X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=test%2Ftest_ip4.py;h=831685150a2f6799efb929b983556593e81a92d5;hb=45a95dd782b91e9ae5665b5f95be4b6d7f99b879;hp=933958911fe1c1497c9c374b1c5d4b360598ff21;hpb=097fa66b986f06281f603767d321ab13ab6c88c3;p=vpp.git diff --git a/test/test_ip4.py b/test/test_ip4.py index 933958911fe..831685150a2 100644 --- a/test/test_ip4.py +++ b/test/test_ip4.py @@ -13,9 +13,12 @@ from six import moves from framework import VppTestCase, VppTestRunner from util import ppp +from vpp_ip import VppIpPrefix from vpp_ip_route import VppIpRoute, VppRoutePath, VppIpMRoute, \ VppMRoutePath, MRouteItfFlags, MRouteEntryFlags, VppMplsIpBind, \ - VppMplsTable, VppIpTable, FibPathType, find_route + VppMplsTable, VppIpTable, FibPathType, find_route, \ + VppIpInterfaceAddress +from vpp_ip import VppIpAddress from vpp_sub_interface import VppSubInterface, VppDot1QSubint, VppDot1ADSubint from vpp_papi import VppEnum @@ -97,7 +100,7 @@ class TestIPv4(VppTestCase): :param int packet_size: Required packet size. :param Scapy pkt: Packet to be modified. """ - dst_if_idx = packet_size / 10 % 2 + dst_if_idx = int(packet_size / 10 % 2) dst_if = self.flows[src_if][dst_if_idx] info = self.create_packet_info(src_if, dst_if) payload = self.info_to_payload(info) @@ -210,6 +213,131 @@ class TestIPv4(VppTestCase): self.verify_capture(i, pkts) +class TestIPv4IfAddrRoute(VppTestCase): + """ IPv4 Interface Addr Route Test Case """ + + @classmethod + def setUpClass(cls): + super(TestIPv4IfAddrRoute, cls).setUpClass() + + @classmethod + def tearDownClass(cls): + super(TestIPv4IfAddrRoute, cls).tearDownClass() + + def setUp(self): + super(TestIPv4IfAddrRoute, self).setUp() + + # create 1 pg interface + self.create_pg_interfaces(range(1)) + + for i in self.pg_interfaces: + i.admin_up() + i.config_ip4() + i.resolve_arp() + + def tearDown(self): + super(TestIPv4IfAddrRoute, self).tearDown() + for i in self.pg_interfaces: + i.unconfig_ip4() + i.admin_down() + + def test_ipv4_ifaddrs_same_prefix(self): + """ IPv4 Interface Addresses Same Prefix test + + Test scenario: + + - Verify no route in FIB for prefix 10.10.10.0/24 + - Configure IPv4 address 10.10.10.10/24 on an interface + - Verify route in FIB for prefix 10.10.10.0/24 + - Configure IPv4 address 10.10.10.20/24 on an interface + - Delete 10.10.10.10/24 from interface + - Verify route in FIB for prefix 10.10.10.0/24 + - Delete 10.10.10.20/24 from interface + - Verify no route in FIB for prefix 10.10.10.0/24 + """ + + # create two addresses, verify route not present + if_addr1 = VppIpInterfaceAddress(self, self.pg0, + VppIpAddress("10.10.10.10"), 24) + if_addr2 = VppIpInterfaceAddress(self, self.pg0, + VppIpAddress("10.10.10.20"), 24) + self.assertFalse(if_addr1.query_vpp_config()) # 10.10.10.0/24 + self.assertFalse(find_route(self, "10.10.10.10", 32)) + self.assertFalse(find_route(self, "10.10.10.20", 32)) + self.assertFalse(find_route(self, "10.10.10.255", 32)) + self.assertFalse(find_route(self, "10.10.10.0", 32)) + + # configure first address, verify route present + if_addr1.add_vpp_config() + self.assertTrue(if_addr1.query_vpp_config()) # 10.10.10.0/24 + self.assertTrue(find_route(self, "10.10.10.10", 32)) + self.assertFalse(find_route(self, "10.10.10.20", 32)) + self.assertTrue(find_route(self, "10.10.10.255", 32)) + self.assertTrue(find_route(self, "10.10.10.0", 32)) + + # configure second address, delete first, verify route not removed + if_addr2.add_vpp_config() + if_addr1.remove_vpp_config() + self.assertTrue(if_addr1.query_vpp_config()) # 10.10.10.0/24 + self.assertFalse(find_route(self, "10.10.10.10", 32)) + self.assertTrue(find_route(self, "10.10.10.20", 32)) + self.assertTrue(find_route(self, "10.10.10.255", 32)) + self.assertTrue(find_route(self, "10.10.10.0", 32)) + + # delete second address, verify route removed + if_addr2.remove_vpp_config() + self.assertFalse(if_addr1.query_vpp_config()) # 10.10.10.0/24 + self.assertFalse(find_route(self, "10.10.10.10", 32)) + self.assertFalse(find_route(self, "10.10.10.20", 32)) + self.assertFalse(find_route(self, "10.10.10.255", 32)) + self.assertFalse(find_route(self, "10.10.10.0", 32)) + + def test_ipv4_ifaddr_route(self): + """ IPv4 Interface Address Route test + + Test scenario: + + - Create loopback + - Configure IPv4 address on loopback + - Verify that address is not in the FIB + - Bring loopback up + - Verify that address is in the FIB now + - Bring loopback down + - Verify that address is not in the FIB anymore + - Bring loopback up + - Configure IPv4 address on loopback + - Verify that address is in the FIB now + """ + + # create a loopback and configure IPv4 + loopbacks = self.create_loopback_interfaces(1) + lo_if = self.lo_interfaces[0] + + lo_if.local_ip4_prefix_len = 32 + lo_if.config_ip4() + + # The intf was down when addr was added -> entry not in FIB + fib4_dump = self.vapi.ip_route_dump(0) + self.assertFalse(lo_if.is_ip4_entry_in_fib_dump(fib4_dump)) + + # When intf is brought up, entry is added + lo_if.admin_up() + fib4_dump = self.vapi.ip_route_dump(0) + self.assertTrue(lo_if.is_ip4_entry_in_fib_dump(fib4_dump)) + + # When intf is brought down, entry is removed + lo_if.admin_down() + fib4_dump = self.vapi.ip_route_dump(0) + self.assertFalse(lo_if.is_ip4_entry_in_fib_dump(fib4_dump)) + + # Remove addr, bring up interface, re-add -> entry in FIB + lo_if.unconfig_ip4() + lo_if.admin_up() + lo_if.config_ip4() + fib4_dump = self.vapi.ip_route_dump(0) + self.assertTrue(lo_if.is_ip4_entry_in_fib_dump(fib4_dump)) + + class TestICMPEcho(VppTestCase): """ ICMP Echo Test Case """ @@ -249,7 +377,7 @@ class TestICMPEcho(VppTestCase): icmp_id = 0xb icmp_seq = 5 - icmp_load = '\x0a' * 18 + icmp_load = b'\x0a' * 18 p_echo_request = (Ether(src=self.pg0.remote_mac, dst=self.pg0.local_mac) / IP(src=self.pg0.remote_ip4, dst=self.pg0.local_ip4) / @@ -559,7 +687,7 @@ class TestIPNull(VppTestCase): dst=self.pg0.local_mac) / IP(src=self.pg0.remote_ip4, dst="10.0.0.1") / UDP(sport=1234, dport=1234) / - Raw('\xa5' * 100)) + Raw(b'\xa5' * 100)) self.pg0.add_stream(p_unreach) self.pg_enable_capture(self.pg_interfaces) self.pg_start() @@ -592,7 +720,7 @@ class TestIPNull(VppTestCase): dst=self.pg0.local_mac) / IP(src=self.pg0.remote_ip4, dst="10.0.0.2") / UDP(sport=1234, dport=1234) / - Raw('\xa5' * 100)) + Raw(b'\xa5' * 100)) self.pg0.add_stream(p_prohibit) self.pg_enable_capture(self.pg_interfaces) @@ -615,7 +743,7 @@ class TestIPNull(VppTestCase): dst=self.pg0.local_mac) / IP(src=self.pg0.remote_ip4, dst="1.1.1.1") / UDP(sport=1234, dport=1234) / - Raw('\xa5' * 100)) + Raw(b'\xa5' * 100)) r1 = VppIpRoute(self, "1.1.1.0", 24, [VppRoutePath(self.pg1.remote_ip4, @@ -691,12 +819,12 @@ class TestIPDisabled(VppTestCase): dst=self.pg1.local_mac) / IP(src="10.10.10.10", dst=self.pg0.remote_ip4) / UDP(sport=1234, dport=1234) / - Raw('\xa5' * 100)) + Raw(b'\xa5' * 100)) pm = (Ether(src=self.pg1.remote_mac, dst=self.pg1.local_mac) / IP(src="10.10.10.10", dst="232.1.1.1") / UDP(sport=1234, dport=1234) / - Raw('\xa5' * 100)) + Raw(b'\xa5' * 100)) # # PG1 does not forward IP traffic @@ -780,7 +908,7 @@ class TestIPSubNets(VppTestCase): dst=self.pg1.local_mac) / IP(dst="10.10.10.10", src=self.pg0.local_ip4) / UDP(sport=1234, dport=1234) / - Raw('\xa5' * 100)) + Raw(b'\xa5' * 100)) self.pg1.add_stream(p) self.pg_enable_capture(self.pg_interfaces) @@ -793,27 +921,28 @@ class TestIPSubNets(VppTestCase): ip_addr_n = socket.inet_pton(socket.AF_INET, "10.10.10.10") self.vapi.sw_interface_add_del_address( - sw_if_index=self.pg0.sw_if_index, address=ip_addr_n, - address_length=16) + sw_if_index=self.pg0.sw_if_index, + prefix=VppIpPrefix("10.10.10.10", 16).encode()) pn = (Ether(src=self.pg1.remote_mac, dst=self.pg1.local_mac) / IP(dst="10.10.0.0", src=self.pg0.local_ip4) / UDP(sport=1234, dport=1234) / - Raw('\xa5' * 100)) + Raw(b'\xa5' * 100)) pb = (Ether(src=self.pg1.remote_mac, dst=self.pg1.local_mac) / IP(dst="10.10.255.255", src=self.pg0.local_ip4) / UDP(sport=1234, dport=1234) / - Raw('\xa5' * 100)) + Raw(b'\xa5' * 100)) self.send_and_assert_no_replies(self.pg1, pn, "IP Network address") self.send_and_assert_no_replies(self.pg1, pb, "IP Broadcast address") # remove the sub-net and we are forwarding via the cover again self.vapi.sw_interface_add_del_address( - sw_if_index=self.pg0.sw_if_index, address=ip_addr_n, - address_length=16, is_add=0) + sw_if_index=self.pg0.sw_if_index, + prefix=VppIpPrefix("10.10.10.10", 16).encode(), is_add=0) + self.pg1.add_stream(pn) self.pg_enable_capture(self.pg_interfaces) self.pg_start() @@ -830,14 +959,14 @@ class TestIPSubNets(VppTestCase): ip_addr_n = socket.inet_pton(socket.AF_INET, "10.10.10.10") self.vapi.sw_interface_add_del_address( - sw_if_index=self.pg0.sw_if_index, address=ip_addr_n, - address_length=31) + sw_if_index=self.pg0.sw_if_index, + prefix=VppIpPrefix("10.10.10.10", 31).encode()) pn = (Ether(src=self.pg1.remote_mac, dst=self.pg1.local_mac) / IP(dst="10.10.10.11", src=self.pg0.local_ip4) / UDP(sport=1234, dport=1234) / - Raw('\xa5' * 100)) + Raw(b'\xa5' * 100)) self.pg1.add_stream(pn) self.pg_enable_capture(self.pg_interfaces) @@ -847,8 +976,9 @@ class TestIPSubNets(VppTestCase): # remove the sub-net and we are forwarding via the cover again self.vapi.sw_interface_add_del_address( - sw_if_index=self.pg0.sw_if_index, address=ip_addr_n, - address_length=31, is_add=0) + sw_if_index=self.pg0.sw_if_index, + prefix=VppIpPrefix("10.10.10.10", 31).encode(), is_add=0) + self.pg1.add_stream(pn) self.pg_enable_capture(self.pg_interfaces) self.pg_start() @@ -922,7 +1052,7 @@ class TestIPLoadBalance(VppTestCase): for ii in range(NUM_PKTS): port_ip_hdr = (IP(dst="10.0.0.1", src="20.0.0.1") / UDP(sport=1234, dport=1234 + ii) / - Raw('\xa5' * 100)) + Raw(b'\xa5' * 100)) port_ip_pkts.append((Ether(src=self.pg0.remote_mac, dst=self.pg0.local_mac) / port_ip_hdr)) @@ -933,7 +1063,7 @@ class TestIPLoadBalance(VppTestCase): src_ip_hdr = (IP(dst="10.0.0.1", src="20.0.0.%d" % ii) / UDP(sport=1234, dport=1234) / - Raw('\xa5' * 100)) + Raw(b'\xa5' * 100)) src_ip_pkts.append((Ether(src=self.pg0.remote_mac, dst=self.pg0.local_mac) / src_ip_hdr)) @@ -1002,12 +1132,12 @@ class TestIPLoadBalance(VppTestCase): dst=self.pg0.local_mac) / IP(dst="1.1.1.1", src="20.0.0.1") / UDP(sport=1234, dport=1234 + ii) / - Raw('\xa5' * 100))) + Raw(b'\xa5' * 100))) src_pkts.append((Ether(src=self.pg0.remote_mac, dst=self.pg0.local_mac) / IP(dst="1.1.1.1", src="20.0.0.%d" % ii) / UDP(sport=1234, dport=1234) / - Raw('\xa5' * 100))) + Raw(b'\xa5' * 100))) route_10_0_0_2 = VppIpRoute(self, "10.0.0.2", 32, [VppRoutePath(self.pg3.remote_ip4, @@ -1090,7 +1220,7 @@ class TestIPLoadBalance(VppTestCase): dst=self.pg0.local_mac) / IP(dst="1.1.1.2", src="20.0.0.2") / UDP(sport=1234, dport=1234 + ii) / - Raw('\xa5' * 100))) + Raw(b'\xa5' * 100))) route_10_0_0_3 = VppIpRoute(self, "10.0.0.3", 32, [VppRoutePath(self.pg3.remote_ip4, @@ -1126,7 +1256,7 @@ class TestIPLoadBalance(VppTestCase): dst=self.pg0.local_mac) / IP(dst="10.0.0.3", src="20.0.0.2") / UDP(sport=1234, dport=1234 + ii) / - Raw('\xa5' * 100)) + Raw(b'\xa5' * 100)) self.send_and_expect_one_itf(self.pg0, port_pkts, self.pg4) @@ -1178,7 +1308,7 @@ class TestIPVlan0(VppTestCase): IP(dst=self.pg1.remote_ip4, src=self.pg0.remote_ip4) / UDP(sport=1234, dport=1234) / - Raw('\xa5' * 100)) * NUM_PKTS + Raw(b'\xa5' * 100)) * NUM_PKTS # # Expect that packets sent on VLAN-0 are forwarded on the @@ -1239,7 +1369,7 @@ class TestIPPunt(VppTestCase): dst=self.pg0.local_mac) / IP(src=self.pg0.remote_ip4, dst=self.pg0.local_ip4) / UDP(sport=1234, dport=1234) / - Raw('\xa5' * 100)) + Raw(b'\xa5' * 100)) pkts = p * 1025 @@ -1404,12 +1534,12 @@ class TestIPDeag(VppTestCase): dst=self.pg0.local_mac) / IP(src="5.5.5.5", dst="1.1.1.1") / TCP(sport=1234, dport=1234) / - Raw('\xa5' * 100)) + Raw(b'\xa5' * 100)) p_src = (Ether(src=self.pg0.remote_mac, dst=self.pg0.local_mac) / IP(src="2.2.2.2", dst="1.1.1.2") / TCP(sport=1234, dport=1234) / - Raw('\xa5' * 100)) + Raw(b'\xa5' * 100)) pkts_dst = p_dst * 257 pkts_src = p_src * 257 @@ -1452,7 +1582,7 @@ class TestIPDeag(VppTestCase): dst=self.pg0.local_mac) / IP(src="2.2.2.4", dst="2.2.2.3") / TCP(sport=1234, dport=1234) / - Raw('\xa5' * 100)) + Raw(b'\xa5' * 100)) self.send_and_assert_no_replies(self.pg0, p_l * 257, "IP lookup loop") @@ -1500,7 +1630,7 @@ class TestIPInput(VppTestCase): dst=self.pg1.remote_ip4, len=40) / UDP(sport=1234, dport=1234) / - Raw('\xa5' * 100)) + Raw(b'\xa5' * 100)) rx = self.send_and_expect(self.pg0, p_short * NUM_PKTS, self.pg1) @@ -1513,7 +1643,7 @@ class TestIPInput(VppTestCase): dst=self.pg1.remote_ip4, len=400) / UDP(sport=1234, dport=1234) / - Raw('\xa5' * 100)) + Raw(b'\xa5' * 100)) rx = self.send_and_assert_no_replies(self.pg0, p_long * NUM_PKTS, "too long") @@ -1527,7 +1657,7 @@ class TestIPInput(VppTestCase): dst=self.pg1.remote_ip4, chksum=400) / UDP(sport=1234, dport=1234) / - Raw('\xa5' * 100)) + Raw(b'\xa5' * 100)) rx = self.send_and_assert_no_replies(self.pg0, p_chksum * NUM_PKTS, "bad checksum") @@ -1541,7 +1671,7 @@ class TestIPInput(VppTestCase): dst=self.pg1.remote_ip4, version=3) / UDP(sport=1234, dport=1234) / - Raw('\xa5' * 100)) + Raw(b'\xa5' * 100)) rx = self.send_and_assert_no_replies(self.pg0, p_ver * NUM_PKTS, "funky version") @@ -1555,7 +1685,7 @@ class TestIPInput(VppTestCase): dst=self.pg1.remote_ip4, frag=1) / UDP(sport=1234, dport=1234) / - Raw('\xa5' * 100)) + Raw(b'\xa5' * 100)) rx = self.send_and_assert_no_replies(self.pg0, p_frag * NUM_PKTS, "frag offset") @@ -1569,7 +1699,7 @@ class TestIPInput(VppTestCase): dst=self.pg1.remote_ip4, ttl=1) / UDP(sport=1234, dport=1234) / - Raw('\xa5' * 100)) + Raw(b'\xa5' * 100)) rx = self.send_and_expect(self.pg0, p_ttl * NUM_PKTS, self.pg0) @@ -1591,7 +1721,7 @@ class TestIPInput(VppTestCase): dst=self.pg1.remote_ip4, ttl=10, flags='DF') / UDP(sport=1234, dport=1234) / - Raw('\xa5' * 2000)) + Raw(b'\xa5' * 2000)) self.vapi.sw_interface_set_mtu(self.pg1.sw_if_index, [1500, 0, 0, 0]) @@ -1619,7 +1749,7 @@ class TestIPInput(VppTestCase): IP(src="0.0.0.0", dst=self.pg0.local_ip4) / ICMP(id=4, seq=4) / - Raw(load='\x0a' * 18)) + Raw(load=b'\x0a' * 18)) rx = self.send_and_assert_no_replies(self.pg0, p_s0 * 17) p_s0 = (Ether(src=self.pg0.remote_mac, @@ -1627,7 +1757,7 @@ class TestIPInput(VppTestCase): IP(src="255.255.255.255", dst=self.pg0.local_ip4) / ICMP(id=4, seq=4) / - Raw(load='\x0a' * 18)) + Raw(load=b'\x0a' * 18)) rx = self.send_and_assert_no_replies(self.pg0, p_s0 * 17) @@ -1669,13 +1799,13 @@ class TestIPDirectedBroadcast(VppTestCase): IP(src="1.1.1.1", dst=self.pg0._local_ip4_bcast) / UDP(sport=1234, dport=1234) / - Raw('\xa5' * 2000)) + Raw(b'\xa5' * 2000)) p1 = (Ether(src=self.pg0.remote_mac, dst=self.pg0.local_mac) / IP(src="1.1.1.1", dst=self.pg1._local_ip4_bcast) / UDP(sport=1234, dport=1234) / - Raw('\xa5' * 2000)) + Raw(b'\xa5' * 2000)) self.pg0.config_ip4() self.pg0.resolve_arp() @@ -1751,13 +1881,13 @@ class TestIPLPM(VppTestCase): IP(src="1.1.1.1", dst="10.1.1.1") / UDP(sport=1234, dport=1234) / - Raw('\xa5' * 2000)) + Raw(b'\xa5' * 2000)) p_24 = (Ether(src=self.pg0.remote_mac, dst=self.pg0.local_mac) / IP(src="1.1.1.1", dst="10.1.2.1") / UDP(sport=1234, dport=1234) / - Raw('\xa5' * 2000)) + Raw(b'\xa5' * 2000)) self.logger.info(self.vapi.cli("sh ip fib mtrie")) rx = self.send_and_expect(self.pg0, p_8 * NUM_PKTS, self.pg2) @@ -1808,7 +1938,7 @@ class TestIPv4Frag(VppTestCase): packets = self.dst_if.get_capture(3) # Assume VPP sends the fragments in order - payload = '' + payload = b'' for p in packets: payload_offset = p.frag * 8 if payload_offset > 0: