1#!/bin/bash
2# SPDX-License-Identifier: GPL-2.0
3#
4# Topology for Bond mode 1,5,6 testing
5#
6#  +-------------------------------------+
7#  |                bond0                |
8#  |                  +                  |  Server
9#  |      eth0        | eth1   eth2      |  192.0.2.1/24
10#  |        +-------------------+        |  2001:db8::1/24
11#  |        |         |         |        |
12#  +-------------------------------------+
13#           |         |         |
14#  +-------------------------------------+
15#  |        |         |         |        |
16#  |    +---+---------+---------+---+    |  Gateway
17#  |    |            br0            |    |  192.0.2.254/24
18#  |    +-------------+-------------+    |  2001:db8::254/24
19#  |                  |                  |
20#  +-------------------------------------+
21#                     |
22#  +-------------------------------------+
23#  |                  |                  |  Client
24#  |                  +                  |  192.0.2.10/24
25#  |                eth0                 |  2001:db8::10/24
26#  +-------------------------------------+
27
28s_ns="s-$(mktemp -u XXXXXX)"
29c_ns="c-$(mktemp -u XXXXXX)"
30g_ns="g-$(mktemp -u XXXXXX)"
31s_ip4="192.0.2.1"
32c_ip4="192.0.2.10"
33g_ip4="192.0.2.254"
34s_ip6="2001:db8::1"
35c_ip6="2001:db8::10"
36g_ip6="2001:db8::254"
37
38gateway_create()
39{
40	ip netns add ${g_ns}
41	ip -n ${g_ns} link add br0 type bridge
42	ip -n ${g_ns} link set br0 up
43	ip -n ${g_ns} addr add ${g_ip4}/24 dev br0
44	ip -n ${g_ns} addr add ${g_ip6}/24 dev br0
45}
46
47gateway_destroy()
48{
49	ip -n ${g_ns} link del br0
50	ip netns del ${g_ns}
51}
52
53server_create()
54{
55	ip netns add ${s_ns}
56	ip -n ${s_ns} link add bond0 type bond mode active-backup miimon 100
57
58	for i in $(seq 0 2); do
59		ip -n ${s_ns} link add eth${i} type veth peer name s${i} netns ${g_ns}
60
61		ip -n ${g_ns} link set s${i} up
62		ip -n ${g_ns} link set s${i} master br0
63		ip -n ${s_ns} link set eth${i} master bond0
64	done
65
66	ip -n ${s_ns} link set bond0 up
67	ip -n ${s_ns} addr add ${s_ip4}/24 dev bond0
68	ip -n ${s_ns} addr add ${s_ip6}/24 dev bond0
69	sleep 2
70}
71
72# Reset bond with new mode and options
73bond_reset()
74{
75	local param="$1"
76
77	ip -n ${s_ns} link set bond0 down
78	ip -n ${s_ns} link del bond0
79
80	ip -n ${s_ns} link add bond0 type bond $param
81	for i in $(seq 0 2); do
82		ip -n ${s_ns} link set eth$i master bond0
83	done
84
85	ip -n ${s_ns} link set bond0 up
86	ip -n ${s_ns} addr add ${s_ip4}/24 dev bond0
87	ip -n ${s_ns} addr add ${s_ip6}/24 dev bond0
88	sleep 2
89}
90
91server_destroy()
92{
93	for i in $(seq 0 2); do
94		ip -n ${s_ns} link del eth${i}
95	done
96	ip netns del ${s_ns}
97}
98
99client_create()
100{
101	ip netns add ${c_ns}
102	ip -n ${c_ns} link add eth0 type veth peer name c0 netns ${g_ns}
103
104	ip -n ${g_ns} link set c0 up
105	ip -n ${g_ns} link set c0 master br0
106
107	ip -n ${c_ns} link set eth0 up
108	ip -n ${c_ns} addr add ${c_ip4}/24 dev eth0
109	ip -n ${c_ns} addr add ${c_ip6}/24 dev eth0
110}
111
112client_destroy()
113{
114	ip -n ${c_ns} link del eth0
115	ip netns del ${c_ns}
116}
117
118setup_prepare()
119{
120	gateway_create
121	server_create
122	client_create
123}
124
125cleanup()
126{
127	pre_cleanup
128
129	client_destroy
130	server_destroy
131	gateway_destroy
132}
133
134bond_check_connection()
135{
136	local msg=${1:-"check connection"}
137
138	sleep 2
139	ip netns exec ${s_ns} ping ${c_ip4} -c5 -i 0.1 &>/dev/null
140	check_err $? "${msg}: ping failed"
141	ip netns exec ${s_ns} ping6 ${c_ip6} -c5 -i 0.1 &>/dev/null
142	check_err $? "${msg}: ping6 failed"
143}
144