| #!/bin/bash |
| # SPDX-License-Identifier: GPL-2.0 |
| |
| # +---------------------------+ +------------------------------+ |
| # | vrf-h1 | | vrf-h2 | |
| # | + $h1 | | + $h2 | |
| # | | 10.1.1.101/24 | | | 10.1.2.101/24 | |
| # | | default via 10.1.1.1 | | | default via 10.1.2.1 | |
| # +----|----------------------+ +----|-------------------------+ |
| # | | |
| # +----|--------------------------------------------|-------------------------+ |
| # | SW | | | |
| # | +--|--------------------------------------------|-----------------------+ | |
| # | | + $swp1 br1 + $swp2 | | |
| # | | vid 10 pvid untagged vid 20 pvid untagged | | |
| # | | | | |
| # | | + vx10 + vx20 | | |
| # | | local 10.0.0.1 local 10.0.0.1 | | |
| # | | remote 10.0.0.2 remote 10.0.0.2 | | |
| # | | id 1010 id 1020 | | |
| # | | dstport 4789 dstport 4789 | | |
| # | | vid 10 pvid untagged vid 20 pvid untagged | | |
| # | | | | |
| # | | + vx4001 | | |
| # | | local 10.0.0.1 | | |
| # | | remote 10.0.0.2 | | |
| # | | id 104001 | | |
| # | | dstport 4789 | | |
| # | | vid 4001 pvid untagged | | |
| # | | | | |
| # | +-----------------------------------+-----------------------------------+ | |
| # | | | |
| # | +-----------------------------------|-----------------------------------+ | |
| # | | | | | |
| # | | +--------------------------------+--------------------------------+ | | |
| # | | | | | | | |
| # | | + vlan10 | vlan20 + | | |
| # | | | 10.1.1.11/24 | 10.1.2.11/24 | | | |
| # | | | | | | | |
| # | | + vlan10-v (macvlan) + vlan20-v (macvlan) + | | |
| # | | 10.1.1.1/24 vlan4001 10.1.2.1/24 | | |
| # | | 00:00:5e:00:01:01 00:00:5e:00:01:01 | | |
| # | | vrf-green | | |
| # | +-----------------------------------------------------------------------+ | |
| # | | |
| # | + $rp1 +lo | |
| # | | 192.0.2.1/24 10.0.0.1/32 | |
| # +----|----------------------------------------------------------------------+ |
| # | |
| # +----|--------------------------------------------------------+ |
| # | | vrf-spine | |
| # | + $rp2 | |
| # | 192.0.2.2/24 | |
| # | | (maybe) HW |
| # ============================================================================= |
| # | | (likely) SW |
| # | | |
| # | + v1 (veth) | |
| # | | 192.0.3.2/24 | |
| # +----|--------------------------------------------------------+ |
| # | |
| # +----|----------------------------------------------------------------------+ |
| # | + v2 (veth) +lo NS1 (netns) | |
| # | 192.0.3.1/24 10.0.0.2/32 | |
| # | | |
| # | +-----------------------------------------------------------------------+ | |
| # | | vrf-green | | |
| # | | + vlan10-v (macvlan) vlan20-v (macvlan) + | | |
| # | | | 10.1.1.1/24 10.1.2.1/24 | | | |
| # | | | 00:00:5e:00:01:01 00:00:5e:00:01:01 | | | |
| # | | | vlan4001 | | | |
| # | | + vlan10 + vlan20 + | | |
| # | | | 10.1.1.12/24 | 10.1.2.12/24 | | | |
| # | | | | | | | |
| # | | +--------------------------------+--------------------------------+ | | |
| # | | | | | |
| # | +-----------------------------------|-----------------------------------+ | |
| # | | | |
| # | +-----------------------------------+-----------------------------------+ | |
| # | | | | |
| # | | + vx10 + vx20 | | |
| # | | local 10.0.0.2 local 10.0.0.2 | | |
| # | | remote 10.0.0.1 remote 10.0.0.1 | | |
| # | | id 1010 id 1020 | | |
| # | | dstport 4789 dstport 4789 | | |
| # | | vid 10 pvid untagged vid 20 pvid untagged | | |
| # | | | | |
| # | | + vx4001 | | |
| # | | local 10.0.0.2 | | |
| # | | remote 10.0.0.1 | | |
| # | | id 104001 | | |
| # | | dstport 4789 | | |
| # | | vid 4001 pvid untagged | | |
| # | | | | |
| # | | + w1 (veth) + w3 (veth) | | |
| # | | | vid 10 pvid untagged br1 | vid 20 pvid untagged | | |
| # | +--|------------------------------------------|-------------------------+ | |
| # | | | | |
| # | | | | |
| # | +--|----------------------+ +--|-------------------------+ | |
| # | | | vrf-h1 | | | vrf-h2 | | |
| # | | + w2 (veth) | | + w4 (veth) | | |
| # | | 10.1.1.102/24 | | 10.1.2.102/24 | | |
| # | | default via 10.1.1.1 | | default via 10.1.2.1 | | |
| # | +-------------------------+ +----------------------------+ | |
| # +---------------------------------------------------------------------------+ |
| |
| ALL_TESTS=" |
| ping_ipv4 |
| " |
| NUM_NETIFS=6 |
| source lib.sh |
| |
| 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/24 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/24 dev $if_name |
| |
| ip link set dev $if_name down |
| vrf_destroy $vrf_name |
| } |
| |
| h1_create() |
| { |
| hx_create "vrf-h1" $h1 10.1.1.101 10.1.1.1 |
| } |
| |
| h1_destroy() |
| { |
| hx_destroy "vrf-h1" $h1 10.1.1.101 10.1.1.1 |
| } |
| |
| h2_create() |
| { |
| hx_create "vrf-h2" $h2 10.1.2.101 10.1.2.1 |
| } |
| |
| h2_destroy() |
| { |
| hx_destroy "vrf-h2" $h2 10.1.2.101 10.1.2.1 |
| } |
| |
| 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 192.0.2.1/24 |
| ip route add 10.0.0.2/32 nexthop via 192.0.2.2 |
| |
| ip link add name vx10 type vxlan id 1010 \ |
| local 10.0.0.1 remote 10.0.0.2 dstport 4789 \ |
| nolearning noudpcsum 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 1020 \ |
| local 10.0.0.1 remote 10.0.0.2 dstport 4789 \ |
| nolearning noudpcsum 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 link add name vx4001 type vxlan id 104001 \ |
| local 10.0.0.1 dstport 4789 \ |
| nolearning noudpcsum tos inherit ttl 100 |
| ip link set dev vx4001 up |
| |
| ip link set dev vx4001 master br1 |
| bridge vlan add vid 4001 dev vx4001 pvid untagged |
| |
| ip address add 10.0.0.1/32 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 10.1.1.11/24 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 10.1.1.1/24 dev vlan10-v |
| |
| ip link add link br1 name vlan20 up master vrf-green type vlan id 20 |
| ip address add 10.1.2.11/24 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 10.1.2.1/24 dev vlan20-v |
| |
| ip link add link br1 name vlan4001 up master vrf-green \ |
| type vlan id 4001 |
| |
| bridge vlan add vid 10 dev br1 self |
| bridge vlan add vid 20 dev br1 self |
| bridge vlan add vid 4001 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 |
| |
| sysctl_set net.ipv4.conf.all.rp_filter 0 |
| sysctl_set net.ipv4.conf.vlan10-v.rp_filter 0 |
| sysctl_set net.ipv4.conf.vlan20-v.rp_filter 0 |
| } |
| |
| switch_destroy() |
| { |
| sysctl_restore net.ipv4.conf.all.rp_filter |
| |
| 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 4001 dev br1 self |
| bridge vlan del vid 20 dev br1 self |
| bridge vlan del vid 10 dev br1 self |
| |
| ip link del dev vlan4001 |
| |
| ip link del dev vlan20 |
| |
| ip link del dev vlan10 |
| |
| vrf_destroy "vrf-green" |
| |
| ip address del 10.0.0.1/32 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 4001 dev vx4001 |
| ip link set dev vx4001 nomaster |
| |
| ip link set dev vx4001 down |
| ip link del dev vx4001 |
| |
| 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 10.0.0.2/32 nexthop via 192.0.2.2 |
| ip address del dev $rp1 192.0.2.1/24 |
| 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 192.0.2.2/24 dev $rp2 |
| ip address add 192.0.3.2/24 dev v1 |
| |
| ip route add 10.0.0.1/32 vrf vrf-spine nexthop via 192.0.2.1 |
| ip route add 10.0.0.2/32 vrf vrf-spine nexthop via 192.0.3.1 |
| } |
| |
| spine_destroy() |
| { |
| ip route del 10.0.0.2/32 vrf vrf-spine nexthop via 192.0.3.1 |
| ip route del 10.0.0.1/32 vrf vrf-spine nexthop via 192.0.2.1 |
| |
| ip address del 192.0.3.2/24 dev v1 |
| ip address del 192.0.2.2/24 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 10.1.1.102 10.1.1.1 |
| } |
| export -f ns_h1_create |
| |
| ns_h2_create() |
| { |
| hx_create "vrf-h2" w4 10.1.2.102 10.1.2.1 |
| } |
| 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 192.0.3.1/24 |
| ip route add 10.0.0.1/32 nexthop via 192.0.3.2 |
| |
| ip link add name vx10 type vxlan id 1010 \ |
| local 10.0.0.2 remote 10.0.0.1 dstport 4789 \ |
| nolearning noudpcsum 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 1020 \ |
| local 10.0.0.2 remote 10.0.0.1 dstport 4789 \ |
| nolearning noudpcsum 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 add name vx4001 type vxlan id 104001 \ |
| local 10.0.0.2 dstport 4789 \ |
| nolearning noudpcsum tos inherit ttl 100 |
| ip link set dev vx4001 up |
| |
| ip link set dev vx4001 master br1 |
| bridge vlan add vid 4001 dev vx4001 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 10.0.0.2/32 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 10.1.1.12/24 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 10.1.1.1/24 dev vlan10-v |
| |
| ip link add link br1 name vlan20 up master vrf-green type vlan id 20 |
| ip address add 10.1.2.12/24 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 10.1.2.1/24 dev vlan20-v |
| |
| ip link add link br1 name vlan4001 up master vrf-green \ |
| type vlan id 4001 |
| |
| bridge vlan add vid 10 dev br1 self |
| bridge vlan add vid 20 dev br1 self |
| bridge vlan add vid 4001 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 |
| |
| sysctl_set net.ipv4.conf.all.rp_filter 0 |
| sysctl_set net.ipv4.conf.vlan10-v.rp_filter 0 |
| sysctl_set net.ipv4.conf.vlan20-v.rp_filter 0 |
| } |
| 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 |
| } |
| |
| __l2_vni_init() |
| { |
| 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 __l2_vni_init |
| |
| l2_vni_init() |
| { |
| 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) |
| |
| __l2_vni_init $h1_ns_mac $h2_ns_mac 10.1.1.102 10.1.2.102 10.0.0.2 |
| in_ns ns1 __l2_vni_init $h1_mac $h2_mac 10.1.1.101 10.1.2.101 10.0.0.1 |
| } |
| |
| __l3_vni_init() |
| { |
| local mac=$1; shift |
| local vtep_ip=$1; shift |
| local host1_ip=$1; shift |
| local host2_ip=$1; shift |
| |
| bridge fdb add $mac dev vx4001 self master extern_learn static \ |
| dst $vtep_ip vlan 4001 |
| |
| ip neigh add $vtep_ip lladdr $mac nud noarp dev vlan4001 extern_learn |
| |
| ip route add $host1_ip/32 vrf vrf-green nexthop via $vtep_ip \ |
| dev vlan4001 onlink |
| ip route add $host2_ip/32 vrf vrf-green nexthop via $vtep_ip \ |
| dev vlan4001 onlink |
| } |
| export -f __l3_vni_init |
| |
| l3_vni_init() |
| { |
| local vlan4001_ns_mac=$(in_ns ns1 mac_get vlan4001) |
| local vlan4001_mac=$(mac_get vlan4001) |
| |
| __l3_vni_init $vlan4001_ns_mac 10.0.0.2 10.1.1.102 10.1.2.102 |
| in_ns ns1 __l3_vni_init $vlan4001_mac 10.0.0.1 10.1.1.101 10.1.2.101 |
| } |
| |
| 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 |
| |
| l2_vni_init |
| l3_vni_init |
| } |
| |
| cleanup() |
| { |
| pre_cleanup |
| |
| ns1_destroy |
| spine_destroy |
| ip link del dev v1 |
| |
| switch_destroy |
| h2_destroy |
| h1_destroy |
| |
| forwarding_restore |
| vrf_cleanup |
| } |
| |
| ping_ipv4() |
| { |
| ping_test $h1 10.1.2.101 ": local->local vid 10->vid 20" |
| ping_test $h1 10.1.1.102 ": local->remote vid 10->vid 10" |
| ping_test $h2 10.1.2.102 ": local->remote vid 20->vid 20" |
| ping_test $h1 10.1.2.102 ": local->remote vid 10->vid 20" |
| ping_test $h2 10.1.1.102 ": local->remote vid 20->vid 10" |
| } |
| |
| trap cleanup EXIT |
| |
| setup_prepare |
| setup_wait |
| |
| tests_run |
| |
| exit $EXIT_STATUS |