1# $NetBSD: t_route.sh,v 1.10 2016/12/21 02:46:08 ozaki-r Exp $ 2# 3# Copyright (c) 2016 Internet Initiative Japan Inc. 4# All rights reserved. 5# 6# Redistribution and use in source and binary forms, with or without 7# modification, are permitted provided that the following conditions 8# are met: 9# 1. Redistributions of source code must retain the above copyright 10# notice, this list of conditions and the following disclaimer. 11# 2. Redistributions in binary form must reproduce the above copyright 12# notice, this list of conditions and the following disclaimer in the 13# documentation and/or other materials provided with the distribution. 14# 15# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 16# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 17# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 18# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 19# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 20# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 21# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 22# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 23# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 24# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 25# POSSIBILITY OF SUCH DAMAGE. 26# 27 28# non_subnet_gateway 29SOCK_CLIENT=unix://commsock1 30SOCK_GW=unix://commsock2 31BUS=bus1 32 33# command_get 34SOCKSRC=unix://commsock1 35SOCKFWD=unix://commsock2 36SOCKDST=unix://commsock3 37IP4SRC=10.0.1.2 38IP4SRCGW=10.0.1.1 39IP4DSTGW=10.0.2.1 40IP4DST=10.0.2.2 41IP4DST_BCAST=10.0.2.255 42IP6SRC=fc00:0:0:1::2 43IP6SRCGW=fc00:0:0:1::1 44IP6DSTGW=fc00:0:0:2::1 45IP6DST=fc00:0:0:2::2 46BUS_SRCGW=bus1 47BUS_DSTGW=bus2 48 49DEBUG=${DEBUG:-false} 50TIMEOUT=1 51PING_OPTS="-n -c 1 -w $TIMEOUT" 52 53atf_test_case route_non_subnet_gateway cleanup 54route_non_subnet_gateway_head() 55{ 56 57 atf_set "descr" "tests of a gateway not on the local subnet" 58 atf_set "require.progs" "rump_server" 59} 60 61route_non_subnet_gateway_body() 62{ 63 64 rump_server_start $SOCK_CLIENT 65 rump_server_start $SOCK_GW 66 67 export RUMP_SERVER=${SOCK_GW} 68 rump_server_add_iface $SOCK_GW shmif0 $BUS 69 atf_check -s exit:0 rump.ifconfig shmif0 192.168.0.1 70 atf_check -s exit:0 rump.ifconfig shmif0 up 71 72 # The gateway knows the client 73 atf_check -s exit:0 -o match:'add net 10.0.0.1: gateway shmif0' \ 74 rump.route add -net 10.0.0.1/32 -link -cloning -iface shmif0 75 76 $DEBUG && rump.netstat -nr -f inet 77 78 export RUMP_SERVER=${SOCK_CLIENT} 79 rump_server_add_iface $SOCK_CLIENT shmif0 $BUS 80 atf_check -s exit:0 rump.ifconfig shmif0 10.0.0.1/32 81 atf_check -s exit:0 rump.ifconfig shmif0 up 82 atf_check -s exit:0 rump.ifconfig -w 10 83 84 $DEBUG && rump.netstat -nr -f inet 85 86 # Don't know a route to the gateway yet 87 atf_check -s not-exit:0 -o match:'100.0% packet loss' \ 88 -e match:'No route to host' rump.ping $PING_OPTS 192.168.0.1 89 90 # Teach a route to the gateway 91 atf_check -s exit:0 -o match:'add net 192.168.0.1: gateway shmif0' \ 92 rump.route add -net 192.168.0.1/32 -link -cloning -iface shmif0 93 atf_check -s exit:0 -o match:'add net default: gateway 192.168.0.1' \ 94 rump.route add default -ifa 10.0.0.1 192.168.0.1 95 96 $DEBUG && rump.netstat -nr -f inet 97 98 # Be reachable to the gateway 99 atf_check -s exit:0 -o ignore rump.ping $PING_OPTS 192.168.0.1 100 101 rump_server_destroy_ifaces 102} 103 104route_non_subnet_gateway_cleanup() 105{ 106 107 $DEBUG && dump 108 cleanup 109} 110 111atf_test_case route_command_get cleanup 112atf_test_case route_command_get6 cleanup 113route_command_get_head() 114{ 115 116 atf_set "descr" "tests of route get command" 117 atf_set "require.progs" "rump_server" 118} 119 120route_command_get6_head() 121{ 122 123 atf_set "descr" "tests of route get command (IPv6)" 124 atf_set "require.progs" "rump_server" 125} 126 127setup_endpoint() 128{ 129 local sock=${1} 130 local addr=${2} 131 local bus=${3} 132 local mode=${4} 133 local gw=${5} 134 135 export RUMP_SERVER=${sock} 136 rump_server_add_iface $sock shmif0 $bus 137 if [ $mode = "ipv6" ]; then 138 atf_check -s exit:0 rump.ifconfig shmif0 inet6 ${addr} 139 atf_check -s exit:0 -o ignore rump.route add -inet6 default ${gw} 140 else 141 atf_check -s exit:0 rump.ifconfig shmif0 inet ${addr} netmask 0xffffff00 142 atf_check -s exit:0 -o ignore rump.route add default ${gw} 143 fi 144 atf_check -s exit:0 rump.ifconfig shmif0 up 145 atf_check -s exit:0 rump.ifconfig -w 10 146 147 if $DEBUG; then 148 rump.ifconfig shmif0 149 rump.netstat -nr 150 fi 151} 152 153setup_forwarder() 154{ 155 mode=${1} 156 157 rump_server_add_iface $SOCKFWD shmif0 $BUS_SRCGW 158 rump_server_add_iface $SOCKFWD shmif1 $BUS_DSTGW 159 160 export RUMP_SERVER=$SOCKFWD 161 if [ $mode = "ipv6" ]; then 162 atf_check -s exit:0 rump.ifconfig shmif0 inet6 ${IP6SRCGW} 163 atf_check -s exit:0 rump.ifconfig shmif1 inet6 ${IP6DSTGW} 164 else 165 atf_check -s exit:0 rump.ifconfig shmif0 inet ${IP4SRCGW} netmask 0xffffff00 166 atf_check -s exit:0 rump.ifconfig shmif1 inet ${IP4DSTGW} netmask 0xffffff00 167 fi 168 169 atf_check -s exit:0 rump.ifconfig shmif0 up 170 atf_check -s exit:0 rump.ifconfig shmif1 up 171 atf_check -s exit:0 rump.ifconfig -w 10 172 173 if $DEBUG; then 174 rump.netstat -nr 175 if [ $mode = "ipv6" ]; then 176 rump.sysctl net.inet6.ip6.forwarding 177 else 178 rump.sysctl net.inet.ip.forwarding 179 fi 180 fi 181} 182 183setup_forwarding() 184{ 185 export RUMP_SERVER=$SOCKFWD 186 atf_check -s exit:0 -o ignore rump.sysctl -w net.inet.ip.forwarding=1 187} 188 189setup_forwarding6() 190{ 191 export RUMP_SERVER=$SOCKFWD 192 atf_check -s exit:0 -o ignore rump.sysctl -w net.inet6.ip6.forwarding=1 193} 194 195setup() 196{ 197 198 rump_server_start $SOCKSRC 199 rump_server_start $SOCKFWD 200 rump_server_start $SOCKDST 201 202 setup_endpoint $SOCKSRC $IP4SRC $BUS_SRCGW ipv4 $IP4SRCGW 203 setup_endpoint $SOCKDST $IP4DST $BUS_DSTGW ipv4 $IP4DSTGW 204 setup_forwarder ipv4 205} 206 207setup6() 208{ 209 210 rump_server_start $SOCKSRC netinet6 211 rump_server_start $SOCKFWD netinet6 212 rump_server_start $SOCKDST netinet6 213 214 setup_endpoint $SOCKSRC $IP6SRC $BUS_SRCGW ipv6 $IP6SRCGW 215 setup_endpoint $SOCKDST $IP6DST $BUS_DSTGW ipv6 $IP6DSTGW 216 setup_forwarder ipv6 217} 218 219test_route_get() 220{ 221 222 export RUMP_SERVER=$SOCKSRC 223 $DEBUG && rump.netstat -nr -f inet 224 $DEBUG && rump.arp -n -a 225 226 # Make sure an ARP cache to the gateway doesn't exist 227 rump.arp -d $IP4SRCGW 228 229 # Local 230 cat >./expect <<-EOF 231 route to: 10.0.1.2 232destination: 10.0.1.2 233 local addr: 10.0.1.2 234 interface: lo0 235 flags: <UP,HOST,DONE,LLINFO,LOCAL> 236 recvpipe sendpipe ssthresh rtt,msec rttvar hopcount mtu expire 237 EOF 238 rump.route -n get $IP4SRC > ./output 239 $DEBUG && cat ./expect ./output 240 # XXX: omit the last line because expire is unstable on rump kernel. 241 sed -i '$d' ./output 242 atf_check -s exit:0 diff ./expect ./output 243 244 # Neighbor 245 cat >./expect <<-EOF 246 route to: 10.0.1.1 247destination: 10.0.1.0 248 mask: 255.255.255.0 249 local addr: 10.0.1.2 250 interface: shmif0 251 flags: <UP,DONE,CONNECTED> 252 recvpipe sendpipe ssthresh rtt,msec rttvar hopcount mtu expire 253 EOF 254 rump.route -n get $IP4SRCGW > ./output 255 $DEBUG && cat ./expect ./output 256 sed -i '$d' ./output 257 atf_check -s exit:0 diff ./expect ./output 258 259 # Remote host 260 cat >./expect <<-EOF 261 route to: 10.0.2.2 262destination: default 263 mask: default 264 gateway: 10.0.1.1 265 local addr: 10.0.1.2 266 interface: shmif0 267 flags: <UP,GATEWAY,DONE,STATIC> 268 recvpipe sendpipe ssthresh rtt,msec rttvar hopcount mtu expire 269 EOF 270 rump.route -n get $IP4DST > ./output 271 $DEBUG && cat ./expect ./output 272 sed -i '$d' ./output 273 atf_check -s exit:0 diff ./expect ./output 274 275 # Create a ARP cache 276 atf_check -s exit:0 -o ignore rump.ping -q -n -w $TIMEOUT -c 1 $IP4SRCGW 277 278 # Neighbor with a cache (no different from w/o cache) 279 cat >./expect <<-EOF 280 route to: 10.0.1.1 281destination: 10.0.1.0 282 mask: 255.255.255.0 283 local addr: 10.0.1.2 284 interface: shmif0 285 flags: <UP,DONE,CONNECTED> 286 recvpipe sendpipe ssthresh rtt,msec rttvar hopcount mtu expire 287 EOF 288 rump.route -n get $IP4SRCGW > ./output 289 $DEBUG && cat ./expect ./output 290 sed -i '$d' ./output 291 atf_check -s exit:0 diff ./expect ./output 292} 293 294test_route_get6() 295{ 296 297 export RUMP_SERVER=$SOCKSRC 298 $DEBUG && rump.netstat -nr -f inet 299 $DEBUG && rump.ndp -n -a 300 301 # Make sure an ARP cache to the gateway doesn't exist 302 rump.ndp -d $IP6SRCGW 303 304 # Local 305 cat >./expect <<-EOF 306 route to: fc00:0:0:1::2 307destination: fc00:0:0:1::2 308 local addr: fc00:0:0:1::2 309 interface: lo0 310 flags: <UP,HOST,DONE,LLINFO,LOCAL> 311 recvpipe sendpipe ssthresh rtt,msec rttvar hopcount mtu expire 312 EOF 313 rump.route -n get -inet6 $IP6SRC > ./output 314 $DEBUG && cat ./expect ./output 315 sed -i '$d' ./output 316 atf_check -s exit:0 diff ./expect ./output 317 318 # Neighbor 319 cat >./expect <<-EOF 320 route to: fc00:0:0:1::1 321destination: fc00:0:0:1:: 322 mask: ffff:ffff:ffff:ffff:: 323 local addr: fc00:0:0:1::2 324 interface: shmif0 325 flags: <UP,DONE,CONNECTED> 326 recvpipe sendpipe ssthresh rtt,msec rttvar hopcount mtu expire 327 EOF 328 rump.route -n get -inet6 $IP6SRCGW > ./output 329 $DEBUG && cat ./expect ./output 330 sed -i '$d' ./output 331 atf_check -s exit:0 diff ./expect ./output 332 333 # Remote host 334 cat >./expect <<-EOF 335 route to: fc00:0:0:2::2 336destination: :: 337 mask: default 338 gateway: fc00:0:0:1::1 339 local addr: fc00:0:0:1::2 340 interface: shmif0 341 flags: <UP,GATEWAY,DONE,STATIC> 342 recvpipe sendpipe ssthresh rtt,msec rttvar hopcount mtu expire 343 EOF 344 rump.route -n get -inet6 $IP6DST > ./output 345 $DEBUG && cat ./expect ./output 346 sed -i '$d' ./output 347 atf_check -s exit:0 diff ./expect ./output 348 349 # Create a NDP cache 350 atf_check -s exit:0 -o ignore rump.ping6 -n -c 1 -X $TIMEOUT $IP6SRCGW 351 352 # Neighbor with a cache (no different from w/o cache) 353 cat >./expect <<-EOF 354 route to: fc00:0:0:1::1 355destination: fc00:0:0:1:: 356 mask: ffff:ffff:ffff:ffff:: 357 local addr: fc00:0:0:1::2 358 interface: shmif0 359 flags: <UP,DONE,CONNECTED> 360 recvpipe sendpipe ssthresh rtt,msec rttvar hopcount mtu expire 361 EOF 362 rump.route -n get -inet6 $IP6SRCGW > ./output 363 $DEBUG && cat ./expect ./output 364 sed -i '$d' ./output 365 atf_check -s exit:0 diff ./expect ./output 366} 367 368route_command_get_body() 369{ 370 371 setup 372 setup_forwarding 373 test_route_get 374 rump_server_destroy_ifaces 375} 376 377route_command_get6_body() 378{ 379 380 setup6 381 setup_forwarding6 382 test_route_get6 383 rump_server_destroy_ifaces 384} 385 386route_command_get_cleanup() 387{ 388 389 $DEBUG && dump 390 cleanup 391} 392 393route_command_get6_cleanup() 394{ 395 396 $DEBUG && dump 397 cleanup 398} 399 400atf_init_test_cases() 401{ 402 403 atf_add_test_case route_non_subnet_gateway 404 atf_add_test_case route_command_get 405 atf_add_test_case route_command_get6 406} 407