]> CyberLeo.Net >> Repos - FreeBSD/releng/10.0.git/blob - tools/test/netfibs/reflector.sh
- Copy stable/10 (r259064) to releng/10.0 as part of the
[FreeBSD/releng/10.0.git] / tools / test / netfibs / reflector.sh
1 #!/bin/sh
2 #-
3 # Copyright (c) 2012 Cisco Systems, Inc.
4 # All rights reserved.
5 #
6 # This software was developed by Bjoern Zeeb under contract to
7 # Cisco Systems, Inc..
8 #
9 # Redistribution and use in source and binary forms, with or without
10 # modification, are permitted provided that the following conditions
11 # are met:
12 # 1. Redistributions of source code must retain the above copyright
13 #    notice, this list of conditions and the following disclaimer.
14 # 2. Redistributions in binary form must reproduce the above copyright
15 #    notice, this list of conditions and the following disclaimer in the
16 #    documentation and/or other materials provided with the distribution.
17 #
18 # THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
19 # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20 # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21 # ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
22 # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23 # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
24 # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
25 # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
26 # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
27 # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
28 # SUCH DAMAGE.
29 #
30 # $FreeBSD$
31 #
32
33 # We will use the RFC5180 (and Errata) benchmarking working group prefix
34 # 2001:0002::/48 for testing.
35 PREFIX="2001:2:"
36
37 # Set IFACE to the real interface you want to run the test on.
38 : ${IFACE:=lo0}
39
40 # Control port we use to exchange messages between nodes to sync. tests, etc.
41 : ${CTRLPORT:=6666}
42
43 # Get the number of FIBs from the kernel.
44 RT_NUMFIBS=`sysctl -n net.fibs`
45
46 PEERADDR="2001:2:ff00::1"
47 OURADDR="2001:2:ff00::2"
48
49 OURLINKLOCAL=""
50 PEERLINKLOCAL=""
51
52 # By default all commands must succeed.  Individual tests may disable this
53 # temporary.
54 set -e
55
56 # Debug magic.
57 case "${DEBUG}" in
58 42)     set -x ;;
59 esac
60
61
62
63 #
64 # Helper functions.
65 #
66
67 # Function to avoid prelist races adding and deleting prefixes too quickly.
68 delay()
69 {
70
71         # sleep 1 is too long.
72         touch /tmp/foo || true
73         stat /tmp/foo > /dev/null 2>&1 || true
74 }
75
76 check_rc()
77 {
78         local _rc _exp _testno _testname _msg _r
79         _rc=$1
80         _exp=$2
81         _testno=$3
82         _testname="$4"
83         _msg="$5"
84
85         _r="not ok"
86         if test ${_rc} -eq ${_exp}; then
87                 _r="ok"
88         fi
89         echo "${_r} ${_testno} ${_testname} # ${_msg} ${_rc}"
90 }
91
92 print_debug()
93 {
94         local _msg
95         _msg="$*"
96
97         case ${DEBUG} in
98         ''|0)   ;;
99         *)      echo "DEBUG: ${_msg}" >&2 ;;
100         esac
101 }
102
103 die()
104 {
105         local _msg
106         _msg="$*"
107
108         echo "ERROR: ${_msg}" >&2
109         exit 1
110 }
111
112 #
113 # Test functions.
114 #
115
116 # Setup our side and wait for the peer to tell us that it is ready.
117 wait_remote_ready()
118 {
119         local _greeting _keyword _fibs _linklocal i
120
121         print_debug "Setting up interface ${IFACE}"
122         ifconfig ${IFACE} inet6 ${OURADDR}/64 -alias > /dev/null 2>&1 || true
123         delay
124         ifconfig ${IFACE} inet6 ${OURADDR}/64 alias up
125         i=0
126         while test ${i} -lt ${RT_NUMFIBS}; do
127                 ifconfig ${IFACE} inet6 2001:2:${i}::2/64 -alias \
128                     > /dev/null 2>&1 || true
129                 delay
130                 i=$((i + 1))
131         done
132         OURLINKLOCAL=`ifconfig ${IFACE} | awk '/inet6 fe80:/ { print $2 }'`
133
134         # Let things settle.
135         print_debug "Waiting 4 seconds for things to settle"
136         sleep 4
137
138         # Wait for the remote to connect and start things.
139         # We tell it the magic keyword, our number of FIBs and our link-local.
140         # It already knows our global address.
141         _greeting=`echo "SETUP ${RT_NUMFIBS} ${OURLINKLOCAL}" | \
142             nc -6 -l ${CTRLPORT}`
143
144         read _keyword _fibs _linklocal <<EOI
145 ${_greeting}
146 EOI
147         print_debug "_keyword=${_keyword}"
148         print_debug "_fibs=${_fibs}"
149         print_debug "_linklocal=${_linklocal}"
150         case ${_keyword} in
151         SETUP)  ;;
152         *)      die "Got invalid keyword in greeting: ${_greeting}"
153                 ;;
154         esac
155         if test ${_fibs} -ne ${RT_NUMFIBS}; then
156                 die "Number of FIBs not matching ours (${RT_NUMFIBS}) in" \
157                     "greeting: ${_greeting}"
158         fi
159         PEERLINKLOCAL=${_linklocal}
160
161         print_debug "Successfully received greeting. Peer at ${PEERLINKLOCAL}"
162 }
163
164 cleanup()
165 {
166
167         print_debug "Removing address from interface ${IFACE}"
168         ifconfig ${IFACE} inet6 ${OURADDR}/64 -alias
169         delay
170 }
171
172 ################################################################################
173 #
174 testtx_icmp6_connected()
175 {
176         local _opts
177
178         _opts=""
179         case ${DEBUG} in
180         ''|0)   ;;
181         42)     _opts="-d -d" ;;
182         *)      _opts="-d" ;;
183         esac
184         print_debug "./reflect -p ${CTRLPORT} -T TCP6 " \
185             "-t testtx_icmp6_connected ${_opts}"
186         ./reflect -p ${CTRLPORT} -T TCP6 -t testtx_icmp6_connected ${_opts}
187         print_debug "reflect terminated without error."
188 }
189
190 testtx_tcp6_connected()
191 {
192         local _opts
193
194         _opts=""
195         case ${DEBUG} in
196         ''|0)   ;;
197         42)     _opts="-d -d" ;;
198         *)      _opts="-d" ;;
199         esac
200         print_debug "./reflect -p ${CTRLPORT} -T TCP6 " \
201             "-t testtx_tcp6_connected ${_opts}"
202         ./reflect -p ${CTRLPORT} -T TCP6 -t testtx_tcp6_connected ${_opts}
203         print_debug "reflect terminated without error."
204 }
205
206 testtx_udp6_connected()
207 {
208         local _opts
209
210         _opts=""
211         case ${DEBUG} in
212         ''|0)   ;;
213         42)     _opts="-d -d" ;;
214         *)      _opts="-d" ;;
215         esac
216         print_debug "./reflect -p ${CTRLPORT} -T UDP6 " \
217             "-t testtx_udp6_connected ${_opts}"
218         ./reflect -p ${CTRLPORT} -T UDP6 -t testtx_udp6_connected ${_opts}
219         print_debug "reflect terminated without error."
220 }
221
222 ################################################################################
223 #
224 testtx_icmp6_connected_blackhole()
225 {
226         local _opts fib
227
228         _opts=""
229         case ${DEBUG} in
230         ''|0)   ;;
231         42)     _opts="-d -d" ;;
232         *)      _opts="-d" ;;
233         esac
234
235         fib=0
236         while test ${fib} -lt ${RT_NUMFIBS}; do
237                 print_debug "./reflect -p ${CTRLPORT} -T TCP6 " \
238                     "-t testtx_icmp6_connected_blackhole${fib} ${_opts}"
239                 ./reflect -p ${CTRLPORT} -T TCP6 \
240                     -t testtx_icmp6_connected_blackhole${fib} ${_opts}
241                 print_debug "reflect terminated without error."
242                 fib=$((fib + 1))
243         done
244 }
245
246 testtx_tcp6_connected_blackhole()
247 {
248         local _opts fib
249
250         _opts=""
251         case ${DEBUG} in
252         ''|0)   ;;
253         42)     _opts="-d -d" ;;
254         *)      _opts="-d" ;;
255         esac
256
257         fib=0
258         while test ${fib} -lt ${RT_NUMFIBS}; do
259                 print_debug "./reflect -p ${CTRLPORT} -T TCP6 " \
260                     "-t testtx_tcp6_connected_blackhole${fib} ${_opts}"
261                 ./reflect -p ${CTRLPORT} -T TCP6 \
262                     -t testtx_tcp6_connected_blackhole${fib} ${_opts}
263                 print_debug "reflect terminated without error."
264                 fib=$((fib + 1))
265         done
266 }
267
268 testtx_udp6_connected_blackhole()
269 {
270         local _opts fib
271
272         _opts=""
273         case ${DEBUG} in
274         ''|0)   ;;
275         42)     _opts="-d -d" ;;
276         *)      _opts="-d" ;;
277         esac
278
279         fib=0
280         while test ${fib} -lt ${RT_NUMFIBS}; do
281                 print_debug "./reflect -p ${CTRLPORT} -T UDP6 " \
282                     "-t testtx_udp6_connected_blackhole${fib} ${_opts}"
283                 ./reflect -p ${CTRLPORT} -T UDP6 \
284                     -t testtx_udp6_connected_blackhole${fib} ${_opts}
285                 print_debug "reflect terminated without error."
286                 fib=$((fib + 1))
287         done
288 }
289
290 ################################################################################
291 #
292 testtx_ulp6_connected_transfernets()
293 {
294         local _opts fib _n _o
295         _n="$1"
296         _o="$2"
297
298         _opts=""
299         case ${DEBUG} in
300         ''|0)   ;;
301         42)     _opts="-d -d" ;;
302         *)      _opts="-d" ;;
303         esac
304
305         # Setup transfer networks.
306         fib=0
307         while test ${fib} -lt ${RT_NUMFIBS}; do
308                 setfib -F${fib} \
309                     ifconfig ${IFACE} inet6 2001:2:${fib}::2/64 alias
310                 fib=$((fib + 1))
311         done
312
313         fib=0
314         while test ${fib} -lt ${RT_NUMFIBS}; do
315                 print_debug "./reflect -p ${CTRLPORT} -T ${_o} -t ${_n}${fib} ${_opts}"
316                 ./reflect -p ${CTRLPORT} -T ${_o} -t ${_n}${fib} ${_opts}
317                 print_debug "reflect terminated without error."
318                 fib=$((fib + 1))
319         done
320
321         # Cleanup transfer networks.
322         fib=0
323         while test ${fib} -lt ${RT_NUMFIBS}; do
324                 setfib -F${fib} \
325                     ifconfig ${IFACE} inet6 2001:2:${fib}::2/64 -alias
326                 delay
327                 fib=$((fib + 1))
328         done
329 }
330
331 testtx_icmp6_connected_transfernets()
332 {
333
334         testtx_ulp6_connected_transfernets \
335             "testtx_icmp6_connected_transfernets" "TCP6"
336 }
337
338 testtx_tcp6_connected_transfernets()
339 {
340
341         testtx_ulp6_connected_transfernets \
342             "testtx_tcp6_connected_transfernets" "TCP6"
343 }
344
345 testtx_udp6_connected_transfernets()
346 {
347
348         testtx_ulp6_connected_transfernets \
349             "testtx_udp6_connected_transfernets" "UDP6"
350 }
351
352 testtx_icmp6_connected_ifconfig_transfernets()
353 {
354
355         testtx_ulp6_connected_transfernets \
356             "testtx_icmp6_connected_ifconfig_transfernets" "TCP6"
357 }
358
359 testtx_tcp6_connected_ifconfig_transfernets()
360 {
361
362         testtx_ulp6_connected_transfernets \
363             "testtx_tcp6_connected_ifconfig_transfernets" "TCP6"
364 }
365
366 testtx_udp6_connected_ifconfig_transfernets()
367 {
368
369         testtx_ulp6_connected_transfernets \
370             "testtx_udp6_connected_ifconfig_transfernets" "UDP6"
371 }
372
373 ################################################################################
374 #
375 testtx_ulp6_gateway()
376 {
377         local _opts _n _o
378         _n="$1"
379         _o="$2"
380
381         ifconfig lo0 inet6 2001:2:ff01::2 -alias > /dev/null 2>&1 || true
382         delay
383         ifconfig lo0 inet6 2001:2:ff01::2 alias
384
385         _opts=""
386         case ${DEBUG} in
387         ''|0)   ;;
388         42)     _opts="-d -d" ;;
389         *)      _opts="-d" ;;
390         esac
391
392         print_debug "./reflect -p ${CTRLPORT} -T ${_o} " \
393             "-t ${_n} ${_opts} -A 2001:2:ff01::2"
394         ./reflect -p ${CTRLPORT} -T ${_o} \
395             -t ${_n} ${_opts} -A 2001:2:ff01::2
396         print_debug "reflect terminated without error."
397
398         ifconfig lo0 inet6 2001:2:ff01::2 -alias
399         delay
400 }
401
402 testtx_icmp6_gateway()
403 {
404
405         testtx_ulp6_gateway "testtx_icmp6_gateway" "TCP6"
406 }
407
408 testtx_tcp6_gateway()
409 {
410
411         testtx_ulp6_gateway "testtx_tcp6_gateway" "TCP6"
412 }
413
414 testtx_udp6_gateway()
415 {
416
417         testtx_ulp6_gateway "testtx_udp6_gateway" "UDP6"
418 }
419
420 ################################################################################
421 #
422 testtx_ulp6_transfernets_gateways()
423 {
424         local _opts fib _n _o
425         _n="$1"
426         _o="$2"
427
428         _opts=""
429         case ${DEBUG} in
430         ''|0)   ;;
431         42)     _opts="-d -d" ;;
432         *)      _opts="-d" ;;
433         esac
434
435         # Setup transfer networks.
436         fib=0
437         while test ${fib} -lt ${RT_NUMFIBS}; do
438                 setfib -F${fib} \
439                     ifconfig ${IFACE} inet6 2001:2:${fib}::2/64 alias
440                 fib=$((fib + 1))
441         done
442
443         # Setup out listener IP.
444         ifconfig lo0 inet6 2001:2:ff01::2 -alias > /dev/null 2>&1 || true
445         delay
446         ifconfig lo0 inet6 2001:2:ff01::2 alias
447
448         # Reflect requests.
449         print_debug "./reflect -p ${CTRLPORT} -T ${_o} " \
450             "-t ${_n} ${_opts} -A 2001:2:ff01::2"
451         ./reflect -p ${CTRLPORT} -T ${_o} \
452             -t ${_n} ${_opts} -A 2001:2:ff01::2
453         print_debug "reflect terminated without error."
454
455         # Cleanup transfer networks and listener IP.
456         fib=0
457         while test ${fib} -lt ${RT_NUMFIBS}; do
458                 setfib -F${fib} \
459                     ifconfig ${IFACE} inet6 2001:2:${fib}::2/64 -alias
460                 delay
461                 fib=$((fib + 1))
462         done
463         ifconfig lo0 inet6 2001:2:ff01::2 -alias
464 }
465
466 testtx_icmp6_transfernets_gateways()
467 {
468
469         testtx_ulp6_transfernets_gateways \
470             "testtx_icmp6_transfernets_gateways" "TCP6"
471 }
472
473 testtx_tcp6_transfernets_gateways()
474 {
475
476         testtx_ulp6_transfernets_gateways \
477             "testtx_tcp6_transfernets_gateways" "TCP6"
478 }
479
480 testtx_udp6_transfernets_gateways()
481 {
482
483         testtx_ulp6_transfernets_gateways \
484             "testtx_udp6_transfernets_gateways" "UDP6"
485 }
486
487
488 ################################################################################
489 #
490 testtx_ulp6_transfernets_gateway()
491 {
492         local _opts fib _n _o
493         _n="$1"
494         _o="$2"
495
496         _opts=""
497         case ${DEBUG} in
498         ''|0)   ;;
499         42)     _opts="-d -d" ;;
500         *)      _opts="-d" ;;
501         esac
502
503         # Setup transfer networks.
504         fib=0
505         while test ${fib} -lt ${RT_NUMFIBS}; do
506                 setfib -F${fib} \
507                     ifconfig ${IFACE} inet6 2001:2:${fib}::2/64 alias
508                 fib=$((fib + 1))
509         done
510
511         # Setup out listener IP.
512         ifconfig lo0 inet6 2001:2:ff01::2 -alias > /dev/null 2>&1 || true
513         delay
514         ifconfig lo0 inet6 2001:2:ff01::2 alias
515
516         # Reflect requests.
517         fib=0
518         while test ${fib} -lt ${RT_NUMFIBS}; do
519                 print_debug "./reflect -p ${CTRLPORT} -T ${_o} " \
520                     "-t ${_n}${fib} ${_opts} -A 2001:2:ff01::2"
521                 ./reflect -p ${CTRLPORT} -T ${_o} \
522                     -t ${_n}${fib} ${_opts} -A 2001:2:ff01::2
523                 print_debug "reflect terminated without error."
524                 fib=$((fib + 1))
525         done
526
527         # Cleanup transfer networks and listener IP.
528         fib=0
529         while test ${fib} -lt ${RT_NUMFIBS}; do
530                 setfib -F${fib} \
531                     ifconfig ${IFACE} inet6 2001:2:${fib}::2/64 -alias
532                 delay
533                 fib=$((fib + 1))
534         done
535         ifconfig lo0 inet6 2001:2:ff01::2 -alias
536 }
537
538 testtx_icmp6_transfernets_gateway()
539 {
540
541         testtx_ulp6_transfernets_gateway \
542             "testtx_icmp6_transfernets_gateway" "TCP6"
543 }
544
545 testtx_tcp6_transfernets_gateway()
546 {
547
548         testtx_ulp6_transfernets_gateway \
549             "testtx_tcp6_transfernets_gateway" "TCP6"
550 }
551
552 testtx_udp6_transfernets_gateway()
553 {
554
555         testtx_ulp6_transfernets_gateway \
556             "testtx_udp6_transfernets_gateway" "UDP6"
557 }
558
559 ################################################################################
560 #
561 # We are receiver, but the FIBs are with us this time.
562 #
563 #
564
565 #       # For IPFW, IFCONFIG
566 #       #   For each FIB
567 #       #     Send OOB well known to work START, wait for reflect
568 #       #     Send probe, wait for reply with FIB# or RST/ICMP6 unreach
569 #       #       (in case of ICMP6 use magic like ipfw count and OOB reply)
570 #       #     Send OOB well known to work DONE, wait for reflect   
571 #       #     Compare real with expected results.
572 #
573
574 textrx_ipfw_setup()
575 {
576         local _fib _transfer i _p _o
577         _fib=$1
578         _transfer=$2
579
580         # ICMP6 would need content inspection to distinguish FIB, we can
581         # only differentiate by address.
582         # For the default single-address cases always set to current FIB.
583         ipfw add 100 setfib ${_fib} ipv6-icmp \
584             from ${PEERADDR} to ${OURADDR} \
585             via ${IFACE} in > /dev/null 2>&1
586         ipfw add 100 setfib ${_fib} ipv6-icmp \
587             from ${PEERLINKLOCAL%\%*} to ${OURLINKLOCAL%\%*} \
588             via ${IFACE} in > /dev/null 2>&1
589
590         # Always also do a setfib for the control port so that OOB
591         # signaling workes even if we remove connected subnets.
592         ipfw add 200 setfib ${_fib} ip6 from ${PEERADDR} to ${OURADDR} \
593             dst-port ${CTRLPORT} via ${IFACE} in > /dev/null 2>&1
594
595         # Save addresses
596         _p="${PEERADDR}"
597         _o="${OURADDR}"
598
599         i=0
600         while test ${i} -lt ${RT_NUMFIBS}; do
601
602                 # If doing multiple transfer networks, replace PEERADDR.
603                 case ${_transfer} in
604                 1)      PEERADDR=2001:2:${i}::1
605                         OURADDR=2001:2:${i}::2
606                         ;;
607                 esac
608
609                 if test ${_instances} -gt 1 -o ${_transfer} -eq 1; then
610                         ipfw add 400 setfib ${_fib} ipv6-icmp \
611                             from ${PEERADDR} to ${OURADDR} \
612                             icmp6types 128 \
613                             via ${IFACE} in > /dev/null 2>&1
614                 fi
615                 
616                 case ${i} in
617                 ${_fib})
618                         ipfw add 400 setfib ${_fib} ip6 \
619                             from ${PEERADDR} to ${OURADDR} \
620                             dst-port $((CTRLPORT + 1000 + i)) \
621                             via ${IFACE} in > /dev/null 2>&1
622                         ipfw add 400 setfib ${_fib} ip6 \
623                             from ${PEERLINKLOCAL%\%*} to ${OURLINKLOCAL%\%*} \
624                             dst-port $((CTRLPORT + 1000 + i)) \
625                             via ${IFACE} in > /dev/null 2>&1
626                         if test ${_instances} -le 1 -o ${_transfer} -ne 1; then
627                                 ipfw add 400 setfib ${_fib} ipv6-icmp \
628                                     from ${PEERADDR} to ${OURADDR} \
629                                     icmp6types 128 \
630                                     via ${IFACE} in > /dev/null 2>&1
631                         fi
632                         ;;
633                 esac
634
635                 i=$((i + 1))
636         done
637
638         # Restore addresses.
639         PEERADDR="${_p}"
640         OURADDR="${_o}"
641
642         case ${DEBUG} in
643         ''|0)   ;;
644         *)      ipfw show ;;
645         esac
646 }
647
648 textrx_ifconfig_setup()
649 {
650         local _fib
651         _fib=$1
652
653         ifconfig ${IFACE} fib ${_fib} > /dev/null 2>&1
654 }
655
656 textrx_ipfw_cleanup()
657 {
658         local i
659
660         case ${DEBUG} in
661         ''|0)   ;;
662         *)      ipfw show ;;
663         esac
664
665         ipfw delete 100 > /dev/null 2>&1 || true
666         ipfw delete 200 > /dev/null 2>&1 || true
667         ipfw delete 400 > /dev/null 2>&1 || true
668
669         i=0
670         while test ${i} -lt ${RT_NUMFIBS}; do
671
672                 ipfw delete $((1000 + i)) > /dev/null 2>&1 || true
673                 i=$((i + 1))
674         done
675 }
676
677 textrx_ifconfig_cleanup()
678 {
679
680         ifconfig ${IFACE} fib 0 > /dev/null 2>&1
681 }
682
683 textrx_count_setup()
684 {
685         local i
686
687         i=0
688         while test ${i} -lt ${RT_NUMFIBS}; do
689
690                 # Count ICMP6 echo replies.
691                 ipfw add $((500 + i)) count ipv6-icmp from any to any \
692                     icmp6types 129 fib ${i} via ${IFACE} out > /dev/null 2>&1
693                 ipfw add $((500 + i)) count tcp from any to any \
694                     fib ${i} via ${IFACE} out > /dev/null 2>&1
695                 ipfw add $((500 + i)) count udp from any to any \
696                     fib ${i} via ${IFACE} out > /dev/null 2>&1
697                 i=$((i + 1))
698         done
699 }
700
701 textrx_count_results()
702 {
703         local _fib _o i _rstr _c _req _p _opts
704         _fib=$1
705         _o="$2"
706
707         case ${DEBUG} in
708         ''|0)   ;;
709         *)      ipfw show ;;
710         esac
711
712         _rstr=""
713         i=0
714         while test ${i} -lt ${RT_NUMFIBS}; do
715
716                 case "${_o}" in
717                 "-i")   _c=`ipfw show $((500 + i)) | awk '/ ipv6-icmp / { print $2 }'` ;;
718                 "-u")   _c=`ipfw show $((500 + i)) | awk '/ udp / { print $2 }'` ;;
719                 *)      _c=`ipfw show $((500 + i)) | awk '/ tcp / { print $2 }'` ;;
720                 esac
721                 _rstr="${_rstr}${i} ${_c},"
722
723                 ipfw delete $((500 + i)) > /dev/null 2>&1 || true
724                 i=$((i + 1))
725         done
726
727         # We do not care about the request.
728         _req=`echo "RESULT ${_rstr}" | nc -V ${_fib} -6 -l ${CTRLPORT}`
729         print_debug "$? -- ${_req} -- RESULT ${_rstr}"
730 }
731
732 testrx_remove_connected()
733 {
734         local _fib _transfer i j _prefix
735         _fib=$1
736         _transfer=$2
737
738         if test ${_transfer} -eq 1; then
739                 i=0
740                 while test ${i} -lt ${RT_NUMFIBS}; do
741                         j=0
742                         while test ${j} -lt ${RT_NUMFIBS}; do
743                                 _prefix="2001:2:${j}::"
744
745                                 case ${j} in
746                                 ${_fib});;
747                                 *)      print_debug "setfib -F${i} route delete" \
748                                             "-inet6 -net ${_prefix}"
749                                         setfib -F${i} route delete -inet6 -net \
750                                             ${_prefix} > /dev/null 2>&1
751                                         ;;
752                                 esac
753                                 j=$((j + 1))
754                         done
755                         i=$((i + 1))
756                 done
757
758         else
759                 _prefix=${OURADDR%2}    # Luckily we know the details.
760                 i=0
761                 while test ${i} -lt ${RT_NUMFIBS}; do
762
763                         case ${i} in
764                         ${_fib});;
765                         *)      print_debug "setfib -F${i} route delete" \
766                                     "-inet6 -net ${_prefix}"
767                                 setfib -F${i} route delete -inet6 -net \
768                                     ${_prefix} > /dev/null 2>&1
769                                 ;;
770                         esac
771
772                         i=$((i + 1))
773                 done
774         fi
775 }
776
777 testrx_cleanup_connected()
778 {
779         local _fib _transfer i _prefix
780         _fib=$1
781         _transfer=$2
782
783         if test ${_transfer} -eq 1; then
784
785                 i=0
786                 while test ${i} -lt ${RT_NUMFIBS}; do
787                         setfib -F${i} \
788                            ifconfig ${IFACE} inet6 2001:2:${i}::2/64 -alias \
789                             > /dev/null 2>&1
790                         delay
791                         i=$((i + 1))
792                 done
793
794         else
795                 # Use the hammer removing the address and adding it again to get
796                 # the connected subnet back to all FIBs.  Hard to do otherwise.
797                 ifconfig ${IFACE} inet6 ${OURADDR}/64 -alias || true
798                 delay
799                 ifconfig ${IFACE} inet6 ${OURADDR}/64 alias up
800         fi
801 }
802
803 testrx_setup_transfer_networks()
804 {
805         local i
806
807         i=0
808         while test ${i} -lt ${RT_NUMFIBS}; do
809                 ifconfig ${IFACE} inet6 2001:2:${i}::2/64 -alias \
810                     > /dev/null 2>&1 || true
811                 delay
812                 ifconfig ${IFACE} inet6 2001:2:${i}::2/64 alias
813                 i=$((i + 1))
814         done
815 }
816
817 testrx_run_one()
818 {
819         local _fib _txt _opts
820         _fib=$1
821         _txt="$2"
822         _opts="$3"
823
824         case ${USE_SOSETFIB} in
825         0)      print_debug "setfib -F${_fib} ./reflect -p ${CTRLPORT}" \
826                     "-t ${_txt} ${_opts}"
827                 setfib -F${_fib} ./reflect -p ${CTRLPORT} -t ${_txt} ${_opts}
828                 ;;
829         1)      print_debug "./reflect -F${_fib} -p ${CTRLPORT} -t ${_txt}" \
830                     "${_opts}"
831                 ./reflect -F${_fib} -p ${CTRLPORT} -t ${_txt} ${_opts}
832                 ;;
833         *)      die "Invalid value for USE_SOSETFIB: ${USE_SOSETFIB}" ;;
834         esac
835         print_debug "reflect '${_txt}' terminated without error."
836 }
837
838 testrx_run_multiple()
839 {
840         local _fib _txt _opts i _jobs _p _w
841         _fib=$1
842         _txt="$2"
843         _opts="$3"
844
845         i=0
846         _jobs=""
847         while test ${i} -lt ${RT_NUMFIBS}; do
848                 case ${USE_SOSETFIB} in
849                 0)      print_debug "setfib -F${i} ./reflect" \
850                             "-p $((CTRLPORT + 1000 + i))" \
851                             "-t ${_txt} ${_opts} -N -f ${i} &"
852                         setfib -F${i} ./reflect -p $((CTRLPORT + 1000 + i)) \
853                             -t ${_txt} ${_opts} -N -f ${i} &
854                         ;;
855                 1)      print_debug "./reflect -F ${i}" \
856                             "-p $((CTRLPORT + 1000 + i))" \
857                             "-t ${_txt} ${_opts} -N -f ${i} &"
858                         ./reflect -F ${i} -p $((CTRLPORT + 1000 + i)) \
859                             -t ${_txt} ${_opts} -N -f ${i} &
860                         ;;
861                 *)      die "Invalid value for USE_SOSETFIB: ${USE_SOSETFIB}" ;;
862                 esac
863                 _p=$!
864                 _jobs="${_jobs}${_p} "
865                 case ${i} in
866                 ${_fib}) _w=${_p} ;;
867                 esac
868                 i=$((i + 1))
869         done
870
871         # Start OOB control connection for START/DONE.
872         testrx_run_one ${_fib} "${_txt}" "${_opts}"
873         print_debug "KILL ${_jobs}"
874         for i in ${_jobs}; do
875                 kill ${i} || true
876         done
877         #killall reflect || true
878         print_debug "reflects for '${_txt}' terminated without error."
879 }
880
881 testrx_run_test()
882 {
883         local _n _t _fib _o _txt i _f _instance _destructive _transfer
884         _n="$1"
885         _t="$2"
886         _fib=$3
887         _o="$4"
888         _instances=$5
889         _destructive=$6
890         _transfer=$7
891
892         : ${_destructive:=0}
893
894         _opts=""
895         case ${DEBUG} in
896         ''|0)   ;;
897         42)     _opts="-d -d" ;;
898         *)      _opts="-d" ;;
899         esac
900
901         # Convert netcat options to reflect aguments.
902         case "${_o}" in
903         -i)     _opts="${_opts} -T TCP6" ;;     # Use TCP for START/DONE.
904         -u)     _opts="${_opts} -T UDP6" ;;
905         *)      _opts="${_opts} -T TCP6" ;;
906         esac
907
908         # Combined test case base name.
909         case ${USE_SOSETFIB} in
910         0)      _f="setfib" ;;
911         1)      _f="so_setfib" ;;
912         *)      die "Unexpected value for SO_SETFIB: ${SO_SETFIB}" ;;
913         esac
914
915         _txt="${_n}_${_f}_${_t}_${_fib}_${_instances}_${_destructive}_${_transfer}"
916
917         case ${_transfer} in
918         1)      testrx_setup_transfer_networks ;;
919         esac
920
921         case "${_t}" in
922         ipfw)           textrx_ipfw_setup ${_fib} ${_transfer} ${_instances} ;;
923         ifconfig)       textrx_ifconfig_setup ${_fib} ;;
924         *)              die "Invalid type in ${_txt}" ;;
925         esac
926
927         # Setup unresponsive FIBs.
928         case ${_destructive} in
929         1)      testrx_remove_connected ${_fib} ${_transfer} ;;
930         esac
931
932         # Setup to get result counts.
933         textrx_count_setup
934
935         # Run just one / one per FIB (with incremental ports).
936         #case ${_instances} in
937         #1)     testrx_run_one ${_fib} "${_txt}" "${_opts}" ;;
938         #*)     testrx_run_multiple ${_fib} "${_txt}" "${_opts}" ;;
939         #esac
940         testrx_run_multiple ${_fib} "${_txt}" "${_opts}" ${_transfer}
941
942         # Export result counts.
943         textrx_count_results ${_fib} "${_o}"
944
945         # Cleanup unresponsive  FIBs or multiple prefixes.
946         if test ${_destructive} -eq 1 -o ${_transfer} -eq 1; then
947                 testrx_cleanup_connected ${_fib} ${_transfer}
948         fi
949
950         case "${_t}" in
951         ipfw)           textrx_ipfw_cleanup ;;
952         ifconfig)       textrx_ifconfig_cleanup ;;
953         *)              die "Invalid type in ${_txt}" ;;
954         esac
955 }
956
957 testrx_main()
958 {
959         local _n _o s t fib _instances _destructive
960         _n="$1"
961         _o="$2"
962         _instances=$3
963
964         : ${_instances:=1}
965
966         print_debug "${_n}"
967         for _transfer in 1 0; do
968                 for _destructive in 0 1; do
969                         for t in ipfw ifconfig; do
970
971                                 print_debug "${_n}_${t}"
972                                 fib=0
973                                 while test ${fib} -lt ${RT_NUMFIBS}; do
974
975                                         print_debug "${_n}_${t}_${fib}" \
976                                             "${_instances} ${_destructive}" \
977                                             "${_transfer}"
978                                         testrx_run_test "${_n}" "${t}" ${fib} \
979                                            "${_o}" ${_instances} \
980                                            ${_destructive} ${_transfer}
981
982                                         fib=$((fib + 1))
983                                 done
984                         done
985                 done
986         done
987 }
988
989 ################################################################################
990 #
991 # Probe all FIBs with one "active" one a time.
992 #
993 testrx_icmp6_same_addr_one_fib_a_time()
994 {
995
996         testrx_main "testrx_icmp6_same_addr_one_fib_a_time" "-i"
997 }
998
999 testrx_tcp6_same_addr_one_fib_a_time()
1000 {
1001
1002         testrx_main "testrx_tcp6_same_addr_one_fib_a_time" ""
1003 }
1004
1005 testrx_udp6_same_addr_one_fib_a_time()
1006 {
1007
1008         testrx_main "testrx_udp6_same_addr_one_fib_a_time" "-u"
1009 }
1010
1011 ################################################################################
1012 #
1013 # Probe all FIBs with all "active" all time.
1014 #
1015 testrx_tcp6_same_addr_all_fibs_a_time()
1016 {
1017
1018         testrx_main "testrx_tcp6_same_addr_all_fibs_a_time" "" ${RT_NUMFIBS}
1019 }
1020
1021 testrx_udp6_same_addr_all_fibs_a_time()
1022 {
1023
1024         testrx_main "testrx_udp6_same_addr_all_fibs_a_time" "-u" ${RT_NUMFIBS}
1025 }
1026
1027
1028 ################################################################################
1029 #
1030 # Prereqs.
1031 #
1032 if test `sysctl -n security.jail.jailed` -eq 0; then
1033         kldload ipfw > /dev/null 2>&1 || kldstat -v | grep -q ipfw 
1034 fi
1035 ipfw -f flush > /dev/null 2>&1 || die "please load ipfw in base system"
1036 ipfw add 65000 permit ip from any to any > /dev/null 2>&1
1037 killall reflect || true
1038
1039 ################################################################################
1040 #
1041 # Run tests.
1042 #
1043 wait_remote_ready
1044
1045 # We are receiver reflecting the input back.
1046 for uso in 0 1; do
1047
1048         # Only run ICMP6 tests for the first loop.
1049         test ${uso} -ne 0 || testtx_icmp6_connected
1050         testtx_tcp6_connected
1051         testtx_udp6_connected
1052
1053         test ${uso} -ne 0 || testtx_icmp6_connected_blackhole
1054         testtx_tcp6_connected_blackhole
1055         testtx_udp6_connected_blackhole
1056
1057         test ${uso} -ne 0 || testtx_icmp6_connected_transfernets
1058         testtx_tcp6_connected_transfernets
1059         testtx_udp6_connected_transfernets
1060
1061         test ${uso} -ne 0 || testtx_icmp6_connected_ifconfig_transfernets
1062         testtx_tcp6_connected_ifconfig_transfernets
1063         testtx_udp6_connected_ifconfig_transfernets
1064
1065         test ${uso} -ne 0 || testtx_icmp6_gateway
1066         testtx_tcp6_gateway
1067         testtx_udp6_gateway
1068
1069         test ${uso} -ne 0 || testtx_icmp6_transfernets_gateways
1070         testtx_tcp6_transfernets_gateways
1071         testtx_udp6_transfernets_gateways
1072
1073         test ${uso} -ne 0 || testtx_icmp6_transfernets_gateway
1074         testtx_tcp6_transfernets_gateway
1075         testtx_udp6_transfernets_gateway
1076 done
1077
1078 ipfw -f flush > /dev/null 2>&1
1079 ipfw add 65000 permit ip from any to any > /dev/null 2>&1
1080
1081 # We are receiver, but the FIBs are with us this time.
1082 for uso in 0 1; do
1083
1084         USE_SOSETFIB=${uso}
1085         
1086         # Only expect ICMP6 tests for the first loop.
1087         test ${uso} -ne 0 || testrx_icmp6_same_addr_one_fib_a_time
1088         testrx_tcp6_same_addr_one_fib_a_time
1089         testrx_udp6_same_addr_one_fib_a_time
1090
1091         testrx_tcp6_same_addr_all_fibs_a_time
1092         testrx_udp6_same_addr_all_fibs_a_time
1093
1094 done
1095
1096 cleanup
1097
1098 # end