Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

selftests: forwarding: bridge_mdb: Fix failing test with old libnet

As explained in commit 8bcfb4ae4d97 ("selftests: forwarding: Fix failing
tests with old libnet"), old versions of libnet (used by mausezahn) do
not use the "SO_BINDTODEVICE" socket option. For IP unicast packets,
this can be solved by prefixing mausezahn invocations with "ip vrf
exec". However, IP multicast packets do not perform routing and simply
egress the bound device, which does not exist in this case.

Fix by specifying the source and destination MAC of the packet which
will cause mausezahn to use a packet socket instead of an IP socket.

Fixes: b6d00da08610 ("selftests: forwarding: Add bridge MDB test")
Reported-by: Mirsad Todorovac <mirsad.todorovac@alu.unizg.hr>
Closes: https://lore.kernel.org/netdev/adc5e40d-d040-a65e-eb26-edf47dac5b02@alu.unizg.hr/
Signed-off-by: Ido Schimmel <idosch@nvidia.com>
Tested-by: Mirsad Todorovac <mirsad.todorovac@alu.unizg.hr>
Reviewed-by: Hangbin Liu <liuhangbin@gmail.com>
Acked-by: Nikolay Aleksandrov <razor@blackwall.org>
Link: https://lore.kernel.org/r/20230808141503.4060661-16-idosch@nvidia.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>

authored by

Ido Schimmel and committed by
Jakub Kicinski
e98e195d 21a72166

+24 -22
+24 -22
tools/testing/selftests/net/forwarding/bridge_mdb.sh
··· 850 850 __fwd_test_host_ip() 851 851 { 852 852 local grp=$1; shift 853 + local dmac=$1; shift 853 854 local src=$1; shift 854 855 local mode=$1; shift 855 856 local name ··· 873 872 # Packet should only be flooded to multicast router ports when there is 874 873 # no matching MDB entry. The bridge is not configured as a multicast 875 874 # router port. 876 - $MZ $mode $h1.10 -c 1 -p 128 -A $src -B $grp -t udp -q 875 + $MZ $mode $h1.10 -a own -b $dmac -c 1 -p 128 -A $src -B $grp -t udp -q 877 876 tc_check_packets "dev br0 ingress" 1 0 878 877 check_err $? "Packet locally received after flood" 879 878 880 879 # Install a regular port group entry and expect the packet to not be 881 880 # locally received. 882 881 bridge mdb add dev br0 port $swp2 grp $grp temp vid 10 883 - $MZ $mode $h1.10 -c 1 -p 128 -A $src -B $grp -t udp -q 882 + $MZ $mode $h1.10 -a own -b $dmac -c 1 -p 128 -A $src -B $grp -t udp -q 884 883 tc_check_packets "dev br0 ingress" 1 0 885 884 check_err $? "Packet locally received after installing a regular entry" 886 885 887 886 # Add a host entry and expect the packet to be locally received. 888 887 bridge mdb add dev br0 port br0 grp $grp temp vid 10 889 - $MZ $mode $h1.10 -c 1 -p 128 -A $src -B $grp -t udp -q 888 + $MZ $mode $h1.10 -a own -b $dmac -c 1 -p 128 -A $src -B $grp -t udp -q 890 889 tc_check_packets "dev br0 ingress" 1 1 891 890 check_err $? "Packet not locally received after adding a host entry" 892 891 893 892 # Remove the host entry and expect the packet to not be locally 894 893 # received. 895 894 bridge mdb del dev br0 port br0 grp $grp vid 10 896 - $MZ $mode $h1.10 -c 1 -p 128 -A $src -B $grp -t udp -q 895 + $MZ $mode $h1.10 -a own -b $dmac -c 1 -p 128 -A $src -B $grp -t udp -q 897 896 tc_check_packets "dev br0 ingress" 1 1 898 897 check_err $? "Packet locally received after removing a host entry" 899 898 ··· 906 905 907 906 fwd_test_host_ip() 908 907 { 909 - __fwd_test_host_ip "239.1.1.1" "192.0.2.1" "-4" 910 - __fwd_test_host_ip "ff0e::1" "2001:db8:1::1" "-6" 908 + __fwd_test_host_ip "239.1.1.1" "01:00:5e:01:01:01" "192.0.2.1" "-4" 909 + __fwd_test_host_ip "ff0e::1" "33:33:00:00:00:01" "2001:db8:1::1" "-6" 911 910 } 912 911 913 912 fwd_test_host_l2() ··· 967 966 __fwd_test_port_ip() 968 967 { 969 968 local grp=$1; shift 969 + local dmac=$1; shift 970 970 local valid_src=$1; shift 971 971 local invalid_src=$1; shift 972 972 local mode=$1; shift ··· 1001 999 vlan_ethtype $eth_type vlan_id 10 dst_ip $grp \ 1002 1000 src_ip $invalid_src action drop 1003 1001 1004 - $MZ $mode $h1.10 -c 1 -p 128 -A $valid_src -B $grp -t udp -q 1002 + $MZ $mode $h1.10 -a own -b $dmac -c 1 -p 128 -A $valid_src -B $grp -t udp -q 1005 1003 tc_check_packets "dev $h2 ingress" 1 0 1006 1004 check_err $? "Packet from valid source received on H2 before adding entry" 1007 1005 1008 - $MZ $mode $h1.10 -c 1 -p 128 -A $invalid_src -B $grp -t udp -q 1006 + $MZ $mode $h1.10 -a own -b $dmac -c 1 -p 128 -A $invalid_src -B $grp -t udp -q 1009 1007 tc_check_packets "dev $h2 ingress" 2 0 1010 1008 check_err $? "Packet from invalid source received on H2 before adding entry" 1011 1009 1012 1010 bridge mdb add dev br0 port $swp2 grp $grp vid 10 \ 1013 1011 filter_mode $filter_mode source_list $src_list 1014 1012 1015 - $MZ $mode $h1.10 -c 1 -p 128 -A $valid_src -B $grp -t udp -q 1013 + $MZ $mode $h1.10 -a own -b $dmac -c 1 -p 128 -A $valid_src -B $grp -t udp -q 1016 1014 tc_check_packets "dev $h2 ingress" 1 1 1017 1015 check_err $? "Packet from valid source not received on H2 after adding entry" 1018 1016 1019 - $MZ $mode $h1.10 -c 1 -p 128 -A $invalid_src -B $grp -t udp -q 1017 + $MZ $mode $h1.10 -a own -b $dmac -c 1 -p 128 -A $invalid_src -B $grp -t udp -q 1020 1018 tc_check_packets "dev $h2 ingress" 2 0 1021 1019 check_err $? "Packet from invalid source received on H2 after adding entry" 1022 1020 1023 1021 bridge mdb replace dev br0 port $swp2 grp $grp vid 10 \ 1024 1022 filter_mode exclude 1025 1023 1026 - $MZ $mode $h1.10 -c 1 -p 128 -A $valid_src -B $grp -t udp -q 1024 + $MZ $mode $h1.10 -a own -b $dmac -c 1 -p 128 -A $valid_src -B $grp -t udp -q 1027 1025 tc_check_packets "dev $h2 ingress" 1 2 1028 1026 check_err $? "Packet from valid source not received on H2 after allowing all sources" 1029 1027 1030 - $MZ $mode $h1.10 -c 1 -p 128 -A $invalid_src -B $grp -t udp -q 1028 + $MZ $mode $h1.10 -a own -b $dmac -c 1 -p 128 -A $invalid_src -B $grp -t udp -q 1031 1029 tc_check_packets "dev $h2 ingress" 2 1 1032 1030 check_err $? "Packet from invalid source not received on H2 after allowing all sources" 1033 1031 1034 1032 bridge mdb del dev br0 port $swp2 grp $grp vid 10 1035 1033 1036 - $MZ $mode $h1.10 -c 1 -p 128 -A $valid_src -B $grp -t udp -q 1034 + $MZ $mode $h1.10 -a own -b $dmac -c 1 -p 128 -A $valid_src -B $grp -t udp -q 1037 1035 tc_check_packets "dev $h2 ingress" 1 2 1038 1036 check_err $? "Packet from valid source received on H2 after deleting entry" 1039 1037 1040 - $MZ $mode $h1.10 -c 1 -p 128 -A $invalid_src -B $grp -t udp -q 1038 + $MZ $mode $h1.10 -a own -b $dmac -c 1 -p 128 -A $invalid_src -B $grp -t udp -q 1041 1039 tc_check_packets "dev $h2 ingress" 2 1 1042 1040 check_err $? "Packet from invalid source received on H2 after deleting entry" 1043 1041 ··· 1049 1047 1050 1048 fwd_test_port_ip() 1051 1049 { 1052 - __fwd_test_port_ip "239.1.1.1" "192.0.2.1" "192.0.2.2" "-4" "exclude" 1053 - __fwd_test_port_ip "ff0e::1" "2001:db8:1::1" "2001:db8:1::2" "-6" \ 1050 + __fwd_test_port_ip "239.1.1.1" "01:00:5e:01:01:01" "192.0.2.1" "192.0.2.2" "-4" "exclude" 1051 + __fwd_test_port_ip "ff0e::1" "33:33:00:00:00:01" "2001:db8:1::1" "2001:db8:1::2" "-6" \ 1054 1052 "exclude" 1055 - __fwd_test_port_ip "239.1.1.1" "192.0.2.1" "192.0.2.2" "-4" "include" 1056 - __fwd_test_port_ip "ff0e::1" "2001:db8:1::1" "2001:db8:1::2" "-6" \ 1053 + __fwd_test_port_ip "239.1.1.1" "01:00:5e:01:01:01" "192.0.2.1" "192.0.2.2" "-4" "include" 1054 + __fwd_test_port_ip "ff0e::1" "33:33:00:00:00:01" "2001:db8:1::1" "2001:db8:1::2" "-6" \ 1057 1055 "include" 1058 1056 } 1059 1057 ··· 1129 1127 filter_mode include source_list 192.0.2.1 1130 1128 1131 1129 # IS_IN ( 192.0.2.2 ) 1132 - $MZ $h1.10 -c 1 -A 192.0.2.1 -B 239.1.1.1 \ 1130 + $MZ $h1.10 -c 1 -a own -b 01:00:5e:01:01:01 -A 192.0.2.1 -B 239.1.1.1 \ 1133 1131 -t ip proto=2,p=$(igmpv3_is_in_get 239.1.1.1 192.0.2.2) -q 1134 1132 1135 1133 bridge -d mdb show dev br0 vid 10 | grep 239.1.1.1 | grep -q 192.0.2.2 ··· 1142 1140 filter_mode include source_list 192.0.2.1 1143 1141 1144 1142 # IS_IN ( 192.0.2.2 ) 1145 - $MZ $h1.10 -c 1 -A 192.0.2.1 -B 239.1.1.1 \ 1143 + $MZ $h1.10 -a own -b 01:00:5e:01:01:01 -c 1 -A 192.0.2.1 -B 239.1.1.1 \ 1146 1144 -t ip proto=2,p=$(igmpv3_is_in_get 239.1.1.1 192.0.2.2) -q 1147 1145 1148 1146 bridge -d mdb show dev br0 vid 10 | grep 239.1.1.1 | grep -v "src" | \ ··· 1169 1167 1170 1168 # IS_IN ( 2001:db8:1::2 ) 1171 1169 local p=$(mldv2_is_in_get fe80::1 ff0e::1 2001:db8:1::2) 1172 - $MZ -6 $h1.10 -c 1 -A fe80::1 -B ff0e::1 \ 1170 + $MZ -6 $h1.10 -a own -b 33:33:00:00:00:01 -c 1 -A fe80::1 -B ff0e::1 \ 1173 1171 -t ip hop=1,next=0,p="$p" -q 1174 1172 1175 1173 bridge -d mdb show dev br0 vid 10 | grep ff0e::1 | \ ··· 1183 1181 filter_mode include source_list 2001:db8:1::1 1184 1182 1185 1183 # IS_IN ( 2001:db8:1::2 ) 1186 - $MZ -6 $h1.10 -c 1 -A fe80::1 -B ff0e::1 \ 1184 + $MZ -6 $h1.10 -a own -b 33:33:00:00:00:01 -c 1 -A fe80::1 -B ff0e::1 \ 1187 1185 -t ip hop=1,next=0,p="$p" -q 1188 1186 1189 1187 bridge -d mdb show dev br0 vid 10 | grep ff0e::1 | grep -v "src" | \