示例#1
0
 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)
示例#2
0
 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
示例#3
0
 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
示例#4
0
 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)
示例#5
0
 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
示例#6
0
 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)
示例#7
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.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)
示例#8
0
 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"))
示例#10
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)
示例#11
0
 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)
示例#12
0
 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:]
示例#13
0
 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
示例#14
0
    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')
示例#15
0
 def dst(self, value):
     self._dst = EthAddr(value)
示例#16
0
 def src(self, value):
     self._src = EthAddr(value)
示例#17
0
 def testBadAddr(self):
     with self.assertRaises(RuntimeError):
         x = EthAddr("a")
示例#18
0
 def testSetSrc(self):
     astr = '00:00:00:00:00:01'
     self.e.src = astr
     self.assertEqual(self.e.src, EthAddr(astr))
示例#19
0
 def targethwaddr(self, value):
     self._targethwaddr = EthAddr(value)
示例#20
0
 def senderhwaddr(self, value):
     self._senderhwaddr = EthAddr(value)
示例#21
0
 def testBlankAddrs(self):
     self.assertEqual(self.e.src, EthAddr())
     self.assertEqual(self.e.dst, EthAddr())
示例#22
0
 def testSetDst(self):
     astr = '00:00:00:00:00:01'
     self.e.dst = astr
     self.assertEqual(self.e.dst, EthAddr(astr))
示例#23
0
 def __init__(self, **kwargs):
     self._src = self._dst = EthAddr()
     self._ethertype = EtherType.IP
     super().__init__(**kwargs)
示例#24
0
 def testBadSet(self):
     with self.assertRaises(Exception):
         self.e.xdst = EthAddr()