@@ -142,6 +142,7 @@ dummy6_mask="64"
142
142
143
143
cleanup_done=1
144
144
err_buf=
145
+ tcpdump_pids=
145
146
146
147
err () {
147
148
err_buf=" ${err_buf}${1}
@@ -284,7 +285,24 @@ setup() {
284
285
done
285
286
}
286
287
288
+ trace () {
289
+ [ $tracing -eq 0 ] && return
290
+
291
+ for arg do
292
+ [ " ${ns_cmd} " = " " ] && ns_cmd=" ${arg} " && continue
293
+ ${ns_cmd} tcpdump -s 0 -i " ${arg} " -w " ${name} _${arg} .pcap" 2> /dev/null &
294
+ tcpdump_pids=" ${tcpdump_pids} $! "
295
+ ns_cmd=
296
+ done
297
+ sleep 1
298
+ }
299
+
287
300
cleanup () {
301
+ for pid in ${tcpdump_pids} ; do
302
+ kill ${pid}
303
+ done
304
+ tcpdump_pids=
305
+
288
306
[ ${cleanup_done} -eq 1 ] && return
289
307
for n in ${NS_A} ${NS_B} ${NS_R1} ${NS_R2} ; do
290
308
ip netns del ${n} 2> /dev/null
@@ -357,6 +375,10 @@ test_pmtu_ipvX() {
357
375
family=${1}
358
376
359
377
setup namespaces routing || return 2
378
+ trace " ${ns_a} " veth_A-R1 " ${ns_r1} " veth_R1-A \
379
+ " ${ns_r1} " veth_R1-B " ${ns_b} " veth_B-R1 \
380
+ " ${ns_a} " veth_A-R2 " ${ns_r2} " veth_R2-A \
381
+ " ${ns_r2} " veth_R2-B " ${ns_b} " veth_B-R2
360
382
361
383
if [ ${family} -eq 4 ]; then
362
384
ping=ping
@@ -445,6 +467,8 @@ test_pmtu_ipv6_exception() {
445
467
446
468
test_pmtu_vti4_exception () {
447
469
setup namespaces veth vti4 xfrm4 || return 2
470
+ trace " ${ns_a} " veth_a " ${ns_b} " veth_b \
471
+ " ${ns_a} " vti4_a " ${ns_b} " vti4_b
448
472
449
473
veth_mtu=1500
450
474
vti_mtu=$(( veth_mtu - 20 ))
@@ -473,6 +497,8 @@ test_pmtu_vti4_exception() {
473
497
474
498
test_pmtu_vti6_exception () {
475
499
setup namespaces veth vti6 xfrm6 || return 2
500
+ trace " ${ns_a} " veth_a " ${ns_b} " veth_b \
501
+ " ${ns_a} " vti6_a " ${ns_b} " vti6_b
476
502
fail=0
477
503
478
504
# Create route exception by exceeding link layer MTU
@@ -641,15 +667,56 @@ test_pmtu_vti6_link_change_mtu() {
641
667
return ${fail}
642
668
}
643
669
644
- trap cleanup EXIT
670
+ usage () {
671
+ echo
672
+ echo " $0 [OPTIONS] [TEST]..."
673
+ echo " If no TEST argument is given, all tests will be run."
674
+ echo
675
+ echo " Options"
676
+ echo " --trace: capture traffic to TEST_INTERFACE.pcap"
677
+ echo
678
+ echo " Available tests${tests} "
679
+ exit 1
680
+ }
645
681
646
682
exitcode=0
647
683
desc=0
648
684
IFS="
649
685
"
686
+
687
+ tracing=0
688
+ for arg do
689
+ if [ " ${arg} " != " ${arg# --* } " ]; then
690
+ opt=" ${arg# --} "
691
+ if [ " ${opt} " = " trace" ]; then
692
+ if which tcpdump > /dev/null 2>&1 ; then
693
+ tracing=1
694
+ else
695
+ echo " === tcpdump not available, tracing disabled"
696
+ fi
697
+ else
698
+ usage
699
+ fi
700
+ else
701
+ # Check first that all requested tests are available before
702
+ # running any
703
+ command -v > /dev/null " test_${arg} " || { echo " === Test ${arg} not found" ; usage; }
704
+ fi
705
+ done
706
+
707
+ trap cleanup EXIT
708
+
650
709
for t in ${tests} ; do
651
710
[ $desc -eq 0 ] && name=" ${t} " && desc=1 && continue || desc=0
652
711
712
+ run_this=1
713
+ for arg do
714
+ [ " ${arg} " != " ${arg# --* } " ] && continue
715
+ [ " ${arg} " = " ${name} " ] && run_this=1 && break
716
+ run_this=0
717
+ done
718
+ [ $run_this -eq 0 ] && continue
719
+
653
720
(
654
721
unset IFS
655
722
eval test_${name}
0 commit comments