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

tools/testing: add a selftest for SO_NETNS_COOKIE

Make sure that SO_NETNS_COOKIE returns a non-zero value, and
that sockets from different namespaces have a distinct cookie
value.

Signed-off-by: Lorenz Bauer <lmb@cloudflare.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Lorenz Bauer and committed by
David S. Miller
ae24bab2 e8b9eab9

+64 -1
+1
tools/testing/selftests/net/.gitignore
··· 30 30 rxtimestamp 31 31 timestamping 32 32 txtimestamp 33 + so_netns_cookie
+1 -1
tools/testing/selftests/net/Makefile
··· 30 30 TEST_GEN_FILES += psock_fanout psock_tpacket msg_zerocopy reuseport_addr_any 31 31 TEST_GEN_FILES += tcp_mmap tcp_inq psock_snd txring_overwrite 32 32 TEST_GEN_FILES += udpgso udpgso_bench_tx udpgso_bench_rx ip_defrag 33 - TEST_GEN_FILES += so_txtime ipv6_flowlabel ipv6_flowlabel_mgr 33 + TEST_GEN_FILES += so_txtime ipv6_flowlabel ipv6_flowlabel_mgr so_netns_cookie 34 34 TEST_GEN_FILES += tcp_fastopen_backup_key 35 35 TEST_GEN_FILES += fin_ack_lat 36 36 TEST_GEN_FILES += reuseaddr_ports_exhausted
+1
tools/testing/selftests/net/config
··· 1 1 CONFIG_USER_NS=y 2 + CONFIG_NET_NS=y 2 3 CONFIG_BPF_SYSCALL=y 3 4 CONFIG_TEST_BPF=m 4 5 CONFIG_NUMA=y
+61
tools/testing/selftests/net/so_netns_cookie.c
··· 1 + // SPDX-License-Identifier: GPL-2.0 2 + #define _GNU_SOURCE 3 + #include <sched.h> 4 + #include <unistd.h> 5 + #include <stdio.h> 6 + #include <errno.h> 7 + #include <string.h> 8 + #include <stdlib.h> 9 + #include <stdint.h> 10 + #include <sys/types.h> 11 + #include <sys/socket.h> 12 + 13 + #ifndef SO_NETNS_COOKIE 14 + #define SO_NETNS_COOKIE 71 15 + #endif 16 + 17 + #define pr_err(fmt, ...) \ 18 + ({ \ 19 + fprintf(stderr, "%s:%d:" fmt ": %m\n", \ 20 + __func__, __LINE__, ##__VA_ARGS__); \ 21 + 1; \ 22 + }) 23 + 24 + int main(int argc, char *argvp[]) 25 + { 26 + uint64_t cookie1, cookie2; 27 + socklen_t vallen; 28 + int sock1, sock2; 29 + 30 + sock1 = socket(AF_INET, SOCK_STREAM, 0); 31 + if (sock1 < 0) 32 + return pr_err("Unable to create TCP socket"); 33 + 34 + vallen = sizeof(cookie1); 35 + if (getsockopt(sock1, SOL_SOCKET, SO_NETNS_COOKIE, &cookie1, &vallen) != 0) 36 + return pr_err("getsockopt(SOL_SOCKET, SO_NETNS_COOKIE)"); 37 + 38 + if (!cookie1) 39 + return pr_err("SO_NETNS_COOKIE returned zero cookie"); 40 + 41 + if (unshare(CLONE_NEWNET)) 42 + return pr_err("unshare"); 43 + 44 + sock2 = socket(AF_INET, SOCK_STREAM, 0); 45 + if (sock2 < 0) 46 + return pr_err("Unable to create TCP socket"); 47 + 48 + vallen = sizeof(cookie2); 49 + if (getsockopt(sock2, SOL_SOCKET, SO_NETNS_COOKIE, &cookie2, &vallen) != 0) 50 + return pr_err("getsockopt(SOL_SOCKET, SO_NETNS_COOKIE)"); 51 + 52 + if (!cookie2) 53 + return pr_err("SO_NETNS_COOKIE returned zero cookie"); 54 + 55 + if (cookie1 == cookie2) 56 + return pr_err("SO_NETNS_COOKIE returned identical cookies for distinct ns"); 57 + 58 + close(sock1); 59 + close(sock2); 60 + return 0; 61 + }