1#!/bin/bash
2# SPDX-License-Identifier: GPL-2.0
3#
4# Test macvlan over balance-alb
5
6lib_dir=$(dirname "$0")
7source ${lib_dir}/bond_topo_2d1c.sh
8
9m1_ns="m1-$(mktemp -u XXXXXX)"
10m2_ns="m1-$(mktemp -u XXXXXX)"
11m1_ip4="192.0.2.11"
12m1_ip6="2001:db8::11"
13m2_ip4="192.0.2.12"
14m2_ip6="2001:db8::12"
15
16cleanup()
17{
18	ip -n ${m1_ns} link del macv0
19	ip netns del ${m1_ns}
20	ip -n ${m2_ns} link del macv0
21	ip netns del ${m2_ns}
22
23	client_destroy
24	server_destroy
25	gateway_destroy
26}
27
28check_connection()
29{
30	local ns=${1}
31	local target=${2}
32	local message=${3:-"macvlan_over_bond"}
33	RET=0
34
35
36	ip netns exec ${ns} ping ${target} -c 4 -i 0.1 &>/dev/null
37	check_err $? "ping failed"
38	log_test "$mode: $message"
39}
40
41macvlan_over_bond()
42{
43	local param="$1"
44	RET=0
45
46	# setup new bond mode
47	bond_reset "${param}"
48
49	ip -n ${s_ns} link add link bond0 name macv0 type macvlan mode bridge
50	ip -n ${s_ns} link set macv0 netns ${m1_ns}
51	ip -n ${m1_ns} link set dev macv0 up
52	ip -n ${m1_ns} addr add ${m1_ip4}/24 dev macv0
53	ip -n ${m1_ns} addr add ${m1_ip6}/24 dev macv0
54
55	ip -n ${s_ns} link add link bond0 name macv0 type macvlan mode bridge
56	ip -n ${s_ns} link set macv0 netns ${m2_ns}
57	ip -n ${m2_ns} link set dev macv0 up
58	ip -n ${m2_ns} addr add ${m2_ip4}/24 dev macv0
59	ip -n ${m2_ns} addr add ${m2_ip6}/24 dev macv0
60
61	sleep 2
62
63	check_connection "${c_ns}" "${s_ip4}" "IPv4: client->server"
64	check_connection "${c_ns}" "${s_ip6}" "IPv6: client->server"
65	check_connection "${c_ns}" "${m1_ip4}" "IPv4: client->macvlan_1"
66	check_connection "${c_ns}" "${m1_ip6}" "IPv6: client->macvlan_1"
67	check_connection "${c_ns}" "${m2_ip4}" "IPv4: client->macvlan_2"
68	check_connection "${c_ns}" "${m2_ip6}" "IPv6: client->macvlan_2"
69	check_connection "${m1_ns}" "${m2_ip4}" "IPv4: macvlan_1->macvlan_2"
70	check_connection "${m1_ns}" "${m2_ip6}" "IPv6: macvlan_1->macvlan_2"
71
72
73	sleep 5
74
75	check_connection "${s_ns}" "${c_ip4}" "IPv4: server->client"
76	check_connection "${s_ns}" "${c_ip6}" "IPv6: server->client"
77	check_connection "${m1_ns}" "${c_ip4}" "IPv4: macvlan_1->client"
78	check_connection "${m1_ns}" "${c_ip6}" "IPv6: macvlan_1->client"
79	check_connection "${m2_ns}" "${c_ip4}" "IPv4: macvlan_2->client"
80	check_connection "${m2_ns}" "${c_ip6}" "IPv6: macvlan_2->client"
81	check_connection "${m2_ns}" "${m1_ip4}" "IPv4: macvlan_2->macvlan_2"
82	check_connection "${m2_ns}" "${m1_ip6}" "IPv6: macvlan_2->macvlan_2"
83
84	ip -n ${c_ns} neigh flush dev eth0
85}
86
87trap cleanup EXIT
88
89setup_prepare
90ip netns add ${m1_ns}
91ip netns add ${m2_ns}
92
93modes="active-backup balance-tlb balance-alb"
94
95for mode in $modes; do
96	macvlan_over_bond "mode $mode"
97done
98
99exit $EXIT_STATUS
100