Skip to content

Commit 075de93

Browse files
btherydavem330
authored andcommitted
[NETNS][IPV6] af_inet6 - allow socket creation per namespace
Allow creation of IPv6 raw and datagram sockets in network namespaces other than init_net. Signed-off-by: Benjamin Thery <benjamin.thery@bull.net> Signed-off-by: Daniel Lezcano <dlezcano@fr.ibm.com> Signed-off-by: David S. Miller <davem@davemloft.net>
1 parent 94911fe commit 075de93

File tree

1 file changed

+4
-6
lines changed

1 file changed

+4
-6
lines changed

net/ipv6/af_inet6.c

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -92,9 +92,6 @@ static int inet6_create(struct net *net, struct socket *sock, int protocol)
9292
int try_loading_module = 0;
9393
int err;
9494

95-
if (net != &init_net)
96-
return -EAFNOSUPPORT;
97-
9895
if (sock->type != SOCK_RAW &&
9996
sock->type != SOCK_DGRAM &&
10097
!inet_ehash_secret)
@@ -248,6 +245,7 @@ int inet6_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
248245
struct sock *sk = sock->sk;
249246
struct inet_sock *inet = inet_sk(sk);
250247
struct ipv6_pinfo *np = inet6_sk(sk);
248+
struct net *net = sk->sk_net;
251249
__be32 v4addr = 0;
252250
unsigned short snum;
253251
int addr_type = 0;
@@ -278,7 +276,7 @@ int inet6_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
278276
/* Check if the address belongs to the host. */
279277
if (addr_type == IPV6_ADDR_MAPPED) {
280278
v4addr = addr->sin6_addr.s6_addr32[3];
281-
if (inet_addr_type(&init_net, v4addr) != RTN_LOCAL) {
279+
if (inet_addr_type(net, v4addr) != RTN_LOCAL) {
282280
err = -EADDRNOTAVAIL;
283281
goto out;
284282
}
@@ -300,7 +298,7 @@ int inet6_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
300298
err = -EINVAL;
301299
goto out;
302300
}
303-
dev = dev_get_by_index(&init_net, sk->sk_bound_dev_if);
301+
dev = dev_get_by_index(net, sk->sk_bound_dev_if);
304302
if (!dev) {
305303
err = -ENODEV;
306304
goto out;
@@ -312,7 +310,7 @@ int inet6_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
312310
*/
313311
v4addr = LOOPBACK4_IPV6;
314312
if (!(addr_type & IPV6_ADDR_MULTICAST)) {
315-
if (!ipv6_chk_addr(&init_net, &addr->sin6_addr,
313+
if (!ipv6_chk_addr(net, &addr->sin6_addr,
316314
dev, 0)) {
317315
if (dev)
318316
dev_put(dev);

0 commit comments

Comments
 (0)