-
Notifications
You must be signed in to change notification settings - Fork 10
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge branch 'mlxsw-handle-mtu-values'
Petr Machata says: ==================== mlxsw: Handle MTU values Amit Cohen writes: The driver uses two values for maximum MTU, but neither is accurate. In addition, the value which is configured to hardware is not calculated correctly. Handle these issues and expose accurate values for minimum and maximum MTU per netdevice. Add test cases to check that the exposed values are really supported. Patch set overview: Patches #1-#3 set the driver to use accurate values for MTU Patch #4 aligns the driver to always use the same value for maximum MTU Patch #5 adds a test ==================== Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Jakub Kicinski <[email protected]>
- Loading branch information
Showing
6 changed files
with
295 additions
and
32 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,283 @@ | ||
#!/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 |