diff options
55 files changed, 694 insertions, 709 deletions
diff --git a/drivers/infiniband/core/addr.c b/drivers/infiniband/core/addr.c index 0b926e45afe2..a5ea1bce9689 100644 --- a/drivers/infiniband/core/addr.c +++ b/drivers/infiniband/core/addr.c | |||
@@ -215,7 +215,7 @@ static int addr4_resolve(struct sockaddr_in *src_in, | |||
215 | 215 | ||
216 | neigh = neigh_lookup(&arp_tbl, &rt->rt_gateway, rt->idev->dev); | 216 | neigh = neigh_lookup(&arp_tbl, &rt->rt_gateway, rt->idev->dev); |
217 | if (!neigh || !(neigh->nud_state & NUD_VALID)) { | 217 | if (!neigh || !(neigh->nud_state & NUD_VALID)) { |
218 | neigh_event_send(rt->u.dst.neighbour, NULL); | 218 | neigh_event_send(rt->dst.neighbour, NULL); |
219 | ret = -ENODATA; | 219 | ret = -ENODATA; |
220 | if (neigh) | 220 | if (neigh) |
221 | goto release; | 221 | goto release; |
diff --git a/drivers/infiniband/hw/cxgb3/iwch_cm.c b/drivers/infiniband/hw/cxgb3/iwch_cm.c index ebfb117ba68b..abd683ea326d 100644 --- a/drivers/infiniband/hw/cxgb3/iwch_cm.c +++ b/drivers/infiniband/hw/cxgb3/iwch_cm.c | |||
@@ -1364,7 +1364,7 @@ static int pass_accept_req(struct t3cdev *tdev, struct sk_buff *skb, void *ctx) | |||
1364 | __func__); | 1364 | __func__); |
1365 | goto reject; | 1365 | goto reject; |
1366 | } | 1366 | } |
1367 | dst = &rt->u.dst; | 1367 | dst = &rt->dst; |
1368 | l2t = t3_l2t_get(tdev, dst->neighbour, dst->neighbour->dev); | 1368 | l2t = t3_l2t_get(tdev, dst->neighbour, dst->neighbour->dev); |
1369 | if (!l2t) { | 1369 | if (!l2t) { |
1370 | printk(KERN_ERR MOD "%s - failed to allocate l2t entry!\n", | 1370 | printk(KERN_ERR MOD "%s - failed to allocate l2t entry!\n", |
@@ -1932,7 +1932,7 @@ int iwch_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param) | |||
1932 | err = -EHOSTUNREACH; | 1932 | err = -EHOSTUNREACH; |
1933 | goto fail3; | 1933 | goto fail3; |
1934 | } | 1934 | } |
1935 | ep->dst = &rt->u.dst; | 1935 | ep->dst = &rt->dst; |
1936 | 1936 | ||
1937 | /* get a l2t entry */ | 1937 | /* get a l2t entry */ |
1938 | ep->l2t = t3_l2t_get(ep->com.tdev, ep->dst->neighbour, | 1938 | ep->l2t = t3_l2t_get(ep->com.tdev, ep->dst->neighbour, |
diff --git a/drivers/infiniband/hw/cxgb4/cm.c b/drivers/infiniband/hw/cxgb4/cm.c index 30ce0a8eca09..8b693c8c25e2 100644 --- a/drivers/infiniband/hw/cxgb4/cm.c +++ b/drivers/infiniband/hw/cxgb4/cm.c | |||
@@ -1364,7 +1364,7 @@ static int pass_accept_req(struct c4iw_dev *dev, struct sk_buff *skb) | |||
1364 | __func__); | 1364 | __func__); |
1365 | goto reject; | 1365 | goto reject; |
1366 | } | 1366 | } |
1367 | dst = &rt->u.dst; | 1367 | dst = &rt->dst; |
1368 | if (dst->neighbour->dev->flags & IFF_LOOPBACK) { | 1368 | if (dst->neighbour->dev->flags & IFF_LOOPBACK) { |
1369 | pdev = ip_dev_find(&init_net, peer_ip); | 1369 | pdev = ip_dev_find(&init_net, peer_ip); |
1370 | BUG_ON(!pdev); | 1370 | BUG_ON(!pdev); |
@@ -1938,7 +1938,7 @@ int c4iw_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param) | |||
1938 | err = -EHOSTUNREACH; | 1938 | err = -EHOSTUNREACH; |
1939 | goto fail3; | 1939 | goto fail3; |
1940 | } | 1940 | } |
1941 | ep->dst = &rt->u.dst; | 1941 | ep->dst = &rt->dst; |
1942 | 1942 | ||
1943 | /* get a l2t entry */ | 1943 | /* get a l2t entry */ |
1944 | if (ep->dst->neighbour->dev->flags & IFF_LOOPBACK) { | 1944 | if (ep->dst->neighbour->dev->flags & IFF_LOOPBACK) { |
diff --git a/drivers/infiniband/hw/nes/nes_cm.c b/drivers/infiniband/hw/nes/nes_cm.c index 986d6f32dded..d876d0435cd4 100644 --- a/drivers/infiniband/hw/nes/nes_cm.c +++ b/drivers/infiniband/hw/nes/nes_cm.c | |||
@@ -1146,7 +1146,7 @@ static int nes_addr_resolve_neigh(struct nes_vnic *nesvnic, u32 dst_ip, int arpi | |||
1146 | } | 1146 | } |
1147 | 1147 | ||
1148 | if ((neigh == NULL) || (!(neigh->nud_state & NUD_VALID))) | 1148 | if ((neigh == NULL) || (!(neigh->nud_state & NUD_VALID))) |
1149 | neigh_event_send(rt->u.dst.neighbour, NULL); | 1149 | neigh_event_send(rt->dst.neighbour, NULL); |
1150 | 1150 | ||
1151 | ip_rt_put(rt); | 1151 | ip_rt_put(rt); |
1152 | return rc; | 1152 | return rc; |
diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c index 1b19276cff12..ac4f94b7da37 100644 --- a/drivers/net/bonding/bond_main.c +++ b/drivers/net/bonding/bond_main.c | |||
@@ -2584,7 +2584,7 @@ static void bond_arp_send_all(struct bonding *bond, struct slave *slave) | |||
2584 | /* | 2584 | /* |
2585 | * This target is not on a VLAN | 2585 | * This target is not on a VLAN |
2586 | */ | 2586 | */ |
2587 | if (rt->u.dst.dev == bond->dev) { | 2587 | if (rt->dst.dev == bond->dev) { |
2588 | ip_rt_put(rt); | 2588 | ip_rt_put(rt); |
2589 | pr_debug("basa: rtdev == bond->dev: arp_send\n"); | 2589 | pr_debug("basa: rtdev == bond->dev: arp_send\n"); |
2590 | bond_arp_send(slave->dev, ARPOP_REQUEST, targets[i], | 2590 | bond_arp_send(slave->dev, ARPOP_REQUEST, targets[i], |
@@ -2595,7 +2595,7 @@ static void bond_arp_send_all(struct bonding *bond, struct slave *slave) | |||
2595 | vlan_id = 0; | 2595 | vlan_id = 0; |
2596 | list_for_each_entry(vlan, &bond->vlan_list, vlan_list) { | 2596 | list_for_each_entry(vlan, &bond->vlan_list, vlan_list) { |
2597 | vlan_dev = vlan_group_get_device(bond->vlgrp, vlan->vlan_id); | 2597 | vlan_dev = vlan_group_get_device(bond->vlgrp, vlan->vlan_id); |
2598 | if (vlan_dev == rt->u.dst.dev) { | 2598 | if (vlan_dev == rt->dst.dev) { |
2599 | vlan_id = vlan->vlan_id; | 2599 | vlan_id = vlan->vlan_id; |
2600 | pr_debug("basa: vlan match on %s %d\n", | 2600 | pr_debug("basa: vlan match on %s %d\n", |
2601 | vlan_dev->name, vlan_id); | 2601 | vlan_dev->name, vlan_id); |
@@ -2613,7 +2613,7 @@ static void bond_arp_send_all(struct bonding *bond, struct slave *slave) | |||
2613 | if (net_ratelimit()) { | 2613 | if (net_ratelimit()) { |
2614 | pr_warning("%s: no path to arp_ip_target %pI4 via rt.dev %s\n", | 2614 | pr_warning("%s: no path to arp_ip_target %pI4 via rt.dev %s\n", |
2615 | bond->dev->name, &fl.fl4_dst, | 2615 | bond->dev->name, &fl.fl4_dst, |
2616 | rt->u.dst.dev ? rt->u.dst.dev->name : "NULL"); | 2616 | rt->dst.dev ? rt->dst.dev->name : "NULL"); |
2617 | } | 2617 | } |
2618 | ip_rt_put(rt); | 2618 | ip_rt_put(rt); |
2619 | } | 2619 | } |
diff --git a/drivers/net/cnic.c b/drivers/net/cnic.c index fe925663d39a..908d89a4fe86 100644 --- a/drivers/net/cnic.c +++ b/drivers/net/cnic.c | |||
@@ -2824,7 +2824,7 @@ static int cnic_get_v4_route(struct sockaddr_in *dst_addr, | |||
2824 | 2824 | ||
2825 | err = ip_route_output_key(&init_net, &rt, &fl); | 2825 | err = ip_route_output_key(&init_net, &rt, &fl); |
2826 | if (!err) | 2826 | if (!err) |
2827 | *dst = &rt->u.dst; | 2827 | *dst = &rt->dst; |
2828 | return err; | 2828 | return err; |
2829 | #else | 2829 | #else |
2830 | return -ENETUNREACH; | 2830 | return -ENETUNREACH; |
diff --git a/drivers/scsi/cxgb3i/cxgb3i_offload.c b/drivers/scsi/cxgb3i/cxgb3i_offload.c index a175be9c496f..3b6a06eebf7f 100644 --- a/drivers/scsi/cxgb3i/cxgb3i_offload.c +++ b/drivers/scsi/cxgb3i/cxgb3i_offload.c | |||
@@ -1587,7 +1587,7 @@ cxgb3i_find_dev(struct net_device *dev, __be32 ipaddr) | |||
1587 | 1587 | ||
1588 | err = ip_route_output_key(dev ? dev_net(dev) : &init_net, &rt, &fl); | 1588 | err = ip_route_output_key(dev ? dev_net(dev) : &init_net, &rt, &fl); |
1589 | if (!err) | 1589 | if (!err) |
1590 | return (&rt->u.dst)->dev; | 1590 | return (&rt->dst)->dev; |
1591 | 1591 | ||
1592 | return NULL; | 1592 | return NULL; |
1593 | } | 1593 | } |
@@ -1649,7 +1649,7 @@ int cxgb3i_c3cn_connect(struct net_device *dev, struct s3_conn *c3cn, | |||
1649 | c3cn->saddr.sin_addr.s_addr = rt->rt_src; | 1649 | c3cn->saddr.sin_addr.s_addr = rt->rt_src; |
1650 | 1650 | ||
1651 | /* now commit destination to connection */ | 1651 | /* now commit destination to connection */ |
1652 | c3cn->dst_cache = &rt->u.dst; | 1652 | c3cn->dst_cache = &rt->dst; |
1653 | 1653 | ||
1654 | /* try to establish an offloaded connection */ | 1654 | /* try to establish an offloaded connection */ |
1655 | dev = cxgb3_egress_dev(c3cn->dst_cache->dev, c3cn, 0); | 1655 | dev = cxgb3_egress_dev(c3cn->dst_cache->dev, c3cn, 0); |
diff --git a/include/net/dn_route.h b/include/net/dn_route.h index 60c9f22d8694..ccadab3aa3f6 100644 --- a/include/net/dn_route.h +++ b/include/net/dn_route.h | |||
@@ -65,9 +65,7 @@ extern void dn_rt_cache_flush(int delay); | |||
65 | * packets to the originating host. | 65 | * packets to the originating host. |
66 | */ | 66 | */ |
67 | struct dn_route { | 67 | struct dn_route { |
68 | union { | 68 | struct dst_entry dst; |
69 | struct dst_entry dst; | ||
70 | } u; | ||
71 | 69 | ||
72 | struct flowi fl; | 70 | struct flowi fl; |
73 | 71 | ||
diff --git a/include/net/ip6_fib.h b/include/net/ip6_fib.h index 4b1dc1161c37..062a823d311c 100644 --- a/include/net/ip6_fib.h +++ b/include/net/ip6_fib.h | |||
@@ -84,13 +84,11 @@ struct rt6key { | |||
84 | struct fib6_table; | 84 | struct fib6_table; |
85 | 85 | ||
86 | struct rt6_info { | 86 | struct rt6_info { |
87 | union { | 87 | struct dst_entry dst; |
88 | struct dst_entry dst; | ||
89 | } u; | ||
90 | 88 | ||
91 | #define rt6i_dev u.dst.dev | 89 | #define rt6i_dev dst.dev |
92 | #define rt6i_nexthop u.dst.neighbour | 90 | #define rt6i_nexthop dst.neighbour |
93 | #define rt6i_expires u.dst.expires | 91 | #define rt6i_expires dst.expires |
94 | 92 | ||
95 | /* | 93 | /* |
96 | * Tail elements of dst_entry (__refcnt etc.) | 94 | * Tail elements of dst_entry (__refcnt etc.) |
diff --git a/include/net/ipip.h b/include/net/ipip.h index 11e8513d2d07..65caea8b414f 100644 --- a/include/net/ipip.h +++ b/include/net/ipip.h | |||
@@ -50,7 +50,7 @@ struct ip_tunnel_prl_entry { | |||
50 | int pkt_len = skb->len - skb_transport_offset(skb); \ | 50 | int pkt_len = skb->len - skb_transport_offset(skb); \ |
51 | \ | 51 | \ |
52 | skb->ip_summed = CHECKSUM_NONE; \ | 52 | skb->ip_summed = CHECKSUM_NONE; \ |
53 | ip_select_ident(iph, &rt->u.dst, NULL); \ | 53 | ip_select_ident(iph, &rt->dst, NULL); \ |
54 | \ | 54 | \ |
55 | err = ip_local_out(skb); \ | 55 | err = ip_local_out(skb); \ |
56 | if (likely(net_xmit_eval(err) == 0)) { \ | 56 | if (likely(net_xmit_eval(err) == 0)) { \ |
diff --git a/include/net/route.h b/include/net/route.h index af6cf4b4c9dc..bd732d62e1c3 100644 --- a/include/net/route.h +++ b/include/net/route.h | |||
@@ -50,9 +50,7 @@ | |||
50 | struct fib_nh; | 50 | struct fib_nh; |
51 | struct inet_peer; | 51 | struct inet_peer; |
52 | struct rtable { | 52 | struct rtable { |
53 | union { | 53 | struct dst_entry dst; |
54 | struct dst_entry dst; | ||
55 | } u; | ||
56 | 54 | ||
57 | /* Cache lookup keys */ | 55 | /* Cache lookup keys */ |
58 | struct flowi fl; | 56 | struct flowi fl; |
@@ -144,7 +142,7 @@ extern void fib_add_ifaddr(struct in_ifaddr *); | |||
144 | static inline void ip_rt_put(struct rtable * rt) | 142 | static inline void ip_rt_put(struct rtable * rt) |
145 | { | 143 | { |
146 | if (rt) | 144 | if (rt) |
147 | dst_release(&rt->u.dst); | 145 | dst_release(&rt->dst); |
148 | } | 146 | } |
149 | 147 | ||
150 | #define IPTOS_RT_MASK (IPTOS_TOS_MASK & ~3) | 148 | #define IPTOS_RT_MASK (IPTOS_TOS_MASK & ~3) |
diff --git a/net/atm/clip.c b/net/atm/clip.c index 313aba11316b..95fdd1185067 100644 --- a/net/atm/clip.c +++ b/net/atm/clip.c | |||
@@ -522,7 +522,7 @@ static int clip_setentry(struct atm_vcc *vcc, __be32 ip) | |||
522 | error = ip_route_output_key(&init_net, &rt, &fl); | 522 | error = ip_route_output_key(&init_net, &rt, &fl); |
523 | if (error) | 523 | if (error) |
524 | return error; | 524 | return error; |
525 | neigh = __neigh_lookup(&clip_tbl, &ip, rt->u.dst.dev, 1); | 525 | neigh = __neigh_lookup(&clip_tbl, &ip, rt->dst.dev, 1); |
526 | ip_rt_put(rt); | 526 | ip_rt_put(rt); |
527 | if (!neigh) | 527 | if (!neigh) |
528 | return -ENOMEM; | 528 | return -ENOMEM; |
diff --git a/net/bridge/br_device.c b/net/bridge/br_device.c index eedf2c94820e..b898364beaf5 100644 --- a/net/bridge/br_device.c +++ b/net/bridge/br_device.c | |||
@@ -127,7 +127,7 @@ static int br_change_mtu(struct net_device *dev, int new_mtu) | |||
127 | 127 | ||
128 | #ifdef CONFIG_BRIDGE_NETFILTER | 128 | #ifdef CONFIG_BRIDGE_NETFILTER |
129 | /* remember the MTU in the rtable for PMTU */ | 129 | /* remember the MTU in the rtable for PMTU */ |
130 | br->fake_rtable.u.dst.metrics[RTAX_MTU - 1] = new_mtu; | 130 | br->fake_rtable.dst.metrics[RTAX_MTU - 1] = new_mtu; |
131 | #endif | 131 | #endif |
132 | 132 | ||
133 | return 0; | 133 | return 0; |
diff --git a/net/bridge/br_netfilter.c b/net/bridge/br_netfilter.c index 44420992f72f..0685b2558ab5 100644 --- a/net/bridge/br_netfilter.c +++ b/net/bridge/br_netfilter.c | |||
@@ -117,12 +117,12 @@ void br_netfilter_rtable_init(struct net_bridge *br) | |||
117 | { | 117 | { |
118 | struct rtable *rt = &br->fake_rtable; | 118 | struct rtable *rt = &br->fake_rtable; |
119 | 119 | ||
120 | atomic_set(&rt->u.dst.__refcnt, 1); | 120 | atomic_set(&rt->dst.__refcnt, 1); |
121 | rt->u.dst.dev = br->dev; | 121 | rt->dst.dev = br->dev; |
122 | rt->u.dst.path = &rt->u.dst; | 122 | rt->dst.path = &rt->dst; |
123 | rt->u.dst.metrics[RTAX_MTU - 1] = 1500; | 123 | rt->dst.metrics[RTAX_MTU - 1] = 1500; |
124 | rt->u.dst.flags = DST_NOXFRM; | 124 | rt->dst.flags = DST_NOXFRM; |
125 | rt->u.dst.ops = &fake_dst_ops; | 125 | rt->dst.ops = &fake_dst_ops; |
126 | } | 126 | } |
127 | 127 | ||
128 | static inline struct rtable *bridge_parent_rtable(const struct net_device *dev) | 128 | static inline struct rtable *bridge_parent_rtable(const struct net_device *dev) |
@@ -244,8 +244,8 @@ static int br_nf_pre_routing_finish_ipv6(struct sk_buff *skb) | |||
244 | kfree_skb(skb); | 244 | kfree_skb(skb); |
245 | return 0; | 245 | return 0; |
246 | } | 246 | } |
247 | dst_hold(&rt->u.dst); | 247 | dst_hold(&rt->dst); |
248 | skb_dst_set(skb, &rt->u.dst); | 248 | skb_dst_set(skb, &rt->dst); |
249 | 249 | ||
250 | skb->dev = nf_bridge->physindev; | 250 | skb->dev = nf_bridge->physindev; |
251 | nf_bridge_update_protocol(skb); | 251 | nf_bridge_update_protocol(skb); |
@@ -396,8 +396,8 @@ bridged_dnat: | |||
396 | kfree_skb(skb); | 396 | kfree_skb(skb); |
397 | return 0; | 397 | return 0; |
398 | } | 398 | } |
399 | dst_hold(&rt->u.dst); | 399 | dst_hold(&rt->dst); |
400 | skb_dst_set(skb, &rt->u.dst); | 400 | skb_dst_set(skb, &rt->dst); |
401 | } | 401 | } |
402 | 402 | ||
403 | skb->dev = nf_bridge->physindev; | 403 | skb->dev = nf_bridge->physindev; |
diff --git a/net/dccp/ipv4.c b/net/dccp/ipv4.c index d9b11ef8694c..d4a166f0f391 100644 --- a/net/dccp/ipv4.c +++ b/net/dccp/ipv4.c | |||
@@ -105,7 +105,7 @@ int dccp_v4_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len) | |||
105 | goto failure; | 105 | goto failure; |
106 | 106 | ||
107 | /* OK, now commit destination to socket. */ | 107 | /* OK, now commit destination to socket. */ |
108 | sk_setup_caps(sk, &rt->u.dst); | 108 | sk_setup_caps(sk, &rt->dst); |
109 | 109 | ||
110 | dp->dccps_iss = secure_dccp_sequence_number(inet->inet_saddr, | 110 | dp->dccps_iss = secure_dccp_sequence_number(inet->inet_saddr, |
111 | inet->inet_daddr, | 111 | inet->inet_daddr, |
@@ -475,7 +475,7 @@ static struct dst_entry* dccp_v4_route_skb(struct net *net, struct sock *sk, | |||
475 | return NULL; | 475 | return NULL; |
476 | } | 476 | } |
477 | 477 | ||
478 | return &rt->u.dst; | 478 | return &rt->dst; |
479 | } | 479 | } |
480 | 480 | ||
481 | static int dccp_v4_send_response(struct sock *sk, struct request_sock *req, | 481 | static int dccp_v4_send_response(struct sock *sk, struct request_sock *req, |
diff --git a/net/decnet/dn_route.c b/net/decnet/dn_route.c index 812e6dff6067..6585ea6d1182 100644 --- a/net/decnet/dn_route.c +++ b/net/decnet/dn_route.c | |||
@@ -146,13 +146,13 @@ static __inline__ unsigned dn_hash(__le16 src, __le16 dst) | |||
146 | 146 | ||
147 | static inline void dnrt_free(struct dn_route *rt) | 147 | static inline void dnrt_free(struct dn_route *rt) |
148 | { | 148 | { |
149 | call_rcu_bh(&rt->u.dst.rcu_head, dst_rcu_free); | 149 | call_rcu_bh(&rt->dst.rcu_head, dst_rcu_free); |
150 | } | 150 | } |
151 | 151 | ||
152 | static inline void dnrt_drop(struct dn_route *rt) | 152 | static inline void dnrt_drop(struct dn_route *rt) |
153 | { | 153 | { |
154 | dst_release(&rt->u.dst); | 154 | dst_release(&rt->dst); |
155 | call_rcu_bh(&rt->u.dst.rcu_head, dst_rcu_free); | 155 | call_rcu_bh(&rt->dst.rcu_head, dst_rcu_free); |
156 | } | 156 | } |
157 | 157 | ||
158 | static void dn_dst_check_expire(unsigned long dummy) | 158 | static void dn_dst_check_expire(unsigned long dummy) |
@@ -167,13 +167,13 @@ static void dn_dst_check_expire(unsigned long dummy) | |||
167 | 167 | ||
168 | spin_lock(&dn_rt_hash_table[i].lock); | 168 | spin_lock(&dn_rt_hash_table[i].lock); |
169 | while((rt=*rtp) != NULL) { | 169 | while((rt=*rtp) != NULL) { |
170 | if (atomic_read(&rt->u.dst.__refcnt) || | 170 | if (atomic_read(&rt->dst.__refcnt) || |
171 | (now - rt->u.dst.lastuse) < expire) { | 171 | (now - rt->dst.lastuse) < expire) { |
172 | rtp = &rt->u.dst.dn_next; | 172 | rtp = &rt->dst.dn_next; |
173 | continue; | 173 | continue; |
174 | } | 174 | } |
175 | *rtp = rt->u.dst.dn_next; | 175 | *rtp = rt->dst.dn_next; |
176 | rt->u.dst.dn_next = NULL; | 176 | rt->dst.dn_next = NULL; |
177 | dnrt_free(rt); | 177 | dnrt_free(rt); |
178 | } | 178 | } |
179 | spin_unlock(&dn_rt_hash_table[i].lock); | 179 | spin_unlock(&dn_rt_hash_table[i].lock); |
@@ -198,13 +198,13 @@ static int dn_dst_gc(struct dst_ops *ops) | |||
198 | rtp = &dn_rt_hash_table[i].chain; | 198 | rtp = &dn_rt_hash_table[i].chain; |
199 | 199 | ||
200 | while((rt=*rtp) != NULL) { | 200 | while((rt=*rtp) != NULL) { |
201 | if (atomic_read(&rt->u.dst.__refcnt) || | 201 | if (atomic_read(&rt->dst.__refcnt) || |
202 | (now - rt->u.dst.lastuse) < expire) { | 202 | (now - rt->dst.lastuse) < expire) { |
203 | rtp = &rt->u.dst.dn_next; | 203 | rtp = &rt->dst.dn_next; |
204 | continue; | 204 | continue; |
205 | } | 205 | } |
206 | *rtp = rt->u.dst.dn_next; | 206 | *rtp = rt->dst.dn_next; |
207 | rt->u.dst.dn_next = NULL; | 207 | rt->dst.dn_next = NULL; |
208 | dnrt_drop(rt); | 208 | dnrt_drop(rt); |
209 | break; | 209 | break; |
210 | } | 210 | } |
@@ -287,25 +287,25 @@ static int dn_insert_route(struct dn_route *rt, unsigned hash, struct dn_route * | |||
287 | while((rth = *rthp) != NULL) { | 287 | while((rth = *rthp) != NULL) { |
288 | if (compare_keys(&rth->fl, &rt->fl)) { | 288 | if (compare_keys(&rth->fl, &rt->fl)) { |
289 | /* Put it first */ | 289 | /* Put it first */ |
290 | *rthp = rth->u.dst.dn_next; | 290 | *rthp = rth->dst.dn_next; |
291 | rcu_assign_pointer(rth->u.dst.dn_next, | 291 | rcu_assign_pointer(rth->dst.dn_next, |
292 | dn_rt_hash_table[hash].chain); | 292 | dn_rt_hash_table[hash].chain); |
293 | rcu_assign_pointer(dn_rt_hash_table[hash].chain, rth); | 293 | rcu_assign_pointer(dn_rt_hash_table[hash].chain, rth); |
294 | 294 | ||
295 | dst_use(&rth->u.dst, now); | 295 | dst_use(&rth->dst, now); |
296 | spin_unlock_bh(&dn_rt_hash_table[hash].lock); | 296 | spin_unlock_bh(&dn_rt_hash_table[hash].lock); |
297 | 297 | ||
298 | dnrt_drop(rt); | 298 | dnrt_drop(rt); |
299 | *rp = rth; | 299 | *rp = rth; |
300 | return 0; | 300 | return 0; |
301 | } | 301 | } |
302 | rthp = &rth->u.dst.dn_next; | 302 | rthp = &rth->dst.dn_next; |
303 | } | 303 | } |
304 | 304 | ||
305 | rcu_assign_pointer(rt->u.dst.dn_next, dn_rt_hash_table[hash].chain); | 305 | rcu_assign_pointer(rt->dst.dn_next, dn_rt_hash_table[hash].chain); |
306 | rcu_assign_pointer(dn_rt_hash_table[hash].chain, rt); | 306 | rcu_assign_pointer(dn_rt_hash_table[hash].chain, rt); |
307 | 307 | ||
308 | dst_use(&rt->u.dst, now); | 308 | dst_use(&rt->dst, now); |
309 | spin_unlock_bh(&dn_rt_hash_table[hash].lock); | 309 | spin_unlock_bh(&dn_rt_hash_table[hash].lock); |
310 | *rp = rt; | 310 | *rp = rt; |
311 | return 0; | 311 | return 0; |
@@ -323,8 +323,8 @@ static void dn_run_flush(unsigned long dummy) | |||
323 | goto nothing_to_declare; | 323 | goto nothing_to_declare; |
324 | 324 | ||
325 | for(; rt; rt=next) { | 325 | for(; rt; rt=next) { |
326 | next = rt->u.dst.dn_next; | 326 | next = rt->dst.dn_next; |
327 | rt->u.dst.dn_next = NULL; | 327 | rt->dst.dn_next = NULL; |
328 | dst_free((struct dst_entry *)rt); | 328 | dst_free((struct dst_entry *)rt); |
329 | } | 329 | } |
330 | 330 | ||
@@ -743,7 +743,7 @@ static int dn_forward(struct sk_buff *skb) | |||
743 | /* Ensure that we have enough space for headers */ | 743 | /* Ensure that we have enough space for headers */ |
744 | rt = (struct dn_route *)skb_dst(skb); | 744 | rt = (struct dn_route *)skb_dst(skb); |
745 | header_len = dn_db->use_long ? 21 : 6; | 745 | header_len = dn_db->use_long ? 21 : 6; |
746 | if (skb_cow(skb, LL_RESERVED_SPACE(rt->u.dst.dev)+header_len)) | 746 | if (skb_cow(skb, LL_RESERVED_SPACE(rt->dst.dev)+header_len)) |
747 | goto drop; | 747 | goto drop; |
748 | 748 | ||
749 | /* | 749 | /* |
@@ -752,7 +752,7 @@ static int dn_forward(struct sk_buff *skb) | |||
752 | if (++cb->hops > 30) | 752 | if (++cb->hops > 30) |
753 | goto drop; | 753 | goto drop; |
754 | 754 | ||
755 | skb->dev = rt->u.dst.dev; | 755 | skb->dev = rt->dst.dev; |
756 | 756 | ||
757 | /* | 757 | /* |
758 | * If packet goes out same interface it came in on, then set | 758 | * If packet goes out same interface it came in on, then set |
@@ -792,7 +792,7 @@ static int dn_rt_bug(struct sk_buff *skb) | |||
792 | static int dn_rt_set_next_hop(struct dn_route *rt, struct dn_fib_res *res) | 792 | static int dn_rt_set_next_hop(struct dn_route *rt, struct dn_fib_res *res) |
793 | { | 793 | { |
794 | struct dn_fib_info *fi = res->fi; | 794 | struct dn_fib_info *fi = res->fi; |
795 | struct net_device *dev = rt->u.dst.dev; | 795 | struct net_device *dev = rt->dst.dev; |
796 | struct neighbour *n; | 796 | struct neighbour *n; |
797 | unsigned mss; | 797 | unsigned mss; |
798 | 798 | ||
@@ -800,25 +800,25 @@ static int dn_rt_set_next_hop(struct dn_route *rt, struct dn_fib_res *res) | |||
800 | if (DN_FIB_RES_GW(*res) && | 800 | if (DN_FIB_RES_GW(*res) && |
801 | DN_FIB_RES_NH(*res).nh_scope == RT_SCOPE_LINK) | 801 | DN_FIB_RES_NH(*res).nh_scope == RT_SCOPE_LINK) |
802 | rt->rt_gateway = DN_FIB_RES_GW(*res); | 802 | rt->rt_gateway = DN_FIB_RES_GW(*res); |
803 | memcpy(rt->u.dst.metrics, fi->fib_metrics, | 803 | memcpy(rt->dst.metrics, fi->fib_metrics, |
804 | sizeof(rt->u.dst.metrics)); | 804 | sizeof(rt->dst.metrics)); |
805 | } | 805 | } |
806 | rt->rt_type = res->type; | 806 | rt->rt_type = res->type; |
807 | 807 | ||
808 | if (dev != NULL && rt->u.dst.neighbour == NULL) { | 808 | if (dev != NULL && rt->dst.neighbour == NULL) { |
809 | n = __neigh_lookup_errno(&dn_neigh_table, &rt->rt_gateway, dev); | 809 | n = __neigh_lookup_errno(&dn_neigh_table, &rt->rt_gateway, dev); |
810 | if (IS_ERR(n)) | 810 | if (IS_ERR(n)) |
811 | return PTR_ERR(n); | 811 | return PTR_ERR(n); |
812 | rt->u.dst.neighbour = n; | 812 | rt->dst.neighbour = n; |
813 | } | 813 | } |
814 | 814 | ||
815 | if (dst_metric(&rt->u.dst, RTAX_MTU) == 0 || | 815 | if (dst_metric(&rt->dst, RTAX_MTU) == 0 || |
816 | dst_metric(&rt->u.dst, RTAX_MTU) > rt->u.dst.dev->mtu) | 816 | dst_metric(&rt->dst, RTAX_MTU) > rt->dst.dev->mtu) |
817 | rt->u.dst.metrics[RTAX_MTU-1] = rt->u.dst.dev->mtu; | 817 | rt->dst.metrics[RTAX_MTU-1] = rt->dst.dev->mtu; |
818 | mss = dn_mss_from_pmtu(dev, dst_mtu(&rt->u.dst)); | 818 | mss = dn_mss_from_pmtu(dev, dst_mtu(&rt->dst)); |
819 | if (dst_metric(&rt->u.dst, RTAX_ADVMSS) == 0 || | 819 | if (dst_metric(&rt->dst, RTAX_ADVMSS) == 0 || |
820 | dst_metric(&rt->u.dst, RTAX_ADVMSS) > mss) | 820 | dst_metric(&rt->dst, RTAX_ADVMSS) > mss) |
821 | rt->u.dst.metrics[RTAX_ADVMSS-1] = mss; | 821 | rt->dst.metrics[RTAX_ADVMSS-1] = mss; |
822 | return 0; | 822 | return 0; |
823 | } | 823 | } |
824 | 824 | ||
@@ -1096,8 +1096,8 @@ make_route: | |||
1096 | if (rt == NULL) | 1096 | if (rt == NULL) |
1097 | goto e_nobufs; | 1097 | goto e_nobufs; |
1098 | 1098 | ||
1099 | atomic_set(&rt->u.dst.__refcnt, 1); | 1099 | atomic_set(&rt->dst.__refcnt, 1); |
1100 | rt->u.dst.flags = DST_HOST; | 1100 | rt->dst.flags = DST_HOST; |
1101 | 1101 | ||
1102 | rt->fl.fld_src = oldflp->fld_src; | 1102 | rt->fl.fld_src = oldflp->fld_src; |
1103 | rt->fl.fld_dst = oldflp->fld_dst; | 1103 | rt->fl.fld_dst = oldflp->fld_dst; |
@@ -1113,17 +1113,17 @@ make_route: | |||
1113 | rt->rt_dst_map = fl.fld_dst; | 1113 | rt->rt_dst_map = fl.fld_dst; |
1114 | rt->rt_src_map = fl.fld_src; | 1114 | rt->rt_src_map = fl.fld_src; |
1115 | 1115 | ||
1116 | rt->u.dst.dev = dev_out; | 1116 | rt->dst.dev = dev_out; |
1117 | dev_hold(dev_out); | 1117 | dev_hold(dev_out); |
1118 | rt->u.dst.neighbour = neigh; | 1118 | rt->dst.neighbour = neigh; |
1119 | neigh = NULL; | 1119 | neigh = NULL; |
1120 | 1120 | ||
1121 | rt->u.dst.lastuse = jiffies; | 1121 | rt->dst.lastuse = jiffies; |
1122 | rt->u.dst.output = dn_output; | 1122 | rt->dst.output = dn_output; |
1123 | rt->u.dst.input = dn_rt_bug; | 1123 | rt->dst.input = dn_rt_bug; |
1124 | rt->rt_flags = flags; | 1124 | rt->rt_flags = flags; |
1125 | if (flags & RTCF_LOCAL) | 1125 | if (flags & RTCF_LOCAL) |
1126 | rt->u.dst.input = dn_nsp_rx; | 1126 | rt->dst.input = dn_nsp_rx; |
1127 | 1127 | ||
1128 | err = dn_rt_set_next_hop(rt, &res); | 1128 | err = dn_rt_set_next_hop(rt, &res); |
1129 | if (err) | 1129 | if (err) |
@@ -1152,7 +1152,7 @@ e_nobufs: | |||
1152 | err = -ENOBUFS; | 1152 | err = -ENOBUFS; |
1153 | goto done; | 1153 | goto done; |
1154 | e_neighbour: | 1154 | e_neighbour: |
1155 | dst_free(&rt->u.dst); | 1155 | dst_free(&rt->dst); |
1156 | goto e_nobufs; | 1156 | goto e_nobufs; |
1157 | } | 1157 | } |
1158 | 1158 | ||
@@ -1168,15 +1168,15 @@ static int __dn_route_output_key(struct dst_entry **pprt, const struct flowi *fl | |||
1168 | if (!(flags & MSG_TRYHARD)) { | 1168 | if (!(flags & MSG_TRYHARD)) { |
1169 | rcu_read_lock_bh(); | 1169 | rcu_read_lock_bh(); |
1170 | for (rt = rcu_dereference_bh(dn_rt_hash_table[hash].chain); rt; | 1170 | for (rt = rcu_dereference_bh(dn_rt_hash_table[hash].chain); rt; |
1171 | rt = rcu_dereference_bh(rt->u.dst.dn_next)) { | 1171 | rt = rcu_dereference_bh(rt->dst.dn_next)) { |
1172 | if ((flp->fld_dst == rt->fl.fld_dst) && | 1172 | if ((flp->fld_dst == rt->fl.fld_dst) && |
1173 | (flp->fld_src == rt->fl.fld_src) && | 1173 | (flp->fld_src == rt->fl.fld_src) && |
1174 | (flp->mark == rt->fl.mark) && | 1174 | (flp->mark == rt->fl.mark) && |
1175 | (rt->fl.iif == 0) && | 1175 | (rt->fl.iif == 0) && |
1176 | (rt->fl.oif == flp->oif)) { | 1176 | (rt->fl.oif == flp->oif)) { |
1177 | dst_use(&rt->u.dst, jiffies); | 1177 | dst_use(&rt->dst, jiffies); |
1178 | rcu_read_unlock_bh(); | 1178 | rcu_read_unlock_bh(); |
1179 | *pprt = &rt->u.dst; | 1179 | *pprt = &rt->dst; |
1180 | return 0; | 1180 | return 0; |
1181 | } | 1181 | } |
1182 | } | 1182 | } |
@@ -1375,29 +1375,29 @@ make_route: | |||
1375 | rt->fl.iif = in_dev->ifindex; | 1375 | rt->fl.iif = in_dev->ifindex; |
1376 | rt->fl.mark = fl.mark; | 1376 | rt->fl.mark = fl.mark; |
1377 | 1377 | ||
1378 | rt->u.dst.flags = DST_HOST; | 1378 | rt->dst.flags = DST_HOST; |
1379 | rt->u.dst.neighbour = neigh; | 1379 | rt->dst.neighbour = neigh; |
1380 | rt->u.dst.dev = out_dev; | 1380 | rt->dst.dev = out_dev; |
1381 | rt->u.dst.lastuse = jiffies; | 1381 | rt->dst.lastuse = jiffies; |
1382 | rt->u.dst.output = dn_rt_bug; | 1382 | rt->dst.output = dn_rt_bug; |
1383 | switch(res.type) { | 1383 | switch(res.type) { |
1384 | case RTN_UNICAST: | 1384 | case RTN_UNICAST: |
1385 | rt->u.dst.input = dn_forward; | 1385 | rt->dst.input = dn_forward; |
1386 | break; | 1386 | break; |
1387 | case RTN_LOCAL: | 1387 | case RTN_LOCAL: |
1388 | rt->u.dst.output = dn_output; | 1388 | rt->dst.output = dn_output; |
1389 | rt->u.dst.input = dn_nsp_rx; | 1389 | rt->dst.input = dn_nsp_rx; |
1390 | rt->u.dst.dev = in_dev; | 1390 | rt->dst.dev = in_dev; |
1391 | flags |= RTCF_LOCAL; | 1391 | flags |= RTCF_LOCAL; |
1392 | break; | 1392 | break; |
1393 | default: | 1393 | default: |
1394 | case RTN_UNREACHABLE: | 1394 | case RTN_UNREACHABLE: |
1395 | case RTN_BLACKHOLE: | 1395 | case RTN_BLACKHOLE: |
1396 | rt->u.dst.input = dst_discard; | 1396 | rt->dst.input = dst_discard; |
1397 | } | 1397 | } |
1398 | rt->rt_flags = flags; | 1398 | rt->rt_flags = flags; |
1399 | if (rt->u.dst.dev) | 1399 | if (rt->dst.dev) |
1400 | dev_hold(rt->u.dst.dev); | 1400 | dev_hold(rt->dst.dev); |
1401 | 1401 | ||
1402 | err = dn_rt_set_next_hop(rt, &res); | 1402 | err = dn_rt_set_next_hop(rt, &res); |
1403 | if (err) | 1403 | if (err) |
@@ -1405,7 +1405,7 @@ make_route: | |||
1405 | 1405 | ||
1406 | hash = dn_hash(rt->fl.fld_src, rt->fl.fld_dst); | 1406 | hash = dn_hash(rt->fl.fld_src, rt->fl.fld_dst); |
1407 | dn_insert_route(rt, hash, &rt); | 1407 | dn_insert_route(rt, hash, &rt); |
1408 | skb_dst_set(skb, &rt->u.dst); | 1408 | skb_dst_set(skb, &rt->dst); |
1409 | 1409 | ||
1410 | done: | 1410 | done: |
1411 | if (neigh) | 1411 | if (neigh) |
@@ -1427,7 +1427,7 @@ e_nobufs: | |||
1427 | goto done; | 1427 | goto done; |
1428 | 1428 | ||
1429 | e_neighbour: | 1429 | e_neighbour: |
1430 | dst_free(&rt->u.dst); | 1430 | dst_free(&rt->dst); |
1431 | goto done; | 1431 | goto done; |
1432 | } | 1432 | } |
1433 | 1433 | ||
@@ -1442,13 +1442,13 @@ static int dn_route_input(struct sk_buff *skb) | |||
1442 | 1442 | ||
1443 | rcu_read_lock(); | 1443 | rcu_read_lock(); |
1444 | for(rt = rcu_dereference(dn_rt_hash_table[hash].chain); rt != NULL; | 1444 | for(rt = rcu_dereference(dn_rt_hash_table[hash].chain); rt != NULL; |
1445 | rt = rcu_dereference(rt->u.dst.dn_next)) { | 1445 | rt = rcu_dereference(rt->dst.dn_next)) { |
1446 | if ((rt->fl.fld_src == cb->src) && | 1446 | if ((rt->fl.fld_src == cb->src) && |
1447 | (rt->fl.fld_dst == cb->dst) && | 1447 | (rt->fl.fld_dst == cb->dst) && |
1448 | (rt->fl.oif == 0) && | 1448 | (rt->fl.oif == 0) && |
1449 | (rt->fl.mark == skb->mark) && | 1449 | (rt->fl.mark == skb->mark) && |
1450 | (rt->fl.iif == cb->iif)) { | 1450 | (rt->fl.iif == cb->iif)) { |
1451 | dst_use(&rt->u.dst, jiffies); | 1451 | dst_use(&rt->dst, jiffies); |
1452 | rcu_read_unlock(); | 1452 | rcu_read_unlock(); |
1453 | skb_dst_set(skb, (struct dst_entry *)rt); | 1453 | skb_dst_set(skb, (struct dst_entry *)rt); |
1454 | return 0; | 1454 | return 0; |
@@ -1487,8 +1487,8 @@ static int dn_rt_fill_info(struct sk_buff *skb, u32 pid, u32 seq, | |||
1487 | r->rtm_src_len = 16; | 1487 | r->rtm_src_len = 16; |
1488 | RTA_PUT(skb, RTA_SRC, 2, &rt->fl.fld_src); | 1488 | RTA_PUT(skb, RTA_SRC, 2, &rt->fl.fld_src); |
1489 | } | 1489 | } |
1490 | if (rt->u.dst.dev) | 1490 | if (rt->dst.dev) |
1491 | RTA_PUT(skb, RTA_OIF, sizeof(int), &rt->u.dst.dev->ifindex); | 1491 | RTA_PUT(skb, RTA_OIF, sizeof(int), &rt->dst.dev->ifindex); |
1492 | /* | 1492 | /* |
1493 | * Note to self - change this if input routes reverse direction when | 1493 | * Note to self - change this if input routes reverse direction when |
1494 | * they deal only with inputs and not with replies like they do | 1494 | * they deal only with inputs and not with replies like they do |
@@ -1497,11 +1497,11 @@ static int dn_rt_fill_info(struct sk_buff *skb, u32 pid, u32 seq, | |||
1497 | RTA_PUT(skb, RTA_PREFSRC, 2, &rt->rt_local_src); | 1497 | RTA_PUT(skb, RTA_PREFSRC, 2, &rt->rt_local_src); |
1498 | if (rt->rt_daddr != rt->rt_gateway) | 1498 | if (rt->rt_daddr != rt->rt_gateway) |
1499 | RTA_PUT(skb, RTA_GATEWAY, 2, &rt->rt_gateway); | 1499 | RTA_PUT(skb, RTA_GATEWAY, 2, &rt->rt_gateway); |
1500 | if (rtnetlink_put_metrics(skb, rt->u.dst.metrics) < 0) | 1500 | if (rtnetlink_put_metrics(skb, rt->dst.metrics) < 0) |
1501 | goto rtattr_failure; | 1501 | goto rtattr_failure; |
1502 | expires = rt->u.dst.expires ? rt->u.dst.expires - jiffies : 0; | 1502 | expires = rt->dst.expires ? rt->dst.expires - jiffies : 0; |
1503 | if (rtnl_put_cacheinfo(skb, &rt->u.dst, 0, 0, 0, expires, | 1503 | if (rtnl_put_cacheinfo(skb, &rt->dst, 0, 0, 0, expires, |
1504 | rt->u.dst.error) < 0) | 1504 | rt->dst.error) < 0) |
1505 | goto rtattr_failure; | 1505 | goto rtattr_failure; |
1506 | if (rt->fl.iif) | 1506 | if (rt->fl.iif) |
1507 | RTA_PUT(skb, RTA_IIF, sizeof(int), &rt->fl.iif); | 1507 | RTA_PUT(skb, RTA_IIF, sizeof(int), &rt->fl.iif); |
@@ -1568,8 +1568,8 @@ static int dn_cache_getroute(struct sk_buff *in_skb, struct nlmsghdr *nlh, void | |||
1568 | local_bh_enable(); | 1568 | local_bh_enable(); |
1569 | memset(cb, 0, sizeof(struct dn_skb_cb)); | 1569 | memset(cb, 0, sizeof(struct dn_skb_cb)); |
1570 | rt = (struct dn_route *)skb_dst(skb); | 1570 | rt = (struct dn_route *)skb_dst(skb); |
1571 | if (!err && -rt->u.dst.error) | 1571 | if (!err && -rt->dst.error) |
1572 | err = rt->u.dst.error; | 1572 | err = rt->dst.error; |
1573 | } else { | 1573 | } else { |
1574 | int oif = 0; | 1574 | int oif = 0; |
1575 | if (rta[RTA_OIF - 1]) | 1575 | if (rta[RTA_OIF - 1]) |
@@ -1583,7 +1583,7 @@ static int dn_cache_getroute(struct sk_buff *in_skb, struct nlmsghdr *nlh, void | |||
1583 | skb->dev = NULL; | 1583 | skb->dev = NULL; |
1584 | if (err) | 1584 | if (err) |
1585 | goto out_free; | 1585 | goto out_free; |
1586 | skb_dst_set(skb, &rt->u.dst); | 1586 | skb_dst_set(skb, &rt->dst); |
1587 | if (rtm->rtm_flags & RTM_F_NOTIFY) | 1587 | if (rtm->rtm_flags & RTM_F_NOTIFY) |
1588 | rt->rt_flags |= RTCF_NOTIFY; | 1588 | rt->rt_flags |= RTCF_NOTIFY; |
1589 | 1589 | ||
@@ -1632,10 +1632,10 @@ int dn_cache_dump(struct sk_buff *skb, struct netlink_callback *cb) | |||
1632 | rcu_read_lock_bh(); | 1632 | rcu_read_lock_bh(); |
1633 | for(rt = rcu_dereference_bh(dn_rt_hash_table[h].chain), idx = 0; | 1633 | for(rt = rcu_dereference_bh(dn_rt_hash_table[h].chain), idx = 0; |
1634 | rt; | 1634 | rt; |
1635 | rt = rcu_dereference_bh(rt->u.dst.dn_next), idx++) { | 1635 | rt = rcu_dereference_bh(rt->dst.dn_next), idx++) { |
1636 | if (idx < s_idx) | 1636 | if (idx < s_idx) |
1637 | continue; | 1637 | continue; |
1638 | skb_dst_set(skb, dst_clone(&rt->u.dst)); | 1638 | skb_dst_set(skb, dst_clone(&rt->dst)); |
1639 | if (dn_rt_fill_info(skb, NETLINK_CB(cb->skb).pid, | 1639 | if (dn_rt_fill_info(skb, NETLINK_CB(cb->skb).pid, |
1640 | cb->nlh->nlmsg_seq, RTM_NEWROUTE, | 1640 | cb->nlh->nlmsg_seq, RTM_NEWROUTE, |
1641 | 1, NLM_F_MULTI) <= 0) { | 1641 | 1, NLM_F_MULTI) <= 0) { |
@@ -1678,7 +1678,7 @@ static struct dn_route *dn_rt_cache_get_next(struct seq_file *seq, struct dn_rou | |||
1678 | { | 1678 | { |
1679 | struct dn_rt_cache_iter_state *s = seq->private; | 1679 | struct dn_rt_cache_iter_state *s = seq->private; |
1680 | 1680 | ||
1681 | rt = rt->u.dst.dn_next; | 1681 | rt = rt->dst.dn_next; |
1682 | while(!rt) { | 1682 | while(!rt) { |
1683 | rcu_read_unlock_bh(); | 1683 | rcu_read_unlock_bh(); |
1684 | if (--s->bucket < 0) | 1684 | if (--s->bucket < 0) |
@@ -1719,12 +1719,12 @@ static int dn_rt_cache_seq_show(struct seq_file *seq, void *v) | |||
1719 | char buf1[DN_ASCBUF_LEN], buf2[DN_ASCBUF_LEN]; | 1719 | char buf1[DN_ASCBUF_LEN], buf2[DN_ASCBUF_LEN]; |
1720 | 1720 | ||
1721 | seq_printf(seq, "%-8s %-7s %-7s %04d %04d %04d\n", | 1721 | seq_printf(seq, "%-8s %-7s %-7s %04d %04d %04d\n", |
1722 | rt->u.dst.dev ? rt->u.dst.dev->name : "*", | 1722 | rt->dst.dev ? rt->dst.dev->name : "*", |
1723 | dn_addr2asc(le16_to_cpu(rt->rt_daddr), buf1), | 1723 | dn_addr2asc(le16_to_cpu(rt->rt_daddr), buf1), |
1724 | dn_addr2asc(le16_to_cpu(rt->rt_saddr), buf2), | 1724 | dn_addr2asc(le16_to_cpu(rt->rt_saddr), buf2), |
1725 | atomic_read(&rt->u.dst.__refcnt), | 1725 | atomic_read(&rt->dst.__refcnt), |
1726 | rt->u.dst.__use, | 1726 | rt->dst.__use, |
1727 | (int) dst_metric(&rt->u.dst, RTAX_RTT)); | 1727 | (int) dst_metric(&rt->dst, RTAX_RTT)); |
1728 | return 0; | 1728 | return 0; |
1729 | } | 1729 | } |
1730 | 1730 | ||
diff --git a/net/ethernet/eth.c b/net/ethernet/eth.c index 61ec0329316c..215c83986a9d 100644 --- a/net/ethernet/eth.c +++ b/net/ethernet/eth.c | |||
@@ -158,7 +158,6 @@ EXPORT_SYMBOL(eth_rebuild_header); | |||
158 | __be16 eth_type_trans(struct sk_buff *skb, struct net_device *dev) | 158 | __be16 eth_type_trans(struct sk_buff *skb, struct net_device *dev) |
159 | { | 159 | { |
160 | struct ethhdr *eth; | 160 | struct ethhdr *eth; |
161 | unsigned char *rawp; | ||
162 | 161 | ||
163 | skb->dev = dev; | 162 | skb->dev = dev; |
164 | skb_reset_mac_header(skb); | 163 | skb_reset_mac_header(skb); |
@@ -199,15 +198,13 @@ __be16 eth_type_trans(struct sk_buff *skb, struct net_device *dev) | |||
199 | if (ntohs(eth->h_proto) >= 1536) | 198 | if (ntohs(eth->h_proto) >= 1536) |
200 | return eth->h_proto; | 199 | return eth->h_proto; |
201 | 200 | ||
202 | rawp = skb->data; | ||
203 | |||
204 | /* | 201 | /* |
205 | * This is a magic hack to spot IPX packets. Older Novell breaks | 202 | * This is a magic hack to spot IPX packets. Older Novell breaks |
206 | * the protocol design and runs IPX over 802.3 without an 802.2 LLC | 203 | * the protocol design and runs IPX over 802.3 without an 802.2 LLC |
207 | * layer. We look for FFFF which isn't a used 802.2 SSAP/DSAP. This | 204 | * layer. We look for FFFF which isn't a used 802.2 SSAP/DSAP. This |
208 | * won't work for fault tolerant netware but does for the rest. | 205 | * won't work for fault tolerant netware but does for the rest. |
209 | */ | 206 | */ |
210 | if (*(unsigned short *)rawp == 0xFFFF) | 207 | if (skb->len >= 2 && *(unsigned short *)(skb->data) == 0xFFFF) |
211 | return htons(ETH_P_802_3); | 208 | return htons(ETH_P_802_3); |
212 | 209 | ||
213 | /* | 210 | /* |
diff --git a/net/ipv4/af_inet.c b/net/ipv4/af_inet.c index 551ce564b035..d99e7e020189 100644 --- a/net/ipv4/af_inet.c +++ b/net/ipv4/af_inet.c | |||
@@ -1100,7 +1100,7 @@ static int inet_sk_reselect_saddr(struct sock *sk) | |||
1100 | if (err) | 1100 | if (err) |
1101 | return err; | 1101 | return err; |
1102 | 1102 | ||
1103 | sk_setup_caps(sk, &rt->u.dst); | 1103 | sk_setup_caps(sk, &rt->dst); |
1104 | 1104 | ||
1105 | new_saddr = rt->rt_src; | 1105 | new_saddr = rt->rt_src; |
1106 | 1106 | ||
@@ -1166,7 +1166,7 @@ int inet_sk_rebuild_header(struct sock *sk) | |||
1166 | err = ip_route_output_flow(sock_net(sk), &rt, &fl, sk, 0); | 1166 | err = ip_route_output_flow(sock_net(sk), &rt, &fl, sk, 0); |
1167 | } | 1167 | } |
1168 | if (!err) | 1168 | if (!err) |
1169 | sk_setup_caps(sk, &rt->u.dst); | 1169 | sk_setup_caps(sk, &rt->dst); |
1170 | else { | 1170 | else { |
1171 | /* Routing failed... */ | 1171 | /* Routing failed... */ |
1172 | sk->sk_route_caps = 0; | 1172 | sk->sk_route_caps = 0; |
diff --git a/net/ipv4/arp.c b/net/ipv4/arp.c index 917d2d66162e..cf78f41830ca 100644 --- a/net/ipv4/arp.c +++ b/net/ipv4/arp.c | |||
@@ -427,7 +427,7 @@ static int arp_filter(__be32 sip, __be32 tip, struct net_device *dev) | |||
427 | 427 | ||
428 | if (ip_route_output_key(net, &rt, &fl) < 0) | 428 | if (ip_route_output_key(net, &rt, &fl) < 0) |
429 | return 1; | 429 | return 1; |
430 | if (rt->u.dst.dev != dev) { | 430 | if (rt->dst.dev != dev) { |
431 | NET_INC_STATS_BH(net, LINUX_MIB_ARPFILTER); | 431 | NET_INC_STATS_BH(net, LINUX_MIB_ARPFILTER); |
432 | flag = 1; | 432 | flag = 1; |
433 | } | 433 | } |
@@ -532,7 +532,7 @@ static inline int arp_fwd_proxy(struct in_device *in_dev, | |||
532 | struct in_device *out_dev; | 532 | struct in_device *out_dev; |
533 | int imi, omi = -1; | 533 | int imi, omi = -1; |
534 | 534 | ||
535 | if (rt->u.dst.dev == dev) | 535 | if (rt->dst.dev == dev) |
536 | return 0; | 536 | return 0; |
537 | 537 | ||
538 | if (!IN_DEV_PROXY_ARP(in_dev)) | 538 | if (!IN_DEV_PROXY_ARP(in_dev)) |
@@ -545,7 +545,7 @@ static inline int arp_fwd_proxy(struct in_device *in_dev, | |||
545 | 545 | ||
546 | /* place to check for proxy_arp for routes */ | 546 | /* place to check for proxy_arp for routes */ |
547 | 547 | ||
548 | out_dev = __in_dev_get_rcu(rt->u.dst.dev); | 548 | out_dev = __in_dev_get_rcu(rt->dst.dev); |
549 | if (out_dev) | 549 | if (out_dev) |
550 | omi = IN_DEV_MEDIUM_ID(out_dev); | 550 | omi = IN_DEV_MEDIUM_ID(out_dev); |
551 | 551 | ||
@@ -576,7 +576,7 @@ static inline int arp_fwd_pvlan(struct in_device *in_dev, | |||
576 | __be32 sip, __be32 tip) | 576 | __be32 sip, __be32 tip) |
577 | { | 577 | { |
578 | /* Private VLAN is only concerned about the same ethernet segment */ | 578 | /* Private VLAN is only concerned about the same ethernet segment */ |
579 | if (rt->u.dst.dev != dev) | 579 | if (rt->dst.dev != dev) |
580 | return 0; | 580 | return 0; |
581 | 581 | ||
582 | /* Don't reply on self probes (often done by windowz boxes)*/ | 582 | /* Don't reply on self probes (often done by windowz boxes)*/ |
@@ -1042,7 +1042,7 @@ static int arp_req_set(struct net *net, struct arpreq *r, | |||
1042 | struct rtable * rt; | 1042 | struct rtable * rt; |
1043 | if ((err = ip_route_output_key(net, &rt, &fl)) != 0) | 1043 | if ((err = ip_route_output_key(net, &rt, &fl)) != 0) |
1044 | return err; | 1044 | return err; |
1045 | dev = rt->u.dst.dev; | 1045 | dev = rt->dst.dev; |
1046 | ip_rt_put(rt); | 1046 | ip_rt_put(rt); |
1047 | if (!dev) | 1047 | if (!dev) |
1048 | return -EINVAL; | 1048 | return -EINVAL; |
@@ -1149,7 +1149,7 @@ static int arp_req_delete(struct net *net, struct arpreq *r, | |||
1149 | struct rtable * rt; | 1149 | struct rtable * rt; |
1150 | if ((err = ip_route_output_key(net, &rt, &fl)) != 0) | 1150 | if ((err = ip_route_output_key(net, &rt, &fl)) != 0) |
1151 | return err; | 1151 | return err; |
1152 | dev = rt->u.dst.dev; | 1152 | dev = rt->dst.dev; |
1153 | ip_rt_put(rt); | 1153 | ip_rt_put(rt); |
1154 | if (!dev) | 1154 | if (!dev) |
1155 | return -EINVAL; | 1155 | return -EINVAL; |
diff --git a/net/ipv4/datagram.c b/net/ipv4/datagram.c index fb2465811b48..fe3daa7f07a9 100644 --- a/net/ipv4/datagram.c +++ b/net/ipv4/datagram.c | |||
@@ -69,7 +69,7 @@ int ip4_datagram_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len) | |||
69 | sk->sk_state = TCP_ESTABLISHED; | 69 | sk->sk_state = TCP_ESTABLISHED; |
70 | inet->inet_id = jiffies; | 70 | inet->inet_id = jiffies; |
71 | 71 | ||
72 | sk_dst_set(sk, &rt->u.dst); | 72 | sk_dst_set(sk, &rt->dst); |
73 | return(0); | 73 | return(0); |
74 | } | 74 | } |
75 | 75 | ||
diff --git a/net/ipv4/icmp.c b/net/ipv4/icmp.c index bdb6c71e72a6..7569b21a3a2d 100644 --- a/net/ipv4/icmp.c +++ b/net/ipv4/icmp.c | |||
@@ -271,7 +271,7 @@ int xrlim_allow(struct dst_entry *dst, int timeout) | |||
271 | static inline int icmpv4_xrlim_allow(struct net *net, struct rtable *rt, | 271 | static inline int icmpv4_xrlim_allow(struct net *net, struct rtable *rt, |
272 | int type, int code) | 272 | int type, int code) |
273 | { | 273 | { |
274 | struct dst_entry *dst = &rt->u.dst; | 274 | struct dst_entry *dst = &rt->dst; |
275 | int rc = 1; | 275 | int rc = 1; |
276 | 276 | ||
277 | if (type > NR_ICMP_TYPES) | 277 | if (type > NR_ICMP_TYPES) |
@@ -327,7 +327,7 @@ static void icmp_push_reply(struct icmp_bxm *icmp_param, | |||
327 | struct sock *sk; | 327 | struct sock *sk; |
328 | struct sk_buff *skb; | 328 | struct sk_buff *skb; |
329 | 329 | ||
330 | sk = icmp_sk(dev_net((*rt)->u.dst.dev)); | 330 | sk = icmp_sk(dev_net((*rt)->dst.dev)); |
331 | if (ip_append_data(sk, icmp_glue_bits, icmp_param, | 331 | if (ip_append_data(sk, icmp_glue_bits, icmp_param, |
332 | icmp_param->data_len+icmp_param->head_len, | 332 | icmp_param->data_len+icmp_param->head_len, |
333 | icmp_param->head_len, | 333 | icmp_param->head_len, |
@@ -359,7 +359,7 @@ static void icmp_reply(struct icmp_bxm *icmp_param, struct sk_buff *skb) | |||
359 | { | 359 | { |
360 | struct ipcm_cookie ipc; | 360 | struct ipcm_cookie ipc; |
361 | struct rtable *rt = skb_rtable(skb); | 361 | struct rtable *rt = skb_rtable(skb); |
362 | struct net *net = dev_net(rt->u.dst.dev); | 362 | struct net *net = dev_net(rt->dst.dev); |
363 | struct sock *sk; | 363 | struct sock *sk; |
364 | struct inet_sock *inet; | 364 | struct inet_sock *inet; |
365 | __be32 daddr; | 365 | __be32 daddr; |
@@ -427,7 +427,7 @@ void icmp_send(struct sk_buff *skb_in, int type, int code, __be32 info) | |||
427 | 427 | ||
428 | if (!rt) | 428 | if (!rt) |
429 | goto out; | 429 | goto out; |
430 | net = dev_net(rt->u.dst.dev); | 430 | net = dev_net(rt->dst.dev); |
431 | 431 | ||
432 | /* | 432 | /* |
433 | * Find the original header. It is expected to be valid, of course. | 433 | * Find the original header. It is expected to be valid, of course. |
@@ -596,9 +596,9 @@ void icmp_send(struct sk_buff *skb_in, int type, int code, __be32 info) | |||
596 | /* Ugh! */ | 596 | /* Ugh! */ |
597 | orefdst = skb_in->_skb_refdst; /* save old refdst */ | 597 | orefdst = skb_in->_skb_refdst; /* save old refdst */ |
598 | err = ip_route_input(skb_in, fl.fl4_dst, fl.fl4_src, | 598 | err = ip_route_input(skb_in, fl.fl4_dst, fl.fl4_src, |
599 | RT_TOS(tos), rt2->u.dst.dev); | 599 | RT_TOS(tos), rt2->dst.dev); |
600 | 600 | ||
601 | dst_release(&rt2->u.dst); | 601 | dst_release(&rt2->dst); |
602 | rt2 = skb_rtable(skb_in); | 602 | rt2 = skb_rtable(skb_in); |
603 | skb_in->_skb_refdst = orefdst; /* restore old refdst */ | 603 | skb_in->_skb_refdst = orefdst; /* restore old refdst */ |
604 | } | 604 | } |
@@ -610,7 +610,7 @@ void icmp_send(struct sk_buff *skb_in, int type, int code, __be32 info) | |||
610 | XFRM_LOOKUP_ICMP); | 610 | XFRM_LOOKUP_ICMP); |
611 | switch (err) { | 611 | switch (err) { |
612 | case 0: | 612 | case 0: |
613 | dst_release(&rt->u.dst); | 613 | dst_release(&rt->dst); |
614 | rt = rt2; | 614 | rt = rt2; |
615 | break; | 615 | break; |
616 | case -EPERM: | 616 | case -EPERM: |
@@ -629,7 +629,7 @@ route_done: | |||
629 | 629 | ||
630 | /* RFC says return as much as we can without exceeding 576 bytes. */ | 630 | /* RFC says return as much as we can without exceeding 576 bytes. */ |
631 | 631 | ||
632 | room = dst_mtu(&rt->u.dst); | 632 | room = dst_mtu(&rt->dst); |
633 | if (room > 576) | 633 | if (room > 576) |
634 | room = 576; | 634 | room = 576; |
635 | room -= sizeof(struct iphdr) + icmp_param.replyopts.optlen; | 635 | room -= sizeof(struct iphdr) + icmp_param.replyopts.optlen; |
@@ -972,7 +972,7 @@ int icmp_rcv(struct sk_buff *skb) | |||
972 | { | 972 | { |
973 | struct icmphdr *icmph; | 973 | struct icmphdr *icmph; |
974 | struct rtable *rt = skb_rtable(skb); | 974 | struct rtable *rt = skb_rtable(skb); |
975 | struct net *net = dev_net(rt->u.dst.dev); | 975 | struct net *net = dev_net(rt->dst.dev); |
976 | 976 | ||
977 | if (!xfrm4_policy_check(NULL, XFRM_POLICY_IN, skb)) { | 977 | if (!xfrm4_policy_check(NULL, XFRM_POLICY_IN, skb)) { |
978 | struct sec_path *sp = skb_sec_path(skb); | 978 | struct sec_path *sp = skb_sec_path(skb); |
diff --git a/net/ipv4/igmp.c b/net/ipv4/igmp.c index 3294f547c481..b5580d422994 100644 --- a/net/ipv4/igmp.c +++ b/net/ipv4/igmp.c | |||
@@ -312,7 +312,7 @@ static struct sk_buff *igmpv3_newpack(struct net_device *dev, int size) | |||
312 | return NULL; | 312 | return NULL; |
313 | } | 313 | } |
314 | 314 | ||
315 | skb_dst_set(skb, &rt->u.dst); | 315 | skb_dst_set(skb, &rt->dst); |
316 | skb->dev = dev; | 316 | skb->dev = dev; |
317 | 317 | ||
318 | skb_reserve(skb, LL_RESERVED_SPACE(dev)); | 318 | skb_reserve(skb, LL_RESERVED_SPACE(dev)); |
@@ -330,7 +330,7 @@ static struct sk_buff *igmpv3_newpack(struct net_device *dev, int size) | |||
330 | pip->saddr = rt->rt_src; | 330 | pip->saddr = rt->rt_src; |
331 | pip->protocol = IPPROTO_IGMP; | 331 | pip->protocol = IPPROTO_IGMP; |
332 | pip->tot_len = 0; /* filled in later */ | 332 | pip->tot_len = 0; /* filled in later */ |
333 | ip_select_ident(pip, &rt->u.dst, NULL); | 333 | ip_select_ident(pip, &rt->dst, NULL); |
334 | ((u8*)&pip[1])[0] = IPOPT_RA; | 334 | ((u8*)&pip[1])[0] = IPOPT_RA; |
335 | ((u8*)&pip[1])[1] = 4; | 335 | ((u8*)&pip[1])[1] = 4; |
336 | ((u8*)&pip[1])[2] = 0; | 336 | ((u8*)&pip[1])[2] = 0; |
@@ -660,7 +660,7 @@ static int igmp_send_report(struct in_device *in_dev, struct ip_mc_list *pmc, | |||
660 | return -1; | 660 | return -1; |
661 | } | 661 | } |
662 | 662 | ||
663 | skb_dst_set(skb, &rt->u.dst); | 663 | skb_dst_set(skb, &rt->dst); |
664 | 664 | ||
665 | skb_reserve(skb, LL_RESERVED_SPACE(dev)); | 665 | skb_reserve(skb, LL_RESERVED_SPACE(dev)); |
666 | 666 | ||
@@ -676,7 +676,7 @@ static int igmp_send_report(struct in_device *in_dev, struct ip_mc_list *pmc, | |||
676 | iph->daddr = dst; | 676 | iph->daddr = dst; |
677 | iph->saddr = rt->rt_src; | 677 | iph->saddr = rt->rt_src; |
678 | iph->protocol = IPPROTO_IGMP; | 678 | iph->protocol = IPPROTO_IGMP; |
679 | ip_select_ident(iph, &rt->u.dst, NULL); | 679 | ip_select_ident(iph, &rt->dst, NULL); |
680 | ((u8*)&iph[1])[0] = IPOPT_RA; | 680 | ((u8*)&iph[1])[0] = IPOPT_RA; |
681 | ((u8*)&iph[1])[1] = 4; | 681 | ((u8*)&iph[1])[1] = 4; |
682 | ((u8*)&iph[1])[2] = 0; | 682 | ((u8*)&iph[1])[2] = 0; |
@@ -1425,7 +1425,7 @@ static struct in_device *ip_mc_find_dev(struct net *net, struct ip_mreqn *imr) | |||
1425 | } | 1425 | } |
1426 | 1426 | ||
1427 | if (!dev && !ip_route_output_key(net, &rt, &fl)) { | 1427 | if (!dev && !ip_route_output_key(net, &rt, &fl)) { |
1428 | dev = rt->u.dst.dev; | 1428 | dev = rt->dst.dev; |
1429 | ip_rt_put(rt); | 1429 | ip_rt_put(rt); |
1430 | } | 1430 | } |
1431 | if (dev) { | 1431 | if (dev) { |
diff --git a/net/ipv4/inet_connection_sock.c b/net/ipv4/inet_connection_sock.c index 70eb3507c406..57c9e4d7b805 100644 --- a/net/ipv4/inet_connection_sock.c +++ b/net/ipv4/inet_connection_sock.c | |||
@@ -383,7 +383,7 @@ struct dst_entry *inet_csk_route_req(struct sock *sk, | |||
383 | goto no_route; | 383 | goto no_route; |
384 | if (opt && opt->is_strictroute && rt->rt_dst != rt->rt_gateway) | 384 | if (opt && opt->is_strictroute && rt->rt_dst != rt->rt_gateway) |
385 | goto route_err; | 385 | goto route_err; |
386 | return &rt->u.dst; | 386 | return &rt->dst; |
387 | 387 | ||
388 | route_err: | 388 | route_err: |
389 | ip_rt_put(rt); | 389 | ip_rt_put(rt); |
diff --git a/net/ipv4/ip_forward.c b/net/ipv4/ip_forward.c index 56cdf68a074c..99461f09320f 100644 --- a/net/ipv4/ip_forward.c +++ b/net/ipv4/ip_forward.c | |||
@@ -87,16 +87,16 @@ int ip_forward(struct sk_buff *skb) | |||
87 | if (opt->is_strictroute && rt->rt_dst != rt->rt_gateway) | 87 | if (opt->is_strictroute && rt->rt_dst != rt->rt_gateway) |
88 | goto sr_failed; | 88 | goto sr_failed; |
89 | 89 | ||
90 | if (unlikely(skb->len > dst_mtu(&rt->u.dst) && !skb_is_gso(skb) && | 90 | if (unlikely(skb->len > dst_mtu(&rt->dst) && !skb_is_gso(skb) && |
91 | (ip_hdr(skb)->frag_off & htons(IP_DF))) && !skb->local_df) { | 91 | (ip_hdr(skb)->frag_off & htons(IP_DF))) && !skb->local_df) { |
92 | IP_INC_STATS(dev_net(rt->u.dst.dev), IPSTATS_MIB_FRAGFAILS); | 92 | IP_INC_STATS(dev_net(rt->dst.dev), IPSTATS_MIB_FRAGFAILS); |
93 | icmp_send(skb, ICMP_DEST_UNREACH, ICMP_FRAG_NEEDED, | 93 | icmp_send(skb, ICMP_DEST_UNREACH, ICMP_FRAG_NEEDED, |
94 | htonl(dst_mtu(&rt->u.dst))); | 94 | htonl(dst_mtu(&rt->dst))); |
95 | goto drop; | 95 | goto drop; |
96 | } | 96 | } |
97 | 97 | ||
98 | /* We are about to mangle packet. Copy it! */ | 98 | /* We are about to mangle packet. Copy it! */ |
99 | if (skb_cow(skb, LL_RESERVED_SPACE(rt->u.dst.dev)+rt->u.dst.header_len)) | 99 | if (skb_cow(skb, LL_RESERVED_SPACE(rt->dst.dev)+rt->dst.header_len)) |
100 | goto drop; | 100 | goto drop; |
101 | iph = ip_hdr(skb); | 101 | iph = ip_hdr(skb); |
102 | 102 | ||
@@ -113,7 +113,7 @@ int ip_forward(struct sk_buff *skb) | |||
113 | skb->priority = rt_tos2priority(iph->tos); | 113 | skb->priority = rt_tos2priority(iph->tos); |
114 | 114 | ||
115 | return NF_HOOK(NFPROTO_IPV4, NF_INET_FORWARD, skb, skb->dev, | 115 | return NF_HOOK(NFPROTO_IPV4, NF_INET_FORWARD, skb, skb->dev, |
116 | rt->u.dst.dev, ip_forward_finish); | 116 | rt->dst.dev, ip_forward_finish); |
117 | 117 | ||
118 | sr_failed: | 118 | sr_failed: |
119 | /* | 119 | /* |
diff --git a/net/ipv4/ip_gre.c b/net/ipv4/ip_gre.c index 32618e11076d..749e54889e82 100644 --- a/net/ipv4/ip_gre.c +++ b/net/ipv4/ip_gre.c | |||
@@ -745,7 +745,7 @@ static netdev_tx_t ipgre_tunnel_xmit(struct sk_buff *skb, struct net_device *dev | |||
745 | goto tx_error; | 745 | goto tx_error; |
746 | } | 746 | } |
747 | } | 747 | } |
748 | tdev = rt->u.dst.dev; | 748 | tdev = rt->dst.dev; |
749 | 749 | ||
750 | if (tdev == dev) { | 750 | if (tdev == dev) { |
751 | ip_rt_put(rt); | 751 | ip_rt_put(rt); |
@@ -755,7 +755,7 @@ static netdev_tx_t ipgre_tunnel_xmit(struct sk_buff *skb, struct net_device *dev | |||
755 | 755 | ||
756 | df = tiph->frag_off; | 756 | df = tiph->frag_off; |
757 | if (df) | 757 | if (df) |
758 | mtu = dst_mtu(&rt->u.dst) - dev->hard_header_len - tunnel->hlen; | 758 | mtu = dst_mtu(&rt->dst) - dev->hard_header_len - tunnel->hlen; |
759 | else | 759 | else |
760 | mtu = skb_dst(skb) ? dst_mtu(skb_dst(skb)) : dev->mtu; | 760 | mtu = skb_dst(skb) ? dst_mtu(skb_dst(skb)) : dev->mtu; |
761 | 761 | ||
@@ -803,7 +803,7 @@ static netdev_tx_t ipgre_tunnel_xmit(struct sk_buff *skb, struct net_device *dev | |||
803 | tunnel->err_count = 0; | 803 | tunnel->err_count = 0; |
804 | } | 804 | } |
805 | 805 | ||
806 | max_headroom = LL_RESERVED_SPACE(tdev) + gre_hlen + rt->u.dst.header_len; | 806 | max_headroom = LL_RESERVED_SPACE(tdev) + gre_hlen + rt->dst.header_len; |
807 | 807 | ||
808 | if (skb_headroom(skb) < max_headroom || skb_shared(skb)|| | 808 | if (skb_headroom(skb) < max_headroom || skb_shared(skb)|| |
809 | (skb_cloned(skb) && !skb_clone_writable(skb, 0))) { | 809 | (skb_cloned(skb) && !skb_clone_writable(skb, 0))) { |
@@ -830,7 +830,7 @@ static netdev_tx_t ipgre_tunnel_xmit(struct sk_buff *skb, struct net_device *dev | |||
830 | IPCB(skb)->flags &= ~(IPSKB_XFRM_TUNNEL_SIZE | IPSKB_XFRM_TRANSFORMED | | 830 | IPCB(skb)->flags &= ~(IPSKB_XFRM_TUNNEL_SIZE | IPSKB_XFRM_TRANSFORMED | |
831 | IPSKB_REROUTED); | 831 | IPSKB_REROUTED); |
832 | skb_dst_drop(skb); | 832 | skb_dst_drop(skb); |
833 | skb_dst_set(skb, &rt->u.dst); | 833 | skb_dst_set(skb, &rt->dst); |
834 | 834 | ||
835 | /* | 835 | /* |
836 | * Push down and install the IPIP header. | 836 | * Push down and install the IPIP header. |
@@ -853,7 +853,7 @@ static netdev_tx_t ipgre_tunnel_xmit(struct sk_buff *skb, struct net_device *dev | |||
853 | iph->ttl = ((struct ipv6hdr *)old_iph)->hop_limit; | 853 | iph->ttl = ((struct ipv6hdr *)old_iph)->hop_limit; |
854 | #endif | 854 | #endif |
855 | else | 855 | else |
856 | iph->ttl = dst_metric(&rt->u.dst, RTAX_HOPLIMIT); | 856 | iph->ttl = dst_metric(&rt->dst, RTAX_HOPLIMIT); |
857 | } | 857 | } |
858 | 858 | ||
859 | ((__be16 *)(iph + 1))[0] = tunnel->parms.o_flags; | 859 | ((__be16 *)(iph + 1))[0] = tunnel->parms.o_flags; |
@@ -915,7 +915,7 @@ static int ipgre_tunnel_bind_dev(struct net_device *dev) | |||
915 | .proto = IPPROTO_GRE }; | 915 | .proto = IPPROTO_GRE }; |
916 | struct rtable *rt; | 916 | struct rtable *rt; |
917 | if (!ip_route_output_key(dev_net(dev), &rt, &fl)) { | 917 | if (!ip_route_output_key(dev_net(dev), &rt, &fl)) { |
918 | tdev = rt->u.dst.dev; | 918 | tdev = rt->dst.dev; |
919 | ip_rt_put(rt); | 919 | ip_rt_put(rt); |
920 | } | 920 | } |
921 | 921 | ||
@@ -1174,7 +1174,7 @@ static int ipgre_open(struct net_device *dev) | |||
1174 | struct rtable *rt; | 1174 | struct rtable *rt; |
1175 | if (ip_route_output_key(dev_net(dev), &rt, &fl)) | 1175 | if (ip_route_output_key(dev_net(dev), &rt, &fl)) |
1176 | return -EADDRNOTAVAIL; | 1176 | return -EADDRNOTAVAIL; |
1177 | dev = rt->u.dst.dev; | 1177 | dev = rt->dst.dev; |
1178 | ip_rt_put(rt); | 1178 | ip_rt_put(rt); |
1179 | if (__in_dev_get_rtnl(dev) == NULL) | 1179 | if (__in_dev_get_rtnl(dev) == NULL) |
1180 | return -EADDRNOTAVAIL; | 1180 | return -EADDRNOTAVAIL; |
diff --git a/net/ipv4/ip_input.c b/net/ipv4/ip_input.c index 08a3b121f908..db47a5a00ed2 100644 --- a/net/ipv4/ip_input.c +++ b/net/ipv4/ip_input.c | |||
@@ -356,10 +356,10 @@ static int ip_rcv_finish(struct sk_buff *skb) | |||
356 | 356 | ||
357 | rt = skb_rtable(skb); | 357 | rt = skb_rtable(skb); |
358 | if (rt->rt_type == RTN_MULTICAST) { | 358 | if (rt->rt_type == RTN_MULTICAST) { |
359 | IP_UPD_PO_STATS_BH(dev_net(rt->u.dst.dev), IPSTATS_MIB_INMCAST, | 359 | IP_UPD_PO_STATS_BH(dev_net(rt->dst.dev), IPSTATS_MIB_INMCAST, |
360 | skb->len); | 360 | skb->len); |
361 | } else if (rt->rt_type == RTN_BROADCAST) | 361 | } else if (rt->rt_type == RTN_BROADCAST) |
362 | IP_UPD_PO_STATS_BH(dev_net(rt->u.dst.dev), IPSTATS_MIB_INBCAST, | 362 | IP_UPD_PO_STATS_BH(dev_net(rt->dst.dev), IPSTATS_MIB_INBCAST, |
363 | skb->len); | 363 | skb->len); |
364 | 364 | ||
365 | return dst_input(skb); | 365 | return dst_input(skb); |
diff --git a/net/ipv4/ip_output.c b/net/ipv4/ip_output.c index 9a4a6c96cb0d..6cbeb2e108de 100644 --- a/net/ipv4/ip_output.c +++ b/net/ipv4/ip_output.c | |||
@@ -151,15 +151,15 @@ int ip_build_and_send_pkt(struct sk_buff *skb, struct sock *sk, | |||
151 | iph->version = 4; | 151 | iph->version = 4; |
152 | iph->ihl = 5; | 152 | iph->ihl = 5; |
153 | iph->tos = inet->tos; | 153 | iph->tos = inet->tos; |
154 | if (ip_dont_fragment(sk, &rt->u.dst)) | 154 | if (ip_dont_fragment(sk, &rt->dst)) |
155 | iph->frag_off = htons(IP_DF); | 155 | iph->frag_off = htons(IP_DF); |
156 | else | 156 | else |
157 | iph->frag_off = 0; | 157 | iph->frag_off = 0; |
158 | iph->ttl = ip_select_ttl(inet, &rt->u.dst); | 158 | iph->ttl = ip_select_ttl(inet, &rt->dst); |
159 | iph->daddr = rt->rt_dst; | 159 | iph->daddr = rt->rt_dst; |
160 | iph->saddr = rt->rt_src; | 160 | iph->saddr = rt->rt_src; |
161 | iph->protocol = sk->sk_protocol; | 161 | iph->protocol = sk->sk_protocol; |
162 | ip_select_ident(iph, &rt->u.dst, sk); | 162 | ip_select_ident(iph, &rt->dst, sk); |
163 | 163 | ||
164 | if (opt && opt->optlen) { | 164 | if (opt && opt->optlen) { |
165 | iph->ihl += opt->optlen>>2; | 165 | iph->ihl += opt->optlen>>2; |
@@ -240,7 +240,7 @@ int ip_mc_output(struct sk_buff *skb) | |||
240 | { | 240 | { |
241 | struct sock *sk = skb->sk; | 241 | struct sock *sk = skb->sk; |
242 | struct rtable *rt = skb_rtable(skb); | 242 | struct rtable *rt = skb_rtable(skb); |
243 | struct net_device *dev = rt->u.dst.dev; | 243 | struct net_device *dev = rt->dst.dev; |
244 | 244 | ||
245 | /* | 245 | /* |
246 | * If the indicated interface is up and running, send the packet. | 246 | * If the indicated interface is up and running, send the packet. |
@@ -359,9 +359,9 @@ int ip_queue_xmit(struct sk_buff *skb) | |||
359 | if (ip_route_output_flow(sock_net(sk), &rt, &fl, sk, 0)) | 359 | if (ip_route_output_flow(sock_net(sk), &rt, &fl, sk, 0)) |
360 | goto no_route; | 360 | goto no_route; |
361 | } | 361 | } |
362 | sk_setup_caps(sk, &rt->u.dst); | 362 | sk_setup_caps(sk, &rt->dst); |
363 | } | 363 | } |
364 | skb_dst_set_noref(skb, &rt->u.dst); | 364 | skb_dst_set_noref(skb, &rt->dst); |
365 | 365 | ||
366 | packet_routed: | 366 | packet_routed: |
367 | if (opt && opt->is_strictroute && rt->rt_dst != rt->rt_gateway) | 367 | if (opt && opt->is_strictroute && rt->rt_dst != rt->rt_gateway) |
@@ -372,11 +372,11 @@ packet_routed: | |||
372 | skb_reset_network_header(skb); | 372 | skb_reset_network_header(skb); |
373 | iph = ip_hdr(skb); | 373 | iph = ip_hdr(skb); |
374 | *((__be16 *)iph) = htons((4 << 12) | (5 << 8) | (inet->tos & 0xff)); | 374 | *((__be16 *)iph) = htons((4 << 12) | (5 << 8) | (inet->tos & 0xff)); |
375 | if (ip_dont_fragment(sk, &rt->u.dst) && !skb->local_df) | 375 | if (ip_dont_fragment(sk, &rt->dst) && !skb->local_df) |
376 | iph->frag_off = htons(IP_DF); | 376 | iph->frag_off = htons(IP_DF); |
377 | else | 377 | else |
378 | iph->frag_off = 0; | 378 | iph->frag_off = 0; |
379 | iph->ttl = ip_select_ttl(inet, &rt->u.dst); | 379 | iph->ttl = ip_select_ttl(inet, &rt->dst); |
380 | iph->protocol = sk->sk_protocol; | 380 | iph->protocol = sk->sk_protocol; |
381 | iph->saddr = rt->rt_src; | 381 | iph->saddr = rt->rt_src; |
382 | iph->daddr = rt->rt_dst; | 382 | iph->daddr = rt->rt_dst; |
@@ -387,7 +387,7 @@ packet_routed: | |||
387 | ip_options_build(skb, opt, inet->inet_daddr, rt, 0); | 387 | ip_options_build(skb, opt, inet->inet_daddr, rt, 0); |
388 | } | 388 | } |
389 | 389 | ||
390 | ip_select_ident_more(iph, &rt->u.dst, sk, | 390 | ip_select_ident_more(iph, &rt->dst, sk, |
391 | (skb_shinfo(skb)->gso_segs ?: 1) - 1); | 391 | (skb_shinfo(skb)->gso_segs ?: 1) - 1); |
392 | 392 | ||
393 | skb->priority = sk->sk_priority; | 393 | skb->priority = sk->sk_priority; |
@@ -452,7 +452,7 @@ int ip_fragment(struct sk_buff *skb, int (*output)(struct sk_buff *)) | |||
452 | struct rtable *rt = skb_rtable(skb); | 452 | struct rtable *rt = skb_rtable(skb); |
453 | int err = 0; | 453 | int err = 0; |
454 | 454 | ||
455 | dev = rt->u.dst.dev; | 455 | dev = rt->dst.dev; |
456 | 456 | ||
457 | /* | 457 | /* |
458 | * Point into the IP datagram header. | 458 | * Point into the IP datagram header. |
@@ -473,7 +473,7 @@ int ip_fragment(struct sk_buff *skb, int (*output)(struct sk_buff *)) | |||
473 | */ | 473 | */ |
474 | 474 | ||
475 | hlen = iph->ihl * 4; | 475 | hlen = iph->ihl * 4; |
476 | mtu = dst_mtu(&rt->u.dst) - hlen; /* Size of data space */ | 476 | mtu = dst_mtu(&rt->dst) - hlen; /* Size of data space */ |
477 | #ifdef CONFIG_BRIDGE_NETFILTER | 477 | #ifdef CONFIG_BRIDGE_NETFILTER |
478 | if (skb->nf_bridge) | 478 | if (skb->nf_bridge) |
479 | mtu -= nf_bridge_mtu_reduction(skb); | 479 | mtu -= nf_bridge_mtu_reduction(skb); |
@@ -586,7 +586,7 @@ slow_path: | |||
586 | * we need to make room for the encapsulating header | 586 | * we need to make room for the encapsulating header |
587 | */ | 587 | */ |
588 | pad = nf_bridge_pad(skb); | 588 | pad = nf_bridge_pad(skb); |
589 | ll_rs = LL_RESERVED_SPACE_EXTRA(rt->u.dst.dev, pad); | 589 | ll_rs = LL_RESERVED_SPACE_EXTRA(rt->dst.dev, pad); |
590 | mtu -= pad; | 590 | mtu -= pad; |
591 | 591 | ||
592 | /* | 592 | /* |
@@ -833,13 +833,13 @@ int ip_append_data(struct sock *sk, | |||
833 | */ | 833 | */ |
834 | *rtp = NULL; | 834 | *rtp = NULL; |
835 | inet->cork.fragsize = mtu = inet->pmtudisc == IP_PMTUDISC_PROBE ? | 835 | inet->cork.fragsize = mtu = inet->pmtudisc == IP_PMTUDISC_PROBE ? |
836 | rt->u.dst.dev->mtu : | 836 | rt->dst.dev->mtu : |
837 | dst_mtu(rt->u.dst.path); | 837 | dst_mtu(rt->dst.path); |
838 | inet->cork.dst = &rt->u.dst; | 838 | inet->cork.dst = &rt->dst; |
839 | inet->cork.length = 0; | 839 | inet->cork.length = 0; |
840 | sk->sk_sndmsg_page = NULL; | 840 | sk->sk_sndmsg_page = NULL; |
841 | sk->sk_sndmsg_off = 0; | 841 | sk->sk_sndmsg_off = 0; |
842 | if ((exthdrlen = rt->u.dst.header_len) != 0) { | 842 | if ((exthdrlen = rt->dst.header_len) != 0) { |
843 | length += exthdrlen; | 843 | length += exthdrlen; |
844 | transhdrlen += exthdrlen; | 844 | transhdrlen += exthdrlen; |
845 | } | 845 | } |
@@ -852,7 +852,7 @@ int ip_append_data(struct sock *sk, | |||
852 | exthdrlen = 0; | 852 | exthdrlen = 0; |
853 | mtu = inet->cork.fragsize; | 853 | mtu = inet->cork.fragsize; |
854 | } | 854 | } |
855 | hh_len = LL_RESERVED_SPACE(rt->u.dst.dev); | 855 | hh_len = LL_RESERVED_SPACE(rt->dst.dev); |
856 | 856 | ||
857 | fragheaderlen = sizeof(struct iphdr) + (opt ? opt->optlen : 0); | 857 | fragheaderlen = sizeof(struct iphdr) + (opt ? opt->optlen : 0); |
858 | maxfraglen = ((mtu - fragheaderlen) & ~7) + fragheaderlen; | 858 | maxfraglen = ((mtu - fragheaderlen) & ~7) + fragheaderlen; |
@@ -869,14 +869,14 @@ int ip_append_data(struct sock *sk, | |||
869 | */ | 869 | */ |
870 | if (transhdrlen && | 870 | if (transhdrlen && |
871 | length + fragheaderlen <= mtu && | 871 | length + fragheaderlen <= mtu && |
872 | rt->u.dst.dev->features & NETIF_F_V4_CSUM && | 872 | rt->dst.dev->features & NETIF_F_V4_CSUM && |
873 | !exthdrlen) | 873 | !exthdrlen) |
874 | csummode = CHECKSUM_PARTIAL; | 874 | csummode = CHECKSUM_PARTIAL; |
875 | 875 | ||
876 | inet->cork.length += length; | 876 | inet->cork.length += length; |
877 | if (((length> mtu) || !skb_queue_empty(&sk->sk_write_queue)) && | 877 | if (((length> mtu) || !skb_queue_empty(&sk->sk_write_queue)) && |
878 | (sk->sk_protocol == IPPROTO_UDP) && | 878 | (sk->sk_protocol == IPPROTO_UDP) && |
879 | (rt->u.dst.dev->features & NETIF_F_UFO)) { | 879 | (rt->dst.dev->features & NETIF_F_UFO)) { |
880 | err = ip_ufo_append_data(sk, getfrag, from, length, hh_len, | 880 | err = ip_ufo_append_data(sk, getfrag, from, length, hh_len, |
881 | fragheaderlen, transhdrlen, mtu, | 881 | fragheaderlen, transhdrlen, mtu, |
882 | flags); | 882 | flags); |
@@ -924,7 +924,7 @@ alloc_new_skb: | |||
924 | fraglen = datalen + fragheaderlen; | 924 | fraglen = datalen + fragheaderlen; |
925 | 925 | ||
926 | if ((flags & MSG_MORE) && | 926 | if ((flags & MSG_MORE) && |
927 | !(rt->u.dst.dev->features&NETIF_F_SG)) | 927 | !(rt->dst.dev->features&NETIF_F_SG)) |
928 | alloclen = mtu; | 928 | alloclen = mtu; |
929 | else | 929 | else |
930 | alloclen = datalen + fragheaderlen; | 930 | alloclen = datalen + fragheaderlen; |
@@ -935,7 +935,7 @@ alloc_new_skb: | |||
935 | * the last. | 935 | * the last. |
936 | */ | 936 | */ |
937 | if (datalen == length + fraggap) | 937 | if (datalen == length + fraggap) |
938 | alloclen += rt->u.dst.trailer_len; | 938 | alloclen += rt->dst.trailer_len; |
939 | 939 | ||
940 | if (transhdrlen) { | 940 | if (transhdrlen) { |
941 | skb = sock_alloc_send_skb(sk, | 941 | skb = sock_alloc_send_skb(sk, |
@@ -1008,7 +1008,7 @@ alloc_new_skb: | |||
1008 | if (copy > length) | 1008 | if (copy > length) |
1009 | copy = length; | 1009 | copy = length; |
1010 | 1010 | ||
1011 | if (!(rt->u.dst.dev->features&NETIF_F_SG)) { | 1011 | if (!(rt->dst.dev->features&NETIF_F_SG)) { |
1012 | unsigned int off; | 1012 | unsigned int off; |
1013 | 1013 | ||
1014 | off = skb->len; | 1014 | off = skb->len; |
@@ -1103,10 +1103,10 @@ ssize_t ip_append_page(struct sock *sk, struct page *page, | |||
1103 | if (inet->cork.flags & IPCORK_OPT) | 1103 | if (inet->cork.flags & IPCORK_OPT) |
1104 | opt = inet->cork.opt; | 1104 | opt = inet->cork.opt; |
1105 | 1105 | ||
1106 | if (!(rt->u.dst.dev->features&NETIF_F_SG)) | 1106 | if (!(rt->dst.dev->features&NETIF_F_SG)) |
1107 | return -EOPNOTSUPP; | 1107 | return -EOPNOTSUPP; |
1108 | 1108 | ||
1109 | hh_len = LL_RESERVED_SPACE(rt->u.dst.dev); | 1109 | hh_len = LL_RESERVED_SPACE(rt->dst.dev); |
1110 | mtu = inet->cork.fragsize; | 1110 | mtu = inet->cork.fragsize; |
1111 | 1111 | ||
1112 | fragheaderlen = sizeof(struct iphdr) + (opt ? opt->optlen : 0); | 1112 | fragheaderlen = sizeof(struct iphdr) + (opt ? opt->optlen : 0); |
@@ -1122,7 +1122,7 @@ ssize_t ip_append_page(struct sock *sk, struct page *page, | |||
1122 | 1122 | ||
1123 | inet->cork.length += size; | 1123 | inet->cork.length += size; |
1124 | if ((sk->sk_protocol == IPPROTO_UDP) && | 1124 | if ((sk->sk_protocol == IPPROTO_UDP) && |
1125 | (rt->u.dst.dev->features & NETIF_F_UFO)) { | 1125 | (rt->dst.dev->features & NETIF_F_UFO)) { |
1126 | skb_shinfo(skb)->gso_size = mtu - fragheaderlen; | 1126 | skb_shinfo(skb)->gso_size = mtu - fragheaderlen; |
1127 | skb_shinfo(skb)->gso_type = SKB_GSO_UDP; | 1127 | skb_shinfo(skb)->gso_type = SKB_GSO_UDP; |
1128 | } | 1128 | } |
@@ -1274,8 +1274,8 @@ int ip_push_pending_frames(struct sock *sk) | |||
1274 | * If local_df is set too, we still allow to fragment this frame | 1274 | * If local_df is set too, we still allow to fragment this frame |
1275 | * locally. */ | 1275 | * locally. */ |
1276 | if (inet->pmtudisc >= IP_PMTUDISC_DO || | 1276 | if (inet->pmtudisc >= IP_PMTUDISC_DO || |
1277 | (skb->len <= dst_mtu(&rt->u.dst) && | 1277 | (skb->len <= dst_mtu(&rt->dst) && |
1278 | ip_dont_fragment(sk, &rt->u.dst))) | 1278 | ip_dont_fragment(sk, &rt->dst))) |
1279 | df = htons(IP_DF); | 1279 | df = htons(IP_DF); |
1280 | 1280 | ||
1281 | if (inet->cork.flags & IPCORK_OPT) | 1281 | if (inet->cork.flags & IPCORK_OPT) |
@@ -1284,7 +1284,7 @@ int ip_push_pending_frames(struct sock *sk) | |||
1284 | if (rt->rt_type == RTN_MULTICAST) | 1284 | if (rt->rt_type == RTN_MULTICAST) |
1285 | ttl = inet->mc_ttl; | 1285 | ttl = inet->mc_ttl; |
1286 | else | 1286 | else |
1287 | ttl = ip_select_ttl(inet, &rt->u.dst); | 1287 | ttl = ip_select_ttl(inet, &rt->dst); |
1288 | 1288 | ||
1289 | iph = (struct iphdr *)skb->data; | 1289 | iph = (struct iphdr *)skb->data; |
1290 | iph->version = 4; | 1290 | iph->version = 4; |
@@ -1295,7 +1295,7 @@ int ip_push_pending_frames(struct sock *sk) | |||
1295 | } | 1295 | } |
1296 | iph->tos = inet->tos; | 1296 | iph->tos = inet->tos; |
1297 | iph->frag_off = df; | 1297 | iph->frag_off = df; |
1298 | ip_select_ident(iph, &rt->u.dst, sk); | 1298 | ip_select_ident(iph, &rt->dst, sk); |
1299 | iph->ttl = ttl; | 1299 | iph->ttl = ttl; |
1300 | iph->protocol = sk->sk_protocol; | 1300 | iph->protocol = sk->sk_protocol; |
1301 | iph->saddr = rt->rt_src; | 1301 | iph->saddr = rt->rt_src; |
@@ -1308,7 +1308,7 @@ int ip_push_pending_frames(struct sock *sk) | |||
1308 | * on dst refcount | 1308 | * on dst refcount |
1309 | */ | 1309 | */ |
1310 | inet->cork.dst = NULL; | 1310 | inet->cork.dst = NULL; |
1311 | skb_dst_set(skb, &rt->u.dst); | 1311 | skb_dst_set(skb, &rt->dst); |
1312 | 1312 | ||
1313 | if (iph->protocol == IPPROTO_ICMP) | 1313 | if (iph->protocol == IPPROTO_ICMP) |
1314 | icmp_out_count(net, ((struct icmphdr *) | 1314 | icmp_out_count(net, ((struct icmphdr *) |
diff --git a/net/ipv4/ipip.c b/net/ipv4/ipip.c index 7fd636711037..ec036731a70b 100644 --- a/net/ipv4/ipip.c +++ b/net/ipv4/ipip.c | |||
@@ -435,7 +435,7 @@ static netdev_tx_t ipip_tunnel_xmit(struct sk_buff *skb, struct net_device *dev) | |||
435 | goto tx_error_icmp; | 435 | goto tx_error_icmp; |
436 | } | 436 | } |
437 | } | 437 | } |
438 | tdev = rt->u.dst.dev; | 438 | tdev = rt->dst.dev; |
439 | 439 | ||
440 | if (tdev == dev) { | 440 | if (tdev == dev) { |
441 | ip_rt_put(rt); | 441 | ip_rt_put(rt); |
@@ -446,7 +446,7 @@ static netdev_tx_t ipip_tunnel_xmit(struct sk_buff *skb, struct net_device *dev) | |||
446 | df |= old_iph->frag_off & htons(IP_DF); | 446 | df |= old_iph->frag_off & htons(IP_DF); |
447 | 447 | ||
448 | if (df) { | 448 | if (df) { |
449 | mtu = dst_mtu(&rt->u.dst) - sizeof(struct iphdr); | 449 | mtu = dst_mtu(&rt->dst) - sizeof(struct iphdr); |
450 | 450 | ||
451 | if (mtu < 68) { | 451 | if (mtu < 68) { |
452 | stats->collisions++; | 452 | stats->collisions++; |
@@ -503,7 +503,7 @@ static netdev_tx_t ipip_tunnel_xmit(struct sk_buff *skb, struct net_device *dev) | |||
503 | IPCB(skb)->flags &= ~(IPSKB_XFRM_TUNNEL_SIZE | IPSKB_XFRM_TRANSFORMED | | 503 | IPCB(skb)->flags &= ~(IPSKB_XFRM_TUNNEL_SIZE | IPSKB_XFRM_TRANSFORMED | |
504 | IPSKB_REROUTED); | 504 | IPSKB_REROUTED); |
505 | skb_dst_drop(skb); | 505 | skb_dst_drop(skb); |
506 | skb_dst_set(skb, &rt->u.dst); | 506 | skb_dst_set(skb, &rt->dst); |
507 | 507 | ||
508 | /* | 508 | /* |
509 | * Push down and install the IPIP header. | 509 | * Push down and install the IPIP header. |
@@ -552,7 +552,7 @@ static void ipip_tunnel_bind_dev(struct net_device *dev) | |||
552 | .proto = IPPROTO_IPIP }; | 552 | .proto = IPPROTO_IPIP }; |
553 | struct rtable *rt; | 553 | struct rtable *rt; |
554 | if (!ip_route_output_key(dev_net(dev), &rt, &fl)) { | 554 | if (!ip_route_output_key(dev_net(dev), &rt, &fl)) { |
555 | tdev = rt->u.dst.dev; | 555 | tdev = rt->dst.dev; |
556 | ip_rt_put(rt); | 556 | ip_rt_put(rt); |
557 | } | 557 | } |
558 | dev->flags |= IFF_POINTOPOINT; | 558 | dev->flags |= IFF_POINTOPOINT; |
diff --git a/net/ipv4/ipmr.c b/net/ipv4/ipmr.c index 856123fe32f9..8418afc357ee 100644 --- a/net/ipv4/ipmr.c +++ b/net/ipv4/ipmr.c | |||
@@ -1551,9 +1551,9 @@ static void ipmr_queue_xmit(struct net *net, struct mr_table *mrt, | |||
1551 | goto out_free; | 1551 | goto out_free; |
1552 | } | 1552 | } |
1553 | 1553 | ||
1554 | dev = rt->u.dst.dev; | 1554 | dev = rt->dst.dev; |
1555 | 1555 | ||
1556 | if (skb->len+encap > dst_mtu(&rt->u.dst) && (ntohs(iph->frag_off) & IP_DF)) { | 1556 | if (skb->len+encap > dst_mtu(&rt->dst) && (ntohs(iph->frag_off) & IP_DF)) { |
1557 | /* Do not fragment multicasts. Alas, IPv4 does not | 1557 | /* Do not fragment multicasts. Alas, IPv4 does not |
1558 | allow to send ICMP, so that packets will disappear | 1558 | allow to send ICMP, so that packets will disappear |
1559 | to blackhole. | 1559 | to blackhole. |
@@ -1564,7 +1564,7 @@ static void ipmr_queue_xmit(struct net *net, struct mr_table *mrt, | |||
1564 | goto out_free; | 1564 | goto out_free; |
1565 | } | 1565 | } |
1566 | 1566 | ||
1567 | encap += LL_RESERVED_SPACE(dev) + rt->u.dst.header_len; | 1567 | encap += LL_RESERVED_SPACE(dev) + rt->dst.header_len; |
1568 | 1568 | ||
1569 | if (skb_cow(skb, encap)) { | 1569 | if (skb_cow(skb, encap)) { |
1570 | ip_rt_put(rt); | 1570 | ip_rt_put(rt); |
@@ -1575,7 +1575,7 @@ static void ipmr_queue_xmit(struct net *net, struct mr_table *mrt, | |||
1575 | vif->bytes_out += skb->len; | 1575 | vif->bytes_out += skb->len; |
1576 | 1576 | ||
1577 | skb_dst_drop(skb); | 1577 | skb_dst_drop(skb); |
1578 | skb_dst_set(skb, &rt->u.dst); | 1578 | skb_dst_set(skb, &rt->dst); |
1579 | ip_decrease_ttl(ip_hdr(skb)); | 1579 | ip_decrease_ttl(ip_hdr(skb)); |
1580 | 1580 | ||
1581 | /* FIXME: forward and output firewalls used to be called here. | 1581 | /* FIXME: forward and output firewalls used to be called here. |
diff --git a/net/ipv4/netfilter.c b/net/ipv4/netfilter.c index 07de855e2175..cfbc79af21c3 100644 --- a/net/ipv4/netfilter.c +++ b/net/ipv4/netfilter.c | |||
@@ -43,7 +43,7 @@ int ip_route_me_harder(struct sk_buff *skb, unsigned addr_type) | |||
43 | 43 | ||
44 | /* Drop old route. */ | 44 | /* Drop old route. */ |
45 | skb_dst_drop(skb); | 45 | skb_dst_drop(skb); |
46 | skb_dst_set(skb, &rt->u.dst); | 46 | skb_dst_set(skb, &rt->dst); |
47 | } else { | 47 | } else { |
48 | /* non-local src, find valid iif to satisfy | 48 | /* non-local src, find valid iif to satisfy |
49 | * rp-filter when calling ip_route_input. */ | 49 | * rp-filter when calling ip_route_input. */ |
@@ -53,11 +53,11 @@ int ip_route_me_harder(struct sk_buff *skb, unsigned addr_type) | |||
53 | 53 | ||
54 | orefdst = skb->_skb_refdst; | 54 | orefdst = skb->_skb_refdst; |
55 | if (ip_route_input(skb, iph->daddr, iph->saddr, | 55 | if (ip_route_input(skb, iph->daddr, iph->saddr, |
56 | RT_TOS(iph->tos), rt->u.dst.dev) != 0) { | 56 | RT_TOS(iph->tos), rt->dst.dev) != 0) { |
57 | dst_release(&rt->u.dst); | 57 | dst_release(&rt->dst); |
58 | return -1; | 58 | return -1; |
59 | } | 59 | } |
60 | dst_release(&rt->u.dst); | 60 | dst_release(&rt->dst); |
61 | refdst_drop(orefdst); | 61 | refdst_drop(orefdst); |
62 | } | 62 | } |
63 | 63 | ||
diff --git a/net/ipv4/raw.c b/net/ipv4/raw.c index 66cc3befcd44..009a7b2aa1ef 100644 --- a/net/ipv4/raw.c +++ b/net/ipv4/raw.c | |||
@@ -325,24 +325,24 @@ static int raw_send_hdrinc(struct sock *sk, void *from, size_t length, | |||
325 | int err; | 325 | int err; |
326 | struct rtable *rt = *rtp; | 326 | struct rtable *rt = *rtp; |
327 | 327 | ||
328 | if (length > rt->u.dst.dev->mtu) { | 328 | if (length > rt->dst.dev->mtu) { |
329 | ip_local_error(sk, EMSGSIZE, rt->rt_dst, inet->inet_dport, | 329 | ip_local_error(sk, EMSGSIZE, rt->rt_dst, inet->inet_dport, |
330 | rt->u.dst.dev->mtu); | 330 | rt->dst.dev->mtu); |
331 | return -EMSGSIZE; | 331 | return -EMSGSIZE; |
332 | } | 332 | } |
333 | if (flags&MSG_PROBE) | 333 | if (flags&MSG_PROBE) |
334 | goto out; | 334 | goto out; |
335 | 335 | ||
336 | skb = sock_alloc_send_skb(sk, | 336 | skb = sock_alloc_send_skb(sk, |
337 | length + LL_ALLOCATED_SPACE(rt->u.dst.dev) + 15, | 337 | length + LL_ALLOCATED_SPACE(rt->dst.dev) + 15, |
338 | flags & MSG_DONTWAIT, &err); | 338 | flags & MSG_DONTWAIT, &err); |
339 | if (skb == NULL) | 339 | if (skb == NULL) |
340 | goto error; | 340 | goto error; |
341 | skb_reserve(skb, LL_RESERVED_SPACE(rt->u.dst.dev)); | 341 | skb_reserve(skb, LL_RESERVED_SPACE(rt->dst.dev)); |
342 | 342 | ||
343 | skb->priority = sk->sk_priority; | 343 | skb->priority = sk->sk_priority; |
344 | skb->mark = sk->sk_mark; | 344 | skb->mark = sk->sk_mark; |
345 | skb_dst_set(skb, &rt->u.dst); | 345 | skb_dst_set(skb, &rt->dst); |
346 | *rtp = NULL; | 346 | *rtp = NULL; |
347 | 347 | ||
348 | skb_reset_network_header(skb); | 348 | skb_reset_network_header(skb); |
@@ -375,7 +375,7 @@ static int raw_send_hdrinc(struct sock *sk, void *from, size_t length, | |||
375 | iph->check = 0; | 375 | iph->check = 0; |
376 | iph->tot_len = htons(length); | 376 | iph->tot_len = htons(length); |
377 | if (!iph->id) | 377 | if (!iph->id) |
378 | ip_select_ident(iph, &rt->u.dst, NULL); | 378 | ip_select_ident(iph, &rt->dst, NULL); |
379 | 379 | ||
380 | iph->check = ip_fast_csum((unsigned char *)iph, iph->ihl); | 380 | iph->check = ip_fast_csum((unsigned char *)iph, iph->ihl); |
381 | } | 381 | } |
@@ -384,7 +384,7 @@ static int raw_send_hdrinc(struct sock *sk, void *from, size_t length, | |||
384 | skb_transport_header(skb))->type); | 384 | skb_transport_header(skb))->type); |
385 | 385 | ||
386 | err = NF_HOOK(NFPROTO_IPV4, NF_INET_LOCAL_OUT, skb, NULL, | 386 | err = NF_HOOK(NFPROTO_IPV4, NF_INET_LOCAL_OUT, skb, NULL, |
387 | rt->u.dst.dev, dst_output); | 387 | rt->dst.dev, dst_output); |
388 | if (err > 0) | 388 | if (err > 0) |
389 | err = net_xmit_errno(err); | 389 | err = net_xmit_errno(err); |
390 | if (err) | 390 | if (err) |
@@ -606,7 +606,7 @@ out: | |||
606 | return len; | 606 | return len; |
607 | 607 | ||
608 | do_confirm: | 608 | do_confirm: |
609 | dst_confirm(&rt->u.dst); | 609 | dst_confirm(&rt->dst); |
610 | if (!(msg->msg_flags & MSG_PROBE) || len) | 610 | if (!(msg->msg_flags & MSG_PROBE) || len) |
611 | goto back_from_confirm; | 611 | goto back_from_confirm; |
612 | err = 0; | 612 | err = 0; |
diff --git a/net/ipv4/route.c b/net/ipv4/route.c index 883b5c7195ac..a291edbbc97f 100644 --- a/net/ipv4/route.c +++ b/net/ipv4/route.c | |||
@@ -286,10 +286,10 @@ static struct rtable *rt_cache_get_first(struct seq_file *seq) | |||
286 | rcu_read_lock_bh(); | 286 | rcu_read_lock_bh(); |
287 | r = rcu_dereference_bh(rt_hash_table[st->bucket].chain); | 287 | r = rcu_dereference_bh(rt_hash_table[st->bucket].chain); |
288 | while (r) { | 288 | while (r) { |
289 | if (dev_net(r->u.dst.dev) == seq_file_net(seq) && | 289 | if (dev_net(r->dst.dev) == seq_file_net(seq) && |
290 | r->rt_genid == st->genid) | 290 | r->rt_genid == st->genid) |
291 | return r; | 291 | return r; |
292 | r = rcu_dereference_bh(r->u.dst.rt_next); | 292 | r = rcu_dereference_bh(r->dst.rt_next); |
293 | } | 293 | } |
294 | rcu_read_unlock_bh(); | 294 | rcu_read_unlock_bh(); |
295 | } | 295 | } |
@@ -301,7 +301,7 @@ static struct rtable *__rt_cache_get_next(struct seq_file *seq, | |||
301 | { | 301 | { |
302 | struct rt_cache_iter_state *st = seq->private; | 302 | struct rt_cache_iter_state *st = seq->private; |
303 | 303 | ||
304 | r = r->u.dst.rt_next; | 304 | r = r->dst.rt_next; |
305 | while (!r) { | 305 | while (!r) { |
306 | rcu_read_unlock_bh(); | 306 | rcu_read_unlock_bh(); |
307 | do { | 307 | do { |
@@ -319,7 +319,7 @@ static struct rtable *rt_cache_get_next(struct seq_file *seq, | |||
319 | { | 319 | { |
320 | struct rt_cache_iter_state *st = seq->private; | 320 | struct rt_cache_iter_state *st = seq->private; |
321 | while ((r = __rt_cache_get_next(seq, r)) != NULL) { | 321 | while ((r = __rt_cache_get_next(seq, r)) != NULL) { |
322 | if (dev_net(r->u.dst.dev) != seq_file_net(seq)) | 322 | if (dev_net(r->dst.dev) != seq_file_net(seq)) |
323 | continue; | 323 | continue; |
324 | if (r->rt_genid == st->genid) | 324 | if (r->rt_genid == st->genid) |
325 | break; | 325 | break; |
@@ -377,19 +377,19 @@ static int rt_cache_seq_show(struct seq_file *seq, void *v) | |||
377 | 377 | ||
378 | seq_printf(seq, "%s\t%08X\t%08X\t%8X\t%d\t%u\t%d\t" | 378 | seq_printf(seq, "%s\t%08X\t%08X\t%8X\t%d\t%u\t%d\t" |
379 | "%08X\t%d\t%u\t%u\t%02X\t%d\t%1d\t%08X%n", | 379 | "%08X\t%d\t%u\t%u\t%02X\t%d\t%1d\t%08X%n", |
380 | r->u.dst.dev ? r->u.dst.dev->name : "*", | 380 | r->dst.dev ? r->dst.dev->name : "*", |
381 | (__force u32)r->rt_dst, | 381 | (__force u32)r->rt_dst, |
382 | (__force u32)r->rt_gateway, | 382 | (__force u32)r->rt_gateway, |
383 | r->rt_flags, atomic_read(&r->u.dst.__refcnt), | 383 | r->rt_flags, atomic_read(&r->dst.__refcnt), |
384 | r->u.dst.__use, 0, (__force u32)r->rt_src, | 384 | r->dst.__use, 0, (__force u32)r->rt_src, |
385 | (dst_metric(&r->u.dst, RTAX_ADVMSS) ? | 385 | (dst_metric(&r->dst, RTAX_ADVMSS) ? |
386 | (int)dst_metric(&r->u.dst, RTAX_ADVMSS) + 40 : 0), | 386 | (int)dst_metric(&r->dst, RTAX_ADVMSS) + 40 : 0), |
387 | dst_metric(&r->u.dst, RTAX_WINDOW), | 387 | dst_metric(&r->dst, RTAX_WINDOW), |
388 | (int)((dst_metric(&r->u.dst, RTAX_RTT) >> 3) + | 388 | (int)((dst_metric(&r->dst, RTAX_RTT) >> 3) + |
389 | dst_metric(&r->u.dst, RTAX_RTTVAR)), | 389 | dst_metric(&r->dst, RTAX_RTTVAR)), |
390 | r->fl.fl4_tos, | 390 | r->fl.fl4_tos, |
391 | r->u.dst.hh ? atomic_read(&r->u.dst.hh->hh_refcnt) : -1, | 391 | r->dst.hh ? atomic_read(&r->dst.hh->hh_refcnt) : -1, |
392 | r->u.dst.hh ? (r->u.dst.hh->hh_output == | 392 | r->dst.hh ? (r->dst.hh->hh_output == |
393 | dev_queue_xmit) : 0, | 393 | dev_queue_xmit) : 0, |
394 | r->rt_spec_dst, &len); | 394 | r->rt_spec_dst, &len); |
395 | 395 | ||
@@ -608,13 +608,13 @@ static inline int ip_rt_proc_init(void) | |||
608 | 608 | ||
609 | static inline void rt_free(struct rtable *rt) | 609 | static inline void rt_free(struct rtable *rt) |
610 | { | 610 | { |
611 | call_rcu_bh(&rt->u.dst.rcu_head, dst_rcu_free); | 611 | call_rcu_bh(&rt->dst.rcu_head, dst_rcu_free); |
612 | } | 612 | } |
613 | 613 | ||
614 | static inline void rt_drop(struct rtable *rt) | 614 | static inline void rt_drop(struct rtable *rt) |
615 | { | 615 | { |
616 | ip_rt_put(rt); | 616 | ip_rt_put(rt); |
617 | call_rcu_bh(&rt->u.dst.rcu_head, dst_rcu_free); | 617 | call_rcu_bh(&rt->dst.rcu_head, dst_rcu_free); |
618 | } | 618 | } |
619 | 619 | ||
620 | static inline int rt_fast_clean(struct rtable *rth) | 620 | static inline int rt_fast_clean(struct rtable *rth) |
@@ -622,13 +622,13 @@ static inline int rt_fast_clean(struct rtable *rth) | |||
622 | /* Kill broadcast/multicast entries very aggresively, if they | 622 | /* Kill broadcast/multicast entries very aggresively, if they |
623 | collide in hash table with more useful entries */ | 623 | collide in hash table with more useful entries */ |
624 | return (rth->rt_flags & (RTCF_BROADCAST | RTCF_MULTICAST)) && | 624 | return (rth->rt_flags & (RTCF_BROADCAST | RTCF_MULTICAST)) && |
625 | rth->fl.iif && rth->u.dst.rt_next; | 625 | rth->fl.iif && rth->dst.rt_next; |
626 | } | 626 | } |
627 | 627 | ||
628 | static inline int rt_valuable(struct rtable *rth) | 628 | static inline int rt_valuable(struct rtable *rth) |
629 | { | 629 | { |
630 | return (rth->rt_flags & (RTCF_REDIRECTED | RTCF_NOTIFY)) || | 630 | return (rth->rt_flags & (RTCF_REDIRECTED | RTCF_NOTIFY)) || |
631 | rth->u.dst.expires; | 631 | rth->dst.expires; |
632 | } | 632 | } |
633 | 633 | ||
634 | static int rt_may_expire(struct rtable *rth, unsigned long tmo1, unsigned long tmo2) | 634 | static int rt_may_expire(struct rtable *rth, unsigned long tmo1, unsigned long tmo2) |
@@ -636,15 +636,15 @@ static int rt_may_expire(struct rtable *rth, unsigned long tmo1, unsigned long t | |||
636 | unsigned long age; | 636 | unsigned long age; |
637 | int ret = 0; | 637 | int ret = 0; |
638 | 638 | ||
639 | if (atomic_read(&rth->u.dst.__refcnt)) | 639 | if (atomic_read(&rth->dst.__refcnt)) |
640 | goto out; | 640 | goto out; |
641 | 641 | ||
642 | ret = 1; | 642 | ret = 1; |
643 | if (rth->u.dst.expires && | 643 | if (rth->dst.expires && |
644 | time_after_eq(jiffies, rth->u.dst.expires)) | 644 | time_after_eq(jiffies, rth->dst.expires)) |
645 | goto out; | 645 | goto out; |
646 | 646 | ||
647 | age = jiffies - rth->u.dst.lastuse; | 647 | age = jiffies - rth->dst.lastuse; |
648 | ret = 0; | 648 | ret = 0; |
649 | if ((age <= tmo1 && !rt_fast_clean(rth)) || | 649 | if ((age <= tmo1 && !rt_fast_clean(rth)) || |
650 | (age <= tmo2 && rt_valuable(rth))) | 650 | (age <= tmo2 && rt_valuable(rth))) |
@@ -660,7 +660,7 @@ out: return ret; | |||
660 | */ | 660 | */ |
661 | static inline u32 rt_score(struct rtable *rt) | 661 | static inline u32 rt_score(struct rtable *rt) |
662 | { | 662 | { |
663 | u32 score = jiffies - rt->u.dst.lastuse; | 663 | u32 score = jiffies - rt->dst.lastuse; |
664 | 664 | ||
665 | score = ~score & ~(3<<30); | 665 | score = ~score & ~(3<<30); |
666 | 666 | ||
@@ -700,12 +700,12 @@ static inline int compare_keys(struct flowi *fl1, struct flowi *fl2) | |||
700 | 700 | ||
701 | static inline int compare_netns(struct rtable *rt1, struct rtable *rt2) | 701 | static inline int compare_netns(struct rtable *rt1, struct rtable *rt2) |
702 | { | 702 | { |
703 | return net_eq(dev_net(rt1->u.dst.dev), dev_net(rt2->u.dst.dev)); | 703 | return net_eq(dev_net(rt1->dst.dev), dev_net(rt2->dst.dev)); |
704 | } | 704 | } |
705 | 705 | ||
706 | static inline int rt_is_expired(struct rtable *rth) | 706 | static inline int rt_is_expired(struct rtable *rth) |
707 | { | 707 | { |
708 | return rth->rt_genid != rt_genid(dev_net(rth->u.dst.dev)); | 708 | return rth->rt_genid != rt_genid(dev_net(rth->dst.dev)); |
709 | } | 709 | } |
710 | 710 | ||
711 | /* | 711 | /* |
@@ -734,7 +734,7 @@ static void rt_do_flush(int process_context) | |||
734 | rth = rt_hash_table[i].chain; | 734 | rth = rt_hash_table[i].chain; |
735 | 735 | ||
736 | /* defer releasing the head of the list after spin_unlock */ | 736 | /* defer releasing the head of the list after spin_unlock */ |
737 | for (tail = rth; tail; tail = tail->u.dst.rt_next) | 737 | for (tail = rth; tail; tail = tail->dst.rt_next) |
738 | if (!rt_is_expired(tail)) | 738 | if (!rt_is_expired(tail)) |
739 | break; | 739 | break; |
740 | if (rth != tail) | 740 | if (rth != tail) |
@@ -743,9 +743,9 @@ static void rt_do_flush(int process_context) | |||
743 | /* call rt_free on entries after the tail requiring flush */ | 743 | /* call rt_free on entries after the tail requiring flush */ |
744 | prev = &rt_hash_table[i].chain; | 744 | prev = &rt_hash_table[i].chain; |
745 | for (p = *prev; p; p = next) { | 745 | for (p = *prev; p; p = next) { |
746 | next = p->u.dst.rt_next; | 746 | next = p->dst.rt_next; |
747 | if (!rt_is_expired(p)) { | 747 | if (!rt_is_expired(p)) { |
748 | prev = &p->u.dst.rt_next; | 748 | prev = &p->dst.rt_next; |
749 | } else { | 749 | } else { |
750 | *prev = next; | 750 | *prev = next; |
751 | rt_free(p); | 751 | rt_free(p); |
@@ -760,7 +760,7 @@ static void rt_do_flush(int process_context) | |||
760 | spin_unlock_bh(rt_hash_lock_addr(i)); | 760 | spin_unlock_bh(rt_hash_lock_addr(i)); |
761 | 761 | ||
762 | for (; rth != tail; rth = next) { | 762 | for (; rth != tail; rth = next) { |
763 | next = rth->u.dst.rt_next; | 763 | next = rth->dst.rt_next; |
764 | rt_free(rth); | 764 | rt_free(rth); |
765 | } | 765 | } |
766 | } | 766 | } |
@@ -791,7 +791,7 @@ static int has_noalias(const struct rtable *head, const struct rtable *rth) | |||
791 | while (aux != rth) { | 791 | while (aux != rth) { |
792 | if (compare_hash_inputs(&aux->fl, &rth->fl)) | 792 | if (compare_hash_inputs(&aux->fl, &rth->fl)) |
793 | return 0; | 793 | return 0; |
794 | aux = aux->u.dst.rt_next; | 794 | aux = aux->dst.rt_next; |
795 | } | 795 | } |
796 | return ONE; | 796 | return ONE; |
797 | } | 797 | } |
@@ -831,18 +831,18 @@ static void rt_check_expire(void) | |||
831 | length = 0; | 831 | length = 0; |
832 | spin_lock_bh(rt_hash_lock_addr(i)); | 832 | spin_lock_bh(rt_hash_lock_addr(i)); |
833 | while ((rth = *rthp) != NULL) { | 833 | while ((rth = *rthp) != NULL) { |
834 | prefetch(rth->u.dst.rt_next); | 834 | prefetch(rth->dst.rt_next); |
835 | if (rt_is_expired(rth)) { | 835 | if (rt_is_expired(rth)) { |
836 | *rthp = rth->u.dst.rt_next; | 836 | *rthp = rth->dst.rt_next; |
837 | rt_free(rth); | 837 | rt_free(rth); |
838 | continue; | 838 | continue; |
839 | } | 839 | } |
840 | if (rth->u.dst.expires) { | 840 | if (rth->dst.expires) { |
841 | /* Entry is expired even if it is in use */ | 841 | /* Entry is expired even if it is in use */ |
842 | if (time_before_eq(jiffies, rth->u.dst.expires)) { | 842 | if (time_before_eq(jiffies, rth->dst.expires)) { |
843 | nofree: | 843 | nofree: |
844 | tmo >>= 1; | 844 | tmo >>= 1; |
845 | rthp = &rth->u.dst.rt_next; | 845 | rthp = &rth->dst.rt_next; |
846 | /* | 846 | /* |
847 | * We only count entries on | 847 | * We only count entries on |
848 | * a chain with equal hash inputs once | 848 | * a chain with equal hash inputs once |
@@ -858,7 +858,7 @@ nofree: | |||
858 | goto nofree; | 858 | goto nofree; |
859 | 859 | ||
860 | /* Cleanup aged off entries. */ | 860 | /* Cleanup aged off entries. */ |
861 | *rthp = rth->u.dst.rt_next; | 861 | *rthp = rth->dst.rt_next; |
862 | rt_free(rth); | 862 | rt_free(rth); |
863 | } | 863 | } |
864 | spin_unlock_bh(rt_hash_lock_addr(i)); | 864 | spin_unlock_bh(rt_hash_lock_addr(i)); |
@@ -999,10 +999,10 @@ static int rt_garbage_collect(struct dst_ops *ops) | |||
999 | if (!rt_is_expired(rth) && | 999 | if (!rt_is_expired(rth) && |
1000 | !rt_may_expire(rth, tmo, expire)) { | 1000 | !rt_may_expire(rth, tmo, expire)) { |
1001 | tmo >>= 1; | 1001 | tmo >>= 1; |
1002 | rthp = &rth->u.dst.rt_next; | 1002 | rthp = &rth->dst.rt_next; |
1003 | continue; | 1003 | continue; |
1004 | } | 1004 | } |
1005 | *rthp = rth->u.dst.rt_next; | 1005 | *rthp = rth->dst.rt_next; |
1006 | rt_free(rth); | 1006 | rt_free(rth); |
1007 | goal--; | 1007 | goal--; |
1008 | } | 1008 | } |
@@ -1068,7 +1068,7 @@ static int slow_chain_length(const struct rtable *head) | |||
1068 | 1068 | ||
1069 | while (rth) { | 1069 | while (rth) { |
1070 | length += has_noalias(head, rth); | 1070 | length += has_noalias(head, rth); |
1071 | rth = rth->u.dst.rt_next; | 1071 | rth = rth->dst.rt_next; |
1072 | } | 1072 | } |
1073 | return length >> FRACT_BITS; | 1073 | return length >> FRACT_BITS; |
1074 | } | 1074 | } |
@@ -1090,7 +1090,7 @@ restart: | |||
1090 | candp = NULL; | 1090 | candp = NULL; |
1091 | now = jiffies; | 1091 | now = jiffies; |
1092 | 1092 | ||
1093 | if (!rt_caching(dev_net(rt->u.dst.dev))) { | 1093 | if (!rt_caching(dev_net(rt->dst.dev))) { |
1094 | /* | 1094 | /* |
1095 | * If we're not caching, just tell the caller we | 1095 | * If we're not caching, just tell the caller we |
1096 | * were successful and don't touch the route. The | 1096 | * were successful and don't touch the route. The |
@@ -1108,7 +1108,7 @@ restart: | |||
1108 | */ | 1108 | */ |
1109 | 1109 | ||
1110 | if (rt->rt_type == RTN_UNICAST || rt->fl.iif == 0) { | 1110 | if (rt->rt_type == RTN_UNICAST || rt->fl.iif == 0) { |
1111 | int err = arp_bind_neighbour(&rt->u.dst); | 1111 | int err = arp_bind_neighbour(&rt->dst); |
1112 | if (err) { | 1112 | if (err) { |
1113 | if (net_ratelimit()) | 1113 | if (net_ratelimit()) |
1114 | printk(KERN_WARNING | 1114 | printk(KERN_WARNING |
@@ -1127,19 +1127,19 @@ restart: | |||
1127 | spin_lock_bh(rt_hash_lock_addr(hash)); | 1127 | spin_lock_bh(rt_hash_lock_addr(hash)); |
1128 | while ((rth = *rthp) != NULL) { | 1128 | while ((rth = *rthp) != NULL) { |
1129 | if (rt_is_expired(rth)) { | 1129 | if (rt_is_expired(rth)) { |
1130 | *rthp = rth->u.dst.rt_next; | 1130 | *rthp = rth->dst.rt_next; |
1131 | rt_free(rth); | 1131 | rt_free(rth); |
1132 | continue; | 1132 | continue; |
1133 | } | 1133 | } |
1134 | if (compare_keys(&rth->fl, &rt->fl) && compare_netns(rth, rt)) { | 1134 | if (compare_keys(&rth->fl, &rt->fl) && compare_netns(rth, rt)) { |
1135 | /* Put it first */ | 1135 | /* Put it first */ |
1136 | *rthp = rth->u.dst.rt_next; | 1136 | *rthp = rth->dst.rt_next; |
1137 | /* | 1137 | /* |
1138 | * Since lookup is lockfree, the deletion | 1138 | * Since lookup is lockfree, the deletion |
1139 | * must be visible to another weakly ordered CPU before | 1139 | * must be visible to another weakly ordered CPU before |
1140 | * the insertion at the start of the hash chain. | 1140 | * the insertion at the start of the hash chain. |
1141 | */ | 1141 | */ |
1142 | rcu_assign_pointer(rth->u.dst.rt_next, | 1142 | rcu_assign_pointer(rth->dst.rt_next, |
1143 | rt_hash_table[hash].chain); | 1143 | rt_hash_table[hash].chain); |
1144 | /* | 1144 | /* |
1145 | * Since lookup is lockfree, the update writes | 1145 | * Since lookup is lockfree, the update writes |
@@ -1147,18 +1147,18 @@ restart: | |||
1147 | */ | 1147 | */ |
1148 | rcu_assign_pointer(rt_hash_table[hash].chain, rth); | 1148 | rcu_assign_pointer(rt_hash_table[hash].chain, rth); |
1149 | 1149 | ||
1150 | dst_use(&rth->u.dst, now); | 1150 | dst_use(&rth->dst, now); |
1151 | spin_unlock_bh(rt_hash_lock_addr(hash)); | 1151 | spin_unlock_bh(rt_hash_lock_addr(hash)); |
1152 | 1152 | ||
1153 | rt_drop(rt); | 1153 | rt_drop(rt); |
1154 | if (rp) | 1154 | if (rp) |
1155 | *rp = rth; | 1155 | *rp = rth; |
1156 | else | 1156 | else |
1157 | skb_dst_set(skb, &rth->u.dst); | 1157 | skb_dst_set(skb, &rth->dst); |
1158 | return 0; | 1158 | return 0; |
1159 | } | 1159 | } |
1160 | 1160 | ||
1161 | if (!atomic_read(&rth->u.dst.__refcnt)) { | 1161 | if (!atomic_read(&rth->dst.__refcnt)) { |
1162 | u32 score = rt_score(rth); | 1162 | u32 score = rt_score(rth); |
1163 | 1163 | ||
1164 | if (score <= min_score) { | 1164 | if (score <= min_score) { |
@@ -1170,7 +1170,7 @@ restart: | |||
1170 | 1170 | ||
1171 | chain_length++; | 1171 | chain_length++; |
1172 | 1172 | ||
1173 | rthp = &rth->u.dst.rt_next; | 1173 | rthp = &rth->dst.rt_next; |
1174 | } | 1174 | } |
1175 | 1175 | ||
1176 | if (cand) { | 1176 | if (cand) { |
@@ -1181,17 +1181,17 @@ restart: | |||
1181 | * only 2 entries per bucket. We will see. | 1181 | * only 2 entries per bucket. We will see. |
1182 | */ | 1182 | */ |
1183 | if (chain_length > ip_rt_gc_elasticity) { | 1183 | if (chain_length > ip_rt_gc_elasticity) { |
1184 | *candp = cand->u.dst.rt_next; | 1184 | *candp = cand->dst.rt_next; |
1185 | rt_free(cand); | 1185 | rt_free(cand); |
1186 | } | 1186 | } |
1187 | } else { | 1187 | } else { |
1188 | if (chain_length > rt_chain_length_max && | 1188 | if (chain_length > rt_chain_length_max && |
1189 | slow_chain_length(rt_hash_table[hash].chain) > rt_chain_length_max) { | 1189 | slow_chain_length(rt_hash_table[hash].chain) > rt_chain_length_max) { |
1190 | struct net *net = dev_net(rt->u.dst.dev); | 1190 | struct net *net = dev_net(rt->dst.dev); |
1191 | int num = ++net->ipv4.current_rt_cache_rebuild_count; | 1191 | int num = ++net->ipv4.current_rt_cache_rebuild_count; |
1192 | if (!rt_caching(net)) { | 1192 | if (!rt_caching(net)) { |
1193 | printk(KERN_WARNING "%s: %d rebuilds is over limit, route caching disabled\n", | 1193 | printk(KERN_WARNING "%s: %d rebuilds is over limit, route caching disabled\n", |
1194 | rt->u.dst.dev->name, num); | 1194 | rt->dst.dev->name, num); |
1195 | } | 1195 | } |
1196 | rt_emergency_hash_rebuild(net); | 1196 | rt_emergency_hash_rebuild(net); |
1197 | spin_unlock_bh(rt_hash_lock_addr(hash)); | 1197 | spin_unlock_bh(rt_hash_lock_addr(hash)); |
@@ -1206,7 +1206,7 @@ restart: | |||
1206 | route or unicast forwarding path. | 1206 | route or unicast forwarding path. |
1207 | */ | 1207 | */ |
1208 | if (rt->rt_type == RTN_UNICAST || rt->fl.iif == 0) { | 1208 | if (rt->rt_type == RTN_UNICAST || rt->fl.iif == 0) { |
1209 | int err = arp_bind_neighbour(&rt->u.dst); | 1209 | int err = arp_bind_neighbour(&rt->dst); |
1210 | if (err) { | 1210 | if (err) { |
1211 | spin_unlock_bh(rt_hash_lock_addr(hash)); | 1211 | spin_unlock_bh(rt_hash_lock_addr(hash)); |
1212 | 1212 | ||
@@ -1237,14 +1237,14 @@ restart: | |||
1237 | } | 1237 | } |
1238 | } | 1238 | } |
1239 | 1239 | ||
1240 | rt->u.dst.rt_next = rt_hash_table[hash].chain; | 1240 | rt->dst.rt_next = rt_hash_table[hash].chain; |
1241 | 1241 | ||
1242 | #if RT_CACHE_DEBUG >= 2 | 1242 | #if RT_CACHE_DEBUG >= 2 |
1243 | if (rt->u.dst.rt_next) { | 1243 | if (rt->dst.rt_next) { |
1244 | struct rtable *trt; | 1244 | struct rtable *trt; |
1245 | printk(KERN_DEBUG "rt_cache @%02x: %pI4", | 1245 | printk(KERN_DEBUG "rt_cache @%02x: %pI4", |
1246 | hash, &rt->rt_dst); | 1246 | hash, &rt->rt_dst); |
1247 | for (trt = rt->u.dst.rt_next; trt; trt = trt->u.dst.rt_next) | 1247 | for (trt = rt->dst.rt_next; trt; trt = trt->dst.rt_next) |
1248 | printk(" . %pI4", &trt->rt_dst); | 1248 | printk(" . %pI4", &trt->rt_dst); |
1249 | printk("\n"); | 1249 | printk("\n"); |
1250 | } | 1250 | } |
@@ -1262,7 +1262,7 @@ skip_hashing: | |||
1262 | if (rp) | 1262 | if (rp) |
1263 | *rp = rt; | 1263 | *rp = rt; |
1264 | else | 1264 | else |
1265 | skb_dst_set(skb, &rt->u.dst); | 1265 | skb_dst_set(skb, &rt->dst); |
1266 | return 0; | 1266 | return 0; |
1267 | } | 1267 | } |
1268 | 1268 | ||
@@ -1334,11 +1334,11 @@ static void rt_del(unsigned hash, struct rtable *rt) | |||
1334 | ip_rt_put(rt); | 1334 | ip_rt_put(rt); |
1335 | while ((aux = *rthp) != NULL) { | 1335 | while ((aux = *rthp) != NULL) { |
1336 | if (aux == rt || rt_is_expired(aux)) { | 1336 | if (aux == rt || rt_is_expired(aux)) { |
1337 | *rthp = aux->u.dst.rt_next; | 1337 | *rthp = aux->dst.rt_next; |
1338 | rt_free(aux); | 1338 | rt_free(aux); |
1339 | continue; | 1339 | continue; |
1340 | } | 1340 | } |
1341 | rthp = &aux->u.dst.rt_next; | 1341 | rthp = &aux->dst.rt_next; |
1342 | } | 1342 | } |
1343 | spin_unlock_bh(rt_hash_lock_addr(hash)); | 1343 | spin_unlock_bh(rt_hash_lock_addr(hash)); |
1344 | } | 1344 | } |
@@ -1392,19 +1392,19 @@ void ip_rt_redirect(__be32 old_gw, __be32 daddr, __be32 new_gw, | |||
1392 | rth->fl.oif != ikeys[k] || | 1392 | rth->fl.oif != ikeys[k] || |
1393 | rth->fl.iif != 0 || | 1393 | rth->fl.iif != 0 || |
1394 | rt_is_expired(rth) || | 1394 | rt_is_expired(rth) || |
1395 | !net_eq(dev_net(rth->u.dst.dev), net)) { | 1395 | !net_eq(dev_net(rth->dst.dev), net)) { |
1396 | rthp = &rth->u.dst.rt_next; | 1396 | rthp = &rth->dst.rt_next; |
1397 | continue; | 1397 | continue; |
1398 | } | 1398 | } |
1399 | 1399 | ||
1400 | if (rth->rt_dst != daddr || | 1400 | if (rth->rt_dst != daddr || |
1401 | rth->rt_src != saddr || | 1401 | rth->rt_src != saddr || |
1402 | rth->u.dst.error || | 1402 | rth->dst.error || |
1403 | rth->rt_gateway != old_gw || | 1403 | rth->rt_gateway != old_gw || |
1404 | rth->u.dst.dev != dev) | 1404 | rth->dst.dev != dev) |
1405 | break; | 1405 | break; |
1406 | 1406 | ||
1407 | dst_hold(&rth->u.dst); | 1407 | dst_hold(&rth->dst); |
1408 | 1408 | ||
1409 | rt = dst_alloc(&ipv4_dst_ops); | 1409 | rt = dst_alloc(&ipv4_dst_ops); |
1410 | if (rt == NULL) { | 1410 | if (rt == NULL) { |
@@ -1414,20 +1414,20 @@ void ip_rt_redirect(__be32 old_gw, __be32 daddr, __be32 new_gw, | |||
1414 | 1414 | ||
1415 | /* Copy all the information. */ | 1415 | /* Copy all the information. */ |
1416 | *rt = *rth; | 1416 | *rt = *rth; |
1417 | rt->u.dst.__use = 1; | 1417 | rt->dst.__use = 1; |
1418 | atomic_set(&rt->u.dst.__refcnt, 1); | 1418 | atomic_set(&rt->dst.__refcnt, 1); |
1419 | rt->u.dst.child = NULL; | 1419 | rt->dst.child = NULL; |
1420 | if (rt->u.dst.dev) | 1420 | if (rt->dst.dev) |
1421 | dev_hold(rt->u.dst.dev); | 1421 | dev_hold(rt->dst.dev); |
1422 | if (rt->idev) | 1422 | if (rt->idev) |
1423 | in_dev_hold(rt->idev); | 1423 | in_dev_hold(rt->idev); |
1424 | rt->u.dst.obsolete = -1; | 1424 | rt->dst.obsolete = -1; |
1425 | rt->u.dst.lastuse = jiffies; | 1425 | rt->dst.lastuse = jiffies; |
1426 | rt->u.dst.path = &rt->u.dst; | 1426 | rt->dst.path = &rt->dst; |
1427 | rt->u.dst.neighbour = NULL; | 1427 | rt->dst.neighbour = NULL; |
1428 | rt->u.dst.hh = NULL; | 1428 | rt->dst.hh = NULL; |
1429 | #ifdef CONFIG_XFRM | 1429 | #ifdef CONFIG_XFRM |
1430 | rt->u.dst.xfrm = NULL; | 1430 | rt->dst.xfrm = NULL; |
1431 | #endif | 1431 | #endif |
1432 | rt->rt_genid = rt_genid(net); | 1432 | rt->rt_genid = rt_genid(net); |
1433 | rt->rt_flags |= RTCF_REDIRECTED; | 1433 | rt->rt_flags |= RTCF_REDIRECTED; |
@@ -1436,23 +1436,23 @@ void ip_rt_redirect(__be32 old_gw, __be32 daddr, __be32 new_gw, | |||
1436 | rt->rt_gateway = new_gw; | 1436 | rt->rt_gateway = new_gw; |
1437 | 1437 | ||
1438 | /* Redirect received -> path was valid */ | 1438 | /* Redirect received -> path was valid */ |
1439 | dst_confirm(&rth->u.dst); | 1439 | dst_confirm(&rth->dst); |
1440 | 1440 | ||
1441 | if (rt->peer) | 1441 | if (rt->peer) |
1442 | atomic_inc(&rt->peer->refcnt); | 1442 | atomic_inc(&rt->peer->refcnt); |
1443 | 1443 | ||
1444 | if (arp_bind_neighbour(&rt->u.dst) || | 1444 | if (arp_bind_neighbour(&rt->dst) || |
1445 | !(rt->u.dst.neighbour->nud_state & | 1445 | !(rt->dst.neighbour->nud_state & |
1446 | NUD_VALID)) { | 1446 | NUD_VALID)) { |
1447 | if (rt->u.dst.neighbour) | 1447 | if (rt->dst.neighbour) |
1448 | neigh_event_send(rt->u.dst.neighbour, NULL); | 1448 | neigh_event_send(rt->dst.neighbour, NULL); |
1449 | ip_rt_put(rth); | 1449 | ip_rt_put(rth); |
1450 | rt_drop(rt); | 1450 | rt_drop(rt); |
1451 | goto do_next; | 1451 | goto do_next; |
1452 | } | 1452 | } |
1453 | 1453 | ||
1454 | netevent.old = &rth->u.dst; | 1454 | netevent.old = &rth->dst; |
1455 | netevent.new = &rt->u.dst; | 1455 | netevent.new = &rt->dst; |
1456 | call_netevent_notifiers(NETEVENT_REDIRECT, | 1456 | call_netevent_notifiers(NETEVENT_REDIRECT, |
1457 | &netevent); | 1457 | &netevent); |
1458 | 1458 | ||
@@ -1488,8 +1488,8 @@ static struct dst_entry *ipv4_negative_advice(struct dst_entry *dst) | |||
1488 | ip_rt_put(rt); | 1488 | ip_rt_put(rt); |
1489 | ret = NULL; | 1489 | ret = NULL; |
1490 | } else if ((rt->rt_flags & RTCF_REDIRECTED) || | 1490 | } else if ((rt->rt_flags & RTCF_REDIRECTED) || |
1491 | (rt->u.dst.expires && | 1491 | (rt->dst.expires && |
1492 | time_after_eq(jiffies, rt->u.dst.expires))) { | 1492 | time_after_eq(jiffies, rt->dst.expires))) { |
1493 | unsigned hash = rt_hash(rt->fl.fl4_dst, rt->fl.fl4_src, | 1493 | unsigned hash = rt_hash(rt->fl.fl4_dst, rt->fl.fl4_src, |
1494 | rt->fl.oif, | 1494 | rt->fl.oif, |
1495 | rt_genid(dev_net(dst->dev))); | 1495 | rt_genid(dev_net(dst->dev))); |
@@ -1527,7 +1527,7 @@ void ip_rt_send_redirect(struct sk_buff *skb) | |||
1527 | int log_martians; | 1527 | int log_martians; |
1528 | 1528 | ||
1529 | rcu_read_lock(); | 1529 | rcu_read_lock(); |
1530 | in_dev = __in_dev_get_rcu(rt->u.dst.dev); | 1530 | in_dev = __in_dev_get_rcu(rt->dst.dev); |
1531 | if (!in_dev || !IN_DEV_TX_REDIRECTS(in_dev)) { | 1531 | if (!in_dev || !IN_DEV_TX_REDIRECTS(in_dev)) { |
1532 | rcu_read_unlock(); | 1532 | rcu_read_unlock(); |
1533 | return; | 1533 | return; |
@@ -1538,30 +1538,30 @@ void ip_rt_send_redirect(struct sk_buff *skb) | |||
1538 | /* No redirected packets during ip_rt_redirect_silence; | 1538 | /* No redirected packets during ip_rt_redirect_silence; |
1539 | * reset the algorithm. | 1539 | * reset the algorithm. |
1540 | */ | 1540 | */ |
1541 | if (time_after(jiffies, rt->u.dst.rate_last + ip_rt_redirect_silence)) | 1541 | if (time_after(jiffies, rt->dst.rate_last + ip_rt_redirect_silence)) |
1542 | rt->u.dst.rate_tokens = 0; | 1542 | rt->dst.rate_tokens = 0; |
1543 | 1543 | ||
1544 | /* Too many ignored redirects; do not send anything | 1544 | /* Too many ignored redirects; do not send anything |
1545 | * set u.dst.rate_last to the last seen redirected packet. | 1545 | * set dst.rate_last to the last seen redirected packet. |
1546 | */ | 1546 | */ |
1547 | if (rt->u.dst.rate_tokens >= ip_rt_redirect_number) { | 1547 | if (rt->dst.rate_tokens >= ip_rt_redirect_number) { |
1548 | rt->u.dst.rate_last = jiffies; | 1548 | rt->dst.rate_last = jiffies; |
1549 | return; | 1549 | return; |
1550 | } | 1550 | } |
1551 | 1551 | ||
1552 | /* Check for load limit; set rate_last to the latest sent | 1552 | /* Check for load limit; set rate_last to the latest sent |
1553 | * redirect. | 1553 | * redirect. |
1554 | */ | 1554 | */ |
1555 | if (rt->u.dst.rate_tokens == 0 || | 1555 | if (rt->dst.rate_tokens == 0 || |
1556 | time_after(jiffies, | 1556 | time_after(jiffies, |
1557 | (rt->u.dst.rate_last + | 1557 | (rt->dst.rate_last + |
1558 | (ip_rt_redirect_load << rt->u.dst.rate_tokens)))) { | 1558 | (ip_rt_redirect_load << rt->dst.rate_tokens)))) { |
1559 | icmp_send(skb, ICMP_REDIRECT, ICMP_REDIR_HOST, rt->rt_gateway); | 1559 | icmp_send(skb, ICMP_REDIRECT, ICMP_REDIR_HOST, rt->rt_gateway); |
1560 | rt->u.dst.rate_last = jiffies; | 1560 | rt->dst.rate_last = jiffies; |
1561 | ++rt->u.dst.rate_tokens; | 1561 | ++rt->dst.rate_tokens; |
1562 | #ifdef CONFIG_IP_ROUTE_VERBOSE | 1562 | #ifdef CONFIG_IP_ROUTE_VERBOSE |
1563 | if (log_martians && | 1563 | if (log_martians && |
1564 | rt->u.dst.rate_tokens == ip_rt_redirect_number && | 1564 | rt->dst.rate_tokens == ip_rt_redirect_number && |
1565 | net_ratelimit()) | 1565 | net_ratelimit()) |
1566 | printk(KERN_WARNING "host %pI4/if%d ignores redirects for %pI4 to %pI4.\n", | 1566 | printk(KERN_WARNING "host %pI4/if%d ignores redirects for %pI4 to %pI4.\n", |
1567 | &rt->rt_src, rt->rt_iif, | 1567 | &rt->rt_src, rt->rt_iif, |
@@ -1576,7 +1576,7 @@ static int ip_error(struct sk_buff *skb) | |||
1576 | unsigned long now; | 1576 | unsigned long now; |
1577 | int code; | 1577 | int code; |
1578 | 1578 | ||
1579 | switch (rt->u.dst.error) { | 1579 | switch (rt->dst.error) { |
1580 | case EINVAL: | 1580 | case EINVAL: |
1581 | default: | 1581 | default: |
1582 | goto out; | 1582 | goto out; |
@@ -1585,7 +1585,7 @@ static int ip_error(struct sk_buff *skb) | |||
1585 | break; | 1585 | break; |
1586 | case ENETUNREACH: | 1586 | case ENETUNREACH: |
1587 | code = ICMP_NET_UNREACH; | 1587 | code = ICMP_NET_UNREACH; |
1588 | IP_INC_STATS_BH(dev_net(rt->u.dst.dev), | 1588 | IP_INC_STATS_BH(dev_net(rt->dst.dev), |
1589 | IPSTATS_MIB_INNOROUTES); | 1589 | IPSTATS_MIB_INNOROUTES); |
1590 | break; | 1590 | break; |
1591 | case EACCES: | 1591 | case EACCES: |
@@ -1594,12 +1594,12 @@ static int ip_error(struct sk_buff *skb) | |||
1594 | } | 1594 | } |
1595 | 1595 | ||
1596 | now = jiffies; | 1596 | now = jiffies; |
1597 | rt->u.dst.rate_tokens += now - rt->u.dst.rate_last; | 1597 | rt->dst.rate_tokens += now - rt->dst.rate_last; |
1598 | if (rt->u.dst.rate_tokens > ip_rt_error_burst) | 1598 | if (rt->dst.rate_tokens > ip_rt_error_burst) |
1599 | rt->u.dst.rate_tokens = ip_rt_error_burst; | 1599 | rt->dst.rate_tokens = ip_rt_error_burst; |
1600 | rt->u.dst.rate_last = now; | 1600 | rt->dst.rate_last = now; |
1601 | if (rt->u.dst.rate_tokens >= ip_rt_error_cost) { | 1601 | if (rt->dst.rate_tokens >= ip_rt_error_cost) { |
1602 | rt->u.dst.rate_tokens -= ip_rt_error_cost; | 1602 | rt->dst.rate_tokens -= ip_rt_error_cost; |
1603 | icmp_send(skb, ICMP_DEST_UNREACH, code, 0); | 1603 | icmp_send(skb, ICMP_DEST_UNREACH, code, 0); |
1604 | } | 1604 | } |
1605 | 1605 | ||
@@ -1644,7 +1644,7 @@ unsigned short ip_rt_frag_needed(struct net *net, struct iphdr *iph, | |||
1644 | 1644 | ||
1645 | rcu_read_lock(); | 1645 | rcu_read_lock(); |
1646 | for (rth = rcu_dereference(rt_hash_table[hash].chain); rth; | 1646 | for (rth = rcu_dereference(rt_hash_table[hash].chain); rth; |
1647 | rth = rcu_dereference(rth->u.dst.rt_next)) { | 1647 | rth = rcu_dereference(rth->dst.rt_next)) { |
1648 | unsigned short mtu = new_mtu; | 1648 | unsigned short mtu = new_mtu; |
1649 | 1649 | ||
1650 | if (rth->fl.fl4_dst != daddr || | 1650 | if (rth->fl.fl4_dst != daddr || |
@@ -1653,8 +1653,8 @@ unsigned short ip_rt_frag_needed(struct net *net, struct iphdr *iph, | |||
1653 | rth->rt_src != iph->saddr || | 1653 | rth->rt_src != iph->saddr || |
1654 | rth->fl.oif != ikeys[k] || | 1654 | rth->fl.oif != ikeys[k] || |
1655 | rth->fl.iif != 0 || | 1655 | rth->fl.iif != 0 || |
1656 | dst_metric_locked(&rth->u.dst, RTAX_MTU) || | 1656 | dst_metric_locked(&rth->dst, RTAX_MTU) || |
1657 | !net_eq(dev_net(rth->u.dst.dev), net) || | 1657 | !net_eq(dev_net(rth->dst.dev), net) || |
1658 | rt_is_expired(rth)) | 1658 | rt_is_expired(rth)) |
1659 | continue; | 1659 | continue; |
1660 | 1660 | ||
@@ -1662,22 +1662,22 @@ unsigned short ip_rt_frag_needed(struct net *net, struct iphdr *iph, | |||
1662 | 1662 | ||
1663 | /* BSD 4.2 compatibility hack :-( */ | 1663 | /* BSD 4.2 compatibility hack :-( */ |
1664 | if (mtu == 0 && | 1664 | if (mtu == 0 && |
1665 | old_mtu >= dst_mtu(&rth->u.dst) && | 1665 | old_mtu >= dst_mtu(&rth->dst) && |
1666 | old_mtu >= 68 + (iph->ihl << 2)) | 1666 | old_mtu >= 68 + (iph->ihl << 2)) |
1667 | old_mtu -= iph->ihl << 2; | 1667 | old_mtu -= iph->ihl << 2; |
1668 | 1668 | ||
1669 | mtu = guess_mtu(old_mtu); | 1669 | mtu = guess_mtu(old_mtu); |
1670 | } | 1670 | } |
1671 | if (mtu <= dst_mtu(&rth->u.dst)) { | 1671 | if (mtu <= dst_mtu(&rth->dst)) { |
1672 | if (mtu < dst_mtu(&rth->u.dst)) { | 1672 | if (mtu < dst_mtu(&rth->dst)) { |
1673 | dst_confirm(&rth->u.dst); | 1673 | dst_confirm(&rth->dst); |
1674 | if (mtu < ip_rt_min_pmtu) { | 1674 | if (mtu < ip_rt_min_pmtu) { |
1675 | mtu = ip_rt_min_pmtu; | 1675 | mtu = ip_rt_min_pmtu; |
1676 | rth->u.dst.metrics[RTAX_LOCK-1] |= | 1676 | rth->dst.metrics[RTAX_LOCK-1] |= |
1677 | (1 << RTAX_MTU); | 1677 | (1 << RTAX_MTU); |
1678 | } | 1678 | } |
1679 | rth->u.dst.metrics[RTAX_MTU-1] = mtu; | 1679 | rth->dst.metrics[RTAX_MTU-1] = mtu; |
1680 | dst_set_expires(&rth->u.dst, | 1680 | dst_set_expires(&rth->dst, |
1681 | ip_rt_mtu_expires); | 1681 | ip_rt_mtu_expires); |
1682 | } | 1682 | } |
1683 | est_mtu = mtu; | 1683 | est_mtu = mtu; |
@@ -1750,7 +1750,7 @@ static void ipv4_link_failure(struct sk_buff *skb) | |||
1750 | 1750 | ||
1751 | rt = skb_rtable(skb); | 1751 | rt = skb_rtable(skb); |
1752 | if (rt) | 1752 | if (rt) |
1753 | dst_set_expires(&rt->u.dst, 0); | 1753 | dst_set_expires(&rt->dst, 0); |
1754 | } | 1754 | } |
1755 | 1755 | ||
1756 | static int ip_rt_bug(struct sk_buff *skb) | 1756 | static int ip_rt_bug(struct sk_buff *skb) |
@@ -1778,11 +1778,11 @@ void ip_rt_get_source(u8 *addr, struct rtable *rt) | |||
1778 | 1778 | ||
1779 | if (rt->fl.iif == 0) | 1779 | if (rt->fl.iif == 0) |
1780 | src = rt->rt_src; | 1780 | src = rt->rt_src; |
1781 | else if (fib_lookup(dev_net(rt->u.dst.dev), &rt->fl, &res) == 0) { | 1781 | else if (fib_lookup(dev_net(rt->dst.dev), &rt->fl, &res) == 0) { |
1782 | src = FIB_RES_PREFSRC(res); | 1782 | src = FIB_RES_PREFSRC(res); |
1783 | fib_res_put(&res); | 1783 | fib_res_put(&res); |
1784 | } else | 1784 | } else |
1785 | src = inet_select_addr(rt->u.dst.dev, rt->rt_gateway, | 1785 | src = inet_select_addr(rt->dst.dev, rt->rt_gateway, |
1786 | RT_SCOPE_UNIVERSE); | 1786 | RT_SCOPE_UNIVERSE); |
1787 | memcpy(addr, &src, 4); | 1787 | memcpy(addr, &src, 4); |
1788 | } | 1788 | } |
@@ -1790,10 +1790,10 @@ void ip_rt_get_source(u8 *addr, struct rtable *rt) | |||
1790 | #ifdef CONFIG_NET_CLS_ROUTE | 1790 | #ifdef CONFIG_NET_CLS_ROUTE |
1791 | static void set_class_tag(struct rtable *rt, u32 tag) | 1791 | static void set_class_tag(struct rtable *rt, u32 tag) |
1792 | { | 1792 | { |
1793 | if (!(rt->u.dst.tclassid & 0xFFFF)) | 1793 | if (!(rt->dst.tclassid & 0xFFFF)) |
1794 | rt->u.dst.tclassid |= tag & 0xFFFF; | 1794 | rt->dst.tclassid |= tag & 0xFFFF; |
1795 | if (!(rt->u.dst.tclassid & 0xFFFF0000)) | 1795 | if (!(rt->dst.tclassid & 0xFFFF0000)) |
1796 | rt->u.dst.tclassid |= tag & 0xFFFF0000; | 1796 | rt->dst.tclassid |= tag & 0xFFFF0000; |
1797 | } | 1797 | } |
1798 | #endif | 1798 | #endif |
1799 | 1799 | ||
@@ -1805,30 +1805,30 @@ static void rt_set_nexthop(struct rtable *rt, struct fib_result *res, u32 itag) | |||
1805 | if (FIB_RES_GW(*res) && | 1805 | if (FIB_RES_GW(*res) && |
1806 | FIB_RES_NH(*res).nh_scope == RT_SCOPE_LINK) | 1806 | FIB_RES_NH(*res).nh_scope == RT_SCOPE_LINK) |
1807 | rt->rt_gateway = FIB_RES_GW(*res); | 1807 | rt->rt_gateway = FIB_RES_GW(*res); |
1808 | memcpy(rt->u.dst.metrics, fi->fib_metrics, | 1808 | memcpy(rt->dst.metrics, fi->fib_metrics, |
1809 | sizeof(rt->u.dst.metrics)); | 1809 | sizeof(rt->dst.metrics)); |
1810 | if (fi->fib_mtu == 0) { | 1810 | if (fi->fib_mtu == 0) { |
1811 | rt->u.dst.metrics[RTAX_MTU-1] = rt->u.dst.dev->mtu; | 1811 | rt->dst.metrics[RTAX_MTU-1] = rt->dst.dev->mtu; |
1812 | if (dst_metric_locked(&rt->u.dst, RTAX_MTU) && | 1812 | if (dst_metric_locked(&rt->dst, RTAX_MTU) && |
1813 | rt->rt_gateway != rt->rt_dst && | 1813 | rt->rt_gateway != rt->rt_dst && |
1814 | rt->u.dst.dev->mtu > 576) | 1814 | rt->dst.dev->mtu > 576) |
1815 | rt->u.dst.metrics[RTAX_MTU-1] = 576; | 1815 | rt->dst.metrics[RTAX_MTU-1] = 576; |
1816 | } | 1816 | } |
1817 | #ifdef CONFIG_NET_CLS_ROUTE | 1817 | #ifdef CONFIG_NET_CLS_ROUTE |
1818 | rt->u.dst.tclassid = FIB_RES_NH(*res).nh_tclassid; | 1818 | rt->dst.tclassid = FIB_RES_NH(*res).nh_tclassid; |
1819 | #endif | 1819 | #endif |
1820 | } else | 1820 | } else |
1821 | rt->u.dst.metrics[RTAX_MTU-1]= rt->u.dst.dev->mtu; | 1821 | rt->dst.metrics[RTAX_MTU-1]= rt->dst.dev->mtu; |
1822 | 1822 | ||
1823 | if (dst_metric(&rt->u.dst, RTAX_HOPLIMIT) == 0) | 1823 | if (dst_metric(&rt->dst, RTAX_HOPLIMIT) == 0) |
1824 | rt->u.dst.metrics[RTAX_HOPLIMIT-1] = sysctl_ip_default_ttl; | 1824 | rt->dst.metrics[RTAX_HOPLIMIT-1] = sysctl_ip_default_ttl; |
1825 | if (dst_mtu(&rt->u.dst) > IP_MAX_MTU) | 1825 | if (dst_mtu(&rt->dst) > IP_MAX_MTU) |
1826 | rt->u.dst.metrics[RTAX_MTU-1] = IP_MAX_MTU; | 1826 | rt->dst.metrics[RTAX_MTU-1] = IP_MAX_MTU; |
1827 | if (dst_metric(&rt->u.dst, RTAX_ADVMSS) == 0) | 1827 | if (dst_metric(&rt->dst, RTAX_ADVMSS) == 0) |
1828 | rt->u.dst.metrics[RTAX_ADVMSS-1] = max_t(unsigned int, rt->u.dst.dev->mtu - 40, | 1828 | rt->dst.metrics[RTAX_ADVMSS-1] = max_t(unsigned int, rt->dst.dev->mtu - 40, |
1829 | ip_rt_min_advmss); | 1829 | ip_rt_min_advmss); |
1830 | if (dst_metric(&rt->u.dst, RTAX_ADVMSS) > 65535 - 40) | 1830 | if (dst_metric(&rt->dst, RTAX_ADVMSS) > 65535 - 40) |
1831 | rt->u.dst.metrics[RTAX_ADVMSS-1] = 65535 - 40; | 1831 | rt->dst.metrics[RTAX_ADVMSS-1] = 65535 - 40; |
1832 | 1832 | ||
1833 | #ifdef CONFIG_NET_CLS_ROUTE | 1833 | #ifdef CONFIG_NET_CLS_ROUTE |
1834 | #ifdef CONFIG_IP_MULTIPLE_TABLES | 1834 | #ifdef CONFIG_IP_MULTIPLE_TABLES |
@@ -1873,13 +1873,13 @@ static int ip_route_input_mc(struct sk_buff *skb, __be32 daddr, __be32 saddr, | |||
1873 | if (!rth) | 1873 | if (!rth) |
1874 | goto e_nobufs; | 1874 | goto e_nobufs; |
1875 | 1875 | ||
1876 | rth->u.dst.output = ip_rt_bug; | 1876 | rth->dst.output = ip_rt_bug; |
1877 | rth->u.dst.obsolete = -1; | 1877 | rth->dst.obsolete = -1; |
1878 | 1878 | ||
1879 | atomic_set(&rth->u.dst.__refcnt, 1); | 1879 | atomic_set(&rth->dst.__refcnt, 1); |
1880 | rth->u.dst.flags= DST_HOST; | 1880 | rth->dst.flags= DST_HOST; |
1881 | if (IN_DEV_CONF_GET(in_dev, NOPOLICY)) | 1881 | if (IN_DEV_CONF_GET(in_dev, NOPOLICY)) |
1882 | rth->u.dst.flags |= DST_NOPOLICY; | 1882 | rth->dst.flags |= DST_NOPOLICY; |
1883 | rth->fl.fl4_dst = daddr; | 1883 | rth->fl.fl4_dst = daddr; |
1884 | rth->rt_dst = daddr; | 1884 | rth->rt_dst = daddr; |
1885 | rth->fl.fl4_tos = tos; | 1885 | rth->fl.fl4_tos = tos; |
@@ -1887,13 +1887,13 @@ static int ip_route_input_mc(struct sk_buff *skb, __be32 daddr, __be32 saddr, | |||
1887 | rth->fl.fl4_src = saddr; | 1887 | rth->fl.fl4_src = saddr; |
1888 | rth->rt_src = saddr; | 1888 | rth->rt_src = saddr; |
1889 | #ifdef CONFIG_NET_CLS_ROUTE | 1889 | #ifdef CONFIG_NET_CLS_ROUTE |
1890 | rth->u.dst.tclassid = itag; | 1890 | rth->dst.tclassid = itag; |
1891 | #endif | 1891 | #endif |
1892 | rth->rt_iif = | 1892 | rth->rt_iif = |
1893 | rth->fl.iif = dev->ifindex; | 1893 | rth->fl.iif = dev->ifindex; |
1894 | rth->u.dst.dev = init_net.loopback_dev; | 1894 | rth->dst.dev = init_net.loopback_dev; |
1895 | dev_hold(rth->u.dst.dev); | 1895 | dev_hold(rth->dst.dev); |
1896 | rth->idev = in_dev_get(rth->u.dst.dev); | 1896 | rth->idev = in_dev_get(rth->dst.dev); |
1897 | rth->fl.oif = 0; | 1897 | rth->fl.oif = 0; |
1898 | rth->rt_gateway = daddr; | 1898 | rth->rt_gateway = daddr; |
1899 | rth->rt_spec_dst= spec_dst; | 1899 | rth->rt_spec_dst= spec_dst; |
@@ -1901,13 +1901,13 @@ static int ip_route_input_mc(struct sk_buff *skb, __be32 daddr, __be32 saddr, | |||
1901 | rth->rt_flags = RTCF_MULTICAST; | 1901 | rth->rt_flags = RTCF_MULTICAST; |
1902 | rth->rt_type = RTN_MULTICAST; | 1902 | rth->rt_type = RTN_MULTICAST; |
1903 | if (our) { | 1903 | if (our) { |
1904 | rth->u.dst.input= ip_local_deliver; | 1904 | rth->dst.input= ip_local_deliver; |
1905 | rth->rt_flags |= RTCF_LOCAL; | 1905 | rth->rt_flags |= RTCF_LOCAL; |
1906 | } | 1906 | } |
1907 | 1907 | ||
1908 | #ifdef CONFIG_IP_MROUTE | 1908 | #ifdef CONFIG_IP_MROUTE |
1909 | if (!ipv4_is_local_multicast(daddr) && IN_DEV_MFORWARD(in_dev)) | 1909 | if (!ipv4_is_local_multicast(daddr) && IN_DEV_MFORWARD(in_dev)) |
1910 | rth->u.dst.input = ip_mr_input; | 1910 | rth->dst.input = ip_mr_input; |
1911 | #endif | 1911 | #endif |
1912 | RT_CACHE_STAT_INC(in_slow_mc); | 1912 | RT_CACHE_STAT_INC(in_slow_mc); |
1913 | 1913 | ||
@@ -2016,12 +2016,12 @@ static int __mkroute_input(struct sk_buff *skb, | |||
2016 | goto cleanup; | 2016 | goto cleanup; |
2017 | } | 2017 | } |
2018 | 2018 | ||
2019 | atomic_set(&rth->u.dst.__refcnt, 1); | 2019 | atomic_set(&rth->dst.__refcnt, 1); |
2020 | rth->u.dst.flags= DST_HOST; | 2020 | rth->dst.flags= DST_HOST; |
2021 | if (IN_DEV_CONF_GET(in_dev, NOPOLICY)) | 2021 | if (IN_DEV_CONF_GET(in_dev, NOPOLICY)) |
2022 | rth->u.dst.flags |= DST_NOPOLICY; | 2022 | rth->dst.flags |= DST_NOPOLICY; |
2023 | if (IN_DEV_CONF_GET(out_dev, NOXFRM)) | 2023 | if (IN_DEV_CONF_GET(out_dev, NOXFRM)) |
2024 | rth->u.dst.flags |= DST_NOXFRM; | 2024 | rth->dst.flags |= DST_NOXFRM; |
2025 | rth->fl.fl4_dst = daddr; | 2025 | rth->fl.fl4_dst = daddr; |
2026 | rth->rt_dst = daddr; | 2026 | rth->rt_dst = daddr; |
2027 | rth->fl.fl4_tos = tos; | 2027 | rth->fl.fl4_tos = tos; |
@@ -2031,16 +2031,16 @@ static int __mkroute_input(struct sk_buff *skb, | |||
2031 | rth->rt_gateway = daddr; | 2031 | rth->rt_gateway = daddr; |
2032 | rth->rt_iif = | 2032 | rth->rt_iif = |
2033 | rth->fl.iif = in_dev->dev->ifindex; | 2033 | rth->fl.iif = in_dev->dev->ifindex; |
2034 | rth->u.dst.dev = (out_dev)->dev; | 2034 | rth->dst.dev = (out_dev)->dev; |
2035 | dev_hold(rth->u.dst.dev); | 2035 | dev_hold(rth->dst.dev); |
2036 | rth->idev = in_dev_get(rth->u.dst.dev); | 2036 | rth->idev = in_dev_get(rth->dst.dev); |
2037 | rth->fl.oif = 0; | 2037 | rth->fl.oif = 0; |
2038 | rth->rt_spec_dst= spec_dst; | 2038 | rth->rt_spec_dst= spec_dst; |
2039 | 2039 | ||
2040 | rth->u.dst.obsolete = -1; | 2040 | rth->dst.obsolete = -1; |
2041 | rth->u.dst.input = ip_forward; | 2041 | rth->dst.input = ip_forward; |
2042 | rth->u.dst.output = ip_output; | 2042 | rth->dst.output = ip_output; |
2043 | rth->rt_genid = rt_genid(dev_net(rth->u.dst.dev)); | 2043 | rth->rt_genid = rt_genid(dev_net(rth->dst.dev)); |
2044 | 2044 | ||
2045 | rt_set_nexthop(rth, res, itag); | 2045 | rt_set_nexthop(rth, res, itag); |
2046 | 2046 | ||
@@ -2074,7 +2074,7 @@ static int ip_mkroute_input(struct sk_buff *skb, | |||
2074 | 2074 | ||
2075 | /* put it into the cache */ | 2075 | /* put it into the cache */ |
2076 | hash = rt_hash(daddr, saddr, fl->iif, | 2076 | hash = rt_hash(daddr, saddr, fl->iif, |
2077 | rt_genid(dev_net(rth->u.dst.dev))); | 2077 | rt_genid(dev_net(rth->dst.dev))); |
2078 | return rt_intern_hash(hash, rth, NULL, skb, fl->iif); | 2078 | return rt_intern_hash(hash, rth, NULL, skb, fl->iif); |
2079 | } | 2079 | } |
2080 | 2080 | ||
@@ -2197,14 +2197,14 @@ local_input: | |||
2197 | if (!rth) | 2197 | if (!rth) |
2198 | goto e_nobufs; | 2198 | goto e_nobufs; |
2199 | 2199 | ||
2200 | rth->u.dst.output= ip_rt_bug; | 2200 | rth->dst.output= ip_rt_bug; |
2201 | rth->u.dst.obsolete = -1; | 2201 | rth->dst.obsolete = -1; |
2202 | rth->rt_genid = rt_genid(net); | 2202 | rth->rt_genid = rt_genid(net); |
2203 | 2203 | ||
2204 | atomic_set(&rth->u.dst.__refcnt, 1); | 2204 | atomic_set(&rth->dst.__refcnt, 1); |
2205 | rth->u.dst.flags= DST_HOST; | 2205 | rth->dst.flags= DST_HOST; |
2206 | if (IN_DEV_CONF_GET(in_dev, NOPOLICY)) | 2206 | if (IN_DEV_CONF_GET(in_dev, NOPOLICY)) |
2207 | rth->u.dst.flags |= DST_NOPOLICY; | 2207 | rth->dst.flags |= DST_NOPOLICY; |
2208 | rth->fl.fl4_dst = daddr; | 2208 | rth->fl.fl4_dst = daddr; |
2209 | rth->rt_dst = daddr; | 2209 | rth->rt_dst = daddr; |
2210 | rth->fl.fl4_tos = tos; | 2210 | rth->fl.fl4_tos = tos; |
@@ -2212,20 +2212,20 @@ local_input: | |||
2212 | rth->fl.fl4_src = saddr; | 2212 | rth->fl.fl4_src = saddr; |
2213 | rth->rt_src = saddr; | 2213 | rth->rt_src = saddr; |
2214 | #ifdef CONFIG_NET_CLS_ROUTE | 2214 | #ifdef CONFIG_NET_CLS_ROUTE |
2215 | rth->u.dst.tclassid = itag; | 2215 | rth->dst.tclassid = itag; |
2216 | #endif | 2216 | #endif |
2217 | rth->rt_iif = | 2217 | rth->rt_iif = |
2218 | rth->fl.iif = dev->ifindex; | 2218 | rth->fl.iif = dev->ifindex; |
2219 | rth->u.dst.dev = net->loopback_dev; | 2219 | rth->dst.dev = net->loopback_dev; |
2220 | dev_hold(rth->u.dst.dev); | 2220 | dev_hold(rth->dst.dev); |
2221 | rth->idev = in_dev_get(rth->u.dst.dev); | 2221 | rth->idev = in_dev_get(rth->dst.dev); |
2222 | rth->rt_gateway = daddr; | 2222 | rth->rt_gateway = daddr; |
2223 | rth->rt_spec_dst= spec_dst; | 2223 | rth->rt_spec_dst= spec_dst; |
2224 | rth->u.dst.input= ip_local_deliver; | 2224 | rth->dst.input= ip_local_deliver; |
2225 | rth->rt_flags = flags|RTCF_LOCAL; | 2225 | rth->rt_flags = flags|RTCF_LOCAL; |
2226 | if (res.type == RTN_UNREACHABLE) { | 2226 | if (res.type == RTN_UNREACHABLE) { |
2227 | rth->u.dst.input= ip_error; | 2227 | rth->dst.input= ip_error; |
2228 | rth->u.dst.error= -err; | 2228 | rth->dst.error= -err; |
2229 | rth->rt_flags &= ~RTCF_LOCAL; | 2229 | rth->rt_flags &= ~RTCF_LOCAL; |
2230 | } | 2230 | } |
2231 | rth->rt_type = res.type; | 2231 | rth->rt_type = res.type; |
@@ -2291,21 +2291,21 @@ int ip_route_input_common(struct sk_buff *skb, __be32 daddr, __be32 saddr, | |||
2291 | hash = rt_hash(daddr, saddr, iif, rt_genid(net)); | 2291 | hash = rt_hash(daddr, saddr, iif, rt_genid(net)); |
2292 | 2292 | ||
2293 | for (rth = rcu_dereference(rt_hash_table[hash].chain); rth; | 2293 | for (rth = rcu_dereference(rt_hash_table[hash].chain); rth; |
2294 | rth = rcu_dereference(rth->u.dst.rt_next)) { | 2294 | rth = rcu_dereference(rth->dst.rt_next)) { |
2295 | if ((((__force u32)rth->fl.fl4_dst ^ (__force u32)daddr) | | 2295 | if ((((__force u32)rth->fl.fl4_dst ^ (__force u32)daddr) | |
2296 | ((__force u32)rth->fl.fl4_src ^ (__force u32)saddr) | | 2296 | ((__force u32)rth->fl.fl4_src ^ (__force u32)saddr) | |
2297 | (rth->fl.iif ^ iif) | | 2297 | (rth->fl.iif ^ iif) | |
2298 | rth->fl.oif | | 2298 | rth->fl.oif | |
2299 | (rth->fl.fl4_tos ^ tos)) == 0 && | 2299 | (rth->fl.fl4_tos ^ tos)) == 0 && |
2300 | rth->fl.mark == skb->mark && | 2300 | rth->fl.mark == skb->mark && |
2301 | net_eq(dev_net(rth->u.dst.dev), net) && | 2301 | net_eq(dev_net(rth->dst.dev), net) && |
2302 | !rt_is_expired(rth)) { | 2302 | !rt_is_expired(rth)) { |
2303 | if (noref) { | 2303 | if (noref) { |
2304 | dst_use_noref(&rth->u.dst, jiffies); | 2304 | dst_use_noref(&rth->dst, jiffies); |
2305 | skb_dst_set_noref(skb, &rth->u.dst); | 2305 | skb_dst_set_noref(skb, &rth->dst); |
2306 | } else { | 2306 | } else { |
2307 | dst_use(&rth->u.dst, jiffies); | 2307 | dst_use(&rth->dst, jiffies); |
2308 | skb_dst_set(skb, &rth->u.dst); | 2308 | skb_dst_set(skb, &rth->dst); |
2309 | } | 2309 | } |
2310 | RT_CACHE_STAT_INC(in_hit); | 2310 | RT_CACHE_STAT_INC(in_hit); |
2311 | rcu_read_unlock(); | 2311 | rcu_read_unlock(); |
@@ -2412,12 +2412,12 @@ static int __mkroute_output(struct rtable **result, | |||
2412 | goto cleanup; | 2412 | goto cleanup; |
2413 | } | 2413 | } |
2414 | 2414 | ||
2415 | atomic_set(&rth->u.dst.__refcnt, 1); | 2415 | atomic_set(&rth->dst.__refcnt, 1); |
2416 | rth->u.dst.flags= DST_HOST; | 2416 | rth->dst.flags= DST_HOST; |
2417 | if (IN_DEV_CONF_GET(in_dev, NOXFRM)) | 2417 | if (IN_DEV_CONF_GET(in_dev, NOXFRM)) |
2418 | rth->u.dst.flags |= DST_NOXFRM; | 2418 | rth->dst.flags |= DST_NOXFRM; |
2419 | if (IN_DEV_CONF_GET(in_dev, NOPOLICY)) | 2419 | if (IN_DEV_CONF_GET(in_dev, NOPOLICY)) |
2420 | rth->u.dst.flags |= DST_NOPOLICY; | 2420 | rth->dst.flags |= DST_NOPOLICY; |
2421 | 2421 | ||
2422 | rth->fl.fl4_dst = oldflp->fl4_dst; | 2422 | rth->fl.fl4_dst = oldflp->fl4_dst; |
2423 | rth->fl.fl4_tos = tos; | 2423 | rth->fl.fl4_tos = tos; |
@@ -2429,35 +2429,35 @@ static int __mkroute_output(struct rtable **result, | |||
2429 | rth->rt_iif = oldflp->oif ? : dev_out->ifindex; | 2429 | rth->rt_iif = oldflp->oif ? : dev_out->ifindex; |
2430 | /* get references to the devices that are to be hold by the routing | 2430 | /* get references to the devices that are to be hold by the routing |
2431 | cache entry */ | 2431 | cache entry */ |
2432 | rth->u.dst.dev = dev_out; | 2432 | rth->dst.dev = dev_out; |
2433 | dev_hold(dev_out); | 2433 | dev_hold(dev_out); |
2434 | rth->idev = in_dev_get(dev_out); | 2434 | rth->idev = in_dev_get(dev_out); |
2435 | rth->rt_gateway = fl->fl4_dst; | 2435 | rth->rt_gateway = fl->fl4_dst; |
2436 | rth->rt_spec_dst= fl->fl4_src; | 2436 | rth->rt_spec_dst= fl->fl4_src; |
2437 | 2437 | ||
2438 | rth->u.dst.output=ip_output; | 2438 | rth->dst.output=ip_output; |
2439 | rth->u.dst.obsolete = -1; | 2439 | rth->dst.obsolete = -1; |
2440 | rth->rt_genid = rt_genid(dev_net(dev_out)); | 2440 | rth->rt_genid = rt_genid(dev_net(dev_out)); |
2441 | 2441 | ||
2442 | RT_CACHE_STAT_INC(out_slow_tot); | 2442 | RT_CACHE_STAT_INC(out_slow_tot); |
2443 | 2443 | ||
2444 | if (flags & RTCF_LOCAL) { | 2444 | if (flags & RTCF_LOCAL) { |
2445 | rth->u.dst.input = ip_local_deliver; | 2445 | rth->dst.input = ip_local_deliver; |
2446 | rth->rt_spec_dst = fl->fl4_dst; | 2446 | rth->rt_spec_dst = fl->fl4_dst; |
2447 | } | 2447 | } |
2448 | if (flags & (RTCF_BROADCAST | RTCF_MULTICAST)) { | 2448 | if (flags & (RTCF_BROADCAST | RTCF_MULTICAST)) { |
2449 | rth->rt_spec_dst = fl->fl4_src; | 2449 | rth->rt_spec_dst = fl->fl4_src; |
2450 | if (flags & RTCF_LOCAL && | 2450 | if (flags & RTCF_LOCAL && |
2451 | !(dev_out->flags & IFF_LOOPBACK)) { | 2451 | !(dev_out->flags & IFF_LOOPBACK)) { |
2452 | rth->u.dst.output = ip_mc_output; | 2452 | rth->dst.output = ip_mc_output; |
2453 | RT_CACHE_STAT_INC(out_slow_mc); | 2453 | RT_CACHE_STAT_INC(out_slow_mc); |
2454 | } | 2454 | } |
2455 | #ifdef CONFIG_IP_MROUTE | 2455 | #ifdef CONFIG_IP_MROUTE |
2456 | if (res->type == RTN_MULTICAST) { | 2456 | if (res->type == RTN_MULTICAST) { |
2457 | if (IN_DEV_MFORWARD(in_dev) && | 2457 | if (IN_DEV_MFORWARD(in_dev) && |
2458 | !ipv4_is_local_multicast(oldflp->fl4_dst)) { | 2458 | !ipv4_is_local_multicast(oldflp->fl4_dst)) { |
2459 | rth->u.dst.input = ip_mr_input; | 2459 | rth->dst.input = ip_mr_input; |
2460 | rth->u.dst.output = ip_mc_output; | 2460 | rth->dst.output = ip_mc_output; |
2461 | } | 2461 | } |
2462 | } | 2462 | } |
2463 | #endif | 2463 | #endif |
@@ -2712,7 +2712,7 @@ int __ip_route_output_key(struct net *net, struct rtable **rp, | |||
2712 | 2712 | ||
2713 | rcu_read_lock_bh(); | 2713 | rcu_read_lock_bh(); |
2714 | for (rth = rcu_dereference_bh(rt_hash_table[hash].chain); rth; | 2714 | for (rth = rcu_dereference_bh(rt_hash_table[hash].chain); rth; |
2715 | rth = rcu_dereference_bh(rth->u.dst.rt_next)) { | 2715 | rth = rcu_dereference_bh(rth->dst.rt_next)) { |
2716 | if (rth->fl.fl4_dst == flp->fl4_dst && | 2716 | if (rth->fl.fl4_dst == flp->fl4_dst && |
2717 | rth->fl.fl4_src == flp->fl4_src && | 2717 | rth->fl.fl4_src == flp->fl4_src && |
2718 | rth->fl.iif == 0 && | 2718 | rth->fl.iif == 0 && |
@@ -2720,9 +2720,9 @@ int __ip_route_output_key(struct net *net, struct rtable **rp, | |||
2720 | rth->fl.mark == flp->mark && | 2720 | rth->fl.mark == flp->mark && |
2721 | !((rth->fl.fl4_tos ^ flp->fl4_tos) & | 2721 | !((rth->fl.fl4_tos ^ flp->fl4_tos) & |
2722 | (IPTOS_RT_MASK | RTO_ONLINK)) && | 2722 | (IPTOS_RT_MASK | RTO_ONLINK)) && |
2723 | net_eq(dev_net(rth->u.dst.dev), net) && | 2723 | net_eq(dev_net(rth->dst.dev), net) && |
2724 | !rt_is_expired(rth)) { | 2724 | !rt_is_expired(rth)) { |
2725 | dst_use(&rth->u.dst, jiffies); | 2725 | dst_use(&rth->dst, jiffies); |
2726 | RT_CACHE_STAT_INC(out_hit); | 2726 | RT_CACHE_STAT_INC(out_hit); |
2727 | rcu_read_unlock_bh(); | 2727 | rcu_read_unlock_bh(); |
2728 | *rp = rth; | 2728 | *rp = rth; |
@@ -2759,15 +2759,15 @@ static int ipv4_dst_blackhole(struct net *net, struct rtable **rp, struct flowi | |||
2759 | dst_alloc(&ipv4_dst_blackhole_ops); | 2759 | dst_alloc(&ipv4_dst_blackhole_ops); |
2760 | 2760 | ||
2761 | if (rt) { | 2761 | if (rt) { |
2762 | struct dst_entry *new = &rt->u.dst; | 2762 | struct dst_entry *new = &rt->dst; |
2763 | 2763 | ||
2764 | atomic_set(&new->__refcnt, 1); | 2764 | atomic_set(&new->__refcnt, 1); |
2765 | new->__use = 1; | 2765 | new->__use = 1; |
2766 | new->input = dst_discard; | 2766 | new->input = dst_discard; |
2767 | new->output = dst_discard; | 2767 | new->output = dst_discard; |
2768 | memcpy(new->metrics, ort->u.dst.metrics, RTAX_MAX*sizeof(u32)); | 2768 | memcpy(new->metrics, ort->dst.metrics, RTAX_MAX*sizeof(u32)); |
2769 | 2769 | ||
2770 | new->dev = ort->u.dst.dev; | 2770 | new->dev = ort->dst.dev; |
2771 | if (new->dev) | 2771 | if (new->dev) |
2772 | dev_hold(new->dev); | 2772 | dev_hold(new->dev); |
2773 | 2773 | ||
@@ -2791,7 +2791,7 @@ static int ipv4_dst_blackhole(struct net *net, struct rtable **rp, struct flowi | |||
2791 | dst_free(new); | 2791 | dst_free(new); |
2792 | } | 2792 | } |
2793 | 2793 | ||
2794 | dst_release(&(*rp)->u.dst); | 2794 | dst_release(&(*rp)->dst); |
2795 | *rp = rt; | 2795 | *rp = rt; |
2796 | return (rt ? 0 : -ENOMEM); | 2796 | return (rt ? 0 : -ENOMEM); |
2797 | } | 2797 | } |
@@ -2861,11 +2861,11 @@ static int rt_fill_info(struct net *net, | |||
2861 | r->rtm_src_len = 32; | 2861 | r->rtm_src_len = 32; |
2862 | NLA_PUT_BE32(skb, RTA_SRC, rt->fl.fl4_src); | 2862 | NLA_PUT_BE32(skb, RTA_SRC, rt->fl.fl4_src); |
2863 | } | 2863 | } |
2864 | if (rt->u.dst.dev) | 2864 | if (rt->dst.dev) |
2865 | NLA_PUT_U32(skb, RTA_OIF, rt->u.dst.dev->ifindex); | 2865 | NLA_PUT_U32(skb, RTA_OIF, rt->dst.dev->ifindex); |
2866 | #ifdef CONFIG_NET_CLS_ROUTE | 2866 | #ifdef CONFIG_NET_CLS_ROUTE |
2867 | if (rt->u.dst.tclassid) | 2867 | if (rt->dst.tclassid) |
2868 | NLA_PUT_U32(skb, RTA_FLOW, rt->u.dst.tclassid); | 2868 | NLA_PUT_U32(skb, RTA_FLOW, rt->dst.tclassid); |
2869 | #endif | 2869 | #endif |
2870 | if (rt->fl.iif) | 2870 | if (rt->fl.iif) |
2871 | NLA_PUT_BE32(skb, RTA_PREFSRC, rt->rt_spec_dst); | 2871 | NLA_PUT_BE32(skb, RTA_PREFSRC, rt->rt_spec_dst); |
@@ -2875,11 +2875,11 @@ static int rt_fill_info(struct net *net, | |||
2875 | if (rt->rt_dst != rt->rt_gateway) | 2875 | if (rt->rt_dst != rt->rt_gateway) |
2876 | NLA_PUT_BE32(skb, RTA_GATEWAY, rt->rt_gateway); | 2876 | NLA_PUT_BE32(skb, RTA_GATEWAY, rt->rt_gateway); |
2877 | 2877 | ||
2878 | if (rtnetlink_put_metrics(skb, rt->u.dst.metrics) < 0) | 2878 | if (rtnetlink_put_metrics(skb, rt->dst.metrics) < 0) |
2879 | goto nla_put_failure; | 2879 | goto nla_put_failure; |
2880 | 2880 | ||
2881 | error = rt->u.dst.error; | 2881 | error = rt->dst.error; |
2882 | expires = rt->u.dst.expires ? rt->u.dst.expires - jiffies : 0; | 2882 | expires = rt->dst.expires ? rt->dst.expires - jiffies : 0; |
2883 | if (rt->peer) { | 2883 | if (rt->peer) { |
2884 | id = atomic_read(&rt->peer->ip_id_count) & 0xffff; | 2884 | id = atomic_read(&rt->peer->ip_id_count) & 0xffff; |
2885 | if (rt->peer->tcp_ts_stamp) { | 2885 | if (rt->peer->tcp_ts_stamp) { |
@@ -2911,7 +2911,7 @@ static int rt_fill_info(struct net *net, | |||
2911 | NLA_PUT_U32(skb, RTA_IIF, rt->fl.iif); | 2911 | NLA_PUT_U32(skb, RTA_IIF, rt->fl.iif); |
2912 | } | 2912 | } |
2913 | 2913 | ||
2914 | if (rtnl_put_cacheinfo(skb, &rt->u.dst, id, ts, tsage, | 2914 | if (rtnl_put_cacheinfo(skb, &rt->dst, id, ts, tsage, |
2915 | expires, error) < 0) | 2915 | expires, error) < 0) |
2916 | goto nla_put_failure; | 2916 | goto nla_put_failure; |
2917 | 2917 | ||
@@ -2976,8 +2976,8 @@ static int inet_rtm_getroute(struct sk_buff *in_skb, struct nlmsghdr* nlh, void | |||
2976 | local_bh_enable(); | 2976 | local_bh_enable(); |
2977 | 2977 | ||
2978 | rt = skb_rtable(skb); | 2978 | rt = skb_rtable(skb); |
2979 | if (err == 0 && rt->u.dst.error) | 2979 | if (err == 0 && rt->dst.error) |
2980 | err = -rt->u.dst.error; | 2980 | err = -rt->dst.error; |
2981 | } else { | 2981 | } else { |
2982 | struct flowi fl = { | 2982 | struct flowi fl = { |
2983 | .nl_u = { | 2983 | .nl_u = { |
@@ -2995,7 +2995,7 @@ static int inet_rtm_getroute(struct sk_buff *in_skb, struct nlmsghdr* nlh, void | |||
2995 | if (err) | 2995 | if (err) |
2996 | goto errout_free; | 2996 | goto errout_free; |
2997 | 2997 | ||
2998 | skb_dst_set(skb, &rt->u.dst); | 2998 | skb_dst_set(skb, &rt->dst); |
2999 | if (rtm->rtm_flags & RTM_F_NOTIFY) | 2999 | if (rtm->rtm_flags & RTM_F_NOTIFY) |
3000 | rt->rt_flags |= RTCF_NOTIFY; | 3000 | rt->rt_flags |= RTCF_NOTIFY; |
3001 | 3001 | ||
@@ -3031,12 +3031,12 @@ int ip_rt_dump(struct sk_buff *skb, struct netlink_callback *cb) | |||
3031 | continue; | 3031 | continue; |
3032 | rcu_read_lock_bh(); | 3032 | rcu_read_lock_bh(); |
3033 | for (rt = rcu_dereference_bh(rt_hash_table[h].chain), idx = 0; rt; | 3033 | for (rt = rcu_dereference_bh(rt_hash_table[h].chain), idx = 0; rt; |
3034 | rt = rcu_dereference_bh(rt->u.dst.rt_next), idx++) { | 3034 | rt = rcu_dereference_bh(rt->dst.rt_next), idx++) { |
3035 | if (!net_eq(dev_net(rt->u.dst.dev), net) || idx < s_idx) | 3035 | if (!net_eq(dev_net(rt->dst.dev), net) || idx < s_idx) |
3036 | continue; | 3036 | continue; |
3037 | if (rt_is_expired(rt)) | 3037 | if (rt_is_expired(rt)) |
3038 | continue; | 3038 | continue; |
3039 | skb_dst_set_noref(skb, &rt->u.dst); | 3039 | skb_dst_set_noref(skb, &rt->dst); |
3040 | if (rt_fill_info(net, skb, NETLINK_CB(cb->skb).pid, | 3040 | if (rt_fill_info(net, skb, NETLINK_CB(cb->skb).pid, |
3041 | cb->nlh->nlmsg_seq, RTM_NEWROUTE, | 3041 | cb->nlh->nlmsg_seq, RTM_NEWROUTE, |
3042 | 1, NLM_F_MULTI) <= 0) { | 3042 | 1, NLM_F_MULTI) <= 0) { |
diff --git a/net/ipv4/syncookies.c b/net/ipv4/syncookies.c index 5c48124332de..02bef6aa8b30 100644 --- a/net/ipv4/syncookies.c +++ b/net/ipv4/syncookies.c | |||
@@ -354,15 +354,15 @@ struct sock *cookie_v4_check(struct sock *sk, struct sk_buff *skb, | |||
354 | } | 354 | } |
355 | 355 | ||
356 | /* Try to redo what tcp_v4_send_synack did. */ | 356 | /* Try to redo what tcp_v4_send_synack did. */ |
357 | req->window_clamp = tp->window_clamp ? :dst_metric(&rt->u.dst, RTAX_WINDOW); | 357 | req->window_clamp = tp->window_clamp ? :dst_metric(&rt->dst, RTAX_WINDOW); |
358 | 358 | ||
359 | tcp_select_initial_window(tcp_full_space(sk), req->mss, | 359 | tcp_select_initial_window(tcp_full_space(sk), req->mss, |
360 | &req->rcv_wnd, &req->window_clamp, | 360 | &req->rcv_wnd, &req->window_clamp, |
361 | ireq->wscale_ok, &rcv_wscale, | 361 | ireq->wscale_ok, &rcv_wscale, |
362 | dst_metric(&rt->u.dst, RTAX_INITRWND)); | 362 | dst_metric(&rt->dst, RTAX_INITRWND)); |
363 | 363 | ||
364 | ireq->rcv_wscale = rcv_wscale; | 364 | ireq->rcv_wscale = rcv_wscale; |
365 | 365 | ||
366 | ret = get_cookie_sock(sk, skb, req, &rt->u.dst); | 366 | ret = get_cookie_sock(sk, skb, req, &rt->dst); |
367 | out: return ret; | 367 | out: return ret; |
368 | } | 368 | } |
diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c index 7f976af27bf0..7f9515c0379f 100644 --- a/net/ipv4/tcp_ipv4.c +++ b/net/ipv4/tcp_ipv4.c | |||
@@ -237,7 +237,7 @@ int tcp_v4_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len) | |||
237 | 237 | ||
238 | /* OK, now commit destination to socket. */ | 238 | /* OK, now commit destination to socket. */ |
239 | sk->sk_gso_type = SKB_GSO_TCPV4; | 239 | sk->sk_gso_type = SKB_GSO_TCPV4; |
240 | sk_setup_caps(sk, &rt->u.dst); | 240 | sk_setup_caps(sk, &rt->dst); |
241 | 241 | ||
242 | if (!tp->write_seq) | 242 | if (!tp->write_seq) |
243 | tp->write_seq = secure_tcp_sequence_number(inet->inet_saddr, | 243 | tp->write_seq = secure_tcp_sequence_number(inet->inet_saddr, |
diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c index eec4ff456e33..32e0bef60d0a 100644 --- a/net/ipv4/udp.c +++ b/net/ipv4/udp.c | |||
@@ -914,7 +914,7 @@ int udp_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg, | |||
914 | !sock_flag(sk, SOCK_BROADCAST)) | 914 | !sock_flag(sk, SOCK_BROADCAST)) |
915 | goto out; | 915 | goto out; |
916 | if (connected) | 916 | if (connected) |
917 | sk_dst_set(sk, dst_clone(&rt->u.dst)); | 917 | sk_dst_set(sk, dst_clone(&rt->dst)); |
918 | } | 918 | } |
919 | 919 | ||
920 | if (msg->msg_flags&MSG_CONFIRM) | 920 | if (msg->msg_flags&MSG_CONFIRM) |
@@ -978,7 +978,7 @@ out: | |||
978 | return err; | 978 | return err; |
979 | 979 | ||
980 | do_confirm: | 980 | do_confirm: |
981 | dst_confirm(&rt->u.dst); | 981 | dst_confirm(&rt->dst); |
982 | if (!(msg->msg_flags&MSG_PROBE) || len) | 982 | if (!(msg->msg_flags&MSG_PROBE) || len) |
983 | goto back_from_confirm; | 983 | goto back_from_confirm; |
984 | err = 0; | 984 | err = 0; |
diff --git a/net/ipv4/xfrm4_policy.c b/net/ipv4/xfrm4_policy.c index 1705476670ef..349327092c9e 100644 --- a/net/ipv4/xfrm4_policy.c +++ b/net/ipv4/xfrm4_policy.c | |||
@@ -37,7 +37,7 @@ static struct dst_entry *xfrm4_dst_lookup(struct net *net, int tos, | |||
37 | fl.fl4_src = saddr->a4; | 37 | fl.fl4_src = saddr->a4; |
38 | 38 | ||
39 | err = __ip_route_output_key(net, &rt, &fl); | 39 | err = __ip_route_output_key(net, &rt, &fl); |
40 | dst = &rt->u.dst; | 40 | dst = &rt->dst; |
41 | if (err) | 41 | if (err) |
42 | dst = ERR_PTR(err); | 42 | dst = ERR_PTR(err); |
43 | return dst; | 43 | return dst; |
diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c index e1a698df5706..b97bb1f30808 100644 --- a/net/ipv6/addrconf.c +++ b/net/ipv6/addrconf.c | |||
@@ -557,7 +557,7 @@ void inet6_ifa_finish_destroy(struct inet6_ifaddr *ifp) | |||
557 | pr_warning("Freeing alive inet6 address %p\n", ifp); | 557 | pr_warning("Freeing alive inet6 address %p\n", ifp); |
558 | return; | 558 | return; |
559 | } | 559 | } |
560 | dst_release(&ifp->rt->u.dst); | 560 | dst_release(&ifp->rt->dst); |
561 | 561 | ||
562 | call_rcu(&ifp->rcu, inet6_ifa_finish_destroy_rcu); | 562 | call_rcu(&ifp->rcu, inet6_ifa_finish_destroy_rcu); |
563 | } | 563 | } |
@@ -823,7 +823,7 @@ static void ipv6_del_addr(struct inet6_ifaddr *ifp) | |||
823 | rt->rt6i_flags |= RTF_EXPIRES; | 823 | rt->rt6i_flags |= RTF_EXPIRES; |
824 | } | 824 | } |
825 | } | 825 | } |
826 | dst_release(&rt->u.dst); | 826 | dst_release(&rt->dst); |
827 | } | 827 | } |
828 | 828 | ||
829 | out: | 829 | out: |
@@ -1863,7 +1863,7 @@ void addrconf_prefix_rcv(struct net_device *dev, u8 *opt, int len) | |||
1863 | dev, expires, flags); | 1863 | dev, expires, flags); |
1864 | } | 1864 | } |
1865 | if (rt) | 1865 | if (rt) |
1866 | dst_release(&rt->u.dst); | 1866 | dst_release(&rt->dst); |
1867 | } | 1867 | } |
1868 | 1868 | ||
1869 | /* Try to figure out our local address for this prefix */ | 1869 | /* Try to figure out our local address for this prefix */ |
@@ -4093,11 +4093,11 @@ static void __ipv6_ifa_notify(int event, struct inet6_ifaddr *ifp) | |||
4093 | if (ifp->idev->cnf.forwarding) | 4093 | if (ifp->idev->cnf.forwarding) |
4094 | addrconf_leave_anycast(ifp); | 4094 | addrconf_leave_anycast(ifp); |
4095 | addrconf_leave_solict(ifp->idev, &ifp->addr); | 4095 | addrconf_leave_solict(ifp->idev, &ifp->addr); |
4096 | dst_hold(&ifp->rt->u.dst); | 4096 | dst_hold(&ifp->rt->dst); |
4097 | 4097 | ||
4098 | if (ifp->state == INET6_IFADDR_STATE_DEAD && | 4098 | if (ifp->state == INET6_IFADDR_STATE_DEAD && |
4099 | ip6_del_rt(ifp->rt)) | 4099 | ip6_del_rt(ifp->rt)) |
4100 | dst_free(&ifp->rt->u.dst); | 4100 | dst_free(&ifp->rt->dst); |
4101 | break; | 4101 | break; |
4102 | } | 4102 | } |
4103 | } | 4103 | } |
diff --git a/net/ipv6/anycast.c b/net/ipv6/anycast.c index f058fbd808c8..0e5e943446f0 100644 --- a/net/ipv6/anycast.c +++ b/net/ipv6/anycast.c | |||
@@ -84,7 +84,7 @@ int ipv6_sock_ac_join(struct sock *sk, int ifindex, struct in6_addr *addr) | |||
84 | rt = rt6_lookup(net, addr, NULL, 0, 0); | 84 | rt = rt6_lookup(net, addr, NULL, 0, 0); |
85 | if (rt) { | 85 | if (rt) { |
86 | dev = rt->rt6i_dev; | 86 | dev = rt->rt6i_dev; |
87 | dst_release(&rt->u.dst); | 87 | dst_release(&rt->dst); |
88 | } else if (ishost) { | 88 | } else if (ishost) { |
89 | err = -EADDRNOTAVAIL; | 89 | err = -EADDRNOTAVAIL; |
90 | goto error; | 90 | goto error; |
@@ -244,7 +244,7 @@ static void aca_put(struct ifacaddr6 *ac) | |||
244 | { | 244 | { |
245 | if (atomic_dec_and_test(&ac->aca_refcnt)) { | 245 | if (atomic_dec_and_test(&ac->aca_refcnt)) { |
246 | in6_dev_put(ac->aca_idev); | 246 | in6_dev_put(ac->aca_idev); |
247 | dst_release(&ac->aca_rt->u.dst); | 247 | dst_release(&ac->aca_rt->dst); |
248 | kfree(ac); | 248 | kfree(ac); |
249 | } | 249 | } |
250 | } | 250 | } |
@@ -350,7 +350,7 @@ int __ipv6_dev_ac_dec(struct inet6_dev *idev, struct in6_addr *addr) | |||
350 | write_unlock_bh(&idev->lock); | 350 | write_unlock_bh(&idev->lock); |
351 | addrconf_leave_solict(idev, &aca->aca_addr); | 351 | addrconf_leave_solict(idev, &aca->aca_addr); |
352 | 352 | ||
353 | dst_hold(&aca->aca_rt->u.dst); | 353 | dst_hold(&aca->aca_rt->dst); |
354 | ip6_del_rt(aca->aca_rt); | 354 | ip6_del_rt(aca->aca_rt); |
355 | 355 | ||
356 | aca_put(aca); | 356 | aca_put(aca); |
diff --git a/net/ipv6/fib6_rules.c b/net/ipv6/fib6_rules.c index 8e44f8f9c188..b1108ede18e1 100644 --- a/net/ipv6/fib6_rules.c +++ b/net/ipv6/fib6_rules.c | |||
@@ -43,8 +43,8 @@ struct dst_entry *fib6_rule_lookup(struct net *net, struct flowi *fl, | |||
43 | if (arg.result) | 43 | if (arg.result) |
44 | return arg.result; | 44 | return arg.result; |
45 | 45 | ||
46 | dst_hold(&net->ipv6.ip6_null_entry->u.dst); | 46 | dst_hold(&net->ipv6.ip6_null_entry->dst); |
47 | return &net->ipv6.ip6_null_entry->u.dst; | 47 | return &net->ipv6.ip6_null_entry->dst; |
48 | } | 48 | } |
49 | 49 | ||
50 | static int fib6_rule_action(struct fib_rule *rule, struct flowi *flp, | 50 | static int fib6_rule_action(struct fib_rule *rule, struct flowi *flp, |
@@ -86,7 +86,7 @@ static int fib6_rule_action(struct fib_rule *rule, struct flowi *flp, | |||
86 | struct in6_addr saddr; | 86 | struct in6_addr saddr; |
87 | 87 | ||
88 | if (ipv6_dev_get_saddr(net, | 88 | if (ipv6_dev_get_saddr(net, |
89 | ip6_dst_idev(&rt->u.dst)->dev, | 89 | ip6_dst_idev(&rt->dst)->dev, |
90 | &flp->fl6_dst, | 90 | &flp->fl6_dst, |
91 | rt6_flags2srcprefs(flags), | 91 | rt6_flags2srcprefs(flags), |
92 | &saddr)) | 92 | &saddr)) |
@@ -99,12 +99,12 @@ static int fib6_rule_action(struct fib_rule *rule, struct flowi *flp, | |||
99 | goto out; | 99 | goto out; |
100 | } | 100 | } |
101 | again: | 101 | again: |
102 | dst_release(&rt->u.dst); | 102 | dst_release(&rt->dst); |
103 | rt = NULL; | 103 | rt = NULL; |
104 | goto out; | 104 | goto out; |
105 | 105 | ||
106 | discard_pkt: | 106 | discard_pkt: |
107 | dst_hold(&rt->u.dst); | 107 | dst_hold(&rt->dst); |
108 | out: | 108 | out: |
109 | arg->result = rt; | 109 | arg->result = rt; |
110 | return rt == NULL ? -EAGAIN : 0; | 110 | return rt == NULL ? -EAGAIN : 0; |
diff --git a/net/ipv6/ip6_fib.c b/net/ipv6/ip6_fib.c index 92a122b7795d..b6a585909d35 100644 --- a/net/ipv6/ip6_fib.c +++ b/net/ipv6/ip6_fib.c | |||
@@ -165,7 +165,7 @@ static __inline__ void node_free(struct fib6_node * fn) | |||
165 | static __inline__ void rt6_release(struct rt6_info *rt) | 165 | static __inline__ void rt6_release(struct rt6_info *rt) |
166 | { | 166 | { |
167 | if (atomic_dec_and_test(&rt->rt6i_ref)) | 167 | if (atomic_dec_and_test(&rt->rt6i_ref)) |
168 | dst_free(&rt->u.dst); | 168 | dst_free(&rt->dst); |
169 | } | 169 | } |
170 | 170 | ||
171 | static void fib6_link_table(struct net *net, struct fib6_table *tb) | 171 | static void fib6_link_table(struct net *net, struct fib6_table *tb) |
@@ -278,7 +278,7 @@ static int fib6_dump_node(struct fib6_walker_t *w) | |||
278 | int res; | 278 | int res; |
279 | struct rt6_info *rt; | 279 | struct rt6_info *rt; |
280 | 280 | ||
281 | for (rt = w->leaf; rt; rt = rt->u.dst.rt6_next) { | 281 | for (rt = w->leaf; rt; rt = rt->dst.rt6_next) { |
282 | res = rt6_dump_route(rt, w->args); | 282 | res = rt6_dump_route(rt, w->args); |
283 | if (res < 0) { | 283 | if (res < 0) { |
284 | /* Frame is full, suspend walking */ | 284 | /* Frame is full, suspend walking */ |
@@ -619,7 +619,7 @@ static int fib6_add_rt2node(struct fib6_node *fn, struct rt6_info *rt, | |||
619 | 619 | ||
620 | ins = &fn->leaf; | 620 | ins = &fn->leaf; |
621 | 621 | ||
622 | for (iter = fn->leaf; iter; iter=iter->u.dst.rt6_next) { | 622 | for (iter = fn->leaf; iter; iter=iter->dst.rt6_next) { |
623 | /* | 623 | /* |
624 | * Search for duplicates | 624 | * Search for duplicates |
625 | */ | 625 | */ |
@@ -647,7 +647,7 @@ static int fib6_add_rt2node(struct fib6_node *fn, struct rt6_info *rt, | |||
647 | if (iter->rt6i_metric > rt->rt6i_metric) | 647 | if (iter->rt6i_metric > rt->rt6i_metric) |
648 | break; | 648 | break; |
649 | 649 | ||
650 | ins = &iter->u.dst.rt6_next; | 650 | ins = &iter->dst.rt6_next; |
651 | } | 651 | } |
652 | 652 | ||
653 | /* Reset round-robin state, if necessary */ | 653 | /* Reset round-robin state, if necessary */ |
@@ -658,7 +658,7 @@ static int fib6_add_rt2node(struct fib6_node *fn, struct rt6_info *rt, | |||
658 | * insert node | 658 | * insert node |
659 | */ | 659 | */ |
660 | 660 | ||
661 | rt->u.dst.rt6_next = iter; | 661 | rt->dst.rt6_next = iter; |
662 | *ins = rt; | 662 | *ins = rt; |
663 | rt->rt6i_node = fn; | 663 | rt->rt6i_node = fn; |
664 | atomic_inc(&rt->rt6i_ref); | 664 | atomic_inc(&rt->rt6i_ref); |
@@ -799,7 +799,7 @@ out: | |||
799 | atomic_inc(&pn->leaf->rt6i_ref); | 799 | atomic_inc(&pn->leaf->rt6i_ref); |
800 | } | 800 | } |
801 | #endif | 801 | #endif |
802 | dst_free(&rt->u.dst); | 802 | dst_free(&rt->dst); |
803 | } | 803 | } |
804 | return err; | 804 | return err; |
805 | 805 | ||
@@ -810,7 +810,7 @@ out: | |||
810 | st_failure: | 810 | st_failure: |
811 | if (fn && !(fn->fn_flags & (RTN_RTINFO|RTN_ROOT))) | 811 | if (fn && !(fn->fn_flags & (RTN_RTINFO|RTN_ROOT))) |
812 | fib6_repair_tree(info->nl_net, fn); | 812 | fib6_repair_tree(info->nl_net, fn); |
813 | dst_free(&rt->u.dst); | 813 | dst_free(&rt->dst); |
814 | return err; | 814 | return err; |
815 | #endif | 815 | #endif |
816 | } | 816 | } |
@@ -1108,7 +1108,7 @@ static void fib6_del_route(struct fib6_node *fn, struct rt6_info **rtp, | |||
1108 | RT6_TRACE("fib6_del_route\n"); | 1108 | RT6_TRACE("fib6_del_route\n"); |
1109 | 1109 | ||
1110 | /* Unlink it */ | 1110 | /* Unlink it */ |
1111 | *rtp = rt->u.dst.rt6_next; | 1111 | *rtp = rt->dst.rt6_next; |
1112 | rt->rt6i_node = NULL; | 1112 | rt->rt6i_node = NULL; |
1113 | net->ipv6.rt6_stats->fib_rt_entries--; | 1113 | net->ipv6.rt6_stats->fib_rt_entries--; |
1114 | net->ipv6.rt6_stats->fib_discarded_routes++; | 1114 | net->ipv6.rt6_stats->fib_discarded_routes++; |
@@ -1122,14 +1122,14 @@ static void fib6_del_route(struct fib6_node *fn, struct rt6_info **rtp, | |||
1122 | FOR_WALKERS(w) { | 1122 | FOR_WALKERS(w) { |
1123 | if (w->state == FWS_C && w->leaf == rt) { | 1123 | if (w->state == FWS_C && w->leaf == rt) { |
1124 | RT6_TRACE("walker %p adjusted by delroute\n", w); | 1124 | RT6_TRACE("walker %p adjusted by delroute\n", w); |
1125 | w->leaf = rt->u.dst.rt6_next; | 1125 | w->leaf = rt->dst.rt6_next; |
1126 | if (w->leaf == NULL) | 1126 | if (w->leaf == NULL) |
1127 | w->state = FWS_U; | 1127 | w->state = FWS_U; |
1128 | } | 1128 | } |
1129 | } | 1129 | } |
1130 | read_unlock(&fib6_walker_lock); | 1130 | read_unlock(&fib6_walker_lock); |
1131 | 1131 | ||
1132 | rt->u.dst.rt6_next = NULL; | 1132 | rt->dst.rt6_next = NULL; |
1133 | 1133 | ||
1134 | /* If it was last route, expunge its radix tree node */ | 1134 | /* If it was last route, expunge its radix tree node */ |
1135 | if (fn->leaf == NULL) { | 1135 | if (fn->leaf == NULL) { |
@@ -1168,7 +1168,7 @@ int fib6_del(struct rt6_info *rt, struct nl_info *info) | |||
1168 | struct rt6_info **rtp; | 1168 | struct rt6_info **rtp; |
1169 | 1169 | ||
1170 | #if RT6_DEBUG >= 2 | 1170 | #if RT6_DEBUG >= 2 |
1171 | if (rt->u.dst.obsolete>0) { | 1171 | if (rt->dst.obsolete>0) { |
1172 | WARN_ON(fn != NULL); | 1172 | WARN_ON(fn != NULL); |
1173 | return -ENOENT; | 1173 | return -ENOENT; |
1174 | } | 1174 | } |
@@ -1195,7 +1195,7 @@ int fib6_del(struct rt6_info *rt, struct nl_info *info) | |||
1195 | * Walk the leaf entries looking for ourself | 1195 | * Walk the leaf entries looking for ourself |
1196 | */ | 1196 | */ |
1197 | 1197 | ||
1198 | for (rtp = &fn->leaf; *rtp; rtp = &(*rtp)->u.dst.rt6_next) { | 1198 | for (rtp = &fn->leaf; *rtp; rtp = &(*rtp)->dst.rt6_next) { |
1199 | if (*rtp == rt) { | 1199 | if (*rtp == rt) { |
1200 | fib6_del_route(fn, rtp, info); | 1200 | fib6_del_route(fn, rtp, info); |
1201 | return 0; | 1201 | return 0; |
@@ -1334,7 +1334,7 @@ static int fib6_clean_node(struct fib6_walker_t *w) | |||
1334 | .nl_net = c->net, | 1334 | .nl_net = c->net, |
1335 | }; | 1335 | }; |
1336 | 1336 | ||
1337 | for (rt = w->leaf; rt; rt = rt->u.dst.rt6_next) { | 1337 | for (rt = w->leaf; rt; rt = rt->dst.rt6_next) { |
1338 | res = c->func(rt, c->arg); | 1338 | res = c->func(rt, c->arg); |
1339 | if (res < 0) { | 1339 | if (res < 0) { |
1340 | w->leaf = rt; | 1340 | w->leaf = rt; |
@@ -1448,8 +1448,8 @@ static int fib6_age(struct rt6_info *rt, void *arg) | |||
1448 | } | 1448 | } |
1449 | gc_args.more++; | 1449 | gc_args.more++; |
1450 | } else if (rt->rt6i_flags & RTF_CACHE) { | 1450 | } else if (rt->rt6i_flags & RTF_CACHE) { |
1451 | if (atomic_read(&rt->u.dst.__refcnt) == 0 && | 1451 | if (atomic_read(&rt->dst.__refcnt) == 0 && |
1452 | time_after_eq(now, rt->u.dst.lastuse + gc_args.timeout)) { | 1452 | time_after_eq(now, rt->dst.lastuse + gc_args.timeout)) { |
1453 | RT6_TRACE("aging clone %p\n", rt); | 1453 | RT6_TRACE("aging clone %p\n", rt); |
1454 | return -1; | 1454 | return -1; |
1455 | } else if ((rt->rt6i_flags & RTF_GATEWAY) && | 1455 | } else if ((rt->rt6i_flags & RTF_GATEWAY) && |
diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c index 89425af0684c..d40b330c0ee6 100644 --- a/net/ipv6/ip6_output.c +++ b/net/ipv6/ip6_output.c | |||
@@ -698,7 +698,7 @@ static int ip6_fragment(struct sk_buff *skb, int (*output)(struct sk_buff *)) | |||
698 | ipv6_hdr(skb)->payload_len = htons(first_len - | 698 | ipv6_hdr(skb)->payload_len = htons(first_len - |
699 | sizeof(struct ipv6hdr)); | 699 | sizeof(struct ipv6hdr)); |
700 | 700 | ||
701 | dst_hold(&rt->u.dst); | 701 | dst_hold(&rt->dst); |
702 | 702 | ||
703 | for (;;) { | 703 | for (;;) { |
704 | /* Prepare header of the next frame, | 704 | /* Prepare header of the next frame, |
@@ -726,7 +726,7 @@ static int ip6_fragment(struct sk_buff *skb, int (*output)(struct sk_buff *)) | |||
726 | 726 | ||
727 | err = output(skb); | 727 | err = output(skb); |
728 | if(!err) | 728 | if(!err) |
729 | IP6_INC_STATS(net, ip6_dst_idev(&rt->u.dst), | 729 | IP6_INC_STATS(net, ip6_dst_idev(&rt->dst), |
730 | IPSTATS_MIB_FRAGCREATES); | 730 | IPSTATS_MIB_FRAGCREATES); |
731 | 731 | ||
732 | if (err || !frag) | 732 | if (err || !frag) |
@@ -740,9 +740,9 @@ static int ip6_fragment(struct sk_buff *skb, int (*output)(struct sk_buff *)) | |||
740 | kfree(tmp_hdr); | 740 | kfree(tmp_hdr); |
741 | 741 | ||
742 | if (err == 0) { | 742 | if (err == 0) { |
743 | IP6_INC_STATS(net, ip6_dst_idev(&rt->u.dst), | 743 | IP6_INC_STATS(net, ip6_dst_idev(&rt->dst), |
744 | IPSTATS_MIB_FRAGOKS); | 744 | IPSTATS_MIB_FRAGOKS); |
745 | dst_release(&rt->u.dst); | 745 | dst_release(&rt->dst); |
746 | return 0; | 746 | return 0; |
747 | } | 747 | } |
748 | 748 | ||
@@ -752,9 +752,9 @@ static int ip6_fragment(struct sk_buff *skb, int (*output)(struct sk_buff *)) | |||
752 | frag = skb; | 752 | frag = skb; |
753 | } | 753 | } |
754 | 754 | ||
755 | IP6_INC_STATS(net, ip6_dst_idev(&rt->u.dst), | 755 | IP6_INC_STATS(net, ip6_dst_idev(&rt->dst), |
756 | IPSTATS_MIB_FRAGFAILS); | 756 | IPSTATS_MIB_FRAGFAILS); |
757 | dst_release(&rt->u.dst); | 757 | dst_release(&rt->dst); |
758 | return err; | 758 | return err; |
759 | } | 759 | } |
760 | 760 | ||
@@ -785,7 +785,7 @@ slow_path: | |||
785 | * Allocate buffer. | 785 | * Allocate buffer. |
786 | */ | 786 | */ |
787 | 787 | ||
788 | if ((frag = alloc_skb(len+hlen+sizeof(struct frag_hdr)+LL_ALLOCATED_SPACE(rt->u.dst.dev), GFP_ATOMIC)) == NULL) { | 788 | if ((frag = alloc_skb(len+hlen+sizeof(struct frag_hdr)+LL_ALLOCATED_SPACE(rt->dst.dev), GFP_ATOMIC)) == NULL) { |
789 | NETDEBUG(KERN_INFO "IPv6: frag: no memory for new fragment!\n"); | 789 | NETDEBUG(KERN_INFO "IPv6: frag: no memory for new fragment!\n"); |
790 | IP6_INC_STATS(net, ip6_dst_idev(skb_dst(skb)), | 790 | IP6_INC_STATS(net, ip6_dst_idev(skb_dst(skb)), |
791 | IPSTATS_MIB_FRAGFAILS); | 791 | IPSTATS_MIB_FRAGFAILS); |
@@ -798,7 +798,7 @@ slow_path: | |||
798 | */ | 798 | */ |
799 | 799 | ||
800 | ip6_copy_metadata(frag, skb); | 800 | ip6_copy_metadata(frag, skb); |
801 | skb_reserve(frag, LL_RESERVED_SPACE(rt->u.dst.dev)); | 801 | skb_reserve(frag, LL_RESERVED_SPACE(rt->dst.dev)); |
802 | skb_put(frag, len + hlen + sizeof(struct frag_hdr)); | 802 | skb_put(frag, len + hlen + sizeof(struct frag_hdr)); |
803 | skb_reset_network_header(frag); | 803 | skb_reset_network_header(frag); |
804 | fh = (struct frag_hdr *)(skb_network_header(frag) + hlen); | 804 | fh = (struct frag_hdr *)(skb_network_header(frag) + hlen); |
@@ -1156,24 +1156,24 @@ int ip6_append_data(struct sock *sk, int getfrag(void *from, char *to, | |||
1156 | 1156 | ||
1157 | /* need source address above miyazawa*/ | 1157 | /* need source address above miyazawa*/ |
1158 | } | 1158 | } |
1159 | dst_hold(&rt->u.dst); | 1159 | dst_hold(&rt->dst); |
1160 | inet->cork.dst = &rt->u.dst; | 1160 | inet->cork.dst = &rt->dst; |
1161 | inet->cork.fl = *fl; | 1161 | inet->cork.fl = *fl; |
1162 | np->cork.hop_limit = hlimit; | 1162 | np->cork.hop_limit = hlimit; |
1163 | np->cork.tclass = tclass; | 1163 | np->cork.tclass = tclass; |
1164 | mtu = np->pmtudisc == IPV6_PMTUDISC_PROBE ? | 1164 | mtu = np->pmtudisc == IPV6_PMTUDISC_PROBE ? |
1165 | rt->u.dst.dev->mtu : dst_mtu(rt->u.dst.path); | 1165 | rt->dst.dev->mtu : dst_mtu(rt->dst.path); |
1166 | if (np->frag_size < mtu) { | 1166 | if (np->frag_size < mtu) { |
1167 | if (np->frag_size) | 1167 | if (np->frag_size) |
1168 | mtu = np->frag_size; | 1168 | mtu = np->frag_size; |
1169 | } | 1169 | } |
1170 | inet->cork.fragsize = mtu; | 1170 | inet->cork.fragsize = mtu; |
1171 | if (dst_allfrag(rt->u.dst.path)) | 1171 | if (dst_allfrag(rt->dst.path)) |
1172 | inet->cork.flags |= IPCORK_ALLFRAG; | 1172 | inet->cork.flags |= IPCORK_ALLFRAG; |
1173 | inet->cork.length = 0; | 1173 | inet->cork.length = 0; |
1174 | sk->sk_sndmsg_page = NULL; | 1174 | sk->sk_sndmsg_page = NULL; |
1175 | sk->sk_sndmsg_off = 0; | 1175 | sk->sk_sndmsg_off = 0; |
1176 | exthdrlen = rt->u.dst.header_len + (opt ? opt->opt_flen : 0) - | 1176 | exthdrlen = rt->dst.header_len + (opt ? opt->opt_flen : 0) - |
1177 | rt->rt6i_nfheader_len; | 1177 | rt->rt6i_nfheader_len; |
1178 | length += exthdrlen; | 1178 | length += exthdrlen; |
1179 | transhdrlen += exthdrlen; | 1179 | transhdrlen += exthdrlen; |
@@ -1186,7 +1186,7 @@ int ip6_append_data(struct sock *sk, int getfrag(void *from, char *to, | |||
1186 | mtu = inet->cork.fragsize; | 1186 | mtu = inet->cork.fragsize; |
1187 | } | 1187 | } |
1188 | 1188 | ||
1189 | hh_len = LL_RESERVED_SPACE(rt->u.dst.dev); | 1189 | hh_len = LL_RESERVED_SPACE(rt->dst.dev); |
1190 | 1190 | ||
1191 | fragheaderlen = sizeof(struct ipv6hdr) + rt->rt6i_nfheader_len + | 1191 | fragheaderlen = sizeof(struct ipv6hdr) + rt->rt6i_nfheader_len + |
1192 | (opt ? opt->opt_nflen : 0); | 1192 | (opt ? opt->opt_nflen : 0); |
@@ -1224,7 +1224,7 @@ int ip6_append_data(struct sock *sk, int getfrag(void *from, char *to, | |||
1224 | } | 1224 | } |
1225 | 1225 | ||
1226 | if (proto == IPPROTO_UDP && | 1226 | if (proto == IPPROTO_UDP && |
1227 | (rt->u.dst.dev->features & NETIF_F_UFO)) { | 1227 | (rt->dst.dev->features & NETIF_F_UFO)) { |
1228 | 1228 | ||
1229 | err = ip6_ufo_append_data(sk, getfrag, from, length, | 1229 | err = ip6_ufo_append_data(sk, getfrag, from, length, |
1230 | hh_len, fragheaderlen, | 1230 | hh_len, fragheaderlen, |
@@ -1270,7 +1270,7 @@ alloc_new_skb: | |||
1270 | 1270 | ||
1271 | fraglen = datalen + fragheaderlen; | 1271 | fraglen = datalen + fragheaderlen; |
1272 | if ((flags & MSG_MORE) && | 1272 | if ((flags & MSG_MORE) && |
1273 | !(rt->u.dst.dev->features&NETIF_F_SG)) | 1273 | !(rt->dst.dev->features&NETIF_F_SG)) |
1274 | alloclen = mtu; | 1274 | alloclen = mtu; |
1275 | else | 1275 | else |
1276 | alloclen = datalen + fragheaderlen; | 1276 | alloclen = datalen + fragheaderlen; |
@@ -1281,7 +1281,7 @@ alloc_new_skb: | |||
1281 | * because we have no idea if we're the last one. | 1281 | * because we have no idea if we're the last one. |
1282 | */ | 1282 | */ |
1283 | if (datalen == length + fraggap) | 1283 | if (datalen == length + fraggap) |
1284 | alloclen += rt->u.dst.trailer_len; | 1284 | alloclen += rt->dst.trailer_len; |
1285 | 1285 | ||
1286 | /* | 1286 | /* |
1287 | * We just reserve space for fragment header. | 1287 | * We just reserve space for fragment header. |
@@ -1358,7 +1358,7 @@ alloc_new_skb: | |||
1358 | if (copy > length) | 1358 | if (copy > length) |
1359 | copy = length; | 1359 | copy = length; |
1360 | 1360 | ||
1361 | if (!(rt->u.dst.dev->features&NETIF_F_SG)) { | 1361 | if (!(rt->dst.dev->features&NETIF_F_SG)) { |
1362 | unsigned int off; | 1362 | unsigned int off; |
1363 | 1363 | ||
1364 | off = skb->len; | 1364 | off = skb->len; |
@@ -1503,7 +1503,7 @@ int ip6_push_pending_frames(struct sock *sk) | |||
1503 | skb->priority = sk->sk_priority; | 1503 | skb->priority = sk->sk_priority; |
1504 | skb->mark = sk->sk_mark; | 1504 | skb->mark = sk->sk_mark; |
1505 | 1505 | ||
1506 | skb_dst_set(skb, dst_clone(&rt->u.dst)); | 1506 | skb_dst_set(skb, dst_clone(&rt->dst)); |
1507 | IP6_UPD_PO_STATS(net, rt->rt6i_idev, IPSTATS_MIB_OUT, skb->len); | 1507 | IP6_UPD_PO_STATS(net, rt->rt6i_idev, IPSTATS_MIB_OUT, skb->len); |
1508 | if (proto == IPPROTO_ICMPV6) { | 1508 | if (proto == IPPROTO_ICMPV6) { |
1509 | struct inet6_dev *idev = ip6_dst_idev(skb_dst(skb)); | 1509 | struct inet6_dev *idev = ip6_dst_idev(skb_dst(skb)); |
diff --git a/net/ipv6/ip6_tunnel.c b/net/ipv6/ip6_tunnel.c index 8f39893d8081..0fd027f3f47e 100644 --- a/net/ipv6/ip6_tunnel.c +++ b/net/ipv6/ip6_tunnel.c | |||
@@ -552,7 +552,7 @@ ip4ip6_err(struct sk_buff *skb, struct inet6_skb_parm *opt, | |||
552 | if (ip_route_output_key(dev_net(skb->dev), &rt, &fl)) | 552 | if (ip_route_output_key(dev_net(skb->dev), &rt, &fl)) |
553 | goto out; | 553 | goto out; |
554 | 554 | ||
555 | skb2->dev = rt->u.dst.dev; | 555 | skb2->dev = rt->dst.dev; |
556 | 556 | ||
557 | /* route "incoming" packet */ | 557 | /* route "incoming" packet */ |
558 | if (rt->rt_flags & RTCF_LOCAL) { | 558 | if (rt->rt_flags & RTCF_LOCAL) { |
@@ -562,7 +562,7 @@ ip4ip6_err(struct sk_buff *skb, struct inet6_skb_parm *opt, | |||
562 | fl.fl4_src = eiph->saddr; | 562 | fl.fl4_src = eiph->saddr; |
563 | fl.fl4_tos = eiph->tos; | 563 | fl.fl4_tos = eiph->tos; |
564 | if (ip_route_output_key(dev_net(skb->dev), &rt, &fl) || | 564 | if (ip_route_output_key(dev_net(skb->dev), &rt, &fl) || |
565 | rt->u.dst.dev->type != ARPHRD_TUNNEL) { | 565 | rt->dst.dev->type != ARPHRD_TUNNEL) { |
566 | ip_rt_put(rt); | 566 | ip_rt_put(rt); |
567 | goto out; | 567 | goto out; |
568 | } | 568 | } |
@@ -626,7 +626,7 @@ ip6ip6_err(struct sk_buff *skb, struct inet6_skb_parm *opt, | |||
626 | icmpv6_send(skb2, rel_type, rel_code, rel_info); | 626 | icmpv6_send(skb2, rel_type, rel_code, rel_info); |
627 | 627 | ||
628 | if (rt) | 628 | if (rt) |
629 | dst_release(&rt->u.dst); | 629 | dst_release(&rt->dst); |
630 | 630 | ||
631 | kfree_skb(skb2); | 631 | kfree_skb(skb2); |
632 | } | 632 | } |
@@ -1135,7 +1135,7 @@ static void ip6_tnl_link_config(struct ip6_tnl *t) | |||
1135 | if (dev->mtu < IPV6_MIN_MTU) | 1135 | if (dev->mtu < IPV6_MIN_MTU) |
1136 | dev->mtu = IPV6_MIN_MTU; | 1136 | dev->mtu = IPV6_MIN_MTU; |
1137 | } | 1137 | } |
1138 | dst_release(&rt->u.dst); | 1138 | dst_release(&rt->dst); |
1139 | } | 1139 | } |
1140 | } | 1140 | } |
1141 | 1141 | ||
diff --git a/net/ipv6/mcast.c b/net/ipv6/mcast.c index 3e36d1538b6e..d1444b95ad7e 100644 --- a/net/ipv6/mcast.c +++ b/net/ipv6/mcast.c | |||
@@ -158,7 +158,7 @@ int ipv6_sock_mc_join(struct sock *sk, int ifindex, const struct in6_addr *addr) | |||
158 | rt = rt6_lookup(net, addr, NULL, 0, 0); | 158 | rt = rt6_lookup(net, addr, NULL, 0, 0); |
159 | if (rt) { | 159 | if (rt) { |
160 | dev = rt->rt6i_dev; | 160 | dev = rt->rt6i_dev; |
161 | dst_release(&rt->u.dst); | 161 | dst_release(&rt->dst); |
162 | } | 162 | } |
163 | } else | 163 | } else |
164 | dev = dev_get_by_index_rcu(net, ifindex); | 164 | dev = dev_get_by_index_rcu(net, ifindex); |
@@ -248,7 +248,7 @@ static struct inet6_dev *ip6_mc_find_dev_rcu(struct net *net, | |||
248 | if (rt) { | 248 | if (rt) { |
249 | dev = rt->rt6i_dev; | 249 | dev = rt->rt6i_dev; |
250 | dev_hold(dev); | 250 | dev_hold(dev); |
251 | dst_release(&rt->u.dst); | 251 | dst_release(&rt->dst); |
252 | } | 252 | } |
253 | } else | 253 | } else |
254 | dev = dev_get_by_index_rcu(net, ifindex); | 254 | dev = dev_get_by_index_rcu(net, ifindex); |
diff --git a/net/ipv6/ndisc.c b/net/ipv6/ndisc.c index 0abdc242ddb7..1fc46fc60efd 100644 --- a/net/ipv6/ndisc.c +++ b/net/ipv6/ndisc.c | |||
@@ -1229,7 +1229,7 @@ static void ndisc_router_discovery(struct sk_buff *skb) | |||
1229 | ND_PRINTK0(KERN_ERR | 1229 | ND_PRINTK0(KERN_ERR |
1230 | "ICMPv6 RA: %s() got default router without neighbour.\n", | 1230 | "ICMPv6 RA: %s() got default router without neighbour.\n", |
1231 | __func__); | 1231 | __func__); |
1232 | dst_release(&rt->u.dst); | 1232 | dst_release(&rt->dst); |
1233 | in6_dev_put(in6_dev); | 1233 | in6_dev_put(in6_dev); |
1234 | return; | 1234 | return; |
1235 | } | 1235 | } |
@@ -1244,7 +1244,7 @@ static void ndisc_router_discovery(struct sk_buff *skb) | |||
1244 | if (ra_msg->icmph.icmp6_hop_limit) { | 1244 | if (ra_msg->icmph.icmp6_hop_limit) { |
1245 | in6_dev->cnf.hop_limit = ra_msg->icmph.icmp6_hop_limit; | 1245 | in6_dev->cnf.hop_limit = ra_msg->icmph.icmp6_hop_limit; |
1246 | if (rt) | 1246 | if (rt) |
1247 | rt->u.dst.metrics[RTAX_HOPLIMIT-1] = ra_msg->icmph.icmp6_hop_limit; | 1247 | rt->dst.metrics[RTAX_HOPLIMIT-1] = ra_msg->icmph.icmp6_hop_limit; |
1248 | } | 1248 | } |
1249 | 1249 | ||
1250 | skip_defrtr: | 1250 | skip_defrtr: |
@@ -1363,7 +1363,7 @@ skip_linkparms: | |||
1363 | in6_dev->cnf.mtu6 = mtu; | 1363 | in6_dev->cnf.mtu6 = mtu; |
1364 | 1364 | ||
1365 | if (rt) | 1365 | if (rt) |
1366 | rt->u.dst.metrics[RTAX_MTU-1] = mtu; | 1366 | rt->dst.metrics[RTAX_MTU-1] = mtu; |
1367 | 1367 | ||
1368 | rt6_mtu_change(skb->dev, mtu); | 1368 | rt6_mtu_change(skb->dev, mtu); |
1369 | } | 1369 | } |
@@ -1384,7 +1384,7 @@ skip_linkparms: | |||
1384 | } | 1384 | } |
1385 | out: | 1385 | out: |
1386 | if (rt) | 1386 | if (rt) |
1387 | dst_release(&rt->u.dst); | 1387 | dst_release(&rt->dst); |
1388 | else if (neigh) | 1388 | else if (neigh) |
1389 | neigh_release(neigh); | 1389 | neigh_release(neigh); |
1390 | in6_dev_put(in6_dev); | 1390 | in6_dev_put(in6_dev); |
diff --git a/net/ipv6/raw.c b/net/ipv6/raw.c index 968b96490729..e677937a07fc 100644 --- a/net/ipv6/raw.c +++ b/net/ipv6/raw.c | |||
@@ -611,23 +611,23 @@ static int rawv6_send_hdrinc(struct sock *sk, void *from, int length, | |||
611 | int err; | 611 | int err; |
612 | struct rt6_info *rt = (struct rt6_info *)*dstp; | 612 | struct rt6_info *rt = (struct rt6_info *)*dstp; |
613 | 613 | ||
614 | if (length > rt->u.dst.dev->mtu) { | 614 | if (length > rt->dst.dev->mtu) { |
615 | ipv6_local_error(sk, EMSGSIZE, fl, rt->u.dst.dev->mtu); | 615 | ipv6_local_error(sk, EMSGSIZE, fl, rt->dst.dev->mtu); |
616 | return -EMSGSIZE; | 616 | return -EMSGSIZE; |
617 | } | 617 | } |
618 | if (flags&MSG_PROBE) | 618 | if (flags&MSG_PROBE) |
619 | goto out; | 619 | goto out; |
620 | 620 | ||
621 | skb = sock_alloc_send_skb(sk, | 621 | skb = sock_alloc_send_skb(sk, |
622 | length + LL_ALLOCATED_SPACE(rt->u.dst.dev) + 15, | 622 | length + LL_ALLOCATED_SPACE(rt->dst.dev) + 15, |
623 | flags & MSG_DONTWAIT, &err); | 623 | flags & MSG_DONTWAIT, &err); |
624 | if (skb == NULL) | 624 | if (skb == NULL) |
625 | goto error; | 625 | goto error; |
626 | skb_reserve(skb, LL_RESERVED_SPACE(rt->u.dst.dev)); | 626 | skb_reserve(skb, LL_RESERVED_SPACE(rt->dst.dev)); |
627 | 627 | ||
628 | skb->priority = sk->sk_priority; | 628 | skb->priority = sk->sk_priority; |
629 | skb->mark = sk->sk_mark; | 629 | skb->mark = sk->sk_mark; |
630 | skb_dst_set(skb, &rt->u.dst); | 630 | skb_dst_set(skb, &rt->dst); |
631 | *dstp = NULL; | 631 | *dstp = NULL; |
632 | 632 | ||
633 | skb_put(skb, length); | 633 | skb_put(skb, length); |
@@ -643,7 +643,7 @@ static int rawv6_send_hdrinc(struct sock *sk, void *from, int length, | |||
643 | 643 | ||
644 | IP6_UPD_PO_STATS(sock_net(sk), rt->rt6i_idev, IPSTATS_MIB_OUT, skb->len); | 644 | IP6_UPD_PO_STATS(sock_net(sk), rt->rt6i_idev, IPSTATS_MIB_OUT, skb->len); |
645 | err = NF_HOOK(NFPROTO_IPV6, NF_INET_LOCAL_OUT, skb, NULL, | 645 | err = NF_HOOK(NFPROTO_IPV6, NF_INET_LOCAL_OUT, skb, NULL, |
646 | rt->u.dst.dev, dst_output); | 646 | rt->dst.dev, dst_output); |
647 | if (err > 0) | 647 | if (err > 0) |
648 | err = net_xmit_errno(err); | 648 | err = net_xmit_errno(err); |
649 | if (err) | 649 | if (err) |
diff --git a/net/ipv6/route.c b/net/ipv6/route.c index 252d76199c41..f7702850d45c 100644 --- a/net/ipv6/route.c +++ b/net/ipv6/route.c | |||
@@ -126,16 +126,14 @@ static struct dst_ops ip6_dst_blackhole_ops = { | |||
126 | }; | 126 | }; |
127 | 127 | ||
128 | static struct rt6_info ip6_null_entry_template = { | 128 | static struct rt6_info ip6_null_entry_template = { |
129 | .u = { | 129 | .dst = { |
130 | .dst = { | 130 | .__refcnt = ATOMIC_INIT(1), |
131 | .__refcnt = ATOMIC_INIT(1), | 131 | .__use = 1, |
132 | .__use = 1, | 132 | .obsolete = -1, |
133 | .obsolete = -1, | 133 | .error = -ENETUNREACH, |
134 | .error = -ENETUNREACH, | 134 | .metrics = { [RTAX_HOPLIMIT - 1] = 255, }, |
135 | .metrics = { [RTAX_HOPLIMIT - 1] = 255, }, | 135 | .input = ip6_pkt_discard, |
136 | .input = ip6_pkt_discard, | 136 | .output = ip6_pkt_discard_out, |
137 | .output = ip6_pkt_discard_out, | ||
138 | } | ||
139 | }, | 137 | }, |
140 | .rt6i_flags = (RTF_REJECT | RTF_NONEXTHOP), | 138 | .rt6i_flags = (RTF_REJECT | RTF_NONEXTHOP), |
141 | .rt6i_protocol = RTPROT_KERNEL, | 139 | .rt6i_protocol = RTPROT_KERNEL, |
@@ -149,16 +147,14 @@ static int ip6_pkt_prohibit(struct sk_buff *skb); | |||
149 | static int ip6_pkt_prohibit_out(struct sk_buff *skb); | 147 | static int ip6_pkt_prohibit_out(struct sk_buff *skb); |
150 | 148 | ||
151 | static struct rt6_info ip6_prohibit_entry_template = { | 149 | static struct rt6_info ip6_prohibit_entry_template = { |
152 | .u = { | 150 | .dst = { |
153 | .dst = { | 151 | .__refcnt = ATOMIC_INIT(1), |
154 | .__refcnt = ATOMIC_INIT(1), | 152 | .__use = 1, |
155 | .__use = 1, | 153 | .obsolete = -1, |
156 | .obsolete = -1, | 154 | .error = -EACCES, |
157 | .error = -EACCES, | 155 | .metrics = { [RTAX_HOPLIMIT - 1] = 255, }, |
158 | .metrics = { [RTAX_HOPLIMIT - 1] = 255, }, | 156 | .input = ip6_pkt_prohibit, |
159 | .input = ip6_pkt_prohibit, | 157 | .output = ip6_pkt_prohibit_out, |
160 | .output = ip6_pkt_prohibit_out, | ||
161 | } | ||
162 | }, | 158 | }, |
163 | .rt6i_flags = (RTF_REJECT | RTF_NONEXTHOP), | 159 | .rt6i_flags = (RTF_REJECT | RTF_NONEXTHOP), |
164 | .rt6i_protocol = RTPROT_KERNEL, | 160 | .rt6i_protocol = RTPROT_KERNEL, |
@@ -167,16 +163,14 @@ static struct rt6_info ip6_prohibit_entry_template = { | |||
167 | }; | 163 | }; |
168 | 164 | ||
169 | static struct rt6_info ip6_blk_hole_entry_template = { | 165 | static struct rt6_info ip6_blk_hole_entry_template = { |
170 | .u = { | 166 | .dst = { |
171 | .dst = { | 167 | .__refcnt = ATOMIC_INIT(1), |
172 | .__refcnt = ATOMIC_INIT(1), | 168 | .__use = 1, |
173 | .__use = 1, | 169 | .obsolete = -1, |
174 | .obsolete = -1, | 170 | .error = -EINVAL, |
175 | .error = -EINVAL, | 171 | .metrics = { [RTAX_HOPLIMIT - 1] = 255, }, |
176 | .metrics = { [RTAX_HOPLIMIT - 1] = 255, }, | 172 | .input = dst_discard, |
177 | .input = dst_discard, | 173 | .output = dst_discard, |
178 | .output = dst_discard, | ||
179 | } | ||
180 | }, | 174 | }, |
181 | .rt6i_flags = (RTF_REJECT | RTF_NONEXTHOP), | 175 | .rt6i_flags = (RTF_REJECT | RTF_NONEXTHOP), |
182 | .rt6i_protocol = RTPROT_KERNEL, | 176 | .rt6i_protocol = RTPROT_KERNEL, |
@@ -249,7 +243,7 @@ static inline struct rt6_info *rt6_device_match(struct net *net, | |||
249 | if (!oif && ipv6_addr_any(saddr)) | 243 | if (!oif && ipv6_addr_any(saddr)) |
250 | goto out; | 244 | goto out; |
251 | 245 | ||
252 | for (sprt = rt; sprt; sprt = sprt->u.dst.rt6_next) { | 246 | for (sprt = rt; sprt; sprt = sprt->dst.rt6_next) { |
253 | struct net_device *dev = sprt->rt6i_dev; | 247 | struct net_device *dev = sprt->rt6i_dev; |
254 | 248 | ||
255 | if (oif) { | 249 | if (oif) { |
@@ -407,10 +401,10 @@ static struct rt6_info *find_rr_leaf(struct fib6_node *fn, | |||
407 | 401 | ||
408 | match = NULL; | 402 | match = NULL; |
409 | for (rt = rr_head; rt && rt->rt6i_metric == metric; | 403 | for (rt = rr_head; rt && rt->rt6i_metric == metric; |
410 | rt = rt->u.dst.rt6_next) | 404 | rt = rt->dst.rt6_next) |
411 | match = find_match(rt, oif, strict, &mpri, match); | 405 | match = find_match(rt, oif, strict, &mpri, match); |
412 | for (rt = fn->leaf; rt && rt != rr_head && rt->rt6i_metric == metric; | 406 | for (rt = fn->leaf; rt && rt != rr_head && rt->rt6i_metric == metric; |
413 | rt = rt->u.dst.rt6_next) | 407 | rt = rt->dst.rt6_next) |
414 | match = find_match(rt, oif, strict, &mpri, match); | 408 | match = find_match(rt, oif, strict, &mpri, match); |
415 | 409 | ||
416 | return match; | 410 | return match; |
@@ -432,7 +426,7 @@ static struct rt6_info *rt6_select(struct fib6_node *fn, int oif, int strict) | |||
432 | 426 | ||
433 | if (!match && | 427 | if (!match && |
434 | (strict & RT6_LOOKUP_F_REACHABLE)) { | 428 | (strict & RT6_LOOKUP_F_REACHABLE)) { |
435 | struct rt6_info *next = rt0->u.dst.rt6_next; | 429 | struct rt6_info *next = rt0->dst.rt6_next; |
436 | 430 | ||
437 | /* no entries matched; do round-robin */ | 431 | /* no entries matched; do round-robin */ |
438 | if (!next || next->rt6i_metric != rt0->rt6i_metric) | 432 | if (!next || next->rt6i_metric != rt0->rt6i_metric) |
@@ -517,7 +511,7 @@ int rt6_route_rcv(struct net_device *dev, u8 *opt, int len, | |||
517 | rt->rt6i_expires = jiffies + HZ * lifetime; | 511 | rt->rt6i_expires = jiffies + HZ * lifetime; |
518 | rt->rt6i_flags |= RTF_EXPIRES; | 512 | rt->rt6i_flags |= RTF_EXPIRES; |
519 | } | 513 | } |
520 | dst_release(&rt->u.dst); | 514 | dst_release(&rt->dst); |
521 | } | 515 | } |
522 | return 0; | 516 | return 0; |
523 | } | 517 | } |
@@ -555,7 +549,7 @@ restart: | |||
555 | rt = rt6_device_match(net, rt, &fl->fl6_src, fl->oif, flags); | 549 | rt = rt6_device_match(net, rt, &fl->fl6_src, fl->oif, flags); |
556 | BACKTRACK(net, &fl->fl6_src); | 550 | BACKTRACK(net, &fl->fl6_src); |
557 | out: | 551 | out: |
558 | dst_use(&rt->u.dst, jiffies); | 552 | dst_use(&rt->dst, jiffies); |
559 | read_unlock_bh(&table->tb6_lock); | 553 | read_unlock_bh(&table->tb6_lock); |
560 | return rt; | 554 | return rt; |
561 | 555 | ||
@@ -643,7 +637,7 @@ static struct rt6_info *rt6_alloc_cow(struct rt6_info *ort, struct in6_addr *dad | |||
643 | ipv6_addr_copy(&rt->rt6i_dst.addr, daddr); | 637 | ipv6_addr_copy(&rt->rt6i_dst.addr, daddr); |
644 | rt->rt6i_dst.plen = 128; | 638 | rt->rt6i_dst.plen = 128; |
645 | rt->rt6i_flags |= RTF_CACHE; | 639 | rt->rt6i_flags |= RTF_CACHE; |
646 | rt->u.dst.flags |= DST_HOST; | 640 | rt->dst.flags |= DST_HOST; |
647 | 641 | ||
648 | #ifdef CONFIG_IPV6_SUBTREES | 642 | #ifdef CONFIG_IPV6_SUBTREES |
649 | if (rt->rt6i_src.plen && saddr) { | 643 | if (rt->rt6i_src.plen && saddr) { |
@@ -677,7 +671,7 @@ static struct rt6_info *rt6_alloc_cow(struct rt6_info *ort, struct in6_addr *dad | |||
677 | if (net_ratelimit()) | 671 | if (net_ratelimit()) |
678 | printk(KERN_WARNING | 672 | printk(KERN_WARNING |
679 | "Neighbour table overflow.\n"); | 673 | "Neighbour table overflow.\n"); |
680 | dst_free(&rt->u.dst); | 674 | dst_free(&rt->dst); |
681 | return NULL; | 675 | return NULL; |
682 | } | 676 | } |
683 | rt->rt6i_nexthop = neigh; | 677 | rt->rt6i_nexthop = neigh; |
@@ -694,7 +688,7 @@ static struct rt6_info *rt6_alloc_clone(struct rt6_info *ort, struct in6_addr *d | |||
694 | ipv6_addr_copy(&rt->rt6i_dst.addr, daddr); | 688 | ipv6_addr_copy(&rt->rt6i_dst.addr, daddr); |
695 | rt->rt6i_dst.plen = 128; | 689 | rt->rt6i_dst.plen = 128; |
696 | rt->rt6i_flags |= RTF_CACHE; | 690 | rt->rt6i_flags |= RTF_CACHE; |
697 | rt->u.dst.flags |= DST_HOST; | 691 | rt->dst.flags |= DST_HOST; |
698 | rt->rt6i_nexthop = neigh_clone(ort->rt6i_nexthop); | 692 | rt->rt6i_nexthop = neigh_clone(ort->rt6i_nexthop); |
699 | } | 693 | } |
700 | return rt; | 694 | return rt; |
@@ -726,7 +720,7 @@ restart: | |||
726 | rt->rt6i_flags & RTF_CACHE) | 720 | rt->rt6i_flags & RTF_CACHE) |
727 | goto out; | 721 | goto out; |
728 | 722 | ||
729 | dst_hold(&rt->u.dst); | 723 | dst_hold(&rt->dst); |
730 | read_unlock_bh(&table->tb6_lock); | 724 | read_unlock_bh(&table->tb6_lock); |
731 | 725 | ||
732 | if (!rt->rt6i_nexthop && !(rt->rt6i_flags & RTF_NONEXTHOP)) | 726 | if (!rt->rt6i_nexthop && !(rt->rt6i_flags & RTF_NONEXTHOP)) |
@@ -739,10 +733,10 @@ restart: | |||
739 | #endif | 733 | #endif |
740 | } | 734 | } |
741 | 735 | ||
742 | dst_release(&rt->u.dst); | 736 | dst_release(&rt->dst); |
743 | rt = nrt ? : net->ipv6.ip6_null_entry; | 737 | rt = nrt ? : net->ipv6.ip6_null_entry; |
744 | 738 | ||
745 | dst_hold(&rt->u.dst); | 739 | dst_hold(&rt->dst); |
746 | if (nrt) { | 740 | if (nrt) { |
747 | err = ip6_ins_rt(nrt); | 741 | err = ip6_ins_rt(nrt); |
748 | if (!err) | 742 | if (!err) |
@@ -756,7 +750,7 @@ restart: | |||
756 | * Race condition! In the gap, when table->tb6_lock was | 750 | * Race condition! In the gap, when table->tb6_lock was |
757 | * released someone could insert this route. Relookup. | 751 | * released someone could insert this route. Relookup. |
758 | */ | 752 | */ |
759 | dst_release(&rt->u.dst); | 753 | dst_release(&rt->dst); |
760 | goto relookup; | 754 | goto relookup; |
761 | 755 | ||
762 | out: | 756 | out: |
@@ -764,11 +758,11 @@ out: | |||
764 | reachable = 0; | 758 | reachable = 0; |
765 | goto restart_2; | 759 | goto restart_2; |
766 | } | 760 | } |
767 | dst_hold(&rt->u.dst); | 761 | dst_hold(&rt->dst); |
768 | read_unlock_bh(&table->tb6_lock); | 762 | read_unlock_bh(&table->tb6_lock); |
769 | out2: | 763 | out2: |
770 | rt->u.dst.lastuse = jiffies; | 764 | rt->dst.lastuse = jiffies; |
771 | rt->u.dst.__use++; | 765 | rt->dst.__use++; |
772 | 766 | ||
773 | return rt; | 767 | return rt; |
774 | } | 768 | } |
@@ -835,15 +829,15 @@ int ip6_dst_blackhole(struct sock *sk, struct dst_entry **dstp, struct flowi *fl | |||
835 | struct dst_entry *new = NULL; | 829 | struct dst_entry *new = NULL; |
836 | 830 | ||
837 | if (rt) { | 831 | if (rt) { |
838 | new = &rt->u.dst; | 832 | new = &rt->dst; |
839 | 833 | ||
840 | atomic_set(&new->__refcnt, 1); | 834 | atomic_set(&new->__refcnt, 1); |
841 | new->__use = 1; | 835 | new->__use = 1; |
842 | new->input = dst_discard; | 836 | new->input = dst_discard; |
843 | new->output = dst_discard; | 837 | new->output = dst_discard; |
844 | 838 | ||
845 | memcpy(new->metrics, ort->u.dst.metrics, RTAX_MAX*sizeof(u32)); | 839 | memcpy(new->metrics, ort->dst.metrics, RTAX_MAX*sizeof(u32)); |
846 | new->dev = ort->u.dst.dev; | 840 | new->dev = ort->dst.dev; |
847 | if (new->dev) | 841 | if (new->dev) |
848 | dev_hold(new->dev); | 842 | dev_hold(new->dev); |
849 | rt->rt6i_idev = ort->rt6i_idev; | 843 | rt->rt6i_idev = ort->rt6i_idev; |
@@ -912,7 +906,7 @@ static void ip6_link_failure(struct sk_buff *skb) | |||
912 | rt = (struct rt6_info *) skb_dst(skb); | 906 | rt = (struct rt6_info *) skb_dst(skb); |
913 | if (rt) { | 907 | if (rt) { |
914 | if (rt->rt6i_flags&RTF_CACHE) { | 908 | if (rt->rt6i_flags&RTF_CACHE) { |
915 | dst_set_expires(&rt->u.dst, 0); | 909 | dst_set_expires(&rt->dst, 0); |
916 | rt->rt6i_flags |= RTF_EXPIRES; | 910 | rt->rt6i_flags |= RTF_EXPIRES; |
917 | } else if (rt->rt6i_node && (rt->rt6i_flags & RTF_DEFAULT)) | 911 | } else if (rt->rt6i_node && (rt->rt6i_flags & RTF_DEFAULT)) |
918 | rt->rt6i_node->fn_sernum = -1; | 912 | rt->rt6i_node->fn_sernum = -1; |
@@ -986,14 +980,14 @@ struct dst_entry *icmp6_dst_alloc(struct net_device *dev, | |||
986 | rt->rt6i_dev = dev; | 980 | rt->rt6i_dev = dev; |
987 | rt->rt6i_idev = idev; | 981 | rt->rt6i_idev = idev; |
988 | rt->rt6i_nexthop = neigh; | 982 | rt->rt6i_nexthop = neigh; |
989 | atomic_set(&rt->u.dst.__refcnt, 1); | 983 | atomic_set(&rt->dst.__refcnt, 1); |
990 | rt->u.dst.metrics[RTAX_HOPLIMIT-1] = 255; | 984 | rt->dst.metrics[RTAX_HOPLIMIT-1] = 255; |
991 | rt->u.dst.metrics[RTAX_MTU-1] = ipv6_get_mtu(rt->rt6i_dev); | 985 | rt->dst.metrics[RTAX_MTU-1] = ipv6_get_mtu(rt->rt6i_dev); |
992 | rt->u.dst.metrics[RTAX_ADVMSS-1] = ipv6_advmss(net, dst_mtu(&rt->u.dst)); | 986 | rt->dst.metrics[RTAX_ADVMSS-1] = ipv6_advmss(net, dst_mtu(&rt->dst)); |
993 | rt->u.dst.output = ip6_output; | 987 | rt->dst.output = ip6_output; |
994 | 988 | ||
995 | #if 0 /* there's no chance to use these for ndisc */ | 989 | #if 0 /* there's no chance to use these for ndisc */ |
996 | rt->u.dst.flags = ipv6_addr_type(addr) & IPV6_ADDR_UNICAST | 990 | rt->dst.flags = ipv6_addr_type(addr) & IPV6_ADDR_UNICAST |
997 | ? DST_HOST | 991 | ? DST_HOST |
998 | : 0; | 992 | : 0; |
999 | ipv6_addr_copy(&rt->rt6i_dst.addr, addr); | 993 | ipv6_addr_copy(&rt->rt6i_dst.addr, addr); |
@@ -1001,14 +995,14 @@ struct dst_entry *icmp6_dst_alloc(struct net_device *dev, | |||
1001 | #endif | 995 | #endif |
1002 | 996 | ||
1003 | spin_lock_bh(&icmp6_dst_lock); | 997 | spin_lock_bh(&icmp6_dst_lock); |
1004 | rt->u.dst.next = icmp6_dst_gc_list; | 998 | rt->dst.next = icmp6_dst_gc_list; |
1005 | icmp6_dst_gc_list = &rt->u.dst; | 999 | icmp6_dst_gc_list = &rt->dst; |
1006 | spin_unlock_bh(&icmp6_dst_lock); | 1000 | spin_unlock_bh(&icmp6_dst_lock); |
1007 | 1001 | ||
1008 | fib6_force_start_gc(net); | 1002 | fib6_force_start_gc(net); |
1009 | 1003 | ||
1010 | out: | 1004 | out: |
1011 | return &rt->u.dst; | 1005 | return &rt->dst; |
1012 | } | 1006 | } |
1013 | 1007 | ||
1014 | int icmp6_dst_gc(void) | 1008 | int icmp6_dst_gc(void) |
@@ -1159,7 +1153,7 @@ int ip6_route_add(struct fib6_config *cfg) | |||
1159 | goto out; | 1153 | goto out; |
1160 | } | 1154 | } |
1161 | 1155 | ||
1162 | rt->u.dst.obsolete = -1; | 1156 | rt->dst.obsolete = -1; |
1163 | rt->rt6i_expires = (cfg->fc_flags & RTF_EXPIRES) ? | 1157 | rt->rt6i_expires = (cfg->fc_flags & RTF_EXPIRES) ? |
1164 | jiffies + clock_t_to_jiffies(cfg->fc_expires) : | 1158 | jiffies + clock_t_to_jiffies(cfg->fc_expires) : |
1165 | 0; | 1159 | 0; |
@@ -1171,16 +1165,16 @@ int ip6_route_add(struct fib6_config *cfg) | |||
1171 | addr_type = ipv6_addr_type(&cfg->fc_dst); | 1165 | addr_type = ipv6_addr_type(&cfg->fc_dst); |
1172 | 1166 | ||
1173 | if (addr_type & IPV6_ADDR_MULTICAST) | 1167 | if (addr_type & IPV6_ADDR_MULTICAST) |
1174 | rt->u.dst.input = ip6_mc_input; | 1168 | rt->dst.input = ip6_mc_input; |
1175 | else | 1169 | else |
1176 | rt->u.dst.input = ip6_forward; | 1170 | rt->dst.input = ip6_forward; |
1177 | 1171 | ||
1178 | rt->u.dst.output = ip6_output; | 1172 | rt->dst.output = ip6_output; |
1179 | 1173 | ||
1180 | ipv6_addr_prefix(&rt->rt6i_dst.addr, &cfg->fc_dst, cfg->fc_dst_len); | 1174 | ipv6_addr_prefix(&rt->rt6i_dst.addr, &cfg->fc_dst, cfg->fc_dst_len); |
1181 | rt->rt6i_dst.plen = cfg->fc_dst_len; | 1175 | rt->rt6i_dst.plen = cfg->fc_dst_len; |
1182 | if (rt->rt6i_dst.plen == 128) | 1176 | if (rt->rt6i_dst.plen == 128) |
1183 | rt->u.dst.flags = DST_HOST; | 1177 | rt->dst.flags = DST_HOST; |
1184 | 1178 | ||
1185 | #ifdef CONFIG_IPV6_SUBTREES | 1179 | #ifdef CONFIG_IPV6_SUBTREES |
1186 | ipv6_addr_prefix(&rt->rt6i_src.addr, &cfg->fc_src, cfg->fc_src_len); | 1180 | ipv6_addr_prefix(&rt->rt6i_src.addr, &cfg->fc_src, cfg->fc_src_len); |
@@ -1208,9 +1202,9 @@ int ip6_route_add(struct fib6_config *cfg) | |||
1208 | goto out; | 1202 | goto out; |
1209 | } | 1203 | } |
1210 | } | 1204 | } |
1211 | rt->u.dst.output = ip6_pkt_discard_out; | 1205 | rt->dst.output = ip6_pkt_discard_out; |
1212 | rt->u.dst.input = ip6_pkt_discard; | 1206 | rt->dst.input = ip6_pkt_discard; |
1213 | rt->u.dst.error = -ENETUNREACH; | 1207 | rt->dst.error = -ENETUNREACH; |
1214 | rt->rt6i_flags = RTF_REJECT|RTF_NONEXTHOP; | 1208 | rt->rt6i_flags = RTF_REJECT|RTF_NONEXTHOP; |
1215 | goto install_route; | 1209 | goto install_route; |
1216 | } | 1210 | } |
@@ -1244,7 +1238,7 @@ int ip6_route_add(struct fib6_config *cfg) | |||
1244 | goto out; | 1238 | goto out; |
1245 | if (dev) { | 1239 | if (dev) { |
1246 | if (dev != grt->rt6i_dev) { | 1240 | if (dev != grt->rt6i_dev) { |
1247 | dst_release(&grt->u.dst); | 1241 | dst_release(&grt->dst); |
1248 | goto out; | 1242 | goto out; |
1249 | } | 1243 | } |
1250 | } else { | 1244 | } else { |
@@ -1255,7 +1249,7 @@ int ip6_route_add(struct fib6_config *cfg) | |||
1255 | } | 1249 | } |
1256 | if (!(grt->rt6i_flags&RTF_GATEWAY)) | 1250 | if (!(grt->rt6i_flags&RTF_GATEWAY)) |
1257 | err = 0; | 1251 | err = 0; |
1258 | dst_release(&grt->u.dst); | 1252 | dst_release(&grt->dst); |
1259 | 1253 | ||
1260 | if (err) | 1254 | if (err) |
1261 | goto out; | 1255 | goto out; |
@@ -1294,18 +1288,18 @@ install_route: | |||
1294 | goto out; | 1288 | goto out; |
1295 | } | 1289 | } |
1296 | 1290 | ||
1297 | rt->u.dst.metrics[type - 1] = nla_get_u32(nla); | 1291 | rt->dst.metrics[type - 1] = nla_get_u32(nla); |
1298 | } | 1292 | } |
1299 | } | 1293 | } |
1300 | } | 1294 | } |
1301 | 1295 | ||
1302 | if (dst_metric(&rt->u.dst, RTAX_HOPLIMIT) == 0) | 1296 | if (dst_metric(&rt->dst, RTAX_HOPLIMIT) == 0) |
1303 | rt->u.dst.metrics[RTAX_HOPLIMIT-1] = -1; | 1297 | rt->dst.metrics[RTAX_HOPLIMIT-1] = -1; |
1304 | if (!dst_mtu(&rt->u.dst)) | 1298 | if (!dst_mtu(&rt->dst)) |
1305 | rt->u.dst.metrics[RTAX_MTU-1] = ipv6_get_mtu(dev); | 1299 | rt->dst.metrics[RTAX_MTU-1] = ipv6_get_mtu(dev); |
1306 | if (!dst_metric(&rt->u.dst, RTAX_ADVMSS)) | 1300 | if (!dst_metric(&rt->dst, RTAX_ADVMSS)) |
1307 | rt->u.dst.metrics[RTAX_ADVMSS-1] = ipv6_advmss(net, dst_mtu(&rt->u.dst)); | 1301 | rt->dst.metrics[RTAX_ADVMSS-1] = ipv6_advmss(net, dst_mtu(&rt->dst)); |
1308 | rt->u.dst.dev = dev; | 1302 | rt->dst.dev = dev; |
1309 | rt->rt6i_idev = idev; | 1303 | rt->rt6i_idev = idev; |
1310 | rt->rt6i_table = table; | 1304 | rt->rt6i_table = table; |
1311 | 1305 | ||
@@ -1319,7 +1313,7 @@ out: | |||
1319 | if (idev) | 1313 | if (idev) |
1320 | in6_dev_put(idev); | 1314 | in6_dev_put(idev); |
1321 | if (rt) | 1315 | if (rt) |
1322 | dst_free(&rt->u.dst); | 1316 | dst_free(&rt->dst); |
1323 | return err; | 1317 | return err; |
1324 | } | 1318 | } |
1325 | 1319 | ||
@@ -1336,7 +1330,7 @@ static int __ip6_del_rt(struct rt6_info *rt, struct nl_info *info) | |||
1336 | write_lock_bh(&table->tb6_lock); | 1330 | write_lock_bh(&table->tb6_lock); |
1337 | 1331 | ||
1338 | err = fib6_del(rt, info); | 1332 | err = fib6_del(rt, info); |
1339 | dst_release(&rt->u.dst); | 1333 | dst_release(&rt->dst); |
1340 | 1334 | ||
1341 | write_unlock_bh(&table->tb6_lock); | 1335 | write_unlock_bh(&table->tb6_lock); |
1342 | 1336 | ||
@@ -1369,7 +1363,7 @@ static int ip6_route_del(struct fib6_config *cfg) | |||
1369 | &cfg->fc_src, cfg->fc_src_len); | 1363 | &cfg->fc_src, cfg->fc_src_len); |
1370 | 1364 | ||
1371 | if (fn) { | 1365 | if (fn) { |
1372 | for (rt = fn->leaf; rt; rt = rt->u.dst.rt6_next) { | 1366 | for (rt = fn->leaf; rt; rt = rt->dst.rt6_next) { |
1373 | if (cfg->fc_ifindex && | 1367 | if (cfg->fc_ifindex && |
1374 | (rt->rt6i_dev == NULL || | 1368 | (rt->rt6i_dev == NULL || |
1375 | rt->rt6i_dev->ifindex != cfg->fc_ifindex)) | 1369 | rt->rt6i_dev->ifindex != cfg->fc_ifindex)) |
@@ -1379,7 +1373,7 @@ static int ip6_route_del(struct fib6_config *cfg) | |||
1379 | continue; | 1373 | continue; |
1380 | if (cfg->fc_metric && cfg->fc_metric != rt->rt6i_metric) | 1374 | if (cfg->fc_metric && cfg->fc_metric != rt->rt6i_metric) |
1381 | continue; | 1375 | continue; |
1382 | dst_hold(&rt->u.dst); | 1376 | dst_hold(&rt->dst); |
1383 | read_unlock_bh(&table->tb6_lock); | 1377 | read_unlock_bh(&table->tb6_lock); |
1384 | 1378 | ||
1385 | return __ip6_del_rt(rt, &cfg->fc_nlinfo); | 1379 | return __ip6_del_rt(rt, &cfg->fc_nlinfo); |
@@ -1421,7 +1415,7 @@ static struct rt6_info *__ip6_route_redirect(struct net *net, | |||
1421 | read_lock_bh(&table->tb6_lock); | 1415 | read_lock_bh(&table->tb6_lock); |
1422 | fn = fib6_lookup(&table->tb6_root, &fl->fl6_dst, &fl->fl6_src); | 1416 | fn = fib6_lookup(&table->tb6_root, &fl->fl6_dst, &fl->fl6_src); |
1423 | restart: | 1417 | restart: |
1424 | for (rt = fn->leaf; rt; rt = rt->u.dst.rt6_next) { | 1418 | for (rt = fn->leaf; rt; rt = rt->dst.rt6_next) { |
1425 | /* | 1419 | /* |
1426 | * Current route is on-link; redirect is always invalid. | 1420 | * Current route is on-link; redirect is always invalid. |
1427 | * | 1421 | * |
@@ -1445,7 +1439,7 @@ restart: | |||
1445 | rt = net->ipv6.ip6_null_entry; | 1439 | rt = net->ipv6.ip6_null_entry; |
1446 | BACKTRACK(net, &fl->fl6_src); | 1440 | BACKTRACK(net, &fl->fl6_src); |
1447 | out: | 1441 | out: |
1448 | dst_hold(&rt->u.dst); | 1442 | dst_hold(&rt->dst); |
1449 | 1443 | ||
1450 | read_unlock_bh(&table->tb6_lock); | 1444 | read_unlock_bh(&table->tb6_lock); |
1451 | 1445 | ||
@@ -1513,10 +1507,10 @@ void rt6_redirect(struct in6_addr *dest, struct in6_addr *src, | |||
1513 | * Look, redirects are sent only in response to data packets, | 1507 | * Look, redirects are sent only in response to data packets, |
1514 | * so that this nexthop apparently is reachable. --ANK | 1508 | * so that this nexthop apparently is reachable. --ANK |
1515 | */ | 1509 | */ |
1516 | dst_confirm(&rt->u.dst); | 1510 | dst_confirm(&rt->dst); |
1517 | 1511 | ||
1518 | /* Duplicate redirect: silently ignore. */ | 1512 | /* Duplicate redirect: silently ignore. */ |
1519 | if (neigh == rt->u.dst.neighbour) | 1513 | if (neigh == rt->dst.neighbour) |
1520 | goto out; | 1514 | goto out; |
1521 | 1515 | ||
1522 | nrt = ip6_rt_copy(rt); | 1516 | nrt = ip6_rt_copy(rt); |
@@ -1529,20 +1523,20 @@ void rt6_redirect(struct in6_addr *dest, struct in6_addr *src, | |||
1529 | 1523 | ||
1530 | ipv6_addr_copy(&nrt->rt6i_dst.addr, dest); | 1524 | ipv6_addr_copy(&nrt->rt6i_dst.addr, dest); |
1531 | nrt->rt6i_dst.plen = 128; | 1525 | nrt->rt6i_dst.plen = 128; |
1532 | nrt->u.dst.flags |= DST_HOST; | 1526 | nrt->dst.flags |= DST_HOST; |
1533 | 1527 | ||
1534 | ipv6_addr_copy(&nrt->rt6i_gateway, (struct in6_addr*)neigh->primary_key); | 1528 | ipv6_addr_copy(&nrt->rt6i_gateway, (struct in6_addr*)neigh->primary_key); |
1535 | nrt->rt6i_nexthop = neigh_clone(neigh); | 1529 | nrt->rt6i_nexthop = neigh_clone(neigh); |
1536 | /* Reset pmtu, it may be better */ | 1530 | /* Reset pmtu, it may be better */ |
1537 | nrt->u.dst.metrics[RTAX_MTU-1] = ipv6_get_mtu(neigh->dev); | 1531 | nrt->dst.metrics[RTAX_MTU-1] = ipv6_get_mtu(neigh->dev); |
1538 | nrt->u.dst.metrics[RTAX_ADVMSS-1] = ipv6_advmss(dev_net(neigh->dev), | 1532 | nrt->dst.metrics[RTAX_ADVMSS-1] = ipv6_advmss(dev_net(neigh->dev), |
1539 | dst_mtu(&nrt->u.dst)); | 1533 | dst_mtu(&nrt->dst)); |
1540 | 1534 | ||
1541 | if (ip6_ins_rt(nrt)) | 1535 | if (ip6_ins_rt(nrt)) |
1542 | goto out; | 1536 | goto out; |
1543 | 1537 | ||
1544 | netevent.old = &rt->u.dst; | 1538 | netevent.old = &rt->dst; |
1545 | netevent.new = &nrt->u.dst; | 1539 | netevent.new = &nrt->dst; |
1546 | call_netevent_notifiers(NETEVENT_REDIRECT, &netevent); | 1540 | call_netevent_notifiers(NETEVENT_REDIRECT, &netevent); |
1547 | 1541 | ||
1548 | if (rt->rt6i_flags&RTF_CACHE) { | 1542 | if (rt->rt6i_flags&RTF_CACHE) { |
@@ -1551,7 +1545,7 @@ void rt6_redirect(struct in6_addr *dest, struct in6_addr *src, | |||
1551 | } | 1545 | } |
1552 | 1546 | ||
1553 | out: | 1547 | out: |
1554 | dst_release(&rt->u.dst); | 1548 | dst_release(&rt->dst); |
1555 | } | 1549 | } |
1556 | 1550 | ||
1557 | /* | 1551 | /* |
@@ -1570,7 +1564,7 @@ void rt6_pmtu_discovery(struct in6_addr *daddr, struct in6_addr *saddr, | |||
1570 | if (rt == NULL) | 1564 | if (rt == NULL) |
1571 | return; | 1565 | return; |
1572 | 1566 | ||
1573 | if (pmtu >= dst_mtu(&rt->u.dst)) | 1567 | if (pmtu >= dst_mtu(&rt->dst)) |
1574 | goto out; | 1568 | goto out; |
1575 | 1569 | ||
1576 | if (pmtu < IPV6_MIN_MTU) { | 1570 | if (pmtu < IPV6_MIN_MTU) { |
@@ -1588,7 +1582,7 @@ void rt6_pmtu_discovery(struct in6_addr *daddr, struct in6_addr *saddr, | |||
1588 | They are sent only in response to data packets, | 1582 | They are sent only in response to data packets, |
1589 | so that this nexthop apparently is reachable. --ANK | 1583 | so that this nexthop apparently is reachable. --ANK |
1590 | */ | 1584 | */ |
1591 | dst_confirm(&rt->u.dst); | 1585 | dst_confirm(&rt->dst); |
1592 | 1586 | ||
1593 | /* Host route. If it is static, it would be better | 1587 | /* Host route. If it is static, it would be better |
1594 | not to override it, but add new one, so that | 1588 | not to override it, but add new one, so that |
@@ -1596,10 +1590,10 @@ void rt6_pmtu_discovery(struct in6_addr *daddr, struct in6_addr *saddr, | |||
1596 | would return automatically. | 1590 | would return automatically. |
1597 | */ | 1591 | */ |
1598 | if (rt->rt6i_flags & RTF_CACHE) { | 1592 | if (rt->rt6i_flags & RTF_CACHE) { |
1599 | rt->u.dst.metrics[RTAX_MTU-1] = pmtu; | 1593 | rt->dst.metrics[RTAX_MTU-1] = pmtu; |
1600 | if (allfrag) | 1594 | if (allfrag) |
1601 | rt->u.dst.metrics[RTAX_FEATURES-1] |= RTAX_FEATURE_ALLFRAG; | 1595 | rt->dst.metrics[RTAX_FEATURES-1] |= RTAX_FEATURE_ALLFRAG; |
1602 | dst_set_expires(&rt->u.dst, net->ipv6.sysctl.ip6_rt_mtu_expires); | 1596 | dst_set_expires(&rt->dst, net->ipv6.sysctl.ip6_rt_mtu_expires); |
1603 | rt->rt6i_flags |= RTF_MODIFIED|RTF_EXPIRES; | 1597 | rt->rt6i_flags |= RTF_MODIFIED|RTF_EXPIRES; |
1604 | goto out; | 1598 | goto out; |
1605 | } | 1599 | } |
@@ -1615,9 +1609,9 @@ void rt6_pmtu_discovery(struct in6_addr *daddr, struct in6_addr *saddr, | |||
1615 | nrt = rt6_alloc_clone(rt, daddr); | 1609 | nrt = rt6_alloc_clone(rt, daddr); |
1616 | 1610 | ||
1617 | if (nrt) { | 1611 | if (nrt) { |
1618 | nrt->u.dst.metrics[RTAX_MTU-1] = pmtu; | 1612 | nrt->dst.metrics[RTAX_MTU-1] = pmtu; |
1619 | if (allfrag) | 1613 | if (allfrag) |
1620 | nrt->u.dst.metrics[RTAX_FEATURES-1] |= RTAX_FEATURE_ALLFRAG; | 1614 | nrt->dst.metrics[RTAX_FEATURES-1] |= RTAX_FEATURE_ALLFRAG; |
1621 | 1615 | ||
1622 | /* According to RFC 1981, detecting PMTU increase shouldn't be | 1616 | /* According to RFC 1981, detecting PMTU increase shouldn't be |
1623 | * happened within 5 mins, the recommended timer is 10 mins. | 1617 | * happened within 5 mins, the recommended timer is 10 mins. |
@@ -1625,13 +1619,13 @@ void rt6_pmtu_discovery(struct in6_addr *daddr, struct in6_addr *saddr, | |||
1625 | * which is 10 mins. After 10 mins the decreased pmtu is expired | 1619 | * which is 10 mins. After 10 mins the decreased pmtu is expired |
1626 | * and detecting PMTU increase will be automatically happened. | 1620 | * and detecting PMTU increase will be automatically happened. |
1627 | */ | 1621 | */ |
1628 | dst_set_expires(&nrt->u.dst, net->ipv6.sysctl.ip6_rt_mtu_expires); | 1622 | dst_set_expires(&nrt->dst, net->ipv6.sysctl.ip6_rt_mtu_expires); |
1629 | nrt->rt6i_flags |= RTF_DYNAMIC|RTF_EXPIRES; | 1623 | nrt->rt6i_flags |= RTF_DYNAMIC|RTF_EXPIRES; |
1630 | 1624 | ||
1631 | ip6_ins_rt(nrt); | 1625 | ip6_ins_rt(nrt); |
1632 | } | 1626 | } |
1633 | out: | 1627 | out: |
1634 | dst_release(&rt->u.dst); | 1628 | dst_release(&rt->dst); |
1635 | } | 1629 | } |
1636 | 1630 | ||
1637 | /* | 1631 | /* |
@@ -1644,18 +1638,18 @@ static struct rt6_info * ip6_rt_copy(struct rt6_info *ort) | |||
1644 | struct rt6_info *rt = ip6_dst_alloc(&net->ipv6.ip6_dst_ops); | 1638 | struct rt6_info *rt = ip6_dst_alloc(&net->ipv6.ip6_dst_ops); |
1645 | 1639 | ||
1646 | if (rt) { | 1640 | if (rt) { |
1647 | rt->u.dst.input = ort->u.dst.input; | 1641 | rt->dst.input = ort->dst.input; |
1648 | rt->u.dst.output = ort->u.dst.output; | 1642 | rt->dst.output = ort->dst.output; |
1649 | 1643 | ||
1650 | memcpy(rt->u.dst.metrics, ort->u.dst.metrics, RTAX_MAX*sizeof(u32)); | 1644 | memcpy(rt->dst.metrics, ort->dst.metrics, RTAX_MAX*sizeof(u32)); |
1651 | rt->u.dst.error = ort->u.dst.error; | 1645 | rt->dst.error = ort->dst.error; |
1652 | rt->u.dst.dev = ort->u.dst.dev; | 1646 | rt->dst.dev = ort->dst.dev; |
1653 | if (rt->u.dst.dev) | 1647 | if (rt->dst.dev) |
1654 | dev_hold(rt->u.dst.dev); | 1648 | dev_hold(rt->dst.dev); |
1655 | rt->rt6i_idev = ort->rt6i_idev; | 1649 | rt->rt6i_idev = ort->rt6i_idev; |
1656 | if (rt->rt6i_idev) | 1650 | if (rt->rt6i_idev) |
1657 | in6_dev_hold(rt->rt6i_idev); | 1651 | in6_dev_hold(rt->rt6i_idev); |
1658 | rt->u.dst.lastuse = jiffies; | 1652 | rt->dst.lastuse = jiffies; |
1659 | rt->rt6i_expires = 0; | 1653 | rt->rt6i_expires = 0; |
1660 | 1654 | ||
1661 | ipv6_addr_copy(&rt->rt6i_gateway, &ort->rt6i_gateway); | 1655 | ipv6_addr_copy(&rt->rt6i_gateway, &ort->rt6i_gateway); |
@@ -1689,14 +1683,14 @@ static struct rt6_info *rt6_get_route_info(struct net *net, | |||
1689 | if (!fn) | 1683 | if (!fn) |
1690 | goto out; | 1684 | goto out; |
1691 | 1685 | ||
1692 | for (rt = fn->leaf; rt; rt = rt->u.dst.rt6_next) { | 1686 | for (rt = fn->leaf; rt; rt = rt->dst.rt6_next) { |
1693 | if (rt->rt6i_dev->ifindex != ifindex) | 1687 | if (rt->rt6i_dev->ifindex != ifindex) |
1694 | continue; | 1688 | continue; |
1695 | if ((rt->rt6i_flags & (RTF_ROUTEINFO|RTF_GATEWAY)) != (RTF_ROUTEINFO|RTF_GATEWAY)) | 1689 | if ((rt->rt6i_flags & (RTF_ROUTEINFO|RTF_GATEWAY)) != (RTF_ROUTEINFO|RTF_GATEWAY)) |
1696 | continue; | 1690 | continue; |
1697 | if (!ipv6_addr_equal(&rt->rt6i_gateway, gwaddr)) | 1691 | if (!ipv6_addr_equal(&rt->rt6i_gateway, gwaddr)) |
1698 | continue; | 1692 | continue; |
1699 | dst_hold(&rt->u.dst); | 1693 | dst_hold(&rt->dst); |
1700 | break; | 1694 | break; |
1701 | } | 1695 | } |
1702 | out: | 1696 | out: |
@@ -1744,14 +1738,14 @@ struct rt6_info *rt6_get_dflt_router(struct in6_addr *addr, struct net_device *d | |||
1744 | return NULL; | 1738 | return NULL; |
1745 | 1739 | ||
1746 | write_lock_bh(&table->tb6_lock); | 1740 | write_lock_bh(&table->tb6_lock); |
1747 | for (rt = table->tb6_root.leaf; rt; rt=rt->u.dst.rt6_next) { | 1741 | for (rt = table->tb6_root.leaf; rt; rt=rt->dst.rt6_next) { |
1748 | if (dev == rt->rt6i_dev && | 1742 | if (dev == rt->rt6i_dev && |
1749 | ((rt->rt6i_flags & (RTF_ADDRCONF | RTF_DEFAULT)) == (RTF_ADDRCONF | RTF_DEFAULT)) && | 1743 | ((rt->rt6i_flags & (RTF_ADDRCONF | RTF_DEFAULT)) == (RTF_ADDRCONF | RTF_DEFAULT)) && |
1750 | ipv6_addr_equal(&rt->rt6i_gateway, addr)) | 1744 | ipv6_addr_equal(&rt->rt6i_gateway, addr)) |
1751 | break; | 1745 | break; |
1752 | } | 1746 | } |
1753 | if (rt) | 1747 | if (rt) |
1754 | dst_hold(&rt->u.dst); | 1748 | dst_hold(&rt->dst); |
1755 | write_unlock_bh(&table->tb6_lock); | 1749 | write_unlock_bh(&table->tb6_lock); |
1756 | return rt; | 1750 | return rt; |
1757 | } | 1751 | } |
@@ -1790,9 +1784,9 @@ void rt6_purge_dflt_routers(struct net *net) | |||
1790 | 1784 | ||
1791 | restart: | 1785 | restart: |
1792 | read_lock_bh(&table->tb6_lock); | 1786 | read_lock_bh(&table->tb6_lock); |
1793 | for (rt = table->tb6_root.leaf; rt; rt = rt->u.dst.rt6_next) { | 1787 | for (rt = table->tb6_root.leaf; rt; rt = rt->dst.rt6_next) { |
1794 | if (rt->rt6i_flags & (RTF_DEFAULT | RTF_ADDRCONF)) { | 1788 | if (rt->rt6i_flags & (RTF_DEFAULT | RTF_ADDRCONF)) { |
1795 | dst_hold(&rt->u.dst); | 1789 | dst_hold(&rt->dst); |
1796 | read_unlock_bh(&table->tb6_lock); | 1790 | read_unlock_bh(&table->tb6_lock); |
1797 | ip6_del_rt(rt); | 1791 | ip6_del_rt(rt); |
1798 | goto restart; | 1792 | goto restart; |
@@ -1930,15 +1924,15 @@ struct rt6_info *addrconf_dst_alloc(struct inet6_dev *idev, | |||
1930 | dev_hold(net->loopback_dev); | 1924 | dev_hold(net->loopback_dev); |
1931 | in6_dev_hold(idev); | 1925 | in6_dev_hold(idev); |
1932 | 1926 | ||
1933 | rt->u.dst.flags = DST_HOST; | 1927 | rt->dst.flags = DST_HOST; |
1934 | rt->u.dst.input = ip6_input; | 1928 | rt->dst.input = ip6_input; |
1935 | rt->u.dst.output = ip6_output; | 1929 | rt->dst.output = ip6_output; |
1936 | rt->rt6i_dev = net->loopback_dev; | 1930 | rt->rt6i_dev = net->loopback_dev; |
1937 | rt->rt6i_idev = idev; | 1931 | rt->rt6i_idev = idev; |
1938 | rt->u.dst.metrics[RTAX_MTU-1] = ipv6_get_mtu(rt->rt6i_dev); | 1932 | rt->dst.metrics[RTAX_MTU-1] = ipv6_get_mtu(rt->rt6i_dev); |
1939 | rt->u.dst.metrics[RTAX_ADVMSS-1] = ipv6_advmss(net, dst_mtu(&rt->u.dst)); | 1933 | rt->dst.metrics[RTAX_ADVMSS-1] = ipv6_advmss(net, dst_mtu(&rt->dst)); |
1940 | rt->u.dst.metrics[RTAX_HOPLIMIT-1] = -1; | 1934 | rt->dst.metrics[RTAX_HOPLIMIT-1] = -1; |
1941 | rt->u.dst.obsolete = -1; | 1935 | rt->dst.obsolete = -1; |
1942 | 1936 | ||
1943 | rt->rt6i_flags = RTF_UP | RTF_NONEXTHOP; | 1937 | rt->rt6i_flags = RTF_UP | RTF_NONEXTHOP; |
1944 | if (anycast) | 1938 | if (anycast) |
@@ -1947,7 +1941,7 @@ struct rt6_info *addrconf_dst_alloc(struct inet6_dev *idev, | |||
1947 | rt->rt6i_flags |= RTF_LOCAL; | 1941 | rt->rt6i_flags |= RTF_LOCAL; |
1948 | neigh = ndisc_get_neigh(rt->rt6i_dev, &rt->rt6i_gateway); | 1942 | neigh = ndisc_get_neigh(rt->rt6i_dev, &rt->rt6i_gateway); |
1949 | if (IS_ERR(neigh)) { | 1943 | if (IS_ERR(neigh)) { |
1950 | dst_free(&rt->u.dst); | 1944 | dst_free(&rt->dst); |
1951 | 1945 | ||
1952 | /* We are casting this because that is the return | 1946 | /* We are casting this because that is the return |
1953 | * value type. But an errno encoded pointer is the | 1947 | * value type. But an errno encoded pointer is the |
@@ -1962,7 +1956,7 @@ struct rt6_info *addrconf_dst_alloc(struct inet6_dev *idev, | |||
1962 | rt->rt6i_dst.plen = 128; | 1956 | rt->rt6i_dst.plen = 128; |
1963 | rt->rt6i_table = fib6_get_table(net, RT6_TABLE_LOCAL); | 1957 | rt->rt6i_table = fib6_get_table(net, RT6_TABLE_LOCAL); |
1964 | 1958 | ||
1965 | atomic_set(&rt->u.dst.__refcnt, 1); | 1959 | atomic_set(&rt->dst.__refcnt, 1); |
1966 | 1960 | ||
1967 | return rt; | 1961 | return rt; |
1968 | } | 1962 | } |
@@ -2033,12 +2027,12 @@ static int rt6_mtu_change_route(struct rt6_info *rt, void *p_arg) | |||
2033 | PMTU discouvery. | 2027 | PMTU discouvery. |
2034 | */ | 2028 | */ |
2035 | if (rt->rt6i_dev == arg->dev && | 2029 | if (rt->rt6i_dev == arg->dev && |
2036 | !dst_metric_locked(&rt->u.dst, RTAX_MTU) && | 2030 | !dst_metric_locked(&rt->dst, RTAX_MTU) && |
2037 | (dst_mtu(&rt->u.dst) >= arg->mtu || | 2031 | (dst_mtu(&rt->dst) >= arg->mtu || |
2038 | (dst_mtu(&rt->u.dst) < arg->mtu && | 2032 | (dst_mtu(&rt->dst) < arg->mtu && |
2039 | dst_mtu(&rt->u.dst) == idev->cnf.mtu6))) { | 2033 | dst_mtu(&rt->dst) == idev->cnf.mtu6))) { |
2040 | rt->u.dst.metrics[RTAX_MTU-1] = arg->mtu; | 2034 | rt->dst.metrics[RTAX_MTU-1] = arg->mtu; |
2041 | rt->u.dst.metrics[RTAX_ADVMSS-1] = ipv6_advmss(net, arg->mtu); | 2035 | rt->dst.metrics[RTAX_ADVMSS-1] = ipv6_advmss(net, arg->mtu); |
2042 | } | 2036 | } |
2043 | return 0; | 2037 | return 0; |
2044 | } | 2038 | } |
@@ -2252,20 +2246,20 @@ static int rt6_fill_node(struct net *net, | |||
2252 | #endif | 2246 | #endif |
2253 | NLA_PUT_U32(skb, RTA_IIF, iif); | 2247 | NLA_PUT_U32(skb, RTA_IIF, iif); |
2254 | } else if (dst) { | 2248 | } else if (dst) { |
2255 | struct inet6_dev *idev = ip6_dst_idev(&rt->u.dst); | 2249 | struct inet6_dev *idev = ip6_dst_idev(&rt->dst); |
2256 | struct in6_addr saddr_buf; | 2250 | struct in6_addr saddr_buf; |
2257 | if (ipv6_dev_get_saddr(net, idev ? idev->dev : NULL, | 2251 | if (ipv6_dev_get_saddr(net, idev ? idev->dev : NULL, |
2258 | dst, 0, &saddr_buf) == 0) | 2252 | dst, 0, &saddr_buf) == 0) |
2259 | NLA_PUT(skb, RTA_PREFSRC, 16, &saddr_buf); | 2253 | NLA_PUT(skb, RTA_PREFSRC, 16, &saddr_buf); |
2260 | } | 2254 | } |
2261 | 2255 | ||
2262 | if (rtnetlink_put_metrics(skb, rt->u.dst.metrics) < 0) | 2256 | if (rtnetlink_put_metrics(skb, rt->dst.metrics) < 0) |
2263 | goto nla_put_failure; | 2257 | goto nla_put_failure; |
2264 | 2258 | ||
2265 | if (rt->u.dst.neighbour) | 2259 | if (rt->dst.neighbour) |
2266 | NLA_PUT(skb, RTA_GATEWAY, 16, &rt->u.dst.neighbour->primary_key); | 2260 | NLA_PUT(skb, RTA_GATEWAY, 16, &rt->dst.neighbour->primary_key); |
2267 | 2261 | ||
2268 | if (rt->u.dst.dev) | 2262 | if (rt->dst.dev) |
2269 | NLA_PUT_U32(skb, RTA_OIF, rt->rt6i_dev->ifindex); | 2263 | NLA_PUT_U32(skb, RTA_OIF, rt->rt6i_dev->ifindex); |
2270 | 2264 | ||
2271 | NLA_PUT_U32(skb, RTA_PRIORITY, rt->rt6i_metric); | 2265 | NLA_PUT_U32(skb, RTA_PRIORITY, rt->rt6i_metric); |
@@ -2277,8 +2271,8 @@ static int rt6_fill_node(struct net *net, | |||
2277 | else | 2271 | else |
2278 | expires = INT_MAX; | 2272 | expires = INT_MAX; |
2279 | 2273 | ||
2280 | if (rtnl_put_cacheinfo(skb, &rt->u.dst, 0, 0, 0, | 2274 | if (rtnl_put_cacheinfo(skb, &rt->dst, 0, 0, 0, |
2281 | expires, rt->u.dst.error) < 0) | 2275 | expires, rt->dst.error) < 0) |
2282 | goto nla_put_failure; | 2276 | goto nla_put_failure; |
2283 | 2277 | ||
2284 | return nlmsg_end(skb, nlh); | 2278 | return nlmsg_end(skb, nlh); |
@@ -2364,7 +2358,7 @@ static int inet6_rtm_getroute(struct sk_buff *in_skb, struct nlmsghdr* nlh, void | |||
2364 | skb_reserve(skb, MAX_HEADER + sizeof(struct ipv6hdr)); | 2358 | skb_reserve(skb, MAX_HEADER + sizeof(struct ipv6hdr)); |
2365 | 2359 | ||
2366 | rt = (struct rt6_info*) ip6_route_output(net, NULL, &fl); | 2360 | rt = (struct rt6_info*) ip6_route_output(net, NULL, &fl); |
2367 | skb_dst_set(skb, &rt->u.dst); | 2361 | skb_dst_set(skb, &rt->dst); |
2368 | 2362 | ||
2369 | err = rt6_fill_node(net, skb, rt, &fl.fl6_dst, &fl.fl6_src, iif, | 2363 | err = rt6_fill_node(net, skb, rt, &fl.fl6_dst, &fl.fl6_src, iif, |
2370 | RTM_NEWROUTE, NETLINK_CB(in_skb).pid, | 2364 | RTM_NEWROUTE, NETLINK_CB(in_skb).pid, |
@@ -2416,12 +2410,12 @@ static int ip6_route_dev_notify(struct notifier_block *this, | |||
2416 | struct net *net = dev_net(dev); | 2410 | struct net *net = dev_net(dev); |
2417 | 2411 | ||
2418 | if (event == NETDEV_REGISTER && (dev->flags & IFF_LOOPBACK)) { | 2412 | if (event == NETDEV_REGISTER && (dev->flags & IFF_LOOPBACK)) { |
2419 | net->ipv6.ip6_null_entry->u.dst.dev = dev; | 2413 | net->ipv6.ip6_null_entry->dst.dev = dev; |
2420 | net->ipv6.ip6_null_entry->rt6i_idev = in6_dev_get(dev); | 2414 | net->ipv6.ip6_null_entry->rt6i_idev = in6_dev_get(dev); |
2421 | #ifdef CONFIG_IPV6_MULTIPLE_TABLES | 2415 | #ifdef CONFIG_IPV6_MULTIPLE_TABLES |
2422 | net->ipv6.ip6_prohibit_entry->u.dst.dev = dev; | 2416 | net->ipv6.ip6_prohibit_entry->dst.dev = dev; |
2423 | net->ipv6.ip6_prohibit_entry->rt6i_idev = in6_dev_get(dev); | 2417 | net->ipv6.ip6_prohibit_entry->rt6i_idev = in6_dev_get(dev); |
2424 | net->ipv6.ip6_blk_hole_entry->u.dst.dev = dev; | 2418 | net->ipv6.ip6_blk_hole_entry->dst.dev = dev; |
2425 | net->ipv6.ip6_blk_hole_entry->rt6i_idev = in6_dev_get(dev); | 2419 | net->ipv6.ip6_blk_hole_entry->rt6i_idev = in6_dev_get(dev); |
2426 | #endif | 2420 | #endif |
2427 | } | 2421 | } |
@@ -2464,8 +2458,8 @@ static int rt6_info_route(struct rt6_info *rt, void *p_arg) | |||
2464 | seq_puts(m, "00000000000000000000000000000000"); | 2458 | seq_puts(m, "00000000000000000000000000000000"); |
2465 | } | 2459 | } |
2466 | seq_printf(m, " %08x %08x %08x %08x %8s\n", | 2460 | seq_printf(m, " %08x %08x %08x %08x %8s\n", |
2467 | rt->rt6i_metric, atomic_read(&rt->u.dst.__refcnt), | 2461 | rt->rt6i_metric, atomic_read(&rt->dst.__refcnt), |
2468 | rt->u.dst.__use, rt->rt6i_flags, | 2462 | rt->dst.__use, rt->rt6i_flags, |
2469 | rt->rt6i_dev ? rt->rt6i_dev->name : ""); | 2463 | rt->rt6i_dev ? rt->rt6i_dev->name : ""); |
2470 | return 0; | 2464 | return 0; |
2471 | } | 2465 | } |
@@ -2646,9 +2640,9 @@ static int __net_init ip6_route_net_init(struct net *net) | |||
2646 | GFP_KERNEL); | 2640 | GFP_KERNEL); |
2647 | if (!net->ipv6.ip6_null_entry) | 2641 | if (!net->ipv6.ip6_null_entry) |
2648 | goto out_ip6_dst_ops; | 2642 | goto out_ip6_dst_ops; |
2649 | net->ipv6.ip6_null_entry->u.dst.path = | 2643 | net->ipv6.ip6_null_entry->dst.path = |
2650 | (struct dst_entry *)net->ipv6.ip6_null_entry; | 2644 | (struct dst_entry *)net->ipv6.ip6_null_entry; |
2651 | net->ipv6.ip6_null_entry->u.dst.ops = &net->ipv6.ip6_dst_ops; | 2645 | net->ipv6.ip6_null_entry->dst.ops = &net->ipv6.ip6_dst_ops; |
2652 | 2646 | ||
2653 | #ifdef CONFIG_IPV6_MULTIPLE_TABLES | 2647 | #ifdef CONFIG_IPV6_MULTIPLE_TABLES |
2654 | net->ipv6.ip6_prohibit_entry = kmemdup(&ip6_prohibit_entry_template, | 2648 | net->ipv6.ip6_prohibit_entry = kmemdup(&ip6_prohibit_entry_template, |
@@ -2656,18 +2650,18 @@ static int __net_init ip6_route_net_init(struct net *net) | |||
2656 | GFP_KERNEL); | 2650 | GFP_KERNEL); |
2657 | if (!net->ipv6.ip6_prohibit_entry) | 2651 | if (!net->ipv6.ip6_prohibit_entry) |
2658 | goto out_ip6_null_entry; | 2652 | goto out_ip6_null_entry; |
2659 | net->ipv6.ip6_prohibit_entry->u.dst.path = | 2653 | net->ipv6.ip6_prohibit_entry->dst.path = |
2660 | (struct dst_entry *)net->ipv6.ip6_prohibit_entry; | 2654 | (struct dst_entry *)net->ipv6.ip6_prohibit_entry; |
2661 | net->ipv6.ip6_prohibit_entry->u.dst.ops = &net->ipv6.ip6_dst_ops; | 2655 | net->ipv6.ip6_prohibit_entry->dst.ops = &net->ipv6.ip6_dst_ops; |
2662 | 2656 | ||
2663 | net->ipv6.ip6_blk_hole_entry = kmemdup(&ip6_blk_hole_entry_template, | 2657 | net->ipv6.ip6_blk_hole_entry = kmemdup(&ip6_blk_hole_entry_template, |
2664 | sizeof(*net->ipv6.ip6_blk_hole_entry), | 2658 | sizeof(*net->ipv6.ip6_blk_hole_entry), |
2665 | GFP_KERNEL); | 2659 | GFP_KERNEL); |
2666 | if (!net->ipv6.ip6_blk_hole_entry) | 2660 | if (!net->ipv6.ip6_blk_hole_entry) |
2667 | goto out_ip6_prohibit_entry; | 2661 | goto out_ip6_prohibit_entry; |
2668 | net->ipv6.ip6_blk_hole_entry->u.dst.path = | 2662 | net->ipv6.ip6_blk_hole_entry->dst.path = |
2669 | (struct dst_entry *)net->ipv6.ip6_blk_hole_entry; | 2663 | (struct dst_entry *)net->ipv6.ip6_blk_hole_entry; |
2670 | net->ipv6.ip6_blk_hole_entry->u.dst.ops = &net->ipv6.ip6_dst_ops; | 2664 | net->ipv6.ip6_blk_hole_entry->dst.ops = &net->ipv6.ip6_dst_ops; |
2671 | #endif | 2665 | #endif |
2672 | 2666 | ||
2673 | net->ipv6.sysctl.flush_delay = 0; | 2667 | net->ipv6.sysctl.flush_delay = 0; |
@@ -2742,12 +2736,12 @@ int __init ip6_route_init(void) | |||
2742 | /* Registering of the loopback is done before this portion of code, | 2736 | /* Registering of the loopback is done before this portion of code, |
2743 | * the loopback reference in rt6_info will not be taken, do it | 2737 | * the loopback reference in rt6_info will not be taken, do it |
2744 | * manually for init_net */ | 2738 | * manually for init_net */ |
2745 | init_net.ipv6.ip6_null_entry->u.dst.dev = init_net.loopback_dev; | 2739 | init_net.ipv6.ip6_null_entry->dst.dev = init_net.loopback_dev; |
2746 | init_net.ipv6.ip6_null_entry->rt6i_idev = in6_dev_get(init_net.loopback_dev); | 2740 | init_net.ipv6.ip6_null_entry->rt6i_idev = in6_dev_get(init_net.loopback_dev); |
2747 | #ifdef CONFIG_IPV6_MULTIPLE_TABLES | 2741 | #ifdef CONFIG_IPV6_MULTIPLE_TABLES |
2748 | init_net.ipv6.ip6_prohibit_entry->u.dst.dev = init_net.loopback_dev; | 2742 | init_net.ipv6.ip6_prohibit_entry->dst.dev = init_net.loopback_dev; |
2749 | init_net.ipv6.ip6_prohibit_entry->rt6i_idev = in6_dev_get(init_net.loopback_dev); | 2743 | init_net.ipv6.ip6_prohibit_entry->rt6i_idev = in6_dev_get(init_net.loopback_dev); |
2750 | init_net.ipv6.ip6_blk_hole_entry->u.dst.dev = init_net.loopback_dev; | 2744 | init_net.ipv6.ip6_blk_hole_entry->dst.dev = init_net.loopback_dev; |
2751 | init_net.ipv6.ip6_blk_hole_entry->rt6i_idev = in6_dev_get(init_net.loopback_dev); | 2745 | init_net.ipv6.ip6_blk_hole_entry->rt6i_idev = in6_dev_get(init_net.loopback_dev); |
2752 | #endif | 2746 | #endif |
2753 | ret = fib6_init(); | 2747 | ret = fib6_init(); |
diff --git a/net/ipv6/sit.c b/net/ipv6/sit.c index 702c532ec21e..4699cd3c3118 100644 --- a/net/ipv6/sit.c +++ b/net/ipv6/sit.c | |||
@@ -712,7 +712,7 @@ static netdev_tx_t ipip6_tunnel_xmit(struct sk_buff *skb, | |||
712 | stats->tx_carrier_errors++; | 712 | stats->tx_carrier_errors++; |
713 | goto tx_error_icmp; | 713 | goto tx_error_icmp; |
714 | } | 714 | } |
715 | tdev = rt->u.dst.dev; | 715 | tdev = rt->dst.dev; |
716 | 716 | ||
717 | if (tdev == dev) { | 717 | if (tdev == dev) { |
718 | ip_rt_put(rt); | 718 | ip_rt_put(rt); |
@@ -721,7 +721,7 @@ static netdev_tx_t ipip6_tunnel_xmit(struct sk_buff *skb, | |||
721 | } | 721 | } |
722 | 722 | ||
723 | if (df) { | 723 | if (df) { |
724 | mtu = dst_mtu(&rt->u.dst) - sizeof(struct iphdr); | 724 | mtu = dst_mtu(&rt->dst) - sizeof(struct iphdr); |
725 | 725 | ||
726 | if (mtu < 68) { | 726 | if (mtu < 68) { |
727 | stats->collisions++; | 727 | stats->collisions++; |
@@ -780,7 +780,7 @@ static netdev_tx_t ipip6_tunnel_xmit(struct sk_buff *skb, | |||
780 | memset(&(IPCB(skb)->opt), 0, sizeof(IPCB(skb)->opt)); | 780 | memset(&(IPCB(skb)->opt), 0, sizeof(IPCB(skb)->opt)); |
781 | IPCB(skb)->flags = 0; | 781 | IPCB(skb)->flags = 0; |
782 | skb_dst_drop(skb); | 782 | skb_dst_drop(skb); |
783 | skb_dst_set(skb, &rt->u.dst); | 783 | skb_dst_set(skb, &rt->dst); |
784 | 784 | ||
785 | /* | 785 | /* |
786 | * Push down and install the IPIP header. | 786 | * Push down and install the IPIP header. |
@@ -829,7 +829,7 @@ static void ipip6_tunnel_bind_dev(struct net_device *dev) | |||
829 | .proto = IPPROTO_IPV6 }; | 829 | .proto = IPPROTO_IPV6 }; |
830 | struct rtable *rt; | 830 | struct rtable *rt; |
831 | if (!ip_route_output_key(dev_net(dev), &rt, &fl)) { | 831 | if (!ip_route_output_key(dev_net(dev), &rt, &fl)) { |
832 | tdev = rt->u.dst.dev; | 832 | tdev = rt->dst.dev; |
833 | ip_rt_put(rt); | 833 | ip_rt_put(rt); |
834 | } | 834 | } |
835 | dev->flags |= IFF_POINTOPOINT; | 835 | dev->flags |= IFF_POINTOPOINT; |
diff --git a/net/l2tp/l2tp_ip.c b/net/l2tp/l2tp_ip.c index 0852512d392c..226a0ae3bcfd 100644 --- a/net/l2tp/l2tp_ip.c +++ b/net/l2tp/l2tp_ip.c | |||
@@ -348,7 +348,7 @@ static int l2tp_ip_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len | |||
348 | sk->sk_state = TCP_ESTABLISHED; | 348 | sk->sk_state = TCP_ESTABLISHED; |
349 | inet->inet_id = jiffies; | 349 | inet->inet_id = jiffies; |
350 | 350 | ||
351 | sk_dst_set(sk, &rt->u.dst); | 351 | sk_dst_set(sk, &rt->dst); |
352 | 352 | ||
353 | write_lock_bh(&l2tp_ip_lock); | 353 | write_lock_bh(&l2tp_ip_lock); |
354 | hlist_del_init(&sk->sk_bind_node); | 354 | hlist_del_init(&sk->sk_bind_node); |
@@ -496,9 +496,9 @@ static int l2tp_ip_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *m | |||
496 | if (ip_route_output_flow(sock_net(sk), &rt, &fl, sk, 0)) | 496 | if (ip_route_output_flow(sock_net(sk), &rt, &fl, sk, 0)) |
497 | goto no_route; | 497 | goto no_route; |
498 | } | 498 | } |
499 | sk_setup_caps(sk, &rt->u.dst); | 499 | sk_setup_caps(sk, &rt->dst); |
500 | } | 500 | } |
501 | skb_dst_set(skb, dst_clone(&rt->u.dst)); | 501 | skb_dst_set(skb, dst_clone(&rt->dst)); |
502 | 502 | ||
503 | /* Queue the packet to IP for output */ | 503 | /* Queue the packet to IP for output */ |
504 | rc = ip_queue_xmit(skb); | 504 | rc = ip_queue_xmit(skb); |
diff --git a/net/netfilter/ipvs/ip_vs_xmit.c b/net/netfilter/ipvs/ip_vs_xmit.c index 93c15a107b2c..02b078e11cf3 100644 --- a/net/netfilter/ipvs/ip_vs_xmit.c +++ b/net/netfilter/ipvs/ip_vs_xmit.c | |||
@@ -90,10 +90,10 @@ __ip_vs_get_out_rt(struct ip_vs_conn *cp, u32 rtos) | |||
90 | &dest->addr.ip); | 90 | &dest->addr.ip); |
91 | return NULL; | 91 | return NULL; |
92 | } | 92 | } |
93 | __ip_vs_dst_set(dest, rtos, dst_clone(&rt->u.dst)); | 93 | __ip_vs_dst_set(dest, rtos, dst_clone(&rt->dst)); |
94 | IP_VS_DBG(10, "new dst %pI4, refcnt=%d, rtos=%X\n", | 94 | IP_VS_DBG(10, "new dst %pI4, refcnt=%d, rtos=%X\n", |
95 | &dest->addr.ip, | 95 | &dest->addr.ip, |
96 | atomic_read(&rt->u.dst.__refcnt), rtos); | 96 | atomic_read(&rt->dst.__refcnt), rtos); |
97 | } | 97 | } |
98 | spin_unlock(&dest->dst_lock); | 98 | spin_unlock(&dest->dst_lock); |
99 | } else { | 99 | } else { |
@@ -148,10 +148,10 @@ __ip_vs_get_out_rt_v6(struct ip_vs_conn *cp) | |||
148 | &dest->addr.in6); | 148 | &dest->addr.in6); |
149 | return NULL; | 149 | return NULL; |
150 | } | 150 | } |
151 | __ip_vs_dst_set(dest, 0, dst_clone(&rt->u.dst)); | 151 | __ip_vs_dst_set(dest, 0, dst_clone(&rt->dst)); |
152 | IP_VS_DBG(10, "new dst %pI6, refcnt=%d\n", | 152 | IP_VS_DBG(10, "new dst %pI6, refcnt=%d\n", |
153 | &dest->addr.in6, | 153 | &dest->addr.in6, |
154 | atomic_read(&rt->u.dst.__refcnt)); | 154 | atomic_read(&rt->dst.__refcnt)); |
155 | } | 155 | } |
156 | spin_unlock(&dest->dst_lock); | 156 | spin_unlock(&dest->dst_lock); |
157 | } else { | 157 | } else { |
@@ -198,7 +198,7 @@ do { \ | |||
198 | (skb)->ipvs_property = 1; \ | 198 | (skb)->ipvs_property = 1; \ |
199 | skb_forward_csum(skb); \ | 199 | skb_forward_csum(skb); \ |
200 | NF_HOOK(pf, NF_INET_LOCAL_OUT, (skb), NULL, \ | 200 | NF_HOOK(pf, NF_INET_LOCAL_OUT, (skb), NULL, \ |
201 | (rt)->u.dst.dev, dst_output); \ | 201 | (rt)->dst.dev, dst_output); \ |
202 | } while (0) | 202 | } while (0) |
203 | 203 | ||
204 | 204 | ||
@@ -245,7 +245,7 @@ ip_vs_bypass_xmit(struct sk_buff *skb, struct ip_vs_conn *cp, | |||
245 | } | 245 | } |
246 | 246 | ||
247 | /* MTU checking */ | 247 | /* MTU checking */ |
248 | mtu = dst_mtu(&rt->u.dst); | 248 | mtu = dst_mtu(&rt->dst); |
249 | if ((skb->len > mtu) && (iph->frag_off & htons(IP_DF))) { | 249 | if ((skb->len > mtu) && (iph->frag_off & htons(IP_DF))) { |
250 | ip_rt_put(rt); | 250 | ip_rt_put(rt); |
251 | icmp_send(skb, ICMP_DEST_UNREACH,ICMP_FRAG_NEEDED, htonl(mtu)); | 251 | icmp_send(skb, ICMP_DEST_UNREACH,ICMP_FRAG_NEEDED, htonl(mtu)); |
@@ -265,7 +265,7 @@ ip_vs_bypass_xmit(struct sk_buff *skb, struct ip_vs_conn *cp, | |||
265 | 265 | ||
266 | /* drop old route */ | 266 | /* drop old route */ |
267 | skb_dst_drop(skb); | 267 | skb_dst_drop(skb); |
268 | skb_dst_set(skb, &rt->u.dst); | 268 | skb_dst_set(skb, &rt->dst); |
269 | 269 | ||
270 | /* Another hack: avoid icmp_send in ip_fragment */ | 270 | /* Another hack: avoid icmp_send in ip_fragment */ |
271 | skb->local_df = 1; | 271 | skb->local_df = 1; |
@@ -309,9 +309,9 @@ ip_vs_bypass_xmit_v6(struct sk_buff *skb, struct ip_vs_conn *cp, | |||
309 | } | 309 | } |
310 | 310 | ||
311 | /* MTU checking */ | 311 | /* MTU checking */ |
312 | mtu = dst_mtu(&rt->u.dst); | 312 | mtu = dst_mtu(&rt->dst); |
313 | if (skb->len > mtu) { | 313 | if (skb->len > mtu) { |
314 | dst_release(&rt->u.dst); | 314 | dst_release(&rt->dst); |
315 | icmpv6_send(skb, ICMPV6_PKT_TOOBIG, 0, mtu); | 315 | icmpv6_send(skb, ICMPV6_PKT_TOOBIG, 0, mtu); |
316 | IP_VS_DBG_RL("%s(): frag needed\n", __func__); | 316 | IP_VS_DBG_RL("%s(): frag needed\n", __func__); |
317 | goto tx_error; | 317 | goto tx_error; |
@@ -323,13 +323,13 @@ ip_vs_bypass_xmit_v6(struct sk_buff *skb, struct ip_vs_conn *cp, | |||
323 | */ | 323 | */ |
324 | skb = skb_share_check(skb, GFP_ATOMIC); | 324 | skb = skb_share_check(skb, GFP_ATOMIC); |
325 | if (unlikely(skb == NULL)) { | 325 | if (unlikely(skb == NULL)) { |
326 | dst_release(&rt->u.dst); | 326 | dst_release(&rt->dst); |
327 | return NF_STOLEN; | 327 | return NF_STOLEN; |
328 | } | 328 | } |
329 | 329 | ||
330 | /* drop old route */ | 330 | /* drop old route */ |
331 | skb_dst_drop(skb); | 331 | skb_dst_drop(skb); |
332 | skb_dst_set(skb, &rt->u.dst); | 332 | skb_dst_set(skb, &rt->dst); |
333 | 333 | ||
334 | /* Another hack: avoid icmp_send in ip_fragment */ | 334 | /* Another hack: avoid icmp_send in ip_fragment */ |
335 | skb->local_df = 1; | 335 | skb->local_df = 1; |
@@ -376,7 +376,7 @@ ip_vs_nat_xmit(struct sk_buff *skb, struct ip_vs_conn *cp, | |||
376 | goto tx_error_icmp; | 376 | goto tx_error_icmp; |
377 | 377 | ||
378 | /* MTU checking */ | 378 | /* MTU checking */ |
379 | mtu = dst_mtu(&rt->u.dst); | 379 | mtu = dst_mtu(&rt->dst); |
380 | if ((skb->len > mtu) && (iph->frag_off & htons(IP_DF))) { | 380 | if ((skb->len > mtu) && (iph->frag_off & htons(IP_DF))) { |
381 | ip_rt_put(rt); | 381 | ip_rt_put(rt); |
382 | icmp_send(skb, ICMP_DEST_UNREACH,ICMP_FRAG_NEEDED, htonl(mtu)); | 382 | icmp_send(skb, ICMP_DEST_UNREACH,ICMP_FRAG_NEEDED, htonl(mtu)); |
@@ -388,12 +388,12 @@ ip_vs_nat_xmit(struct sk_buff *skb, struct ip_vs_conn *cp, | |||
388 | if (!skb_make_writable(skb, sizeof(struct iphdr))) | 388 | if (!skb_make_writable(skb, sizeof(struct iphdr))) |
389 | goto tx_error_put; | 389 | goto tx_error_put; |
390 | 390 | ||
391 | if (skb_cow(skb, rt->u.dst.dev->hard_header_len)) | 391 | if (skb_cow(skb, rt->dst.dev->hard_header_len)) |
392 | goto tx_error_put; | 392 | goto tx_error_put; |
393 | 393 | ||
394 | /* drop old route */ | 394 | /* drop old route */ |
395 | skb_dst_drop(skb); | 395 | skb_dst_drop(skb); |
396 | skb_dst_set(skb, &rt->u.dst); | 396 | skb_dst_set(skb, &rt->dst); |
397 | 397 | ||
398 | /* mangle the packet */ | 398 | /* mangle the packet */ |
399 | if (pp->dnat_handler && !pp->dnat_handler(skb, pp, cp)) | 399 | if (pp->dnat_handler && !pp->dnat_handler(skb, pp, cp)) |
@@ -452,9 +452,9 @@ ip_vs_nat_xmit_v6(struct sk_buff *skb, struct ip_vs_conn *cp, | |||
452 | goto tx_error_icmp; | 452 | goto tx_error_icmp; |
453 | 453 | ||
454 | /* MTU checking */ | 454 | /* MTU checking */ |
455 | mtu = dst_mtu(&rt->u.dst); | 455 | mtu = dst_mtu(&rt->dst); |
456 | if (skb->len > mtu) { | 456 | if (skb->len > mtu) { |
457 | dst_release(&rt->u.dst); | 457 | dst_release(&rt->dst); |
458 | icmpv6_send(skb, ICMPV6_PKT_TOOBIG, 0, mtu); | 458 | icmpv6_send(skb, ICMPV6_PKT_TOOBIG, 0, mtu); |
459 | IP_VS_DBG_RL_PKT(0, pp, skb, 0, | 459 | IP_VS_DBG_RL_PKT(0, pp, skb, 0, |
460 | "ip_vs_nat_xmit_v6(): frag needed for"); | 460 | "ip_vs_nat_xmit_v6(): frag needed for"); |
@@ -465,12 +465,12 @@ ip_vs_nat_xmit_v6(struct sk_buff *skb, struct ip_vs_conn *cp, | |||
465 | if (!skb_make_writable(skb, sizeof(struct ipv6hdr))) | 465 | if (!skb_make_writable(skb, sizeof(struct ipv6hdr))) |
466 | goto tx_error_put; | 466 | goto tx_error_put; |
467 | 467 | ||
468 | if (skb_cow(skb, rt->u.dst.dev->hard_header_len)) | 468 | if (skb_cow(skb, rt->dst.dev->hard_header_len)) |
469 | goto tx_error_put; | 469 | goto tx_error_put; |
470 | 470 | ||
471 | /* drop old route */ | 471 | /* drop old route */ |
472 | skb_dst_drop(skb); | 472 | skb_dst_drop(skb); |
473 | skb_dst_set(skb, &rt->u.dst); | 473 | skb_dst_set(skb, &rt->dst); |
474 | 474 | ||
475 | /* mangle the packet */ | 475 | /* mangle the packet */ |
476 | if (pp->dnat_handler && !pp->dnat_handler(skb, pp, cp)) | 476 | if (pp->dnat_handler && !pp->dnat_handler(skb, pp, cp)) |
@@ -498,7 +498,7 @@ tx_error: | |||
498 | kfree_skb(skb); | 498 | kfree_skb(skb); |
499 | return NF_STOLEN; | 499 | return NF_STOLEN; |
500 | tx_error_put: | 500 | tx_error_put: |
501 | dst_release(&rt->u.dst); | 501 | dst_release(&rt->dst); |
502 | goto tx_error; | 502 | goto tx_error; |
503 | } | 503 | } |
504 | #endif | 504 | #endif |
@@ -549,9 +549,9 @@ ip_vs_tunnel_xmit(struct sk_buff *skb, struct ip_vs_conn *cp, | |||
549 | if (!(rt = __ip_vs_get_out_rt(cp, RT_TOS(tos)))) | 549 | if (!(rt = __ip_vs_get_out_rt(cp, RT_TOS(tos)))) |
550 | goto tx_error_icmp; | 550 | goto tx_error_icmp; |
551 | 551 | ||
552 | tdev = rt->u.dst.dev; | 552 | tdev = rt->dst.dev; |
553 | 553 | ||
554 | mtu = dst_mtu(&rt->u.dst) - sizeof(struct iphdr); | 554 | mtu = dst_mtu(&rt->dst) - sizeof(struct iphdr); |
555 | if (mtu < 68) { | 555 | if (mtu < 68) { |
556 | ip_rt_put(rt); | 556 | ip_rt_put(rt); |
557 | IP_VS_DBG_RL("%s(): mtu less than 68\n", __func__); | 557 | IP_VS_DBG_RL("%s(): mtu less than 68\n", __func__); |
@@ -601,7 +601,7 @@ ip_vs_tunnel_xmit(struct sk_buff *skb, struct ip_vs_conn *cp, | |||
601 | 601 | ||
602 | /* drop old route */ | 602 | /* drop old route */ |
603 | skb_dst_drop(skb); | 603 | skb_dst_drop(skb); |
604 | skb_dst_set(skb, &rt->u.dst); | 604 | skb_dst_set(skb, &rt->dst); |
605 | 605 | ||
606 | /* | 606 | /* |
607 | * Push down and install the IPIP header. | 607 | * Push down and install the IPIP header. |
@@ -615,7 +615,7 @@ ip_vs_tunnel_xmit(struct sk_buff *skb, struct ip_vs_conn *cp, | |||
615 | iph->daddr = rt->rt_dst; | 615 | iph->daddr = rt->rt_dst; |
616 | iph->saddr = rt->rt_src; | 616 | iph->saddr = rt->rt_src; |
617 | iph->ttl = old_iph->ttl; | 617 | iph->ttl = old_iph->ttl; |
618 | ip_select_ident(iph, &rt->u.dst, NULL); | 618 | ip_select_ident(iph, &rt->dst, NULL); |
619 | 619 | ||
620 | /* Another hack: avoid icmp_send in ip_fragment */ | 620 | /* Another hack: avoid icmp_send in ip_fragment */ |
621 | skb->local_df = 1; | 621 | skb->local_df = 1; |
@@ -660,12 +660,12 @@ ip_vs_tunnel_xmit_v6(struct sk_buff *skb, struct ip_vs_conn *cp, | |||
660 | if (!rt) | 660 | if (!rt) |
661 | goto tx_error_icmp; | 661 | goto tx_error_icmp; |
662 | 662 | ||
663 | tdev = rt->u.dst.dev; | 663 | tdev = rt->dst.dev; |
664 | 664 | ||
665 | mtu = dst_mtu(&rt->u.dst) - sizeof(struct ipv6hdr); | 665 | mtu = dst_mtu(&rt->dst) - sizeof(struct ipv6hdr); |
666 | /* TODO IPv6: do we need this check in IPv6? */ | 666 | /* TODO IPv6: do we need this check in IPv6? */ |
667 | if (mtu < 1280) { | 667 | if (mtu < 1280) { |
668 | dst_release(&rt->u.dst); | 668 | dst_release(&rt->dst); |
669 | IP_VS_DBG_RL("%s(): mtu less than 1280\n", __func__); | 669 | IP_VS_DBG_RL("%s(): mtu less than 1280\n", __func__); |
670 | goto tx_error; | 670 | goto tx_error; |
671 | } | 671 | } |
@@ -674,7 +674,7 @@ ip_vs_tunnel_xmit_v6(struct sk_buff *skb, struct ip_vs_conn *cp, | |||
674 | 674 | ||
675 | if (mtu < ntohs(old_iph->payload_len) + sizeof(struct ipv6hdr)) { | 675 | if (mtu < ntohs(old_iph->payload_len) + sizeof(struct ipv6hdr)) { |
676 | icmpv6_send(skb, ICMPV6_PKT_TOOBIG, 0, mtu); | 676 | icmpv6_send(skb, ICMPV6_PKT_TOOBIG, 0, mtu); |
677 | dst_release(&rt->u.dst); | 677 | dst_release(&rt->dst); |
678 | IP_VS_DBG_RL("%s(): frag needed\n", __func__); | 678 | IP_VS_DBG_RL("%s(): frag needed\n", __func__); |
679 | goto tx_error; | 679 | goto tx_error; |
680 | } | 680 | } |
@@ -689,7 +689,7 @@ ip_vs_tunnel_xmit_v6(struct sk_buff *skb, struct ip_vs_conn *cp, | |||
689 | struct sk_buff *new_skb = | 689 | struct sk_buff *new_skb = |
690 | skb_realloc_headroom(skb, max_headroom); | 690 | skb_realloc_headroom(skb, max_headroom); |
691 | if (!new_skb) { | 691 | if (!new_skb) { |
692 | dst_release(&rt->u.dst); | 692 | dst_release(&rt->dst); |
693 | kfree_skb(skb); | 693 | kfree_skb(skb); |
694 | IP_VS_ERR_RL("%s(): no memory\n", __func__); | 694 | IP_VS_ERR_RL("%s(): no memory\n", __func__); |
695 | return NF_STOLEN; | 695 | return NF_STOLEN; |
@@ -707,7 +707,7 @@ ip_vs_tunnel_xmit_v6(struct sk_buff *skb, struct ip_vs_conn *cp, | |||
707 | 707 | ||
708 | /* drop old route */ | 708 | /* drop old route */ |
709 | skb_dst_drop(skb); | 709 | skb_dst_drop(skb); |
710 | skb_dst_set(skb, &rt->u.dst); | 710 | skb_dst_set(skb, &rt->dst); |
711 | 711 | ||
712 | /* | 712 | /* |
713 | * Push down and install the IPIP header. | 713 | * Push down and install the IPIP header. |
@@ -760,7 +760,7 @@ ip_vs_dr_xmit(struct sk_buff *skb, struct ip_vs_conn *cp, | |||
760 | goto tx_error_icmp; | 760 | goto tx_error_icmp; |
761 | 761 | ||
762 | /* MTU checking */ | 762 | /* MTU checking */ |
763 | mtu = dst_mtu(&rt->u.dst); | 763 | mtu = dst_mtu(&rt->dst); |
764 | if ((iph->frag_off & htons(IP_DF)) && skb->len > mtu) { | 764 | if ((iph->frag_off & htons(IP_DF)) && skb->len > mtu) { |
765 | icmp_send(skb, ICMP_DEST_UNREACH,ICMP_FRAG_NEEDED, htonl(mtu)); | 765 | icmp_send(skb, ICMP_DEST_UNREACH,ICMP_FRAG_NEEDED, htonl(mtu)); |
766 | ip_rt_put(rt); | 766 | ip_rt_put(rt); |
@@ -780,7 +780,7 @@ ip_vs_dr_xmit(struct sk_buff *skb, struct ip_vs_conn *cp, | |||
780 | 780 | ||
781 | /* drop old route */ | 781 | /* drop old route */ |
782 | skb_dst_drop(skb); | 782 | skb_dst_drop(skb); |
783 | skb_dst_set(skb, &rt->u.dst); | 783 | skb_dst_set(skb, &rt->dst); |
784 | 784 | ||
785 | /* Another hack: avoid icmp_send in ip_fragment */ | 785 | /* Another hack: avoid icmp_send in ip_fragment */ |
786 | skb->local_df = 1; | 786 | skb->local_df = 1; |
@@ -813,10 +813,10 @@ ip_vs_dr_xmit_v6(struct sk_buff *skb, struct ip_vs_conn *cp, | |||
813 | goto tx_error_icmp; | 813 | goto tx_error_icmp; |
814 | 814 | ||
815 | /* MTU checking */ | 815 | /* MTU checking */ |
816 | mtu = dst_mtu(&rt->u.dst); | 816 | mtu = dst_mtu(&rt->dst); |
817 | if (skb->len > mtu) { | 817 | if (skb->len > mtu) { |
818 | icmpv6_send(skb, ICMPV6_PKT_TOOBIG, 0, mtu); | 818 | icmpv6_send(skb, ICMPV6_PKT_TOOBIG, 0, mtu); |
819 | dst_release(&rt->u.dst); | 819 | dst_release(&rt->dst); |
820 | IP_VS_DBG_RL("%s(): frag needed\n", __func__); | 820 | IP_VS_DBG_RL("%s(): frag needed\n", __func__); |
821 | goto tx_error; | 821 | goto tx_error; |
822 | } | 822 | } |
@@ -827,13 +827,13 @@ ip_vs_dr_xmit_v6(struct sk_buff *skb, struct ip_vs_conn *cp, | |||
827 | */ | 827 | */ |
828 | skb = skb_share_check(skb, GFP_ATOMIC); | 828 | skb = skb_share_check(skb, GFP_ATOMIC); |
829 | if (unlikely(skb == NULL)) { | 829 | if (unlikely(skb == NULL)) { |
830 | dst_release(&rt->u.dst); | 830 | dst_release(&rt->dst); |
831 | return NF_STOLEN; | 831 | return NF_STOLEN; |
832 | } | 832 | } |
833 | 833 | ||
834 | /* drop old route */ | 834 | /* drop old route */ |
835 | skb_dst_drop(skb); | 835 | skb_dst_drop(skb); |
836 | skb_dst_set(skb, &rt->u.dst); | 836 | skb_dst_set(skb, &rt->dst); |
837 | 837 | ||
838 | /* Another hack: avoid icmp_send in ip_fragment */ | 838 | /* Another hack: avoid icmp_send in ip_fragment */ |
839 | skb->local_df = 1; | 839 | skb->local_df = 1; |
@@ -888,7 +888,7 @@ ip_vs_icmp_xmit(struct sk_buff *skb, struct ip_vs_conn *cp, | |||
888 | goto tx_error_icmp; | 888 | goto tx_error_icmp; |
889 | 889 | ||
890 | /* MTU checking */ | 890 | /* MTU checking */ |
891 | mtu = dst_mtu(&rt->u.dst); | 891 | mtu = dst_mtu(&rt->dst); |
892 | if ((skb->len > mtu) && (ip_hdr(skb)->frag_off & htons(IP_DF))) { | 892 | if ((skb->len > mtu) && (ip_hdr(skb)->frag_off & htons(IP_DF))) { |
893 | ip_rt_put(rt); | 893 | ip_rt_put(rt); |
894 | icmp_send(skb, ICMP_DEST_UNREACH, ICMP_FRAG_NEEDED, htonl(mtu)); | 894 | icmp_send(skb, ICMP_DEST_UNREACH, ICMP_FRAG_NEEDED, htonl(mtu)); |
@@ -900,12 +900,12 @@ ip_vs_icmp_xmit(struct sk_buff *skb, struct ip_vs_conn *cp, | |||
900 | if (!skb_make_writable(skb, offset)) | 900 | if (!skb_make_writable(skb, offset)) |
901 | goto tx_error_put; | 901 | goto tx_error_put; |
902 | 902 | ||
903 | if (skb_cow(skb, rt->u.dst.dev->hard_header_len)) | 903 | if (skb_cow(skb, rt->dst.dev->hard_header_len)) |
904 | goto tx_error_put; | 904 | goto tx_error_put; |
905 | 905 | ||
906 | /* drop the old route when skb is not shared */ | 906 | /* drop the old route when skb is not shared */ |
907 | skb_dst_drop(skb); | 907 | skb_dst_drop(skb); |
908 | skb_dst_set(skb, &rt->u.dst); | 908 | skb_dst_set(skb, &rt->dst); |
909 | 909 | ||
910 | ip_vs_nat_icmp(skb, pp, cp, 0); | 910 | ip_vs_nat_icmp(skb, pp, cp, 0); |
911 | 911 | ||
@@ -963,9 +963,9 @@ ip_vs_icmp_xmit_v6(struct sk_buff *skb, struct ip_vs_conn *cp, | |||
963 | goto tx_error_icmp; | 963 | goto tx_error_icmp; |
964 | 964 | ||
965 | /* MTU checking */ | 965 | /* MTU checking */ |
966 | mtu = dst_mtu(&rt->u.dst); | 966 | mtu = dst_mtu(&rt->dst); |
967 | if (skb->len > mtu) { | 967 | if (skb->len > mtu) { |
968 | dst_release(&rt->u.dst); | 968 | dst_release(&rt->dst); |
969 | icmpv6_send(skb, ICMPV6_PKT_TOOBIG, 0, mtu); | 969 | icmpv6_send(skb, ICMPV6_PKT_TOOBIG, 0, mtu); |
970 | IP_VS_DBG_RL("%s(): frag needed\n", __func__); | 970 | IP_VS_DBG_RL("%s(): frag needed\n", __func__); |
971 | goto tx_error; | 971 | goto tx_error; |
@@ -975,12 +975,12 @@ ip_vs_icmp_xmit_v6(struct sk_buff *skb, struct ip_vs_conn *cp, | |||
975 | if (!skb_make_writable(skb, offset)) | 975 | if (!skb_make_writable(skb, offset)) |
976 | goto tx_error_put; | 976 | goto tx_error_put; |
977 | 977 | ||
978 | if (skb_cow(skb, rt->u.dst.dev->hard_header_len)) | 978 | if (skb_cow(skb, rt->dst.dev->hard_header_len)) |
979 | goto tx_error_put; | 979 | goto tx_error_put; |
980 | 980 | ||
981 | /* drop the old route when skb is not shared */ | 981 | /* drop the old route when skb is not shared */ |
982 | skb_dst_drop(skb); | 982 | skb_dst_drop(skb); |
983 | skb_dst_set(skb, &rt->u.dst); | 983 | skb_dst_set(skb, &rt->dst); |
984 | 984 | ||
985 | ip_vs_nat_icmp_v6(skb, pp, cp, 0); | 985 | ip_vs_nat_icmp_v6(skb, pp, cp, 0); |
986 | 986 | ||
@@ -1001,7 +1001,7 @@ out: | |||
1001 | LeaveFunction(10); | 1001 | LeaveFunction(10); |
1002 | return rc; | 1002 | return rc; |
1003 | tx_error_put: | 1003 | tx_error_put: |
1004 | dst_release(&rt->u.dst); | 1004 | dst_release(&rt->dst); |
1005 | goto tx_error; | 1005 | goto tx_error; |
1006 | } | 1006 | } |
1007 | #endif | 1007 | #endif |
diff --git a/net/netfilter/nf_conntrack_h323_main.c b/net/netfilter/nf_conntrack_h323_main.c index 6eaee7c8a337..b969025cf82f 100644 --- a/net/netfilter/nf_conntrack_h323_main.c +++ b/net/netfilter/nf_conntrack_h323_main.c | |||
@@ -734,11 +734,11 @@ static int callforward_do_filter(const union nf_inet_addr *src, | |||
734 | if (!afinfo->route((struct dst_entry **)&rt1, &fl1)) { | 734 | if (!afinfo->route((struct dst_entry **)&rt1, &fl1)) { |
735 | if (!afinfo->route((struct dst_entry **)&rt2, &fl2)) { | 735 | if (!afinfo->route((struct dst_entry **)&rt2, &fl2)) { |
736 | if (rt1->rt_gateway == rt2->rt_gateway && | 736 | if (rt1->rt_gateway == rt2->rt_gateway && |
737 | rt1->u.dst.dev == rt2->u.dst.dev) | 737 | rt1->dst.dev == rt2->dst.dev) |
738 | ret = 1; | 738 | ret = 1; |
739 | dst_release(&rt2->u.dst); | 739 | dst_release(&rt2->dst); |
740 | } | 740 | } |
741 | dst_release(&rt1->u.dst); | 741 | dst_release(&rt1->dst); |
742 | } | 742 | } |
743 | break; | 743 | break; |
744 | } | 744 | } |
@@ -753,11 +753,11 @@ static int callforward_do_filter(const union nf_inet_addr *src, | |||
753 | if (!afinfo->route((struct dst_entry **)&rt2, &fl2)) { | 753 | if (!afinfo->route((struct dst_entry **)&rt2, &fl2)) { |
754 | if (!memcmp(&rt1->rt6i_gateway, &rt2->rt6i_gateway, | 754 | if (!memcmp(&rt1->rt6i_gateway, &rt2->rt6i_gateway, |
755 | sizeof(rt1->rt6i_gateway)) && | 755 | sizeof(rt1->rt6i_gateway)) && |
756 | rt1->u.dst.dev == rt2->u.dst.dev) | 756 | rt1->dst.dev == rt2->dst.dev) |
757 | ret = 1; | 757 | ret = 1; |
758 | dst_release(&rt2->u.dst); | 758 | dst_release(&rt2->dst); |
759 | } | 759 | } |
760 | dst_release(&rt1->u.dst); | 760 | dst_release(&rt1->dst); |
761 | } | 761 | } |
762 | break; | 762 | break; |
763 | } | 763 | } |
diff --git a/net/netfilter/nf_conntrack_netbios_ns.c b/net/netfilter/nf_conntrack_netbios_ns.c index 497b2224536f..aadde018a072 100644 --- a/net/netfilter/nf_conntrack_netbios_ns.c +++ b/net/netfilter/nf_conntrack_netbios_ns.c | |||
@@ -61,7 +61,7 @@ static int help(struct sk_buff *skb, unsigned int protoff, | |||
61 | goto out; | 61 | goto out; |
62 | 62 | ||
63 | rcu_read_lock(); | 63 | rcu_read_lock(); |
64 | in_dev = __in_dev_get_rcu(rt->u.dst.dev); | 64 | in_dev = __in_dev_get_rcu(rt->dst.dev); |
65 | if (in_dev != NULL) { | 65 | if (in_dev != NULL) { |
66 | for_primary_ifa(in_dev) { | 66 | for_primary_ifa(in_dev) { |
67 | if (ifa->ifa_broadcast == iph->daddr) { | 67 | if (ifa->ifa_broadcast == iph->daddr) { |
diff --git a/net/netfilter/xt_TCPMSS.c b/net/netfilter/xt_TCPMSS.c index 62ec021fbd50..1841388c770a 100644 --- a/net/netfilter/xt_TCPMSS.c +++ b/net/netfilter/xt_TCPMSS.c | |||
@@ -165,8 +165,8 @@ static u_int32_t tcpmss_reverse_mtu(const struct sk_buff *skb, | |||
165 | rcu_read_unlock(); | 165 | rcu_read_unlock(); |
166 | 166 | ||
167 | if (rt != NULL) { | 167 | if (rt != NULL) { |
168 | mtu = dst_mtu(&rt->u.dst); | 168 | mtu = dst_mtu(&rt->dst); |
169 | dst_release(&rt->u.dst); | 169 | dst_release(&rt->dst); |
170 | } | 170 | } |
171 | return mtu; | 171 | return mtu; |
172 | } | 172 | } |
diff --git a/net/netfilter/xt_TEE.c b/net/netfilter/xt_TEE.c index 859d9fd429c8..c77a85bbd9eb 100644 --- a/net/netfilter/xt_TEE.c +++ b/net/netfilter/xt_TEE.c | |||
@@ -77,8 +77,8 @@ tee_tg_route4(struct sk_buff *skb, const struct xt_tee_tginfo *info) | |||
77 | return false; | 77 | return false; |
78 | 78 | ||
79 | skb_dst_drop(skb); | 79 | skb_dst_drop(skb); |
80 | skb_dst_set(skb, &rt->u.dst); | 80 | skb_dst_set(skb, &rt->dst); |
81 | skb->dev = rt->u.dst.dev; | 81 | skb->dev = rt->dst.dev; |
82 | skb->protocol = htons(ETH_P_IP); | 82 | skb->protocol = htons(ETH_P_IP); |
83 | return true; | 83 | return true; |
84 | } | 84 | } |
diff --git a/net/rxrpc/ar-peer.c b/net/rxrpc/ar-peer.c index f0f85b0123f7..9f1729bd60de 100644 --- a/net/rxrpc/ar-peer.c +++ b/net/rxrpc/ar-peer.c | |||
@@ -64,8 +64,8 @@ static void rxrpc_assess_MTU_size(struct rxrpc_peer *peer) | |||
64 | return; | 64 | return; |
65 | } | 65 | } |
66 | 66 | ||
67 | peer->if_mtu = dst_mtu(&rt->u.dst); | 67 | peer->if_mtu = dst_mtu(&rt->dst); |
68 | dst_release(&rt->u.dst); | 68 | dst_release(&rt->dst); |
69 | 69 | ||
70 | _leave(" [if_mtu %u]", peer->if_mtu); | 70 | _leave(" [if_mtu %u]", peer->if_mtu); |
71 | } | 71 | } |
diff --git a/net/sctp/protocol.c b/net/sctp/protocol.c index 182749867c72..a0e1a7fdebbf 100644 --- a/net/sctp/protocol.c +++ b/net/sctp/protocol.c | |||
@@ -490,7 +490,7 @@ static struct dst_entry *sctp_v4_get_dst(struct sctp_association *asoc, | |||
490 | __func__, &fl.fl4_dst, &fl.fl4_src); | 490 | __func__, &fl.fl4_dst, &fl.fl4_src); |
491 | 491 | ||
492 | if (!ip_route_output_key(&init_net, &rt, &fl)) { | 492 | if (!ip_route_output_key(&init_net, &rt, &fl)) { |
493 | dst = &rt->u.dst; | 493 | dst = &rt->dst; |
494 | } | 494 | } |
495 | 495 | ||
496 | /* If there is no association or if a source address is passed, no | 496 | /* If there is no association or if a source address is passed, no |
@@ -534,7 +534,7 @@ static struct dst_entry *sctp_v4_get_dst(struct sctp_association *asoc, | |||
534 | fl.fl4_src = laddr->a.v4.sin_addr.s_addr; | 534 | fl.fl4_src = laddr->a.v4.sin_addr.s_addr; |
535 | fl.fl_ip_sport = laddr->a.v4.sin_port; | 535 | fl.fl_ip_sport = laddr->a.v4.sin_port; |
536 | if (!ip_route_output_key(&init_net, &rt, &fl)) { | 536 | if (!ip_route_output_key(&init_net, &rt, &fl)) { |
537 | dst = &rt->u.dst; | 537 | dst = &rt->dst; |
538 | goto out_unlock; | 538 | goto out_unlock; |
539 | } | 539 | } |
540 | } | 540 | } |