Exemple #1
0
 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,
         )
Exemple #2
0
 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')
Exemple #3
0
 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')
Exemple #4
0
 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()
Exemple #5
0
 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()
Exemple #6
0
 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)
Exemple #7
0
 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)
Exemple #8
0
 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)))
Exemple #9
0
 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
Exemple #10
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])
Exemple #11
0
 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)
             ))
Exemple #12
0
 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
Exemple #13
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])
Exemple #14
0
 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
Exemple #15
0
 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
Exemple #16
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())
Exemple #17
0
 def on_ipv4(self, raw):
     packet = Packet(raw)
     mint.report('{} recved {}'.format(
         ip_to_str(self.ip),
         repr(packet.payload),
     ))
Exemple #18
0
 def report(self, *args, **kwargs):
     mint.report(self, '|', *args, **kwargs)
Exemple #19
0
 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())
Exemple #20
0
 def report(self, *args, **kwargs):
     s = put_format(*args, **kwargs)
     self.stdout.append('{:5} | {}'.format(mint.now(), s))
     mint.report(self, '|', s)
Exemple #21
0
 def report(self, *args, **kwargs):
     mint.report(self, '|', *args, **kwargs)