summaryrefslogtreecommitdiff
path: root/tools/testing/selftests/net
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2026-08-27 13:53:43 -0700
committerLinus Torvalds <torvalds@linux-foundation.org>2026-08-27 13:53:43 -0700
commit1b78070aaef63512688aebfbc82365ef9d6660f1 (patch)
tree691c0aeaa3d92278ceeb6ace56bc8cd56a7f2ae8 /tools/testing/selftests/net
parent3ba13f5e7180c034b0a1ef7e052fb780856b134e (diff)
parent4a9d62a8774f130a5b8de26ca9f415e6050a9d51 (diff)
downloadlinux-stable-master.tar.gz
linux-stable-master.zip
Merge tag 'net-7.3-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/netdev/netHEADmaster
Pull networking fixes from Jakub Kicinski: "Including fixes from Bluetooth, IPSec and Netfilter. Current release - fix to a fix: - netfilter: ipset: remove need to allocate memory on delete operations Current release - regressions: - macb: drop CONFIG_OF #if block, fix build Previous releases - always broken: - stream of fixes for SCTP continues - inet: frags: strip GSO state from fragments before reassembly - virtio-net: ensure that TCP packets don't overflow gso_segs - tcp-ao: fix use-after-free of current_key on reconnect to another peer - page_pool: remove zone/policy GFP flags when allocating XArray entries - Bluetooth: L2CAP: reject accept queue add unless BT_LISTEN - tls: device: fix out-of-bounds write in tls_append_frag() - eth: bnxt: - ring the doorbell when SW USO exits early, avoid packets stuck in Tx - gate TPH enablement behind BNXT_SUPPORTS_QUEUE_API check, avoid users of older NICs seeing non-actionable warning messages - eth: qede: fix NULL pointer dereference in TPA fragment processing" * tag 'net-7.3-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net: (216 commits) inet: frags: strip GSO state from fragments before reassembly net/sched: sch_htb: limit htb_classify inner-class filter hops selftests/net: packetdrill: add tcp_urg_ptr_retransmit tcp: fix corruption of urgent data on multi-segment retransmit usb: atm: usbatm: fix invalid ci_range initialization net: fec: only stop PTP if it was initialized slip: remove slip_hangup() to fix use-after-free in slip_receive_buf() net: bridge: mcast: fix use-after-free of a master VLAN's multicast context net/sched: bound qdisc_pkt_len to prevent qdisc soft lockup net: dsa: mxl862xx: enable assisted learning on CPU port net: stmmac: restore NET_IP_ALIGN in the RX DMA offset net: stmmac: drop gso_enabled_types and rely on netdev features net: stmmac: selftests: Don't test flow control for small rx fifos net: stmmac: selftests: Account for the UC filter list for filtering tests net: stmmac: dwxgmac: Account for the primary MAC address for UC filtering net: stmmac: dwmac4: Account for the primary MAC address for UC filtering net: stmmac: dwmac1000: Account for the primary MAC address for UC filtering net: stmmac: selftests: Check multiple MMC counters selftests: net: Fix slow configurations in big_tcp_tunnels.sh selftests: net: Lower threshold with csum offload off in big_tcp_tunnels.sh ...
Diffstat (limited to 'tools/testing/selftests/net')
-rwxr-xr-xtools/testing/selftests/net/big_tcp_tunnels.sh38
-rw-r--r--tools/testing/selftests/net/fin_ack_lat.c5
-rwxr-xr-xtools/testing/selftests/net/fin_ack_lat.sh2
-rw-r--r--tools/testing/selftests/net/packetdrill/tcp_advmss_pmtu_ipv4.pkt67
-rw-r--r--tools/testing/selftests/net/packetdrill/tcp_advmss_pmtu_ipv6.pkt67
-rw-r--r--tools/testing/selftests/net/packetdrill/tcp_urg_ptr_retransmit.pkt65
-rw-r--r--tools/testing/selftests/net/tcp_ao/key-management.c67
-rw-r--r--tools/testing/selftests/net/tcp_ao/lib/aolib.h6
-rw-r--r--tools/testing/selftests/net/tcp_ao/lib/sock.c4
9 files changed, 289 insertions, 32 deletions
diff --git a/tools/testing/selftests/net/big_tcp_tunnels.sh b/tools/testing/selftests/net/big_tcp_tunnels.sh
index d6513ed8d4e8..cc0875e52fb9 100755
--- a/tools/testing/selftests/net/big_tcp_tunnels.sh
+++ b/tools/testing/selftests/net/big_tcp_tunnels.sh
@@ -3,6 +3,8 @@
#
# Testing for IPv4 and IPv6 BIG TCP over VXLAN and GENEVE tunnels.
+source "$(dirname "$0")/lib.sh"
+
SERVER_NS=$(mktemp -u server-XXXXXXXX)
SERVER_IP4="192.168.1.1"
SERVER_IP6="2001:db8::1:1"
@@ -15,11 +17,18 @@ CLIENT_IP6="2001:db8::1:2"
CLIENT_IP4_TUN="192.168.2.2"
CLIENT_IP6_TUN="2001:db8::2:2"
-: "${PACKETS_THRESHOLD:=1000}"
-
# Kselftest framework requirement - SKIP code is 4.
ksft_skip=4
+if [ -z "$PACKETS_THRESHOLD" ]; then
+ if [ "$KSFT_MACHINE_SLOW" = yes ]; then
+ echo 'Debug kernel detected, lowering the default threshold'
+ PACKETS_THRESHOLD=100
+ else
+ PACKETS_THRESHOLD=1000
+ fi
+fi
+
setup() {
ip netns add "$SERVER_NS"
ip netns add "$CLIENT_NS"
@@ -39,6 +48,9 @@ setup() {
gro_max_size 196608 gro_ipv4_max_size 196608
ip netns exec "$SERVER_NS" netserver >/dev/null
+ wait_local_port_listen "$SERVER_NS" 12865 tcp
+
+ DEFAULT_TCP_MIN_TSO_SEGS=$(ip netns exec "$CLIENT_NS" sysctl -n net.ipv4.tcp_min_tso_segs)
}
setup_tunnel() {
@@ -97,6 +109,8 @@ cleanup() {
}
do_test() {
+ local packets_threshold="$PACKETS_THRESHOLD"
+
# When tx csum offload is off, software GSO is performed before passing the
# packet to veth. Check BIG TCP packets inside the VXLAN tunnel to verify
# the software checksum path: if the checksum code is broken, these packets
@@ -115,6 +129,7 @@ do_test() {
else
IPTABLES=ip6tables
fi
+ packets_threshold=$(( PACKETS_THRESHOLD / 10 ))
fi
if [ "$2" = 4 ]; then
IPTABLES_SACK=iptables
@@ -122,6 +137,21 @@ do_test() {
IPTABLES_SACK=ip6tables
fi
+ if [ "$3" != 'on' ] && [ "$KSFT_MACHINE_SLOW" = yes ]; then
+ echo 'Slow configuration; increasing net.ipv4.tcp_min_tso_segs and initcwnd'
+ ip netns exec "$CLIENT_NS" sysctl -w net.ipv4.tcp_min_tso_segs=52
+ if [ "$2" = 4 ]; then
+ ip -netns "$CLIENT_NS" \
+ route change 192.168.2.0/24 dev tun0 initcwnd 100
+ else
+ ip -netns "$CLIENT_NS" -6 \
+ route change 2001:db8::2:0/112 dev tun0 initcwnd 100
+ fi
+ else
+ ip netns exec "$CLIENT_NS" \
+ sysctl -w net.ipv4.tcp_min_tso_segs="$DEFAULT_TCP_MIN_TSO_SEGS"
+ fi
+
ip netns exec "$SERVER_NS" "$IPTABLES" -w -t raw -I PREROUTING -i "${CAPTURE_IFACE}1" -m length ! --length 0:65535 -m comment --comment "bigtcp"
ip netns exec "$CLIENT_NS" "$IPTABLES" -w -t raw -I OUTPUT -o "${CAPTURE_IFACE}0" -m length ! --length 0:65535 -m comment --comment "bigtcp"
ip netns exec "$SERVER_NS" "$IPTABLES_SACK" -w -t raw -I OUTPUT -o "tun1" -p tcp -m tcp --tcp-flags ACK ACK --tcp-option 5 -m comment --comment "sack"
@@ -147,8 +177,8 @@ do_test() {
echo "Captured BIG TCP RX packets: $PACKETS_SERVER"
echo "Captured BIG TCP TX packets: $PACKETS_CLIENT"
echo "Captured TCP SACK packets: $PACKETS_SACK"
- [ "$PACKETS_SERVER" -gt "$PACKETS_THRESHOLD" ] || return 1
- [ "$PACKETS_CLIENT" -gt "$PACKETS_THRESHOLD" ] || return 1
+ [ "$PACKETS_SERVER" -gt "$packets_threshold" ] || return 1
+ [ "$PACKETS_CLIENT" -gt "$packets_threshold" ] || return 1
[ "$PACKETS_SACK" -lt "$(( PACKETS_CLIENT / 2 ))" ] || return 1
}
diff --git a/tools/testing/selftests/net/fin_ack_lat.c b/tools/testing/selftests/net/fin_ack_lat.c
index 4117332eb1a9..4068f8e227cf 100644
--- a/tools/testing/selftests/net/fin_ack_lat.c
+++ b/tools/testing/selftests/net/fin_ack_lat.c
@@ -103,7 +103,8 @@ static void server(int sock, struct sockaddr_in address)
static void sig_handler(int signum)
{
- kill(SIGTERM, child_pid);
+ if (child_pid > 0)
+ kill(child_pid, SIGTERM);
exit(0);
}
@@ -142,6 +143,8 @@ int main(int argc, char const *argv[])
fprintf(stderr, "server port: %d\n", ntohs(laddr.sin_port));
child_pid = fork();
+ if (child_pid < 0)
+ error(-1, errno, "fork");
if (!child_pid)
client(ntohs(laddr.sin_port));
else
diff --git a/tools/testing/selftests/net/fin_ack_lat.sh b/tools/testing/selftests/net/fin_ack_lat.sh
index a3ff6e0b2c7a..a8aa2238ab5c 100755
--- a/tools/testing/selftests/net/fin_ack_lat.sh
+++ b/tools/testing/selftests/net/fin_ack_lat.sh
@@ -9,7 +9,7 @@ set -e
tmpfile=$(mktemp /tmp/fin_ack_latency.XXXX.log)
cleanup() {
- kill $(pidof fin_ack_lat)
+ kill $(pidof fin_ack_lat) 2>/dev/null || true
rm -f $tmpfile
}
diff --git a/tools/testing/selftests/net/packetdrill/tcp_advmss_pmtu_ipv4.pkt b/tools/testing/selftests/net/packetdrill/tcp_advmss_pmtu_ipv4.pkt
new file mode 100644
index 000000000000..f2ef931b77a1
--- /dev/null
+++ b/tools/testing/selftests/net/packetdrill/tcp_advmss_pmtu_ipv4.pkt
@@ -0,0 +1,67 @@
+// SPDX-License-Identifier: GPL-2.0
+//
+// Test that IPv4 advertised MSS in SYN-ACK is derived from the configured
+// interface MTU (1500 -> MSS 1460), not the ICMP-learned Path MTU.
+
+--ip_version=ipv4
+
+`./defaults.sh
+ethtool -K tun0 tso off
+`
+
+//
+// Connection 1: Learn PMTU exception (MTU 1200 -> MSS 1160)
+//
+ 0 socket(..., SOCK_STREAM, IPPROTO_TCP) = 3
+ +0 setsockopt(3, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0
+ +0 bind(3, ..., ...) = 0
+ +0 listen(3, 1) = 0
+
+ +0 < S 0:0(0) win 65535 <mss 1460,sackOK,nop,nop,nop,wscale 8>
+ +0 > S. 0:0(0) ack 1 <mss 1460,nop,nop,sackOK,nop,wscale 8>
+ +.1 < . 1:1(0) ack 1 win 257
+ +0 accept(3, ..., ...) = 4
+
+// Send a full 1460-byte segment
+ +0 write(4, ..., 1460) = 1460
+ +0 > P. 1:1461(1460) ack 1
+
+// ICMP Fragmentation Needed arrives indicating next-hop MTU 1200
+ +0 < icmp unreachable frag_needed mtu 1200 [1:1461(1460)]
+
+// Local host retransmits using the learned MTU 1200 (MSS = 1200 - 40 = 1160)
+ +0 > . 1:1161(1160) ack 1
+ +0 > P. 1161:1461(300) ack 1
+ +0 < R 1:1(0) ack 1461 win 0
+
+// Close connection 1 and listener
+ +0 close(4) = 0
+ +0 close(3) = 0
+
+//
+// Connection 2: New connection from the same peer
+//
+ +0 socket(..., SOCK_STREAM, IPPROTO_TCP) = 3
+ +0 setsockopt(3, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0
+ +0 bind(3, ..., ...) = 0
+ +0 listen(3, 1) = 0
+
+ +0 < S 0:0(0) win 65535 <mss 1460,sackOK,nop,nop,nop,wscale 8>
+
+// Verify: SYN-ACK MUST advertise configured MSS 1460, NOT the learned PMTU MSS 1160
+ +0 > S. 0:0(0) ack 1 <mss 1460,nop,nop,sackOK,nop,wscale 8>
+ +0 < . 1:1(0) ack 1 win 257
+ +0 accept(3, ..., ...) = 4
+
+// Verify: Outgoing transmit MSS is still constrained by the learned PMTU 1200
+ +0 write(4, ..., 1460) = 1460
+ +0 > . 1:1161(1160) ack 1
+ +0 > P. 1161:1461(300) ack 1
+ +0 < . 1:1(0) ack 1461 win 257
+
+// Clean up
+ +0 close(4) = 0
+ +0 > F. 1461:1461(0) ack 1
+ +0 < F. 1:1(0) ack 1462 win 257
+ +0 > . 1462:1462(0) ack 2
+ +0 close(3) = 0
diff --git a/tools/testing/selftests/net/packetdrill/tcp_advmss_pmtu_ipv6.pkt b/tools/testing/selftests/net/packetdrill/tcp_advmss_pmtu_ipv6.pkt
new file mode 100644
index 000000000000..c7638b11a815
--- /dev/null
+++ b/tools/testing/selftests/net/packetdrill/tcp_advmss_pmtu_ipv6.pkt
@@ -0,0 +1,67 @@
+// SPDX-License-Identifier: GPL-2.0
+//
+// Test that IPv6 advertised MSS in SYN-ACK is derived from the configured
+// interface MTU (1520 -> MSS 1460), not the ICMPv6-learned Path MTU.
+
+--ip_version=ipv6
+
+`./defaults.sh
+ethtool -K tun0 tso off
+`
+
+//
+// Connection 1: Learn PMTU exception (MTU 1280 -> MSS 1220)
+//
+ 0 socket(..., SOCK_STREAM, IPPROTO_TCP) = 3
+ +0 setsockopt(3, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0
+ +0 bind(3, ..., ...) = 0
+ +0 listen(3, 1) = 0
+
+ +0 < S 0:0(0) win 65535 <mss 1460,sackOK,nop,nop,nop,wscale 8>
+ +0 > S. 0:0(0) ack 1 <mss 1460,nop,nop,sackOK,nop,wscale 8>
+ +.1 < . 1:1(0) ack 1 win 257
+ +0 accept(3, ..., ...) = 4
+
+// Send a full 1460-byte segment
+ +0 write(4, ..., 1460) = 1460
+ +0 > P. 1:1461(1460) ack 1
+
+// ICMPv6 Packet Too Big arrives indicating next-hop MTU 1280
+ +0 < icmp packet_too_big mtu 1280 [1:1461(1460)]
+
+// Local host retransmits using the learned MTU 1280 (MSS = 1280 - 40 - 20 = 1220)
+ +0 > . 1:1221(1220) ack 1
+ +0 > P. 1221:1461(240) ack 1
+ +0 < R 1:1(0) ack 1461 win 0
+
+// Close connection 1 and listener
+ +0 close(4) = 0
+ +0 close(3) = 0
+
+//
+// Connection 2: New connection from the same peer
+//
+ +0 socket(..., SOCK_STREAM, IPPROTO_TCP) = 3
+ +0 setsockopt(3, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0
+ +0 bind(3, ..., ...) = 0
+ +0 listen(3, 1) = 0
+
+ +0 < S 0:0(0) win 65535 <mss 1460,sackOK,nop,nop,nop,wscale 8>
+
+// Verify: SYN-ACK MUST advertise configured MSS 1460, NOT the learned PMTU MSS 1220
+ +0 > S. 0:0(0) ack 1 <mss 1460,nop,nop,sackOK,nop,wscale 8>
+ +0 < . 1:1(0) ack 1 win 257
+ +0 accept(3, ..., ...) = 4
+
+// Verify: Outgoing transmit MSS is still constrained by the learned PMTU 1280
+ +0 write(4, ..., 1460) = 1460
+ +0 > . 1:1221(1220) ack 1
+ +0 > P. 1221:1461(240) ack 1
+ +0 < . 1:1(0) ack 1461 win 257
+
+// Clean up
+ +0 close(4) = 0
+ +0 > F. 1461:1461(0) ack 1
+ +0 < F. 1:1(0) ack 1462 win 257
+ +0 > . 1462:1462(0) ack 2
+ +0 close(3) = 0
diff --git a/tools/testing/selftests/net/packetdrill/tcp_urg_ptr_retransmit.pkt b/tools/testing/selftests/net/packetdrill/tcp_urg_ptr_retransmit.pkt
new file mode 100644
index 000000000000..22f750ce09c1
--- /dev/null
+++ b/tools/testing/selftests/net/packetdrill/tcp_urg_ptr_retransmit.pkt
@@ -0,0 +1,65 @@
+// SPDX-License-Identifier: GPL-2.0
+--ip_version=ipv4
+//
+// Reproduce urg_ptr being copied across segments on a multi-segment retransmit
+// in urgent mode (regression since 10d3be569243).
+//
+// server (kernel, under test) client (packetdrill)
+// | write(5000): 1:1001 .. 4001:5001 | mss 1000 from
+// | -------------------------------------------> | the client SYN
+// | send(MSG_OOB): 5001:5002 urg 1 | snd_up = 5002
+// | -------------------------------------------> |
+// | SACK 2001:5002, leaving hole 1:2001|
+// | <------------------------------------------- |
+// | retransmit hole 1:2001 as ONE skb: |
+// | seq=1, 2 segments, urg_ptr = 5002-1 = 5001|
+// | tun tso off -> software GSO splits it: |
+// | seg A 1:1001 urg_ptr 5001 (correct) |
+// | seg B 1001:2001 urg_ptr ? |
+// | want 5002-1001 = 4001 |
+// | bug inherits 5001 <- caught here |
+// | -------------------------------------------> |
+//
+
+`./defaults.sh`
+
+ 0 socket(..., SOCK_STREAM, IPPROTO_TCP) = 3
+ +0 setsockopt(3, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0
+ +0 bind(3, ..., ...) = 0
+ +0 listen(3, 1) = 0
+
+// 1. client force mss=1000
+ +.1 < S 0:0(0) win 32792 <mss 1000,sackOK,nop,nop,nop,wscale 7>
+ +0 > S. 0:0(0) ack 1 <mss 1460,nop,nop,sackOK,nop,wscale 8>
+ +.1 < . 1:1(0) ack 1 win 320
+ +0 accept(3, ..., ...) = 4
+
+// 2. server sends 5000 bytes; TSO on, so packetdrill sees whole super-skbs
+ +0 write(4, ..., 5000) = 5000
+ +0 > P. 1:5001(5000) ack 1
+
+// 3. server send OOB
+ +0 send(4, ..., 1, MSG_OOB) = 1
+ +0 > PU. 5001:5002(1) ack 1 urg 1
+
+// We could disable GSO at the start of the script, but then the PSH flag on
+// the 5 initial server segments is not deterministic and hard to match. Keep
+// TSO on for the initial send (one super-skb, stable PSH) and disable it only
+// here, so software GSO splits the retransmit and each segment's urg_ptr is
+// checked on the wire.
+ +0 `ethtool -K tun0 tso off gso off gro off lro off 2>/dev/null`
+
+// 4. SACKed blocks reach dupthresh -> fast retransmit of the 1:2001 hole.
+ +.05 < . 1:1(0) ack 1 win 320 <sack 2001:3001,nop,nop>
+ +0 < . 1:1(0) ack 1 win 320 <sack 2001:4001,nop,nop>
+ +0 < . 1:1(0) ack 1 win 320 <sack 2001:5002,nop,nop>
+
+// Retransmit must keep a per-segment urg_ptr (5002 - seg.seq): seg A 5001,
+// seg B 4001. The fix sends the hole as two independent skbs, so seg B has
+// no PSH. Unpatched it goes out as one super-skb whose GSO split copies
+// urg_ptr onto seg B and also adds PSH there, so on an unpatched kernel the
+// mismatch shows up on the PSH bit before the urg_ptr.
+ +0 > U. 1:1001(1000) ack 1 urg 5001
+ +0 > U. 1001:2001(1000) ack 1 urg 4001
+
+ +.1 < . 1:1(0) ack 5002 win 320
diff --git a/tools/testing/selftests/net/tcp_ao/key-management.c b/tools/testing/selftests/net/tcp_ao/key-management.c
index d86bb380b79f..0451f92f4645 100644
--- a/tools/testing/selftests/net/tcp_ao/key-management.c
+++ b/tools/testing/selftests/net/tcp_ao/key-management.c
@@ -63,8 +63,8 @@ static int prepare_lsk(union tcp_addr *addr, uint8_t sndid, uint8_t rcvid)
return sk;
}
-static int test_del_key(int sk, uint8_t sndid, uint8_t rcvid, bool async,
- int current_key, int rnext_key)
+static int test_del_key(int sk, uint8_t sndid, uint8_t rcvid, int ifindex,
+ bool async, int current_key, int rnext_key)
{
struct tcp_ao_info_opt ao_info = {};
struct tcp_ao_getsockopt key = {};
@@ -76,6 +76,10 @@ static int test_del_key(int sk, uint8_t sndid, uint8_t rcvid, bool async,
del.prefix = DEFAULT_TEST_PREFIX;
del.sndid = sndid;
del.rcvid = rcvid;
+ if (ifindex) {
+ del.keyflags = TCP_AO_KEYF_IFINDEX;
+ del.ifindex = ifindex;
+ }
if (current_key >= 0) {
del.set_current = 1;
@@ -95,7 +99,8 @@ static int test_del_key(int sk, uint8_t sndid, uint8_t rcvid, bool async,
tcp_addr_to_sockaddr_in(&sockaddr, &this_ip_dest, 0);
err = test_get_one_ao(sk, &key, &sockaddr, sizeof(sockaddr),
- DEFAULT_TEST_PREFIX, sndid, rcvid);
+ DEFAULT_TEST_PREFIX, sndid, rcvid,
+ del.keyflags, del.ifindex);
if (!err)
return -EEXIST;
if (err != -E2BIG)
@@ -112,12 +117,12 @@ static int test_del_key(int sk, uint8_t sndid, uint8_t rcvid, bool async,
}
static void try_delete_key(char *tst_name, int sk, uint8_t sndid, uint8_t rcvid,
- bool async, int current_key, int rnext_key,
+ int ifindex, bool async, int current_key, int rnext_key,
fault_t inj)
{
int err;
- err = test_del_key(sk, sndid, rcvid, async, current_key, rnext_key);
+ err = test_del_key(sk, sndid, rcvid, ifindex, async, current_key, rnext_key);
if ((err == -EBUSY && fault(BUSY)) || (err == -EINVAL && fault(CURRNEXT))) {
test_ok("%s: key deletion was prevented", tst_name);
return;
@@ -236,15 +241,15 @@ static void check_closed_socket(void)
int sk;
sk = prepare_sk(&this_ip_dest, 200, 200);
- try_delete_key("closed socket, delete a key", sk, 200, 200, 0, -1, -1, 0);
- try_delete_key("closed socket, delete all keys", sk, 100, 100, 0, -1, -1, 0);
+ try_delete_key("closed socket, delete a key", sk, 200, 200, 0, 0, -1, -1, 0);
+ try_delete_key("closed socket, delete all keys", sk, 100, 100, 0, 0, -1, -1, 0);
close(sk);
sk = prepare_sk(&this_ip_dest, 200, 200);
if (test_set_key(sk, 100, 200))
test_error("failed to set current/rnext keys");
- try_delete_key("closed socket, delete current key", sk, 100, 100, 0, -1, -1, FAULT_BUSY);
- try_delete_key("closed socket, delete rnext key", sk, 200, 200, 0, -1, -1, FAULT_BUSY);
+ try_delete_key("closed socket, delete current key", sk, 100, 100, 0, 0, -1, -1, FAULT_BUSY);
+ try_delete_key("closed socket, delete rnext key", sk, 200, 200, 0, 0, -1, -1, FAULT_BUSY);
close(sk);
sk = prepare_sk(&this_ip_dest, 200, 200);
@@ -254,10 +259,12 @@ static void check_closed_socket(void)
if (test_add_key(sk, "Glory to Ukraine!", this_ip_dest,
DEFAULT_TEST_PREFIX, 12, 13))
test_error("test_add_key()");
- try_delete_key("closed socket, delete a key + set current/rnext", sk, 100, 100, 0, 10, 13, 0);
- try_delete_key("closed socket, force-delete current key", sk, 10, 11, 0, 200, -1, 0);
- try_delete_key("closed socket, force-delete rnext key", sk, 12, 13, 0, -1, 200, 0);
- try_delete_key("closed socket, delete current+rnext key", sk, 200, 200, 0, -1, -1, FAULT_BUSY);
+ try_delete_key("closed socket, delete a key + set current/rnext", sk,
+ 100, 100, 0, 0, 10, 13, 0);
+ try_delete_key("closed socket, force-delete current key", sk, 10, 11, 0, 0, 200, -1, 0);
+ try_delete_key("closed socket, force-delete rnext key", sk, 12, 13, 0, 0, -1, 200, 0);
+ try_delete_key("closed socket, delete current+rnext key", sk,
+ 200, 200, 0, 0, -1, -1, FAULT_BUSY);
close(sk);
sk = prepare_sk(&this_ip_dest, 200, 200);
@@ -272,6 +279,18 @@ static void check_closed_socket(void)
this_ip_dest, DEFAULT_TEST_PREFIX,
false, true, 20, 10, 0);
close(sk);
+
+ if (!should_skip_test("closed socket, add + delete VRF-scoped key",
+ KCONFIG_NET_VRF)) {
+ sk = prepare_sk(&this_ip_dest, 200, 200);
+ if (test_add_key_vrf(sk, SECOND_PASSWORD, TCP_AO_KEYF_IFINDEX,
+ this_ip_dest, DEFAULT_TEST_PREFIX,
+ test_vrf_ifindex, 201, 201))
+ test_error("test_add_key_vrf()");
+ try_delete_key("closed socket, add + delete VRF-scoped key", sk, 201, 201,
+ test_vrf_ifindex, 0, -1, -1, 0);
+ close(sk);
+ }
}
static void assert_no_current_rnext(const char *tst_msg, int sk)
@@ -322,8 +341,8 @@ static void check_listen_socket(void)
int sk, err;
sk = prepare_lsk(&this_ip_dest, 200, 200);
- try_delete_key("listen socket, delete a key", sk, 200, 200, 0, -1, -1, 0);
- try_delete_key("listen socket, delete all keys", sk, 100, 100, 0, -1, -1, 0);
+ try_delete_key("listen socket, delete a key", sk, 200, 200, 0, 0, -1, -1, 0);
+ try_delete_key("listen socket, delete all keys", sk, 100, 100, 0, 0, -1, -1, 0);
close(sk);
sk = prepare_lsk(&this_ip_dest, 200, 200);
@@ -345,8 +364,10 @@ static void check_listen_socket(void)
if (listen(sk, 10))
test_error("listen()");
assert_no_current_rnext("listen() after current/rnext keys set", sk);
- try_delete_key("listen socket, delete current key from before listen()", sk, 100, 100, 0, -1, -1, FAULT_FIXME);
- try_delete_key("listen socket, delete rnext key from before listen()", sk, 200, 200, 0, -1, -1, FAULT_FIXME);
+ try_delete_key("listen socket, delete current key from before listen()", sk,
+ 100, 100, 0, 0, -1, -1, FAULT_FIXME);
+ try_delete_key("listen socket, delete rnext key from before listen()", sk,
+ 200, 200, 0, 0, -1, -1, FAULT_FIXME);
close(sk);
assert_no_tcp_repair();
@@ -359,13 +380,13 @@ static void check_listen_socket(void)
DEFAULT_TEST_PREFIX, 12, 13))
test_error("test_add_key()");
try_delete_key("listen socket, delete a key + set current/rnext", sk,
- 100, 100, 0, 10, 13, FAULT_CURRNEXT);
+ 100, 100, 0, 0, 10, 13, FAULT_CURRNEXT);
try_delete_key("listen socket, force-delete current key", sk,
- 10, 11, 0, 200, -1, FAULT_CURRNEXT);
+ 10, 11, 0, 0, 200, -1, FAULT_CURRNEXT);
try_delete_key("listen socket, force-delete rnext key", sk,
- 12, 13, 0, -1, 200, FAULT_CURRNEXT);
+ 12, 13, 0, 0, -1, 200, FAULT_CURRNEXT);
try_delete_key("listen socket, delete a key", sk,
- 200, 200, 0, -1, -1, 0);
+ 200, 200, 0, 0, -1, -1, 0);
close(sk);
sk = prepare_lsk(&this_ip_dest, 200, 200);
@@ -1131,7 +1152,6 @@ static void check_established_socket(void)
{
unsigned int port = test_server_port;
- setup_vrfs();
try_client_run("client: Check current/rnext keys unset before connect()",
port++, 20, -1, -1);
try_client_run("client: Check current/rnext keys set before connect()",
@@ -1150,6 +1170,7 @@ static void *client_fn(void *arg)
{
if (inet_pton(TEST_FAMILY, TEST_WRONG_IP, &wrong_addr) != 1)
test_error("Can't convert ip address %s", TEST_WRONG_IP);
+ setup_vrfs();
check_closed_socket();
check_listen_socket();
check_established_socket();
@@ -1158,6 +1179,6 @@ static void *client_fn(void *arg)
int main(int argc, char *argv[])
{
- test_init(121, server_fn, client_fn);
+ test_init(122, server_fn, client_fn);
return 0;
}
diff --git a/tools/testing/selftests/net/tcp_ao/lib/aolib.h b/tools/testing/selftests/net/tcp_ao/lib/aolib.h
index ebb2899c12fe..53be1744237e 100644
--- a/tools/testing/selftests/net/tcp_ao/lib/aolib.h
+++ b/tools/testing/selftests/net/tcp_ao/lib/aolib.h
@@ -404,7 +404,8 @@ static inline int test_prepare_def_key(struct tcp_ao_add *ao,
extern int test_get_one_ao(int sk, struct tcp_ao_getsockopt *out,
void *addr, size_t addr_sz,
- uint8_t prefix, uint8_t sndid, uint8_t rcvid);
+ uint8_t prefix, uint8_t sndid, uint8_t rcvid,
+ uint8_t keyflags, int ifindex);
extern int test_get_ao_info(int sk, struct tcp_ao_info_opt *out);
extern int test_set_ao_info(int sk, struct tcp_ao_info_opt *in);
extern int test_cmp_getsockopt_setsockopt(const struct tcp_ao_add *a,
@@ -418,7 +419,8 @@ static inline int test_verify_socket_key(int sk, struct tcp_ao_add *key)
int err;
err = test_get_one_ao(sk, &key2, &key->addr, sizeof(key->addr),
- key->prefix, key->sndid, key->rcvid);
+ key->prefix, key->sndid, key->rcvid,
+ key->keyflags, key->ifindex);
if (err)
return err;
diff --git a/tools/testing/selftests/net/tcp_ao/lib/sock.c b/tools/testing/selftests/net/tcp_ao/lib/sock.c
index ef8e9031d47a..2e7b06a1a156 100644
--- a/tools/testing/selftests/net/tcp_ao/lib/sock.c
+++ b/tools/testing/selftests/net/tcp_ao/lib/sock.c
@@ -252,7 +252,7 @@ static int test_get_ao_keys_nr(int sk)
int test_get_one_ao(int sk, struct tcp_ao_getsockopt *out,
void *addr, size_t addr_sz, uint8_t prefix,
- uint8_t sndid, uint8_t rcvid)
+ uint8_t sndid, uint8_t rcvid, uint8_t keyflags, int ifindex)
{
struct tcp_ao_getsockopt tmp = {};
socklen_t tmp_sz = sizeof(tmp);
@@ -262,6 +262,8 @@ int test_get_one_ao(int sk, struct tcp_ao_getsockopt *out,
tmp.prefix = prefix;
tmp.sndid = sndid;
tmp.rcvid = rcvid;
+ tmp.keyflags = keyflags;
+ tmp.ifindex = ifindex;
tmp.nkeys = 1;
ret = getsockopt(sk, IPPROTO_TCP, TCP_AO_GET_KEYS, &tmp, &tmp_sz);