#!/bin/bash # check iif/iifname/oifgroup/iiftype match. # Kselftest framework requirement - SKIP code is 4. ksft_skip=4 sfx=$(mktemp -u "XXXXXXXX") ns0="ns0-$sfx" if ! nft --version > /dev/null 2>&1; then echo "SKIP: Could not run test without nft tool" exit $ksft_skip fi cleanup() { ip netns del "$ns0" } ip netns add "$ns0" ip -net "$ns0" link set lo up ip -net "$ns0" addr add 127.0.0.1 dev lo trap cleanup EXIT currentyear=$(date +%Y) lastyear=$((currentyear-1)) ip netns exec "$ns0" nft -f /dev/stdin <<EOF table inet filter { counter iifcount {} counter iifnamecount {} counter iifgroupcount {} counter iiftypecount {} counter infproto4count {} counter il4protocounter {} counter imarkcounter {} counter icpu0counter {} counter ilastyearcounter {} counter icurrentyearcounter {} counter oifcount {} counter oifnamecount {} counter oifgroupcount {} counter oiftypecount {} counter onfproto4count {} counter ol4protocounter {} counter oskuidcounter {} counter oskgidcounter {} counter omarkcounter {} chain input { type filter hook input priority 0; policy accept; meta iif lo counter name "iifcount" meta iifname "lo" counter name "iifnamecount" meta iifgroup "default" counter name "iifgroupcount" meta iiftype "loopback" counter name "iiftypecount" meta nfproto ipv4 counter name "infproto4count" meta l4proto icmp counter name "il4protocounter" meta mark 42 counter name "imarkcounter" meta cpu 0 counter name "icpu0counter" meta time "$lastyear-01-01" - "$lastyear-12-31" counter name ilastyearcounter meta time "$currentyear-01-01" - "$currentyear-12-31" counter name icurrentyearcounter } chain output { type filter hook output priority 0; policy accept; meta oif lo counter name "oifcount" counter meta oifname "lo" counter name "oifnamecount" meta oifgroup "default" counter name "oifgroupcount" meta oiftype "loopback" counter name "oiftypecount" meta nfproto ipv4 counter name "onfproto4count" meta l4proto icmp counter name "ol4protocounter" meta skuid 0 counter name "oskuidcounter" meta skgid 0 counter name "oskgidcounter" meta mark 42 counter name "omarkcounter" } } EOF if [ $? -ne 0 ]; then echo "SKIP: Could not add test ruleset" exit $ksft_skip fi ret=0 check_one_counter() { local cname="$1" local want="packets $2" local verbose="$3" if ! ip netns exec "$ns0" nft list counter inet filter $cname | grep -q "$want"; then echo "FAIL: $cname, want \"$want\", got" ret=1 ip netns exec "$ns0" nft list counter inet filter $cname fi } check_lo_counters() { local want="$1" local verbose="$2" local counter for counter in iifcount iifnamecount iifgroupcount iiftypecount infproto4count \ oifcount oifnamecount oifgroupcount oiftypecount onfproto4count \ il4protocounter icurrentyearcounter ol4protocounter \ ; do check_one_counter "$counter" "$want" "$verbose" done } check_lo_counters "0" false ip netns exec "$ns0" ping -q -c 1 127.0.0.1 -m 42 > /dev/null check_lo_counters "2" true check_one_counter oskuidcounter "1" true check_one_counter oskgidcounter "1" true check_one_counter imarkcounter "1" true check_one_counter omarkcounter "1" true check_one_counter ilastyearcounter "0" true if [ $ret -eq 0 ];then echo "OK: nftables meta iif/oif counters at expected values" else exit $ret fi #First CPU execution and counter taskset -p 01 $$ > /dev/null ip netns exec "$ns0" nft reset counters > /dev/null ip netns exec "$ns0" ping -q -c 1 127.0.0.1 > /dev/null check_one_counter icpu0counter "2" true if [ $ret -eq 0 ];then echo "OK: nftables meta cpu counter at expected values" fi exit $ret