]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
selftests: ovpn: add notification parsing and matching
authorRalf Lici <ralf@mandelbit.com>
Fri, 13 Jun 2025 15:55:39 +0000 (17:55 +0200)
committerAntonio Quartulli <antonio@openvpn.net>
Tue, 17 Mar 2026 10:08:55 +0000 (11:08 +0100)
To verify that netlink notifications are correctly emitted and contain
the expected fields, this commit uses the tools/net/ynl/pyynl/cli.py
script to create multicast listeners. These listeners record the
captured notifications to a JSON file, which is later compared to the
expected output.

Cc: linux-kselftest@vger.kernel.org
Cc: shuah@kernel.org
Cc: horms@kernel.org
Signed-off-by: Ralf Lici <ralf@mandelbit.com>
Signed-off-by: Antonio Quartulli <antonio@openvpn.net>
18 files changed:
tools/testing/selftests/net/ovpn/Makefile
tools/testing/selftests/net/ovpn/common.sh
tools/testing/selftests/net/ovpn/json/peer0-float.json [new file with mode: 0644]
tools/testing/selftests/net/ovpn/json/peer0.json [new file with mode: 0644]
tools/testing/selftests/net/ovpn/json/peer1-float.json [new symlink]
tools/testing/selftests/net/ovpn/json/peer1.json [new file with mode: 0644]
tools/testing/selftests/net/ovpn/json/peer2-float.json [new symlink]
tools/testing/selftests/net/ovpn/json/peer2.json [new file with mode: 0644]
tools/testing/selftests/net/ovpn/json/peer3-float.json [new symlink]
tools/testing/selftests/net/ovpn/json/peer3.json [new file with mode: 0644]
tools/testing/selftests/net/ovpn/json/peer4-float.json [new symlink]
tools/testing/selftests/net/ovpn/json/peer4.json [new file with mode: 0644]
tools/testing/selftests/net/ovpn/json/peer5-float.json [new symlink]
tools/testing/selftests/net/ovpn/json/peer5.json [new file with mode: 0644]
tools/testing/selftests/net/ovpn/json/peer6-float.json [new symlink]
tools/testing/selftests/net/ovpn/json/peer6.json [new file with mode: 0644]
tools/testing/selftests/net/ovpn/tcp_peers.txt
tools/testing/selftests/net/ovpn/test.sh

index e59271a25d76af4aefa5e95a838fa99fed980f67..88891d9f5c56dcd8b7cfa3146da965fe8194b549 100644 (file)
@@ -23,7 +23,14 @@ endif
 LDLIBS += $(NL_LDLIBS)
 
 
-TEST_FILES = common.sh
+TEST_FILES = \
+       common.sh \
+       data64.key \
+       json \
+       tcp_peers.txt \
+       udp_peers.txt \
+       ../../../../net/ynl/pyynl/cli.py \
+# end of TEST_FILES
 
 TEST_PROGS := \
        test-chachapoly.sh \
index 88869c675d032eb003ab6d066bf3ce55a8b8b3bb..df0a541148feca31bf2354225bedeefe9008d19b 100644 (file)
@@ -7,12 +7,18 @@
 UDP_PEERS_FILE=${UDP_PEERS_FILE:-udp_peers.txt}
 TCP_PEERS_FILE=${TCP_PEERS_FILE:-tcp_peers.txt}
 OVPN_CLI=${OVPN_CLI:-./ovpn-cli}
+YNL_CLI=${YNL_CLI:-../../../../net/ynl/pyynl/cli.py}
 ALG=${ALG:-aes}
 PROTO=${PROTO:-UDP}
 FLOAT=${FLOAT:-0}
 
+JQ_FILTER='map(select(.msg.peer | has("remote-ipv6") | not)) |
+       map(del(.msg.ifindex)) | sort_by(.msg.peer.id)[]'
 LAN_IP="11.11.11.11"
 
+declare -A tmp_jsons=()
+declare -A listener_pids=()
+
 create_ns() {
        ip netns add peer${1}
 }
@@ -48,6 +54,14 @@ setup_ns() {
        ip -n peer${1} link set tun${1} up
 }
 
+setup_listener() {
+       file=$(mktemp)
+       PYTHONUNBUFFERED=1 ip netns exec peer${p} ${YNL_CLI} --family ovpn \
+               --subscribe peers --output-json --duration 40 > ${file} &
+       listener_pids[$1]=$!
+       tmp_jsons[$1]="${file}"
+}
+
 add_peer() {
        if [ "${PROTO}" == "UDP" ]; then
                if [ ${1} -eq 0 ]; then
@@ -82,6 +96,24 @@ add_peer() {
        fi
 }
 
+compare_ntfs() {
+       if [ ${#tmp_jsons[@]} -gt 0 ]; then
+               [ "$FLOAT" == 1 ] && suffix="-float"
+               expected="json/peer${1}${suffix}.json"
+               received="${tmp_jsons[$1]}"
+
+               kill -TERM ${listener_pids[$1]} || true
+               wait ${listener_pids[$1]} || true
+               printf "Checking notifications for peer ${1}... "
+               if diff <(jq -s "${JQ_FILTER}" ${expected}) \
+                       <(jq -s "${JQ_FILTER}" ${received}); then
+                       echo "OK"
+               fi
+
+               rm -f ${received} || true
+       fi
+}
+
 cleanup() {
        # some ovpn-cli processes sleep in background so they need manual poking
        killall $(basename ${OVPN_CLI}) 2>/dev/null || true
@@ -104,5 +136,3 @@ if [ "${PROTO}" == "UDP" ]; then
 else
        NUM_PEERS=${NUM_PEERS:-$(wc -l ${TCP_PEERS_FILE} | awk '{print $1}')}
 fi
-
-
diff --git a/tools/testing/selftests/net/ovpn/json/peer0-float.json b/tools/testing/selftests/net/ovpn/json/peer0-float.json
new file mode 100644 (file)
index 0000000..682fa58
--- /dev/null
@@ -0,0 +1,9 @@
+{"name": "peer-float-ntf", "msg": {"ifindex": 0, "peer": {"id": 1, "remote-ipv4": "10.10.1.3", "remote-port": 1}}}
+{"name": "peer-float-ntf", "msg": {"ifindex": 0, "peer": {"id": 2, "remote-ipv4": "10.10.2.3", "remote-port": 1}}}
+{"name": "peer-float-ntf", "msg": {"ifindex": 0, "peer": {"id": 3, "remote-ipv4": "10.10.3.3", "remote-port": 1}}}
+{"name": "peer-del-ntf", "msg": {"ifindex": 0, "peer": {"del-reason": "userspace", "id": 1}}}
+{"name": "peer-del-ntf", "msg": {"ifindex": 0, "peer": {"del-reason": "userspace", "id": 2}}}
+{"name": "peer-del-ntf", "msg": {"ifindex": 0, "peer": {"del-reason": "expired", "id": 3}}}
+{"name": "peer-del-ntf", "msg": {"ifindex": 0, "peer": {"del-reason": "expired", "id": 4}}}
+{"name": "peer-del-ntf", "msg": {"ifindex": 0, "peer": {"del-reason": "expired", "id": 5}}}
+{"name": "peer-del-ntf", "msg": {"ifindex": 0, "peer": {"del-reason": "expired", "id": 6}}}
diff --git a/tools/testing/selftests/net/ovpn/json/peer0.json b/tools/testing/selftests/net/ovpn/json/peer0.json
new file mode 100644 (file)
index 0000000..7c46a33
--- /dev/null
@@ -0,0 +1,6 @@
+{"name": "peer-del-ntf", "msg": {"ifindex": 0, "peer": {"del-reason": "userspace", "id": 1}}}
+{"name": "peer-del-ntf", "msg": {"ifindex": 0, "peer": {"del-reason": "userspace", "id": 2}}}
+{"name": "peer-del-ntf", "msg": {"ifindex": 0, "peer": {"del-reason": "expired", "id": 3}}}
+{"name": "peer-del-ntf", "msg": {"ifindex": 0, "peer": {"del-reason": "expired", "id": 4}}}
+{"name": "peer-del-ntf", "msg": {"ifindex": 0, "peer": {"del-reason": "expired", "id": 5}}}
+{"name": "peer-del-ntf", "msg": {"ifindex": 0, "peer": {"del-reason": "expired", "id": 6}}}
diff --git a/tools/testing/selftests/net/ovpn/json/peer1-float.json b/tools/testing/selftests/net/ovpn/json/peer1-float.json
new file mode 120000 (symlink)
index 0000000..d28c328
--- /dev/null
@@ -0,0 +1 @@
+peer1.json
\ No newline at end of file
diff --git a/tools/testing/selftests/net/ovpn/json/peer1.json b/tools/testing/selftests/net/ovpn/json/peer1.json
new file mode 100644 (file)
index 0000000..5da4ea9
--- /dev/null
@@ -0,0 +1 @@
+{"name": "peer-del-ntf", "msg": {"ifindex": 0, "peer": {"del-reason": "userspace", "id": 1}}}
diff --git a/tools/testing/selftests/net/ovpn/json/peer2-float.json b/tools/testing/selftests/net/ovpn/json/peer2-float.json
new file mode 120000 (symlink)
index 0000000..b9f0998
--- /dev/null
@@ -0,0 +1 @@
+peer2.json
\ No newline at end of file
diff --git a/tools/testing/selftests/net/ovpn/json/peer2.json b/tools/testing/selftests/net/ovpn/json/peer2.json
new file mode 100644 (file)
index 0000000..8f6db4f
--- /dev/null
@@ -0,0 +1 @@
+{"name": "peer-del-ntf", "msg": {"ifindex": 0, "peer": {"del-reason": "userspace", "id": 2}}}
diff --git a/tools/testing/selftests/net/ovpn/json/peer3-float.json b/tools/testing/selftests/net/ovpn/json/peer3-float.json
new file mode 120000 (symlink)
index 0000000..2700b55
--- /dev/null
@@ -0,0 +1 @@
+peer3.json
\ No newline at end of file
diff --git a/tools/testing/selftests/net/ovpn/json/peer3.json b/tools/testing/selftests/net/ovpn/json/peer3.json
new file mode 100644 (file)
index 0000000..bdabd6f
--- /dev/null
@@ -0,0 +1 @@
+{"name": "peer-del-ntf", "msg": {"ifindex": 0, "peer": {"del-reason": "expired", "id": 3}}}
diff --git a/tools/testing/selftests/net/ovpn/json/peer4-float.json b/tools/testing/selftests/net/ovpn/json/peer4-float.json
new file mode 120000 (symlink)
index 0000000..460f6c1
--- /dev/null
@@ -0,0 +1 @@
+peer4.json
\ No newline at end of file
diff --git a/tools/testing/selftests/net/ovpn/json/peer4.json b/tools/testing/selftests/net/ovpn/json/peer4.json
new file mode 100644 (file)
index 0000000..c3734bb
--- /dev/null
@@ -0,0 +1 @@
+{"name": "peer-del-ntf", "msg": {"ifindex": 0, "peer": {"del-reason": "expired", "id": 4}}}
diff --git a/tools/testing/selftests/net/ovpn/json/peer5-float.json b/tools/testing/selftests/net/ovpn/json/peer5-float.json
new file mode 120000 (symlink)
index 0000000..0f725c5
--- /dev/null
@@ -0,0 +1 @@
+peer5.json
\ No newline at end of file
diff --git a/tools/testing/selftests/net/ovpn/json/peer5.json b/tools/testing/selftests/net/ovpn/json/peer5.json
new file mode 100644 (file)
index 0000000..46c4a34
--- /dev/null
@@ -0,0 +1 @@
+{"name": "peer-del-ntf", "msg": {"ifindex": 0, "peer": {"del-reason": "expired", "id": 5}}}
diff --git a/tools/testing/selftests/net/ovpn/json/peer6-float.json b/tools/testing/selftests/net/ovpn/json/peer6-float.json
new file mode 120000 (symlink)
index 0000000..4d9ded3
--- /dev/null
@@ -0,0 +1 @@
+peer6.json
\ No newline at end of file
diff --git a/tools/testing/selftests/net/ovpn/json/peer6.json b/tools/testing/selftests/net/ovpn/json/peer6.json
new file mode 100644 (file)
index 0000000..aa30f2c
--- /dev/null
@@ -0,0 +1 @@
+{"name": "peer-del-ntf", "msg": {"ifindex": 0, "peer": {"del-reason": "expired", "id": 6}}}
index d753eebe8716ed3588334ad766981e883ed2469a..b8f3cb33eaa2a7138c34a06344af179e3d0662a9 100644 (file)
@@ -3,3 +3,4 @@
 3 5.5.5.4
 4 5.5.5.5
 5 5.5.5.6
+6 5.5.5.7
index e8acdc30330704a1303c37a8b1c8d171b7371bbb..c2904342ec574481f3166379034dec956951e9d8 100755 (executable)
@@ -17,6 +17,10 @@ for p in $(seq 0 ${NUM_PEERS}); do
        create_ns ${p}
 done
 
+for p in $(seq 0 ${NUM_PEERS}); do
+       setup_listener ${p}
+done
+
 for p in $(seq 0 ${NUM_PEERS}); do
        setup_ns ${p} 5.5.5.$((${p} + 1))/24 ${MTU}
 done
@@ -112,6 +116,10 @@ for p in $(seq 3 ${NUM_PEERS}); do
 done
 sleep 5
 
+for p in $(seq 0 ${NUM_PEERS}); do
+       compare_ntfs ${p}
+done
+
 cleanup
 
 modprobe -r ovpn || true