1#!/bin/bash 2# SPDX-License-Identifier: GPL-2.0 3 4# +--------------------+ 5# | H1 | 6# | | 7# | $h1.10 + | 8# | 192.0.2.2/24 | | 9# | 2001:db8:1::2/64 | | 10# | | | 11# | $h1 + | 12# | | | 13# +------------------|-+ 14# | 15# +------------------|-+ 16# | SW | | 17# | $swp1 + | 18# | | | 19# | $swp1.10 + | 20# | 192.0.2.1/24 | 21# | 2001:db8:1::1/64 | 22# | | 23# +--------------------+ 24 25ALL_TESTS=" 26 ping_ipv4 27 ping_ipv6 28 max_mtu_config_test 29 max_mtu_traffic_test 30 min_mtu_config_test 31 min_mtu_traffic_test 32" 33 34NUM_NETIFS=2 35source lib.sh 36 37h1_create() 38{ 39 simple_if_init $h1 40 vlan_create $h1 10 v$h1 192.0.2.2/24 2001:db8:1::2/64 41} 42 43h1_destroy() 44{ 45 vlan_destroy $h1 10 192.0.2.2/24 2001:db8:1::2/64 46 simple_if_fini $h1 47} 48 49switch_create() 50{ 51 ip li set dev $swp1 up 52 vlan_create $swp1 10 "" 192.0.2.1/24 2001:db8:1::1/64 53} 54 55switch_destroy() 56{ 57 ip li set dev $swp1 down 58 vlan_destroy $swp1 10 59} 60 61setup_prepare() 62{ 63 h1=${NETIFS[p1]} 64 swp1=${NETIFS[p2]} 65 66 vrf_prepare 67 68 h1_create 69 70 switch_create 71 72 forwarding_enable 73} 74 75cleanup() 76{ 77 pre_cleanup 78 79 forwarding_restore 80 81 switch_destroy 82 83 h1_destroy 84 85 vrf_cleanup 86} 87 88ping_ipv4() 89{ 90 ping_test $h1.10 192.0.2.1 91} 92 93ping_ipv6() 94{ 95 ping6_test $h1.10 2001:db8:1::1 96} 97 98min_max_mtu_get_if() 99{ 100 local dev=$1; shift 101 local min_max=$1; shift 102 103 ip -d -j link show $dev | jq ".[].$min_max" 104} 105 106ensure_compatible_min_max_mtu() 107{ 108 local min_max=$1; shift 109 110 local mtu=$(min_max_mtu_get_if ${NETIFS[p1]} $min_max) 111 local i 112 113 for ((i = 2; i <= NUM_NETIFS; ++i)); do 114 local current_mtu=$(min_max_mtu_get_if ${NETIFS[p$i]} $min_max) 115 116 if [ $current_mtu -ne $mtu ]; then 117 return 1 118 fi 119 done 120} 121 122mtu_set_if() 123{ 124 local dev=$1; shift 125 local mtu=$1; shift 126 local should_fail=${1:-0}; shift 127 128 mtu_set $dev $mtu 2>/dev/null 129 check_err_fail $should_fail $? "Set MTU $mtu for $dev" 130} 131 132mtu_set_all_if() 133{ 134 local mtu=$1; shift 135 local i 136 137 for ((i = 1; i <= NUM_NETIFS; ++i)); do 138 mtu_set_if ${NETIFS[p$i]} $mtu 139 mtu_set_if ${NETIFS[p$i]}.10 $mtu 140 done 141} 142 143mtu_restore_all_if() 144{ 145 local i 146 147 for ((i = 1; i <= NUM_NETIFS; ++i)); do 148 mtu_restore ${NETIFS[p$i]}.10 149 mtu_restore ${NETIFS[p$i]} 150 done 151} 152 153mtu_test_ping4() 154{ 155 local mtu=$1; shift 156 local should_fail=$1; shift 157 158 # Ping adds 8 bytes for ICMP header and 20 bytes for IP header 159 local ping_headers_len=$((20 + 8)) 160 local pkt_size=$((mtu - ping_headers_len)) 161 162 ping_do $h1.10 192.0.2.1 "-s $pkt_size -M do" 163 check_err_fail $should_fail $? "Ping, packet size: $pkt_size" 164} 165 166mtu_test_ping6() 167{ 168 local mtu=$1; shift 169 local should_fail=$1; shift 170 171 # Ping adds 8 bytes for ICMP header and 40 bytes for IPv6 header 172 local ping6_headers_len=$((40 + 8)) 173 local pkt_size=$((mtu - ping6_headers_len)) 174 175 ping6_do $h1.10 2001:db8:1::1 "-s $pkt_size -M do" 176 check_err_fail $should_fail $? "Ping6, packet size: $pkt_size" 177} 178 179max_mtu_config_test() 180{ 181 local i 182 183 RET=0 184 185 for ((i = 1; i <= NUM_NETIFS; ++i)); do 186 local dev=${NETIFS[p$i]} 187 local max_mtu=$(min_max_mtu_get_if $dev "max_mtu") 188 local should_fail 189 190 should_fail=0 191 mtu_set_if $dev $max_mtu $should_fail 192 mtu_restore $dev 193 194 should_fail=1 195 mtu_set_if $dev $((max_mtu + 1)) $should_fail 196 mtu_restore $dev 197 done 198 199 log_test "Test maximum MTU configuration" 200} 201 202max_mtu_traffic_test() 203{ 204 local should_fail 205 local max_mtu 206 207 RET=0 208 209 if ! ensure_compatible_min_max_mtu "max_mtu"; then 210 log_test_xfail "Topology has incompatible maximum MTU values" 211 return 212 fi 213 214 max_mtu=$(min_max_mtu_get_if ${NETIFS[p1]} "max_mtu") 215 216 should_fail=0 217 mtu_set_all_if $max_mtu 218 mtu_test_ping4 $max_mtu $should_fail 219 mtu_test_ping6 $max_mtu $should_fail 220 mtu_restore_all_if 221 222 should_fail=1 223 mtu_set_all_if $((max_mtu - 1)) 224 mtu_test_ping4 $max_mtu $should_fail 225 mtu_test_ping6 $max_mtu $should_fail 226 mtu_restore_all_if 227 228 log_test "Test traffic, packet size is maximum MTU" 229} 230 231min_mtu_config_test() 232{ 233 local i 234 235 RET=0 236 237 for ((i = 1; i <= NUM_NETIFS; ++i)); do 238 local dev=${NETIFS[p$i]} 239 local min_mtu=$(min_max_mtu_get_if $dev "min_mtu") 240 local should_fail 241 242 should_fail=0 243 mtu_set_if $dev $min_mtu $should_fail 244 mtu_restore $dev 245 246 should_fail=1 247 mtu_set_if $dev $((min_mtu - 1)) $should_fail 248 mtu_restore $dev 249 done 250 251 log_test "Test minimum MTU configuration" 252} 253 254min_mtu_traffic_test() 255{ 256 local should_fail=0 257 local min_mtu 258 259 RET=0 260 261 if ! ensure_compatible_min_max_mtu "min_mtu"; then 262 log_test_xfail "Topology has incompatible minimum MTU values" 263 return 264 fi 265 266 min_mtu=$(min_max_mtu_get_if ${NETIFS[p1]} "min_mtu") 267 mtu_set_all_if $min_mtu 268 mtu_test_ping4 $min_mtu $should_fail 269 # Do not test minimum MTU with IPv6, as IPv6 requires higher MTU. 270 271 mtu_restore_all_if 272 273 log_test "Test traffic, packet size is minimum MTU" 274} 275 276trap cleanup EXIT 277 278setup_prepare 279setup_wait 280 281tests_run 282 283exit $EXIT_STATUS 284