selftests: forwarding: multiple instances in tcpdump helper
authorJoachim Wiberg <troglobit@gmail.com>
Fri, 22 Apr 2022 10:14:59 +0000 (13:14 +0300)
committerDavid S. Miller <davem@davemloft.net>
Sat, 23 Apr 2022 11:18:16 +0000 (12:18 +0100)
Extend tcpdump_start() & C:o to handle multiple instances.  Useful when
observing bridge operation, e.g., unicast learning/flooding, and any
case of multicast distribution (to these ports but not that one ...).

This means the interface argument is now a mandatory argument to all
tcpdump_*() functions, hence the changes to the ocelot flower test.

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
Reviewed-by: Vladimir Oltean <vladimir.oltean@nxp.com>
Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
tools/testing/selftests/drivers/net/ocelot/tc_flower_chains.sh
tools/testing/selftests/net/forwarding/lib.sh

index eaf8a04a7ca5f18633871b79eed97e9b3d9f3f40..7e684e27a682f5e0c3446f054636e6af59fb1ad0 100755 (executable)
@@ -215,15 +215,15 @@ test_vlan_pop()
 
        sleep 1
 
-       tcpdump_stop
+       tcpdump_stop $eth2
 
-       if tcpdump_show | grep -q "$eth3_mac > $eth2_mac, ethertype IPv4"; then
+       if tcpdump_show $eth2 | grep -q "$eth3_mac > $eth2_mac, ethertype IPv4"; then
                echo "OK"
        else
                echo "FAIL"
        fi
 
-       tcpdump_cleanup
+       tcpdump_cleanup $eth2
 }
 
 test_vlan_push()
@@ -236,15 +236,15 @@ test_vlan_push()
 
        sleep 1
 
-       tcpdump_stop
+       tcpdump_stop $eth3.100
 
-       if tcpdump_show | grep -q "$eth2_mac > $eth3_mac"; then
+       if tcpdump_show $eth3.100 | grep -q "$eth2_mac > $eth3_mac"; then
                echo "OK"
        else
                echo "FAIL"
        fi
 
-       tcpdump_cleanup
+       tcpdump_cleanup $eth3.100
 }
 
 test_vlan_ingress_modify()
@@ -267,15 +267,15 @@ test_vlan_ingress_modify()
 
        sleep 1
 
-       tcpdump_stop
+       tcpdump_stop $eth2
 
-       if tcpdump_show | grep -q "$eth3_mac > $eth2_mac, .* vlan 300"; then
+       if tcpdump_show $eth2 | grep -q "$eth3_mac > $eth2_mac, .* vlan 300"; then
                echo "OK"
        else
                echo "FAIL"
        fi
 
-       tcpdump_cleanup
+       tcpdump_cleanup $eth2
 
        tc filter del dev $eth0 ingress chain $(IS1 2) pref 3
 
@@ -305,15 +305,15 @@ test_vlan_egress_modify()
 
        sleep 1
 
-       tcpdump_stop
+       tcpdump_stop $eth2
 
-       if tcpdump_show | grep -q "$eth3_mac > $eth2_mac, .* vlan 300"; then
+       if tcpdump_show $eth2 | grep -q "$eth3_mac > $eth2_mac, .* vlan 300"; then
                echo "OK"
        else
                echo "FAIL"
        fi
 
-       tcpdump_cleanup
+       tcpdump_cleanup $eth2
 
        tc filter del dev $eth1 egress chain $(ES0) pref 3
        tc qdisc del dev $eth1 clsact
index de10451d767164f05f05ae25b9dec75d516fb1e3..7eff5ecf7565fd76dfe35d6f9f8e5d4ff00ad100 100755 (executable)
@@ -1386,13 +1386,17 @@ stop_traffic()
        { kill %% && wait %%; } 2>/dev/null
 }
 
+declare -A cappid
+declare -A capfile
+declare -A capout
+
 tcpdump_start()
 {
        local if_name=$1; shift
        local ns=$1; shift
 
-       capfile=$(mktemp)
-       capout=$(mktemp)
+       capfile[$if_name]=$(mktemp)
+       capout[$if_name]=$(mktemp)
 
        if [ -z $ns ]; then
                ns_cmd=""
@@ -1407,26 +1411,34 @@ tcpdump_start()
        fi
 
        $ns_cmd tcpdump $TCPDUMP_EXTRA_FLAGS -e -n -Q in -i $if_name \
-               -s 65535 -B 32768 $capuser -w $capfile > "$capout" 2>&1 &
-       cappid=$!
+               -s 65535 -B 32768 $capuser -w ${capfile[$if_name]} \
+               > "${capout[$if_name]}" 2>&1 &
+       cappid[$if_name]=$!
 
        sleep 1
 }
 
 tcpdump_stop()
 {
-       $ns_cmd kill $cappid
+       local if_name=$1
+       local pid=${cappid[$if_name]}
+
+       $ns_cmd kill "$pid" && wait "$pid"
        sleep 1
 }
 
 tcpdump_cleanup()
 {
-       rm $capfile $capout
+       local if_name=$1
+
+       rm ${capfile[$if_name]} ${capout[$if_name]}
 }
 
 tcpdump_show()
 {
-       tcpdump -e -n -r $capfile 2>&1
+       local if_name=$1
+
+       tcpdump -e -n -r ${capfile[$if_name]} 2>&1
 }
 
 # return 0 if the packet wasn't seen on host2_if or 1 if it was