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