1 1.16 ozaki # $NetBSD: t_dad.sh,v 1.16 2024/08/20 08:21:48 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 SOCKLOCAL=unix://commsock1 29 1.1 ozaki SOCKPEER=unix://commsock2 30 1.1 ozaki 31 1.9 ozaki DEBUG=${DEBUG:-false} 32 1.1 ozaki 33 1.1 ozaki atf_test_case dad_basic cleanup 34 1.1 ozaki atf_test_case dad_duplicated cleanup 35 1.16 ozaki atf_test_case dad_duplicated_nodad cleanup 36 1.1 ozaki 37 1.1 ozaki dad_basic_head() 38 1.1 ozaki { 39 1.1 ozaki atf_set "descr" "Tests for IPv4 DAD basic behavior" 40 1.1 ozaki atf_set "require.progs" "rump_server" 41 1.1 ozaki } 42 1.1 ozaki 43 1.1 ozaki dad_duplicated_head() 44 1.1 ozaki { 45 1.1 ozaki atf_set "descr" "Tests for IPv4 DAD duplicated state" 46 1.1 ozaki atf_set "require.progs" "rump_server" 47 1.1 ozaki } 48 1.1 ozaki 49 1.16 ozaki dad_duplicated_nodad_head() 50 1.16 ozaki { 51 1.16 ozaki atf_set "descr" "Tests for IPv4 DAD duplicated state w/o DAD" 52 1.16 ozaki atf_set "require.progs" "rump_server" 53 1.16 ozaki } 54 1.16 ozaki 55 1.1 ozaki setup_server() 56 1.1 ozaki { 57 1.1 ozaki local sock=$1 58 1.1 ozaki local ip=$2 59 1.1 ozaki 60 1.13 ozaki rump_server_add_iface $sock shmif0 bus1 61 1.13 ozaki 62 1.1 ozaki export RUMP_SERVER=$sock 63 1.1 ozaki atf_check -s exit:0 rump.ifconfig shmif0 inet $ip/24 64 1.1 ozaki atf_check -s exit:0 rump.ifconfig shmif0 up 65 1.1 ozaki atf_check -s exit:0 rump.ifconfig -w 10 66 1.1 ozaki 67 1.1 ozaki $DEBUG && rump.ifconfig shmif0 68 1.1 ozaki } 69 1.1 ozaki 70 1.1 ozaki make_pkt_str() 71 1.1 ozaki { 72 1.1 ozaki local target=$1 73 1.1 ozaki local sender=$2 74 1.14 ozaki pkt="> ff:ff:ff:ff:ff:ff, ethertype ARP \(0x0806\), length 42:" 75 1.1 ozaki pkt="$pkt Request who-has $target tell $sender, length 28" 76 1.1 ozaki echo $pkt 77 1.1 ozaki } 78 1.1 ozaki 79 1.16 ozaki make_reply_str() 80 1.16 ozaki { 81 1.16 ozaki local srcmac=$1 82 1.16 ozaki local dstmac=$2 83 1.16 ozaki local ip=$3 84 1.16 ozaki pkt="$srcmac > $dstmac, ethertype ARP \(0x0806\), length 42:" 85 1.16 ozaki pkt="Reply $ip is-at $srcmac, length 28" 86 1.16 ozaki echo $pkt 87 1.16 ozaki } 88 1.16 ozaki 89 1.1 ozaki dad_basic_body() 90 1.1 ozaki { 91 1.1 ozaki local pkt= 92 1.1 ozaki 93 1.13 ozaki rump_server_start $SOCKLOCAL 94 1.13 ozaki rump_server_add_iface $SOCKLOCAL shmif0 bus1 95 1.13 ozaki 96 1.1 ozaki export RUMP_SERVER=$SOCKLOCAL 97 1.1 ozaki 98 1.14 ozaki # Increase the number of trials, which makes the tests stable 99 1.14 ozaki atf_check -s exit:0 -o match:'3 -> 5' \ 100 1.14 ozaki rump.sysctl -w net.inet.ip.dad_count=5 101 1.14 ozaki 102 1.1 ozaki atf_check -s exit:0 rump.ifconfig shmif0 inet 10.0.0.1/24 103 1.1 ozaki atf_check -s exit:0 rump.ifconfig shmif0 inet 10.0.0.2/24 alias 104 1.1 ozaki $DEBUG && rump.ifconfig shmif0 105 1.1 ozaki 106 1.4 ozaki atf_check -s exit:0 rump.ifconfig shmif0 up 107 1.4 ozaki rump.ifconfig shmif0 > ./out 108 1.4 ozaki $DEBUG && cat ./out 109 1.1 ozaki 110 1.4 ozaki # The primary address doesn't start with tentative state 111 1.14 ozaki atf_check -s exit:0 -o not-match:'10\.0\.0\.1.+TENTATIVE' cat ./out 112 1.4 ozaki # The alias address starts with tentative state 113 1.14 ozaki atf_check -s exit:0 -o match:'10\.0\.0\.2.+TENTATIVE' cat ./out 114 1.4 ozaki 115 1.4 ozaki atf_check -s exit:0 sleep 2 116 1.12 ozaki extract_new_packets bus1 > ./out 117 1.4 ozaki $DEBUG && cat ./out 118 1.1 ozaki 119 1.1 ozaki # Check DAD probe packets 120 1.1 ozaki pkt=$(make_pkt_str 10.0.0.2 0.0.0.0) 121 1.14 ozaki atf_check -s exit:0 -o match:"$pkt" cat ./out 122 1.1 ozaki # No DAD for the primary address 123 1.1 ozaki pkt=$(make_pkt_str 10.0.0.1 0.0.0.0) 124 1.14 ozaki atf_check -s exit:0 -o not-match:"$pkt" cat ./out 125 1.1 ozaki 126 1.1 ozaki # Waiting for DAD complete 127 1.1 ozaki atf_check -s exit:0 rump.ifconfig -w 10 128 1.6 ozaki # Give a chance to send a DAD announce packet 129 1.14 ozaki atf_check -s exit:0 sleep 2 130 1.12 ozaki extract_new_packets bus1 > ./out 131 1.4 ozaki $DEBUG && cat ./out 132 1.1 ozaki 133 1.1 ozaki # Check the DAD announce packet 134 1.1 ozaki pkt=$(make_pkt_str 10.0.0.2 10.0.0.2) 135 1.14 ozaki atf_check -s exit:0 -o match:"$pkt" cat ./out 136 1.1 ozaki # The alias address left tentative 137 1.14 ozaki atf_check -s exit:0 -o not-match:'10\.0\.0\.2.+TENTATIVE' \ 138 1.14 ozaki rump.ifconfig shmif0 139 1.1 ozaki 140 1.1 ozaki # 141 1.1 ozaki # Add a new address on the fly 142 1.1 ozaki # 143 1.1 ozaki atf_check -s exit:0 rump.ifconfig shmif0 inet 10.0.0.3/24 alias 144 1.1 ozaki 145 1.4 ozaki # The new address starts with tentative state 146 1.14 ozaki atf_check -s exit:0 -o match:'10\.0\.0\.3.+TENTATIVE' \ 147 1.14 ozaki rump.ifconfig shmif0 148 1.1 ozaki 149 1.1 ozaki # Check DAD probe packets 150 1.4 ozaki atf_check -s exit:0 sleep 2 151 1.12 ozaki extract_new_packets bus1 > ./out 152 1.4 ozaki $DEBUG && cat ./out 153 1.1 ozaki pkt=$(make_pkt_str 10.0.0.3 0.0.0.0) 154 1.14 ozaki atf_check -s exit:0 -o match:"$pkt" cat ./out 155 1.1 ozaki 156 1.1 ozaki # Waiting for DAD complete 157 1.1 ozaki atf_check -s exit:0 rump.ifconfig -w 10 158 1.6 ozaki # Give a chance to send a DAD announce packet 159 1.14 ozaki atf_check -s exit:0 sleep 2 160 1.12 ozaki extract_new_packets bus1 > ./out 161 1.4 ozaki $DEBUG && cat ./out 162 1.1 ozaki 163 1.1 ozaki # Check the DAD announce packet 164 1.1 ozaki pkt=$(make_pkt_str 10.0.0.3 10.0.0.3) 165 1.14 ozaki atf_check -s exit:0 -o match:"$pkt" cat ./out 166 1.1 ozaki # The new address left tentative 167 1.14 ozaki atf_check -s exit:0 -o not-match:'10\.0\.0\.3.+TENTATIVE' \ 168 1.14 ozaki rump.ifconfig shmif0 169 1.13 ozaki 170 1.13 ozaki rump_server_destroy_ifaces 171 1.1 ozaki } 172 1.1 ozaki 173 1.1 ozaki dad_duplicated_body() 174 1.1 ozaki { 175 1.1 ozaki local localip1=10.0.1.1 176 1.1 ozaki local localip2=10.0.1.11 177 1.1 ozaki local peerip=10.0.1.2 178 1.1 ozaki 179 1.13 ozaki rump_server_start $SOCKLOCAL 180 1.13 ozaki rump_server_start $SOCKPEER 181 1.1 ozaki 182 1.1 ozaki setup_server $SOCKLOCAL $localip1 183 1.1 ozaki setup_server $SOCKPEER $peerip 184 1.1 ozaki 185 1.1 ozaki export RUMP_SERVER=$SOCKLOCAL 186 1.1 ozaki 187 1.1 ozaki # The primary address isn't marked as duplicated 188 1.15 ozaki atf_check -s exit:0 -o not-match:"${localip1}.+DUPLICATED" \ 189 1.15 ozaki rump.ifconfig shmif0 190 1.1 ozaki 191 1.1 ozaki # 192 1.1 ozaki # Add a new address duplicated with the peer server 193 1.1 ozaki # 194 1.1 ozaki atf_check -s exit:0 rump.ifconfig shmif0 inet $peerip alias 195 1.15 ozaki atf_check -s exit:0 sleep 2 196 1.1 ozaki 197 1.1 ozaki # The new address is marked as duplicated 198 1.15 ozaki atf_check -s exit:0 -o match:"${peerip}.+DUPLICATED" \ 199 1.15 ozaki rump.ifconfig shmif0 200 1.1 ozaki 201 1.1 ozaki # A unique address isn't marked as duplicated 202 1.1 ozaki atf_check -s exit:0 rump.ifconfig shmif0 inet $localip2 alias 203 1.15 ozaki atf_check -s exit:0 sleep 2 204 1.15 ozaki atf_check -s exit:0 -o not-match:"${localip2}.+DUPLICATED" \ 205 1.15 ozaki rump.ifconfig shmif0 206 1.1 ozaki 207 1.13 ozaki rump_server_destroy_ifaces 208 1.1 ozaki } 209 1.1 ozaki 210 1.16 ozaki dad_duplicated_nodad_body() 211 1.16 ozaki { 212 1.16 ozaki local localip1=10.0.1.1 213 1.16 ozaki local localip2=10.0.1.11 214 1.16 ozaki local peerip=10.0.1.2 215 1.16 ozaki local lmac= pmac= 216 1.16 ozaki 217 1.16 ozaki rump_server_start $SOCKLOCAL 218 1.16 ozaki rump_server_start $SOCKPEER 219 1.16 ozaki 220 1.16 ozaki export RUMP_SERVER=$SOCKLOCAL 221 1.16 ozaki atf_check -s exit:0 -o ignore rump.sysctl -w net.inet.ip.dad_count=0 222 1.16 ozaki export RUMP_SERVER=$SOCKPEER 223 1.16 ozaki atf_check -s exit:0 -o ignore rump.sysctl -w net.inet.ip.dad_count=0 224 1.16 ozaki 225 1.16 ozaki setup_server $SOCKLOCAL $localip1 226 1.16 ozaki setup_server $SOCKPEER $peerip 227 1.16 ozaki 228 1.16 ozaki export RUMP_SERVER=$SOCKLOCAL 229 1.16 ozaki 230 1.16 ozaki # The primary address isn't marked as duplicated 231 1.16 ozaki atf_check -s exit:0 -o not-match:"${localip1}.+DUPLICATED" \ 232 1.16 ozaki rump.ifconfig shmif0 233 1.16 ozaki 234 1.16 ozaki extract_new_packets bus1 > ./out 235 1.16 ozaki 236 1.16 ozaki # GARP packets are sent 237 1.16 ozaki pkt=$(make_pkt_str $localip1 $localip1) 238 1.16 ozaki atf_check -s exit:0 -o match:"$pkt" cat ./out 239 1.16 ozaki pkt=$(make_pkt_str $peerip $peerip) 240 1.16 ozaki atf_check -s exit:0 -o match:"$pkt" cat ./out 241 1.16 ozaki 242 1.16 ozaki # No DAD probe packets are sent 243 1.16 ozaki pkt=$(make_pkt_str $localip1 0.0.0.0) 244 1.16 ozaki atf_check -s exit:0 -o not-match:"$pkt" cat ./out 245 1.16 ozaki pkt=$(make_pkt_str $peerip 0.0.0.0) 246 1.16 ozaki atf_check -s exit:0 -o not-match:"$pkt" cat ./out 247 1.16 ozaki 248 1.16 ozaki # 249 1.16 ozaki # Add a new address duplicated with the peer server 250 1.16 ozaki # 251 1.16 ozaki atf_check -s exit:0 rump.ifconfig shmif0 inet $peerip alias 252 1.16 ozaki atf_check -s exit:0 sleep 2 253 1.16 ozaki 254 1.16 ozaki # The new address is NOT marked as duplicated 255 1.16 ozaki atf_check -s exit:0 -o not-match:"${peerip}.+DUPLICATED" \ 256 1.16 ozaki rump.ifconfig shmif0 257 1.16 ozaki 258 1.16 ozaki lmac=$(get_macaddr $SOCKLOCAL) 259 1.16 ozaki pmac=$(get_macaddr $SOCKPEER) 260 1.16 ozaki extract_new_packets bus1 > ./out 261 1.16 ozaki 262 1.16 ozaki # The peer just replies a GARP of the peer 263 1.16 ozaki pkt=$(make_reply_str $pmac $lmac $peerip) 264 1.16 ozaki atf_check -s exit:0 -o match:"$pkt" cat ./out 265 1.16 ozaki 266 1.16 ozaki # A unique address isn't marked as duplicated 267 1.16 ozaki atf_check -s exit:0 rump.ifconfig shmif0 inet $localip2 alias 268 1.16 ozaki atf_check -s exit:0 sleep 2 269 1.16 ozaki atf_check -s exit:0 -o not-match:"${localip2}.+DUPLICATED" \ 270 1.16 ozaki rump.ifconfig shmif0 271 1.16 ozaki 272 1.16 ozaki rump_server_destroy_ifaces 273 1.16 ozaki } 274 1.16 ozaki 275 1.1 ozaki dad_basic_cleanup() 276 1.1 ozaki { 277 1.13 ozaki $DEBUG && dump 278 1.13 ozaki cleanup 279 1.1 ozaki } 280 1.1 ozaki 281 1.1 ozaki dad_duplicated_cleanup() 282 1.1 ozaki { 283 1.1 ozaki $DEBUG && dump 284 1.2 ozaki cleanup 285 1.1 ozaki } 286 1.1 ozaki 287 1.16 ozaki dad_duplicated_nodad_cleanup() 288 1.16 ozaki { 289 1.16 ozaki 290 1.16 ozaki $DEBUG && dump 291 1.16 ozaki cleanup 292 1.16 ozaki } 293 1.16 ozaki 294 1.1 ozaki atf_init_test_cases() 295 1.1 ozaki { 296 1.1 ozaki atf_add_test_case dad_basic 297 1.1 ozaki atf_add_test_case dad_duplicated 298 1.16 ozaki atf_add_test_case dad_duplicated_nodad 299 1.1 ozaki } 300