예제 #1
0
 def compose(self, yiaddr, siaddr, chaddr, *opts):
     r = ''
     r += IP(yiaddr)
     r += IP(siaddr)
     r += MAC(chaddr)
     opts = list(opts)
     for i, opt in enumerate(opts):
         if isinstance(opt, int):
             opts[i] = struct.pack('!B', opt)
         elif not isinstance(opt, str):
             opts[i] = str(opt)
     r += ''.join(opts)
     return r
예제 #2
0
    def send_ip(self, data, dst_ip, protocol=Packet.Protocol.Raw):
        dst_ip = IP(dst_ip)
        if not dst_ip:
            self.report('invalid dst_ip {}, ignored', dst_ip)
            return
        try:
            _, _, gateway, interface = self.routes.find(dst_ip)
        except KeyError:
            self.report('no gateway for destination {}, ignored', dst_ip)
            return

        if gateway:
            self.report('{} is non-local, beg {} to deliver', dst_ip, gateway)
        else:
            self.report('{} is local, send directly', dst_ip)

        packet = Packet(
            src_ip=interface.ip,
            dst_ip=dst_ip,
            protocol=protocol,
            payload=data,
        )
        interface.send_packet(
            packet.raw,
            gateway if gateway else dst_ip,
            Frame.EtherType.IPv4,
        )
예제 #3
0
 def connect(self, addr):
     ip, port = addr
     ip = IP(ip)
     port = Port(port)
     if not self.bound:
         self.bind((IP_All, None))
     segment = Segment(
         src_port=self.port,
         dst_port=port,
         syn=True,
     )
     self.host.send_ip(segment.raw, ip, protocol=Packet.Protocol.TCP)
예제 #4
0
    def bind(self, sock, addr):
        ip, port = addr

        ip = IP(ip)
        if not ip:
            ip = self.interface.ip

        if port is None:
            port = self.ports[sock.type].popleft()
        port = Port(port)

        addr = (ip, port)

        addr2socket = self.get_addr2socket(sock)
        addr2socket[addr] = sock
        return addr
예제 #5
0
파일: host.py 프로젝트: ver007/mint-dev
    def bind(self, sock, addr):
        ip, port = addr

        ip = IP(ip)
        if not ip:
            ip = self.interface.ip

        port = Port(port)  # TODO: port == None

        addr = (ip, port)

        if sock.type == LibSocket.SOCK_DGRAM:
            addr2socket = self.sockets[Packet.Protocol.UDP]
        else:
            self.report('invalid bind')
            return (None, None)
        addr2socket[addr] = sock
        return addr
예제 #6
0
 def ack(self, request):
     self.report('DHCP Ack {}', request.options['RequestedIP'])
     routers = [IP(ip).bytes_form for ip in self.routers]
     pdu = DHCP.PDU(
         # yiaddr (your ip address)
         request.options['RequestedIP'],
         # siaddr (server ip address)
         self.sock.ip,
         # chaddr (client hardware address)
         request.chaddr,
         # options
         DHCP.Opt.MessageType, 1, DHCP.Opt.Ext.MessageType.Ack,
         DHCP.Opt.SubnetMask, 4, self.subnet_mask.bytes_form,
         DHCP.Opt.Router, 4 * len(routers), ''.join(routers),
         DHCP.Opt.LeaseTime, 4, struct.pack('!I', self.lease_time),
         # end
         DHCP.Opt.End,
     )
     self.sock.sendto(pdu.raw, (IP_Broadcast, DHCP.ClientPort))
예제 #7
0
    def send(self, data, ip, protocol=Packet.Protocol.Raw):
        dst_ip = IP(ip)
        _, _, gateway, interface = self.routes.find(dst_ip)

        if gateway:
            self.report('{} is non-local, beg {} to deliver', dst_ip, gateway)
        else:
            self.report('{} is local, send directly', dst_ip)

        packet = Packet(
            src_ip=interface.ip,
            dst_ip=dst_ip,
            protocol=protocol,
            payload=data,
        )
        interface.send_packet(
            packet.raw,
            gateway if gateway else dst_ip,
            Frame.EtherType.IPv4,
        )
예제 #8
0
 def add(self, net, mask, gateway, interface):
     self.entries.append(Entry(IP(net), IP(mask), IP(gateway), interface))
예제 #9
0
 def default_gateway(self, val):
     gateway = IP(val)
     self._default_gateway = gateway
     self.routes[-1].gateway = gateway
예제 #10
0
 def bind(self, addr):
     ip, port = IP(addr[0]), Port(addr[1])
     self.local_addr = self.host.bind(self, (ip, port))
     self.ip, self.port = self.local_addr
예제 #11
0
 def __init__(self, host):
     super(DHCPServer, self).__init__(host)
     self.pool = Pool()
     self.subnet_mask = IP('0.0.0.0')
     self.routers = ['0.0.0.0']
     self.lease_time = 8000
예제 #12
0
 def default_gateway(self, val):
     gateway = IP(val)
     self._default_gateway = gateway
     self.routes[-1].gateway = gateway
     self.report('default gateway changed to {}', gateway)
예제 #13
0
 def bind(self, addr):
     ip, port = IP(addr[0]), Port(addr[1]) if addr[1] else None
     self.local_addr = self.host.bind(self, (ip, port))
     self.ip, self.port = self.local_addr
     self.bound = True