X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=test%2Ftest_ip4.py;h=933958911fe1c1497c9c374b1c5d4b360598ff21;hb=097fa66b9;hp=7ed6580315ee16b5ce0400e35ad7cc4a76d40557;hpb=7f9b7f9f492d1748d8ba025b3a713058fdb1943d;p=vpp.git diff --git a/test/test_ip4.py b/test/test_ip4.py index 7ed6580315e..933958911fe 100644 --- a/test/test_ip4.py +++ b/test/test_ip4.py @@ -15,8 +15,11 @@ from framework import VppTestCase, VppTestRunner from util import ppp from vpp_ip_route import VppIpRoute, VppRoutePath, VppIpMRoute, \ VppMRoutePath, MRouteItfFlags, MRouteEntryFlags, VppMplsIpBind, \ - VppMplsTable, VppIpTable + VppMplsTable, VppIpTable, FibPathType, find_route from vpp_sub_interface import VppSubInterface, VppDot1QSubint, VppDot1ADSubint +from vpp_papi import VppEnum + +NUM_PKTS = 67 class TestIPv4(VppTestCase): @@ -77,41 +80,14 @@ class TestIPv4(VppTestCase): i.resolve_arp() # config 2M FIB entries - self.config_fib_entries(200) def tearDown(self): """Run standard test teardown and log ``show ip arp``.""" super(TestIPv4, self).tearDown() - if not self.vpp_dead: - self.logger.info(self.vapi.cli("show ip arp")) - # info(self.vapi.cli("show ip fib")) # many entries - - def config_fib_entries(self, count): - """For each interface add to the FIB table *count* routes to - "10.0.0.1/32" destination with interface's local address as next-hop - address. - :param int count: Number of FIB entries. - - - *TODO:* check if the next-hop address shouldn't be remote address - instead of local address. - """ - n_int = len(self.interfaces) - percent = 0 - counter = 0.0 - dest_addr = socket.inet_pton(socket.AF_INET, "10.0.0.1") - dest_addr_len = 32 - for i in self.interfaces: - next_hop_address = i.local_ip4n - for j in range(count / n_int): - self.vapi.ip_add_del_route(dst_address=dest_addr, - dst_address_length=dest_addr_len, - next_hop_address=next_hop_address) - counter += 1 - if counter / count * 100 > percent: - self.logger.info("Configure %d FIB entries .. %d%% done" % - (count, percent)) - percent += 1 + def show_commands_at_teardown(self): + self.logger.info(self.vapi.cli("show ip arp")) + # info(self.vapi.cli("show ip fib")) # many entries def modify_packet(self, src_if, packet_size, pkt): """Add load, set destination IP and extend packet to required packet @@ -314,7 +290,8 @@ class TestIPv4FibCrud(VppTestCase): ..note:: Python API is too slow to add many routes, needs replacement. """ - def config_fib_many_to_one(self, start_dest_addr, next_hop_addr, count): + def config_fib_many_to_one(self, start_dest_addr, next_hop_addr, + count, start=0): """ :param start_dest_addr: @@ -322,42 +299,30 @@ class TestIPv4FibCrud(VppTestCase): :param count: :return list: added ips with 32 prefix """ - added_ips = [] - dest_addr = int(binascii.hexlify(socket.inet_pton(socket.AF_INET, - start_dest_addr)), 16) - dest_addr_len = 32 - n_next_hop_addr = socket.inet_pton(socket.AF_INET, next_hop_addr) - for _ in range(count): - n_dest_addr = binascii.unhexlify('{:08x}'.format(dest_addr)) - self.vapi.ip_add_del_route(dst_address=n_dest_addr, - dst_address_length=dest_addr_len, - next_hop_address=n_next_hop_addr) - added_ips.append(socket.inet_ntoa(n_dest_addr)) - dest_addr += 1 - return added_ips - - def unconfig_fib_many_to_one(self, start_dest_addr, next_hop_addr, count): - - removed_ips = [] - dest_addr = int(binascii.hexlify(socket.inet_pton(socket.AF_INET, - start_dest_addr)), 16) - dest_addr_len = 32 - n_next_hop_addr = socket.inet_pton(socket.AF_INET, next_hop_addr) - for _ in range(count): - n_dest_addr = binascii.unhexlify('{:08x}'.format(dest_addr)) - self.vapi.ip_add_del_route(dst_address=n_dest_addr, - dst_address_length=dest_addr_len, - next_hop_address=n_next_hop_addr, - is_add=0) - removed_ips.append(socket.inet_ntoa(n_dest_addr)) - dest_addr += 1 - return removed_ips - - def create_stream(self, src_if, dst_if, dst_ips, count): + routes = [] + for i in range(count): + r = VppIpRoute(self, start_dest_addr % (i + start), 32, + [VppRoutePath(next_hop_addr, 0xffffffff)]) + r.add_vpp_config() + routes.append(r) + return routes + + def unconfig_fib_many_to_one(self, start_dest_addr, next_hop_addr, + count, start=0): + + routes = [] + for i in range(count): + r = VppIpRoute(self, start_dest_addr % (i + start), 32, + [VppRoutePath(next_hop_addr, 0xffffffff)]) + r.remove_vpp_config() + routes.append(r) + return routes + + def create_stream(self, src_if, dst_if, routes, count): pkts = [] for _ in range(count): - dst_addr = random.choice(dst_ips) + dst_addr = random.choice(routes).prefix.address info = self.create_packet_info(src_if, dst_if) payload = self.info_to_payload(info) p = (Ether(dst=src_if.local_mac, src=src_if.remote_mac) / @@ -385,18 +350,6 @@ class TestIPv4FibCrud(VppTestCase): return p return None - @staticmethod - def _match_route_detail(route_detail, ip, address_length=32, table_id=0): - if route_detail.address == socket.inet_pton(socket.AF_INET, ip): - if route_detail.table_id != table_id: - return False - elif route_detail.address_length != address_length: - return False - else: - return True - else: - return False - def verify_capture(self, dst_interface, received_pkts, expected_pkts): self.assertEqual(len(received_pkts), len(expected_pkts)) to_verify = list(expected_pkts) @@ -407,27 +360,13 @@ class TestIPv4FibCrud(VppTestCase): to_verify.remove(x) self.assertListEqual(to_verify, []) - def verify_route_dump(self, fib_dump, ips): - - def _ip_in_route_dump(ip, fib_dump): - return next((route for route in fib_dump - if self._match_route_detail(route, ip)), - False) - - for ip in ips: - self.assertTrue(_ip_in_route_dump(ip, fib_dump), - 'IP {!s} is not in fib dump.'.format(ip)) + def verify_route_dump(self, routes): + for r in routes: + self.assertTrue(find_route(self, r.prefix.address, r.prefix.len)) - def verify_not_in_route_dump(self, fib_dump, ips): - - def _ip_in_route_dump(ip, fib_dump): - return next((route for route in fib_dump - if self._match_route_detail(route, ip)), - False) - - for ip in ips: - self.assertFalse(_ip_in_route_dump(ip, fib_dump), - 'IP {!s} is in fib dump.'.format(ip)) + def verify_not_in_route_dump(self, routes): + for r in routes: + self.assertFalse(find_route(self, r.prefix.address, r.prefix.len)) @classmethod def setUpClass(cls): @@ -470,16 +409,13 @@ class TestIPv4FibCrud(VppTestCase): self.deleted_routes = [] def test_1_add_routes(self): - """ Add 1k routes + """ Add 1k routes """ - - add 100 routes check with traffic script. - """ - # config 1M FIB entries + # add 100 routes check with traffic script. self.configured_routes.extend(self.config_fib_many_to_one( - "10.0.0.0", self.pg0.remote_ip4, 100)) + "10.0.0.%d", self.pg0.remote_ip4, 100)) - fib_dump = self.vapi.ip_fib_dump() - self.verify_route_dump(fib_dump, self.configured_routes) + self.verify_route_dump(self.configured_routes) self.stream_1 = self.create_stream( self.pg1, self.pg0, self.configured_routes, 100) @@ -501,14 +437,13 @@ class TestIPv4FibCrud(VppTestCase): """ # config 1M FIB entries self.configured_routes.extend(self.config_fib_many_to_one( - "10.0.0.0", self.pg0.remote_ip4, 100)) + "10.0.0.%d", self.pg0.remote_ip4, 100)) self.deleted_routes.extend(self.unconfig_fib_many_to_one( - "10.0.0.10", self.pg0.remote_ip4, 10)) + "10.0.0.%d", self.pg0.remote_ip4, 10, start=10)) for x in self.deleted_routes: self.configured_routes.remove(x) - fib_dump = self.vapi.ip_fib_dump() - self.verify_route_dump(fib_dump, self.configured_routes) + self.verify_route_dump(self.configured_routes) self.stream_1 = self.create_stream( self.pg1, self.pg0, self.configured_routes, 100) @@ -534,23 +469,22 @@ class TestIPv4FibCrud(VppTestCase): """ # config 1M FIB entries self.configured_routes.extend(self.config_fib_many_to_one( - "10.0.0.0", self.pg0.remote_ip4, 100)) + "10.0.0.%d", self.pg0.remote_ip4, 100)) self.deleted_routes.extend(self.unconfig_fib_many_to_one( - "10.0.0.10", self.pg0.remote_ip4, 10)) + "10.0.0.%d", self.pg0.remote_ip4, 10, start=10)) for x in self.deleted_routes: self.configured_routes.remove(x) tmp = self.config_fib_many_to_one( - "10.0.0.10", self.pg0.remote_ip4, 5) + "10.0.0.%d", self.pg0.remote_ip4, 5, start=10) self.configured_routes.extend(tmp) for x in tmp: self.deleted_routes.remove(x) self.configured_routes.extend(self.config_fib_many_to_one( - "10.0.1.0", self.pg0.remote_ip4, 100)) + "10.0.1.%d", self.pg0.remote_ip4, 100)) - fib_dump = self.vapi.ip_fib_dump() - self.verify_route_dump(fib_dump, self.configured_routes) + self.verify_route_dump(self.configured_routes) self.stream_1 = self.create_stream( self.pg1, self.pg0, self.configured_routes, 300) @@ -569,20 +503,15 @@ class TestIPv4FibCrud(VppTestCase): pkts = self.pg0.get_capture(len(self.stream_1) + len(self.stream_2)) self.verify_capture(self.pg0, pkts, self.stream_1 + self.stream_2) - def test_4_del_routes(self): - """ Delete 1.5k routes - - - delete 5 routes check with traffic script. - - add 100 routes check with traffic script. - """ + # delete 5 routes check with traffic script. + # add 100 routes check with traffic script. self.deleted_routes.extend(self.unconfig_fib_many_to_one( - "10.0.0.0", self.pg0.remote_ip4, 15)) + "10.0.0.%d", self.pg0.remote_ip4, 15)) self.deleted_routes.extend(self.unconfig_fib_many_to_one( - "10.0.0.20", self.pg0.remote_ip4, 85)) + "10.0.0.%d", self.pg0.remote_ip4, 85)) self.deleted_routes.extend(self.unconfig_fib_many_to_one( - "10.0.1.0", self.pg0.remote_ip4, 100)) - fib_dump = self.vapi.ip_fib_dump() - self.verify_not_in_route_dump(fib_dump, self.deleted_routes) + "10.0.1.%d", self.pg0.remote_ip4, 100)) + self.verify_not_in_route_dump(self.deleted_routes) class TestIPNull(VppTestCase): @@ -619,7 +548,11 @@ class TestIPNull(VppTestCase): # # A route via IP NULL that will reply with ICMP unreachables # - ip_unreach = VppIpRoute(self, "10.0.0.1", 32, [], is_unreach=1) + ip_unreach = VppIpRoute( + self, "10.0.0.1", 32, + [VppRoutePath("0.0.0.0", + 0xffffffff, + type=FibPathType.FIB_PATH_TYPE_ICMP_UNREACH)]) ip_unreach.add_vpp_config() p_unreach = (Ether(src=self.pg0.remote_mac, @@ -627,7 +560,6 @@ class TestIPNull(VppTestCase): IP(src=self.pg0.remote_ip4, dst="10.0.0.1") / UDP(sport=1234, dport=1234) / Raw('\xa5' * 100)) - self.pg0.add_stream(p_unreach) self.pg_enable_capture(self.pg_interfaces) self.pg_start() @@ -649,7 +581,11 @@ class TestIPNull(VppTestCase): # # A route via IP NULL that will reply with ICMP prohibited # - ip_prohibit = VppIpRoute(self, "10.0.0.2", 32, [], is_prohibit=1) + ip_prohibit = VppIpRoute( + self, "10.0.0.2", 32, + [VppRoutePath("0.0.0.0", + 0xffffffff, + type=FibPathType.FIB_PATH_TYPE_ICMP_PROHIBIT)]) ip_prohibit.add_vpp_config() p_prohibit = (Ether(src=self.pg0.remote_mac, @@ -686,17 +622,20 @@ class TestIPNull(VppTestCase): self.pg1.sw_if_index)]) r1.add_vpp_config() - rx = self.send_and_expect(self.pg0, p * 65, self.pg1) + rx = self.send_and_expect(self.pg0, p * NUM_PKTS, self.pg1) # # insert a more specific as a drop # - r2 = VppIpRoute(self, "1.1.1.1", 32, [], is_drop=1) + r2 = VppIpRoute(self, "1.1.1.1", 32, + [VppRoutePath("0.0.0.0", + 0xffffffff, + type=FibPathType.FIB_PATH_TYPE_DROP)]) r2.add_vpp_config() - self.send_and_assert_no_replies(self.pg0, p * 65, "Drop Route") + self.send_and_assert_no_replies(self.pg0, p * NUM_PKTS, "Drop Route") r2.remove_vpp_config() - rx = self.send_and_expect(self.pg0, p * 65, self.pg1) + rx = self.send_and_expect(self.pg0, p * NUM_PKTS, self.pg1) class TestIPDisabled(VppTestCase): @@ -980,7 +919,7 @@ class TestIPLoadBalance(VppTestCase): src_ip_pkts = [] src_mpls_pkts = [] - for ii in range(65): + 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)) @@ -1239,7 +1178,7 @@ class TestIPVlan0(VppTestCase): IP(dst=self.pg1.remote_ip4, src=self.pg0.remote_ip4) / UDP(sport=1234, dport=1234) / - Raw('\xa5' * 100)) * 65 + Raw('\xa5' * 100)) * NUM_PKTS # # Expect that packets sent on VLAN-0 are forwarded on the @@ -1278,10 +1217,28 @@ class TestIPPunt(VppTestCase): def test_ip_punt(self): """ IP punt police and redirect """ + # use UDP packet that have a port we need to explicitly + # register to get punted. + pt_l4 = VppEnum.vl_api_punt_type_t.PUNT_API_TYPE_L4 + af_ip4 = VppEnum.vl_api_address_family_t.ADDRESS_IP4 + udp_proto = VppEnum.vl_api_ip_proto_t.IP_API_PROTO_UDP + punt_udp = { + 'type': pt_l4, + 'punt': { + 'l4': { + 'af': af_ip4, + 'protocol': udp_proto, + 'port': 1234, + } + } + } + + self.vapi.set_punt(is_add=1, punt=punt_udp) + p = (Ether(src=self.pg0.remote_mac, dst=self.pg0.local_mac) / IP(src=self.pg0.remote_ip4, dst=self.pg0.local_ip4) / - TCP(sport=1234, dport=1234) / + UDP(sport=1234, dport=1234) / Raw('\xa5' * 100)) pkts = p * 1025 @@ -1430,11 +1387,12 @@ class TestIPDeag(VppTestCase): [VppRoutePath("0.0.0.0", 0xffffffff, nh_table_id=1)]) - route_to_src = VppIpRoute(self, "1.1.1.2", 32, - [VppRoutePath("0.0.0.0", - 0xffffffff, - nh_table_id=2, - is_source_lookup=1)]) + route_to_src = VppIpRoute( + self, "1.1.1.2", 32, + [VppRoutePath("0.0.0.0", + 0xffffffff, + nh_table_id=2, + type=FibPathType.FIB_PATH_TYPE_SOURCE_LOOKUP)]) route_to_dst.add_vpp_config() route_to_src.add_vpp_config() @@ -1468,6 +1426,7 @@ class TestIPDeag(VppTestCase): self.pg1.sw_if_index)], table_id=1) route_in_dst.add_vpp_config() + self.send_and_expect(self.pg0, pkts_dst, self.pg1) # @@ -1543,7 +1502,7 @@ class TestIPInput(VppTestCase): UDP(sport=1234, dport=1234) / Raw('\xa5' * 100)) - rx = self.send_and_expect(self.pg0, p_short * 65, self.pg1) + rx = self.send_and_expect(self.pg0, p_short * NUM_PKTS, self.pg1) # # Packet too long - this is dropped @@ -1556,7 +1515,7 @@ class TestIPInput(VppTestCase): UDP(sport=1234, dport=1234) / Raw('\xa5' * 100)) - rx = self.send_and_assert_no_replies(self.pg0, p_long * 65, + rx = self.send_and_assert_no_replies(self.pg0, p_long * NUM_PKTS, "too long") # @@ -1570,7 +1529,7 @@ class TestIPInput(VppTestCase): UDP(sport=1234, dport=1234) / Raw('\xa5' * 100)) - rx = self.send_and_assert_no_replies(self.pg0, p_chksum * 65, + rx = self.send_and_assert_no_replies(self.pg0, p_chksum * NUM_PKTS, "bad checksum") # @@ -1584,7 +1543,7 @@ class TestIPInput(VppTestCase): UDP(sport=1234, dport=1234) / Raw('\xa5' * 100)) - rx = self.send_and_assert_no_replies(self.pg0, p_ver * 65, + rx = self.send_and_assert_no_replies(self.pg0, p_ver * NUM_PKTS, "funky version") # @@ -1598,7 +1557,7 @@ class TestIPInput(VppTestCase): UDP(sport=1234, dport=1234) / Raw('\xa5' * 100)) - rx = self.send_and_assert_no_replies(self.pg0, p_frag * 65, + rx = self.send_and_assert_no_replies(self.pg0, p_frag * NUM_PKTS, "frag offset") # @@ -1612,7 +1571,7 @@ class TestIPInput(VppTestCase): UDP(sport=1234, dport=1234) / Raw('\xa5' * 100)) - rx = self.send_and_expect(self.pg0, p_ttl * 65, self.pg0) + rx = self.send_and_expect(self.pg0, p_ttl * NUM_PKTS, self.pg0) rx = rx[0] icmp = rx[ICMP] @@ -1636,7 +1595,7 @@ class TestIPInput(VppTestCase): self.vapi.sw_interface_set_mtu(self.pg1.sw_if_index, [1500, 0, 0, 0]) - rx = self.send_and_expect(self.pg0, p_mtu * 65, self.pg0) + rx = self.send_and_expect(self.pg0, p_mtu * NUM_PKTS, self.pg0) rx = rx[0] icmp = rx[ICMP] @@ -1647,7 +1606,7 @@ class TestIPInput(VppTestCase): self.assertEqual(icmp.dst, self.pg1.remote_ip4) self.vapi.sw_interface_set_mtu(self.pg1.sw_if_index, [2500, 0, 0, 0]) - rx = self.send_and_expect(self.pg0, p_mtu * 65, self.pg1) + rx = self.send_and_expect(self.pg0, p_mtu * NUM_PKTS, self.pg1) # Reset MTU for subsequent tests self.vapi.sw_interface_set_mtu(self.pg1.sw_if_index, [9000, 0, 0, 0]) @@ -1726,10 +1685,10 @@ class TestIPDirectedBroadcast(VppTestCase): # # test packet is L2 broadcast # - rx = self.send_and_expect(self.pg1, p0 * 65, self.pg0) + rx = self.send_and_expect(self.pg1, p0 * NUM_PKTS, self.pg0) self.assertTrue(rx[0][Ether].dst, "ff:ff:ff:ff:ff:ff") - self.send_and_assert_no_replies(self.pg0, p1 * 65, + self.send_and_assert_no_replies(self.pg0, p1 * NUM_PKTS, "directed broadcast disabled") # @@ -1737,12 +1696,12 @@ class TestIPDirectedBroadcast(VppTestCase): # self.vapi.sw_interface_set_ip_directed_broadcast( self.pg0.sw_if_index, 0) - self.send_and_assert_no_replies(self.pg1, p0 * 65, + self.send_and_assert_no_replies(self.pg1, p0 * NUM_PKTS, "directed broadcast disabled") self.vapi.sw_interface_set_ip_directed_broadcast( self.pg0.sw_if_index, 1) - rx = self.send_and_expect(self.pg1, p0 * 65, self.pg0) + rx = self.send_and_expect(self.pg1, p0 * NUM_PKTS, self.pg0) self.pg0.unconfig_ip4() self.pg1.unconfig_ip4() @@ -1801,8 +1760,8 @@ class TestIPLPM(VppTestCase): Raw('\xa5' * 2000)) self.logger.info(self.vapi.cli("sh ip fib mtrie")) - rx = self.send_and_expect(self.pg0, p_8 * 65, self.pg2) - rx = self.send_and_expect(self.pg0, p_24 * 65, self.pg1) + rx = self.send_and_expect(self.pg0, p_8 * NUM_PKTS, self.pg2) + rx = self.send_and_expect(self.pg0, p_24 * NUM_PKTS, self.pg1) class TestIPv4Frag(VppTestCase):