Skip to content

Commit b6a6006

Browse files
Guillaume Naultkuba-moo
authored andcommitted
selftests: Add IPv6 link-local address generation tests for GRE devices.
GRE devices have their special code for IPv6 link-local address generation that has been the source of several regressions in the past. Add selftest to check that all gre, ip6gre, gretap and ip6gretap get an IPv6 link-link local address in accordance with the net.ipv6.conf.<dev>.addr_gen_mode sysctl. Note: This patch was originally applied as commit 6f50175 ("selftests: Add IPv6 link-local address generation tests for GRE devices."). However, it was then reverted by commit 355d940 ("Revert "selftests: Add IPv6 link-local address generation tests for GRE devices."") because the commit it depended on was going to be reverted. Now that the situation is resolved, we can add this selftest again (no changes since original patch, appart from context update in tools/testing/selftests/net/Makefile). Signed-off-by: Guillaume Nault <gnault@redhat.com> Reviewed-by: Ido Schimmel <idosch@nvidia.com> Tested-by: Ido Schimmel <idosch@nvidia.com> Link: https://patch.msgid.link/2c3a5733cb3a6e3119504361a9b9f89fda570a2d.1746225214.git.gnault@redhat.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
1 parent 3e6a024 commit b6a6006

2 files changed

Lines changed: 178 additions & 0 deletions

File tree

tools/testing/selftests/net/Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ TEST_PROGS += veth.sh
3131
TEST_PROGS += ioam6.sh
3232
TEST_PROGS += gro.sh
3333
TEST_PROGS += gre_gso.sh
34+
TEST_PROGS += gre_ipv6_lladdr.sh
3435
TEST_PROGS += cmsg_so_mark.sh
3536
TEST_PROGS += cmsg_so_priority.sh
3637
TEST_PROGS += test_so_rcv.sh
Lines changed: 177 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,177 @@
1+
#!/bin/bash
2+
# SPDX-License-Identifier: GPL-2.0
3+
4+
source ./lib.sh
5+
6+
PAUSE_ON_FAIL="no"
7+
8+
# The trap function handler
9+
#
10+
exit_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+
#
20+
setup_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 if network device has an IPv6 link-local address assigned.
28+
#
29+
# Parameters:
30+
#
31+
# * $1: The network device to test
32+
# * $2: An extra regular expression that should be matched (to verify the
33+
# presence of extra attributes)
34+
# * $3: The expected return code from grep (to allow checking the absence of
35+
# a link-local address)
36+
# * $4: The user visible name for the scenario being tested
37+
#
38+
check_ipv6_ll_addr()
39+
{
40+
local DEV="$1"
41+
local EXTRA_MATCH="$2"
42+
local XRET="$3"
43+
local MSG="$4"
44+
45+
RET=0
46+
set +e
47+
ip -netns "${NS0}" -6 address show dev "${DEV}" scope link | grep "fe80::" | grep -q "${EXTRA_MATCH}"
48+
check_err_fail "${XRET}" $? ""
49+
log_test "${MSG}"
50+
set -e
51+
}
52+
53+
# Create a GRE device and verify that it gets an IPv6 link-local address as
54+
# expected.
55+
#
56+
# Parameters:
57+
#
58+
# * $1: The device type (gre, ip6gre, gretap or ip6gretap)
59+
# * $2: The local underlay IP address (can be an IPv4, an IPv6 or "any")
60+
# * $3: The remote underlay IP address (can be an IPv4, an IPv6 or "any")
61+
# * $4: The IPv6 interface identifier generation mode to use for the GRE
62+
# device (eui64, none, stable-privacy or random).
63+
#
64+
test_gre_device()
65+
{
66+
local GRE_TYPE="$1"
67+
local LOCAL_IP="$2"
68+
local REMOTE_IP="$3"
69+
local MODE="$4"
70+
local ADDR_GEN_MODE
71+
local MATCH_REGEXP
72+
local MSG
73+
74+
ip link add netns "${NS0}" name gretest type "${GRE_TYPE}" local "${LOCAL_IP}" remote "${REMOTE_IP}"
75+
76+
case "${MODE}" in
77+
"eui64")
78+
ADDR_GEN_MODE=0
79+
MATCH_REGEXP=""
80+
MSG="${GRE_TYPE}, mode: 0 (EUI64), ${LOCAL_IP} -> ${REMOTE_IP}"
81+
XRET=0
82+
;;
83+
"none")
84+
ADDR_GEN_MODE=1
85+
MATCH_REGEXP=""
86+
MSG="${GRE_TYPE}, mode: 1 (none), ${LOCAL_IP} -> ${REMOTE_IP}"
87+
XRET=1 # No link-local address should be generated
88+
;;
89+
"stable-privacy")
90+
ADDR_GEN_MODE=2
91+
MATCH_REGEXP="stable-privacy"
92+
MSG="${GRE_TYPE}, mode: 2 (stable privacy), ${LOCAL_IP} -> ${REMOTE_IP}"
93+
XRET=0
94+
# Initialise stable_secret (required for stable-privacy mode)
95+
ip netns exec "${NS0}" sysctl -qw net.ipv6.conf.gretest.stable_secret="2001:db8::abcd"
96+
;;
97+
"random")
98+
ADDR_GEN_MODE=3
99+
MATCH_REGEXP="stable-privacy"
100+
MSG="${GRE_TYPE}, mode: 3 (random), ${LOCAL_IP} -> ${REMOTE_IP}"
101+
XRET=0
102+
;;
103+
esac
104+
105+
# Check that IPv6 link-local address is generated when device goes up
106+
ip netns exec "${NS0}" sysctl -qw net.ipv6.conf.gretest.addr_gen_mode="${ADDR_GEN_MODE}"
107+
ip -netns "${NS0}" link set dev gretest up
108+
check_ipv6_ll_addr gretest "${MATCH_REGEXP}" "${XRET}" "config: ${MSG}"
109+
110+
# Now disable link-local address generation
111+
ip -netns "${NS0}" link set dev gretest down
112+
ip netns exec "${NS0}" sysctl -qw net.ipv6.conf.gretest.addr_gen_mode=1
113+
ip -netns "${NS0}" link set dev gretest up
114+
115+
# Check that link-local address generation works when re-enabled while
116+
# the device is already up
117+
ip netns exec "${NS0}" sysctl -qw net.ipv6.conf.gretest.addr_gen_mode="${ADDR_GEN_MODE}"
118+
check_ipv6_ll_addr gretest "${MATCH_REGEXP}" "${XRET}" "update: ${MSG}"
119+
120+
ip -netns "${NS0}" link del dev gretest
121+
}
122+
123+
test_gre4()
124+
{
125+
local GRE_TYPE
126+
local MODE
127+
128+
for GRE_TYPE in "gre" "gretap"; do
129+
printf "\n####\nTesting IPv6 link-local address generation on ${GRE_TYPE} devices\n####\n\n"
130+
131+
for MODE in "eui64" "none" "stable-privacy" "random"; do
132+
test_gre_device "${GRE_TYPE}" 192.0.2.10 192.0.2.11 "${MODE}"
133+
test_gre_device "${GRE_TYPE}" any 192.0.2.11 "${MODE}"
134+
test_gre_device "${GRE_TYPE}" 192.0.2.10 any "${MODE}"
135+
done
136+
done
137+
}
138+
139+
test_gre6()
140+
{
141+
local GRE_TYPE
142+
local MODE
143+
144+
for GRE_TYPE in "ip6gre" "ip6gretap"; do
145+
printf "\n####\nTesting IPv6 link-local address generation on ${GRE_TYPE} devices\n####\n\n"
146+
147+
for MODE in "eui64" "none" "stable-privacy" "random"; do
148+
test_gre_device "${GRE_TYPE}" 2001:db8::10 2001:db8::11 "${MODE}"
149+
test_gre_device "${GRE_TYPE}" any 2001:db8::11 "${MODE}"
150+
test_gre_device "${GRE_TYPE}" 2001:db8::10 any "${MODE}"
151+
done
152+
done
153+
}
154+
155+
usage()
156+
{
157+
echo "Usage: $0 [-p]"
158+
exit 1
159+
}
160+
161+
while getopts :p o
162+
do
163+
case $o in
164+
p) PAUSE_ON_FAIL="yes";;
165+
*) usage;;
166+
esac
167+
done
168+
169+
setup_ns NS0
170+
171+
set -e
172+
trap exit_cleanup_all EXIT
173+
174+
setup_basenet
175+
176+
test_gre4
177+
test_gre6

0 commit comments

Comments
 (0)