remove useless union keyword in rtable, rt6_info and dn_route.
Since there is only one member in a union, the union keyword isn't useful.
Signed-off-by: Changli Gao <xiaosuo@gmail.com>
Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
 
        neigh = neigh_lookup(&arp_tbl, &rt->rt_gateway, rt->idev->dev);
        if (!neigh || !(neigh->nud_state & NUD_VALID)) {
-               neigh_event_send(rt->u.dst.neighbour, NULL);
+               neigh_event_send(rt->dst.neighbour, NULL);
                ret = -ENODATA;
                if (neigh)
                        goto release;
 
                       __func__);
                goto reject;
        }
-       dst = &rt->u.dst;
+       dst = &rt->dst;
        l2t = t3_l2t_get(tdev, dst->neighbour, dst->neighbour->dev);
        if (!l2t) {
                printk(KERN_ERR MOD "%s - failed to allocate l2t entry!\n",
                err = -EHOSTUNREACH;
                goto fail3;
        }
-       ep->dst = &rt->u.dst;
+       ep->dst = &rt->dst;
 
        /* get a l2t entry */
        ep->l2t = t3_l2t_get(ep->com.tdev, ep->dst->neighbour,
 
                       __func__);
                goto reject;
        }
-       dst = &rt->u.dst;
+       dst = &rt->dst;
        if (dst->neighbour->dev->flags & IFF_LOOPBACK) {
                pdev = ip_dev_find(&init_net, peer_ip);
                BUG_ON(!pdev);
                err = -EHOSTUNREACH;
                goto fail3;
        }
-       ep->dst = &rt->u.dst;
+       ep->dst = &rt->dst;
 
        /* get a l2t entry */
        if (ep->dst->neighbour->dev->flags & IFF_LOOPBACK) {
 
        }
 
        if ((neigh == NULL) || (!(neigh->nud_state & NUD_VALID)))
-               neigh_event_send(rt->u.dst.neighbour, NULL);
+               neigh_event_send(rt->dst.neighbour, NULL);
 
        ip_rt_put(rt);
        return rc;
 
                /*
                 * This target is not on a VLAN
                 */
-               if (rt->u.dst.dev == bond->dev) {
+               if (rt->dst.dev == bond->dev) {
                        ip_rt_put(rt);
                        pr_debug("basa: rtdev == bond->dev: arp_send\n");
                        bond_arp_send(slave->dev, ARPOP_REQUEST, targets[i],
                vlan_id = 0;
                list_for_each_entry(vlan, &bond->vlan_list, vlan_list) {
                        vlan_dev = vlan_group_get_device(bond->vlgrp, vlan->vlan_id);
-                       if (vlan_dev == rt->u.dst.dev) {
+                       if (vlan_dev == rt->dst.dev) {
                                vlan_id = vlan->vlan_id;
                                pr_debug("basa: vlan match on %s %d\n",
                                       vlan_dev->name, vlan_id);
                if (net_ratelimit()) {
                        pr_warning("%s: no path to arp_ip_target %pI4 via rt.dev %s\n",
                                   bond->dev->name, &fl.fl4_dst,
-                                  rt->u.dst.dev ? rt->u.dst.dev->name : "NULL");
+                                  rt->dst.dev ? rt->dst.dev->name : "NULL");
                }
                ip_rt_put(rt);
        }
 
 
        err = ip_route_output_key(&init_net, &rt, &fl);
        if (!err)
-               *dst = &rt->u.dst;
+               *dst = &rt->dst;
        return err;
 #else
        return -ENETUNREACH;
 
 
        err = ip_route_output_key(dev ? dev_net(dev) : &init_net, &rt, &fl);
        if (!err)
-               return (&rt->u.dst)->dev;
+               return (&rt->dst)->dev;
 
        return NULL;
 }
                c3cn->saddr.sin_addr.s_addr = rt->rt_src;
 
        /* now commit destination to connection */
-       c3cn->dst_cache = &rt->u.dst;
+       c3cn->dst_cache = &rt->dst;
 
        /* try to establish an offloaded connection */
        dev = cxgb3_egress_dev(c3cn->dst_cache->dev, c3cn, 0);
 
  * packets to the originating host.
  */
 struct dn_route {
-       union {
-               struct dst_entry dst;
-       } u;
+       struct dst_entry dst;
 
        struct flowi fl;
 
 
 struct fib6_table;
 
 struct rt6_info {
-       union {
-               struct dst_entry        dst;
-       } u;
+       struct dst_entry                dst;
 
-#define rt6i_dev                       u.dst.dev
-#define rt6i_nexthop                   u.dst.neighbour
-#define rt6i_expires                   u.dst.expires
+#define rt6i_dev                       dst.dev
+#define rt6i_nexthop                   dst.neighbour
+#define rt6i_expires                   dst.expires
 
        /*
         * Tail elements of dst_entry (__refcnt etc.)
 
        int pkt_len = skb->len - skb_transport_offset(skb);             \
                                                                        \
        skb->ip_summed = CHECKSUM_NONE;                                 \
-       ip_select_ident(iph, &rt->u.dst, NULL);                         \
+       ip_select_ident(iph, &rt->dst, NULL);                           \
                                                                        \
        err = ip_local_out(skb);                                        \
        if (likely(net_xmit_eval(err) == 0)) {                          \
 
 struct fib_nh;
 struct inet_peer;
 struct rtable {
-       union {
-               struct dst_entry        dst;
-       } u;
+       struct dst_entry        dst;
 
        /* Cache lookup keys */
        struct flowi            fl;
 static inline void ip_rt_put(struct rtable * rt)
 {
        if (rt)
-               dst_release(&rt->u.dst);
+               dst_release(&rt->dst);
 }
 
 #define IPTOS_RT_MASK  (IPTOS_TOS_MASK & ~3)
 
        error = ip_route_output_key(&init_net, &rt, &fl);
        if (error)
                return error;
-       neigh = __neigh_lookup(&clip_tbl, &ip, rt->u.dst.dev, 1);
+       neigh = __neigh_lookup(&clip_tbl, &ip, rt->dst.dev, 1);
        ip_rt_put(rt);
        if (!neigh)
                return -ENOMEM;
 
 
 #ifdef CONFIG_BRIDGE_NETFILTER
        /* remember the MTU in the rtable for PMTU */
-       br->fake_rtable.u.dst.metrics[RTAX_MTU - 1] = new_mtu;
+       br->fake_rtable.dst.metrics[RTAX_MTU - 1] = new_mtu;
 #endif
 
        return 0;
 
 {
        struct rtable *rt = &br->fake_rtable;
 
-       atomic_set(&rt->u.dst.__refcnt, 1);
-       rt->u.dst.dev = br->dev;
-       rt->u.dst.path = &rt->u.dst;
-       rt->u.dst.metrics[RTAX_MTU - 1] = 1500;
-       rt->u.dst.flags = DST_NOXFRM;
-       rt->u.dst.ops = &fake_dst_ops;
+       atomic_set(&rt->dst.__refcnt, 1);
+       rt->dst.dev = br->dev;
+       rt->dst.path = &rt->dst;
+       rt->dst.metrics[RTAX_MTU - 1] = 1500;
+       rt->dst.flags   = DST_NOXFRM;
+       rt->dst.ops = &fake_dst_ops;
 }
 
 static inline struct rtable *bridge_parent_rtable(const struct net_device *dev)
                kfree_skb(skb);
                return 0;
        }
-       dst_hold(&rt->u.dst);
-       skb_dst_set(skb, &rt->u.dst);
+       dst_hold(&rt->dst);
+       skb_dst_set(skb, &rt->dst);
 
        skb->dev = nf_bridge->physindev;
        nf_bridge_update_protocol(skb);
                        kfree_skb(skb);
                        return 0;
                }
-               dst_hold(&rt->u.dst);
-               skb_dst_set(skb, &rt->u.dst);
+               dst_hold(&rt->dst);
+               skb_dst_set(skb, &rt->dst);
        }
 
        skb->dev = nf_bridge->physindev;
 
                goto failure;
 
        /* OK, now commit destination to socket.  */
-       sk_setup_caps(sk, &rt->u.dst);
+       sk_setup_caps(sk, &rt->dst);
 
        dp->dccps_iss = secure_dccp_sequence_number(inet->inet_saddr,
                                                    inet->inet_daddr,
                return NULL;
        }
 
-       return &rt->u.dst;
+       return &rt->dst;
 }
 
 static int dccp_v4_send_response(struct sock *sk, struct request_sock *req,
 
 
 static inline void dnrt_free(struct dn_route *rt)
 {
-       call_rcu_bh(&rt->u.dst.rcu_head, dst_rcu_free);
+       call_rcu_bh(&rt->dst.rcu_head, dst_rcu_free);
 }
 
 static inline void dnrt_drop(struct dn_route *rt)
 {
-       dst_release(&rt->u.dst);
-       call_rcu_bh(&rt->u.dst.rcu_head, dst_rcu_free);
+       dst_release(&rt->dst);
+       call_rcu_bh(&rt->dst.rcu_head, dst_rcu_free);
 }
 
 static void dn_dst_check_expire(unsigned long dummy)
 
                spin_lock(&dn_rt_hash_table[i].lock);
                while((rt=*rtp) != NULL) {
-                       if (atomic_read(&rt->u.dst.__refcnt) ||
-                                       (now - rt->u.dst.lastuse) < expire) {
-                               rtp = &rt->u.dst.dn_next;
+                       if (atomic_read(&rt->dst.__refcnt) ||
+                                       (now - rt->dst.lastuse) < expire) {
+                               rtp = &rt->dst.dn_next;
                                continue;
                        }
-                       *rtp = rt->u.dst.dn_next;
-                       rt->u.dst.dn_next = NULL;
+                       *rtp = rt->dst.dn_next;
+                       rt->dst.dn_next = NULL;
                        dnrt_free(rt);
                }
                spin_unlock(&dn_rt_hash_table[i].lock);
                rtp = &dn_rt_hash_table[i].chain;
 
                while((rt=*rtp) != NULL) {
-                       if (atomic_read(&rt->u.dst.__refcnt) ||
-                                       (now - rt->u.dst.lastuse) < expire) {
-                               rtp = &rt->u.dst.dn_next;
+                       if (atomic_read(&rt->dst.__refcnt) ||
+                                       (now - rt->dst.lastuse) < expire) {
+                               rtp = &rt->dst.dn_next;
                                continue;
                        }
-                       *rtp = rt->u.dst.dn_next;
-                       rt->u.dst.dn_next = NULL;
+                       *rtp = rt->dst.dn_next;
+                       rt->dst.dn_next = NULL;
                        dnrt_drop(rt);
                        break;
                }
        while((rth = *rthp) != NULL) {
                if (compare_keys(&rth->fl, &rt->fl)) {
                        /* Put it first */
-                       *rthp = rth->u.dst.dn_next;
-                       rcu_assign_pointer(rth->u.dst.dn_next,
+                       *rthp = rth->dst.dn_next;
+                       rcu_assign_pointer(rth->dst.dn_next,
                                           dn_rt_hash_table[hash].chain);
                        rcu_assign_pointer(dn_rt_hash_table[hash].chain, rth);
 
-                       dst_use(&rth->u.dst, now);
+                       dst_use(&rth->dst, now);
                        spin_unlock_bh(&dn_rt_hash_table[hash].lock);
 
                        dnrt_drop(rt);
                        *rp = rth;
                        return 0;
                }
-               rthp = &rth->u.dst.dn_next;
+               rthp = &rth->dst.dn_next;
        }
 
-       rcu_assign_pointer(rt->u.dst.dn_next, dn_rt_hash_table[hash].chain);
+       rcu_assign_pointer(rt->dst.dn_next, dn_rt_hash_table[hash].chain);
        rcu_assign_pointer(dn_rt_hash_table[hash].chain, rt);
 
-       dst_use(&rt->u.dst, now);
+       dst_use(&rt->dst, now);
        spin_unlock_bh(&dn_rt_hash_table[hash].lock);
        *rp = rt;
        return 0;
                        goto nothing_to_declare;
 
                for(; rt; rt=next) {
-                       next = rt->u.dst.dn_next;
-                       rt->u.dst.dn_next = NULL;
+                       next = rt->dst.dn_next;
+                       rt->dst.dn_next = NULL;
                        dst_free((struct dst_entry *)rt);
                }
 
        /* Ensure that we have enough space for headers */
        rt = (struct dn_route *)skb_dst(skb);
        header_len = dn_db->use_long ? 21 : 6;
-       if (skb_cow(skb, LL_RESERVED_SPACE(rt->u.dst.dev)+header_len))
+       if (skb_cow(skb, LL_RESERVED_SPACE(rt->dst.dev)+header_len))
                goto drop;
 
        /*
        if (++cb->hops > 30)
                goto drop;
 
-       skb->dev = rt->u.dst.dev;
+       skb->dev = rt->dst.dev;
 
        /*
         * If packet goes out same interface it came in on, then set
 static int dn_rt_set_next_hop(struct dn_route *rt, struct dn_fib_res *res)
 {
        struct dn_fib_info *fi = res->fi;
-       struct net_device *dev = rt->u.dst.dev;
+       struct net_device *dev = rt->dst.dev;
        struct neighbour *n;
        unsigned mss;
 
                if (DN_FIB_RES_GW(*res) &&
                    DN_FIB_RES_NH(*res).nh_scope == RT_SCOPE_LINK)
                        rt->rt_gateway = DN_FIB_RES_GW(*res);
-               memcpy(rt->u.dst.metrics, fi->fib_metrics,
-                      sizeof(rt->u.dst.metrics));
+               memcpy(rt->dst.metrics, fi->fib_metrics,
+                      sizeof(rt->dst.metrics));
        }
        rt->rt_type = res->type;
 
-       if (dev != NULL && rt->u.dst.neighbour == NULL) {
+       if (dev != NULL && rt->dst.neighbour == NULL) {
                n = __neigh_lookup_errno(&dn_neigh_table, &rt->rt_gateway, dev);
                if (IS_ERR(n))
                        return PTR_ERR(n);
-               rt->u.dst.neighbour = n;
+               rt->dst.neighbour = n;
        }
 
-       if (dst_metric(&rt->u.dst, RTAX_MTU) == 0 ||
-           dst_metric(&rt->u.dst, RTAX_MTU) > rt->u.dst.dev->mtu)
-               rt->u.dst.metrics[RTAX_MTU-1] = rt->u.dst.dev->mtu;
-       mss = dn_mss_from_pmtu(dev, dst_mtu(&rt->u.dst));
-       if (dst_metric(&rt->u.dst, RTAX_ADVMSS) == 0 ||
-           dst_metric(&rt->u.dst, RTAX_ADVMSS) > mss)
-               rt->u.dst.metrics[RTAX_ADVMSS-1] = mss;
+       if (dst_metric(&rt->dst, RTAX_MTU) == 0 ||
+           dst_metric(&rt->dst, RTAX_MTU) > rt->dst.dev->mtu)
+               rt->dst.metrics[RTAX_MTU-1] = rt->dst.dev->mtu;
+       mss = dn_mss_from_pmtu(dev, dst_mtu(&rt->dst));
+       if (dst_metric(&rt->dst, RTAX_ADVMSS) == 0 ||
+           dst_metric(&rt->dst, RTAX_ADVMSS) > mss)
+               rt->dst.metrics[RTAX_ADVMSS-1] = mss;
        return 0;
 }
 
        if (rt == NULL)
                goto e_nobufs;
 
-       atomic_set(&rt->u.dst.__refcnt, 1);
-       rt->u.dst.flags   = DST_HOST;
+       atomic_set(&rt->dst.__refcnt, 1);
+       rt->dst.flags   = DST_HOST;
 
        rt->fl.fld_src    = oldflp->fld_src;
        rt->fl.fld_dst    = oldflp->fld_dst;
        rt->rt_dst_map    = fl.fld_dst;
        rt->rt_src_map    = fl.fld_src;
 
-       rt->u.dst.dev = dev_out;
+       rt->dst.dev = dev_out;
        dev_hold(dev_out);
-       rt->u.dst.neighbour = neigh;
+       rt->dst.neighbour = neigh;
        neigh = NULL;
 
-       rt->u.dst.lastuse = jiffies;
-       rt->u.dst.output  = dn_output;
-       rt->u.dst.input   = dn_rt_bug;
+       rt->dst.lastuse = jiffies;
+       rt->dst.output  = dn_output;
+       rt->dst.input   = dn_rt_bug;
        rt->rt_flags      = flags;
        if (flags & RTCF_LOCAL)
-               rt->u.dst.input = dn_nsp_rx;
+               rt->dst.input = dn_nsp_rx;
 
        err = dn_rt_set_next_hop(rt, &res);
        if (err)
        err = -ENOBUFS;
        goto done;
 e_neighbour:
-       dst_free(&rt->u.dst);
+       dst_free(&rt->dst);
        goto e_nobufs;
 }
 
        if (!(flags & MSG_TRYHARD)) {
                rcu_read_lock_bh();
                for (rt = rcu_dereference_bh(dn_rt_hash_table[hash].chain); rt;
-                       rt = rcu_dereference_bh(rt->u.dst.dn_next)) {
+                       rt = rcu_dereference_bh(rt->dst.dn_next)) {
                        if ((flp->fld_dst == rt->fl.fld_dst) &&
                            (flp->fld_src == rt->fl.fld_src) &&
                            (flp->mark == rt->fl.mark) &&
                            (rt->fl.iif == 0) &&
                            (rt->fl.oif == flp->oif)) {
-                               dst_use(&rt->u.dst, jiffies);
+                               dst_use(&rt->dst, jiffies);
                                rcu_read_unlock_bh();
-                               *pprt = &rt->u.dst;
+                               *pprt = &rt->dst;
                                return 0;
                        }
                }
        rt->fl.iif        = in_dev->ifindex;
        rt->fl.mark       = fl.mark;
 
-       rt->u.dst.flags = DST_HOST;
-       rt->u.dst.neighbour = neigh;
-       rt->u.dst.dev = out_dev;
-       rt->u.dst.lastuse = jiffies;
-       rt->u.dst.output = dn_rt_bug;
+       rt->dst.flags = DST_HOST;
+       rt->dst.neighbour = neigh;
+       rt->dst.dev = out_dev;
+       rt->dst.lastuse = jiffies;
+       rt->dst.output = dn_rt_bug;
        switch(res.type) {
                case RTN_UNICAST:
-                       rt->u.dst.input = dn_forward;
+                       rt->dst.input = dn_forward;
                        break;
                case RTN_LOCAL:
-                       rt->u.dst.output = dn_output;
-                       rt->u.dst.input = dn_nsp_rx;
-                       rt->u.dst.dev = in_dev;
+                       rt->dst.output = dn_output;
+                       rt->dst.input = dn_nsp_rx;
+                       rt->dst.dev = in_dev;
                        flags |= RTCF_LOCAL;
                        break;
                default:
                case RTN_UNREACHABLE:
                case RTN_BLACKHOLE:
-                       rt->u.dst.input = dst_discard;
+                       rt->dst.input = dst_discard;
        }
        rt->rt_flags = flags;
-       if (rt->u.dst.dev)
-               dev_hold(rt->u.dst.dev);
+       if (rt->dst.dev)
+               dev_hold(rt->dst.dev);
 
        err = dn_rt_set_next_hop(rt, &res);
        if (err)
 
        hash = dn_hash(rt->fl.fld_src, rt->fl.fld_dst);
        dn_insert_route(rt, hash, &rt);
-       skb_dst_set(skb, &rt->u.dst);
+       skb_dst_set(skb, &rt->dst);
 
 done:
        if (neigh)
        goto done;
 
 e_neighbour:
-       dst_free(&rt->u.dst);
+       dst_free(&rt->dst);
        goto done;
 }
 
 
        rcu_read_lock();
        for(rt = rcu_dereference(dn_rt_hash_table[hash].chain); rt != NULL;
-           rt = rcu_dereference(rt->u.dst.dn_next)) {
+           rt = rcu_dereference(rt->dst.dn_next)) {
                if ((rt->fl.fld_src == cb->src) &&
                    (rt->fl.fld_dst == cb->dst) &&
                    (rt->fl.oif == 0) &&
                    (rt->fl.mark == skb->mark) &&
                    (rt->fl.iif == cb->iif)) {
-                       dst_use(&rt->u.dst, jiffies);
+                       dst_use(&rt->dst, jiffies);
                        rcu_read_unlock();
                        skb_dst_set(skb, (struct dst_entry *)rt);
                        return 0;
                r->rtm_src_len = 16;
                RTA_PUT(skb, RTA_SRC, 2, &rt->fl.fld_src);
        }
-       if (rt->u.dst.dev)
-               RTA_PUT(skb, RTA_OIF, sizeof(int), &rt->u.dst.dev->ifindex);
+       if (rt->dst.dev)
+               RTA_PUT(skb, RTA_OIF, sizeof(int), &rt->dst.dev->ifindex);
        /*
         * Note to self - change this if input routes reverse direction when
         * they deal only with inputs and not with replies like they do
        RTA_PUT(skb, RTA_PREFSRC, 2, &rt->rt_local_src);
        if (rt->rt_daddr != rt->rt_gateway)
                RTA_PUT(skb, RTA_GATEWAY, 2, &rt->rt_gateway);
-       if (rtnetlink_put_metrics(skb, rt->u.dst.metrics) < 0)
+       if (rtnetlink_put_metrics(skb, rt->dst.metrics) < 0)
                goto rtattr_failure;
-       expires = rt->u.dst.expires ? rt->u.dst.expires - jiffies : 0;
-       if (rtnl_put_cacheinfo(skb, &rt->u.dst, 0, 0, 0, expires,
-                              rt->u.dst.error) < 0)
+       expires = rt->dst.expires ? rt->dst.expires - jiffies : 0;
+       if (rtnl_put_cacheinfo(skb, &rt->dst, 0, 0, 0, expires,
+                              rt->dst.error) < 0)
                goto rtattr_failure;
        if (rt->fl.iif)
                RTA_PUT(skb, RTA_IIF, sizeof(int), &rt->fl.iif);
                local_bh_enable();
                memset(cb, 0, sizeof(struct dn_skb_cb));
                rt = (struct dn_route *)skb_dst(skb);
-               if (!err && -rt->u.dst.error)
-                       err = rt->u.dst.error;
+               if (!err && -rt->dst.error)
+                       err = rt->dst.error;
        } else {
                int oif = 0;
                if (rta[RTA_OIF - 1])
        skb->dev = NULL;
        if (err)
                goto out_free;
-       skb_dst_set(skb, &rt->u.dst);
+       skb_dst_set(skb, &rt->dst);
        if (rtm->rtm_flags & RTM_F_NOTIFY)
                rt->rt_flags |= RTCF_NOTIFY;
 
                rcu_read_lock_bh();
                for(rt = rcu_dereference_bh(dn_rt_hash_table[h].chain), idx = 0;
                        rt;
-                       rt = rcu_dereference_bh(rt->u.dst.dn_next), idx++) {
+                       rt = rcu_dereference_bh(rt->dst.dn_next), idx++) {
                        if (idx < s_idx)
                                continue;
-                       skb_dst_set(skb, dst_clone(&rt->u.dst));
+                       skb_dst_set(skb, dst_clone(&rt->dst));
                        if (dn_rt_fill_info(skb, NETLINK_CB(cb->skb).pid,
                                        cb->nlh->nlmsg_seq, RTM_NEWROUTE,
                                        1, NLM_F_MULTI) <= 0) {
 {
        struct dn_rt_cache_iter_state *s = seq->private;
 
-       rt = rt->u.dst.dn_next;
+       rt = rt->dst.dn_next;
        while(!rt) {
                rcu_read_unlock_bh();
                if (--s->bucket < 0)
        char buf1[DN_ASCBUF_LEN], buf2[DN_ASCBUF_LEN];
 
        seq_printf(seq, "%-8s %-7s %-7s %04d %04d %04d\n",
-                       rt->u.dst.dev ? rt->u.dst.dev->name : "*",
+                       rt->dst.dev ? rt->dst.dev->name : "*",
                        dn_addr2asc(le16_to_cpu(rt->rt_daddr), buf1),
                        dn_addr2asc(le16_to_cpu(rt->rt_saddr), buf2),
-                       atomic_read(&rt->u.dst.__refcnt),
-                       rt->u.dst.__use,
-                       (int) dst_metric(&rt->u.dst, RTAX_RTT));
+                       atomic_read(&rt->dst.__refcnt),
+                       rt->dst.__use,
+                       (int) dst_metric(&rt->dst, RTAX_RTT));
        return 0;
 }
 
 
 __be16 eth_type_trans(struct sk_buff *skb, struct net_device *dev)
 {
        struct ethhdr *eth;
-       unsigned char *rawp;
 
        skb->dev = dev;
        skb_reset_mac_header(skb);
        if (ntohs(eth->h_proto) >= 1536)
                return eth->h_proto;
 
-       rawp = skb->data;
-
        /*
         *      This is a magic hack to spot IPX packets. Older Novell breaks
         *      the protocol design and runs IPX over 802.3 without an 802.2 LLC
         *      layer. We look for FFFF which isn't a used 802.2 SSAP/DSAP. This
         *      won't work for fault tolerant netware but does for the rest.
         */
-       if (*(unsigned short *)rawp == 0xFFFF)
+       if (skb->len >= 2 && *(unsigned short *)(skb->data) == 0xFFFF)
                return htons(ETH_P_802_3);
 
        /*
 
        if (err)
                return err;
 
-       sk_setup_caps(sk, &rt->u.dst);
+       sk_setup_caps(sk, &rt->dst);
 
        new_saddr = rt->rt_src;
 
        err = ip_route_output_flow(sock_net(sk), &rt, &fl, sk, 0);
 }
        if (!err)
-               sk_setup_caps(sk, &rt->u.dst);
+               sk_setup_caps(sk, &rt->dst);
        else {
                /* Routing failed... */
                sk->sk_route_caps = 0;
 
 
        if (ip_route_output_key(net, &rt, &fl) < 0)
                return 1;
-       if (rt->u.dst.dev != dev) {
+       if (rt->dst.dev != dev) {
                NET_INC_STATS_BH(net, LINUX_MIB_ARPFILTER);
                flag = 1;
        }
        struct in_device *out_dev;
        int imi, omi = -1;
 
-       if (rt->u.dst.dev == dev)
+       if (rt->dst.dev == dev)
                return 0;
 
        if (!IN_DEV_PROXY_ARP(in_dev))
 
        /* place to check for proxy_arp for routes */
 
-       out_dev = __in_dev_get_rcu(rt->u.dst.dev);
+       out_dev = __in_dev_get_rcu(rt->dst.dev);
        if (out_dev)
                omi = IN_DEV_MEDIUM_ID(out_dev);
 
                                __be32 sip, __be32 tip)
 {
        /* Private VLAN is only concerned about the same ethernet segment */
-       if (rt->u.dst.dev != dev)
+       if (rt->dst.dev != dev)
                return 0;
 
        /* Don't reply on self probes (often done by windowz boxes)*/
                struct rtable * rt;
                if ((err = ip_route_output_key(net, &rt, &fl)) != 0)
                        return err;
-               dev = rt->u.dst.dev;
+               dev = rt->dst.dev;
                ip_rt_put(rt);
                if (!dev)
                        return -EINVAL;
                struct rtable * rt;
                if ((err = ip_route_output_key(net, &rt, &fl)) != 0)
                        return err;
-               dev = rt->u.dst.dev;
+               dev = rt->dst.dev;
                ip_rt_put(rt);
                if (!dev)
                        return -EINVAL;
 
        sk->sk_state = TCP_ESTABLISHED;
        inet->inet_id = jiffies;
 
-       sk_dst_set(sk, &rt->u.dst);
+       sk_dst_set(sk, &rt->dst);
        return(0);
 }
 
 
 static inline int icmpv4_xrlim_allow(struct net *net, struct rtable *rt,
                int type, int code)
 {
-       struct dst_entry *dst = &rt->u.dst;
+       struct dst_entry *dst = &rt->dst;
        int rc = 1;
 
        if (type > NR_ICMP_TYPES)
        struct sock *sk;
        struct sk_buff *skb;
 
-       sk = icmp_sk(dev_net((*rt)->u.dst.dev));
+       sk = icmp_sk(dev_net((*rt)->dst.dev));
        if (ip_append_data(sk, icmp_glue_bits, icmp_param,
                           icmp_param->data_len+icmp_param->head_len,
                           icmp_param->head_len,
 {
        struct ipcm_cookie ipc;
        struct rtable *rt = skb_rtable(skb);
-       struct net *net = dev_net(rt->u.dst.dev);
+       struct net *net = dev_net(rt->dst.dev);
        struct sock *sk;
        struct inet_sock *inet;
        __be32 daddr;
 
        if (!rt)
                goto out;
-       net = dev_net(rt->u.dst.dev);
+       net = dev_net(rt->dst.dev);
 
        /*
         *      Find the original header. It is expected to be valid, of course.
                        /* Ugh! */
                        orefdst = skb_in->_skb_refdst; /* save old refdst */
                        err = ip_route_input(skb_in, fl.fl4_dst, fl.fl4_src,
-                                            RT_TOS(tos), rt2->u.dst.dev);
+                                            RT_TOS(tos), rt2->dst.dev);
 
-                       dst_release(&rt2->u.dst);
+                       dst_release(&rt2->dst);
                        rt2 = skb_rtable(skb_in);
                        skb_in->_skb_refdst = orefdst; /* restore old refdst */
                }
                                  XFRM_LOOKUP_ICMP);
                switch (err) {
                case 0:
-                       dst_release(&rt->u.dst);
+                       dst_release(&rt->dst);
                        rt = rt2;
                        break;
                case -EPERM:
 
        /* RFC says return as much as we can without exceeding 576 bytes. */
 
-       room = dst_mtu(&rt->u.dst);
+       room = dst_mtu(&rt->dst);
        if (room > 576)
                room = 576;
        room -= sizeof(struct iphdr) + icmp_param.replyopts.optlen;
 {
        struct icmphdr *icmph;
        struct rtable *rt = skb_rtable(skb);
-       struct net *net = dev_net(rt->u.dst.dev);
+       struct net *net = dev_net(rt->dst.dev);
 
        if (!xfrm4_policy_check(NULL, XFRM_POLICY_IN, skb)) {
                struct sec_path *sp = skb_sec_path(skb);
 
                return NULL;
        }
 
-       skb_dst_set(skb, &rt->u.dst);
+       skb_dst_set(skb, &rt->dst);
        skb->dev = dev;
 
        skb_reserve(skb, LL_RESERVED_SPACE(dev));
        pip->saddr    = rt->rt_src;
        pip->protocol = IPPROTO_IGMP;
        pip->tot_len  = 0;      /* filled in later */
-       ip_select_ident(pip, &rt->u.dst, NULL);
+       ip_select_ident(pip, &rt->dst, NULL);
        ((u8*)&pip[1])[0] = IPOPT_RA;
        ((u8*)&pip[1])[1] = 4;
        ((u8*)&pip[1])[2] = 0;
                return -1;
        }
 
-       skb_dst_set(skb, &rt->u.dst);
+       skb_dst_set(skb, &rt->dst);
 
        skb_reserve(skb, LL_RESERVED_SPACE(dev));
 
        iph->daddr    = dst;
        iph->saddr    = rt->rt_src;
        iph->protocol = IPPROTO_IGMP;
-       ip_select_ident(iph, &rt->u.dst, NULL);
+       ip_select_ident(iph, &rt->dst, NULL);
        ((u8*)&iph[1])[0] = IPOPT_RA;
        ((u8*)&iph[1])[1] = 4;
        ((u8*)&iph[1])[2] = 0;
        }
 
        if (!dev && !ip_route_output_key(net, &rt, &fl)) {
-               dev = rt->u.dst.dev;
+               dev = rt->dst.dev;
                ip_rt_put(rt);
        }
        if (dev) {
 
                goto no_route;
        if (opt && opt->is_strictroute && rt->rt_dst != rt->rt_gateway)
                goto route_err;
-       return &rt->u.dst;
+       return &rt->dst;
 
 route_err:
        ip_rt_put(rt);
 
        if (opt->is_strictroute && rt->rt_dst != rt->rt_gateway)
                goto sr_failed;
 
-       if (unlikely(skb->len > dst_mtu(&rt->u.dst) && !skb_is_gso(skb) &&
+       if (unlikely(skb->len > dst_mtu(&rt->dst) && !skb_is_gso(skb) &&
                     (ip_hdr(skb)->frag_off & htons(IP_DF))) && !skb->local_df) {
-               IP_INC_STATS(dev_net(rt->u.dst.dev), IPSTATS_MIB_FRAGFAILS);
+               IP_INC_STATS(dev_net(rt->dst.dev), IPSTATS_MIB_FRAGFAILS);
                icmp_send(skb, ICMP_DEST_UNREACH, ICMP_FRAG_NEEDED,
-                         htonl(dst_mtu(&rt->u.dst)));
+                         htonl(dst_mtu(&rt->dst)));
                goto drop;
        }
 
        /* We are about to mangle packet. Copy it! */
-       if (skb_cow(skb, LL_RESERVED_SPACE(rt->u.dst.dev)+rt->u.dst.header_len))
+       if (skb_cow(skb, LL_RESERVED_SPACE(rt->dst.dev)+rt->dst.header_len))
                goto drop;
        iph = ip_hdr(skb);
 
        skb->priority = rt_tos2priority(iph->tos);
 
        return NF_HOOK(NFPROTO_IPV4, NF_INET_FORWARD, skb, skb->dev,
-                      rt->u.dst.dev, ip_forward_finish);
+                      rt->dst.dev, ip_forward_finish);
 
 sr_failed:
        /*
 
                        goto tx_error;
                }
        }
-       tdev = rt->u.dst.dev;
+       tdev = rt->dst.dev;
 
        if (tdev == dev) {
                ip_rt_put(rt);
 
        df = tiph->frag_off;
        if (df)
-               mtu = dst_mtu(&rt->u.dst) - dev->hard_header_len - tunnel->hlen;
+               mtu = dst_mtu(&rt->dst) - dev->hard_header_len - tunnel->hlen;
        else
                mtu = skb_dst(skb) ? dst_mtu(skb_dst(skb)) : dev->mtu;
 
                        tunnel->err_count = 0;
        }
 
-       max_headroom = LL_RESERVED_SPACE(tdev) + gre_hlen + rt->u.dst.header_len;
+       max_headroom = LL_RESERVED_SPACE(tdev) + gre_hlen + rt->dst.header_len;
 
        if (skb_headroom(skb) < max_headroom || skb_shared(skb)||
            (skb_cloned(skb) && !skb_clone_writable(skb, 0))) {
        IPCB(skb)->flags &= ~(IPSKB_XFRM_TUNNEL_SIZE | IPSKB_XFRM_TRANSFORMED |
                              IPSKB_REROUTED);
        skb_dst_drop(skb);
-       skb_dst_set(skb, &rt->u.dst);
+       skb_dst_set(skb, &rt->dst);
 
        /*
         *      Push down and install the IPIP header.
                        iph->ttl = ((struct ipv6hdr *)old_iph)->hop_limit;
 #endif
                else
-                       iph->ttl = dst_metric(&rt->u.dst, RTAX_HOPLIMIT);
+                       iph->ttl = dst_metric(&rt->dst, RTAX_HOPLIMIT);
        }
 
        ((__be16 *)(iph + 1))[0] = tunnel->parms.o_flags;
                                    .proto = IPPROTO_GRE };
                struct rtable *rt;
                if (!ip_route_output_key(dev_net(dev), &rt, &fl)) {
-                       tdev = rt->u.dst.dev;
+                       tdev = rt->dst.dev;
                        ip_rt_put(rt);
                }
 
                struct rtable *rt;
                if (ip_route_output_key(dev_net(dev), &rt, &fl))
                        return -EADDRNOTAVAIL;
-               dev = rt->u.dst.dev;
+               dev = rt->dst.dev;
                ip_rt_put(rt);
                if (__in_dev_get_rtnl(dev) == NULL)
                        return -EADDRNOTAVAIL;
 
 
        rt = skb_rtable(skb);
        if (rt->rt_type == RTN_MULTICAST) {
-               IP_UPD_PO_STATS_BH(dev_net(rt->u.dst.dev), IPSTATS_MIB_INMCAST,
+               IP_UPD_PO_STATS_BH(dev_net(rt->dst.dev), IPSTATS_MIB_INMCAST,
                                skb->len);
        } else if (rt->rt_type == RTN_BROADCAST)
-               IP_UPD_PO_STATS_BH(dev_net(rt->u.dst.dev), IPSTATS_MIB_INBCAST,
+               IP_UPD_PO_STATS_BH(dev_net(rt->dst.dev), IPSTATS_MIB_INBCAST,
                                skb->len);
 
        return dst_input(skb);
 
        iph->version  = 4;
        iph->ihl      = 5;
        iph->tos      = inet->tos;
-       if (ip_dont_fragment(sk, &rt->u.dst))
+       if (ip_dont_fragment(sk, &rt->dst))
                iph->frag_off = htons(IP_DF);
        else
                iph->frag_off = 0;
-       iph->ttl      = ip_select_ttl(inet, &rt->u.dst);
+       iph->ttl      = ip_select_ttl(inet, &rt->dst);
        iph->daddr    = rt->rt_dst;
        iph->saddr    = rt->rt_src;
        iph->protocol = sk->sk_protocol;
-       ip_select_ident(iph, &rt->u.dst, sk);
+       ip_select_ident(iph, &rt->dst, sk);
 
        if (opt && opt->optlen) {
                iph->ihl += opt->optlen>>2;
 {
        struct sock *sk = skb->sk;
        struct rtable *rt = skb_rtable(skb);
-       struct net_device *dev = rt->u.dst.dev;
+       struct net_device *dev = rt->dst.dev;
 
        /*
         *      If the indicated interface is up and running, send the packet.
                        if (ip_route_output_flow(sock_net(sk), &rt, &fl, sk, 0))
                                goto no_route;
                }
-               sk_setup_caps(sk, &rt->u.dst);
+               sk_setup_caps(sk, &rt->dst);
        }
-       skb_dst_set_noref(skb, &rt->u.dst);
+       skb_dst_set_noref(skb, &rt->dst);
 
 packet_routed:
        if (opt && opt->is_strictroute && rt->rt_dst != rt->rt_gateway)
        skb_reset_network_header(skb);
        iph = ip_hdr(skb);
        *((__be16 *)iph) = htons((4 << 12) | (5 << 8) | (inet->tos & 0xff));
-       if (ip_dont_fragment(sk, &rt->u.dst) && !skb->local_df)
+       if (ip_dont_fragment(sk, &rt->dst) && !skb->local_df)
                iph->frag_off = htons(IP_DF);
        else
                iph->frag_off = 0;
-       iph->ttl      = ip_select_ttl(inet, &rt->u.dst);
+       iph->ttl      = ip_select_ttl(inet, &rt->dst);
        iph->protocol = sk->sk_protocol;
        iph->saddr    = rt->rt_src;
        iph->daddr    = rt->rt_dst;
                ip_options_build(skb, opt, inet->inet_daddr, rt, 0);
        }
 
-       ip_select_ident_more(iph, &rt->u.dst, sk,
+       ip_select_ident_more(iph, &rt->dst, sk,
                             (skb_shinfo(skb)->gso_segs ?: 1) - 1);
 
        skb->priority = sk->sk_priority;
        struct rtable *rt = skb_rtable(skb);
        int err = 0;
 
-       dev = rt->u.dst.dev;
+       dev = rt->dst.dev;
 
        /*
         *      Point into the IP datagram header.
         */
 
        hlen = iph->ihl * 4;
-       mtu = dst_mtu(&rt->u.dst) - hlen;       /* Size of data space */
+       mtu = dst_mtu(&rt->dst) - hlen; /* Size of data space */
 #ifdef CONFIG_BRIDGE_NETFILTER
        if (skb->nf_bridge)
                mtu -= nf_bridge_mtu_reduction(skb);
         * we need to make room for the encapsulating header
         */
        pad = nf_bridge_pad(skb);
-       ll_rs = LL_RESERVED_SPACE_EXTRA(rt->u.dst.dev, pad);
+       ll_rs = LL_RESERVED_SPACE_EXTRA(rt->dst.dev, pad);
        mtu -= pad;
 
        /*
                 */
                *rtp = NULL;
                inet->cork.fragsize = mtu = inet->pmtudisc == IP_PMTUDISC_PROBE ?
-                                           rt->u.dst.dev->mtu :
-                                           dst_mtu(rt->u.dst.path);
-               inet->cork.dst = &rt->u.dst;
+                                           rt->dst.dev->mtu :
+                                           dst_mtu(rt->dst.path);
+               inet->cork.dst = &rt->dst;
                inet->cork.length = 0;
                sk->sk_sndmsg_page = NULL;
                sk->sk_sndmsg_off = 0;
-               if ((exthdrlen = rt->u.dst.header_len) != 0) {
+               if ((exthdrlen = rt->dst.header_len) != 0) {
                        length += exthdrlen;
                        transhdrlen += exthdrlen;
                }
                exthdrlen = 0;
                mtu = inet->cork.fragsize;
        }
-       hh_len = LL_RESERVED_SPACE(rt->u.dst.dev);
+       hh_len = LL_RESERVED_SPACE(rt->dst.dev);
 
        fragheaderlen = sizeof(struct iphdr) + (opt ? opt->optlen : 0);
        maxfraglen = ((mtu - fragheaderlen) & ~7) + fragheaderlen;
         */
        if (transhdrlen &&
            length + fragheaderlen <= mtu &&
-           rt->u.dst.dev->features & NETIF_F_V4_CSUM &&
+           rt->dst.dev->features & NETIF_F_V4_CSUM &&
            !exthdrlen)
                csummode = CHECKSUM_PARTIAL;
 
        inet->cork.length += length;
        if (((length> mtu) || !skb_queue_empty(&sk->sk_write_queue)) &&
            (sk->sk_protocol == IPPROTO_UDP) &&
-           (rt->u.dst.dev->features & NETIF_F_UFO)) {
+           (rt->dst.dev->features & NETIF_F_UFO)) {
                err = ip_ufo_append_data(sk, getfrag, from, length, hh_len,
                                         fragheaderlen, transhdrlen, mtu,
                                         flags);
                        fraglen = datalen + fragheaderlen;
 
                        if ((flags & MSG_MORE) &&
-                           !(rt->u.dst.dev->features&NETIF_F_SG))
+                           !(rt->dst.dev->features&NETIF_F_SG))
                                alloclen = mtu;
                        else
                                alloclen = datalen + fragheaderlen;
                         * the last.
                         */
                        if (datalen == length + fraggap)
-                               alloclen += rt->u.dst.trailer_len;
+                               alloclen += rt->dst.trailer_len;
 
                        if (transhdrlen) {
                                skb = sock_alloc_send_skb(sk,
                if (copy > length)
                        copy = length;
 
-               if (!(rt->u.dst.dev->features&NETIF_F_SG)) {
+               if (!(rt->dst.dev->features&NETIF_F_SG)) {
                        unsigned int off;
 
                        off = skb->len;
        if (inet->cork.flags & IPCORK_OPT)
                opt = inet->cork.opt;
 
-       if (!(rt->u.dst.dev->features&NETIF_F_SG))
+       if (!(rt->dst.dev->features&NETIF_F_SG))
                return -EOPNOTSUPP;
 
-       hh_len = LL_RESERVED_SPACE(rt->u.dst.dev);
+       hh_len = LL_RESERVED_SPACE(rt->dst.dev);
        mtu = inet->cork.fragsize;
 
        fragheaderlen = sizeof(struct iphdr) + (opt ? opt->optlen : 0);
 
        inet->cork.length += size;
        if ((sk->sk_protocol == IPPROTO_UDP) &&
-           (rt->u.dst.dev->features & NETIF_F_UFO)) {
+           (rt->dst.dev->features & NETIF_F_UFO)) {
                skb_shinfo(skb)->gso_size = mtu - fragheaderlen;
                skb_shinfo(skb)->gso_type = SKB_GSO_UDP;
        }
         * If local_df is set too, we still allow to fragment this frame
         * locally. */
        if (inet->pmtudisc >= IP_PMTUDISC_DO ||
-           (skb->len <= dst_mtu(&rt->u.dst) &&
-            ip_dont_fragment(sk, &rt->u.dst)))
+           (skb->len <= dst_mtu(&rt->dst) &&
+            ip_dont_fragment(sk, &rt->dst)))
                df = htons(IP_DF);
 
        if (inet->cork.flags & IPCORK_OPT)
        if (rt->rt_type == RTN_MULTICAST)
                ttl = inet->mc_ttl;
        else
-               ttl = ip_select_ttl(inet, &rt->u.dst);
+               ttl = ip_select_ttl(inet, &rt->dst);
 
        iph = (struct iphdr *)skb->data;
        iph->version = 4;
        }
        iph->tos = inet->tos;
        iph->frag_off = df;
-       ip_select_ident(iph, &rt->u.dst, sk);
+       ip_select_ident(iph, &rt->dst, sk);
        iph->ttl = ttl;
        iph->protocol = sk->sk_protocol;
        iph->saddr = rt->rt_src;
         * on dst refcount
         */
        inet->cork.dst = NULL;
-       skb_dst_set(skb, &rt->u.dst);
+       skb_dst_set(skb, &rt->dst);
 
        if (iph->protocol == IPPROTO_ICMP)
                icmp_out_count(net, ((struct icmphdr *)
 
                        goto tx_error_icmp;
                }
        }
-       tdev = rt->u.dst.dev;
+       tdev = rt->dst.dev;
 
        if (tdev == dev) {
                ip_rt_put(rt);
        df |= old_iph->frag_off & htons(IP_DF);
 
        if (df) {
-               mtu = dst_mtu(&rt->u.dst) - sizeof(struct iphdr);
+               mtu = dst_mtu(&rt->dst) - sizeof(struct iphdr);
 
                if (mtu < 68) {
                        stats->collisions++;
        IPCB(skb)->flags &= ~(IPSKB_XFRM_TUNNEL_SIZE | IPSKB_XFRM_TRANSFORMED |
                              IPSKB_REROUTED);
        skb_dst_drop(skb);
-       skb_dst_set(skb, &rt->u.dst);
+       skb_dst_set(skb, &rt->dst);
 
        /*
         *      Push down and install the IPIP header.
                                    .proto = IPPROTO_IPIP };
                struct rtable *rt;
                if (!ip_route_output_key(dev_net(dev), &rt, &fl)) {
-                       tdev = rt->u.dst.dev;
+                       tdev = rt->dst.dev;
                        ip_rt_put(rt);
                }
                dev->flags |= IFF_POINTOPOINT;
 
                        goto out_free;
        }
 
-       dev = rt->u.dst.dev;
+       dev = rt->dst.dev;
 
-       if (skb->len+encap > dst_mtu(&rt->u.dst) && (ntohs(iph->frag_off) & IP_DF)) {
+       if (skb->len+encap > dst_mtu(&rt->dst) && (ntohs(iph->frag_off) & IP_DF)) {
                /* Do not fragment multicasts. Alas, IPv4 does not
                   allow to send ICMP, so that packets will disappear
                   to blackhole.
                goto out_free;
        }
 
-       encap += LL_RESERVED_SPACE(dev) + rt->u.dst.header_len;
+       encap += LL_RESERVED_SPACE(dev) + rt->dst.header_len;
 
        if (skb_cow(skb, encap)) {
                ip_rt_put(rt);
        vif->bytes_out += skb->len;
 
        skb_dst_drop(skb);
-       skb_dst_set(skb, &rt->u.dst);
+       skb_dst_set(skb, &rt->dst);
        ip_decrease_ttl(ip_hdr(skb));
 
        /* FIXME: forward and output firewalls used to be called here.
 
 
                /* Drop old route. */
                skb_dst_drop(skb);
-               skb_dst_set(skb, &rt->u.dst);
+               skb_dst_set(skb, &rt->dst);
        } else {
                /* non-local src, find valid iif to satisfy
                 * rp-filter when calling ip_route_input. */
 
                orefdst = skb->_skb_refdst;
                if (ip_route_input(skb, iph->daddr, iph->saddr,
-                                  RT_TOS(iph->tos), rt->u.dst.dev) != 0) {
-                       dst_release(&rt->u.dst);
+                                  RT_TOS(iph->tos), rt->dst.dev) != 0) {
+                       dst_release(&rt->dst);
                        return -1;
                }
-               dst_release(&rt->u.dst);
+               dst_release(&rt->dst);
                refdst_drop(orefdst);
        }
 
 
        int err;
        struct rtable *rt = *rtp;
 
-       if (length > rt->u.dst.dev->mtu) {
+       if (length > rt->dst.dev->mtu) {
                ip_local_error(sk, EMSGSIZE, rt->rt_dst, inet->inet_dport,
-                              rt->u.dst.dev->mtu);
+                              rt->dst.dev->mtu);
                return -EMSGSIZE;
        }
        if (flags&MSG_PROBE)
                goto out;
 
        skb = sock_alloc_send_skb(sk,
-                                 length + LL_ALLOCATED_SPACE(rt->u.dst.dev) + 15,
+                                 length + LL_ALLOCATED_SPACE(rt->dst.dev) + 15,
                                  flags & MSG_DONTWAIT, &err);
        if (skb == NULL)
                goto error;
-       skb_reserve(skb, LL_RESERVED_SPACE(rt->u.dst.dev));
+       skb_reserve(skb, LL_RESERVED_SPACE(rt->dst.dev));
 
        skb->priority = sk->sk_priority;
        skb->mark = sk->sk_mark;
-       skb_dst_set(skb, &rt->u.dst);
+       skb_dst_set(skb, &rt->dst);
        *rtp = NULL;
 
        skb_reset_network_header(skb);
                iph->check   = 0;
                iph->tot_len = htons(length);
                if (!iph->id)
-                       ip_select_ident(iph, &rt->u.dst, NULL);
+                       ip_select_ident(iph, &rt->dst, NULL);
 
                iph->check = ip_fast_csum((unsigned char *)iph, iph->ihl);
        }
                        skb_transport_header(skb))->type);
 
        err = NF_HOOK(NFPROTO_IPV4, NF_INET_LOCAL_OUT, skb, NULL,
-                     rt->u.dst.dev, dst_output);
+                     rt->dst.dev, dst_output);
        if (err > 0)
                err = net_xmit_errno(err);
        if (err)
        return len;
 
 do_confirm:
-       dst_confirm(&rt->u.dst);
+       dst_confirm(&rt->dst);
        if (!(msg->msg_flags & MSG_PROBE) || len)
                goto back_from_confirm;
        err = 0;
 
                rcu_read_lock_bh();
                r = rcu_dereference_bh(rt_hash_table[st->bucket].chain);
                while (r) {
-                       if (dev_net(r->u.dst.dev) == seq_file_net(seq) &&
+                       if (dev_net(r->dst.dev) == seq_file_net(seq) &&
                            r->rt_genid == st->genid)
                                return r;
-                       r = rcu_dereference_bh(r->u.dst.rt_next);
+                       r = rcu_dereference_bh(r->dst.rt_next);
                }
                rcu_read_unlock_bh();
        }
 {
        struct rt_cache_iter_state *st = seq->private;
 
-       r = r->u.dst.rt_next;
+       r = r->dst.rt_next;
        while (!r) {
                rcu_read_unlock_bh();
                do {
 {
        struct rt_cache_iter_state *st = seq->private;
        while ((r = __rt_cache_get_next(seq, r)) != NULL) {
-               if (dev_net(r->u.dst.dev) != seq_file_net(seq))
+               if (dev_net(r->dst.dev) != seq_file_net(seq))
                        continue;
                if (r->rt_genid == st->genid)
                        break;
 
                seq_printf(seq, "%s\t%08X\t%08X\t%8X\t%d\t%u\t%d\t"
                              "%08X\t%d\t%u\t%u\t%02X\t%d\t%1d\t%08X%n",
-                       r->u.dst.dev ? r->u.dst.dev->name : "*",
+                       r->dst.dev ? r->dst.dev->name : "*",
                        (__force u32)r->rt_dst,
                        (__force u32)r->rt_gateway,
-                       r->rt_flags, atomic_read(&r->u.dst.__refcnt),
-                       r->u.dst.__use, 0, (__force u32)r->rt_src,
-                       (dst_metric(&r->u.dst, RTAX_ADVMSS) ?
-                            (int)dst_metric(&r->u.dst, RTAX_ADVMSS) + 40 : 0),
-                       dst_metric(&r->u.dst, RTAX_WINDOW),
-                       (int)((dst_metric(&r->u.dst, RTAX_RTT) >> 3) +
-                             dst_metric(&r->u.dst, RTAX_RTTVAR)),
+                       r->rt_flags, atomic_read(&r->dst.__refcnt),
+                       r->dst.__use, 0, (__force u32)r->rt_src,
+                       (dst_metric(&r->dst, RTAX_ADVMSS) ?
+                            (int)dst_metric(&r->dst, RTAX_ADVMSS) + 40 : 0),
+                       dst_metric(&r->dst, RTAX_WINDOW),
+                       (int)((dst_metric(&r->dst, RTAX_RTT) >> 3) +
+                             dst_metric(&r->dst, RTAX_RTTVAR)),
                        r->fl.fl4_tos,
-                       r->u.dst.hh ? atomic_read(&r->u.dst.hh->hh_refcnt) : -1,
-                       r->u.dst.hh ? (r->u.dst.hh->hh_output ==
+                       r->dst.hh ? atomic_read(&r->dst.hh->hh_refcnt) : -1,
+                       r->dst.hh ? (r->dst.hh->hh_output ==
                                       dev_queue_xmit) : 0,
                        r->rt_spec_dst, &len);
 
 
 static inline void rt_free(struct rtable *rt)
 {
-       call_rcu_bh(&rt->u.dst.rcu_head, dst_rcu_free);
+       call_rcu_bh(&rt->dst.rcu_head, dst_rcu_free);
 }
 
 static inline void rt_drop(struct rtable *rt)
 {
        ip_rt_put(rt);
-       call_rcu_bh(&rt->u.dst.rcu_head, dst_rcu_free);
+       call_rcu_bh(&rt->dst.rcu_head, dst_rcu_free);
 }
 
 static inline int rt_fast_clean(struct rtable *rth)
        /* Kill broadcast/multicast entries very aggresively, if they
           collide in hash table with more useful entries */
        return (rth->rt_flags & (RTCF_BROADCAST | RTCF_MULTICAST)) &&
-               rth->fl.iif && rth->u.dst.rt_next;
+               rth->fl.iif && rth->dst.rt_next;
 }
 
 static inline int rt_valuable(struct rtable *rth)
 {
        return (rth->rt_flags & (RTCF_REDIRECTED | RTCF_NOTIFY)) ||
-               rth->u.dst.expires;
+               rth->dst.expires;
 }
 
 static int rt_may_expire(struct rtable *rth, unsigned long tmo1, unsigned long tmo2)
        unsigned long age;
        int ret = 0;
 
-       if (atomic_read(&rth->u.dst.__refcnt))
+       if (atomic_read(&rth->dst.__refcnt))
                goto out;
 
        ret = 1;
-       if (rth->u.dst.expires &&
-           time_after_eq(jiffies, rth->u.dst.expires))
+       if (rth->dst.expires &&
+           time_after_eq(jiffies, rth->dst.expires))
                goto out;
 
-       age = jiffies - rth->u.dst.lastuse;
+       age = jiffies - rth->dst.lastuse;
        ret = 0;
        if ((age <= tmo1 && !rt_fast_clean(rth)) ||
            (age <= tmo2 && rt_valuable(rth)))
  */
 static inline u32 rt_score(struct rtable *rt)
 {
-       u32 score = jiffies - rt->u.dst.lastuse;
+       u32 score = jiffies - rt->dst.lastuse;
 
        score = ~score & ~(3<<30);
 
 
 static inline int compare_netns(struct rtable *rt1, struct rtable *rt2)
 {
-       return net_eq(dev_net(rt1->u.dst.dev), dev_net(rt2->u.dst.dev));
+       return net_eq(dev_net(rt1->dst.dev), dev_net(rt2->dst.dev));
 }
 
 static inline int rt_is_expired(struct rtable *rth)
 {
-       return rth->rt_genid != rt_genid(dev_net(rth->u.dst.dev));
+       return rth->rt_genid != rt_genid(dev_net(rth->dst.dev));
 }
 
 /*
                rth = rt_hash_table[i].chain;
 
                /* defer releasing the head of the list after spin_unlock */
-               for (tail = rth; tail; tail = tail->u.dst.rt_next)
+               for (tail = rth; tail; tail = tail->dst.rt_next)
                        if (!rt_is_expired(tail))
                                break;
                if (rth != tail)
                /* call rt_free on entries after the tail requiring flush */
                prev = &rt_hash_table[i].chain;
                for (p = *prev; p; p = next) {
-                       next = p->u.dst.rt_next;
+                       next = p->dst.rt_next;
                        if (!rt_is_expired(p)) {
-                               prev = &p->u.dst.rt_next;
+                               prev = &p->dst.rt_next;
                        } else {
                                *prev = next;
                                rt_free(p);
                spin_unlock_bh(rt_hash_lock_addr(i));
 
                for (; rth != tail; rth = next) {
-                       next = rth->u.dst.rt_next;
+                       next = rth->dst.rt_next;
                        rt_free(rth);
                }
        }
        while (aux != rth) {
                if (compare_hash_inputs(&aux->fl, &rth->fl))
                        return 0;
-               aux = aux->u.dst.rt_next;
+               aux = aux->dst.rt_next;
        }
        return ONE;
 }
                length = 0;
                spin_lock_bh(rt_hash_lock_addr(i));
                while ((rth = *rthp) != NULL) {
-                       prefetch(rth->u.dst.rt_next);
+                       prefetch(rth->dst.rt_next);
                        if (rt_is_expired(rth)) {
-                               *rthp = rth->u.dst.rt_next;
+                               *rthp = rth->dst.rt_next;
                                rt_free(rth);
                                continue;
                        }
-                       if (rth->u.dst.expires) {
+                       if (rth->dst.expires) {
                                /* Entry is expired even if it is in use */
-                               if (time_before_eq(jiffies, rth->u.dst.expires)) {
+                               if (time_before_eq(jiffies, rth->dst.expires)) {
 nofree:
                                        tmo >>= 1;
-                                       rthp = &rth->u.dst.rt_next;
+                                       rthp = &rth->dst.rt_next;
                                        /*
                                         * We only count entries on
                                         * a chain with equal hash inputs once
                                goto nofree;
 
                        /* Cleanup aged off entries. */
-                       *rthp = rth->u.dst.rt_next;
+                       *rthp = rth->dst.rt_next;
                        rt_free(rth);
                }
                spin_unlock_bh(rt_hash_lock_addr(i));
                                if (!rt_is_expired(rth) &&
                                        !rt_may_expire(rth, tmo, expire)) {
                                        tmo >>= 1;
-                                       rthp = &rth->u.dst.rt_next;
+                                       rthp = &rth->dst.rt_next;
                                        continue;
                                }
-                               *rthp = rth->u.dst.rt_next;
+                               *rthp = rth->dst.rt_next;
                                rt_free(rth);
                                goal--;
                        }
 
        while (rth) {
                length += has_noalias(head, rth);
-               rth = rth->u.dst.rt_next;
+               rth = rth->dst.rt_next;
        }
        return length >> FRACT_BITS;
 }
        candp = NULL;
        now = jiffies;
 
-       if (!rt_caching(dev_net(rt->u.dst.dev))) {
+       if (!rt_caching(dev_net(rt->dst.dev))) {
                /*
                 * If we're not caching, just tell the caller we
                 * were successful and don't touch the route.  The
                 */
 
                if (rt->rt_type == RTN_UNICAST || rt->fl.iif == 0) {
-                       int err = arp_bind_neighbour(&rt->u.dst);
+                       int err = arp_bind_neighbour(&rt->dst);
                        if (err) {
                                if (net_ratelimit())
                                        printk(KERN_WARNING
        spin_lock_bh(rt_hash_lock_addr(hash));
        while ((rth = *rthp) != NULL) {
                if (rt_is_expired(rth)) {
-                       *rthp = rth->u.dst.rt_next;
+                       *rthp = rth->dst.rt_next;
                        rt_free(rth);
                        continue;
                }
                if (compare_keys(&rth->fl, &rt->fl) && compare_netns(rth, rt)) {
                        /* Put it first */
-                       *rthp = rth->u.dst.rt_next;
+                       *rthp = rth->dst.rt_next;
                        /*
                         * Since lookup is lockfree, the deletion
                         * must be visible to another weakly ordered CPU before
                         * the insertion at the start of the hash chain.
                         */
-                       rcu_assign_pointer(rth->u.dst.rt_next,
+                       rcu_assign_pointer(rth->dst.rt_next,
                                           rt_hash_table[hash].chain);
                        /*
                         * Since lookup is lockfree, the update writes
                         */
                        rcu_assign_pointer(rt_hash_table[hash].chain, rth);
 
-                       dst_use(&rth->u.dst, now);
+                       dst_use(&rth->dst, now);
                        spin_unlock_bh(rt_hash_lock_addr(hash));
 
                        rt_drop(rt);
                        if (rp)
                                *rp = rth;
                        else
-                               skb_dst_set(skb, &rth->u.dst);
+                               skb_dst_set(skb, &rth->dst);
                        return 0;
                }
 
-               if (!atomic_read(&rth->u.dst.__refcnt)) {
+               if (!atomic_read(&rth->dst.__refcnt)) {
                        u32 score = rt_score(rth);
 
                        if (score <= min_score) {
 
                chain_length++;
 
-               rthp = &rth->u.dst.rt_next;
+               rthp = &rth->dst.rt_next;
        }
 
        if (cand) {
                 * only 2 entries per bucket. We will see.
                 */
                if (chain_length > ip_rt_gc_elasticity) {
-                       *candp = cand->u.dst.rt_next;
+                       *candp = cand->dst.rt_next;
                        rt_free(cand);
                }
        } else {
                if (chain_length > rt_chain_length_max &&
                    slow_chain_length(rt_hash_table[hash].chain) > rt_chain_length_max) {
-                       struct net *net = dev_net(rt->u.dst.dev);
+                       struct net *net = dev_net(rt->dst.dev);
                        int num = ++net->ipv4.current_rt_cache_rebuild_count;
                        if (!rt_caching(net)) {
                                printk(KERN_WARNING "%s: %d rebuilds is over limit, route caching disabled\n",
-                                       rt->u.dst.dev->name, num);
+                                       rt->dst.dev->name, num);
                        }
                        rt_emergency_hash_rebuild(net);
                        spin_unlock_bh(rt_hash_lock_addr(hash));
           route or unicast forwarding path.
         */
        if (rt->rt_type == RTN_UNICAST || rt->fl.iif == 0) {
-               int err = arp_bind_neighbour(&rt->u.dst);
+               int err = arp_bind_neighbour(&rt->dst);
                if (err) {
                        spin_unlock_bh(rt_hash_lock_addr(hash));
 
                }
        }
 
-       rt->u.dst.rt_next = rt_hash_table[hash].chain;
+       rt->dst.rt_next = rt_hash_table[hash].chain;
 
 #if RT_CACHE_DEBUG >= 2
-       if (rt->u.dst.rt_next) {
+       if (rt->dst.rt_next) {
                struct rtable *trt;
                printk(KERN_DEBUG "rt_cache @%02x: %pI4",
                       hash, &rt->rt_dst);
-               for (trt = rt->u.dst.rt_next; trt; trt = trt->u.dst.rt_next)
+               for (trt = rt->dst.rt_next; trt; trt = trt->dst.rt_next)
                        printk(" . %pI4", &trt->rt_dst);
                printk("\n");
        }
        if (rp)
                *rp = rt;
        else
-               skb_dst_set(skb, &rt->u.dst);
+               skb_dst_set(skb, &rt->dst);
        return 0;
 }
 
        ip_rt_put(rt);
        while ((aux = *rthp) != NULL) {
                if (aux == rt || rt_is_expired(aux)) {
-                       *rthp = aux->u.dst.rt_next;
+                       *rthp = aux->dst.rt_next;
                        rt_free(aux);
                        continue;
                }
-               rthp = &aux->u.dst.rt_next;
+               rthp = &aux->dst.rt_next;
        }
        spin_unlock_bh(rt_hash_lock_addr(hash));
 }
                                    rth->fl.oif != ikeys[k] ||
                                    rth->fl.iif != 0 ||
                                    rt_is_expired(rth) ||
-                                   !net_eq(dev_net(rth->u.dst.dev), net)) {
-                                       rthp = &rth->u.dst.rt_next;
+                                   !net_eq(dev_net(rth->dst.dev), net)) {
+                                       rthp = &rth->dst.rt_next;
                                        continue;
                                }
 
                                if (rth->rt_dst != daddr ||
                                    rth->rt_src != saddr ||
-                                   rth->u.dst.error ||
+                                   rth->dst.error ||
                                    rth->rt_gateway != old_gw ||
-                                   rth->u.dst.dev != dev)
+                                   rth->dst.dev != dev)
                                        break;
 
-                               dst_hold(&rth->u.dst);
+                               dst_hold(&rth->dst);
 
                                rt = dst_alloc(&ipv4_dst_ops);
                                if (rt == NULL) {
 
                                /* Copy all the information. */
                                *rt = *rth;
-                               rt->u.dst.__use         = 1;
-                               atomic_set(&rt->u.dst.__refcnt, 1);
-                               rt->u.dst.child         = NULL;
-                               if (rt->u.dst.dev)
-                                       dev_hold(rt->u.dst.dev);
+                               rt->dst.__use           = 1;
+                               atomic_set(&rt->dst.__refcnt, 1);
+                               rt->dst.child           = NULL;
+                               if (rt->dst.dev)
+                                       dev_hold(rt->dst.dev);
                                if (rt->idev)
                                        in_dev_hold(rt->idev);
-                               rt->u.dst.obsolete      = -1;
-                               rt->u.dst.lastuse       = jiffies;
-                               rt->u.dst.path          = &rt->u.dst;
-                               rt->u.dst.neighbour     = NULL;
-                               rt->u.dst.hh            = NULL;
+                               rt->dst.obsolete        = -1;
+                               rt->dst.lastuse = jiffies;
+                               rt->dst.path            = &rt->dst;
+                               rt->dst.neighbour       = NULL;
+                               rt->dst.hh              = NULL;
 #ifdef CONFIG_XFRM
-                               rt->u.dst.xfrm          = NULL;
+                               rt->dst.xfrm            = NULL;
 #endif
                                rt->rt_genid            = rt_genid(net);
                                rt->rt_flags            |= RTCF_REDIRECTED;
                                rt->rt_gateway          = new_gw;
 
                                /* Redirect received -> path was valid */
-                               dst_confirm(&rth->u.dst);
+                               dst_confirm(&rth->dst);
 
                                if (rt->peer)
                                        atomic_inc(&rt->peer->refcnt);
 
-                               if (arp_bind_neighbour(&rt->u.dst) ||
-                                   !(rt->u.dst.neighbour->nud_state &
+                               if (arp_bind_neighbour(&rt->dst) ||
+                                   !(rt->dst.neighbour->nud_state &
                                            NUD_VALID)) {
-                                       if (rt->u.dst.neighbour)
-                                               neigh_event_send(rt->u.dst.neighbour, NULL);
+                                       if (rt->dst.neighbour)
+                                               neigh_event_send(rt->dst.neighbour, NULL);
                                        ip_rt_put(rth);
                                        rt_drop(rt);
                                        goto do_next;
                                }
 
-                               netevent.old = &rth->u.dst;
-                               netevent.new = &rt->u.dst;
+                               netevent.old = &rth->dst;
+                               netevent.new = &rt->dst;
                                call_netevent_notifiers(NETEVENT_REDIRECT,
                                                        &netevent);
 
                        ip_rt_put(rt);
                        ret = NULL;
                } else if ((rt->rt_flags & RTCF_REDIRECTED) ||
-                          (rt->u.dst.expires &&
-                           time_after_eq(jiffies, rt->u.dst.expires))) {
+                          (rt->dst.expires &&
+                           time_after_eq(jiffies, rt->dst.expires))) {
                        unsigned hash = rt_hash(rt->fl.fl4_dst, rt->fl.fl4_src,
                                                rt->fl.oif,
                                                rt_genid(dev_net(dst->dev)));
        int log_martians;
 
        rcu_read_lock();
-       in_dev = __in_dev_get_rcu(rt->u.dst.dev);
+       in_dev = __in_dev_get_rcu(rt->dst.dev);
        if (!in_dev || !IN_DEV_TX_REDIRECTS(in_dev)) {
                rcu_read_unlock();
                return;
        /* No redirected packets during ip_rt_redirect_silence;
         * reset the algorithm.
         */
-       if (time_after(jiffies, rt->u.dst.rate_last + ip_rt_redirect_silence))
-               rt->u.dst.rate_tokens = 0;
+       if (time_after(jiffies, rt->dst.rate_last + ip_rt_redirect_silence))
+               rt->dst.rate_tokens = 0;
 
        /* Too many ignored redirects; do not send anything
-        * set u.dst.rate_last to the last seen redirected packet.
+        * set dst.rate_last to the last seen redirected packet.
         */
-       if (rt->u.dst.rate_tokens >= ip_rt_redirect_number) {
-               rt->u.dst.rate_last = jiffies;
+       if (rt->dst.rate_tokens >= ip_rt_redirect_number) {
+               rt->dst.rate_last = jiffies;
                return;
        }
 
        /* Check for load limit; set rate_last to the latest sent
         * redirect.
         */
-       if (rt->u.dst.rate_tokens == 0 ||
+       if (rt->dst.rate_tokens == 0 ||
            time_after(jiffies,
-                      (rt->u.dst.rate_last +
-                       (ip_rt_redirect_load << rt->u.dst.rate_tokens)))) {
+                      (rt->dst.rate_last +
+                       (ip_rt_redirect_load << rt->dst.rate_tokens)))) {
                icmp_send(skb, ICMP_REDIRECT, ICMP_REDIR_HOST, rt->rt_gateway);
-               rt->u.dst.rate_last = jiffies;
-               ++rt->u.dst.rate_tokens;
+               rt->dst.rate_last = jiffies;
+               ++rt->dst.rate_tokens;
 #ifdef CONFIG_IP_ROUTE_VERBOSE
                if (log_martians &&
-                   rt->u.dst.rate_tokens == ip_rt_redirect_number &&
+                   rt->dst.rate_tokens == ip_rt_redirect_number &&
                    net_ratelimit())
                        printk(KERN_WARNING "host %pI4/if%d ignores redirects for %pI4 to %pI4.\n",
                                &rt->rt_src, rt->rt_iif,
        unsigned long now;
        int code;
 
-       switch (rt->u.dst.error) {
+       switch (rt->dst.error) {
                case EINVAL:
                default:
                        goto out;
                        break;
                case ENETUNREACH:
                        code = ICMP_NET_UNREACH;
-                       IP_INC_STATS_BH(dev_net(rt->u.dst.dev),
+                       IP_INC_STATS_BH(dev_net(rt->dst.dev),
                                        IPSTATS_MIB_INNOROUTES);
                        break;
                case EACCES:
        }
 
        now = jiffies;
-       rt->u.dst.rate_tokens += now - rt->u.dst.rate_last;
-       if (rt->u.dst.rate_tokens > ip_rt_error_burst)
-               rt->u.dst.rate_tokens = ip_rt_error_burst;
-       rt->u.dst.rate_last = now;
-       if (rt->u.dst.rate_tokens >= ip_rt_error_cost) {
-               rt->u.dst.rate_tokens -= ip_rt_error_cost;
+       rt->dst.rate_tokens += now - rt->dst.rate_last;
+       if (rt->dst.rate_tokens > ip_rt_error_burst)
+               rt->dst.rate_tokens = ip_rt_error_burst;
+       rt->dst.rate_last = now;
+       if (rt->dst.rate_tokens >= ip_rt_error_cost) {
+               rt->dst.rate_tokens -= ip_rt_error_cost;
                icmp_send(skb, ICMP_DEST_UNREACH, code, 0);
        }
 
 
                        rcu_read_lock();
                        for (rth = rcu_dereference(rt_hash_table[hash].chain); rth;
-                            rth = rcu_dereference(rth->u.dst.rt_next)) {
+                            rth = rcu_dereference(rth->dst.rt_next)) {
                                unsigned short mtu = new_mtu;
 
                                if (rth->fl.fl4_dst != daddr ||
                                    rth->rt_src != iph->saddr ||
                                    rth->fl.oif != ikeys[k] ||
                                    rth->fl.iif != 0 ||
-                                   dst_metric_locked(&rth->u.dst, RTAX_MTU) ||
-                                   !net_eq(dev_net(rth->u.dst.dev), net) ||
+                                   dst_metric_locked(&rth->dst, RTAX_MTU) ||
+                                   !net_eq(dev_net(rth->dst.dev), net) ||
                                    rt_is_expired(rth))
                                        continue;
 
 
                                        /* BSD 4.2 compatibility hack :-( */
                                        if (mtu == 0 &&
-                                           old_mtu >= dst_mtu(&rth->u.dst) &&
+                                           old_mtu >= dst_mtu(&rth->dst) &&
                                            old_mtu >= 68 + (iph->ihl << 2))
                                                old_mtu -= iph->ihl << 2;
 
                                        mtu = guess_mtu(old_mtu);
                                }
-                               if (mtu <= dst_mtu(&rth->u.dst)) {
-                                       if (mtu < dst_mtu(&rth->u.dst)) {
-                                               dst_confirm(&rth->u.dst);
+                               if (mtu <= dst_mtu(&rth->dst)) {
+                                       if (mtu < dst_mtu(&rth->dst)) {
+                                               dst_confirm(&rth->dst);
                                                if (mtu < ip_rt_min_pmtu) {
                                                        mtu = ip_rt_min_pmtu;
-                                                       rth->u.dst.metrics[RTAX_LOCK-1] |=
+                                                       rth->dst.metrics[RTAX_LOCK-1] |=
                                                                (1 << RTAX_MTU);
                                                }
-                                               rth->u.dst.metrics[RTAX_MTU-1] = mtu;
-                                               dst_set_expires(&rth->u.dst,
+                                               rth->dst.metrics[RTAX_MTU-1] = mtu;
+                                               dst_set_expires(&rth->dst,
                                                        ip_rt_mtu_expires);
                                        }
                                        est_mtu = mtu;
 
        rt = skb_rtable(skb);
        if (rt)
-               dst_set_expires(&rt->u.dst, 0);
+               dst_set_expires(&rt->dst, 0);
 }
 
 static int ip_rt_bug(struct sk_buff *skb)
 
        if (rt->fl.iif == 0)
                src = rt->rt_src;
-       else if (fib_lookup(dev_net(rt->u.dst.dev), &rt->fl, &res) == 0) {
+       else if (fib_lookup(dev_net(rt->dst.dev), &rt->fl, &res) == 0) {
                src = FIB_RES_PREFSRC(res);
                fib_res_put(&res);
        } else
-               src = inet_select_addr(rt->u.dst.dev, rt->rt_gateway,
+               src = inet_select_addr(rt->dst.dev, rt->rt_gateway,
                                        RT_SCOPE_UNIVERSE);
        memcpy(addr, &src, 4);
 }
 #ifdef CONFIG_NET_CLS_ROUTE
 static void set_class_tag(struct rtable *rt, u32 tag)
 {
-       if (!(rt->u.dst.tclassid & 0xFFFF))
-               rt->u.dst.tclassid |= tag & 0xFFFF;
-       if (!(rt->u.dst.tclassid & 0xFFFF0000))
-               rt->u.dst.tclassid |= tag & 0xFFFF0000;
+       if (!(rt->dst.tclassid & 0xFFFF))
+               rt->dst.tclassid |= tag & 0xFFFF;
+       if (!(rt->dst.tclassid & 0xFFFF0000))
+               rt->dst.tclassid |= tag & 0xFFFF0000;
 }
 #endif
 
                if (FIB_RES_GW(*res) &&
                    FIB_RES_NH(*res).nh_scope == RT_SCOPE_LINK)
                        rt->rt_gateway = FIB_RES_GW(*res);
-               memcpy(rt->u.dst.metrics, fi->fib_metrics,
-                      sizeof(rt->u.dst.metrics));
+               memcpy(rt->dst.metrics, fi->fib_metrics,
+                      sizeof(rt->dst.metrics));
                if (fi->fib_mtu == 0) {
-                       rt->u.dst.metrics[RTAX_MTU-1] = rt->u.dst.dev->mtu;
-                       if (dst_metric_locked(&rt->u.dst, RTAX_MTU) &&
+                       rt->dst.metrics[RTAX_MTU-1] = rt->dst.dev->mtu;
+                       if (dst_metric_locked(&rt->dst, RTAX_MTU) &&
                            rt->rt_gateway != rt->rt_dst &&
-                           rt->u.dst.dev->mtu > 576)
-                               rt->u.dst.metrics[RTAX_MTU-1] = 576;
+                           rt->dst.dev->mtu > 576)
+                               rt->dst.metrics[RTAX_MTU-1] = 576;
                }
 #ifdef CONFIG_NET_CLS_ROUTE
-               rt->u.dst.tclassid = FIB_RES_NH(*res).nh_tclassid;
+               rt->dst.tclassid = FIB_RES_NH(*res).nh_tclassid;
 #endif
        } else
-               rt->u.dst.metrics[RTAX_MTU-1]= rt->u.dst.dev->mtu;
-
-       if (dst_metric(&rt->u.dst, RTAX_HOPLIMIT) == 0)
-               rt->u.dst.metrics[RTAX_HOPLIMIT-1] = sysctl_ip_default_ttl;
-       if (dst_mtu(&rt->u.dst) > IP_MAX_MTU)
-               rt->u.dst.metrics[RTAX_MTU-1] = IP_MAX_MTU;
-       if (dst_metric(&rt->u.dst, RTAX_ADVMSS) == 0)
-               rt->u.dst.metrics[RTAX_ADVMSS-1] = max_t(unsigned int, rt->u.dst.dev->mtu - 40,
+               rt->dst.metrics[RTAX_MTU-1]= rt->dst.dev->mtu;
+
+       if (dst_metric(&rt->dst, RTAX_HOPLIMIT) == 0)
+               rt->dst.metrics[RTAX_HOPLIMIT-1] = sysctl_ip_default_ttl;
+       if (dst_mtu(&rt->dst) > IP_MAX_MTU)
+               rt->dst.metrics[RTAX_MTU-1] = IP_MAX_MTU;
+       if (dst_metric(&rt->dst, RTAX_ADVMSS) == 0)
+               rt->dst.metrics[RTAX_ADVMSS-1] = max_t(unsigned int, rt->dst.dev->mtu - 40,
                                       ip_rt_min_advmss);
-       if (dst_metric(&rt->u.dst, RTAX_ADVMSS) > 65535 - 40)
-               rt->u.dst.metrics[RTAX_ADVMSS-1] = 65535 - 40;
+       if (dst_metric(&rt->dst, RTAX_ADVMSS) > 65535 - 40)
+               rt->dst.metrics[RTAX_ADVMSS-1] = 65535 - 40;
 
 #ifdef CONFIG_NET_CLS_ROUTE
 #ifdef CONFIG_IP_MULTIPLE_TABLES
        if (!rth)
                goto e_nobufs;
 
-       rth->u.dst.output = ip_rt_bug;
-       rth->u.dst.obsolete = -1;
+       rth->dst.output = ip_rt_bug;
+       rth->dst.obsolete = -1;
 
-       atomic_set(&rth->u.dst.__refcnt, 1);
-       rth->u.dst.flags= DST_HOST;
+       atomic_set(&rth->dst.__refcnt, 1);
+       rth->dst.flags= DST_HOST;
        if (IN_DEV_CONF_GET(in_dev, NOPOLICY))
-               rth->u.dst.flags |= DST_NOPOLICY;
+               rth->dst.flags |= DST_NOPOLICY;
        rth->fl.fl4_dst = daddr;
        rth->rt_dst     = daddr;
        rth->fl.fl4_tos = tos;
        rth->fl.fl4_src = saddr;
        rth->rt_src     = saddr;
 #ifdef CONFIG_NET_CLS_ROUTE
-       rth->u.dst.tclassid = itag;
+       rth->dst.tclassid = itag;
 #endif
        rth->rt_iif     =
        rth->fl.iif     = dev->ifindex;
-       rth->u.dst.dev  = init_net.loopback_dev;
-       dev_hold(rth->u.dst.dev);
-       rth->idev       = in_dev_get(rth->u.dst.dev);
+       rth->dst.dev    = init_net.loopback_dev;
+       dev_hold(rth->dst.dev);
+       rth->idev       = in_dev_get(rth->dst.dev);
        rth->fl.oif     = 0;
        rth->rt_gateway = daddr;
        rth->rt_spec_dst= spec_dst;
        rth->rt_flags   = RTCF_MULTICAST;
        rth->rt_type    = RTN_MULTICAST;
        if (our) {
-               rth->u.dst.input= ip_local_deliver;
+               rth->dst.input= ip_local_deliver;
                rth->rt_flags |= RTCF_LOCAL;
        }
 
 #ifdef CONFIG_IP_MROUTE
        if (!ipv4_is_local_multicast(daddr) && IN_DEV_MFORWARD(in_dev))
-               rth->u.dst.input = ip_mr_input;
+               rth->dst.input = ip_mr_input;
 #endif
        RT_CACHE_STAT_INC(in_slow_mc);
 
                goto cleanup;
        }
 
-       atomic_set(&rth->u.dst.__refcnt, 1);
-       rth->u.dst.flags= DST_HOST;
+       atomic_set(&rth->dst.__refcnt, 1);
+       rth->dst.flags= DST_HOST;
        if (IN_DEV_CONF_GET(in_dev, NOPOLICY))
-               rth->u.dst.flags |= DST_NOPOLICY;
+               rth->dst.flags |= DST_NOPOLICY;
        if (IN_DEV_CONF_GET(out_dev, NOXFRM))
-               rth->u.dst.flags |= DST_NOXFRM;
+               rth->dst.flags |= DST_NOXFRM;
        rth->fl.fl4_dst = daddr;
        rth->rt_dst     = daddr;
        rth->fl.fl4_tos = tos;
        rth->rt_gateway = daddr;
        rth->rt_iif     =
                rth->fl.iif     = in_dev->dev->ifindex;
-       rth->u.dst.dev  = (out_dev)->dev;
-       dev_hold(rth->u.dst.dev);
-       rth->idev       = in_dev_get(rth->u.dst.dev);
+       rth->dst.dev    = (out_dev)->dev;
+       dev_hold(rth->dst.dev);
+       rth->idev       = in_dev_get(rth->dst.dev);
        rth->fl.oif     = 0;
        rth->rt_spec_dst= spec_dst;
 
-       rth->u.dst.obsolete = -1;
-       rth->u.dst.input = ip_forward;
-       rth->u.dst.output = ip_output;
-       rth->rt_genid = rt_genid(dev_net(rth->u.dst.dev));
+       rth->dst.obsolete = -1;
+       rth->dst.input = ip_forward;
+       rth->dst.output = ip_output;
+       rth->rt_genid = rt_genid(dev_net(rth->dst.dev));
 
        rt_set_nexthop(rth, res, itag);
 
 
        /* put it into the cache */
        hash = rt_hash(daddr, saddr, fl->iif,
-                      rt_genid(dev_net(rth->u.dst.dev)));
+                      rt_genid(dev_net(rth->dst.dev)));
        return rt_intern_hash(hash, rth, NULL, skb, fl->iif);
 }
 
        if (!rth)
                goto e_nobufs;
 
-       rth->u.dst.output= ip_rt_bug;
-       rth->u.dst.obsolete = -1;
+       rth->dst.output= ip_rt_bug;
+       rth->dst.obsolete = -1;
        rth->rt_genid = rt_genid(net);
 
-       atomic_set(&rth->u.dst.__refcnt, 1);
-       rth->u.dst.flags= DST_HOST;
+       atomic_set(&rth->dst.__refcnt, 1);
+       rth->dst.flags= DST_HOST;
        if (IN_DEV_CONF_GET(in_dev, NOPOLICY))
-               rth->u.dst.flags |= DST_NOPOLICY;
+               rth->dst.flags |= DST_NOPOLICY;
        rth->fl.fl4_dst = daddr;
        rth->rt_dst     = daddr;
        rth->fl.fl4_tos = tos;
        rth->fl.fl4_src = saddr;
        rth->rt_src     = saddr;
 #ifdef CONFIG_NET_CLS_ROUTE
-       rth->u.dst.tclassid = itag;
+       rth->dst.tclassid = itag;
 #endif
        rth->rt_iif     =
        rth->fl.iif     = dev->ifindex;
-       rth->u.dst.dev  = net->loopback_dev;
-       dev_hold(rth->u.dst.dev);
-       rth->idev       = in_dev_get(rth->u.dst.dev);
+       rth->dst.dev    = net->loopback_dev;
+       dev_hold(rth->dst.dev);
+       rth->idev       = in_dev_get(rth->dst.dev);
        rth->rt_gateway = daddr;
        rth->rt_spec_dst= spec_dst;
-       rth->u.dst.input= ip_local_deliver;
+       rth->dst.input= ip_local_deliver;
        rth->rt_flags   = flags|RTCF_LOCAL;
        if (res.type == RTN_UNREACHABLE) {
-               rth->u.dst.input= ip_error;
-               rth->u.dst.error= -err;
+               rth->dst.input= ip_error;
+               rth->dst.error= -err;
                rth->rt_flags   &= ~RTCF_LOCAL;
        }
        rth->rt_type    = res.type;
        hash = rt_hash(daddr, saddr, iif, rt_genid(net));
 
        for (rth = rcu_dereference(rt_hash_table[hash].chain); rth;
-            rth = rcu_dereference(rth->u.dst.rt_next)) {
+            rth = rcu_dereference(rth->dst.rt_next)) {
                if ((((__force u32)rth->fl.fl4_dst ^ (__force u32)daddr) |
                     ((__force u32)rth->fl.fl4_src ^ (__force u32)saddr) |
                     (rth->fl.iif ^ iif) |
                     rth->fl.oif |
                     (rth->fl.fl4_tos ^ tos)) == 0 &&
                    rth->fl.mark == skb->mark &&
-                   net_eq(dev_net(rth->u.dst.dev), net) &&
+                   net_eq(dev_net(rth->dst.dev), net) &&
                    !rt_is_expired(rth)) {
                        if (noref) {
-                               dst_use_noref(&rth->u.dst, jiffies);
-                               skb_dst_set_noref(skb, &rth->u.dst);
+                               dst_use_noref(&rth->dst, jiffies);
+                               skb_dst_set_noref(skb, &rth->dst);
                        } else {
-                               dst_use(&rth->u.dst, jiffies);
-                               skb_dst_set(skb, &rth->u.dst);
+                               dst_use(&rth->dst, jiffies);
+                               skb_dst_set(skb, &rth->dst);
                        }
                        RT_CACHE_STAT_INC(in_hit);
                        rcu_read_unlock();
                goto cleanup;
        }
 
-       atomic_set(&rth->u.dst.__refcnt, 1);
-       rth->u.dst.flags= DST_HOST;
+       atomic_set(&rth->dst.__refcnt, 1);
+       rth->dst.flags= DST_HOST;
        if (IN_DEV_CONF_GET(in_dev, NOXFRM))
-               rth->u.dst.flags |= DST_NOXFRM;
+               rth->dst.flags |= DST_NOXFRM;
        if (IN_DEV_CONF_GET(in_dev, NOPOLICY))
-               rth->u.dst.flags |= DST_NOPOLICY;
+               rth->dst.flags |= DST_NOPOLICY;
 
        rth->fl.fl4_dst = oldflp->fl4_dst;
        rth->fl.fl4_tos = tos;
        rth->rt_iif     = oldflp->oif ? : dev_out->ifindex;
        /* get references to the devices that are to be hold by the routing
           cache entry */
-       rth->u.dst.dev  = dev_out;
+       rth->dst.dev    = dev_out;
        dev_hold(dev_out);
        rth->idev       = in_dev_get(dev_out);
        rth->rt_gateway = fl->fl4_dst;
        rth->rt_spec_dst= fl->fl4_src;
 
-       rth->u.dst.output=ip_output;
-       rth->u.dst.obsolete = -1;
+       rth->dst.output=ip_output;
+       rth->dst.obsolete = -1;
        rth->rt_genid = rt_genid(dev_net(dev_out));
 
        RT_CACHE_STAT_INC(out_slow_tot);
 
        if (flags & RTCF_LOCAL) {
-               rth->u.dst.input = ip_local_deliver;
+               rth->dst.input = ip_local_deliver;
                rth->rt_spec_dst = fl->fl4_dst;
        }
        if (flags & (RTCF_BROADCAST | RTCF_MULTICAST)) {
                rth->rt_spec_dst = fl->fl4_src;
                if (flags & RTCF_LOCAL &&
                    !(dev_out->flags & IFF_LOOPBACK)) {
-                       rth->u.dst.output = ip_mc_output;
+                       rth->dst.output = ip_mc_output;
                        RT_CACHE_STAT_INC(out_slow_mc);
                }
 #ifdef CONFIG_IP_MROUTE
                if (res->type == RTN_MULTICAST) {
                        if (IN_DEV_MFORWARD(in_dev) &&
                            !ipv4_is_local_multicast(oldflp->fl4_dst)) {
-                               rth->u.dst.input = ip_mr_input;
-                               rth->u.dst.output = ip_mc_output;
+                               rth->dst.input = ip_mr_input;
+                               rth->dst.output = ip_mc_output;
                        }
                }
 #endif
 
        rcu_read_lock_bh();
        for (rth = rcu_dereference_bh(rt_hash_table[hash].chain); rth;
-               rth = rcu_dereference_bh(rth->u.dst.rt_next)) {
+               rth = rcu_dereference_bh(rth->dst.rt_next)) {
                if (rth->fl.fl4_dst == flp->fl4_dst &&
                    rth->fl.fl4_src == flp->fl4_src &&
                    rth->fl.iif == 0 &&
                    rth->fl.mark == flp->mark &&
                    !((rth->fl.fl4_tos ^ flp->fl4_tos) &
                            (IPTOS_RT_MASK | RTO_ONLINK)) &&
-                   net_eq(dev_net(rth->u.dst.dev), net) &&
+                   net_eq(dev_net(rth->dst.dev), net) &&
                    !rt_is_expired(rth)) {
-                       dst_use(&rth->u.dst, jiffies);
+                       dst_use(&rth->dst, jiffies);
                        RT_CACHE_STAT_INC(out_hit);
                        rcu_read_unlock_bh();
                        *rp = rth;
                dst_alloc(&ipv4_dst_blackhole_ops);
 
        if (rt) {
-               struct dst_entry *new = &rt->u.dst;
+               struct dst_entry *new = &rt->dst;
 
                atomic_set(&new->__refcnt, 1);
                new->__use = 1;
                new->input = dst_discard;
                new->output = dst_discard;
-               memcpy(new->metrics, ort->u.dst.metrics, RTAX_MAX*sizeof(u32));
+               memcpy(new->metrics, ort->dst.metrics, RTAX_MAX*sizeof(u32));
 
-               new->dev = ort->u.dst.dev;
+               new->dev = ort->dst.dev;
                if (new->dev)
                        dev_hold(new->dev);
 
                dst_free(new);
        }
 
-       dst_release(&(*rp)->u.dst);
+       dst_release(&(*rp)->dst);
        *rp = rt;
        return (rt ? 0 : -ENOMEM);
 }
                r->rtm_src_len = 32;
                NLA_PUT_BE32(skb, RTA_SRC, rt->fl.fl4_src);
        }
-       if (rt->u.dst.dev)
-               NLA_PUT_U32(skb, RTA_OIF, rt->u.dst.dev->ifindex);
+       if (rt->dst.dev)
+               NLA_PUT_U32(skb, RTA_OIF, rt->dst.dev->ifindex);
 #ifdef CONFIG_NET_CLS_ROUTE
-       if (rt->u.dst.tclassid)
-               NLA_PUT_U32(skb, RTA_FLOW, rt->u.dst.tclassid);
+       if (rt->dst.tclassid)
+               NLA_PUT_U32(skb, RTA_FLOW, rt->dst.tclassid);
 #endif
        if (rt->fl.iif)
                NLA_PUT_BE32(skb, RTA_PREFSRC, rt->rt_spec_dst);
        if (rt->rt_dst != rt->rt_gateway)
                NLA_PUT_BE32(skb, RTA_GATEWAY, rt->rt_gateway);
 
-       if (rtnetlink_put_metrics(skb, rt->u.dst.metrics) < 0)
+       if (rtnetlink_put_metrics(skb, rt->dst.metrics) < 0)
                goto nla_put_failure;
 
-       error = rt->u.dst.error;
-       expires = rt->u.dst.expires ? rt->u.dst.expires - jiffies : 0;
+       error = rt->dst.error;
+       expires = rt->dst.expires ? rt->dst.expires - jiffies : 0;
        if (rt->peer) {
                id = atomic_read(&rt->peer->ip_id_count) & 0xffff;
                if (rt->peer->tcp_ts_stamp) {
                        NLA_PUT_U32(skb, RTA_IIF, rt->fl.iif);
        }
 
-       if (rtnl_put_cacheinfo(skb, &rt->u.dst, id, ts, tsage,
+       if (rtnl_put_cacheinfo(skb, &rt->dst, id, ts, tsage,
                               expires, error) < 0)
                goto nla_put_failure;
 
                local_bh_enable();
 
                rt = skb_rtable(skb);
-               if (err == 0 && rt->u.dst.error)
-                       err = -rt->u.dst.error;
+               if (err == 0 && rt->dst.error)
+                       err = -rt->dst.error;
        } else {
                struct flowi fl = {
                        .nl_u = {
        if (err)
                goto errout_free;
 
-       skb_dst_set(skb, &rt->u.dst);
+       skb_dst_set(skb, &rt->dst);
        if (rtm->rtm_flags & RTM_F_NOTIFY)
                rt->rt_flags |= RTCF_NOTIFY;
 
                        continue;
                rcu_read_lock_bh();
                for (rt = rcu_dereference_bh(rt_hash_table[h].chain), idx = 0; rt;
-                    rt = rcu_dereference_bh(rt->u.dst.rt_next), idx++) {
-                       if (!net_eq(dev_net(rt->u.dst.dev), net) || idx < s_idx)
+                    rt = rcu_dereference_bh(rt->dst.rt_next), idx++) {
+                       if (!net_eq(dev_net(rt->dst.dev), net) || idx < s_idx)
                                continue;
                        if (rt_is_expired(rt))
                                continue;
-                       skb_dst_set_noref(skb, &rt->u.dst);
+                       skb_dst_set_noref(skb, &rt->dst);
                        if (rt_fill_info(net, skb, NETLINK_CB(cb->skb).pid,
                                         cb->nlh->nlmsg_seq, RTM_NEWROUTE,
                                         1, NLM_F_MULTI) <= 0) {
 
        }
 
        /* Try to redo what tcp_v4_send_synack did. */
-       req->window_clamp = tp->window_clamp ? :dst_metric(&rt->u.dst, RTAX_WINDOW);
+       req->window_clamp = tp->window_clamp ? :dst_metric(&rt->dst, RTAX_WINDOW);
 
        tcp_select_initial_window(tcp_full_space(sk), req->mss,
                                  &req->rcv_wnd, &req->window_clamp,
                                  ireq->wscale_ok, &rcv_wscale,
-                                 dst_metric(&rt->u.dst, RTAX_INITRWND));
+                                 dst_metric(&rt->dst, RTAX_INITRWND));
 
        ireq->rcv_wscale  = rcv_wscale;
 
-       ret = get_cookie_sock(sk, skb, req, &rt->u.dst);
+       ret = get_cookie_sock(sk, skb, req, &rt->dst);
 out:   return ret;
 }
 
 
        /* OK, now commit destination to socket.  */
        sk->sk_gso_type = SKB_GSO_TCPV4;
-       sk_setup_caps(sk, &rt->u.dst);
+       sk_setup_caps(sk, &rt->dst);
 
        if (!tp->write_seq)
                tp->write_seq = secure_tcp_sequence_number(inet->inet_saddr,
 
                    !sock_flag(sk, SOCK_BROADCAST))
                        goto out;
                if (connected)
-                       sk_dst_set(sk, dst_clone(&rt->u.dst));
+                       sk_dst_set(sk, dst_clone(&rt->dst));
        }
 
        if (msg->msg_flags&MSG_CONFIRM)
        return err;
 
 do_confirm:
-       dst_confirm(&rt->u.dst);
+       dst_confirm(&rt->dst);
        if (!(msg->msg_flags&MSG_PROBE) || len)
                goto back_from_confirm;
        err = 0;
 
                fl.fl4_src = saddr->a4;
 
        err = __ip_route_output_key(net, &rt, &fl);
-       dst = &rt->u.dst;
+       dst = &rt->dst;
        if (err)
                dst = ERR_PTR(err);
        return dst;
 
                pr_warning("Freeing alive inet6 address %p\n", ifp);
                return;
        }
-       dst_release(&ifp->rt->u.dst);
+       dst_release(&ifp->rt->dst);
 
        call_rcu(&ifp->rcu, inet6_ifa_finish_destroy_rcu);
 }
                                rt->rt6i_flags |= RTF_EXPIRES;
                        }
                }
-               dst_release(&rt->u.dst);
+               dst_release(&rt->dst);
        }
 
 out:
                                              dev, expires, flags);
                }
                if (rt)
-                       dst_release(&rt->u.dst);
+                       dst_release(&rt->dst);
        }
 
        /* Try to figure out our local address for this prefix */
                if (ifp->idev->cnf.forwarding)
                        addrconf_leave_anycast(ifp);
                addrconf_leave_solict(ifp->idev, &ifp->addr);
-               dst_hold(&ifp->rt->u.dst);
+               dst_hold(&ifp->rt->dst);
 
                if (ifp->state == INET6_IFADDR_STATE_DEAD &&
                    ip6_del_rt(ifp->rt))
-                       dst_free(&ifp->rt->u.dst);
+                       dst_free(&ifp->rt->dst);
                break;
        }
 }
 
                rt = rt6_lookup(net, addr, NULL, 0, 0);
                if (rt) {
                        dev = rt->rt6i_dev;
-                       dst_release(&rt->u.dst);
+                       dst_release(&rt->dst);
                } else if (ishost) {
                        err = -EADDRNOTAVAIL;
                        goto error;
 {
        if (atomic_dec_and_test(&ac->aca_refcnt)) {
                in6_dev_put(ac->aca_idev);
-               dst_release(&ac->aca_rt->u.dst);
+               dst_release(&ac->aca_rt->dst);
                kfree(ac);
        }
 }
        write_unlock_bh(&idev->lock);
        addrconf_leave_solict(idev, &aca->aca_addr);
 
-       dst_hold(&aca->aca_rt->u.dst);
+       dst_hold(&aca->aca_rt->dst);
        ip6_del_rt(aca->aca_rt);
 
        aca_put(aca);
 
        if (arg.result)
                return arg.result;
 
-       dst_hold(&net->ipv6.ip6_null_entry->u.dst);
-       return &net->ipv6.ip6_null_entry->u.dst;
+       dst_hold(&net->ipv6.ip6_null_entry->dst);
+       return &net->ipv6.ip6_null_entry->dst;
 }
 
 static int fib6_rule_action(struct fib_rule *rule, struct flowi *flp,
                        struct in6_addr saddr;
 
                        if (ipv6_dev_get_saddr(net,
-                                              ip6_dst_idev(&rt->u.dst)->dev,
+                                              ip6_dst_idev(&rt->dst)->dev,
                                               &flp->fl6_dst,
                                               rt6_flags2srcprefs(flags),
                                               &saddr))
                goto out;
        }
 again:
-       dst_release(&rt->u.dst);
+       dst_release(&rt->dst);
        rt = NULL;
        goto out;
 
 discard_pkt:
-       dst_hold(&rt->u.dst);
+       dst_hold(&rt->dst);
 out:
        arg->result = rt;
        return rt == NULL ? -EAGAIN : 0;
 
 static __inline__ void rt6_release(struct rt6_info *rt)
 {
        if (atomic_dec_and_test(&rt->rt6i_ref))
-               dst_free(&rt->u.dst);
+               dst_free(&rt->dst);
 }
 
 static void fib6_link_table(struct net *net, struct fib6_table *tb)
        int res;
        struct rt6_info *rt;
 
-       for (rt = w->leaf; rt; rt = rt->u.dst.rt6_next) {
+       for (rt = w->leaf; rt; rt = rt->dst.rt6_next) {
                res = rt6_dump_route(rt, w->args);
                if (res < 0) {
                        /* Frame is full, suspend walking */
 
        ins = &fn->leaf;
 
-       for (iter = fn->leaf; iter; iter=iter->u.dst.rt6_next) {
+       for (iter = fn->leaf; iter; iter=iter->dst.rt6_next) {
                /*
                 *      Search for duplicates
                 */
                if (iter->rt6i_metric > rt->rt6i_metric)
                        break;
 
-               ins = &iter->u.dst.rt6_next;
+               ins = &iter->dst.rt6_next;
        }
 
        /* Reset round-robin state, if necessary */
         *      insert node
         */
 
-       rt->u.dst.rt6_next = iter;
+       rt->dst.rt6_next = iter;
        *ins = rt;
        rt->rt6i_node = fn;
        atomic_inc(&rt->rt6i_ref);
                        atomic_inc(&pn->leaf->rt6i_ref);
                }
 #endif
-               dst_free(&rt->u.dst);
+               dst_free(&rt->dst);
        }
        return err;
 
 st_failure:
        if (fn && !(fn->fn_flags & (RTN_RTINFO|RTN_ROOT)))
                fib6_repair_tree(info->nl_net, fn);
-       dst_free(&rt->u.dst);
+       dst_free(&rt->dst);
        return err;
 #endif
 }
        RT6_TRACE("fib6_del_route\n");
 
        /* Unlink it */
-       *rtp = rt->u.dst.rt6_next;
+       *rtp = rt->dst.rt6_next;
        rt->rt6i_node = NULL;
        net->ipv6.rt6_stats->fib_rt_entries--;
        net->ipv6.rt6_stats->fib_discarded_routes++;
        FOR_WALKERS(w) {
                if (w->state == FWS_C && w->leaf == rt) {
                        RT6_TRACE("walker %p adjusted by delroute\n", w);
-                       w->leaf = rt->u.dst.rt6_next;
+                       w->leaf = rt->dst.rt6_next;
                        if (w->leaf == NULL)
                                w->state = FWS_U;
                }
        }
        read_unlock(&fib6_walker_lock);
 
-       rt->u.dst.rt6_next = NULL;
+       rt->dst.rt6_next = NULL;
 
        /* If it was last route, expunge its radix tree node */
        if (fn->leaf == NULL) {
        struct rt6_info **rtp;
 
 #if RT6_DEBUG >= 2
-       if (rt->u.dst.obsolete>0) {
+       if (rt->dst.obsolete>0) {
                WARN_ON(fn != NULL);
                return -ENOENT;
        }
         *      Walk the leaf entries looking for ourself
         */
 
-       for (rtp = &fn->leaf; *rtp; rtp = &(*rtp)->u.dst.rt6_next) {
+       for (rtp = &fn->leaf; *rtp; rtp = &(*rtp)->dst.rt6_next) {
                if (*rtp == rt) {
                        fib6_del_route(fn, rtp, info);
                        return 0;
                .nl_net = c->net,
        };
 
-       for (rt = w->leaf; rt; rt = rt->u.dst.rt6_next) {
+       for (rt = w->leaf; rt; rt = rt->dst.rt6_next) {
                res = c->func(rt, c->arg);
                if (res < 0) {
                        w->leaf = rt;
                }
                gc_args.more++;
        } else if (rt->rt6i_flags & RTF_CACHE) {
-               if (atomic_read(&rt->u.dst.__refcnt) == 0 &&
-                   time_after_eq(now, rt->u.dst.lastuse + gc_args.timeout)) {
+               if (atomic_read(&rt->dst.__refcnt) == 0 &&
+                   time_after_eq(now, rt->dst.lastuse + gc_args.timeout)) {
                        RT6_TRACE("aging clone %p\n", rt);
                        return -1;
                } else if ((rt->rt6i_flags & RTF_GATEWAY) &&
 
                ipv6_hdr(skb)->payload_len = htons(first_len -
                                                   sizeof(struct ipv6hdr));
 
-               dst_hold(&rt->u.dst);
+               dst_hold(&rt->dst);
 
                for (;;) {
                        /* Prepare header of the next frame,
 
                        err = output(skb);
                        if(!err)
-                               IP6_INC_STATS(net, ip6_dst_idev(&rt->u.dst),
+                               IP6_INC_STATS(net, ip6_dst_idev(&rt->dst),
                                              IPSTATS_MIB_FRAGCREATES);
 
                        if (err || !frag)
                kfree(tmp_hdr);
 
                if (err == 0) {
-                       IP6_INC_STATS(net, ip6_dst_idev(&rt->u.dst),
+                       IP6_INC_STATS(net, ip6_dst_idev(&rt->dst),
                                      IPSTATS_MIB_FRAGOKS);
-                       dst_release(&rt->u.dst);
+                       dst_release(&rt->dst);
                        return 0;
                }
 
                        frag = skb;
                }
 
-               IP6_INC_STATS(net, ip6_dst_idev(&rt->u.dst),
+               IP6_INC_STATS(net, ip6_dst_idev(&rt->dst),
                              IPSTATS_MIB_FRAGFAILS);
-               dst_release(&rt->u.dst);
+               dst_release(&rt->dst);
                return err;
        }
 
                 *      Allocate buffer.
                 */
 
-               if ((frag = alloc_skb(len+hlen+sizeof(struct frag_hdr)+LL_ALLOCATED_SPACE(rt->u.dst.dev), GFP_ATOMIC)) == NULL) {
+               if ((frag = alloc_skb(len+hlen+sizeof(struct frag_hdr)+LL_ALLOCATED_SPACE(rt->dst.dev), GFP_ATOMIC)) == NULL) {
                        NETDEBUG(KERN_INFO "IPv6: frag: no memory for new fragment!\n");
                        IP6_INC_STATS(net, ip6_dst_idev(skb_dst(skb)),
                                      IPSTATS_MIB_FRAGFAILS);
                 */
 
                ip6_copy_metadata(frag, skb);
-               skb_reserve(frag, LL_RESERVED_SPACE(rt->u.dst.dev));
+               skb_reserve(frag, LL_RESERVED_SPACE(rt->dst.dev));
                skb_put(frag, len + hlen + sizeof(struct frag_hdr));
                skb_reset_network_header(frag);
                fh = (struct frag_hdr *)(skb_network_header(frag) + hlen);
 
                        /* need source address above miyazawa*/
                }
-               dst_hold(&rt->u.dst);
-               inet->cork.dst = &rt->u.dst;
+               dst_hold(&rt->dst);
+               inet->cork.dst = &rt->dst;
                inet->cork.fl = *fl;
                np->cork.hop_limit = hlimit;
                np->cork.tclass = tclass;
                mtu = np->pmtudisc == IPV6_PMTUDISC_PROBE ?
-                     rt->u.dst.dev->mtu : dst_mtu(rt->u.dst.path);
+                     rt->dst.dev->mtu : dst_mtu(rt->dst.path);
                if (np->frag_size < mtu) {
                        if (np->frag_size)
                                mtu = np->frag_size;
                }
                inet->cork.fragsize = mtu;
-               if (dst_allfrag(rt->u.dst.path))
+               if (dst_allfrag(rt->dst.path))
                        inet->cork.flags |= IPCORK_ALLFRAG;
                inet->cork.length = 0;
                sk->sk_sndmsg_page = NULL;
                sk->sk_sndmsg_off = 0;
-               exthdrlen = rt->u.dst.header_len + (opt ? opt->opt_flen : 0) -
+               exthdrlen = rt->dst.header_len + (opt ? opt->opt_flen : 0) -
                            rt->rt6i_nfheader_len;
                length += exthdrlen;
                transhdrlen += exthdrlen;
                mtu = inet->cork.fragsize;
        }
 
-       hh_len = LL_RESERVED_SPACE(rt->u.dst.dev);
+       hh_len = LL_RESERVED_SPACE(rt->dst.dev);
 
        fragheaderlen = sizeof(struct ipv6hdr) + rt->rt6i_nfheader_len +
                        (opt ? opt->opt_nflen : 0);
                }
 
                if (proto == IPPROTO_UDP &&
-                   (rt->u.dst.dev->features & NETIF_F_UFO)) {
+                   (rt->dst.dev->features & NETIF_F_UFO)) {
 
                        err = ip6_ufo_append_data(sk, getfrag, from, length,
                                                  hh_len, fragheaderlen,
 
                        fraglen = datalen + fragheaderlen;
                        if ((flags & MSG_MORE) &&
-                           !(rt->u.dst.dev->features&NETIF_F_SG))
+                           !(rt->dst.dev->features&NETIF_F_SG))
                                alloclen = mtu;
                        else
                                alloclen = datalen + fragheaderlen;
                         * because we have no idea if we're the last one.
                         */
                        if (datalen == length + fraggap)
-                               alloclen += rt->u.dst.trailer_len;
+                               alloclen += rt->dst.trailer_len;
 
                        /*
                         * We just reserve space for fragment header.
                if (copy > length)
                        copy = length;
 
-               if (!(rt->u.dst.dev->features&NETIF_F_SG)) {
+               if (!(rt->dst.dev->features&NETIF_F_SG)) {
                        unsigned int off;
 
                        off = skb->len;
        skb->priority = sk->sk_priority;
        skb->mark = sk->sk_mark;
 
-       skb_dst_set(skb, dst_clone(&rt->u.dst));
+       skb_dst_set(skb, dst_clone(&rt->dst));
        IP6_UPD_PO_STATS(net, rt->rt6i_idev, IPSTATS_MIB_OUT, skb->len);
        if (proto == IPPROTO_ICMPV6) {
                struct inet6_dev *idev = ip6_dst_idev(skb_dst(skb));
 
        if (ip_route_output_key(dev_net(skb->dev), &rt, &fl))
                goto out;
 
-       skb2->dev = rt->u.dst.dev;
+       skb2->dev = rt->dst.dev;
 
        /* route "incoming" packet */
        if (rt->rt_flags & RTCF_LOCAL) {
                fl.fl4_src = eiph->saddr;
                fl.fl4_tos = eiph->tos;
                if (ip_route_output_key(dev_net(skb->dev), &rt, &fl) ||
-                   rt->u.dst.dev->type != ARPHRD_TUNNEL) {
+                   rt->dst.dev->type != ARPHRD_TUNNEL) {
                        ip_rt_put(rt);
                        goto out;
                }
                icmpv6_send(skb2, rel_type, rel_code, rel_info);
 
                if (rt)
-                       dst_release(&rt->u.dst);
+                       dst_release(&rt->dst);
 
                kfree_skb(skb2);
        }
                        if (dev->mtu < IPV6_MIN_MTU)
                                dev->mtu = IPV6_MIN_MTU;
                }
-               dst_release(&rt->u.dst);
+               dst_release(&rt->dst);
        }
 }
 
 
                rt = rt6_lookup(net, addr, NULL, 0, 0);
                if (rt) {
                        dev = rt->rt6i_dev;
-                       dst_release(&rt->u.dst);
+                       dst_release(&rt->dst);
                }
        } else
                dev = dev_get_by_index_rcu(net, ifindex);
                if (rt) {
                        dev = rt->rt6i_dev;
                        dev_hold(dev);
-                       dst_release(&rt->u.dst);
+                       dst_release(&rt->dst);
                }
        } else
                dev = dev_get_by_index_rcu(net, ifindex);
 
                        ND_PRINTK0(KERN_ERR
                                   "ICMPv6 RA: %s() got default router without neighbour.\n",
                                   __func__);
-                       dst_release(&rt->u.dst);
+                       dst_release(&rt->dst);
                        in6_dev_put(in6_dev);
                        return;
                }
        if (ra_msg->icmph.icmp6_hop_limit) {
                in6_dev->cnf.hop_limit = ra_msg->icmph.icmp6_hop_limit;
                if (rt)
-                       rt->u.dst.metrics[RTAX_HOPLIMIT-1] = ra_msg->icmph.icmp6_hop_limit;
+                       rt->dst.metrics[RTAX_HOPLIMIT-1] = ra_msg->icmph.icmp6_hop_limit;
        }
 
 skip_defrtr:
                        in6_dev->cnf.mtu6 = mtu;
 
                        if (rt)
-                               rt->u.dst.metrics[RTAX_MTU-1] = mtu;
+                               rt->dst.metrics[RTAX_MTU-1] = mtu;
 
                        rt6_mtu_change(skb->dev, mtu);
                }
        }
 out:
        if (rt)
-               dst_release(&rt->u.dst);
+               dst_release(&rt->dst);
        else if (neigh)
                neigh_release(neigh);
        in6_dev_put(in6_dev);
 
        int err;
        struct rt6_info *rt = (struct rt6_info *)*dstp;
 
-       if (length > rt->u.dst.dev->mtu) {
-               ipv6_local_error(sk, EMSGSIZE, fl, rt->u.dst.dev->mtu);
+       if (length > rt->dst.dev->mtu) {
+               ipv6_local_error(sk, EMSGSIZE, fl, rt->dst.dev->mtu);
                return -EMSGSIZE;
        }
        if (flags&MSG_PROBE)
                goto out;
 
        skb = sock_alloc_send_skb(sk,
-                                 length + LL_ALLOCATED_SPACE(rt->u.dst.dev) + 15,
+                                 length + LL_ALLOCATED_SPACE(rt->dst.dev) + 15,
                                  flags & MSG_DONTWAIT, &err);
        if (skb == NULL)
                goto error;
-       skb_reserve(skb, LL_RESERVED_SPACE(rt->u.dst.dev));
+       skb_reserve(skb, LL_RESERVED_SPACE(rt->dst.dev));
 
        skb->priority = sk->sk_priority;
        skb->mark = sk->sk_mark;
-       skb_dst_set(skb, &rt->u.dst);
+       skb_dst_set(skb, &rt->dst);
        *dstp = NULL;
 
        skb_put(skb, length);
 
        IP6_UPD_PO_STATS(sock_net(sk), rt->rt6i_idev, IPSTATS_MIB_OUT, skb->len);
        err = NF_HOOK(NFPROTO_IPV6, NF_INET_LOCAL_OUT, skb, NULL,
-                     rt->u.dst.dev, dst_output);
+                     rt->dst.dev, dst_output);
        if (err > 0)
                err = net_xmit_errno(err);
        if (err)
 
 };
 
 static struct rt6_info ip6_null_entry_template = {
-       .u = {
-               .dst = {
-                       .__refcnt       = ATOMIC_INIT(1),
-                       .__use          = 1,
-                       .obsolete       = -1,
-                       .error          = -ENETUNREACH,
-                       .metrics        = { [RTAX_HOPLIMIT - 1] = 255, },
-                       .input          = ip6_pkt_discard,
-                       .output         = ip6_pkt_discard_out,
-               }
+       .dst = {
+               .__refcnt       = ATOMIC_INIT(1),
+               .__use          = 1,
+               .obsolete       = -1,
+               .error          = -ENETUNREACH,
+               .metrics        = { [RTAX_HOPLIMIT - 1] = 255, },
+               .input          = ip6_pkt_discard,
+               .output         = ip6_pkt_discard_out,
        },
        .rt6i_flags     = (RTF_REJECT | RTF_NONEXTHOP),
        .rt6i_protocol  = RTPROT_KERNEL,
 static int ip6_pkt_prohibit_out(struct sk_buff *skb);
 
 static struct rt6_info ip6_prohibit_entry_template = {
-       .u = {
-               .dst = {
-                       .__refcnt       = ATOMIC_INIT(1),
-                       .__use          = 1,
-                       .obsolete       = -1,
-                       .error          = -EACCES,
-                       .metrics        = { [RTAX_HOPLIMIT - 1] = 255, },
-                       .input          = ip6_pkt_prohibit,
-                       .output         = ip6_pkt_prohibit_out,
-               }
+       .dst = {
+               .__refcnt       = ATOMIC_INIT(1),
+               .__use          = 1,
+               .obsolete       = -1,
+               .error          = -EACCES,
+               .metrics        = { [RTAX_HOPLIMIT - 1] = 255, },
+               .input          = ip6_pkt_prohibit,
+               .output         = ip6_pkt_prohibit_out,
        },
        .rt6i_flags     = (RTF_REJECT | RTF_NONEXTHOP),
        .rt6i_protocol  = RTPROT_KERNEL,
 };
 
 static struct rt6_info ip6_blk_hole_entry_template = {
-       .u = {
-               .dst = {
-                       .__refcnt       = ATOMIC_INIT(1),
-                       .__use          = 1,
-                       .obsolete       = -1,
-                       .error          = -EINVAL,
-                       .metrics        = { [RTAX_HOPLIMIT - 1] = 255, },
-                       .input          = dst_discard,
-                       .output         = dst_discard,
-               }
+       .dst = {
+               .__refcnt       = ATOMIC_INIT(1),
+               .__use          = 1,
+               .obsolete       = -1,
+               .error          = -EINVAL,
+               .metrics        = { [RTAX_HOPLIMIT - 1] = 255, },
+               .input          = dst_discard,
+               .output         = dst_discard,
        },
        .rt6i_flags     = (RTF_REJECT | RTF_NONEXTHOP),
        .rt6i_protocol  = RTPROT_KERNEL,
        if (!oif && ipv6_addr_any(saddr))
                goto out;
 
-       for (sprt = rt; sprt; sprt = sprt->u.dst.rt6_next) {
+       for (sprt = rt; sprt; sprt = sprt->dst.rt6_next) {
                struct net_device *dev = sprt->rt6i_dev;
 
                if (oif) {
 
        match = NULL;
        for (rt = rr_head; rt && rt->rt6i_metric == metric;
-            rt = rt->u.dst.rt6_next)
+            rt = rt->dst.rt6_next)
                match = find_match(rt, oif, strict, &mpri, match);
        for (rt = fn->leaf; rt && rt != rr_head && rt->rt6i_metric == metric;
-            rt = rt->u.dst.rt6_next)
+            rt = rt->dst.rt6_next)
                match = find_match(rt, oif, strict, &mpri, match);
 
        return match;
 
        if (!match &&
            (strict & RT6_LOOKUP_F_REACHABLE)) {
-               struct rt6_info *next = rt0->u.dst.rt6_next;
+               struct rt6_info *next = rt0->dst.rt6_next;
 
                /* no entries matched; do round-robin */
                if (!next || next->rt6i_metric != rt0->rt6i_metric)
                        rt->rt6i_expires = jiffies + HZ * lifetime;
                        rt->rt6i_flags |= RTF_EXPIRES;
                }
-               dst_release(&rt->u.dst);
+               dst_release(&rt->dst);
        }
        return 0;
 }
        rt = rt6_device_match(net, rt, &fl->fl6_src, fl->oif, flags);
        BACKTRACK(net, &fl->fl6_src);
 out:
-       dst_use(&rt->u.dst, jiffies);
+       dst_use(&rt->dst, jiffies);
        read_unlock_bh(&table->tb6_lock);
        return rt;
 
                ipv6_addr_copy(&rt->rt6i_dst.addr, daddr);
                rt->rt6i_dst.plen = 128;
                rt->rt6i_flags |= RTF_CACHE;
-               rt->u.dst.flags |= DST_HOST;
+               rt->dst.flags |= DST_HOST;
 
 #ifdef CONFIG_IPV6_SUBTREES
                if (rt->rt6i_src.plen && saddr) {
                        if (net_ratelimit())
                                printk(KERN_WARNING
                                       "Neighbour table overflow.\n");
-                       dst_free(&rt->u.dst);
+                       dst_free(&rt->dst);
                        return NULL;
                }
                rt->rt6i_nexthop = neigh;
                ipv6_addr_copy(&rt->rt6i_dst.addr, daddr);
                rt->rt6i_dst.plen = 128;
                rt->rt6i_flags |= RTF_CACHE;
-               rt->u.dst.flags |= DST_HOST;
+               rt->dst.flags |= DST_HOST;
                rt->rt6i_nexthop = neigh_clone(ort->rt6i_nexthop);
        }
        return rt;
            rt->rt6i_flags & RTF_CACHE)
                goto out;
 
-       dst_hold(&rt->u.dst);
+       dst_hold(&rt->dst);
        read_unlock_bh(&table->tb6_lock);
 
        if (!rt->rt6i_nexthop && !(rt->rt6i_flags & RTF_NONEXTHOP))
 #endif
        }
 
-       dst_release(&rt->u.dst);
+       dst_release(&rt->dst);
        rt = nrt ? : net->ipv6.ip6_null_entry;
 
-       dst_hold(&rt->u.dst);
+       dst_hold(&rt->dst);
        if (nrt) {
                err = ip6_ins_rt(nrt);
                if (!err)
         * Race condition! In the gap, when table->tb6_lock was
         * released someone could insert this route.  Relookup.
         */
-       dst_release(&rt->u.dst);
+       dst_release(&rt->dst);
        goto relookup;
 
 out:
                reachable = 0;
                goto restart_2;
        }
-       dst_hold(&rt->u.dst);
+       dst_hold(&rt->dst);
        read_unlock_bh(&table->tb6_lock);
 out2:
-       rt->u.dst.lastuse = jiffies;
-       rt->u.dst.__use++;
+       rt->dst.lastuse = jiffies;
+       rt->dst.__use++;
 
        return rt;
 }
        struct dst_entry *new = NULL;
 
        if (rt) {
-               new = &rt->u.dst;
+               new = &rt->dst;
 
                atomic_set(&new->__refcnt, 1);
                new->__use = 1;
                new->input = dst_discard;
                new->output = dst_discard;
 
-               memcpy(new->metrics, ort->u.dst.metrics, RTAX_MAX*sizeof(u32));
-               new->dev = ort->u.dst.dev;
+               memcpy(new->metrics, ort->dst.metrics, RTAX_MAX*sizeof(u32));
+               new->dev = ort->dst.dev;
                if (new->dev)
                        dev_hold(new->dev);
                rt->rt6i_idev = ort->rt6i_idev;
        rt = (struct rt6_info *) skb_dst(skb);
        if (rt) {
                if (rt->rt6i_flags&RTF_CACHE) {
-                       dst_set_expires(&rt->u.dst, 0);
+                       dst_set_expires(&rt->dst, 0);
                        rt->rt6i_flags |= RTF_EXPIRES;
                } else if (rt->rt6i_node && (rt->rt6i_flags & RTF_DEFAULT))
                        rt->rt6i_node->fn_sernum = -1;
        rt->rt6i_dev      = dev;
        rt->rt6i_idev     = idev;
        rt->rt6i_nexthop  = neigh;
-       atomic_set(&rt->u.dst.__refcnt, 1);
-       rt->u.dst.metrics[RTAX_HOPLIMIT-1] = 255;
-       rt->u.dst.metrics[RTAX_MTU-1] = ipv6_get_mtu(rt->rt6i_dev);
-       rt->u.dst.metrics[RTAX_ADVMSS-1] = ipv6_advmss(net, dst_mtu(&rt->u.dst));
-       rt->u.dst.output  = ip6_output;
+       atomic_set(&rt->dst.__refcnt, 1);
+       rt->dst.metrics[RTAX_HOPLIMIT-1] = 255;
+       rt->dst.metrics[RTAX_MTU-1] = ipv6_get_mtu(rt->rt6i_dev);
+       rt->dst.metrics[RTAX_ADVMSS-1] = ipv6_advmss(net, dst_mtu(&rt->dst));
+       rt->dst.output  = ip6_output;
 
 #if 0  /* there's no chance to use these for ndisc */
-       rt->u.dst.flags   = ipv6_addr_type(addr) & IPV6_ADDR_UNICAST
+       rt->dst.flags   = ipv6_addr_type(addr) & IPV6_ADDR_UNICAST
                                ? DST_HOST
                                : 0;
        ipv6_addr_copy(&rt->rt6i_dst.addr, addr);
 #endif
 
        spin_lock_bh(&icmp6_dst_lock);
-       rt->u.dst.next = icmp6_dst_gc_list;
-       icmp6_dst_gc_list = &rt->u.dst;
+       rt->dst.next = icmp6_dst_gc_list;
+       icmp6_dst_gc_list = &rt->dst;
        spin_unlock_bh(&icmp6_dst_lock);
 
        fib6_force_start_gc(net);
 
 out:
-       return &rt->u.dst;
+       return &rt->dst;
 }
 
 int icmp6_dst_gc(void)
                goto out;
        }
 
-       rt->u.dst.obsolete = -1;
+       rt->dst.obsolete = -1;
        rt->rt6i_expires = (cfg->fc_flags & RTF_EXPIRES) ?
                                jiffies + clock_t_to_jiffies(cfg->fc_expires) :
                                0;
        addr_type = ipv6_addr_type(&cfg->fc_dst);
 
        if (addr_type & IPV6_ADDR_MULTICAST)
-               rt->u.dst.input = ip6_mc_input;
+               rt->dst.input = ip6_mc_input;
        else
-               rt->u.dst.input = ip6_forward;
+               rt->dst.input = ip6_forward;
 
-       rt->u.dst.output = ip6_output;
+       rt->dst.output = ip6_output;
 
        ipv6_addr_prefix(&rt->rt6i_dst.addr, &cfg->fc_dst, cfg->fc_dst_len);
        rt->rt6i_dst.plen = cfg->fc_dst_len;
        if (rt->rt6i_dst.plen == 128)
-              rt->u.dst.flags = DST_HOST;
+              rt->dst.flags = DST_HOST;
 
 #ifdef CONFIG_IPV6_SUBTREES
        ipv6_addr_prefix(&rt->rt6i_src.addr, &cfg->fc_src, cfg->fc_src_len);
                                goto out;
                        }
                }
-               rt->u.dst.output = ip6_pkt_discard_out;
-               rt->u.dst.input = ip6_pkt_discard;
-               rt->u.dst.error = -ENETUNREACH;
+               rt->dst.output = ip6_pkt_discard_out;
+               rt->dst.input = ip6_pkt_discard;
+               rt->dst.error = -ENETUNREACH;
                rt->rt6i_flags = RTF_REJECT|RTF_NONEXTHOP;
                goto install_route;
        }
                                goto out;
                        if (dev) {
                                if (dev != grt->rt6i_dev) {
-                                       dst_release(&grt->u.dst);
+                                       dst_release(&grt->dst);
                                        goto out;
                                }
                        } else {
                        }
                        if (!(grt->rt6i_flags&RTF_GATEWAY))
                                err = 0;
-                       dst_release(&grt->u.dst);
+                       dst_release(&grt->dst);
 
                        if (err)
                                goto out;
                                        goto out;
                                }
 
-                               rt->u.dst.metrics[type - 1] = nla_get_u32(nla);
+                               rt->dst.metrics[type - 1] = nla_get_u32(nla);
                        }
                }
        }
 
-       if (dst_metric(&rt->u.dst, RTAX_HOPLIMIT) == 0)
-               rt->u.dst.metrics[RTAX_HOPLIMIT-1] = -1;
-       if (!dst_mtu(&rt->u.dst))
-               rt->u.dst.metrics[RTAX_MTU-1] = ipv6_get_mtu(dev);
-       if (!dst_metric(&rt->u.dst, RTAX_ADVMSS))
-               rt->u.dst.metrics[RTAX_ADVMSS-1] = ipv6_advmss(net, dst_mtu(&rt->u.dst));
-       rt->u.dst.dev = dev;
+       if (dst_metric(&rt->dst, RTAX_HOPLIMIT) == 0)
+               rt->dst.metrics[RTAX_HOPLIMIT-1] = -1;
+       if (!dst_mtu(&rt->dst))
+               rt->dst.metrics[RTAX_MTU-1] = ipv6_get_mtu(dev);
+       if (!dst_metric(&rt->dst, RTAX_ADVMSS))
+               rt->dst.metrics[RTAX_ADVMSS-1] = ipv6_advmss(net, dst_mtu(&rt->dst));
+       rt->dst.dev = dev;
        rt->rt6i_idev = idev;
        rt->rt6i_table = table;
 
        if (idev)
                in6_dev_put(idev);
        if (rt)
-               dst_free(&rt->u.dst);
+               dst_free(&rt->dst);
        return err;
 }
 
        write_lock_bh(&table->tb6_lock);
 
        err = fib6_del(rt, info);
-       dst_release(&rt->u.dst);
+       dst_release(&rt->dst);
 
        write_unlock_bh(&table->tb6_lock);
 
                         &cfg->fc_src, cfg->fc_src_len);
 
        if (fn) {
-               for (rt = fn->leaf; rt; rt = rt->u.dst.rt6_next) {
+               for (rt = fn->leaf; rt; rt = rt->dst.rt6_next) {
                        if (cfg->fc_ifindex &&
                            (rt->rt6i_dev == NULL ||
                             rt->rt6i_dev->ifindex != cfg->fc_ifindex))
                                continue;
                        if (cfg->fc_metric && cfg->fc_metric != rt->rt6i_metric)
                                continue;
-                       dst_hold(&rt->u.dst);
+                       dst_hold(&rt->dst);
                        read_unlock_bh(&table->tb6_lock);
 
                        return __ip6_del_rt(rt, &cfg->fc_nlinfo);
        read_lock_bh(&table->tb6_lock);
        fn = fib6_lookup(&table->tb6_root, &fl->fl6_dst, &fl->fl6_src);
 restart:
-       for (rt = fn->leaf; rt; rt = rt->u.dst.rt6_next) {
+       for (rt = fn->leaf; rt; rt = rt->dst.rt6_next) {
                /*
                 * Current route is on-link; redirect is always invalid.
                 *
                rt = net->ipv6.ip6_null_entry;
        BACKTRACK(net, &fl->fl6_src);
 out:
-       dst_hold(&rt->u.dst);
+       dst_hold(&rt->dst);
 
        read_unlock_bh(&table->tb6_lock);
 
         * Look, redirects are sent only in response to data packets,
         * so that this nexthop apparently is reachable. --ANK
         */
-       dst_confirm(&rt->u.dst);
+       dst_confirm(&rt->dst);
 
        /* Duplicate redirect: silently ignore. */
-       if (neigh == rt->u.dst.neighbour)
+       if (neigh == rt->dst.neighbour)
                goto out;
 
        nrt = ip6_rt_copy(rt);
 
        ipv6_addr_copy(&nrt->rt6i_dst.addr, dest);
        nrt->rt6i_dst.plen = 128;
-       nrt->u.dst.flags |= DST_HOST;
+       nrt->dst.flags |= DST_HOST;
 
        ipv6_addr_copy(&nrt->rt6i_gateway, (struct in6_addr*)neigh->primary_key);
        nrt->rt6i_nexthop = neigh_clone(neigh);
        /* Reset pmtu, it may be better */
-       nrt->u.dst.metrics[RTAX_MTU-1] = ipv6_get_mtu(neigh->dev);
-       nrt->u.dst.metrics[RTAX_ADVMSS-1] = ipv6_advmss(dev_net(neigh->dev),
-                                                       dst_mtu(&nrt->u.dst));
+       nrt->dst.metrics[RTAX_MTU-1] = ipv6_get_mtu(neigh->dev);
+       nrt->dst.metrics[RTAX_ADVMSS-1] = ipv6_advmss(dev_net(neigh->dev),
+                                                       dst_mtu(&nrt->dst));
 
        if (ip6_ins_rt(nrt))
                goto out;
 
-       netevent.old = &rt->u.dst;
-       netevent.new = &nrt->u.dst;
+       netevent.old = &rt->dst;
+       netevent.new = &nrt->dst;
        call_netevent_notifiers(NETEVENT_REDIRECT, &netevent);
 
        if (rt->rt6i_flags&RTF_CACHE) {
        }
 
 out:
-       dst_release(&rt->u.dst);
+       dst_release(&rt->dst);
 }
 
 /*
        if (rt == NULL)
                return;
 
-       if (pmtu >= dst_mtu(&rt->u.dst))
+       if (pmtu >= dst_mtu(&rt->dst))
                goto out;
 
        if (pmtu < IPV6_MIN_MTU) {
           They are sent only in response to data packets,
           so that this nexthop apparently is reachable. --ANK
         */
-       dst_confirm(&rt->u.dst);
+       dst_confirm(&rt->dst);
 
        /* Host route. If it is static, it would be better
           not to override it, but add new one, so that
           would return automatically.
         */
        if (rt->rt6i_flags & RTF_CACHE) {
-               rt->u.dst.metrics[RTAX_MTU-1] = pmtu;
+               rt->dst.metrics[RTAX_MTU-1] = pmtu;
                if (allfrag)
-                       rt->u.dst.metrics[RTAX_FEATURES-1] |= RTAX_FEATURE_ALLFRAG;
-               dst_set_expires(&rt->u.dst, net->ipv6.sysctl.ip6_rt_mtu_expires);
+                       rt->dst.metrics[RTAX_FEATURES-1] |= RTAX_FEATURE_ALLFRAG;
+               dst_set_expires(&rt->dst, net->ipv6.sysctl.ip6_rt_mtu_expires);
                rt->rt6i_flags |= RTF_MODIFIED|RTF_EXPIRES;
                goto out;
        }
                nrt = rt6_alloc_clone(rt, daddr);
 
        if (nrt) {
-               nrt->u.dst.metrics[RTAX_MTU-1] = pmtu;
+               nrt->dst.metrics[RTAX_MTU-1] = pmtu;
                if (allfrag)
-                       nrt->u.dst.metrics[RTAX_FEATURES-1] |= RTAX_FEATURE_ALLFRAG;
+                       nrt->dst.metrics[RTAX_FEATURES-1] |= RTAX_FEATURE_ALLFRAG;
 
                /* According to RFC 1981, detecting PMTU increase shouldn't be
                 * happened within 5 mins, the recommended timer is 10 mins.
                 * which is 10 mins. After 10 mins the decreased pmtu is expired
                 * and detecting PMTU increase will be automatically happened.
                 */
-               dst_set_expires(&nrt->u.dst, net->ipv6.sysctl.ip6_rt_mtu_expires);
+               dst_set_expires(&nrt->dst, net->ipv6.sysctl.ip6_rt_mtu_expires);
                nrt->rt6i_flags |= RTF_DYNAMIC|RTF_EXPIRES;
 
                ip6_ins_rt(nrt);
        }
 out:
-       dst_release(&rt->u.dst);
+       dst_release(&rt->dst);
 }
 
 /*
        struct rt6_info *rt = ip6_dst_alloc(&net->ipv6.ip6_dst_ops);
 
        if (rt) {
-               rt->u.dst.input = ort->u.dst.input;
-               rt->u.dst.output = ort->u.dst.output;
-
-               memcpy(rt->u.dst.metrics, ort->u.dst.metrics, RTAX_MAX*sizeof(u32));
-               rt->u.dst.error = ort->u.dst.error;
-               rt->u.dst.dev = ort->u.dst.dev;
-               if (rt->u.dst.dev)
-                       dev_hold(rt->u.dst.dev);
+               rt->dst.input = ort->dst.input;
+               rt->dst.output = ort->dst.output;
+
+               memcpy(rt->dst.metrics, ort->dst.metrics, RTAX_MAX*sizeof(u32));
+               rt->dst.error = ort->dst.error;
+               rt->dst.dev = ort->dst.dev;
+               if (rt->dst.dev)
+                       dev_hold(rt->dst.dev);
                rt->rt6i_idev = ort->rt6i_idev;
                if (rt->rt6i_idev)
                        in6_dev_hold(rt->rt6i_idev);
-               rt->u.dst.lastuse = jiffies;
+               rt->dst.lastuse = jiffies;
                rt->rt6i_expires = 0;
 
                ipv6_addr_copy(&rt->rt6i_gateway, &ort->rt6i_gateway);
        if (!fn)
                goto out;
 
-       for (rt = fn->leaf; rt; rt = rt->u.dst.rt6_next) {
+       for (rt = fn->leaf; rt; rt = rt->dst.rt6_next) {
                if (rt->rt6i_dev->ifindex != ifindex)
                        continue;
                if ((rt->rt6i_flags & (RTF_ROUTEINFO|RTF_GATEWAY)) != (RTF_ROUTEINFO|RTF_GATEWAY))
                        continue;
                if (!ipv6_addr_equal(&rt->rt6i_gateway, gwaddr))
                        continue;
-               dst_hold(&rt->u.dst);
+               dst_hold(&rt->dst);
                break;
        }
 out:
                return NULL;
 
        write_lock_bh(&table->tb6_lock);
-       for (rt = table->tb6_root.leaf; rt; rt=rt->u.dst.rt6_next) {
+       for (rt = table->tb6_root.leaf; rt; rt=rt->dst.rt6_next) {
                if (dev == rt->rt6i_dev &&
                    ((rt->rt6i_flags & (RTF_ADDRCONF | RTF_DEFAULT)) == (RTF_ADDRCONF | RTF_DEFAULT)) &&
                    ipv6_addr_equal(&rt->rt6i_gateway, addr))
                        break;
        }
        if (rt)
-               dst_hold(&rt->u.dst);
+               dst_hold(&rt->dst);
        write_unlock_bh(&table->tb6_lock);
        return rt;
 }
 
 restart:
        read_lock_bh(&table->tb6_lock);
-       for (rt = table->tb6_root.leaf; rt; rt = rt->u.dst.rt6_next) {
+       for (rt = table->tb6_root.leaf; rt; rt = rt->dst.rt6_next) {
                if (rt->rt6i_flags & (RTF_DEFAULT | RTF_ADDRCONF)) {
-                       dst_hold(&rt->u.dst);
+                       dst_hold(&rt->dst);
                        read_unlock_bh(&table->tb6_lock);
                        ip6_del_rt(rt);
                        goto restart;
        dev_hold(net->loopback_dev);
        in6_dev_hold(idev);
 
-       rt->u.dst.flags = DST_HOST;
-       rt->u.dst.input = ip6_input;
-       rt->u.dst.output = ip6_output;
+       rt->dst.flags = DST_HOST;
+       rt->dst.input = ip6_input;
+       rt->dst.output = ip6_output;
        rt->rt6i_dev = net->loopback_dev;
        rt->rt6i_idev = idev;
-       rt->u.dst.metrics[RTAX_MTU-1] = ipv6_get_mtu(rt->rt6i_dev);
-       rt->u.dst.metrics[RTAX_ADVMSS-1] = ipv6_advmss(net, dst_mtu(&rt->u.dst));
-       rt->u.dst.metrics[RTAX_HOPLIMIT-1] = -1;
-       rt->u.dst.obsolete = -1;
+       rt->dst.metrics[RTAX_MTU-1] = ipv6_get_mtu(rt->rt6i_dev);
+       rt->dst.metrics[RTAX_ADVMSS-1] = ipv6_advmss(net, dst_mtu(&rt->dst));
+       rt->dst.metrics[RTAX_HOPLIMIT-1] = -1;
+       rt->dst.obsolete = -1;
 
        rt->rt6i_flags = RTF_UP | RTF_NONEXTHOP;
        if (anycast)
                rt->rt6i_flags |= RTF_LOCAL;
        neigh = ndisc_get_neigh(rt->rt6i_dev, &rt->rt6i_gateway);
        if (IS_ERR(neigh)) {
-               dst_free(&rt->u.dst);
+               dst_free(&rt->dst);
 
                /* We are casting this because that is the return
                 * value type.  But an errno encoded pointer is the
        rt->rt6i_dst.plen = 128;
        rt->rt6i_table = fib6_get_table(net, RT6_TABLE_LOCAL);
 
-       atomic_set(&rt->u.dst.__refcnt, 1);
+       atomic_set(&rt->dst.__refcnt, 1);
 
        return rt;
 }
           PMTU discouvery.
         */
        if (rt->rt6i_dev == arg->dev &&
-           !dst_metric_locked(&rt->u.dst, RTAX_MTU) &&
-           (dst_mtu(&rt->u.dst) >= arg->mtu ||
-            (dst_mtu(&rt->u.dst) < arg->mtu &&
-             dst_mtu(&rt->u.dst) == idev->cnf.mtu6))) {
-               rt->u.dst.metrics[RTAX_MTU-1] = arg->mtu;
-               rt->u.dst.metrics[RTAX_ADVMSS-1] = ipv6_advmss(net, arg->mtu);
+           !dst_metric_locked(&rt->dst, RTAX_MTU) &&
+           (dst_mtu(&rt->dst) >= arg->mtu ||
+            (dst_mtu(&rt->dst) < arg->mtu &&
+             dst_mtu(&rt->dst) == idev->cnf.mtu6))) {
+               rt->dst.metrics[RTAX_MTU-1] = arg->mtu;
+               rt->dst.metrics[RTAX_ADVMSS-1] = ipv6_advmss(net, arg->mtu);
        }
        return 0;
 }
 #endif
                        NLA_PUT_U32(skb, RTA_IIF, iif);
        } else if (dst) {
-               struct inet6_dev *idev = ip6_dst_idev(&rt->u.dst);
+               struct inet6_dev *idev = ip6_dst_idev(&rt->dst);
                struct in6_addr saddr_buf;
                if (ipv6_dev_get_saddr(net, idev ? idev->dev : NULL,
                                       dst, 0, &saddr_buf) == 0)
                        NLA_PUT(skb, RTA_PREFSRC, 16, &saddr_buf);
        }
 
-       if (rtnetlink_put_metrics(skb, rt->u.dst.metrics) < 0)
+       if (rtnetlink_put_metrics(skb, rt->dst.metrics) < 0)
                goto nla_put_failure;
 
-       if (rt->u.dst.neighbour)
-               NLA_PUT(skb, RTA_GATEWAY, 16, &rt->u.dst.neighbour->primary_key);
+       if (rt->dst.neighbour)
+               NLA_PUT(skb, RTA_GATEWAY, 16, &rt->dst.neighbour->primary_key);
 
-       if (rt->u.dst.dev)
+       if (rt->dst.dev)
                NLA_PUT_U32(skb, RTA_OIF, rt->rt6i_dev->ifindex);
 
        NLA_PUT_U32(skb, RTA_PRIORITY, rt->rt6i_metric);
        else
                expires = INT_MAX;
 
-       if (rtnl_put_cacheinfo(skb, &rt->u.dst, 0, 0, 0,
-                              expires, rt->u.dst.error) < 0)
+       if (rtnl_put_cacheinfo(skb, &rt->dst, 0, 0, 0,
+                              expires, rt->dst.error) < 0)
                goto nla_put_failure;
 
        return nlmsg_end(skb, nlh);
        skb_reserve(skb, MAX_HEADER + sizeof(struct ipv6hdr));
 
        rt = (struct rt6_info*) ip6_route_output(net, NULL, &fl);
-       skb_dst_set(skb, &rt->u.dst);
+       skb_dst_set(skb, &rt->dst);
 
        err = rt6_fill_node(net, skb, rt, &fl.fl6_dst, &fl.fl6_src, iif,
                            RTM_NEWROUTE, NETLINK_CB(in_skb).pid,
        struct net *net = dev_net(dev);
 
        if (event == NETDEV_REGISTER && (dev->flags & IFF_LOOPBACK)) {
-               net->ipv6.ip6_null_entry->u.dst.dev = dev;
+               net->ipv6.ip6_null_entry->dst.dev = dev;
                net->ipv6.ip6_null_entry->rt6i_idev = in6_dev_get(dev);
 #ifdef CONFIG_IPV6_MULTIPLE_TABLES
-               net->ipv6.ip6_prohibit_entry->u.dst.dev = dev;
+               net->ipv6.ip6_prohibit_entry->dst.dev = dev;
                net->ipv6.ip6_prohibit_entry->rt6i_idev = in6_dev_get(dev);
-               net->ipv6.ip6_blk_hole_entry->u.dst.dev = dev;
+               net->ipv6.ip6_blk_hole_entry->dst.dev = dev;
                net->ipv6.ip6_blk_hole_entry->rt6i_idev = in6_dev_get(dev);
 #endif
        }
                seq_puts(m, "00000000000000000000000000000000");
        }
        seq_printf(m, " %08x %08x %08x %08x %8s\n",
-                  rt->rt6i_metric, atomic_read(&rt->u.dst.__refcnt),
-                  rt->u.dst.__use, rt->rt6i_flags,
+                  rt->rt6i_metric, atomic_read(&rt->dst.__refcnt),
+                  rt->dst.__use, rt->rt6i_flags,
                   rt->rt6i_dev ? rt->rt6i_dev->name : "");
        return 0;
 }
                                           GFP_KERNEL);
        if (!net->ipv6.ip6_null_entry)
                goto out_ip6_dst_ops;
-       net->ipv6.ip6_null_entry->u.dst.path =
+       net->ipv6.ip6_null_entry->dst.path =
                (struct dst_entry *)net->ipv6.ip6_null_entry;
-       net->ipv6.ip6_null_entry->u.dst.ops = &net->ipv6.ip6_dst_ops;
+       net->ipv6.ip6_null_entry->dst.ops = &net->ipv6.ip6_dst_ops;
 
 #ifdef CONFIG_IPV6_MULTIPLE_TABLES
        net->ipv6.ip6_prohibit_entry = kmemdup(&ip6_prohibit_entry_template,
                                               GFP_KERNEL);
        if (!net->ipv6.ip6_prohibit_entry)
                goto out_ip6_null_entry;
-       net->ipv6.ip6_prohibit_entry->u.dst.path =
+       net->ipv6.ip6_prohibit_entry->dst.path =
                (struct dst_entry *)net->ipv6.ip6_prohibit_entry;
-       net->ipv6.ip6_prohibit_entry->u.dst.ops = &net->ipv6.ip6_dst_ops;
+       net->ipv6.ip6_prohibit_entry->dst.ops = &net->ipv6.ip6_dst_ops;
 
        net->ipv6.ip6_blk_hole_entry = kmemdup(&ip6_blk_hole_entry_template,
                                               sizeof(*net->ipv6.ip6_blk_hole_entry),
                                               GFP_KERNEL);
        if (!net->ipv6.ip6_blk_hole_entry)
                goto out_ip6_prohibit_entry;
-       net->ipv6.ip6_blk_hole_entry->u.dst.path =
+       net->ipv6.ip6_blk_hole_entry->dst.path =
                (struct dst_entry *)net->ipv6.ip6_blk_hole_entry;
-       net->ipv6.ip6_blk_hole_entry->u.dst.ops = &net->ipv6.ip6_dst_ops;
+       net->ipv6.ip6_blk_hole_entry->dst.ops = &net->ipv6.ip6_dst_ops;
 #endif
 
        net->ipv6.sysctl.flush_delay = 0;
        /* Registering of the loopback is done before this portion of code,
         * the loopback reference in rt6_info will not be taken, do it
         * manually for init_net */
-       init_net.ipv6.ip6_null_entry->u.dst.dev = init_net.loopback_dev;
+       init_net.ipv6.ip6_null_entry->dst.dev = init_net.loopback_dev;
        init_net.ipv6.ip6_null_entry->rt6i_idev = in6_dev_get(init_net.loopback_dev);
   #ifdef CONFIG_IPV6_MULTIPLE_TABLES
-       init_net.ipv6.ip6_prohibit_entry->u.dst.dev = init_net.loopback_dev;
+       init_net.ipv6.ip6_prohibit_entry->dst.dev = init_net.loopback_dev;
        init_net.ipv6.ip6_prohibit_entry->rt6i_idev = in6_dev_get(init_net.loopback_dev);
-       init_net.ipv6.ip6_blk_hole_entry->u.dst.dev = init_net.loopback_dev;
+       init_net.ipv6.ip6_blk_hole_entry->dst.dev = init_net.loopback_dev;
        init_net.ipv6.ip6_blk_hole_entry->rt6i_idev = in6_dev_get(init_net.loopback_dev);
   #endif
        ret = fib6_init();
 
                stats->tx_carrier_errors++;
                goto tx_error_icmp;
        }
-       tdev = rt->u.dst.dev;
+       tdev = rt->dst.dev;
 
        if (tdev == dev) {
                ip_rt_put(rt);
        }
 
        if (df) {
-               mtu = dst_mtu(&rt->u.dst) - sizeof(struct iphdr);
+               mtu = dst_mtu(&rt->dst) - sizeof(struct iphdr);
 
                if (mtu < 68) {
                        stats->collisions++;
        memset(&(IPCB(skb)->opt), 0, sizeof(IPCB(skb)->opt));
        IPCB(skb)->flags = 0;
        skb_dst_drop(skb);
-       skb_dst_set(skb, &rt->u.dst);
+       skb_dst_set(skb, &rt->dst);
 
        /*
         *      Push down and install the IPIP header.
                                    .proto = IPPROTO_IPV6 };
                struct rtable *rt;
                if (!ip_route_output_key(dev_net(dev), &rt, &fl)) {
-                       tdev = rt->u.dst.dev;
+                       tdev = rt->dst.dev;
                        ip_rt_put(rt);
                }
                dev->flags |= IFF_POINTOPOINT;
 
        sk->sk_state = TCP_ESTABLISHED;
        inet->inet_id = jiffies;
 
-       sk_dst_set(sk, &rt->u.dst);
+       sk_dst_set(sk, &rt->dst);
 
        write_lock_bh(&l2tp_ip_lock);
        hlist_del_init(&sk->sk_bind_node);
                        if (ip_route_output_flow(sock_net(sk), &rt, &fl, sk, 0))
                                goto no_route;
                }
-               sk_setup_caps(sk, &rt->u.dst);
+               sk_setup_caps(sk, &rt->dst);
        }
-       skb_dst_set(skb, dst_clone(&rt->u.dst));
+       skb_dst_set(skb, dst_clone(&rt->dst));
 
        /* Queue the packet to IP for output */
        rc = ip_queue_xmit(skb);
 
                                             &dest->addr.ip);
                                return NULL;
                        }
-                       __ip_vs_dst_set(dest, rtos, dst_clone(&rt->u.dst));
+                       __ip_vs_dst_set(dest, rtos, dst_clone(&rt->dst));
                        IP_VS_DBG(10, "new dst %pI4, refcnt=%d, rtos=%X\n",
                                  &dest->addr.ip,
-                                 atomic_read(&rt->u.dst.__refcnt), rtos);
+                                 atomic_read(&rt->dst.__refcnt), rtos);
                }
                spin_unlock(&dest->dst_lock);
        } else {
                                             &dest->addr.in6);
                                return NULL;
                        }
-                       __ip_vs_dst_set(dest, 0, dst_clone(&rt->u.dst));
+                       __ip_vs_dst_set(dest, 0, dst_clone(&rt->dst));
                        IP_VS_DBG(10, "new dst %pI6, refcnt=%d\n",
                                  &dest->addr.in6,
-                                 atomic_read(&rt->u.dst.__refcnt));
+                                 atomic_read(&rt->dst.__refcnt));
                }
                spin_unlock(&dest->dst_lock);
        } else {
        (skb)->ipvs_property = 1;                       \
        skb_forward_csum(skb);                          \
        NF_HOOK(pf, NF_INET_LOCAL_OUT, (skb), NULL,     \
-               (rt)->u.dst.dev, dst_output);           \
+               (rt)->dst.dev, dst_output);             \
 } while (0)
 
 
        }
 
        /* MTU checking */
-       mtu = dst_mtu(&rt->u.dst);
+       mtu = dst_mtu(&rt->dst);
        if ((skb->len > mtu) && (iph->frag_off & htons(IP_DF))) {
                ip_rt_put(rt);
                icmp_send(skb, ICMP_DEST_UNREACH,ICMP_FRAG_NEEDED, htonl(mtu));
 
        /* drop old route */
        skb_dst_drop(skb);
-       skb_dst_set(skb, &rt->u.dst);
+       skb_dst_set(skb, &rt->dst);
 
        /* Another hack: avoid icmp_send in ip_fragment */
        skb->local_df = 1;
        }
 
        /* MTU checking */
-       mtu = dst_mtu(&rt->u.dst);
+       mtu = dst_mtu(&rt->dst);
        if (skb->len > mtu) {
-               dst_release(&rt->u.dst);
+               dst_release(&rt->dst);
                icmpv6_send(skb, ICMPV6_PKT_TOOBIG, 0, mtu);
                IP_VS_DBG_RL("%s(): frag needed\n", __func__);
                goto tx_error;
         */
        skb = skb_share_check(skb, GFP_ATOMIC);
        if (unlikely(skb == NULL)) {
-               dst_release(&rt->u.dst);
+               dst_release(&rt->dst);
                return NF_STOLEN;
        }
 
        /* drop old route */
        skb_dst_drop(skb);
-       skb_dst_set(skb, &rt->u.dst);
+       skb_dst_set(skb, &rt->dst);
 
        /* Another hack: avoid icmp_send in ip_fragment */
        skb->local_df = 1;
                goto tx_error_icmp;
 
        /* MTU checking */
-       mtu = dst_mtu(&rt->u.dst);
+       mtu = dst_mtu(&rt->dst);
        if ((skb->len > mtu) && (iph->frag_off & htons(IP_DF))) {
                ip_rt_put(rt);
                icmp_send(skb, ICMP_DEST_UNREACH,ICMP_FRAG_NEEDED, htonl(mtu));
        if (!skb_make_writable(skb, sizeof(struct iphdr)))
                goto tx_error_put;
 
-       if (skb_cow(skb, rt->u.dst.dev->hard_header_len))
+       if (skb_cow(skb, rt->dst.dev->hard_header_len))
                goto tx_error_put;
 
        /* drop old route */
        skb_dst_drop(skb);
-       skb_dst_set(skb, &rt->u.dst);
+       skb_dst_set(skb, &rt->dst);
 
        /* mangle the packet */
        if (pp->dnat_handler && !pp->dnat_handler(skb, pp, cp))
                goto tx_error_icmp;
 
        /* MTU checking */
-       mtu = dst_mtu(&rt->u.dst);
+       mtu = dst_mtu(&rt->dst);
        if (skb->len > mtu) {
-               dst_release(&rt->u.dst);
+               dst_release(&rt->dst);
                icmpv6_send(skb, ICMPV6_PKT_TOOBIG, 0, mtu);
                IP_VS_DBG_RL_PKT(0, pp, skb, 0,
                                 "ip_vs_nat_xmit_v6(): frag needed for");
        if (!skb_make_writable(skb, sizeof(struct ipv6hdr)))
                goto tx_error_put;
 
-       if (skb_cow(skb, rt->u.dst.dev->hard_header_len))
+       if (skb_cow(skb, rt->dst.dev->hard_header_len))
                goto tx_error_put;
 
        /* drop old route */
        skb_dst_drop(skb);
-       skb_dst_set(skb, &rt->u.dst);
+       skb_dst_set(skb, &rt->dst);
 
        /* mangle the packet */
        if (pp->dnat_handler && !pp->dnat_handler(skb, pp, cp))
        kfree_skb(skb);
        return NF_STOLEN;
 tx_error_put:
-       dst_release(&rt->u.dst);
+       dst_release(&rt->dst);
        goto tx_error;
 }
 #endif
        if (!(rt = __ip_vs_get_out_rt(cp, RT_TOS(tos))))
                goto tx_error_icmp;
 
-       tdev = rt->u.dst.dev;
+       tdev = rt->dst.dev;
 
-       mtu = dst_mtu(&rt->u.dst) - sizeof(struct iphdr);
+       mtu = dst_mtu(&rt->dst) - sizeof(struct iphdr);
        if (mtu < 68) {
                ip_rt_put(rt);
                IP_VS_DBG_RL("%s(): mtu less than 68\n", __func__);
 
        /* drop old route */
        skb_dst_drop(skb);
-       skb_dst_set(skb, &rt->u.dst);
+       skb_dst_set(skb, &rt->dst);
 
        /*
         *      Push down and install the IPIP header.
        iph->daddr              =       rt->rt_dst;
        iph->saddr              =       rt->rt_src;
        iph->ttl                =       old_iph->ttl;
-       ip_select_ident(iph, &rt->u.dst, NULL);
+       ip_select_ident(iph, &rt->dst, NULL);
 
        /* Another hack: avoid icmp_send in ip_fragment */
        skb->local_df = 1;
        if (!rt)
                goto tx_error_icmp;
 
-       tdev = rt->u.dst.dev;
+       tdev = rt->dst.dev;
 
-       mtu = dst_mtu(&rt->u.dst) - sizeof(struct ipv6hdr);
+       mtu = dst_mtu(&rt->dst) - sizeof(struct ipv6hdr);
        /* TODO IPv6: do we need this check in IPv6? */
        if (mtu < 1280) {
-               dst_release(&rt->u.dst);
+               dst_release(&rt->dst);
                IP_VS_DBG_RL("%s(): mtu less than 1280\n", __func__);
                goto tx_error;
        }
 
        if (mtu < ntohs(old_iph->payload_len) + sizeof(struct ipv6hdr)) {
                icmpv6_send(skb, ICMPV6_PKT_TOOBIG, 0, mtu);
-               dst_release(&rt->u.dst);
+               dst_release(&rt->dst);
                IP_VS_DBG_RL("%s(): frag needed\n", __func__);
                goto tx_error;
        }
                struct sk_buff *new_skb =
                        skb_realloc_headroom(skb, max_headroom);
                if (!new_skb) {
-                       dst_release(&rt->u.dst);
+                       dst_release(&rt->dst);
                        kfree_skb(skb);
                        IP_VS_ERR_RL("%s(): no memory\n", __func__);
                        return NF_STOLEN;
 
        /* drop old route */
        skb_dst_drop(skb);
-       skb_dst_set(skb, &rt->u.dst);
+       skb_dst_set(skb, &rt->dst);
 
        /*
         *      Push down and install the IPIP header.
                goto tx_error_icmp;
 
        /* MTU checking */
-       mtu = dst_mtu(&rt->u.dst);
+       mtu = dst_mtu(&rt->dst);
        if ((iph->frag_off & htons(IP_DF)) && skb->len > mtu) {
                icmp_send(skb, ICMP_DEST_UNREACH,ICMP_FRAG_NEEDED, htonl(mtu));
                ip_rt_put(rt);
 
        /* drop old route */
        skb_dst_drop(skb);
-       skb_dst_set(skb, &rt->u.dst);
+       skb_dst_set(skb, &rt->dst);
 
        /* Another hack: avoid icmp_send in ip_fragment */
        skb->local_df = 1;
                goto tx_error_icmp;
 
        /* MTU checking */
-       mtu = dst_mtu(&rt->u.dst);
+       mtu = dst_mtu(&rt->dst);
        if (skb->len > mtu) {
                icmpv6_send(skb, ICMPV6_PKT_TOOBIG, 0, mtu);
-               dst_release(&rt->u.dst);
+               dst_release(&rt->dst);
                IP_VS_DBG_RL("%s(): frag needed\n", __func__);
                goto tx_error;
        }
         */
        skb = skb_share_check(skb, GFP_ATOMIC);
        if (unlikely(skb == NULL)) {
-               dst_release(&rt->u.dst);
+               dst_release(&rt->dst);
                return NF_STOLEN;
        }
 
        /* drop old route */
        skb_dst_drop(skb);
-       skb_dst_set(skb, &rt->u.dst);
+       skb_dst_set(skb, &rt->dst);
 
        /* Another hack: avoid icmp_send in ip_fragment */
        skb->local_df = 1;
                goto tx_error_icmp;
 
        /* MTU checking */
-       mtu = dst_mtu(&rt->u.dst);
+       mtu = dst_mtu(&rt->dst);
        if ((skb->len > mtu) && (ip_hdr(skb)->frag_off & htons(IP_DF))) {
                ip_rt_put(rt);
                icmp_send(skb, ICMP_DEST_UNREACH, ICMP_FRAG_NEEDED, htonl(mtu));
        if (!skb_make_writable(skb, offset))
                goto tx_error_put;
 
-       if (skb_cow(skb, rt->u.dst.dev->hard_header_len))
+       if (skb_cow(skb, rt->dst.dev->hard_header_len))
                goto tx_error_put;
 
        /* drop the old route when skb is not shared */
        skb_dst_drop(skb);
-       skb_dst_set(skb, &rt->u.dst);
+       skb_dst_set(skb, &rt->dst);
 
        ip_vs_nat_icmp(skb, pp, cp, 0);
 
                goto tx_error_icmp;
 
        /* MTU checking */
-       mtu = dst_mtu(&rt->u.dst);
+       mtu = dst_mtu(&rt->dst);
        if (skb->len > mtu) {
-               dst_release(&rt->u.dst);
+               dst_release(&rt->dst);
                icmpv6_send(skb, ICMPV6_PKT_TOOBIG, 0, mtu);
                IP_VS_DBG_RL("%s(): frag needed\n", __func__);
                goto tx_error;
        if (!skb_make_writable(skb, offset))
                goto tx_error_put;
 
-       if (skb_cow(skb, rt->u.dst.dev->hard_header_len))
+       if (skb_cow(skb, rt->dst.dev->hard_header_len))
                goto tx_error_put;
 
        /* drop the old route when skb is not shared */
        skb_dst_drop(skb);
-       skb_dst_set(skb, &rt->u.dst);
+       skb_dst_set(skb, &rt->dst);
 
        ip_vs_nat_icmp_v6(skb, pp, cp, 0);
 
        LeaveFunction(10);
        return rc;
 tx_error_put:
-       dst_release(&rt->u.dst);
+       dst_release(&rt->dst);
        goto tx_error;
 }
 #endif
 
                if (!afinfo->route((struct dst_entry **)&rt1, &fl1)) {
                        if (!afinfo->route((struct dst_entry **)&rt2, &fl2)) {
                                if (rt1->rt_gateway == rt2->rt_gateway &&
-                                   rt1->u.dst.dev  == rt2->u.dst.dev)
+                                   rt1->dst.dev  == rt2->dst.dev)
                                        ret = 1;
-                               dst_release(&rt2->u.dst);
+                               dst_release(&rt2->dst);
                        }
-                       dst_release(&rt1->u.dst);
+                       dst_release(&rt1->dst);
                }
                break;
        }
                        if (!afinfo->route((struct dst_entry **)&rt2, &fl2)) {
                                if (!memcmp(&rt1->rt6i_gateway, &rt2->rt6i_gateway,
                                            sizeof(rt1->rt6i_gateway)) &&
-                                   rt1->u.dst.dev == rt2->u.dst.dev)
+                                   rt1->dst.dev == rt2->dst.dev)
                                        ret = 1;
-                               dst_release(&rt2->u.dst);
+                               dst_release(&rt2->dst);
                        }
-                       dst_release(&rt1->u.dst);
+                       dst_release(&rt1->dst);
                }
                break;
        }
 
                goto out;
 
        rcu_read_lock();
-       in_dev = __in_dev_get_rcu(rt->u.dst.dev);
+       in_dev = __in_dev_get_rcu(rt->dst.dev);
        if (in_dev != NULL) {
                for_primary_ifa(in_dev) {
                        if (ifa->ifa_broadcast == iph->daddr) {
 
        rcu_read_unlock();
 
        if (rt != NULL) {
-               mtu = dst_mtu(&rt->u.dst);
-               dst_release(&rt->u.dst);
+               mtu = dst_mtu(&rt->dst);
+               dst_release(&rt->dst);
        }
        return mtu;
 }
 
                return false;
 
        skb_dst_drop(skb);
-       skb_dst_set(skb, &rt->u.dst);
-       skb->dev      = rt->u.dst.dev;
+       skb_dst_set(skb, &rt->dst);
+       skb->dev      = rt->dst.dev;
        skb->protocol = htons(ETH_P_IP);
        return true;
 }
 
                return;
        }
 
-       peer->if_mtu = dst_mtu(&rt->u.dst);
-       dst_release(&rt->u.dst);
+       peer->if_mtu = dst_mtu(&rt->dst);
+       dst_release(&rt->dst);
 
        _leave(" [if_mtu %u]", peer->if_mtu);
 }
 
                          __func__, &fl.fl4_dst, &fl.fl4_src);
 
        if (!ip_route_output_key(&init_net, &rt, &fl)) {
-               dst = &rt->u.dst;
+               dst = &rt->dst;
        }
 
        /* If there is no association or if a source address is passed, no
                        fl.fl4_src = laddr->a.v4.sin_addr.s_addr;
                        fl.fl_ip_sport = laddr->a.v4.sin_port;
                        if (!ip_route_output_key(&init_net, &rt, &fl)) {
-                               dst = &rt->u.dst;
+                               dst = &rt->dst;
                                goto out_unlock;
                        }
                }