add SO_NSID and SO_NETNS socket options
Subsystems (11)
PATCH 4/6 add SO_NSID and SO_NETNS socket options
SO_NSID: bind a socket to a network namespace, given its nsid
This allows a process to have individual sockets in different namespaces.
Also, calling setsockopt(SO_NSID) on a socket before using it for ioctl() make the ioctl() operations happen in the given namespace. This is very useful to configure or retrieve networking information in a different namespace.
SO_NETNS: bind a process to an already existing netns, given its nsid
This is an easy way to move a process to a different, already existing, network namespace without creating a new one.
--- arch/alpha/include/asm/socket.h | 4 +++ arch/arm/include/asm/socket.h | 4 +++ arch/avr32/include/asm/socket.h | 4 +++ arch/blackfin/include/asm/socket.h | 4 +++ arch/h8300/include/asm/socket.h | 4 +++ arch/ia64/include/asm/socket.h | 4 +++ arch/mips/include/asm/socket.h | 4 +++ arch/parisc/include/asm/socket.h | 4 +++ arch/powerpc/include/asm/socket.h | 4 +++ arch/s390/include/asm/socket.h | 4 +++ arch/sh/include/asm/socket.h | 4 +++ arch/sparc/include/asm/socket.h | 4 +++ arch/x86/include/asm/socket.h | 4 +++ include/asm-cris/socket.h | 4 +++ include/asm-frv/socket.h | 4 +++ include/asm-m32r/socket.h | 4 +++ include/asm-m68k/socket.h | 4 +++ include/asm-mn10300/socket.h | 4 +++ include/asm-xtensa/socket.h | 4 +++ net/core/sock.c | 47 +++++++++++++++++++++++++++++++++++- 20 files changed, 122 insertions(+), 1 deletions(-)
arch/alpha/include/asm/socket.h +4 -0
@@ -62,6 +62,10 @@#define SO_MARK 36 +/* Namespace management */ +#define SO_NETNS 37 +#define SO_NSID 38 +/* O_NONBLOCK clashes with the bits used for socket types. Therefore we * have to define SOCK_NONBLOCK to a different value here. */
arch/arm/include/asm/socket.h +4 -0
@@ -54,4 +54,8 @@#define SO_MARK 36 +/* Namespace management */ +#define SO_NETNS 37 +#define SO_NSID 38 +#endif /* _ASM_SOCKET_H */
arch/avr32/include/asm/socket.h +4 -0
@@ -54,4 +54,8 @@#define SO_MARK 36 +/* Namespace management */ +#define SO_NETNS 37 +#define SO_NSID 38 +#endif /* __ASM_AVR32_SOCKET_H */
arch/blackfin/include/asm/socket.h +4 -0
@@ -53,4 +53,8 @@#define SO_MARK 36 +/* Namespace management */ +#define SO_NETNS 37 +#define SO_NSID 38 +#endif /* _ASM_SOCKET_H */
arch/h8300/include/asm/socket.h +4 -0
@@ -54,4 +54,8 @@#define SO_MARK 36 +/* Namespace management */ +#define SO_NETNS 37 +#define SO_NSID 38 +#endif /* _ASM_SOCKET_H */
arch/ia64/include/asm/socket.h +4 -0
@@ -63,4 +63,8 @@#define SO_MARK 36 +/* Namespace management */ +#define SO_NETNS 37 +#define SO_NSID 38 +#endif /* _ASM_IA64_SOCKET_H */
arch/mips/include/asm/socket.h +4 -0
@@ -75,6 +75,10 @@ To add: #define SO_REUSEPORT 0x0200 /* Allow local address and port reuse. */#define SO_MARK 36 +/* Namespace management */ +#define SO_NETNS 37 +#define SO_NSID 38 +#ifdef __KERNEL__/** sock_type - Socket types
arch/parisc/include/asm/socket.h +4 -0
@@ -54,6 +54,10 @@#define SO_MARK 0x401f +/* Namespace management */ +#define SO_NETNS 0x4020 +#define SO_NSID 0x4021 +/* O_NONBLOCK clashes with the bits used for socket types. Therefore we * have to define SOCK_NONBLOCK to a different value here. */
arch/powerpc/include/asm/socket.h +4 -0
@@ -61,4 +61,8 @@#define SO_MARK 36 +/* Namespace management */ +#define SO_NETNS 37 +#define SO_NSID 38 +#endif /* _ASM_POWERPC_SOCKET_H */
arch/s390/include/asm/socket.h +4 -0
@@ -62,4 +62,8 @@#define SO_MARK 36 +/* Namespace management */ +#define SO_NETNS 37 +#define SO_NSID 38 +#endif /* _ASM_SOCKET_H */
arch/sh/include/asm/socket.h +4 -0
@@ -54,4 +54,8 @@#define SO_MARK 36 +/* Namespace management */ +#define SO_NETNS 37 +#define SO_NSID 38 +#endif /* __ASM_SH_SOCKET_H */
arch/sparc/include/asm/socket.h +4 -0
@@ -50,6 +50,10 @@#define SO_MARK 0x0022 +/* Namespace management */ +#define SO_NETNS 0x0023 +#define SO_NSID 0x0024 +/* Security levels - as per NRL IPv6 - don't actually do anything */ #define SO_SECURITY_AUTHENTICATION 0x5001#define SO_SECURITY_ENCRYPTION_TRANSPORT 0x5002
arch/x86/include/asm/socket.h +4 -0
@@ -54,4 +54,8 @@#define SO_MARK 36 +/* Namespace management */ +#define SO_NETNS 37 +#define SO_NSID 38 +#endif /* _ASM_X86_SOCKET_H */
include/asm-cris/socket.h +4 -0
@@ -56,6 +56,10 @@#define SO_MARK 36 +/* Namespace management */ +#define SO_NETNS 37 +#define SO_NSID 38 +#endif /* _ASM_SOCKET_H */
include/asm-frv/socket.h +4 -0
@@ -54,5 +54,9 @@#define SO_MARK 36 +/* Namespace management */ +#define SO_NETNS 37 +#define SO_NSID 38 +#endif /* _ASM_SOCKET_H */
include/asm-m32r/socket.h +4 -0
@@ -54,4 +54,8 @@#define SO_MARK 36 +/* Namespace management */ +#define SO_NETNS 37 +#define SO_NSID 38 +#endif /* _ASM_M32R_SOCKET_H */
include/asm-m68k/socket.h +4 -0
@@ -54,4 +54,8 @@#define SO_MARK 36 +/* Namespace management */ +#define SO_NETNS 37 +#define SO_NSID 38 +#endif /* _ASM_SOCKET_H */
include/asm-mn10300/socket.h +4 -0
@@ -54,4 +54,8 @@#define SO_MARK 36 +/* Namespace management */ +#define SO_NETNS 37 +#define SO_NSID 38 +#endif /* _ASM_SOCKET_H */
include/asm-xtensa/socket.h +4 -0
@@ -65,4 +65,8 @@#define SO_MARK 36 +/* Namespace management */ +#define SO_NETNS 37 +#define SO_NSID 38 +#endif /* _XTENSA_SOCKET_H */
net/core/sock.c +46 -1
59 lines not on this page · raw message
Signature · 1 line
1.5.4.4
A message that is not in the archive (sent off-list or not yet received): [email protected]
Quoted 6 lines
net/core/sock.c +5
-0+case SO_NSID : +if (!capable (CAP_NET_ADMIN )) { + ret = -EPERM ; + }else { +struct net *old_net, *new_net;
net/core/sock.c set_rcvbuf: · line 712
Quoted 10 lines
net/core/sock.c +10
-0+ + ret = -EINVAL ; + new_net =get_net_ns_by_id (val); +if (new_net) { + ret =0 ; + old_net =sock_net (sk); +sock_net_set (sk,get_net (new_net)); +put_net (old_net); + } + }
Ouch. This is incomplete. We can't perform this transformation on a bound socket. And I don't see anything that would prevent that.
Eric