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} 159