ip6tnl,gre6,vti6: implement ndo_get_iflink
[cascardo/linux.git] / net / ipv6 / ip6_vti.c
index 5fb9e21..b531484 100644 (file)
@@ -218,7 +218,7 @@ static struct ip6_tnl *vti6_tnl_create(struct net *net, struct __ip6_tnl_parm *p
                sprintf(name, "ip6_vti%%d");
 
        dev = alloc_netdev(sizeof(*t), name, NET_NAME_UNKNOWN, vti6_dev_setup);
-       if (dev == NULL)
+       if (!dev)
                goto failed;
 
        dev_net_set(dev, net);
@@ -305,7 +305,7 @@ static int vti6_rcv(struct sk_buff *skb)
 
        rcu_read_lock();
        t = vti6_tnl_lookup(dev_net(skb->dev), &ipv6h->saddr, &ipv6h->daddr);
-       if (t != NULL) {
+       if (t) {
                if (t->parms.proto != IPPROTO_IPV6 && t->parms.proto != 0) {
                        rcu_read_unlock();
                        goto discard;
@@ -601,8 +601,6 @@ static void vti6_link_config(struct ip6_tnl *t)
                dev->flags |= IFF_POINTOPOINT;
        else
                dev->flags &= ~IFF_POINTOPOINT;
-
-       dev->iflink = p->link;
 }
 
 /**
@@ -716,7 +714,7 @@ vti6_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
                } else {
                        memset(&p, 0, sizeof(p));
                }
-               if (t == NULL)
+               if (!t)
                        t = netdev_priv(dev);
                vti6_parm_to_user(&p, &t->parms);
                if (copy_to_user(ifr->ifr_ifru.ifru_data, &p, sizeof(p)))
@@ -736,7 +734,7 @@ vti6_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
                vti6_parm_from_user(&p1, &p);
                t = vti6_locate(net, &p1, cmd == SIOCADDTUNNEL);
                if (dev != ip6n->fb_tnl_dev && cmd == SIOCCHGTUNNEL) {
-                       if (t != NULL) {
+                       if (t) {
                                if (t->dev != dev) {
                                        err = -EEXIST;
                                        break;
@@ -767,7 +765,7 @@ vti6_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
                        err = -ENOENT;
                        vti6_parm_from_user(&p1, &p);
                        t = vti6_locate(net, &p1, 0);
-                       if (t == NULL)
+                       if (!t)
                                break;
                        err = -EPERM;
                        if (t->dev == ip6n->fb_tnl_dev)
@@ -808,6 +806,7 @@ static const struct net_device_ops vti6_netdev_ops = {
        .ndo_do_ioctl   = vti6_ioctl,
        .ndo_change_mtu = vti6_change_mtu,
        .ndo_get_stats64 = ip_tunnel_get_stats64,
+       .ndo_get_iflink = ip6_tnl_get_iflink,
 };
 
 /**
@@ -897,12 +896,10 @@ static void vti6_netlink_parms(struct nlattr *data[],
                parms->link = nla_get_u32(data[IFLA_VTI_LINK]);
 
        if (data[IFLA_VTI_LOCAL])
-               nla_memcpy(&parms->laddr, data[IFLA_VTI_LOCAL],
-                          sizeof(struct in6_addr));
+               parms->laddr = nla_get_in6_addr(data[IFLA_VTI_LOCAL]);
 
        if (data[IFLA_VTI_REMOTE])
-               nla_memcpy(&parms->raddr, data[IFLA_VTI_REMOTE],
-                          sizeof(struct in6_addr));
+               parms->raddr = nla_get_in6_addr(data[IFLA_VTI_REMOTE]);
 
        if (data[IFLA_VTI_IKEY])
                parms->i_key = nla_get_be32(data[IFLA_VTI_IKEY]);
@@ -983,10 +980,8 @@ static int vti6_fill_info(struct sk_buff *skb, const struct net_device *dev)
        struct __ip6_tnl_parm *parm = &tunnel->parms;
 
        if (nla_put_u32(skb, IFLA_VTI_LINK, parm->link) ||
-           nla_put(skb, IFLA_VTI_LOCAL, sizeof(struct in6_addr),
-                   &parm->laddr) ||
-           nla_put(skb, IFLA_VTI_REMOTE, sizeof(struct in6_addr),
-                   &parm->raddr) ||
+           nla_put_in6_addr(skb, IFLA_VTI_LOCAL, &parm->laddr) ||
+           nla_put_in6_addr(skb, IFLA_VTI_REMOTE, &parm->raddr) ||
            nla_put_be32(skb, IFLA_VTI_IKEY, parm->i_key) ||
            nla_put_be32(skb, IFLA_VTI_OKEY, parm->o_key))
                goto nla_put_failure;
@@ -1027,7 +1022,7 @@ static void __net_exit vti6_destroy_tunnels(struct vti6_net *ip6n)
 
        for (h = 0; h < HASH_SIZE; h++) {
                t = rtnl_dereference(ip6n->tnls_r_l[h]);
-               while (t != NULL) {
+               while (t) {
                        unregister_netdevice_queue(t->dev, &list);
                        t = rtnl_dereference(t->next);
                }