| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561 |
- #!/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
|