Skip to content

Commit

Permalink
selftests/net: use tc rule to filter the na packet
Browse files Browse the repository at this point in the history
Test arp_ndisc_untracked_subnets use tcpdump to filter the unsolicited
and untracked na messages. It set -e before calling tcpdump. But if
tcpdump filters 0 packet, it will return none zero, and cause the script
to exit.

Instead of using slow tcpdump to capture packets, let's using tc rule
to filter out the na message.

At the same time, fix function setup_v6 which only needs one parameter.
Move all the related helpers from forwarding lib.sh to net lib.sh.

Fixes: 0ea7b0a ("selftests: net: arp_ndisc_untracked_subnets: test for arp_accept and accept_untracked_na")
Signed-off-by: Hangbin Liu <[email protected]>
Reviewed-by: Simon Horman <[email protected]>
Link: https://lore.kernel.org/r/[email protected]
Signed-off-by: Paolo Abeni <[email protected]>
  • Loading branch information
liuhangbin authored and Paolo Abeni committed May 21, 2024
1 parent efb9f4f commit ea63ac1
Show file tree
Hide file tree
Showing 3 changed files with 75 additions and 94 deletions.
53 changes: 17 additions & 36 deletions tools/testing/selftests/net/arp_ndisc_untracked_subnets.sh
Original file line number Diff line number Diff line change
Expand Up @@ -73,32 +73,33 @@ setup_v6() {
# namespaces. veth0 is veth-router, veth1 is veth-host.
# first, set up the inteface's link to the namespace
# then, set the interface "up"
ip -6 -netns ${ROUTER_NS_V6} link add name ${ROUTER_INTF} \
type veth peer name ${HOST_INTF}

ip -6 -netns ${ROUTER_NS_V6} link set dev ${ROUTER_INTF} up
ip -6 -netns ${ROUTER_NS_V6} link set dev ${HOST_INTF} netns \
${HOST_NS_V6}
ip -n ${ROUTER_NS_V6} link add name ${ROUTER_INTF} \
type veth peer name ${HOST_INTF} netns ${HOST_NS_V6}

ip -6 -netns ${HOST_NS_V6} link set dev ${HOST_INTF} up
ip -6 -netns ${ROUTER_NS_V6} addr add \
${ROUTER_ADDR_V6}/${PREFIX_WIDTH_V6} dev ${ROUTER_INTF} nodad
# Add tc rule to filter out host na message
tc -n ${ROUTER_NS_V6} qdisc add dev ${ROUTER_INTF} clsact
tc -n ${ROUTER_NS_V6} filter add dev ${ROUTER_INTF} \
ingress protocol ipv6 pref 1 handle 101 \
flower src_ip ${HOST_ADDR_V6} ip_proto icmpv6 type 136 skip_hw action pass

HOST_CONF=net.ipv6.conf.${HOST_INTF}
ip netns exec ${HOST_NS_V6} sysctl -qw ${HOST_CONF}.ndisc_notify=1
ip netns exec ${HOST_NS_V6} sysctl -qw ${HOST_CONF}.disable_ipv6=0
ip -6 -netns ${HOST_NS_V6} addr add ${HOST_ADDR_V6}/${PREFIX_WIDTH_V6} \
dev ${HOST_INTF}

ROUTER_CONF=net.ipv6.conf.${ROUTER_INTF}

ip netns exec ${ROUTER_NS_V6} sysctl -w \
${ROUTER_CONF}.forwarding=1 >/dev/null 2>&1
ip netns exec ${ROUTER_NS_V6} sysctl -w \
${ROUTER_CONF}.drop_unsolicited_na=0 >/dev/null 2>&1
ip netns exec ${ROUTER_NS_V6} sysctl -w \
${ROUTER_CONF}.accept_untracked_na=${accept_untracked_na} \
>/dev/null 2>&1

ip -n ${ROUTER_NS_V6} link set dev ${ROUTER_INTF} up
ip -n ${HOST_NS_V6} link set dev ${HOST_INTF} up
ip -n ${ROUTER_NS_V6} addr add ${ROUTER_ADDR_V6}/${PREFIX_WIDTH_V6} \
dev ${ROUTER_INTF} nodad
ip -n ${HOST_NS_V6} addr add ${HOST_ADDR_V6}/${PREFIX_WIDTH_V6} \
dev ${HOST_INTF}
set +e
}

Expand Down Expand Up @@ -162,26 +163,6 @@ arp_test_gratuitous_combinations() {
arp_test_gratuitous 2 1
}

cleanup_tcpdump() {
set -e
[[ ! -z ${tcpdump_stdout} ]] && rm -f ${tcpdump_stdout}
[[ ! -z ${tcpdump_stderr} ]] && rm -f ${tcpdump_stderr}
tcpdump_stdout=
tcpdump_stderr=
set +e
}

start_tcpdump() {
set -e
tcpdump_stdout=`mktemp`
tcpdump_stderr=`mktemp`
ip netns exec ${ROUTER_NS_V6} timeout 15s \
tcpdump --immediate-mode -tpni ${ROUTER_INTF} -c 1 \
"icmp6 && icmp6[0] == 136 && src ${HOST_ADDR_V6}" \
> ${tcpdump_stdout} 2> /dev/null
set +e
}

verify_ndisc() {
local accept_untracked_na=$1
local same_subnet=$2
Expand Down Expand Up @@ -222,16 +203,16 @@ ndisc_test_untracked_advertisements() {
HOST_ADDR_V6=2001:db8:abcd:0012::3
fi
fi
setup_v6 $1 $2
start_tcpdump
setup_v6 $1
slowwait_for_counter 15 1 \
tc_rule_handle_stats_get "dev ${ROUTER_INTF} ingress" 101 ".packets" "-n ${ROUTER_NS_V6}"

if verify_ndisc $1 $2; then
printf " TEST: %-60s [ OK ]\n" "${test_msg[*]}"
else
printf " TEST: %-60s [FAIL]\n" "${test_msg[*]}"
fi

cleanup_tcpdump
cleanup_v6
set +e
}
Expand Down
58 changes: 0 additions & 58 deletions tools/testing/selftests/net/forwarding/lib.sh
Original file line number Diff line number Diff line change
Expand Up @@ -129,14 +129,6 @@ fi

source "$net_forwarding_dir/../lib.sh"

# timeout in seconds
slowwait()
{
local timeout_sec=$1; shift

loopy_wait "sleep 0.1" "$((timeout_sec * 1000))" "$@"
}

##############################################################################
# Sanity checks

Expand Down Expand Up @@ -678,33 +670,6 @@ wait_for_trap()
"$@" | grep -q trap
}

until_counter_is()
{
local expr=$1; shift
local current=$("$@")

echo $((current))
((current $expr))
}

busywait_for_counter()
{
local timeout=$1; shift
local delta=$1; shift

local base=$("$@")
busywait "$timeout" until_counter_is ">= $((base + delta))" "$@"
}

slowwait_for_counter()
{
local timeout=$1; shift
local delta=$1; shift

local base=$("$@")
slowwait "$timeout" until_counter_is ">= $((base + delta))" "$@"
}

setup_wait_dev()
{
local dev=$1; shift
Expand Down Expand Up @@ -1023,29 +988,6 @@ link_stats_rx_errors_get()
link_stats_get $1 rx errors
}

tc_rule_stats_get()
{
local dev=$1; shift
local pref=$1; shift
local dir=$1; shift
local selector=${1:-.packets}; shift

tc -j -s filter show dev $dev ${dir:-ingress} pref $pref \
| jq ".[1].options.actions[].stats$selector"
}

tc_rule_handle_stats_get()
{
local id=$1; shift
local handle=$1; shift
local selector=${1:-.packets}; shift
local netns=${1:-""}; shift

tc $netns -j -s filter show $id \
| jq ".[] | select(.options.handle == $handle) | \
.options.actions[0].stats$selector"
}

ethtool_stats_get()
{
local dev=$1; shift
Expand Down
58 changes: 58 additions & 0 deletions tools/testing/selftests/net/lib.sh
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,41 @@ busywait()
loopy_wait : "$timeout_ms" "$@"
}

# timeout in seconds
slowwait()
{
local timeout_sec=$1; shift

loopy_wait "sleep 0.1" "$((timeout_sec * 1000))" "$@"
}

until_counter_is()
{
local expr=$1; shift
local current=$("$@")

echo $((current))
((current $expr))
}

busywait_for_counter()
{
local timeout=$1; shift
local delta=$1; shift

local base=$("$@")
busywait "$timeout" until_counter_is ">= $((base + delta))" "$@"
}

slowwait_for_counter()
{
local timeout=$1; shift
local delta=$1; shift

local base=$("$@")
slowwait "$timeout" until_counter_is ">= $((base + delta))" "$@"
}

cleanup_ns()
{
local ns=""
Expand Down Expand Up @@ -150,3 +185,26 @@ setup_ns()
done
NS_LIST="$NS_LIST $ns_list"
}

tc_rule_stats_get()
{
local dev=$1; shift
local pref=$1; shift
local dir=$1; shift
local selector=${1:-.packets}; shift

tc -j -s filter show dev $dev ${dir:-ingress} pref $pref \
| jq ".[1].options.actions[].stats$selector"
}

tc_rule_handle_stats_get()
{
local id=$1; shift
local handle=$1; shift
local selector=${1:-.packets}; shift
local netns=${1:-""}; shift

tc $netns -j -s filter show $id \
| jq ".[] | select(.options.handle == $handle) | \
.options.actions[0].stats$selector"
}

0 comments on commit ea63ac1

Please sign in to comment.