[net,v2,3/3] gtp: fix cross netns recv on gtp socket

Submitted by Andreas Schultz on Jan. 26, 2017, 3:11 p.m.

Details

Message ID 20170126151134.2892-4-aschultz@tpip.net
State New
Headers show

Commit Message

Andreas Schultz Jan. 26, 2017, 3:11 p.m.
The use of the passed through netlink src_net to check for a
cross netns operation was wrong. Using the GTP socket and the
GTP netdevice is always correct (even if the netdev has been
moved to new netns after link creation).

Remove the now obsolete net field from gtp_dev.

Signed-off-by: Andreas Schultz <aschultz@tpip.net>
---
 drivers/net/gtp.c | 6 ++----
 1 file changed, 2 insertions(+), 4 deletions(-)

Comments

Pablo Neira Jan. 26, 2017, 3:34 p.m.
On Thu, Jan 26, 2017 at 04:11:34PM +0100, Andreas Schultz wrote:
> The use of the passed through netlink src_net to check for a
> cross netns operation was wrong. Using the GTP socket and the
> GTP netdevice is always correct (even if the netdev has been
> moved to new netns after link creation).
> 
> Remove the now obsolete net field from gtp_dev.
> 
> Signed-off-by: Andreas Schultz <aschultz@tpip.net>

Acked-by: Pablo Neira Ayuso <pablo@netfilter.org>
David Miller Jan. 26, 2017, 7:22 p.m.
From: Andreas Schultz <aschultz@tpip.net>

Date: Thu, 26 Jan 2017 16:11:34 +0100

> The use of the passed through netlink src_net to check for a

> cross netns operation was wrong. Using the GTP socket and the

> GTP netdevice is always correct (even if the netdev has been

> moved to new netns after link creation).

> 

> Remove the now obsolete net field from gtp_dev.

> 

> Signed-off-by: Andreas Schultz <aschultz@tpip.net>


Please at least compile test your submissions:

drivers/net/gtp.c: In function ‘gtp_newlink’:
drivers/net/gtp.c:677:8: error: too many arguments to function ‘gtp_encap_enable’
  err = gtp_encap_enable(dev, gtp, fd0, fd1, src_net);
        ^
drivers/net/gtp.c:659:12: note: declared here
 static int gtp_encap_enable(struct net_device *dev, struct gtp_dev *gtp,
            ^
drivers/net/gtp.c: At top level:
drivers/net/gtp.c:822:12: error: conflicting types for ‘gtp_encap_enable’
 static int gtp_encap_enable(struct net_device *dev, struct gtp_dev *gtp,
            ^
drivers/net/gtp.c:659:12: note: previous declaration of ‘gtp_encap_enable’ was here
 static int gtp_encap_enable(struct net_device *dev, struct gtp_dev *gtp,
            ^
drivers/net/gtp.c:659:12: warning: ‘gtp_encap_enable’ used but never defined
drivers/net/gtp.c:822:12: warning: ‘gtp_encap_enable’ defined but not used [-Wunused-function]
 static int gtp_encap_enable(struct net_device *dev, struct gtp_dev *gtp,
            ^
scripts/Makefile.build:299: recipe for target 'drivers/net/gtp.o' failed

Patch hide | download patch | download mbox

diff --git a/drivers/net/gtp.c b/drivers/net/gtp.c
index 1df54d6..72dd1ba 100644
--- a/drivers/net/gtp.c
+++ b/drivers/net/gtp.c
@@ -69,7 +69,6 @@  struct gtp_dev {
 	struct socket		*sock0;
 	struct socket		*sock1u;
 
-	struct net		*net;
 	struct net_device	*dev;
 
 	unsigned int		hash_size;
@@ -316,7 +315,7 @@  static int gtp_encap_recv(struct sock *sk, struct sk_buff *skb)
 
 	netdev_dbg(gtp->dev, "encap_recv sk=%p\n", sk);
 
-	xnet = !net_eq(gtp->net, dev_net(gtp->dev));
+	xnet = !net_eq(sock_net(sk), dev_net(gtp->dev));
 
 	switch (udp_sk(sk)->encap_type) {
 	case UDP_ENCAP_GTP0:
@@ -658,7 +657,7 @@  static void gtp_link_setup(struct net_device *dev)
 static int gtp_hashtable_new(struct gtp_dev *gtp, int hsize);
 static void gtp_hashtable_free(struct gtp_dev *gtp);
 static int gtp_encap_enable(struct net_device *dev, struct gtp_dev *gtp,
-			    int fd_gtp0, int fd_gtp1, struct net *src_net);
+			    int fd_gtp0, int fd_gtp1);
 
 static int gtp_newlink(struct net *src_net, struct net_device *dev,
 			struct nlattr *tb[], struct nlattr *data[])
@@ -858,7 +857,6 @@  static int gtp_encap_enable(struct net_device *dev, struct gtp_dev *gtp,
 
 	gtp->sock0 = sock0;
 	gtp->sock1u = sock1u;
-	gtp->net = src_net;
 
 	tuncfg.sk_user_data = gtp;
 	tuncfg.encap_rcv = gtp_encap_recv;