# All tests in this script. Can be overridden with -t option.
TESTS="
neigh_suppress_arp
neigh_suppress_uc_arp
neigh_suppress_ns
neigh_suppress_uc_ns
neigh_vlan_suppress_arp
neigh_vlan_suppress_ns "
VERBOSE=0
PAUSE_ON_FAIL=no
PAUSE=no
ip netns exec $ns sysctl -qw net.ipv6.conf.all.keep_addr_on_down=1
ip netns exec $ns sysctl -qw net.ipv6.conf.default.ignore_routes_with_linkdown=1
ip netns exec $ns sysctl -qw net.ipv6.conf.all.accept_dad=0
ip netns exec $ns sysctl -qw net.ipv6.conf.default.accept_dad=0
}
setup_topo()
{
local ns
setup_ns h1 h2 sw1 sw2 for ns in $h1 $h2 $sw1 $sw2; do
setup_topo_ns $ns done
ip -n $h1 link add name eth0 type veth peer name swp1 netns $sw1
ip -n $sw1 link add name veth0 type veth peer name veth0 netns $sw2
ip -n $h2 link add name eth0 type veth peer name swp1 netns $sw2
}
setup_host_common()
{
local ns=$1; shift
local v4addr1=$1; shift
local v4addr2=$1; shift
local v6addr1=$1; shift
local v6addr2=$1; shift
ip -n $ns link set dev eth0 up
ip -n $ns link add link eth0 name eth0.10 up type vlan id 10
ip -n $ns link add link eth0 name eth0.20 up type vlan id 20
ip -n $ns address add $v4addr1 dev eth0.10
ip -n $ns address add $v4addr2 dev eth0.20
ip -n $ns address add $v6addr1 dev eth0.10
ip -n $ns address add $v6addr2 dev eth0.20
}
setup_h1()
{
local ns=$h1
local v4addr1=192.0.2.1/28
local v4addr2=192.0.2.17/28
local v6addr1=2001:db8:1::1/64
local v6addr2=2001:db8:2::1/64
setup_sw_common()
{
local ns=$1; shift
local local_addr=$1; shift
local remote_addr=$1; shift
local veth_addr=$1; shift
local gw_addr=$1; shift
ip -n $ns address add $local_addr/32 dev lo
ip -n $ns link set dev veth0 up
ip -n $ns address add $veth_addr/28 dev veth0
ip -n $ns route add default via $gw_addr
ip -n $ns link add name br0 up type bridge vlan_filtering 1 \
vlan_default_pvid 0 mcast_snooping 0
ip -n $ns link add link br0 name br0.10 up type vlan id 10
bridge -n $ns vlan add vid 10 dev br0 self
ip -n $ns link add link br0 name br0.20 up type vlan id 20
bridge -n $ns vlan add vid 20 dev br0 self
ip -n $ns link set dev swp1 up master br0
bridge -n $ns vlan add vid 10 dev swp1
bridge -n $ns vlan add vid 20 dev swp1
ip -n $ns link add name vx0 up master br0 type vxlan \
local $local_addr dstport 4789 nolearning external
bridge -n $ns fdb add 00:00:00:00:00:00 dev vx0 self static \
dst $remote_addr src_vni 10010
bridge -n $ns fdb add 00:00:00:00:00:00 dev vx0 self static \
dst $remote_addr src_vni 10020
bridge -n $ns link set dev vx0 vlan_tunnel on learning off
bridge -n $ns vlan add vid 10 dev vx0
bridge -n $ns vlan add vid 10 dev vx0 tunnel_info id 10010
bridge -n $ns vlan add vid 20 dev vx0
bridge -n $ns vlan add vid 20 dev vx0 tunnel_info id 10020
}
setup_sw1()
{
local ns=$sw1
local local_addr=192.0.2.33
local remote_addr=192.0.2.34
local veth_addr=192.0.2.49
local gw_addr=192.0.2.50
# Initial state - check that ARP requests are not suppressed and that # ARP replies are received.
run_cmd "ip netns exec $h1 arping -q -b -c 1 -w 5 -s $sip -I eth0.$vid $tip"
log_test $? 0 "arping"
tc_check_packets $sw1 "dev vx0 egress" 101 1
log_test $? 0 "ARP suppression"
# Enable neighbor suppression and check that nothing changes compared # to the initial state.
run_cmd "bridge -n $sw1 link set dev vx0 neigh_suppress on"
run_cmd "bridge -n $sw1 -d link show dev vx0 | grep \"neigh_suppress on\""
log_test $? 0 "\"neigh_suppress\" is on"
# Install a neighbor on the matching SVI interface and check that ARP # requests are suppressed.
run_cmd "ip -n $sw1 neigh replace $tip lladdr $h2_mac nud permanent dev br0.$vid"
log_test $? 0 "Neighbor entry installation"
# Take the second host down and check that ARP requests are suppressed # and that ARP replies are received.
run_cmd "ip -n $h2 link set dev eth0.$vid down"
log_test $? 0 "H2 down"
run_cmd "ip -n $h2 link set dev eth0.$vid up"
log_test $? 0 "H2 up"
# Disable neighbor suppression and check that ARP requests are no # longer suppressed.
run_cmd "bridge -n $sw1 link set dev vx0 neigh_suppress off"
run_cmd "bridge -n $sw1 -d link show dev vx0 | grep \"neigh_suppress off\""
log_test $? 0 "\"neigh_suppress\" is off"
# Take the second host down and check that ARP requests are not # suppressed and that ARP replies are not received.
run_cmd "ip -n $h2 link set dev eth0.$vid down"
log_test $? 0 "H2 down"
run_cmd "bridge -n $sw1 link set dev vx0 neigh_suppress on"
run_cmd "bridge -n $sw1 -d link show dev vx0 | grep \"neigh_suppress on\""
log_test $? 0 "\"neigh_suppress\" is on"
tmac=$(ip -n $h2 -j -p link show eth0.$vid | jq -r '.[]["address"]')
run_cmd "bridge -n $sw1 fdb replace $tmac dev vx0 master static vlan $vid"
run_cmd "ip -n $sw1 neigh replace $tip lladdr $tmac nud permanent dev br0.$vid"
run_cmd "tc -n $sw1 qdisc replace dev vx0 clsact"
run_cmd "tc -n $sw1 filter replace dev vx0 egress pref 1 handle 101 proto ipv6 flower indev swp1 ip_proto icmpv6 dst_ip $maddr src_ip $saddr type 135 code 0 action pass"
# Initial state - check that NS messages are not suppressed and that ND # messages are received.
run_cmd "ip netns exec $h1 ndisc6 -q -r 1 -s $saddr -w 5000 $daddr eth0.$vid"
log_test $? 0 "ndisc6"
tc_check_packets $sw1 "dev vx0 egress" 101 1
log_test $? 0 "NS suppression"
# Enable neighbor suppression and check that nothing changes compared # to the initial state.
run_cmd "bridge -n $sw1 link set dev vx0 neigh_suppress on"
run_cmd "bridge -n $sw1 -d link show dev vx0 | grep \"neigh_suppress on\""
log_test $? 0 "\"neigh_suppress\" is on"
# Install a neighbor on the matching SVI interface and check that NS # messages are suppressed.
run_cmd "ip -n $sw1 neigh replace $daddr lladdr $h2_mac nud permanent dev br0.$vid"
log_test $? 0 "Neighbor entry installation"
# Take the second host down and check that NS messages are suppressed # and that ND messages are received.
run_cmd "ip -n $h2 link set dev eth0.$vid down"
log_test $? 0 "H2 down"
run_cmd "ip -n $h2 link set dev eth0.$vid up"
log_test $? 0 "H2 up"
# Disable neighbor suppression and check that NS messages are no longer # suppressed.
run_cmd "bridge -n $sw1 link set dev vx0 neigh_suppress off"
run_cmd "bridge -n $sw1 -d link show dev vx0 | grep \"neigh_suppress off\""
log_test $? 0 "\"neigh_suppress\" is off"
# Take the second host down and check that NS messages are not # suppressed and that ND messages are not received.
run_cmd "ip -n $h2 link set dev eth0.$vid down"
log_test $? 0 "H2 down"
run_cmd "bridge -n $sw1 link set dev vx0 neigh_suppress on"
run_cmd "bridge -n $sw1 -d link show dev vx0 | grep \"neigh_suppress on\""
log_test $? 0 "\"neigh_suppress\" is on"
tmac=$(ip -n $h2 -j -p link show eth0.$vid | jq -r '.[]["address"]')
run_cmd "bridge -n $sw1 fdb replace $tmac dev vx0 master static vlan $vid"
run_cmd "ip -n $sw1 -6 neigh replace $dip lladdr $tmac nud permanent dev br0.$vid"
run_cmd "tc -n $h1 qdisc replace dev eth0.$vid clsact"
run_cmd "tc -n $h1 filter replace dev eth0.$vid ingress pref 1 handle 101 proto ipv6 flower ip_proto icmpv6 src_ip $dip type 136 code 0 action pass"
run_cmd "tc -n $h2 qdisc replace dev eth0.$vid clsact"
run_cmd "tc -n $h2 filter replace dev eth0.$vid egress pref 1 handle 101 proto ipv6 flower ip_proto icmpv6 dst_ip $sip type 136 code 0 action pass"
run_cmd "ip netns exec $h1 mausezahn -6 eth0.$vid -c 1 -a own -b $tmac -A $sip -B $dip -t ip hop=255,next=58,payload=$(icmpv6_header_get $csum $full_dip) -q"
tc_check_packets $h1 "dev eth0.$vid ingress" 101 1
log_test $? 0 "Unicast NS, suppression on, h1 filter"
tc_check_packets $h2 "dev eth0.$vid egress" 101 1
log_test $? 0 "Unicast NS, suppression on, h2 filter"
}
neigh_suppress_uc_ns()
{
local vid=10
local saddr=2001:db8:1::1
local daddr=2001:db8:1::2
local full_daddr=20:01:0d:b8:00:01:00:00:00:00:00:00:00:00:00:02
local csum="ef:79"
neigh_vlan_suppress_arp()
{
local vid1=10
local vid2=20
local sip1=192.0.2.1
local sip2=192.0.2.17
local tip1=192.0.2.2
local tip2=192.0.2.18
local h2_mac1
local h2_mac2
h2_mac1=$(ip -n $h2 -j -p link show eth0.$vid1 | jq -r '.[]["address"]')
h2_mac2=$(ip -n $h2 -j -p link show eth0.$vid2 | jq -r '.[]["address"]')
run_cmd "bridge -n $sw1 fdb replace $h2_mac1 dev vx0 master static vlan $vid1"
run_cmd "bridge -n $sw1 fdb replace $h2_mac2 dev vx0 master static vlan $vid2"
run_cmd "ip -n $sw1 neigh replace $tip1 lladdr $h2_mac1 nud permanent dev br0.$vid1"
run_cmd "ip -n $sw1 neigh replace $tip2 lladdr $h2_mac2 nud permanent dev br0.$vid2"
# Enable per-{Port, VLAN} neighbor suppression and check that ARP # requests are not suppressed and that ARP replies are received.
run_cmd "bridge -n $sw1 link set dev vx0 neigh_vlan_suppress on"
run_cmd "bridge -n $sw1 -d link show dev vx0 | grep \"neigh_vlan_suppress on\""
log_test $? 0 "\"neigh_vlan_suppress\" is on"
# Enable neighbor suppression on VLAN 10 and check that only on this # VLAN ARP requests are suppressed.
run_cmd "bridge -n $sw1 vlan set vid $vid1 dev vx0 neigh_suppress on"
run_cmd "bridge -n $sw1 -d vlan show dev vx0 vid $vid1 | grep \"neigh_suppress on\""
log_test $? 0 "\"neigh_suppress\" is on (VLAN $vid1)"
run_cmd "bridge -n $sw1 -d vlan show dev vx0 vid $vid2 | grep \"neigh_suppress off\""
log_test $? 0 "\"neigh_suppress\" is off (VLAN $vid2)"
# Enable neighbor suppression on the port and check that it has no # effect compared to previous state.
run_cmd "bridge -n $sw1 link set dev vx0 neigh_suppress on"
run_cmd "bridge -n $sw1 -d link show dev vx0 | grep \"neigh_suppress on\""
log_test $? 0 "\"neigh_suppress\" is on"
# Disable neighbor suppression on the port and check that it has no # effect compared to previous state.
run_cmd "bridge -n $sw1 link set dev vx0 neigh_suppress off"
run_cmd "bridge -n $sw1 -d link show dev vx0 | grep \"neigh_suppress off\""
log_test $? 0 "\"neigh_suppress\" is off"
# Disable neighbor suppression on VLAN 10 and check that ARP requests # are no longer suppressed on this VLAN.
run_cmd "bridge -n $sw1 vlan set vid $vid1 dev vx0 neigh_suppress off"
run_cmd "bridge -n $sw1 -d vlan show dev vx0 vid $vid1 | grep \"neigh_suppress off\""
log_test $? 0 "\"neigh_suppress\" is off (VLAN $vid1)"
# Disable per-{Port, VLAN} neighbor suppression, enable neighbor # suppression on the port and check that on both VLANs ARP requests are # suppressed.
run_cmd "bridge -n $sw1 link set dev vx0 neigh_vlan_suppress off"
run_cmd "bridge -n $sw1 -d link show dev vx0 | grep \"neigh_vlan_suppress off\""
log_test $? 0 "\"neigh_vlan_suppress\" is off"
run_cmd "bridge -n $sw1 link set dev vx0 neigh_suppress on"
run_cmd "bridge -n $sw1 -d link show dev vx0 | grep \"neigh_suppress on\""
log_test $? 0 "\"neigh_suppress\" is on"
neigh_vlan_suppress_ns()
{
local vid1=10
local vid2=20
local saddr1=2001:db8:1::1
local saddr2=2001:db8:2::1
local daddr1=2001:db8:1::2
local daddr2=2001:db8:2::2
local maddr=ff02::1:ff00:2
local h2_mac1
local h2_mac2
run_cmd "tc -n $sw1 qdisc replace dev vx0 clsact"
run_cmd "tc -n $sw1 filter replace dev vx0 egress pref 1 handle 101 proto ipv6 flower indev swp1 ip_proto icmpv6 dst_ip $maddr src_ip $saddr1 type 135 code 0 action pass"
run_cmd "tc -n $sw1 filter replace dev vx0 egress pref 1 handle 102 proto ipv6 flower indev swp1 ip_proto icmpv6 dst_ip $maddr src_ip $saddr2 type 135 code 0 action pass"
h2_mac1=$(ip -n $h2 -j -p link show eth0.$vid1 | jq -r '.[]["address"]')
h2_mac2=$(ip -n $h2 -j -p link show eth0.$vid2 | jq -r '.[]["address"]')
run_cmd "bridge -n $sw1 fdb replace $h2_mac1 dev vx0 master static vlan $vid1"
run_cmd "bridge -n $sw1 fdb replace $h2_mac2 dev vx0 master static vlan $vid2"
run_cmd "ip -n $sw1 neigh replace $daddr1 lladdr $h2_mac1 nud permanent dev br0.$vid1"
run_cmd "ip -n $sw1 neigh replace $daddr2 lladdr $h2_mac2 nud permanent dev br0.$vid2"
# Enable per-{Port, VLAN} neighbor suppression and check that NS # messages are not suppressed and that ND messages are received.
run_cmd "bridge -n $sw1 link set dev vx0 neigh_vlan_suppress on"
run_cmd "bridge -n $sw1 -d link show dev vx0 | grep \"neigh_vlan_suppress on\""
log_test $? 0 "\"neigh_vlan_suppress\" is on"
# Enable neighbor suppression on VLAN 10 and check that only on this # VLAN NS messages are suppressed.
run_cmd "bridge -n $sw1 vlan set vid $vid1 dev vx0 neigh_suppress on"
run_cmd "bridge -n $sw1 -d vlan show dev vx0 vid $vid1 | grep \"neigh_suppress on\""
log_test $? 0 "\"neigh_suppress\" is on (VLAN $vid1)"
run_cmd "bridge -n $sw1 -d vlan show dev vx0 vid $vid2 | grep \"neigh_suppress off\""
log_test $? 0 "\"neigh_suppress\" is off (VLAN $vid2)"
# Enable neighbor suppression on the port and check that it has no # effect compared to previous state.
run_cmd "bridge -n $sw1 link set dev vx0 neigh_suppress on"
run_cmd "bridge -n $sw1 -d link show dev vx0 | grep \"neigh_suppress on\""
log_test $? 0 "\"neigh_suppress\" is on"
# Disable neighbor suppression on the port and check that it has no # effect compared to previous state.
run_cmd "bridge -n $sw1 link set dev vx0 neigh_suppress off"
run_cmd "bridge -n $sw1 -d link show dev vx0 | grep \"neigh_suppress off\""
log_test $? 0 "\"neigh_suppress\" is off"
# Disable neighbor suppression on VLAN 10 and check that NS messages # are no longer suppressed on this VLAN.
run_cmd "bridge -n $sw1 vlan set vid $vid1 dev vx0 neigh_suppress off"
run_cmd "bridge -n $sw1 -d vlan show dev vx0 vid $vid1 | grep \"neigh_suppress off\""
log_test $? 0 "\"neigh_suppress\" is off (VLAN $vid1)"
# Disable per-{Port, VLAN} neighbor suppression, enable neighbor # suppression on the port and check that on both VLANs NS messages are # suppressed.
run_cmd "bridge -n $sw1 link set dev vx0 neigh_vlan_suppress off"
run_cmd "bridge -n $sw1 -d link show dev vx0 | grep \"neigh_vlan_suppress off\""
log_test $? 0 "\"neigh_vlan_suppress\" is off"
run_cmd "bridge -n $sw1 link set dev vx0 neigh_suppress on"
run_cmd "bridge -n $sw1 -d link show dev vx0 | grep \"neigh_suppress on\""
log_test $? 0 "\"neigh_suppress\" is on"
-t <test> Test(s) to run (default: all)
(options: $TESTS)
-p Pause on fail
-P Pause after each test before cleanup
-v Verbose mode (show commands and output)
EOF
}
################################################################################ # Main
trap cleanup EXIT
while getopts ":t:pPvh" opt; do
case $opt in
t) TESTS=$OPTARG;;
p) PAUSE_ON_FAIL=yes;;
P) PAUSE=yes;;
v) VERBOSE=$(($VERBOSE + 1));;
h) usage; exit 0;;
*) usage; exit 1;;
esac done
# Make sure we don't pause twice.
[ "${PAUSE}" = "yes" ] && PAUSE_ON_FAIL=no
if [ "$(id -u)" -ne 0 ];then echo"SKIP: Need root privileges"
exit $ksft_skip; fi
if [ ! -x "$(command -v ip)" ]; then echo"SKIP: Could not run test without ip tool"
exit $ksft_skip fi
if [ ! -x "$(command -v bridge)" ]; then echo"SKIP: Could not run test without bridge tool"
exit $ksft_skip fi
if [ ! -x "$(command -v tc)" ]; then echo"SKIP: Could not run test without tc tool"
exit $ksft_skip fi
if [ ! -x "$(command -v arping)" ]; then echo"SKIP: Could not run test without arping tool"
exit $ksft_skip fi
if [ ! -x "$(command -v ndisc6)" ]; then echo"SKIP: Could not run test without ndisc6 tool"
exit $ksft_skip fi
if [ ! -x "$(command -v jq)" ]; then echo"SKIP: Could not run test without jq tool"
exit $ksft_skip fi
if [ ! -x "$(command -v mausezahn)" ]; then echo"SKIP: Could not run test without mausezahn tool"
exit $ksft_skip fi
bridge link help 2>&1 | grep -q "neigh_vlan_suppress" if [ $? -ne 0 ]; then echo"SKIP: iproute2 bridge too old, missing per-VLAN neighbor suppression support"
exit $ksft_skip fi
# Start clean.
cleanup
for t in $TESTS do
setup; $t; cleanup; done
if [ "$TESTS" != "none" ]; then
printf "\nTests passed: %3d\n" ${nsuccess}
printf "Tests failed: %3d\n" ${nfail} 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.