| From foo@baz Wed May 28 21:03:54 PDT 2014 |
| From: Nicolas Dichtel <nicolas.dichtel@6wind.com> |
| Date: Mon, 14 Apr 2014 17:11:38 +0200 |
| Subject: ip6_gre: don't allow to remove the fb_tunnel_dev |
| |
| From: Nicolas Dichtel <nicolas.dichtel@6wind.com> |
| |
| [ Upstream commit 54d63f787b652755e66eb4dd8892ee6d3f5197fc ] |
| |
| It's possible to remove the FB tunnel with the command 'ip link del ip6gre0' but |
| this is unsafe, the module always supposes that this device exists. For example, |
| ip6gre_tunnel_lookup() may use it unconditionally. |
| |
| Let's add a rtnl handler for dellink, which will never remove the FB tunnel (we |
| let ip6gre_destroy_tunnels() do the job). |
| |
| Introduced by commit c12b395a4664 ("gre: Support GRE over IPv6"). |
| |
| CC: Dmitry Kozlov <xeb@mail.ru> |
| Signed-off-by: Nicolas Dichtel <nicolas.dichtel@6wind.com> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| net/ipv6/ip6_gre.c | 10 ++++++++++ |
| 1 file changed, 10 insertions(+) |
| |
| --- a/net/ipv6/ip6_gre.c |
| +++ b/net/ipv6/ip6_gre.c |
| @@ -1566,6 +1566,15 @@ static int ip6gre_changelink(struct net_ |
| return 0; |
| } |
| |
| +static void ip6gre_dellink(struct net_device *dev, struct list_head *head) |
| +{ |
| + struct net *net = dev_net(dev); |
| + struct ip6gre_net *ign = net_generic(net, ip6gre_net_id); |
| + |
| + if (dev != ign->fb_tunnel_dev) |
| + unregister_netdevice_queue(dev, head); |
| +} |
| + |
| static size_t ip6gre_get_size(const struct net_device *dev) |
| { |
| return |
| @@ -1643,6 +1652,7 @@ static struct rtnl_link_ops ip6gre_link_ |
| .validate = ip6gre_tunnel_validate, |
| .newlink = ip6gre_newlink, |
| .changelink = ip6gre_changelink, |
| + .dellink = ip6gre_dellink, |
| .get_size = ip6gre_get_size, |
| .fill_info = ip6gre_fill_info, |
| }; |