1/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
2#ifndef __LINUX_NSFS_H
3#define __LINUX_NSFS_H
4
5#include <linux/ioctl.h>
6#include <linux/types.h>
7
8#define NSIO 0xb7
9
10/* Returns a file descriptor that refers to an owning user namespace */
11#define NS_GET_USERNS _IO(NSIO, 0x1)
12/* Returns a file descriptor that refers to a parent namespace */
13#define NS_GET_PARENT _IO(NSIO, 0x2)
14/* Returns the type of namespace (CLONE_NEW* value) referred to by
15 file descriptor */
16#define NS_GET_NSTYPE _IO(NSIO, 0x3)
17/* Get owner UID (in the caller's user namespace) for a user namespace */
18#define NS_GET_OWNER_UID _IO(NSIO, 0x4)
19/* Translate pid from target pid namespace into the caller's pid namespace. */
20#define NS_GET_PID_FROM_PIDNS _IOR(NSIO, 0x6, int)
21/* Return thread-group leader id of pid in the callers pid namespace. */
22#define NS_GET_TGID_FROM_PIDNS _IOR(NSIO, 0x7, int)
23/* Translate pid from caller's pid namespace into a target pid namespace. */
24#define NS_GET_PID_IN_PIDNS _IOR(NSIO, 0x8, int)
25/* Return thread-group leader id of pid in the target pid namespace. */
26#define NS_GET_TGID_IN_PIDNS _IOR(NSIO, 0x9, int)
27
28struct mnt_ns_info {
29 __u32 size;
30 __u32 nr_mounts;
31 __u64 mnt_ns_id;
32};
33
34#define MNT_NS_INFO_SIZE_VER0 16 /* size of first published struct */
35
36/* Get information about namespace. */
37#define NS_MNT_GET_INFO _IOR(NSIO, 10, struct mnt_ns_info)
38/* Get next namespace. */
39#define NS_MNT_GET_NEXT _IOR(NSIO, 11, struct mnt_ns_info)
40/* Get previous namespace. */
41#define NS_MNT_GET_PREV _IOR(NSIO, 12, struct mnt_ns_info)
42
43/* Retrieve namespace identifiers. */
44#define NS_GET_MNTNS_ID _IOR(NSIO, 5, __u64)
45#define NS_GET_ID _IOR(NSIO, 13, __u64)
46
47enum init_ns_ino {
48 IPC_NS_INIT_INO = 0xEFFFFFFFU,
49 UTS_NS_INIT_INO = 0xEFFFFFFEU,
50 USER_NS_INIT_INO = 0xEFFFFFFDU,
51 PID_NS_INIT_INO = 0xEFFFFFFCU,
52 CGROUP_NS_INIT_INO = 0xEFFFFFFBU,
53 TIME_NS_INIT_INO = 0xEFFFFFFAU,
54 NET_NS_INIT_INO = 0xEFFFFFF9U,
55 MNT_NS_INIT_INO = 0xEFFFFFF8U,
56};
57
58struct nsfs_file_handle {
59 __u64 ns_id;
60 __u32 ns_type;
61 __u32 ns_inum;
62};
63
64#define NSFS_FILE_HANDLE_SIZE_VER0 16 /* sizeof first published struct */
65#define NSFS_FILE_HANDLE_SIZE_LATEST sizeof(struct nsfs_file_handle) /* sizeof latest published struct */
66
67enum init_ns_id {
68 IPC_NS_INIT_ID = 1ULL,
69 UTS_NS_INIT_ID = 2ULL,
70 USER_NS_INIT_ID = 3ULL,
71 PID_NS_INIT_ID = 4ULL,
72 CGROUP_NS_INIT_ID = 5ULL,
73 TIME_NS_INIT_ID = 6ULL,
74 NET_NS_INIT_ID = 7ULL,
75 MNT_NS_INIT_ID = 8ULL,
76};
77
78enum ns_type {
79 TIME_NS = (1ULL << 7), /* CLONE_NEWTIME */
80 MNT_NS = (1ULL << 17), /* CLONE_NEWNS */
81 CGROUP_NS = (1ULL << 25), /* CLONE_NEWCGROUP */
82 UTS_NS = (1ULL << 26), /* CLONE_NEWUTS */
83 IPC_NS = (1ULL << 27), /* CLONE_NEWIPC */
84 USER_NS = (1ULL << 28), /* CLONE_NEWUSER */
85 PID_NS = (1ULL << 29), /* CLONE_NEWPID */
86 NET_NS = (1ULL << 30), /* CLONE_NEWNET */
87};
88
89/**
90 * struct ns_id_req - namespace ID request structure
91 * @size: size of this structure
92 * @spare: reserved for future use
93 * @filter: filter mask
94 * @ns_id: last namespace id
95 * @user_ns_id: owning user namespace ID
96 *
97 * Structure for passing namespace ID and miscellaneous parameters to
98 * statns(2) and listns(2).
99 *
100 * For statns(2) @param represents the request mask.
101 * For listns(2) @param represents the last listed mount id (or zero).
102 */
103struct ns_id_req {
104 __u32 size;
105 __u32 spare;
106 __u64 ns_id;
107 struct /* listns */ {
108 __u32 ns_type;
109 __u32 spare2;
110 __u64 user_ns_id;
111 };
112};
113
114/*
115 * Special @user_ns_id value that can be passed to listns()
116 */
117#define LISTNS_CURRENT_USER 0xffffffffffffffff /* Caller's userns */
118
119/* List of all ns_id_req versions. */
120#define NS_ID_REQ_SIZE_VER0 32 /* sizeof first published struct */
121
122#endif /* __LINUX_NSFS_H */