def testArpRequest(self): p = create_ip_arp_request("00:00:00:11:22:33", "1.2.3.4", "10.11.12.13") self.assertEqual(p.num_headers(), 2) ether = p[0] arp = p[1] self.assertEqual(ether.src, "00:00:00:11:22:33") self.assertEqual(ether.dst, "ff:ff:ff:ff:ff:ff") self.assertEqual(ether.ethertype, EtherType.ARP) self.assertEqual(len(ether), 14) self.assertEqual(arp.operation, ArpOperation.Request) self.assertEqual(arp.hardwaretype, ArpHwType.Ethernet) self.assertEqual(arp.protocoltype, EtherType.IP) self.assertEqual(arp.senderhwaddr, EthAddr("00:00:00:11:22:33")) self.assertEqual(arp.targethwaddr, EthAddr("ff:ff:ff:ff:ff:ff")) self.assertEqual(arp.senderprotoaddr, IPv4Address("1.2.3.4")) self.assertEqual(arp.targetprotoaddr, IPv4Address("10.11.12.13")) serialized = arp.to_bytes() other = Arp() other.from_bytes(serialized) self.assertEqual(arp, other) self.assertEqual(len(arp), 28) with self.assertRaises(Exception): other.from_bytes(serialized[:-3]) xbytes = arp.to_bytes() # inject an invalid arp operation xbytes = xbytes[:6] + b'\xff\xff' + xbytes[8:] a = Arp() with self.assertRaises(Exception): a.from_bytes(xbytes)
def testInterface(self): intf = intfmod.Interface("test", None) self.assertTrue(str(intf).startswith("test")) self.assertTrue("mac:00:00:00:00:00:00" in str(intf)) intf.ethaddr = EthAddr("00:11:22:33:44:55") self.assertEqual(str(intf.ethaddr), "00:11:22:33:44:55") intf.ethaddr = None self.assertTrue("mac:00:00:00:00:00:00" in str(intf)) with self.assertRaises(Exception): intf.ipaddr = 1 intf.assign_ipaddr("1.2.3.4/24") self.assertTrue("ip:1.2.3.4/24" in str(intf)) intf.remove_ipaddr("1.2.3.4") intf.assign_ipaddr("1.2.3.4/22") self.assertTrue("ip:1.2.3.4/22" in str(intf)) with self.assertRaises(Exception): intf.netmask = True with self.assertRaises(Exception): intf.ethaddr = True intf.ethaddr = b'\x01\x02\x03\x04\x05\x06' self.assertEqual(intf.ethaddr, EthAddr("01:02:03:04:05:06")) intf.assign_ipaddr('9.8.7.6') self.assertTrue(IPv4Interface('9.8.7.6/32') in intf.ipaddrs) with self.assertRaises(Exception): intf.iftype = intfmod.InterfaceType.Wireless
def testInterface(self): intf = intfmod.Interface("test", None, None, None) self.assertTrue(str(intf).startswith("test")) self.assertTrue("mac:00:00:00:00:00:00" in str(intf)) intf.ethaddr = EthAddr("00:11:22:33:44:55") self.assertEqual(str(intf.ethaddr), "00:11:22:33:44:55") intf.ethaddr = None self.assertTrue("mac:00:00:00:00:00:00" in str(intf)) with self.assertRaises(Exception): intf.ipaddr = 1 intf.ipaddr = "1.2.3.4" intf.netmask = "24" self.assertTrue("ip:1.2.3.4/24" in str(intf)) intf.netmask = "255.255.252.0" self.assertTrue("ip:1.2.3.4/22" in str(intf)) with self.assertRaises(Exception): intf.netmask = True with self.assertRaises(Exception): intf.ethaddr = True intf.ethaddr = b'\x01\x02\x03\x04\x05\x06' self.assertEqual(intf.ethaddr, EthAddr("01:02:03:04:05:06")) intf.ipaddr = "9.8.7.6" intf.netmask = None self.assertEqual(intf.ipaddr, IPv4Address("9.8.7.6")) self.assertEqual(str(intf.ipinterface), "9.8.7.6/32") with self.assertRaises(Exception): intf.netmask = 4.5 self.assertEqual(intf.iftype, intfmod.InterfaceType.Unknown) with self.assertRaises(Exception): intf.iftype = intfmod.InterfaceType.Wireless
def testParse(self): raw = b'\x01\x02\x03\x04\x05\x06\x06\x05\x04\x03\x02\x01\x08\x00' astr = '01:02:03:04:05:06' e = Ethernet() e.from_bytes(raw) self.assertEqual(e.dst, EthAddr(astr)) self.assertEqual(e.src, EthAddr(':'.join(astr.split(':')[::-1]))) self.assertEqual(e.ethertype, EtherType.IP)
def ethaddr(self, value): if isinstance(value, EthAddr): self.__ethaddr = value elif isinstance(value, str): self.__ethaddr = EthAddr(value) elif value is None: self.__ethaddr = EthAddr('00:00:00:00:00:00') else: self.__ethaddr = value
def testSwitchFeatureReply(self): featuresreply = OpenflowHeader.build(OpenflowType.FeaturesReply, 0) featuresreply[1].dpid_low48 = EthAddr("00:01:02:03:04:05") featuresreply[1].dpid_high16 = b'\xab\xcd' p = OpenflowPhysicalPort(0, EthAddr("ab:cd:ef:ab:cd:ef"), "eth0") featuresreply[1].ports.append(p) xb = featuresreply.to_bytes() fr = Packet.from_bytes(xb, OpenflowHeader) self.assertEqual(fr, featuresreply) self._storePkt(featuresreply)
def testNodeIfRebuild(self): d = {"eth0": "eth0 mac:00:00:00:00:00:18 ip:192.168.3.3/24"} r = Router(interfaces=d) self.assertTrue(r.hasInterface('eth0')) self.assertEqual(r.nodetype, 'Router') self.assertEqual( r.getInterface('eth0').ethaddr, EthAddr("00:00:00:00:00:18")) self.assertTrue( IPv4Interface('192.168.3.3/24') in r.getInterface('eth0').ipaddrs) d = {"eth0": "eth0 mac:00:00:00:00:00:18"} r = Router(interfaces=d) self.assertEqual( r.getInterface('eth0').ethaddr, EthAddr("00:00:00:00:00:18")) self.assertEqual(len(r.getInterface('eth0').ipaddrs), 0) rdict = r.asDict() self.assertEqual(rdict['interfaces'], d)
def interface_by_macaddr(self, macaddr): ''' Given a MAC address, return the interface that 'owns' this address ''' macaddr = EthAddr(macaddr) for devname, iface in self.devinfo.items(): if iface.ethaddr == macaddr: return iface raise SwitchyException("No device has MAC address {}".format(macaddr))
def testTopoBuild(self): t = Topology() t.addHost('h1') t.addHost('h2') t.addRouter('r1') t.addSwitch('s1') t.addLink('h1', 'r1', '1 Mb/s', '5 milliseconds') t.addLink('h1', 's1', '1 Mb/s', '5 milliseconds') t.addLink('h2', 'r1', '1 Mb/s', '5 milliseconds') t.addLink('h2', 's1', '1 Mb/s', '5 milliseconds') self.assertListEqual(sorted(t.nodes), sorted(['h1', 'h2', 'r1', 's1'])) self.assertListEqual(t.routers, ['r1']) self.assertListEqual(t.switches, ['s1']) self.assertListEqual(sorted(t.hosts), ['h1', 'h2']) self.assertListEqual( sorted([sorted(tup) for tup in t.links]), sorted([['h1', 'r1'], ['h1', 's1'], ['h2', 'r1'], ['h2', 's1']])) self.assertIsInstance(t.getNode('h1'), dict) self.assertIsInstance(t.getLink('h1', 's1'), dict) with self.assertRaises(KeyError): t.getNode('x1') with self.assertRaises(KeyError): t.getLink('h1', 'x1') with self.assertRaises(KeyError): t.getLink('x1', 'h1') self.assertListEqual(sorted(t.neighbors('h1')), ['r1', 's1']) self.assertListEqual(sorted(t.edges_from('h1')), [('h1', 'r1'), ('h1', 's1')]) nobj = t.getNode('h1')['nodeobj'] self.assertEqual(len(nobj.interfaces), 2) self.assertEqual(str(nobj.interfaces['eth0'].ethaddr), '00:00:00:00:00:01') self.assertEqual(str(nobj.interfaces['eth1'].ethaddr), '00:00:00:00:00:03') t.assignIPAddresses(prefix='192.168.1.0/24') self.assertEqual( str(nobj.interfaces['eth0'].ipaddr)[:-1], "192.168.1.") self.assertEqual(str(nobj.interfaces['eth0'].netmask), "255.255.255.0") h1ifname, r1ifname = t.getLinkInterfaces('h1', 'r1') self.assertEqual(h1ifname, 'eth0') self.assertEqual(r1ifname, 'eth0') t.setInterfaceAddresses('h1', h1ifname, ip="10.0.1.1", netmask="255.255.0.0", mac="11:22:33:44:55:66") ethaddr, ip, mask = t.getInterfaceAddresses('h1', h1ifname) self.assertEqual(ethaddr, EthAddr("11:22:33:44:55:66")) self.assertEqual(ip, IPAddr("10.0.1.1")) self.assertEqual(mask, IPAddr("255.255.0.0"))
def testNodeIfRebuild(self): d = {"eth0": "eth0 mac:00:00:00:00:00:18 ip:192.168.3.3/24"} r = Router(interfaces=d) self.assertTrue(r.hasInterface('eth0')) self.assertEqual(r.nodetype, 'Router') self.assertEqual( r.getInterface('eth0').ethaddr, EthAddr("00:00:00:00:00:18")) self.assertEqual( r.getInterface('eth0').ipaddr, IPv4Address("192.168.3.3")) self.assertEqual( r.getInterface('eth0').netmask, IPv4Address("255.255.255.0")) d = {"eth0": "eth0 mac:00:00:00:00:00:18"} r = Router(interfaces=d) self.assertEqual( r.getInterface('eth0').ethaddr, EthAddr("00:00:00:00:00:18")) self.assertEqual(r.getInterface('eth0').ipaddr, IPv4Address("0.0.0.0")) self.assertEqual( r.getInterface('eth0').netmask, IPv4Address("255.255.255.255")) rdict = r.asDict() self.assertEqual(rdict['interfaces'], d)
def testArpReply(self): p = create_ip_arp_reply("aa:bb:cc:dd:ee:ff", "00:00:00:11:22:33", "10.11.12.13", "1.2.3.4") self.assertEqual(p.num_headers(), 2) ether = p[0] arp = p[1] self.assertEqual(ether.dst, "00:00:00:11:22:33") self.assertEqual(ether.src, "aa:bb:cc:dd:ee:ff") self.assertEqual(ether.ethertype, EtherType.ARP) self.assertEqual(len(ether), 14) self.assertEqual(arp.operation, ArpOperation.Reply) self.assertEqual(arp.hardwaretype, ArpHwType.Ethernet) self.assertEqual(arp.protocoltype, EtherType.IP) self.assertEqual(arp.targethwaddr, EthAddr("00:00:00:11:22:33")) self.assertEqual(arp.senderhwaddr, EthAddr("aa:bb:cc:dd:ee:ff")) self.assertEqual(arp.targetprotoaddr, IPv4Address("1.2.3.4")) self.assertEqual(arp.senderprotoaddr, IPv4Address("10.11.12.13")) serialized = arp.to_bytes() other = Arp() other.from_bytes(serialized) self.assertEqual(arp, other) self.assertEqual(len(arp), 28)
def from_bytes(self, raw): '''Return an Ethernet object reconstructed from raw bytes, or an Exception if we can't resurrect the packet.''' if len(raw) < Arp._MINLEN: raise Exception( "Not enough bytes ({}) to reconstruct an Arp object".format( len(raw))) fields = struct.unpack(Arp._PACKFMT, raw[:Arp._MINLEN]) try: self._hwtype = ArpHwType(fields[0]) self._prototype = EtherType(fields[1]) self._hwaddrlen = fields[2] self._protoaddrlen = fields[3] self.operation = ArpOperation(fields[4]) self.senderhwaddr = EthAddr(fields[5]) self.senderprotoaddr = IPAddr(fields[6]) self.targethwaddr = EthAddr(fields[7]) self.targetprotoaddr = IPAddr(fields[8]) except Exception as e: raise Exception( "Error constructing Arp packet object from raw bytes: {}". format(str(e))) return raw[Arp._MINLEN:]
def testInterface(self): intf = Interface("test", None, None, None) self.assertTrue(str(intf).startswith("test")) self.assertTrue("mac:00:00:00:00:00:00" in str(intf)) intf.ethaddr = EthAddr("00:11:22:33:44:55") self.assertEqual(str(intf.ethaddr), "00:11:22:33:44:55") intf.ethaddr = None self.assertTrue("mac:00:00:00:00:00:00" in str(intf)) with self.assertRaises(Exception): intf.ipaddr = 1 intf.ipaddr = "1.2.3.4" intf.netmask = "24" self.assertTrue("ip:1.2.3.4/24" in str(intf)) intf.netmask = "255.255.252.0" self.assertTrue("ip:1.2.3.4/22" in str(intf)) with self.assertRaises(Exception): intf.netmask = True
def testTopoBuild(self): t = Topology() t.addHost('h1') t.addHost('h2') t.addRouter('r1') t.addSwitch('s1') t.addLink('h1', 'r1', '1 Mb/s', '5 milliseconds') t.addLink('h1', 's1', '1 Mb/s', '5 milliseconds') t.addLink('h2', 'r1', '1 Mb/s', '5 milliseconds') t.addLink('h2', 's1', '1 Mb/s', '5 milliseconds') self.assertTrue(t.auto_macs) self.assertIn("h1", t) with self.assertRaises(Exception): t.addHost("h1") self.assertTrue(t.hasEdge("h1", "r1")) self.assertFalse(t.hasEdge("h1", "h2")) self.assertListEqual(sorted(t.nodes), sorted(['h1', 'h2', 'r1', 's1'])) self.assertListEqual(t.routers, ['r1']) self.assertListEqual(t.switches, ['s1']) self.assertListEqual(sorted(t.hosts), ['h1', 'h2']) self.assertListEqual( sorted([sorted(tup) for tup in t.links]), sorted([['h1', 'r1'], ['h1', 's1'], ['h2', 'r1'], ['h2', 's1']])) self.assertIsInstance(t.getNode('h1'), dict) self.assertIsInstance(t.getLink('h1', 's1'), dict) with self.assertRaises(KeyError): t.getNode('x1') with self.assertRaises(KeyError): t.getLink('h1', 'x1') with self.assertRaises(KeyError): t.getLink('x1', 'h1') self.assertListEqual(sorted(t.neighbors('h1')), ['r1', 's1']) self.assertListEqual(sorted(t.edges_from('h1')), [('h1', 'r1'), ('h1', 's1')]) nobj = t.getNode('h1')['nodeobj'] self.assertEqual(len(nobj.interfaces), 2) self.assertEqual(str(nobj.interfaces['eth0'].ethaddr), '00:00:00:00:00:01') self.assertEqual(str(nobj.interfaces['eth1'].ethaddr), '00:00:00:00:00:03') self.assertTrue(str(nobj).startswith("Host eth0 ")) t.assignIPAddresses(prefix='192.168.1.0/24') self.assertTrue( IPv4Interface('192.168.1.1/24') in nobj.interfaces['eth0'].ipaddrs) h1ifname, r1ifname = t.getLinkInterfaces('h1', 'r1') self.assertEqual(h1ifname, 'eth0') self.assertEqual(r1ifname, 'eth0') t.setInterfaceAddresses('h1', h1ifname, ip="10.0.1.1/16", mac="11:22:33:44:55:66") ethaddr, ipset = t.getInterfaceAddresses('h1', h1ifname) self.assertEqual(ethaddr, EthAddr("11:22:33:44:55:66")) self.assertTrue(IPv4Interface('10.0.1.1/16') in ipset) t.removeLink('h1', 'r1') self.assertFalse(t.hasEdge('h1', 'r1')) with self.assertRaises(Exception): t.setLinkCharacteristics('h1', 'r1', capacity="10Mbps") t.assignIPAddresses() n = t.getNode('h2') nobj = n['nodeobj'] self.assertRegex(str(nobj), "\s+ip:10\.0\.0\.\d\/8\s+") with self.assertRaises(Exception): t.setInterfaceAddresses('h42', 'eth0') with self.assertRaises(Exception): t.setInterfaceAddresses('h2', 'eth99')
def dst(self, value): self._dst = EthAddr(value)
def src(self, value): self._src = EthAddr(value)
def testBadAddr(self): with self.assertRaises(RuntimeError): x = EthAddr("a")
def testSetSrc(self): astr = '00:00:00:00:00:01' self.e.src = astr self.assertEqual(self.e.src, EthAddr(astr))
def targethwaddr(self, value): self._targethwaddr = EthAddr(value)
def senderhwaddr(self, value): self._senderhwaddr = EthAddr(value)
def testBlankAddrs(self): self.assertEqual(self.e.src, EthAddr()) self.assertEqual(self.e.dst, EthAddr())
def testSetDst(self): astr = '00:00:00:00:00:01' self.e.dst = astr self.assertEqual(self.e.dst, EthAddr(astr))
def __init__(self, **kwargs): self._src = self._dst = EthAddr() self._ethertype = EtherType.IP super().__init__(**kwargs)
def testBadSet(self): with self.assertRaises(Exception): self.e.xdst = EthAddr()