ip link add name br0 type bridge vlan_filtering 0 \
mcast_snooping 1 \
mcast_igmp_version 3 mcast_mld_version 2
ip link set dev br0 up
ip link set dev $swp1 master br0
ip link set dev $swp1 up
bridge link set dev $swp1 fastleave on
ip link set dev $swp2 master br0
ip link set dev $swp2 up
}
switch_create_8021q()
{
local br_flags=$1; shift
log_info "802.1q $br_flags${br_flags:+ }tests"
ip link add name br0 type bridge vlan_filtering 1 vlan_default_pvid 0 \
mcast_snooping 1 $br_flags \
mcast_igmp_version 3 mcast_mld_version 2
bridge vlan add vid 10 dev br0 self
bridge vlan add vid 20 dev br0 self
ip link set dev br0 up
ip link set dev $swp1 master br0
ip link set dev $swp1 up
bridge link set dev $swp1 fastleave on
bridge vlan add vid 10 dev $swp1
bridge vlan add vid 20 dev $swp1
ip link set dev $swp2 master br0
ip link set dev $swp2 up
bridge vlan add vid 10 dev $swp2
bridge vlan add vid 20 dev $swp2
}
switch_create_8021qvs()
{
switch_create_8021q "mcast_vlan_snooping 1"
bridge vlan global set dev br0 vid 10 mcast_igmp_version 3
bridge vlan global set dev br0 vid 10 mcast_mld_version 2
bridge vlan global set dev br0 vid 20 mcast_igmp_version 3
bridge vlan global set dev br0 vid 20 mcast_mld_version 2
}
switch_destroy()
{
ip link set dev $swp2 down
ip link set dev $swp2 nomaster
ip link set dev $swp1 down
ip link set dev $swp1 nomaster
cfg_src_list()
{
local IPs=("$@")
local IPstr=$(echo ${IPs[@]} | tr '[:space:]' , | sed 's/,$//')
echo ${IPstr:+source_list }${IPstr}
}
cfg_group_op()
{
local op=$1; shift
local locus=$1; shift
local GRP=$1; shift
local state=$1; shift
local IPs=("$@")
local source_list=$(cfg_src_list ${IPs[@]})
# Everything besides `bridge mdb' uses the "dev X vid Y" syntax, # so we use it here as well and convert.
local br_locus=$(echo"$locus" | sed 's/^dev /port /')
bridge mdb $op dev br0 $br_locus grp $GRP $state \
filter_mode include $source_list
}
cfg4_entries_op()
{
local op=$1; shift
local locus=$1; shift
local state=$1; shift
local n=$1; shift
local grp=${1:-1}; shift
local GRP=239.1.1.${grp}
local IPs=$(seq -f 192.0.2.%g 1 $((n - 1)))
cfg_group_op "$op""$locus""$GRP""$state" ${IPs[@]}
}
cfg4_entries_add()
{
cfg4_entries_op add "$@"
}
cfg4_entries_del()
{
cfg4_entries_op del"$@"
}
cfg6_entries_op()
{
local op=$1; shift
local locus=$1; shift
local state=$1; shift
local n=$1; shift
local grp=${1:-1}; shift
local GRP=ff0e::${grp}
local IPs=$(printf "2001:db8:1::%x\n" $(seq 1 $((n - 1))))
cfg_group_op "$op""$locus""$GRP""$state" ${IPs[@]}
}
cfg6_entries_add()
{
cfg6_entries_op add "$@"
}
cfg6_entries_del()
{
cfg6_entries_op del"$@"
}
locus_dev_peer()
{
local dev_kw=$1; shift
local dev=$1; shift
local vid_kw=$1; shift
local vid=$1; shift
echo"$h1.${vid:-10}"
}
locus_dev()
{
local dev_kw=$1; shift
local dev=$1; shift
echo $dev
}
ctl4_entries_add()
{
local locus=$1; shift
local state=$1; shift
local n=$1; shift
local grp=${1:-1}; shift
local IPs=$(seq -f 192.0.2.%g 1 $((n - 1)))
local peer=$(locus_dev_peer $locus)
local GRP=239.1.1.${grp}
local dmac=01:00:5e:01:01:$(printf "%02x" $grp)
$MZ $peer -a own -b $dmac -c 1 -A 192.0.2.1 -B $GRP \
-t ip proto=2,p=$(igmpv3_is_in_get $GRP $IPs) -q
sleep 1
local nn=$(bridge mdb show dev br0 | grep $GRP | wc -l) if ((nn != n)); then echo mcast_max_groups > /dev/stderr
false fi
}
ctl4_entries_del()
{
local locus=$1; shift
local state=$1; shift
local n=$1; shift
local grp=${1:-1}; shift
local peer=$(locus_dev_peer $locus)
local GRP=239.1.1.${grp}
local dmac=01:00:5e:00:00:02
$MZ $peer -a own -b $dmac -c 1 -A 192.0.2.1 -B 224.0.0.2 \
-t ip proto=2,p=$(igmpv2_leave_get $GRP) -q
sleep 1
! bridge mdb show dev br0 | grep -q $GRP
}
ctl6_entries_add()
{
local locus=$1; shift
local state=$1; shift
local n=$1; shift
local grp=${1:-1}; shift
local IPs=$(printf "2001:db8:1::%x\n" $(seq 1 $((n - 1))))
local peer=$(locus_dev_peer $locus)
local SIP=fe80::1
local GRP=ff0e::${grp}
local dmac=33:33:00:00:00:$(printf "%02x" $grp)
local p=$(mldv2_is_in_get $SIP $GRP $IPs)
$MZ -6 $peer -a own -b $dmac -c 1 -A $SIP -B $GRP \
-t ip hop=1,next=0,p="$p" -q
sleep 1
local nn=$(bridge mdb show dev br0 | grep $GRP | wc -l) if ((nn != n)); then echo mcast_max_groups > /dev/stderr
false fi
}
ctl6_entries_del()
{
local locus=$1; shift
local state=$1; shift
local n=$1; shift
local grp=${1:-1}; shift
local peer=$(locus_dev_peer $locus)
local SIP=fe80::1
local GRP=ff0e::${grp}
local dmac=33:33:00:00:00:$(printf "%02x" $grp)
local p=$(mldv1_done_get $SIP $GRP)
$MZ -6 $peer -a own -b $dmac -c 1 -A $SIP -B $GRP \
-t ip hop=1,next=0,p="$p" -q
sleep 1
! bridge mdb show dev br0 | grep -q $GRP
}
bridge_maxgroups_errmsg_check_cfg()
{
local msg=$1; shift
local needle=$1; shift
echo"$msg" | grep -q mcast_max_groups
check_err $? "Adding MDB entries failed for the wrong reason: $msg"
}
test_maxgroups_zero()
{
local CFG=$1; shift
local context=$1; shift
local locus=$1; shift
RET=0
local max
max=$(bridge_${context}_maxgroups_get "$locus")
((max == 0))
check_err $? "Max groups on $locus should be 0, but $max reported"
bridge_${context}_maxgroups_set "$locus" 100
check_err $? "Failed to set max to 100"
max=$(bridge_${context}_maxgroups_get "$locus")
((max == 100))
check_err $? "Max groups expected to be 100, but $max reported"
bridge_${context}_maxgroups_set "$locus" 0
check_err $? "Couldn't set maximum to 0"
# Test that setting 0 explicitly still serves as infinity.
${CFG}_entries_add "$locus" temp 5
check_err $? "Adding 5 MDB entries failed but should have passed"
${CFG}_entries_del "$locus" temp 5
check_err $? "Couldn't delete MDB entries"
log_test "$CFG: $context maxgroups: reporting and treatment of 0"
}
test_8021d_maxgroups_zero_cfg4()
{
test_maxgroups_zero cfg4 port "dev $swp1"
}
test_8021d_maxgroups_zero_ctl4()
{
test_maxgroups_zero ctl4 port "dev $swp1"
}
test_8021d_maxgroups_zero_cfg6()
{
test_maxgroups_zero cfg6 port "dev $swp1"
}
test_8021d_maxgroups_zero_ctl6()
{
test_maxgroups_zero ctl6 port "dev $swp1"
}
test_8021q_maxgroups_zero_cfg4()
{
test_maxgroups_zero cfg4 port "dev $swp1 vid 10"
}
test_8021q_maxgroups_zero_ctl4()
{
test_maxgroups_zero ctl4 port "dev $swp1 vid 10"
}
test_8021q_maxgroups_zero_cfg6()
{
test_maxgroups_zero cfg6 port "dev $swp1 vid 10"
}
test_8021q_maxgroups_zero_ctl6()
{
test_maxgroups_zero ctl6 port "dev $swp1 vid 10"
}
test_8021qvs_maxgroups_zero_cfg4()
{
test_maxgroups_zero cfg4 port_vlan "dev $swp1 vid 10"
}
test_8021qvs_maxgroups_zero_ctl4()
{
test_maxgroups_zero ctl4 port_vlan "dev $swp1 vid 10"
}
test_8021qvs_maxgroups_zero_cfg6()
{
test_maxgroups_zero cfg6 port_vlan "dev $swp1 vid 10"
}
test_8021qvs_maxgroups_zero_ctl6()
{
test_maxgroups_zero ctl6 port_vlan "dev $swp1 vid 10"
}
test_maxgroups_zero_cross_vlan()
{
local CFG=$1; shift
local locus0="dev $swp1"
local locus1="dev $swp1 vid 10"
local locus2="dev $swp1 vid 20"
local max
RET=0
bridge_port_vlan_maxgroups_set "$locus1" 100
check_err $? "$locus1: Failed to set max to 100"
max=$(bridge_port_maxgroups_get "$locus0")
((max == 0))
check_err $? "$locus0: Max groups expected to be 0, but $max reported"
max=$(bridge_port_vlan_maxgroups_get "$locus2")
((max == 0))
check_err $? "$locus2: Max groups expected to be 0, but $max reported"
bridge_port_vlan_maxgroups_set "$locus2" 100
check_err $? "$locus2: Failed to set max to 100"
max=$(bridge_port_maxgroups_get "$locus0")
((max == 0))
check_err $? "$locus0: Max groups expected to be 0, but $max reported"
max=$(bridge_port_vlan_maxgroups_get "$locus2")
((max == 100))
check_err $? "$locus2: Max groups expected to be 100, but $max reported"
bridge_port_maxgroups_set "$locus0" 100
check_err $? "$locus0: Failed to set max to 100"
max=$(bridge_port_maxgroups_get "$locus0")
((max == 100))
check_err $? "$locus0: Max groups expected to be 100, but $max reported"
max=$(bridge_port_vlan_maxgroups_get "$locus2")
((max == 100))
check_err $? "$locus2: Max groups expected to be 100, but $max reported"
bridge_port_vlan_maxgroups_set "$locus1" 0
check_err $? "$locus1: Failed to set max to 0"
max=$(bridge_port_maxgroups_get "$locus0")
((max == 100))
check_err $? "$locus0: Max groups expected to be 100, but $max reported"
max=$(bridge_port_vlan_maxgroups_get "$locus2")
((max == 100))
check_err $? "$locus2: Max groups expected to be 100, but $max reported"
bridge_port_vlan_maxgroups_set "$locus2" 0
check_err $? "$locus2: Failed to set max to 0"
max=$(bridge_port_maxgroups_get "$locus0")
((max == 100))
check_err $? "$locus0: Max groups expected to be 100, but $max reported"
max=$(bridge_port_vlan_maxgroups_get "$locus2")
((max == 0))
check_err $? "$locus2: Max groups expected to be 0 but $max reported"
bridge_port_maxgroups_set "$locus0" 0
check_err $? "$locus0: Failed to set max to 0"
max=$(bridge_port_maxgroups_get "$locus0")
((max == 0))
check_err $? "$locus0: Max groups expected to be 0, but $max reported"
max=$(bridge_port_vlan_maxgroups_get "$locus2")
((max == 0))
check_err $? "$locus2: Max groups expected to be 0, but $max reported"
log_test "$CFG: port_vlan maxgroups: isolation of port and per-VLAN maximums"
}
test_8021d_maxgroups_too_low_cfg4()
{
test_maxgroups_too_low cfg4 port "dev $swp1"
}
test_8021d_maxgroups_too_low_ctl4()
{
test_maxgroups_too_low ctl4 port "dev $swp1"
}
test_8021d_maxgroups_too_low_cfg6()
{
test_maxgroups_too_low cfg6 port "dev $swp1"
}
test_8021d_maxgroups_too_low_ctl6()
{
test_maxgroups_too_low ctl6 port "dev $swp1"
}
test_8021q_maxgroups_too_low_cfg4()
{
test_maxgroups_too_low cfg4 port "dev $swp1 vid 10"
}
test_8021q_maxgroups_too_low_ctl4()
{
test_maxgroups_too_low ctl4 port "dev $swp1 vid 10"
}
test_8021q_maxgroups_too_low_cfg6()
{
test_maxgroups_too_low cfg6 port "dev $swp1 vid 10"
}
test_8021q_maxgroups_too_low_ctl6()
{
test_maxgroups_too_low ctl6 port "dev $swp1 vid 10"
}
test_8021qvs_maxgroups_too_low_cfg4()
{
test_maxgroups_too_low cfg4 port_vlan "dev $swp1 vid 10"
}
test_8021qvs_maxgroups_too_low_ctl4()
{
test_maxgroups_too_low ctl4 port_vlan "dev $swp1 vid 10"
}
test_8021qvs_maxgroups_too_low_cfg6()
{
test_maxgroups_too_low cfg6 port_vlan "dev $swp1 vid 10"
}
test_8021qvs_maxgroups_too_low_ctl6()
{
test_maxgroups_too_low ctl6 port_vlan "dev $swp1 vid 10"
}
test_maxgroups_too_many_entries()
{
local CFG=$1; shift
local context=$1; shift
local locus=$1; shift
RET=0
local n=$(bridge_${context}_ngroups_get "$locus")
local msg
# Configure a low maximum
bridge_${context}_maxgroups_set "$locus" $((n+1))
check_err $? "$locus: Couldn't set maximum"
# Try to add more entries than the configured maximum
msg=$(${CFG}_entries_add "$locus" temp 5 2>&1)
check_fail $? "Adding 5 MDB entries passed, but should have failed"
bridge_maxgroups_errmsg_check_${CFG} "$msg"
# When adding entries through the control path, as many as possible # get created. That's consistent with the mcast_hash_max behavior. # So there, drop the entries explicitly. if [[ ${CFG%[46]} == ctl ]]; then
${CFG}_entries_del "$locus" temp 17 2>&1 fi
local n2=$(bridge_${context}_ngroups_get "$locus")
((n2 == n))
check_err $? "Number of groups was $n, but after a failed attempt to add MDB entries it changed to $n2"
bridge_${context}_maxgroups_set "$locus" 0
check_err $? "$locus: Couldn't set maximum to 0"
log_test "$CFG: $context maxgroups: add too many MDB entries"
}
test_8021d_maxgroups_too_many_entries_cfg4()
{
test_maxgroups_too_many_entries cfg4 port "dev $swp1"
}
test_8021d_maxgroups_too_many_entries_ctl4()
{
test_maxgroups_too_many_entries ctl4 port "dev $swp1"
}
test_8021d_maxgroups_too_many_entries_cfg6()
{
test_maxgroups_too_many_entries cfg6 port "dev $swp1"
}
test_8021d_maxgroups_too_many_entries_ctl6()
{
test_maxgroups_too_many_entries ctl6 port "dev $swp1"
}
test_8021q_maxgroups_too_many_entries_cfg4()
{
test_maxgroups_too_many_entries cfg4 port "dev $swp1 vid 10"
}
test_8021q_maxgroups_too_many_entries_ctl4()
{
test_maxgroups_too_many_entries ctl4 port "dev $swp1 vid 10"
}
test_8021q_maxgroups_too_many_entries_cfg6()
{
test_maxgroups_too_many_entries cfg6 port "dev $swp1 vid 10"
}
test_8021q_maxgroups_too_many_entries_ctl6()
{
test_maxgroups_too_many_entries ctl6 port "dev $swp1 vid 10"
}
test_8021qvs_maxgroups_too_many_entries_cfg4()
{
test_maxgroups_too_many_entries cfg4 port_vlan "dev $swp1 vid 10"
}
test_8021qvs_maxgroups_too_many_entries_ctl4()
{
test_maxgroups_too_many_entries ctl4 port_vlan "dev $swp1 vid 10"
}
test_8021qvs_maxgroups_too_many_entries_cfg6()
{
test_maxgroups_too_many_entries cfg6 port_vlan "dev $swp1 vid 10"
}
test_8021qvs_maxgroups_too_many_entries_ctl6()
{
test_maxgroups_too_many_entries ctl6 port_vlan "dev $swp1 vid 10"
}
test_maxgroups_too_many_cross_vlan()
{
local CFG=$1; shift
RET=0
local locus0="dev $swp1"
local locus1="dev $swp1 vid 10"
local locus2="dev $swp1 vid 20"
local n1=$(bridge_port_vlan_ngroups_get "$locus1")
local n2=$(bridge_port_vlan_ngroups_get "$locus2")
local msg
n2=$(bridge_port_vlan_ngroups_get "$locus2") # Now 0 <= n1 < n2-1.
# Setting locus1'maxgroups to n2-1 should pass. The number is # smaller than both the absolute number of MDB entries, and in # particular than number of locus2's number of entries, but it is # large enough to cover locus1's entries. Thus we check that # individual VLAN's ngroups are independent.
bridge_port_vlan_maxgroups_set "$locus1" $((n2-1))
check_err $? "Setting ${locus1}'s maxgroups to $((n2-1)) failed"
msg=$(${CFG}_entries_add "$locus1" temp $n2 111 2>&1)
check_fail $? "$locus1: Adding $n2 MDB entries passed, but should have failed"
bridge_maxgroups_errmsg_check_${CFG} "$msg"
msg=$(${CFG}_entries_add "$locus1" temp 5 111 2>&1)
check_fail $? "$locus1: Adding 5 MDB entries passed, but should have failed"
bridge_maxgroups_errmsg_check_${CFG} "$msg"
# IGMP/MLD packets can cause several entries to be added, before # the maximum is hit and the rest is then bounced. Remove what was # committed, if anything.
${CFG}_entries_del "$locus1" temp 5 111 2>/dev/null
${CFG}_entries_add "$locus1" temp 2 111
check_err $? "$locus1: Adding 2 MDB entries failed, but should have passed"
bridge_${context}_maxgroups_set "$locus" 100
check_err $? "Failed to set max to 100"
ip link set dev br0 type bridge mcast_vlan_snooping 0
sleep 1
ip link set dev br0 type bridge mcast_vlan_snooping 1
local n=$(bridge_${context}_ngroups_get "$locus")
local nn=$(bridge mdb show dev br0 | grep $swp1 | wc -l)
((nn == n))
check_err $? "mcast_n_groups expected to be $nn, but $n reported"
local max=$(bridge_${context}_maxgroups_get "$locus")
((max == 100))
check_err $? "Max groups expected to be 100 but $max reported"
bridge_${context}_maxgroups_set "$locus" 0
check_err $? "Failed to set max to 0"
if ! bridge link help 2>&1 | grep -q "mcast_max_groups"; then echo"SKIP: iproute2 too old, missing bridge \"mcast_max_groups\" support"
exit $ksft_skip fi
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.