Skip to content

Commit

Permalink
test: verify IPv4 & IPv6 group join/leave (ASM + SSM)
Browse files Browse the repository at this point in the history
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
  • Loading branch information
troglobit committed Jul 30, 2021
1 parent 31e5698 commit d1f13a7
Show file tree
Hide file tree
Showing 3 changed files with 195 additions and 1 deletion.
2 changes: 1 addition & 1 deletion test/Makefile.am
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
EXTRA_DIST = basic.sh bridge.sh docky.sh ipv6.sh isolated.sh lib.sh vlan.sh
EXTRA_DIST = basic.sh bridge.sh ipv6.sh isolated.sh join.sh lib.sh vlan.sh
CLEANFILES = *~ *.trs *.log
TEST_EXTENSIONS = .sh
TESTS_ENVIRONMENT = unshare -mrun
Expand Down
10 changes: 10 additions & 0 deletions test/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -191,4 +191,14 @@ be used to send multicast. Lowering the barrier of entry to run tests.
**Topology:** Isolated


### Join/Leave ASM/SSM

Verify ASM & SSM join and leave for IPv4 & IPv6. Since ASM and SSM
cannot be mixed on the same interface (fallback to ASM occurs), we
use different interfaces and verify operation by inspecting the Linux
`ip maddr` and `/proc/net/mcfilter` output.

**Topology:** Basic


[issue-161]: https://github.com/troglobit/smcroute/issues/161
184 changes: 184 additions & 0 deletions test/join.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,184 @@
#!/bin/sh
# Verify join/leave multicast groups for both IPv4 and IPv6
# a1 will be used to verify SSM and a2 to verify ASM
#
# Note: this test is really ugly and full of code duplcation

# shellcheck source=/dev/null
. "$(dirname "$0")/lib.sh"

print "Creating world ..."
topo basic

# IP world ...
ip addr add 10.0.0.1/24 dev a1
ip addr add 20.0.0.1/24 dev a2
ip addr add 2001:1::1/64 dev a1
ip addr add 2001:2::1/64 dev a2
ip -br a

################################################################## STATIC GROUPS
print "Phase 1: Join groups (.conf)"
cat <<EOF > "/tmp/$NM/conf"
# ASM + SSM join/leave multicast groups
phyint a1 enable
phyint a2 enable
mgroup from a1 source fc00::1 group ff04:0:0:0:0:0:0:114
mgroup from a1 source 10.0.0.10 group 225.1.2.3
mgroup from a2 group ff2e::42
mgroup from a2 group 225.3.2.1
EOF
cat "/tmp/$NM/conf"

print "Starting smcrouted ..."
../src/smcrouted -f "/tmp/$NM/conf" -n -N -P "/tmp/$NM/pid" -l debug -S "/tmp/$NM/sock" &
sleep 1

echo "-----------------------------------------------------------------------------------"
../src/smcroutectl -pS "/tmp/$NM/sock" show interfaces
echo "-----------------------------------------------------------------------------------"
../src/smcroutectl -pS "/tmp/$NM/sock" show groups
echo "-----------------------------------------------------------------------------------"
grep "0xe1010203 0x0a00000a" /proc/net/mcfilter
config_ssm=$?
grep "ff040000000000000000000000000114 fc000000000000000000000000000001" /proc/net/mcfilter6
config_ssm6=$?
ip maddr show dev a2 | grep 225.3.2.1
config_asm=$?
ip -6 maddr show dev a2 | grep ff2e::42
config_asm6=$?

# shellcheck disable=SC2166
if [ $config_ssm -eq 0 -a $config_ssm6 -eq 0 ]; then
echo "Config SSM join OK"
config_ssm=0
else
echo "Config SSM join FAIL"
config_ssm=1
fi

# shellcheck disable=SC2166
if [ $config_asm -eq 0 -a $config_asm6 -eq 0 ]; then
echo "Config ASM join OK"
config_asm=0
else
echo "Config ASM join FAIL"
config_asm=1
fi

# shellcheck disable=SC2166
if [ $config_ssm -eq 0 -a $config_asm -eq 0 ]; then
echo "Config join OK"
config=0
else
echo "Config join FAIL"
config=1
fi

#################################################################### JOIN GROUPS
print "Phase 2: Join groups (IPC)"
../src/smcroutectl -S "/tmp/$NM/sock" join a1 10.0.0.11 225.1.1.1
../src/smcroutectl -S "/tmp/$NM/sock" join a2 225.2.2.2

../src/smcroutectl -S "/tmp/$NM/sock" join a1 fc00::2 ff04::111
../src/smcroutectl -S "/tmp/$NM/sock" join a2 ff2e::22

echo "-----------------------------------------------------------------------------------"
../src/smcroutectl -pS "/tmp/$NM/sock" show interfaces
echo "-----------------------------------------------------------------------------------"
../src/smcroutectl -pS "/tmp/$NM/sock" show groups
echo "-----------------------------------------------------------------------------------"
grep "0xe1010101 0x0a00000b" /proc/net/mcfilter
dynamic_ssm=$?
grep "ff040000000000000000000000000111 fc000000000000000000000000000002" /proc/net/mcfilter6
dynamic_ssm6=$?
ip maddr show dev a2 | grep 225.2.2.2
dynamic_asm=$?
ip -6 maddr show dev a2 | grep ff2e::22
dynamic_asm6=$?

# shellcheck disable=SC2166
if [ $dynamic_ssm -eq 0 -a $dynamic_ssm6 -eq 0 ]; then
echo "Dynamic SSM join OK"
dynamic_ssm=0
else
echo "Dynamic SSM join FAIL"
dynamic_ssm=1
fi

# shellcheck disable=SC2166
if [ $dynamic_asm -eq 0 -a $dynamic_asm6 -eq 0 ]; then
echo "Dynamic ASM join OK"
dynamic_asm=0
else
echo "Dynamic ASM join FAIL"
dynamic_asm=1
fi

# shellcheck disable=SC2166
if [ $dynamic_ssm -eq 0 -a $dynamic_asm -eq 0 ]; then
echo "Dynamic join OK"
dynamic=0
else
echo "Dynamic join FAIL"
dynamic=1
fi

################################################################### LEAVE GROUPS
print "Phase 3: Leave groups (IPC)"
../src/smcroutectl -S "/tmp/$NM/sock" leave a1 10.0.0.10 225.1.2.3
../src/smcroutectl -S "/tmp/$NM/sock" leave a2 225.3.2.1

../src/smcroutectl -S "/tmp/$NM/sock" leave a1 fc00::1 ff04::114
../src/smcroutectl -S "/tmp/$NM/sock" leave a2 ff2e::42

echo "-----------------------------------------------------------------------------------"
../src/smcroutectl -pS "/tmp/$NM/sock" show interfaces
echo "-----------------------------------------------------------------------------------"
../src/smcroutectl -pS "/tmp/$NM/sock" show groups
echo "-----------------------------------------------------------------------------------"
grep "0xe1010203 0x0a00000a" /proc/net/mcfilter
leave_ssm=$?
grep "ff040000000000000000000000000114 fc000000000000000000000000000001" /proc/net/mcfilter6
leave_ssm6=$?
ip maddr show dev a2 | grep 225.3.2.1
leave_asm=$?
ip -6 maddr show dev a2 | grep ff2e::42
leave_asm6=$?

# shellcheck disable=SC2166
if [ $leave_ssm -eq 1 -a $leave_ssm6 -eq 1 ]; then
echo "Dynamic SSM leave OK"
leave_ssm=0
else
echo "Dynamic SSM leave FAIL"
leave_ssm=1
fi

# shellcheck disable=SC2166
if [ $leave_asm -eq 1 -a $leave_asm6 -eq 1 ]; then
echo "Dynamic ASM leave OK"
leave_asm=0
else
echo "Dynamic ASM leave FAIL"
leave_asm=1
fi

# shellcheck disable=SC2166
if [ $leave_ssm -eq 0 -a $leave_asm -eq 0 ]; then
echo "Dynamic leave OK"
leave=0
else
echo "Dynamic leave FAIL"
leave=1
fi

########################################################################### DONE
print "Cleaning up ..."
topo teardown

# shellcheck disable=SC2166
[ $config -eq 0 -a $dynamic -eq 0 -a $leave -eq 0 ] && exit 0
exit 1

0 comments on commit d1f13a7

Please sign in to comment.