1*40146bf7SPaolo Abeni#!/bin/bash 2*40146bf7SPaolo Abeni# SPDX-License-Identifier: GPL-2.0 3*40146bf7SPaolo Abeni 4*40146bf7SPaolo Abenisource lib.sh 5*40146bf7SPaolo Abeni 6*40146bf7SPaolo Abeni# shellcheck disable=SC2155 # prefer RO variable over return value from cmd 7*40146bf7SPaolo Abenireadonly CLI="$(dirname "$(readlink -f "$0")")/../../../net/ynl/pyynl/cli.py" 8*40146bf7SPaolo Abeni 9*40146bf7SPaolo Abenireadonly SRC=1 10*40146bf7SPaolo Abenireadonly DST=2 11*40146bf7SPaolo Abeni 12*40146bf7SPaolo Abenireadonly NET_V4=192.168.1. 13*40146bf7SPaolo Abenireadonly NET_V6=2001:db8:: 14*40146bf7SPaolo Abenireadonly OL1_NET_V4=172.16.1. 15*40146bf7SPaolo Abenireadonly OL1_NET_V6=2001:db8:1:: 16*40146bf7SPaolo Abenireadonly OL2_NET_V4=172.16.2. 17*40146bf7SPaolo Abenireadonly OL2_NET_V6=2001:db8:2:: 18*40146bf7SPaolo Abeni 19*40146bf7SPaolo Abenitrap cleanup_all_ns EXIT 20*40146bf7SPaolo Abeni 21*40146bf7SPaolo Abeni# shellcheck disable=SC2329 # can't figure out usage trough a variable 22*40146bf7SPaolo Abeniis_ipv6() { 23*40146bf7SPaolo Abeni if [[ $1 =~ .*:.* ]]; then 24*40146bf7SPaolo Abeni return 0 25*40146bf7SPaolo Abeni fi 26*40146bf7SPaolo Abeni return 1 27*40146bf7SPaolo Abeni} 28*40146bf7SPaolo Abeni 29*40146bf7SPaolo Abeni# shellcheck disable=SC2329 # can't figure out usage trough a variable 30*40146bf7SPaolo Abenicreate_gnv_endpoint() { 31*40146bf7SPaolo Abeni local -r netns=$1 32*40146bf7SPaolo Abeni local -r bm_rem_addr=$2 33*40146bf7SPaolo Abeni local -r gnv_dev=$3 34*40146bf7SPaolo Abeni local -r gnv_id=$4 35*40146bf7SPaolo Abeni local opts=$5 36*40146bf7SPaolo Abeni local gnv_json 37*40146bf7SPaolo Abeni local rem 38*40146bf7SPaolo Abeni 39*40146bf7SPaolo Abeni if is_ipv6 "$bm_rem_addr"; then 40*40146bf7SPaolo Abeni rem=remote6 41*40146bf7SPaolo Abeni else 42*40146bf7SPaolo Abeni rem=remote 43*40146bf7SPaolo Abeni fi 44*40146bf7SPaolo Abeni 45*40146bf7SPaolo Abeni # add ynl opt separator, if needed 46*40146bf7SPaolo Abeni [ -n "$opts" ] && opts=", $opts" 47*40146bf7SPaolo Abeni 48*40146bf7SPaolo Abeni gnv_json="{ \"id\": $gnv_id, \"$rem\": \"$bm_rem_addr\"$opts }" 49*40146bf7SPaolo Abeni ip netns exec "$netns" "$CLI" --family rt-link --create --excl \ 50*40146bf7SPaolo Abeni --do newlink --json "{\"ifname\": \"$gnv_dev\", 51*40146bf7SPaolo Abeni \"linkinfo\": {\"kind\":\"geneve\", 52*40146bf7SPaolo Abeni \"data\": $gnv_json } }" > /dev/null 53*40146bf7SPaolo Abeni ip -n "$netns" link set dev "$gnv_dev" up 54*40146bf7SPaolo Abeni} 55*40146bf7SPaolo Abeni 56*40146bf7SPaolo Abeni# shellcheck disable=SC2329 # can't figure out usage trough a variable 57*40146bf7SPaolo Abenicreate_vxlan_endpoint() { 58*40146bf7SPaolo Abeni local -r netns=$1 59*40146bf7SPaolo Abeni local -r bm_rem_addr=$2 60*40146bf7SPaolo Abeni local -r vxlan_dev=$3 61*40146bf7SPaolo Abeni local -r vxlan_id=$4 62*40146bf7SPaolo Abeni local -r opts_str=$5 63*40146bf7SPaolo Abeni local oldifs 64*40146bf7SPaolo Abeni local -a opts 65*40146bf7SPaolo Abeni local opt 66*40146bf7SPaolo Abeni 67*40146bf7SPaolo Abeni # convert the arguments from yaml format 68*40146bf7SPaolo Abeni oldifs=$IFS 69*40146bf7SPaolo Abeni IFS=',' 70*40146bf7SPaolo Abeni for opt in $opts_str; do 71*40146bf7SPaolo Abeni local pattern='"port":' 72*40146bf7SPaolo Abeni 73*40146bf7SPaolo Abeni [ -n "$opt" ] || continue 74*40146bf7SPaolo Abeni 75*40146bf7SPaolo Abeni opts+=("${opt/$pattern*/dstport}" "${opt/$pattern/}") 76*40146bf7SPaolo Abeni done 77*40146bf7SPaolo Abeni IFS=$oldifs 78*40146bf7SPaolo Abeni [ ${#opts[@]} -gt 0 ] || opts+=("dstport" "4789") 79*40146bf7SPaolo Abeni 80*40146bf7SPaolo Abeni ip -n "$netns" link add "$vxlan_dev" type vxlan id "$vxlan_id" \ 81*40146bf7SPaolo Abeni remote "$bm_rem_addr" "${opts[@]}" 82*40146bf7SPaolo Abeni ip -n "$netns" link set dev "$vxlan_dev" up 83*40146bf7SPaolo Abeni} 84*40146bf7SPaolo Abeni 85*40146bf7SPaolo Abenicreate_ns() { 86*40146bf7SPaolo Abeni local nested_opt='"port":6082' 87*40146bf7SPaolo Abeni local create_endpoint 88*40146bf7SPaolo Abeni local options="$1" 89*40146bf7SPaolo Abeni local feature 90*40146bf7SPaolo Abeni local dev 91*40146bf7SPaolo Abeni local id 92*40146bf7SPaolo Abeni local ns 93*40146bf7SPaolo Abeni 94*40146bf7SPaolo Abeni RET=0 95*40146bf7SPaolo Abeni 96*40146bf7SPaolo Abeni # +-------------+ +-------------+ 97*40146bf7SPaolo Abeni # | NS_SRC | | NS_NST_DST | 98*40146bf7SPaolo Abeni # | | | | 99*40146bf7SPaolo Abeni # | gnv_nst1 | | gnv_nst2 | 100*40146bf7SPaolo Abeni # | + | | + | 101*40146bf7SPaolo Abeni # | | | | | | 102*40146bf7SPaolo Abeni # | + | | + | 103*40146bf7SPaolo Abeni # | gnv1 | | gnv2 | 104*40146bf7SPaolo Abeni # | + | | + | 105*40146bf7SPaolo Abeni # | | | | | | 106*40146bf7SPaolo Abeni # | + veth1 +--------+ veth2 + | 107*40146bf7SPaolo Abeni # | | | | 108*40146bf7SPaolo Abeni # +-------------+ +-------------+ 109*40146bf7SPaolo Abeni 110*40146bf7SPaolo Abeni setup_ns NS_SRC NS_DST 111*40146bf7SPaolo Abeni 112*40146bf7SPaolo Abeni # concatenate caller provided options and default one 113*40146bf7SPaolo Abeni [ -n "$2" ] && nested_opt="$nested_opt,$2" 114*40146bf7SPaolo Abeni 115*40146bf7SPaolo Abeni ip link add name "veth$SRC" netns "$NS_SRC" type veth \ 116*40146bf7SPaolo Abeni peer name "veth$DST" netns "$NS_DST" 117*40146bf7SPaolo Abeni case "$ENCAP" in 118*40146bf7SPaolo Abeni vxlan) 119*40146bf7SPaolo Abeni create_endpoint=create_vxlan_endpoint 120*40146bf7SPaolo Abeni dev=vx 121*40146bf7SPaolo Abeni ;; 122*40146bf7SPaolo Abeni geneve) 123*40146bf7SPaolo Abeni create_endpoint=create_gnv_endpoint 124*40146bf7SPaolo Abeni dev=gnv 125*40146bf7SPaolo Abeni ;; 126*40146bf7SPaolo Abeni esac 127*40146bf7SPaolo Abeni 128*40146bf7SPaolo Abeni id=1 129*40146bf7SPaolo Abeni for ns in "${NS_LIST[@]}"; do 130*40146bf7SPaolo Abeni ip -n "$ns" link set dev "veth$id" up 131*40146bf7SPaolo Abeni 132*40146bf7SPaolo Abeni # ensure the sender can do large write just after 3whs 133*40146bf7SPaolo Abeni ip netns exec "$ns" \ 134*40146bf7SPaolo Abeni sysctl -qw net.ipv4.tcp_wmem="4096 4194304 4194304" 135*40146bf7SPaolo Abeni 136*40146bf7SPaolo Abeni # note that 3 - $SRC == $DST and 3 - $DST == $SRC 137*40146bf7SPaolo Abeni if [ $FAMILY = "4" ]; then 138*40146bf7SPaolo Abeni ip -n "$ns" addr add dev "veth$id" "$NET_V4$id/24" 139*40146bf7SPaolo Abeni $create_endpoint "$ns" "$NET_V4$((3 - id))" \ 140*40146bf7SPaolo Abeni "$dev$id" 4 "$options" 141*40146bf7SPaolo Abeni ip -n "$ns" addr add dev "$dev$id" "$OL1_NET_V4$id/24" 142*40146bf7SPaolo Abeni 143*40146bf7SPaolo Abeni # nested tunnel devices 144*40146bf7SPaolo Abeni # pmtu can't be propagated to upper layer devices; 145*40146bf7SPaolo Abeni # need manual adjust 146*40146bf7SPaolo Abeni $create_endpoint "$ns" "$OL1_NET_V4$((3 - id))" \ 147*40146bf7SPaolo Abeni "$dev"_nst"$id" 40 "$nested_opt" 148*40146bf7SPaolo Abeni ip -n "$ns" addr add dev "$dev"_nst"$id" \ 149*40146bf7SPaolo Abeni "$OL2_NET_V4$id/24" 150*40146bf7SPaolo Abeni ip -n "$ns" link set dev "$dev"_nst"$id" mtu 1392 151*40146bf7SPaolo Abeni else 152*40146bf7SPaolo Abeni ip -n "$ns" addr add dev "veth$id" "$NET_V6$id/64" \ 153*40146bf7SPaolo Abeni nodad 154*40146bf7SPaolo Abeni $create_endpoint "$ns" "$NET_V6$((3 - id))" \ 155*40146bf7SPaolo Abeni "$dev"6"$id" 6 "$options" 156*40146bf7SPaolo Abeni ip -n "$ns" addr add dev "$dev"6"$id" \ 157*40146bf7SPaolo Abeni "$OL1_NET_V6$id/64" nodad 158*40146bf7SPaolo Abeni 159*40146bf7SPaolo Abeni $create_endpoint "$ns" "$OL1_NET_V6$((3 - id))" \ 160*40146bf7SPaolo Abeni "$dev"6_nst"$id" 60 "$nested_opt" 161*40146bf7SPaolo Abeni ip -n "$ns" addr add dev "$dev"6_nst"$id" \ 162*40146bf7SPaolo Abeni "$OL2_NET_V6$id/64" nodad 163*40146bf7SPaolo Abeni ip -n "$ns" link set dev "$dev"6_nst"$id" mtu 1352 164*40146bf7SPaolo Abeni fi 165*40146bf7SPaolo Abeni id=$((id+1)) 166*40146bf7SPaolo Abeni done 167*40146bf7SPaolo Abeni 168*40146bf7SPaolo Abeni # enable GRO heuristic on the veth peer and ensure UDP L4 over tunnel is 169*40146bf7SPaolo Abeni # actually segmented 170*40146bf7SPaolo Abeni for feature in tso tx-udp_tnl-segmentation; do 171*40146bf7SPaolo Abeni ip netns exec "$NS_SRC" ethtool -K "veth$SRC" \ 172*40146bf7SPaolo Abeni "$feature" off 2>/dev/null 173*40146bf7SPaolo Abeni done 174*40146bf7SPaolo Abeni} 175*40146bf7SPaolo Abeni 176*40146bf7SPaolo Abenicreate_ns_gso() { 177*40146bf7SPaolo Abeni local dev 178*40146bf7SPaolo Abeni 179*40146bf7SPaolo Abeni create_ns "$@" 180*40146bf7SPaolo Abeni if [ "$ENCAP" = "geneve" ]; then 181*40146bf7SPaolo Abeni dev=gnv 182*40146bf7SPaolo Abeni else 183*40146bf7SPaolo Abeni dev=vx 184*40146bf7SPaolo Abeni fi 185*40146bf7SPaolo Abeni [ "$FAMILY" = "6" ] && dev="$dev"6 186*40146bf7SPaolo Abeni ip netns exec "$NS_SRC" ethtool -K "$dev$SRC" \ 187*40146bf7SPaolo Abeni tx-gso-partial on \ 188*40146bf7SPaolo Abeni tx-udp_tnl-segmentation on \ 189*40146bf7SPaolo Abeni tx-udp_tnl-csum-segmentation on 190*40146bf7SPaolo Abeni} 191*40146bf7SPaolo Abeni 192*40146bf7SPaolo Abenicreate_ns_gso_gro() { 193*40146bf7SPaolo Abeni create_ns_gso "$@" 194*40146bf7SPaolo Abeni ip netns exec "$NS_DST" ethtool -K "veth$DST" gro on 195*40146bf7SPaolo Abeni ip netns exec "$NS_SRC" ethtool -K "veth$SRC" tx off >/dev/null 2>&1 196*40146bf7SPaolo Abeni} 197*40146bf7SPaolo Abeni 198*40146bf7SPaolo Abenirun_test() { 199*40146bf7SPaolo Abeni local -r dst=$NET$DST 200*40146bf7SPaolo Abeni local -r msg=$1 201*40146bf7SPaolo Abeni local -r total_size=$2 202*40146bf7SPaolo Abeni local -r encappkts=$3 203*40146bf7SPaolo Abeni local inner_proto_offset=0 204*40146bf7SPaolo Abeni local inner_maclen=14 205*40146bf7SPaolo Abeni local rx_family="-4" 206*40146bf7SPaolo Abeni local ipt=iptables 207*40146bf7SPaolo Abeni local bpf_filter 208*40146bf7SPaolo Abeni local -a rx_args 209*40146bf7SPaolo Abeni local wire_pkts 210*40146bf7SPaolo Abeni local rcvpkts 211*40146bf7SPaolo Abeni local encl=8 212*40146bf7SPaolo Abeni local dport 213*40146bf7SPaolo Abeni local pkts 214*40146bf7SPaolo Abeni local snd 215*40146bf7SPaolo Abeni 216*40146bf7SPaolo Abeni if [ $FAMILY = "6" ]; then 217*40146bf7SPaolo Abeni ipt=ip6tables 218*40146bf7SPaolo Abeni else 219*40146bf7SPaolo Abeni # rx program does not support '-6' and implies ipv6 usage by 220*40146bf7SPaolo Abeni # default 221*40146bf7SPaolo Abeni rx_args=("$rx_family") 222*40146bf7SPaolo Abeni fi 223*40146bf7SPaolo Abeni 224*40146bf7SPaolo Abeni # The received can only check fixed size packet 225*40146bf7SPaolo Abeni pkts=$((total_size / GSO_SIZE)) 226*40146bf7SPaolo Abeni if [ -n "$4" ]; then 227*40146bf7SPaolo Abeni wire_pkts=$4 228*40146bf7SPaolo Abeni elif [ $((total_size % GSO_SIZE)) -eq 0 ]; then 229*40146bf7SPaolo Abeni wire_pkts=1 230*40146bf7SPaolo Abeni rx_args+=("-l" "$GSO_SIZE") 231*40146bf7SPaolo Abeni else 232*40146bf7SPaolo Abeni wire_pkts=2 233*40146bf7SPaolo Abeni pkts=$((pkts + 1)) 234*40146bf7SPaolo Abeni fi 235*40146bf7SPaolo Abeni 236*40146bf7SPaolo Abeni if [ "$ENCAP" = "geneve" ]; then 237*40146bf7SPaolo Abeni dport=6081 238*40146bf7SPaolo Abeni else 239*40146bf7SPaolo Abeni dport=4789 240*40146bf7SPaolo Abeni fi 241*40146bf7SPaolo Abeni 242*40146bf7SPaolo Abeni # Either: 243*40146bf7SPaolo Abeni # - IPv4, nested tunnel carries UDP over IPv4, with dport 6082, 244*40146bf7SPaolo Abeni # innermost is TCP over IPv4 on port 8000 245*40146bf7SPaolo Abeni # - IPv6, nested tunnel carries UDP over IPv6, with dport 6082, 246*40146bf7SPaolo Abeni # innermost is TCP over IPv6 on port 8000 247*40146bf7SPaolo Abeni # The nested tunnel port is 6082 and the nested encap len is 8 248*40146bf7SPaolo Abeni # regardless of the encap type (no geneve opts). 249*40146bf7SPaolo Abeni # In inherit protocol mode there is no nested mac hdr and the nested 250*40146bf7SPaolo Abeni # l3 protocol type field belongs to the geneve hdr. 251*40146bf7SPaolo Abeni [ "$USE_HINT" = true ] && encl=16 252*40146bf7SPaolo Abeni [ "$INHERIT" = true ] && inner_maclen=0 253*40146bf7SPaolo Abeni [ "$INHERIT" = true ] && inner_proto_offset=-4 254*40146bf7SPaolo Abeni local inner=$((inner_maclen+encl)) 255*40146bf7SPaolo Abeni local proto=$((inner_maclen+encl+inner_proto_offset)) 256*40146bf7SPaolo Abeni bpf_filter=$(nfbpf_compile "(ip && 257*40146bf7SPaolo Abeni ip[$((40+encl))] == 0x08 && ip[$((41+encl))] == 0x00 && 258*40146bf7SPaolo Abeni ip[$((51+encl))] == 0x11 && 259*40146bf7SPaolo Abeni ip[$((64+encl))] == 0x17 && ip[$((65+encl))] == 0xc2 && 260*40146bf7SPaolo Abeni ip[$((76+proto))] == 0x08 && ip[$((77+proto))] == 0x00 && 261*40146bf7SPaolo Abeni ip[$((87+inner))] == 0x6 && 262*40146bf7SPaolo Abeni ip[$((100+inner))] == 0x1f && ip[$((101+inner))] == 0x40) || 263*40146bf7SPaolo Abeni (ip6 && 264*40146bf7SPaolo Abeni ip6[$((60+encl))] == 0x86 && ip6[$((61+encl))] == 0xdd && 265*40146bf7SPaolo Abeni ip6[$((68+encl))] == 0x11 && 266*40146bf7SPaolo Abeni ip6[$((104+encl))] == 0x17 && ip6[$((105+encl))] == 0xc2 && 267*40146bf7SPaolo Abeni ip6[$((116+proto))] == 0x86 && ip6[$((117+proto))] == 0xdd && 268*40146bf7SPaolo Abeni ip6[$((124+inner))] == 0x6 && 269*40146bf7SPaolo Abeni ip6[$((160+inner))] == 0x1f && ip6[$((161+inner))] == 0x40)") 270*40146bf7SPaolo Abeni 271*40146bf7SPaolo Abeni # ignore shorts packet, to avoid arp/mld induced noise 272*40146bf7SPaolo Abeni ip netns exec "$NS_SRC" "$ipt" -A OUTPUT -p udp --dport "$dport" \ 273*40146bf7SPaolo Abeni -m length --length 600:65535 -m bpf --bytecode "$bpf_filter" 274*40146bf7SPaolo Abeni ip netns exec "$NS_DST" "$ipt" -A INPUT -p udp --dport "$dport" \ 275*40146bf7SPaolo Abeni -m length --length 600:65535 -m bpf --bytecode "$bpf_filter" 276*40146bf7SPaolo Abeni ip netns exec "$NS_DST" ./udpgso_bench_rx -C 2000 -t -R 100 \ 277*40146bf7SPaolo Abeni -n "$pkts" "${rx_args[@]}" & 278*40146bf7SPaolo Abeni local pid=$! 279*40146bf7SPaolo Abeni wait_local_port_listen "$NS_DST" 8000 tcp 280*40146bf7SPaolo Abeni ip netns exec "$NS_SRC" ./udpgso_bench_tx -"$FAMILY" -t -M 1 \ 281*40146bf7SPaolo Abeni -s "$total_size" -D "$dst" 282*40146bf7SPaolo Abeni local ret=$? 283*40146bf7SPaolo Abeni check_err "$ret" "client failure exit code $ret" 284*40146bf7SPaolo Abeni wait "$pid" 285*40146bf7SPaolo Abeni ret=$? 286*40146bf7SPaolo Abeni check_err "$ret" "sever failure exit code $ret" 287*40146bf7SPaolo Abeni 288*40146bf7SPaolo Abeni snd=$(ip netns exec "$NS_SRC" "$ipt"-save -c | 289*40146bf7SPaolo Abeni grep "dport $dport" | sed -e 's/\[//' -e 's/:.*//') 290*40146bf7SPaolo Abeni 291*40146bf7SPaolo Abeni [ "$snd" = "$wire_pkts" ] 292*40146bf7SPaolo Abeni # shellcheck disable=SC2319 # known false positive 293*40146bf7SPaolo Abeni check_err $? "send $snd packets on the lowest link, expected $wire_pkts" 294*40146bf7SPaolo Abeni 295*40146bf7SPaolo Abeni rcvpkts=$(ip netns exec "$NS_DST" "$ipt"-save -c | \ 296*40146bf7SPaolo Abeni grep "dport $dport" | sed -e 's/\[//' -e 's/:.*//') 297*40146bf7SPaolo Abeni 298*40146bf7SPaolo Abeni [ "$rcvpkts" = "$encappkts" ] 299*40146bf7SPaolo Abeni check_err $? "received $rcvpkts $ENCAP packets, expected $encappkts" 300*40146bf7SPaolo Abeni log_test "$msg" 301*40146bf7SPaolo Abeni} 302*40146bf7SPaolo Abeni 303*40146bf7SPaolo Abenirun_tests() { 304*40146bf7SPaolo Abeni for FAMILY in 4 6; do 305*40146bf7SPaolo Abeni NET=$OL2_NET_V4 306*40146bf7SPaolo Abeni GSO_SIZE=1340 # 1392 - 20 - 32 307*40146bf7SPaolo Abeni 308*40146bf7SPaolo Abeni if [ $FAMILY = 6 ]; then 309*40146bf7SPaolo Abeni NET=$OL2_NET_V6 310*40146bf7SPaolo Abeni GSO_SIZE=1280 # 1352 - 40 - 32 311*40146bf7SPaolo Abeni fi 312*40146bf7SPaolo Abeni 313*40146bf7SPaolo Abeni echo "IPv$FAMILY" 314*40146bf7SPaolo Abeni 315*40146bf7SPaolo Abeni unset USE_HINT 316*40146bf7SPaolo Abeni unset INHERIT 317*40146bf7SPaolo Abeni 318*40146bf7SPaolo Abeni # "geneve" must be last encap in list, so that later 319*40146bf7SPaolo Abeni # test cases will run on it 320*40146bf7SPaolo Abeni for ENCAP in "vxlan" "geneve"; do 321*40146bf7SPaolo Abeni create_ns 322*40146bf7SPaolo Abeni run_test "No GSO - $ENCAP" $((GSO_SIZE * 4)) 4 4 323*40146bf7SPaolo Abeni cleanup_all_ns 324*40146bf7SPaolo Abeni 325*40146bf7SPaolo Abeni create_ns_gso 326*40146bf7SPaolo Abeni run_test "GSO without GRO - $ENCAP" $((GSO_SIZE * 4)) \ 327*40146bf7SPaolo Abeni 4 1 328*40146bf7SPaolo Abeni cleanup_all_ns 329*40146bf7SPaolo Abeni 330*40146bf7SPaolo Abeni # IPv4 only test 331*40146bf7SPaolo Abeni [ $FAMILY = "4" ] || continue 332*40146bf7SPaolo Abeni create_ns_gso 333*40146bf7SPaolo Abeni ip netns exec "$NS_SRC" \ 334*40146bf7SPaolo Abeni sysctl -qw net.ipv4.ip_no_pmtu_disc=1 335*40146bf7SPaolo Abeni run_test "GSO disable due to no fixedid - $ENCAP" \ 336*40146bf7SPaolo Abeni $((GSO_SIZE * 4)) 4 4 337*40146bf7SPaolo Abeni cleanup_all_ns 338*40146bf7SPaolo Abeni done 339*40146bf7SPaolo Abeni 340*40146bf7SPaolo Abeni # GRO tests imply/require geneve encap, the only one providing 341*40146bf7SPaolo Abeni # GRO hints 342*40146bf7SPaolo Abeni create_ns_gso_gro 343*40146bf7SPaolo Abeni run_test "double tunnel GRO, no hints" $((GSO_SIZE * 4)) 4 344*40146bf7SPaolo Abeni cleanup_all_ns 345*40146bf7SPaolo Abeni 346*40146bf7SPaolo Abeni # hint option is expected for all the following tests in the RX 347*40146bf7SPaolo Abeni # path 348*40146bf7SPaolo Abeni USE_HINT=true 349*40146bf7SPaolo Abeni create_ns_gso_gro \ 350*40146bf7SPaolo Abeni '"gro-hint":1,"udp-zero-csum6-tx":1,"udp-zero-csum6-rx":1' \ 351*40146bf7SPaolo Abeni '"udp-zero-csum6-tx":1,"udp-zero-csum6-rx":1' 352*40146bf7SPaolo Abeni run_test "double tunnel GRO" $((GSO_SIZE * 4)) 1 353*40146bf7SPaolo Abeni cleanup_all_ns 354*40146bf7SPaolo Abeni 355*40146bf7SPaolo Abeni create_ns_gso_gro '"gro-hint":1,"udp-csum":1' '"udp-csum":1' 356*40146bf7SPaolo Abeni run_test "double tunnel GRO - csum complete" $((GSO_SIZE * 4))\ 357*40146bf7SPaolo Abeni 1 358*40146bf7SPaolo Abeni cleanup_all_ns 359*40146bf7SPaolo Abeni 360*40146bf7SPaolo Abeni create_ns_gso_gro '"gro-hint":1' \ 361*40146bf7SPaolo Abeni '"udp-csum":0,"udp-zero-csum6-tx":1,"udp-zero-csum6-rx":1' 362*40146bf7SPaolo Abeni run_test "double tunnel GRO - no nested csum" \ 363*40146bf7SPaolo Abeni $((GSO_SIZE * 4)) 1 364*40146bf7SPaolo Abeni cleanup_all_ns 365*40146bf7SPaolo Abeni 366*40146bf7SPaolo Abeni create_ns_gso_gro \ 367*40146bf7SPaolo Abeni '"gro-hint":1,"udp-zero-csum6-tx":1,"udp-zero-csum6-rx":1' \ 368*40146bf7SPaolo Abeni '"udp-csum":1' 369*40146bf7SPaolo Abeni run_test "double tunnel GRO - nested csum, outer 0-csum, skip"\ 370*40146bf7SPaolo Abeni $((GSO_SIZE * 4)) 4 371*40146bf7SPaolo Abeni cleanup_all_ns 372*40146bf7SPaolo Abeni 373*40146bf7SPaolo Abeni INHERIT=true 374*40146bf7SPaolo Abeni create_ns_gso_gro '"gro-hint":1,"udp-csum":1' \ 375*40146bf7SPaolo Abeni '"udp-csum":1,"inner-proto-inherit":1' 376*40146bf7SPaolo Abeni run_test "double tunnel GRO - nested inherit proto" \ 377*40146bf7SPaolo Abeni $((GSO_SIZE * 4)) 1 378*40146bf7SPaolo Abeni cleanup_all_ns 379*40146bf7SPaolo Abeni unset INHERIT 380*40146bf7SPaolo Abeni 381*40146bf7SPaolo Abeni create_ns_gso_gro '"gro-hint":1' 382*40146bf7SPaolo Abeni run_test "double tunnel GRO - short last pkt" \ 383*40146bf7SPaolo Abeni $((GSO_SIZE * 4 + GSO_SIZE / 2)) 2 384*40146bf7SPaolo Abeni cleanup_all_ns 385*40146bf7SPaolo Abeni done 386*40146bf7SPaolo Abeni} 387*40146bf7SPaolo Abeni 388*40146bf7SPaolo Abenirequire_command nfbpf_compile 389*40146bf7SPaolo Abenirequire_command jq 390*40146bf7SPaolo Abeni 391*40146bf7SPaolo Abeni# tcp retransmisions will break the accounting 392*40146bf7SPaolo Abenixfail_on_slow run_tests 393*40146bf7SPaolo Abeniexit "$EXIT_STATUS" 394