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