linux/tools/testing/selftests/net/so_netns_cookie.c
<<
>>
Prefs
   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
  24int 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