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