Patchwork [net-next] Phonet: basic net namespace support

login
register
mail settings
Submitter Rémi Denis-Courmont
Date Dec. 1, 2008, 12:02 p.m.
Message ID <1228132957-18373-1-git-send-email-remi.denis-courmont@nokia.com>
Download mbox | patch
Permalink /patch/11552/
State Superseded
Delegated to: David Miller
Headers show

Comments

Rémi Denis-Courmont - Dec. 1, 2008, 12:02 p.m.
Signed-off-by: Rémi Denis-Courmont <remi.denis-courmont@nokia.com>
---
 include/net/phonet/phonet.h |    2 +-
 include/net/phonet/pn_dev.h |    2 +-
 net/phonet/af_phonet.c      |    8 +-------
 net/phonet/pn_dev.c         |    4 +++-
 net/phonet/socket.c         |   11 +++++++----
 5 files changed, 13 insertions(+), 14 deletions(-)
Denis V. Lunev - Dec. 1, 2008, 12:17 p.m.
On Mon, 2008-12-01 at 14:02 +0200, Rémi Denis-Courmont wrote:
[snip]
> -int phonet_address_lookup(u8 addr)
> +int phonet_address_lookup(struct net *net, u8 addr)
>  {
>  	struct phonet_device *pnd;
>  
>  	spin_lock_bh(&pndevs.lock);
>  	list_for_each_entry(pnd, &pndevs.list, list) {
> +		if (dev_net(pnd->netdev) != net)
> +			continue;
net_eq is better (noop without netns). also there are some similar
places below

Regards,
	Den

--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Rémi Denis-Courmont - Dec. 1, 2008, 12:36 p.m.
On Monday 01 December 2008 14:17:49 ext Denis V. Lunev, you wrote:
> On Mon, 2008-12-01 at 14:02 +0200, Rémi Denis-Courmont wrote:
> [snip]
>
> > -int phonet_address_lookup(u8 addr)
> > +int phonet_address_lookup(struct net *net, u8 addr)
> >  {
> >  	struct phonet_device *pnd;
> >
> >  	spin_lock_bh(&pndevs.lock);
> >  	list_for_each_entry(pnd, &pndevs.list, list) {
> > +		if (dev_net(pnd->netdev) != net)
> > +			continue;
>
> net_eq is better (noop without netns). also there are some similar
> places below

Ah ok, thanks for pointing it out. Here comes the two rewritten patches...
David Miller - Dec. 3, 2008, 11:43 p.m.
From: "Rémi Denis-Courmont" <remi.denis-courmont@nokia.com>
Date: Mon, 1 Dec 2008 14:36:24 +0200

> Ah ok, thanks for pointing it out. Here comes the two rewritten patches...

I've applied both updated patches.

Thank you.
--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Patch

diff --git a/include/net/phonet/phonet.h b/include/net/phonet/phonet.h
index c6a2451..057b0a8 100644
--- a/include/net/phonet/phonet.h
+++ b/include/net/phonet/phonet.h
@@ -46,7 +46,7 @@  static inline struct pn_sock *pn_sk(struct sock *sk)
 
 extern const struct proto_ops phonet_dgram_ops;
 
-struct sock *pn_find_sock_by_sa(const struct sockaddr_pn *sa);
+struct sock *pn_find_sock_by_sa(struct net *net, const struct sockaddr_pn *sa);
 void phonet_get_local_port_range(int *min, int *max);
 void pn_sock_hash(struct sock *sk);
 void pn_sock_unhash(struct sock *sk);
diff --git a/include/net/phonet/pn_dev.h b/include/net/phonet/pn_dev.h
index bbd2a83..aa1c59a 100644
--- a/include/net/phonet/pn_dev.h
+++ b/include/net/phonet/pn_dev.h
@@ -43,7 +43,7 @@  struct net_device *phonet_device_get(struct net *net);
 int phonet_address_add(struct net_device *dev, u8 addr);
 int phonet_address_del(struct net_device *dev, u8 addr);
 u8 phonet_address_get(struct net_device *dev, u8 addr);
-int phonet_address_lookup(u8 addr);
+int phonet_address_lookup(struct net *net, u8 addr);
 
 #define PN_NO_ADDR	0xff
 
diff --git a/net/phonet/af_phonet.c b/net/phonet/af_phonet.c
index 9d211f1..13cb323 100644
--- a/net/phonet/af_phonet.c
+++ b/net/phonet/af_phonet.c
@@ -67,9 +67,6 @@  static int pn_socket_create(struct net *net, struct socket *sock, int protocol)
 	struct phonet_protocol *pnp;
 	int err;
 
-	if (net != &init_net)
-		return -EAFNOSUPPORT;
-
 	if (!capable(CAP_SYS_ADMIN))
 		return -EPERM;
 
@@ -352,9 +349,6 @@  static int phonet_rcv(struct sk_buff *skb, struct net_device *dev,
 	struct sockaddr_pn sa;
 	u16 len;
 
-	if (dev_net(dev) != &init_net)
-		goto out;
-
 	/* check we have at least a full Phonet header */
 	if (!pskb_pull(skb, sizeof(struct phonethdr)))
 		goto out;
@@ -373,7 +367,7 @@  static int phonet_rcv(struct sk_buff *skb, struct net_device *dev,
 	if (pn_sockaddr_get_addr(&sa) == 0)
 		goto out; /* currently, we cannot be device 0 */
 
-	sk = pn_find_sock_by_sa(&sa);
+	sk = pn_find_sock_by_sa(dev_net(dev), &sa);
 	if (sk == NULL) {
 		if (can_respond(skb)) {
 			send_obj_unreachable(skb);
diff --git a/net/phonet/pn_dev.c b/net/phonet/pn_dev.c
index 53be9fc..020f457 100644
--- a/net/phonet/pn_dev.c
+++ b/net/phonet/pn_dev.c
@@ -140,12 +140,14 @@  u8 phonet_address_get(struct net_device *dev, u8 addr)
 	return addr;
 }
 
-int phonet_address_lookup(u8 addr)
+int phonet_address_lookup(struct net *net, u8 addr)
 {
 	struct phonet_device *pnd;
 
 	spin_lock_bh(&pndevs.lock);
 	list_for_each_entry(pnd, &pndevs.list, list) {
+		if (dev_net(pnd->netdev) != net)
+			continue;
 		/* Don't allow unregistering devices! */
 		if ((pnd->netdev->reg_state != NETREG_REGISTERED) ||
 				((pnd->netdev->flags & IFF_UP)) != IFF_UP)
diff --git a/net/phonet/socket.c b/net/phonet/socket.c
index d817401..f196201 100644
--- a/net/phonet/socket.c
+++ b/net/phonet/socket.c
@@ -57,7 +57,7 @@  static struct  {
  * Find address based on socket address, match only certain fields.
  * Also grab sock if it was found. Remember to sock_put it later.
  */
-struct sock *pn_find_sock_by_sa(const struct sockaddr_pn *spn)
+struct sock *pn_find_sock_by_sa(struct net *net, const struct sockaddr_pn *spn)
 {
 	struct hlist_node *node;
 	struct sock *sknode;
@@ -71,6 +71,8 @@  struct sock *pn_find_sock_by_sa(const struct sockaddr_pn *spn)
 		struct pn_sock *pn = pn_sk(sknode);
 		BUG_ON(!pn->sobject); /* unbound socket */
 
+		if (sock_net(sknode) != net)
+			continue;
 		if (pn_port(obj)) {
 			/* Look up socket by port */
 			if (pn_port(pn->sobject) != pn_port(obj))
@@ -130,7 +132,7 @@  static int pn_socket_bind(struct socket *sock, struct sockaddr *addr, int len)
 
 	handle = pn_sockaddr_get_object((struct sockaddr_pn *)addr);
 	saddr = pn_addr(handle);
-	if (saddr && phonet_address_lookup(saddr))
+	if (saddr && phonet_address_lookup(sock_net(sk), saddr))
 		return -EADDRNOTAVAIL;
 
 	lock_sock(sk);
@@ -361,6 +363,7 @@  static DEFINE_MUTEX(port_mutex);
 int pn_sock_get_port(struct sock *sk, unsigned short sport)
 {
 	static int port_cur;
+	struct net *net = sock_net(sk);
 	struct pn_sock *pn = pn_sk(sk);
 	struct sockaddr_pn try_sa;
 	struct sock *tmpsk;
@@ -381,7 +384,7 @@  int pn_sock_get_port(struct sock *sk, unsigned short sport)
 				port_cur = pmin;
 
 			pn_sockaddr_set_port(&try_sa, port_cur);
-			tmpsk = pn_find_sock_by_sa(&try_sa);
+			tmpsk = pn_find_sock_by_sa(net, &try_sa);
 			if (tmpsk == NULL) {
 				sport = port_cur;
 				goto found;
@@ -391,7 +394,7 @@  int pn_sock_get_port(struct sock *sk, unsigned short sport)
 	} else {
 		/* try to find specific port */
 		pn_sockaddr_set_port(&try_sa, sport);
-		tmpsk = pn_find_sock_by_sa(&try_sa);
+		tmpsk = pn_find_sock_by_sa(net, &try_sa);
 		if (tmpsk == NULL)
 			/* No sock there! We can use that port... */
 			goto found;