Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

selftests: ovpn: add notification parsing and matching

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>

authored by

Ralf Lici and committed by
Antonio Quartulli
77de28cd c841b676

+70 -3
+8 -1
tools/testing/selftests/net/ovpn/Makefile
··· 23 23 LDLIBS += $(NL_LDLIBS) 24 24 25 25 26 - TEST_FILES = common.sh 26 + TEST_FILES = \ 27 + common.sh \ 28 + data64.key \ 29 + json \ 30 + tcp_peers.txt \ 31 + udp_peers.txt \ 32 + ../../../../net/ynl/pyynl/cli.py \ 33 + # end of TEST_FILES 27 34 28 35 TEST_PROGS := \ 29 36 test-chachapoly.sh \
+32 -2
tools/testing/selftests/net/ovpn/common.sh
··· 7 7 UDP_PEERS_FILE=${UDP_PEERS_FILE:-udp_peers.txt} 8 8 TCP_PEERS_FILE=${TCP_PEERS_FILE:-tcp_peers.txt} 9 9 OVPN_CLI=${OVPN_CLI:-./ovpn-cli} 10 + YNL_CLI=${YNL_CLI:-../../../../net/ynl/pyynl/cli.py} 10 11 ALG=${ALG:-aes} 11 12 PROTO=${PROTO:-UDP} 12 13 FLOAT=${FLOAT:-0} 13 14 15 + JQ_FILTER='map(select(.msg.peer | has("remote-ipv6") | not)) | 16 + map(del(.msg.ifindex)) | sort_by(.msg.peer.id)[]' 14 17 LAN_IP="11.11.11.11" 18 + 19 + declare -A tmp_jsons=() 20 + declare -A listener_pids=() 15 21 16 22 create_ns() { 17 23 ip netns add peer${1} ··· 54 48 ip -n peer${1} link set tun${1} up 55 49 } 56 50 51 + setup_listener() { 52 + file=$(mktemp) 53 + PYTHONUNBUFFERED=1 ip netns exec peer${p} ${YNL_CLI} --family ovpn \ 54 + --subscribe peers --output-json --duration 40 > ${file} & 55 + listener_pids[$1]=$! 56 + tmp_jsons[$1]="${file}" 57 + } 58 + 57 59 add_peer() { 58 60 if [ "${PROTO}" == "UDP" ]; then 59 61 if [ ${1} -eq 0 ]; then ··· 96 82 fi 97 83 } 98 84 85 + compare_ntfs() { 86 + if [ ${#tmp_jsons[@]} -gt 0 ]; then 87 + [ "$FLOAT" == 1 ] && suffix="-float" 88 + expected="json/peer${1}${suffix}.json" 89 + received="${tmp_jsons[$1]}" 90 + 91 + kill -TERM ${listener_pids[$1]} || true 92 + wait ${listener_pids[$1]} || true 93 + printf "Checking notifications for peer ${1}... " 94 + if diff <(jq -s "${JQ_FILTER}" ${expected}) \ 95 + <(jq -s "${JQ_FILTER}" ${received}); then 96 + echo "OK" 97 + fi 98 + 99 + rm -f ${received} || true 100 + fi 101 + } 102 + 99 103 cleanup() { 100 104 # some ovpn-cli processes sleep in background so they need manual poking 101 105 killall $(basename ${OVPN_CLI}) 2>/dev/null || true ··· 136 104 else 137 105 NUM_PEERS=${NUM_PEERS:-$(wc -l ${TCP_PEERS_FILE} | awk '{print $1}')} 138 106 fi 139 - 140 -
+9
tools/testing/selftests/net/ovpn/json/peer0-float.json
··· 1 + {"name": "peer-float-ntf", "msg": {"ifindex": 0, "peer": {"id": 1, "remote-ipv4": "10.10.1.3", "remote-port": 1}}} 2 + {"name": "peer-float-ntf", "msg": {"ifindex": 0, "peer": {"id": 2, "remote-ipv4": "10.10.2.3", "remote-port": 1}}} 3 + {"name": "peer-float-ntf", "msg": {"ifindex": 0, "peer": {"id": 3, "remote-ipv4": "10.10.3.3", "remote-port": 1}}} 4 + {"name": "peer-del-ntf", "msg": {"ifindex": 0, "peer": {"del-reason": "userspace", "id": 1}}} 5 + {"name": "peer-del-ntf", "msg": {"ifindex": 0, "peer": {"del-reason": "userspace", "id": 2}}} 6 + {"name": "peer-del-ntf", "msg": {"ifindex": 0, "peer": {"del-reason": "expired", "id": 3}}} 7 + {"name": "peer-del-ntf", "msg": {"ifindex": 0, "peer": {"del-reason": "expired", "id": 4}}} 8 + {"name": "peer-del-ntf", "msg": {"ifindex": 0, "peer": {"del-reason": "expired", "id": 5}}} 9 + {"name": "peer-del-ntf", "msg": {"ifindex": 0, "peer": {"del-reason": "expired", "id": 6}}}
+6
tools/testing/selftests/net/ovpn/json/peer0.json
··· 1 + {"name": "peer-del-ntf", "msg": {"ifindex": 0, "peer": {"del-reason": "userspace", "id": 1}}} 2 + {"name": "peer-del-ntf", "msg": {"ifindex": 0, "peer": {"del-reason": "userspace", "id": 2}}} 3 + {"name": "peer-del-ntf", "msg": {"ifindex": 0, "peer": {"del-reason": "expired", "id": 3}}} 4 + {"name": "peer-del-ntf", "msg": {"ifindex": 0, "peer": {"del-reason": "expired", "id": 4}}} 5 + {"name": "peer-del-ntf", "msg": {"ifindex": 0, "peer": {"del-reason": "expired", "id": 5}}} 6 + {"name": "peer-del-ntf", "msg": {"ifindex": 0, "peer": {"del-reason": "expired", "id": 6}}}
+1
tools/testing/selftests/net/ovpn/json/peer1.json
··· 1 + {"name": "peer-del-ntf", "msg": {"ifindex": 0, "peer": {"del-reason": "userspace", "id": 1}}}
+1
tools/testing/selftests/net/ovpn/json/peer2.json
··· 1 + {"name": "peer-del-ntf", "msg": {"ifindex": 0, "peer": {"del-reason": "userspace", "id": 2}}}
+1
tools/testing/selftests/net/ovpn/json/peer3.json
··· 1 + {"name": "peer-del-ntf", "msg": {"ifindex": 0, "peer": {"del-reason": "expired", "id": 3}}}
+1
tools/testing/selftests/net/ovpn/json/peer4.json
··· 1 + {"name": "peer-del-ntf", "msg": {"ifindex": 0, "peer": {"del-reason": "expired", "id": 4}}}
+1
tools/testing/selftests/net/ovpn/json/peer5.json
··· 1 + {"name": "peer-del-ntf", "msg": {"ifindex": 0, "peer": {"del-reason": "expired", "id": 5}}}
+1
tools/testing/selftests/net/ovpn/json/peer6.json
··· 1 + {"name": "peer-del-ntf", "msg": {"ifindex": 0, "peer": {"del-reason": "expired", "id": 6}}}
+1
tools/testing/selftests/net/ovpn/tcp_peers.txt
··· 3 3 3 5.5.5.4 4 4 4 5.5.5.5 5 5 5 5.5.5.6 6 + 6 5.5.5.7
+8
tools/testing/selftests/net/ovpn/test.sh
··· 18 18 done 19 19 20 20 for p in $(seq 0 ${NUM_PEERS}); do 21 + setup_listener ${p} 22 + done 23 + 24 + for p in $(seq 0 ${NUM_PEERS}); do 21 25 setup_ns ${p} 5.5.5.$((${p} + 1))/24 ${MTU} 22 26 done 23 27 ··· 115 111 ip netns exec peer${p} ${OVPN_CLI} set_peer tun${p} ${p} 3 3 116 112 done 117 113 sleep 5 114 + 115 + for p in $(seq 0 ${NUM_PEERS}); do 116 + compare_ntfs ${p} 117 + done 118 118 119 119 cleanup 120 120