284 lines
4.7 KiB
Bash
Executable File
284 lines
4.7 KiB
Bash
Executable File
#!/bin/bash
|
|
# SPDX-License-Identifier: GPL-2.0
|
|
|
|
# +--------------------+
|
|
# | H1 |
|
|
# | |
|
|
# | $h1.10 + |
|
|
# | 192.0.2.2/24 | |
|
|
# | 2001:db8:1::2/64 | |
|
|
# | | |
|
|
# | $h1 + |
|
|
# | | |
|
|
# +------------------|-+
|
|
# |
|
|
# +------------------|-+
|
|
# | SW | |
|
|
# | $swp1 + |
|
|
# | | |
|
|
# | $swp1.10 + |
|
|
# | 192.0.2.1/24 |
|
|
# | 2001:db8:1::1/64 |
|
|
# | |
|
|
# +--------------------+
|
|
|
|
ALL_TESTS="
|
|
ping_ipv4
|
|
ping_ipv6
|
|
max_mtu_config_test
|
|
max_mtu_traffic_test
|
|
min_mtu_config_test
|
|
min_mtu_traffic_test
|
|
"
|
|
|
|
NUM_NETIFS=2
|
|
source lib.sh
|
|
|
|
h1_create()
|
|
{
|
|
simple_if_init $h1
|
|
vlan_create $h1 10 v$h1 192.0.2.2/24 2001:db8:1::2/64
|
|
}
|
|
|
|
h1_destroy()
|
|
{
|
|
vlan_destroy $h1 10 192.0.2.2/24 2001:db8:1::2/64
|
|
simple_if_fini $h1
|
|
}
|
|
|
|
switch_create()
|
|
{
|
|
ip li set dev $swp1 up
|
|
vlan_create $swp1 10 "" 192.0.2.1/24 2001:db8:1::1/64
|
|
}
|
|
|
|
switch_destroy()
|
|
{
|
|
ip li set dev $swp1 down
|
|
vlan_destroy $swp1 10
|
|
}
|
|
|
|
setup_prepare()
|
|
{
|
|
h1=${NETIFS[p1]}
|
|
swp1=${NETIFS[p2]}
|
|
|
|
vrf_prepare
|
|
|
|
h1_create
|
|
|
|
switch_create
|
|
|
|
forwarding_enable
|
|
}
|
|
|
|
cleanup()
|
|
{
|
|
pre_cleanup
|
|
|
|
forwarding_restore
|
|
|
|
switch_destroy
|
|
|
|
h1_destroy
|
|
|
|
vrf_cleanup
|
|
}
|
|
|
|
ping_ipv4()
|
|
{
|
|
ping_test $h1.10 192.0.2.1
|
|
}
|
|
|
|
ping_ipv6()
|
|
{
|
|
ping6_test $h1.10 2001:db8:1::1
|
|
}
|
|
|
|
min_max_mtu_get_if()
|
|
{
|
|
local dev=$1; shift
|
|
local min_max=$1; shift
|
|
|
|
ip -d -j link show $dev | jq ".[].$min_max"
|
|
}
|
|
|
|
ensure_compatible_min_max_mtu()
|
|
{
|
|
local min_max=$1; shift
|
|
|
|
local mtu=$(min_max_mtu_get_if ${NETIFS[p1]} $min_max)
|
|
local i
|
|
|
|
for ((i = 2; i <= NUM_NETIFS; ++i)); do
|
|
local current_mtu=$(min_max_mtu_get_if ${NETIFS[p$i]} $min_max)
|
|
|
|
if [ $current_mtu -ne $mtu ]; then
|
|
return 1
|
|
fi
|
|
done
|
|
}
|
|
|
|
mtu_set_if()
|
|
{
|
|
local dev=$1; shift
|
|
local mtu=$1; shift
|
|
local should_fail=${1:-0}; shift
|
|
|
|
mtu_set $dev $mtu 2>/dev/null
|
|
check_err_fail $should_fail $? "Set MTU $mtu for $dev"
|
|
}
|
|
|
|
mtu_set_all_if()
|
|
{
|
|
local mtu=$1; shift
|
|
local i
|
|
|
|
for ((i = 1; i <= NUM_NETIFS; ++i)); do
|
|
mtu_set_if ${NETIFS[p$i]} $mtu
|
|
mtu_set_if ${NETIFS[p$i]}.10 $mtu
|
|
done
|
|
}
|
|
|
|
mtu_restore_all_if()
|
|
{
|
|
local i
|
|
|
|
for ((i = 1; i <= NUM_NETIFS; ++i)); do
|
|
mtu_restore ${NETIFS[p$i]}.10
|
|
mtu_restore ${NETIFS[p$i]}
|
|
done
|
|
}
|
|
|
|
mtu_test_ping4()
|
|
{
|
|
local mtu=$1; shift
|
|
local should_fail=$1; shift
|
|
|
|
# Ping adds 8 bytes for ICMP header and 20 bytes for IP header
|
|
local ping_headers_len=$((20 + 8))
|
|
local pkt_size=$((mtu - ping_headers_len))
|
|
|
|
ping_do $h1.10 192.0.2.1 "-s $pkt_size -M do"
|
|
check_err_fail $should_fail $? "Ping, packet size: $pkt_size"
|
|
}
|
|
|
|
mtu_test_ping6()
|
|
{
|
|
local mtu=$1; shift
|
|
local should_fail=$1; shift
|
|
|
|
# Ping adds 8 bytes for ICMP header and 40 bytes for IPv6 header
|
|
local ping6_headers_len=$((40 + 8))
|
|
local pkt_size=$((mtu - ping6_headers_len))
|
|
|
|
ping6_do $h1.10 2001:db8:1::1 "-s $pkt_size -M do"
|
|
check_err_fail $should_fail $? "Ping6, packet size: $pkt_size"
|
|
}
|
|
|
|
max_mtu_config_test()
|
|
{
|
|
local i
|
|
|
|
RET=0
|
|
|
|
for ((i = 1; i <= NUM_NETIFS; ++i)); do
|
|
local dev=${NETIFS[p$i]}
|
|
local max_mtu=$(min_max_mtu_get_if $dev "max_mtu")
|
|
local should_fail
|
|
|
|
should_fail=0
|
|
mtu_set_if $dev $max_mtu $should_fail
|
|
mtu_restore $dev
|
|
|
|
should_fail=1
|
|
mtu_set_if $dev $((max_mtu + 1)) $should_fail
|
|
mtu_restore $dev
|
|
done
|
|
|
|
log_test "Test maximum MTU configuration"
|
|
}
|
|
|
|
max_mtu_traffic_test()
|
|
{
|
|
local should_fail
|
|
local max_mtu
|
|
|
|
RET=0
|
|
|
|
if ! ensure_compatible_min_max_mtu "max_mtu"; then
|
|
log_test_xfail "Topology has incompatible maximum MTU values"
|
|
return
|
|
fi
|
|
|
|
max_mtu=$(min_max_mtu_get_if ${NETIFS[p1]} "max_mtu")
|
|
|
|
should_fail=0
|
|
mtu_set_all_if $max_mtu
|
|
mtu_test_ping4 $max_mtu $should_fail
|
|
mtu_test_ping6 $max_mtu $should_fail
|
|
mtu_restore_all_if
|
|
|
|
should_fail=1
|
|
mtu_set_all_if $((max_mtu - 1))
|
|
mtu_test_ping4 $max_mtu $should_fail
|
|
mtu_test_ping6 $max_mtu $should_fail
|
|
mtu_restore_all_if
|
|
|
|
log_test "Test traffic, packet size is maximum MTU"
|
|
}
|
|
|
|
min_mtu_config_test()
|
|
{
|
|
local i
|
|
|
|
RET=0
|
|
|
|
for ((i = 1; i <= NUM_NETIFS; ++i)); do
|
|
local dev=${NETIFS[p$i]}
|
|
local min_mtu=$(min_max_mtu_get_if $dev "min_mtu")
|
|
local should_fail
|
|
|
|
should_fail=0
|
|
mtu_set_if $dev $min_mtu $should_fail
|
|
mtu_restore $dev
|
|
|
|
should_fail=1
|
|
mtu_set_if $dev $((min_mtu - 1)) $should_fail
|
|
mtu_restore $dev
|
|
done
|
|
|
|
log_test "Test minimum MTU configuration"
|
|
}
|
|
|
|
min_mtu_traffic_test()
|
|
{
|
|
local should_fail=0
|
|
local min_mtu
|
|
|
|
RET=0
|
|
|
|
if ! ensure_compatible_min_max_mtu "min_mtu"; then
|
|
log_test_xfail "Topology has incompatible minimum MTU values"
|
|
return
|
|
fi
|
|
|
|
min_mtu=$(min_max_mtu_get_if ${NETIFS[p1]} "min_mtu")
|
|
mtu_set_all_if $min_mtu
|
|
mtu_test_ping4 $min_mtu $should_fail
|
|
# Do not test minimum MTU with IPv6, as IPv6 requires higher MTU.
|
|
|
|
mtu_restore_all_if
|
|
|
|
log_test "Test traffic, packet size is minimum MTU"
|
|
}
|
|
|
|
trap cleanup EXIT
|
|
|
|
setup_prepare
|
|
setup_wait
|
|
|
|
tests_run
|
|
|
|
exit $EXIT_STATUS
|