ipip: convert to net_device_ops
authorStephen Hemminger <shemminger@vyatta.com>
Fri, 21 Nov 2008 04:33:21 +0000 (20:33 -0800)
committerDavid S. Miller <davem@davemloft.net>
Fri, 21 Nov 2008 04:33:21 +0000 (20:33 -0800)
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: Stephen Hemminger <shemminger@vyatta.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/ipv4/ipip.c

index b3c3d7b0d1168ddc69f7c911d90b3f097e3b1e2a..9eb437cb821a2348512caf0ab360b407ba9e82b0 100644 (file)
@@ -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)))