X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=test%2Ftest_dhcp6.py;h=57eb113fb13a603d8bd43d7e7ad813a5fd24397e;hb=0972edc1c2a232e9fb7364d517f6eaf9b71431b9;hp=e017feebffe8196d8c226e1dcb046468918a3fc6;hpb=7f9b7f9f492d1748d8ba025b3a713058fdb1943d;p=vpp.git diff --git a/test/test_dhcp6.py b/test/test_dhcp6.py index e017feebffe..57eb113fb13 100644 --- a/test/test_dhcp6.py +++ b/test/test_dhcp6.py @@ -1,4 +1,4 @@ -from socket import AF_INET6 +from socket import AF_INET6, inet_ntop, inet_pton from scapy.layers.dhcp6 import DHCP6_Advertise, DHCP6OptClientId, \ DHCP6OptStatusCode, DHCP6OptPref, DHCP6OptIA_PD, DHCP6OptIAPrefix, \ @@ -7,10 +7,13 @@ from scapy.layers.dhcp6 import DHCP6_Advertise, DHCP6OptClientId, \ DHCP6OptIAAddress from scapy.layers.inet6 import IPv6, Ether, UDP from scapy.utils6 import in6_mactoifaceid -from scapy.utils import inet_ntop, inet_pton +from framework import tag_fixme_vpp_workers from framework import VppTestCase +from framework import tag_run_solo +from vpp_papi import VppEnum import util +import os def ip6_normalize(ip6): @@ -48,18 +51,23 @@ class TestDHCPv6DataPlane(VppTestCase): def test_dhcp_ia_na_send_solicit_receive_advertise(self): """ Verify DHCPv6 IA NA Solicit packet and Advertise event """ - self.vapi.dhcp6_clients_enable_disable() + self.vapi.dhcp6_clients_enable_disable(enable=1) self.pg_enable_capture(self.pg_interfaces) self.pg_start() - address_bin = '\00\01\00\02\00\03' + '\00' * 8 + '\00\05' - address = {'address': address_bin, + address = {'address': '1:2:3::5', 'preferred_time': 60, 'valid_time': 120} - self.vapi.dhcp6_send_client_message(msg_type=1, - sw_if_index=self.pg0.sw_if_index, - T1=20, T2=40, addresses=[address], - n_addresses=len([address])) + self.vapi.dhcp6_send_client_message( + server_index=0xffffffff, + mrc=1, + msg_type=VppEnum.vl_api_dhcpv6_msg_type_t.DHCPV6_MSG_API_SOLICIT, + sw_if_index=self.pg0.sw_if_index, + T1=20, + T2=40, + addresses=[address], + n_addresses=len( + [address])) rx_list = self.pg0.get_capture(1) self.assertEqual(len(rx_list), 1) packet = rx_list[0] @@ -85,7 +93,8 @@ class TestDHCPv6DataPlane(VppTestCase): self.assert_equal(address.preflft, 60) self.assert_equal(address.validlft, 120) - self.vapi.want_dhcp6_reply_events() + self.vapi.want_dhcp6_reply_events(enable_disable=1, + pid=os.getpid()) try: ia_na_opts = DHCP6OptIAAddress(addr='7:8::2', preflft=60, @@ -112,8 +121,8 @@ class TestDHCPv6DataPlane(VppTestCase): self.assert_equal(ev.T2, 40) reported_address = ev.addresses[0] - address = inet_pton(AF_INET6, ia_na_opts.getfieldval("addr")) - self.assert_equal(reported_address.address, address) + address = ia_na_opts.getfieldval("addr") + self.assert_equal(str(reported_address.address), address) self.assert_equal(reported_address.preferred_time, ia_na_opts.getfieldval("preflft")) self.assert_equal(reported_address.valid_time, @@ -121,21 +130,29 @@ class TestDHCPv6DataPlane(VppTestCase): finally: self.vapi.want_dhcp6_reply_events(enable_disable=0) + self.vapi.dhcp6_clients_enable_disable(enable=0) def test_dhcp_pd_send_solicit_receive_advertise(self): """ Verify DHCPv6 PD Solicit packet and Advertise event """ - self.vapi.dhcp6_clients_enable_disable() + self.vapi.dhcp6_clients_enable_disable(enable=1) self.pg_enable_capture(self.pg_interfaces) self.pg_start() - prefix_bin = '\00\01\00\02\00\03' + '\00' * 10 - prefix = {'prefix': prefix_bin, - 'prefix_length': 50, + + prefix = {'prefix': {'address': '1:2:3::', 'len': 50}, 'preferred_time': 60, 'valid_time': 120} - self.vapi.dhcp6_pd_send_client_message(1, self.pg0.sw_if_index, - T1=20, T2=40, prefixes=[prefix]) + prefixes = [prefix] + self.vapi.dhcp6_pd_send_client_message( + server_index=0xffffffff, + mrc=1, + msg_type=VppEnum.vl_api_dhcpv6_msg_type_t.DHCPV6_MSG_API_SOLICIT, + sw_if_index=self.pg0.sw_if_index, + T1=20, + T2=40, + prefixes=prefixes, + n_prefixes=len(prefixes)) rx_list = self.pg0.get_capture(1) self.assertEqual(len(rx_list), 1) packet = rx_list[0] @@ -162,7 +179,8 @@ class TestDHCPv6DataPlane(VppTestCase): self.assert_equal(prefix.preflft, 60) self.assert_equal(prefix.validlft, 120) - self.vapi.want_dhcp6_pd_reply_events() + self.vapi.want_dhcp6_pd_reply_events(enable_disable=1, + pid=os.getpid()) try: ia_pd_opts = DHCP6OptIAPrefix(prefix='7:8::', plen=56, preflft=60, @@ -189,9 +207,10 @@ class TestDHCPv6DataPlane(VppTestCase): self.assert_equal(ev.T2, 40) reported_prefix = ev.prefixes[0] - prefix = inet_pton(AF_INET6, ia_pd_opts.getfieldval("prefix")) - self.assert_equal(reported_prefix.prefix, prefix) - self.assert_equal(reported_prefix.prefix_length, + prefix = ia_pd_opts.getfieldval("prefix") + self.assert_equal( + str(reported_prefix.prefix).split('/')[0], prefix) + self.assert_equal(int(str(reported_prefix.prefix).split('/')[1]), ia_pd_opts.getfieldval("plen")) self.assert_equal(reported_prefix.preferred_time, ia_pd_opts.getfieldval("preflft")) @@ -200,8 +219,10 @@ class TestDHCPv6DataPlane(VppTestCase): finally: self.vapi.want_dhcp6_pd_reply_events(enable_disable=0) + self.vapi.dhcp6_clients_enable_disable(enable=0) +@tag_run_solo class TestDHCPv6IANAControlPlane(VppTestCase): """ DHCPv6 IA NA Control Plane Test Case """ @@ -226,17 +247,19 @@ class TestDHCPv6IANAControlPlane(VppTestCase): self.T1 = 1 self.T2 = 2 - fib = self.vapi.ip6_fib_dump() + fib = self.vapi.ip_route_dump(0, True) self.initial_addresses = set(self.get_interface_addresses(fib, self.pg0)) self.pg_enable_capture(self.pg_interfaces) self.pg_start() - self.vapi.dhcp6_client_enable_disable(self.pg0.sw_if_index) + self.vapi.dhcp6_client_enable_disable(sw_if_index=self.pg0.sw_if_index, + enable=1) def tearDown(self): - self.vapi.dhcp6_client_enable_disable(self.pg0.sw_if_index, enable=0) + self.vapi.dhcp6_client_enable_disable(sw_if_index=self.pg0.sw_if_index, + enable=0) for i in self.interfaces: i.admin_down() @@ -247,14 +270,14 @@ class TestDHCPv6IANAControlPlane(VppTestCase): def get_interface_addresses(fib, pg): lst = [] for entry in fib: - if entry.address_length == 128: - path = entry.path[0] + if entry.route.prefix.prefixlen == 128: + path = entry.route.paths[0] if path.sw_if_index == pg.sw_if_index: - lst.append(entry.address) + lst.append(str(entry.route.prefix.network_address)) return lst def get_addresses(self): - fib = self.vapi.ip6_fib_dump() + fib = self.vapi.ip_route_dump(0, True) addresses = set(self.get_interface_addresses(fib, self.pg0)) return addresses.difference(self.initial_addresses) @@ -288,7 +311,7 @@ class TestDHCPv6IANAControlPlane(VppTestCase): self.assertNotEqual(elapsed_time.elapsedtime, 0) else: self.assertEqual(elapsed_time.elapsedtime, 0) - except: + except BaseException: packet.show() raise @@ -376,12 +399,12 @@ class TestDHCPv6IANAControlPlane(VppTestCase): new_addresses = self.get_addresses() self.assertEqual(len(new_addresses), 1) addr = list(new_addresses)[0] - self.assertEqual(inet_ntop(AF_INET6, addr), '7:8::2') + self.assertEqual(addr, '7:8::2') self.sleep(2) # check that the address is deleted - fib = self.vapi.ip6_fib_dump() + fib = self.vapi.ip_route_dump(0, True) addresses = set(self.get_interface_addresses(fib, self.pg0)) new_addresses = addresses.difference(self.initial_addresses) self.assertEqual(len(new_addresses), 0) @@ -430,7 +453,7 @@ class TestDHCPv6IANAControlPlane(VppTestCase): self.sleep(0.5) # check FIB contains no addresses - fib = self.vapi.ip6_fib_dump() + fib = self.vapi.ip_route_dump(0, True) addresses = set(self.get_interface_addresses(fib, self.pg0)) new_addresses = addresses.difference(self.initial_addresses) self.assertEqual(len(new_addresses), 0) @@ -447,12 +470,13 @@ class TestDHCPv6IANAControlPlane(VppTestCase): self.sleep(0.5) # check FIB contains no addresses - fib = self.vapi.ip6_fib_dump() + fib = self.vapi.ip_route_dump(0, True) addresses = set(self.get_interface_addresses(fib, self.pg0)) new_addresses = addresses.difference(self.initial_addresses) self.assertEqual(len(new_addresses), 0) +@tag_fixme_vpp_workers class TestDHCPv6PDControlPlane(VppTestCase): """ DHCPv6 PD Control Plane Test Case """ @@ -477,7 +501,7 @@ class TestDHCPv6PDControlPlane(VppTestCase): self.T1 = 1 self.T2 = 2 - fib = self.vapi.ip6_fib_dump() + fib = self.vapi.ip_route_dump(0, True) self.initial_addresses = set(self.get_interface_addresses(fib, self.pg1)) @@ -487,7 +511,8 @@ class TestDHCPv6PDControlPlane(VppTestCase): self.prefix_group = 'my-pd-prefix-group' self.vapi.dhcp6_pd_client_enable_disable( - self.pg0.sw_if_index, + enable=1, + sw_if_index=self.pg0.sw_if_index, prefix_group=self.prefix_group) def tearDown(self): @@ -503,14 +528,14 @@ class TestDHCPv6PDControlPlane(VppTestCase): def get_interface_addresses(fib, pg): lst = [] for entry in fib: - if entry.address_length == 128: - path = entry.path[0] + if entry.route.prefix.prefixlen == 128: + path = entry.route.paths[0] if path.sw_if_index == pg.sw_if_index: - lst.append(entry.address) + lst.append(str(entry.route.prefix.network_address)) return lst def get_addresses(self): - fib = self.vapi.ip6_fib_dump() + fib = self.vapi.ip_route_dump(0, True) addresses = set(self.get_interface_addresses(fib, self.pg1)) return addresses.difference(self.initial_addresses) @@ -544,7 +569,7 @@ class TestDHCPv6PDControlPlane(VppTestCase): self.assertNotEqual(elapsed_time.elapsedtime, 0) else: self.assertEqual(elapsed_time.elapsedtime, 0) - except: + except BaseException: packet.show() raise @@ -619,15 +644,13 @@ class TestDHCPv6PDControlPlane(VppTestCase): def test_prefixes(self): """ Test handling of prefixes """ - address_bin_1 = None - address_bin_2 = None + address1 = '::2:0:0:0:405/60' + address2 = '::76:0:0:0:406/62' try: - address_bin_1 = '\x00' * 6 + '\x00\x02' + '\x00' * 6 + '\x04\x05' - address_prefix_length_1 = 60 - self.vapi.ip6_add_del_address_using_prefix(self.pg1.sw_if_index, - address_bin_1, - address_prefix_length_1, - self.prefix_group) + self.vapi.ip6_add_del_address_using_prefix( + sw_if_index=self.pg1.sw_if_index, + address_with_prefix=address1, + prefix_group=self.prefix_group) ia_pd_opts = DHCP6OptIAPrefix(prefix='7:8::', plen=56, preflft=2, validlft=3) @@ -642,48 +665,48 @@ class TestDHCPv6PDControlPlane(VppTestCase): new_addresses = self.get_addresses() self.assertEqual(len(new_addresses), 1) addr = list(new_addresses)[0] - self.assertEqual(inet_ntop(AF_INET6, addr), '7:8:0:2::405') + self.assertEqual(addr, '7:8:0:2::405') self.sleep(1) - address_bin_2 = '\x00' * 6 + '\x00\x76' + '\x00' * 6 + '\x04\x06' - address_prefix_length_2 = 62 - self.vapi.ip6_add_del_address_using_prefix(self.pg1.sw_if_index, - address_bin_2, - address_prefix_length_2, - self.prefix_group) + self.vapi.ip6_add_del_address_using_prefix( + sw_if_index=self.pg1.sw_if_index, + address_with_prefix=address2, + prefix_group=self.prefix_group) self.sleep(1) # check FIB contains 2 addresses - fib = self.vapi.ip6_fib_dump() + fib = self.vapi.ip_route_dump(0, True) addresses = set(self.get_interface_addresses(fib, self.pg1)) new_addresses = addresses.difference(self.initial_addresses) self.assertEqual(len(new_addresses), 2) addr1 = list(new_addresses)[0] addr2 = list(new_addresses)[1] - if inet_ntop(AF_INET6, addr1) == '7:8:0:76::406': + if addr1 == '7:8:0:76::406': addr1, addr2 = addr2, addr1 - self.assertEqual(inet_ntop(AF_INET6, addr1), '7:8:0:2::405') - self.assertEqual(inet_ntop(AF_INET6, addr2), '7:8:0:76::406') + self.assertEqual(addr1, '7:8:0:2::405') + self.assertEqual(addr2, '7:8:0:76::406') self.sleep(1) # check that the addresses are deleted - fib = self.vapi.ip6_fib_dump() + fib = self.vapi.ip_route_dump(0, True) addresses = set(self.get_interface_addresses(fib, self.pg1)) new_addresses = addresses.difference(self.initial_addresses) self.assertEqual(len(new_addresses), 0) finally: - if address_bin_1 is not None: + if address1 is not None: self.vapi.ip6_add_del_address_using_prefix( - self.pg1.sw_if_index, address_bin_1, - address_prefix_length_1, self.prefix_group, is_add=0) - if address_bin_2 is not None: + sw_if_index=self.pg1.sw_if_index, + address_with_prefix=address1, + prefix_group=self.prefix_group, is_add=0) + if address2 is not None: self.vapi.ip6_add_del_address_using_prefix( - self.pg1.sw_if_index, address_bin_2, - address_prefix_length_2, self.prefix_group, is_add=0) + sw_if_index=self.pg1.sw_if_index, + address_with_prefix=address2, + prefix_group=self.prefix_group, is_add=0) def test_sending_client_messages_solicit(self): """ VPP receives messages from DHCPv6 client """ @@ -720,13 +743,12 @@ class TestDHCPv6PDControlPlane(VppTestCase): def test_preferred_greater_than_valid_lifetime(self): """ Preferred lifetime is greater than valid lifetime """ + address1 = '::2:0:0:0:405/60' try: - address_bin = '\x00' * 6 + '\x00\x02' + '\x00' * 6 + '\x04\x05' - address_prefix_length = 60 - self.vapi.ip6_add_del_address_using_prefix(self.pg1.sw_if_index, - address_bin, - address_prefix_length, - self.prefix_group) + self.vapi.ip6_add_del_address_using_prefix( + sw_if_index=self.pg1.sw_if_index, + address_with_prefix=address1, + prefix_group=self.prefix_group) self.wait_for_solicit() self.send_advertise() @@ -738,28 +760,27 @@ class TestDHCPv6PDControlPlane(VppTestCase): self.sleep(0.5) # check FIB contains no addresses - fib = self.vapi.ip6_fib_dump() + fib = self.vapi.ip_route_dump(0, True) addresses = set(self.get_interface_addresses(fib, self.pg1)) new_addresses = addresses.difference(self.initial_addresses) self.assertEqual(len(new_addresses), 0) finally: - self.vapi.ip6_add_del_address_using_prefix(self.pg1.sw_if_index, - address_bin, - address_prefix_length, - self.prefix_group, - is_add=0) + self.vapi.ip6_add_del_address_using_prefix( + sw_if_index=self.pg1.sw_if_index, + address_with_prefix=address1, + prefix_group=self.prefix_group, + is_add=0) def test_T1_greater_than_T2(self): """ T1 is greater than T2 """ + address1 = '::2:0:0:0:405/60' try: - address_bin = '\x00' * 6 + '\x00\x02' + '\x00' * 6 + '\x04\x05' - address_prefix_length = 60 - self.vapi.ip6_add_del_address_using_prefix(self.pg1.sw_if_index, - address_bin, - address_prefix_length, - self.prefix_group) + self.vapi.ip6_add_del_address_using_prefix( + sw_if_index=self.pg1.sw_if_index, + address_with_prefix=address1, + prefix_group=self.prefix_group) self.wait_for_solicit() self.send_advertise() @@ -771,14 +792,14 @@ class TestDHCPv6PDControlPlane(VppTestCase): self.sleep(0.5) # check FIB contains no addresses - fib = self.vapi.ip6_fib_dump() + fib = self.vapi.ip_route_dump(0, True) addresses = set(self.get_interface_addresses(fib, self.pg1)) new_addresses = addresses.difference(self.initial_addresses) self.assertEqual(len(new_addresses), 0) finally: - self.vapi.ip6_add_del_address_using_prefix(self.pg1.sw_if_index, - address_bin, - address_prefix_length, - self.prefix_group, - is_add=0) + self.vapi.ip6_add_del_address_using_prefix( + sw_if_index=self.pg1.sw_if_index, + prefix_group=self.prefix_group, + address_with_prefix=address1, + is_add=False)