selftests: forwarding: add helpers for IP multicast group joins/leaves
authorVladimir Oltean <vladimir.oltean@nxp.com>
Fri, 22 Apr 2022 10:15:00 +0000 (13:15 +0300)
committerDavid S. Miller <davem@davemloft.net>
Sat, 23 Apr 2022 11:18:16 +0000 (12:18 +0100)
Extend the forwarding library with calls to some small C programs which
join an IP multicast group and send some packets to it. Both IPv4 and
IPv6 groups are supported. Use cases range from testing IGMP/MLD
snooping, to RX filtering, to multicast routing.

Testing multicast traffic using msend/mreceive is intended to be done
using tcpdump.

Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
tools/testing/selftests/net/forwarding/lib.sh

index 7eff5ecf7565fd76dfe35d6f9f8e5d4ff00ad100..15fb46b39fe80d5bbd9a4766bd7df5e4da8f1397 100755 (executable)
@@ -27,6 +27,7 @@ INTERFACE_TIMEOUT=${INTERFACE_TIMEOUT:=600}
 LOW_AGEING_TIME=${LOW_AGEING_TIME:=1000}
 REQUIRE_JQ=${REQUIRE_JQ:=yes}
 REQUIRE_MZ=${REQUIRE_MZ:=yes}
+REQUIRE_MTOOLS=${REQUIRE_MTOOLS:=no}
 STABLE_MAC_ADDRS=${STABLE_MAC_ADDRS:=no}
 TCPDUMP_EXTRA_FLAGS=${TCPDUMP_EXTRA_FLAGS:=}
 
@@ -161,6 +162,12 @@ fi
 if [[ "$REQUIRE_MZ" = "yes" ]]; then
        require_command $MZ
 fi
+if [[ "$REQUIRE_MTOOLS" = "yes" ]]; then
+       # https://github.com/vladimiroltean/mtools/
+       # patched for IPv6 support
+       require_command msend
+       require_command mreceive
+fi
 
 if [[ ! -v NUM_NETIFS ]]; then
        echo "SKIP: importer does not define \"NUM_NETIFS\""
@@ -1548,6 +1555,37 @@ brmcast_check_sg_state()
        done
 }
 
+mc_join()
+{
+       local if_name=$1
+       local group=$2
+       local vrf_name=$(master_name_get $if_name)
+
+       # We don't care about actual reception, just about joining the
+       # IP multicast group and adding the L2 address to the device's
+       # MAC filtering table
+       ip vrf exec $vrf_name \
+               mreceive -g $group -I $if_name > /dev/null 2>&1 &
+       mreceive_pid=$!
+
+       sleep 1
+}
+
+mc_leave()
+{
+       kill "$mreceive_pid" && wait "$mreceive_pid"
+}
+
+mc_send()
+{
+       local if_name=$1
+       local groups=$2
+       local vrf_name=$(master_name_get $if_name)
+
+       ip vrf exec $vrf_name \
+               msend -g $groups -I $if_name -c 1 > /dev/null 2>&1
+}
+
 start_ip_monitor()
 {
        local mtype=$1; shift