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 } 62