| #!/bin/bash |
| # SPDX-License-Identifier: GPL-2.0 |
| |
| # +--------------------------------+ +-----------------------------+ |
| # | vrf-h1 | | vrf-h2 | |
| # | + $h1 | | + $h2 | |
| # | | 2001:db8:1::1/64 | | | 2001:db8:2::1/64 | |
| # | | default via 2001:db8:1::3 | | | default via 2001:db8:2::3 | |
| # +----|---------------------------+ +-|---------------------------+ |
| # | | |
| # +----|------------------------------------------|---------------------------+ |
| # | SW | | | |
| # | +--|------------------------------------------|-------------------------+ | |
| # | | + $swp1 br1 + $swp2 | | |
| # | | vid 10 pvid untagged vid 20 pvid untagged | | |
| # | | | | |
| # | | + vx10 + vx20 | | |
| # | | local 2001:db8:3::1 local 2001:db8:3::1 | | |
| # | | remote 2001:db8:3::2 remote 2001:db8:3::2 | | |
| # | | id 1000 id 2000 | | |
| # | | dstport 4789 dstport 4789 | | |
| # | | vid 10 pvid untagged vid 20 pvid untagged | | |
| # | | | | |
| # | +-----------------------------------+-----------------------------------+ | |
| # | | | |
| # | +-----------------------------------|-----------------------------------+ | |
| # | | | | | |
| # | | +--------------------------------+--------------------------------+ | | |
| # | | | | | | |
| # | | + vlan10 vlan20 + | | |
| # | | | 2001:db8:1::2/64 2001:db8:2::2/64 | | | |
| # | | | | | | |
| # | | + vlan10-v (macvlan) vlan20-v (macvlan) + | | |
| # | | 2001:db8:1::3/64 2001:db8:2::3/64 | | |
| # | | 00:00:5e:00:01:01 00:00:5e:00:01:01 | | |
| # | | vrf-green | | |
| # | +-----------------------------------------------------------------------+ | |
| # | | |
| # | + $rp1 +lo | |
| # | | 2001:db8:4::1/64 2001:db8:3::1/128 | |
| # +----|----------------------------------------------------------------------+ |
| # | |
| # +----|--------------------------------------------------------+ |
| # | | vrf-spine | |
| # | + $rp2 | |
| # | 2001:db8:4::2/64 | |
| # | | (maybe) HW |
| # ============================================================================= |
| # | | (likely) SW |
| # | | |
| # | + v1 (veth) | |
| # | | 2001:db8:5::2/64 | |
| # +----|--------------------------------------------------------+ |
| # | |
| # +----|----------------------------------------------------------------------+ |
| # | + v2 (veth) +lo NS1 (netns) | |
| # | 2001:db8:5::1/64 2001:db8:3::2/128 | |
| # | | |
| # | +-----------------------------------------------------------------------+ | |
| # | | vrf-green | | |
| # | | + vlan10-v (macvlan) vlan20-v (macvlan) + | | |
| # | | | 2001:db8:1::3/64 2001:db8:2::3/64 | | | |
| # | | | 00:00:5e:00:01:01 00:00:5e:00:01:01 | | | |
| # | | | | | | |
| # | | + vlan10 vlan20 + | | |
| # | | | 2001:db8:1::3/64 2001:db8:2::3/64 | | | |
| # | | | | | | |
| # | | +--------------------------------+--------------------------------+ | | |
| # | | | | | |
| # | +-----------------------------------|-----------------------------------+ | |
| # | | | |
| # | +-----------------------------------+-----------------------------------+ | |
| # | | | | |
| # | | + vx10 + vx20 | | |
| # | | local 2001:db8:3::2 local 2001:db8:3::2 | | |
| # | | remote 2001:db8:3::1 remote 2001:db8:3::1 | | |
| # | | id 1000 id 2000 | | |
| # | | dstport 4789 dstport 4789 | | |
| # | | vid 10 pvid untagged vid 20 pvid untagged | | |
| # | | | | |
| # | | + w1 (veth) + w3 (veth) | | |
| # | | | vid 10 pvid untagged br1 | vid 20 pvid untagged | | |
| # | +--|------------------------------------------|-------------------------+ | |
| # | | | | |
| # | | | | |
| # | +--|----------------------+ +--|-------------------------+ | |
| # | | | vrf-h1 | | | vrf-h2 | | |
| # | | + w2 (veth) | | + w4 (veth) | | |
| # | | 2001:db8:1::4/64 | | 2001:db8:2::4/64 | | |
| # | | default via | | default via | | |
| # | | 2001:db8:1::3/64 | | 2001:db8:2::3/64 | | |
| # | +-------------------------+ +----------------------------+ | |
| # +---------------------------------------------------------------------------+ |
| |
| ALL_TESTS=" |
| ping_ipv6 |
| arp_decap |
| " |
| NUM_NETIFS=6 |
| source lib.sh |
| |
| require_command $ARPING |
| |
| hx_create() |
| { |
| local vrf_name=$1; shift |
| local if_name=$1; shift |
| local ip_addr=$1; shift |
| local gw_ip=$1; shift |
| |
| vrf_create $vrf_name |
| ip link set dev $if_name master $vrf_name |
| ip link set dev $vrf_name up |
| ip link set dev $if_name up |
| |
| ip address add $ip_addr/64 dev $if_name |
| ip neigh replace $gw_ip lladdr 00:00:5e:00:01:01 nud permanent \ |
| dev $if_name |
| ip route add default vrf $vrf_name nexthop via $gw_ip |
| } |
| export -f hx_create |
| |
| hx_destroy() |
| { |
| local vrf_name=$1; shift |
| local if_name=$1; shift |
| local ip_addr=$1; shift |
| local gw_ip=$1; shift |
| |
| ip route del default vrf $vrf_name nexthop via $gw_ip |
| ip neigh del $gw_ip dev $if_name |
| ip address del $ip_addr/64 dev $if_name |
| |
| ip link set dev $if_name down |
| vrf_destroy $vrf_name |
| } |
| |
| h1_create() |
| { |
| hx_create "vrf-h1" $h1 2001:db8:1::1 2001:db8:1::3 |
| } |
| |
| h1_destroy() |
| { |
| hx_destroy "vrf-h1" $h1 2001:db8:1::1 2001:db8:1::3 |
| } |
| |
| h2_create() |
| { |
| hx_create "vrf-h2" $h2 2001:db8:2::1 2001:db8:2::3 |
| } |
| |
| h2_destroy() |
| { |
| hx_destroy "vrf-h2" $h2 2001:db8:2::1 2001:db8:2::3 |
| } |
| |
| switch_create() |
| { |
| ip link add name br1 type bridge vlan_filtering 1 vlan_default_pvid 0 \ |
| mcast_snooping 0 |
| # Make sure the bridge uses the MAC address of the local port and not |
| # that of the VxLAN's device. |
| ip link set dev br1 address $(mac_get $swp1) |
| ip link set dev br1 up |
| |
| ip link set dev $rp1 up |
| ip address add dev $rp1 2001:db8:4::1/64 |
| ip route add 2001:db8:3::2/128 nexthop via 2001:db8:4::2 |
| |
| ip link add name vx10 type vxlan id 1000 \ |
| local 2001:db8:3::1 remote 2001:db8:3::2 dstport 4789 \ |
| nolearning udp6zerocsumrx udp6zerocsumtx tos inherit ttl 100 |
| ip link set dev vx10 up |
| |
| ip link set dev vx10 master br1 |
| bridge vlan add vid 10 dev vx10 pvid untagged |
| |
| ip link add name vx20 type vxlan id 2000 \ |
| local 2001:db8:3::1 remote 2001:db8:3::2 dstport 4789 \ |
| nolearning udp6zerocsumrx udp6zerocsumtx tos inherit ttl 100 |
| ip link set dev vx20 up |
| |
| ip link set dev vx20 master br1 |
| bridge vlan add vid 20 dev vx20 pvid untagged |
| |
| ip link set dev $swp1 master br1 |
| ip link set dev $swp1 up |
| bridge vlan add vid 10 dev $swp1 pvid untagged |
| |
| ip link set dev $swp2 master br1 |
| ip link set dev $swp2 up |
| bridge vlan add vid 20 dev $swp2 pvid untagged |
| |
| ip address add 2001:db8:3::1/128 dev lo |
| |
| # Create SVIs |
| vrf_create "vrf-green" |
| ip link set dev vrf-green up |
| |
| ip link add link br1 name vlan10 up master vrf-green type vlan id 10 |
| ip address add 2001:db8:1::2/64 dev vlan10 |
| ip link add link vlan10 name vlan10-v up master vrf-green \ |
| address 00:00:5e:00:01:01 type macvlan mode private |
| ip address add 2001:db8:1::3/64 dev vlan10-v |
| |
| ip link add link br1 name vlan20 up master vrf-green type vlan id 20 |
| ip address add 2001:db8:2::2/64 dev vlan20 |
| ip link add link vlan20 name vlan20-v up master vrf-green \ |
| address 00:00:5e:00:01:01 type macvlan mode private |
| ip address add 2001:db8:2::3/64 dev vlan20-v |
| |
| bridge vlan add vid 10 dev br1 self |
| bridge vlan add vid 20 dev br1 self |
| |
| bridge fdb add 00:00:5e:00:01:01 dev br1 self local vlan 10 |
| bridge fdb add 00:00:5e:00:01:01 dev br1 self local vlan 20 |
| |
| } |
| |
| switch_destroy() |
| { |
| bridge fdb del 00:00:5e:00:01:01 dev br1 self local vlan 20 |
| bridge fdb del 00:00:5e:00:01:01 dev br1 self local vlan 10 |
| |
| bridge vlan del vid 20 dev br1 self |
| bridge vlan del vid 10 dev br1 self |
| |
| ip link del dev vlan20 |
| |
| ip link del dev vlan10 |
| |
| vrf_destroy "vrf-green" |
| |
| ip address del 2001:db8:3::1/128 dev lo |
| |
| bridge vlan del vid 20 dev $swp2 |
| ip link set dev $swp2 down |
| ip link set dev $swp2 nomaster |
| |
| bridge vlan del vid 10 dev $swp1 |
| ip link set dev $swp1 down |
| ip link set dev $swp1 nomaster |
| |
| bridge vlan del vid 20 dev vx20 |
| ip link set dev vx20 nomaster |
| |
| ip link set dev vx20 down |
| ip link del dev vx20 |
| |
| bridge vlan del vid 10 dev vx10 |
| ip link set dev vx10 nomaster |
| |
| ip link set dev vx10 down |
| ip link del dev vx10 |
| |
| ip route del 2001:db8:3::2 nexthop via 2001:db8:4::2 |
| ip address del dev $rp1 2001:db8:4::1/64 |
| ip link set dev $rp1 down |
| |
| ip link set dev br1 down |
| ip link del dev br1 |
| } |
| |
| spine_create() |
| { |
| vrf_create "vrf-spine" |
| ip link set dev $rp2 master vrf-spine |
| ip link set dev v1 master vrf-spine |
| ip link set dev vrf-spine up |
| ip link set dev $rp2 up |
| ip link set dev v1 up |
| |
| ip address add 2001:db8:4::2/64 dev $rp2 |
| ip address add 2001:db8:5::2/64 dev v1 |
| |
| ip route add 2001:db8:3::1/128 vrf vrf-spine nexthop via \ |
| 2001:db8:4::1 |
| ip route add 2001:db8:3::2/128 vrf vrf-spine nexthop via \ |
| 2001:db8:5::1 |
| } |
| |
| spine_destroy() |
| { |
| ip route del 2001:db8:3::2/128 vrf vrf-spine nexthop via \ |
| 2001:db8:5::1 |
| ip route del 2001:db8:3::1/128 vrf vrf-spine nexthop via \ |
| 2001:db8:4::1 |
| |
| ip address del 2001:db8:5::2/64 dev v1 |
| ip address del 2001:db8:4::2/64 dev $rp2 |
| |
| ip link set dev v1 down |
| ip link set dev $rp2 down |
| vrf_destroy "vrf-spine" |
| } |
| |
| ns_h1_create() |
| { |
| hx_create "vrf-h1" w2 2001:db8:1::4 2001:db8:1::3 |
| } |
| export -f ns_h1_create |
| |
| ns_h2_create() |
| { |
| hx_create "vrf-h2" w4 2001:db8:2::4 2001:db8:2::3 |
| } |
| export -f ns_h2_create |
| |
| ns_switch_create() |
| { |
| ip link add name br1 type bridge vlan_filtering 1 vlan_default_pvid 0 \ |
| mcast_snooping 0 |
| ip link set dev br1 up |
| |
| ip link set dev v2 up |
| ip address add dev v2 2001:db8:5::1/64 |
| ip route add 2001:db8:3::1 nexthop via 2001:db8:5::2 |
| |
| ip link add name vx10 type vxlan id 1000 \ |
| local 2001:db8:3::2 remote 2001:db8:3::1 dstport 4789 \ |
| nolearning udp6zerocsumrx udp6zerocsumtx tos inherit ttl 100 |
| ip link set dev vx10 up |
| |
| ip link set dev vx10 master br1 |
| bridge vlan add vid 10 dev vx10 pvid untagged |
| |
| ip link add name vx20 type vxlan id 2000 \ |
| local 2001:db8:3::2 remote 2001:db8:3::1 dstport 4789 \ |
| nolearning udp6zerocsumrx udp6zerocsumtx tos inherit ttl 100 |
| ip link set dev vx20 up |
| |
| ip link set dev vx20 master br1 |
| bridge vlan add vid 20 dev vx20 pvid untagged |
| |
| ip link set dev w1 master br1 |
| ip link set dev w1 up |
| bridge vlan add vid 10 dev w1 pvid untagged |
| |
| ip link set dev w3 master br1 |
| ip link set dev w3 up |
| bridge vlan add vid 20 dev w3 pvid untagged |
| |
| ip address add 2001:db8:3::2/128 dev lo |
| |
| # Create SVIs |
| vrf_create "vrf-green" |
| ip link set dev vrf-green up |
| |
| ip link add link br1 name vlan10 up master vrf-green type vlan id 10 |
| ip address add 2001:db8:1::3/64 dev vlan10 |
| ip link add link vlan10 name vlan10-v up master vrf-green \ |
| address 00:00:5e:00:01:01 type macvlan mode private |
| ip address add 2001:db8:1::3/64 dev vlan10-v |
| |
| ip link add link br1 name vlan20 up master vrf-green type vlan id 20 |
| ip address add 2001:db8:2::3/64 dev vlan20 |
| ip link add link vlan20 name vlan20-v up master vrf-green \ |
| address 00:00:5e:00:01:01 type macvlan mode private |
| ip address add 2001:db8:2::3/64 dev vlan20-v |
| |
| bridge vlan add vid 10 dev br1 self |
| bridge vlan add vid 20 dev br1 self |
| |
| bridge fdb add 00:00:5e:00:01:01 dev br1 self local vlan 10 |
| bridge fdb add 00:00:5e:00:01:01 dev br1 self local vlan 20 |
| } |
| export -f ns_switch_create |
| |
| ns_init() |
| { |
| ip link add name w1 type veth peer name w2 |
| ip link add name w3 type veth peer name w4 |
| |
| ip link set dev lo up |
| |
| ns_h1_create |
| ns_h2_create |
| ns_switch_create |
| } |
| export -f ns_init |
| |
| ns1_create() |
| { |
| ip netns add ns1 |
| ip link set dev v2 netns ns1 |
| in_ns ns1 ns_init |
| } |
| |
| ns1_destroy() |
| { |
| ip netns exec ns1 ip link set dev v2 netns 1 |
| ip netns del ns1 |
| } |
| |
| macs_populate() |
| { |
| local mac1=$1; shift |
| local mac2=$1; shift |
| local ip1=$1; shift |
| local ip2=$1; shift |
| local dst=$1; shift |
| |
| bridge fdb add $mac1 dev vx10 self master extern_learn static \ |
| dst $dst vlan 10 |
| bridge fdb add $mac2 dev vx20 self master extern_learn static \ |
| dst $dst vlan 20 |
| |
| ip neigh add $ip1 lladdr $mac1 nud noarp dev vlan10 \ |
| extern_learn |
| ip neigh add $ip2 lladdr $mac2 nud noarp dev vlan20 \ |
| extern_learn |
| } |
| export -f macs_populate |
| |
| macs_initialize() |
| { |
| local h1_ns_mac=$(in_ns ns1 mac_get w2) |
| local h2_ns_mac=$(in_ns ns1 mac_get w4) |
| local h1_mac=$(mac_get $h1) |
| local h2_mac=$(mac_get $h2) |
| |
| macs_populate $h1_ns_mac $h2_ns_mac 2001:db8:1::4 2001:db8:2::4 \ |
| 2001:db8:3::2 |
| in_ns ns1 macs_populate $h1_mac $h2_mac 2001:db8:1::1 2001:db8:2::1 \ |
| 2001:db8:3::1 |
| } |
| |
| setup_prepare() |
| { |
| h1=${NETIFS[p1]} |
| swp1=${NETIFS[p2]} |
| |
| swp2=${NETIFS[p3]} |
| h2=${NETIFS[p4]} |
| |
| rp1=${NETIFS[p5]} |
| rp2=${NETIFS[p6]} |
| |
| vrf_prepare |
| forwarding_enable |
| |
| h1_create |
| h2_create |
| switch_create |
| |
| ip link add name v1 type veth peer name v2 |
| spine_create |
| ns1_create |
| in_ns ns1 forwarding_enable |
| |
| macs_initialize |
| } |
| |
| cleanup() |
| { |
| pre_cleanup |
| |
| ns1_destroy |
| spine_destroy |
| ip link del dev v1 |
| |
| switch_destroy |
| h2_destroy |
| h1_destroy |
| |
| forwarding_restore |
| vrf_cleanup |
| } |
| |
| ping_ipv6() |
| { |
| ping6_test $h1 2001:db8:2::1 ": local->local vid 10->vid 20" |
| ping6_test $h1 2001:db8:1::4 ": local->remote vid 10->vid 10" |
| ping6_test $h2 2001:db8:2::4 ": local->remote vid 20->vid 20" |
| ping6_test $h1 2001:db8:2::4 ": local->remote vid 10->vid 20" |
| ping6_test $h2 2001:db8:1::4 ": local->remote vid 20->vid 10" |
| } |
| |
| arp_decap() |
| { |
| # Repeat the ping tests, but without populating the neighbours. This |
| # makes sure we correctly decapsulate ARP packets |
| log_info "deleting neighbours from vlan interfaces" |
| |
| ip neigh del 2001:db8:1::4 dev vlan10 |
| ip neigh del 2001:db8:2::4 dev vlan20 |
| |
| ping_ipv6 |
| |
| ip neigh replace 2001:db8:1::4 lladdr $(in_ns ns1 mac_get w2) \ |
| nud noarp dev vlan10 extern_learn |
| ip neigh replace 2001:db8:2::4 lladdr $(in_ns ns1 mac_get w4) \ |
| nud noarp dev vlan20 extern_learn |
| } |
| |
| trap cleanup EXIT |
| |
| setup_prepare |
| setup_wait |
| |
| tests_run |
| |
| exit $EXIT_STATUS |