Commit b66c9b8d authored by Lourdes Pedrajas's avatar Lourdes Pedrajas Committed by David S. Miller

selftests: pmtu: implement IPIP, SIT and ip6tnl PMTU discovery tests

Add PMTU discovery tests for these encapsulations:

- IPIP
- SIT, mode ip6ip
- ip6tnl, modes ip6ip6 and ipip6
Signed-off-by: default avatarLourdes Pedrajas <lu@pplo.net>
Reviewed-by: default avatarStefano Brivio <sbrivio@redhat.com>
Reviewed-by: default avatarDavid Ahern <dsahern@gmail.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent cceadc83
...@@ -67,6 +67,10 @@ ...@@ -67,6 +67,10 @@
# Same as pmtu_ipv4_vxlan4, but using a generic UDP IPv4/IPv6 # Same as pmtu_ipv4_vxlan4, but using a generic UDP IPv4/IPv6
# encapsulation (GUE) over IPv4/IPv6, instead of VXLAN # encapsulation (GUE) over IPv4/IPv6, instead of VXLAN
# #
# - pmtu_ipv{4,6}_ipv{4,6}_exception
# Same as pmtu_ipv4_vxlan4, but using a IPv4/IPv6 tunnel over IPv4/IPv6,
# instead of VXLAN
#
# - pmtu_vti4_exception # - pmtu_vti4_exception
# Set up vti tunnel on top of veth, with xfrm states and policies, in two # Set up vti tunnel on top of veth, with xfrm states and policies, in two
# namespaces with matching endpoints. Check that route exception is not # namespaces with matching endpoints. Check that route exception is not
...@@ -151,6 +155,10 @@ tests=" ...@@ -151,6 +155,10 @@ tests="
pmtu_ipv6_gue4_exception IPv6 over gue4: PMTU exceptions 1 pmtu_ipv6_gue4_exception IPv6 over gue4: PMTU exceptions 1
pmtu_ipv4_gue6_exception IPv4 over gue6: PMTU exceptions 1 pmtu_ipv4_gue6_exception IPv4 over gue6: PMTU exceptions 1
pmtu_ipv6_gue6_exception IPv6 over gue6: PMTU exceptions 1 pmtu_ipv6_gue6_exception IPv6 over gue6: PMTU exceptions 1
pmtu_ipv4_ipv4_exception IPv4 over IPv4: PMTU exceptions 1
pmtu_ipv6_ipv4_exception IPv6 over IPv4: PMTU exceptions 1
pmtu_ipv4_ipv6_exception IPv4 over IPv6: PMTU exceptions 1
pmtu_ipv6_ipv6_exception IPv6 over IPv6: PMTU exceptions 1
pmtu_vti6_exception vti6: PMTU exceptions 0 pmtu_vti6_exception vti6: PMTU exceptions 0
pmtu_vti4_exception vti4: PMTU exceptions 0 pmtu_vti4_exception vti4: PMTU exceptions 0
pmtu_vti4_default_mtu vti4: default MTU assignment 0 pmtu_vti4_default_mtu vti4: default MTU assignment 0
...@@ -363,6 +371,62 @@ setup_gue66() { ...@@ -363,6 +371,62 @@ setup_gue66() {
setup_fou_or_gue 6 6 gue setup_fou_or_gue 6 6 gue
} }
setup_ipvX_over_ipvY() {
inner=${1}
outer=${2}
if [ "${outer}" -eq 4 ]; then
a_addr="${prefix4}.${a_r1}.1"
b_addr="${prefix4}.${b_r1}.1"
if [ "${inner}" -eq 4 ]; then
type="ipip"
mode="ipip"
else
type="sit"
mode="ip6ip"
fi
else
a_addr="${prefix6}:${a_r1}::1"
b_addr="${prefix6}:${b_r1}::1"
type="ip6tnl"
if [ "${inner}" -eq 4 ]; then
mode="ipip6"
else
mode="ip6ip6"
fi
fi
run_cmd ${ns_a} ip link add ip_a type ${type} local ${a_addr} remote ${b_addr} mode ${mode} || return 2
run_cmd ${ns_b} ip link add ip_b type ${type} local ${b_addr} remote ${a_addr} mode ${mode}
run_cmd ${ns_a} ip link set ip_a up
run_cmd ${ns_b} ip link set ip_b up
if [ "${inner}" = "4" ]; then
run_cmd ${ns_a} ip addr add ${tunnel4_a_addr}/${tunnel4_mask} dev ip_a
run_cmd ${ns_b} ip addr add ${tunnel4_b_addr}/${tunnel4_mask} dev ip_b
else
run_cmd ${ns_a} ip addr add ${tunnel6_a_addr}/${tunnel6_mask} dev ip_a
run_cmd ${ns_b} ip addr add ${tunnel6_b_addr}/${tunnel6_mask} dev ip_b
fi
}
setup_ip4ip4() {
setup_ipvX_over_ipvY 4 4
}
setup_ip6ip4() {
setup_ipvX_over_ipvY 6 4
}
setup_ip4ip6() {
setup_ipvX_over_ipvY 4 6
}
setup_ip6ip6() {
setup_ipvX_over_ipvY 6 6
}
setup_namespaces() { setup_namespaces() {
for n in ${NS_A} ${NS_B} ${NS_R1} ${NS_R2}; do for n in ${NS_A} ${NS_B} ${NS_R1} ${NS_R2}; do
ip netns add ${n} || return 1 ip netns add ${n} || return 1
...@@ -908,6 +972,64 @@ test_pmtu_ipv6_gue6_exception() { ...@@ -908,6 +972,64 @@ test_pmtu_ipv6_gue6_exception() {
test_pmtu_ipvX_over_fouY_or_gueY 6 6 gue test_pmtu_ipvX_over_fouY_or_gueY 6 6 gue
} }
test_pmtu_ipvX_over_ipvY_exception() {
inner=${1}
outer=${2}
ll_mtu=4000
setup namespaces routing ip${inner}ip${outer} || return 2
trace "${ns_a}" ip_a "${ns_b}" ip_b \
"${ns_a}" veth_A-R1 "${ns_r1}" veth_R1-A \
"${ns_b}" veth_B-R1 "${ns_r1}" veth_R1-B
if [ ${inner} -eq 4 ]; then
ping=ping
dst=${tunnel4_b_addr}
else
ping=${ping6}
dst=${tunnel6_b_addr}
fi
if [ ${outer} -eq 4 ]; then
# IPv4 header
exp_mtu=$((${ll_mtu} - 20))
else
# IPv6 header Option 4
exp_mtu=$((${ll_mtu} - 40 - 8))
fi
# Create route exception by exceeding link layer MTU
mtu "${ns_a}" veth_A-R1 $((${ll_mtu} + 1000))
mtu "${ns_r1}" veth_R1-A $((${ll_mtu} + 1000))
mtu "${ns_b}" veth_B-R1 ${ll_mtu}
mtu "${ns_r1}" veth_R1-B ${ll_mtu}
mtu "${ns_a}" ip_a $((${ll_mtu} + 1000)) || return
mtu "${ns_b}" ip_b $((${ll_mtu} + 1000)) || return
run_cmd ${ns_a} ${ping} -q -M want -i 0.1 -w 1 -s $((${ll_mtu} + 500)) ${dst}
# Check that exception was created
pmtu="$(route_get_dst_pmtu_from_exception "${ns_a}" ${dst})"
check_pmtu_value ${exp_mtu} "${pmtu}" "exceeding link layer MTU on ip${inner}ip${outer} interface"
}
test_pmtu_ipv4_ipv4_exception() {
test_pmtu_ipvX_over_ipvY_exception 4 4
}
test_pmtu_ipv6_ipv4_exception() {
test_pmtu_ipvX_over_ipvY_exception 6 4
}
test_pmtu_ipv4_ipv6_exception() {
test_pmtu_ipvX_over_ipvY_exception 4 6
}
test_pmtu_ipv6_ipv6_exception() {
test_pmtu_ipvX_over_ipvY_exception 6 6
}
test_pmtu_vti4_exception() { test_pmtu_vti4_exception() {
setup namespaces veth vti4 xfrm4 || return 2 setup namespaces veth vti4 xfrm4 || return 2
trace "${ns_a}" veth_a "${ns_b}" veth_b \ trace "${ns_a}" veth_a "${ns_b}" veth_b \
......
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