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