diff --git a/tests/gnrc_dhcpv6_client/Makefile b/tests/gnrc_dhcpv6_client/Makefile index e3eb7c0a42..5c8b0c0d89 100644 --- a/tests/gnrc_dhcpv6_client/Makefile +++ b/tests/gnrc_dhcpv6_client/Makefile @@ -9,6 +9,7 @@ RIOTBASE ?= $(CURDIR)/../.. BOARD_BLACKLIST += mips-malta pic32-wifire pic32-clicker ruuvitag thingy52 USEMODULE += dhcpv6_client_ia_pd +USEMODULE += dhcpv6_client_ia_na USEMODULE += gnrc_dhcpv6_client USEMODULE += gnrc_ipv6_default USEMODULE += xtimer diff --git a/tests/gnrc_dhcpv6_client/kea-dhcp6.conf b/tests/gnrc_dhcpv6_client/kea-dhcp6.conf index e8b9a7964a..b42eade5bd 100644 --- a/tests/gnrc_dhcpv6_client/kea-dhcp6.conf +++ b/tests/gnrc_dhcpv6_client/kea-dhcp6.conf @@ -22,8 +22,9 @@ "subnet6": [ { "interface": "tapbr0", "subnet": "2001:db8::/32", - "pd-pools": [ { "prefix": "2001:db8::", - "prefix-len": 32, + "pools": [ { "pool": "2001:db8:1::/64" } ], + "pd-pools": [ { "prefix": "2001:db8:8000::", + "prefix-len": 33, "delegated-len": 64 } ] } ] }, diff --git a/tests/gnrc_dhcpv6_client/main.c b/tests/gnrc_dhcpv6_client/main.c index b1260a4ccd..dde6c19ff3 100644 --- a/tests/gnrc_dhcpv6_client/main.c +++ b/tests/gnrc_dhcpv6_client/main.c @@ -37,6 +37,8 @@ void *_dhcpv6_client_thread(void *args) (void)args; /* initialize client event queue */ event_queue_init(&event_queue); + /* Configure client to use DHCPv6 IA_NA */ + netif->ipv6.aac_mode |= GNRC_NETIF_AAC_DHCP; /* initialize DHCPv6 client on any interface */ dhcpv6_client_init(&event_queue, SOCK_ADDR_ANY_NETIF); /* configure client to request prefix delegation of /64 subnet diff --git a/tests/gnrc_dhcpv6_client/tests-as-root/01-run.py b/tests/gnrc_dhcpv6_client/tests-as-root/01-run.py index 5c80cd62c6..25f2a08ce8 100755 --- a/tests/gnrc_dhcpv6_client/tests-as-root/01-run.py +++ b/tests/gnrc_dhcpv6_client/tests-as-root/01-run.py @@ -8,6 +8,13 @@ import sys from testrunner import run +from ipaddress import ( + IPv6Address, + IPv6Network, +) + + +IA_NA_ADDRESS_POOL_PREFIX = "2001:db8:1::" def testfunc(child): @@ -15,17 +22,64 @@ def testfunc(child): child.expect(r"inet6 addr:\sfe80:[0-9a-f:]+\s+scope: link") child.expect(r"Iface\s+\d+") child.expect(r"inet6 addr:\s+fe80:[0-9a-f:]+\s+scope: link") - child.expect(r"inet6 addr:\s+(?P[0-9a-f:]+)\s+scope: global") - global_addr = child.match.group("global_addr") + + global_addr_1, global_addr_2 = extract_global_addresses(child) + + global_pfx = extract_global_prefix(child) + + test_global_addrs(global_addr_1, global_addr_2, global_pfx) + + +def extract_global_prefix(child): child.expect(r"(?P[0-9a-f:]+)/64\s+dev #\d\s+" r"expires \d+ sec\s+" r"deprecates \d+ sec") global_pfx = child.match.group("global_pfx") + if global_pfx.endswith("::"): # remove one trailing : in case there are no 0s between prefix and # suffix global_pfx = global_pfx[0:-1] - assert global_addr.startswith(global_pfx) + + return global_pfx + + +def extract_global_address(child): + """Expect and extract a global address from the command line.""" + child.expect(r"inet6 addr:\s+(?P[0-9a-f:]+)\s+scope: global") + return child.match.group("global_addr") + + +def extract_global_addresses(child): + """Extract two global addresses and return them as a tuple.""" + return extract_global_address(child), extract_global_address(child) + + +def check_ia_na_addr(ia_na_addr): + """Check if the expected IA_NA address has been assigned""" + return IPv6Address(ia_na_addr) in IPv6Network("{}/64".format(IA_NA_ADDRESS_POOL_PREFIX)) + + +def check_ia_pd_addr(ia_pd_addr, global_pfx): + """Check if the expected IA_PD address has been assigned""" + return ia_pd_addr.startswith(global_pfx) + + +def check_global_addrs(ia_na_addr, ia_pd_addr, global_pfx): + """Perform IA_NA check for the first and IA_PD for the second address""" + return { + "ia_na_check": check_ia_na_addr(ia_na_addr), + "ia_pd_check": check_ia_pd_addr(ia_pd_addr, global_pfx), + } + + +def test_global_addrs(global_addr_1, global_addr_2, global_pfx): + """Assert that one global address is the IA_NA and the other one is the IA_PD address""" + result_1 = check_global_addrs(global_addr_1, global_addr_2, global_pfx) + result_2 = check_global_addrs(global_addr_2, global_addr_1, global_pfx) + assert result_1 != result_2 + assert result_1["ia_na_check"] != result_2["ia_na_check"] + assert result_1["ia_pd_check"] != result_2["ia_pd_check"] if __name__ == "__main__":