358 lines · bash
1#!/bin/bash2# SPDX-License-Identifier: GPL-2.03 4# +-----------------------+ +----------------------+5# | H1 (vrf) | | H2 (vrf) |6# | + $h1 | | $h2 + |7# | | 192.0.2.1/28 | | 192.0.2.2/28 | |8# | | 2001:db8:1::1/64 | | 2001:db8:1::2/64 | |9# +----|------------------+ +------------------|---+10# | |11# +----|-------------------------------------------------------------------|---+12# | SW | | |13# | +-|-------------------------------------------------------------------|-+ |14# | | + $swp1 BR $swp2 + | |15# | +-----------------------------------------------------------------------+ |16# +----------------------------------------------------------------------------+17 18ALL_TESTS="19 test_l2_miss_unicast20 test_l2_miss_multicast21 test_l2_miss_ll_multicast22 test_l2_miss_broadcast23"24 25NUM_NETIFS=426source lib.sh27source tc_common.sh28 29h1_create()30{31 simple_if_init $h1 192.0.2.1/28 2001:db8:1::1/6432}33 34h1_destroy()35{36 simple_if_fini $h1 192.0.2.1/28 2001:db8:1::1/6437}38 39h2_create()40{41 simple_if_init $h2 192.0.2.2/28 2001:db8:1::2/6442}43 44h2_destroy()45{46 simple_if_fini $h2 192.0.2.2/28 2001:db8:1::2/6447}48 49switch_create()50{51 ip link add name br1 up type bridge52 ip link set dev $swp1 master br153 ip link set dev $swp1 up54 ip link set dev $swp2 master br155 ip link set dev $swp2 up56 57 tc qdisc add dev $swp2 clsact58}59 60switch_destroy()61{62 tc qdisc del dev $swp2 clsact63 64 ip link set dev $swp2 down65 ip link set dev $swp2 nomaster66 ip link set dev $swp1 down67 ip link set dev $swp1 nomaster68 ip link del dev br169}70 71test_l2_miss_unicast()72{73 local dmac=00:01:02:03:04:0574 local dip=192.0.2.275 local sip=192.0.2.176 77 RET=078 79 # Unknown unicast.80 tc filter add dev $swp2 egress protocol ipv4 handle 101 pref 1 \81 flower indev $swp1 l2_miss 1 dst_mac $dmac src_ip $sip \82 dst_ip $dip action pass83 # Known unicast.84 tc filter add dev $swp2 egress protocol ipv4 handle 102 pref 1 \85 flower indev $swp1 l2_miss 0 dst_mac $dmac src_ip $sip \86 dst_ip $dip action pass87 88 # Before adding FDB entry.89 $MZ $h1 -a own -b $dmac -t ip -A $sip -B $dip -c 1 -p 100 -q90 91 tc_check_packets "dev $swp2 egress" 101 192 check_err $? "Unknown unicast filter was not hit before adding FDB entry"93 94 tc_check_packets "dev $swp2 egress" 102 095 check_err $? "Known unicast filter was hit before adding FDB entry"96 97 # Adding FDB entry.98 bridge fdb replace $dmac dev $swp2 master static99 100 $MZ $h1 -a own -b $dmac -t ip -A $sip -B $dip -c 1 -p 100 -q101 102 tc_check_packets "dev $swp2 egress" 101 1103 check_err $? "Unknown unicast filter was hit after adding FDB entry"104 105 tc_check_packets "dev $swp2 egress" 102 1106 check_err $? "Known unicast filter was not hit after adding FDB entry"107 108 # Deleting FDB entry.109 bridge fdb del $dmac dev $swp2 master static110 111 $MZ $h1 -a own -b $dmac -t ip -A $sip -B $dip -c 1 -p 100 -q112 113 tc_check_packets "dev $swp2 egress" 101 2114 check_err $? "Unknown unicast filter was not hit after deleting FDB entry"115 116 tc_check_packets "dev $swp2 egress" 102 1117 check_err $? "Known unicast filter was hit after deleting FDB entry"118 119 tc filter del dev $swp2 egress protocol ipv4 pref 1 handle 102 flower120 tc filter del dev $swp2 egress protocol ipv4 pref 1 handle 101 flower121 122 log_test "L2 miss - Unicast"123}124 125test_l2_miss_multicast_common()126{127 local proto=$1; shift128 local sip=$1; shift129 local dip=$1; shift130 local dmac=$1; shift131 local mode=$1; shift132 local name=$1; shift133 134 RET=0135 136 # Unregistered multicast.137 tc filter add dev $swp2 egress protocol $proto handle 101 pref 1 \138 flower indev $swp1 l2_miss 1 src_ip $sip dst_ip $dip \139 action pass140 # Registered multicast.141 tc filter add dev $swp2 egress protocol $proto handle 102 pref 1 \142 flower indev $swp1 l2_miss 0 src_ip $sip dst_ip $dip \143 action pass144 145 # Before adding MDB entry.146 $MZ $mode $h1 -a own -b $dmac -t ip -A $sip -B $dip -c 1 -p 100 -q147 148 tc_check_packets "dev $swp2 egress" 101 1149 check_err $? "Unregistered multicast filter was not hit before adding MDB entry"150 151 tc_check_packets "dev $swp2 egress" 102 0152 check_err $? "Registered multicast filter was hit before adding MDB entry"153 154 # Adding MDB entry.155 bridge mdb replace dev br1 port $swp2 grp $dip permanent156 157 $MZ $mode $h1 -a own -b $dmac -t ip -A $sip -B $dip -c 1 -p 100 -q158 159 tc_check_packets "dev $swp2 egress" 101 1160 check_err $? "Unregistered multicast filter was hit after adding MDB entry"161 162 tc_check_packets "dev $swp2 egress" 102 1163 check_err $? "Registered multicast filter was not hit after adding MDB entry"164 165 # Deleting MDB entry.166 bridge mdb del dev br1 port $swp2 grp $dip167 168 $MZ $mode $h1 -a own -b $dmac -t ip -A $sip -B $dip -c 1 -p 100 -q169 170 tc_check_packets "dev $swp2 egress" 101 2171 check_err $? "Unregistered multicast filter was not hit after deleting MDB entry"172 173 tc_check_packets "dev $swp2 egress" 102 1174 check_err $? "Registered multicast filter was hit after deleting MDB entry"175 176 tc filter del dev $swp2 egress protocol $proto pref 1 handle 102 flower177 tc filter del dev $swp2 egress protocol $proto pref 1 handle 101 flower178 179 log_test "L2 miss - Multicast ($name)"180}181 182test_l2_miss_multicast_ipv4()183{184 local proto="ipv4"185 local sip=192.0.2.1186 local dip=239.1.1.1187 local dmac=01:00:5e:01:01:01188 local mode="-4"189 local name="IPv4"190 191 test_l2_miss_multicast_common $proto $sip $dip $dmac $mode $name192}193 194test_l2_miss_multicast_ipv6()195{196 local proto="ipv6"197 local sip=2001:db8:1::1198 local dip=ff0e::1199 local dmac=33:33:00:00:00:01200 local mode="-6"201 local name="IPv6"202 203 test_l2_miss_multicast_common $proto $sip $dip $dmac $mode $name204}205 206test_l2_miss_multicast()207{208 # Configure $swp2 as a multicast router port so that it will forward209 # both registered and unregistered multicast traffic.210 bridge link set dev $swp2 mcast_router 2211 212 # Set the Max Response Delay to 100 centiseconds (1 second) so that the213 # bridge will start forwarding according to its MDB soon after a214 # multicast querier is enabled.215 ip link set dev br1 type bridge mcast_query_response_interval 100216 217 # Forwarding according to MDB entries only takes place when the bridge218 # detects that there is a valid querier in the network. Set the bridge219 # as the querier and assign it a valid IPv6 link-local address to be220 # used as the source address for MLD queries.221 ip link set dev br1 type bridge mcast_querier 1222 ip -6 address add fe80::1/64 nodad dev br1223 sleep 10224 225 test_l2_miss_multicast_ipv4226 test_l2_miss_multicast_ipv6227 228 ip -6 address del fe80::1/64 dev br1229 ip link set dev br1 type bridge mcast_querier 0230 ip link set dev br1 type bridge mcast_query_response_interval 1000231 bridge link set dev $swp2 mcast_router 1232}233 234test_l2_miss_multicast_common2()235{236 local name=$1; shift237 local dmac=$1; shift238 local dip=224.0.0.1239 local sip=192.0.2.1240 241}242 243test_l2_miss_ll_multicast_common()244{245 local proto=$1; shift246 local dmac=$1; shift247 local sip=$1; shift248 local dip=$1; shift249 local mode=$1; shift250 local name=$1; shift251 252 RET=0253 254 tc filter add dev $swp2 egress protocol $proto handle 101 pref 1 \255 flower indev $swp1 l2_miss 1 dst_mac $dmac src_ip $sip \256 dst_ip $dip action pass257 258 $MZ $mode $h1 -a own -b $dmac -t ip -A $sip -B $dip -c 1 -p 100 -q259 260 tc_check_packets "dev $swp2 egress" 101 1261 check_err $? "Filter was not hit"262 263 tc filter del dev $swp2 egress protocol $proto pref 1 handle 101 flower264 265 log_test "L2 miss - Link-local multicast ($name)"266}267 268test_l2_miss_ll_multicast_ipv4()269{270 local proto=ipv4271 local dmac=01:00:5e:00:00:01272 local sip=192.0.2.1273 local dip=224.0.0.1274 local mode="-4"275 local name="IPv4"276 277 test_l2_miss_ll_multicast_common $proto $dmac $sip $dip $mode $name278}279 280test_l2_miss_ll_multicast_ipv6()281{282 local proto=ipv6283 local dmac=33:33:00:00:00:01284 local sip=2001:db8:1::1285 local dip=ff02::1286 local mode="-6"287 local name="IPv6"288 289 test_l2_miss_ll_multicast_common $proto $dmac $sip $dip $mode $name290}291 292test_l2_miss_ll_multicast()293{294 test_l2_miss_ll_multicast_ipv4295 test_l2_miss_ll_multicast_ipv6296}297 298test_l2_miss_broadcast()299{300 local dmac=ff:ff:ff:ff:ff:ff301 local smac=00:01:02:03:04:05302 303 RET=0304 305 tc filter add dev $swp2 egress protocol all handle 101 pref 1 \306 flower l2_miss 1 dst_mac $dmac src_mac $smac \307 action pass308 tc filter add dev $swp2 egress protocol all handle 102 pref 1 \309 flower l2_miss 0 dst_mac $dmac src_mac $smac \310 action pass311 312 $MZ $h1 -a $smac -b $dmac -c 1 -p 100 -q313 314 tc_check_packets "dev $swp2 egress" 101 0315 check_err $? "L2 miss filter was hit when should not"316 317 tc_check_packets "dev $swp2 egress" 102 1318 check_err $? "L2 no miss filter was not hit when should"319 320 tc filter del dev $swp2 egress protocol all pref 1 handle 102 flower321 tc filter del dev $swp2 egress protocol all pref 1 handle 101 flower322 323 log_test "L2 miss - Broadcast"324}325 326setup_prepare()327{328 h1=${NETIFS[p1]}329 swp1=${NETIFS[p2]}330 331 swp2=${NETIFS[p3]}332 h2=${NETIFS[p4]}333 334 vrf_prepare335 h1_create336 h2_create337 switch_create338}339 340cleanup()341{342 pre_cleanup343 344 switch_destroy345 h2_destroy346 h1_destroy347 vrf_cleanup348}349 350trap cleanup EXIT351 352setup_prepare353setup_wait354 355tests_run356 357exit $EXIT_STATUS358