def test_it_should_not_respond_to_a_neighbourhood_solicitation_for_a_multicast_group_in_the_ips(self): l = Link('A') n = TestNode('TNN', link0=l, ll_addr0="00:b0:d0:86:bb:f7", ips0=[IPAddress.identify("2001:500:88:200::10"), IPAddress.identify("2001:500:88:200::11"), IPAddress.identify("fe80:500:88:200::10"), IPAddress.identify("192.0.43.10")]) l.accept(IPv6(src="fe80:500:88:200::20", dst="fe80:500:88:200::10")/ICMPv6ND_NS(tgt="ff02::1")) self.assertEqual(1, len(l.forwarded())) self.assertTrue(l.forwarded()[0].haslayer(ICMPv6ND_NS))
def test_it_should_send_traffic_on_if0(self): l = Link('A') n = TestNode('TNN', link0=l, ips0=[IPAddress.identify("2001:500:88:200::10"), IPAddress.identify("2001:500:88:200::11"), IPAddress.identify("fe80:500:88:200::10"), IPAddress.identify("192.0.43.10")]) n.send("This is a packet.") self.assertEqual(1, len(l.forwarded())) self.assertEqual("This is a packet.", l.forwarded()[0])
def test_it_should_send_packets_to_a_link(self): l = Link('A') i = Interface(link=l) i.send("This is a packet.") self.assertEqual(1, len(l.forwarded())) self.assertEqual("This is a packet.", l.forwarded()[0])
def test_it_should_accept_traffic_from_an_interface(self): l = Link('A') i = Interface(link=l) l.accept("This is a packet.", previous_hop=i) self.assertEqual(1, len(l.forwarded())) self.assertEqual("This is a packet.", l.forwarded()[0])
def test_it_should_encapsulate_packets_with_layer_2_frames_on_send(self): l = Link('A') i = Interface(link=l) i.send(IPv6()) self.assertEqual(1, len(l.forwarded())) self.assertTrue(l.forwarded()[0].haslayer(Ether)) self.assertTrue(l.forwarded()[0].haslayer(IPv6))
def test_it_should_set_the_source_and_destination_mac_addresses_to_defaults_for_ethernet_link_layer(self): l = Link('A') i = Interface(link=l) i.send(IPv6()) self.assertEqual(1, len(l.forwarded())) self.assertTrue(l.forwarded()[0].haslayer(Ether)) self.assertEqual("00:00:00:00:00:00", l.forwarded()[0].getlayer(Ether).src) self.assertEqual("ff:ff:ff:ff:ff:ff", l.forwarded()[0].getlayer(Ether).dst)
def test_it_should_forward_packets_from_phy_to_the_link(self): l = Link('A') i = MockInterface('if0', '00:b0:d0:86:bb:f7') k = TargetInterface(link_addr="00:b0:d0:bb:cc:ff") t = Tap(l, i, k) i.accept(["This is a packet."]) self.assertEqual(1, len(l.forwarded())) self.assertEqual("This is a packet.", l.forwarded()[0])
def test_it_should_not_forward_global_traffic_addressed_to_the_interface(self): l = Link('A') m = Link('B') r = TestRouter('TNN', link0=l, ips0=[IPAddress.identify("2001:500:88:200::10"), IPAddress.identify("2001:500:88:200::11"), IPAddress.identify("fe80:500:88:200::10"), IPAddress.identify("192.0.43.10")], link1=m, ips1=[IPAddress.identify("2001:600:88:200::10"), IPAddress.identify("2001:600:88:200::11"), IPAddress.identify("fe80:600:88:200::10"), IPAddress.identify("192.1.43.10")]) l.accept(IPv6(dst="2001:500:88:200::10")) self.assertEqual(1, len(l.forwarded())) self.assertEqual(0, len(m.forwarded()))
def test_it_should_send_traffic_on_if1(self): l = Link('A') m = Link('B') r = TestRouter('TNN', link0=l, ips0=[IPAddress.identify("2001:500:88:200::10"), IPAddress.identify("2001:500:88:200::11"), IPAddress.identify("fe80:500:88:200::10"), IPAddress.identify("192.0.43.10")], link1=m, ips1=[IPAddress.identify("2001:600:88:200::10"), IPAddress.identify("2001:600:88:200::11"), IPAddress.identify("fe80:600:88:200::10"), IPAddress.identify("192.1.43.10")]) r.send("This is a packet.", iface=1) self.assertEqual(0, len(l.forwarded())) self.assertEqual(1, len(m.forwarded())) self.assertEqual("This is a packet.", m.forwarded()[0])
def test_it_should_forward_traffic_to_a_real_interface_through_a_tap(self): l = Link('A') i = Interface(link=l) j = MockInterface('if0', '00:b0:d0:86:bb:f7') k = TargetInterface(link_addr="00:b0:d0:bb:cc:ff") t = Tap(l, j, k) j.accept(["This is a packet."]) self.assertEqual(1, len(l.forwarded())) self.assertEqual("This is a packet.", l.forwarded()[0])
def test_it_should_not_forward_link_local_traffic(self): l = Link('A') m = Link('B') r = TestRouter('TNN', link0=l, ips0=[IPAddress.identify("2001:500:88:200::10"), IPAddress.identify("2001:500:88:200::11"), IPAddress.identify("fe80:500:88:200::10"), IPAddress.identify("192.0.43.10")], link1=m, ips1=[IPAddress.identify("2001:600:88:200::10"), IPAddress.identify("2001:600:88:200::11"), IPAddress.identify("fe80:600:88:200::10"), IPAddress.identify("192.1.43.10")], forwards_to_0=[Network("2001:0500:0088:0200:0000:0000:0000:0000/64")], forwards_to_1=[Network("2001:0600:0088:0200:0000:0000:0000:0000/64")]) l.accept(IPv6(dst="fe80:600:88:200::10")) self.assertEqual(1, len(l.forwarded())) self.assertEqual(0, len(m.forwarded()))
def test_it_should_not_respond_to_an_arp_reply_address(self): l = Link('A') n = TestNode('TNN', link0=l, ll_addr0="00:b0:d0:86:bb:f7", ips0=[IPAddress.identify("2001:500:88:200::10"), IPAddress.identify("2001:500:88:200::11"), IPAddress.identify("fe80:500:88:200::10"), IPAddress.identify("192.0.43.10")]) l.accept(ARP(hwsrc="00:01:02:03:04:05", psrc="192.0.43.100", pdst="192.0.43.200", op=0x002)) self.assertEqual(1, len(l.forwarded()))
def test_it_should_decrement_the_ttl_when_forwarding_ipv4_packets(self): l = Link('A') m = Link('B') r = TestRouter('TNN', link0=l, ips0=[IPAddress.identify("2001:500:88:200::10"), IPAddress.identify("2001:500:88:200::11"), IPAddress.identify("fe80:500:88:200::10"), IPAddress.identify("192.0.43.10")], link1=m, ips1=[IPAddress.identify("2001:600:88:200::10"), IPAddress.identify("2001:600:88:200::11"), IPAddress.identify("fe80:600:88:200::10"), IPAddress.identify("192.1.43.10")], forwards_to_0=[Network("192.0.43.0/24")], forwards_to_1=[Network("192.1.43.0/24")]) p = IP(dst="192.1.43.10") self.assertEqual(64, p.ttl) l.accept(p) self.assertEqual(1, len(l.forwarded())) self.assertEqual(1, len(m.forwarded())) self.assertTrue(m.forwarded()[0].haslayer(IP)) self.assertEqual(63, m.forwarded()[0].ttl)
def test_it_should_not_forward_router_solicitations(self): l = Link('A') m = Link('B') r = TestRouter('TNN', link0=l, ll_addr0="00:b0:d0:86:bb:f7", ips0=[IPAddress.identify("2001:500:88:200::10"), IPAddress.identify("2001:500:88:200::11"), IPAddress.identify("fe80:500:88:200::10"), IPAddress.identify("192.0.43.10")], link1=m, ll_addr1="00:b0:d0:86:bb:f8", ips1=[IPAddress.identify("2001:600:88:200::10"), IPAddress.identify("2001:600:88:200::11"), IPAddress.identify("fe80:600:88:200::10"), IPAddress.identify("192.1.43.10")]) l.accept(IPv6(src="fe80:500:88:200::20", dst="ff02::2")/ICMPv6ND_RS()) self.assertFalse(any(map(lambda p: p.haslayer(ICMPv6ND_RS), m.forwarded())))
def test_it_should_not_forward_neighbour_advertisements(self): l = Link('A') m = Link('B') r = TestRouter('TNN', link0=l, ll_addr0="00:b0:d0:86:bb:f7", ips0=[IPAddress.identify("2001:500:88:200::10"), IPAddress.identify("2001:500:88:200::11"), IPAddress.identify("fe80:500:88:200::10"), IPAddress.identify("192.0.43.10")], link1=m, ll_addr1="00:b0:d0:86:bb:f8", ips1=[IPAddress.identify("2001:600:88:200::10"), IPAddress.identify("2001:600:88:200::11"), IPAddress.identify("fe80:600:88:200::10"), IPAddress.identify("192.1.43.10")]) l.accept(IPv6(src="fe80:500:88:200::20", dst="ff02::2")/ICMPv6ND_NA()) self.assertEqual(0, len(m.forwarded()))
def test_it_should_respond_to_arp_for_its_ipv4_address(self): l = Link('A') n = TestNode('TNN', link0=l, ll_addr0="00:b0:d0:86:bb:f7", ips0=[IPAddress.identify("2001:500:88:200::10"), IPAddress.identify("2001:500:88:200::11"), IPAddress.identify("fe80:500:88:200::10"), IPAddress.identify("192.0.43.10")]) l.accept(ARP(hwsrc="00:01:02:03:04:05", psrc="192.0.43.100", pdst="192.0.43.10")) self.assertEqual(2, len(l.forwarded())) self.assertTrue(l.forwarded()[1].haslayer(ARP)) self.assertEqual(0x0002, l.forwarded()[1].getlayer(ARP).op) self.assertEqual("192.0.43.10", l.forwarded()[1].getlayer(ARP).psrc) self.assertEqual("00:b0:d0:86:bb:f7", l.forwarded()[1].getlayer(ARP).hwsrc) self.assertEqual("192.0.43.100", l.forwarded()[1].getlayer(ARP).pdst) self.assertEqual("00:01:02:03:04:05", l.forwarded()[1].getlayer(ARP).hwdst)
def test_it_should_respond_to_a_neighbourhood_solicitation_for_its_link_local_ip(self): l = Link('A') n = TestNode('TNN', link0=l, ll_addr0="00:b0:d0:86:bb:f7", ips0=[IPAddress.identify("2001:500:88:200::10"), IPAddress.identify("2001:500:88:200::11"), IPAddress.identify("fe80:500:88:200::10"), IPAddress.identify("192.0.43.10")]) l.accept(IPv6(src="fe80:500:88:200::20", dst="fe80:500:88:200::10")/ICMPv6ND_NS(tgt="fe80:500:88:200::10")) self.assertEqual(2, len(l.forwarded())) self.assertTrue(l.forwarded()[0].haslayer(ICMPv6ND_NS)) self.assertTrue(l.forwarded()[1].haslayer(ICMPv6ND_NA)) self.assertEqual("fe80:500:88:200::10", l.forwarded()[1].getlayer(IPv6).src) self.assertEqual("fe80:500:88:200::20", l.forwarded()[1].getlayer(IPv6).dst) self.assertEqual("fe80:500:88:200::10", l.forwarded()[1].getlayer(ICMPv6ND_NA).tgt) self.assertTrue(l.forwarded()[1].haslayer(ICMPv6NDOptDstLLAddr)) self.assertEqual("00:b0:d0:86:bb:f7", l.forwarded()[1].getlayer(ICMPv6NDOptDstLLAddr).lladdr)
def test_it_should_respond_to_router_solicitations(self): l = Link('A') m = Link('B') r = TestRouter('TNN', link0=l, ll_addr0="00:b0:d0:86:bb:f7", ips0=[IPAddress.identify("2001:500:88:200::10"), IPAddress.identify("2001:500:88:200::11"), IPAddress.identify("fe80:500:88:200::10"), IPAddress.identify("192.0.43.10")], link1=m, ll_addr1="00:b0:d0:86:bb:f8", ips1=[IPAddress.identify("2001:600:88:200::10"), IPAddress.identify("2001:600:88:200::11"), IPAddress.identify("fe80:600:88:200::10"), IPAddress.identify("192.1.43.10")]) l.accept(IPv6(src="fe80:500:88:200::20", dst="ff02::2")/ICMPv6ND_RS()) self.assertEqual(2, len(l.forwarded())) self.assertTrue(l.forwarded()[0].haslayer(ICMPv6ND_RS)) self.assertTrue(l.forwarded()[1].haslayer(ICMPv6ND_RA)) self.assertEqual("fe80:500:88:200::10", l.forwarded()[1].getlayer(IPv6).src) self.assertEqual("ff02::1", l.forwarded()[1].getlayer(IPv6).dst) self.assertTrue(l.forwarded()[1].haslayer(ICMPv6NDOptSrcLLAddr)) self.assertEqual("00:b0:d0:86:bb:f7", l.forwarded()[1].getlayer(ICMPv6NDOptSrcLLAddr).lladdr) self.assertTrue(l.forwarded()[1].haslayer(ICMPv6NDOptMTU)) self.assertEqual(1500, l.forwarded()[1].getlayer(ICMPv6NDOptMTU).mtu) self.assertTrue(l.forwarded()[1].haslayer(ICMPv6NDOptPrefixInfo)) self.assertEqual(64, l.forwarded()[1].getlayer(ICMPv6NDOptPrefixInfo).prefixlen) self.assertEqual("2001:500:88:200::", l.forwarded()[1].getlayer(ICMPv6NDOptPrefixInfo).prefix)