diff --git a/tests/sys/netinet6/ndp.sh b/tests/sys/netinet6/ndp.sh --- a/tests/sys/netinet6/ndp.sh +++ b/tests/sys/netinet6/ndp.sh @@ -34,6 +34,19 @@ atf_set require.user root } +wait_tentative() +{ + jail="$1" + itf="$2" + addr="$3" + + for i in `seq 1 25`; do + if [ $(ifconfig -j ${jail} ${itf} inet6 | grep -E "${addr}" | fgrep -c "tentative") = "0" ]; then return; fi + sleep 0.2 + done + atf_fail "Timed out while waiting for DAD on ${itf} for '${addr}'" +} + ndp_add_gu_success_body() { local epair0 jname @@ -50,9 +63,7 @@ jexec ${jname} ifconfig ${epair0}a inet6 2001:db8::1/64 # wait for DAD to complete - while [ `jexec ${jname} ifconfig | grep inet6 | grep -c tentative` != "0" ]; do - sleep 0.1 - done + wait_tentative ${jname} ${epair0}a "inet6 fe80:[:0-9a-f]+%${epair0}a" atf_check jexec ${jname} ndp -s 2001:db8::2 90:10:00:01:02:03 @@ -90,9 +101,7 @@ jexec ${jname} ifconfig ${epair0}a inet6 2001:db8::1/64 # wait for DAD to complete - while [ `jexec ${jname} ifconfig | grep inet6 | grep -c tentative` != "0" ]; do - sleep 0.1 - done + wait_tentative ${jname} ${epair0}a "inet6 2001:db8::1" jexec ${jname} ping -c1 -t1 2001:db8::2 @@ -113,9 +122,8 @@ fi atf_check ${jname} ifconfig ${ifname} up atf_check ${jname} ifconfig ${ifname} inet6 -ifdisabled - while ${jname} ifconfig ${ifname} inet6 | grep tentative; do - sleep 0.1 - done + # wait for DAD to complete + wait_tentative ${jname} ${ifname} "inet6 fe80:[:0-9a-f]+%${ifname}" } ndp_if_lladdr() @@ -188,9 +196,132 @@ vnet_cleanup } +atf_test_case "ndp_lookup_host" "cleanup" +ndp_lookup_host_head() { + atf_set descr 'Test looking up a specific host' + atf_set require.user root +} + +ndp_lookup_host_body() { + + vnet_init + + jname="v6t-ndp_lookup_host" + + epair0=$(vnet_mkepair) + + vnet_mkjail ${jname}a ${epair0}a + vnet_mkjail ${jname}b ${epair0}b + + ipa=2001:db8::1 + ipb=2001:db8::2 + + atf_check -o ignore \ + ifconfig -j ${jname}a ${epair0}a inet6 ${ipa}/64 + atf_check -o ignore \ + ifconfig -j ${jname}b ${epair0}b inet6 ${ipb}/64 + + # get jail b's MAC address + eth="$(ifconfig -j ${jname}b ${epair0}b | + sed -nE "s/^\tether ([0-9a-f:]*)$/\1/p")" + + # no entry yet + atf_check -s exit:1 -o ignore -e match:"\(${ipb}\) -- no entry" \ + jexec ${jname}a ndp -n ${ipb} + + # now ping jail b from jail a + atf_check -o ignore \ + jexec ${jname}a ping -c1 ${ipb} + + # should be populated + atf_check -o match:"${ipb}( +)$eth( +)${epair0}a" \ + jexec ${jname}a ndp -n ${ipb} + +} + +ndp_lookup_host_cleanup() { + vnet_cleanup +} + + +atf_test_case "dad" "cleanup" +dad_head() { + atf_set descr 'Test Duplicate Address Detection works' + atf_set require.user root +} + +dad_body() { + + vnet_init + + jname="v6t-ndp_dad_host" + + epair0=$(vnet_mkepair) + + vnet_mkjail ${jname}a ${epair0}a + vnet_mkjail ${jname}b ${epair0}b + + ip=2001:db8:f00:baa::1 + + atf_check ifconfig -j ${jname}a ${epair0}a inet6 -ifdisabled up + atf_check -o "match:inet6 fe80:[:0-9a-f]+%${epair0}a prefixlen 64 tentative scopeid" ifconfig -j ${jname}a ${epair0}a + atf_check ifconfig -j ${jname}b ${epair0}b inet6 -ifdisabled up + atf_check -o "match:inet6 fe80:[:0-9a-f]+%${epair0}b prefixlen 64 tentative scopeid" ifconfig -j ${jname}b ${epair0}b + # Wait for DAD of LL addresses + wait_tentative ${jname}a ${epair0}a "inet6 fe80:[:0-9a-f]+%${epair0}a" + wait_tentative ${jname}b ${epair0}b "inet6 fe80:[:0-9a-f]+%${epair0}b" + atf_check -o "match:inet6 fe80:[:0-9a-f]+%${epair0}a prefixlen 64 scopeid" ifconfig -j ${jname}a ${epair0}a + atf_check -o "match:inet6 fe80:[:0-9a-f]+%${epair0}b prefixlen 64 scopeid" ifconfig -j ${jname}b ${epair0}b + atf_check ifconfig -j ${jname}a ${epair0}a inet6 ${ip}/64 + atf_check -o "match:inet6 ${ip} prefixlen 64 tentative$" ifconfig -j ${jname}a ${epair0}a + wait_tentative ${jname}a ${epair0}a "inet6 ${ip}" + atf_check -o "match:inet6 ${ip} prefixlen 64$" ifconfig -j ${jname}a ${epair0}a + + # the jail B ifconfig will trigger DAD and duplicate must be detected + atf_check ifconfig -j ${jname}b ${epair0}b inet6 ${ip}/64 + atf_check -o "match:inet6 ${ip} prefixlen 64 tentative$" ifconfig -j ${jname}b ${epair0}b + wait_tentative ${jname}b ${epair0}b "inet6 ${ip}" + atf_check -o "match:inet6 ${ip} prefixlen 64 duplicated$" ifconfig -j ${jname}b ${epair0}b +} + +dad_cleanup() { + vnet_cleanup +} + + +atf_test_case "static_temporary" "cleanup" +static_temporary_head() { + atf_set descr 'Test Duplicate Address Detection works' + atf_set require.user root +} + +static_temporary_body() { + + vnet_init + + set -x + jname="v6t-static_temporary" + + epair0=$(vnet_mkepair) + + vnet_mkjail ${jname} ${epair0}a + + jexec ${jname} ifconfig ${epair0}a inet6 2001:db8::1/64 + + atf_check jexec ${jname} ndp -s 2001:db8::2 90:10:00:01:02:03 temp + atf_check -o "match:2001:db8::2( +)90:10:00:01:02:03( +)${epair0}a( +)[12][09]m[0-9]{1,2}s( +)" jexec ${jname} ndp -n 2001:db8::2 +} + +static_temporary_cleanup() { + vnet_cleanup +} + atf_init_test_cases() { atf_add_test_case "ndp_add_gu_success" atf_add_test_case "ndp_del_gu_success" atf_add_test_case "ndp_slaac_default_route" + atf_add_test_case "ndp_lookup_host" + atf_add_test_case "dad" + atf_add_test_case "static_temporary" }