File Index
Files and directories
Sign in
FILE

gre_ipv6_lladdr.sh

File preview with syntax highlighting.

linux-6.19.14/tools/testing/selftests/net/gre_ipv6_lladdr.sh BASH
  1#!/bin/bash
  2# SPDX-License-Identifier: GPL-2.0
  3
  4source ./lib.sh
  5
  6PAUSE_ON_FAIL="no"
  7
  8# The trap function handler
  9#
 10exit_cleanup_all()
 11{
 12	cleanup_all_ns
 13
 14	exit "${EXIT_STATUS}"
 15}
 16
 17# Add fake IPv4 and IPv6 networks on the loopback device, to be used as
 18# underlay by future GRE devices.
 19#
 20setup_basenet()
 21{
 22	ip -netns "${NS0}" link set dev lo up
 23	ip -netns "${NS0}" address add dev lo 192.0.2.10/24
 24	ip -netns "${NS0}" address add dev lo 2001:db8::10/64 nodad
 25}
 26
 27# Check the IPv6 configuration of a network device.
 28#
 29# We currently check the generation of the link-local IPv6 address and the
 30# creation of the ff00::/8 multicast route.
 31#
 32# Parameters:
 33#
 34#   * $1: The network device to test
 35#   * $2: An extra regular expression that should be matched (to verify the
 36#         presence of extra attributes)
 37#   * $3: The expected return code from grep (to allow checking the absence of
 38#         a link-local address)
 39#   * $4: The user visible name for the scenario being tested
 40#
 41check_ipv6_device_config()
 42{
 43	local DEV="$1"
 44	local EXTRA_MATCH="$2"
 45	local XRET="$3"
 46	local MSG="$4"
 47
 48	RET=0
 49	set +e
 50	ip -netns "${NS0}" -6 address show dev "${DEV}" scope link | grep "fe80::" | grep -q "${EXTRA_MATCH}"
 51	check_err_fail "${XRET}" $? "IPv6 link-local address generation"
 52
 53	ip -netns "${NS0}" -6 route show table local type multicast ff00::/8 proto kernel | grep -q "${DEV}"
 54	check_err_fail 0 $? "IPv6 multicast route creation"
 55
 56	log_test "${MSG}"
 57	set -e
 58}
 59
 60# Create a GRE device and verify that it gets an IPv6 link-local address as
 61# expected.
 62#
 63# Parameters:
 64#
 65#   * $1: The device type (gre, ip6gre, gretap or ip6gretap)
 66#   * $2: The local underlay IP address (can be an IPv4, an IPv6 or "any")
 67#   * $3: The remote underlay IP address (can be an IPv4, an IPv6 or "any")
 68#   * $4: The IPv6 interface identifier generation mode to use for the GRE
 69#         device (eui64, none, stable-privacy or random).
 70#
 71test_gre_device()
 72{
 73	local GRE_TYPE="$1"
 74	local LOCAL_IP="$2"
 75	local REMOTE_IP="$3"
 76	local MODE="$4"
 77	local ADDR_GEN_MODE
 78	local MATCH_REGEXP
 79	local MSG
 80
 81	ip link add netns "${NS0}" name gretest type "${GRE_TYPE}" local "${LOCAL_IP}" remote "${REMOTE_IP}"
 82
 83	case "${MODE}" in
 84	    "eui64")
 85		ADDR_GEN_MODE=0
 86		MATCH_REGEXP=""
 87		MSG="${GRE_TYPE}, mode: 0 (EUI64), ${LOCAL_IP} -> ${REMOTE_IP}"
 88		XRET=0
 89		;;
 90	    "none")
 91		ADDR_GEN_MODE=1
 92		MATCH_REGEXP=""
 93		MSG="${GRE_TYPE}, mode: 1 (none), ${LOCAL_IP} -> ${REMOTE_IP}"
 94		XRET=1 # No link-local address should be generated
 95		;;
 96	    "stable-privacy")
 97		ADDR_GEN_MODE=2
 98		MATCH_REGEXP="stable-privacy"
 99		MSG="${GRE_TYPE}, mode: 2 (stable privacy), ${LOCAL_IP} -> ${REMOTE_IP}"
100		XRET=0
101		# Initialise stable_secret (required for stable-privacy mode)
102		ip netns exec "${NS0}" sysctl -qw net.ipv6.conf.gretest.stable_secret="2001:db8::abcd"
103		;;
104	    "random")
105		ADDR_GEN_MODE=3
106		MATCH_REGEXP="stable-privacy"
107		MSG="${GRE_TYPE}, mode: 3 (random), ${LOCAL_IP} -> ${REMOTE_IP}"
108		XRET=0
109		;;
110	esac
111
112	# Check the IPv6 device configuration when it goes up
113	ip netns exec "${NS0}" sysctl -qw net.ipv6.conf.gretest.addr_gen_mode="${ADDR_GEN_MODE}"
114	ip -netns "${NS0}" link set dev gretest up
115	check_ipv6_device_config gretest "${MATCH_REGEXP}" "${XRET}" "config: ${MSG}"
116
117	# Now disable link-local address generation
118	ip -netns "${NS0}" link set dev gretest down
119	ip netns exec "${NS0}" sysctl -qw net.ipv6.conf.gretest.addr_gen_mode=1
120	ip -netns "${NS0}" link set dev gretest up
121
122	# Check the IPv6 device configuration when link-local address
123	# generation is re-enabled while the device is already up
124	ip netns exec "${NS0}" sysctl -qw net.ipv6.conf.gretest.addr_gen_mode="${ADDR_GEN_MODE}"
125	check_ipv6_device_config gretest "${MATCH_REGEXP}" "${XRET}" "update: ${MSG}"
126
127	ip -netns "${NS0}" link del dev gretest
128}
129
130test_gre4()
131{
132	local GRE_TYPE
133	local MODE
134
135	for GRE_TYPE in "gre" "gretap"; do
136		printf "\n####\nTesting IPv6 configuration of ${GRE_TYPE} devices\n####\n\n"
137
138		for MODE in "eui64" "none" "stable-privacy" "random"; do
139			test_gre_device "${GRE_TYPE}" 192.0.2.10 192.0.2.11 "${MODE}"
140			test_gre_device "${GRE_TYPE}" any 192.0.2.11 "${MODE}"
141			test_gre_device "${GRE_TYPE}" 192.0.2.10 any "${MODE}"
142		done
143	done
144}
145
146test_gre6()
147{
148	local GRE_TYPE
149	local MODE
150
151	for GRE_TYPE in "ip6gre" "ip6gretap"; do
152		printf "\n####\nTesting IPv6 configuration of ${GRE_TYPE} devices\n####\n\n"
153
154		for MODE in "eui64" "none" "stable-privacy" "random"; do
155			test_gre_device "${GRE_TYPE}" 2001:db8::10 2001:db8::11 "${MODE}"
156			test_gre_device "${GRE_TYPE}" any 2001:db8::11 "${MODE}"
157			test_gre_device "${GRE_TYPE}" 2001:db8::10 any "${MODE}"
158		done
159	done
160}
161
162usage()
163{
164	echo "Usage: $0 [-p]"
165	exit 1
166}
167
168while getopts :p o
169do
170	case $o in
171		p) PAUSE_ON_FAIL="yes";;
172		*) usage;;
173	esac
174done
175
176setup_ns NS0
177
178set -e
179trap exit_cleanup_all EXIT
180
181setup_basenet
182
183test_gre4
184test_gre6
~/ Read-only file preview.