135f15ab3SAmit Cohen#!/bin/bash 235f15ab3SAmit Cohen# SPDX-License-Identifier: GPL-2.0 335f15ab3SAmit Cohen 435f15ab3SAmit Cohen# +--------------------+ +----------------------+ 535f15ab3SAmit Cohen# | H1 (vrf) | | H2 (vrf) | 635f15ab3SAmit Cohen# | + h1.10 | | + h2.20 | 735f15ab3SAmit Cohen# | | 192.0.2.1/28 | | | 192.0.2.2/28 | 835f15ab3SAmit Cohen# | | | | | | 935f15ab3SAmit Cohen# | + $h1 | | + $h2 | 1035f15ab3SAmit Cohen# | | | | | | 1135f15ab3SAmit Cohen# +----|---------------+ +--|-------------------+ 1235f15ab3SAmit Cohen# | | 1335f15ab3SAmit Cohen# +----|--------------------------------------------------|--------------------+ 1435f15ab3SAmit Cohen# | SW | | | 1535f15ab3SAmit Cohen# | +--|-------------------------------+ +----------------|------------------+ | 1635f15ab3SAmit Cohen# | | + $swp1 BR1 (802.1ad) | | BR2 (802.1d) + $swp2 | | 1735f15ab3SAmit Cohen# | | vid 100 pvid untagged | | | | | 1835f15ab3SAmit Cohen# | | | | + $swp2.20 | | 1935f15ab3SAmit Cohen# | | | | | | 2035f15ab3SAmit Cohen# | | + vx100 (vxlan) | | + vx200 (vxlan) | | 2135f15ab3SAmit Cohen# | | local 192.0.2.17 | | local 192.0.2.17 | | 2235f15ab3SAmit Cohen# | | remote 192.0.2.34 | | remote 192.0.2.50 | | 2335f15ab3SAmit Cohen# | | id 1000 dstport $VXPORT | | id 2000 dstport $VXPORT | | 2435f15ab3SAmit Cohen# | | vid 100 pvid untagged | | | | 2535f15ab3SAmit Cohen# | +--------------------------------- + +-----------------------------------+ | 2635f15ab3SAmit Cohen# | | 2735f15ab3SAmit Cohen# | 192.0.2.32/28 via 192.0.2.18 | 2835f15ab3SAmit Cohen# | 192.0.2.48/28 via 192.0.2.18 | 2935f15ab3SAmit Cohen# | | 3035f15ab3SAmit Cohen# | + $rp1 | 3135f15ab3SAmit Cohen# | | 192.0.2.17/28 | 3235f15ab3SAmit Cohen# +----|-----------------------------------------------------------------------+ 3335f15ab3SAmit Cohen# | 3435f15ab3SAmit Cohen# +----|--------------------------------------------------------+ 3535f15ab3SAmit Cohen# | | VRP2 (vrf) | 3635f15ab3SAmit Cohen# | + $rp2 | 3735f15ab3SAmit Cohen# | 192.0.2.18/28 | 3835f15ab3SAmit Cohen# | | (maybe) HW 3935f15ab3SAmit Cohen# ============================================================================= 4035f15ab3SAmit Cohen# | | (likely) SW 4135f15ab3SAmit Cohen# | + v1 (veth) + v3 (veth) | 4235f15ab3SAmit Cohen# | | 192.0.2.33/28 | 192.0.2.49/28 | 4335f15ab3SAmit Cohen# +----|---------------------------------------|----------------+ 4435f15ab3SAmit Cohen# | | 4535f15ab3SAmit Cohen# +----|------------------------------+ +----|------------------------------+ 4635f15ab3SAmit Cohen# | + v2 (veth) NS1 (netns) | | + v4 (veth) NS2 (netns) | 4735f15ab3SAmit Cohen# | 192.0.2.34/28 | | 192.0.2.50/28 | 4835f15ab3SAmit Cohen# | | | | 4935f15ab3SAmit Cohen# | 192.0.2.16/28 via 192.0.2.33 | | 192.0.2.16/28 via 192.0.2.49 | 5035f15ab3SAmit Cohen# | 192.0.2.50/32 via 192.0.2.33 | | 192.0.2.34/32 via 192.0.2.49 | 5135f15ab3SAmit Cohen# | | | | 5235f15ab3SAmit Cohen# | +-------------------------------+ | | +-------------------------------+ | 5335f15ab3SAmit Cohen# | | BR3 (802.1ad) | | | | BR3 (802.1d) | | 5435f15ab3SAmit Cohen# | | + vx100 (vxlan) | | | | + vx200 (vxlan) | | 5535f15ab3SAmit Cohen# | | local 192.0.2.34 | | | | local 192.0.2.50 | | 5635f15ab3SAmit Cohen# | | remote 192.0.2.17 | | | | remote 192.0.2.17 | | 5735f15ab3SAmit Cohen# | | remote 192.0.2.50 | | | | remote 192.0.2.34 | | 5835f15ab3SAmit Cohen# | | id 1000 dstport $VXPORT | | | | id 2000 dstport $VXPORT | | 5935f15ab3SAmit Cohen# | | vid 100 pvid untagged | | | | | | 6035f15ab3SAmit Cohen# | | | | | | + w1.20 | | 6135f15ab3SAmit Cohen# | | | | | | | | | 6235f15ab3SAmit Cohen# | | + w1 (veth) | | | | + w1 (veth) | | 6335f15ab3SAmit Cohen# | | | vid 100 pvid untagged | | | | | | | 6435f15ab3SAmit Cohen# | +--|----------------------------+ | | +--|----------------------------+ | 6535f15ab3SAmit Cohen# | | | | | | 6635f15ab3SAmit Cohen# | +--|----------------------------+ | | +--|----------------------------+ | 6735f15ab3SAmit Cohen# | | | VW2 (vrf) | | | | | VW2 (vrf) | | 6835f15ab3SAmit Cohen# | | + w2 (veth) | | | | + w2 (veth) | | 6935f15ab3SAmit Cohen# | | | | | | | | | | 7035f15ab3SAmit Cohen# | | | | | | | | | | 7135f15ab3SAmit Cohen# | | + w2.10 | | | | + w2.20 | | 7235f15ab3SAmit Cohen# | | 192.0.2.3/28 | | | | 192.0.2.4/28 | | 7335f15ab3SAmit Cohen# | +-------------------------------+ | | +-------------------------------+ | 7435f15ab3SAmit Cohen# +-----------------------------------+ +-----------------------------------+ 7535f15ab3SAmit Cohen 7635f15ab3SAmit Cohen: ${VXPORT:=4789} 7735f15ab3SAmit Cohenexport VXPORT 7835f15ab3SAmit Cohen 7935f15ab3SAmit Cohen: ${ALL_TESTS:=" 8035f15ab3SAmit Cohen ping_ipv4 8135f15ab3SAmit Cohen "} 8235f15ab3SAmit Cohen 8335f15ab3SAmit CohenNUM_NETIFS=6 8435f15ab3SAmit Cohensource lib.sh 8535f15ab3SAmit Cohen 8635f15ab3SAmit Cohenh1_create() 8735f15ab3SAmit Cohen{ 8835f15ab3SAmit Cohen simple_if_init $h1 8935f15ab3SAmit Cohen tc qdisc add dev $h1 clsact 9035f15ab3SAmit Cohen vlan_create $h1 10 v$h1 192.0.2.1/28 9135f15ab3SAmit Cohen} 9235f15ab3SAmit Cohen 9335f15ab3SAmit Cohenh1_destroy() 9435f15ab3SAmit Cohen{ 9535f15ab3SAmit Cohen vlan_destroy $h1 10 9635f15ab3SAmit Cohen tc qdisc del dev $h1 clsact 9735f15ab3SAmit Cohen simple_if_fini $h1 9835f15ab3SAmit Cohen} 9935f15ab3SAmit Cohen 10035f15ab3SAmit Cohenh2_create() 10135f15ab3SAmit Cohen{ 10235f15ab3SAmit Cohen simple_if_init $h2 10335f15ab3SAmit Cohen tc qdisc add dev $h2 clsact 10435f15ab3SAmit Cohen vlan_create $h2 20 v$h2 192.0.2.2/28 10535f15ab3SAmit Cohen} 10635f15ab3SAmit Cohen 10735f15ab3SAmit Cohenh2_destroy() 10835f15ab3SAmit Cohen{ 10935f15ab3SAmit Cohen vlan_destroy $h2 20 11035f15ab3SAmit Cohen tc qdisc del dev $h2 clsact 11135f15ab3SAmit Cohen simple_if_fini $h2 11235f15ab3SAmit Cohen} 11335f15ab3SAmit Cohen 11435f15ab3SAmit Cohenrp1_set_addr() 11535f15ab3SAmit Cohen{ 11635f15ab3SAmit Cohen ip address add dev $rp1 192.0.2.17/28 11735f15ab3SAmit Cohen 11835f15ab3SAmit Cohen ip route add 192.0.2.32/28 nexthop via 192.0.2.18 11935f15ab3SAmit Cohen ip route add 192.0.2.48/28 nexthop via 192.0.2.18 12035f15ab3SAmit Cohen} 12135f15ab3SAmit Cohen 12235f15ab3SAmit Cohenrp1_unset_addr() 12335f15ab3SAmit Cohen{ 12435f15ab3SAmit Cohen ip route del 192.0.2.48/28 nexthop via 192.0.2.18 12535f15ab3SAmit Cohen ip route del 192.0.2.32/28 nexthop via 192.0.2.18 12635f15ab3SAmit Cohen 12735f15ab3SAmit Cohen ip address del dev $rp1 192.0.2.17/28 12835f15ab3SAmit Cohen} 12935f15ab3SAmit Cohen 13035f15ab3SAmit Cohenswitch_create() 13135f15ab3SAmit Cohen{ 13235f15ab3SAmit Cohen #### BR1 #### 13335f15ab3SAmit Cohen ip link add name br1 type bridge vlan_filtering 1 \ 13435f15ab3SAmit Cohen vlan_protocol 802.1ad vlan_default_pvid 0 mcast_snooping 0 135*c8015333SPetr Machata ip link set dev br1 addrgenmode none 13635f15ab3SAmit Cohen # Make sure the bridge uses the MAC address of the local port and not 13735f15ab3SAmit Cohen # that of the VxLAN's device. 13835f15ab3SAmit Cohen ip link set dev br1 address $(mac_get $swp1) 13935f15ab3SAmit Cohen ip link set dev br1 up 14035f15ab3SAmit Cohen 14135f15ab3SAmit Cohen #### BR2 #### 14235f15ab3SAmit Cohen ip link add name br2 type bridge vlan_filtering 0 mcast_snooping 0 14335f15ab3SAmit Cohen # Make sure the bridge uses the MAC address of the local port and not 14435f15ab3SAmit Cohen # that of the VxLAN's device. 14535f15ab3SAmit Cohen ip link set dev br2 address $(mac_get $swp2) 14635f15ab3SAmit Cohen ip link set dev br2 up 14735f15ab3SAmit Cohen 14835f15ab3SAmit Cohen ip link set dev $rp1 up 14935f15ab3SAmit Cohen rp1_set_addr 15035f15ab3SAmit Cohen 15135f15ab3SAmit Cohen #### VX100 #### 15235f15ab3SAmit Cohen ip link add name vx100 type vxlan id 1000 local 192.0.2.17 \ 15335f15ab3SAmit Cohen dstport "$VXPORT" nolearning noudpcsum tos inherit ttl 100 15435f15ab3SAmit Cohen ip link set dev vx100 up 15535f15ab3SAmit Cohen 15635f15ab3SAmit Cohen ip link set dev vx100 master br1 15735f15ab3SAmit Cohen bridge vlan add vid 100 dev vx100 pvid untagged 15835f15ab3SAmit Cohen 15935f15ab3SAmit Cohen ip link set dev $swp1 master br1 16035f15ab3SAmit Cohen ip link set dev $swp1 up 16135f15ab3SAmit Cohen bridge vlan add vid 100 dev $swp1 pvid untagged 16235f15ab3SAmit Cohen 16335f15ab3SAmit Cohen #### VX200 #### 16435f15ab3SAmit Cohen ip link add name vx200 type vxlan id 2000 local 192.0.2.17 \ 16535f15ab3SAmit Cohen dstport "$VXPORT" nolearning noudpcsum tos inherit ttl 100 16635f15ab3SAmit Cohen ip link set dev vx200 up 16735f15ab3SAmit Cohen 16835f15ab3SAmit Cohen ip link set dev vx200 master br2 16935f15ab3SAmit Cohen 17035f15ab3SAmit Cohen ip link set dev $swp2 up 17135f15ab3SAmit Cohen ip link add name $swp2.20 link $swp2 type vlan id 20 17235f15ab3SAmit Cohen ip link set dev $swp2.20 master br2 17335f15ab3SAmit Cohen ip link set dev $swp2.20 up 17435f15ab3SAmit Cohen 17535f15ab3SAmit Cohen bridge fdb append dev vx100 00:00:00:00:00:00 dst 192.0.2.34 self 17635f15ab3SAmit Cohen bridge fdb append dev vx200 00:00:00:00:00:00 dst 192.0.2.50 self 17735f15ab3SAmit Cohen} 17835f15ab3SAmit Cohen 17935f15ab3SAmit Cohenswitch_destroy() 18035f15ab3SAmit Cohen{ 18135f15ab3SAmit Cohen bridge fdb del dev vx200 00:00:00:00:00:00 dst 192.0.2.50 self 18235f15ab3SAmit Cohen bridge fdb del dev vx100 00:00:00:00:00:00 dst 192.0.2.34 self 18335f15ab3SAmit Cohen 18435f15ab3SAmit Cohen ip link set dev vx200 nomaster 18535f15ab3SAmit Cohen ip link set dev vx200 down 18635f15ab3SAmit Cohen ip link del dev vx200 18735f15ab3SAmit Cohen 18835f15ab3SAmit Cohen ip link del dev $swp2.20 18935f15ab3SAmit Cohen ip link set dev $swp2 down 19035f15ab3SAmit Cohen ip link set dev $swp2 nomaster 19135f15ab3SAmit Cohen 19235f15ab3SAmit Cohen bridge vlan del vid 100 dev $swp1 19335f15ab3SAmit Cohen ip link set dev $swp1 down 19435f15ab3SAmit Cohen ip link set dev $swp1 nomaster 19535f15ab3SAmit Cohen 19635f15ab3SAmit Cohen ip link set dev vx100 nomaster 19735f15ab3SAmit Cohen ip link set dev vx100 down 19835f15ab3SAmit Cohen ip link del dev vx100 19935f15ab3SAmit Cohen 20035f15ab3SAmit Cohen rp1_unset_addr 20135f15ab3SAmit Cohen ip link set dev $rp1 down 20235f15ab3SAmit Cohen 20335f15ab3SAmit Cohen ip link set dev br2 down 20435f15ab3SAmit Cohen ip link del dev br2 20535f15ab3SAmit Cohen 20635f15ab3SAmit Cohen ip link set dev br1 down 20735f15ab3SAmit Cohen ip link del dev br1 20835f15ab3SAmit Cohen} 20935f15ab3SAmit Cohen 21035f15ab3SAmit Cohenvrp2_create() 21135f15ab3SAmit Cohen{ 21235f15ab3SAmit Cohen simple_if_init $rp2 192.0.2.18/28 21335f15ab3SAmit Cohen __simple_if_init v1 v$rp2 192.0.2.33/28 21435f15ab3SAmit Cohen __simple_if_init v3 v$rp2 192.0.2.49/28 21535f15ab3SAmit Cohen tc qdisc add dev v1 clsact 21635f15ab3SAmit Cohen} 21735f15ab3SAmit Cohen 21835f15ab3SAmit Cohenvrp2_destroy() 21935f15ab3SAmit Cohen{ 22035f15ab3SAmit Cohen tc qdisc del dev v1 clsact 22135f15ab3SAmit Cohen __simple_if_fini v3 192.0.2.49/28 22235f15ab3SAmit Cohen __simple_if_fini v1 192.0.2.33/28 22335f15ab3SAmit Cohen simple_if_fini $rp2 192.0.2.18/28 22435f15ab3SAmit Cohen} 22535f15ab3SAmit Cohen 22635f15ab3SAmit Cohenns_init_common() 22735f15ab3SAmit Cohen{ 22835f15ab3SAmit Cohen local in_if=$1; shift 22935f15ab3SAmit Cohen local in_addr=$1; shift 23035f15ab3SAmit Cohen local other_in_addr=$1; shift 23135f15ab3SAmit Cohen local vxlan_name=$1; shift 23235f15ab3SAmit Cohen local vxlan_id=$1; shift 23335f15ab3SAmit Cohen local vlan_id=$1; shift 23435f15ab3SAmit Cohen local host_addr=$1; shift 23535f15ab3SAmit Cohen local nh_addr=$1; shift 23635f15ab3SAmit Cohen 23735f15ab3SAmit Cohen ip link set dev $in_if up 23835f15ab3SAmit Cohen ip address add dev $in_if $in_addr/28 23935f15ab3SAmit Cohen tc qdisc add dev $in_if clsact 24035f15ab3SAmit Cohen 24135f15ab3SAmit Cohen ip link add name br3 type bridge vlan_filtering 0 24235f15ab3SAmit Cohen ip link set dev br3 up 24335f15ab3SAmit Cohen 24435f15ab3SAmit Cohen ip link add name w1 type veth peer name w2 24535f15ab3SAmit Cohen 24635f15ab3SAmit Cohen ip link set dev w1 master br3 24735f15ab3SAmit Cohen ip link set dev w1 up 24835f15ab3SAmit Cohen 24935f15ab3SAmit Cohen ip link add name $vxlan_name type vxlan id $vxlan_id local $in_addr \ 25035f15ab3SAmit Cohen dstport "$VXPORT" 25135f15ab3SAmit Cohen ip link set dev $vxlan_name up 25235f15ab3SAmit Cohen bridge fdb append dev $vxlan_name 00:00:00:00:00:00 dst 192.0.2.17 self 25335f15ab3SAmit Cohen bridge fdb append dev $vxlan_name 00:00:00:00:00:00 dst $other_in_addr self 25435f15ab3SAmit Cohen 25535f15ab3SAmit Cohen ip link set dev $vxlan_name master br3 25635f15ab3SAmit Cohen tc qdisc add dev $vxlan_name clsact 25735f15ab3SAmit Cohen 25835f15ab3SAmit Cohen simple_if_init w2 25935f15ab3SAmit Cohen vlan_create w2 $vlan_id vw2 $host_addr/28 26035f15ab3SAmit Cohen 26135f15ab3SAmit Cohen ip route add 192.0.2.16/28 nexthop via $nh_addr 26235f15ab3SAmit Cohen ip route add $other_in_addr/32 nexthop via $nh_addr 26335f15ab3SAmit Cohen} 26435f15ab3SAmit Cohenexport -f ns_init_common 26535f15ab3SAmit Cohen 26635f15ab3SAmit Cohenns1_create() 26735f15ab3SAmit Cohen{ 26835f15ab3SAmit Cohen ip netns add ns1 26935f15ab3SAmit Cohen ip link set dev v2 netns ns1 27035f15ab3SAmit Cohen in_ns ns1 \ 27135f15ab3SAmit Cohen ns_init_common v2 192.0.2.34 192.0.2.50 vx100 1000 10 192.0.2.3 \ 27235f15ab3SAmit Cohen 192.0.2.33 27335f15ab3SAmit Cohen 27435f15ab3SAmit Cohen in_ns ns1 bridge vlan add vid 100 dev vx100 pvid untagged 27535f15ab3SAmit Cohen} 27635f15ab3SAmit Cohen 27735f15ab3SAmit Cohenns1_destroy() 27835f15ab3SAmit Cohen{ 27935f15ab3SAmit Cohen ip netns exec ns1 ip link set dev v2 netns 1 28035f15ab3SAmit Cohen ip netns del ns1 28135f15ab3SAmit Cohen} 28235f15ab3SAmit Cohen 28335f15ab3SAmit Cohenns2_create() 28435f15ab3SAmit Cohen{ 28535f15ab3SAmit Cohen ip netns add ns2 28635f15ab3SAmit Cohen ip link set dev v4 netns ns2 28735f15ab3SAmit Cohen in_ns ns2 \ 28835f15ab3SAmit Cohen ns_init_common v4 192.0.2.50 192.0.2.34 vx200 2000 20 192.0.2.4 \ 28935f15ab3SAmit Cohen 192.0.2.49 29035f15ab3SAmit Cohen 29135f15ab3SAmit Cohen in_ns ns2 ip link add name w1.20 link w1 type vlan id 20 29235f15ab3SAmit Cohen in_ns ns2 ip link set dev w1.20 master br3 29335f15ab3SAmit Cohen in_ns ns2 ip link set dev w1.20 up 29435f15ab3SAmit Cohen} 29535f15ab3SAmit Cohen 29635f15ab3SAmit Cohenns2_destroy() 29735f15ab3SAmit Cohen{ 29835f15ab3SAmit Cohen ip netns exec ns2 ip link set dev v4 netns 1 29935f15ab3SAmit Cohen ip netns del ns2 30035f15ab3SAmit Cohen} 30135f15ab3SAmit Cohen 30235f15ab3SAmit Cohensetup_prepare() 30335f15ab3SAmit Cohen{ 30435f15ab3SAmit Cohen h1=${NETIFS[p1]} 30535f15ab3SAmit Cohen swp1=${NETIFS[p2]} 30635f15ab3SAmit Cohen 30735f15ab3SAmit Cohen swp2=${NETIFS[p3]} 30835f15ab3SAmit Cohen h2=${NETIFS[p4]} 30935f15ab3SAmit Cohen 31035f15ab3SAmit Cohen rp1=${NETIFS[p5]} 31135f15ab3SAmit Cohen rp2=${NETIFS[p6]} 31235f15ab3SAmit Cohen 31335f15ab3SAmit Cohen vrf_prepare 31435f15ab3SAmit Cohen forwarding_enable 31535f15ab3SAmit Cohen 31635f15ab3SAmit Cohen h1_create 31735f15ab3SAmit Cohen h2_create 31835f15ab3SAmit Cohen switch_create 31935f15ab3SAmit Cohen 32035f15ab3SAmit Cohen ip link add name v1 type veth peer name v2 32135f15ab3SAmit Cohen ip link add name v3 type veth peer name v4 32235f15ab3SAmit Cohen vrp2_create 32335f15ab3SAmit Cohen ns1_create 32435f15ab3SAmit Cohen ns2_create 32535f15ab3SAmit Cohen 32635f15ab3SAmit Cohen r1_mac=$(in_ns ns1 mac_get w2) 32735f15ab3SAmit Cohen r2_mac=$(in_ns ns2 mac_get w2) 32835f15ab3SAmit Cohen h2_mac=$(mac_get $h2) 32935f15ab3SAmit Cohen} 33035f15ab3SAmit Cohen 33135f15ab3SAmit Cohencleanup() 33235f15ab3SAmit Cohen{ 33335f15ab3SAmit Cohen pre_cleanup 33435f15ab3SAmit Cohen 33535f15ab3SAmit Cohen ns2_destroy 33635f15ab3SAmit Cohen ns1_destroy 33735f15ab3SAmit Cohen vrp2_destroy 33835f15ab3SAmit Cohen ip link del dev v3 33935f15ab3SAmit Cohen ip link del dev v1 34035f15ab3SAmit Cohen 34135f15ab3SAmit Cohen switch_destroy 34235f15ab3SAmit Cohen h2_destroy 34335f15ab3SAmit Cohen h1_destroy 34435f15ab3SAmit Cohen 34535f15ab3SAmit Cohen forwarding_restore 34635f15ab3SAmit Cohen vrf_cleanup 34735f15ab3SAmit Cohen} 34835f15ab3SAmit Cohen 34935f15ab3SAmit Cohenping_ipv4() 35035f15ab3SAmit Cohen{ 35135f15ab3SAmit Cohen ping_test $h1 192.0.2.3 ": local->remote 1 through VxLAN with an 802.1ad bridge" 35235f15ab3SAmit Cohen ping_test $h2 192.0.2.4 ": local->remote 2 through VxLAN with an 802.1d bridge" 35335f15ab3SAmit Cohen} 35435f15ab3SAmit Cohen 35535f15ab3SAmit Cohentest_all() 35635f15ab3SAmit Cohen{ 35735f15ab3SAmit Cohen echo "Running tests with UDP port $VXPORT" 35835f15ab3SAmit Cohen tests_run 35935f15ab3SAmit Cohen} 36035f15ab3SAmit Cohen 36135f15ab3SAmit Cohentrap cleanup EXIT 36235f15ab3SAmit Cohen 36335f15ab3SAmit Cohensetup_prepare 36435f15ab3SAmit Cohensetup_wait 36535f15ab3SAmit Cohentest_all 36635f15ab3SAmit Cohen 36735f15ab3SAmit Cohenexit $EXIT_STATUS 368