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 remove_expired_entries(self): now = mint.now() n_entries = len(self.route_table) self.route_table = { k: v for k, v in self.route_table.items() if now - v.time < self.entry_duration } if len(self.route_table) != n_entries: mint.report('switch\'s expired entries cleaned')
def input(self): self.iframe.feed(self.tip.isymbol) if self.iframe.complete: payload = str(self.iframe) try: self.ibuffer.append(payload) except Full: mint.report('frame dropped: {}', repr(payload)) self.iframe = Inputter()
def run(self): while True: self.routes.remove_expired_entries() for iport in self.ports: try: raw = iport.recv(block=False) except Empty: continue frame = Frame(raw) self.routes.register(frame.src, iport) oports = self.routes.get(frame.dst, exclude=iport) for oport in oports: try: oport.send(raw, block=False) except Full: mint.report('frame dropped {}', repr(raw)) mint.elapse(1)
def run(self): while True: raw = self.delimiter.recv() frame = Frame(raw) if self.for_me(frame.dst): try: handler = self.handlers[frame.ethertype] except KeyError: mint.report('no handler for {}'.format( Frame.EtherType[frame.ethertype])) else: handler(frame.payload) else: msg = '{:02x} dropped frame from {:02x} to {:02x}: {}' mint.report( msg.format(mac_from_bytes(self.mac), mac_from_bytes(frame.src), mac_from_bytes(frame.dst), repr(frame.payload)))
def feed(self, bit): if self.idle: if bit: self.count += 1 else: if self.count == 6: mint.report('start sending') self.idle = False self.count = 0 else: self.bits.append(bit) if bit: self.count += 1 else: if self.count == 5: del self.bits[-1] elif self.count == 6: del self.bits[-8:] mint.report('finish recving') self.complete = True self.count = 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])
def run(self): while True: raw = self.delimiter.recv() frame = Frame(raw) if self.for_me(frame.dst): try: handler = self.handlers[frame.ethertype] except KeyError: mint.report('no handler for {}'.format( Frame.EtherType[frame.ethertype] )) else: handler(frame.payload) else: msg = '{:02x} dropped frame from {:02x} to {:02x}: {}' mint.report(msg.format( mac_from_bytes(self.mac), mac_from_bytes(frame.src), mac_from_bytes(frame.dst), repr(frame.payload) ))
def feed(self, bit): if self.idle: if bit: self.count += 1 else: if self.count == 6: mint.report('preamble detected, ' + 'frame payload will start on next bit') self.idle = False self.count = 0 else: self.bits.append(bit) if bit: self.count += 1 else: if self.count == 5: del self.bits[-1] elif self.count == 6: del self.bits[-8:] mint.report('postamble detected, ' + 'put frame payload into ibuffer') self.complete = True self.count = 0
def register(self, addr, port): mint.report('register host with address {:02x} on port-{}', addr, self.ports.index(port)) if addr == 0x00: return self.route_table[addr] = bunch(ports=[port], time=mint.now())
def on_ipv4(self, raw): packet = Packet(raw) mint.report('{} recved {}'.format( ip_to_str(self.ip), repr(packet.payload), ))
def report(self, *args, **kwargs): mint.report(self, '|', *args, **kwargs)
def register(self, addr, port): mint.report('register host with address {:02x} on port-{}', mac_from_bytes(addr), self.ports.index(port)) if addr == '\x00': return self.route_table[addr] = bunch(ports=[port], time=mint.now())
def report(self, *args, **kwargs): s = put_format(*args, **kwargs) self.stdout.append('{:5} | {}'.format(mint.now(), s)) mint.report(self, '|', s)