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