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