#!/bin/bash # SPDX-License-Identifier: GPL-2.0 # This test ensures directed broadcast routes use dst hint mechanism source lib.sh CLIENT_IP4="192.168.0.1" SERVER_IP4="192.168.0.2" BROADCAST_ADDRESS="192.168.0.255" setup() { setup_ns CLIENT_NS SERVER_NS ip -net "${SERVER_NS}" link add link1 type veth peer name link0 netns "${CLIENT_NS}" ip -net "${CLIENT_NS}" link set link0 up ip -net "${CLIENT_NS}" addr add "${CLIENT_IP4}/24" dev link0 ip -net "${SERVER_NS}" link set link1 up ip -net "${SERVER_NS}" addr add "${SERVER_IP4}/24" dev link1 ip netns exec "${CLIENT_NS}" ethtool -K link0 tcp-segmentation-offload off ip netns exec "${SERVER_NS}" sh -c "echo 500000000 > /sys/class/net/link1/gro_flush_timeout" ip netns exec "${SERVER_NS}" sh -c "echo 1 > /sys/class/net/link1/napi_defer_hard_irqs" ip netns exec "${SERVER_NS}" ethtool -K link1 generic-receive-offload on } cleanup() { ip -net "${SERVER_NS}" link del link1 cleanup_ns "${CLIENT_NS}" "${SERVER_NS}" } directed_bcast_hint_test() { local rc=0 echo "Testing for directed broadcast route hint" orig_in_brd=$(ip netns exec "${SERVER_NS}" lnstat -j -i1 -c1 | jq '.in_brd') ip netns exec "${CLIENT_NS}" mausezahn link0 -a own -b bcast -A "${CLIENT_IP4}" \ -B "${BROADCAST_ADDRESS}" -c1 -t tcp "sp=1-100,dp=1234,s=1,a=0" -p 5 -q sleep 1 new_in_brd=$(ip netns exec "${SERVER_NS}" lnstat -j -i1 -c1 | jq '.in_brd') res=$(echo "${new_in_brd} - ${orig_in_brd}" | bc) if [ "${res}" -lt 100 ]; then echo "[ OK ]" rc="${ksft_pass}" else echo "[FAIL] expected in_brd to be under 100, got ${res}" rc="${ksft_fail}" fi return "${rc}" } if [ ! -x "$(command -v mausezahn)" ]; then echo "SKIP: Could not run test without mausezahn tool" exit "${ksft_skip}" fi if [ ! -x "$(command -v jq)" ]; then echo "SKIP: Could not run test without jq tool" exit "${ksft_skip}" fi if [ ! -x "$(command -v bc)" ]; then echo "SKIP: Could not run test without bc tool" exit "${ksft_skip}" fi trap cleanup EXIT setup directed_bcast_hint_test exit $?