X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=test%2Ftest_ip4.py;h=60bc023a28046ee12486694b4cca6aae42dbb2dc;hb=053204ab039d34a990ff0e14c32ce3b294fcce0e;hp=933958911fe1c1497c9c374b1c5d4b360598ff21;hpb=097fa66b986f06281f603767d321ab13ab6c88c3;p=vpp.git diff --git a/test/test_ip4.py b/test/test_ip4.py index 933958911fe..60bc023a280 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 @@ -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 """ @@ -793,8 +921,8 @@ 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) / @@ -812,8 +940,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=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,8 +959,8 @@ 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) / @@ -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()