Home | History | Annotate | Line # | Download | only in ndp
t_ndp.sh revision 1.19.2.1
      1  1.19.2.1  martin #	$NetBSD: t_ndp.sh,v 1.19.2.1 2017/07/07 13:57:26 martin Exp $
      2       1.1   ozaki #
      3       1.1   ozaki # Copyright (c) 2015 The NetBSD Foundation, Inc.
      4       1.1   ozaki # All rights reserved.
      5       1.1   ozaki #
      6       1.1   ozaki # Redistribution and use in source and binary forms, with or without
      7       1.1   ozaki # modification, are permitted provided that the following conditions
      8       1.1   ozaki # are met:
      9       1.1   ozaki # 1. Redistributions of source code must retain the above copyright
     10       1.1   ozaki #    notice, this list of conditions and the following disclaimer.
     11       1.1   ozaki # 2. Redistributions in binary form must reproduce the above copyright
     12       1.1   ozaki #    notice, this list of conditions and the following disclaimer in the
     13       1.1   ozaki #    documentation and/or other materials provided with the distribution.
     14       1.1   ozaki #
     15       1.1   ozaki # THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
     16       1.1   ozaki # ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
     17       1.1   ozaki # TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     18       1.1   ozaki # PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
     19       1.1   ozaki # BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     20       1.1   ozaki # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     21       1.1   ozaki # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     22       1.1   ozaki # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     23       1.1   ozaki # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     24       1.1   ozaki # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     25       1.1   ozaki # POSSIBILITY OF SUCH DAMAGE.
     26       1.1   ozaki #
     27       1.1   ozaki 
     28       1.1   ozaki SOCKSRC=unix://commsock1
     29       1.1   ozaki SOCKDST=unix://commsock2
     30       1.1   ozaki IP6SRC=fc00::1
     31  1.19.2.1  martin IP6SRC2=fc00::3
     32       1.1   ozaki IP6DST=fc00::2
     33  1.19.2.1  martin IP6NET=fc00::0
     34       1.1   ozaki 
     35      1.19   ozaki DEBUG=${DEBUG:-false}
     36       1.1   ozaki TIMEOUT=1
     37       1.1   ozaki 
     38      1.12   ozaki atf_test_case ndp_cache_expiration cleanup
     39      1.12   ozaki atf_test_case ndp_commands cleanup
     40      1.12   ozaki atf_test_case ndp_cache_overwriting cleanup
     41      1.12   ozaki atf_test_case ndp_neighborgcthresh cleanup
     42      1.12   ozaki atf_test_case ndp_link_activation cleanup
     43       1.1   ozaki 
     44      1.12   ozaki ndp_cache_expiration_head()
     45       1.1   ozaki {
     46       1.1   ozaki 	atf_set "descr" "Tests for NDP cache expiration"
     47       1.1   ozaki 	atf_set "require.progs" "rump_server"
     48       1.1   ozaki }
     49       1.1   ozaki 
     50      1.12   ozaki ndp_commands_head()
     51       1.1   ozaki {
     52       1.1   ozaki 	atf_set "descr" "Tests for commands of ndp(8)"
     53       1.1   ozaki 	atf_set "require.progs" "rump_server"
     54       1.1   ozaki }
     55       1.1   ozaki 
     56      1.12   ozaki ndp_cache_overwriting_head()
     57       1.1   ozaki {
     58       1.1   ozaki 	atf_set "descr" "Tests for behavior of overwriting NDP caches"
     59       1.1   ozaki 	atf_set "require.progs" "rump_server"
     60       1.1   ozaki }
     61       1.1   ozaki 
     62      1.12   ozaki ndp_neighborgcthresh_head()
     63       1.7   ozaki {
     64       1.7   ozaki 	atf_set "descr" "Tests for GC of neighbor caches"
     65       1.7   ozaki 	atf_set "require.progs" "rump_server"
     66       1.7   ozaki }
     67       1.7   ozaki 
     68      1.12   ozaki ndp_link_activation_head()
     69       1.9   ozaki {
     70       1.9   ozaki 	atf_set "descr" "Tests for activating a new MAC address"
     71       1.9   ozaki 	atf_set "require.progs" "rump_server"
     72       1.9   ozaki }
     73       1.9   ozaki 
     74       1.1   ozaki setup_dst_server()
     75       1.1   ozaki {
     76       1.8   ozaki 	local assign_ip=$1
     77       1.8   ozaki 
     78      1.17   ozaki 	rump_server_add_iface $SOCKDST shmif0 bus1
     79       1.1   ozaki 	export RUMP_SERVER=$SOCKDST
     80       1.8   ozaki 	if [ "$assign_ip" != no ]; then
     81       1.8   ozaki 		atf_check -s exit:0 rump.ifconfig shmif0 inet6 $IP6DST
     82       1.8   ozaki 	fi
     83       1.1   ozaki 	atf_check -s exit:0 rump.ifconfig shmif0 up
     84       1.1   ozaki 	atf_check -s exit:0 rump.ifconfig -w 10
     85       1.1   ozaki 
     86       1.1   ozaki 	$DEBUG && rump.ifconfig shmif0
     87       1.1   ozaki 	$DEBUG && rump.ndp -n -a
     88       1.1   ozaki }
     89       1.1   ozaki 
     90       1.1   ozaki setup_src_server()
     91       1.1   ozaki {
     92       1.1   ozaki 	$DEBUG && ulimit -c unlimited
     93       1.1   ozaki 	export RUMP_SERVER=$SOCKSRC
     94       1.1   ozaki 
     95       1.1   ozaki 	# Setup an interface
     96      1.17   ozaki 	rump_server_add_iface $SOCKSRC shmif0 bus1
     97       1.1   ozaki 	atf_check -s exit:0 rump.ifconfig shmif0 inet6 $IP6SRC
     98       1.1   ozaki 	atf_check -s exit:0 rump.ifconfig shmif0 up
     99       1.1   ozaki 	atf_check -s exit:0 rump.ifconfig -w 10
    100       1.1   ozaki 
    101       1.1   ozaki 	# Sanity check
    102       1.1   ozaki 	$DEBUG && rump.ifconfig shmif0
    103       1.1   ozaki 	$DEBUG && rump.ndp -n -a
    104  1.19.2.1  martin 	atf_check -s not-exit:0 -o ignore -e match:'no entry' rump.ndp -n $IP6SRC
    105  1.19.2.1  martin 	atf_check -s not-exit:0 -o ignore -e match:'no entry' rump.ndp -n $IP6DST
    106       1.1   ozaki }
    107       1.1   ozaki 
    108       1.1   ozaki get_timeout()
    109       1.1   ozaki {
    110       1.1   ozaki 	local timeout=$(env RUMP_SERVER=$SOCKSRC rump.ndp -n $IP6DST |grep $IP6DST|awk '{print $4;}')
    111       1.1   ozaki 	timeout=${timeout%s}
    112       1.1   ozaki 	echo $timeout
    113       1.1   ozaki }
    114       1.1   ozaki 
    115      1.12   ozaki ndp_cache_expiration_body()
    116       1.1   ozaki {
    117      1.17   ozaki 
    118      1.17   ozaki 	rump_server_start $SOCKSRC netinet6
    119      1.17   ozaki 	rump_server_start $SOCKDST netinet6
    120       1.1   ozaki 
    121       1.1   ozaki 	setup_dst_server
    122       1.1   ozaki 	setup_src_server
    123       1.1   ozaki 
    124       1.1   ozaki 	#
    125       1.1   ozaki 	# Check if a cache is expired expectedly
    126       1.1   ozaki 	#
    127       1.1   ozaki 	export RUMP_SERVER=$SOCKSRC
    128       1.3   ozaki 	atf_check -s exit:0 -o ignore rump.ping6 -n -X $TIMEOUT -c 1 $IP6DST
    129       1.1   ozaki 
    130       1.1   ozaki 	$DEBUG && rump.ndp -n -a
    131  1.19.2.1  martin 	atf_check -s not-exit:0 -o ignore -e match:'no entry' rump.ndp -n $IP6SRC
    132       1.1   ozaki 	# Should be cached
    133       1.1   ozaki 	atf_check -s exit:0 -o not-match:'permanent' rump.ndp -n $IP6DST
    134       1.1   ozaki 
    135       1.1   ozaki 	timeout=$(get_timeout $IP6DST)
    136       1.1   ozaki 
    137       1.1   ozaki 	atf_check -s exit:0 sleep $(($timeout + 1))
    138       1.1   ozaki 
    139       1.1   ozaki 	$DEBUG && rump.ndp -n -a
    140  1.19.2.1  martin 	atf_check -s not-exit:0 -o ignore -e match:'no entry' rump.ndp -n $IP6SRC
    141       1.1   ozaki 	# Expired but remains until GC sweaps it (1 day)
    142      1.18   ozaki 	atf_check -s exit:0 -o match:"$ONEDAYISH" rump.ndp -n $IP6DST
    143      1.17   ozaki 
    144      1.17   ozaki 	rump_server_destroy_ifaces
    145       1.1   ozaki }
    146       1.1   ozaki 
    147       1.5   ozaki ifdown_dst_server()
    148       1.5   ozaki {
    149       1.5   ozaki 	export RUMP_SERVER=$SOCKDST
    150       1.5   ozaki 	atf_check -s exit:0 rump.ifconfig shmif0 down
    151       1.5   ozaki 	export RUMP_SERVER=$SOCKSRC
    152       1.5   ozaki }
    153       1.5   ozaki 
    154      1.12   ozaki ndp_commands_body()
    155       1.1   ozaki {
    156      1.17   ozaki 
    157      1.17   ozaki 	rump_server_start $SOCKSRC netinet6
    158      1.17   ozaki 	rump_server_start $SOCKDST netinet6
    159       1.1   ozaki 
    160       1.1   ozaki 	setup_dst_server
    161       1.1   ozaki 	setup_src_server
    162       1.1   ozaki 
    163       1.1   ozaki 	export RUMP_SERVER=$SOCKSRC
    164       1.1   ozaki 
    165       1.1   ozaki 	# Add and delete a static entry
    166       1.1   ozaki 	$DEBUG && rump.ndp -n -a
    167       1.1   ozaki 	atf_check -s exit:0 -o ignore rump.ndp -s fc00::10 b2:a0:20:00:00:10
    168       1.1   ozaki 	$DEBUG && rump.ndp -n -a
    169       1.1   ozaki 	atf_check -s exit:0 -o match:'permanent' rump.ndp -n fc00::10
    170  1.19.2.1  martin 	check_route fc00::10 'b2:a0:20:00:00:10' UHLS shmif0
    171       1.2   ozaki 	atf_check -s exit:0 -o match:'deleted' rump.ndp -d fc00::10
    172       1.1   ozaki 	$DEBUG && rump.ndp -n -a
    173       1.1   ozaki 	atf_check -s not-exit:0 -o ignore -e ignore rump.ndp -n fc00::10
    174  1.19.2.1  martin 	check_route_no_entry fc00::10
    175       1.1   ozaki 
    176       1.1   ozaki 	# Add multiple entries via a file (XXX not implemented)
    177       1.1   ozaki 	#cat - > ./list <<-EOF
    178       1.1   ozaki 	#fc00::11 b2:a0:20:00:00:11
    179       1.1   ozaki 	#fc00::12 b2:a0:20:00:00:12
    180       1.1   ozaki 	#fc00::13 b2:a0:20:00:00:13
    181       1.1   ozaki 	#fc00::14 b2:a0:20:00:00:14
    182       1.1   ozaki 	#fc00::15 b2:a0:20:00:00:15
    183       1.1   ozaki 	#EOF
    184       1.1   ozaki 	#$DEBUG && rump.ndp -n -a
    185       1.1   ozaki 	#atf_check -s exit:0 -o ignore rump.ndp -f ./list
    186       1.1   ozaki 	#$DEBUG && rump.ndp -n -a
    187       1.1   ozaki 
    188       1.3   ozaki 	atf_check -s exit:0 -o ignore rump.ping6 -n -X $TIMEOUT -c 1 $IP6DST
    189       1.1   ozaki 	atf_check -s exit:0 -o ignore rump.ndp -s fc00::11 b2:a0:20:00:00:11
    190       1.1   ozaki 	atf_check -s exit:0 -o ignore rump.ndp -s fc00::12 b2:a0:20:00:00:12
    191       1.1   ozaki 
    192       1.1   ozaki 	atf_check -s exit:0 -o not-match:'permanent' rump.ndp -n $IP6DST
    193       1.1   ozaki 	atf_check -s exit:0 -o match:'permanent' rump.ndp -n fc00::11
    194       1.1   ozaki 	atf_check -s exit:0 -o match:'permanent' rump.ndp -n fc00::12
    195  1.19.2.1  martin 	check_route_flags $IP6DST UHL
    196  1.19.2.1  martin 	check_route_flags fc00::11 UHLS
    197  1.19.2.1  martin 	check_route_flags fc00::12 UHLS
    198       1.1   ozaki 
    199       1.1   ozaki 	# Test ndp -a
    200       1.1   ozaki 	atf_check -s exit:0 -o match:'fc00::11' rump.ndp -n -a
    201       1.1   ozaki 	atf_check -s exit:0 -o match:'fc00::12' rump.ndp -n -a
    202       1.1   ozaki 
    203       1.5   ozaki 	# Ensure no packet upsets the src server
    204       1.5   ozaki 	ifdown_dst_server
    205       1.5   ozaki 
    206       1.1   ozaki 	# Flush all entries (-c)
    207       1.1   ozaki 	$DEBUG && rump.ndp -n -a
    208       1.1   ozaki 	atf_check -s exit:0 -o ignore rump.ndp -c
    209      1.10   ozaki 	atf_check -s not-exit:0 -o ignore -e ignore rump.ndp -n $IP6SRC
    210       1.1   ozaki 	atf_check -s not-exit:0 -o ignore -e ignore rump.ndp -n $IP6DST
    211  1.19.2.1  martin 	#check_route_no_entry $IP6SRC
    212  1.19.2.1  martin 	check_route_no_entry $IP6DST
    213       1.1   ozaki 	# Only the static caches are not deleted
    214       1.1   ozaki 	atf_check -s exit:0 -o ignore -e ignore rump.ndp -n fc00::11
    215       1.1   ozaki 	atf_check -s exit:0 -o ignore -e ignore rump.ndp -n fc00::12
    216  1.19.2.1  martin 	check_route_flags fc00::11 UHLS
    217  1.19.2.1  martin 	check_route_flags fc00::12 UHLS
    218       1.1   ozaki 
    219       1.1   ozaki 	$DEBUG && rump.ndp -n -a
    220      1.11   ozaki 	atf_check -s exit:0 -o ignore rump.ndp -s fc00::10 b2:a0:20:00:00:10 temp
    221       1.1   ozaki 	rump.ndp -s fc00::10 b2:a0:20:00:00:10 temp
    222       1.1   ozaki 	$DEBUG && rump.ndp -n -a
    223      1.11   ozaki 	atf_check -s exit:0 -o not-match:'permanent' rump.ndp -n fc00::10
    224  1.19.2.1  martin 	check_route fc00::10 'b2:a0:20:00:00:10' UHL shmif0
    225       1.1   ozaki 
    226      1.17   ozaki 	rump_server_destroy_ifaces
    227       1.1   ozaki }
    228       1.1   ozaki 
    229      1.12   ozaki ndp_cache_overwriting_body()
    230       1.1   ozaki {
    231      1.17   ozaki 
    232      1.17   ozaki 	rump_server_start $SOCKSRC netinet6
    233      1.17   ozaki 	rump_server_start $SOCKDST netinet6
    234       1.1   ozaki 
    235       1.1   ozaki 	setup_dst_server
    236       1.1   ozaki 	setup_src_server
    237       1.1   ozaki 
    238       1.1   ozaki 	export RUMP_SERVER=$SOCKSRC
    239       1.1   ozaki 
    240       1.1   ozaki 	# Cannot overwrite a permanent cache
    241  1.19.2.1  martin 	atf_check -s exit:0 rump.ndp -s $IP6SRC b2:a0:20:00:00:ff
    242       1.1   ozaki 	$DEBUG && rump.ndp -n -a
    243  1.19.2.1  martin 	atf_check -s not-exit:0 -e ignore rump.ndp -s $IP6SRC b2:a0:20:00:00:fe
    244       1.1   ozaki 
    245       1.3   ozaki 	atf_check -s exit:0 -o ignore rump.ping6 -n -X $TIMEOUT -c 1 $IP6DST
    246       1.1   ozaki 	$DEBUG && rump.ndp -n -a
    247       1.1   ozaki 	# Can overwrite a dynamic cache
    248       1.1   ozaki 	atf_check -s exit:0 -o ignore rump.ndp -s $IP6DST b2:a0:20:00:00:00
    249       1.1   ozaki 	$DEBUG && rump.ndp -n -a
    250       1.1   ozaki 	atf_check -s exit:0 -o match:'permanent' rump.ndp -n $IP6DST
    251       1.1   ozaki 
    252       1.1   ozaki 	# Test temp option (XXX it doesn't work; expire time isn't set)
    253       1.1   ozaki 	#atf_check -s exit:0 -o ignore rump.ndp -s fc00::10 b2:a0:20:00:00:10 temp
    254       1.1   ozaki 	#$DEBUG && rump.ndp -n -a
    255       1.1   ozaki 	#atf_check -s exit:0 -o not-match:'permanent' rump.ndp -n fc00::10
    256       1.1   ozaki 	# Cannot overwrite a temp cache
    257       1.1   ozaki 	#atf_check -s not-exit:0 -e ignore rump.ndp -s fc00::10 b2:a0:20:00:00:ff
    258       1.1   ozaki 	#$DEBUG && rump.ndp -n -a
    259       1.1   ozaki 
    260      1.17   ozaki 	rump_server_destroy_ifaces
    261       1.1   ozaki }
    262       1.1   ozaki 
    263       1.7   ozaki get_n_caches()
    264       1.7   ozaki {
    265       1.7   ozaki 
    266       1.7   ozaki 	echo $(rump.ndp -a -n |grep -v -e Neighbor -e permanent |wc -l)
    267       1.7   ozaki }
    268       1.7   ozaki 
    269      1.12   ozaki ndp_neighborgcthresh_body()
    270       1.7   ozaki {
    271       1.7   ozaki 
    272      1.17   ozaki 	rump_server_start $SOCKSRC netinet6
    273      1.17   ozaki 	rump_server_start $SOCKDST netinet6
    274       1.7   ozaki 
    275       1.8   ozaki 	setup_dst_server no
    276       1.7   ozaki 	setup_src_server
    277       1.7   ozaki 
    278       1.7   ozaki 	export RUMP_SERVER=$SOCKDST
    279       1.7   ozaki 	for i in $(seq 0 9); do
    280       1.7   ozaki 		atf_check -s exit:0 rump.ifconfig shmif0 inet6 ${IP6DST}$i
    281       1.7   ozaki 	done
    282       1.7   ozaki 
    283       1.7   ozaki 	export RUMP_SERVER=$SOCKSRC
    284       1.7   ozaki 
    285       1.7   ozaki 	# ping to 3 destinations
    286       1.7   ozaki 	$DEBUG && rump.ndp -n -a
    287       1.7   ozaki 	for i in $(seq 0 2); do
    288       1.7   ozaki 		atf_check -s exit:0 -o ignore rump.ping6 -n -X $TIMEOUT -c 1 \
    289       1.7   ozaki 		    ${IP6DST}$i
    290       1.7   ozaki 	done
    291       1.7   ozaki 	$DEBUG && rump.ndp -n -a
    292       1.7   ozaki 
    293       1.7   ozaki 	# 3 caches should be created
    294       1.7   ozaki 	atf_check_equal $(get_n_caches) 3
    295       1.7   ozaki 
    296       1.7   ozaki 	# ping to additional 3 destinations
    297       1.7   ozaki 	for i in $(seq 3 5); do
    298       1.7   ozaki 		atf_check -s exit:0 -o ignore rump.ping6 -n -X $TIMEOUT -c 1 \
    299       1.7   ozaki 		    ${IP6DST}$i
    300       1.7   ozaki 	done
    301       1.7   ozaki 	$DEBUG && rump.ndp -n -a
    302       1.7   ozaki 
    303       1.7   ozaki 	# 6 caches should be created in total
    304       1.7   ozaki 	atf_check_equal $(get_n_caches) 6
    305       1.7   ozaki 
    306       1.7   ozaki 	# Limit the number of neighbor caches to 5
    307       1.7   ozaki 	atf_check -s exit:0 -o ignore rump.sysctl -w \
    308       1.7   ozaki 	    net.inet6.ip6.neighborgcthresh=5
    309       1.7   ozaki 
    310       1.7   ozaki 	# ping to additional 4 destinations
    311       1.7   ozaki 	for i in $(seq 6 9); do
    312       1.7   ozaki 		atf_check -s exit:0 -o ignore rump.ping6 -n -X $TIMEOUT -c 1 \
    313       1.7   ozaki 		    ${IP6DST}$i
    314       1.7   ozaki 	done
    315       1.7   ozaki 
    316       1.7   ozaki 	# More than 5 caches should be created in total, but exceeded caches
    317       1.7   ozaki 	# should be GC-ed
    318       1.7   ozaki 	if [ "$(get_n_caches)" -gt 5 ]; then
    319       1.7   ozaki 		atf_fail "Neighbor caches are not GC-ed"
    320       1.7   ozaki 	fi
    321       1.7   ozaki 
    322      1.17   ozaki 	rump_server_destroy_ifaces
    323       1.7   ozaki }
    324       1.7   ozaki 
    325       1.9   ozaki make_pkt_str_na()
    326       1.9   ozaki {
    327       1.9   ozaki 	local ip=$1
    328       1.9   ozaki 	local mac=$2
    329       1.9   ozaki 	local pkt=
    330       1.9   ozaki 	pkt="$mac > 33:33:00:00:00:01, ethertype IPv6 (0x86dd), length 86:"
    331       1.9   ozaki 	pkt="$pkt $ip > ff02::1: ICMP6, neighbor advertisement"
    332       1.9   ozaki 	echo $pkt
    333       1.9   ozaki }
    334       1.9   ozaki 
    335      1.12   ozaki ndp_link_activation_body()
    336       1.9   ozaki {
    337       1.9   ozaki 	local linklocal=
    338       1.9   ozaki 
    339      1.17   ozaki 	rump_server_start $SOCKSRC netinet6
    340      1.17   ozaki 	rump_server_start $SOCKDST netinet6
    341       1.9   ozaki 
    342       1.9   ozaki 	setup_dst_server
    343       1.9   ozaki 	setup_src_server
    344       1.9   ozaki 
    345       1.9   ozaki 	# flush old packets
    346      1.15   ozaki 	extract_new_packets bus1 > ./out
    347       1.9   ozaki 
    348       1.9   ozaki 	export RUMP_SERVER=$SOCKSRC
    349       1.9   ozaki 
    350       1.9   ozaki 	atf_check -s exit:0 -o ignore rump.ifconfig shmif0 link \
    351       1.9   ozaki 	    b2:a1:00:00:00:01
    352       1.9   ozaki 
    353       1.9   ozaki 	atf_check -s exit:0 sleep 1
    354      1.15   ozaki 	extract_new_packets bus1 > ./out
    355       1.9   ozaki 	$DEBUG && cat ./out
    356       1.9   ozaki 
    357       1.9   ozaki 	linklocal=$(rump.ifconfig shmif0 |awk '/fe80/ {print $2;}' |awk -F % '{print $1;}')
    358       1.9   ozaki 	$DEBUG && echo $linklocal
    359       1.9   ozaki 
    360       1.9   ozaki 	pkt=$(make_pkt_str_na $linklocal b2:a1:00:00:00:01)
    361       1.9   ozaki 	atf_check -s not-exit:0 -x "cat ./out |grep -q '$pkt'"
    362       1.9   ozaki 
    363       1.9   ozaki 	atf_check -s exit:0 -o ignore rump.ifconfig shmif0 link \
    364       1.9   ozaki 	    b2:a1:00:00:00:02 active
    365       1.9   ozaki 
    366       1.9   ozaki 	atf_check -s exit:0 sleep 1
    367      1.15   ozaki 	extract_new_packets bus1 > ./out
    368       1.9   ozaki 	$DEBUG && cat ./out
    369       1.9   ozaki 
    370       1.9   ozaki 	linklocal=$(rump.ifconfig shmif0 |awk '/fe80/ {print $2;}' |awk -F % '{print $1;}')
    371       1.9   ozaki 	$DEBUG && echo $linklocal
    372       1.9   ozaki 
    373       1.9   ozaki 	pkt=$(make_pkt_str_na $linklocal b2:a1:00:00:00:02)
    374       1.9   ozaki 	atf_check -s exit:0 -x "cat ./out |grep -q '$pkt'"
    375       1.1   ozaki 
    376      1.17   ozaki 	rump_server_destroy_ifaces
    377       1.1   ozaki }
    378       1.1   ozaki 
    379      1.12   ozaki ndp_cache_expiration_cleanup()
    380       1.1   ozaki {
    381       1.1   ozaki 	$DEBUG && dump
    382       1.1   ozaki 	cleanup
    383       1.1   ozaki }
    384       1.1   ozaki 
    385      1.12   ozaki ndp_commands_cleanup()
    386       1.1   ozaki {
    387       1.1   ozaki 	$DEBUG && dump
    388       1.1   ozaki 	cleanup
    389       1.1   ozaki }
    390       1.1   ozaki 
    391      1.12   ozaki ndp_cache_overwriting_cleanup()
    392       1.1   ozaki {
    393       1.1   ozaki 	$DEBUG && dump
    394       1.1   ozaki 	cleanup
    395       1.1   ozaki }
    396       1.1   ozaki 
    397      1.12   ozaki ndp_neighborgcthresh_cleanup()
    398       1.7   ozaki {
    399       1.7   ozaki 	$DEBUG && dump
    400       1.7   ozaki 	cleanup
    401       1.7   ozaki }
    402       1.7   ozaki 
    403      1.12   ozaki ndp_link_activation_cleanup()
    404       1.9   ozaki {
    405       1.9   ozaki 	$DEBUG && dump
    406       1.9   ozaki 	cleanup
    407       1.9   ozaki }
    408       1.9   ozaki 
    409  1.19.2.1  martin atf_test_case ndp_rtm cleanup
    410  1.19.2.1  martin ndp_rtm_head()
    411  1.19.2.1  martin {
    412  1.19.2.1  martin 
    413  1.19.2.1  martin 	atf_set "descr" "Tests for routing messages on operations of NDP entries"
    414  1.19.2.1  martin 	atf_set "require.progs" "rump_server"
    415  1.19.2.1  martin }
    416  1.19.2.1  martin 
    417  1.19.2.1  martin ndp_rtm_body()
    418  1.19.2.1  martin {
    419  1.19.2.1  martin 	local macaddr_src= macaddr_dst=
    420  1.19.2.1  martin 	local file=./tmp
    421  1.19.2.1  martin 	local pid= str=
    422  1.19.2.1  martin 
    423  1.19.2.1  martin 	rump_server_start $SOCKSRC netinet6
    424  1.19.2.1  martin 	rump_server_start $SOCKDST netinet6
    425  1.19.2.1  martin 
    426  1.19.2.1  martin 	setup_dst_server
    427  1.19.2.1  martin 	setup_src_server
    428  1.19.2.1  martin 
    429  1.19.2.1  martin 	macaddr_src=$(get_macaddr $SOCKSRC shmif0)
    430  1.19.2.1  martin 	macaddr_dst=$(get_macaddr $SOCKDST shmif0)
    431  1.19.2.1  martin 
    432  1.19.2.1  martin 	export RUMP_SERVER=$SOCKSRC
    433  1.19.2.1  martin 
    434  1.19.2.1  martin 	# Test ping and a resulting routing message (RTM_ADD)
    435  1.19.2.1  martin 	rump.route -n monitor -c 1 > $file &
    436  1.19.2.1  martin 	pid=$?
    437  1.19.2.1  martin 	sleep 1
    438  1.19.2.1  martin 	atf_check -s exit:0 -o ignore rump.ping6 -n -X 1 -c 1 $IP6DST
    439  1.19.2.1  martin 	wait $pid
    440  1.19.2.1  martin 	$DEBUG && cat $file
    441  1.19.2.1  martin 
    442  1.19.2.1  martin 	str="RTM_ADD.+<UP,HOST,DONE,LLINFO,CLONED>"
    443  1.19.2.1  martin 	atf_check -s exit:0 -o match:"$str" cat $file
    444  1.19.2.1  martin 	str="<DST,GATEWAY>"
    445  1.19.2.1  martin 	atf_check -s exit:0 -o match:"$str" cat $file
    446  1.19.2.1  martin 	str="$IP6DST link#2"
    447  1.19.2.1  martin 	atf_check -s exit:0 -o match:"$str" cat $file
    448  1.19.2.1  martin 
    449  1.19.2.1  martin 	# Test ndp -d and resulting routing messages (RTM_DELETE)
    450  1.19.2.1  martin 	rump.route -n monitor -c 2 > $file &
    451  1.19.2.1  martin 	pid=$?
    452  1.19.2.1  martin 	sleep 1
    453  1.19.2.1  martin 	atf_check -s exit:0 -o ignore rump.ndp -d $IP6DST
    454  1.19.2.1  martin 	wait $pid
    455  1.19.2.1  martin 	$DEBUG && cat $file
    456  1.19.2.1  martin 
    457  1.19.2.1  martin 	str="RTM_DELETE.+<HOST,DONE,LLINFO,CLONED>"
    458  1.19.2.1  martin 	atf_check -s exit:0 -o match:"$str" grep -A 3 RTM_DELETE $file
    459  1.19.2.1  martin 	str="<DST,GATEWAY>"
    460  1.19.2.1  martin 	atf_check -s exit:0 -o match:"$str" grep -A 3 RTM_DELETE $file
    461  1.19.2.1  martin 	str="$IP6DST $macaddr_dst"
    462  1.19.2.1  martin 	atf_check -s exit:0 -o match:"$str" grep -A 3 RTM_DELETE $file
    463  1.19.2.1  martin 
    464  1.19.2.1  martin 	rump_server_destroy_ifaces
    465  1.19.2.1  martin }
    466  1.19.2.1  martin 
    467  1.19.2.1  martin ndp_rtm_cleanup()
    468  1.19.2.1  martin {
    469  1.19.2.1  martin 
    470  1.19.2.1  martin 	$DEBUG && dump
    471  1.19.2.1  martin 	cleanup
    472  1.19.2.1  martin }
    473  1.19.2.1  martin 
    474  1.19.2.1  martin atf_test_case ndp_purge_on_route_change cleanup
    475  1.19.2.1  martin ndp_purge_on_route_change_head()
    476  1.19.2.1  martin {
    477  1.19.2.1  martin 
    478  1.19.2.1  martin 	atf_set "descr" "Tests if NDP entries are removed on route change"
    479  1.19.2.1  martin 	atf_set "require.progs" "rump_server"
    480  1.19.2.1  martin }
    481  1.19.2.1  martin 
    482  1.19.2.1  martin ndp_purge_on_route_change_body()
    483  1.19.2.1  martin {
    484  1.19.2.1  martin 
    485  1.19.2.1  martin 	rump_server_start $SOCKSRC netinet6
    486  1.19.2.1  martin 	rump_server_start $SOCKDST netinet6
    487  1.19.2.1  martin 
    488  1.19.2.1  martin 	setup_dst_server
    489  1.19.2.1  martin 	setup_src_server
    490  1.19.2.1  martin 
    491  1.19.2.1  martin 	rump_server_add_iface $SOCKSRC shmif1 bus1
    492  1.19.2.1  martin 	export RUMP_SERVER=$SOCKSRC
    493  1.19.2.1  martin 	atf_check -s exit:0 rump.ifconfig shmif1 inet6 $IP6SRC2
    494  1.19.2.1  martin 	atf_check -s exit:0 rump.ifconfig -w 10
    495  1.19.2.1  martin 
    496  1.19.2.1  martin 	$DEBUG && rump.netstat -nr -f inet6
    497  1.19.2.1  martin 	atf_check -s exit:0 -o ignore rump.ping6 -n -X 1 -c 1 $IP6DST
    498  1.19.2.1  martin 	atf_check -s exit:0 -o match:'shmif0' rump.ndp -n $IP6DST
    499  1.19.2.1  martin 
    500  1.19.2.1  martin 	atf_check -s exit:0 -o ignore \
    501  1.19.2.1  martin 	    rump.route change -inet6 -net $IP6NET/64 -ifp shmif1
    502  1.19.2.1  martin 	$DEBUG && rump.netstat -nr -f inet6
    503  1.19.2.1  martin 	$DEBUG && rump.ndp -na
    504  1.19.2.1  martin 	# The entry was already removed on route change
    505  1.19.2.1  martin 	atf_check -s not-exit:0 -o ignore -e match:'no entry' \
    506  1.19.2.1  martin 	    rump.ndp -n $IP6DST
    507  1.19.2.1  martin 
    508  1.19.2.1  martin 	rump_server_destroy_ifaces
    509  1.19.2.1  martin }
    510  1.19.2.1  martin 
    511  1.19.2.1  martin ndp_purge_on_route_change_cleanup()
    512  1.19.2.1  martin {
    513  1.19.2.1  martin 
    514  1.19.2.1  martin 	$DEBUG && dump
    515  1.19.2.1  martin 	cleanup
    516  1.19.2.1  martin }
    517  1.19.2.1  martin 
    518  1.19.2.1  martin atf_test_case ndp_purge_on_route_delete cleanup
    519  1.19.2.1  martin ndp_purge_on_route_delete_head()
    520  1.19.2.1  martin {
    521  1.19.2.1  martin 
    522  1.19.2.1  martin 	atf_set "descr" "Tests if NDP entries are removed on route delete"
    523  1.19.2.1  martin 	atf_set "require.progs" "rump_server"
    524  1.19.2.1  martin }
    525  1.19.2.1  martin 
    526  1.19.2.1  martin ndp_purge_on_route_delete_body()
    527  1.19.2.1  martin {
    528  1.19.2.1  martin 
    529  1.19.2.1  martin 	rump_server_start $SOCKSRC netinet6
    530  1.19.2.1  martin 	rump_server_start $SOCKDST netinet6
    531  1.19.2.1  martin 
    532  1.19.2.1  martin 	setup_dst_server
    533  1.19.2.1  martin 	setup_src_server
    534  1.19.2.1  martin 
    535  1.19.2.1  martin 	$DEBUG && rump.netstat -nr -f inet6
    536  1.19.2.1  martin 	atf_check -s exit:0 -o ignore rump.ping6 -n -X 1 -c 1 $IP6DST
    537  1.19.2.1  martin 	atf_check -s exit:0 -o match:'shmif0' rump.ndp -n $IP6DST
    538  1.19.2.1  martin 
    539  1.19.2.1  martin 	atf_check -s exit:0 -o ignore rump.route delete -inet6 -net $IP6NET/64
    540  1.19.2.1  martin 	$DEBUG && rump.netstat -nr -f inet6
    541  1.19.2.1  martin 	$DEBUG && rump.ndp -na
    542  1.19.2.1  martin 
    543  1.19.2.1  martin 	# The entry was already removed on route delete
    544  1.19.2.1  martin 	atf_check -s not-exit:0 -o ignore -e match:'no entry' \
    545  1.19.2.1  martin 	    rump.ndp -n $IP6DST
    546  1.19.2.1  martin 
    547  1.19.2.1  martin 	rump_server_destroy_ifaces
    548  1.19.2.1  martin }
    549  1.19.2.1  martin 
    550  1.19.2.1  martin ndp_purge_on_route_delete_cleanup()
    551  1.19.2.1  martin {
    552  1.19.2.1  martin 
    553  1.19.2.1  martin 	$DEBUG && dump
    554  1.19.2.1  martin 	cleanup
    555  1.19.2.1  martin }
    556  1.19.2.1  martin 
    557  1.19.2.1  martin atf_test_case ndp_purge_on_ifdown cleanup
    558  1.19.2.1  martin ndp_purge_on_ifdown_head()
    559  1.19.2.1  martin {
    560  1.19.2.1  martin 
    561  1.19.2.1  martin 	atf_set "descr" "Tests if NDP entries are removed on interface down"
    562  1.19.2.1  martin 	atf_set "require.progs" "rump_server"
    563  1.19.2.1  martin }
    564  1.19.2.1  martin 
    565  1.19.2.1  martin ndp_purge_on_ifdown_body()
    566  1.19.2.1  martin {
    567  1.19.2.1  martin 
    568  1.19.2.1  martin 	rump_server_start $SOCKSRC netinet6
    569  1.19.2.1  martin 	rump_server_start $SOCKDST netinet6
    570  1.19.2.1  martin 
    571  1.19.2.1  martin 	setup_dst_server
    572  1.19.2.1  martin 	setup_src_server
    573  1.19.2.1  martin 
    574  1.19.2.1  martin 	$DEBUG && rump.netstat -nr -f inet6
    575  1.19.2.1  martin 	atf_check -s exit:0 -o ignore rump.ping6 -n -X 1 -c 1 $IP6DST
    576  1.19.2.1  martin 	atf_check -s exit:0 -o match:'shmif0' rump.ndp -n $IP6DST
    577  1.19.2.1  martin 
    578  1.19.2.1  martin 	# Shutdown the interface
    579  1.19.2.1  martin 	atf_check -s exit:0 rump.ifconfig shmif0 down
    580  1.19.2.1  martin 	$DEBUG && rump.netstat -nr -f inet6
    581  1.19.2.1  martin 	$DEBUG && rump.ndp -na
    582  1.19.2.1  martin 
    583  1.19.2.1  martin 	# The entry was already removed on ifconfig down
    584  1.19.2.1  martin 	atf_check -s not-exit:0 -o ignore -e match:'no entry' \
    585  1.19.2.1  martin 	    rump.ndp -n $IP6DST
    586  1.19.2.1  martin 
    587  1.19.2.1  martin 	rump_server_destroy_ifaces
    588  1.19.2.1  martin }
    589  1.19.2.1  martin 
    590  1.19.2.1  martin ndp_purge_on_ifdown_cleanup()
    591  1.19.2.1  martin {
    592  1.19.2.1  martin 
    593  1.19.2.1  martin 	$DEBUG && dump
    594  1.19.2.1  martin 	cleanup
    595  1.19.2.1  martin }
    596  1.19.2.1  martin 
    597  1.19.2.1  martin atf_test_case ndp_stray_entries cleanup
    598  1.19.2.1  martin ndp_stray_entries_head()
    599  1.19.2.1  martin {
    600  1.19.2.1  martin 
    601  1.19.2.1  martin 	atf_set "descr" "Tests if NDP entries are removed on route change"
    602  1.19.2.1  martin 	atf_set "require.progs" "rump_server"
    603  1.19.2.1  martin }
    604  1.19.2.1  martin 
    605  1.19.2.1  martin ndp_stray_entries_body()
    606  1.19.2.1  martin {
    607  1.19.2.1  martin 
    608  1.19.2.1  martin 	rump_server_start $SOCKSRC netinet6
    609  1.19.2.1  martin 	rump_server_start $SOCKDST netinet6
    610  1.19.2.1  martin 
    611  1.19.2.1  martin 	setup_dst_server
    612  1.19.2.1  martin 	setup_src_server
    613  1.19.2.1  martin 
    614  1.19.2.1  martin 	rump_server_add_iface $SOCKSRC shmif1 bus1
    615  1.19.2.1  martin 
    616  1.19.2.1  martin 	export RUMP_SERVER=$SOCKSRC
    617  1.19.2.1  martin 	atf_check -s exit:0 rump.ifconfig shmif1 inet6 $IP6SRC2/64
    618  1.19.2.1  martin 	atf_check -s exit:0 rump.ifconfig -w 10
    619  1.19.2.1  martin 
    620  1.19.2.1  martin 	$DEBUG && rump.netstat -nr -f inet6
    621  1.19.2.1  martin 	atf_check -s exit:0 -o ignore rump.ping6 -n -X 1 -c 1 $IP6DST
    622  1.19.2.1  martin 	$DEBUG && rump.ndp -na
    623  1.19.2.1  martin 	atf_check -s exit:0 -o match:'shmif0' rump.ndp -n $IP6DST
    624  1.19.2.1  martin 	atf_check -s exit:0 -o not-match:'shmif1' rump.ndp -n $IP6DST
    625  1.19.2.1  martin 
    626  1.19.2.1  martin 	# Clean up
    627  1.19.2.1  martin 	atf_check -s exit:0 -o ignore rump.ndp -c
    628  1.19.2.1  martin 	atf_check -s not-exit:0 -o ignore -e match:'no entry' rump.ndp -n $IP6DST
    629  1.19.2.1  martin 
    630  1.19.2.1  martin 	# ping from a different source address
    631  1.19.2.1  martin 	atf_check -s exit:0 -o ignore \
    632  1.19.2.1  martin 	    rump.ping6 -n -X 1 -c 1 -S $IP6SRC2 $IP6DST
    633  1.19.2.1  martin 	$DEBUG && rump.ndp -na
    634  1.19.2.1  martin 	atf_check -s exit:0 -o match:'shmif0' rump.ndp -n $IP6DST
    635  1.19.2.1  martin 	# ARP reply goes back via shmif1, so a cache is created on shmif1
    636  1.19.2.1  martin 	atf_check -s exit:0 -o match:'shmif1' rump.ndp -n $IP6DST
    637  1.19.2.1  martin 
    638  1.19.2.1  martin 	# Clean up by ndp -c
    639  1.19.2.1  martin 	atf_check -s exit:0 -o ignore rump.ndp -c
    640  1.19.2.1  martin 	atf_check -s not-exit:0 -o ignore -e match:'no entry' rump.ndp -n $IP6DST
    641  1.19.2.1  martin 
    642  1.19.2.1  martin 	# ping from a different source address again
    643  1.19.2.1  martin 	atf_check -s exit:0 -o ignore \
    644  1.19.2.1  martin 	    rump.ping6 -n -X 1 -c 1 -S $IP6SRC2 $IP6DST
    645  1.19.2.1  martin 	atf_check -s exit:0 -o match:'shmif0' rump.ndp -n $IP6DST
    646  1.19.2.1  martin 	# ARP reply doen't come
    647  1.19.2.1  martin 	atf_check -s exit:0 -o not-match:'shmif1' rump.ndp -n $IP6DST
    648  1.19.2.1  martin 
    649  1.19.2.1  martin 	# Cleanup caches on the destination
    650  1.19.2.1  martin 	export RUMP_SERVER=$SOCKDST
    651  1.19.2.1  martin 	$DEBUG && rump.ndp -na
    652  1.19.2.1  martin 	atf_check -s exit:0 -o ignore rump.ndp -c
    653  1.19.2.1  martin 	$DEBUG && rump.ndp -na
    654  1.19.2.1  martin 	export RUMP_SERVER=$SOCKSRC
    655  1.19.2.1  martin 
    656  1.19.2.1  martin 	# ping from a different source address again
    657  1.19.2.1  martin 	atf_check -s exit:0 -o ignore \
    658  1.19.2.1  martin 	    rump.ping6 -n -X 1 -c 1 -S $IP6SRC2 $IP6DST
    659  1.19.2.1  martin 	atf_check -s exit:0 -o match:'shmif0' rump.ndp -n $IP6DST
    660  1.19.2.1  martin 	# ARP reply goes back via shmif1
    661  1.19.2.1  martin 	atf_check -s exit:0 -o match:'shmif1' rump.ndp -n $IP6DST
    662  1.19.2.1  martin 
    663  1.19.2.1  martin 	# Clean up by ndp -d <ip>
    664  1.19.2.1  martin 	atf_check -s exit:0 -o ignore rump.ndp -d $IP6DST
    665  1.19.2.1  martin 	# Both entries should be deleted
    666  1.19.2.1  martin 	atf_check -s not-exit:0 -o ignore -e match:'no entry' rump.ndp -n $IP6DST
    667  1.19.2.1  martin 
    668  1.19.2.1  martin 	rump_server_destroy_ifaces
    669  1.19.2.1  martin }
    670  1.19.2.1  martin 
    671  1.19.2.1  martin ndp_stray_entries_cleanup()
    672  1.19.2.1  martin {
    673  1.19.2.1  martin 
    674  1.19.2.1  martin 	$DEBUG && dump
    675  1.19.2.1  martin 	cleanup
    676  1.19.2.1  martin }
    677  1.19.2.1  martin 
    678       1.1   ozaki atf_init_test_cases()
    679       1.1   ozaki {
    680      1.12   ozaki 	atf_add_test_case ndp_cache_expiration
    681      1.12   ozaki 	atf_add_test_case ndp_commands
    682      1.12   ozaki 	atf_add_test_case ndp_cache_overwriting
    683      1.12   ozaki 	atf_add_test_case ndp_neighborgcthresh
    684      1.12   ozaki 	atf_add_test_case ndp_link_activation
    685  1.19.2.1  martin 	atf_add_test_case ndp_rtm
    686  1.19.2.1  martin 	atf_add_test_case ndp_purge_on_route_change
    687  1.19.2.1  martin 	atf_add_test_case ndp_purge_on_route_delete
    688  1.19.2.1  martin 	atf_add_test_case ndp_purge_on_ifdown
    689  1.19.2.1  martin 	atf_add_test_case ndp_stray_entries
    690       1.1   ozaki }
    691