#!/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