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" 42mac[0]="00:0a:0b:0c:0d:01" 43mac[1]="00:0a:0b:0c:0d:02" 44 45gateway_create() 46{ 47 ip netns add ${g_ns} 48 ip -n ${g_ns} link add br0 type bridge 49 ip -n ${g_ns} link set br0 up 50 ip -n ${g_ns} addr add ${g_ip4}/24 dev br0 51 ip -n ${g_ns} addr add ${g_ip6}/24 dev br0 52} 53 54gateway_destroy() 55{ 56 ip -n ${g_ns} link del br0 57 ip netns del ${g_ns} 58} 59 60server_create() 61{ 62 ip netns add ${s_ns} 63 ip -n ${s_ns} link add bond0 type bond mode active-backup miimon 100 64 65 for i in $(seq 0 1); do 66 ip -n ${s_ns} link add eth${i} type veth peer name s${i} netns ${g_ns} 67 ip -n "${s_ns}" link set "eth${i}" addr "${mac[$i]}" 68 69 ip -n ${g_ns} link set s${i} up 70 ip -n ${g_ns} link set s${i} master br0 71 ip -n ${s_ns} link set eth${i} master bond0 72 73 tc -n ${g_ns} qdisc add dev s${i} clsact 74 done 75 76 ip -n ${s_ns} link set bond0 up 77 ip -n ${s_ns} addr add ${s_ip4}/24 dev bond0 78 ip -n ${s_ns} addr add ${s_ip6}/24 dev bond0 79} 80 81# Reset bond with new mode and options 82bond_reset() 83{ 84 # Count the eth link number in real-time as this function 85 # maybe called from other topologies. 86 local link_num=$(ip -n ${s_ns} -br link show | grep -c "^eth") 87 local param="$1" 88 link_num=$((link_num -1)) 89 90 ip -n ${s_ns} link set bond0 down 91 ip -n ${s_ns} link del bond0 92 93 ip -n ${s_ns} link add bond0 type bond $param 94 for i in $(seq 0 ${link_num}); do 95 ip -n ${s_ns} link set eth$i master bond0 96 done 97 98 ip -n ${s_ns} link set bond0 up 99 ip -n ${s_ns} addr add ${s_ip4}/24 dev bond0 100 ip -n ${s_ns} addr add ${s_ip6}/24 dev bond0 101 # Wait for IPv6 address ready as it needs DAD 102 slowwait 2 ip netns exec ${s_ns} ping6 ${c_ip6} -c 1 -W 0.1 &> /dev/null 103} 104 105server_destroy() 106{ 107 # Count the eth link number in real-time as this function 108 # maybe called from other topologies. 109 local link_num=$(ip -n ${s_ns} -br link show | grep -c "^eth") 110 link_num=$((link_num -1)) 111 for i in $(seq 0 ${link_num}); do 112 ip -n ${s_ns} link del eth${i} 113 done 114 ip netns del ${s_ns} 115} 116 117client_create() 118{ 119 ip netns add ${c_ns} 120 ip -n ${c_ns} link add eth0 type veth peer name c0 netns ${g_ns} 121 122 ip -n ${g_ns} link set c0 up 123 ip -n ${g_ns} link set c0 master br0 124 125 ip -n ${c_ns} link set eth0 up 126 ip -n ${c_ns} addr add ${c_ip4}/24 dev eth0 127 ip -n ${c_ns} addr add ${c_ip6}/24 dev eth0 128} 129 130client_destroy() 131{ 132 ip -n ${c_ns} link del eth0 133 ip netns del ${c_ns} 134} 135 136setup_prepare() 137{ 138 gateway_create 139 server_create 140 client_create 141} 142 143cleanup() 144{ 145 pre_cleanup 146 147 client_destroy 148 server_destroy 149 gateway_destroy 150} 151 152bond_check_connection() 153{ 154 local msg=${1:-"check connection"} 155 156 slowwait 2 ip netns exec ${s_ns} ping ${c_ip4} -c 1 -W 0.1 &> /dev/null 157 ip netns exec ${s_ns} ping ${c_ip4} -c5 -i 0.1 &>/dev/null 158 check_err $? "${msg}: ping failed" 159 ip netns exec ${s_ns} ping6 ${c_ip6} -c5 -i 0.1 &>/dev/null 160 check_err $? "${msg}: ping6 failed" 161} 162