Commit c53cb00f authored by Guillaume Nault's avatar Guillaume Nault Committed by Paolo Abeni

selftests/net: l2_tos_ttl_inherit.sh: Run tests in their own netns.

This selftest currently runs half in the current namespace and half in
a netns of its own. Therefore, the test can fail if the current
namespace is already configured with incompatible parameters (for
example if it already has a veth0 interface).

Adapt the script to put both ends of the veth pair in their own netns.
Now veth0 is created in NS0 instead of the current namespace, while
veth1 is set up in NS1 (instead of the 'testing' netns).

The user visible netns names are randomised to minimise the risk of
conflicts with already existing namespaces. The cleanup() function
doesn't need to remove the virtual interface anymore: deleting NS0 and
NS1 automatically removes the virtual interfaces they contained.

We can remove $ns, which was only used to run ip commands in the
'testing' netns (let's use the builtin "-netns" option instead).
However, we still need a similar functionality as ping and tcpdump
now need to run in NS0. So we now have $RUN_NS0 for that.

Fixes: b690842d ("selftests/net: test l2 tunnel TOS/TTL inheriting")
Reported-by: default avatarMirsad Goran Todorovac <mirsad.todorovac@alu.unizg.hr>
Tested-by: default avatarMirsad Goran Todorovac <mirsad.todorovac@alu.unizg.hr>
Signed-off-by: default avatarGuillaume Nault <gnault@redhat.com>
Signed-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
parent e59370b2
......@@ -25,6 +25,11 @@ expected_tos="0x00"
expected_ttl="0"
failed=false
readonly NS0=$(mktemp -u ns0-XXXXXXXX)
readonly NS1=$(mktemp -u ns1-XXXXXXXX)
RUN_NS0="ip netns exec ${NS0}"
get_random_tos() {
# Get a random hex tos value between 0x00 and 0xfc, a multiple of 4
echo "0x$(tr -dc '0-9a-f' < /dev/urandom | head -c 1)\
......@@ -61,7 +66,6 @@ setup() {
local vlan="$5"
local test_tos="0x00"
local test_ttl="0"
local ns="ip netns exec testing"
# We don't want a test-tos of 0x00,
# because this is the value that we get when no tos is set.
......@@ -94,14 +98,15 @@ setup() {
printf "│%7s │%6s │%6s │%13s │%13s │%6s │" \
"$type" "$outer" "$inner" "$tos" "$ttl" "$vlan"
# Create 'testing' netns, veth pair and connect main ns with testing ns
ip netns add testing
ip link add type veth
ip link set veth1 netns testing
ip link set veth0 up
$ns ip link set veth1 up
ip addr flush dev veth0
$ns ip addr flush dev veth1
# Create netns NS0 and NS1 and connect them with a veth pair
ip netns add "${NS0}"
ip netns add "${NS1}"
ip link add name veth0 netns "${NS0}" type veth \
peer name veth1 netns "${NS1}"
ip -netns "${NS0}" link set dev veth0 up
ip -netns "${NS1}" link set dev veth1 up
ip -netns "${NS0}" address flush dev veth0
ip -netns "${NS1}" address flush dev veth1
local local_addr1=""
local local_addr2=""
......@@ -127,51 +132,59 @@ setup() {
if [ "$type" = "gre" ]; then
type="gretap"
fi
ip addr add 198.18.0.1/24 dev veth0
$ns ip addr add 198.18.0.2/24 dev veth1
ip link add name tep0 type $type $local_addr1 remote \
198.18.0.2 tos $test_tos ttl $test_ttl $vxlan $geneve
$ns ip link add name tep1 type $type $local_addr2 remote \
198.18.0.1 tos $test_tos ttl $test_ttl $vxlan $geneve
ip -netns "${NS0}" address add 198.18.0.1/24 dev veth0
ip -netns "${NS1}" address add 198.18.0.2/24 dev veth1
ip -netns "${NS0}" link add name tep0 type $type $local_addr1 \
remote 198.18.0.2 tos $test_tos ttl $test_ttl \
$vxlan $geneve
ip -netns "${NS1}" link add name tep1 type $type $local_addr2 \
remote 198.18.0.1 tos $test_tos ttl $test_ttl \
$vxlan $geneve
elif [ "$outer" = "6" ]; then
if [ "$type" = "gre" ]; then
type="ip6gretap"
fi
ip addr add fdd1:ced0:5d88:3fce::1/64 dev veth0 nodad
$ns ip addr add fdd1:ced0:5d88:3fce::2/64 dev veth1 nodad
ip link add name tep0 type $type $local_addr1 \
remote fdd1:ced0:5d88:3fce::2 tos $test_tos ttl $test_ttl \
$vxlan $geneve
$ns ip link add name tep1 type $type $local_addr2 \
remote fdd1:ced0:5d88:3fce::1 tos $test_tos ttl $test_ttl \
$vxlan $geneve
ip -netns "${NS0}" address add fdd1:ced0:5d88:3fce::1/64 \
dev veth0 nodad
ip -netns "${NS1}" address add fdd1:ced0:5d88:3fce::2/64 \
dev veth1 nodad
ip -netns "${NS0}" link add name tep0 type $type $local_addr1 \
remote fdd1:ced0:5d88:3fce::2 tos $test_tos \
ttl $test_ttl $vxlan $geneve
ip -netns "${NS1}" link add name tep1 type $type $local_addr2 \
remote fdd1:ced0:5d88:3fce::1 tos $test_tos \
ttl $test_ttl $vxlan $geneve
fi
# Bring L2-tunnel link up and create VLAN on top
ip link set tep0 up
$ns ip link set tep1 up
ip addr flush dev tep0
$ns ip addr flush dev tep1
ip -netns "${NS0}" link set tep0 up
ip -netns "${NS1}" link set tep1 up
ip -netns "${NS0}" address flush dev tep0
ip -netns "${NS1}" address flush dev tep1
local parent
if $vlan; then
parent="vlan99-"
ip link add link tep0 name ${parent}0 type vlan id 99
$ns ip link add link tep1 name ${parent}1 type vlan id 99
ip link set ${parent}0 up
$ns ip link set ${parent}1 up
ip addr flush dev ${parent}0
$ns ip addr flush dev ${parent}1
ip -netns "${NS0}" link add link tep0 name ${parent}0 \
type vlan id 99
ip -netns "${NS1}" link add link tep1 name ${parent}1 \
type vlan id 99
ip -netns "${NS0}" link set dev ${parent}0 up
ip -netns "${NS1}" link set dev ${parent}1 up
ip -netns "${NS0}" address flush dev ${parent}0
ip -netns "${NS1}" address flush dev ${parent}1
else
parent="tep"
fi
# Assign inner IPv4/IPv6 addresses
if [ "$inner" = "4" ] || [ "$inner" = "other" ]; then
ip addr add 198.19.0.1/24 brd + dev ${parent}0
$ns ip addr add 198.19.0.2/24 brd + dev ${parent}1
ip -netns "${NS0}" address add 198.19.0.1/24 brd + dev ${parent}0
ip -netns "${NS1}" address add 198.19.0.2/24 brd + dev ${parent}1
elif [ "$inner" = "6" ]; then
ip addr add fdd4:96cf:4eae:443b::1/64 dev ${parent}0 nodad
$ns ip addr add fdd4:96cf:4eae:443b::2/64 dev ${parent}1 nodad
ip -netns "${NS0}" address add fdd4:96cf:4eae:443b::1/64 \
dev ${parent}0 nodad
ip -netns "${NS1}" address add fdd4:96cf:4eae:443b::2/64 \
dev ${parent}1 nodad
fi
}
......@@ -192,10 +205,10 @@ verify() {
ping_dst="198.19.0.3" # Generates ARPs which are not IPv4/IPv6
fi
if [ "$tos_ttl" = "inherit" ]; then
ping -i 0.1 $ping_dst -Q "$expected_tos" -t "$expected_ttl" \
2>/dev/null 1>&2 & ping_pid="$!"
${RUN_NS0} ping -i 0.1 $ping_dst -Q "$expected_tos" \
-t "$expected_ttl" 2>/dev/null 1>&2 & ping_pid="$!"
else
ping -i 0.1 $ping_dst 2>/dev/null 1>&2 & ping_pid="$!"
${RUN_NS0} ping -i 0.1 $ping_dst 2>/dev/null 1>&2 & ping_pid="$!"
fi
local tunnel_type_offset tunnel_type_proto req_proto_offset req_offset
if [ "$type" = "gre" ]; then
......@@ -216,10 +229,12 @@ verify() {
req_proto_offset="$((req_proto_offset + 4))"
req_offset="$((req_offset + 4))"
fi
out="$(tcpdump --immediate-mode -p -c 1 -v -i veth0 -n \
out="$(${RUN_NS0} tcpdump --immediate-mode -p -c 1 -v \
-i veth0 -n \
ip[$tunnel_type_offset] = $tunnel_type_proto and \
ip[$req_proto_offset] = 0x01 and \
ip[$req_offset] = 0x08 2>/dev/null | head -n 1)"
ip[$req_offset] = 0x08 2>/dev/null \
| head -n 1)"
elif [ "$inner" = "6" ]; then
req_proto_offset="44"
req_offset="78"
......@@ -231,10 +246,12 @@ verify() {
req_proto_offset="$((req_proto_offset + 4))"
req_offset="$((req_offset + 4))"
fi
out="$(tcpdump --immediate-mode -p -c 1 -v -i veth0 -n \
out="$(${RUN_NS0} tcpdump --immediate-mode -p -c 1 -v \
-i veth0 -n \
ip[$tunnel_type_offset] = $tunnel_type_proto and \
ip[$req_proto_offset] = 0x3a and \
ip[$req_offset] = 0x80 2>/dev/null | head -n 1)"
ip[$req_offset] = 0x80 2>/dev/null \
| head -n 1)"
elif [ "$inner" = "other" ]; then
req_proto_offset="36"
req_offset="45"
......@@ -250,11 +267,13 @@ verify() {
expected_tos="0x00"
expected_ttl="64"
fi
out="$(tcpdump --immediate-mode -p -c 1 -v -i veth0 -n \
out="$(${RUN_NS0} tcpdump --immediate-mode -p -c 1 -v \
-i veth0 -n \
ip[$tunnel_type_offset] = $tunnel_type_proto and \
ip[$req_proto_offset] = 0x08 and \
ip[$((req_proto_offset + 1))] = 0x06 and \
ip[$req_offset] = 0x01 2>/dev/null | head -n 1)"
ip[$req_offset] = 0x01 2>/dev/null \
| head -n 1)"
fi
elif [ "$outer" = "6" ]; then
if [ "$type" = "gre" ]; then
......@@ -273,10 +292,12 @@ verify() {
req_proto_offset="$((req_proto_offset + 4))"
req_offset="$((req_offset + 4))"
fi
out="$(tcpdump --immediate-mode -p -c 1 -v -i veth0 -n \
out="$(${RUN_NS0} tcpdump --immediate-mode -p -c 1 -v \
-i veth0 -n \
ip6[$tunnel_type_offset] = $tunnel_type_proto and \
ip6[$req_proto_offset] = 0x01 and \
ip6[$req_offset] = 0x08 2>/dev/null | head -n 1)"
ip6[$req_offset] = 0x08 2>/dev/null \
| head -n 1)"
elif [ "$inner" = "6" ]; then
local req_proto_offset="72"
local req_offset="106"
......@@ -288,10 +309,12 @@ verify() {
req_proto_offset="$((req_proto_offset + 4))"
req_offset="$((req_offset + 4))"
fi
out="$(tcpdump --immediate-mode -p -c 1 -v -i veth0 -n \
out="$(${RUN_NS0} tcpdump --immediate-mode -p -c 1 -v \
-i veth0 -n \
ip6[$tunnel_type_offset] = $tunnel_type_proto and \
ip6[$req_proto_offset] = 0x3a and \
ip6[$req_offset] = 0x80 2>/dev/null | head -n 1)"
ip6[$req_offset] = 0x80 2>/dev/null \
| head -n 1)"
elif [ "$inner" = "other" ]; then
local req_proto_offset="64"
local req_offset="73"
......@@ -307,11 +330,13 @@ verify() {
expected_tos="0x00"
expected_ttl="64"
fi
out="$(tcpdump --immediate-mode -p -c 1 -v -i veth0 -n \
out="$(${RUN_NS0} tcpdump --immediate-mode -p -c 1 -v \
-i veth0 -n \
ip6[$tunnel_type_offset] = $tunnel_type_proto and \
ip6[$req_proto_offset] = 0x08 and \
ip6[$((req_proto_offset + 1))] = 0x06 and \
ip6[$req_offset] = 0x01 2>/dev/null | head -n 1)"
ip6[$req_offset] = 0x01 2>/dev/null \
| head -n 1)"
fi
fi
kill -9 $ping_pid
......@@ -351,9 +376,8 @@ verify() {
}
cleanup() {
ip link del veth0 2>/dev/null
ip netns del testing 2>/dev/null
ip link del tep0 2>/dev/null
ip netns del "${NS0}" 2>/dev/null
ip netns del "${NS1}" 2>/dev/null
}
printf "┌────────┬───────┬───────┬──────────────┬"
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment