Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/tools/test/netfibs/forwarding.sh
39536 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
# Test setup:
33
#
34
# left ------------------------- middle ------------------------- right
35
# IFACE IFACE IFACEFAR IFACE
36
# LEFTADDR MIDDLELEFTADDR MIDDLERIGHTADDR RIGHTADDR
37
# forwarding=1
38
# initiator FIB tests reflector
39
40
# We will use the RFC5180 (and Errata) benchmarking working group prefix
41
# 2001:0002::/48 for testing.
42
PREFIX="2001:2:"
43
44
# Set IFACE to the real interface you want to run the test on.
45
# IFACEFAR is only relevant on the middle (forwarding) node and will be the
46
# 'right' side (far end) one.
47
: ${IFACE:=lo0}
48
: ${IFACEFAR:=lo0}
49
50
# Number of seconds to wait for peer node to synchronize for test.
51
: ${WAITS:=120}
52
53
# Control port we use to exchange messages between nodes to sync. tests, etc.
54
: ${CTRLPORT:=6666}
55
56
# Get the number of FIBs from the kernel.
57
RT_NUMFIBS=`sysctl -n net.fibs`
58
59
# This is the initiator and connected middle node.
60
LEFTADDR="2001:2:fe00::1"
61
MIDDLELEFTADDR="2001:2:fe00::2"
62
# This is the far end middle node and receiver side.
63
MIDDLERIGHTADDR="2001:2:ff00::1"
64
RIGHTADDR="2001:2:ff00::2"
65
66
# By default all commands must succeed. Individual tests may disable this
67
# temporary.
68
set -e
69
70
# Debug magic.
71
case "${DEBUG}" in
72
42) set -x ;;
73
esac
74
75
76
################################################################################
77
#
78
# Input validation.
79
#
80
81
node=$1
82
case ${node} in
83
left) ;;
84
middle) ;;
85
right) ;;
86
*) echo "ERROR: invalid node name '${node}'. Must be left, middle or" \
87
" right" >&1
88
exit 1
89
;;
90
esac
91
92
################################################################################
93
#
94
# Helper functions.
95
#
96
check_rc()
97
{
98
local _rc _exp _testno _testname _msg _r
99
_rc=$1
100
_exp=$2
101
_testno=$3
102
_testname="$4"
103
_msg="$5"
104
105
_r="not ok"
106
if test ${_rc} -eq ${_exp}; then
107
_r="ok"
108
fi
109
echo "${_r} ${_testno} ${_testname} # ${_msg} ${_rc} ${_exp}"
110
}
111
112
print_debug()
113
{
114
local _msg
115
_msg="$*"
116
117
case ${DEBUG} in
118
''|0) ;;
119
*) echo "DEBUG: ${_msg}" >&2 ;;
120
esac
121
}
122
123
die()
124
{
125
local _msg
126
_msg="$*"
127
128
echo "ERROR: ${_msg}" >&2
129
exit 1
130
}
131
132
133
################################################################################
134
#
135
# Functions to configure networking and do a basic reachability check.
136
#
137
138
setup_networking()
139
{
140
141
print_debug "Setting up networking"
142
case ${node} in
143
left) ifconfig ${IFACE} inet6 ${LEFTADDR}/64 -alias \
144
> /dev/null 2>&1 || true
145
ifconfig ${IFACE} inet6 ${LEFTADDR}/64 alias up
146
ifconfig ${IFACE} fib 0
147
sysctl net.inet6.ip6.forwarding=0 > /dev/null
148
route delete -net -inet6 default > /dev/null 2>&1 || true
149
route delete -host -inet6 ${RIGHTADDR} ${MIDDLELEFTADDR} \
150
> /dev/null 2>&1 || true
151
route add -host -inet6 ${RIGHTADDR} ${MIDDLELEFTADDR} \
152
> /dev/null
153
route delete -host -inet6 ${MIDDLERIGHTADDR} ${MIDDLELEFTADDR} \
154
> /dev/null 2>&1 || true
155
route add -host -inet6 ${MIDDLERIGHTADDR} ${MIDDLELEFTADDR} \
156
> /dev/null 2>&1 || true
157
;;
158
middle) ifconfig ${IFACE} inet6 ${MIDDLELEFTADDR}/64 -alias \
159
> /dev/null 2>&1 || true
160
ifconfig ${IFACE} inet6 ${MIDDLELEFTADDR}/64 alias up
161
ifconfig ${IFACE} fib 0
162
ifconfig ${IFACEFAR} inet6 ${MIDDLERIGHTADDR}/64 -alias \
163
> /dev/null 2>&1 || true
164
ifconfig ${IFACEFAR} inet6 ${MIDDLERIGHTADDR}/64 alias up
165
ifconfig ${IFACEFAR} fib 0
166
sysctl net.inet6.ip6.forwarding=1 > /dev/null
167
;;
168
right) ifconfig ${IFACE} inet6 ${RIGHTADDR}/64 -alias \
169
> /dev/null 2>&1 || true
170
ifconfig ${IFACE} inet6 ${RIGHTADDR}/64 alias up
171
ifconfig ${IFACE} fib 0
172
sysctl net.inet6.ip6.forwarding=0 > /dev/null
173
route delete -net -inet6 default > /dev/null 2>&1 || true
174
route delete -host -inet6 ${LEFTADDR} ${MIDDLERIGHTADDR} \
175
> /dev/null 2>&1 || true
176
route add -host -inet6 ${LEFTADDR} ${MIDDLERIGHTADDR} \
177
> /dev/null
178
route delete -host -inet6 ${MIDDLELEFTADDR} ${MIDDLERIGHTADDR} \
179
> /dev/null 2>&1 || true
180
route add -host -inet6 ${MIDDLELEFTADDR} ${MIDDLERIGHTADDR} \
181
> /dev/null
182
;;
183
esac
184
185
# Let things settle.
186
print_debug "Waiting 4 seconds for things to settle"
187
sleep 4
188
}
189
190
cleanup_networking()
191
{
192
193
case ${node} in
194
left) ifconfig ${IFACE} inet6 ${LEFTADDR}/64 -alias
195
;;
196
middle) ifconfig ${IFACE} inet6 ${MIDDLELEFTADDR}/64 -alias
197
ifconfig ${IFACEFAR} inet6 ${MIDDLERIGHTADDR}/64 -alias
198
sysctl net.inet6.ip6.forwarding=0 > /dev/null
199
;;
200
right) ifconfig ${IFACE} inet6 ${RIGHTADDR}/64 -alias
201
;;
202
esac
203
print_debug "Cleaned up networking"
204
}
205
206
_reachability_check()
207
{
208
local _addr _rc
209
_addr="$1"
210
211
ping6 -n -c1 ${_addr} > /dev/null 2>&1
212
_rc=$?
213
case ${_rc} in
214
0) ;;
215
*) print_debug "cannot ping6 ${_addr}, rc=${_rc}"
216
return 1
217
;;
218
esac
219
return 0
220
}
221
222
reachability_check()
223
{
224
local _i rc
225
226
# Try to reach all control addresses on other nodes.
227
# We need to loop for a while as we cannot expect all to be up
228
# the very same moment.
229
i=1
230
rc=42
231
while test ${rc} -ne 0 -a ${i} -le ${WAITS}; do
232
print_debug "${i}/${WAITS} trying to ping6 control addresses."
233
rc=0
234
set +e
235
case ${node} in
236
left) _reachability_check ${MIDDLELEFTADDR}
237
rc=$((rc + $?))
238
_reachability_check ${MIDDLERIGHTADDR}
239
rc=$((rc + $?))
240
_reachability_check ${RIGHTADDR}
241
rc=$((rc + $?))
242
;;
243
middle) _reachability_check ${LEFTADDR}
244
rc=$((rc + $?))
245
_reachability_check ${RIGHTADDR}
246
rc=$((rc + $?))
247
;;
248
right) _reachability_check ${MIDDLERIGHTADDR}
249
rc=$((rc + $?))
250
_reachability_check ${MIDDLELEFTADDR}
251
rc=$((rc + $?))
252
_reachability_check ${LEFTADDR}
253
rc=$((rc + $?))
254
;;
255
esac
256
set -e
257
sleep 1
258
i=$((i + 1))
259
done
260
}
261
262
################################################################################
263
#
264
# "Greeting" handling to sync notes to the agreed upon next test case.
265
#
266
send_control_msg()
267
{
268
local _case _addr i rc _msg _keyword _fibs
269
_case="$1"
270
_addr="$2"
271
272
set +e
273
i=0
274
rc=-1
275
while test ${i} -lt ${WAITS} -a ${rc} -ne 0; do
276
print_debug "Sending control msg #${i} to peer ${_addr}"
277
_msg=`echo "${_case} ${RT_NUMFIBS}" | \
278
nc -6 -w 1 ${_addr} ${CTRLPORT}`
279
rc=$?
280
i=$((i + 1))
281
# Might sleep longer in total but better than to DoS
282
# and not get anywhere.
283
sleep 1
284
done
285
set -e
286
287
read _keyword _fibs <<EOI
288
${_msg}
289
EOI
290
print_debug "_keyword=${_keyword}"
291
print_debug "_fibs=${_fibs}"
292
case ${_keyword} in
293
${_case});;
294
*) die "Got invalid keyword from ${_addr} in control message:" \
295
"${_msg}"
296
;;
297
esac
298
if test ${_fibs} -ne ${RT_NUMFIBS}; then
299
die "Number of FIBs not matching ours (${RT_NUMFIBS}) in" \
300
"control message from ${_addr}: ${_msg}"
301
fi
302
303
print_debug "Successfully exchanged control message with ${_addr}."
304
}
305
306
send_control_msgs()
307
{
308
local _case _addr
309
_case="$1"
310
311
# Always start with the far end. Otherwise we will cut that off when
312
# cleanly taering down things again.
313
for _addr in ${RIGHTADDR} ${MIDDLELEFTADDR}; do
314
send_control_msg "${_case}" ${_addr}
315
done
316
317
# Allow us to flush ipfw counters etc before new packets will arrive.
318
sleep 1
319
}
320
321
# We are setup. Wait for the initiator to tell us that it is ready.
322
wait_remote_ready()
323
{
324
local _case _msg _keyword _fibs
325
_case="$1"
326
327
# Wait for the remote to connect and start things.
328
# We tell it the magic keyword, and our number of FIBs.
329
_msg=`echo "${_case} ${RT_NUMFIBS}" | nc -6 -l ${CTRLPORT}`
330
331
read _keyword _fibs <<EOI
332
${_msg}
333
EOI
334
print_debug "_keyword=${_keyword}"
335
print_debug "_fibs=${_fibs}"
336
case ${_keyword} in
337
${_case});;
338
*) die "Got invalid keyword in control message: ${_msg}"
339
;;
340
esac
341
if test ${_fibs} -ne ${RT_NUMFIBS}; then
342
die "Number of FIBs not matching ours (${RT_NUMFIBS}) in" \
343
"control message: ${_msg}"
344
fi
345
346
print_debug "Successfully received control message."
347
}
348
349
################################################################################
350
#
351
# Test case helper functions.
352
#
353
# Please note that neither on the intiator nor the reflector are FIBs despite
354
# a variable name might indicate. If such a variable is used it mirrors FIB
355
# numbers from the middle node to match for test cases.
356
#
357
test_icmp6()
358
{
359
local _maxfibs _addr _n _testno i _rc _ec
360
_maxfibs=$1
361
_addr="$2"
362
_n="$3"
363
364
printf "1..%d\n" ${_maxfibs}
365
_testno=1
366
set +e
367
i=0
368
while test ${i} -lt ${_maxfibs}; do
369
_txt="${_n}_${i}"
370
print_debug "Testing ${_txt}"
371
372
# Generate HEX for ping6 payload.
373
_fibtxt=`echo "${_txt}" | hd -v | cut -b11-60 | tr -d ' \r\n'`
374
375
eval _rc="\${rc_${i}}"
376
ping6 -n -c1 -p ${_fibtxt} ${_addr} > /dev/null 2>&1
377
_ec=$?
378
# We need to normalize the exit code of ping6.
379
case ${_ec} in
380
0) ;;
381
*) _ec=1 ;;
382
esac
383
check_rc ${_ec} ${_rc} ${_testno} "${_txt}" "FIB ${i} ${_addr}"
384
testno=$((testno + 1))
385
i=$((i + 1))
386
done
387
set -e
388
}
389
390
test_ulp_reflect_one()
391
{
392
local _txt _opts port fib
393
_txt="$1"
394
_opts="$2"
395
port=$3
396
fib=$4
397
398
print_debug "./reflect -p $((port + 1 + fib)) -t ${_txt}" "${_opts}"
399
./reflect -p $((port + 1 + fib)) -t ${_txt} ${_opts}
400
print_debug "reflect '${_txt}' terminated without error."
401
}
402
403
test_ulp_reflect_multiple()
404
{
405
local _maxfibs _txt _opts i _jobs _p
406
_maxfibs=$1
407
_txt="$2"
408
_opts="$3"
409
410
i=0
411
_jobs=""
412
while test ${i} -lt ${_maxfibs}; do
413
print_debug "./reflect -p $((CTRLPORT + 1000 + i))" \
414
"-t ${_txt} ${_opts} -N -f ${i} &"
415
./reflect -p $((CTRLPORT + 1000 + i)) \
416
-t ${_txt} ${_opts} -N -f ${i} &
417
_p=$!
418
_jobs="${_jobs}${_p} "
419
i=$((i + 1))
420
done
421
422
# Start OOB control connection for START/DONE.
423
testrx_run_one "${_txt}" "${_opts}"
424
print_debug "KILL ${_jobs}"
425
for i in ${_jobs}; do
426
kill ${i} || true
427
done
428
#killall reflect || true
429
print_debug "reflects for '${_txt}' terminated without error."
430
}
431
432
nc_send_recv()
433
{
434
local _loops _msg _expreply _addr _port _opts i
435
_loops=$1
436
_msg="$2"
437
_expreply="$3"
438
_addr=$4
439
_port=$5
440
_opts="$6"
441
442
i=0
443
while test ${i} -lt ${_loops}; do
444
i=$((i + 1))
445
print_debug "e ${_msg} | nc -6 -w1 ${_opts} ${_addr} ${_port}"
446
_reply=`echo "${_msg}" | nc -6 -w1 ${_opts} ${_addr} ${_port}`
447
if test "${_reply}" != "${_expreply}"; then
448
if test ${i} -lt ${_loops}; then
449
sleep 1
450
else
451
# Must let caller decide how to handle the error.
452
# die "Got invalid reply from peer." \
453
# "Expected '${_expreply}', got '${_reply}'"
454
return 1
455
fi
456
else
457
break
458
fi
459
done
460
return 0
461
}
462
463
test_ulp()
464
{
465
local maxfibs _msg _addr port fib i _txt testno _rc _reply
466
maxfibs=$1
467
_msg="$2"
468
_addr=$3
469
port=$4
470
fib=$5
471
472
printf "1..%d\n" $((${maxfibs} * 2))
473
testno=1
474
i=0
475
while test ${i} -lt ${maxfibs}; do
476
477
if test ${i} -eq $((${maxfibs} - 1)); then
478
# Last one; signal DONE.
479
_txt="DONE ${_msg}_${i}"
480
else
481
_txt="DONE ${_msg}_${i}"
482
fi
483
484
eval _rc="\${rc_${i}}"
485
486
# Test TCP.
487
nc_send_recv ${maxfibs} "${_txt}" "${_txt}" ${_addr} \
488
$((${port} + 1 + fib)) ""
489
check_rc $? ${_rc} ${testno} "${_msg}_${i}_tcp" \
490
"[${_addr}]:$((${port} + 1 + fib)) ${_reply}"
491
testno=$((testno + 1))
492
sleep 1
493
494
# Test UDP.
495
nc_send_recv ${maxfibs} "${_txt}" "${_txt}" ${_addr} \
496
$((${port} + 1 + fib)) "-u"
497
check_rc $? ${_rc} ${testno} "${_msg}_${i}_udp" \
498
"[${_addr}]:$((${port} + 1 + fib)) ${_reply}"
499
sleep 1
500
501
i=$((i + 1))
502
testno=$((testno + 1))
503
done
504
}
505
506
setup_ipfw_count()
507
{
508
local i port maxfib _p _fib _ofib
509
port=$1
510
maxfib=$2
511
_fib=$3
512
_ofib=$4
513
514
i=0
515
while test ${i} -lt ${maxfib}; do
516
517
case ${_ofib} in
518
-1) _p=$((port + 1 + i)) ;;
519
*) _p=$((port + 1 + maxfib - 1 - i)) ;;
520
esac
521
522
# Only count ICMP6 echo replies.
523
ipfw add $((10000 + i)) count ipv6-icmp from any to any \
524
icmp6types 129 fib ${i} via ${IFACE} out > /dev/null
525
ipfw add $((10000 + i)) count tcp from any to any \
526
src-port ${_p} fib ${i} via ${IFACE} out > /dev/null
527
ipfw add $((10000 + i)) count udp from any to any \
528
src-port ${_p} fib ${i} via ${IFACE} out > /dev/null
529
530
# Only count ICMP6 echo requests.
531
ipfw add $((20000 + i)) count ipv6-icmp from any to any \
532
icmp6types 128 fib ${i} via ${IFACEFAR} out > /dev/null
533
ipfw add $((20000 + i)) count tcp from any to any \
534
dst-port $((${port} + 1 + i)) fib ${i} \
535
via ${IFACEFAR} out > /dev/null
536
ipfw add $((20000 + i)) count udp from any to any \
537
dst-port $((${port} + 1 + i)) fib ${i} \
538
via ${IFACEFAR} out > /dev/null
539
540
i=$((i + 1))
541
done
542
}
543
544
report_ipfw_count()
545
{
546
local _fib _o i _rstr _c _req _p _opts base
547
_o="$2"
548
549
case ${DEBUG} in
550
''|0) ;;
551
*) ipfw show ;;
552
esac
553
554
_rstr="RESULTS "
555
for base in 10000 20000; do
556
for _o in i t u; do
557
case ${base} in
558
10000) _rstr="${_rstr}\nLEFT " ;;
559
20000) _rstr="${_rstr}\nRIGHT " ;;
560
esac
561
case ${_o} in
562
i) _rstr="${_rstr}ICMP6 " ;;
563
t) _rstr="${_rstr}TCP " ;;
564
u) _rstr="${_rstr}UDP " ;;
565
esac
566
i=0
567
while test ${i} -lt ${RT_NUMFIBS}; do
568
569
case "${_o}" in
570
i) _c=`ipfw show $((${base} + i)) | \
571
awk '/ ipv6-icmp / { print $2 }'` ;;
572
t) _c=`ipfw show $((${base} + i)) | \
573
awk '/ tcp / { print $2 }'` ;;
574
u) _c=`ipfw show $((${base} + i)) | \
575
awk '/ udp / { print $2 }'` ;;
576
esac
577
_rstr="${_rstr}${i} ${_c},"
578
579
i=$((i + 1))
580
done
581
done
582
i=0
583
while test ${i} -lt ${RT_NUMFIBS}; do
584
ipfw delete $((${base} + i)) > /dev/null 2>&1 || true
585
i=$((i + 1))
586
done
587
done
588
589
# We do not care about the request.
590
_req=`printf "${_rstr}" | nc -6 -l $((${CTRLPORT} - 1))`
591
print_debug "$? -- ${_req} -- ${_rstr}"
592
}
593
594
fetch_ipfw_count()
595
{
596
local _n _reply _line _edge _type _fib _count _rc _ec _status
597
_n="$1"
598
599
# Leave node some time to build result set.
600
sleep 3
601
602
print_debug "Asking for ipfw count results..."
603
set +e
604
nc_send_recv 1 "RESULT REQUEST" "" ${MIDDLELEFTADDR} \
605
$((${CTRLPORT} - 1)) ""
606
set -e
607
case "${_reply}" in
608
RESULTS\ *) ;;
609
*) die "Got invalid reply from peer." \
610
"Expected 'RESULTS ...', got '${_reply}'" ;;
611
esac
612
613
# Trim "RESULTS "
614
_reply=${_reply#* }
615
616
# FIBs * {left, right} * {icmp6, tcp, udp}
617
printf "1..%d\n" $((RT_NUMFIBS * 2 * 3))
618
testno=1
619
while read _line; do
620
print_debug "_line == ${_line}"
621
_edge=${_line%% *}
622
_line=${_line#* }
623
_type=${_line%% *}
624
_line=${_line#* }
625
626
while read _fib _count; do
627
eval _em="\${rc_${_n}_${_edge}_${_type}_${_fib}}"
628
: ${_em:=-42}
629
if test ${_count} -gt 0; then
630
_rc=1
631
else
632
_rc=0
633
fi
634
if test ${_rc} -eq ${_em}; then
635
_status="ok"
636
else
637
_status="not ok"
638
fi
639
printf "%s %d %s # count=%s _rc=%d _em=%d\n" \
640
"${_status}" ${testno} "${_n}_${_edge}_${_type}_${_fib}" \
641
${_count} ${_rc} ${_em}
642
testno=$((testno + 1))
643
done <<EOi
644
`printf "${_line}" | tr ',' '\n'`
645
EOi
646
647
done <<EOo
648
`printf "${_reply}" | grep -v "^$"`
649
EOo
650
651
print_debug "ipfw count results processed"
652
}
653
654
################################################################################
655
#
656
# Test cases.
657
#
658
# In general we set the FIB on in, but count on out.
659
#
660
661
_fwd_default_fib_symmetric_results()
662
{
663
local _n i _edge _type _rc
664
_n="$1"
665
666
i=0
667
while test ${i} -lt ${RT_NUMFIBS}; do
668
for _edge in "LEFT" "RIGHT"; do
669
for _type in "ICMP6" "TCP" "UDP"; do
670
671
case ${i} in
672
0) eval rc_${_n}_${_edge}_${_type}_${i}=1
673
#print_debug \
674
# "rc_${_n}_${_edge}_${_type}_${i}=1"
675
;;
676
*) eval rc_${_n}_${_edge}_${_type}_${i}=0
677
#print_debug \
678
# "rc_${_n}_${_edge}_${_type}_${i}=0"
679
;;
680
esac
681
682
done
683
done
684
i=$((i + 1))
685
done
686
}
687
688
_fwd_default_fib_symmetric_left()
689
{
690
local _n
691
_n="$1"
692
693
send_control_msgs "START_${_n}"
694
695
# Setup expected return code
696
rc_0=0
697
698
# Initiate probes for ICMP6, TCP and UDP.
699
test_icmp6 1 ${RIGHTADDR} "${_n}_icmp6"
700
test_ulp 1 "${_n}" ${RIGHTADDR} ${CTRLPORT} 0
701
702
send_control_msgs "STOP_${_n}"
703
_fwd_default_fib_symmetric_results "${_n}"
704
fetch_ipfw_count "${_n}"
705
}
706
707
_fwd_default_fib_symmetric_middle()
708
{
709
local _n
710
_n="$1"
711
712
setup_ipfw_count ${CTRLPORT} ${RT_NUMFIBS} 0 -1
713
wait_remote_ready "START_${_n}"
714
ipfw -q zero > /dev/null
715
# Nothing to do for the middle node testing the default.
716
sleep 1
717
wait_remote_ready "STOP_${_n}"
718
report_ipfw_count
719
}
720
721
_fwd_default_fib_symmetric_right()
722
{
723
local _n
724
_n="$1"
725
726
wait_remote_ready "START_${_n}"
727
728
# No need to do anything for ICMPv6.
729
# Start reflect for TCP and UDP.
730
test_ulp_reflect_one "${_n}_tcp" "-N -T TCP6" 0 ${CTRLPORT}
731
test_ulp_reflect_one "${_n}_udp" "-N -T UDP6" 0 ${CTRLPORT}
732
733
wait_remote_ready "STOP_${_n}"
734
}
735
736
fwd_default_fib_symmetric()
737
{
738
local _n
739
740
_n="fwd_default_fib_symmetric"
741
742
print_debug "${_n}"
743
case ${node} in
744
left) _fwd_default_fib_symmetric_left ${_n} ;;
745
middle) _fwd_default_fib_symmetric_middle ${_n} ;;
746
right) _fwd_default_fib_symmetric_right ${_n} ;;
747
esac
748
}
749
750
_fwd_default_fib_symmetric_middle_ifconfig()
751
{
752
local _n
753
_n="$1"
754
755
ifconfig ${IFACE} fib 0
756
ifconfig ${IFACEFAR} fib 0
757
setup_ipfw_count ${CTRLPORT} ${RT_NUMFIBS} 0 -1
758
wait_remote_ready "START_${_n}"
759
ipfw -q zero > /dev/null
760
# Nothing to do for the middle node testing the default.
761
sleep 1
762
wait_remote_ready "STOP_${_n}"
763
report_ipfw_count
764
}
765
766
fwd_default_fib_symmetric_ifconfig()
767
{
768
local _n
769
770
_n="fwd_default_fib_symmetric_ifconfig"
771
772
print_debug "${_n}"
773
case ${node} in
774
left) _fwd_default_fib_symmetric_left ${_n} ;;
775
middle) _fwd_default_fib_symmetric_middle_ifconfig ${_n} ;;
776
right) _fwd_default_fib_symmetric_right ${_n} ;;
777
esac
778
}
779
780
_fwd_default_fib_symmetric_middle_ipfw()
781
{
782
local _n
783
_n="$1"
784
785
ipfw add 100 setfib 0 ipv6-icmp from any to any \
786
icmp6types 128 via ${IFACE} in > /dev/null
787
ipfw add 100 setfib 0 ip6 from any to any \
788
proto tcp dst-port ${CTRLPORT} via ${IFACE} in > /dev/null
789
ipfw add 100 setfib 0 ip6 from any to any \
790
proto udp dst-port ${CTRLPORT} via ${IFACE} in > /dev/null
791
792
ipfw add 100 setfib 0 ipv6-icmp from any to any \
793
icmp6types 128 via ${IFACEFAR} in > /dev/null
794
ipfw add 100 setfib 0 tcp from any to any \
795
dst-port ${CTRLPORT} via ${IFACEFAR} in > /dev/null
796
ipfw add 100 setfib 0 udp from any to any \
797
dst-port ${CTRLPORT} via ${IFACEFAR} in > /dev/null
798
799
setup_ipfw_count ${CTRLPORT} ${RT_NUMFIBS} 0 -1
800
wait_remote_ready "START_${_n}"
801
ipfw -q zero > /dev/null
802
# Nothing to do for the middle node testing the default.
803
sleep 1
804
wait_remote_ready "STOP_${_n}"
805
report_ipfw_count
806
807
ipfw delete 100 > /dev/null
808
}
809
810
fwd_default_fib_symmetric_ipfw()
811
{
812
local _n
813
814
_n="fwd_default_fib_symmetric_ipfw"
815
816
print_debug "${_n}"
817
case ${node} in
818
left) _fwd_default_fib_symmetric_left ${_n} ;;
819
middle) _fwd_default_fib_symmetric_middle_ipfw ${_n} ;;
820
right) _fwd_default_fib_symmetric_right ${_n} ;;
821
esac
822
}
823
824
################################################################################
825
826
_fwd_fib_symmetric_results()
827
{
828
local _n _fib i _edge _type _rc
829
_n="$1"
830
_fib=$2
831
832
i=0
833
while test ${i} -lt ${RT_NUMFIBS}; do
834
for _edge in "LEFT" "RIGHT"; do
835
for _type in "ICMP6" "TCP" "UDP"; do
836
837
case ${i} in
838
${_fib}) eval rc_${_n}_${_edge}_${_type}_${i}=1
839
#print_debug \
840
# "rc_${_n}_${_edge}_${_type}_${i}=1"
841
;;
842
*) eval rc_${_n}_${_edge}_${_type}_${i}=0
843
#print_debug \
844
# "rc_${_n}_${_edge}_${_type}_${i}=0"
845
;;
846
esac
847
848
done
849
done
850
i=$((i + 1))
851
done
852
}
853
854
_fwd_fib_symmetric_left()
855
{
856
local _n _maxfib i
857
_n="$1"
858
_maxfib=$2
859
860
# Setup expected return code
861
i=0
862
while test ${i} -lt ${_maxfib}; do
863
eval rc_${i}=0
864
i=$((i + 1))
865
done
866
867
# Initiate probes for ICMP6, TCP and UDP.
868
i=0
869
while test ${i} -lt ${_maxfib}; do
870
871
sleep 1
872
873
send_control_msgs "START_${_n}_${i}"
874
875
test_icmp6 1 ${RIGHTADDR} "${_n}_${i}_icmp6"
876
test_ulp 1 "${_n}_${i}" ${RIGHTADDR} ${CTRLPORT} ${i}
877
878
send_control_msgs "STOP_${_n}_${i}"
879
_fwd_fib_symmetric_results "${_n}_${i}" ${i}
880
fetch_ipfw_count "${_n}_${i}"
881
i=$((i + 1))
882
done
883
}
884
885
_fwd_fib_symmetric_right()
886
{
887
local _n _maxfib i
888
_n="$1"
889
_maxfib=$2
890
891
i=0
892
while test ${i} -lt ${_maxfib}; do
893
wait_remote_ready "START_${_n}_${i}"
894
895
# No need to do anything for ICMPv6.
896
# Start reflect for TCP and UDP.
897
test_ulp_reflect_one "${_n}_tcp" "-N -T TCP6" ${i} ${CTRLPORT}
898
test_ulp_reflect_one "${_n}_udp" "-N -T UDP6" ${i} ${CTRLPORT}
899
900
wait_remote_ready "STOP_${_n}_${i}"
901
i=$((i + 1))
902
done
903
}
904
905
_fwd_fib_symmetric_middle_ifconfig()
906
{
907
local _n _maxfib i
908
_n="$1"
909
_maxfib=$2
910
911
i=0
912
while test ${i} -lt ${_maxfib}; do
913
ifconfig ${IFACE} fib ${i}
914
ifconfig ${IFACEFAR} fib ${i}
915
setup_ipfw_count ${CTRLPORT} ${_maxfib} ${i} -1
916
wait_remote_ready "START_${_n}_${i}"
917
ipfw -q zero > /dev/null
918
# Nothing to do for the middle node testing the default.
919
sleep 1
920
wait_remote_ready "STOP_${_n}_${i}"
921
report_ipfw_count
922
i=$((i + 1))
923
done
924
}
925
926
_fwd_fib_symmetric_middle_ipfw()
927
{
928
local _n _maxfib i _port
929
_n="$1"
930
_maxfib=$2
931
932
i=0
933
while test ${i} -lt ${_maxfib}; do
934
_port=$((CTRLPORT + 1 + i))
935
ipfw add 100 setfib ${i} ipv6-icmp from any to any \
936
icmp6types 128 via ${IFACE} in > /dev/null
937
ipfw add 100 setfib ${i} tcp from any to any \
938
dst-port ${_port} via ${IFACE} in > /dev/null
939
ipfw add 100 setfib ${i} udp from any to any \
940
dst-port ${_port} via ${IFACE} in > /dev/null
941
942
ipfw add 100 setfib ${i} ipv6-icmp from any to any \
943
icmp6types 129 via ${IFACEFAR} in > /dev/null
944
ipfw add 100 setfib ${i} tcp from any to any \
945
src-port ${_port} via ${IFACEFAR} in > /dev/null
946
ipfw add 100 setfib ${i} udp from any to any \
947
src-port ${_port} via ${IFACEFAR} in > /dev/null
948
949
setup_ipfw_count ${CTRLPORT} ${_maxfib} ${i} -1
950
wait_remote_ready "START_${_n}_${i}"
951
ipfw -q zero > /dev/null
952
# Nothing to do for the middle node testing the default.
953
sleep 1
954
wait_remote_ready "STOP_${_n}_${i}"
955
report_ipfw_count
956
957
ipfw delete 100 > /dev/null
958
i=$((i + 1))
959
done
960
}
961
962
fwd_fib_symmetric_ifconfig()
963
{
964
local _maxfib _n
965
_maxfib=$1
966
967
_n="fwd_fib_symmetric_ifconfig"
968
969
print_debug "${_n} ${_maxfib}"
970
case ${node} in
971
left) _fwd_fib_symmetric_left ${_n} ${_maxfib} ;;
972
middle) _fwd_fib_symmetric_middle_ifconfig ${_n} ${_maxfib} ;;
973
right) _fwd_fib_symmetric_right ${_n} ${_maxfib} ;;
974
esac
975
}
976
977
fwd_fib_symmetric_ipfw()
978
{
979
local _maxfib _n
980
_maxfib=$1
981
982
_n="fwd_fib_symmetric_ipfw"
983
984
print_debug "${_n} ${_maxfib}"
985
case ${node} in
986
left) _fwd_fib_symmetric_left ${_n} ${_maxfib} ;;
987
middle) _fwd_fib_symmetric_middle_ipfw ${_n} ${_maxfib} ;;
988
right) _fwd_fib_symmetric_right ${_n} ${_maxfib} ;;
989
esac
990
}
991
992
################################################################################
993
994
_fwd_fib_asymmetric_results()
995
{
996
local _n fib maxfib i _edge _type _rc
997
_n="$1"
998
fib=$2
999
maxfib=$3
1000
1001
i=0
1002
while test ${i} -lt ${maxfib}; do
1003
_edge="RIGHT"
1004
for _type in "ICMP6" "TCP" "UDP"; do
1005
1006
case ${i} in
1007
${fib}) eval rc_${_n}_${_edge}_${_type}_${i}=1
1008
#print_debug \
1009
# "rc_${_n}_${_edge}_${_type}_${i}=1"
1010
;;
1011
*) eval rc_${_n}_${_edge}_${_type}_${i}=0
1012
#print_debug \
1013
# "rc_${_n}_${_edge}_${_type}_${i}=0"
1014
;;
1015
esac
1016
1017
done
1018
i=$((i + 1))
1019
done
1020
fib=$((maxfib - 1 - fib))
1021
i=0
1022
while test ${i} -lt ${maxfib}; do
1023
_edge="LEFT"
1024
for _type in "ICMP6" "TCP" "UDP"; do
1025
1026
case ${i} in
1027
${fib}) eval rc_${_n}_${_edge}_${_type}_${i}=1
1028
#print_debug \
1029
# "rc_${_n}_${_edge}_${_type}_${i}=1"
1030
;;
1031
*) eval rc_${_n}_${_edge}_${_type}_${i}=0
1032
#print_debug \
1033
# "rc_${_n}_${_edge}_${_type}_${i}=0"
1034
;;
1035
esac
1036
1037
done
1038
i=$((i + 1))
1039
done
1040
}
1041
1042
_fwd_fib_asymmetric_left()
1043
{
1044
local _n _maxfib i
1045
_n="$1"
1046
_maxfib=$2
1047
1048
# Setup expected return code
1049
i=0
1050
while test ${i} -lt ${_maxfib}; do
1051
eval rc_${i}=0
1052
i=$((i + 1))
1053
done
1054
1055
# Initiate probes for ICMP6, TCP and UDP.
1056
i=0
1057
while test ${i} -lt ${_maxfib}; do
1058
1059
sleep 1
1060
1061
send_control_msgs "START_${_n}_${i}"
1062
1063
test_icmp6 1 ${RIGHTADDR} "${_n}_${i}_icmp6"
1064
test_ulp 1 "${_n}_${i}" ${RIGHTADDR} ${CTRLPORT} ${i}
1065
1066
send_control_msgs "STOP_${_n}_${i}"
1067
_fwd_fib_asymmetric_results "${_n}_${i}" ${i} ${_maxfib}
1068
fetch_ipfw_count "${_n}_${i}"
1069
i=$((i + 1))
1070
done
1071
}
1072
1073
_fwd_fib_asymmetric_middle_ifconfig()
1074
{
1075
local _n maxfib i
1076
_n="$1"
1077
maxfib=$2
1078
1079
i=0
1080
while test ${i} -lt ${maxfib}; do
1081
ifconfig ${IFACE} fib ${i}
1082
ifconfig ${IFACEFAR} fib $((${maxfib} - 1 - ${i}))
1083
setup_ipfw_count ${CTRLPORT} ${maxfib} ${i} \
1084
$((${maxfib} - 1 - ${i}))
1085
wait_remote_ready "START_${_n}_${i}"
1086
ipfw -q zero > /dev/null
1087
# Nothing to do for the middle node testing the default.
1088
sleep 1
1089
wait_remote_ready "STOP_${_n}_${i}"
1090
report_ipfw_count
1091
i=$((i + 1))
1092
done
1093
}
1094
1095
_fwd_fib_asymmetric_middle_ipfw()
1096
{
1097
local _n maxfib i j _port
1098
_n="$1"
1099
maxfib=$2
1100
1101
i=0
1102
while test ${i} -lt ${maxfib}; do
1103
1104
_port=$((CTRLPORT + 1 + i))
1105
ipfw add 100 setfib ${i} ipv6-icmp from any to any \
1106
icmp6types 128 via ${IFACE} in > /dev/null
1107
ipfw add 100 setfib ${i} tcp from any to any \
1108
dst-port ${_port} via ${IFACE} in > /dev/null
1109
ipfw add 100 setfib ${i} udp from any to any \
1110
dst-port ${_port} via ${IFACE} in > /dev/null
1111
1112
j=$((${maxfib} - 1 - ${i}))
1113
ipfw add 100 setfib ${j} ipv6-icmp from any to any \
1114
icmp6types 129 via ${IFACEFAR} in > /dev/null
1115
ipfw add 100 setfib ${j} tcp from any to any \
1116
src-port ${_port} via ${IFACEFAR} in > /dev/null
1117
ipfw add 100 setfib ${j} udp from any to any \
1118
src-port ${_port} via ${IFACEFAR} in > /dev/null
1119
1120
setup_ipfw_count ${CTRLPORT} ${maxfib} ${i} ${j}
1121
wait_remote_ready "START_${_n}_${i}"
1122
ipfw -q zero > /dev/null
1123
# Nothing to do for the middle node testing the default.
1124
sleep 1
1125
wait_remote_ready "STOP_${_n}_${i}"
1126
report_ipfw_count
1127
1128
ipfw delete 100 > /dev/null
1129
i=$((i + 1))
1130
done
1131
}
1132
1133
fwd_fib_asymmetric_ifconfig()
1134
{
1135
local _maxfib _n
1136
_maxfib=$1
1137
1138
_n="fwd_fib_asymmetric_ifconfig"
1139
1140
print_debug "${_n} ${_maxfib}"
1141
case ${node} in
1142
left) _fwd_fib_asymmetric_left ${_n} ${_maxfib} ;;
1143
middle) _fwd_fib_asymmetric_middle_ifconfig ${_n} ${_maxfib} ;;
1144
right) _fwd_fib_symmetric_right ${_n} ${_maxfib} ;;
1145
esac
1146
}
1147
1148
fwd_fib_asymmetric_ipfw()
1149
{
1150
local _maxfib _n
1151
_maxfib=$1
1152
1153
_n="fwd_fib_asymmetric_ipfw"
1154
1155
print_debug "${_n} ${_maxfib}"
1156
case ${node} in
1157
left) _fwd_fib_asymmetric_left ${_n} ${_maxfib} ;;
1158
middle) _fwd_fib_asymmetric_middle_ipfw ${_n} ${_maxfib} ;;
1159
right) _fwd_fib_symmetric_right ${_n} ${_maxfib} ;;
1160
esac
1161
}
1162
1163
################################################################################
1164
1165
_fwd_fib_symmetric_destructive_left()
1166
{
1167
local _n _maxfib i _addr
1168
_n="$1"
1169
_maxfib=$2
1170
1171
# Setup expected return code
1172
i=0
1173
while test ${i} -lt ${_maxfib}; do
1174
eval rc_${i}=0
1175
i=$((i + 1))
1176
done
1177
1178
# Add default route.
1179
route add -net -inet6 default ${MIDDLELEFTADDR} > /dev/null
1180
1181
# Initiate probes for ICMP6, TCP and UDP.
1182
i=0
1183
while test ${i} -lt ${_maxfib}; do
1184
1185
sleep 1
1186
1187
send_control_msgs "START_${_n}_${i}"
1188
1189
_addr="2001:2:${i}::2"
1190
test_icmp6 1 ${_addr} "${_n}_${i}_icmp6"
1191
test_ulp 1 "${_n}_${i}" ${_addr} ${CTRLPORT} ${i}
1192
1193
send_control_msgs "STOP_${_n}_${i}"
1194
_fwd_fib_symmetric_results "${_n}_${i}" ${i}
1195
fetch_ipfw_count "${_n}_${i}"
1196
i=$((i + 1))
1197
done
1198
1199
# Cleanup networking.
1200
route delete -net -inet6 default > /dev/null
1201
}
1202
1203
_fwd_fib_symmetric_destructive_right()
1204
{
1205
local _n _maxfib i _addr
1206
_n="$1"
1207
_maxfib=$2
1208
1209
# Setup networking (ideally we'd use the link-local).
1210
route add -net -inet6 default ${MIDDLERIGHTADDR} > /dev/null 2>&1
1211
i=0
1212
while test ${i} -lt ${_maxfib}; do
1213
ifconfig ${IFACE} inet6 2001:2:${i}::2/64 alias
1214
i=$((i + 1))
1215
done
1216
1217
i=0
1218
while test ${i} -lt ${_maxfib}; do
1219
wait_remote_ready "START_${_n}_${i}"
1220
1221
# No need to do anything for ICMPv6.
1222
# Start reflect for TCP and UDP.
1223
_addr="2001:2:${i}::2"
1224
test_ulp_reflect_one "${_n}_tcp" "-N -T TCP6 -A ${_addr}" \
1225
${i} ${CTRLPORT}
1226
test_ulp_reflect_one "${_n}_udp" "-N -T UDP6 -A ${_addr}" \
1227
${i} ${CTRLPORT}
1228
1229
wait_remote_ready "STOP_${_n}_${i}"
1230
i=$((i + 1))
1231
done
1232
1233
# Cleanup networking again.
1234
route delete -net -inet6 default > /dev/null 2>&1
1235
i=0
1236
while test ${i} -lt ${_maxfib}; do
1237
ifconfig ${IFACE} inet6 2001:2:${i}::2/64 -alias
1238
i=$((i + 1))
1239
done
1240
1241
}
1242
1243
1244
_fwd_fib_symmetric_destructive_middle_setup_networking()
1245
{
1246
local _maxfib i j
1247
_maxfib=$1
1248
1249
# Setup networking.
1250
i=0
1251
while test ${i} -lt ${_maxfib}; do
1252
ifconfig ${IFACEFAR} inet6 2001:2:${i}::1/64 -alias \
1253
> /dev/null 2>&1 || true
1254
ifconfig ${IFACEFAR} inet6 2001:2:${i}::1/64 alias
1255
j=0
1256
while test ${j} -lt ${_maxfib}; do
1257
# Only work on all other FIBs.
1258
if test ${j} -ne ${i}; then
1259
setfib -F ${j} route delete -net -inet6 \
1260
2001:2:${i}::/64 > /dev/null
1261
fi
1262
j=$((j + 1))
1263
done
1264
i=$((i + 1))
1265
done
1266
}
1267
1268
_fwd_fib_symmetric_destructive_middle_cleanup_networking()
1269
{
1270
local _maxfib i
1271
_maxfib=$1
1272
1273
# Cleanup networking again.
1274
i=0
1275
while test ${i} -lt ${_maxfib}; do
1276
ifconfig ${IFACEFAR} inet6 2001:2:${i}::1/64 -alias
1277
i=$((i + 1))
1278
done
1279
}
1280
1281
_fwd_fib_symmetric_destructive_middle_ifconfig()
1282
{
1283
local _n _maxfib i
1284
_n="$1"
1285
_maxfib=$2
1286
1287
_fwd_fib_symmetric_destructive_middle_setup_networking ${_maxfib}
1288
1289
i=0
1290
while test ${i} -lt ${_maxfib}; do
1291
ifconfig ${IFACE} fib ${i}
1292
ifconfig ${IFACEFAR} fib ${i}
1293
setup_ipfw_count ${CTRLPORT} ${_maxfib} ${i} -1
1294
wait_remote_ready "START_${_n}_${i}"
1295
ipfw -q zero > /dev/null
1296
# Nothing to do for the middle node testing the default.
1297
sleep 1
1298
wait_remote_ready "STOP_${_n}_${i}"
1299
report_ipfw_count
1300
i=$((i + 1))
1301
done
1302
1303
_fwd_fib_symmetric_destructive_middle_cleanup_networking ${_maxfib}
1304
}
1305
1306
_fwd_fib_symmetric_destructive_middle_ipfw()
1307
{
1308
local _n _maxfib i _port
1309
_n="$1"
1310
_maxfib=$2
1311
1312
_fwd_fib_symmetric_destructive_middle_setup_networking ${_maxfib}
1313
1314
i=0
1315
while test ${i} -lt ${_maxfib}; do
1316
_port=$((CTRLPORT + 1 + i))
1317
ipfw add 100 setfib ${i} ipv6-icmp from any to any \
1318
icmp6types 128 via ${IFACE} in > /dev/null
1319
ipfw add 100 setfib ${i} tcp from any to any \
1320
dst-port ${_port} via ${IFACE} in > /dev/null
1321
ipfw add 100 setfib ${i} udp from any to any \
1322
dst-port ${_port} via ${IFACE} in > /dev/null
1323
1324
ipfw add 100 setfib ${i} ipv6-icmp from any to any \
1325
icmp6types 129 via ${IFACEFAR} in > /dev/null
1326
ipfw add 100 setfib ${i} tcp from any to any \
1327
src-port ${_port} via ${IFACEFAR} in > /dev/null
1328
ipfw add 100 setfib ${i} udp from any to any \
1329
src-port ${_port} via ${IFACEFAR} in > /dev/null
1330
1331
setup_ipfw_count ${CTRLPORT} ${_maxfib} ${i} -1
1332
wait_remote_ready "START_${_n}_${i}"
1333
ipfw -q zero > /dev/null
1334
# Nothing to do for the middle node testing the default.
1335
sleep 1
1336
wait_remote_ready "STOP_${_n}_${i}"
1337
report_ipfw_count
1338
1339
ipfw delete 100 > /dev/null
1340
i=$((i + 1))
1341
done
1342
1343
_fwd_fib_symmetric_destructive_middle_cleanup_networking ${_maxfib}
1344
}
1345
1346
fwd_fib_symmetric_destructive_ifconfig()
1347
{
1348
local _maxfib _n
1349
_maxfib=$1
1350
1351
_n="fwd_fib_symmetric_destructive_ifconfig"
1352
1353
print_debug "${_n} ${_maxfib}"
1354
case ${node} in
1355
left) _fwd_fib_symmetric_destructive_left ${_n} ${_maxfib} ;;
1356
middle) _fwd_fib_symmetric_destructive_middle_ifconfig \
1357
${_n} ${_maxfib} ;;
1358
right) _fwd_fib_symmetric_destructive_right ${_n} ${_maxfib} ;;
1359
esac
1360
}
1361
1362
fwd_fib_symmetric_destructive_ipfw()
1363
{
1364
local _maxfib _n
1365
_maxfib=$1
1366
1367
_n="fwd_fib_symmetric_destructive_ipfw"
1368
1369
print_debug "${_n} ${_maxfib}"
1370
case ${node} in
1371
left) _fwd_fib_symmetric_destructive_left ${_n} ${_maxfib} ;;
1372
middle) _fwd_fib_symmetric_destructive_middle_ipfw \
1373
${_n} ${_maxfib} ;;
1374
right) _fwd_fib_symmetric_destructive_right ${_n} ${_maxfib} ;;
1375
esac
1376
}
1377
1378
################################################################################
1379
1380
_fwd_fib_symmetric_destructive_defroute_left()
1381
{
1382
local _n _maxfib i _addr
1383
_n="$1"
1384
_maxfib=$2
1385
1386
# Setup expected return code
1387
i=0
1388
while test ${i} -lt ${_maxfib}; do
1389
eval rc_${i}=0
1390
i=$((i + 1))
1391
done
1392
1393
# Add default route.
1394
route delete -net -inet6 default > /dev/null 2>&1 || true
1395
route add -net -inet6 default ${MIDDLELEFTADDR} > /dev/null
1396
1397
# Initiate probes for ICMP6, TCP and UDP.
1398
_addr="2001:2:1234::2"
1399
i=0
1400
while test ${i} -lt ${_maxfib}; do
1401
1402
sleep 1
1403
1404
send_control_msgs "START_${_n}_${i}"
1405
1406
test_icmp6 1 "${_addr}" "${_n}_${i}_icmp6"
1407
test_ulp 1 "${_n}_${i}" "${_addr}" ${CTRLPORT} ${i}
1408
1409
send_control_msgs "STOP_${_n}_${i}"
1410
_fwd_fib_symmetric_results "${_n}_${i}" ${i}
1411
fetch_ipfw_count "${_n}_${i}"
1412
i=$((i + 1))
1413
done
1414
1415
# Cleanup networking.
1416
route delete -net -inet6 default > /dev/null 2>&1
1417
}
1418
1419
_fwd_fib_symmetric_destructive_defroute_right()
1420
{
1421
local _n _maxfib i _addr
1422
_n="$1"
1423
_maxfib=$2
1424
1425
# Setup networking (ideally we'd use the link-local).
1426
route delete -net -inet6 default > /dev/null 2>&1 || true
1427
route add -net -inet6 default ${MIDDLERIGHTADDR} > /dev/null 2>&1
1428
i=0
1429
while test ${i} -lt ${_maxfib}; do
1430
ifconfig ${IFACE} inet6 2001:2:${i}::2/64 -alias \
1431
> /dev/null 2>&1 || true
1432
ifconfig ${IFACE} inet6 2001:2:${i}::2/64 alias
1433
i=$((i + 1))
1434
done
1435
_addr="2001:2:1234::2"
1436
ifconfig lo0 inet6 ${_addr}/128 alias
1437
1438
i=0
1439
while test ${i} -lt ${_maxfib}; do
1440
wait_remote_ready "START_${_n}_${i}"
1441
1442
# No need to do anything for ICMPv6.
1443
# Start reflect for TCP and UDP.
1444
test_ulp_reflect_one "${_n}_tcp" "-N -T TCP6 -A ${_addr}" \
1445
${i} ${CTRLPORT}
1446
test_ulp_reflect_one "${_n}_udp" "-N -T UDP6 -A ${_addr}" \
1447
${i} ${CTRLPORT}
1448
1449
wait_remote_ready "STOP_${_n}_${i}"
1450
i=$((i + 1))
1451
done
1452
1453
# Cleanup networking again.
1454
route delete -net -inet6 default > /dev/null 2>&1
1455
i=0
1456
while test ${i} -lt ${_maxfib}; do
1457
ifconfig ${IFACE} inet6 2001:2:${i}::2/64 -alias
1458
i=$((i + 1))
1459
done
1460
ifconfig lo0 inet6 ${_addr}/128 -alias
1461
1462
}
1463
1464
_fwd_fib_symmetric_destructive_defroute_middle_setup_networking()
1465
{
1466
local _maxfib i j
1467
_maxfib=$1
1468
1469
# Setup networking.
1470
i=0
1471
while test ${i} -lt ${_maxfib}; do
1472
ifconfig ${IFACEFAR} inet6 2001:2:${i}::1/64 -alias \
1473
> /dev/null 2>&1 || true
1474
ifconfig ${IFACEFAR} inet6 2001:2:${i}::1/64 alias
1475
j=0
1476
while test ${j} -lt ${_maxfib}; do
1477
# Only work on all other FIBs.
1478
if test ${j} -ne ${i}; then
1479
setfib -F ${j} route delete -net -inet6 \
1480
2001:2:${i}::/64 > /dev/null
1481
fi
1482
j=$((j + 1))
1483
done
1484
setfib -F ${i} route delete -net -inet6 \
1485
2001:2:1234::2 2001:2:${i}::2 > /dev/null 2>&1 || true
1486
setfib -F ${i} route add -net -inet6 \
1487
2001:2:1234::2 2001:2:${i}::2 > /dev/null
1488
i=$((i + 1))
1489
done
1490
}
1491
1492
_fwd_fib_symmetric_destructive_defroute_middle_cleanup_networking()
1493
{
1494
local _maxfib i
1495
_maxfib=$1
1496
1497
# Cleanup networking again.
1498
i=0
1499
while test ${i} -lt ${_maxfib}; do
1500
ifconfig ${IFACEFAR} inet6 2001:2:${i}::1/64 -alias
1501
setfib -F ${i} route delete -net -inet6 \
1502
2001:2:1234::2 2001:2:${i}::2 > /dev/null
1503
i=$((i + 1))
1504
done
1505
}
1506
1507
_fwd_fib_symmetric_destructive_defroute_middle_ifconfig()
1508
{
1509
local _n _maxfib i
1510
_n="$1"
1511
_maxfib=$2
1512
1513
_fwd_fib_symmetric_destructive_defroute_middle_setup_networking \
1514
${_maxfib}
1515
1516
i=0
1517
while test ${i} -lt ${_maxfib}; do
1518
ifconfig ${IFACE} fib ${i}
1519
ifconfig ${IFACEFAR} fib ${i}
1520
setup_ipfw_count ${CTRLPORT} ${_maxfib} ${i} -1
1521
wait_remote_ready "START_${_n}_${i}"
1522
ipfw -q zero > /dev/null
1523
# Nothing to do for the middle node testing the default.
1524
sleep 1
1525
wait_remote_ready "STOP_${_n}_${i}"
1526
report_ipfw_count
1527
i=$((i + 1))
1528
done
1529
1530
_fwd_fib_symmetric_destructive_defroute_middle_cleanup_networking \
1531
${_maxfib}
1532
}
1533
1534
_fwd_fib_symmetric_destructive_defroute_middle_ipfw()
1535
{
1536
local _n _maxfib i _port
1537
_n="$1"
1538
_maxfib=$2
1539
1540
_fwd_fib_symmetric_destructive_defroute_middle_setup_networking \
1541
${_maxfib}
1542
1543
i=0
1544
while test ${i} -lt ${_maxfib}; do
1545
_port=$((CTRLPORT + 1 + i))
1546
ipfw add 100 setfib ${i} ipv6-icmp from any to any \
1547
icmp6types 128 via ${IFACE} in > /dev/null
1548
ipfw add 100 setfib ${i} tcp from any to any \
1549
dst-port ${_port} via ${IFACE} in > /dev/null
1550
ipfw add 100 setfib ${i} udp from any to any \
1551
dst-port ${_port} via ${IFACE} in > /dev/null
1552
1553
ipfw add 100 setfib ${i} ipv6-icmp from any to any \
1554
icmp6types 129 via ${IFACEFAR} in > /dev/null
1555
ipfw add 100 setfib ${i} tcp from any to any \
1556
src-port ${_port} via ${IFACEFAR} in > /dev/null
1557
ipfw add 100 setfib ${i} udp from any to any \
1558
src-port ${_port} via ${IFACEFAR} in > /dev/null
1559
1560
setup_ipfw_count ${CTRLPORT} ${_maxfib} ${i} -1
1561
wait_remote_ready "START_${_n}_${i}"
1562
ipfw -q zero > /dev/null
1563
# Nothing to do for the middle node testing the default.
1564
sleep 1
1565
wait_remote_ready "STOP_${_n}_${i}"
1566
report_ipfw_count
1567
1568
ipfw delete 100 > /dev/null
1569
i=$((i + 1))
1570
done
1571
1572
_fwd_fib_symmetric_destructive_defroute_middle_cleanup_networking \
1573
${_maxfib}
1574
}
1575
1576
fwd_fib_symmetric_destructive_defroute_ifconfig()
1577
{
1578
local _maxfib _n
1579
_maxfib=$1
1580
1581
_n="fwd_fib_symmetric_destructive_defroute_ifconfig"
1582
1583
print_debug "${_n} ${_maxfib}"
1584
case ${node} in
1585
left) _fwd_fib_symmetric_destructive_defroute_left \
1586
${_n} ${_maxfib} ;;
1587
middle) _fwd_fib_symmetric_destructive_defroute_middle_ifconfig \
1588
${_n} ${_maxfib} ;;
1589
right) _fwd_fib_symmetric_destructive_defroute_right \
1590
${_n} ${_maxfib} ;;
1591
esac
1592
}
1593
1594
fwd_fib_symmetric_destructive_defroute_ipfw()
1595
{
1596
local _maxfib _n
1597
_maxfib=$1
1598
1599
_n="fwd_fib_symmetric_destructive_defroute_ipfw"
1600
1601
print_debug "${_n} ${_maxfib}"
1602
case ${node} in
1603
left) _fwd_fib_symmetric_destructive_defroute_left \
1604
${_n} ${_maxfib} ;;
1605
middle) _fwd_fib_symmetric_destructive_defroute_middle_ipfw \
1606
${_n} ${_maxfib} ;;
1607
right) _fwd_fib_symmetric_destructive_defroute_right \
1608
${_n} ${_maxfib} ;;
1609
esac
1610
}
1611
1612
################################################################################
1613
#
1614
# MAIN
1615
#
1616
1617
# Same for all hosts.
1618
if test `sysctl -n security.jail.jailed` -eq 0; then
1619
kldload ipfw > /dev/null 2>&1 || kldstat -v | grep -q ipfw
1620
fi
1621
ipfw -f flush > /dev/null 2>&1 || die "please load ipfw in base system"
1622
ipfw add 65000 permit ip from any to any > /dev/null 2>&1
1623
1624
# Per host setup.
1625
setup_networking
1626
reachability_check
1627
1628
#
1629
# Tests
1630
#
1631
1632
fwd_default_fib_symmetric
1633
fwd_default_fib_symmetric_ifconfig
1634
fwd_default_fib_symmetric_ipfw
1635
1636
fwd_fib_symmetric_ifconfig ${RT_NUMFIBS}
1637
fwd_fib_symmetric_ipfw ${RT_NUMFIBS}
1638
1639
fwd_fib_asymmetric_ifconfig ${RT_NUMFIBS}
1640
fwd_fib_asymmetric_ipfw ${RT_NUMFIBS}
1641
1642
fwd_fib_symmetric_destructive_ifconfig ${RT_NUMFIBS}
1643
fwd_fib_symmetric_destructive_ipfw ${RT_NUMFIBS}
1644
1645
fwd_fib_symmetric_destructive_defroute_ifconfig ${RT_NUMFIBS}
1646
fwd_fib_symmetric_destructive_defroute_ipfw ${RT_NUMFIBS}
1647
1648
# Per host cleanup.
1649
cleanup_networking
1650
1651
# end
1652
1653