Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 23a12b14 authored by Stephen Hemminger's avatar Stephen Hemminger Committed by David S. Miller
Browse files

ipip: convert to net_device_ops



Convert to network device ops. Needed to change to directly call
the init routine since two sides share same ops.  In the process
found by inspection a device ref count leak if register_netdevice failed.

Signed-off-by: default avatarStephen Hemminger <shemminger@vyatta.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 748ff68f
Loading
Loading
Loading
Loading
+17 −16
Original line number Diff line number Diff line
@@ -130,8 +130,8 @@ struct ipip_net {
	struct net_device *fb_tunnel_dev;
};

static int ipip_fb_tunnel_init(struct net_device *dev);
static int ipip_tunnel_init(struct net_device *dev);
static void ipip_fb_tunnel_init(struct net_device *dev);
static void ipip_tunnel_init(struct net_device *dev);
static void ipip_tunnel_setup(struct net_device *dev);

static DEFINE_RWLOCK(ipip_lock);
@@ -245,9 +245,10 @@ static struct ip_tunnel * ipip_tunnel_locate(struct net *net,
	}

	nt = netdev_priv(dev);
	dev->init = ipip_tunnel_init;
	nt->parms = *parms;

	ipip_tunnel_init(dev);

	if (register_netdevice(dev) < 0)
		goto failed_free;

@@ -691,12 +692,17 @@ static int ipip_tunnel_change_mtu(struct net_device *dev, int new_mtu)
	return 0;
}

static const struct net_device_ops ipip_netdev_ops = {
	.ndo_uninit	= ipip_tunnel_uninit,
	.ndo_start_xmit	= ipip_tunnel_xmit,
	.ndo_do_ioctl	= ipip_tunnel_ioctl,
	.ndo_change_mtu	= ipip_tunnel_change_mtu,

};

static void ipip_tunnel_setup(struct net_device *dev)
{
	dev->uninit		= ipip_tunnel_uninit;
	dev->hard_start_xmit	= ipip_tunnel_xmit;
	dev->do_ioctl		= ipip_tunnel_ioctl;
	dev->change_mtu		= ipip_tunnel_change_mtu;
	dev->netdev_ops		= &ipip_netdev_ops;
	dev->destructor		= free_netdev;

	dev->type		= ARPHRD_TUNNEL;
@@ -708,11 +714,9 @@ static void ipip_tunnel_setup(struct net_device *dev)
	dev->features		|= NETIF_F_NETNS_LOCAL;
}

static int ipip_tunnel_init(struct net_device *dev)
static void ipip_tunnel_init(struct net_device *dev)
{
	struct ip_tunnel *tunnel;

	tunnel = netdev_priv(dev);
	struct ip_tunnel *tunnel = netdev_priv(dev);

	tunnel->dev = dev;
	strcpy(tunnel->parms.name, dev->name);
@@ -721,11 +725,9 @@ static int ipip_tunnel_init(struct net_device *dev)
	memcpy(dev->broadcast, &tunnel->parms.iph.daddr, 4);

	ipip_tunnel_bind_dev(dev);

	return 0;
}

static int ipip_fb_tunnel_init(struct net_device *dev)
static void ipip_fb_tunnel_init(struct net_device *dev)
{
	struct ip_tunnel *tunnel = netdev_priv(dev);
	struct iphdr *iph = &tunnel->parms.iph;
@@ -740,7 +742,6 @@ static int ipip_fb_tunnel_init(struct net_device *dev)

	dev_hold(dev);
	ipn->tunnels_wc[0]	= tunnel;
	return 0;
}

static struct xfrm_tunnel ipip_handler = {
@@ -793,7 +794,7 @@ static int ipip_init_net(struct net *net)
		goto err_alloc_dev;
	}

	ipn->fb_tunnel_dev->init = ipip_fb_tunnel_init;
	ipip_fb_tunnel_init(ipn->fb_tunnel_dev);
	dev_net_set(ipn->fb_tunnel_dev, net);

	if ((err = register_netdev(ipn->fb_tunnel_dev)))