Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

selftests: add amt interface selftest script

This is selftest script for amt interface.
This script includes basic forwarding scenarion and torture scenario.

Signed-off-by: Taehee Yoo <ap420073@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Taehee Yoo and committed by
David S. Miller
c08e8bae b75f7095

+286
+1
tools/testing/selftests/net/Makefile
··· 22 22 TEST_PROGS += drop_monitor_tests.sh 23 23 TEST_PROGS += vrf_route_leaking.sh 24 24 TEST_PROGS += bareudp.sh 25 + TEST_PROGS += amt.sh 25 26 TEST_PROGS += unicast_extensions.sh 26 27 TEST_PROGS += udpgro_fwd.sh 27 28 TEST_PROGS += veth.sh
+284
tools/testing/selftests/net/amt.sh
··· 1 + #!/bin/sh 2 + # SPDX-License-Identifier: GPL-2.0 3 + 4 + # Author: Taehee Yoo <ap420073@gmail.com> 5 + # 6 + # This script evaluates the AMT driver. 7 + # There are four network-namespaces, LISTENER, SOURCE, GATEWAY, RELAY. 8 + # The role of LISTENER is to listen multicast traffic. 9 + # In order to do that, it send IGMP group join message. 10 + # The role of SOURCE is to send multicast traffic to listener. 11 + # The role of GATEWAY is to work Gateway role of AMT interface. 12 + # The role of RELAY is to work Relay role of AMT interface. 13 + # 14 + # 15 + # +------------------------+ 16 + # | LISTENER netns | 17 + # | | 18 + # | +------------------+ | 19 + # | | l_gw | | 20 + # | | 192.168.0.2/24 | | 21 + # | | 2001:db8::2/64 | | 22 + # | +------------------+ | 23 + # | . | 24 + # +------------------------+ 25 + # . 26 + # . 27 + # +-----------------------------------------------------+ 28 + # | . GATEWAY netns | 29 + # | . | 30 + # |+---------------------------------------------------+| 31 + # || . br0 || 32 + # || +------------------+ +------------------+ || 33 + # || | gw_l | | amtg | || 34 + # || | 192.168.0.1/24 | +--------+---------+ || 35 + # || | 2001:db8::1/64 | | || 36 + # || +------------------+ | || 37 + # |+-------------------------------------|-------------+| 38 + # | | | 39 + # | +--------+---------+ | 40 + # | | gw_relay | | 41 + # | | 10.0.0.1/24 | | 42 + # | +------------------+ | 43 + # | . | 44 + # +-----------------------------------------------------+ 45 + # . 46 + # . 47 + # +-----------------------------------------------------+ 48 + # | RELAY netns . | 49 + # | +------------------+ | 50 + # | | relay_gw | | 51 + # | | 10.0.0.2/24 | | 52 + # | +--------+---------+ | 53 + # | | | 54 + # | | | 55 + # | +------------------+ +--------+---------+ | 56 + # | | relay_src | | amtr | | 57 + # | | 172.17.0.1/24 | +------------------+ | 58 + # | | 2001:db8:3::1/64 | | 59 + # | +------------------+ | 60 + # | . | 61 + # | . | 62 + # +-----------------------------------------------------+ 63 + # . 64 + # . 65 + # +------------------------+ 66 + # | . | 67 + # | +------------------+ | 68 + # | | src_relay | | 69 + # | | 172.17.0.2/24 | | 70 + # | | 2001:db8:3::2/64 | | 71 + # | +------------------+ | 72 + # | SOURCE netns | 73 + # +------------------------+ 74 + #============================================================================== 75 + 76 + readonly LISTENER=$(mktemp -u listener-XXXXXXXX) 77 + readonly GATEWAY=$(mktemp -u gateway-XXXXXXXX) 78 + readonly RELAY=$(mktemp -u relay-XXXXXXXX) 79 + readonly SOURCE=$(mktemp -u source-XXXXXXXX) 80 + ERR=4 81 + err=0 82 + 83 + exit_cleanup() 84 + { 85 + for ns in "$@"; do 86 + ip netns delete "${ns}" 2>/dev/null || true 87 + done 88 + 89 + exit $ERR 90 + } 91 + 92 + create_namespaces() 93 + { 94 + ip netns add "${LISTENER}" || exit_cleanup 95 + ip netns add "${GATEWAY}" || exit_cleanup "${LISTENER}" 96 + ip netns add "${RELAY}" || exit_cleanup "${LISTENER}" "${GATEWAY}" 97 + ip netns add "${SOURCE}" || exit_cleanup "${LISTENER}" "${GATEWAY}" \ 98 + "${RELAY}" 99 + } 100 + 101 + # The trap function handler 102 + # 103 + exit_cleanup_all() 104 + { 105 + exit_cleanup "${LISTENER}" "${GATEWAY}" "${RELAY}" "${SOURCE}" 106 + } 107 + 108 + setup_interface() 109 + { 110 + for ns in "${LISTENER}" "${GATEWAY}" "${RELAY}" "${SOURCE}"; do 111 + ip -netns "${ns}" link set dev lo up 112 + done; 113 + 114 + ip link add l_gw type veth peer name gw_l 115 + ip link add gw_relay type veth peer name relay_gw 116 + ip link add relay_src type veth peer name src_relay 117 + 118 + ip link set l_gw netns "${LISTENER}" up 119 + ip link set gw_l netns "${GATEWAY}" up 120 + ip link set gw_relay netns "${GATEWAY}" up 121 + ip link set relay_gw netns "${RELAY}" up 122 + ip link set relay_src netns "${RELAY}" up 123 + ip link set src_relay netns "${SOURCE}" up mtu 1400 124 + 125 + ip netns exec "${LISTENER}" ip a a 192.168.0.2/24 dev l_gw 126 + ip netns exec "${LISTENER}" ip r a default via 192.168.0.1 dev l_gw 127 + ip netns exec "${LISTENER}" ip a a 2001:db8::2/64 dev l_gw 128 + ip netns exec "${LISTENER}" ip r a default via 2001:db8::1 dev l_gw 129 + ip netns exec "${LISTENER}" ip a a 239.0.0.1/32 dev l_gw autojoin 130 + ip netns exec "${LISTENER}" ip a a ff0e::5:6/128 dev l_gw autojoin 131 + 132 + ip netns exec "${GATEWAY}" ip a a 192.168.0.1/24 dev gw_l 133 + ip netns exec "${GATEWAY}" ip a a 2001:db8::1/64 dev gw_l 134 + ip netns exec "${GATEWAY}" ip a a 10.0.0.1/24 dev gw_relay 135 + ip netns exec "${GATEWAY}" ip link add br0 type bridge 136 + ip netns exec "${GATEWAY}" ip link set br0 up 137 + ip netns exec "${GATEWAY}" ip link set gw_l master br0 138 + ip netns exec "${GATEWAY}" ip link set gw_l up 139 + ip netns exec "${GATEWAY}" ip link add amtg master br0 type amt \ 140 + mode gateway local 10.0.0.1 discovery 10.0.0.2 dev gw_relay \ 141 + gateway_port 2268 relay_port 2268 142 + ip netns exec "${RELAY}" ip a a 10.0.0.2/24 dev relay_gw 143 + ip netns exec "${RELAY}" ip link add amtr type amt mode relay \ 144 + local 10.0.0.2 dev relay_gw relay_port 2268 max_tunnels 4 145 + ip netns exec "${RELAY}" ip a a 172.17.0.1/24 dev relay_src 146 + ip netns exec "${RELAY}" ip a a 2001:db8:3::1/64 dev relay_src 147 + ip netns exec "${SOURCE}" ip a a 172.17.0.2/24 dev src_relay 148 + ip netns exec "${SOURCE}" ip a a 2001:db8:3::2/64 dev src_relay 149 + ip netns exec "${SOURCE}" ip r a default via 172.17.0.1 dev src_relay 150 + ip netns exec "${SOURCE}" ip r a default via 2001:db8:3::1 dev src_relay 151 + ip netns exec "${RELAY}" ip link set amtr up 152 + ip netns exec "${GATEWAY}" ip link set amtg up 153 + } 154 + 155 + setup_sysctl() 156 + { 157 + ip netns exec "${RELAY}" sysctl net.ipv4.ip_forward=1 -w -q 158 + } 159 + 160 + setup_iptables() 161 + { 162 + ip netns exec "${RELAY}" iptables -t mangle -I PREROUTING \ 163 + -d 239.0.0.1 -j TTL --ttl-set 2 164 + ip netns exec "${RELAY}" ip6tables -t mangle -I PREROUTING \ 165 + -j HL --hl-set 2 166 + } 167 + 168 + setup_mcast_routing() 169 + { 170 + ip netns exec "${RELAY}" smcrouted 171 + ip netns exec "${RELAY}" smcroutectl a relay_src \ 172 + 172.17.0.2 239.0.0.1 amtr 173 + ip netns exec "${RELAY}" smcroutectl a relay_src \ 174 + 2001:db8:3::2 ff0e::5:6 amtr 175 + } 176 + 177 + test_remote_ip() 178 + { 179 + REMOTE=$(ip netns exec "${GATEWAY}" \ 180 + ip -d -j link show amtg | jq .[0].linkinfo.info_data.remote) 181 + if [ $REMOTE == "\"10.0.0.2\"" ]; then 182 + printf "TEST: %-60s [ OK ]\n" "amt discovery" 183 + else 184 + printf "TEST: %-60s [FAIL]\n" "amt discovery" 185 + ERR=1 186 + fi 187 + } 188 + 189 + send_mcast_torture4() 190 + { 191 + ip netns exec "${SOURCE}" bash -c \ 192 + 'cat /dev/urandom | head -c 1G | nc -w 1 -u 239.0.0.1 4001' 193 + } 194 + 195 + 196 + send_mcast_torture6() 197 + { 198 + ip netns exec "${SOURCE}" bash -c \ 199 + 'cat /dev/urandom | head -c 1G | nc -w 1 -u ff0e::5:6 6001' 200 + } 201 + 202 + check_features() 203 + { 204 + ip link help 2>&1 | grep -q amt 205 + if [ $? -ne 0 ]; then 206 + echo "Missing amt support in iproute2" >&2 207 + exit_cleanup 208 + fi 209 + } 210 + 211 + test_ipv4_forward() 212 + { 213 + RESULT4=$(ip netns exec "${LISTENER}" nc -w 1 -l -u 239.0.0.1 4000) 214 + if [ "$RESULT4" == "172.17.0.2" ]; then 215 + printf "TEST: %-60s [ OK ]\n" "IPv4 amt multicast forwarding" 216 + exit 0 217 + else 218 + printf "TEST: %-60s [FAIL]\n" "IPv4 amt multicast forwarding" 219 + exit 1 220 + fi 221 + } 222 + 223 + test_ipv6_forward() 224 + { 225 + RESULT6=$(ip netns exec "${LISTENER}" nc -w 1 -l -u ff0e::5:6 6000) 226 + if [ "$RESULT6" == "2001:db8:3::2" ]; then 227 + printf "TEST: %-60s [ OK ]\n" "IPv6 amt multicast forwarding" 228 + exit 0 229 + else 230 + printf "TEST: %-60s [FAIL]\n" "IPv6 amt multicast forwarding" 231 + exit 1 232 + fi 233 + } 234 + 235 + send_mcast4() 236 + { 237 + sleep 2 238 + ip netns exec "${SOURCE}" bash -c \ 239 + 'echo 172.17.0.2 | nc -w 1 -u 239.0.0.1 4000' & 240 + } 241 + 242 + send_mcast6() 243 + { 244 + sleep 2 245 + ip netns exec "${SOURCE}" bash -c \ 246 + 'echo 2001:db8:3::2 | nc -w 1 -u ff0e::5:6 6000' & 247 + } 248 + 249 + check_features 250 + 251 + create_namespaces 252 + 253 + set -e 254 + trap exit_cleanup_all EXIT 255 + 256 + setup_interface 257 + setup_sysctl 258 + setup_iptables 259 + setup_mcast_routing 260 + test_remote_ip 261 + test_ipv4_forward & 262 + pid=$! 263 + send_mcast4 264 + wait $pid || err=$? 265 + if [ $err -eq 1 ]; then 266 + ERR=1 267 + fi 268 + test_ipv6_forward & 269 + pid=$! 270 + send_mcast6 271 + wait $pid || err=$? 272 + if [ $err -eq 1 ]; then 273 + ERR=1 274 + fi 275 + send_mcast_torture4 276 + printf "TEST: %-60s [ OK ]\n" "IPv4 amt traffic forwarding torture" 277 + send_mcast_torture6 278 + printf "TEST: %-60s [ OK ]\n" "IPv6 amt traffic forwarding torture" 279 + sleep 5 280 + if [ "${ERR}" -eq 1 ]; then 281 + echo "Some tests failed." >&2 282 + else 283 + ERR=0 284 + fi
+1
tools/testing/selftests/net/config
··· 44 44 CONFIG_BAREUDP=m 45 45 CONFIG_IPV6_IOAM6_LWTUNNEL=y 46 46 CONFIG_CRYPTO_SM4=y 47 + CONFIG_AMT=m