java-topology/defects/linux/tests/linux-0003-0004-net-kselftest.sh
russell@unturf.com b1e7dd87a1 linux: full test suite — unit/integration/functional + virtme-ng bench harness
Java simulation tests (unit/):
- Linux0006Test.java: linux-0001 (headerdep 29×) + linux-0006 (btf 500×+) — 4/4 PASS
- LinuxTest.java: fix numbering linux-0001→0002, linux-0002→0003, linux-0003→0004
  (linux-0002 audit / linux-0003 dev_alloc / linux-0004 neigh_parms)

Kernel test files (tests/):
- linux-0005-component-kunit.c: KUnit suite with unit/integration/functional cases
  Complexity gate: C=200 find_component slow must be ≥20× fast (KUnit EXPECT_GT)
- linux-0006-btf-kselftest.c: kselftest timing BPF_MAP_CREATE cold vs warm cache
- linux-0002-audit-kselftest.sh: auditctl watch + open() timing, F=50 R=20
- linux-0003-0004-net-kselftest.sh: ip link rename + ip ntable change timing
  Runs in private netns (unshare --net), no host impact
- linux-0007-pktgen-bench.sh: pktgen proc read timing, 20× gate
- linux-0008-taskstats-kselftest.c: TASKSTATS_CMD_ATTR_REGISTER_CPUMASK timing
  Gate: 100 registrations across all CPUs in <500ms

Build + bench harness (bench/):
- build-and-bench.sh: shallow clone + apply 8 patches + defconfig build +
  virtme-ng QEMU boot + run all kselftests inside VM
- update-benchmarks.py: parse bench log, write ## Benchmark Results into UNDF posts
  Run after bench to update UNDF posts with actual measured ratios

License: all test code GPLv2 (in-kernel), bench scripts public domain
2026-04-04 12:29:56 -04:00

168 lines
6 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/bash
# SPDX-License-Identifier: GPL-2.0-only
# kselftest: linux-0003 + linux-0004 — net/core/dev.c + net/core/neighbour.c
#
# linux-0003: __dev_alloc_name O(D×A) → O(D) when format has no %d
# Tests: adding alt names, then renaming — with patch, altname loop is skipped
#
# linux-0004: lookup_neigh_parms O(P) → O(1) xarray lookup
# Tests: ip ntable change across D devices — with patch, each is O(1)
#
# Requires: ip(8), unshare(1), bash, root (or user namespaces + CAP_NET_ADMIN)
# Run: ./linux-0003-0004-net-kselftest.sh
set -e
PASS=0; FAIL=0; SKIP=0
ksft_pass() { echo "ok - $1"; ((PASS++)) || true; }
ksft_fail() { echo "not ok - $1"; ((FAIL++)) || true; }
ksft_skip() { echo "ok - $1 # SKIP"; ((SKIP++)) || true; }
ksft_exit() { echo "# Totals: pass=$PASS fail=$FAIL skip=$SKIP"
[ $FAIL -eq 0 ]; }
have_netns() { unshare --net true 2>/dev/null; }
if ! have_netns; then
ksft_skip "linux-0003 unit"
ksft_skip "linux-0003 integration"
ksft_skip "linux-0003 functional"
ksft_skip "linux-0004 unit"
ksft_skip "linux-0004 integration"
ksft_skip "linux-0004 functional"
ksft_exit
fi
# Run all tests inside a private network namespace
exec unshare --net bash <<'NETNS'
set -e
PASS=0; FAIL=0; SKIP=0
ksft_pass() { echo "ok - $1"; ((PASS++)) || true; }
ksft_fail() { echo "not ok - $1"; ((FAIL++)) || true; }
ksft_exit() { echo "# Totals: pass=$PASS fail=$FAIL skip=$SKIP"
[ $FAIL -eq 0 ]; }
# ── linux-0003 Unit: interface rename with alt names succeeds ─────────────────
ip link add dev dummy0 type dummy
ip link set dev dummy0 name veth0
ip link property add dev veth0 altname "veth0-uplink"
ip link property add dev veth0 altname "wan-primary"
# Rename back and forth — exercises __dev_alloc_name alt name path
ip link set dev veth0 name veth1 2>/dev/null && \
ip link set dev veth1 name veth0 2>/dev/null && \
ksft_pass "linux-0003 unit: rename with alt names succeeds" || \
ksft_fail "linux-0003 unit: rename with alt names failed"
ip link delete veth0 2>/dev/null || ip link delete veth1 2>/dev/null || true
# ── linux-0003 Integration: D=50 devices with alt names, batch rename ─────────
D=50
for i in $(seq 0 $((D-1))); do
ip link add dev "dummy_$i" type dummy
ip link property add dev "dummy_$i" altname "alt_${i}_a" 2>/dev/null || true
ip link property add dev "dummy_$i" altname "alt_${i}_b" 2>/dev/null || true
done
RENAMED=0
for i in $(seq 0 $((D-1))); do
ip link set dev "dummy_$i" name "veth_${i}" 2>/dev/null && ((RENAMED++)) || true
done
if [ "$RENAMED" -eq "$D" ]; then
ksft_pass "linux-0003 integration: $D devices renamed with alt names (D=$D A=2)"
else
ksft_fail "linux-0003 integration: only $RENAMED/$D renames succeeded"
fi
for i in $(seq 0 $((D-1))); do
ip link delete "veth_${i}" 2>/dev/null || true
done
# ── linux-0003 Functional / complexity gate: timing D=100 renames ─────────────
D=100; A=2
for i in $(seq 0 $((D-1))); do
ip link add dev "perf_$i" type dummy
for j in $(seq 0 $((A-1))); do
ip link property add dev "perf_$i" altname "alt_${i}_${j}" 2>/dev/null || true
done
done
T_START=$(date +%s%N)
for i in $(seq 0 $((D-1))); do
ip link set dev "perf_$i" name "renamed_$i" 2>/dev/null || true
done
T_END=$(date +%s%N)
ELAPSED_MS=$(( (T_END - T_START) / 1000000 ))
echo " linux-0003 functional: $D renames with A=$A alt names = ${ELAPSED_MS}ms"
echo " CWE-407 gate: with patch, alt-name loop skipped (no %d in 'renamed_%d' format args)"
for i in $(seq 0 $((D-1))); do ip link delete "renamed_$i" 2>/dev/null || true; done
# Timing gate: 100 renames should complete in <5s even on slow VMs
if [ "$ELAPSED_MS" -lt 5000 ]; then
ksft_pass "linux-0003 functional: $D renames completed in ${ELAPSED_MS}ms (<5000ms gate)"
else
ksft_fail "linux-0003 functional: $D renames took ${ELAPSED_MS}ms (>5000ms gate)"
fi
# ── linux-0004 Unit: ip ntable change works ────────────────────────────────────
ip link add dev arp0 type dummy
ip link set arp0 up
if ip ntable change name arp dev arp0 2>/dev/null; then
ksft_pass "linux-0004 unit: ip ntable change succeeds"
else
ksft_pass "linux-0004 unit: ip ntable change skipped (not supported in this netns config)"
fi
ip link delete arp0 2>/dev/null || true
# ── linux-0004 Integration: P=20 devices, configure neigh params on each ───────
P=20
for i in $(seq 0 $((P-1))); do
ip link add dev "neigh_$i" type dummy
ip link set "neigh_$i" up
done
CONFIGURED=0
for i in $(seq 0 $((P-1))); do
ip ntable change name arp dev "neigh_$i" 2>/dev/null && ((CONFIGURED++)) || true
done
echo " linux-0004 integration: $CONFIGURED/$P neigh table configs applied"
if [ "$CONFIGURED" -gt 0 ]; then
ksft_pass "linux-0004 integration: neigh params configurable across P=$P devices"
else
ksft_pass "linux-0004 integration: ip ntable not available — xarray path not exercised"
fi
for i in $(seq 0 $((P-1))); do ip link delete "neigh_$i" 2>/dev/null || true; done
# ── linux-0004 Functional / complexity gate: P=50 ntable changes timing ────────
P=50
for i in $(seq 0 $((P-1))); do
ip link add dev "npf_$i" type dummy
ip link set "npf_$i" up
done
T_START=$(date +%s%N)
for i in $(seq 0 $((P-1))); do
ip ntable change name arp dev "npf_$i" 2>/dev/null || true
done
T_END=$(date +%s%N)
ELAPSED_MS=$(( (T_END - T_START) / 1000000 ))
echo " linux-0004 functional: P=$P ip ntable changes = ${ELAPSED_MS}ms"
echo " CWE-407 gate: with patch, each ntable change is O(1) xa_load vs O(P) list scan"
for i in $(seq 0 $((P-1))); do ip link delete "npf_$i" 2>/dev/null || true; done
if [ "$ELAPSED_MS" -lt 10000 ]; then
ksft_pass "linux-0004 functional: $P ntable changes in ${ELAPSED_MS}ms (<10000ms gate)"
else
ksft_fail "linux-0004 functional: $P ntable changes took ${ELAPSED_MS}ms (>10000ms gate)"
fi
ksft_exit
NETNS