selftests: Add ipv4 udp tests to fcnal-test
[linux-2.6-microblaze.git] / tools / testing / selftests / net / fcnal-test.sh
1 #!/bin/bash
2 # SPDX-License-Identifier: GPL-2.0
3 #
4 # Copyright (c) 2019 David Ahern <dsahern@gmail.com>. All rights reserved.
5 #
6 # IPv4 and IPv6 functional tests focusing on VRF and routing lookups
7 # for various permutations:
8 #   1. icmp, tcp, udp and netfilter
9 #   2. client, server, no-server
10 #   3. global address on interface
11 #   4. global address on 'lo'
12 #   5. remote and local traffic
13 #   6. VRF and non-VRF permutations
14 #
15 # Setup:
16 #                     ns-A     |     ns-B
17 # No VRF case:
18 #    [ lo ]         [ eth1 ]---|---[ eth1 ]      [ lo ]
19 #                                                remote address
20 # VRF case:
21 #         [ red ]---[ eth1 ]---|---[ eth1 ]      [ lo ]
22 #
23 # ns-A:
24 #     eth1: 172.16.1.1/24, 2001:db8:1::1/64
25 #       lo: 127.0.0.1/8, ::1/128
26 #           172.16.2.1/32, 2001:db8:2::1/128
27 #      red: 127.0.0.1/8, ::1/128
28 #           172.16.3.1/32, 2001:db8:3::1/128
29 #
30 # ns-B:
31 #     eth1: 172.16.1.2/24, 2001:db8:1::2/64
32 #      lo2: 127.0.0.1/8, ::1/128
33 #           172.16.2.2/32, 2001:db8:2::2/128
34 #
35 # server / client nomenclature relative to ns-A
36
37 VERBOSE=0
38
39 NSA_DEV=eth1
40 NSB_DEV=eth1
41 VRF=red
42 VRF_TABLE=1101
43
44 # IPv4 config
45 NSA_IP=172.16.1.1
46 NSB_IP=172.16.1.2
47 VRF_IP=172.16.3.1
48
49 # IPv6 config
50 NSA_IP6=2001:db8:1::1
51 NSB_IP6=2001:db8:1::2
52 VRF_IP6=2001:db8:3::1
53
54 NSA_LO_IP=172.16.2.1
55 NSB_LO_IP=172.16.2.2
56 NSA_LO_IP6=2001:db8:2::1
57 NSB_LO_IP6=2001:db8:2::2
58
59 MCAST=ff02::1
60 # set after namespace create
61 NSA_LINKIP6=
62 NSB_LINKIP6=
63
64 NSA=ns-A
65 NSB=ns-B
66
67 NSA_CMD="ip netns exec ${NSA}"
68 NSB_CMD="ip netns exec ${NSB}"
69
70 which ping6 > /dev/null 2>&1 && ping6=$(which ping6) || ping6=$(which ping)
71
72 ################################################################################
73 # utilities
74
75 log_test()
76 {
77         local rc=$1
78         local expected=$2
79         local msg="$3"
80
81         [ "${VERBOSE}" = "1" ] && echo
82
83         if [ ${rc} -eq ${expected} ]; then
84                 nsuccess=$((nsuccess+1))
85                 printf "TEST: %-70s  [ OK ]\n" "${msg}"
86         else
87                 nfail=$((nfail+1))
88                 printf "TEST: %-70s  [FAIL]\n" "${msg}"
89                 if [ "${PAUSE_ON_FAIL}" = "yes" ]; then
90                         echo
91                         echo "hit enter to continue, 'q' to quit"
92                         read a
93                         [ "$a" = "q" ] && exit 1
94                 fi
95         fi
96
97         if [ "${PAUSE}" = "yes" ]; then
98                 echo
99                 echo "hit enter to continue, 'q' to quit"
100                 read a
101                 [ "$a" = "q" ] && exit 1
102         fi
103
104         kill_procs
105 }
106
107 log_test_addr()
108 {
109         local addr=$1
110         local rc=$2
111         local expected=$3
112         local msg="$4"
113         local astr
114
115         astr=$(addr2str ${addr})
116         log_test $rc $expected "$msg - ${astr}"
117 }
118
119 log_section()
120 {
121         echo
122         echo "###########################################################################"
123         echo "$*"
124         echo "###########################################################################"
125         echo
126 }
127
128 log_subsection()
129 {
130         echo
131         echo "#################################################################"
132         echo "$*"
133         echo
134 }
135
136 log_start()
137 {
138         # make sure we have no test instances running
139         kill_procs
140
141         if [ "${VERBOSE}" = "1" ]; then
142                 echo
143                 echo "#######################################################"
144         fi
145 }
146
147 log_debug()
148 {
149         if [ "${VERBOSE}" = "1" ]; then
150                 echo
151                 echo "$*"
152                 echo
153         fi
154 }
155
156 show_hint()
157 {
158         if [ "${VERBOSE}" = "1" ]; then
159                 echo "HINT: $*"
160                 echo
161         fi
162 }
163
164 kill_procs()
165 {
166         killall nettest ping ping6 >/dev/null 2>&1
167         sleep 1
168 }
169
170 do_run_cmd()
171 {
172         local cmd="$*"
173         local out
174
175         if [ "$VERBOSE" = "1" ]; then
176                 echo "COMMAND: ${cmd}"
177         fi
178
179         out=$($cmd 2>&1)
180         rc=$?
181         if [ "$VERBOSE" = "1" -a -n "$out" ]; then
182                 echo "$out"
183         fi
184
185         return $rc
186 }
187
188 run_cmd()
189 {
190         do_run_cmd ${NSA_CMD} $*
191 }
192
193 run_cmd_nsb()
194 {
195         do_run_cmd ${NSB_CMD} $*
196 }
197
198 setup_cmd()
199 {
200         local cmd="$*"
201         local rc
202
203         run_cmd ${cmd}
204         rc=$?
205         if [ $rc -ne 0 ]; then
206                 # show user the command if not done so already
207                 if [ "$VERBOSE" = "0" ]; then
208                         echo "setup command: $cmd"
209                 fi
210                 echo "failed. stopping tests"
211                 if [ "${PAUSE_ON_FAIL}" = "yes" ]; then
212                         echo
213                         echo "hit enter to continue"
214                         read a
215                 fi
216                 exit $rc
217         fi
218 }
219
220 setup_cmd_nsb()
221 {
222         local cmd="$*"
223         local rc
224
225         run_cmd_nsb ${cmd}
226         rc=$?
227         if [ $rc -ne 0 ]; then
228                 # show user the command if not done so already
229                 if [ "$VERBOSE" = "0" ]; then
230                         echo "setup command: $cmd"
231                 fi
232                 echo "failed. stopping tests"
233                 if [ "${PAUSE_ON_FAIL}" = "yes" ]; then
234                         echo
235                         echo "hit enter to continue"
236                         read a
237                 fi
238                 exit $rc
239         fi
240 }
241
242 # set sysctl values in NS-A
243 set_sysctl()
244 {
245         echo "SYSCTL: $*"
246         echo
247         run_cmd sysctl -q -w $*
248 }
249
250 ################################################################################
251 # Setup for tests
252
253 addr2str()
254 {
255         case "$1" in
256         127.0.0.1) echo "loopback";;
257         ::1) echo "IPv6 loopback";;
258
259         ${NSA_IP})      echo "ns-A IP";;
260         ${NSA_IP6})     echo "ns-A IPv6";;
261         ${NSA_LO_IP})   echo "ns-A loopback IP";;
262         ${NSA_LO_IP6})  echo "ns-A loopback IPv6";;
263         ${NSA_LINKIP6}|${NSA_LINKIP6}%*) echo "ns-A IPv6 LLA";;
264
265         ${NSB_IP})      echo "ns-B IP";;
266         ${NSB_IP6})     echo "ns-B IPv6";;
267         ${NSB_LO_IP})   echo "ns-B loopback IP";;
268         ${NSB_LO_IP6})  echo "ns-B loopback IPv6";;
269         ${NSB_LINKIP6}|${NSB_LINKIP6}%*) echo "ns-B IPv6 LLA";;
270
271         ${VRF_IP})      echo "VRF IP";;
272         ${VRF_IP6})     echo "VRF IPv6";;
273
274         ${MCAST}%*)     echo "multicast IP";;
275
276         *) echo "unknown";;
277         esac
278 }
279
280 get_linklocal()
281 {
282         local ns=$1
283         local dev=$2
284         local addr
285
286         addr=$(ip -netns ${ns} -6 -br addr show dev ${dev} | \
287         awk '{
288                 for (i = 3; i <= NF; ++i) {
289                         if ($i ~ /^fe80/)
290                                 print $i
291                 }
292         }'
293         )
294         addr=${addr/\/*}
295
296         [ -z "$addr" ] && return 1
297
298         echo $addr
299
300         return 0
301 }
302
303 ################################################################################
304 # create namespaces and vrf
305
306 create_vrf()
307 {
308         local ns=$1
309         local vrf=$2
310         local table=$3
311         local addr=$4
312         local addr6=$5
313
314         ip -netns ${ns} link add ${vrf} type vrf table ${table}
315         ip -netns ${ns} link set ${vrf} up
316         ip -netns ${ns} route add vrf ${vrf} unreachable default metric 8192
317         ip -netns ${ns} -6 route add vrf ${vrf} unreachable default metric 8192
318
319         ip -netns ${ns} addr add 127.0.0.1/8 dev ${vrf}
320         ip -netns ${ns} -6 addr add ::1 dev ${vrf} nodad
321         if [ "${addr}" != "-" ]; then
322                 ip -netns ${ns} addr add dev ${vrf} ${addr}
323         fi
324         if [ "${addr6}" != "-" ]; then
325                 ip -netns ${ns} -6 addr add dev ${vrf} ${addr6}
326         fi
327
328         ip -netns ${ns} ru del pref 0
329         ip -netns ${ns} ru add pref 32765 from all lookup local
330         ip -netns ${ns} -6 ru del pref 0
331         ip -netns ${ns} -6 ru add pref 32765 from all lookup local
332 }
333
334 create_ns()
335 {
336         local ns=$1
337         local addr=$2
338         local addr6=$3
339
340         ip netns add ${ns}
341
342         ip -netns ${ns} link set lo up
343         if [ "${addr}" != "-" ]; then
344                 ip -netns ${ns} addr add dev lo ${addr}
345         fi
346         if [ "${addr6}" != "-" ]; then
347                 ip -netns ${ns} -6 addr add dev lo ${addr6}
348         fi
349
350         ip -netns ${ns} ro add unreachable default metric 8192
351         ip -netns ${ns} -6 ro add unreachable default metric 8192
352
353         ip netns exec ${ns} sysctl -qw net.ipv4.ip_forward=1
354         ip netns exec ${ns} sysctl -qw net.ipv6.conf.all.keep_addr_on_down=1
355         ip netns exec ${ns} sysctl -qw net.ipv6.conf.all.forwarding=1
356         ip netns exec ${ns} sysctl -qw net.ipv6.conf.default.forwarding=1
357 }
358
359 # create veth pair to connect namespaces and apply addresses.
360 connect_ns()
361 {
362         local ns1=$1
363         local ns1_dev=$2
364         local ns1_addr=$3
365         local ns1_addr6=$4
366         local ns2=$5
367         local ns2_dev=$6
368         local ns2_addr=$7
369         local ns2_addr6=$8
370
371         ip -netns ${ns1} li add ${ns1_dev} type veth peer name tmp
372         ip -netns ${ns1} li set ${ns1_dev} up
373         ip -netns ${ns1} li set tmp netns ${ns2} name ${ns2_dev}
374         ip -netns ${ns2} li set ${ns2_dev} up
375
376         if [ "${ns1_addr}" != "-" ]; then
377                 ip -netns ${ns1} addr add dev ${ns1_dev} ${ns1_addr}
378                 ip -netns ${ns2} addr add dev ${ns2_dev} ${ns2_addr}
379         fi
380
381         if [ "${ns1_addr6}" != "-" ]; then
382                 ip -netns ${ns1} addr add dev ${ns1_dev} ${ns1_addr6}
383                 ip -netns ${ns2} addr add dev ${ns2_dev} ${ns2_addr6}
384         fi
385 }
386
387 cleanup()
388 {
389         # explicit cleanups to check those code paths
390         ip netns | grep -q ${NSA}
391         if [ $? -eq 0 ]; then
392                 ip -netns ${NSA} link delete ${VRF}
393                 ip -netns ${NSA} ro flush table ${VRF_TABLE}
394
395                 ip -netns ${NSA} addr flush dev ${NSA_DEV}
396                 ip -netns ${NSA} -6 addr flush dev ${NSA_DEV}
397                 ip -netns ${NSA} link set dev ${NSA_DEV} down
398                 ip -netns ${NSA} link del dev ${NSA_DEV}
399
400                 ip netns del ${NSA}
401         fi
402
403         ip netns del ${NSB}
404 }
405
406 setup()
407 {
408         local with_vrf=${1}
409
410         # make sure we are starting with a clean slate
411         kill_procs
412         cleanup 2>/dev/null
413
414         log_debug "Configuring network namespaces"
415         set -e
416
417         create_ns ${NSA} ${NSA_LO_IP}/32 ${NSA_LO_IP6}/128
418         create_ns ${NSB} ${NSB_LO_IP}/32 ${NSB_LO_IP6}/128
419         connect_ns ${NSA} ${NSA_DEV} ${NSA_IP}/24 ${NSA_IP6}/64 \
420                    ${NSB} ${NSB_DEV} ${NSB_IP}/24 ${NSB_IP6}/64
421
422         NSA_LINKIP6=$(get_linklocal ${NSA} ${NSA_DEV})
423         NSB_LINKIP6=$(get_linklocal ${NSB} ${NSB_DEV})
424
425         # tell ns-A how to get to remote addresses of ns-B
426         if [ "${with_vrf}" = "yes" ]; then
427                 create_vrf ${NSA} ${VRF} ${VRF_TABLE} ${VRF_IP} ${VRF_IP6}
428
429                 ip -netns ${NSA} link set dev ${NSA_DEV} vrf ${VRF}
430                 ip -netns ${NSA} ro add vrf ${VRF} ${NSB_LO_IP}/32 via ${NSB_IP} dev ${NSA_DEV}
431                 ip -netns ${NSA} -6 ro add vrf ${VRF} ${NSB_LO_IP6}/128 via ${NSB_IP6} dev ${NSA_DEV}
432
433                 ip -netns ${NSB} ro add ${VRF_IP}/32 via ${NSA_IP} dev ${NSB_DEV}
434                 ip -netns ${NSB} -6 ro add ${VRF_IP6}/128 via ${NSA_IP6} dev ${NSB_DEV}
435         else
436                 ip -netns ${NSA} ro add ${NSB_LO_IP}/32 via ${NSB_IP} dev ${NSA_DEV}
437                 ip -netns ${NSA} ro add ${NSB_LO_IP6}/128 via ${NSB_IP6} dev ${NSA_DEV}
438         fi
439
440
441         # tell ns-B how to get to remote addresses of ns-A
442         ip -netns ${NSB} ro add ${NSA_LO_IP}/32 via ${NSA_IP} dev ${NSB_DEV}
443         ip -netns ${NSB} ro add ${NSA_LO_IP6}/128 via ${NSA_IP6} dev ${NSB_DEV}
444
445         set +e
446
447         sleep 1
448 }
449
450 ################################################################################
451 # IPv4
452
453 ipv4_ping_novrf()
454 {
455         local a
456
457         #
458         # out
459         #
460         for a in ${NSB_IP} ${NSB_LO_IP}
461         do
462                 log_start
463                 run_cmd ping -c1 -w1 ${a}
464                 log_test_addr ${a} $? 0 "ping out"
465
466                 log_start
467                 run_cmd ping -c1 -w1 -I ${NSA_DEV} ${a}
468                 log_test_addr ${a} $? 0 "ping out, device bind"
469
470                 log_start
471                 run_cmd ping -c1 -w1 -I ${NSA_LO_IP} ${a}
472                 log_test_addr ${a} $? 0 "ping out, address bind"
473         done
474
475         #
476         # in
477         #
478         for a in ${NSA_IP} ${NSA_LO_IP}
479         do
480                 log_start
481                 run_cmd_nsb ping -c1 -w1 ${a}
482                 log_test_addr ${a} $? 0 "ping in"
483         done
484
485         #
486         # local traffic
487         #
488         for a in ${NSA_IP} ${NSA_LO_IP} 127.0.0.1
489         do
490                 log_start
491                 run_cmd ping -c1 -w1 ${a}
492                 log_test_addr ${a} $? 0 "ping local"
493         done
494
495         #
496         # local traffic, socket bound to device
497         #
498         # address on device
499         a=${NSA_IP}
500         log_start
501         run_cmd ping -c1 -w1 -I ${NSA_DEV} ${a}
502         log_test_addr ${a} $? 0 "ping local, device bind"
503
504         # loopback addresses not reachable from device bind
505         # fails in a really weird way though because ipv4 special cases
506         # route lookups with oif set.
507         for a in ${NSA_LO_IP} 127.0.0.1
508         do
509                 log_start
510                 show_hint "Fails since address on loopback device is out of device scope"
511                 run_cmd ping -c1 -w1 -I ${NSA_DEV} ${a}
512                 log_test_addr ${a} $? 1 "ping local, device bind"
513         done
514
515         #
516         # ip rule blocks reachability to remote address
517         #
518         log_start
519         setup_cmd ip rule add pref 32765 from all lookup local
520         setup_cmd ip rule del pref 0 from all lookup local
521         setup_cmd ip rule add pref 50 to ${NSB_LO_IP} prohibit
522         setup_cmd ip rule add pref 51 from ${NSB_IP} prohibit
523
524         a=${NSB_LO_IP}
525         run_cmd ping -c1 -w1 ${a}
526         log_test_addr ${a} $? 2 "ping out, blocked by rule"
527
528         # NOTE: ipv4 actually allows the lookup to fail and yet still create
529         # a viable rtable if the oif (e.g., bind to device) is set, so this
530         # case succeeds despite the rule
531         # run_cmd ping -c1 -w1 -I ${NSA_DEV} ${a}
532
533         a=${NSA_LO_IP}
534         log_start
535         show_hint "Response generates ICMP (or arp request is ignored) due to ip rule"
536         run_cmd_nsb ping -c1 -w1 ${a}
537         log_test_addr ${a} $? 1 "ping in, blocked by rule"
538
539         [ "$VERBOSE" = "1" ] && echo
540         setup_cmd ip rule del pref 32765 from all lookup local
541         setup_cmd ip rule add pref 0 from all lookup local
542         setup_cmd ip rule del pref 50 to ${NSB_LO_IP} prohibit
543         setup_cmd ip rule del pref 51 from ${NSB_IP} prohibit
544
545         #
546         # route blocks reachability to remote address
547         #
548         log_start
549         setup_cmd ip route replace unreachable ${NSB_LO_IP}
550         setup_cmd ip route replace unreachable ${NSB_IP}
551
552         a=${NSB_LO_IP}
553         run_cmd ping -c1 -w1 ${a}
554         log_test_addr ${a} $? 2 "ping out, blocked by route"
555
556         # NOTE: ipv4 actually allows the lookup to fail and yet still create
557         # a viable rtable if the oif (e.g., bind to device) is set, so this
558         # case succeeds despite not having a route for the address
559         # run_cmd ping -c1 -w1 -I ${NSA_DEV} ${a}
560
561         a=${NSA_LO_IP}
562         log_start
563         show_hint "Response is dropped (or arp request is ignored) due to ip route"
564         run_cmd_nsb ping -c1 -w1 ${a}
565         log_test_addr ${a} $? 1 "ping in, blocked by route"
566
567         #
568         # remove 'remote' routes; fallback to default
569         #
570         log_start
571         setup_cmd ip ro del ${NSB_LO_IP}
572
573         a=${NSB_LO_IP}
574         run_cmd ping -c1 -w1 ${a}
575         log_test_addr ${a} $? 2 "ping out, unreachable default route"
576
577         # NOTE: ipv4 actually allows the lookup to fail and yet still create
578         # a viable rtable if the oif (e.g., bind to device) is set, so this
579         # case succeeds despite not having a route for the address
580         # run_cmd ping -c1 -w1 -I ${NSA_DEV} ${a}
581 }
582
583 ipv4_ping_vrf()
584 {
585         local a
586
587         # should default on; does not exist on older kernels
588         set_sysctl net.ipv4.raw_l3mdev_accept=1 2>/dev/null
589
590         #
591         # out
592         #
593         for a in ${NSB_IP} ${NSB_LO_IP}
594         do
595                 log_start
596                 run_cmd ping -c1 -w1 -I ${VRF} ${a}
597                 log_test_addr ${a} $? 0 "ping out, VRF bind"
598
599                 log_start
600                 run_cmd ping -c1 -w1 -I ${NSA_DEV} ${a}
601                 log_test_addr ${a} $? 0 "ping out, device bind"
602
603                 log_start
604                 run_cmd ip vrf exec ${VRF} ping -c1 -w1 -I ${NSA_IP} ${a}
605                 log_test_addr ${a} $? 0 "ping out, vrf device + dev address bind"
606
607                 log_start
608                 run_cmd ip vrf exec ${VRF} ping -c1 -w1 -I ${VRF_IP} ${a}
609                 log_test_addr ${a} $? 0 "ping out, vrf device + vrf address bind"
610         done
611
612         #
613         # in
614         #
615         for a in ${NSA_IP} ${VRF_IP}
616         do
617                 log_start
618                 run_cmd_nsb ping -c1 -w1 ${a}
619                 log_test_addr ${a} $? 0 "ping in"
620         done
621
622         #
623         # local traffic, local address
624         #
625         for a in ${NSA_IP} ${VRF_IP} 127.0.0.1
626         do
627                 log_start
628                 show_hint "Source address should be ${a}"
629                 run_cmd ping -c1 -w1 -I ${VRF} ${a}
630                 log_test_addr ${a} $? 0 "ping local, VRF bind"
631         done
632
633         #
634         # local traffic, socket bound to device
635         #
636         # address on device
637         a=${NSA_IP}
638         log_start
639         run_cmd ping -c1 -w1 -I ${NSA_DEV} ${a}
640         log_test_addr ${a} $? 0 "ping local, device bind"
641
642         # vrf device is out of scope
643         for a in ${VRF_IP} 127.0.0.1
644         do
645                 log_start
646                 show_hint "Fails since address on vrf device is out of device scope"
647                 run_cmd ping -c1 -w1 -I ${NSA_DEV} ${a}
648                 log_test_addr ${a} $? 1 "ping local, device bind"
649         done
650
651         #
652         # ip rule blocks address
653         #
654         log_start
655         setup_cmd ip rule add pref 50 to ${NSB_LO_IP} prohibit
656         setup_cmd ip rule add pref 51 from ${NSB_IP} prohibit
657
658         a=${NSB_LO_IP}
659         run_cmd ping -c1 -w1 -I ${VRF} ${a}
660         log_test_addr ${a} $? 2 "ping out, vrf bind, blocked by rule"
661
662         log_start
663         run_cmd ping -c1 -w1 -I ${NSA_DEV} ${a}
664         log_test_addr ${a} $? 2 "ping out, device bind, blocked by rule"
665
666         a=${NSA_LO_IP}
667         log_start
668         show_hint "Response lost due to ip rule"
669         run_cmd_nsb ping -c1 -w1 ${a}
670         log_test_addr ${a} $? 1 "ping in, blocked by rule"
671
672         [ "$VERBOSE" = "1" ] && echo
673         setup_cmd ip rule del pref 50 to ${NSB_LO_IP} prohibit
674         setup_cmd ip rule del pref 51 from ${NSB_IP} prohibit
675
676         #
677         # remove 'remote' routes; fallback to default
678         #
679         log_start
680         setup_cmd ip ro del vrf ${VRF} ${NSB_LO_IP}
681
682         a=${NSB_LO_IP}
683         run_cmd ping -c1 -w1 -I ${VRF} ${a}
684         log_test_addr ${a} $? 2 "ping out, vrf bind, unreachable route"
685
686         log_start
687         run_cmd ping -c1 -w1 -I ${NSA_DEV} ${a}
688         log_test_addr ${a} $? 2 "ping out, device bind, unreachable route"
689
690         a=${NSA_LO_IP}
691         log_start
692         show_hint "Response lost by unreachable route"
693         run_cmd_nsb ping -c1 -w1 ${a}
694         log_test_addr ${a} $? 1 "ping in, unreachable route"
695 }
696
697 ipv4_ping()
698 {
699         log_section "IPv4 ping"
700
701         log_subsection "No VRF"
702         setup
703         set_sysctl net.ipv4.raw_l3mdev_accept=0 2>/dev/null
704         ipv4_ping_novrf
705         setup
706         set_sysctl net.ipv4.raw_l3mdev_accept=1 2>/dev/null
707         ipv4_ping_novrf
708
709         log_subsection "With VRF"
710         setup "yes"
711         ipv4_ping_vrf
712 }
713
714 ################################################################################
715 # IPv4 TCP
716
717 ipv4_tcp_novrf()
718 {
719         local a
720
721         #
722         # server tests
723         #
724         for a in ${NSA_IP} ${NSA_LO_IP}
725         do
726                 log_start
727                 run_cmd nettest -s &
728                 sleep 1
729                 run_cmd_nsb nettest -r ${a}
730                 log_test_addr ${a} $? 0 "Global server"
731         done
732
733         a=${NSA_IP}
734         log_start
735         run_cmd nettest -s -d ${NSA_DEV} &
736         sleep 1
737         run_cmd_nsb nettest -r ${a}
738         log_test_addr ${a} $? 0 "Device server"
739
740         # verify TCP reset sent and received
741         for a in ${NSA_IP} ${NSA_LO_IP}
742         do
743                 log_start
744                 show_hint "Should fail 'Connection refused' since there is no server"
745                 run_cmd_nsb nettest -r ${a}
746                 log_test_addr ${a} $? 1 "No server"
747         done
748
749         #
750         # client
751         #
752         for a in ${NSB_IP} ${NSB_LO_IP}
753         do
754                 log_start
755                 run_cmd_nsb nettest -s &
756                 sleep 1
757                 run_cmd nettest -r ${a} -0 ${NSA_IP}
758                 log_test_addr ${a} $? 0 "Client"
759
760                 log_start
761                 run_cmd_nsb nettest -s &
762                 sleep 1
763                 run_cmd nettest -r ${a} -d ${NSA_DEV}
764                 log_test_addr ${a} $? 0 "Client, device bind"
765
766                 log_start
767                 show_hint "Should fail 'Connection refused'"
768                 run_cmd nettest -r ${a}
769                 log_test_addr ${a} $? 1 "No server, unbound client"
770
771                 log_start
772                 show_hint "Should fail 'Connection refused'"
773                 run_cmd nettest -r ${a} -d ${NSA_DEV}
774                 log_test_addr ${a} $? 1 "No server, device client"
775         done
776
777         #
778         # local address tests
779         #
780         for a in ${NSA_IP} ${NSA_LO_IP} 127.0.0.1
781         do
782                 log_start
783                 run_cmd nettest -s &
784                 sleep 1
785                 run_cmd nettest -r ${a} -0 ${a} -1 ${a}
786                 log_test_addr ${a} $? 0 "Global server, local connection"
787         done
788
789         a=${NSA_IP}
790         log_start
791         run_cmd nettest -s -d ${NSA_DEV} &
792         sleep 1
793         run_cmd nettest -r ${a} -0 ${a}
794         log_test_addr ${a} $? 0 "Device server, unbound client, local connection"
795
796         for a in ${NSA_LO_IP} 127.0.0.1
797         do
798                 log_start
799                 show_hint "Should fail 'Connection refused' since addresses on loopback are out of device scope"
800                 run_cmd nettest -s -d ${NSA_DEV} &
801                 sleep 1
802                 run_cmd nettest -r ${a}
803                 log_test_addr ${a} $? 1 "Device server, unbound client, local connection"
804         done
805
806         a=${NSA_IP}
807         log_start
808         run_cmd nettest -s &
809         sleep 1
810         run_cmd nettest -r ${a} -0 ${a} -d ${NSA_DEV}
811         log_test_addr ${a} $? 0 "Global server, device client, local connection"
812
813         for a in ${NSA_LO_IP} 127.0.0.1
814         do
815                 log_start
816                 show_hint "Should fail 'No route to host' since addresses on loopback are out of device scope"
817                 run_cmd nettest -s &
818                 sleep 1
819                 run_cmd nettest -r ${a} -d ${NSA_DEV}
820                 log_test_addr ${a} $? 1 "Global server, device client, local connection"
821         done
822
823         a=${NSA_IP}
824         log_start
825         run_cmd nettest -s -d ${NSA_DEV} -2 ${NSA_DEV} &
826         sleep 1
827         run_cmd nettest  -d ${NSA_DEV} -r ${a} -0 ${a}
828         log_test_addr ${a} $? 0 "Device server, device client, local connection"
829
830         log_start
831         show_hint "Should fail 'Connection refused'"
832         run_cmd nettest -d ${NSA_DEV} -r ${a}
833         log_test_addr ${a} $? 1 "No server, device client, local conn"
834 }
835
836 ipv4_tcp_vrf()
837 {
838         local a
839
840         # disable global server
841         log_subsection "Global server disabled"
842
843         set_sysctl net.ipv4.tcp_l3mdev_accept=0
844
845         #
846         # server tests
847         #
848         for a in ${NSA_IP} ${VRF_IP}
849         do
850                 log_start
851                 show_hint "Should fail 'Connection refused' since global server with VRF is disabled"
852                 run_cmd nettest -s &
853                 sleep 1
854                 run_cmd_nsb nettest -r ${a}
855                 log_test_addr ${a} $? 1 "Global server"
856
857                 log_start
858                 run_cmd nettest -s -d ${VRF} -2 ${VRF} &
859                 sleep 1
860                 run_cmd_nsb nettest -r ${a}
861                 log_test_addr ${a} $? 0 "VRF server"
862
863                 log_start
864                 run_cmd nettest -s -d ${NSA_DEV} -2 ${NSA_DEV} &
865                 sleep 1
866                 run_cmd_nsb nettest -r ${a}
867                 log_test_addr ${a} $? 0 "Device server"
868
869                 # verify TCP reset received
870                 log_start
871                 show_hint "Should fail 'Connection refused' since there is no server"
872                 run_cmd_nsb nettest -r ${a}
873                 log_test_addr ${a} $? 1 "No server"
874         done
875
876         # local address tests
877         # (${VRF_IP} and 127.0.0.1 both timeout)
878         a=${NSA_IP}
879         log_start
880         show_hint "Should fail 'Connection refused' since global server with VRF is disabled"
881         run_cmd nettest -s &
882         sleep 1
883         run_cmd nettest -r ${a} -d ${NSA_DEV}
884         log_test_addr ${a} $? 1 "Global server, local connection"
885
886         #
887         # enable VRF global server
888         #
889         log_subsection "VRF Global server enabled"
890         set_sysctl net.ipv4.tcp_l3mdev_accept=1
891
892         for a in ${NSA_IP} ${VRF_IP}
893         do
894                 log_start
895                 show_hint "client socket should be bound to VRF"
896                 run_cmd nettest -s -2 ${VRF} &
897                 sleep 1
898                 run_cmd_nsb nettest -r ${a}
899                 log_test_addr ${a} $? 0 "Global server"
900
901                 log_start
902                 show_hint "client socket should be bound to VRF"
903                 run_cmd nettest -s -d ${VRF} -2 ${VRF} &
904                 sleep 1
905                 run_cmd_nsb nettest -r ${a}
906                 log_test_addr ${a} $? 0 "VRF server"
907
908                 # verify TCP reset received
909                 log_start
910                 show_hint "Should fail 'Connection refused'"
911                 run_cmd_nsb nettest -r ${a}
912                 log_test_addr ${a} $? 1 "No server"
913         done
914
915         a=${NSA_IP}
916         log_start
917         show_hint "client socket should be bound to device"
918         run_cmd nettest -s -d ${NSA_DEV} -2 ${NSA_DEV} &
919         sleep 1
920         run_cmd_nsb nettest -r ${a}
921         log_test_addr ${a} $? 0 "Device server"
922
923         # local address tests
924         for a in ${NSA_IP} ${VRF_IP}
925         do
926                 log_start
927                 show_hint "Should fail 'No route to host' since client is not bound to VRF"
928                 run_cmd nettest -s -2 ${VRF} &
929                 sleep 1
930                 run_cmd nettest -r ${a}
931                 log_test_addr ${a} $? 1 "Global server, local connection"
932         done
933
934         #
935         # client
936         #
937         for a in ${NSB_IP} ${NSB_LO_IP}
938         do
939                 log_start
940                 run_cmd_nsb nettest -s &
941                 sleep 1
942                 run_cmd nettest -r ${a} -d ${VRF}
943                 log_test_addr ${a} $? 0 "Client, VRF bind"
944
945                 log_start
946                 run_cmd_nsb nettest -s &
947                 sleep 1
948                 run_cmd nettest -r ${a} -d ${NSA_DEV}
949                 log_test_addr ${a} $? 0 "Client, device bind"
950
951                 log_start
952                 show_hint "Should fail 'Connection refused'"
953                 run_cmd nettest -r ${a} -d ${VRF}
954                 log_test_addr ${a} $? 1 "No server, VRF client"
955
956                 log_start
957                 show_hint "Should fail 'Connection refused'"
958                 run_cmd nettest -r ${a} -d ${NSA_DEV}
959                 log_test_addr ${a} $? 1 "No server, device client"
960         done
961
962         for a in ${NSA_IP} ${VRF_IP} 127.0.0.1
963         do
964                 log_start
965                 run_cmd nettest -s -d ${VRF} -2 ${VRF} &
966                 sleep 1
967                 run_cmd nettest -r ${a} -d ${VRF} -0 ${a}
968                 log_test_addr ${a} $? 0 "VRF server, VRF client, local connection"
969         done
970
971         a=${NSA_IP}
972         log_start
973         run_cmd nettest -s -d ${VRF} -2 ${VRF} &
974         sleep 1
975         run_cmd nettest -r ${a} -d ${NSA_DEV} -0 ${a}
976         log_test_addr ${a} $? 0 "VRF server, device client, local connection"
977
978         log_start
979         show_hint "Should fail 'No route to host' since client is out of VRF scope"
980         run_cmd nettest -s -d ${VRF} &
981         sleep 1
982         run_cmd nettest -r ${a}
983         log_test_addr ${a} $? 1 "VRF server, unbound client, local connection"
984
985         log_start
986         run_cmd nettest -s -d ${NSA_DEV} -2 ${NSA_DEV} &
987         sleep 1
988         run_cmd nettest -r ${a} -d ${VRF} -0 ${a}
989         log_test_addr ${a} $? 0 "Device server, VRF client, local connection"
990
991         log_start
992         run_cmd nettest -s -d ${NSA_DEV} -2 ${NSA_DEV} &
993         sleep 1
994         run_cmd nettest -r ${a} -d ${NSA_DEV} -0 ${a}
995         log_test_addr ${a} $? 0 "Device server, device client, local connection"
996 }
997
998 ipv4_tcp()
999 {
1000         log_section "IPv4/TCP"
1001
1002         which nettest >/dev/null
1003         if [ $? -ne 0 ]; then
1004                 log_error "nettest not found; skipping tests"
1005                 return
1006         fi
1007
1008         log_subsection "No VRF"
1009         setup
1010
1011         # tcp_l3mdev_accept should have no affect without VRF;
1012         # run tests with it enabled and disabled to verify
1013         log_subsection "tcp_l3mdev_accept disabled"
1014         set_sysctl net.ipv4.tcp_l3mdev_accept=0
1015         ipv4_tcp_novrf
1016         log_subsection "tcp_l3mdev_accept enabled"
1017         set_sysctl net.ipv4.tcp_l3mdev_accept=1
1018         ipv4_tcp_novrf
1019
1020         log_subsection "With VRF"
1021         setup "yes"
1022         ipv4_tcp_vrf
1023 }
1024
1025 ################################################################################
1026 # IPv4 UDP
1027
1028 ipv4_udp_novrf()
1029 {
1030         local a
1031
1032         #
1033         # server tests
1034         #
1035         for a in ${NSA_IP} ${NSA_LO_IP}
1036         do
1037                 log_start
1038                 run_cmd nettest -D -s -2 ${NSA_DEV} &
1039                 sleep 1
1040                 run_cmd_nsb nettest -D -r ${a}
1041                 log_test_addr ${a} $? 0 "Global server"
1042
1043                 log_start
1044                 show_hint "Should fail 'Connection refused' since there is no server"
1045                 run_cmd_nsb nettest -D -r ${a}
1046                 log_test_addr ${a} $? 1 "No server"
1047         done
1048
1049         a=${NSA_IP}
1050         log_start
1051         run_cmd nettest -D -d ${NSA_DEV} -s -2 ${NSA_DEV} &
1052         sleep 1
1053         run_cmd_nsb nettest -D -r ${a}
1054         log_test_addr ${a} $? 0 "Device server"
1055
1056         #
1057         # client
1058         #
1059         for a in ${NSB_IP} ${NSB_LO_IP}
1060         do
1061                 log_start
1062                 run_cmd_nsb nettest -D -s &
1063                 sleep 1
1064                 run_cmd nettest -D -r ${a} -0 ${NSA_IP}
1065                 log_test_addr ${a} $? 0 "Client"
1066
1067                 log_start
1068                 run_cmd_nsb nettest -D -s &
1069                 sleep 1
1070                 run_cmd nettest -D -r ${a} -d ${NSA_DEV} -0 ${NSA_IP}
1071                 log_test_addr ${a} $? 0 "Client, device bind"
1072
1073                 log_start
1074                 run_cmd_nsb nettest -D -s &
1075                 sleep 1
1076                 run_cmd nettest -D -r ${a} -d ${NSA_DEV} -C -0 ${NSA_IP}
1077                 log_test_addr ${a} $? 0 "Client, device send via cmsg"
1078
1079                 log_start
1080                 run_cmd_nsb nettest -D -s &
1081                 sleep 1
1082                 run_cmd nettest -D -r ${a} -d ${NSA_DEV} -S -0 ${NSA_IP}
1083                 log_test_addr ${a} $? 0 "Client, device bind via IP_UNICAST_IF"
1084
1085                 log_start
1086                 show_hint "Should fail 'Connection refused'"
1087                 run_cmd nettest -D -r ${a}
1088                 log_test_addr ${a} $? 1 "No server, unbound client"
1089
1090                 log_start
1091                 show_hint "Should fail 'Connection refused'"
1092                 run_cmd nettest -D -r ${a} -d ${NSA_DEV}
1093                 log_test_addr ${a} $? 1 "No server, device client"
1094         done
1095
1096         #
1097         # local address tests
1098         #
1099         for a in ${NSA_IP} ${NSA_LO_IP} 127.0.0.1
1100         do
1101                 log_start
1102                 run_cmd nettest -D -s &
1103                 sleep 1
1104                 run_cmd nettest -D -r ${a} -0 ${a} -1 ${a}
1105                 log_test_addr ${a} $? 0 "Global server, local connection"
1106         done
1107
1108         a=${NSA_IP}
1109         log_start
1110         run_cmd nettest -s -D -d ${NSA_DEV} -2 ${NSA_DEV} &
1111         sleep 1
1112         run_cmd nettest -D -r ${a}
1113         log_test_addr ${a} $? 0 "Device server, unbound client, local connection"
1114
1115         for a in ${NSA_LO_IP} 127.0.0.1
1116         do
1117                 log_start
1118                 show_hint "Should fail 'Connection refused' since address is out of device scope"
1119                 run_cmd nettest -s -D -d ${NSA_DEV} &
1120                 sleep 1
1121                 run_cmd nettest -D -r ${a}
1122                 log_test_addr ${a} $? 1 "Device server, unbound client, local connection"
1123         done
1124
1125         a=${NSA_IP}
1126         log_start
1127         run_cmd nettest -s -D &
1128         sleep 1
1129         run_cmd nettest -D -d ${NSA_DEV} -r ${a}
1130         log_test_addr ${a} $? 0 "Global server, device client, local connection"
1131
1132         log_start
1133         run_cmd nettest -s -D &
1134         sleep 1
1135         run_cmd nettest -D -d ${NSA_DEV} -C -r ${a}
1136         log_test_addr ${a} $? 0 "Global server, device send via cmsg, local connection"
1137
1138         log_start
1139         run_cmd nettest -s -D &
1140         sleep 1
1141         run_cmd nettest -D -d ${NSA_DEV} -S -r ${a}
1142         log_test_addr ${a} $? 0 "Global server, device client via IP_UNICAST_IF, local connection"
1143
1144         # IPv4 with device bind has really weird behavior - it overrides the
1145         # fib lookup, generates an rtable and tries to send the packet. This
1146         # causes failures for local traffic at different places
1147         for a in ${NSA_LO_IP} 127.0.0.1
1148         do
1149                 log_start
1150                 show_hint "Should fail since addresses on loopback are out of device scope"
1151                 run_cmd nettest -D -s &
1152                 sleep 1
1153                 run_cmd nettest -D -r ${a} -d ${NSA_DEV}
1154                 log_test_addr ${a} $? 2 "Global server, device client, local connection"
1155
1156                 log_start
1157                 show_hint "Should fail since addresses on loopback are out of device scope"
1158                 run_cmd nettest -D -s &
1159                 sleep 1
1160                 run_cmd nettest -D -r ${a} -d ${NSA_DEV} -C
1161                 log_test_addr ${a} $? 1 "Global server, device send via cmsg, local connection"
1162
1163                 log_start
1164                 show_hint "Should fail since addresses on loopback are out of device scope"
1165                 run_cmd nettest -D -s &
1166                 sleep 1
1167                 run_cmd nettest -D -r ${a} -d ${NSA_DEV} -S
1168                 log_test_addr ${a} $? 1 "Global server, device client via IP_UNICAST_IF, local connection"
1169         done
1170
1171         a=${NSA_IP}
1172         log_start
1173         run_cmd nettest -D -s -d ${NSA_DEV} -2 ${NSA_DEV} &
1174         sleep 1
1175         run_cmd nettest -D -d ${NSA_DEV} -r ${a} -0 ${a}
1176         log_test_addr ${a} $? 0 "Device server, device client, local conn"
1177
1178         log_start
1179         run_cmd nettest -D -d ${NSA_DEV} -r ${a}
1180         log_test_addr ${a} $? 2 "No server, device client, local conn"
1181 }
1182
1183 ipv4_udp_vrf()
1184 {
1185         local a
1186
1187         # disable global server
1188         log_subsection "Global server disabled"
1189         set_sysctl net.ipv4.udp_l3mdev_accept=0
1190
1191         #
1192         # server tests
1193         #
1194         for a in ${NSA_IP} ${VRF_IP}
1195         do
1196                 log_start
1197                 show_hint "Fails because ingress is in a VRF and global server is disabled"
1198                 run_cmd nettest -D -s &
1199                 sleep 1
1200                 run_cmd_nsb nettest -D -r ${a}
1201                 log_test_addr ${a} $? 1 "Global server"
1202
1203                 log_start
1204                 run_cmd nettest -D -d ${VRF} -s -2 ${NSA_DEV} &
1205                 sleep 1
1206                 run_cmd_nsb nettest -D -r ${a}
1207                 log_test_addr ${a} $? 0 "VRF server"
1208
1209                 log_start
1210                 run_cmd nettest -D -d ${NSA_DEV} -s -2 ${NSA_DEV} &
1211                 sleep 1
1212                 run_cmd_nsb nettest -D -r ${a}
1213                 log_test_addr ${a} $? 0 "Enslaved device server"
1214
1215                 log_start
1216                 show_hint "Should fail 'Connection refused' since there is no server"
1217                 run_cmd_nsb nettest -D -r ${a}
1218                 log_test_addr ${a} $? 1 "No server"
1219
1220                 log_start
1221                 show_hint "Should fail 'Connection refused' since global server is out of scope"
1222                 run_cmd nettest -D -s &
1223                 sleep 1
1224                 run_cmd nettest -D -d ${VRF} -r ${a}
1225                 log_test_addr ${a} $? 1 "Global server, VRF client, local connection"
1226         done
1227
1228         a=${NSA_IP}
1229         log_start
1230         run_cmd nettest -s -D -d ${VRF} -2 ${NSA_DEV} &
1231         sleep 1
1232         run_cmd nettest -D -d ${VRF} -r ${a}
1233         log_test_addr ${a} $? 0 "VRF server, VRF client, local conn"
1234
1235         log_start
1236         run_cmd nettest -s -D -d ${VRF} -2 ${NSA_DEV} &
1237         sleep 1
1238         run_cmd nettest -D -d ${NSA_DEV} -r ${a}
1239         log_test_addr ${a} $? 0 "VRF server, enslaved device client, local connection"
1240
1241         a=${NSA_IP}
1242         log_start
1243         run_cmd nettest -s -D -d ${NSA_DEV} -2 ${NSA_DEV} &
1244         sleep 1
1245         run_cmd nettest -D -d ${VRF} -r ${a}
1246         log_test_addr ${a} $? 0 "Enslaved device server, VRF client, local conn"
1247
1248         log_start
1249         run_cmd nettest -s -D -d ${NSA_DEV} -2 ${NSA_DEV} &
1250         sleep 1
1251         run_cmd nettest -D -d ${NSA_DEV} -r ${a}
1252         log_test_addr ${a} $? 0 "Enslaved device server, device client, local conn"
1253
1254         # enable global server
1255         log_subsection "Global server enabled"
1256         set_sysctl net.ipv4.udp_l3mdev_accept=1
1257
1258         #
1259         # server tests
1260         #
1261         for a in ${NSA_IP} ${VRF_IP}
1262         do
1263                 log_start
1264                 run_cmd nettest -D -s -2 ${NSA_DEV} &
1265                 sleep 1
1266                 run_cmd_nsb nettest -D -r ${a}
1267                 log_test_addr ${a} $? 0 "Global server"
1268
1269                 log_start
1270                 run_cmd nettest -D -d ${VRF} -s -2 ${NSA_DEV} &
1271                 sleep 1
1272                 run_cmd_nsb nettest -D -r ${a}
1273                 log_test_addr ${a} $? 0 "VRF server"
1274
1275                 log_start
1276                 run_cmd nettest -D -d ${NSA_DEV} -s -2 ${NSA_DEV} &
1277                 sleep 1
1278                 run_cmd_nsb nettest -D -r ${a}
1279                 log_test_addr ${a} $? 0 "Enslaved device server"
1280
1281                 log_start
1282                 show_hint "Should fail 'Connection refused'"
1283                 run_cmd_nsb nettest -D -r ${a}
1284                 log_test_addr ${a} $? 1 "No server"
1285         done
1286
1287         #
1288         # client tests
1289         #
1290         log_start
1291         run_cmd_nsb nettest -D -s &
1292         sleep 1
1293         run_cmd nettest -d ${VRF} -D -r ${NSB_IP} -1 ${NSA_IP}
1294         log_test $? 0 "VRF client"
1295
1296         log_start
1297         run_cmd_nsb nettest -D -s &
1298         sleep 1
1299         run_cmd nettest -d ${NSA_DEV} -D -r ${NSB_IP} -1 ${NSA_IP}
1300         log_test $? 0 "Enslaved device client"
1301
1302         # negative test - should fail
1303         log_start
1304         show_hint "Should fail 'Connection refused'"
1305         run_cmd nettest -D -d ${VRF} -r ${NSB_IP}
1306         log_test $? 1 "No server, VRF client"
1307
1308         log_start
1309         show_hint "Should fail 'Connection refused'"
1310         run_cmd nettest -D -d ${NSA_DEV} -r ${NSB_IP}
1311         log_test $? 1 "No server, enslaved device client"
1312
1313         #
1314         # local address tests
1315         #
1316         a=${NSA_IP}
1317         log_start
1318         run_cmd nettest -D -s -2 ${NSA_DEV} &
1319         sleep 1
1320         run_cmd nettest -D -d ${VRF} -r ${a}
1321         log_test_addr ${a} $? 0 "Global server, VRF client, local conn"
1322
1323         log_start
1324         run_cmd nettest -s -D -d ${VRF} -2 ${NSA_DEV} &
1325         sleep 1
1326         run_cmd nettest -D -d ${VRF} -r ${a}
1327         log_test_addr ${a} $? 0 "VRF server, VRF client, local conn"
1328
1329         log_start
1330         run_cmd nettest -s -D -d ${VRF} -2 ${NSA_DEV} &
1331         sleep 1
1332         run_cmd nettest -D -d ${NSA_DEV} -r ${a}
1333         log_test_addr ${a} $? 0 "VRF server, device client, local conn"
1334
1335         log_start
1336         run_cmd nettest -s -D -d ${NSA_DEV} -2 ${NSA_DEV} &
1337         sleep 1
1338         run_cmd nettest -D -d ${VRF} -r ${a}
1339         log_test_addr ${a} $? 0 "Enslaved device server, VRF client, local conn"
1340
1341         log_start
1342         run_cmd nettest -s -D -d ${NSA_DEV} -2 ${NSA_DEV} &
1343         sleep 1
1344         run_cmd nettest -D -d ${NSA_DEV} -r ${a}
1345         log_test_addr ${a} $? 0 "Enslaved device server, device client, local conn"
1346
1347         for a in ${VRF_IP} 127.0.0.1
1348         do
1349                 log_start
1350                 run_cmd nettest -D -s -2 ${VRF} &
1351                 sleep 1
1352                 run_cmd nettest -D -d ${VRF} -r ${a}
1353                 log_test_addr ${a} $? 0 "Global server, VRF client, local conn"
1354         done
1355
1356         for a in ${VRF_IP} 127.0.0.1
1357         do
1358                 log_start
1359                 run_cmd nettest -s -D -d ${VRF} -2 ${VRF} &
1360                 sleep 1
1361                 run_cmd nettest -D -d ${VRF} -r ${a}
1362                 log_test_addr ${a} $? 0 "VRF server, VRF client, local conn"
1363         done
1364
1365         # negative test - should fail
1366         # verifies ECONNREFUSED
1367         for a in ${NSA_IP} ${VRF_IP} 127.0.0.1
1368         do
1369                 log_start
1370                 show_hint "Should fail 'Connection refused'"
1371                 run_cmd nettest -D -d ${VRF} -r ${a}
1372                 log_test_addr ${a} $? 1 "No server, VRF client, local conn"
1373         done
1374 }
1375
1376 ipv4_udp()
1377 {
1378         which nettest >/dev/null
1379         if [ $? -ne 0 ]; then
1380                 log_error "nettest not found; skipping tests"
1381                 return
1382         fi
1383
1384         log_section "IPv4/UDP"
1385         log_subsection "No VRF"
1386
1387         setup
1388
1389         # udp_l3mdev_accept should have no affect without VRF;
1390         # run tests with it enabled and disabled to verify
1391         log_subsection "udp_l3mdev_accept disabled"
1392         set_sysctl net.ipv4.udp_l3mdev_accept=0
1393         ipv4_udp_novrf
1394         log_subsection "udp_l3mdev_accept enabled"
1395         set_sysctl net.ipv4.udp_l3mdev_accept=1
1396         ipv4_udp_novrf
1397
1398         log_subsection "With VRF"
1399         setup "yes"
1400         ipv4_udp_vrf
1401 }
1402
1403 ################################################################################
1404 # IPv6
1405
1406 ipv6_ping_novrf()
1407 {
1408         local a
1409
1410         # should not have an impact, but make a known state
1411         set_sysctl net.ipv4.raw_l3mdev_accept=0 2>/dev/null
1412
1413         #
1414         # out
1415         #
1416         for a in ${NSB_IP6} ${NSB_LO_IP6} ${NSB_LINKIP6}%${NSA_DEV} ${MCAST}%${NSA_DEV}
1417         do
1418                 log_start
1419                 run_cmd ${ping6} -c1 -w1 ${a}
1420                 log_test_addr ${a} $? 0 "ping out"
1421         done
1422
1423         for a in ${NSB_IP6} ${NSB_LO_IP6}
1424         do
1425                 log_start
1426                 run_cmd ${ping6} -c1 -w1 -I ${NSA_DEV} ${a}
1427                 log_test_addr ${a} $? 0 "ping out, device bind"
1428
1429                 log_start
1430                 run_cmd ${ping6} -c1 -w1 -I ${NSA_LO_IP6} ${a}
1431                 log_test_addr ${a} $? 0 "ping out, loopback address bind"
1432         done
1433
1434         #
1435         # in
1436         #
1437         for a in ${NSA_IP6} ${NSA_LO_IP6} ${NSA_LINKIP6}%${NSB_DEV} ${MCAST}%${NSB_DEV}
1438         do
1439                 log_start
1440                 run_cmd_nsb ${ping6} -c1 -w1 ${a}
1441                 log_test_addr ${a} $? 0 "ping in"
1442         done
1443
1444         #
1445         # local traffic, local address
1446         #
1447         for a in ${NSA_IP6} ${NSA_LO_IP6} ::1 ${NSA_LINKIP6}%${NSA_DEV} ${MCAST}%${NSA_DEV}
1448         do
1449                 log_start
1450                 run_cmd ${ping6} -c1 -w1 ${a}
1451                 log_test_addr ${a} $? 0 "ping local, no bind"
1452         done
1453
1454         for a in ${NSA_IP6} ${NSA_LINKIP6}%${NSA_DEV} ${MCAST}%${NSA_DEV}
1455         do
1456                 log_start
1457                 run_cmd ${ping6} -c1 -w1 -I ${NSA_DEV} ${a}
1458                 log_test_addr ${a} $? 0 "ping local, device bind"
1459         done
1460
1461         for a in ${NSA_LO_IP6} ::1
1462         do
1463                 log_start
1464                 show_hint "Fails since address on loopback is out of device scope"
1465                 run_cmd ${ping6} -c1 -w1 -I ${NSA_DEV} ${a}
1466                 log_test_addr ${a} $? 2 "ping local, device bind"
1467         done
1468
1469         #
1470         # ip rule blocks address
1471         #
1472         log_start
1473         setup_cmd ip -6 rule add pref 32765 from all lookup local
1474         setup_cmd ip -6 rule del pref 0 from all lookup local
1475         setup_cmd ip -6 rule add pref 50 to ${NSB_LO_IP6} prohibit
1476         setup_cmd ip -6 rule add pref 51 from ${NSB_IP6} prohibit
1477
1478         a=${NSB_LO_IP6}
1479         run_cmd ${ping6} -c1 -w1 ${a}
1480         log_test_addr ${a} $? 2 "ping out, blocked by rule"
1481
1482         log_start
1483         run_cmd ${ping6} -c1 -w1 -I ${NSA_DEV} ${a}
1484         log_test_addr ${a} $? 2 "ping out, device bind, blocked by rule"
1485
1486         a=${NSA_LO_IP6}
1487         log_start
1488         show_hint "Response lost due to ip rule"
1489         run_cmd_nsb ${ping6} -c1 -w1 ${a}
1490         log_test_addr ${a} $? 1 "ping in, blocked by rule"
1491
1492         setup_cmd ip -6 rule add pref 0 from all lookup local
1493         setup_cmd ip -6 rule del pref 32765 from all lookup local
1494         setup_cmd ip -6 rule del pref 50 to ${NSB_LO_IP6} prohibit
1495         setup_cmd ip -6 rule del pref 51 from ${NSB_IP6} prohibit
1496
1497         #
1498         # route blocks reachability to remote address
1499         #
1500         log_start
1501         setup_cmd ip -6 route del ${NSB_LO_IP6}
1502         setup_cmd ip -6 route add unreachable ${NSB_LO_IP6} metric 10
1503         setup_cmd ip -6 route add unreachable ${NSB_IP6} metric 10
1504
1505         a=${NSB_LO_IP6}
1506         run_cmd ${ping6} -c1 -w1 ${a}
1507         log_test_addr ${a} $? 2 "ping out, blocked by route"
1508
1509         log_start
1510         run_cmd ${ping6} -c1 -w1 -I ${NSA_DEV} ${a}
1511         log_test_addr ${a} $? 2 "ping out, device bind, blocked by route"
1512
1513         a=${NSA_LO_IP6}
1514         log_start
1515         show_hint "Response lost due to ip route"
1516         run_cmd_nsb ${ping6} -c1 -w1 ${a}
1517         log_test_addr ${a} $? 1 "ping in, blocked by route"
1518
1519
1520         #
1521         # remove 'remote' routes; fallback to default
1522         #
1523         log_start
1524         setup_cmd ip -6 ro del unreachable ${NSB_LO_IP6}
1525         setup_cmd ip -6 ro del unreachable ${NSB_IP6}
1526
1527         a=${NSB_LO_IP6}
1528         run_cmd ${ping6} -c1 -w1 ${a}
1529         log_test_addr ${a} $? 2 "ping out, unreachable route"
1530
1531         log_start
1532         run_cmd ${ping6} -c1 -w1 -I ${NSA_DEV} ${a}
1533         log_test_addr ${a} $? 2 "ping out, device bind, unreachable route"
1534 }
1535
1536 ipv6_ping_vrf()
1537 {
1538         local a
1539
1540         # should default on; does not exist on older kernels
1541         set_sysctl net.ipv4.raw_l3mdev_accept=1 2>/dev/null
1542
1543         #
1544         # out
1545         #
1546         for a in ${NSB_IP6} ${NSB_LO_IP6}
1547         do
1548                 log_start
1549                 run_cmd ${ping6} -c1 -w1 -I ${VRF} ${a}
1550                 log_test_addr ${a} $? 0 "ping out, VRF bind"
1551         done
1552
1553         for a in ${NSB_LINKIP6}%${VRF} ${MCAST}%${VRF}
1554         do
1555                 log_start
1556                 show_hint "Fails since VRF device does not support linklocal or multicast"
1557                 run_cmd ${ping6} -c1 -w1 ${a}
1558                 log_test_addr ${a} $? 2 "ping out, VRF bind"
1559         done
1560
1561         for a in ${NSB_IP6} ${NSB_LO_IP6} ${NSB_LINKIP6}%${NSA_DEV} ${MCAST}%${NSA_DEV}
1562         do
1563                 log_start
1564                 run_cmd ${ping6} -c1 -w1 -I ${NSA_DEV} ${a}
1565                 log_test_addr ${a} $? 0 "ping out, device bind"
1566         done
1567
1568         for a in ${NSB_IP6} ${NSB_LO_IP6} ${NSB_LINKIP6}%${NSA_DEV}
1569         do
1570                 log_start
1571                 run_cmd ip vrf exec ${VRF} ${ping6} -c1 -w1 -I ${VRF_IP6} ${a}
1572                 log_test_addr ${a} $? 0 "ping out, vrf device+address bind"
1573         done
1574
1575         #
1576         # in
1577         #
1578         for a in ${NSA_IP6} ${VRF_IP6} ${NSA_LINKIP6}%${NSB_DEV} ${MCAST}%${NSB_DEV}
1579         do
1580                 log_start
1581                 run_cmd_nsb ${ping6} -c1 -w1 ${a}
1582                 log_test_addr ${a} $? 0 "ping in"
1583         done
1584
1585         a=${NSA_LO_IP6}
1586         log_start
1587         show_hint "Fails since loopback address is out of VRF scope"
1588         run_cmd_nsb ${ping6} -c1 -w1 ${a}
1589         log_test_addr ${a} $? 1 "ping in"
1590
1591         #
1592         # local traffic, local address
1593         #
1594         for a in ${NSA_IP6} ${VRF_IP6} ::1
1595         do
1596                 log_start
1597                 show_hint "Source address should be ${a}"
1598                 run_cmd ${ping6} -c1 -w1 -I ${VRF} ${a}
1599                 log_test_addr ${a} $? 0 "ping local, VRF bind"
1600         done
1601
1602         for a in ${NSA_IP6} ${NSA_LINKIP6}%${NSA_DEV} ${MCAST}%${NSA_DEV}
1603         do
1604                 log_start
1605                 run_cmd ${ping6} -c1 -w1 -I ${NSA_DEV} ${a}
1606                 log_test_addr ${a} $? 0 "ping local, device bind"
1607         done
1608
1609         # LLA to GUA - remove ipv6 global addresses from ns-B
1610         setup_cmd_nsb ip -6 addr del ${NSB_IP6}/64 dev ${NSB_DEV}
1611         setup_cmd_nsb ip -6 addr del ${NSB_LO_IP6}/128 dev lo
1612         setup_cmd_nsb ip -6 ro add ${NSA_IP6}/128 via ${NSA_LINKIP6} dev ${NSB_DEV}
1613
1614         for a in ${NSA_IP6} ${VRF_IP6}
1615         do
1616                 log_start
1617                 run_cmd_nsb ${ping6} -c1 -w1 ${NSA_IP6}
1618                 log_test_addr ${a} $? 0 "ping in, LLA to GUA"
1619         done
1620
1621         setup_cmd_nsb ip -6 ro del ${NSA_IP6}/128 via ${NSA_LINKIP6} dev ${NSB_DEV}
1622         setup_cmd_nsb ip -6 addr add ${NSB_IP6}/64 dev ${NSB_DEV}
1623         setup_cmd_nsb ip -6 addr add ${NSB_LO_IP6}/128 dev lo
1624
1625         #
1626         # ip rule blocks address
1627         #
1628         log_start
1629         setup_cmd ip -6 rule add pref 50 to ${NSB_LO_IP6} prohibit
1630         setup_cmd ip -6 rule add pref 51 from ${NSB_IP6} prohibit
1631
1632         a=${NSB_LO_IP6}
1633         run_cmd ${ping6} -c1 -w1 ${a}
1634         log_test_addr ${a} $? 2 "ping out, blocked by rule"
1635
1636         log_start
1637         run_cmd ${ping6} -c1 -w1 -I ${NSA_DEV} ${a}
1638         log_test_addr ${a} $? 2 "ping out, device bind, blocked by rule"
1639
1640         a=${NSA_LO_IP6}
1641         log_start
1642         show_hint "Response lost due to ip rule"
1643         run_cmd_nsb ${ping6} -c1 -w1 ${a}
1644         log_test_addr ${a} $? 1 "ping in, blocked by rule"
1645
1646         log_start
1647         setup_cmd ip -6 rule del pref 50 to ${NSB_LO_IP6} prohibit
1648         setup_cmd ip -6 rule del pref 51 from ${NSB_IP6} prohibit
1649
1650         #
1651         # remove 'remote' routes; fallback to default
1652         #
1653         log_start
1654         setup_cmd ip -6 ro del ${NSB_LO_IP6} vrf ${VRF}
1655
1656         a=${NSB_LO_IP6}
1657         run_cmd ${ping6} -c1 -w1 ${a}
1658         log_test_addr ${a} $? 2 "ping out, unreachable route"
1659
1660         log_start
1661         run_cmd ${ping6} -c1 -w1 -I ${NSA_DEV} ${a}
1662         log_test_addr ${a} $? 2 "ping out, device bind, unreachable route"
1663
1664         ip -netns ${NSB} -6 ro del ${NSA_LO_IP6}
1665         a=${NSA_LO_IP6}
1666         log_start
1667         run_cmd_nsb ${ping6} -c1 -w1 ${a}
1668         log_test_addr ${a} $? 2 "ping in, unreachable route"
1669 }
1670
1671 ipv6_ping()
1672 {
1673         log_section "IPv6 ping"
1674
1675         log_subsection "No VRF"
1676         setup
1677         ipv6_ping_novrf
1678
1679         log_subsection "With VRF"
1680         setup "yes"
1681         ipv6_ping_vrf
1682 }
1683
1684 ################################################################################
1685 # IPv6 TCP
1686
1687 ipv6_tcp_novrf()
1688 {
1689         local a
1690
1691         #
1692         # server tests
1693         #
1694         for a in ${NSA_IP6} ${NSA_LO_IP6} ${NSA_LINKIP6}%${NSB_DEV}
1695         do
1696                 log_start
1697                 run_cmd nettest -6 -s &
1698                 sleep 1
1699                 run_cmd_nsb nettest -6 -r ${a}
1700                 log_test_addr ${a} $? 0 "Global server"
1701         done
1702
1703         # verify TCP reset received
1704         for a in ${NSA_IP6} ${NSA_LO_IP6} ${NSA_LINKIP6}%${NSB_DEV}
1705         do
1706                 log_start
1707                 show_hint "Should fail 'Connection refused'"
1708                 run_cmd_nsb nettest -6 -r ${a}
1709                 log_test_addr ${a} $? 1 "No server"
1710         done
1711
1712         #
1713         # client
1714         #
1715         for a in ${NSB_IP6} ${NSB_LO_IP6} ${NSB_LINKIP6}%${NSA_DEV}
1716         do
1717                 log_start
1718                 run_cmd_nsb nettest -6 -s &
1719                 sleep 1
1720                 run_cmd nettest -6 -r ${a}
1721                 log_test_addr ${a} $? 0 "Client"
1722         done
1723
1724         for a in ${NSB_IP6} ${NSB_LO_IP6} ${NSB_LINKIP6}%${NSA_DEV}
1725         do
1726                 log_start
1727                 run_cmd_nsb nettest -6 -s &
1728                 sleep 1
1729                 run_cmd nettest -6 -r ${a} -d ${NSA_DEV}
1730                 log_test_addr ${a} $? 0 "Client, device bind"
1731         done
1732
1733         for a in ${NSB_IP6} ${NSB_LO_IP6} ${NSB_LINKIP6}%${NSA_DEV}
1734         do
1735                 log_start
1736                 show_hint "Should fail 'Connection refused'"
1737                 run_cmd nettest -6 -r ${a} -d ${NSA_DEV}
1738                 log_test_addr ${a} $? 1 "No server, device client"
1739         done
1740
1741         #
1742         # local address tests
1743         #
1744         for a in ${NSA_IP6} ${NSA_LO_IP6} ::1
1745         do
1746                 log_start
1747                 run_cmd nettest -6 -s &
1748                 sleep 1
1749                 run_cmd nettest -6 -r ${a}
1750                 log_test_addr ${a} $? 0 "Global server, local connection"
1751         done
1752
1753         a=${NSA_IP6}
1754         log_start
1755         run_cmd nettest -6 -s -d ${NSA_DEV} -2 ${NSA_DEV} &
1756         sleep 1
1757         run_cmd nettest -6 -r ${a} -0 ${a}
1758         log_test_addr ${a} $? 0 "Device server, unbound client, local connection"
1759
1760         for a in ${NSA_LO_IP6} ::1
1761         do
1762                 log_start
1763                 show_hint "Should fail 'Connection refused' since addresses on loopback are out of device scope"
1764                 run_cmd nettest -6 -s -d ${NSA_DEV} &
1765                 sleep 1
1766                 run_cmd nettest -6 -r ${a}
1767                 log_test_addr ${a} $? 1 "Device server, unbound client, local connection"
1768         done
1769
1770         a=${NSA_IP6}
1771         log_start
1772         run_cmd nettest -6 -s &
1773         sleep 1
1774         run_cmd nettest -6 -r ${a} -d ${NSA_DEV} -0 ${a}
1775         log_test_addr ${a} $? 0 "Global server, device client, local connection"
1776
1777         for a in ${NSA_LO_IP6} ::1
1778         do
1779                 log_start
1780                 show_hint "Should fail 'Connection refused' since addresses on loopback are out of device scope"
1781                 run_cmd nettest -6 -s &
1782                 sleep 1
1783                 run_cmd nettest -6 -r ${a} -d ${NSA_DEV}
1784                 log_test_addr ${a} $? 1 "Global server, device client, local connection"
1785         done
1786
1787         for a in ${NSA_IP6} ${NSA_LINKIP6}
1788         do
1789                 log_start
1790                 run_cmd nettest -6 -s -d ${NSA_DEV} -2 ${NSA_DEV} &
1791                 sleep 1
1792                 run_cmd nettest -6  -d ${NSA_DEV} -r ${a}
1793                 log_test_addr ${a} $? 0 "Device server, device client, local conn"
1794         done
1795
1796         for a in ${NSA_IP6} ${NSA_LINKIP6}
1797         do
1798                 log_start
1799                 show_hint "Should fail 'Connection refused'"
1800                 run_cmd nettest -6 -d ${NSA_DEV} -r ${a}
1801                 log_test_addr ${a} $? 1 "No server, device client, local conn"
1802         done
1803 }
1804
1805 ipv6_tcp_vrf()
1806 {
1807         local a
1808
1809         # disable global server
1810         log_subsection "Global server disabled"
1811
1812         set_sysctl net.ipv4.tcp_l3mdev_accept=0
1813
1814         #
1815         # server tests
1816         #
1817         for a in ${NSA_IP6} ${VRF_IP6} ${NSA_LINKIP6}%${NSB_DEV}
1818         do
1819                 log_start
1820                 show_hint "Should fail 'Connection refused' since global server with VRF is disabled"
1821                 run_cmd nettest -6 -s &
1822                 sleep 1
1823                 run_cmd_nsb nettest -6 -r ${a}
1824                 log_test_addr ${a} $? 1 "Global server"
1825         done
1826
1827         for a in ${NSA_IP6} ${VRF_IP6}
1828         do
1829                 log_start
1830                 run_cmd nettest -6 -s -d ${VRF} -2 ${VRF} &
1831                 sleep 1
1832                 run_cmd_nsb nettest -6 -r ${a}
1833                 log_test_addr ${a} $? 0 "VRF server"
1834         done
1835
1836         # link local is always bound to ingress device
1837         a=${NSA_LINKIP6}%${NSB_DEV}
1838         log_start
1839         run_cmd nettest -6 -s -d ${VRF} -2 ${NSA_DEV} &
1840         sleep 1
1841         run_cmd_nsb nettest -6 -r ${a}
1842         log_test_addr ${a} $? 0 "VRF server"
1843
1844         for a in ${NSA_IP6} ${VRF_IP6} ${NSA_LINKIP6}%${NSB_DEV}
1845         do
1846                 log_start
1847                 run_cmd nettest -6 -s -d ${NSA_DEV} -2 ${NSA_DEV} &
1848                 sleep 1
1849                 run_cmd_nsb nettest -6 -r ${a}
1850                 log_test_addr ${a} $? 0 "Device server"
1851         done
1852
1853         # verify TCP reset received
1854         for a in ${NSA_IP6} ${VRF_IP6} ${NSA_LINKIP6}%${NSB_DEV}
1855         do
1856                 log_start
1857                 show_hint "Should fail 'Connection refused'"
1858                 run_cmd_nsb nettest -6 -r ${a}
1859                 log_test_addr ${a} $? 1 "No server"
1860         done
1861
1862         # local address tests
1863         a=${NSA_IP6}
1864         log_start
1865         show_hint "Should fail 'Connection refused' since global server with VRF is disabled"
1866         run_cmd nettest -6 -s &
1867         sleep 1
1868         run_cmd nettest -6 -r ${a} -d ${NSA_DEV}
1869         log_test_addr ${a} $? 1 "Global server, local connection"
1870
1871         #
1872         # enable VRF global server
1873         #
1874         log_subsection "VRF Global server enabled"
1875         set_sysctl net.ipv4.tcp_l3mdev_accept=1
1876
1877         for a in ${NSA_IP6} ${VRF_IP6}
1878         do
1879                 log_start
1880                 run_cmd nettest -6 -s -2 ${VRF} &
1881                 sleep 1
1882                 run_cmd_nsb nettest -6 -r ${a}
1883                 log_test_addr ${a} $? 0 "Global server"
1884         done
1885
1886         for a in ${NSA_IP6} ${VRF_IP6}
1887         do
1888                 log_start
1889                 run_cmd nettest -6 -s -d ${VRF} -2 ${VRF} &
1890                 sleep 1
1891                 run_cmd_nsb nettest -6 -r ${a}
1892                 log_test_addr ${a} $? 0 "VRF server"
1893         done
1894
1895         # For LLA, child socket is bound to device
1896         a=${NSA_LINKIP6}%${NSB_DEV}
1897         log_start
1898         run_cmd nettest -6 -s -2 ${NSA_DEV} &
1899         sleep 1
1900         run_cmd_nsb nettest -6 -r ${a}
1901         log_test_addr ${a} $? 0 "Global server"
1902
1903         log_start
1904         run_cmd nettest -6 -s -d ${VRF} -2 ${NSA_DEV} &
1905         sleep 1
1906         run_cmd_nsb nettest -6 -r ${a}
1907         log_test_addr ${a} $? 0 "VRF server"
1908
1909         for a in ${NSA_IP6} ${NSA_LINKIP6}%${NSB_DEV}
1910         do
1911                 log_start
1912                 run_cmd nettest -6 -s -d ${NSA_DEV} -2 ${NSA_DEV} &
1913                 sleep 1
1914                 run_cmd_nsb nettest -6 -r ${a}
1915                 log_test_addr ${a} $? 0 "Device server"
1916         done
1917
1918         # verify TCP reset received
1919         for a in ${NSA_IP6} ${VRF_IP6} ${NSA_LINKIP6}%${NSB_DEV}
1920         do
1921                 log_start
1922                 show_hint "Should fail 'Connection refused'"
1923                 run_cmd_nsb nettest -6 -r ${a}
1924                 log_test_addr ${a} $? 1 "No server"
1925         done
1926
1927         # local address tests
1928         for a in ${NSA_IP6} ${VRF_IP6}
1929         do
1930                 log_start
1931                 show_hint "Fails 'No route to host' since client is not in VRF"
1932                 run_cmd nettest -6 -s -2 ${VRF} &
1933                 sleep 1
1934                 run_cmd nettest -6 -r ${a}
1935                 log_test_addr ${a} $? 1 "Global server, local connection"
1936         done
1937
1938
1939         #
1940         # client
1941         #
1942         for a in ${NSB_IP6} ${NSB_LO_IP6}
1943         do
1944                 log_start
1945                 run_cmd_nsb nettest -6 -s &
1946                 sleep 1
1947                 run_cmd nettest -6 -r ${a} -d ${VRF}
1948                 log_test_addr ${a} $? 0 "Client, VRF bind"
1949         done
1950
1951         a=${NSB_LINKIP6}
1952         log_start
1953         show_hint "Fails since VRF device does not allow linklocal addresses"
1954         run_cmd_nsb nettest -6 -s &
1955         sleep 1
1956         run_cmd nettest -6 -r ${a} -d ${VRF}
1957         log_test_addr ${a} $? 1 "Client, VRF bind"
1958
1959         for a in ${NSB_IP6} ${NSB_LO_IP6} ${NSB_LINKIP6}
1960         do
1961                 log_start
1962                 run_cmd_nsb nettest -6 -s &
1963                 sleep 1
1964                 run_cmd nettest -6 -r ${a} -d ${NSA_DEV}
1965                 log_test_addr ${a} $? 0 "Client, device bind"
1966         done
1967
1968         for a in ${NSB_IP6} ${NSB_LO_IP6}
1969         do
1970                 log_start
1971                 show_hint "Should fail 'Connection refused'"
1972                 run_cmd nettest -6 -r ${a} -d ${VRF}
1973                 log_test_addr ${a} $? 1 "No server, VRF client"
1974         done
1975
1976         for a in ${NSB_IP6} ${NSB_LO_IP6} ${NSB_LINKIP6}
1977         do
1978                 log_start
1979                 show_hint "Should fail 'Connection refused'"
1980                 run_cmd nettest -6 -r ${a} -d ${NSA_DEV}
1981                 log_test_addr ${a} $? 1 "No server, device client"
1982         done
1983
1984         for a in ${NSA_IP6} ${VRF_IP6} ::1
1985         do
1986                 log_start
1987                 run_cmd nettest -6 -s -d ${VRF} -2 ${VRF} &
1988                 sleep 1
1989                 run_cmd nettest -6 -r ${a} -d ${VRF} -0 ${a}
1990                 log_test_addr ${a} $? 0 "VRF server, VRF client, local connection"
1991         done
1992
1993         a=${NSA_IP6}
1994         log_start
1995         run_cmd nettest -6 -s -d ${VRF} -2 ${VRF} &
1996         sleep 1
1997         run_cmd nettest -6 -r ${a} -d ${NSA_DEV} -0 ${a}
1998         log_test_addr ${a} $? 0 "VRF server, device client, local connection"
1999
2000         a=${NSA_IP6}
2001         log_start
2002         show_hint "Should fail since unbound client is out of VRF scope"
2003         run_cmd nettest -6 -s -d ${VRF} &
2004         sleep 1
2005         run_cmd nettest -6 -r ${a}
2006         log_test_addr ${a} $? 1 "VRF server, unbound client, local connection"
2007
2008         log_start
2009         run_cmd nettest -6 -s -d ${NSA_DEV} -2 ${NSA_DEV} &
2010         sleep 1
2011         run_cmd nettest -6 -r ${a} -d ${VRF} -0 ${a}
2012         log_test_addr ${a} $? 0 "Device server, VRF client, local connection"
2013
2014         for a in ${NSA_IP6} ${NSA_LINKIP6}
2015         do
2016                 log_start
2017                 run_cmd nettest -6 -s -d ${NSA_DEV} -2 ${NSA_DEV} &
2018                 sleep 1
2019                 run_cmd nettest -6 -r ${a} -d ${NSA_DEV} -0 ${a}
2020                 log_test_addr ${a} $? 0 "Device server, device client, local connection"
2021         done
2022 }
2023
2024 ipv6_tcp()
2025 {
2026         log_section "IPv6/TCP"
2027
2028         which nettest >/dev/null
2029         if [ $? -ne 0 ]; then
2030                 log_error "nettest not found; skipping tests"
2031                 return
2032         fi
2033
2034         log_subsection "No VRF"
2035         setup
2036
2037         # tcp_l3mdev_accept should have no affect without VRF;
2038         # run tests with it enabled and disabled to verify
2039         log_subsection "tcp_l3mdev_accept disabled"
2040         set_sysctl net.ipv4.tcp_l3mdev_accept=0
2041         ipv6_tcp_novrf
2042         log_subsection "tcp_l3mdev_accept enabled"
2043         set_sysctl net.ipv4.tcp_l3mdev_accept=1
2044         ipv6_tcp_novrf
2045
2046         log_subsection "With VRF"
2047         setup "yes"
2048         ipv6_tcp_vrf
2049 }
2050
2051 ################################################################################
2052 # usage
2053
2054 usage()
2055 {
2056         cat <<EOF
2057 usage: ${0##*/} OPTS
2058
2059         -4          IPv4 tests only
2060         -6          IPv6 tests only
2061         -t <test>   Test name/set to run
2062         -p          Pause on fail
2063         -P          Pause after each test
2064         -v          Be verbose
2065 EOF
2066 }
2067
2068 ################################################################################
2069 # main
2070
2071 TESTS_IPV4="ipv4_ping ipv4_tcp ipv4_udp"
2072 TESTS_IPV6="ipv6_ping ipv6_tcp"
2073 PAUSE_ON_FAIL=no
2074 PAUSE=no
2075
2076 while getopts :46t:pPvh o
2077 do
2078         case $o in
2079                 4) TESTS=ipv4;;
2080                 6) TESTS=ipv6;;
2081                 t) TESTS=$OPTARG;;
2082                 p) PAUSE_ON_FAIL=yes;;
2083                 P) PAUSE=yes;;
2084                 v) VERBOSE=1;;
2085                 h) usage; exit 0;;
2086                 *) usage; exit 1;;
2087         esac
2088 done
2089
2090 # make sure we don't pause twice
2091 [ "${PAUSE}" = "yes" ] && PAUSE_ON_FAIL=no
2092
2093 #
2094 # show user test config
2095 #
2096 if [ -z "$TESTS" ]; then
2097         TESTS="$TESTS_IPV4 $TESTS_IPV6 $TESTS_OTHER"
2098 elif [ "$TESTS" = "ipv4" ]; then
2099         TESTS="$TESTS_IPV4"
2100 elif [ "$TESTS" = "ipv6" ]; then
2101         TESTS="$TESTS_IPV6"
2102 fi
2103
2104 declare -i nfail=0
2105 declare -i nsuccess=0
2106
2107 for t in $TESTS
2108 do
2109         case $t in
2110         ipv4_ping|ping)  ipv4_ping;;
2111         ipv4_tcp|tcp)    ipv4_tcp;;
2112         ipv4_udp|udp)    ipv4_udp;;
2113
2114         ipv6_ping|ping6) ipv6_ping;;
2115         ipv6_tcp|tcp6)   ipv6_tcp;;
2116
2117         # setup namespaces and config, but do not run any tests
2118         setup)           setup; exit 0;;
2119         vrf_setup)       setup "yes"; exit 0;;
2120
2121         help)            echo "Test names: $TESTS"; exit 0;;
2122         esac
2123 done
2124
2125 cleanup 2>/dev/null
2126
2127 printf "\nTests passed: %3d\n" ${nsuccess}
2128 printf "Tests failed: %3d\n"   ${nfail}