|
Thomas Bogendoerfer |
5e7261 |
From: Christoph Hellwig <hch@lst.de>
|
|
Thomas Bogendoerfer |
5e7261 |
Date: Tue, 19 May 2020 15:03:13 +0200
|
|
Thomas Bogendoerfer |
5e7261 |
Subject: net: add a new ndo_tunnel_ioctl method
|
|
Thomas Bogendoerfer |
5e7261 |
Patch-mainline: v5.8-rc1
|
|
Thomas Bogendoerfer |
5e7261 |
Git-commit: 607259a695312cdfac2b52fb9d5b5890c834d573
|
|
Thomas Bogendoerfer |
5e7261 |
References: bsc#1176447
|
|
Thomas Bogendoerfer |
5e7261 |
|
|
Thomas Bogendoerfer |
5e7261 |
This method is used to properly allow kernel callers of the IPv4 route
|
|
Thomas Bogendoerfer |
5e7261 |
management ioctls. The exsting ip_tunnel_ioctl helper is renamed to
|
|
Thomas Bogendoerfer |
5e7261 |
ip_tunnel_ctl to better reflect that it doesn't directly implement ioctls
|
|
Thomas Bogendoerfer |
5e7261 |
touching user memory, and is used for the guts of ndo_tunnel_ctl
|
|
Thomas Bogendoerfer |
5e7261 |
implementations. A new ip_tunnel_ioctl helper is added that can be wired
|
|
Thomas Bogendoerfer |
5e7261 |
up directly to the ndo_do_ioctl method and takes care of the copy to and
|
|
Thomas Bogendoerfer |
5e7261 |
from userspace.
|
|
Thomas Bogendoerfer |
5e7261 |
|
|
Thomas Bogendoerfer |
5e7261 |
Signed-off-by: Christoph Hellwig <hch@lst.de>
|
|
Thomas Bogendoerfer |
5e7261 |
Signed-off-by: David S. Miller <davem@davemloft.net>
|
|
Thomas Bogendoerfer |
5e7261 |
Acked-by: Thomas Bogendoerfer <tbogendoerfer@suse.de>
|
|
Thomas Bogendoerfer |
5e7261 |
---
|
|
Thomas Bogendoerfer |
5e7261 |
include/linux/netdevice.h | 6 ++++++
|
|
Thomas Bogendoerfer |
5e7261 |
include/net/ip_tunnels.h | 3 ++-
|
|
Thomas Bogendoerfer |
5e7261 |
net/ipv4/ip_gre.c | 35 ++++++++++++++---------------------
|
|
Thomas Bogendoerfer |
5e7261 |
net/ipv4/ip_tunnel.c | 16 +++++++++++++++-
|
|
Thomas Bogendoerfer |
5e7261 |
net/ipv4/ip_vti.c | 32 +++++++++++++-------------------
|
|
Thomas Bogendoerfer |
5e7261 |
net/ipv4/ipip.c | 30 +++++++++---------------------
|
|
Thomas Bogendoerfer |
5e7261 |
6 files changed, 59 insertions(+), 63 deletions(-)
|
|
Thomas Bogendoerfer |
5e7261 |
|
|
Thomas Bogendoerfer |
5e7261 |
--- a/include/linux/netdevice.h
|
|
Thomas Bogendoerfer |
5e7261 |
+++ b/include/linux/netdevice.h
|
|
Thomas Bogendoerfer |
5e7261 |
@@ -53,6 +53,7 @@ struct netpoll_info;
|
|
Thomas Bogendoerfer |
5e7261 |
struct device;
|
|
Thomas Bogendoerfer |
5e7261 |
struct phy_device;
|
|
Thomas Bogendoerfer |
5e7261 |
struct dsa_port;
|
|
Thomas Bogendoerfer |
5e7261 |
+struct ip_tunnel_parm;
|
|
Thomas Bogendoerfer |
5e7261 |
struct macsec_context;
|
|
Thomas Bogendoerfer |
5e7261 |
struct macsec_ops;
|
|
Thomas Bogendoerfer |
5e7261 |
|
|
Thomas Bogendoerfer |
5e7261 |
@@ -1275,6 +1276,9 @@ struct netdev_net_notifier {
|
|
Thomas Bogendoerfer |
5e7261 |
* Get devlink port instance associated with a given netdev.
|
|
Thomas Bogendoerfer |
5e7261 |
* Called with a reference on the netdevice and devlink locks only,
|
|
Thomas Bogendoerfer |
5e7261 |
* rtnl_lock is not held.
|
|
Thomas Bogendoerfer |
5e7261 |
+ * int (*ndo_tunnel_ctl)(struct net_device *dev, struct ip_tunnel_parm *p,
|
|
Thomas Bogendoerfer |
5e7261 |
+ * int cmd);
|
|
Thomas Bogendoerfer |
5e7261 |
+ * Add, change, delete or get information on an IPv4 tunnel.
|
|
Thomas Bogendoerfer |
5e7261 |
*/
|
|
Thomas Bogendoerfer |
5e7261 |
struct net_device_ops {
|
|
Thomas Bogendoerfer |
5e7261 |
int (*ndo_init)(struct net_device *dev);
|
|
Thomas Bogendoerfer |
5e7261 |
@@ -1480,6 +1484,8 @@ struct net_device_ops {
|
|
Thomas Bogendoerfer |
5e7261 |
int (*ndo_xsk_wakeup)(struct net_device *dev,
|
|
Thomas Bogendoerfer |
5e7261 |
u32 queue_id, u32 flags);
|
|
Thomas Bogendoerfer |
5e7261 |
struct devlink_port * (*ndo_get_devlink_port)(struct net_device *dev);
|
|
Thomas Bogendoerfer |
5e7261 |
+ int (*ndo_tunnel_ctl)(struct net_device *dev,
|
|
Thomas Bogendoerfer |
5e7261 |
+ struct ip_tunnel_parm *p, int cmd);
|
|
Thomas Bogendoerfer |
5e7261 |
};
|
|
Thomas Bogendoerfer |
5e7261 |
|
|
Thomas Bogendoerfer |
5e7261 |
/**
|
|
Thomas Bogendoerfer |
5e7261 |
--- a/include/net/ip_tunnels.h
|
|
Thomas Bogendoerfer |
5e7261 |
+++ b/include/net/ip_tunnels.h
|
|
Thomas Bogendoerfer |
5e7261 |
@@ -269,7 +269,8 @@ void ip_tunnel_xmit(struct sk_buff *skb,
|
|
Thomas Bogendoerfer |
5e7261 |
const struct iphdr *tnl_params, const u8 protocol);
|
|
Thomas Bogendoerfer |
5e7261 |
void ip_md_tunnel_xmit(struct sk_buff *skb, struct net_device *dev,
|
|
Thomas Bogendoerfer |
5e7261 |
const u8 proto, int tunnel_hlen);
|
|
Thomas Bogendoerfer |
5e7261 |
-int ip_tunnel_ioctl(struct net_device *dev, struct ip_tunnel_parm *p, int cmd);
|
|
Thomas Bogendoerfer |
5e7261 |
+int ip_tunnel_ctl(struct net_device *dev, struct ip_tunnel_parm *p, int cmd);
|
|
Thomas Bogendoerfer |
5e7261 |
+int ip_tunnel_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd);
|
|
Thomas Bogendoerfer |
5e7261 |
int __ip_tunnel_change_mtu(struct net_device *dev, int new_mtu, bool strict);
|
|
Thomas Bogendoerfer |
5e7261 |
int ip_tunnel_change_mtu(struct net_device *dev, int new_mtu);
|
|
Thomas Bogendoerfer |
5e7261 |
|
|
Thomas Bogendoerfer |
5e7261 |
--- a/net/ipv4/ip_gre.c
|
|
Thomas Bogendoerfer |
5e7261 |
+++ b/net/ipv4/ip_gre.c
|
|
Thomas Bogendoerfer |
5e7261 |
@@ -747,45 +747,37 @@ static void ipgre_link_update(struct net
|
|
Thomas Bogendoerfer |
5e7261 |
}
|
|
Thomas Bogendoerfer |
5e7261 |
}
|
|
Thomas Bogendoerfer |
5e7261 |
|
|
Thomas Bogendoerfer |
5e7261 |
-static int ipgre_tunnel_ioctl(struct net_device *dev,
|
|
Thomas Bogendoerfer |
5e7261 |
- struct ifreq *ifr, int cmd)
|
|
Thomas Bogendoerfer |
5e7261 |
+static int ipgre_tunnel_ctl(struct net_device *dev, struct ip_tunnel_parm *p,
|
|
Thomas Bogendoerfer |
5e7261 |
+ int cmd)
|
|
Thomas Bogendoerfer |
5e7261 |
{
|
|
Thomas Bogendoerfer |
5e7261 |
- struct ip_tunnel_parm p;
|
|
Thomas Bogendoerfer |
5e7261 |
int err;
|
|
Thomas Bogendoerfer |
5e7261 |
|
|
Thomas Bogendoerfer |
5e7261 |
- if (copy_from_user(&p, ifr->ifr_ifru.ifru_data, sizeof(p)))
|
|
Thomas Bogendoerfer |
5e7261 |
- return -EFAULT;
|
|
Thomas Bogendoerfer |
5e7261 |
-
|
|
Thomas Bogendoerfer |
5e7261 |
if (cmd == SIOCADDTUNNEL || cmd == SIOCCHGTUNNEL) {
|
|
Thomas Bogendoerfer |
5e7261 |
- if (p.iph.version != 4 || p.iph.protocol != IPPROTO_GRE ||
|
|
Thomas Bogendoerfer |
5e7261 |
- p.iph.ihl != 5 || (p.iph.frag_off & htons(~IP_DF)) ||
|
|
Thomas Bogendoerfer |
5e7261 |
- ((p.i_flags | p.o_flags) & (GRE_VERSION | GRE_ROUTING)))
|
|
Thomas Bogendoerfer |
5e7261 |
+ if (p->iph.version != 4 || p->iph.protocol != IPPROTO_GRE ||
|
|
Thomas Bogendoerfer |
5e7261 |
+ p->iph.ihl != 5 || (p->iph.frag_off & htons(~IP_DF)) ||
|
|
Thomas Bogendoerfer |
5e7261 |
+ ((p->i_flags | p->o_flags) & (GRE_VERSION | GRE_ROUTING)))
|
|
Thomas Bogendoerfer |
5e7261 |
return -EINVAL;
|
|
Thomas Bogendoerfer |
5e7261 |
}
|
|
Thomas Bogendoerfer |
5e7261 |
|
|
Thomas Bogendoerfer |
5e7261 |
- p.i_flags = gre_flags_to_tnl_flags(p.i_flags);
|
|
Thomas Bogendoerfer |
5e7261 |
- p.o_flags = gre_flags_to_tnl_flags(p.o_flags);
|
|
Thomas Bogendoerfer |
5e7261 |
+ p->i_flags = gre_flags_to_tnl_flags(p->i_flags);
|
|
Thomas Bogendoerfer |
5e7261 |
+ p->o_flags = gre_flags_to_tnl_flags(p->o_flags);
|
|
Thomas Bogendoerfer |
5e7261 |
|
|
Thomas Bogendoerfer |
5e7261 |
- err = ip_tunnel_ioctl(dev, &p, cmd);
|
|
Thomas Bogendoerfer |
5e7261 |
+ err = ip_tunnel_ctl(dev, p, cmd);
|
|
Thomas Bogendoerfer |
5e7261 |
if (err)
|
|
Thomas Bogendoerfer |
5e7261 |
return err;
|
|
Thomas Bogendoerfer |
5e7261 |
|
|
Thomas Bogendoerfer |
5e7261 |
if (cmd == SIOCCHGTUNNEL) {
|
|
Thomas Bogendoerfer |
5e7261 |
struct ip_tunnel *t = netdev_priv(dev);
|
|
Thomas Bogendoerfer |
5e7261 |
|
|
Thomas Bogendoerfer |
5e7261 |
- t->parms.i_flags = p.i_flags;
|
|
Thomas Bogendoerfer |
5e7261 |
- t->parms.o_flags = p.o_flags;
|
|
Thomas Bogendoerfer |
5e7261 |
+ t->parms.i_flags = p->i_flags;
|
|
Thomas Bogendoerfer |
5e7261 |
+ t->parms.o_flags = p->o_flags;
|
|
Thomas Bogendoerfer |
5e7261 |
|
|
Thomas Bogendoerfer |
5e7261 |
if (strcmp(dev->rtnl_link_ops->kind, "erspan"))
|
|
Thomas Bogendoerfer |
5e7261 |
ipgre_link_update(dev, true);
|
|
Thomas Bogendoerfer |
5e7261 |
}
|
|
Thomas Bogendoerfer |
5e7261 |
|
|
Thomas Bogendoerfer |
5e7261 |
- p.i_flags = gre_tnl_flags_to_gre_flags(p.i_flags);
|
|
Thomas Bogendoerfer |
5e7261 |
- p.o_flags = gre_tnl_flags_to_gre_flags(p.o_flags);
|
|
Thomas Bogendoerfer |
5e7261 |
-
|
|
Thomas Bogendoerfer |
5e7261 |
- if (copy_to_user(ifr->ifr_ifru.ifru_data, &p, sizeof(p)))
|
|
Thomas Bogendoerfer |
5e7261 |
- return -EFAULT;
|
|
Thomas Bogendoerfer |
5e7261 |
-
|
|
Thomas Bogendoerfer |
5e7261 |
+ p->i_flags = gre_tnl_flags_to_gre_flags(p->i_flags);
|
|
Thomas Bogendoerfer |
5e7261 |
+ p->o_flags = gre_tnl_flags_to_gre_flags(p->o_flags);
|
|
Thomas Bogendoerfer |
5e7261 |
return 0;
|
|
Thomas Bogendoerfer |
5e7261 |
}
|
|
Thomas Bogendoerfer |
5e7261 |
|
|
Thomas Bogendoerfer |
5e7261 |
@@ -903,10 +895,11 @@ static const struct net_device_ops ipgre
|
|
Thomas Bogendoerfer |
5e7261 |
.ndo_stop = ipgre_close,
|
|
Thomas Bogendoerfer |
5e7261 |
#endif
|
|
Thomas Bogendoerfer |
5e7261 |
.ndo_start_xmit = ipgre_xmit,
|
|
Thomas Bogendoerfer |
5e7261 |
- .ndo_do_ioctl = ipgre_tunnel_ioctl,
|
|
Thomas Bogendoerfer |
5e7261 |
+ .ndo_do_ioctl = ip_tunnel_ioctl,
|
|
Thomas Bogendoerfer |
5e7261 |
.ndo_change_mtu = ip_tunnel_change_mtu,
|
|
Thomas Bogendoerfer |
5e7261 |
.ndo_get_stats64 = ip_tunnel_get_stats64,
|
|
Thomas Bogendoerfer |
5e7261 |
.ndo_get_iflink = ip_tunnel_get_iflink,
|
|
Thomas Bogendoerfer |
5e7261 |
+ .ndo_tunnel_ctl = ipgre_tunnel_ctl,
|
|
Thomas Bogendoerfer |
5e7261 |
};
|
|
Thomas Bogendoerfer |
5e7261 |
|
|
Thomas Bogendoerfer |
5e7261 |
#define GRE_FEATURES (NETIF_F_SG | \
|
|
Thomas Bogendoerfer |
5e7261 |
--- a/net/ipv4/ip_tunnel.c
|
|
Thomas Bogendoerfer |
5e7261 |
+++ b/net/ipv4/ip_tunnel.c
|
|
Thomas Bogendoerfer |
5e7261 |
@@ -860,7 +860,7 @@ static void ip_tunnel_update(struct ip_t
|
|
Thomas Bogendoerfer |
5e7261 |
netdev_state_change(dev);
|
|
Thomas Bogendoerfer |
5e7261 |
}
|
|
Thomas Bogendoerfer |
5e7261 |
|
|
Thomas Bogendoerfer |
5e7261 |
-int ip_tunnel_ioctl(struct net_device *dev, struct ip_tunnel_parm *p, int cmd)
|
|
Thomas Bogendoerfer |
5e7261 |
+int ip_tunnel_ctl(struct net_device *dev, struct ip_tunnel_parm *p, int cmd)
|
|
Thomas Bogendoerfer |
5e7261 |
{
|
|
Thomas Bogendoerfer |
5e7261 |
int err = 0;
|
|
Thomas Bogendoerfer |
5e7261 |
struct ip_tunnel *t = netdev_priv(dev);
|
|
Thomas Bogendoerfer |
5e7261 |
@@ -960,6 +960,20 @@ int ip_tunnel_ioctl(struct net_device *d
|
|
Thomas Bogendoerfer |
5e7261 |
done:
|
|
Thomas Bogendoerfer |
5e7261 |
return err;
|
|
Thomas Bogendoerfer |
5e7261 |
}
|
|
Thomas Bogendoerfer |
5e7261 |
+EXPORT_SYMBOL_GPL(ip_tunnel_ctl);
|
|
Thomas Bogendoerfer |
5e7261 |
+
|
|
Thomas Bogendoerfer |
5e7261 |
+int ip_tunnel_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
|
|
Thomas Bogendoerfer |
5e7261 |
+{
|
|
Thomas Bogendoerfer |
5e7261 |
+ struct ip_tunnel_parm p;
|
|
Thomas Bogendoerfer |
5e7261 |
+ int err;
|
|
Thomas Bogendoerfer |
5e7261 |
+
|
|
Thomas Bogendoerfer |
5e7261 |
+ if (copy_from_user(&p, ifr->ifr_ifru.ifru_data, sizeof(p)))
|
|
Thomas Bogendoerfer |
5e7261 |
+ return -EFAULT;
|
|
Thomas Bogendoerfer |
5e7261 |
+ err = dev->netdev_ops->ndo_tunnel_ctl(dev, &p, cmd);
|
|
Thomas Bogendoerfer |
5e7261 |
+ if (!err && copy_to_user(ifr->ifr_ifru.ifru_data, &p, sizeof(p)))
|
|
Thomas Bogendoerfer |
5e7261 |
+ return -EFAULT;
|
|
Thomas Bogendoerfer |
5e7261 |
+ return err;
|
|
Thomas Bogendoerfer |
5e7261 |
+}
|
|
Thomas Bogendoerfer |
5e7261 |
EXPORT_SYMBOL_GPL(ip_tunnel_ioctl);
|
|
Thomas Bogendoerfer |
5e7261 |
|
|
Thomas Bogendoerfer |
5e7261 |
int __ip_tunnel_change_mtu(struct net_device *dev, int new_mtu, bool strict)
|
|
Thomas Bogendoerfer |
5e7261 |
--- a/net/ipv4/ip_vti.c
|
|
Thomas Bogendoerfer |
5e7261 |
+++ b/net/ipv4/ip_vti.c
|
|
Thomas Bogendoerfer |
5e7261 |
@@ -378,38 +378,31 @@ static int vti4_err(struct sk_buff *skb,
|
|
Thomas Bogendoerfer |
5e7261 |
}
|
|
Thomas Bogendoerfer |
5e7261 |
|
|
Thomas Bogendoerfer |
5e7261 |
static int
|
|
Thomas Bogendoerfer |
5e7261 |
-vti_tunnel_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
|
|
Thomas Bogendoerfer |
5e7261 |
+vti_tunnel_ctl(struct net_device *dev, struct ip_tunnel_parm *p, int cmd)
|
|
Thomas Bogendoerfer |
5e7261 |
{
|
|
Thomas Bogendoerfer |
5e7261 |
int err = 0;
|
|
Thomas Bogendoerfer |
5e7261 |
- struct ip_tunnel_parm p;
|
|
Thomas Bogendoerfer |
5e7261 |
-
|
|
Thomas Bogendoerfer |
5e7261 |
- if (copy_from_user(&p, ifr->ifr_ifru.ifru_data, sizeof(p)))
|
|
Thomas Bogendoerfer |
5e7261 |
- return -EFAULT;
|
|
Thomas Bogendoerfer |
5e7261 |
|
|
Thomas Bogendoerfer |
5e7261 |
if (cmd == SIOCADDTUNNEL || cmd == SIOCCHGTUNNEL) {
|
|
Thomas Bogendoerfer |
5e7261 |
- if (p.iph.version != 4 || p.iph.protocol != IPPROTO_IPIP ||
|
|
Thomas Bogendoerfer |
5e7261 |
- p.iph.ihl != 5)
|
|
Thomas Bogendoerfer |
5e7261 |
+ if (p->iph.version != 4 || p->iph.protocol != IPPROTO_IPIP ||
|
|
Thomas Bogendoerfer |
5e7261 |
+ p->iph.ihl != 5)
|
|
Thomas Bogendoerfer |
5e7261 |
return -EINVAL;
|
|
Thomas Bogendoerfer |
5e7261 |
}
|
|
Thomas Bogendoerfer |
5e7261 |
|
|
Thomas Bogendoerfer |
5e7261 |
- if (!(p.i_flags & GRE_KEY))
|
|
Thomas Bogendoerfer |
5e7261 |
- p.i_key = 0;
|
|
Thomas Bogendoerfer |
5e7261 |
- if (!(p.o_flags & GRE_KEY))
|
|
Thomas Bogendoerfer |
5e7261 |
- p.o_key = 0;
|
|
Thomas Bogendoerfer |
5e7261 |
+ if (!(p->i_flags & GRE_KEY))
|
|
Thomas Bogendoerfer |
5e7261 |
+ p->i_key = 0;
|
|
Thomas Bogendoerfer |
5e7261 |
+ if (!(p->o_flags & GRE_KEY))
|
|
Thomas Bogendoerfer |
5e7261 |
+ p->o_key = 0;
|
|
Thomas Bogendoerfer |
5e7261 |
|
|
Thomas Bogendoerfer |
5e7261 |
- p.i_flags = VTI_ISVTI;
|
|
Thomas Bogendoerfer |
5e7261 |
+ p->i_flags = VTI_ISVTI;
|
|
Thomas Bogendoerfer |
5e7261 |
|
|
Thomas Bogendoerfer |
5e7261 |
- err = ip_tunnel_ioctl(dev, &p, cmd);
|
|
Thomas Bogendoerfer |
5e7261 |
+ err = ip_tunnel_ctl(dev, p, cmd);
|
|
Thomas Bogendoerfer |
5e7261 |
if (err)
|
|
Thomas Bogendoerfer |
5e7261 |
return err;
|
|
Thomas Bogendoerfer |
5e7261 |
|
|
Thomas Bogendoerfer |
5e7261 |
if (cmd != SIOCDELTUNNEL) {
|
|
Thomas Bogendoerfer |
5e7261 |
- p.i_flags |= GRE_KEY;
|
|
Thomas Bogendoerfer |
5e7261 |
- p.o_flags |= GRE_KEY;
|
|
Thomas Bogendoerfer |
5e7261 |
+ p->i_flags |= GRE_KEY;
|
|
Thomas Bogendoerfer |
5e7261 |
+ p->o_flags |= GRE_KEY;
|
|
Thomas Bogendoerfer |
5e7261 |
}
|
|
Thomas Bogendoerfer |
5e7261 |
-
|
|
Thomas Bogendoerfer |
5e7261 |
- if (copy_to_user(ifr->ifr_ifru.ifru_data, &p, sizeof(p)))
|
|
Thomas Bogendoerfer |
5e7261 |
- return -EFAULT;
|
|
Thomas Bogendoerfer |
5e7261 |
return 0;
|
|
Thomas Bogendoerfer |
5e7261 |
}
|
|
Thomas Bogendoerfer |
5e7261 |
|
|
Thomas Bogendoerfer |
5e7261 |
@@ -417,10 +410,11 @@ static const struct net_device_ops vti_n
|
|
Thomas Bogendoerfer |
5e7261 |
.ndo_init = vti_tunnel_init,
|
|
Thomas Bogendoerfer |
5e7261 |
.ndo_uninit = ip_tunnel_uninit,
|
|
Thomas Bogendoerfer |
5e7261 |
.ndo_start_xmit = vti_tunnel_xmit,
|
|
Thomas Bogendoerfer |
5e7261 |
- .ndo_do_ioctl = vti_tunnel_ioctl,
|
|
Thomas Bogendoerfer |
5e7261 |
+ .ndo_do_ioctl = ip_tunnel_ioctl,
|
|
Thomas Bogendoerfer |
5e7261 |
.ndo_change_mtu = ip_tunnel_change_mtu,
|
|
Thomas Bogendoerfer |
5e7261 |
.ndo_get_stats64 = ip_tunnel_get_stats64,
|
|
Thomas Bogendoerfer |
5e7261 |
.ndo_get_iflink = ip_tunnel_get_iflink,
|
|
Thomas Bogendoerfer |
5e7261 |
+ .ndo_tunnel_ctl = vti_tunnel_ctl,
|
|
Thomas Bogendoerfer |
5e7261 |
};
|
|
Thomas Bogendoerfer |
5e7261 |
|
|
Thomas Bogendoerfer |
5e7261 |
static void vti_tunnel_setup(struct net_device *dev)
|
|
Thomas Bogendoerfer |
5e7261 |
--- a/net/ipv4/ipip.c
|
|
Thomas Bogendoerfer |
5e7261 |
+++ b/net/ipv4/ipip.c
|
|
Thomas Bogendoerfer |
5e7261 |
@@ -327,41 +327,29 @@ static bool ipip_tunnel_ioctl_verify_pro
|
|
Thomas Bogendoerfer |
5e7261 |
}
|
|
Thomas Bogendoerfer |
5e7261 |
|
|
Thomas Bogendoerfer |
5e7261 |
static int
|
|
Thomas Bogendoerfer |
5e7261 |
-ipip_tunnel_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
|
|
Thomas Bogendoerfer |
5e7261 |
+ipip_tunnel_ctl(struct net_device *dev, struct ip_tunnel_parm *p, int cmd)
|
|
Thomas Bogendoerfer |
5e7261 |
{
|
|
Thomas Bogendoerfer |
5e7261 |
- int err = 0;
|
|
Thomas Bogendoerfer |
5e7261 |
- struct ip_tunnel_parm p;
|
|
Thomas Bogendoerfer |
5e7261 |
-
|
|
Thomas Bogendoerfer |
5e7261 |
- if (copy_from_user(&p, ifr->ifr_ifru.ifru_data, sizeof(p)))
|
|
Thomas Bogendoerfer |
5e7261 |
- return -EFAULT;
|
|
Thomas Bogendoerfer |
5e7261 |
-
|
|
Thomas Bogendoerfer |
5e7261 |
if (cmd == SIOCADDTUNNEL || cmd == SIOCCHGTUNNEL) {
|
|
Thomas Bogendoerfer |
5e7261 |
- if (p.iph.version != 4 ||
|
|
Thomas Bogendoerfer |
5e7261 |
- !ipip_tunnel_ioctl_verify_protocol(p.iph.protocol) ||
|
|
Thomas Bogendoerfer |
5e7261 |
- p.iph.ihl != 5 || (p.iph.frag_off&htons(~IP_DF)))
|
|
Thomas Bogendoerfer |
5e7261 |
+ if (p->iph.version != 4 ||
|
|
Thomas Bogendoerfer |
5e7261 |
+ !ipip_tunnel_ioctl_verify_protocol(p->iph.protocol) ||
|
|
Thomas Bogendoerfer |
5e7261 |
+ p->iph.ihl != 5 || (p->iph.frag_off & htons(~IP_DF)))
|
|
Thomas Bogendoerfer |
5e7261 |
return -EINVAL;
|
|
Thomas Bogendoerfer |
5e7261 |
}
|
|
Thomas Bogendoerfer |
5e7261 |
|
|
Thomas Bogendoerfer |
5e7261 |
- p.i_key = p.o_key = 0;
|
|
Thomas Bogendoerfer |
5e7261 |
- p.i_flags = p.o_flags = 0;
|
|
Thomas Bogendoerfer |
5e7261 |
- err = ip_tunnel_ioctl(dev, &p, cmd);
|
|
Thomas Bogendoerfer |
5e7261 |
- if (err)
|
|
Thomas Bogendoerfer |
5e7261 |
- return err;
|
|
Thomas Bogendoerfer |
5e7261 |
-
|
|
Thomas Bogendoerfer |
5e7261 |
- if (copy_to_user(ifr->ifr_ifru.ifru_data, &p, sizeof(p)))
|
|
Thomas Bogendoerfer |
5e7261 |
- return -EFAULT;
|
|
Thomas Bogendoerfer |
5e7261 |
-
|
|
Thomas Bogendoerfer |
5e7261 |
- return 0;
|
|
Thomas Bogendoerfer |
5e7261 |
+ p->i_key = p->o_key = 0;
|
|
Thomas Bogendoerfer |
5e7261 |
+ p->i_flags = p->o_flags = 0;
|
|
Thomas Bogendoerfer |
5e7261 |
+ return ip_tunnel_ctl(dev, p, cmd);
|
|
Thomas Bogendoerfer |
5e7261 |
}
|
|
Thomas Bogendoerfer |
5e7261 |
|
|
Thomas Bogendoerfer |
5e7261 |
static const struct net_device_ops ipip_netdev_ops = {
|
|
Thomas Bogendoerfer |
5e7261 |
.ndo_init = ipip_tunnel_init,
|
|
Thomas Bogendoerfer |
5e7261 |
.ndo_uninit = ip_tunnel_uninit,
|
|
Thomas Bogendoerfer |
5e7261 |
.ndo_start_xmit = ipip_tunnel_xmit,
|
|
Thomas Bogendoerfer |
5e7261 |
- .ndo_do_ioctl = ipip_tunnel_ioctl,
|
|
Thomas Bogendoerfer |
5e7261 |
+ .ndo_do_ioctl = ip_tunnel_ioctl,
|
|
Thomas Bogendoerfer |
5e7261 |
.ndo_change_mtu = ip_tunnel_change_mtu,
|
|
Thomas Bogendoerfer |
5e7261 |
.ndo_get_stats64 = ip_tunnel_get_stats64,
|
|
Thomas Bogendoerfer |
5e7261 |
.ndo_get_iflink = ip_tunnel_get_iflink,
|
|
Thomas Bogendoerfer |
5e7261 |
+ .ndo_tunnel_ctl = ipip_tunnel_ctl,
|
|
Thomas Bogendoerfer |
5e7261 |
};
|
|
Thomas Bogendoerfer |
5e7261 |
|
|
Thomas Bogendoerfer |
5e7261 |
#define IPIP_FEATURES (NETIF_F_SG | \
|