552 lines
18 KiB
Bash
Executable File
552 lines
18 KiB
Bash
Executable File
#!/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
|
|
}
|
|
|
|
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 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
|
|
}
|
|
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
|