Linux kernel mirror (for testing)
git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel
os
linux
1#!/bin/bash
2# SPDX-License-Identifier: GPL-2.0
3#
4# Topology for Bond mode 1,5,6 testing
5#
6# +-------------------------+
7# | bond0 | Server
8# | + | 192.0.2.1/24
9# | eth0 | eth1 | 2001:db8::1/24
10# | +---+---+ |
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
28REQUIRE_MZ=no
29NUM_NETIFS=0
30lib_dir=$(dirname "$0")
31source "$lib_dir"/../../../net/forwarding/lib.sh
32
33s_ns="s-$(mktemp -u XXXXXX)"
34c_ns="c-$(mktemp -u XXXXXX)"
35g_ns="g-$(mktemp -u XXXXXX)"
36s_ip4="192.0.2.1"
37c_ip4="192.0.2.10"
38g_ip4="192.0.2.254"
39s_ip6="2001:db8::1"
40c_ip6="2001:db8::10"
41g_ip6="2001:db8::254"
42
43gateway_create()
44{
45 ip netns add ${g_ns}
46 ip -n ${g_ns} link add br0 type bridge
47 ip -n ${g_ns} link set br0 up
48 ip -n ${g_ns} addr add ${g_ip4}/24 dev br0
49 ip -n ${g_ns} addr add ${g_ip6}/24 dev br0
50}
51
52gateway_destroy()
53{
54 ip -n ${g_ns} link del br0
55 ip netns del ${g_ns}
56}
57
58server_create()
59{
60 ip netns add ${s_ns}
61 ip -n ${s_ns} link add bond0 type bond mode active-backup miimon 100
62
63 for i in $(seq 0 1); do
64 ip -n ${s_ns} link add eth${i} type veth peer name s${i} netns ${g_ns}
65
66 ip -n ${g_ns} link set s${i} up
67 ip -n ${g_ns} link set s${i} master br0
68 ip -n ${s_ns} link set eth${i} master bond0
69
70 tc -n ${g_ns} qdisc add dev s${i} clsact
71 done
72
73 ip -n ${s_ns} link set bond0 up
74 ip -n ${s_ns} addr add ${s_ip4}/24 dev bond0
75 ip -n ${s_ns} addr add ${s_ip6}/24 dev bond0
76}
77
78# Reset bond with new mode and options
79bond_reset()
80{
81 # Count the eth link number in real-time as this function
82 # maybe called from other topologies.
83 local link_num=$(ip -n ${s_ns} -br link show | grep -c "^eth")
84 local param="$1"
85 link_num=$((link_num -1))
86
87 ip -n ${s_ns} link set bond0 down
88 ip -n ${s_ns} link del bond0
89
90 ip -n ${s_ns} link add bond0 type bond $param
91 for i in $(seq 0 ${link_num}); do
92 ip -n ${s_ns} link set eth$i master bond0
93 done
94
95 ip -n ${s_ns} link set bond0 up
96 ip -n ${s_ns} addr add ${s_ip4}/24 dev bond0
97 ip -n ${s_ns} addr add ${s_ip6}/24 dev bond0
98 # Wait for IPv6 address ready as it needs DAD
99 slowwait 2 ip netns exec ${s_ns} ping6 ${c_ip6} -c 1 -W 0.1 &> /dev/null
100}
101
102server_destroy()
103{
104 # Count the eth link number in real-time as this function
105 # maybe called from other topologies.
106 local link_num=$(ip -n ${s_ns} -br link show | grep -c "^eth")
107 link_num=$((link_num -1))
108 for i in $(seq 0 ${link_num}); do
109 ip -n ${s_ns} link del eth${i}
110 done
111 ip netns del ${s_ns}
112}
113
114client_create()
115{
116 ip netns add ${c_ns}
117 ip -n ${c_ns} link add eth0 type veth peer name c0 netns ${g_ns}
118
119 ip -n ${g_ns} link set c0 up
120 ip -n ${g_ns} link set c0 master br0
121
122 ip -n ${c_ns} link set eth0 up
123 ip -n ${c_ns} addr add ${c_ip4}/24 dev eth0
124 ip -n ${c_ns} addr add ${c_ip6}/24 dev eth0
125}
126
127client_destroy()
128{
129 ip -n ${c_ns} link del eth0
130 ip netns del ${c_ns}
131}
132
133setup_prepare()
134{
135 gateway_create
136 server_create
137 client_create
138}
139
140cleanup()
141{
142 pre_cleanup
143
144 client_destroy
145 server_destroy
146 gateway_destroy
147}
148
149bond_check_connection()
150{
151 local msg=${1:-"check connection"}
152
153 slowwait 2 ip netns exec ${s_ns} ping ${c_ip4} -c 1 -W 0.1 &> /dev/null
154 ip netns exec ${s_ns} ping ${c_ip4} -c5 -i 0.1 &>/dev/null
155 check_err $? "${msg}: ping failed"
156 ip netns exec ${s_ns} ping6 ${c_ip6} -c5 -i 0.1 &>/dev/null
157 check_err $? "${msg}: ping6 failed"
158}