xref: /netbsd-src/tests/net/arp/t_arp.sh (revision e781f1b0f718d190e8c0bb85c26b6c7e8178130f)
1*e781f1b0Sozaki-r#	$NetBSD: t_arp.sh,v 1.48 2024/09/09 07:26:42 ozaki-r Exp $
2d4516589Sozaki-r#
3d4516589Sozaki-r# Copyright (c) 2015 The NetBSD Foundation, Inc.
4d4516589Sozaki-r# All rights reserved.
5d4516589Sozaki-r#
6d4516589Sozaki-r# Redistribution and use in source and binary forms, with or without
7d4516589Sozaki-r# modification, are permitted provided that the following conditions
8d4516589Sozaki-r# are met:
9d4516589Sozaki-r# 1. Redistributions of source code must retain the above copyright
10d4516589Sozaki-r#    notice, this list of conditions and the following disclaimer.
11d4516589Sozaki-r# 2. Redistributions in binary form must reproduce the above copyright
12d4516589Sozaki-r#    notice, this list of conditions and the following disclaimer in the
13d4516589Sozaki-r#    documentation and/or other materials provided with the distribution.
14d4516589Sozaki-r#
15d4516589Sozaki-r# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
16d4516589Sozaki-r# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
17d4516589Sozaki-r# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
18d4516589Sozaki-r# PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
19d4516589Sozaki-r# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
20d4516589Sozaki-r# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
21d4516589Sozaki-r# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
22d4516589Sozaki-r# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
23d4516589Sozaki-r# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
24d4516589Sozaki-r# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
25d4516589Sozaki-r# POSSIBILITY OF SUCH DAMAGE.
26d4516589Sozaki-r#
27d4516589Sozaki-r
28d4516589Sozaki-rSOCKSRC=unix://commsock1
29d4516589Sozaki-rSOCKDST=unix://commsock2
30d4516589Sozaki-rIP4SRC=10.0.1.1
31f86487baSozaki-rIP4SRC2=10.0.1.5
32f86487baSozaki-rIP4NET=10.0.1.0
33d4516589Sozaki-rIP4DST=10.0.1.2
348ce75dc0Sozaki-rIP4DST_PROXYARP1=10.0.1.3
358ce75dc0Sozaki-rIP4DST_PROXYARP2=10.0.1.4
3607f3df8bSroyIP4DST_FAIL1=10.0.1.99
3707f3df8bSroyIP4DST_FAIL2=10.0.99.99
38d4516589Sozaki-r
391c189061Sozaki-rDEBUG=${DEBUG:-false}
40d4516589Sozaki-rTIMEOUT=1
41d4516589Sozaki-r
42d4516589Sozaki-rsetup_dst_server()
43d4516589Sozaki-r{
445a83ceeaSozaki-r
455a83ceeaSozaki-r	rump_server_add_iface $SOCKDST shmif0 bus1
46d4516589Sozaki-r	export RUMP_SERVER=$SOCKDST
47d4516589Sozaki-r	atf_check -s exit:0 rump.ifconfig shmif0 inet $IP4DST/24
48d4516589Sozaki-r	atf_check -s exit:0 rump.ifconfig shmif0 up
49d4516589Sozaki-r	atf_check -s exit:0 rump.ifconfig -w 10
50d4516589Sozaki-r
51d4516589Sozaki-r	$DEBUG && rump.ifconfig shmif0
52d4516589Sozaki-r	$DEBUG && rump.arp -n -a
53da803ed7Sozaki-r	$DEBUG && rump.netstat -nr -f inet
54d4516589Sozaki-r}
55d4516589Sozaki-r
56d4516589Sozaki-rsetup_src_server()
57d4516589Sozaki-r{
5804ce7456Sozaki-r	local keep=${1:-0}
59d4516589Sozaki-r
60d4516589Sozaki-r	export RUMP_SERVER=$SOCKSRC
61d4516589Sozaki-r
62caed3cdaSroy	# Shorten the expire time of cache entries
6304ce7456Sozaki-r	if [ $keep != 0 ]; then
64caed3cdaSroy		# Convert to ms
65caed3cdaSroy		keep=$(($keep * 1000))
6604ce7456Sozaki-r		atf_check -s exit:0 -o ignore \
67caed3cdaSroy		    rump.sysctl -w net.inet.arp.nd_reachable=$keep
6804ce7456Sozaki-r	fi
69d4516589Sozaki-r
70d4516589Sozaki-r	# Setup an interface
715a83ceeaSozaki-r	rump_server_add_iface $SOCKSRC shmif0 bus1
72d4516589Sozaki-r	atf_check -s exit:0 rump.ifconfig shmif0 inet $IP4SRC/24
73d4516589Sozaki-r	atf_check -s exit:0 rump.ifconfig shmif0 up
74d4516589Sozaki-r	atf_check -s exit:0 rump.ifconfig -w 10
75d4516589Sozaki-r
76d4516589Sozaki-r	# Sanity check
77d4516589Sozaki-r	$DEBUG && rump.ifconfig shmif0
78d4516589Sozaki-r	$DEBUG && rump.arp -n -a
79da803ed7Sozaki-r	$DEBUG && rump.netstat -nr -f inet
80dc9233b9Sozaki-r	atf_check -s not-exit:0 -e match:'no entry' rump.arp -n $IP4SRC
81dc9233b9Sozaki-r	atf_check -s not-exit:0 -e match:'no entry' rump.arp -n $IP4DST
82d4516589Sozaki-r}
83d4516589Sozaki-r
84caed3cdaSroyget_timeout()
85d4516589Sozaki-r{
86caed3cdaSroy	local addr="$1"
87caed3cdaSroy	local timeout=$(env RUMP_SERVER=$SOCKSRC rump.arp -n $addr |grep $addr|awk '{print $7;}')
88caed3cdaSroy	timeout=${timeout%s}
89caed3cdaSroy	echo $timeout
90caed3cdaSroy}
91caed3cdaSroy
92992011b0Sozaki-rtest_cache_expiration()
93caed3cdaSroy{
94caed3cdaSroy	local arp_keep=7
95d4516589Sozaki-r
965a83ceeaSozaki-r	rump_server_start $SOCKSRC
975a83ceeaSozaki-r	rump_server_start $SOCKDST
98d4516589Sozaki-r
99d4516589Sozaki-r	setup_dst_server
1000dac8021Sozaki-r	setup_src_server $arp_keep
101d4516589Sozaki-r
102caed3cdaSroy	# Make a permanent cache entry to avoid sending an NS packet disturbing
103caed3cdaSroy	# the test
104caed3cdaSroy	macaddr=$(get_macaddr $SOCKSRC shmif0)
105caed3cdaSroy	export RUMP_SERVER=$SOCKDST
106caed3cdaSroy	atf_check -s exit:0 -o ignore rump.arp -s $IP4SRC $macaddr
107caed3cdaSroy
108caed3cdaSroy	export RUMP_SERVER=$SOCKSRC
109caed3cdaSroy
110d4516589Sozaki-r	#
111d4516589Sozaki-r	# Check if a cache is expired expectedly
112d4516589Sozaki-r	#
113d4516589Sozaki-r	atf_check -s exit:0 -o ignore rump.ping -n -w $TIMEOUT -c 1 $IP4DST
114d4516589Sozaki-r
115d4516589Sozaki-r	$DEBUG && rump.arp -n -a
116caed3cdaSroy	atf_check -s not-exit:0 -o ignore -e match:'no entry' rump.arp -n $IP4SRC
117d4516589Sozaki-r	# Should be cached
118caed3cdaSroy	atf_check -s exit:0 -o not-match:'permanent' rump.arp -n $IP4DST
119d4516589Sozaki-r
120caed3cdaSroy	timeout=$(get_timeout $IP4DST)
121caed3cdaSroy
122caed3cdaSroy	atf_check -s exit:0 sleep $(($timeout + 1))
123d4516589Sozaki-r
124d4516589Sozaki-r	$DEBUG && rump.arp -n -a
125caed3cdaSroy	atf_check -s not-exit:0 -o ignore -e match:'no entry' rump.arp -n $IP4SRC
126caed3cdaSroy	# Expired but remains until GC sweaps it (1 day)
127caed3cdaSroy	atf_check -s exit:0 -o match:"$ONEDAYISH" rump.arp -n $IP4DST
128d4516589Sozaki-r
1295a83ceeaSozaki-r	rump_server_destroy_ifaces
130d4516589Sozaki-r}
131d4516589Sozaki-r
132da803ed7Sozaki-rcheck_arp_static_entry()
133da803ed7Sozaki-r{
134da803ed7Sozaki-r	local ip=$1
135da803ed7Sozaki-r	local mac=$2
136da803ed7Sozaki-r	local type=$3
137da803ed7Sozaki-r	local flags=
138da803ed7Sozaki-r
139da803ed7Sozaki-r	atf_check -s exit:0 -o match:"$mac" rump.arp -n $ip
140da803ed7Sozaki-r	if [ $type = 'permanent' ]; then
141da803ed7Sozaki-r		atf_check -s exit:0 -o match:'permanent' rump.arp -n $ip
142da803ed7Sozaki-r		check_route $ip "$mac" UHLS shmif0
143da803ed7Sozaki-r	else
144da803ed7Sozaki-r		atf_check -s exit:0 -o not-match:'permanent' rump.arp -n $ip
145da803ed7Sozaki-r		check_route $ip "$mac" UHL shmif0
146da803ed7Sozaki-r	fi
147da803ed7Sozaki-r}
148da803ed7Sozaki-r
149992011b0Sozaki-rtest_command()
150d4516589Sozaki-r{
151d4516589Sozaki-r	local arp_keep=5
152d4516589Sozaki-r	local bonus=2
153d4516589Sozaki-r
1545a83ceeaSozaki-r	rump_server_start $SOCKSRC
1555a83ceeaSozaki-r	rump_server_start $SOCKDST
156d4516589Sozaki-r
157d4516589Sozaki-r	setup_dst_server
1580dac8021Sozaki-r	setup_src_server $arp_keep
159d4516589Sozaki-r
160d4516589Sozaki-r	export RUMP_SERVER=$SOCKSRC
161d4516589Sozaki-r
162d4516589Sozaki-r	# Add and delete a static entry
163d4516589Sozaki-r	$DEBUG && rump.arp -n -a
164d4516589Sozaki-r	atf_check -s exit:0 -o ignore rump.arp -s 10.0.1.10 b2:a0:20:00:00:10
165d4516589Sozaki-r	$DEBUG && rump.arp -n -a
166da803ed7Sozaki-r	$DEBUG && rump.netstat -nr -f inet
167da803ed7Sozaki-r	check_arp_static_entry 10.0.1.10 'b2:a0:20:00:00:10' permanent
168d4516589Sozaki-r	atf_check -s exit:0 -o ignore rump.arp -d 10.0.1.10
169d4516589Sozaki-r	$DEBUG && rump.arp -n -a
170da803ed7Sozaki-r	$DEBUG && rump.netstat -nr -f inet
171d4516589Sozaki-r	atf_check -s not-exit:0 -e ignore rump.arp -n 10.0.1.10
172da803ed7Sozaki-r	check_route_no_entry 10.0.1.10
173d4516589Sozaki-r
174d4516589Sozaki-r	# Add multiple entries via a file
175d4516589Sozaki-r	cat - > ./list <<-EOF
176d4516589Sozaki-r	10.0.1.11 b2:a0:20:00:00:11
177d4516589Sozaki-r	10.0.1.12 b2:a0:20:00:00:12
178d4516589Sozaki-r	10.0.1.13 b2:a0:20:00:00:13
179d4516589Sozaki-r	10.0.1.14 b2:a0:20:00:00:14
180d4516589Sozaki-r	10.0.1.15 b2:a0:20:00:00:15
181d4516589Sozaki-r	EOF
182d4516589Sozaki-r	$DEBUG && rump.arp -n -a
183da803ed7Sozaki-r	$DEBUG && rump.netstat -nr -f inet
184d4516589Sozaki-r	atf_check -s exit:0 -o ignore rump.arp -f ./list
185d4516589Sozaki-r	$DEBUG && rump.arp -n -a
186da803ed7Sozaki-r	$DEBUG && rump.netstat -nr -f inet
187da803ed7Sozaki-r	check_arp_static_entry 10.0.1.11 'b2:a0:20:00:00:11' permanent
188da803ed7Sozaki-r	check_arp_static_entry 10.0.1.12 'b2:a0:20:00:00:12' permanent
189da803ed7Sozaki-r	check_arp_static_entry 10.0.1.13 'b2:a0:20:00:00:13' permanent
190da803ed7Sozaki-r	check_arp_static_entry 10.0.1.14 'b2:a0:20:00:00:14' permanent
191da803ed7Sozaki-r	check_arp_static_entry 10.0.1.15 'b2:a0:20:00:00:15' permanent
192d4516589Sozaki-r
1937a175f40Sozaki-r	# Test arp -a
1947a175f40Sozaki-r	atf_check -s exit:0 -o match:'10.0.1.11' rump.arp -n -a
1957a175f40Sozaki-r	atf_check -s exit:0 -o match:'10.0.1.12' rump.arp -n -a
1967a175f40Sozaki-r	atf_check -s exit:0 -o match:'10.0.1.13' rump.arp -n -a
1977a175f40Sozaki-r	atf_check -s exit:0 -o match:'10.0.1.14' rump.arp -n -a
1987a175f40Sozaki-r	atf_check -s exit:0 -o match:'10.0.1.15' rump.arp -n -a
1997a175f40Sozaki-r
200d4516589Sozaki-r	# Flush all entries
201d4516589Sozaki-r	$DEBUG && rump.arp -n -a
202da803ed7Sozaki-r	$DEBUG && rump.netstat -nr -f inet
203d4516589Sozaki-r	atf_check -s exit:0 -o ignore rump.arp -d -a
204d4516589Sozaki-r	atf_check -s not-exit:0 -e ignore rump.arp -n 10.0.1.11
205d4516589Sozaki-r	atf_check -s not-exit:0 -e ignore rump.arp -n 10.0.1.12
206d4516589Sozaki-r	atf_check -s not-exit:0 -e ignore rump.arp -n 10.0.1.13
207d4516589Sozaki-r	atf_check -s not-exit:0 -e ignore rump.arp -n 10.0.1.14
208d4516589Sozaki-r	atf_check -s not-exit:0 -e ignore rump.arp -n 10.0.1.15
209d4516589Sozaki-r	atf_check -s not-exit:0 -e ignore rump.arp -n 10.0.1.1
210da803ed7Sozaki-r	check_route_no_entry 10.0.1.11
211da803ed7Sozaki-r	check_route_no_entry 10.0.1.12
212da803ed7Sozaki-r	check_route_no_entry 10.0.1.13
213da803ed7Sozaki-r	check_route_no_entry 10.0.1.14
214da803ed7Sozaki-r	check_route_no_entry 10.0.1.15
215bf665d2fSozaki-r
216bf665d2fSozaki-r	# Test temp option
217bf665d2fSozaki-r	$DEBUG && rump.arp -n -a
218bf665d2fSozaki-r	atf_check -s exit:0 -o ignore rump.arp -s 10.0.1.10 b2:a0:20:00:00:10 temp
219bf665d2fSozaki-r	$DEBUG && rump.arp -n -a
220da803ed7Sozaki-r	$DEBUG && rump.netstat -nr -f inet
221da803ed7Sozaki-r	check_arp_static_entry 10.0.1.10 'b2:a0:20:00:00:10' temp
222bf665d2fSozaki-r
223bf665d2fSozaki-r	# Hm? the cache doesn't expire...
224caed3cdaSroy	#atf_check -s exit:0 sleep $(($arp_keep + $bonus))
225caed3cdaSroy	#$DEBUG && rump.arp -n -a
226caed3cdaSroy	#$DEBUG && rump.netstat -nr -f inet
22714dcf9ffSozaki-r	#atf_check -s not-exit:0 -e ignore rump.arp -n 10.0.1.10
22825711fd3Sozaki-r
2295a83ceeaSozaki-r	rump_server_destroy_ifaces
230d4516589Sozaki-r}
231d4516589Sozaki-r
232f6036fa4Sozaki-rmake_pkt_str_arpreq()
233b4bfe1a8Sozaki-r{
234b4bfe1a8Sozaki-r	local target=$1
235b4bfe1a8Sozaki-r	local sender=$2
2364cb98a5aSozaki-r	pkt="> ff:ff:ff:ff:ff:ff, ethertype ARP \(0x0806\), length 42:"
237b4bfe1a8Sozaki-r	pkt="$pkt Request who-has $target tell $sender, length 28"
238b4bfe1a8Sozaki-r	echo $pkt
239b4bfe1a8Sozaki-r}
240b4bfe1a8Sozaki-r
2416ca7de5dSozaki-rtest_garp_common()
242b4bfe1a8Sozaki-r{
2436ca7de5dSozaki-r	local no_dad=$1
244b4bfe1a8Sozaki-r	local pkt=
245b4bfe1a8Sozaki-r
2465a83ceeaSozaki-r	rump_server_start $SOCKSRC
2475a83ceeaSozaki-r
248b4bfe1a8Sozaki-r	export RUMP_SERVER=$SOCKSRC
249b4bfe1a8Sozaki-r
2506ca7de5dSozaki-r	if $no_dad; then
2516ca7de5dSozaki-r		atf_check -s exit:0 -o match:'3 -> 0' \
2526ca7de5dSozaki-r		    rump.sysctl -w net.inet.ip.dad_count=0
2536ca7de5dSozaki-r	fi
2546ca7de5dSozaki-r
255b4bfe1a8Sozaki-r	# Setup an interface
2565a83ceeaSozaki-r	rump_server_add_iface $SOCKSRC shmif0 bus1
257b4bfe1a8Sozaki-r	atf_check -s exit:0 rump.ifconfig shmif0 inet 10.0.0.1/24
258b4bfe1a8Sozaki-r	atf_check -s exit:0 rump.ifconfig shmif0 up
259b4bfe1a8Sozaki-r	$DEBUG && rump.ifconfig shmif0
260b4bfe1a8Sozaki-r
261b4bfe1a8Sozaki-r	atf_check -s exit:0 sleep 1
2624cb98a5aSozaki-r	extract_new_packets bus1 > ./out
263b4bfe1a8Sozaki-r
2646ca7de5dSozaki-r	#
2656ca7de5dSozaki-r	# Assign an address to an interface without IFF_UP
2666ca7de5dSozaki-r	#
267b4bfe1a8Sozaki-r	# A GARP packet is sent for the primary address
268f6036fa4Sozaki-r	pkt=$(make_pkt_str_arpreq 10.0.0.1 10.0.0.1)
2694cb98a5aSozaki-r	atf_check -s exit:0 -o match:"$pkt" cat ./out
270b4bfe1a8Sozaki-r
2716ca7de5dSozaki-r	atf_check -s exit:0 rump.ifconfig shmif0 down
2726ca7de5dSozaki-r	atf_check -s exit:0 rump.ifconfig shmif0 inet 10.0.0.2/24 alias
2736ca7de5dSozaki-r
2746ca7de5dSozaki-r	atf_check -s exit:0 sleep 1
2756ca7de5dSozaki-r	extract_new_packets bus1 > ./out
2766ca7de5dSozaki-r
2776ca7de5dSozaki-r	# A GARP packet is sent for the alias address
2786ca7de5dSozaki-r	pkt=$(make_pkt_str_arpreq 10.0.0.2 10.0.0.2)
2796ca7de5dSozaki-r	atf_check -s exit:0 -o match:"$pkt" cat ./out
2806ca7de5dSozaki-r
2816ca7de5dSozaki-r	# Clean up
2826ca7de5dSozaki-r	atf_check -s exit:0 rump.ifconfig shmif0 inet 10.0.0.1/24 delete
2836ca7de5dSozaki-r	atf_check -s exit:0 rump.ifconfig shmif0 inet 10.0.0.2/24 delete
2846ca7de5dSozaki-r
2856ca7de5dSozaki-r	#
2866ca7de5dSozaki-r	# Assign an address to an interface with IFF_UP
2876ca7de5dSozaki-r	#
2886ca7de5dSozaki-r	atf_check -s exit:0 rump.ifconfig shmif0 up
2896ca7de5dSozaki-r
2906ca7de5dSozaki-r	# Primary address
291b4bfe1a8Sozaki-r	atf_check -s exit:0 rump.ifconfig shmif0 inet 10.0.0.3/24
2926ca7de5dSozaki-r
2936ca7de5dSozaki-r	atf_check -s exit:0 sleep 1
2946ca7de5dSozaki-r	extract_new_packets bus1 > ./out
2956ca7de5dSozaki-r
2966ca7de5dSozaki-r	pkt=$(make_pkt_str_arpreq 10.0.0.3 10.0.0.3)
2976ca7de5dSozaki-r	if $no_dad; then
2986ca7de5dSozaki-r		# A GARP packet is sent
2996ca7de5dSozaki-r		atf_check -s exit:0 -o match:"$pkt" cat ./out
3006ca7de5dSozaki-r	else
3016ca7de5dSozaki-r		# No GARP packet is sent
3026ca7de5dSozaki-r		atf_check -s exit:0 -o not-match:"$pkt" cat ./out
3036ca7de5dSozaki-r	fi
3046ca7de5dSozaki-r
3056ca7de5dSozaki-r	# Alias address
306b4bfe1a8Sozaki-r	atf_check -s exit:0 rump.ifconfig shmif0 inet 10.0.0.4/24 alias
307b4bfe1a8Sozaki-r
3086ca7de5dSozaki-r	atf_check -s exit:0 sleep 1
3094cb98a5aSozaki-r	extract_new_packets bus1 > ./out
3106ca7de5dSozaki-r
311f6036fa4Sozaki-r	pkt=$(make_pkt_str_arpreq 10.0.0.4 10.0.0.4)
3126ca7de5dSozaki-r	if $no_dad; then
3136ca7de5dSozaki-r		# A GARP packet is sent
3146ca7de5dSozaki-r		atf_check -s exit:0 -o match:"$pkt" cat ./out
3156ca7de5dSozaki-r	else
3166ca7de5dSozaki-r		# No GARP packet is sent
3174cb98a5aSozaki-r		atf_check -s exit:0 -o not-match:"$pkt" cat ./out
3186ca7de5dSozaki-r	fi
3195a83ceeaSozaki-r
32007905cd2Sozaki-r	#
32107905cd2Sozaki-r	# GARP on Link up
32207905cd2Sozaki-r	#
32307905cd2Sozaki-r	atf_check -s exit:0 rump.ifconfig shmif0 media none
32407905cd2Sozaki-r	extract_new_packets bus1 > ./out
32507905cd2Sozaki-r	atf_check -s exit:0 rump.ifconfig shmif0 media auto
32607905cd2Sozaki-r
32707905cd2Sozaki-r	atf_check -s exit:0 sleep 1
32807905cd2Sozaki-r	extract_new_packets bus1 > ./out
32907905cd2Sozaki-r
33007905cd2Sozaki-r	if $no_dad; then
33107905cd2Sozaki-r		# A GARP packet is sent for both primary and alias addresses.
33207905cd2Sozaki-r		pkt=$(make_pkt_str_arpreq 10.0.0.3 10.0.0.3)
33307905cd2Sozaki-r		atf_check -s exit:0 -o match:"$pkt" cat ./out
33407905cd2Sozaki-r		pkt=$(make_pkt_str_arpreq 10.0.0.4 10.0.0.4)
33507905cd2Sozaki-r		atf_check -s exit:0 -o match:"$pkt" cat ./out
33607905cd2Sozaki-r	else
33707905cd2Sozaki-r		# No GARP is sent.
33807905cd2Sozaki-r		pkt=$(make_pkt_str_arpreq 10.0.0.3 10.0.0.3)
33907905cd2Sozaki-r		atf_check -s exit:0 -o not-match:"$pkt" cat ./out
34007905cd2Sozaki-r		pkt=$(make_pkt_str_arpreq 10.0.0.4 10.0.0.4)
34107905cd2Sozaki-r		atf_check -s exit:0 -o not-match:"$pkt" cat ./out
34207905cd2Sozaki-r		# DAD packets are sent instead.
34307905cd2Sozaki-r		pkt=$(make_pkt_str_arpreq 10.0.0.3 0.0.0.0)
34407905cd2Sozaki-r		atf_check -s exit:0 -o match:"$pkt" cat ./out
34507905cd2Sozaki-r		pkt=$(make_pkt_str_arpreq 10.0.0.4 0.0.0.0)
34607905cd2Sozaki-r		atf_check -s exit:0 -o match:"$pkt" cat ./out
34707905cd2Sozaki-r	fi
34807905cd2Sozaki-r
3495a83ceeaSozaki-r	rump_server_destroy_ifaces
350b4bfe1a8Sozaki-r}
351b4bfe1a8Sozaki-r
352992011b0Sozaki-rtest_garp()
3536ca7de5dSozaki-r{
3546ca7de5dSozaki-r
3556ca7de5dSozaki-r	test_garp_common false
3566ca7de5dSozaki-r}
3576ca7de5dSozaki-r
358992011b0Sozaki-rtest_garp_without_dad()
3596ca7de5dSozaki-r{
3606ca7de5dSozaki-r
3616ca7de5dSozaki-r	test_garp_common true
3626ca7de5dSozaki-r}
3636ca7de5dSozaki-r
364992011b0Sozaki-rtest_cache_overwriting()
3656abe86b9Sozaki-r{
3666abe86b9Sozaki-r
3675a83ceeaSozaki-r	rump_server_start $SOCKSRC
3685a83ceeaSozaki-r	rump_server_start $SOCKDST
3696abe86b9Sozaki-r
3706abe86b9Sozaki-r	setup_dst_server
37104ce7456Sozaki-r	setup_src_server
3726abe86b9Sozaki-r
3736abe86b9Sozaki-r	export RUMP_SERVER=$SOCKSRC
3746abe86b9Sozaki-r
3756abe86b9Sozaki-r	# Cannot overwrite a permanent cache
376fcbd6bf4Sozaki-r	atf_check -s exit:0 rump.arp -s $IP4DST b2:a0:20:00:00:ff
3776abe86b9Sozaki-r	$DEBUG && rump.arp -n -a
378dc9233b9Sozaki-r	atf_check -s not-exit:0 -e match:'File exists' \
379fcbd6bf4Sozaki-r	    rump.arp -s $IP4DST b2:a0:20:00:00:fe
380fcbd6bf4Sozaki-r	# cleanup
381fcbd6bf4Sozaki-r	atf_check -s exit:0 rump.arp -d $IP4DST
3826abe86b9Sozaki-r
3836abe86b9Sozaki-r	atf_check -s exit:0 -o ignore rump.ping -n -w $TIMEOUT -c 1 $IP4DST
3846abe86b9Sozaki-r	$DEBUG && rump.arp -n -a
3856abe86b9Sozaki-r	# Can overwrite a dynamic cache
3866abe86b9Sozaki-r	atf_check -s exit:0 -o ignore rump.arp -s $IP4DST b2:a0:20:00:00:00
3876abe86b9Sozaki-r	$DEBUG && rump.arp -n -a
38817bcc6ffSozaki-r	atf_check -s exit:0 -o match:'b2:a0:20:00:00:00' rump.arp -n $IP4DST
3896abe86b9Sozaki-r	atf_check -s exit:0 -o match:'permanent' rump.arp -n $IP4DST
3906abe86b9Sozaki-r
3916abe86b9Sozaki-r	atf_check -s exit:0 -o ignore rump.arp -s 10.0.1.10 b2:a0:20:00:00:10 temp
3926abe86b9Sozaki-r	$DEBUG && rump.arp -n -a
39317bcc6ffSozaki-r	atf_check -s exit:0 -o match:'b2:a0:20:00:00:10' rump.arp -n 10.0.1.10
3946abe86b9Sozaki-r	atf_check -s exit:0 -o not-match:'permanent' rump.arp -n 10.0.1.10
39509973b35Sozaki-r	# Can overwrite a temp cache
39609973b35Sozaki-r	atf_check -s exit:0 -o ignore rump.arp -s 10.0.1.10 b2:a0:20:00:00:ff
39709973b35Sozaki-r	atf_check -s exit:0 -o match:'b2:a0:20:00:00:ff' rump.arp -n 10.0.1.10
3986abe86b9Sozaki-r	$DEBUG && rump.arp -n -a
39925711fd3Sozaki-r
4005a83ceeaSozaki-r	rump_server_destroy_ifaces
4016abe86b9Sozaki-r}
4026abe86b9Sozaki-r
403f6036fa4Sozaki-rmake_pkt_str_arprep()
404f6036fa4Sozaki-r{
405f6036fa4Sozaki-r	local ip=$1
406f6036fa4Sozaki-r	local mac=$2
407f6036fa4Sozaki-r	pkt="ethertype ARP (0x0806), length 42: "
408f6036fa4Sozaki-r	pkt="Reply $ip is-at $mac, length 28"
409f6036fa4Sozaki-r	echo $pkt
410f6036fa4Sozaki-r}
411f6036fa4Sozaki-r
41209973b35Sozaki-rmake_pkt_str_garp()
41309973b35Sozaki-r{
41409973b35Sozaki-r	local ip=$1
41509973b35Sozaki-r	local mac=$2
41609973b35Sozaki-r	local pkt=
41709973b35Sozaki-r	pkt="$mac > ff:ff:ff:ff:ff:ff, ethertype ARP (0x0806),"
41809973b35Sozaki-r	pkt="$pkt length 42: Request who-has $ip tell $ip, length 28"
41909973b35Sozaki-r	echo $pkt
42009973b35Sozaki-r}
42109973b35Sozaki-r
4228ce75dc0Sozaki-rtest_proxy_arp()
423f6036fa4Sozaki-r{
4248ce75dc0Sozaki-r	local opts= title= flags=
4258ce75dc0Sozaki-r	local type=$1
426f6036fa4Sozaki-r
4275a83ceeaSozaki-r	rump_server_start $SOCKSRC
42848e354a3Sbad	rump_server_fs_start $SOCKDST tap
429f6036fa4Sozaki-r
430f6036fa4Sozaki-r	setup_dst_server
43104ce7456Sozaki-r	setup_src_server
432f6036fa4Sozaki-r
433f6036fa4Sozaki-r	export RUMP_SERVER=$SOCKDST
4348ce75dc0Sozaki-r	atf_check -s exit:0 -o ignore rump.sysctl -w net.inet.ip.forwarding=1
435554c6ec3Sozaki-r	macaddr_dst=$(get_macaddr $SOCKDST shmif0)
436f6036fa4Sozaki-r
4378ce75dc0Sozaki-r	if [ "$type" = "pub" ]; then
4388ce75dc0Sozaki-r		opts="pub"
4398ce75dc0Sozaki-r	else
4408ce75dc0Sozaki-r		opts="pub proxy"
4418ce75dc0Sozaki-r	fi
442fcbd6bf4Sozaki-r	# Always proxy only since migrating to lltable/llentry
4437a353eb7Sroy	title='published \(proxy only\)'
444f6036fa4Sozaki-r
4458ce75dc0Sozaki-r	#
4468ce75dc0Sozaki-r	# Test#1: First setup an endpoint then create proxy arp entry
4478ce75dc0Sozaki-r	#
4488ce75dc0Sozaki-r	export RUMP_SERVER=$SOCKDST
449ce0ae1dfSozaki-r	rump_server_add_iface $SOCKDST tap1
4508ce75dc0Sozaki-r	atf_check -s exit:0 rump.ifconfig tap1 $IP4DST_PROXYARP1/24 up
4518ce75dc0Sozaki-r	atf_check -s exit:0 rump.ifconfig -w 10
452f6036fa4Sozaki-r
4538ce75dc0Sozaki-r	# Try to ping (should fail w/o proxy arp)
454f6036fa4Sozaki-r	export RUMP_SERVER=$SOCKSRC
455f6036fa4Sozaki-r	atf_check -s not-exit:0 -o ignore -e ignore \
4568ce75dc0Sozaki-r	    rump.ping -n -w 1 -c 1 $IP4DST_PROXYARP1
45765e7bf86Sroy	# Remove ARP entry as it may hang around in WAITDELETE a few seconds
45865e7bf86Sroy	atf_check -s ignore rump.arp -d $IP4DST_PROXYARP1
459f6036fa4Sozaki-r
4608ce75dc0Sozaki-r	# Flushing
461d64bc47fSozaki-r	extract_new_packets bus1 > ./out
4628ce75dc0Sozaki-r
4638ce75dc0Sozaki-r	# Set up proxy ARP entry
4648ce75dc0Sozaki-r	export RUMP_SERVER=$SOCKDST
4658ce75dc0Sozaki-r	atf_check -s exit:0 -o ignore \
4668ce75dc0Sozaki-r	    rump.arp -s $IP4DST_PROXYARP1 $macaddr_dst $opts
4678ce75dc0Sozaki-r	atf_check -s exit:0 -o match:"$title" rump.arp -n $IP4DST_PROXYARP1
4688ce75dc0Sozaki-r
4698ce75dc0Sozaki-r	# Try to ping
4708ce75dc0Sozaki-r	export RUMP_SERVER=$SOCKSRC
471fcbd6bf4Sozaki-r	atf_check -s exit:0 -o ignore rump.ping -n -w 1 -c 1 $IP4DST_PROXYARP1
4728ce75dc0Sozaki-r
473d64bc47fSozaki-r	extract_new_packets bus1 > ./out
474f6036fa4Sozaki-r	$DEBUG && cat ./out
475f6036fa4Sozaki-r
47609973b35Sozaki-r	pkt1=$(make_pkt_str_arprep $IP4DST_PROXYARP1 $macaddr_dst)
47709973b35Sozaki-r	pkt2=$(make_pkt_str_garp $IP4DST_PROXYARP1 $macaddr_dst)
47809973b35Sozaki-r	atf_check -s exit:0 -x "cat ./out |grep -q -e '$pkt1' -e '$pkt2'"
479f6036fa4Sozaki-r
4808ce75dc0Sozaki-r	#
4818ce75dc0Sozaki-r	# Test#2: Create proxy arp entry then set up an endpoint
4828ce75dc0Sozaki-r	#
4838ce75dc0Sozaki-r	export RUMP_SERVER=$SOCKDST
4848ce75dc0Sozaki-r	atf_check -s exit:0 -o ignore \
4858ce75dc0Sozaki-r	    rump.arp -s $IP4DST_PROXYARP2 $macaddr_dst $opts
4868ce75dc0Sozaki-r	atf_check -s exit:0 -o match:"$title" rump.arp -n $IP4DST_PROXYARP2
48709973b35Sozaki-r	$DEBUG && rump.netstat -nr -f inet
4888ce75dc0Sozaki-r
4898ce75dc0Sozaki-r	# Try to ping (should fail because no endpoint exists)
4908ce75dc0Sozaki-r	export RUMP_SERVER=$SOCKSRC
491f6036fa4Sozaki-r	atf_check -s not-exit:0 -o ignore -e ignore \
4928ce75dc0Sozaki-r	    rump.ping -n -w 1 -c 1 $IP4DST_PROXYARP2
49365e7bf86Sroy	# Remove ARP entry as it may hang around in WAITDELETE a few seconds
49465e7bf86Sroy	atf_check -s ignore rump.arp -d $IP4DST_PROXYARP2
495f6036fa4Sozaki-r
496d64bc47fSozaki-r	extract_new_packets bus1 > ./out
497f6036fa4Sozaki-r	$DEBUG && cat ./out
498f6036fa4Sozaki-r
4998ce75dc0Sozaki-r	# ARP reply should be sent
5008ce75dc0Sozaki-r	pkt=$(make_pkt_str_arprep $IP4DST_PROXYARP2 $macaddr_dst)
501f6036fa4Sozaki-r	atf_check -s exit:0 -x "cat ./out |grep -q '$pkt'"
502f6036fa4Sozaki-r
5038ce75dc0Sozaki-r	export RUMP_SERVER=$SOCKDST
504ce0ae1dfSozaki-r	rump_server_add_iface $SOCKDST tap2
5058ce75dc0Sozaki-r	atf_check -s exit:0 rump.ifconfig tap2 $IP4DST_PROXYARP2/24 up
5068ce75dc0Sozaki-r	atf_check -s exit:0 rump.ifconfig -w 10
5078ce75dc0Sozaki-r
5088ce75dc0Sozaki-r	# Try to ping
5098ce75dc0Sozaki-r	export RUMP_SERVER=$SOCKSRC
51009973b35Sozaki-r	atf_check -s exit:0 -o ignore rump.ping -n -w 1 -c 1 $IP4DST_PROXYARP2
5118ce75dc0Sozaki-r}
5128ce75dc0Sozaki-r
513992011b0Sozaki-rtest_proxy_arp_pub()
5148ce75dc0Sozaki-r{
5158ce75dc0Sozaki-r
5168ce75dc0Sozaki-r	test_proxy_arp pub
5175a83ceeaSozaki-r	rump_server_destroy_ifaces
5188ce75dc0Sozaki-r}
5198ce75dc0Sozaki-r
520992011b0Sozaki-rtest_proxy_arp_pubproxy()
5218ce75dc0Sozaki-r{
5228ce75dc0Sozaki-r
5238ce75dc0Sozaki-r	test_proxy_arp pubproxy
5245a83ceeaSozaki-r	rump_server_destroy_ifaces
525f6036fa4Sozaki-r}
526f6036fa4Sozaki-r
527992011b0Sozaki-rtest_link_activation()
528520486c3Sozaki-r{
529520486c3Sozaki-r
5305a83ceeaSozaki-r	rump_server_start $SOCKSRC
5315a83ceeaSozaki-r	rump_server_start $SOCKDST
532520486c3Sozaki-r
533520486c3Sozaki-r	setup_dst_server
53404ce7456Sozaki-r	setup_src_server
535520486c3Sozaki-r
536520486c3Sozaki-r	# flush old packets
537d64bc47fSozaki-r	extract_new_packets bus1 > ./out
538520486c3Sozaki-r
539520486c3Sozaki-r	export RUMP_SERVER=$SOCKSRC
540520486c3Sozaki-r
541520486c3Sozaki-r	atf_check -s exit:0 -o ignore rump.ifconfig shmif0 link \
542520486c3Sozaki-r	    b2:a1:00:00:00:01
543520486c3Sozaki-r
544520486c3Sozaki-r	atf_check -s exit:0 sleep 1
545d64bc47fSozaki-r	extract_new_packets bus1 > ./out
546520486c3Sozaki-r	$DEBUG && cat ./out
547520486c3Sozaki-r
548520486c3Sozaki-r	pkt=$(make_pkt_str_arpreq $IP4SRC $IP4SRC)
5494cb98a5aSozaki-r	atf_check -s exit:0 -o not-match:"$pkt" cat ./out
550520486c3Sozaki-r
551520486c3Sozaki-r	atf_check -s exit:0 -o ignore rump.ifconfig shmif0 link \
552520486c3Sozaki-r	    b2:a1:00:00:00:02 active
553520486c3Sozaki-r
554520486c3Sozaki-r	atf_check -s exit:0 sleep 1
555d64bc47fSozaki-r	extract_new_packets bus1 > ./out
556520486c3Sozaki-r	$DEBUG && cat ./out
557520486c3Sozaki-r
558520486c3Sozaki-r	pkt=$(make_pkt_str_arpreq $IP4SRC $IP4SRC)
5594cb98a5aSozaki-r	atf_check -s exit:0 -o match:"b2:a1:00:00:00:02 $pkt" cat ./out
5605a83ceeaSozaki-r
5615a83ceeaSozaki-r	rump_server_destroy_ifaces
562520486c3Sozaki-r}
563520486c3Sozaki-r
564992011b0Sozaki-rtest_static()
565095fdb04Sozaki-r{
566095fdb04Sozaki-r	local macaddr_src=
567095fdb04Sozaki-r
5685a83ceeaSozaki-r	rump_server_start $SOCKSRC
5695a83ceeaSozaki-r	rump_server_start $SOCKDST
570095fdb04Sozaki-r
571095fdb04Sozaki-r	setup_dst_server
57204ce7456Sozaki-r	setup_src_server
573095fdb04Sozaki-r
574554c6ec3Sozaki-r	macaddr_src=$(get_macaddr $SOCKSRC shmif0)
575095fdb04Sozaki-r
576095fdb04Sozaki-r	# Set a (valid) static ARP entry for the src server
577095fdb04Sozaki-r	export RUMP_SERVER=$SOCKDST
578095fdb04Sozaki-r	$DEBUG && rump.arp -n -a
579095fdb04Sozaki-r	atf_check -s exit:0 -o ignore rump.arp -s $IP4SRC $macaddr_src
580095fdb04Sozaki-r	$DEBUG && rump.arp -n -a
581095fdb04Sozaki-r
582095fdb04Sozaki-r	# Test receiving an ARP request with the static ARP entry (as spa/sha)
583095fdb04Sozaki-r	export RUMP_SERVER=$SOCKSRC
584095fdb04Sozaki-r	atf_check -s exit:0 -o ignore rump.ping -n -w 1 -c 1 $IP4DST
585095fdb04Sozaki-r
5865a83ceeaSozaki-r	rump_server_destroy_ifaces
587d4516589Sozaki-r}
588d4516589Sozaki-r
589992011b0Sozaki-rtest_rtm()
590e40a7848Sozaki-r{
591e40a7848Sozaki-r	local macaddr_src= macaddr_dst=
592e40a7848Sozaki-r	local file=./tmp
593af284e43Skre	local pid= hdr= what= addr=
594e40a7848Sozaki-r
595e40a7848Sozaki-r	rump_server_start $SOCKSRC
596e40a7848Sozaki-r	rump_server_start $SOCKDST
597e40a7848Sozaki-r
598e40a7848Sozaki-r	setup_dst_server
59904ce7456Sozaki-r	setup_src_server
600e40a7848Sozaki-r
601e40a7848Sozaki-r	macaddr_src=$(get_macaddr $SOCKSRC shmif0)
602e40a7848Sozaki-r	macaddr_dst=$(get_macaddr $SOCKDST shmif0)
603e40a7848Sozaki-r
604e40a7848Sozaki-r	export RUMP_SERVER=$SOCKSRC
605e40a7848Sozaki-r
606e40a7848Sozaki-r	# Test ping and a resulting routing message (RTM_ADD)
607e40a7848Sozaki-r	rump.route -n monitor -c 1 > $file &
608af284e43Skre	pid=$!
609e40a7848Sozaki-r	sleep 1
610e40a7848Sozaki-r	atf_check -s exit:0 -o ignore rump.ping -n -w 1 -c 1 $IP4DST
611e40a7848Sozaki-r	wait $pid
612e40a7848Sozaki-r	$DEBUG && cat $file
613e40a7848Sozaki-r
614af284e43Skre	hdr="RTM_ADD.+<UP,HOST,DONE,LLINFO,CLONED>"
615af284e43Skre	what="<DST,GATEWAY>"
61607f3df8bSroy	addr="$IP4DST $macaddr_dst"
61707f3df8bSroy	atf_check -s exit:0 -o match:"$hdr" -o match:"$what" -o match:"$addr" \
61807f3df8bSroy		cat $file
61907f3df8bSroy
62007f3df8bSroy	# Test ping and a resulting routing message (RTM_MISS) on subnet
62107f3df8bSroy	rump.route -n monitor -c 1 > $file &
62207f3df8bSroy	pid=$!
62307f3df8bSroy	sleep 1
62407f3df8bSroy	atf_check -s exit:2 -o ignore -e ignore \
6256a4c2721Sroy		rump.ping -n -w 1 -c 1 $IP4DST_FAIL1
62607f3df8bSroy	wait $pid
62707f3df8bSroy	$DEBUG && cat $file
62807f3df8bSroy
62907f3df8bSroy	hdr="RTM_MISS.+<DONE>"
63017da0e54Sroy	what="<DST,GATEWAY,AUTHOR>"
63117da0e54Sroy	addr="$IP4DST_FAIL1 link#2 $IP4SRC"
63207f3df8bSroy	atf_check -s exit:0 -o match:"$hdr" -o match:"$what" -o match:"$addr" \
63307f3df8bSroy		cat $file
63407f3df8bSroy
63507f3df8bSroy	# Test ping and a resulting routing message (RTM_MISS) off subnet
63607f3df8bSroy	rump.route -n monitor -c 1 > $file &
63707f3df8bSroy	pid=$!
63807f3df8bSroy	sleep 1
63907f3df8bSroy	atf_check -s exit:2 -o ignore -e ignore \
64007f3df8bSroy		rump.ping -n -w 1 -c 1 $IP4DST_FAIL2
64107f3df8bSroy	wait $pid
64207f3df8bSroy	$DEBUG && cat $file
64307f3df8bSroy
64407f3df8bSroy	hdr="RTM_MISS.+<DONE>"
64507f3df8bSroy	what="<DST>"
64607f3df8bSroy	addr="$IP4DST_FAIL2"
647af284e43Skre	atf_check -s exit:0 -o match:"$hdr" -o match:"$what" -o match:"$addr" \
648af284e43Skre		cat $file
649e40a7848Sozaki-r
6503f429830Sozaki-r	# Test arp -d and resulting routing messages (RTM_DELETE)
651af284e43Skre	rump.route -n monitor -c 1 > $file &
652af284e43Skre	pid=$!
653e40a7848Sozaki-r	sleep 1
654e40a7848Sozaki-r	atf_check -s exit:0 -o ignore rump.arp -d $IP4DST
655e40a7848Sozaki-r	wait $pid
656e40a7848Sozaki-r	$DEBUG && cat $file
657e40a7848Sozaki-r
658af284e43Skre	hdr="RTM_DELETE.+<HOST,DONE,LLINFO,CLONED>"
659af284e43Skre	what="<DST,GATEWAY>"
660af284e43Skre	addr="$IP4DST $macaddr_dst"
661af284e43Skre	atf_check -s exit:0 -o match:"$hdr" -o match:"$what" -o match:"$addr" \
662af284e43Skre		grep -A 3 RTM_DELETE $file
663e40a7848Sozaki-r
664e40a7848Sozaki-r	rump_server_destroy_ifaces
665e40a7848Sozaki-r}
666e40a7848Sozaki-r
667992011b0Sozaki-rtest_purge_on_route_change()
668f86487baSozaki-r{
669f86487baSozaki-r
670f86487baSozaki-r	rump_server_start $SOCKSRC
671f86487baSozaki-r	rump_server_start $SOCKDST
672f86487baSozaki-r
673f86487baSozaki-r	setup_dst_server
674f86487baSozaki-r	setup_src_server
675f86487baSozaki-r
676f86487baSozaki-r	rump_server_add_iface $SOCKSRC shmif1 bus1
677f86487baSozaki-r	export RUMP_SERVER=$SOCKSRC
678f86487baSozaki-r	atf_check -s exit:0 rump.ifconfig shmif1 inet $IP4SRC2/24
679f86487baSozaki-r	atf_check -s exit:0 rump.ifconfig -w 10
680f86487baSozaki-r
681f86487baSozaki-r	$DEBUG && rump.netstat -nr -f inet
682f86487baSozaki-r	atf_check -s exit:0 -o ignore rump.ping -n -w 1 -c 1 $IP4DST
683f86487baSozaki-r	$DEBUG && rump.arp -na
684f86487baSozaki-r	atf_check -s exit:0 -o ignore \
685f86487baSozaki-r	    rump.route change -net $IP4NET -ifp shmif1
686f86487baSozaki-r	$DEBUG && rump.netstat -nr -f inet
687f86487baSozaki-r	$DEBUG && rump.arp -na
688f86487baSozaki-r	# The entry was already removed on route change
689f86487baSozaki-r	atf_check -s not-exit:0 -e match:'no entry' rump.arp -n $IP4DST
690f86487baSozaki-r
691f86487baSozaki-r	rump_server_destroy_ifaces
692f86487baSozaki-r}
693f86487baSozaki-r
694992011b0Sozaki-rtest_purge_on_route_delete()
695f86487baSozaki-r{
696f86487baSozaki-r
697f86487baSozaki-r	rump_server_start $SOCKSRC
698f86487baSozaki-r	rump_server_start $SOCKDST
699f86487baSozaki-r
700f86487baSozaki-r	setup_dst_server
701f86487baSozaki-r	setup_src_server
702f86487baSozaki-r
703f86487baSozaki-r	$DEBUG && rump.netstat -nr -f inet
704f86487baSozaki-r	atf_check -s exit:0 -o ignore rump.ping -n -w 1 -c 1 $IP4DST
705f86487baSozaki-r	$DEBUG && rump.arp -na
706f86487baSozaki-r
707f86487baSozaki-r	atf_check -s exit:0 -o ignore rump.route delete -net $IP4NET
708f86487baSozaki-r	$DEBUG && rump.netstat -nr -f inet
709f86487baSozaki-r	$DEBUG && rump.arp -na
710f86487baSozaki-r
711f86487baSozaki-r	# The entry was already removed on route delete
712f86487baSozaki-r	atf_check -s not-exit:0 -e match:'no entry' rump.arp -n $IP4DST
713f86487baSozaki-r
714f86487baSozaki-r	rump_server_destroy_ifaces
715f86487baSozaki-r}
716f86487baSozaki-r
717992011b0Sozaki-rtest_purge_on_ifdown()
718f86487baSozaki-r{
719f86487baSozaki-r
720f86487baSozaki-r	rump_server_start $SOCKSRC
721f86487baSozaki-r	rump_server_start $SOCKDST
722f86487baSozaki-r
723f86487baSozaki-r	setup_dst_server
724f86487baSozaki-r	setup_src_server
725f86487baSozaki-r
726f86487baSozaki-r	$DEBUG && rump.netstat -nr -f inet
727f86487baSozaki-r	atf_check -s exit:0 -o ignore rump.ping -n -w 1 -c 1 $IP4DST
728f86487baSozaki-r	atf_check -s exit:0 -o match:'shmif0' rump.arp -n $IP4DST
729f86487baSozaki-r
730f86487baSozaki-r	# Shutdown the interface
731f86487baSozaki-r	atf_check -s exit:0 rump.ifconfig shmif0 down
732f86487baSozaki-r	$DEBUG && rump.netstat -nr -f inet
733f86487baSozaki-r	$DEBUG && rump.arp -na
734f86487baSozaki-r
735f86487baSozaki-r	atf_check -s not-exit:0 -e match:'no entry' rump.arp -n $IP4DST
736f86487baSozaki-r
737f86487baSozaki-r	rump_server_destroy_ifaces
738f86487baSozaki-r}
739f86487baSozaki-r
740992011b0Sozaki-rtest_stray_entries()
7413f429830Sozaki-r{
7423f429830Sozaki-r
7433f429830Sozaki-r	rump_server_start $SOCKSRC
7443f429830Sozaki-r	rump_server_start $SOCKDST
7453f429830Sozaki-r
7463f429830Sozaki-r	setup_dst_server
7473f429830Sozaki-r	setup_src_server
7483f429830Sozaki-r
7493f429830Sozaki-r	rump_server_add_iface $SOCKSRC shmif1 bus1
7503f429830Sozaki-r
7513f429830Sozaki-r	export RUMP_SERVER=$SOCKSRC
7523f429830Sozaki-r	atf_check -s exit:0 rump.ifconfig shmif1 inet $IP4SRC2/24
7533f429830Sozaki-r	atf_check -s exit:0 rump.ifconfig -w 10
7543f429830Sozaki-r
7553f429830Sozaki-r	$DEBUG && rump.netstat -nr -f inet
7563f429830Sozaki-r	atf_check -s exit:0 -o ignore rump.ping -n -w 1 -c 1 $IP4DST
7573f429830Sozaki-r	$DEBUG && rump.arp -na
7583f429830Sozaki-r	atf_check -s exit:0 -o match:'shmif0' rump.arp -n $IP4DST
7593f429830Sozaki-r	atf_check -s exit:0 -o not-match:'shmif1' rump.arp -n $IP4DST
7603f429830Sozaki-r
7613f429830Sozaki-r	# Clean up
7623f429830Sozaki-r	atf_check -s exit:0 -o ignore rump.arp -da
7633f429830Sozaki-r	atf_check -s not-exit:0 -e match:'no entry' rump.arp -n $IP4DST
7643f429830Sozaki-r
7653f429830Sozaki-r	# ping from a different source address
7663f429830Sozaki-r	atf_check -s exit:0 -o ignore \
7673f429830Sozaki-r	    rump.ping -n -w 1 -c 1 -I $IP4SRC2 $IP4DST
7683f429830Sozaki-r	$DEBUG && rump.arp -na
7693f429830Sozaki-r	atf_check -s exit:0 -o match:'shmif0' rump.arp -n $IP4DST
7703f429830Sozaki-r	# ARP reply goes back via shmif1, so a cache is created on shmif1
7713f429830Sozaki-r	atf_check -s exit:0 -o match:'shmif1' rump.arp -n $IP4DST
7723f429830Sozaki-r
7733f429830Sozaki-r	# Clean up by arp -da
7743f429830Sozaki-r	atf_check -s exit:0 -o ignore rump.arp -da
7753f429830Sozaki-r	atf_check -s not-exit:0 -e match:'no entry' rump.arp -n $IP4DST
7763f429830Sozaki-r
7773f429830Sozaki-r	# ping from a different source address again
7783f429830Sozaki-r	atf_check -s exit:0 -o ignore \
7793f429830Sozaki-r	    rump.ping -n -w 1 -c 1 -I $IP4SRC2 $IP4DST
7803f429830Sozaki-r	atf_check -s exit:0 -o match:'shmif0' rump.arp -n $IP4DST
7813f429830Sozaki-r	# ARP reply doen't come
7823f429830Sozaki-r	atf_check -s exit:0 -o not-match:'shmif1' rump.arp -n $IP4DST
7833f429830Sozaki-r
7843f429830Sozaki-r	# Cleanup caches on the destination
7853f429830Sozaki-r	export RUMP_SERVER=$SOCKDST
7863f429830Sozaki-r	atf_check -s exit:0 -o ignore rump.arp -da
7873f429830Sozaki-r	export RUMP_SERVER=$SOCKSRC
7883f429830Sozaki-r
7893f429830Sozaki-r	# ping from a different source address again
7903f429830Sozaki-r	atf_check -s exit:0 -o ignore \
7913f429830Sozaki-r	    rump.ping -n -w 1 -c 1 -I $IP4SRC2 $IP4DST
7923f429830Sozaki-r	atf_check -s exit:0 -o match:'shmif0' rump.arp -n $IP4DST
7933f429830Sozaki-r	# ARP reply goes back via shmif1
7943f429830Sozaki-r	atf_check -s exit:0 -o match:'shmif1' rump.arp -n $IP4DST
7953f429830Sozaki-r
7963f429830Sozaki-r	# Clean up by arp -d <ip>
7973f429830Sozaki-r	atf_check -s exit:0 -o ignore rump.arp -d $IP4DST
7983f429830Sozaki-r	# Both entries should be deleted
7993f429830Sozaki-r	atf_check -s not-exit:0 -e match:'no entry' rump.arp -n $IP4DST
8003f429830Sozaki-r
8013f429830Sozaki-r	rump_server_destroy_ifaces
8023f429830Sozaki-r}
8033f429830Sozaki-r
804*e781f1b0Sozaki-rtest_cache_creation_common()
805*e781f1b0Sozaki-r{
806*e781f1b0Sozaki-r	local no_dad=$1
807*e781f1b0Sozaki-r
808*e781f1b0Sozaki-r	rump_server_start $SOCKSRC
809*e781f1b0Sozaki-r	rump_server_start $SOCKDST
810*e781f1b0Sozaki-r
811*e781f1b0Sozaki-r	if $no_dad; then
812*e781f1b0Sozaki-r		export RUMP_SERVER=$SOCKSRC
813*e781f1b0Sozaki-r		atf_check -s exit:0 -o match:'3 -> 0' \
814*e781f1b0Sozaki-r		    rump.sysctl -w net.inet.ip.dad_count=0
815*e781f1b0Sozaki-r		export RUMP_SERVER=$SOCKDST
816*e781f1b0Sozaki-r		atf_check -s exit:0 -o match:'3 -> 0' \
817*e781f1b0Sozaki-r		    rump.sysctl -w net.inet.ip.dad_count=0
818*e781f1b0Sozaki-r	fi
819*e781f1b0Sozaki-r
820*e781f1b0Sozaki-r	setup_dst_server
821*e781f1b0Sozaki-r	setup_src_server
822*e781f1b0Sozaki-r
823*e781f1b0Sozaki-r	macaddr_src=$(get_macaddr $SOCKSRC shmif0)
824*e781f1b0Sozaki-r	macaddr_dst=$(get_macaddr $SOCKDST shmif0)
825*e781f1b0Sozaki-r
826*e781f1b0Sozaki-r	# ARP cache entries are not created for DAD/GARP packets.
827*e781f1b0Sozaki-r	export RUMP_SERVER=$SOCKSRC
828*e781f1b0Sozaki-r	atf_check -s exit:0 -o empty rump.arp -n -a
829*e781f1b0Sozaki-r	export RUMP_SERVER=$SOCKDST
830*e781f1b0Sozaki-r	atf_check -s exit:0 -o empty rump.arp -n -a
831*e781f1b0Sozaki-r
832*e781f1b0Sozaki-r	export RUMP_SERVER=$SOCKSRC
833*e781f1b0Sozaki-r
834*e781f1b0Sozaki-r	extract_new_packets bus1 > ./out
835*e781f1b0Sozaki-r
836*e781f1b0Sozaki-r	atf_check -s exit:0 -o ignore rump.ping -n -w $TIMEOUT -c 1 $IP4DST
837*e781f1b0Sozaki-r	$DEBUG && rump.arp -n -a
838*e781f1b0Sozaki-r
839*e781f1b0Sozaki-r	extract_new_packets bus1 > ./out
840*e781f1b0Sozaki-r
841*e781f1b0Sozaki-r	atf_check -s exit:0 -o match:"\? \(10.0.1.2\) at $macaddr_dst on shmif0 [0-9]+s R" \
842*e781f1b0Sozaki-r	    rump.arp -n -a
843*e781f1b0Sozaki-r
844*e781f1b0Sozaki-r	export RUMP_SERVER=$SOCKDST
845*e781f1b0Sozaki-r
846*e781f1b0Sozaki-r	# An entry was first created as stale then sending an ARP reply made it delay.
847*e781f1b0Sozaki-r	atf_check -s exit:0 -o match:"\? \(10.0.1.1\) at $macaddr_src on shmif0 [0-9]+s D" \
848*e781f1b0Sozaki-r	    rump.arp -n -a
849*e781f1b0Sozaki-r
850*e781f1b0Sozaki-r	# The sender resolves the receiver's address.
851*e781f1b0Sozaki-r	pkt=$(make_pkt_str_arpreq 10.0.1.2 10.0.1.1)
852*e781f1b0Sozaki-r	atf_check -s exit:0 -o match:"$pkt" cat ./out
853*e781f1b0Sozaki-r
854*e781f1b0Sozaki-r	# The receiver doesn't resolv the sender's address because the ARP request
855*e781f1b0Sozaki-r	# from the sender has let make an entry already.
856*e781f1b0Sozaki-r	pkt=$(make_pkt_str_arpreq 10.0.1.1 10.0.1.2)
857*e781f1b0Sozaki-r	atf_check -s exit:0 -o not-match:"$pkt" cat ./out
858*e781f1b0Sozaki-r
859*e781f1b0Sozaki-r	rump_server_destroy_ifaces
860*e781f1b0Sozaki-r}
861*e781f1b0Sozaki-r
862*e781f1b0Sozaki-rtest_cache_creation()
863*e781f1b0Sozaki-r{
864*e781f1b0Sozaki-r
865*e781f1b0Sozaki-r	test_cache_creation_common false
866*e781f1b0Sozaki-r}
867*e781f1b0Sozaki-r
868*e781f1b0Sozaki-rtest_cache_creation_nodad()
869*e781f1b0Sozaki-r{
870*e781f1b0Sozaki-r
871*e781f1b0Sozaki-r	test_cache_creation_common true
872*e781f1b0Sozaki-r}
873*e781f1b0Sozaki-r
874992011b0Sozaki-radd_test()
8753f429830Sozaki-r{
876992011b0Sozaki-r	local name=$1
877992011b0Sozaki-r	local desc="$2"
8783f429830Sozaki-r
879992011b0Sozaki-r	atf_test_case "arp_${name}" cleanup
880992011b0Sozaki-r	eval "arp_${name}_head() {
881992011b0Sozaki-r			atf_set descr \"${desc}\"
882992011b0Sozaki-r			atf_set require.progs rump_server
883992011b0Sozaki-r		}
884992011b0Sozaki-r	    arp_${name}_body() {
885992011b0Sozaki-r			test_${name}
886992011b0Sozaki-r		}
887992011b0Sozaki-r	    arp_${name}_cleanup() {
888992011b0Sozaki-r			\$DEBUG && dump
8893f429830Sozaki-r			cleanup
890992011b0Sozaki-r		}"
891992011b0Sozaki-r	atf_add_test_case "arp_${name}"
8923f429830Sozaki-r}
8933f429830Sozaki-r
894d4516589Sozaki-ratf_init_test_cases()
895d4516589Sozaki-r{
896992011b0Sozaki-r
897992011b0Sozaki-r	add_test cache_expiration      "Tests for ARP cache expiration"
898992011b0Sozaki-r	add_test command               "Tests for arp_commands of arp(8)"
899992011b0Sozaki-r	add_test garp                  "Tests for GARP"
900992011b0Sozaki-r	add_test garp_without_dad      "Tests for GARP with DAD disabled"
901992011b0Sozaki-r	add_test cache_overwriting     "Tests for behavior of overwriting ARP caches"
902992011b0Sozaki-r	add_test proxy_arp_pub         "Tests for Proxy ARP (pub)"
903992011b0Sozaki-r	add_test proxy_arp_pubproxy    "Tests for Proxy ARP (pub proxy)"
904992011b0Sozaki-r	add_test link_activation       "Tests for activating a new MAC address"
905992011b0Sozaki-r	add_test static                "Tests for static ARP entries"
906992011b0Sozaki-r	add_test rtm                   "Tests for routing messages on operations of ARP entries"
907992011b0Sozaki-r	add_test purge_on_route_change "Tests if ARP entries are removed on route change"
908992011b0Sozaki-r	add_test purge_on_route_delete "Tests if ARP entries are removed on route delete"
909992011b0Sozaki-r	add_test purge_on_ifdown       "Tests if ARP entries are removed on interface down"
910992011b0Sozaki-r	add_test stray_entries         "Tests if ARP entries are removed on route change"
911*e781f1b0Sozaki-r	add_test cache_creation        "Tests for ARP cache creation"
912*e781f1b0Sozaki-r	add_test cache_creation_nodad  "Tests for ARP cache creation without DAD"
913d4516589Sozaki-r}
914