def status(self): raw = self.getter() r = OrderedDict([('raw', repr(raw))]) if raw: frame = Frame(raw) r['Frame'] = OrderedDict([ ('Dst MAC', '{:02x}'.format(mac_from_bytes(frame.dst))), ('Src MAC', '{:02x}'.format(mac_from_bytes(frame.src))), ('EtherType', Frame.EtherType[frame.ethertype]), ]) if frame.ethertype == Frame.EtherType.IPv4: packet = Packet(frame.payload) r['IPv4'] = OrderedDict([ ('Protocol', Packet.Protocol[packet.protocol]), ('Src IP', ip_to_str(packet.src)), ('Dst IP', ip_to_str(packet.dst)), ('Payload', repr(packet.payload)), ]) elif frame.ethertype == Frame.EtherType.ARP: arp = ARP(frame.payload) r['ARP'] = OrderedDict([ ('Oper', ARP.Oper[arp.oper]), ('Src IP', ip_to_str(arp.src_ip)), ('Src MAC', '{:02x}'.format(mac_from_bytes(arp.src_mac))), ('Dst IP', ip_to_str(arp.dst_ip)), ('Dst MAC', '{:02x}'.format(mac_from_bytes(arp.dst_mac))), ]) return r
def on_arp(self, raw): arp = ARP(raw) if arp.oper == ARP.Oper.IAm: mint.report('{} got ARP annoucement from {}'.format( ip_to_str(self.ip), ip_to_str(arp.src_ip), )) self.arp_cache[arp.src_ip] = (arp.src_mac, mint.now()) packets = self.pending_packets[arp.src_ip] for packet in packets: self.framer.send(packet.raw, arp.src_mac) del packets[:] elif arp.oper == ARP.Oper.WhoIs: if not arp.dst_ip == self.ip: mint.report('{} got irrelevant ARP packet'.format( ip_to_str(self.ip))) return packet = ARP( oper=ARP.Oper.IAm, src_ip=self.ip, src_mac=self.framer.mac, dst_ip=arp.src_ip, dst_mac=arp.src_mac, ).raw self.framer.send( packet, to=arp.src_mac, ethertype=Frame.EtherType.ARP, )
def on_ipv4(self, raw): packet = Packet(raw) mint.report('{} recved {}'.format( ip_to_str(self.ip), repr(packet.payload), ))
def ip(self): return ip_to_str(self.packeter.ip)