mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-04 18:09:57 +00:00
gtp: fix cross netns recv on gtp socket
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> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
c6ce1d08ee
commit
3ab1b469e8
1 changed files with 4 additions and 6 deletions
|
@ -69,7 +69,6 @@ struct gtp_dev {
|
||||||
struct socket *sock0;
|
struct socket *sock0;
|
||||||
struct socket *sock1u;
|
struct socket *sock1u;
|
||||||
|
|
||||||
struct net *net;
|
|
||||||
struct net_device *dev;
|
struct net_device *dev;
|
||||||
|
|
||||||
unsigned int hash_size;
|
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);
|
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) {
|
switch (udp_sk(sk)->encap_type) {
|
||||||
case UDP_ENCAP_GTP0:
|
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 int gtp_hashtable_new(struct gtp_dev *gtp, int hsize);
|
||||||
static void gtp_hashtable_free(struct gtp_dev *gtp);
|
static void gtp_hashtable_free(struct gtp_dev *gtp);
|
||||||
static int gtp_encap_enable(struct net_device *dev, 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,
|
static int gtp_newlink(struct net *src_net, struct net_device *dev,
|
||||||
struct nlattr *tb[], struct nlattr *data[])
|
struct nlattr *tb[], struct nlattr *data[])
|
||||||
|
@ -675,7 +674,7 @@ static int gtp_newlink(struct net *src_net, struct net_device *dev,
|
||||||
fd0 = nla_get_u32(data[IFLA_GTP_FD0]);
|
fd0 = nla_get_u32(data[IFLA_GTP_FD0]);
|
||||||
fd1 = nla_get_u32(data[IFLA_GTP_FD1]);
|
fd1 = nla_get_u32(data[IFLA_GTP_FD1]);
|
||||||
|
|
||||||
err = gtp_encap_enable(dev, gtp, fd0, fd1, src_net);
|
err = gtp_encap_enable(dev, gtp, fd0, fd1);
|
||||||
if (err < 0)
|
if (err < 0)
|
||||||
goto out_err;
|
goto out_err;
|
||||||
|
|
||||||
|
@ -821,7 +820,7 @@ static void gtp_hashtable_free(struct gtp_dev *gtp)
|
||||||
}
|
}
|
||||||
|
|
||||||
static int gtp_encap_enable(struct net_device *dev, 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)
|
||||||
{
|
{
|
||||||
struct udp_tunnel_sock_cfg tuncfg = {NULL};
|
struct udp_tunnel_sock_cfg tuncfg = {NULL};
|
||||||
struct socket *sock0, *sock1u;
|
struct socket *sock0, *sock1u;
|
||||||
|
@ -858,7 +857,6 @@ static int gtp_encap_enable(struct net_device *dev, struct gtp_dev *gtp,
|
||||||
|
|
||||||
gtp->sock0 = sock0;
|
gtp->sock0 = sock0;
|
||||||
gtp->sock1u = sock1u;
|
gtp->sock1u = sock1u;
|
||||||
gtp->net = src_net;
|
|
||||||
|
|
||||||
tuncfg.sk_user_data = gtp;
|
tuncfg.sk_user_data = gtp;
|
||||||
tuncfg.encap_rcv = gtp_encap_recv;
|
tuncfg.encap_rcv = gtp_encap_recv;
|
||||||
|
|
Loading…
Reference in a new issue