1b6d00da0SIdo Schimmel#!/bin/bash 2b6d00da0SIdo Schimmel# SPDX-License-Identifier: GPL-2.0 3b6d00da0SIdo Schimmel 4b6d00da0SIdo Schimmel# +-----------------------+ +------------------------+ 5b6d00da0SIdo Schimmel# | H1 (vrf) | | H2 (vrf) | 6b6d00da0SIdo Schimmel# | + $h1.10 | | + $h2.10 | 7b6d00da0SIdo Schimmel# | | 192.0.2.1/28 | | | 192.0.2.2/28 | 8b6d00da0SIdo Schimmel# | | 2001:db8:1::1/64 | | | 2001:db8:1::2/64 | 9b6d00da0SIdo Schimmel# | | | | | | 10b6d00da0SIdo Schimmel# | | + $h1.20 | | | + $h2.20 | 11b6d00da0SIdo Schimmel# | \ | 198.51.100.1/24 | | \ | 198.51.100.2/24 | 12b6d00da0SIdo Schimmel# | \ | 2001:db8:2::1/64 | | \ | 2001:db8:2::2/64 | 13b6d00da0SIdo Schimmel# | \| | | \| | 14b6d00da0SIdo Schimmel# | + $h1 | | + $h2 | 15b6d00da0SIdo Schimmel# +----|------------------+ +----|-------------------+ 16b6d00da0SIdo Schimmel# | | 17b6d00da0SIdo Schimmel# +----|--------------------------------------------------|-------------------+ 18b6d00da0SIdo Schimmel# | SW | | | 19b6d00da0SIdo Schimmel# | +--|--------------------------------------------------|-----------------+ | 20b6d00da0SIdo Schimmel# | | + $swp1 BR0 (802.1q) + $swp2 | | 21b6d00da0SIdo Schimmel# | | vid 10 vid 10 | | 22b6d00da0SIdo Schimmel# | | vid 20 vid 20 | | 23b6d00da0SIdo Schimmel# | | | | 24b6d00da0SIdo Schimmel# | +-----------------------------------------------------------------------+ | 25b6d00da0SIdo Schimmel# +---------------------------------------------------------------------------+ 26b6d00da0SIdo Schimmel 27b6d00da0SIdo SchimmelALL_TESTS=" 28b6d00da0SIdo Schimmel cfg_test 29b6d00da0SIdo Schimmel fwd_test 30b6d00da0SIdo Schimmel ctrl_test 31b6d00da0SIdo Schimmel" 32b6d00da0SIdo Schimmel 33b6d00da0SIdo SchimmelNUM_NETIFS=4 34b6d00da0SIdo Schimmelsource lib.sh 35b6d00da0SIdo Schimmelsource tc_common.sh 36b6d00da0SIdo Schimmel 37b6d00da0SIdo Schimmelh1_create() 38b6d00da0SIdo Schimmel{ 39b6d00da0SIdo Schimmel simple_if_init $h1 40b6d00da0SIdo Schimmel vlan_create $h1 10 v$h1 192.0.2.1/28 2001:db8:1::1/64 41b6d00da0SIdo Schimmel vlan_create $h1 20 v$h1 198.51.100.1/24 2001:db8:2::1/64 42b6d00da0SIdo Schimmel} 43b6d00da0SIdo Schimmel 44b6d00da0SIdo Schimmelh1_destroy() 45b6d00da0SIdo Schimmel{ 46b6d00da0SIdo Schimmel vlan_destroy $h1 20 47b6d00da0SIdo Schimmel vlan_destroy $h1 10 48b6d00da0SIdo Schimmel simple_if_fini $h1 49b6d00da0SIdo Schimmel} 50b6d00da0SIdo Schimmel 51b6d00da0SIdo Schimmelh2_create() 52b6d00da0SIdo Schimmel{ 53b6d00da0SIdo Schimmel simple_if_init $h2 54b6d00da0SIdo Schimmel vlan_create $h2 10 v$h2 192.0.2.2/28 55b6d00da0SIdo Schimmel vlan_create $h2 20 v$h2 198.51.100.2/24 56b6d00da0SIdo Schimmel} 57b6d00da0SIdo Schimmel 58b6d00da0SIdo Schimmelh2_destroy() 59b6d00da0SIdo Schimmel{ 60b6d00da0SIdo Schimmel vlan_destroy $h2 20 61b6d00da0SIdo Schimmel vlan_destroy $h2 10 62b6d00da0SIdo Schimmel simple_if_fini $h2 63b6d00da0SIdo Schimmel} 64b6d00da0SIdo Schimmel 65b6d00da0SIdo Schimmelswitch_create() 66b6d00da0SIdo Schimmel{ 67b6d00da0SIdo Schimmel ip link add name br0 type bridge vlan_filtering 1 vlan_default_pvid 0 \ 68b6d00da0SIdo Schimmel mcast_snooping 1 mcast_igmp_version 3 mcast_mld_version 2 69b6d00da0SIdo Schimmel bridge vlan add vid 10 dev br0 self 70b6d00da0SIdo Schimmel bridge vlan add vid 20 dev br0 self 71b6d00da0SIdo Schimmel ip link set dev br0 up 72b6d00da0SIdo Schimmel 73b6d00da0SIdo Schimmel ip link set dev $swp1 master br0 74b6d00da0SIdo Schimmel ip link set dev $swp1 up 75b6d00da0SIdo Schimmel bridge vlan add vid 10 dev $swp1 76b6d00da0SIdo Schimmel bridge vlan add vid 20 dev $swp1 77b6d00da0SIdo Schimmel 78b6d00da0SIdo Schimmel ip link set dev $swp2 master br0 79b6d00da0SIdo Schimmel ip link set dev $swp2 up 80b6d00da0SIdo Schimmel bridge vlan add vid 10 dev $swp2 81b6d00da0SIdo Schimmel bridge vlan add vid 20 dev $swp2 82b6d00da0SIdo Schimmel 83b6d00da0SIdo Schimmel tc qdisc add dev br0 clsact 84b6d00da0SIdo Schimmel tc qdisc add dev $h2 clsact 85b6d00da0SIdo Schimmel} 86b6d00da0SIdo Schimmel 87b6d00da0SIdo Schimmelswitch_destroy() 88b6d00da0SIdo Schimmel{ 89b6d00da0SIdo Schimmel tc qdisc del dev $h2 clsact 90b6d00da0SIdo Schimmel tc qdisc del dev br0 clsact 91b6d00da0SIdo Schimmel 92b6d00da0SIdo Schimmel bridge vlan del vid 20 dev $swp2 93b6d00da0SIdo Schimmel bridge vlan del vid 10 dev $swp2 94b6d00da0SIdo Schimmel ip link set dev $swp2 down 95b6d00da0SIdo Schimmel ip link set dev $swp2 nomaster 96b6d00da0SIdo Schimmel 97b6d00da0SIdo Schimmel bridge vlan del vid 20 dev $swp1 98b6d00da0SIdo Schimmel bridge vlan del vid 10 dev $swp1 99b6d00da0SIdo Schimmel ip link set dev $swp1 down 100b6d00da0SIdo Schimmel ip link set dev $swp1 nomaster 101b6d00da0SIdo Schimmel 102b6d00da0SIdo Schimmel ip link set dev br0 down 103b6d00da0SIdo Schimmel bridge vlan del vid 20 dev br0 self 104b6d00da0SIdo Schimmel bridge vlan del vid 10 dev br0 self 105b6d00da0SIdo Schimmel ip link del dev br0 106b6d00da0SIdo Schimmel} 107b6d00da0SIdo Schimmel 108b6d00da0SIdo Schimmelsetup_prepare() 109b6d00da0SIdo Schimmel{ 110b6d00da0SIdo Schimmel h1=${NETIFS[p1]} 111b6d00da0SIdo Schimmel swp1=${NETIFS[p2]} 112b6d00da0SIdo Schimmel 113b6d00da0SIdo Schimmel swp2=${NETIFS[p3]} 114b6d00da0SIdo Schimmel h2=${NETIFS[p4]} 115b6d00da0SIdo Schimmel 116b6d00da0SIdo Schimmel vrf_prepare 117b6d00da0SIdo Schimmel forwarding_enable 118b6d00da0SIdo Schimmel 119b6d00da0SIdo Schimmel h1_create 120b6d00da0SIdo Schimmel h2_create 121b6d00da0SIdo Schimmel switch_create 122b6d00da0SIdo Schimmel} 123b6d00da0SIdo Schimmel 124b6d00da0SIdo Schimmelcleanup() 125b6d00da0SIdo Schimmel{ 126b6d00da0SIdo Schimmel pre_cleanup 127b6d00da0SIdo Schimmel 128b6d00da0SIdo Schimmel switch_destroy 129b6d00da0SIdo Schimmel h2_destroy 130b6d00da0SIdo Schimmel h1_destroy 131b6d00da0SIdo Schimmel 132b6d00da0SIdo Schimmel forwarding_restore 133b6d00da0SIdo Schimmel vrf_cleanup 134b6d00da0SIdo Schimmel} 135b6d00da0SIdo Schimmel 136b6d00da0SIdo Schimmelcfg_test_host_common() 137b6d00da0SIdo Schimmel{ 138b6d00da0SIdo Schimmel local name=$1; shift 139b6d00da0SIdo Schimmel local grp=$1; shift 140b6d00da0SIdo Schimmel local src=$1; shift 141b6d00da0SIdo Schimmel local state=$1; shift 142b6d00da0SIdo Schimmel local invalid_state=$1; shift 143b6d00da0SIdo Schimmel 144b6d00da0SIdo Schimmel RET=0 145b6d00da0SIdo Schimmel 146b6d00da0SIdo Schimmel # Check basic add, replace and delete behavior. 147b6d00da0SIdo Schimmel bridge mdb add dev br0 port br0 grp $grp $state vid 10 148925fd1a0SIdo Schimmel bridge mdb get dev br0 grp $grp vid 10 &> /dev/null 149b6d00da0SIdo Schimmel check_err $? "Failed to add $name host entry" 150b6d00da0SIdo Schimmel 151b6d00da0SIdo Schimmel bridge mdb replace dev br0 port br0 grp $grp $state vid 10 &> /dev/null 152b6d00da0SIdo Schimmel check_fail $? "Managed to replace $name host entry" 153b6d00da0SIdo Schimmel 154b6d00da0SIdo Schimmel bridge mdb del dev br0 port br0 grp $grp $state vid 10 155925fd1a0SIdo Schimmel bridge mdb get dev br0 grp $grp vid 10 &> /dev/null 156b6d00da0SIdo Schimmel check_fail $? "Failed to delete $name host entry" 157b6d00da0SIdo Schimmel 158b6d00da0SIdo Schimmel # Check error cases. 159b6d00da0SIdo Schimmel bridge mdb add dev br0 port br0 grp $grp $invalid_state vid 10 \ 160b6d00da0SIdo Schimmel &> /dev/null 161b6d00da0SIdo Schimmel check_fail $? "Managed to add $name host entry with a $invalid_state state" 162b6d00da0SIdo Schimmel 163b6d00da0SIdo Schimmel bridge mdb add dev br0 port br0 grp $grp src $src $state vid 10 \ 164b6d00da0SIdo Schimmel &> /dev/null 165b6d00da0SIdo Schimmel check_fail $? "Managed to add $name host entry with a source" 166b6d00da0SIdo Schimmel 167b6d00da0SIdo Schimmel bridge mdb add dev br0 port br0 grp $grp $state vid 10 \ 168b6d00da0SIdo Schimmel filter_mode exclude &> /dev/null 169b6d00da0SIdo Schimmel check_fail $? "Managed to add $name host entry with a filter mode" 170b6d00da0SIdo Schimmel 171b6d00da0SIdo Schimmel bridge mdb add dev br0 port br0 grp $grp $state vid 10 \ 172b6d00da0SIdo Schimmel source_list $src &> /dev/null 173b6d00da0SIdo Schimmel check_fail $? "Managed to add $name host entry with a source list" 174b6d00da0SIdo Schimmel 175b6d00da0SIdo Schimmel bridge mdb add dev br0 port br0 grp $grp $state vid 10 \ 176b6d00da0SIdo Schimmel proto 123 &> /dev/null 177b6d00da0SIdo Schimmel check_fail $? "Managed to add $name host entry with a protocol" 178b6d00da0SIdo Schimmel 179b6d00da0SIdo Schimmel log_test "Common host entries configuration tests ($name)" 180b6d00da0SIdo Schimmel} 181b6d00da0SIdo Schimmel 182b6d00da0SIdo Schimmel# Check configuration of host entries from all types. 183b6d00da0SIdo Schimmelcfg_test_host() 184b6d00da0SIdo Schimmel{ 185b6d00da0SIdo Schimmel echo 186b6d00da0SIdo Schimmel log_info "# Host entries configuration tests" 187b6d00da0SIdo Schimmel 188b6d00da0SIdo Schimmel cfg_test_host_common "IPv4" "239.1.1.1" "192.0.2.1" "temp" "permanent" 189b6d00da0SIdo Schimmel cfg_test_host_common "IPv6" "ff0e::1" "2001:db8:1::1" "temp" "permanent" 190b6d00da0SIdo Schimmel cfg_test_host_common "L2" "01:02:03:04:05:06" "00:00:00:00:00:01" \ 191b6d00da0SIdo Schimmel "permanent" "temp" 192b6d00da0SIdo Schimmel} 193b6d00da0SIdo Schimmel 194b6d00da0SIdo Schimmelcfg_test_port_common() 195b6d00da0SIdo Schimmel{ 196b6d00da0SIdo Schimmel local name=$1;shift 197b6d00da0SIdo Schimmel local grp_key=$1; shift 198b6d00da0SIdo Schimmel 199b6d00da0SIdo Schimmel RET=0 200b6d00da0SIdo Schimmel 201b6d00da0SIdo Schimmel # Check basic add, replace and delete behavior. 202b6d00da0SIdo Schimmel bridge mdb add dev br0 port $swp1 $grp_key permanent vid 10 203925fd1a0SIdo Schimmel bridge mdb get dev br0 $grp_key vid 10 &> /dev/null 204b6d00da0SIdo Schimmel check_err $? "Failed to add $name entry" 205b6d00da0SIdo Schimmel 206b6d00da0SIdo Schimmel bridge mdb replace dev br0 port $swp1 $grp_key permanent vid 10 \ 207b6d00da0SIdo Schimmel &> /dev/null 208b6d00da0SIdo Schimmel check_err $? "Failed to replace $name entry" 209b6d00da0SIdo Schimmel 210b6d00da0SIdo Schimmel bridge mdb del dev br0 port $swp1 $grp_key permanent vid 10 211925fd1a0SIdo Schimmel bridge mdb get dev br0 $grp_key vid 10 &> /dev/null 212b6d00da0SIdo Schimmel check_fail $? "Failed to delete $name entry" 213b6d00da0SIdo Schimmel 214b6d00da0SIdo Schimmel # Check default protocol and replacement. 215b6d00da0SIdo Schimmel bridge mdb add dev br0 port $swp1 $grp_key permanent vid 10 216925fd1a0SIdo Schimmel bridge -d mdb get dev br0 $grp_key vid 10 | grep -q "static" 217b6d00da0SIdo Schimmel check_err $? "$name entry not added with default \"static\" protocol" 218b6d00da0SIdo Schimmel 219b6d00da0SIdo Schimmel bridge mdb replace dev br0 port $swp1 $grp_key permanent vid 10 \ 220b6d00da0SIdo Schimmel proto 123 221925fd1a0SIdo Schimmel bridge -d mdb get dev br0 $grp_key vid 10 | grep -q "123" 222b6d00da0SIdo Schimmel check_err $? "Failed to replace protocol of $name entry" 223b6d00da0SIdo Schimmel bridge mdb del dev br0 port $swp1 $grp_key permanent vid 10 224b6d00da0SIdo Schimmel 225b6d00da0SIdo Schimmel # Check behavior when VLAN is not specified. 226b6d00da0SIdo Schimmel bridge mdb add dev br0 port $swp1 $grp_key permanent 227925fd1a0SIdo Schimmel bridge mdb get dev br0 $grp_key vid 10 &> /dev/null 228b6d00da0SIdo Schimmel check_err $? "$name entry with VLAN 10 not added when VLAN was not specified" 229925fd1a0SIdo Schimmel bridge mdb get dev br0 $grp_key vid 20 &> /dev/null 230b6d00da0SIdo Schimmel check_err $? "$name entry with VLAN 20 not added when VLAN was not specified" 231b6d00da0SIdo Schimmel 232b6d00da0SIdo Schimmel bridge mdb del dev br0 port $swp1 $grp_key permanent 233925fd1a0SIdo Schimmel bridge mdb get dev br0 $grp_key vid 10 &> /dev/null 234b6d00da0SIdo Schimmel check_fail $? "$name entry with VLAN 10 not deleted when VLAN was not specified" 235925fd1a0SIdo Schimmel bridge mdb get dev br0 $grp_key vid 20 &> /dev/null 236b6d00da0SIdo Schimmel check_fail $? "$name entry with VLAN 20 not deleted when VLAN was not specified" 237b6d00da0SIdo Schimmel 238b6d00da0SIdo Schimmel # Check behavior when bridge port is down. 239b6d00da0SIdo Schimmel ip link set dev $swp1 down 240b6d00da0SIdo Schimmel 241b6d00da0SIdo Schimmel bridge mdb add dev br0 port $swp1 $grp_key permanent vid 10 242b6d00da0SIdo Schimmel check_err $? "Failed to add $name permanent entry when bridge port is down" 243b6d00da0SIdo Schimmel 244b6d00da0SIdo Schimmel bridge mdb del dev br0 port $swp1 $grp_key permanent vid 10 245b6d00da0SIdo Schimmel 246b6d00da0SIdo Schimmel bridge mdb add dev br0 port $swp1 $grp_key temp vid 10 &> /dev/null 247b6d00da0SIdo Schimmel check_fail $? "Managed to add $name temporary entry when bridge port is down" 248b6d00da0SIdo Schimmel 249b6d00da0SIdo Schimmel ip link set dev $swp1 up 250b6d00da0SIdo Schimmel setup_wait_dev $swp1 251b6d00da0SIdo Schimmel 252b6d00da0SIdo Schimmel # Check error cases. 253b6d00da0SIdo Schimmel ip link set dev br0 down 254b6d00da0SIdo Schimmel bridge mdb add dev br0 port $swp1 $grp_key permanent vid 10 \ 255b6d00da0SIdo Schimmel &> /dev/null 256b6d00da0SIdo Schimmel check_fail $? "Managed to add $name entry when bridge is down" 257b6d00da0SIdo Schimmel ip link set dev br0 up 258b6d00da0SIdo Schimmel 259b6d00da0SIdo Schimmel ip link set dev br0 type bridge mcast_snooping 0 260b6d00da0SIdo Schimmel bridge mdb add dev br0 port $swp1 $grp_key permanent vid \ 261b6d00da0SIdo Schimmel 10 &> /dev/null 262b6d00da0SIdo Schimmel check_fail $? "Managed to add $name entry when multicast snooping is disabled" 263b6d00da0SIdo Schimmel ip link set dev br0 type bridge mcast_snooping 1 264b6d00da0SIdo Schimmel 265b6d00da0SIdo Schimmel bridge mdb add dev br0 port $swp1 $grp_key permanent vid 5000 \ 266b6d00da0SIdo Schimmel &> /dev/null 267b6d00da0SIdo Schimmel check_fail $? "Managed to add $name entry with an invalid VLAN" 268b6d00da0SIdo Schimmel 269b6d00da0SIdo Schimmel log_test "Common port group entries configuration tests ($name)" 270b6d00da0SIdo Schimmel} 271b6d00da0SIdo Schimmel 272b6d00da0SIdo Schimmelsrc_list_create() 273b6d00da0SIdo Schimmel{ 274b6d00da0SIdo Schimmel local src_prefix=$1; shift 275b6d00da0SIdo Schimmel local num_srcs=$1; shift 276b6d00da0SIdo Schimmel local src_list 277b6d00da0SIdo Schimmel local i 278b6d00da0SIdo Schimmel 279b6d00da0SIdo Schimmel for i in $(seq 1 $num_srcs); do 280b6d00da0SIdo Schimmel src_list=${src_list},${src_prefix}${i} 281b6d00da0SIdo Schimmel done 282b6d00da0SIdo Schimmel 283b6d00da0SIdo Schimmel echo $src_list | cut -c 2- 284b6d00da0SIdo Schimmel} 285b6d00da0SIdo Schimmel 286b6d00da0SIdo Schimmel__cfg_test_port_ip_star_g() 287b6d00da0SIdo Schimmel{ 288b6d00da0SIdo Schimmel local name=$1; shift 289b6d00da0SIdo Schimmel local grp=$1; shift 290b6d00da0SIdo Schimmel local invalid_grp=$1; shift 291b6d00da0SIdo Schimmel local src_prefix=$1; shift 292b6d00da0SIdo Schimmel local src1=${src_prefix}1 293b6d00da0SIdo Schimmel local src2=${src_prefix}2 294b6d00da0SIdo Schimmel local src3=${src_prefix}3 295b6d00da0SIdo Schimmel local max_srcs=31 296b6d00da0SIdo Schimmel local num_srcs 297b6d00da0SIdo Schimmel 298b6d00da0SIdo Schimmel RET=0 299b6d00da0SIdo Schimmel 300b6d00da0SIdo Schimmel bridge mdb add dev br0 port $swp1 grp $grp vid 10 301925fd1a0SIdo Schimmel bridge -d mdb get dev br0 grp $grp vid 10 | grep -q "exclude" 302b6d00da0SIdo Schimmel check_err $? "Default filter mode is not \"exclude\"" 303b6d00da0SIdo Schimmel bridge mdb del dev br0 port $swp1 grp $grp vid 10 304b6d00da0SIdo Schimmel 305b6d00da0SIdo Schimmel # Check basic add and delete behavior. 306b6d00da0SIdo Schimmel bridge mdb add dev br0 port $swp1 grp $grp vid 10 filter_mode exclude \ 307b6d00da0SIdo Schimmel source_list $src1 308925fd1a0SIdo Schimmel bridge -d mdb get dev br0 grp $grp vid 10 &> /dev/null 309b6d00da0SIdo Schimmel check_err $? "(*, G) entry not created" 310925fd1a0SIdo Schimmel bridge -d mdb get dev br0 grp $grp src $src1 vid 10 &> /dev/null 311b6d00da0SIdo Schimmel check_err $? "(S, G) entry not created" 312b6d00da0SIdo Schimmel bridge mdb del dev br0 port $swp1 grp $grp vid 10 313925fd1a0SIdo Schimmel bridge -d mdb get dev br0 grp $grp vid 10 &> /dev/null 314b6d00da0SIdo Schimmel check_fail $? "(*, G) entry not deleted" 315925fd1a0SIdo Schimmel bridge -d mdb get dev br0 grp $grp src $src1 vid 10 &> /dev/null 316b6d00da0SIdo Schimmel check_fail $? "(S, G) entry not deleted" 317b6d00da0SIdo Schimmel 318b6d00da0SIdo Schimmel ## State (permanent / temp) tests. 319b6d00da0SIdo Schimmel 320b6d00da0SIdo Schimmel # Check that group and source timer are not set for permanent entries. 321b6d00da0SIdo Schimmel bridge mdb add dev br0 port $swp1 grp $grp permanent vid 10 \ 322b6d00da0SIdo Schimmel filter_mode exclude source_list $src1 323b6d00da0SIdo Schimmel 324925fd1a0SIdo Schimmel bridge -d mdb get dev br0 grp $grp vid 10 | grep -q "permanent" 325b6d00da0SIdo Schimmel check_err $? "(*, G) entry not added as \"permanent\" when should" 326925fd1a0SIdo Schimmel bridge -d mdb get dev br0 grp $grp src $src1 vid 10 | \ 327b6d00da0SIdo Schimmel grep -q "permanent" 328b6d00da0SIdo Schimmel check_err $? "(S, G) entry not added as \"permanent\" when should" 329b6d00da0SIdo Schimmel 330925fd1a0SIdo Schimmel bridge -d -s mdb get dev br0 grp $grp vid 10 | grep -q " 0.00" 331b6d00da0SIdo Schimmel check_err $? "(*, G) \"permanent\" entry has a pending group timer" 332*d8893ac8SIdo Schimmel bridge -d -s mdb get dev br0 grp $grp vid 10 | grep -q "/0.00" 333b6d00da0SIdo Schimmel check_err $? "\"permanent\" source entry has a pending source timer" 334b6d00da0SIdo Schimmel 335b6d00da0SIdo Schimmel bridge mdb del dev br0 port $swp1 grp $grp vid 10 336b6d00da0SIdo Schimmel 337b6d00da0SIdo Schimmel # Check that group timer is set for temporary (*, G) EXCLUDE, but not 338b6d00da0SIdo Schimmel # the source timer. 339b6d00da0SIdo Schimmel bridge mdb add dev br0 port $swp1 grp $grp temp vid 10 \ 340b6d00da0SIdo Schimmel filter_mode exclude source_list $src1 341b6d00da0SIdo Schimmel 342925fd1a0SIdo Schimmel bridge -d mdb get dev br0 grp $grp vid 10 | grep -q "temp" 343b6d00da0SIdo Schimmel check_err $? "(*, G) EXCLUDE entry not added as \"temp\" when should" 344925fd1a0SIdo Schimmel bridge -d mdb get dev br0 grp $grp src $src1 vid 10 | grep -q "temp" 345b6d00da0SIdo Schimmel check_err $? "(S, G) \"blocked\" entry not added as \"temp\" when should" 346b6d00da0SIdo Schimmel 347925fd1a0SIdo Schimmel bridge -d -s mdb get dev br0 grp $grp vid 10 | grep -q " 0.00" 348b6d00da0SIdo Schimmel check_fail $? "(*, G) EXCLUDE entry does not have a pending group timer" 349*d8893ac8SIdo Schimmel bridge -d -s mdb get dev br0 grp $grp vid 10 | grep -q "/0.00" 350b6d00da0SIdo Schimmel check_err $? "\"blocked\" source entry has a pending source timer" 351b6d00da0SIdo Schimmel 352b6d00da0SIdo Schimmel bridge mdb del dev br0 port $swp1 grp $grp vid 10 353b6d00da0SIdo Schimmel 354b6d00da0SIdo Schimmel # Check that group timer is not set for temporary (*, G) INCLUDE, but 355b6d00da0SIdo Schimmel # that the source timer is set. 356b6d00da0SIdo Schimmel bridge mdb add dev br0 port $swp1 grp $grp temp vid 10 \ 357b6d00da0SIdo Schimmel filter_mode include source_list $src1 358b6d00da0SIdo Schimmel 359925fd1a0SIdo Schimmel bridge -d mdb get dev br0 grp $grp vid 10 | grep -q "temp" 360b6d00da0SIdo Schimmel check_err $? "(*, G) INCLUDE entry not added as \"temp\" when should" 361925fd1a0SIdo Schimmel bridge -d mdb get dev br0 grp $grp src $src1 vid 10 | grep -q "temp" 362b6d00da0SIdo Schimmel check_err $? "(S, G) entry not added as \"temp\" when should" 363b6d00da0SIdo Schimmel 364925fd1a0SIdo Schimmel bridge -d -s mdb get dev br0 grp $grp vid 10 | grep -q " 0.00" 365b6d00da0SIdo Schimmel check_err $? "(*, G) INCLUDE entry has a pending group timer" 366*d8893ac8SIdo Schimmel bridge -d -s mdb get dev br0 grp $grp vid 10 | grep -q "/0.00" 367b6d00da0SIdo Schimmel check_fail $? "Source entry does not have a pending source timer" 368b6d00da0SIdo Schimmel 369b6d00da0SIdo Schimmel bridge mdb del dev br0 port $swp1 grp $grp vid 10 370b6d00da0SIdo Schimmel 371b6d00da0SIdo Schimmel # Check that group timer is never set for (S, G) entries. 372b6d00da0SIdo Schimmel bridge mdb add dev br0 port $swp1 grp $grp temp vid 10 \ 373b6d00da0SIdo Schimmel filter_mode include source_list $src1 374b6d00da0SIdo Schimmel 375925fd1a0SIdo Schimmel bridge -d -s mdb get dev br0 grp $grp src $src1 vid 10 | grep -q " 0.00" 376b6d00da0SIdo Schimmel check_err $? "(S, G) entry has a pending group timer" 377b6d00da0SIdo Schimmel 378b6d00da0SIdo Schimmel bridge mdb del dev br0 port $swp1 grp $grp vid 10 379b6d00da0SIdo Schimmel 380b6d00da0SIdo Schimmel ## Filter mode (include / exclude) tests. 381b6d00da0SIdo Schimmel 382b6d00da0SIdo Schimmel # Check that (*, G) INCLUDE entries are added with correct filter mode 383b6d00da0SIdo Schimmel # and that (S, G) entries are not marked as "blocked". 384b6d00da0SIdo Schimmel bridge mdb add dev br0 port $swp1 grp $grp vid 10 \ 385b6d00da0SIdo Schimmel filter_mode include source_list $src1 386b6d00da0SIdo Schimmel 387925fd1a0SIdo Schimmel bridge -d mdb get dev br0 grp $grp vid 10 | grep -q "include" 388b6d00da0SIdo Schimmel check_err $? "(*, G) INCLUDE not added with \"include\" filter mode" 389925fd1a0SIdo Schimmel bridge -d mdb get dev br0 grp $grp src $src1 vid 10 | grep -q "blocked" 390b6d00da0SIdo Schimmel check_fail $? "(S, G) entry marked as \"blocked\" when should not" 391b6d00da0SIdo Schimmel 392b6d00da0SIdo Schimmel bridge mdb del dev br0 port $swp1 grp $grp vid 10 393b6d00da0SIdo Schimmel 394b6d00da0SIdo Schimmel # Check that (*, G) EXCLUDE entries are added with correct filter mode 395b6d00da0SIdo Schimmel # and that (S, G) entries are marked as "blocked". 396b6d00da0SIdo Schimmel bridge mdb add dev br0 port $swp1 grp $grp vid 10 \ 397b6d00da0SIdo Schimmel filter_mode exclude source_list $src1 398b6d00da0SIdo Schimmel 399925fd1a0SIdo Schimmel bridge -d mdb get dev br0 grp $grp vid 10 | grep -q "exclude" 400b6d00da0SIdo Schimmel check_err $? "(*, G) EXCLUDE not added with \"exclude\" filter mode" 401925fd1a0SIdo Schimmel bridge -d mdb get dev br0 grp $grp src $src1 vid 10 | grep -q "blocked" 402b6d00da0SIdo Schimmel check_err $? "(S, G) entry not marked as \"blocked\" when should" 403b6d00da0SIdo Schimmel 404b6d00da0SIdo Schimmel bridge mdb del dev br0 port $swp1 grp $grp vid 10 405b6d00da0SIdo Schimmel 406b6d00da0SIdo Schimmel ## Protocol tests. 407b6d00da0SIdo Schimmel 408b6d00da0SIdo Schimmel # Check that (*, G) and (S, G) entries are added with the specified 409b6d00da0SIdo Schimmel # protocol. 410b6d00da0SIdo Schimmel bridge mdb add dev br0 port $swp1 grp $grp vid 10 \ 411b6d00da0SIdo Schimmel filter_mode exclude source_list $src1 proto zebra 412b6d00da0SIdo Schimmel 413925fd1a0SIdo Schimmel bridge -d mdb get dev br0 grp $grp vid 10 | grep -q "zebra" 414b6d00da0SIdo Schimmel check_err $? "(*, G) entry not added with \"zebra\" protocol" 415925fd1a0SIdo Schimmel bridge -d mdb get dev br0 grp $grp src $src1 vid 10 | grep -q "zebra" 416b6d00da0SIdo Schimmel check_err $? "(S, G) entry not marked added with \"zebra\" protocol" 417b6d00da0SIdo Schimmel 418b6d00da0SIdo Schimmel bridge mdb del dev br0 port $swp1 grp $grp vid 10 419b6d00da0SIdo Schimmel 420b6d00da0SIdo Schimmel ## Replace tests. 421b6d00da0SIdo Schimmel 422b6d00da0SIdo Schimmel # Check that state can be modified. 423b6d00da0SIdo Schimmel bridge mdb add dev br0 port $swp1 grp $grp temp vid 10 \ 424b6d00da0SIdo Schimmel filter_mode exclude source_list $src1 425b6d00da0SIdo Schimmel 426b6d00da0SIdo Schimmel bridge mdb replace dev br0 port $swp1 grp $grp permanent vid 10 \ 427b6d00da0SIdo Schimmel filter_mode exclude source_list $src1 428925fd1a0SIdo Schimmel bridge -d mdb get dev br0 grp $grp vid 10 | grep -q "permanent" 429b6d00da0SIdo Schimmel check_err $? "(*, G) entry not marked as \"permanent\" after replace" 430925fd1a0SIdo Schimmel bridge -d mdb get dev br0 grp $grp src $src1 vid 10 | grep -q "permanent" 431b6d00da0SIdo Schimmel check_err $? "(S, G) entry not marked as \"permanent\" after replace" 432b6d00da0SIdo Schimmel 433b6d00da0SIdo Schimmel bridge mdb replace dev br0 port $swp1 grp $grp temp vid 10 \ 434b6d00da0SIdo Schimmel filter_mode exclude source_list $src1 435925fd1a0SIdo Schimmel bridge -d mdb get dev br0 grp $grp vid 10 | grep -q "temp" 436b6d00da0SIdo Schimmel check_err $? "(*, G) entry not marked as \"temp\" after replace" 437925fd1a0SIdo Schimmel bridge -d mdb get dev br0 grp $grp src $src1 vid 10 | grep -q "temp" 438b6d00da0SIdo Schimmel check_err $? "(S, G) entry not marked as \"temp\" after replace" 439b6d00da0SIdo Schimmel 440b6d00da0SIdo Schimmel bridge mdb del dev br0 port $swp1 grp $grp vid 10 441b6d00da0SIdo Schimmel 442b6d00da0SIdo Schimmel # Check that filter mode can be modified. 443b6d00da0SIdo Schimmel bridge mdb add dev br0 port $swp1 grp $grp temp vid 10 \ 444b6d00da0SIdo Schimmel filter_mode exclude source_list $src1 445b6d00da0SIdo Schimmel 446b6d00da0SIdo Schimmel bridge mdb replace dev br0 port $swp1 grp $grp temp vid 10 \ 447b6d00da0SIdo Schimmel filter_mode include source_list $src1 448925fd1a0SIdo Schimmel bridge -d mdb get dev br0 grp $grp vid 10 | grep -q "include" 449b6d00da0SIdo Schimmel check_err $? "(*, G) not marked with \"include\" filter mode after replace" 450925fd1a0SIdo Schimmel bridge -d mdb get dev br0 grp $grp src $src1 vid 10 | grep -q "blocked" 451b6d00da0SIdo Schimmel check_fail $? "(S, G) marked as \"blocked\" after replace" 452b6d00da0SIdo Schimmel 453b6d00da0SIdo Schimmel bridge mdb replace dev br0 port $swp1 grp $grp temp vid 10 \ 454b6d00da0SIdo Schimmel filter_mode exclude source_list $src1 455925fd1a0SIdo Schimmel bridge -d mdb get dev br0 grp $grp vid 10 | grep -q "exclude" 456b6d00da0SIdo Schimmel check_err $? "(*, G) not marked with \"exclude\" filter mode after replace" 457925fd1a0SIdo Schimmel bridge -d mdb get dev br0 grp $grp src $src1 vid 10 | grep -q "blocked" 458b6d00da0SIdo Schimmel check_err $? "(S, G) not marked as \"blocked\" after replace" 459b6d00da0SIdo Schimmel 460b6d00da0SIdo Schimmel bridge mdb del dev br0 port $swp1 grp $grp vid 10 461b6d00da0SIdo Schimmel 462b6d00da0SIdo Schimmel # Check that sources can be added to and removed from the source list. 463b6d00da0SIdo Schimmel bridge mdb add dev br0 port $swp1 grp $grp temp vid 10 \ 464b6d00da0SIdo Schimmel filter_mode exclude source_list $src1 465b6d00da0SIdo Schimmel 466b6d00da0SIdo Schimmel bridge mdb replace dev br0 port $swp1 grp $grp temp vid 10 \ 467b6d00da0SIdo Schimmel filter_mode exclude source_list $src1,$src2,$src3 468925fd1a0SIdo Schimmel bridge -d mdb get dev br0 grp $grp src $src1 vid 10 &> /dev/null 469b6d00da0SIdo Schimmel check_err $? "(S, G) entry for source $src1 not created after replace" 470925fd1a0SIdo Schimmel bridge -d mdb get dev br0 grp $grp src $src2 vid 10 &> /dev/null 471b6d00da0SIdo Schimmel check_err $? "(S, G) entry for source $src2 not created after replace" 472925fd1a0SIdo Schimmel bridge -d mdb get dev br0 grp $grp src $src3 vid 10 &> /dev/null 473b6d00da0SIdo Schimmel check_err $? "(S, G) entry for source $src3 not created after replace" 474b6d00da0SIdo Schimmel 475b6d00da0SIdo Schimmel bridge mdb replace dev br0 port $swp1 grp $grp temp vid 10 \ 476b6d00da0SIdo Schimmel filter_mode exclude source_list $src1,$src3 477925fd1a0SIdo Schimmel bridge -d mdb get dev br0 grp $grp src $src1 vid 10 &> /dev/null 478b6d00da0SIdo Schimmel check_err $? "(S, G) entry for source $src1 not created after second replace" 479925fd1a0SIdo Schimmel bridge -d mdb get dev br0 grp $grp src $src2 vid 10 &> /dev/null 480b6d00da0SIdo Schimmel check_fail $? "(S, G) entry for source $src2 created after second replace" 481925fd1a0SIdo Schimmel bridge -d mdb get dev br0 grp $grp src $src3 vid 10 &> /dev/null 482b6d00da0SIdo Schimmel check_err $? "(S, G) entry for source $src3 not created after second replace" 483b6d00da0SIdo Schimmel 484b6d00da0SIdo Schimmel bridge mdb del dev br0 port $swp1 grp $grp vid 10 485b6d00da0SIdo Schimmel 486b6d00da0SIdo Schimmel # Check that protocol can be modified. 487b6d00da0SIdo Schimmel bridge mdb add dev br0 port $swp1 grp $grp temp vid 10 \ 488b6d00da0SIdo Schimmel filter_mode exclude source_list $src1 proto zebra 489b6d00da0SIdo Schimmel 490b6d00da0SIdo Schimmel bridge mdb replace dev br0 port $swp1 grp $grp temp vid 10 \ 491b6d00da0SIdo Schimmel filter_mode exclude source_list $src1 proto bgp 492925fd1a0SIdo Schimmel bridge -d mdb get dev br0 grp $grp vid 10 | grep -q "bgp" 493b6d00da0SIdo Schimmel check_err $? "(*, G) protocol not changed to \"bgp\" after replace" 494925fd1a0SIdo Schimmel bridge -d mdb get dev br0 grp $grp src $src1 vid 10 | grep -q "bgp" 495b6d00da0SIdo Schimmel check_err $? "(S, G) protocol not changed to \"bgp\" after replace" 496b6d00da0SIdo Schimmel 497b6d00da0SIdo Schimmel bridge mdb del dev br0 port $swp1 grp $grp vid 10 498b6d00da0SIdo Schimmel 499b6d00da0SIdo Schimmel ## Star exclude tests. 500b6d00da0SIdo Schimmel 501b6d00da0SIdo Schimmel # Check star exclude functionality. When adding a new EXCLUDE (*, G), 502b6d00da0SIdo Schimmel # it needs to be also added to all (S, G) entries for proper 503b6d00da0SIdo Schimmel # replication. 504b6d00da0SIdo Schimmel bridge mdb add dev br0 port $swp2 grp $grp vid 10 \ 505b6d00da0SIdo Schimmel filter_mode include source_list $src1 506b6d00da0SIdo Schimmel bridge mdb add dev br0 port $swp1 grp $grp vid 10 507925fd1a0SIdo Schimmel bridge -d mdb get dev br0 grp $grp src $src1 vid 10 | grep "$swp1" | \ 508925fd1a0SIdo Schimmel grep -q "added_by_star_ex" 509b6d00da0SIdo Schimmel check_err $? "\"added_by_star_ex\" entry not created after adding (*, G) entry" 510b6d00da0SIdo Schimmel bridge mdb del dev br0 port $swp1 grp $grp vid 10 511b6d00da0SIdo Schimmel bridge mdb del dev br0 port $swp2 grp $grp src $src1 vid 10 512b6d00da0SIdo Schimmel 513b6d00da0SIdo Schimmel ## Error cases tests. 514b6d00da0SIdo Schimmel 515b6d00da0SIdo Schimmel bridge mdb add dev br0 port $swp1 grp $invalid_grp vid 10 &> /dev/null 516b6d00da0SIdo Schimmel check_fail $? "Managed to add an entry with an invalid group" 517b6d00da0SIdo Schimmel 518b6d00da0SIdo Schimmel bridge mdb add dev br0 port $swp1 grp $grp vid 10 filter_mode include \ 519b6d00da0SIdo Schimmel &> /dev/null 520b6d00da0SIdo Schimmel check_fail $? "Managed to add an INCLUDE entry with an empty source list" 521b6d00da0SIdo Schimmel 522b6d00da0SIdo Schimmel bridge mdb add dev br0 port $swp1 grp $grp vid 10 filter_mode include \ 523b6d00da0SIdo Schimmel source_list $grp &> /dev/null 524b6d00da0SIdo Schimmel check_fail $? "Managed to add an entry with an invalid source in source list" 525b6d00da0SIdo Schimmel 526b6d00da0SIdo Schimmel bridge mdb add dev br0 port $swp1 grp $grp vid 10 \ 527b6d00da0SIdo Schimmel source_list $src &> /dev/null 528b6d00da0SIdo Schimmel check_fail $? "Managed to add an entry with a source list and no filter mode" 529b6d00da0SIdo Schimmel 530b6d00da0SIdo Schimmel bridge mdb add dev br0 port $swp1 grp $grp vid 10 filter_mode include \ 531b6d00da0SIdo Schimmel source_list $src1 532b6d00da0SIdo Schimmel bridge mdb add dev br0 port $swp1 grp $grp vid 10 filter_mode exclude \ 533b6d00da0SIdo Schimmel source_list $src1 &> /dev/null 534b6d00da0SIdo Schimmel check_fail $? "Managed to replace an entry without using replace" 535b6d00da0SIdo Schimmel bridge mdb del dev br0 port $swp1 grp $grp vid 10 536b6d00da0SIdo Schimmel 537b6d00da0SIdo Schimmel bridge mdb add dev br0 port $swp1 grp $grp src $src2 vid 10 538b6d00da0SIdo Schimmel bridge mdb add dev br0 port $swp1 grp $grp vid 10 filter_mode include \ 539b6d00da0SIdo Schimmel source_list $src1,$src2,$src3 &> /dev/null 540b6d00da0SIdo Schimmel check_fail $? "Managed to add a source that already has a forwarding entry" 541b6d00da0SIdo Schimmel bridge mdb del dev br0 port $swp1 grp $grp src $src2 vid 10 542b6d00da0SIdo Schimmel 543b6d00da0SIdo Schimmel # Check maximum number of sources. 544b6d00da0SIdo Schimmel bridge mdb add dev br0 port $swp1 grp $grp vid 10 filter_mode exclude \ 545b6d00da0SIdo Schimmel source_list $(src_list_create $src_prefix $max_srcs) 546b6d00da0SIdo Schimmel num_srcs=$(bridge -d mdb show dev br0 vid 10 | grep "$grp" | \ 547b6d00da0SIdo Schimmel grep "src" | wc -l) 548b6d00da0SIdo Schimmel [[ $num_srcs -eq $max_srcs ]] 549b6d00da0SIdo Schimmel check_err $? "Failed to configure maximum number of sources ($max_srcs)" 550b6d00da0SIdo Schimmel bridge mdb del dev br0 port $swp1 grp $grp vid 10 551b6d00da0SIdo Schimmel 552b6d00da0SIdo Schimmel bridge mdb add dev br0 port $swp1 grp $grp vid 10 filter_mode exclude \ 553b6d00da0SIdo Schimmel source_list $(src_list_create $src_prefix $((max_srcs + 1))) \ 554b6d00da0SIdo Schimmel &> /dev/null 555b6d00da0SIdo Schimmel check_fail $? "Managed to exceed maximum number of sources ($max_srcs)" 556b6d00da0SIdo Schimmel 557b6d00da0SIdo Schimmel log_test "$name (*, G) port group entries configuration tests" 558b6d00da0SIdo Schimmel} 559b6d00da0SIdo Schimmel 560b6d00da0SIdo Schimmelcfg_test_port_ip_star_g() 561b6d00da0SIdo Schimmel{ 562b6d00da0SIdo Schimmel echo 563b6d00da0SIdo Schimmel log_info "# Port group entries configuration tests - (*, G)" 564b6d00da0SIdo Schimmel 565b6d00da0SIdo Schimmel cfg_test_port_common "IPv4 (*, G)" "grp 239.1.1.1" 566b6d00da0SIdo Schimmel cfg_test_port_common "IPv6 (*, G)" "grp ff0e::1" 567b6d00da0SIdo Schimmel __cfg_test_port_ip_star_g "IPv4" "239.1.1.1" "224.0.0.1" "192.0.2." 568b6d00da0SIdo Schimmel __cfg_test_port_ip_star_g "IPv6" "ff0e::1" "ff02::1" "2001:db8:1::" 569b6d00da0SIdo Schimmel} 570b6d00da0SIdo Schimmel 571b6d00da0SIdo Schimmel__cfg_test_port_ip_sg() 572b6d00da0SIdo Schimmel{ 573b6d00da0SIdo Schimmel local name=$1; shift 574b6d00da0SIdo Schimmel local grp=$1; shift 575b6d00da0SIdo Schimmel local src=$1; shift 576b6d00da0SIdo Schimmel local grp_key="grp $grp src $src" 577b6d00da0SIdo Schimmel 578b6d00da0SIdo Schimmel RET=0 579b6d00da0SIdo Schimmel 580b6d00da0SIdo Schimmel bridge mdb add dev br0 port $swp1 $grp_key vid 10 581925fd1a0SIdo Schimmel bridge -d mdb get dev br0 $grp_key vid 10 | grep -q "include" 582b6d00da0SIdo Schimmel check_err $? "Default filter mode is not \"include\"" 583b6d00da0SIdo Schimmel bridge mdb del dev br0 port $swp1 $grp_key vid 10 584b6d00da0SIdo Schimmel 585b6d00da0SIdo Schimmel # Check that entries can be added as both permanent and temp and that 586b6d00da0SIdo Schimmel # group timer is set correctly. 587b6d00da0SIdo Schimmel bridge mdb add dev br0 port $swp1 $grp_key permanent vid 10 588925fd1a0SIdo Schimmel bridge -d mdb get dev br0 $grp_key vid 10 | grep -q "permanent" 589b6d00da0SIdo Schimmel check_err $? "Entry not added as \"permanent\" when should" 590925fd1a0SIdo Schimmel bridge -d -s mdb get dev br0 $grp_key vid 10 | grep -q " 0.00" 591b6d00da0SIdo Schimmel check_err $? "\"permanent\" entry has a pending group timer" 592b6d00da0SIdo Schimmel bridge mdb del dev br0 port $swp1 $grp_key vid 10 593b6d00da0SIdo Schimmel 594b6d00da0SIdo Schimmel bridge mdb add dev br0 port $swp1 $grp_key temp vid 10 595925fd1a0SIdo Schimmel bridge -d mdb get dev br0 $grp_key vid 10 | grep -q "temp" 596b6d00da0SIdo Schimmel check_err $? "Entry not added as \"temp\" when should" 597925fd1a0SIdo Schimmel bridge -d -s mdb get dev br0 $grp_key vid 10 | grep -q " 0.00" 598b6d00da0SIdo Schimmel check_fail $? "\"temp\" entry has an unpending group timer" 599b6d00da0SIdo Schimmel bridge mdb del dev br0 port $swp1 $grp_key vid 10 600b6d00da0SIdo Schimmel 601b6d00da0SIdo Schimmel # Check error cases. 602b6d00da0SIdo Schimmel bridge mdb add dev br0 port $swp1 $grp_key vid 10 \ 603b6d00da0SIdo Schimmel filter_mode include &> /dev/null 604b6d00da0SIdo Schimmel check_fail $? "Managed to add an entry with a filter mode" 605b6d00da0SIdo Schimmel 606b6d00da0SIdo Schimmel bridge mdb add dev br0 port $swp1 $grp_key vid 10 \ 607b6d00da0SIdo Schimmel filter_mode include source_list $src &> /dev/null 608b6d00da0SIdo Schimmel check_fail $? "Managed to add an entry with a source list" 609b6d00da0SIdo Schimmel 610b6d00da0SIdo Schimmel bridge mdb add dev br0 port $swp1 grp $grp src $grp vid 10 &> /dev/null 611b6d00da0SIdo Schimmel check_fail $? "Managed to add an entry with an invalid source" 612b6d00da0SIdo Schimmel 613b6d00da0SIdo Schimmel bridge mdb add dev br0 port $swp1 $grp_key vid 10 temp 614b6d00da0SIdo Schimmel bridge mdb add dev br0 port $swp1 $grp_key vid 10 permanent &> /dev/null 615b6d00da0SIdo Schimmel check_fail $? "Managed to replace an entry without using replace" 616b6d00da0SIdo Schimmel bridge mdb del dev br0 port $swp1 $grp_key vid 10 617b6d00da0SIdo Schimmel 618b6d00da0SIdo Schimmel # Check that we can replace available attributes. 619b6d00da0SIdo Schimmel bridge mdb add dev br0 port $swp1 $grp_key vid 10 proto 123 620b6d00da0SIdo Schimmel bridge mdb replace dev br0 port $swp1 $grp_key vid 10 proto 111 621925fd1a0SIdo Schimmel bridge -d mdb get dev br0 $grp_key vid 10 | grep -q "111" 622b6d00da0SIdo Schimmel check_err $? "Failed to replace protocol" 623b6d00da0SIdo Schimmel 624b6d00da0SIdo Schimmel bridge mdb replace dev br0 port $swp1 $grp_key vid 10 permanent 625925fd1a0SIdo Schimmel bridge -d mdb get dev br0 $grp_key vid 10 | grep -q "permanent" 626b6d00da0SIdo Schimmel check_err $? "Entry not marked as \"permanent\" after replace" 627925fd1a0SIdo Schimmel bridge -d -s mdb get dev br0 $grp_key vid 10 | grep -q " 0.00" 628b6d00da0SIdo Schimmel check_err $? "Entry has a pending group timer after replace" 629b6d00da0SIdo Schimmel 630b6d00da0SIdo Schimmel bridge mdb replace dev br0 port $swp1 $grp_key vid 10 temp 631925fd1a0SIdo Schimmel bridge -d mdb get dev br0 $grp_key vid 10 | grep -q "temp" 632b6d00da0SIdo Schimmel check_err $? "Entry not marked as \"temp\" after replace" 633925fd1a0SIdo Schimmel bridge -d -s mdb get dev br0 $grp_key vid 10 | grep -q " 0.00" 634b6d00da0SIdo Schimmel check_fail $? "Entry has an unpending group timer after replace" 635b6d00da0SIdo Schimmel bridge mdb del dev br0 port $swp1 $grp_key vid 10 636b6d00da0SIdo Schimmel 637b6d00da0SIdo Schimmel # Check star exclude functionality. When adding a (S, G), all matching 638b6d00da0SIdo Schimmel # (*, G) ports need to be added to it. 639b6d00da0SIdo Schimmel bridge mdb add dev br0 port $swp2 grp $grp vid 10 640b6d00da0SIdo Schimmel bridge mdb add dev br0 port $swp1 $grp_key vid 10 641925fd1a0SIdo Schimmel bridge mdb get dev br0 $grp_key vid 10 | grep $swp2 | \ 642b6d00da0SIdo Schimmel grep -q "added_by_star_ex" 643b6d00da0SIdo Schimmel check_err $? "\"added_by_star_ex\" entry not created after adding (S, G) entry" 644b6d00da0SIdo Schimmel bridge mdb del dev br0 port $swp1 $grp_key vid 10 645b6d00da0SIdo Schimmel bridge mdb del dev br0 port $swp2 grp $grp vid 10 646b6d00da0SIdo Schimmel 647b6d00da0SIdo Schimmel log_test "$name (S, G) port group entries configuration tests" 648b6d00da0SIdo Schimmel} 649b6d00da0SIdo Schimmel 650b6d00da0SIdo Schimmelcfg_test_port_ip_sg() 651b6d00da0SIdo Schimmel{ 652b6d00da0SIdo Schimmel echo 653b6d00da0SIdo Schimmel log_info "# Port group entries configuration tests - (S, G)" 654b6d00da0SIdo Schimmel 655b6d00da0SIdo Schimmel cfg_test_port_common "IPv4 (S, G)" "grp 239.1.1.1 src 192.0.2.1" 656b6d00da0SIdo Schimmel cfg_test_port_common "IPv6 (S, G)" "grp ff0e::1 src 2001:db8:1::1" 657b6d00da0SIdo Schimmel __cfg_test_port_ip_sg "IPv4" "239.1.1.1" "192.0.2.1" 658b6d00da0SIdo Schimmel __cfg_test_port_ip_sg "IPv6" "ff0e::1" "2001:db8:1::1" 659b6d00da0SIdo Schimmel} 660b6d00da0SIdo Schimmel 661b6d00da0SIdo Schimmelcfg_test_port_ip() 662b6d00da0SIdo Schimmel{ 663b6d00da0SIdo Schimmel cfg_test_port_ip_star_g 664b6d00da0SIdo Schimmel cfg_test_port_ip_sg 665b6d00da0SIdo Schimmel} 666b6d00da0SIdo Schimmel 667b6d00da0SIdo Schimmel__cfg_test_port_l2() 668b6d00da0SIdo Schimmel{ 669b6d00da0SIdo Schimmel local grp="01:02:03:04:05:06" 670b6d00da0SIdo Schimmel 671b6d00da0SIdo Schimmel RET=0 672b6d00da0SIdo Schimmel 673b6d00da0SIdo Schimmel bridge meb add dev br0 port $swp grp 00:01:02:03:04:05 \ 674b6d00da0SIdo Schimmel permanent vid 10 &> /dev/null 675b6d00da0SIdo Schimmel check_fail $? "Managed to add an entry with unicast MAC" 676b6d00da0SIdo Schimmel 677b6d00da0SIdo Schimmel bridge mdb add dev br0 port $swp grp $grp src 00:01:02:03:04:05 \ 678b6d00da0SIdo Schimmel permanent vid 10 &> /dev/null 679b6d00da0SIdo Schimmel check_fail $? "Managed to add an entry with a source" 680b6d00da0SIdo Schimmel 681b6d00da0SIdo Schimmel bridge mdb add dev br0 port $swp1 grp $grp permanent vid 10 \ 682b6d00da0SIdo Schimmel filter_mode include &> /dev/null 683b6d00da0SIdo Schimmel check_fail $? "Managed to add an entry with a filter mode" 684b6d00da0SIdo Schimmel 685b6d00da0SIdo Schimmel bridge mdb add dev br0 port $swp1 grp $grp permanent vid 10 \ 686b6d00da0SIdo Schimmel source_list 00:01:02:03:04:05 &> /dev/null 687b6d00da0SIdo Schimmel check_fail $? "Managed to add an entry with a source list" 688b6d00da0SIdo Schimmel 689b6d00da0SIdo Schimmel log_test "L2 (*, G) port group entries configuration tests" 690b6d00da0SIdo Schimmel} 691b6d00da0SIdo Schimmel 692b6d00da0SIdo Schimmelcfg_test_port_l2() 693b6d00da0SIdo Schimmel{ 694b6d00da0SIdo Schimmel echo 695b6d00da0SIdo Schimmel log_info "# Port group entries configuration tests - L2" 696b6d00da0SIdo Schimmel 697b6d00da0SIdo Schimmel cfg_test_port_common "L2 (*, G)" "grp 01:02:03:04:05:06" 698b6d00da0SIdo Schimmel __cfg_test_port_l2 699b6d00da0SIdo Schimmel} 700b6d00da0SIdo Schimmel 701b6d00da0SIdo Schimmel# Check configuration of regular (port) entries of all types. 702b6d00da0SIdo Schimmelcfg_test_port() 703b6d00da0SIdo Schimmel{ 704b6d00da0SIdo Schimmel cfg_test_port_ip 705b6d00da0SIdo Schimmel cfg_test_port_l2 706b6d00da0SIdo Schimmel} 707b6d00da0SIdo Schimmel 70804913912SIdo Schimmelipv4_grps_get() 70904913912SIdo Schimmel{ 71004913912SIdo Schimmel local max_grps=$1; shift 71104913912SIdo Schimmel local i 71204913912SIdo Schimmel 71304913912SIdo Schimmel for i in $(seq 0 $((max_grps - 1))); do 71404913912SIdo Schimmel echo "239.1.1.$i" 71504913912SIdo Schimmel done 71604913912SIdo Schimmel} 71704913912SIdo Schimmel 71804913912SIdo Schimmelipv6_grps_get() 71904913912SIdo Schimmel{ 72004913912SIdo Schimmel local max_grps=$1; shift 72104913912SIdo Schimmel local i 72204913912SIdo Schimmel 72304913912SIdo Schimmel for i in $(seq 0 $((max_grps - 1))); do 72404913912SIdo Schimmel echo "ff0e::$(printf %x $i)" 72504913912SIdo Schimmel done 72604913912SIdo Schimmel} 72704913912SIdo Schimmel 72804913912SIdo Schimmell2_grps_get() 72904913912SIdo Schimmel{ 73004913912SIdo Schimmel local max_grps=$1; shift 73104913912SIdo Schimmel local i 73204913912SIdo Schimmel 73304913912SIdo Schimmel for i in $(seq 0 $((max_grps - 1))); do 73404913912SIdo Schimmel echo "01:00:00:00:00:$(printf %02x $i)" 73504913912SIdo Schimmel done 73604913912SIdo Schimmel} 73704913912SIdo Schimmel 73804913912SIdo Schimmelcfg_test_dump_common() 73904913912SIdo Schimmel{ 74004913912SIdo Schimmel local name=$1; shift 74104913912SIdo Schimmel local fn=$1; shift 74204913912SIdo Schimmel local max_bridges=2 74304913912SIdo Schimmel local max_grps=256 74404913912SIdo Schimmel local max_ports=32 74504913912SIdo Schimmel local num_entries 74604913912SIdo Schimmel local batch_file 74704913912SIdo Schimmel local grp 74804913912SIdo Schimmel local i j 74904913912SIdo Schimmel 75004913912SIdo Schimmel RET=0 75104913912SIdo Schimmel 75204913912SIdo Schimmel # Create net devices. 75304913912SIdo Schimmel for i in $(seq 1 $max_bridges); do 75404913912SIdo Schimmel ip link add name br-test${i} up type bridge vlan_filtering 1 \ 75504913912SIdo Schimmel mcast_snooping 1 75604913912SIdo Schimmel for j in $(seq 1 $max_ports); do 75704913912SIdo Schimmel ip link add name br-test${i}-du${j} up \ 75804913912SIdo Schimmel master br-test${i} type dummy 75904913912SIdo Schimmel done 76004913912SIdo Schimmel done 76104913912SIdo Schimmel 76204913912SIdo Schimmel # Create batch file with MDB entries. 76304913912SIdo Schimmel batch_file=$(mktemp) 76404913912SIdo Schimmel for i in $(seq 1 $max_bridges); do 76504913912SIdo Schimmel for j in $(seq 1 $max_ports); do 76604913912SIdo Schimmel for grp in $($fn $max_grps); do 76704913912SIdo Schimmel echo "mdb add dev br-test${i} \ 76804913912SIdo Schimmel port br-test${i}-du${j} grp $grp \ 76904913912SIdo Schimmel permanent vid 1" >> $batch_file 77004913912SIdo Schimmel done 77104913912SIdo Schimmel done 77204913912SIdo Schimmel done 77304913912SIdo Schimmel 77404913912SIdo Schimmel # Program the batch file and check for expected number of entries. 77504913912SIdo Schimmel bridge -b $batch_file 77604913912SIdo Schimmel for i in $(seq 1 $max_bridges); do 77704913912SIdo Schimmel num_entries=$(bridge mdb show dev br-test${i} | \ 77804913912SIdo Schimmel grep "permanent" | wc -l) 77904913912SIdo Schimmel [[ $num_entries -eq $((max_grps * max_ports)) ]] 78004913912SIdo Schimmel check_err $? "Wrong number of entries in br-test${i}" 78104913912SIdo Schimmel done 78204913912SIdo Schimmel 78304913912SIdo Schimmel # Cleanup. 78404913912SIdo Schimmel rm $batch_file 78504913912SIdo Schimmel for i in $(seq 1 $max_bridges); do 78604913912SIdo Schimmel ip link del dev br-test${i} 78704913912SIdo Schimmel for j in $(seq $max_ports); do 78804913912SIdo Schimmel ip link del dev br-test${i}-du${j} 78904913912SIdo Schimmel done 79004913912SIdo Schimmel done 79104913912SIdo Schimmel 79204913912SIdo Schimmel log_test "$name large scale dump tests" 79304913912SIdo Schimmel} 79404913912SIdo Schimmel 79504913912SIdo Schimmel# Check large scale dump. 79604913912SIdo Schimmelcfg_test_dump() 79704913912SIdo Schimmel{ 79804913912SIdo Schimmel echo 79904913912SIdo Schimmel log_info "# Large scale dump tests" 80004913912SIdo Schimmel 80104913912SIdo Schimmel cfg_test_dump_common "IPv4" ipv4_grps_get 80204913912SIdo Schimmel cfg_test_dump_common "IPv6" ipv6_grps_get 80304913912SIdo Schimmel cfg_test_dump_common "L2" l2_grps_get 80404913912SIdo Schimmel} 80504913912SIdo Schimmel 806b6d00da0SIdo Schimmelcfg_test() 807b6d00da0SIdo Schimmel{ 808b6d00da0SIdo Schimmel cfg_test_host 809b6d00da0SIdo Schimmel cfg_test_port 81004913912SIdo Schimmel cfg_test_dump 811b6d00da0SIdo Schimmel} 812b6d00da0SIdo Schimmel 813b6d00da0SIdo Schimmel__fwd_test_host_ip() 814b6d00da0SIdo Schimmel{ 815b6d00da0SIdo Schimmel local grp=$1; shift 816e98e195dSIdo Schimmel local dmac=$1; shift 817b6d00da0SIdo Schimmel local src=$1; shift 818b6d00da0SIdo Schimmel local mode=$1; shift 819b6d00da0SIdo Schimmel local name 820b6d00da0SIdo Schimmel local eth_type 821b6d00da0SIdo Schimmel 822b6d00da0SIdo Schimmel RET=0 823b6d00da0SIdo Schimmel 824b6d00da0SIdo Schimmel if [[ $mode == "-4" ]]; then 825b6d00da0SIdo Schimmel name="IPv4" 826b6d00da0SIdo Schimmel eth_type="ipv4" 827b6d00da0SIdo Schimmel else 828b6d00da0SIdo Schimmel name="IPv6" 829b6d00da0SIdo Schimmel eth_type="ipv6" 830b6d00da0SIdo Schimmel fi 831b6d00da0SIdo Schimmel 832b6d00da0SIdo Schimmel tc filter add dev br0 ingress protocol 802.1q pref 1 handle 1 flower \ 833b6d00da0SIdo Schimmel vlan_ethtype $eth_type vlan_id 10 dst_ip $grp src_ip $src \ 834b6d00da0SIdo Schimmel action drop 835b6d00da0SIdo Schimmel 836b6d00da0SIdo Schimmel # Packet should only be flooded to multicast router ports when there is 837b6d00da0SIdo Schimmel # no matching MDB entry. The bridge is not configured as a multicast 838b6d00da0SIdo Schimmel # router port. 839e98e195dSIdo Schimmel $MZ $mode $h1.10 -a own -b $dmac -c 1 -p 128 -A $src -B $grp -t udp -q 840b6d00da0SIdo Schimmel tc_check_packets "dev br0 ingress" 1 0 841b6d00da0SIdo Schimmel check_err $? "Packet locally received after flood" 842b6d00da0SIdo Schimmel 843b6d00da0SIdo Schimmel # Install a regular port group entry and expect the packet to not be 844b6d00da0SIdo Schimmel # locally received. 845b6d00da0SIdo Schimmel bridge mdb add dev br0 port $swp2 grp $grp temp vid 10 846e98e195dSIdo Schimmel $MZ $mode $h1.10 -a own -b $dmac -c 1 -p 128 -A $src -B $grp -t udp -q 847b6d00da0SIdo Schimmel tc_check_packets "dev br0 ingress" 1 0 848b6d00da0SIdo Schimmel check_err $? "Packet locally received after installing a regular entry" 849b6d00da0SIdo Schimmel 850b6d00da0SIdo Schimmel # Add a host entry and expect the packet to be locally received. 851b6d00da0SIdo Schimmel bridge mdb add dev br0 port br0 grp $grp temp vid 10 852e98e195dSIdo Schimmel $MZ $mode $h1.10 -a own -b $dmac -c 1 -p 128 -A $src -B $grp -t udp -q 853b6d00da0SIdo Schimmel tc_check_packets "dev br0 ingress" 1 1 854b6d00da0SIdo Schimmel check_err $? "Packet not locally received after adding a host entry" 855b6d00da0SIdo Schimmel 856b6d00da0SIdo Schimmel # Remove the host entry and expect the packet to not be locally 857b6d00da0SIdo Schimmel # received. 858b6d00da0SIdo Schimmel bridge mdb del dev br0 port br0 grp $grp vid 10 859e98e195dSIdo Schimmel $MZ $mode $h1.10 -a own -b $dmac -c 1 -p 128 -A $src -B $grp -t udp -q 860b6d00da0SIdo Schimmel tc_check_packets "dev br0 ingress" 1 1 861b6d00da0SIdo Schimmel check_err $? "Packet locally received after removing a host entry" 862b6d00da0SIdo Schimmel 863b6d00da0SIdo Schimmel bridge mdb del dev br0 port $swp2 grp $grp vid 10 864b6d00da0SIdo Schimmel 865b6d00da0SIdo Schimmel tc filter del dev br0 ingress protocol 802.1q pref 1 handle 1 flower 866b6d00da0SIdo Schimmel 867b6d00da0SIdo Schimmel log_test "$name host entries forwarding tests" 868b6d00da0SIdo Schimmel} 869b6d00da0SIdo Schimmel 870b6d00da0SIdo Schimmelfwd_test_host_ip() 871b6d00da0SIdo Schimmel{ 872e98e195dSIdo Schimmel __fwd_test_host_ip "239.1.1.1" "01:00:5e:01:01:01" "192.0.2.1" "-4" 873e98e195dSIdo Schimmel __fwd_test_host_ip "ff0e::1" "33:33:00:00:00:01" "2001:db8:1::1" "-6" 874b6d00da0SIdo Schimmel} 875b6d00da0SIdo Schimmel 876b6d00da0SIdo Schimmelfwd_test_host_l2() 877b6d00da0SIdo Schimmel{ 878b6d00da0SIdo Schimmel local dmac=01:02:03:04:05:06 879b6d00da0SIdo Schimmel 880b6d00da0SIdo Schimmel RET=0 881b6d00da0SIdo Schimmel 882b6d00da0SIdo Schimmel tc filter add dev br0 ingress protocol all pref 1 handle 1 flower \ 883b6d00da0SIdo Schimmel dst_mac $dmac action drop 884b6d00da0SIdo Schimmel 885b6d00da0SIdo Schimmel # Packet should be flooded and locally received when there is no 886b6d00da0SIdo Schimmel # matching MDB entry. 887b6d00da0SIdo Schimmel $MZ $h1.10 -c 1 -p 128 -a own -b $dmac -q 888b6d00da0SIdo Schimmel tc_check_packets "dev br0 ingress" 1 1 889b6d00da0SIdo Schimmel check_err $? "Packet not locally received after flood" 890b6d00da0SIdo Schimmel 891b6d00da0SIdo Schimmel # Install a regular port group entry and expect the packet to not be 892b6d00da0SIdo Schimmel # locally received. 893b6d00da0SIdo Schimmel bridge mdb add dev br0 port $swp2 grp $dmac permanent vid 10 894b6d00da0SIdo Schimmel $MZ $h1.10 -c 1 -p 128 -a own -b $dmac -q 895b6d00da0SIdo Schimmel tc_check_packets "dev br0 ingress" 1 1 896b6d00da0SIdo Schimmel check_err $? "Packet locally received after installing a regular entry" 897b6d00da0SIdo Schimmel 898b6d00da0SIdo Schimmel # Add a host entry and expect the packet to be locally received. 899b6d00da0SIdo Schimmel bridge mdb add dev br0 port br0 grp $dmac permanent vid 10 900b6d00da0SIdo Schimmel $MZ $h1.10 -c 1 -p 128 -a own -b $dmac -q 901b6d00da0SIdo Schimmel tc_check_packets "dev br0 ingress" 1 2 902b6d00da0SIdo Schimmel check_err $? "Packet not locally received after adding a host entry" 903b6d00da0SIdo Schimmel 904b6d00da0SIdo Schimmel # Remove the host entry and expect the packet to not be locally 905b6d00da0SIdo Schimmel # received. 906b6d00da0SIdo Schimmel bridge mdb del dev br0 port br0 grp $dmac permanent vid 10 907b6d00da0SIdo Schimmel $MZ $h1.10 -c 1 -p 128 -a own -b $dmac -q 908b6d00da0SIdo Schimmel tc_check_packets "dev br0 ingress" 1 2 909b6d00da0SIdo Schimmel check_err $? "Packet locally received after removing a host entry" 910b6d00da0SIdo Schimmel 911b6d00da0SIdo Schimmel bridge mdb del dev br0 port $swp2 grp $dmac permanent vid 10 912b6d00da0SIdo Schimmel 913b6d00da0SIdo Schimmel tc filter del dev br0 ingress protocol all pref 1 handle 1 flower 914b6d00da0SIdo Schimmel 915b6d00da0SIdo Schimmel log_test "L2 host entries forwarding tests" 916b6d00da0SIdo Schimmel} 917b6d00da0SIdo Schimmel 918b6d00da0SIdo Schimmelfwd_test_host() 919b6d00da0SIdo Schimmel{ 920b6d00da0SIdo Schimmel # Disable multicast router on the bridge to ensure that packets are 921b6d00da0SIdo Schimmel # only locally received when a matching host entry is present. 922b6d00da0SIdo Schimmel ip link set dev br0 type bridge mcast_router 0 923b6d00da0SIdo Schimmel 924b6d00da0SIdo Schimmel fwd_test_host_ip 925b6d00da0SIdo Schimmel fwd_test_host_l2 926b6d00da0SIdo Schimmel 927b6d00da0SIdo Schimmel ip link set dev br0 type bridge mcast_router 1 928b6d00da0SIdo Schimmel} 929b6d00da0SIdo Schimmel 930b6d00da0SIdo Schimmel__fwd_test_port_ip() 931b6d00da0SIdo Schimmel{ 932b6d00da0SIdo Schimmel local grp=$1; shift 933e98e195dSIdo Schimmel local dmac=$1; shift 934b6d00da0SIdo Schimmel local valid_src=$1; shift 935b6d00da0SIdo Schimmel local invalid_src=$1; shift 936b6d00da0SIdo Schimmel local mode=$1; shift 937b6d00da0SIdo Schimmel local filter_mode=$1; shift 938b6d00da0SIdo Schimmel local name 939b6d00da0SIdo Schimmel local eth_type 940b6d00da0SIdo Schimmel local src_list 941b6d00da0SIdo Schimmel 942b6d00da0SIdo Schimmel RET=0 943b6d00da0SIdo Schimmel 944b6d00da0SIdo Schimmel if [[ $mode == "-4" ]]; then 945b6d00da0SIdo Schimmel name="IPv4" 946b6d00da0SIdo Schimmel eth_type="ipv4" 947b6d00da0SIdo Schimmel else 948b6d00da0SIdo Schimmel name="IPv6" 949b6d00da0SIdo Schimmel eth_type="ipv6" 950b6d00da0SIdo Schimmel fi 951b6d00da0SIdo Schimmel 952b6d00da0SIdo Schimmel # The valid source is the one we expect to get packets from after 953b6d00da0SIdo Schimmel # adding the entry. 954b6d00da0SIdo Schimmel if [[ $filter_mode == "include" ]]; then 955b6d00da0SIdo Schimmel src_list=$valid_src 956b6d00da0SIdo Schimmel else 957b6d00da0SIdo Schimmel src_list=$invalid_src 958b6d00da0SIdo Schimmel fi 959b6d00da0SIdo Schimmel 960b6d00da0SIdo Schimmel tc filter add dev $h2 ingress protocol 802.1q pref 1 handle 1 flower \ 961b6d00da0SIdo Schimmel vlan_ethtype $eth_type vlan_id 10 dst_ip $grp \ 962b6d00da0SIdo Schimmel src_ip $valid_src action drop 963b6d00da0SIdo Schimmel tc filter add dev $h2 ingress protocol 802.1q pref 1 handle 2 flower \ 964b6d00da0SIdo Schimmel vlan_ethtype $eth_type vlan_id 10 dst_ip $grp \ 965b6d00da0SIdo Schimmel src_ip $invalid_src action drop 966b6d00da0SIdo Schimmel 967e98e195dSIdo Schimmel $MZ $mode $h1.10 -a own -b $dmac -c 1 -p 128 -A $valid_src -B $grp -t udp -q 968b6d00da0SIdo Schimmel tc_check_packets "dev $h2 ingress" 1 0 969b6d00da0SIdo Schimmel check_err $? "Packet from valid source received on H2 before adding entry" 970b6d00da0SIdo Schimmel 971e98e195dSIdo Schimmel $MZ $mode $h1.10 -a own -b $dmac -c 1 -p 128 -A $invalid_src -B $grp -t udp -q 972b6d00da0SIdo Schimmel tc_check_packets "dev $h2 ingress" 2 0 973b6d00da0SIdo Schimmel check_err $? "Packet from invalid source received on H2 before adding entry" 974b6d00da0SIdo Schimmel 975b6d00da0SIdo Schimmel bridge mdb add dev br0 port $swp2 grp $grp vid 10 \ 976b6d00da0SIdo Schimmel filter_mode $filter_mode source_list $src_list 977b6d00da0SIdo Schimmel 978e98e195dSIdo Schimmel $MZ $mode $h1.10 -a own -b $dmac -c 1 -p 128 -A $valid_src -B $grp -t udp -q 979b6d00da0SIdo Schimmel tc_check_packets "dev $h2 ingress" 1 1 980b6d00da0SIdo Schimmel check_err $? "Packet from valid source not received on H2 after adding entry" 981b6d00da0SIdo Schimmel 982e98e195dSIdo Schimmel $MZ $mode $h1.10 -a own -b $dmac -c 1 -p 128 -A $invalid_src -B $grp -t udp -q 983b6d00da0SIdo Schimmel tc_check_packets "dev $h2 ingress" 2 0 984b6d00da0SIdo Schimmel check_err $? "Packet from invalid source received on H2 after adding entry" 985b6d00da0SIdo Schimmel 986b6d00da0SIdo Schimmel bridge mdb replace dev br0 port $swp2 grp $grp vid 10 \ 987b6d00da0SIdo Schimmel filter_mode exclude 988b6d00da0SIdo Schimmel 989e98e195dSIdo Schimmel $MZ $mode $h1.10 -a own -b $dmac -c 1 -p 128 -A $valid_src -B $grp -t udp -q 990b6d00da0SIdo Schimmel tc_check_packets "dev $h2 ingress" 1 2 991b6d00da0SIdo Schimmel check_err $? "Packet from valid source not received on H2 after allowing all sources" 992b6d00da0SIdo Schimmel 993e98e195dSIdo Schimmel $MZ $mode $h1.10 -a own -b $dmac -c 1 -p 128 -A $invalid_src -B $grp -t udp -q 994b6d00da0SIdo Schimmel tc_check_packets "dev $h2 ingress" 2 1 995b6d00da0SIdo Schimmel check_err $? "Packet from invalid source not received on H2 after allowing all sources" 996b6d00da0SIdo Schimmel 997b6d00da0SIdo Schimmel bridge mdb del dev br0 port $swp2 grp $grp vid 10 998b6d00da0SIdo Schimmel 999e98e195dSIdo Schimmel $MZ $mode $h1.10 -a own -b $dmac -c 1 -p 128 -A $valid_src -B $grp -t udp -q 1000b6d00da0SIdo Schimmel tc_check_packets "dev $h2 ingress" 1 2 1001b6d00da0SIdo Schimmel check_err $? "Packet from valid source received on H2 after deleting entry" 1002b6d00da0SIdo Schimmel 1003e98e195dSIdo Schimmel $MZ $mode $h1.10 -a own -b $dmac -c 1 -p 128 -A $invalid_src -B $grp -t udp -q 1004b6d00da0SIdo Schimmel tc_check_packets "dev $h2 ingress" 2 1 1005b6d00da0SIdo Schimmel check_err $? "Packet from invalid source received on H2 after deleting entry" 1006b6d00da0SIdo Schimmel 1007b6d00da0SIdo Schimmel tc filter del dev $h2 ingress protocol 802.1q pref 1 handle 2 flower 1008b6d00da0SIdo Schimmel tc filter del dev $h2 ingress protocol 802.1q pref 1 handle 1 flower 1009b6d00da0SIdo Schimmel 1010b6d00da0SIdo Schimmel log_test "$name port group \"$filter_mode\" entries forwarding tests" 1011b6d00da0SIdo Schimmel} 1012b6d00da0SIdo Schimmel 1013b6d00da0SIdo Schimmelfwd_test_port_ip() 1014b6d00da0SIdo Schimmel{ 1015e98e195dSIdo Schimmel __fwd_test_port_ip "239.1.1.1" "01:00:5e:01:01:01" "192.0.2.1" "192.0.2.2" "-4" "exclude" 1016e98e195dSIdo Schimmel __fwd_test_port_ip "ff0e::1" "33:33:00:00:00:01" "2001:db8:1::1" "2001:db8:1::2" "-6" \ 1017b6d00da0SIdo Schimmel "exclude" 1018e98e195dSIdo Schimmel __fwd_test_port_ip "239.1.1.1" "01:00:5e:01:01:01" "192.0.2.1" "192.0.2.2" "-4" "include" 1019e98e195dSIdo Schimmel __fwd_test_port_ip "ff0e::1" "33:33:00:00:00:01" "2001:db8:1::1" "2001:db8:1::2" "-6" \ 1020b6d00da0SIdo Schimmel "include" 1021b6d00da0SIdo Schimmel} 1022b6d00da0SIdo Schimmel 1023b6d00da0SIdo Schimmelfwd_test_port_l2() 1024b6d00da0SIdo Schimmel{ 1025b6d00da0SIdo Schimmel local dmac=01:02:03:04:05:06 1026b6d00da0SIdo Schimmel 1027b6d00da0SIdo Schimmel RET=0 1028b6d00da0SIdo Schimmel 1029b6d00da0SIdo Schimmel tc filter add dev $h2 ingress protocol all pref 1 handle 1 flower \ 1030b6d00da0SIdo Schimmel dst_mac $dmac action drop 1031b6d00da0SIdo Schimmel 1032b6d00da0SIdo Schimmel $MZ $h1.10 -c 1 -p 128 -a own -b $dmac -q 1033b6d00da0SIdo Schimmel tc_check_packets "dev $h2 ingress" 1 0 1034b6d00da0SIdo Schimmel check_err $? "Packet received on H2 before adding entry" 1035b6d00da0SIdo Schimmel 1036b6d00da0SIdo Schimmel bridge mdb add dev br0 port $swp2 grp $dmac permanent vid 10 1037b6d00da0SIdo Schimmel $MZ $h1.10 -c 1 -p 128 -a own -b $dmac -q 1038b6d00da0SIdo Schimmel tc_check_packets "dev $h2 ingress" 1 1 1039b6d00da0SIdo Schimmel check_err $? "Packet not received on H2 after adding entry" 1040b6d00da0SIdo Schimmel 1041b6d00da0SIdo Schimmel bridge mdb del dev br0 port $swp2 grp $dmac permanent vid 10 1042b6d00da0SIdo Schimmel $MZ $h1.10 -c 1 -p 128 -a own -b $dmac -q 1043b6d00da0SIdo Schimmel tc_check_packets "dev $h2 ingress" 1 1 1044b6d00da0SIdo Schimmel check_err $? "Packet received on H2 after deleting entry" 1045b6d00da0SIdo Schimmel 1046b6d00da0SIdo Schimmel tc filter del dev $h2 ingress protocol all pref 1 handle 1 flower 1047b6d00da0SIdo Schimmel 1048b6d00da0SIdo Schimmel log_test "L2 port entries forwarding tests" 1049b6d00da0SIdo Schimmel} 1050b6d00da0SIdo Schimmel 1051b6d00da0SIdo Schimmelfwd_test_port() 1052b6d00da0SIdo Schimmel{ 1053b6d00da0SIdo Schimmel # Disable multicast flooding to ensure that packets are only forwarded 1054b6d00da0SIdo Schimmel # out of a port when a matching port group entry is present. 1055b6d00da0SIdo Schimmel bridge link set dev $swp2 mcast_flood off 1056b6d00da0SIdo Schimmel 1057b6d00da0SIdo Schimmel fwd_test_port_ip 1058b6d00da0SIdo Schimmel fwd_test_port_l2 1059b6d00da0SIdo Schimmel 1060b6d00da0SIdo Schimmel bridge link set dev $swp2 mcast_flood on 1061b6d00da0SIdo Schimmel} 1062b6d00da0SIdo Schimmel 1063b6d00da0SIdo Schimmelfwd_test() 1064b6d00da0SIdo Schimmel{ 1065b6d00da0SIdo Schimmel echo 1066b6d00da0SIdo Schimmel log_info "# Forwarding tests" 1067b6d00da0SIdo Schimmel 1068c3e0cfe7SIdo Schimmel # Set the Max Response Delay to 100 centiseconds (1 second) so that the 1069c3e0cfe7SIdo Schimmel # bridge will start forwarding according to its MDB soon after a 1070c3e0cfe7SIdo Schimmel # multicast querier is enabled. 1071c3e0cfe7SIdo Schimmel ip link set dev br0 type bridge mcast_query_response_interval 100 1072c3e0cfe7SIdo Schimmel 1073b6d00da0SIdo Schimmel # Forwarding according to MDB entries only takes place when the bridge 1074b6d00da0SIdo Schimmel # detects that there is a valid querier in the network. Set the bridge 1075b6d00da0SIdo Schimmel # as the querier and assign it a valid IPv6 link-local address to be 1076b6d00da0SIdo Schimmel # used as the source address for MLD queries. 1077b6d00da0SIdo Schimmel ip -6 address add fe80::1/64 nodad dev br0 1078b6d00da0SIdo Schimmel ip link set dev br0 type bridge mcast_querier 1 1079b6d00da0SIdo Schimmel sleep 10 1080b6d00da0SIdo Schimmel 1081b6d00da0SIdo Schimmel fwd_test_host 1082b6d00da0SIdo Schimmel fwd_test_port 1083b6d00da0SIdo Schimmel 1084b6d00da0SIdo Schimmel ip link set dev br0 type bridge mcast_querier 0 1085b6d00da0SIdo Schimmel ip -6 address del fe80::1/64 dev br0 1086c3e0cfe7SIdo Schimmel ip link set dev br0 type bridge mcast_query_response_interval 1000 1087b6d00da0SIdo Schimmel} 1088b6d00da0SIdo Schimmel 1089b6d00da0SIdo Schimmelctrl_igmpv3_is_in_test() 1090b6d00da0SIdo Schimmel{ 1091b6d00da0SIdo Schimmel RET=0 1092b6d00da0SIdo Schimmel 1093b6d00da0SIdo Schimmel # Add a permanent entry and check that it is not affected by the 1094b6d00da0SIdo Schimmel # received IGMP packet. 1095b6d00da0SIdo Schimmel bridge mdb add dev br0 port $swp1 grp 239.1.1.1 permanent vid 10 \ 1096b6d00da0SIdo Schimmel filter_mode include source_list 192.0.2.1 1097b6d00da0SIdo Schimmel 1098b6d00da0SIdo Schimmel # IS_IN ( 192.0.2.2 ) 1099e98e195dSIdo Schimmel $MZ $h1.10 -c 1 -a own -b 01:00:5e:01:01:01 -A 192.0.2.1 -B 239.1.1.1 \ 1100506a1ac9SPetr Machata -t ip proto=2,p=$(igmpv3_is_in_get 239.1.1.1 192.0.2.2) -q 1101b6d00da0SIdo Schimmel 1102925fd1a0SIdo Schimmel bridge mdb get dev br0 grp 239.1.1.1 src 192.0.2.2 vid 10 &> /dev/null 1103b6d00da0SIdo Schimmel check_fail $? "Permanent entry affected by IGMP packet" 1104b6d00da0SIdo Schimmel 1105b6d00da0SIdo Schimmel # Replace the permanent entry with a temporary one and check that after 1106b6d00da0SIdo Schimmel # processing the IGMP packet, a new source is added to the list along 1107b6d00da0SIdo Schimmel # with a new forwarding entry. 1108b6d00da0SIdo Schimmel bridge mdb replace dev br0 port $swp1 grp 239.1.1.1 temp vid 10 \ 1109b6d00da0SIdo Schimmel filter_mode include source_list 192.0.2.1 1110b6d00da0SIdo Schimmel 1111b6d00da0SIdo Schimmel # IS_IN ( 192.0.2.2 ) 1112e98e195dSIdo Schimmel $MZ $h1.10 -a own -b 01:00:5e:01:01:01 -c 1 -A 192.0.2.1 -B 239.1.1.1 \ 1113506a1ac9SPetr Machata -t ip proto=2,p=$(igmpv3_is_in_get 239.1.1.1 192.0.2.2) -q 1114b6d00da0SIdo Schimmel 1115925fd1a0SIdo Schimmel bridge -d mdb get dev br0 grp 239.1.1.1 vid 10 | grep -q 192.0.2.2 1116b6d00da0SIdo Schimmel check_err $? "Source not add to source list" 1117b6d00da0SIdo Schimmel 1118925fd1a0SIdo Schimmel bridge mdb get dev br0 grp 239.1.1.1 src 192.0.2.2 vid 10 &> /dev/null 1119b6d00da0SIdo Schimmel check_err $? "(S, G) entry not created for new source" 1120b6d00da0SIdo Schimmel 1121b6d00da0SIdo Schimmel bridge mdb del dev br0 port $swp1 grp 239.1.1.1 vid 10 1122b6d00da0SIdo Schimmel 1123f7ccf60cSPetr Machata log_test "IGMPv3 MODE_IS_INCLUDE tests" 1124b6d00da0SIdo Schimmel} 1125b6d00da0SIdo Schimmel 1126b6d00da0SIdo Schimmelctrl_mldv2_is_in_test() 1127b6d00da0SIdo Schimmel{ 1128b6d00da0SIdo Schimmel RET=0 1129b6d00da0SIdo Schimmel 1130b6d00da0SIdo Schimmel # Add a permanent entry and check that it is not affected by the 1131b6d00da0SIdo Schimmel # received MLD packet. 1132b6d00da0SIdo Schimmel bridge mdb add dev br0 port $swp1 grp ff0e::1 permanent vid 10 \ 1133b6d00da0SIdo Schimmel filter_mode include source_list 2001:db8:1::1 1134b6d00da0SIdo Schimmel 1135b6d00da0SIdo Schimmel # IS_IN ( 2001:db8:1::2 ) 1136506a1ac9SPetr Machata local p=$(mldv2_is_in_get fe80::1 ff0e::1 2001:db8:1::2) 1137e98e195dSIdo Schimmel $MZ -6 $h1.10 -a own -b 33:33:00:00:00:01 -c 1 -A fe80::1 -B ff0e::1 \ 1138506a1ac9SPetr Machata -t ip hop=1,next=0,p="$p" -q 1139b6d00da0SIdo Schimmel 1140925fd1a0SIdo Schimmel bridge mdb get dev br0 grp ff0e::1 src 2001:db8:1::2 vid 10 &> /dev/null 1141b6d00da0SIdo Schimmel check_fail $? "Permanent entry affected by MLD packet" 1142b6d00da0SIdo Schimmel 1143b6d00da0SIdo Schimmel # Replace the permanent entry with a temporary one and check that after 1144b6d00da0SIdo Schimmel # processing the MLD packet, a new source is added to the list along 1145b6d00da0SIdo Schimmel # with a new forwarding entry. 1146b6d00da0SIdo Schimmel bridge mdb replace dev br0 port $swp1 grp ff0e::1 temp vid 10 \ 1147b6d00da0SIdo Schimmel filter_mode include source_list 2001:db8:1::1 1148b6d00da0SIdo Schimmel 1149b6d00da0SIdo Schimmel # IS_IN ( 2001:db8:1::2 ) 1150e98e195dSIdo Schimmel $MZ -6 $h1.10 -a own -b 33:33:00:00:00:01 -c 1 -A fe80::1 -B ff0e::1 \ 1151506a1ac9SPetr Machata -t ip hop=1,next=0,p="$p" -q 1152b6d00da0SIdo Schimmel 1153925fd1a0SIdo Schimmel bridge -d mdb get dev br0 grp ff0e::1 vid 10 | grep -q 2001:db8:1::2 1154b6d00da0SIdo Schimmel check_err $? "Source not add to source list" 1155b6d00da0SIdo Schimmel 1156925fd1a0SIdo Schimmel bridge mdb get dev br0 grp ff0e::1 src 2001:db8:1::2 vid 10 &> /dev/null 1157b6d00da0SIdo Schimmel check_err $? "(S, G) entry not created for new source" 1158b6d00da0SIdo Schimmel 1159b6d00da0SIdo Schimmel bridge mdb del dev br0 port $swp1 grp ff0e::1 vid 10 1160b6d00da0SIdo Schimmel 1161b6d00da0SIdo Schimmel log_test "MLDv2 MODE_IS_INCLUDE tests" 1162b6d00da0SIdo Schimmel} 1163b6d00da0SIdo Schimmel 1164b6d00da0SIdo Schimmelctrl_test() 1165b6d00da0SIdo Schimmel{ 1166b6d00da0SIdo Schimmel echo 1167b6d00da0SIdo Schimmel log_info "# Control packets tests" 1168b6d00da0SIdo Schimmel 1169b6d00da0SIdo Schimmel ctrl_igmpv3_is_in_test 1170b6d00da0SIdo Schimmel ctrl_mldv2_is_in_test 1171b6d00da0SIdo Schimmel} 1172b6d00da0SIdo Schimmel 1173925fd1a0SIdo Schimmelif ! bridge mdb help 2>&1 | grep -q "get"; then 1174925fd1a0SIdo Schimmel echo "SKIP: iproute2 too old, missing bridge mdb get support" 1175ab2eda04SIdo Schimmel exit $ksft_skip 1176ab2eda04SIdo Schimmelfi 1177ab2eda04SIdo Schimmel 1178b6d00da0SIdo Schimmeltrap cleanup EXIT 1179b6d00da0SIdo Schimmel 1180b6d00da0SIdo Schimmelsetup_prepare 1181b6d00da0SIdo Schimmelsetup_wait 1182b6d00da0SIdo Schimmeltests_run 1183b6d00da0SIdo Schimmel 1184b6d00da0SIdo Schimmelexit $EXIT_STATUS 1185