Home | History | Annotate | Line # | Download | only in arp
t_arp.sh revision 1.49
      1  1.49  ozaki #	$NetBSD: t_arp.sh,v 1.49 2025/08/18 06:48:29 ozaki-r 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 IP4SRC=10.0.1.1
     31  1.27  ozaki IP4SRC2=10.0.1.5
     32  1.27  ozaki IP4NET=10.0.1.0
     33   1.1  ozaki IP4DST=10.0.1.2
     34  1.13  ozaki IP4DST_PROXYARP1=10.0.1.3
     35  1.13  ozaki IP4DST_PROXYARP2=10.0.1.4
     36  1.39    roy IP4DST_FAIL1=10.0.1.99
     37  1.39    roy IP4DST_FAIL2=10.0.99.99
     38   1.1  ozaki 
     39  1.18  ozaki DEBUG=${DEBUG:-false}
     40   1.1  ozaki TIMEOUT=1
     41   1.1  ozaki 
     42   1.1  ozaki setup_dst_server()
     43   1.1  ozaki {
     44  1.22  ozaki 
     45  1.22  ozaki 	rump_server_add_iface $SOCKDST shmif0 bus1
     46   1.1  ozaki 	export RUMP_SERVER=$SOCKDST
     47   1.1  ozaki 	atf_check -s exit:0 rump.ifconfig shmif0 inet $IP4DST/24
     48   1.1  ozaki 	atf_check -s exit:0 rump.ifconfig shmif0 up
     49   1.1  ozaki 	atf_check -s exit:0 rump.ifconfig -w 10
     50   1.1  ozaki 
     51   1.1  ozaki 	$DEBUG && rump.ifconfig shmif0
     52   1.1  ozaki 	$DEBUG && rump.arp -n -a
     53  1.32  ozaki 	$DEBUG && rump.netstat -nr -f inet
     54   1.1  ozaki }
     55   1.1  ozaki 
     56   1.1  ozaki setup_src_server()
     57   1.1  ozaki {
     58  1.25  ozaki 	local keep=${1:-0}
     59   1.1  ozaki 
     60   1.1  ozaki 	export RUMP_SERVER=$SOCKSRC
     61   1.1  ozaki 
     62  1.42    roy 	# Shorten the expire time of cache entries
     63  1.25  ozaki 	if [ $keep != 0 ]; then
     64  1.42    roy 		# Convert to ms
     65  1.42    roy 		keep=$(($keep * 1000))
     66  1.25  ozaki 		atf_check -s exit:0 -o ignore \
     67  1.42    roy 		    rump.sysctl -w net.inet.arp.nd_reachable=$keep
     68  1.25  ozaki 	fi
     69   1.1  ozaki 
     70   1.1  ozaki 	# Setup an interface
     71  1.22  ozaki 	rump_server_add_iface $SOCKSRC shmif0 bus1
     72   1.1  ozaki 	atf_check -s exit:0 rump.ifconfig shmif0 inet $IP4SRC/24
     73   1.1  ozaki 	atf_check -s exit:0 rump.ifconfig shmif0 up
     74   1.1  ozaki 	atf_check -s exit:0 rump.ifconfig -w 10
     75   1.1  ozaki 
     76   1.1  ozaki 	# Sanity check
     77   1.1  ozaki 	$DEBUG && rump.ifconfig shmif0
     78   1.1  ozaki 	$DEBUG && rump.arp -n -a
     79  1.32  ozaki 	$DEBUG && rump.netstat -nr -f inet
     80  1.26  ozaki 	atf_check -s not-exit:0 -e match:'no entry' rump.arp -n $IP4SRC
     81  1.26  ozaki 	atf_check -s not-exit:0 -e match:'no entry' rump.arp -n $IP4DST
     82   1.1  ozaki }
     83   1.1  ozaki 
     84  1.42    roy get_timeout()
     85   1.1  ozaki {
     86  1.42    roy 	local addr="$1"
     87  1.42    roy 	local timeout=$(env RUMP_SERVER=$SOCKSRC rump.arp -n $addr |grep $addr|awk '{print $7;}')
     88  1.42    roy 	timeout=${timeout%s}
     89  1.42    roy 	echo $timeout
     90  1.42    roy }
     91  1.42    roy 
     92  1.47  ozaki test_cache_expiration()
     93  1.42    roy {
     94  1.42    roy 	local arp_keep=7
     95   1.1  ozaki 
     96  1.22  ozaki 	rump_server_start $SOCKSRC
     97  1.22  ozaki 	rump_server_start $SOCKDST
     98   1.1  ozaki 
     99   1.1  ozaki 	setup_dst_server
    100   1.9  ozaki 	setup_src_server $arp_keep
    101   1.1  ozaki 
    102  1.42    roy 	# Make a permanent cache entry to avoid sending an NS packet disturbing
    103  1.42    roy 	# the test
    104  1.42    roy 	macaddr=$(get_macaddr $SOCKSRC shmif0)
    105  1.42    roy 	export RUMP_SERVER=$SOCKDST
    106  1.42    roy 	atf_check -s exit:0 -o ignore rump.arp -s $IP4SRC $macaddr
    107  1.42    roy 
    108  1.42    roy 	export RUMP_SERVER=$SOCKSRC
    109  1.42    roy 
    110   1.1  ozaki 	#
    111   1.1  ozaki 	# Check if a cache is expired expectedly
    112   1.1  ozaki 	#
    113   1.1  ozaki 	atf_check -s exit:0 -o ignore rump.ping -n -w $TIMEOUT -c 1 $IP4DST
    114   1.1  ozaki 
    115   1.1  ozaki 	$DEBUG && rump.arp -n -a
    116  1.42    roy 	atf_check -s not-exit:0 -o ignore -e match:'no entry' rump.arp -n $IP4SRC
    117   1.1  ozaki 	# Should be cached
    118  1.42    roy 	atf_check -s exit:0 -o not-match:'permanent' rump.arp -n $IP4DST
    119  1.42    roy 
    120  1.42    roy 	timeout=$(get_timeout $IP4DST)
    121   1.1  ozaki 
    122  1.42    roy 	atf_check -s exit:0 sleep $(($timeout + 1))
    123   1.1  ozaki 
    124   1.1  ozaki 	$DEBUG && rump.arp -n -a
    125  1.42    roy 	atf_check -s not-exit:0 -o ignore -e match:'no entry' rump.arp -n $IP4SRC
    126  1.42    roy 	# Expired but remains until GC sweaps it (1 day)
    127  1.42    roy 	atf_check -s exit:0 -o match:"$ONEDAYISH" rump.arp -n $IP4DST
    128  1.22  ozaki 
    129  1.22  ozaki 	rump_server_destroy_ifaces
    130   1.1  ozaki }
    131   1.1  ozaki 
    132  1.32  ozaki check_arp_static_entry()
    133  1.32  ozaki {
    134  1.32  ozaki 	local ip=$1
    135  1.32  ozaki 	local mac=$2
    136  1.32  ozaki 	local type=$3
    137  1.32  ozaki 	local flags=
    138  1.32  ozaki 
    139  1.32  ozaki 	atf_check -s exit:0 -o match:"$mac" rump.arp -n $ip
    140  1.32  ozaki 	if [ $type = 'permanent' ]; then
    141  1.32  ozaki 		atf_check -s exit:0 -o match:'permanent' rump.arp -n $ip
    142  1.32  ozaki 		check_route $ip "$mac" UHLS shmif0
    143  1.32  ozaki 	else
    144  1.32  ozaki 		atf_check -s exit:0 -o not-match:'permanent' rump.arp -n $ip
    145  1.32  ozaki 		check_route $ip "$mac" UHL shmif0
    146  1.32  ozaki 	fi
    147  1.32  ozaki }
    148  1.32  ozaki 
    149  1.47  ozaki test_command()
    150   1.1  ozaki {
    151   1.1  ozaki 	local arp_keep=5
    152   1.1  ozaki 	local bonus=2
    153   1.1  ozaki 
    154  1.22  ozaki 	rump_server_start $SOCKSRC
    155  1.22  ozaki 	rump_server_start $SOCKDST
    156   1.1  ozaki 
    157   1.1  ozaki 	setup_dst_server
    158   1.9  ozaki 	setup_src_server $arp_keep
    159   1.1  ozaki 
    160   1.1  ozaki 	export RUMP_SERVER=$SOCKSRC
    161   1.1  ozaki 
    162   1.1  ozaki 	# Add and delete a static entry
    163   1.1  ozaki 	$DEBUG && rump.arp -n -a
    164   1.1  ozaki 	atf_check -s exit:0 -o ignore rump.arp -s 10.0.1.10 b2:a0:20:00:00:10
    165   1.1  ozaki 	$DEBUG && rump.arp -n -a
    166  1.32  ozaki 	$DEBUG && rump.netstat -nr -f inet
    167  1.32  ozaki 	check_arp_static_entry 10.0.1.10 'b2:a0:20:00:00:10' permanent
    168   1.1  ozaki 	atf_check -s exit:0 -o ignore rump.arp -d 10.0.1.10
    169   1.1  ozaki 	$DEBUG && rump.arp -n -a
    170  1.32  ozaki 	$DEBUG && rump.netstat -nr -f inet
    171   1.1  ozaki 	atf_check -s not-exit:0 -e ignore rump.arp -n 10.0.1.10
    172  1.32  ozaki 	check_route_no_entry 10.0.1.10
    173   1.1  ozaki 
    174   1.1  ozaki 	# Add multiple entries via a file
    175   1.1  ozaki 	cat - > ./list <<-EOF
    176   1.1  ozaki 	10.0.1.11 b2:a0:20:00:00:11
    177   1.1  ozaki 	10.0.1.12 b2:a0:20:00:00:12
    178   1.1  ozaki 	10.0.1.13 b2:a0:20:00:00:13
    179   1.1  ozaki 	10.0.1.14 b2:a0:20:00:00:14
    180   1.1  ozaki 	10.0.1.15 b2:a0:20:00:00:15
    181   1.1  ozaki 	EOF
    182   1.1  ozaki 	$DEBUG && rump.arp -n -a
    183  1.32  ozaki 	$DEBUG && rump.netstat -nr -f inet
    184   1.1  ozaki 	atf_check -s exit:0 -o ignore rump.arp -f ./list
    185   1.1  ozaki 	$DEBUG && rump.arp -n -a
    186  1.32  ozaki 	$DEBUG && rump.netstat -nr -f inet
    187  1.32  ozaki 	check_arp_static_entry 10.0.1.11 'b2:a0:20:00:00:11' permanent
    188  1.32  ozaki 	check_arp_static_entry 10.0.1.12 'b2:a0:20:00:00:12' permanent
    189  1.32  ozaki 	check_arp_static_entry 10.0.1.13 'b2:a0:20:00:00:13' permanent
    190  1.32  ozaki 	check_arp_static_entry 10.0.1.14 'b2:a0:20:00:00:14' permanent
    191  1.32  ozaki 	check_arp_static_entry 10.0.1.15 'b2:a0:20:00:00:15' permanent
    192   1.1  ozaki 
    193   1.3  ozaki 	# Test arp -a
    194   1.3  ozaki 	atf_check -s exit:0 -o match:'10.0.1.11' rump.arp -n -a
    195   1.3  ozaki 	atf_check -s exit:0 -o match:'10.0.1.12' rump.arp -n -a
    196   1.3  ozaki 	atf_check -s exit:0 -o match:'10.0.1.13' rump.arp -n -a
    197   1.3  ozaki 	atf_check -s exit:0 -o match:'10.0.1.14' rump.arp -n -a
    198   1.3  ozaki 	atf_check -s exit:0 -o match:'10.0.1.15' rump.arp -n -a
    199   1.3  ozaki 
    200   1.1  ozaki 	# Flush all entries
    201   1.1  ozaki 	$DEBUG && rump.arp -n -a
    202  1.32  ozaki 	$DEBUG && rump.netstat -nr -f inet
    203   1.1  ozaki 	atf_check -s exit:0 -o ignore rump.arp -d -a
    204   1.1  ozaki 	atf_check -s not-exit:0 -e ignore rump.arp -n 10.0.1.11
    205   1.1  ozaki 	atf_check -s not-exit:0 -e ignore rump.arp -n 10.0.1.12
    206   1.1  ozaki 	atf_check -s not-exit:0 -e ignore rump.arp -n 10.0.1.13
    207   1.1  ozaki 	atf_check -s not-exit:0 -e ignore rump.arp -n 10.0.1.14
    208   1.1  ozaki 	atf_check -s not-exit:0 -e ignore rump.arp -n 10.0.1.15
    209   1.1  ozaki 	atf_check -s not-exit:0 -e ignore rump.arp -n 10.0.1.1
    210  1.32  ozaki 	check_route_no_entry 10.0.1.11
    211  1.32  ozaki 	check_route_no_entry 10.0.1.12
    212  1.32  ozaki 	check_route_no_entry 10.0.1.13
    213  1.32  ozaki 	check_route_no_entry 10.0.1.14
    214  1.32  ozaki 	check_route_no_entry 10.0.1.15
    215   1.4  ozaki 
    216   1.4  ozaki 	# Test temp option
    217   1.4  ozaki 	$DEBUG && rump.arp -n -a
    218   1.4  ozaki 	atf_check -s exit:0 -o ignore rump.arp -s 10.0.1.10 b2:a0:20:00:00:10 temp
    219   1.4  ozaki 	$DEBUG && rump.arp -n -a
    220  1.32  ozaki 	$DEBUG && rump.netstat -nr -f inet
    221  1.32  ozaki 	check_arp_static_entry 10.0.1.10 'b2:a0:20:00:00:10' temp
    222   1.4  ozaki 
    223   1.4  ozaki 	# Hm? the cache doesn't expire...
    224  1.42    roy 	#atf_check -s exit:0 sleep $(($arp_keep + $bonus))
    225  1.42    roy 	#$DEBUG && rump.arp -n -a
    226  1.42    roy 	#$DEBUG && rump.netstat -nr -f inet
    227   1.8  ozaki 	#atf_check -s not-exit:0 -e ignore rump.arp -n 10.0.1.10
    228   1.6  ozaki 
    229  1.22  ozaki 	rump_server_destroy_ifaces
    230   1.1  ozaki }
    231   1.1  ozaki 
    232  1.11  ozaki make_pkt_str_arpreq()
    233   1.2  ozaki {
    234   1.2  ozaki 	local target=$1
    235   1.2  ozaki 	local sender=$2
    236  1.35  ozaki 	pkt="> ff:ff:ff:ff:ff:ff, ethertype ARP \(0x0806\), length 42:"
    237   1.2  ozaki 	pkt="$pkt Request who-has $target tell $sender, length 28"
    238   1.2  ozaki 	echo $pkt
    239   1.2  ozaki }
    240   1.2  ozaki 
    241  1.36  ozaki test_garp_common()
    242   1.2  ozaki {
    243  1.36  ozaki 	local no_dad=$1
    244   1.2  ozaki 	local pkt=
    245   1.2  ozaki 
    246  1.22  ozaki 	rump_server_start $SOCKSRC
    247  1.22  ozaki 
    248   1.2  ozaki 	export RUMP_SERVER=$SOCKSRC
    249   1.2  ozaki 
    250  1.36  ozaki 	if $no_dad; then
    251  1.36  ozaki 		atf_check -s exit:0 -o match:'3 -> 0' \
    252  1.36  ozaki 		    rump.sysctl -w net.inet.ip.dad_count=0
    253  1.36  ozaki 	fi
    254  1.36  ozaki 
    255   1.2  ozaki 	# Setup an interface
    256  1.22  ozaki 	rump_server_add_iface $SOCKSRC shmif0 bus1
    257   1.2  ozaki 	atf_check -s exit:0 rump.ifconfig shmif0 inet 10.0.0.1/24
    258   1.2  ozaki 	atf_check -s exit:0 rump.ifconfig shmif0 up
    259   1.2  ozaki 	$DEBUG && rump.ifconfig shmif0
    260   1.2  ozaki 
    261   1.2  ozaki 	atf_check -s exit:0 sleep 1
    262  1.35  ozaki 	extract_new_packets bus1 > ./out
    263   1.2  ozaki 
    264  1.36  ozaki 	#
    265  1.36  ozaki 	# Assign an address to an interface without IFF_UP
    266  1.36  ozaki 	#
    267   1.2  ozaki 	# A GARP packet is sent for the primary address
    268  1.11  ozaki 	pkt=$(make_pkt_str_arpreq 10.0.0.1 10.0.0.1)
    269  1.35  ozaki 	atf_check -s exit:0 -o match:"$pkt" cat ./out
    270  1.36  ozaki 
    271  1.36  ozaki 	atf_check -s exit:0 rump.ifconfig shmif0 down
    272  1.36  ozaki 	atf_check -s exit:0 rump.ifconfig shmif0 inet 10.0.0.2/24 alias
    273  1.36  ozaki 
    274  1.36  ozaki 	atf_check -s exit:0 sleep 1
    275  1.36  ozaki 	extract_new_packets bus1 > ./out
    276  1.36  ozaki 
    277  1.36  ozaki 	# A GARP packet is sent for the alias address
    278  1.11  ozaki 	pkt=$(make_pkt_str_arpreq 10.0.0.2 10.0.0.2)
    279  1.36  ozaki 	atf_check -s exit:0 -o match:"$pkt" cat ./out
    280  1.36  ozaki 
    281  1.36  ozaki 	# Clean up
    282  1.36  ozaki 	atf_check -s exit:0 rump.ifconfig shmif0 inet 10.0.0.1/24 delete
    283  1.36  ozaki 	atf_check -s exit:0 rump.ifconfig shmif0 inet 10.0.0.2/24 delete
    284  1.36  ozaki 
    285  1.36  ozaki 	#
    286  1.36  ozaki 	# Assign an address to an interface with IFF_UP
    287  1.36  ozaki 	#
    288  1.36  ozaki 	atf_check -s exit:0 rump.ifconfig shmif0 up
    289   1.2  ozaki 
    290  1.36  ozaki 	# Primary address
    291   1.2  ozaki 	atf_check -s exit:0 rump.ifconfig shmif0 inet 10.0.0.3/24
    292  1.36  ozaki 
    293  1.36  ozaki 	atf_check -s exit:0 sleep 1
    294  1.36  ozaki 	extract_new_packets bus1 > ./out
    295  1.36  ozaki 
    296  1.36  ozaki 	pkt=$(make_pkt_str_arpreq 10.0.0.3 10.0.0.3)
    297  1.36  ozaki 	if $no_dad; then
    298  1.36  ozaki 		# A GARP packet is sent
    299  1.36  ozaki 		atf_check -s exit:0 -o match:"$pkt" cat ./out
    300  1.36  ozaki 	else
    301  1.36  ozaki 		# No GARP packet is sent
    302  1.36  ozaki 		atf_check -s exit:0 -o not-match:"$pkt" cat ./out
    303  1.36  ozaki 	fi
    304  1.36  ozaki 
    305  1.36  ozaki 	# Alias address
    306   1.2  ozaki 	atf_check -s exit:0 rump.ifconfig shmif0 inet 10.0.0.4/24 alias
    307   1.2  ozaki 
    308  1.36  ozaki 	atf_check -s exit:0 sleep 1
    309  1.35  ozaki 	extract_new_packets bus1 > ./out
    310  1.36  ozaki 
    311  1.11  ozaki 	pkt=$(make_pkt_str_arpreq 10.0.0.4 10.0.0.4)
    312  1.36  ozaki 	if $no_dad; then
    313  1.36  ozaki 		# A GARP packet is sent
    314  1.36  ozaki 		atf_check -s exit:0 -o match:"$pkt" cat ./out
    315  1.36  ozaki 	else
    316  1.36  ozaki 		# No GARP packet is sent
    317  1.36  ozaki 		atf_check -s exit:0 -o not-match:"$pkt" cat ./out
    318  1.36  ozaki 	fi
    319  1.22  ozaki 
    320  1.46  ozaki 	#
    321  1.46  ozaki 	# GARP on Link up
    322  1.46  ozaki 	#
    323  1.46  ozaki 	atf_check -s exit:0 rump.ifconfig shmif0 media none
    324  1.46  ozaki 	extract_new_packets bus1 > ./out
    325  1.46  ozaki 	atf_check -s exit:0 rump.ifconfig shmif0 media auto
    326  1.46  ozaki 
    327  1.46  ozaki 	atf_check -s exit:0 sleep 1
    328  1.46  ozaki 	extract_new_packets bus1 > ./out
    329  1.46  ozaki 
    330  1.46  ozaki 	if $no_dad; then
    331  1.46  ozaki 		# A GARP packet is sent for both primary and alias addresses.
    332  1.46  ozaki 		pkt=$(make_pkt_str_arpreq 10.0.0.3 10.0.0.3)
    333  1.46  ozaki 		atf_check -s exit:0 -o match:"$pkt" cat ./out
    334  1.46  ozaki 		pkt=$(make_pkt_str_arpreq 10.0.0.4 10.0.0.4)
    335  1.46  ozaki 		atf_check -s exit:0 -o match:"$pkt" cat ./out
    336  1.46  ozaki 	else
    337  1.46  ozaki 		# No GARP is sent.
    338  1.46  ozaki 		pkt=$(make_pkt_str_arpreq 10.0.0.3 10.0.0.3)
    339  1.46  ozaki 		atf_check -s exit:0 -o not-match:"$pkt" cat ./out
    340  1.46  ozaki 		pkt=$(make_pkt_str_arpreq 10.0.0.4 10.0.0.4)
    341  1.46  ozaki 		atf_check -s exit:0 -o not-match:"$pkt" cat ./out
    342  1.46  ozaki 		# DAD packets are sent instead.
    343  1.46  ozaki 		pkt=$(make_pkt_str_arpreq 10.0.0.3 0.0.0.0)
    344  1.46  ozaki 		atf_check -s exit:0 -o match:"$pkt" cat ./out
    345  1.46  ozaki 		pkt=$(make_pkt_str_arpreq 10.0.0.4 0.0.0.0)
    346  1.46  ozaki 		atf_check -s exit:0 -o match:"$pkt" cat ./out
    347  1.46  ozaki 	fi
    348  1.46  ozaki 
    349  1.22  ozaki 	rump_server_destroy_ifaces
    350   1.2  ozaki }
    351   1.2  ozaki 
    352  1.47  ozaki test_garp()
    353  1.36  ozaki {
    354  1.36  ozaki 
    355  1.36  ozaki 	test_garp_common false
    356  1.36  ozaki }
    357  1.36  ozaki 
    358  1.47  ozaki test_garp_without_dad()
    359  1.36  ozaki {
    360  1.36  ozaki 
    361  1.36  ozaki 	test_garp_common true
    362  1.36  ozaki }
    363  1.36  ozaki 
    364  1.47  ozaki test_cache_overwriting()
    365   1.5  ozaki {
    366   1.5  ozaki 
    367  1.22  ozaki 	rump_server_start $SOCKSRC
    368  1.22  ozaki 	rump_server_start $SOCKDST
    369   1.5  ozaki 
    370   1.5  ozaki 	setup_dst_server
    371  1.25  ozaki 	setup_src_server
    372   1.5  ozaki 
    373   1.5  ozaki 	export RUMP_SERVER=$SOCKSRC
    374   1.5  ozaki 
    375   1.5  ozaki 	# Cannot overwrite a permanent cache
    376  1.31  ozaki 	atf_check -s exit:0 rump.arp -s $IP4DST b2:a0:20:00:00:ff
    377  1.26  ozaki 	$DEBUG && rump.arp -n -a
    378  1.10  ozaki 	atf_check -s not-exit:0 -e match:'File exists' \
    379  1.31  ozaki 	    rump.arp -s $IP4DST b2:a0:20:00:00:fe
    380  1.31  ozaki 	# cleanup
    381  1.31  ozaki 	atf_check -s exit:0 rump.arp -d $IP4DST
    382   1.5  ozaki 
    383   1.5  ozaki 	atf_check -s exit:0 -o ignore rump.ping -n -w $TIMEOUT -c 1 $IP4DST
    384   1.5  ozaki 	$DEBUG && rump.arp -n -a
    385   1.5  ozaki 	# Can overwrite a dynamic cache
    386   1.5  ozaki 	atf_check -s exit:0 -o ignore rump.arp -s $IP4DST b2:a0:20:00:00:00
    387   1.5  ozaki 	$DEBUG && rump.arp -n -a
    388   1.7  ozaki 	atf_check -s exit:0 -o match:'b2:a0:20:00:00:00' rump.arp -n $IP4DST
    389   1.5  ozaki 	atf_check -s exit:0 -o match:'permanent' rump.arp -n $IP4DST
    390   1.5  ozaki 
    391   1.5  ozaki 	atf_check -s exit:0 -o ignore rump.arp -s 10.0.1.10 b2:a0:20:00:00:10 temp
    392   1.5  ozaki 	$DEBUG && rump.arp -n -a
    393   1.7  ozaki 	atf_check -s exit:0 -o match:'b2:a0:20:00:00:10' rump.arp -n 10.0.1.10
    394   1.5  ozaki 	atf_check -s exit:0 -o not-match:'permanent' rump.arp -n 10.0.1.10
    395  1.14  ozaki 	# Can overwrite a temp cache
    396  1.14  ozaki 	atf_check -s exit:0 -o ignore rump.arp -s 10.0.1.10 b2:a0:20:00:00:ff
    397  1.14  ozaki 	atf_check -s exit:0 -o match:'b2:a0:20:00:00:ff' rump.arp -n 10.0.1.10
    398   1.5  ozaki 	$DEBUG && rump.arp -n -a
    399   1.6  ozaki 
    400  1.22  ozaki 	rump_server_destroy_ifaces
    401   1.5  ozaki }
    402   1.5  ozaki 
    403  1.11  ozaki make_pkt_str_arprep()
    404  1.11  ozaki {
    405  1.11  ozaki 	local ip=$1
    406  1.11  ozaki 	local mac=$2
    407  1.11  ozaki 	pkt="ethertype ARP (0x0806), length 42: "
    408  1.11  ozaki 	pkt="Reply $ip is-at $mac, length 28"
    409  1.11  ozaki 	echo $pkt
    410  1.11  ozaki }
    411  1.11  ozaki 
    412  1.14  ozaki make_pkt_str_garp()
    413  1.14  ozaki {
    414  1.14  ozaki 	local ip=$1
    415  1.14  ozaki 	local mac=$2
    416  1.14  ozaki 	local pkt=
    417  1.14  ozaki 	pkt="$mac > ff:ff:ff:ff:ff:ff, ethertype ARP (0x0806),"
    418  1.14  ozaki 	pkt="$pkt length 42: Request who-has $ip tell $ip, length 28"
    419  1.14  ozaki 	echo $pkt
    420  1.14  ozaki }
    421  1.14  ozaki 
    422  1.13  ozaki test_proxy_arp()
    423  1.11  ozaki {
    424  1.13  ozaki 	local opts= title= flags=
    425  1.13  ozaki 	local type=$1
    426  1.11  ozaki 
    427  1.22  ozaki 	rump_server_start $SOCKSRC
    428  1.37    bad 	rump_server_fs_start $SOCKDST tap
    429  1.11  ozaki 
    430  1.11  ozaki 	setup_dst_server
    431  1.25  ozaki 	setup_src_server
    432  1.11  ozaki 
    433  1.11  ozaki 	export RUMP_SERVER=$SOCKDST
    434  1.13  ozaki 	atf_check -s exit:0 -o ignore rump.sysctl -w net.inet.ip.forwarding=1
    435  1.21  ozaki 	macaddr_dst=$(get_macaddr $SOCKDST shmif0)
    436  1.11  ozaki 
    437  1.13  ozaki 	if [ "$type" = "pub" ]; then
    438  1.13  ozaki 		opts="pub"
    439  1.13  ozaki 	else
    440  1.13  ozaki 		opts="pub proxy"
    441  1.13  ozaki 	fi
    442  1.31  ozaki 	# Always proxy only since migrating to lltable/llentry
    443  1.43    roy 	title='published \(proxy only\)'
    444  1.11  ozaki 
    445  1.13  ozaki 	#
    446  1.13  ozaki 	# Test#1: First setup an endpoint then create proxy arp entry
    447  1.13  ozaki 	#
    448  1.13  ozaki 	export RUMP_SERVER=$SOCKDST
    449  1.38  ozaki 	rump_server_add_iface $SOCKDST tap1
    450  1.13  ozaki 	atf_check -s exit:0 rump.ifconfig tap1 $IP4DST_PROXYARP1/24 up
    451  1.13  ozaki 	atf_check -s exit:0 rump.ifconfig -w 10
    452  1.13  ozaki 
    453  1.13  ozaki 	# Try to ping (should fail w/o proxy arp)
    454  1.13  ozaki 	export RUMP_SERVER=$SOCKSRC
    455  1.13  ozaki 	atf_check -s not-exit:0 -o ignore -e ignore \
    456  1.13  ozaki 	    rump.ping -n -w 1 -c 1 $IP4DST_PROXYARP1
    457  1.45    roy 	# Remove ARP entry as it may hang around in WAITDELETE a few seconds
    458  1.45    roy 	atf_check -s ignore rump.arp -d $IP4DST_PROXYARP1
    459  1.11  ozaki 
    460  1.13  ozaki 	# Flushing
    461  1.19  ozaki 	extract_new_packets bus1 > ./out
    462  1.11  ozaki 
    463  1.13  ozaki 	# Set up proxy ARP entry
    464  1.13  ozaki 	export RUMP_SERVER=$SOCKDST
    465  1.13  ozaki 	atf_check -s exit:0 -o ignore \
    466  1.13  ozaki 	    rump.arp -s $IP4DST_PROXYARP1 $macaddr_dst $opts
    467  1.13  ozaki 	atf_check -s exit:0 -o match:"$title" rump.arp -n $IP4DST_PROXYARP1
    468  1.11  ozaki 
    469  1.13  ozaki 	# Try to ping
    470  1.11  ozaki 	export RUMP_SERVER=$SOCKSRC
    471  1.31  ozaki 	atf_check -s exit:0 -o ignore rump.ping -n -w 1 -c 1 $IP4DST_PROXYARP1
    472  1.11  ozaki 
    473  1.19  ozaki 	extract_new_packets bus1 > ./out
    474  1.11  ozaki 	$DEBUG && cat ./out
    475  1.11  ozaki 
    476  1.14  ozaki 	pkt1=$(make_pkt_str_arprep $IP4DST_PROXYARP1 $macaddr_dst)
    477  1.14  ozaki 	pkt2=$(make_pkt_str_garp $IP4DST_PROXYARP1 $macaddr_dst)
    478  1.31  ozaki 	atf_check -s exit:0 -x "cat ./out |grep -q -e '$pkt1' -e '$pkt2'"
    479  1.13  ozaki 
    480  1.13  ozaki 	#
    481  1.13  ozaki 	# Test#2: Create proxy arp entry then set up an endpoint
    482  1.13  ozaki 	#
    483  1.13  ozaki 	export RUMP_SERVER=$SOCKDST
    484  1.13  ozaki 	atf_check -s exit:0 -o ignore \
    485  1.13  ozaki 	    rump.arp -s $IP4DST_PROXYARP2 $macaddr_dst $opts
    486  1.13  ozaki 	atf_check -s exit:0 -o match:"$title" rump.arp -n $IP4DST_PROXYARP2
    487  1.14  ozaki 	$DEBUG && rump.netstat -nr -f inet
    488  1.11  ozaki 
    489  1.13  ozaki 	# Try to ping (should fail because no endpoint exists)
    490  1.13  ozaki 	export RUMP_SERVER=$SOCKSRC
    491  1.11  ozaki 	atf_check -s not-exit:0 -o ignore -e ignore \
    492  1.13  ozaki 	    rump.ping -n -w 1 -c 1 $IP4DST_PROXYARP2
    493  1.45    roy 	# Remove ARP entry as it may hang around in WAITDELETE a few seconds
    494  1.45    roy 	atf_check -s ignore rump.arp -d $IP4DST_PROXYARP2
    495  1.11  ozaki 
    496  1.19  ozaki 	extract_new_packets bus1 > ./out
    497  1.11  ozaki 	$DEBUG && cat ./out
    498  1.11  ozaki 
    499  1.13  ozaki 	# ARP reply should be sent
    500  1.13  ozaki 	pkt=$(make_pkt_str_arprep $IP4DST_PROXYARP2 $macaddr_dst)
    501  1.11  ozaki 	atf_check -s exit:0 -x "cat ./out |grep -q '$pkt'"
    502  1.11  ozaki 
    503  1.13  ozaki 	export RUMP_SERVER=$SOCKDST
    504  1.38  ozaki 	rump_server_add_iface $SOCKDST tap2
    505  1.13  ozaki 	atf_check -s exit:0 rump.ifconfig tap2 $IP4DST_PROXYARP2/24 up
    506  1.13  ozaki 	atf_check -s exit:0 rump.ifconfig -w 10
    507  1.13  ozaki 
    508  1.13  ozaki 	# Try to ping
    509  1.13  ozaki 	export RUMP_SERVER=$SOCKSRC
    510  1.14  ozaki 	atf_check -s exit:0 -o ignore rump.ping -n -w 1 -c 1 $IP4DST_PROXYARP2
    511  1.13  ozaki }
    512  1.13  ozaki 
    513  1.47  ozaki test_proxy_arp_pub()
    514  1.13  ozaki {
    515  1.13  ozaki 
    516  1.13  ozaki 	test_proxy_arp pub
    517  1.22  ozaki 	rump_server_destroy_ifaces
    518  1.13  ozaki }
    519  1.13  ozaki 
    520  1.47  ozaki test_proxy_arp_pubproxy()
    521  1.13  ozaki {
    522  1.13  ozaki 
    523  1.13  ozaki 	test_proxy_arp pubproxy
    524  1.22  ozaki 	rump_server_destroy_ifaces
    525  1.11  ozaki }
    526  1.11  ozaki 
    527  1.47  ozaki test_link_activation()
    528  1.12  ozaki {
    529  1.12  ozaki 
    530  1.22  ozaki 	rump_server_start $SOCKSRC
    531  1.22  ozaki 	rump_server_start $SOCKDST
    532  1.12  ozaki 
    533  1.12  ozaki 	setup_dst_server
    534  1.25  ozaki 	setup_src_server
    535  1.12  ozaki 
    536  1.12  ozaki 	# flush old packets
    537  1.19  ozaki 	extract_new_packets bus1 > ./out
    538  1.12  ozaki 
    539  1.12  ozaki 	export RUMP_SERVER=$SOCKSRC
    540  1.12  ozaki 
    541  1.12  ozaki 	atf_check -s exit:0 -o ignore rump.ifconfig shmif0 link \
    542  1.12  ozaki 	    b2:a1:00:00:00:01
    543  1.12  ozaki 
    544  1.12  ozaki 	atf_check -s exit:0 sleep 1
    545  1.19  ozaki 	extract_new_packets bus1 > ./out
    546  1.12  ozaki 	$DEBUG && cat ./out
    547  1.12  ozaki 
    548  1.12  ozaki 	pkt=$(make_pkt_str_arpreq $IP4SRC $IP4SRC)
    549  1.35  ozaki 	atf_check -s exit:0 -o not-match:"$pkt" cat ./out
    550  1.12  ozaki 
    551  1.12  ozaki 	atf_check -s exit:0 -o ignore rump.ifconfig shmif0 link \
    552  1.12  ozaki 	    b2:a1:00:00:00:02 active
    553  1.12  ozaki 
    554  1.12  ozaki 	atf_check -s exit:0 sleep 1
    555  1.19  ozaki 	extract_new_packets bus1 > ./out
    556  1.12  ozaki 	$DEBUG && cat ./out
    557  1.12  ozaki 
    558  1.12  ozaki 	pkt=$(make_pkt_str_arpreq $IP4SRC $IP4SRC)
    559  1.35  ozaki 	atf_check -s exit:0 -o match:"b2:a1:00:00:00:02 $pkt" cat ./out
    560  1.22  ozaki 
    561  1.22  ozaki 	rump_server_destroy_ifaces
    562  1.12  ozaki }
    563  1.12  ozaki 
    564  1.47  ozaki test_static()
    565  1.15  ozaki {
    566  1.15  ozaki 	local macaddr_src=
    567  1.15  ozaki 
    568  1.22  ozaki 	rump_server_start $SOCKSRC
    569  1.22  ozaki 	rump_server_start $SOCKDST
    570  1.15  ozaki 
    571  1.15  ozaki 	setup_dst_server
    572  1.25  ozaki 	setup_src_server
    573  1.15  ozaki 
    574  1.21  ozaki 	macaddr_src=$(get_macaddr $SOCKSRC shmif0)
    575  1.15  ozaki 
    576  1.15  ozaki 	# Set a (valid) static ARP entry for the src server
    577  1.15  ozaki 	export RUMP_SERVER=$SOCKDST
    578  1.15  ozaki 	$DEBUG && rump.arp -n -a
    579  1.15  ozaki 	atf_check -s exit:0 -o ignore rump.arp -s $IP4SRC $macaddr_src
    580  1.15  ozaki 	$DEBUG && rump.arp -n -a
    581  1.15  ozaki 
    582  1.15  ozaki 	# Test receiving an ARP request with the static ARP entry (as spa/sha)
    583  1.15  ozaki 	export RUMP_SERVER=$SOCKSRC
    584  1.15  ozaki 	atf_check -s exit:0 -o ignore rump.ping -n -w 1 -c 1 $IP4DST
    585   1.1  ozaki 
    586  1.22  ozaki 	rump_server_destroy_ifaces
    587   1.1  ozaki }
    588   1.1  ozaki 
    589  1.47  ozaki test_rtm()
    590  1.23  ozaki {
    591  1.23  ozaki 	local macaddr_src= macaddr_dst=
    592  1.23  ozaki 	local file=./tmp
    593  1.34    kre 	local pid= hdr= what= addr=
    594  1.23  ozaki 
    595  1.23  ozaki 	rump_server_start $SOCKSRC
    596  1.23  ozaki 	rump_server_start $SOCKDST
    597  1.23  ozaki 
    598  1.23  ozaki 	setup_dst_server
    599  1.25  ozaki 	setup_src_server
    600  1.23  ozaki 
    601  1.23  ozaki 	macaddr_src=$(get_macaddr $SOCKSRC shmif0)
    602  1.23  ozaki 	macaddr_dst=$(get_macaddr $SOCKDST shmif0)
    603  1.23  ozaki 
    604  1.23  ozaki 	export RUMP_SERVER=$SOCKSRC
    605  1.23  ozaki 
    606  1.23  ozaki 	# Test ping and a resulting routing message (RTM_ADD)
    607  1.23  ozaki 	rump.route -n monitor -c 1 > $file &
    608  1.34    kre 	pid=$!
    609  1.23  ozaki 	sleep 1
    610  1.23  ozaki 	atf_check -s exit:0 -o ignore rump.ping -n -w 1 -c 1 $IP4DST
    611  1.23  ozaki 	wait $pid
    612  1.23  ozaki 	$DEBUG && cat $file
    613  1.23  ozaki 
    614  1.34    kre 	hdr="RTM_ADD.+<UP,HOST,DONE,LLINFO,CLONED>"
    615  1.34    kre 	what="<DST,GATEWAY>"
    616  1.39    roy 	addr="$IP4DST $macaddr_dst"
    617  1.39    roy 	atf_check -s exit:0 -o match:"$hdr" -o match:"$what" -o match:"$addr" \
    618  1.39    roy 		cat $file
    619  1.39    roy 
    620  1.39    roy 	# Test ping and a resulting routing message (RTM_MISS) on subnet
    621  1.39    roy 	rump.route -n monitor -c 1 > $file &
    622  1.39    roy 	pid=$!
    623  1.39    roy 	sleep 1
    624  1.39    roy 	atf_check -s exit:2 -o ignore -e ignore \
    625  1.44    roy 		rump.ping -n -w 1 -c 1 $IP4DST_FAIL1
    626  1.39    roy 	wait $pid
    627  1.39    roy 	$DEBUG && cat $file
    628  1.39    roy 
    629  1.39    roy 	hdr="RTM_MISS.+<DONE>"
    630  1.41    roy 	what="<DST,GATEWAY,AUTHOR>"
    631  1.41    roy 	addr="$IP4DST_FAIL1 link#2 $IP4SRC"
    632  1.39    roy 	atf_check -s exit:0 -o match:"$hdr" -o match:"$what" -o match:"$addr" \
    633  1.39    roy 		cat $file
    634  1.39    roy 
    635  1.39    roy 	# Test ping and a resulting routing message (RTM_MISS) off subnet
    636  1.39    roy 	rump.route -n monitor -c 1 > $file &
    637  1.39    roy 	pid=$!
    638  1.39    roy 	sleep 1
    639  1.39    roy 	atf_check -s exit:2 -o ignore -e ignore \
    640  1.39    roy 		rump.ping -n -w 1 -c 1 $IP4DST_FAIL2
    641  1.39    roy 	wait $pid
    642  1.39    roy 	$DEBUG && cat $file
    643  1.39    roy 
    644  1.39    roy 	hdr="RTM_MISS.+<DONE>"
    645  1.39    roy 	what="<DST>"
    646  1.39    roy 	addr="$IP4DST_FAIL2"
    647  1.34    kre 	atf_check -s exit:0 -o match:"$hdr" -o match:"$what" -o match:"$addr" \
    648  1.34    kre 		cat $file
    649  1.23  ozaki 
    650  1.33  ozaki 	# Test arp -d and resulting routing messages (RTM_DELETE)
    651  1.34    kre 	rump.route -n monitor -c 1 > $file &
    652  1.34    kre 	pid=$!
    653  1.23  ozaki 	sleep 1
    654  1.23  ozaki 	atf_check -s exit:0 -o ignore rump.arp -d $IP4DST
    655  1.23  ozaki 	wait $pid
    656  1.23  ozaki 	$DEBUG && cat $file
    657  1.23  ozaki 
    658  1.34    kre 	hdr="RTM_DELETE.+<HOST,DONE,LLINFO,CLONED>"
    659  1.34    kre 	what="<DST,GATEWAY>"
    660  1.34    kre 	addr="$IP4DST $macaddr_dst"
    661  1.34    kre 	atf_check -s exit:0 -o match:"$hdr" -o match:"$what" -o match:"$addr" \
    662  1.34    kre 		grep -A 3 RTM_DELETE $file
    663  1.23  ozaki 
    664  1.23  ozaki 	rump_server_destroy_ifaces
    665  1.23  ozaki }
    666  1.23  ozaki 
    667  1.47  ozaki test_purge_on_route_change()
    668  1.27  ozaki {
    669  1.27  ozaki 
    670  1.27  ozaki 	rump_server_start $SOCKSRC
    671  1.27  ozaki 	rump_server_start $SOCKDST
    672  1.27  ozaki 
    673  1.27  ozaki 	setup_dst_server
    674  1.27  ozaki 	setup_src_server
    675  1.27  ozaki 
    676  1.27  ozaki 	rump_server_add_iface $SOCKSRC shmif1 bus1
    677  1.27  ozaki 	export RUMP_SERVER=$SOCKSRC
    678  1.27  ozaki 	atf_check -s exit:0 rump.ifconfig shmif1 inet $IP4SRC2/24
    679  1.27  ozaki 	atf_check -s exit:0 rump.ifconfig -w 10
    680  1.27  ozaki 
    681  1.27  ozaki 	$DEBUG && rump.netstat -nr -f inet
    682  1.27  ozaki 	atf_check -s exit:0 -o ignore rump.ping -n -w 1 -c 1 $IP4DST
    683  1.27  ozaki 	$DEBUG && rump.arp -na
    684  1.27  ozaki 	atf_check -s exit:0 -o ignore \
    685  1.27  ozaki 	    rump.route change -net $IP4NET -ifp shmif1
    686  1.27  ozaki 	$DEBUG && rump.netstat -nr -f inet
    687  1.27  ozaki 	$DEBUG && rump.arp -na
    688  1.27  ozaki 	# The entry was already removed on route change
    689  1.27  ozaki 	atf_check -s not-exit:0 -e match:'no entry' rump.arp -n $IP4DST
    690  1.27  ozaki 
    691  1.27  ozaki 	rump_server_destroy_ifaces
    692  1.27  ozaki }
    693  1.27  ozaki 
    694  1.47  ozaki test_purge_on_route_delete()
    695  1.27  ozaki {
    696  1.27  ozaki 
    697  1.27  ozaki 	rump_server_start $SOCKSRC
    698  1.27  ozaki 	rump_server_start $SOCKDST
    699  1.27  ozaki 
    700  1.27  ozaki 	setup_dst_server
    701  1.27  ozaki 	setup_src_server
    702  1.27  ozaki 
    703  1.27  ozaki 	$DEBUG && rump.netstat -nr -f inet
    704  1.27  ozaki 	atf_check -s exit:0 -o ignore rump.ping -n -w 1 -c 1 $IP4DST
    705  1.27  ozaki 	$DEBUG && rump.arp -na
    706  1.27  ozaki 
    707  1.27  ozaki 	atf_check -s exit:0 -o ignore rump.route delete -net $IP4NET
    708  1.27  ozaki 	$DEBUG && rump.netstat -nr -f inet
    709  1.27  ozaki 	$DEBUG && rump.arp -na
    710  1.27  ozaki 
    711  1.27  ozaki 	# The entry was already removed on route delete
    712  1.27  ozaki 	atf_check -s not-exit:0 -e match:'no entry' rump.arp -n $IP4DST
    713  1.27  ozaki 
    714  1.27  ozaki 	rump_server_destroy_ifaces
    715  1.27  ozaki }
    716  1.27  ozaki 
    717  1.47  ozaki test_purge_on_ifdown()
    718  1.27  ozaki {
    719  1.27  ozaki 
    720  1.27  ozaki 	rump_server_start $SOCKSRC
    721  1.27  ozaki 	rump_server_start $SOCKDST
    722  1.27  ozaki 
    723  1.27  ozaki 	setup_dst_server
    724  1.27  ozaki 	setup_src_server
    725  1.27  ozaki 
    726  1.27  ozaki 	$DEBUG && rump.netstat -nr -f inet
    727  1.27  ozaki 	atf_check -s exit:0 -o ignore rump.ping -n -w 1 -c 1 $IP4DST
    728  1.27  ozaki 	atf_check -s exit:0 -o match:'shmif0' rump.arp -n $IP4DST
    729  1.27  ozaki 
    730  1.27  ozaki 	# Shutdown the interface
    731  1.27  ozaki 	atf_check -s exit:0 rump.ifconfig shmif0 down
    732  1.27  ozaki 	$DEBUG && rump.netstat -nr -f inet
    733  1.27  ozaki 	$DEBUG && rump.arp -na
    734  1.27  ozaki 
    735  1.27  ozaki 	atf_check -s not-exit:0 -e match:'no entry' rump.arp -n $IP4DST
    736  1.27  ozaki 
    737  1.27  ozaki 	rump_server_destroy_ifaces
    738  1.27  ozaki }
    739  1.27  ozaki 
    740  1.47  ozaki test_stray_entries()
    741  1.33  ozaki {
    742  1.33  ozaki 
    743  1.33  ozaki 	rump_server_start $SOCKSRC
    744  1.33  ozaki 	rump_server_start $SOCKDST
    745  1.33  ozaki 
    746  1.33  ozaki 	setup_dst_server
    747  1.33  ozaki 	setup_src_server
    748  1.33  ozaki 
    749  1.33  ozaki 	rump_server_add_iface $SOCKSRC shmif1 bus1
    750  1.33  ozaki 
    751  1.33  ozaki 	export RUMP_SERVER=$SOCKSRC
    752  1.33  ozaki 	atf_check -s exit:0 rump.ifconfig shmif1 inet $IP4SRC2/24
    753  1.33  ozaki 	atf_check -s exit:0 rump.ifconfig -w 10
    754  1.33  ozaki 
    755  1.33  ozaki 	$DEBUG && rump.netstat -nr -f inet
    756  1.33  ozaki 	atf_check -s exit:0 -o ignore rump.ping -n -w 1 -c 1 $IP4DST
    757  1.33  ozaki 	$DEBUG && rump.arp -na
    758  1.33  ozaki 	atf_check -s exit:0 -o match:'shmif0' rump.arp -n $IP4DST
    759  1.33  ozaki 	atf_check -s exit:0 -o not-match:'shmif1' rump.arp -n $IP4DST
    760  1.33  ozaki 
    761  1.33  ozaki 	# Clean up
    762  1.33  ozaki 	atf_check -s exit:0 -o ignore rump.arp -da
    763  1.33  ozaki 	atf_check -s not-exit:0 -e match:'no entry' rump.arp -n $IP4DST
    764  1.33  ozaki 
    765  1.33  ozaki 	# ping from a different source address
    766  1.33  ozaki 	atf_check -s exit:0 -o ignore \
    767  1.33  ozaki 	    rump.ping -n -w 1 -c 1 -I $IP4SRC2 $IP4DST
    768  1.33  ozaki 	$DEBUG && rump.arp -na
    769  1.33  ozaki 	atf_check -s exit:0 -o match:'shmif0' rump.arp -n $IP4DST
    770  1.33  ozaki 	# ARP reply goes back via shmif1, so a cache is created on shmif1
    771  1.33  ozaki 	atf_check -s exit:0 -o match:'shmif1' rump.arp -n $IP4DST
    772  1.33  ozaki 
    773  1.33  ozaki 	# Clean up by arp -da
    774  1.33  ozaki 	atf_check -s exit:0 -o ignore rump.arp -da
    775  1.33  ozaki 	atf_check -s not-exit:0 -e match:'no entry' rump.arp -n $IP4DST
    776  1.33  ozaki 
    777  1.33  ozaki 	# ping from a different source address again
    778  1.33  ozaki 	atf_check -s exit:0 -o ignore \
    779  1.33  ozaki 	    rump.ping -n -w 1 -c 1 -I $IP4SRC2 $IP4DST
    780  1.33  ozaki 	atf_check -s exit:0 -o match:'shmif0' rump.arp -n $IP4DST
    781  1.33  ozaki 	# ARP reply doen't come
    782  1.33  ozaki 	atf_check -s exit:0 -o not-match:'shmif1' rump.arp -n $IP4DST
    783  1.33  ozaki 
    784  1.33  ozaki 	# Cleanup caches on the destination
    785  1.33  ozaki 	export RUMP_SERVER=$SOCKDST
    786  1.33  ozaki 	atf_check -s exit:0 -o ignore rump.arp -da
    787  1.33  ozaki 	export RUMP_SERVER=$SOCKSRC
    788  1.33  ozaki 
    789  1.33  ozaki 	# ping from a different source address again
    790  1.33  ozaki 	atf_check -s exit:0 -o ignore \
    791  1.33  ozaki 	    rump.ping -n -w 1 -c 1 -I $IP4SRC2 $IP4DST
    792  1.33  ozaki 	atf_check -s exit:0 -o match:'shmif0' rump.arp -n $IP4DST
    793  1.33  ozaki 	# ARP reply goes back via shmif1
    794  1.33  ozaki 	atf_check -s exit:0 -o match:'shmif1' rump.arp -n $IP4DST
    795  1.33  ozaki 
    796  1.33  ozaki 	# Clean up by arp -d <ip>
    797  1.33  ozaki 	atf_check -s exit:0 -o ignore rump.arp -d $IP4DST
    798  1.33  ozaki 	# Both entries should be deleted
    799  1.33  ozaki 	atf_check -s not-exit:0 -e match:'no entry' rump.arp -n $IP4DST
    800  1.33  ozaki 
    801  1.33  ozaki 	rump_server_destroy_ifaces
    802  1.33  ozaki }
    803  1.33  ozaki 
    804  1.48  ozaki test_cache_creation_common()
    805  1.48  ozaki {
    806  1.48  ozaki 	local no_dad=$1
    807  1.48  ozaki 
    808  1.48  ozaki 	rump_server_start $SOCKSRC
    809  1.48  ozaki 	rump_server_start $SOCKDST
    810  1.48  ozaki 
    811  1.48  ozaki 	if $no_dad; then
    812  1.48  ozaki 		export RUMP_SERVER=$SOCKSRC
    813  1.48  ozaki 		atf_check -s exit:0 -o match:'3 -> 0' \
    814  1.48  ozaki 		    rump.sysctl -w net.inet.ip.dad_count=0
    815  1.48  ozaki 		export RUMP_SERVER=$SOCKDST
    816  1.48  ozaki 		atf_check -s exit:0 -o match:'3 -> 0' \
    817  1.48  ozaki 		    rump.sysctl -w net.inet.ip.dad_count=0
    818  1.48  ozaki 	fi
    819  1.48  ozaki 
    820  1.48  ozaki 	setup_dst_server
    821  1.48  ozaki 	setup_src_server
    822  1.48  ozaki 
    823  1.48  ozaki 	macaddr_src=$(get_macaddr $SOCKSRC shmif0)
    824  1.48  ozaki 	macaddr_dst=$(get_macaddr $SOCKDST shmif0)
    825  1.48  ozaki 
    826  1.48  ozaki 	# ARP cache entries are not created for DAD/GARP packets.
    827  1.48  ozaki 	export RUMP_SERVER=$SOCKSRC
    828  1.48  ozaki 	atf_check -s exit:0 -o empty rump.arp -n -a
    829  1.48  ozaki 	export RUMP_SERVER=$SOCKDST
    830  1.48  ozaki 	atf_check -s exit:0 -o empty rump.arp -n -a
    831  1.48  ozaki 
    832  1.48  ozaki 	export RUMP_SERVER=$SOCKSRC
    833  1.48  ozaki 
    834  1.48  ozaki 	extract_new_packets bus1 > ./out
    835  1.48  ozaki 
    836  1.48  ozaki 	atf_check -s exit:0 -o ignore rump.ping -n -w $TIMEOUT -c 1 $IP4DST
    837  1.48  ozaki 	$DEBUG && rump.arp -n -a
    838  1.48  ozaki 
    839  1.48  ozaki 	extract_new_packets bus1 > ./out
    840  1.48  ozaki 
    841  1.48  ozaki 	atf_check -s exit:0 -o match:"\? \(10.0.1.2\) at $macaddr_dst on shmif0 [0-9]+s R" \
    842  1.48  ozaki 	    rump.arp -n -a
    843  1.48  ozaki 
    844  1.48  ozaki 	export RUMP_SERVER=$SOCKDST
    845  1.48  ozaki 
    846  1.48  ozaki 	# An entry was first created as stale then sending an ARP reply made it delay.
    847  1.48  ozaki 	atf_check -s exit:0 -o match:"\? \(10.0.1.1\) at $macaddr_src on shmif0 [0-9]+s D" \
    848  1.48  ozaki 	    rump.arp -n -a
    849  1.48  ozaki 
    850  1.48  ozaki 	# The sender resolves the receiver's address.
    851  1.48  ozaki 	pkt=$(make_pkt_str_arpreq 10.0.1.2 10.0.1.1)
    852  1.48  ozaki 	atf_check -s exit:0 -o match:"$pkt" cat ./out
    853  1.48  ozaki 
    854  1.48  ozaki 	# The receiver doesn't resolv the sender's address because the ARP request
    855  1.48  ozaki 	# from the sender has let make an entry already.
    856  1.48  ozaki 	pkt=$(make_pkt_str_arpreq 10.0.1.1 10.0.1.2)
    857  1.48  ozaki 	atf_check -s exit:0 -o not-match:"$pkt" cat ./out
    858  1.48  ozaki 
    859  1.48  ozaki 	rump_server_destroy_ifaces
    860  1.48  ozaki }
    861  1.48  ozaki 
    862  1.48  ozaki test_cache_creation()
    863  1.48  ozaki {
    864  1.48  ozaki 
    865  1.48  ozaki 	test_cache_creation_common false
    866  1.48  ozaki }
    867  1.48  ozaki 
    868  1.48  ozaki test_cache_creation_nodad()
    869  1.48  ozaki {
    870  1.48  ozaki 
    871  1.48  ozaki 	test_cache_creation_common true
    872  1.48  ozaki }
    873  1.48  ozaki 
    874  1.49  ozaki test_arp_request_count()
    875  1.49  ozaki {
    876  1.49  ozaki 
    877  1.49  ozaki 	export RUMP_SERVER=$SOCKSRC
    878  1.49  ozaki 	pkt=$(make_pkt_str_arpreq 10.0.1.2 10.0.1.1)
    879  1.49  ozaki 
    880  1.49  ozaki 	extract_new_packets bus1 > ./out
    881  1.49  ozaki 	atf_check -s not-exit:0 -o ignore -e ignore rump.ping -n -c 1 $IP4DST
    882  1.49  ozaki 	extract_new_packets bus1 > ./out
    883  1.49  ozaki 
    884  1.49  ozaki 	# ARP sends request packets net.inet.arp.nd_bmaxtries times at most.
    885  1.49  ozaki 	times=$(rump.sysctl -n net.inet.arp.nd_bmaxtries)
    886  1.49  ozaki 	$DEBUG && echo times=$times
    887  1.49  ozaki 	$DEBUG && cat ./out
    888  1.49  ozaki 	atf_check -s exit:0 -o match:"$pkt" cat ./out
    889  1.49  ozaki 	atf_check -s exit:0 -o match:"$times" sh -c "grep -E '$pkt' ./out |wc -l"
    890  1.49  ozaki }
    891  1.49  ozaki 
    892  1.49  ozaki test_resolution()
    893  1.49  ozaki {
    894  1.49  ozaki 
    895  1.49  ozaki 	rump_server_start $SOCKSRC
    896  1.49  ozaki 	setup_src_server
    897  1.49  ozaki 
    898  1.49  ozaki 	export RUMP_SERVER=$SOCKSRC
    899  1.49  ozaki 
    900  1.49  ozaki 	# Test default value of net.inet.arp.nd_bmaxtries
    901  1.49  ozaki 	test_arp_request_count
    902  1.49  ozaki 
    903  1.49  ozaki 	# Test net.inet.arp.nd_bmaxtries=1
    904  1.49  ozaki 	atf_check -s exit:0 rump.sysctl -wq net.inet.arp.nd_bmaxtries=1
    905  1.49  ozaki 	test_arp_request_count
    906  1.49  ozaki 
    907  1.49  ozaki 	rump_server_destroy_ifaces
    908  1.49  ozaki }
    909  1.49  ozaki 
    910  1.47  ozaki add_test()
    911  1.33  ozaki {
    912  1.47  ozaki 	local name=$1
    913  1.47  ozaki 	local desc="$2"
    914  1.33  ozaki 
    915  1.47  ozaki 	atf_test_case "arp_${name}" cleanup
    916  1.47  ozaki 	eval "arp_${name}_head() {
    917  1.47  ozaki 			atf_set descr \"${desc}\"
    918  1.47  ozaki 			atf_set require.progs rump_server
    919  1.47  ozaki 		}
    920  1.47  ozaki 	    arp_${name}_body() {
    921  1.47  ozaki 			test_${name}
    922  1.47  ozaki 		}
    923  1.47  ozaki 	    arp_${name}_cleanup() {
    924  1.47  ozaki 			\$DEBUG && dump
    925  1.47  ozaki 			cleanup
    926  1.47  ozaki 		}"
    927  1.47  ozaki 	atf_add_test_case "arp_${name}"
    928  1.33  ozaki }
    929  1.33  ozaki 
    930   1.1  ozaki atf_init_test_cases()
    931   1.1  ozaki {
    932  1.47  ozaki 
    933  1.47  ozaki 	add_test cache_expiration      "Tests for ARP cache expiration"
    934  1.47  ozaki 	add_test command               "Tests for arp_commands of arp(8)"
    935  1.47  ozaki 	add_test garp                  "Tests for GARP"
    936  1.47  ozaki 	add_test garp_without_dad      "Tests for GARP with DAD disabled"
    937  1.47  ozaki 	add_test cache_overwriting     "Tests for behavior of overwriting ARP caches"
    938  1.47  ozaki 	add_test proxy_arp_pub         "Tests for Proxy ARP (pub)"
    939  1.47  ozaki 	add_test proxy_arp_pubproxy    "Tests for Proxy ARP (pub proxy)"
    940  1.47  ozaki 	add_test link_activation       "Tests for activating a new MAC address"
    941  1.47  ozaki 	add_test static                "Tests for static ARP entries"
    942  1.47  ozaki 	add_test rtm                   "Tests for routing messages on operations of ARP entries"
    943  1.47  ozaki 	add_test purge_on_route_change "Tests if ARP entries are removed on route change"
    944  1.47  ozaki 	add_test purge_on_route_delete "Tests if ARP entries are removed on route delete"
    945  1.47  ozaki 	add_test purge_on_ifdown       "Tests if ARP entries are removed on interface down"
    946  1.47  ozaki 	add_test stray_entries         "Tests if ARP entries are removed on route change"
    947  1.48  ozaki 	add_test cache_creation        "Tests for ARP cache creation"
    948  1.48  ozaki 	add_test cache_creation_nodad  "Tests for ARP cache creation without DAD"
    949  1.49  ozaki 	add_test resolution            "Tests for ARP resolution"
    950   1.1  ozaki }
    951