Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Phonet: basic net namespace support

Signed-off-by: Rémi Denis-Courmont <remi.denis-courmont@nokia.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Rémi Denis-Courmont and committed by
David S. Miller
52404881 d81d2285

+14 -15
+1 -1
include/net/phonet/phonet.h
··· 46 46 47 47 extern const struct proto_ops phonet_dgram_ops; 48 48 49 - struct sock *pn_find_sock_by_sa(const struct sockaddr_pn *sa); 49 + struct sock *pn_find_sock_by_sa(struct net *net, const struct sockaddr_pn *sa); 50 50 void phonet_get_local_port_range(int *min, int *max); 51 51 void pn_sock_hash(struct sock *sk); 52 52 void pn_sock_unhash(struct sock *sk);
+1 -1
include/net/phonet/pn_dev.h
··· 43 43 int phonet_address_add(struct net_device *dev, u8 addr); 44 44 int phonet_address_del(struct net_device *dev, u8 addr); 45 45 u8 phonet_address_get(struct net_device *dev, u8 addr); 46 - int phonet_address_lookup(u8 addr); 46 + int phonet_address_lookup(struct net *net, u8 addr); 47 47 48 48 #define PN_NO_ADDR 0xff 49 49
+1 -7
net/phonet/af_phonet.c
··· 67 67 struct phonet_protocol *pnp; 68 68 int err; 69 69 70 - if (net != &init_net) 71 - return -EAFNOSUPPORT; 72 - 73 70 if (!capable(CAP_SYS_ADMIN)) 74 71 return -EPERM; 75 72 ··· 349 352 struct sockaddr_pn sa; 350 353 u16 len; 351 354 352 - if (dev_net(dev) != &init_net) 353 - goto out; 354 - 355 355 /* check we have at least a full Phonet header */ 356 356 if (!pskb_pull(skb, sizeof(struct phonethdr))) 357 357 goto out; ··· 367 373 if (pn_sockaddr_get_addr(&sa) == 0) 368 374 goto out; /* currently, we cannot be device 0 */ 369 375 370 - sk = pn_find_sock_by_sa(&sa); 376 + sk = pn_find_sock_by_sa(dev_net(dev), &sa); 371 377 if (sk == NULL) { 372 378 if (can_respond(skb)) { 373 379 send_obj_unreachable(skb);
+4 -2
net/phonet/pn_dev.c
··· 76 76 dev = pnd->netdev; 77 77 BUG_ON(!dev); 78 78 79 - if (dev_net(dev) == net && 79 + if (net_eq(dev_net(dev), net) && 80 80 (dev->reg_state == NETREG_REGISTERED) && 81 81 ((pnd->netdev->flags & IFF_UP)) == IFF_UP) 82 82 break; ··· 140 140 return addr; 141 141 } 142 142 143 - int phonet_address_lookup(u8 addr) 143 + int phonet_address_lookup(struct net *net, u8 addr) 144 144 { 145 145 struct phonet_device *pnd; 146 146 147 147 spin_lock_bh(&pndevs.lock); 148 148 list_for_each_entry(pnd, &pndevs.list, list) { 149 + if (!net_eq(dev_net(pnd->netdev), net)) 150 + continue; 149 151 /* Don't allow unregistering devices! */ 150 152 if ((pnd->netdev->reg_state != NETREG_REGISTERED) || 151 153 ((pnd->netdev->flags & IFF_UP)) != IFF_UP)
+7 -4
net/phonet/socket.c
··· 57 57 * Find address based on socket address, match only certain fields. 58 58 * Also grab sock if it was found. Remember to sock_put it later. 59 59 */ 60 - struct sock *pn_find_sock_by_sa(const struct sockaddr_pn *spn) 60 + struct sock *pn_find_sock_by_sa(struct net *net, const struct sockaddr_pn *spn) 61 61 { 62 62 struct hlist_node *node; 63 63 struct sock *sknode; ··· 71 71 struct pn_sock *pn = pn_sk(sknode); 72 72 BUG_ON(!pn->sobject); /* unbound socket */ 73 73 74 + if (!net_eq(sock_net(sknode), net)) 75 + continue; 74 76 if (pn_port(obj)) { 75 77 /* Look up socket by port */ 76 78 if (pn_port(pn->sobject) != pn_port(obj)) ··· 132 130 133 131 handle = pn_sockaddr_get_object((struct sockaddr_pn *)addr); 134 132 saddr = pn_addr(handle); 135 - if (saddr && phonet_address_lookup(saddr)) 133 + if (saddr && phonet_address_lookup(sock_net(sk), saddr)) 136 134 return -EADDRNOTAVAIL; 137 135 138 136 lock_sock(sk); ··· 363 361 int pn_sock_get_port(struct sock *sk, unsigned short sport) 364 362 { 365 363 static int port_cur; 364 + struct net *net = sock_net(sk); 366 365 struct pn_sock *pn = pn_sk(sk); 367 366 struct sockaddr_pn try_sa; 368 367 struct sock *tmpsk; ··· 384 381 port_cur = pmin; 385 382 386 383 pn_sockaddr_set_port(&try_sa, port_cur); 387 - tmpsk = pn_find_sock_by_sa(&try_sa); 384 + tmpsk = pn_find_sock_by_sa(net, &try_sa); 388 385 if (tmpsk == NULL) { 389 386 sport = port_cur; 390 387 goto found; ··· 394 391 } else { 395 392 /* try to find specific port */ 396 393 pn_sockaddr_set_port(&try_sa, sport); 397 - tmpsk = pn_find_sock_by_sa(&try_sa); 394 + tmpsk = pn_find_sock_by_sa(net, &try_sa); 398 395 if (tmpsk == NULL) 399 396 /* No sock there! We can use that port... */ 400 397 goto found;