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