1 1.40 ozaki # $NetBSD: t_ndp.sh,v 1.40 2022/01/07 03:07:41 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 IP6SRC=fc00::1 31 1.24 ozaki IP6SRC2=fc00::3 32 1.1 ozaki IP6DST=fc00::2 33 1.24 ozaki IP6NET=fc00::0 34 1.36 roy IP6DST_FAIL1=fc00::99 35 1.36 roy IP6DST_FAIL2=fc01::99 36 1.1 ozaki 37 1.19 ozaki DEBUG=${DEBUG:-false} 38 1.1 ozaki TIMEOUT=1 39 1.1 ozaki 40 1.12 ozaki atf_test_case ndp_cache_expiration cleanup 41 1.12 ozaki atf_test_case ndp_commands cleanup 42 1.12 ozaki atf_test_case ndp_cache_overwriting cleanup 43 1.12 ozaki atf_test_case ndp_neighborgcthresh cleanup 44 1.12 ozaki atf_test_case ndp_link_activation cleanup 45 1.1 ozaki 46 1.12 ozaki ndp_cache_expiration_head() 47 1.1 ozaki { 48 1.1 ozaki atf_set "descr" "Tests for NDP cache expiration" 49 1.1 ozaki atf_set "require.progs" "rump_server" 50 1.1 ozaki } 51 1.1 ozaki 52 1.12 ozaki ndp_commands_head() 53 1.1 ozaki { 54 1.1 ozaki atf_set "descr" "Tests for commands of ndp(8)" 55 1.1 ozaki atf_set "require.progs" "rump_server" 56 1.1 ozaki } 57 1.1 ozaki 58 1.12 ozaki ndp_cache_overwriting_head() 59 1.1 ozaki { 60 1.1 ozaki atf_set "descr" "Tests for behavior of overwriting NDP caches" 61 1.1 ozaki atf_set "require.progs" "rump_server" 62 1.1 ozaki } 63 1.1 ozaki 64 1.12 ozaki ndp_neighborgcthresh_head() 65 1.7 ozaki { 66 1.7 ozaki atf_set "descr" "Tests for GC of neighbor caches" 67 1.7 ozaki atf_set "require.progs" "rump_server" 68 1.7 ozaki } 69 1.7 ozaki 70 1.12 ozaki ndp_link_activation_head() 71 1.9 ozaki { 72 1.9 ozaki atf_set "descr" "Tests for activating a new MAC address" 73 1.9 ozaki atf_set "require.progs" "rump_server" 74 1.9 ozaki } 75 1.9 ozaki 76 1.1 ozaki setup_dst_server() 77 1.1 ozaki { 78 1.8 ozaki local assign_ip=$1 79 1.8 ozaki 80 1.17 ozaki rump_server_add_iface $SOCKDST shmif0 bus1 81 1.1 ozaki export RUMP_SERVER=$SOCKDST 82 1.8 ozaki if [ "$assign_ip" != no ]; then 83 1.8 ozaki atf_check -s exit:0 rump.ifconfig shmif0 inet6 $IP6DST 84 1.8 ozaki fi 85 1.1 ozaki atf_check -s exit:0 rump.ifconfig shmif0 up 86 1.1 ozaki atf_check -s exit:0 rump.ifconfig -w 10 87 1.1 ozaki 88 1.1 ozaki $DEBUG && rump.ifconfig shmif0 89 1.1 ozaki $DEBUG && rump.ndp -n -a 90 1.1 ozaki } 91 1.1 ozaki 92 1.1 ozaki setup_src_server() 93 1.1 ozaki { 94 1.1 ozaki $DEBUG && ulimit -c unlimited 95 1.1 ozaki export RUMP_SERVER=$SOCKSRC 96 1.1 ozaki 97 1.1 ozaki # Setup an interface 98 1.17 ozaki rump_server_add_iface $SOCKSRC shmif0 bus1 99 1.1 ozaki atf_check -s exit:0 rump.ifconfig shmif0 inet6 $IP6SRC 100 1.1 ozaki atf_check -s exit:0 rump.ifconfig shmif0 up 101 1.1 ozaki atf_check -s exit:0 rump.ifconfig -w 10 102 1.1 ozaki 103 1.1 ozaki # Sanity check 104 1.1 ozaki $DEBUG && rump.ifconfig shmif0 105 1.1 ozaki $DEBUG && rump.ndp -n -a 106 1.22 ozaki atf_check -s not-exit:0 -o ignore -e match:'no entry' rump.ndp -n $IP6SRC 107 1.22 ozaki atf_check -s not-exit:0 -o ignore -e match:'no entry' rump.ndp -n $IP6DST 108 1.1 ozaki } 109 1.1 ozaki 110 1.1 ozaki get_timeout() 111 1.1 ozaki { 112 1.1 ozaki local timeout=$(env RUMP_SERVER=$SOCKSRC rump.ndp -n $IP6DST |grep $IP6DST|awk '{print $4;}') 113 1.1 ozaki timeout=${timeout%s} 114 1.1 ozaki echo $timeout 115 1.1 ozaki } 116 1.1 ozaki 117 1.12 ozaki ndp_cache_expiration_body() 118 1.1 ozaki { 119 1.34 ozaki local macaddr= 120 1.17 ozaki 121 1.17 ozaki rump_server_start $SOCKSRC netinet6 122 1.17 ozaki rump_server_start $SOCKDST netinet6 123 1.1 ozaki 124 1.1 ozaki setup_dst_server 125 1.1 ozaki setup_src_server 126 1.1 ozaki 127 1.34 ozaki # Shorten the expire time of cache entries 128 1.33 ozaki export RUMP_SERVER=$SOCKSRC 129 1.33 ozaki atf_check -s exit:0 -o match:'basereachable=7s0ms' \ 130 1.33 ozaki rump.ndp -i shmif0 basereachable=7000 131 1.33 ozaki 132 1.34 ozaki # Make a permanent cache entry to avoid sending an NS packet disturbing 133 1.34 ozaki # the test 134 1.34 ozaki macaddr=$(get_macaddr $SOCKSRC shmif0) 135 1.34 ozaki export RUMP_SERVER=$SOCKDST 136 1.34 ozaki atf_check -s exit:0 -o ignore rump.ndp -s $IP6SRC $macaddr 137 1.34 ozaki 138 1.34 ozaki export RUMP_SERVER=$SOCKSRC 139 1.34 ozaki 140 1.1 ozaki # 141 1.1 ozaki # Check if a cache is expired expectedly 142 1.1 ozaki # 143 1.3 ozaki atf_check -s exit:0 -o ignore rump.ping6 -n -X $TIMEOUT -c 1 $IP6DST 144 1.1 ozaki 145 1.1 ozaki $DEBUG && rump.ndp -n -a 146 1.22 ozaki atf_check -s not-exit:0 -o ignore -e match:'no entry' rump.ndp -n $IP6SRC 147 1.1 ozaki # Should be cached 148 1.1 ozaki atf_check -s exit:0 -o not-match:'permanent' rump.ndp -n $IP6DST 149 1.1 ozaki 150 1.1 ozaki timeout=$(get_timeout $IP6DST) 151 1.1 ozaki 152 1.1 ozaki atf_check -s exit:0 sleep $(($timeout + 1)) 153 1.1 ozaki 154 1.1 ozaki $DEBUG && rump.ndp -n -a 155 1.22 ozaki atf_check -s not-exit:0 -o ignore -e match:'no entry' rump.ndp -n $IP6SRC 156 1.1 ozaki # Expired but remains until GC sweaps it (1 day) 157 1.18 ozaki atf_check -s exit:0 -o match:"$ONEDAYISH" rump.ndp -n $IP6DST 158 1.17 ozaki 159 1.17 ozaki rump_server_destroy_ifaces 160 1.1 ozaki } 161 1.1 ozaki 162 1.5 ozaki ifdown_dst_server() 163 1.5 ozaki { 164 1.5 ozaki export RUMP_SERVER=$SOCKDST 165 1.5 ozaki atf_check -s exit:0 rump.ifconfig shmif0 down 166 1.5 ozaki export RUMP_SERVER=$SOCKSRC 167 1.5 ozaki } 168 1.5 ozaki 169 1.12 ozaki ndp_commands_body() 170 1.1 ozaki { 171 1.17 ozaki 172 1.17 ozaki rump_server_start $SOCKSRC netinet6 173 1.17 ozaki rump_server_start $SOCKDST netinet6 174 1.1 ozaki 175 1.1 ozaki setup_dst_server 176 1.1 ozaki setup_src_server 177 1.1 ozaki 178 1.1 ozaki export RUMP_SERVER=$SOCKSRC 179 1.1 ozaki 180 1.1 ozaki # Add and delete a static entry 181 1.1 ozaki $DEBUG && rump.ndp -n -a 182 1.1 ozaki atf_check -s exit:0 -o ignore rump.ndp -s fc00::10 b2:a0:20:00:00:10 183 1.1 ozaki $DEBUG && rump.ndp -n -a 184 1.1 ozaki atf_check -s exit:0 -o match:'permanent' rump.ndp -n fc00::10 185 1.28 ozaki check_route fc00::10 'b2:a0:20:00:00:10' UHLS shmif0 186 1.2 ozaki atf_check -s exit:0 -o match:'deleted' rump.ndp -d fc00::10 187 1.1 ozaki $DEBUG && rump.ndp -n -a 188 1.1 ozaki atf_check -s not-exit:0 -o ignore -e ignore rump.ndp -n fc00::10 189 1.28 ozaki check_route_no_entry fc00::10 190 1.1 ozaki 191 1.1 ozaki # Add multiple entries via a file (XXX not implemented) 192 1.1 ozaki #cat - > ./list <<-EOF 193 1.1 ozaki #fc00::11 b2:a0:20:00:00:11 194 1.1 ozaki #fc00::12 b2:a0:20:00:00:12 195 1.1 ozaki #fc00::13 b2:a0:20:00:00:13 196 1.1 ozaki #fc00::14 b2:a0:20:00:00:14 197 1.1 ozaki #fc00::15 b2:a0:20:00:00:15 198 1.1 ozaki #EOF 199 1.1 ozaki #$DEBUG && rump.ndp -n -a 200 1.1 ozaki #atf_check -s exit:0 -o ignore rump.ndp -f ./list 201 1.1 ozaki #$DEBUG && rump.ndp -n -a 202 1.1 ozaki 203 1.3 ozaki atf_check -s exit:0 -o ignore rump.ping6 -n -X $TIMEOUT -c 1 $IP6DST 204 1.1 ozaki atf_check -s exit:0 -o ignore rump.ndp -s fc00::11 b2:a0:20:00:00:11 205 1.1 ozaki atf_check -s exit:0 -o ignore rump.ndp -s fc00::12 b2:a0:20:00:00:12 206 1.1 ozaki 207 1.1 ozaki atf_check -s exit:0 -o not-match:'permanent' rump.ndp -n $IP6DST 208 1.1 ozaki atf_check -s exit:0 -o match:'permanent' rump.ndp -n fc00::11 209 1.1 ozaki atf_check -s exit:0 -o match:'permanent' rump.ndp -n fc00::12 210 1.28 ozaki check_route_flags $IP6DST UHL 211 1.28 ozaki check_route_flags fc00::11 UHLS 212 1.28 ozaki check_route_flags fc00::12 UHLS 213 1.1 ozaki 214 1.1 ozaki # Test ndp -a 215 1.1 ozaki atf_check -s exit:0 -o match:'fc00::11' rump.ndp -n -a 216 1.1 ozaki atf_check -s exit:0 -o match:'fc00::12' rump.ndp -n -a 217 1.1 ozaki 218 1.5 ozaki # Ensure no packet upsets the src server 219 1.5 ozaki ifdown_dst_server 220 1.5 ozaki 221 1.1 ozaki # Flush all entries (-c) 222 1.1 ozaki $DEBUG && rump.ndp -n -a 223 1.1 ozaki atf_check -s exit:0 -o ignore rump.ndp -c 224 1.10 ozaki atf_check -s not-exit:0 -o ignore -e ignore rump.ndp -n $IP6SRC 225 1.1 ozaki atf_check -s not-exit:0 -o ignore -e ignore rump.ndp -n $IP6DST 226 1.28 ozaki #check_route_no_entry $IP6SRC 227 1.28 ozaki check_route_no_entry $IP6DST 228 1.1 ozaki # Only the static caches are not deleted 229 1.1 ozaki atf_check -s exit:0 -o ignore -e ignore rump.ndp -n fc00::11 230 1.1 ozaki atf_check -s exit:0 -o ignore -e ignore rump.ndp -n fc00::12 231 1.28 ozaki check_route_flags fc00::11 UHLS 232 1.28 ozaki check_route_flags fc00::12 UHLS 233 1.1 ozaki 234 1.1 ozaki $DEBUG && rump.ndp -n -a 235 1.11 ozaki atf_check -s exit:0 -o ignore rump.ndp -s fc00::10 b2:a0:20:00:00:10 temp 236 1.1 ozaki rump.ndp -s fc00::10 b2:a0:20:00:00:10 temp 237 1.1 ozaki $DEBUG && rump.ndp -n -a 238 1.11 ozaki atf_check -s exit:0 -o not-match:'permanent' rump.ndp -n fc00::10 239 1.28 ozaki check_route fc00::10 'b2:a0:20:00:00:10' UHL shmif0 240 1.1 ozaki 241 1.17 ozaki rump_server_destroy_ifaces 242 1.1 ozaki } 243 1.1 ozaki 244 1.12 ozaki ndp_cache_overwriting_body() 245 1.1 ozaki { 246 1.17 ozaki 247 1.17 ozaki rump_server_start $SOCKSRC netinet6 248 1.17 ozaki rump_server_start $SOCKDST netinet6 249 1.1 ozaki 250 1.1 ozaki setup_dst_server 251 1.1 ozaki setup_src_server 252 1.1 ozaki 253 1.1 ozaki export RUMP_SERVER=$SOCKSRC 254 1.1 ozaki 255 1.1 ozaki # Cannot overwrite a permanent cache 256 1.22 ozaki atf_check -s exit:0 rump.ndp -s $IP6SRC b2:a0:20:00:00:ff 257 1.1 ozaki $DEBUG && rump.ndp -n -a 258 1.22 ozaki atf_check -s not-exit:0 -e ignore rump.ndp -s $IP6SRC b2:a0:20:00:00:fe 259 1.1 ozaki 260 1.3 ozaki atf_check -s exit:0 -o ignore rump.ping6 -n -X $TIMEOUT -c 1 $IP6DST 261 1.1 ozaki $DEBUG && rump.ndp -n -a 262 1.1 ozaki # Can overwrite a dynamic cache 263 1.1 ozaki atf_check -s exit:0 -o ignore rump.ndp -s $IP6DST b2:a0:20:00:00:00 264 1.1 ozaki $DEBUG && rump.ndp -n -a 265 1.1 ozaki atf_check -s exit:0 -o match:'permanent' rump.ndp -n $IP6DST 266 1.1 ozaki 267 1.1 ozaki # Test temp option (XXX it doesn't work; expire time isn't set) 268 1.1 ozaki #atf_check -s exit:0 -o ignore rump.ndp -s fc00::10 b2:a0:20:00:00:10 temp 269 1.1 ozaki #$DEBUG && rump.ndp -n -a 270 1.1 ozaki #atf_check -s exit:0 -o not-match:'permanent' rump.ndp -n fc00::10 271 1.1 ozaki # Cannot overwrite a temp cache 272 1.1 ozaki #atf_check -s not-exit:0 -e ignore rump.ndp -s fc00::10 b2:a0:20:00:00:ff 273 1.1 ozaki #$DEBUG && rump.ndp -n -a 274 1.1 ozaki 275 1.17 ozaki rump_server_destroy_ifaces 276 1.1 ozaki } 277 1.1 ozaki 278 1.7 ozaki get_n_caches() 279 1.7 ozaki { 280 1.7 ozaki 281 1.7 ozaki echo $(rump.ndp -a -n |grep -v -e Neighbor -e permanent |wc -l) 282 1.7 ozaki } 283 1.7 ozaki 284 1.12 ozaki ndp_neighborgcthresh_body() 285 1.7 ozaki { 286 1.7 ozaki 287 1.17 ozaki rump_server_start $SOCKSRC netinet6 288 1.17 ozaki rump_server_start $SOCKDST netinet6 289 1.7 ozaki 290 1.8 ozaki setup_dst_server no 291 1.7 ozaki setup_src_server 292 1.7 ozaki 293 1.7 ozaki export RUMP_SERVER=$SOCKDST 294 1.7 ozaki for i in $(seq 0 9); do 295 1.7 ozaki atf_check -s exit:0 rump.ifconfig shmif0 inet6 ${IP6DST}$i 296 1.7 ozaki done 297 1.7 ozaki 298 1.7 ozaki export RUMP_SERVER=$SOCKSRC 299 1.7 ozaki 300 1.7 ozaki # ping to 3 destinations 301 1.7 ozaki $DEBUG && rump.ndp -n -a 302 1.7 ozaki for i in $(seq 0 2); do 303 1.7 ozaki atf_check -s exit:0 -o ignore rump.ping6 -n -X $TIMEOUT -c 1 \ 304 1.7 ozaki ${IP6DST}$i 305 1.7 ozaki done 306 1.7 ozaki $DEBUG && rump.ndp -n -a 307 1.7 ozaki 308 1.7 ozaki # 3 caches should be created 309 1.7 ozaki atf_check_equal $(get_n_caches) 3 310 1.7 ozaki 311 1.7 ozaki # ping to additional 3 destinations 312 1.7 ozaki for i in $(seq 3 5); do 313 1.7 ozaki atf_check -s exit:0 -o ignore rump.ping6 -n -X $TIMEOUT -c 1 \ 314 1.7 ozaki ${IP6DST}$i 315 1.7 ozaki done 316 1.7 ozaki $DEBUG && rump.ndp -n -a 317 1.7 ozaki 318 1.7 ozaki # 6 caches should be created in total 319 1.7 ozaki atf_check_equal $(get_n_caches) 6 320 1.7 ozaki 321 1.7 ozaki # Limit the number of neighbor caches to 5 322 1.7 ozaki atf_check -s exit:0 -o ignore rump.sysctl -w \ 323 1.7 ozaki net.inet6.ip6.neighborgcthresh=5 324 1.7 ozaki 325 1.7 ozaki # ping to additional 4 destinations 326 1.7 ozaki for i in $(seq 6 9); do 327 1.7 ozaki atf_check -s exit:0 -o ignore rump.ping6 -n -X $TIMEOUT -c 1 \ 328 1.7 ozaki ${IP6DST}$i 329 1.7 ozaki done 330 1.7 ozaki 331 1.7 ozaki # More than 5 caches should be created in total, but exceeded caches 332 1.7 ozaki # should be GC-ed 333 1.7 ozaki if [ "$(get_n_caches)" -gt 5 ]; then 334 1.7 ozaki atf_fail "Neighbor caches are not GC-ed" 335 1.7 ozaki fi 336 1.7 ozaki 337 1.17 ozaki rump_server_destroy_ifaces 338 1.7 ozaki } 339 1.7 ozaki 340 1.9 ozaki make_pkt_str_na() 341 1.9 ozaki { 342 1.9 ozaki local ip=$1 343 1.9 ozaki local mac=$2 344 1.9 ozaki local pkt= 345 1.9 ozaki pkt="$mac > 33:33:00:00:00:01, ethertype IPv6 (0x86dd), length 86:" 346 1.9 ozaki pkt="$pkt $ip > ff02::1: ICMP6, neighbor advertisement" 347 1.9 ozaki echo $pkt 348 1.9 ozaki } 349 1.9 ozaki 350 1.12 ozaki ndp_link_activation_body() 351 1.9 ozaki { 352 1.9 ozaki local linklocal= 353 1.9 ozaki 354 1.17 ozaki rump_server_start $SOCKSRC netinet6 355 1.17 ozaki rump_server_start $SOCKDST netinet6 356 1.9 ozaki 357 1.9 ozaki setup_dst_server 358 1.9 ozaki setup_src_server 359 1.9 ozaki 360 1.9 ozaki # flush old packets 361 1.15 ozaki extract_new_packets bus1 > ./out 362 1.9 ozaki 363 1.9 ozaki export RUMP_SERVER=$SOCKSRC 364 1.9 ozaki 365 1.9 ozaki atf_check -s exit:0 -o ignore rump.ifconfig shmif0 link \ 366 1.9 ozaki b2:a1:00:00:00:01 367 1.9 ozaki 368 1.9 ozaki atf_check -s exit:0 sleep 1 369 1.15 ozaki extract_new_packets bus1 > ./out 370 1.9 ozaki $DEBUG && cat ./out 371 1.9 ozaki 372 1.9 ozaki linklocal=$(rump.ifconfig shmif0 |awk '/fe80/ {print $2;}' |awk -F % '{print $1;}') 373 1.9 ozaki $DEBUG && echo $linklocal 374 1.9 ozaki 375 1.9 ozaki pkt=$(make_pkt_str_na $linklocal b2:a1:00:00:00:01) 376 1.9 ozaki atf_check -s not-exit:0 -x "cat ./out |grep -q '$pkt'" 377 1.9 ozaki 378 1.9 ozaki atf_check -s exit:0 -o ignore rump.ifconfig shmif0 link \ 379 1.9 ozaki b2:a1:00:00:00:02 active 380 1.9 ozaki 381 1.9 ozaki atf_check -s exit:0 sleep 1 382 1.15 ozaki extract_new_packets bus1 > ./out 383 1.9 ozaki $DEBUG && cat ./out 384 1.9 ozaki 385 1.9 ozaki linklocal=$(rump.ifconfig shmif0 |awk '/fe80/ {print $2;}' |awk -F % '{print $1;}') 386 1.9 ozaki $DEBUG && echo $linklocal 387 1.9 ozaki 388 1.9 ozaki pkt=$(make_pkt_str_na $linklocal b2:a1:00:00:00:02) 389 1.9 ozaki atf_check -s exit:0 -x "cat ./out |grep -q '$pkt'" 390 1.1 ozaki 391 1.17 ozaki rump_server_destroy_ifaces 392 1.1 ozaki } 393 1.1 ozaki 394 1.12 ozaki ndp_cache_expiration_cleanup() 395 1.1 ozaki { 396 1.1 ozaki $DEBUG && dump 397 1.1 ozaki cleanup 398 1.1 ozaki } 399 1.1 ozaki 400 1.12 ozaki ndp_commands_cleanup() 401 1.1 ozaki { 402 1.1 ozaki $DEBUG && dump 403 1.1 ozaki cleanup 404 1.1 ozaki } 405 1.1 ozaki 406 1.12 ozaki ndp_cache_overwriting_cleanup() 407 1.1 ozaki { 408 1.1 ozaki $DEBUG && dump 409 1.1 ozaki cleanup 410 1.1 ozaki } 411 1.1 ozaki 412 1.12 ozaki ndp_neighborgcthresh_cleanup() 413 1.7 ozaki { 414 1.7 ozaki $DEBUG && dump 415 1.7 ozaki cleanup 416 1.7 ozaki } 417 1.7 ozaki 418 1.12 ozaki ndp_link_activation_cleanup() 419 1.9 ozaki { 420 1.9 ozaki $DEBUG && dump 421 1.9 ozaki cleanup 422 1.9 ozaki } 423 1.9 ozaki 424 1.21 ozaki atf_test_case ndp_rtm cleanup 425 1.20 ozaki ndp_rtm_head() 426 1.20 ozaki { 427 1.20 ozaki 428 1.23 ozaki atf_set "descr" "Tests for routing messages on operations of NDP entries" 429 1.20 ozaki atf_set "require.progs" "rump_server" 430 1.20 ozaki } 431 1.20 ozaki 432 1.20 ozaki ndp_rtm_body() 433 1.20 ozaki { 434 1.20 ozaki local macaddr_src= macaddr_dst= 435 1.20 ozaki local file=./tmp 436 1.30 kre local pid= hdr= what= addr= 437 1.20 ozaki 438 1.20 ozaki rump_server_start $SOCKSRC netinet6 439 1.20 ozaki rump_server_start $SOCKDST netinet6 440 1.20 ozaki 441 1.20 ozaki setup_dst_server 442 1.20 ozaki setup_src_server 443 1.20 ozaki 444 1.20 ozaki macaddr_src=$(get_macaddr $SOCKSRC shmif0) 445 1.20 ozaki macaddr_dst=$(get_macaddr $SOCKDST shmif0) 446 1.20 ozaki 447 1.20 ozaki export RUMP_SERVER=$SOCKSRC 448 1.20 ozaki 449 1.20 ozaki # Test ping and a resulting routing message (RTM_ADD) 450 1.20 ozaki rump.route -n monitor -c 1 > $file & 451 1.30 kre pid=$! 452 1.20 ozaki sleep 1 453 1.20 ozaki atf_check -s exit:0 -o ignore rump.ping6 -n -X 1 -c 1 $IP6DST 454 1.20 ozaki wait $pid 455 1.20 ozaki $DEBUG && cat $file 456 1.20 ozaki 457 1.30 kre hdr="RTM_ADD.+<UP,HOST,DONE,LLINFO,CLONED>" 458 1.37 roy what="<DST,GATEWAY,AUTHOR>" 459 1.37 roy addr="$IP6DST $macaddr_dst $IP6DST" 460 1.36 roy atf_check -s exit:0 -o match:"$hdr" -o match:"$what" -o match:"$addr" \ 461 1.36 roy cat $file 462 1.36 roy 463 1.36 roy # Test ping and a resulting routing message (RTM_MISS) on subnet 464 1.36 roy rump.route -n monitor -c 1 > $file & 465 1.36 roy pid=$! 466 1.36 roy sleep 1 467 1.36 roy atf_check -s exit:1 -o ignore -e ignore \ 468 1.39 roy rump.ping6 -n -X 1 -c 1 $IP6DST_FAIL1 469 1.36 roy wait $pid 470 1.36 roy $DEBUG && cat $file 471 1.36 roy 472 1.36 roy hdr="RTM_MISS.+<DONE>" 473 1.37 roy what="<DST,GATEWAY,AUTHOR>" 474 1.38 roy addr="$IP6DST_FAIL1 link#2 $IP6SRC" 475 1.36 roy atf_check -s exit:0 -o match:"$hdr" -o match:"$what" -o match:"$addr" \ 476 1.36 roy cat $file 477 1.36 roy 478 1.36 roy # Test ping and a resulting routing message (RTM_MISS) off subnet 479 1.36 roy rump.route -n monitor -c 1 > $file & 480 1.36 roy pid=$! 481 1.36 roy sleep 1 482 1.36 roy atf_check -s exit:1 -o ignore -e ignore \ 483 1.36 roy rump.ping6 -n -X 1 -c 1 $IP6DST_FAIL2 484 1.36 roy wait $pid 485 1.36 roy $DEBUG && cat $file 486 1.36 roy 487 1.36 roy hdr="RTM_MISS.+<DONE>" 488 1.36 roy what="<DST>" 489 1.36 roy addr="$IP6DST_FAIL2" 490 1.30 kre atf_check -s exit:0 -o match:"$hdr" -o match:"$what" -o match:"$addr" \ 491 1.30 kre cat $file 492 1.20 ozaki 493 1.29 ozaki # Test ndp -d and resulting routing messages (RTM_DELETE) 494 1.30 kre rump.route -n monitor -c 1 > $file & 495 1.30 kre pid=$! 496 1.20 ozaki sleep 1 497 1.20 ozaki atf_check -s exit:0 -o ignore rump.ndp -d $IP6DST 498 1.20 ozaki wait $pid 499 1.20 ozaki $DEBUG && cat $file 500 1.20 ozaki 501 1.30 kre hdr="RTM_DELETE.+<HOST,DONE,LLINFO,CLONED>" 502 1.30 kre what="<DST,GATEWAY>" 503 1.30 kre addr="$IP6DST $macaddr_dst" 504 1.30 kre atf_check -s exit:0 -o match:"$hdr" -o match:"$what" -o match:"$addr" \ 505 1.30 kre grep -A 3 RTM_DELETE $file 506 1.20 ozaki 507 1.20 ozaki rump_server_destroy_ifaces 508 1.20 ozaki } 509 1.20 ozaki 510 1.20 ozaki ndp_rtm_cleanup() 511 1.20 ozaki { 512 1.20 ozaki 513 1.20 ozaki $DEBUG && dump 514 1.20 ozaki cleanup 515 1.20 ozaki } 516 1.20 ozaki 517 1.24 ozaki atf_test_case ndp_purge_on_route_change cleanup 518 1.24 ozaki ndp_purge_on_route_change_head() 519 1.24 ozaki { 520 1.24 ozaki 521 1.24 ozaki atf_set "descr" "Tests if NDP entries are removed on route change" 522 1.24 ozaki atf_set "require.progs" "rump_server" 523 1.24 ozaki } 524 1.24 ozaki 525 1.24 ozaki ndp_purge_on_route_change_body() 526 1.24 ozaki { 527 1.24 ozaki 528 1.24 ozaki rump_server_start $SOCKSRC netinet6 529 1.24 ozaki rump_server_start $SOCKDST netinet6 530 1.24 ozaki 531 1.24 ozaki setup_dst_server 532 1.24 ozaki setup_src_server 533 1.24 ozaki 534 1.24 ozaki rump_server_add_iface $SOCKSRC shmif1 bus1 535 1.24 ozaki export RUMP_SERVER=$SOCKSRC 536 1.31 ozaki atf_check -s exit:0 rump.ifconfig shmif1 inet6 fc00:1::1 537 1.24 ozaki atf_check -s exit:0 rump.ifconfig -w 10 538 1.24 ozaki 539 1.24 ozaki $DEBUG && rump.netstat -nr -f inet6 540 1.24 ozaki atf_check -s exit:0 -o ignore rump.ping6 -n -X 1 -c 1 $IP6DST 541 1.24 ozaki atf_check -s exit:0 -o match:'shmif0' rump.ndp -n $IP6DST 542 1.24 ozaki 543 1.24 ozaki atf_check -s exit:0 -o ignore \ 544 1.24 ozaki rump.route change -inet6 -net $IP6NET/64 -ifp shmif1 545 1.24 ozaki $DEBUG && rump.netstat -nr -f inet6 546 1.24 ozaki $DEBUG && rump.ndp -na 547 1.24 ozaki # The entry was already removed on route change 548 1.24 ozaki atf_check -s not-exit:0 -o ignore -e match:'no entry' \ 549 1.24 ozaki rump.ndp -n $IP6DST 550 1.24 ozaki 551 1.24 ozaki rump_server_destroy_ifaces 552 1.24 ozaki } 553 1.24 ozaki 554 1.24 ozaki ndp_purge_on_route_change_cleanup() 555 1.24 ozaki { 556 1.24 ozaki 557 1.24 ozaki $DEBUG && dump 558 1.24 ozaki cleanup 559 1.24 ozaki } 560 1.24 ozaki 561 1.24 ozaki atf_test_case ndp_purge_on_route_delete cleanup 562 1.24 ozaki ndp_purge_on_route_delete_head() 563 1.24 ozaki { 564 1.24 ozaki 565 1.24 ozaki atf_set "descr" "Tests if NDP entries are removed on route delete" 566 1.24 ozaki atf_set "require.progs" "rump_server" 567 1.24 ozaki } 568 1.24 ozaki 569 1.24 ozaki ndp_purge_on_route_delete_body() 570 1.24 ozaki { 571 1.24 ozaki 572 1.24 ozaki rump_server_start $SOCKSRC netinet6 573 1.24 ozaki rump_server_start $SOCKDST netinet6 574 1.24 ozaki 575 1.24 ozaki setup_dst_server 576 1.24 ozaki setup_src_server 577 1.24 ozaki 578 1.24 ozaki $DEBUG && rump.netstat -nr -f inet6 579 1.24 ozaki atf_check -s exit:0 -o ignore rump.ping6 -n -X 1 -c 1 $IP6DST 580 1.24 ozaki atf_check -s exit:0 -o match:'shmif0' rump.ndp -n $IP6DST 581 1.24 ozaki 582 1.24 ozaki atf_check -s exit:0 -o ignore rump.route delete -inet6 -net $IP6NET/64 583 1.24 ozaki $DEBUG && rump.netstat -nr -f inet6 584 1.24 ozaki $DEBUG && rump.ndp -na 585 1.24 ozaki 586 1.24 ozaki # The entry was already removed on route delete 587 1.24 ozaki atf_check -s not-exit:0 -o ignore -e match:'no entry' \ 588 1.24 ozaki rump.ndp -n $IP6DST 589 1.24 ozaki 590 1.24 ozaki rump_server_destroy_ifaces 591 1.24 ozaki } 592 1.24 ozaki 593 1.24 ozaki ndp_purge_on_route_delete_cleanup() 594 1.24 ozaki { 595 1.24 ozaki 596 1.24 ozaki $DEBUG && dump 597 1.24 ozaki cleanup 598 1.24 ozaki } 599 1.24 ozaki 600 1.24 ozaki atf_test_case ndp_purge_on_ifdown cleanup 601 1.24 ozaki ndp_purge_on_ifdown_head() 602 1.24 ozaki { 603 1.24 ozaki 604 1.24 ozaki atf_set "descr" "Tests if NDP entries are removed on interface down" 605 1.24 ozaki atf_set "require.progs" "rump_server" 606 1.24 ozaki } 607 1.24 ozaki 608 1.24 ozaki ndp_purge_on_ifdown_body() 609 1.24 ozaki { 610 1.24 ozaki 611 1.24 ozaki rump_server_start $SOCKSRC netinet6 612 1.24 ozaki rump_server_start $SOCKDST netinet6 613 1.24 ozaki 614 1.24 ozaki setup_dst_server 615 1.24 ozaki setup_src_server 616 1.24 ozaki 617 1.24 ozaki $DEBUG && rump.netstat -nr -f inet6 618 1.24 ozaki atf_check -s exit:0 -o ignore rump.ping6 -n -X 1 -c 1 $IP6DST 619 1.24 ozaki atf_check -s exit:0 -o match:'shmif0' rump.ndp -n $IP6DST 620 1.24 ozaki 621 1.24 ozaki # Shutdown the interface 622 1.24 ozaki atf_check -s exit:0 rump.ifconfig shmif0 down 623 1.24 ozaki $DEBUG && rump.netstat -nr -f inet6 624 1.24 ozaki $DEBUG && rump.ndp -na 625 1.24 ozaki 626 1.24 ozaki # The entry was already removed on ifconfig down 627 1.24 ozaki atf_check -s not-exit:0 -o ignore -e match:'no entry' \ 628 1.24 ozaki rump.ndp -n $IP6DST 629 1.24 ozaki 630 1.24 ozaki rump_server_destroy_ifaces 631 1.24 ozaki } 632 1.24 ozaki 633 1.24 ozaki ndp_purge_on_ifdown_cleanup() 634 1.24 ozaki { 635 1.24 ozaki 636 1.24 ozaki $DEBUG && dump 637 1.24 ozaki cleanup 638 1.24 ozaki } 639 1.24 ozaki 640 1.29 ozaki atf_test_case ndp_stray_entries cleanup 641 1.29 ozaki ndp_stray_entries_head() 642 1.29 ozaki { 643 1.29 ozaki 644 1.29 ozaki atf_set "descr" "Tests if NDP entries are removed on route change" 645 1.29 ozaki atf_set "require.progs" "rump_server" 646 1.29 ozaki } 647 1.29 ozaki 648 1.29 ozaki ndp_stray_entries_body() 649 1.29 ozaki { 650 1.29 ozaki 651 1.29 ozaki rump_server_start $SOCKSRC netinet6 652 1.29 ozaki rump_server_start $SOCKDST netinet6 653 1.29 ozaki 654 1.29 ozaki setup_dst_server 655 1.29 ozaki setup_src_server 656 1.29 ozaki 657 1.29 ozaki rump_server_add_iface $SOCKSRC shmif1 bus1 658 1.29 ozaki 659 1.29 ozaki export RUMP_SERVER=$SOCKSRC 660 1.29 ozaki atf_check -s exit:0 rump.ifconfig shmif1 inet6 $IP6SRC2/64 661 1.29 ozaki atf_check -s exit:0 rump.ifconfig -w 10 662 1.29 ozaki 663 1.29 ozaki $DEBUG && rump.netstat -nr -f inet6 664 1.29 ozaki atf_check -s exit:0 -o ignore rump.ping6 -n -X 1 -c 1 $IP6DST 665 1.29 ozaki $DEBUG && rump.ndp -na 666 1.29 ozaki atf_check -s exit:0 -o match:'shmif0' rump.ndp -n $IP6DST 667 1.29 ozaki atf_check -s exit:0 -o not-match:'shmif1' rump.ndp -n $IP6DST 668 1.29 ozaki 669 1.29 ozaki # Clean up 670 1.29 ozaki atf_check -s exit:0 -o ignore rump.ndp -c 671 1.29 ozaki atf_check -s not-exit:0 -o ignore -e match:'no entry' rump.ndp -n $IP6DST 672 1.29 ozaki 673 1.29 ozaki # ping from a different source address 674 1.29 ozaki atf_check -s exit:0 -o ignore \ 675 1.29 ozaki rump.ping6 -n -X 1 -c 1 -S $IP6SRC2 $IP6DST 676 1.29 ozaki $DEBUG && rump.ndp -na 677 1.29 ozaki atf_check -s exit:0 -o match:'shmif0' rump.ndp -n $IP6DST 678 1.29 ozaki # ARP reply goes back via shmif1, so a cache is created on shmif1 679 1.29 ozaki atf_check -s exit:0 -o match:'shmif1' rump.ndp -n $IP6DST 680 1.29 ozaki 681 1.29 ozaki # Clean up by ndp -c 682 1.29 ozaki atf_check -s exit:0 -o ignore rump.ndp -c 683 1.29 ozaki atf_check -s not-exit:0 -o ignore -e match:'no entry' rump.ndp -n $IP6DST 684 1.29 ozaki 685 1.29 ozaki # ping from a different source address again 686 1.29 ozaki atf_check -s exit:0 -o ignore \ 687 1.29 ozaki rump.ping6 -n -X 1 -c 1 -S $IP6SRC2 $IP6DST 688 1.29 ozaki atf_check -s exit:0 -o match:'shmif0' rump.ndp -n $IP6DST 689 1.29 ozaki # ARP reply doen't come 690 1.29 ozaki atf_check -s exit:0 -o not-match:'shmif1' rump.ndp -n $IP6DST 691 1.29 ozaki 692 1.29 ozaki # Cleanup caches on the destination 693 1.29 ozaki export RUMP_SERVER=$SOCKDST 694 1.29 ozaki $DEBUG && rump.ndp -na 695 1.29 ozaki atf_check -s exit:0 -o ignore rump.ndp -c 696 1.29 ozaki $DEBUG && rump.ndp -na 697 1.29 ozaki export RUMP_SERVER=$SOCKSRC 698 1.29 ozaki 699 1.29 ozaki # ping from a different source address again 700 1.29 ozaki atf_check -s exit:0 -o ignore \ 701 1.29 ozaki rump.ping6 -n -X 1 -c 1 -S $IP6SRC2 $IP6DST 702 1.29 ozaki atf_check -s exit:0 -o match:'shmif0' rump.ndp -n $IP6DST 703 1.29 ozaki # ARP reply goes back via shmif1 704 1.29 ozaki atf_check -s exit:0 -o match:'shmif1' rump.ndp -n $IP6DST 705 1.29 ozaki 706 1.29 ozaki # Clean up by ndp -d <ip> 707 1.29 ozaki atf_check -s exit:0 -o ignore rump.ndp -d $IP6DST 708 1.29 ozaki # Both entries should be deleted 709 1.29 ozaki atf_check -s not-exit:0 -o ignore -e match:'no entry' rump.ndp -n $IP6DST 710 1.29 ozaki 711 1.29 ozaki rump_server_destroy_ifaces 712 1.29 ozaki } 713 1.29 ozaki 714 1.29 ozaki ndp_stray_entries_cleanup() 715 1.29 ozaki { 716 1.29 ozaki 717 1.29 ozaki $DEBUG && dump 718 1.29 ozaki cleanup 719 1.29 ozaki } 720 1.29 ozaki 721 1.32 ozaki atf_test_case ndp_cache_state cleanup 722 1.35 ozaki ndp_cache_state_head() 723 1.32 ozaki { 724 1.32 ozaki 725 1.32 ozaki atf_set "descr" "Tests states of neighbor cache entries" 726 1.32 ozaki atf_set "require.progs" "rump_server" 727 1.32 ozaki } 728 1.32 ozaki 729 1.32 ozaki check_cache_state() 730 1.32 ozaki { 731 1.32 ozaki local dst=$1 732 1.32 ozaki local state=$2 733 1.32 ozaki 734 1.32 ozaki $DEBUG && rump.ndp -n $dst 735 1.32 ozaki atf_check -s exit:0 -o match:"^$dst.*$state " rump.ndp -n $dst 736 1.32 ozaki } 737 1.32 ozaki 738 1.32 ozaki wait_until_stalled() 739 1.32 ozaki { 740 1.32 ozaki local dst=$1 741 1.32 ozaki local state=$2 742 1.32 ozaki 743 1.32 ozaki $DEBUG && rump.ndp -n $dst 744 1.32 ozaki while true; do 745 1.32 ozaki rump.ndp -n $dst | grep -q "^$dst.*S " && break 746 1.32 ozaki sleep 1 747 1.32 ozaki done 748 1.32 ozaki $DEBUG && rump.ndp -n $dst 749 1.32 ozaki } 750 1.32 ozaki 751 1.32 ozaki ndp_cache_state_body() 752 1.32 ozaki { 753 1.34 ozaki local macaddr= 754 1.32 ozaki 755 1.40 ozaki skip_if_qemu 756 1.40 ozaki 757 1.32 ozaki rump_server_start $SOCKSRC netinet6 758 1.32 ozaki rump_server_start $SOCKDST netinet6 759 1.32 ozaki 760 1.32 ozaki setup_dst_server 761 1.32 ozaki setup_src_server 762 1.32 ozaki 763 1.34 ozaki # Shorten the expire time of cache entries 764 1.32 ozaki export RUMP_SERVER=$SOCKSRC 765 1.33 ozaki atf_check -s exit:0 -o match:'basereachable=7s0ms' \ 766 1.33 ozaki rump.ndp -i shmif0 basereachable=7000 767 1.33 ozaki 768 1.34 ozaki # Make a permanent cache entry to avoid sending an NS packet disturbing 769 1.34 ozaki # the test 770 1.34 ozaki macaddr=$(get_macaddr $SOCKSRC shmif0) 771 1.34 ozaki export RUMP_SERVER=$SOCKDST 772 1.34 ozaki atf_check -s exit:0 -o ignore rump.ndp -s $IP6SRC $macaddr 773 1.34 ozaki 774 1.34 ozaki export RUMP_SERVER=$SOCKSRC 775 1.34 ozaki 776 1.32 ozaki # 777 1.32 ozaki # Reachability confirmation (RFC 4861 7.3.3) 778 1.32 ozaki # 779 1.32 ozaki atf_check -s exit:0 -o ignore rump.ping6 -n -X $TIMEOUT -c 1 $IP6DST 780 1.32 ozaki 781 1.32 ozaki # Receiving a solicited NA packet changes the state of the cache to REACHABLE 782 1.32 ozaki check_cache_state $IP6DST R 783 1.32 ozaki 784 1.32 ozaki # The state of the cache transits to STALE after a while 785 1.32 ozaki wait_until_stalled $IP6DST 786 1.32 ozaki 787 1.32 ozaki # Sending a packet on the cache will run a reachability confirmation 788 1.32 ozaki atf_check -s exit:0 -o ignore rump.ping6 -n -X $TIMEOUT -c 1 $IP6DST 789 1.32 ozaki 790 1.32 ozaki sleep 1 791 1.32 ozaki 792 1.32 ozaki # The state of the cache is changed to DELAY and stay for 5s, then 793 1.32 ozaki # send a NS packet and change the state to PROBE 794 1.32 ozaki check_cache_state $IP6DST D 795 1.32 ozaki 796 1.32 ozaki sleep $((5 + 1)) 797 1.32 ozaki 798 1.32 ozaki # If the reachability confirmation is success, the state of the cache 799 1.32 ozaki # is changed to REACHABLE 800 1.32 ozaki check_cache_state $IP6DST R 801 1.32 ozaki } 802 1.32 ozaki 803 1.32 ozaki ndp_cache_state_cleanup() 804 1.32 ozaki { 805 1.32 ozaki 806 1.32 ozaki $DEBUG && dump 807 1.32 ozaki cleanup 808 1.32 ozaki } 809 1.32 ozaki 810 1.1 ozaki atf_init_test_cases() 811 1.1 ozaki { 812 1.12 ozaki atf_add_test_case ndp_cache_expiration 813 1.12 ozaki atf_add_test_case ndp_commands 814 1.12 ozaki atf_add_test_case ndp_cache_overwriting 815 1.12 ozaki atf_add_test_case ndp_neighborgcthresh 816 1.12 ozaki atf_add_test_case ndp_link_activation 817 1.20 ozaki atf_add_test_case ndp_rtm 818 1.24 ozaki atf_add_test_case ndp_purge_on_route_change 819 1.24 ozaki atf_add_test_case ndp_purge_on_route_delete 820 1.24 ozaki atf_add_test_case ndp_purge_on_ifdown 821 1.29 ozaki atf_add_test_case ndp_stray_entries 822 1.32 ozaki atf_add_test_case ndp_cache_state 823 1.1 ozaki } 824