Ejemplo n.º 1
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,
        )
Ejemplo n.º 2
0
 def on_ipv4(self, frame, **_):
     packet = Packet(frame.payload)
     if packet.protocol == Packet.Protocol.TCP:
         PDU = Segment
     elif packet.protocol == Packet.Protocol.UDP:
         PDU = Datagram
     else:
         self.report('unsupported transport layer protocol')
         return
     self.on_transport_pdu(packet, PDU)
Ejemplo n.º 3
0
 def on_ipv4(self, frame, **kwargs):
     i_interface = kwargs.get('interface')
     packet = Packet(frame.payload)
     try:
         net, _, gateway, interface = self.routes.find(packet.dst_ip)
     except KeyError:
         self.report('do not know how to route packet for {}',
                     packet.dst_ip)
     else:
         if interface != i_interface:
             interface.send_packet(
                 data=packet.raw,
                 dst_ip=gateway if gateway else packet.dst_ip,
                 ethertype=frame.ethertype,
             )
         else:
             self.report('packet dst to {} already on net {}, ignored',
                         packet.dst_ip, net)
Ejemplo n.º 4
0
 def sendto(self, data, addr):
     addr = canonicalized_addr(addr)
     dst_ip, dst_port = addr
     if not self.local_addr:
         local_ip = IP_Loopback if dst_ip == IP_Loopback else IP_All
         self.bind((local_ip, None))
     datagram = Datagram(
         src_port=self.port,
         dst_port=dst_port,
         payload=data,
     )
     packet = Packet(
         protocol=Packet.Protocol.UDP,
         src_ip=self.ip,
         dst_ip=dst_ip,
         payload=datagram.raw,
     )
     self.host.send_packet(packet)
Ejemplo n.º 5
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,
        )
Ejemplo n.º 6
0
 def on_ipv4(self, frame):
     packet = Packet(frame.payload)
     src_ip = packet.src_ip
     src_mac = frame.src_mac
     self.ip2mac[src_ip] = src_mac
     #mint.report('!!!')
     #print repr(packet.protocol), Packet.Protocol[packet.protocol]
     #print self.ip2mac
     if packet.protocol == Packet.Protocol.UDP:
         datagram = Datagram(packet.payload)
         try:
             sock_id = (self.libsocket.SOCK_DGRAM, packet.dst_ip,
                        datagram.dst_port)
             sock = self.sockets[sock_id]
             remote_addr = (packet.src_ip, datagram.src_port)
             sock.feed_datagram(datagram.payload, remote_addr)
         except KeyError:
             pass
     else:
         mint.report('{}: unsupport protocol {}', self,
                     Packet.Protocol[packet.protocol])
Ejemplo n.º 7
0
 def on_ipv4(self, frame, **_):
     packet = Packet(frame.payload)
     self.send('wooo..', packet.src_ip)
Ejemplo n.º 8
0
 def on_ipv4(self, frame, **_):
     packet = Packet(frame.payload)
     if packet.protocol == Packet.Protocol.UDP:
         self.on_udp(packet)