diff options
83 files changed, 414 insertions, 390 deletions
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_cm.c b/drivers/infiniband/ulp/ipoib/ipoib_cm.c index 4248c313936..181b1f32325 100644 --- a/drivers/infiniband/ulp/ipoib/ipoib_cm.c +++ b/drivers/infiniband/ulp/ipoib/ipoib_cm.c | |||
@@ -1394,8 +1394,8 @@ void ipoib_cm_skb_too_long(struct net_device *dev, struct sk_buff *skb, | |||
1394 | struct ipoib_dev_priv *priv = netdev_priv(dev); | 1394 | struct ipoib_dev_priv *priv = netdev_priv(dev); |
1395 | int e = skb_queue_empty(&priv->cm.skb_queue); | 1395 | int e = skb_queue_empty(&priv->cm.skb_queue); |
1396 | 1396 | ||
1397 | if (skb->dst) | 1397 | if (skb_dst(skb)) |
1398 | skb->dst->ops->update_pmtu(skb->dst, mtu); | 1398 | skb_dst(skb)->ops->update_pmtu(skb_dst(skb), mtu); |
1399 | 1399 | ||
1400 | skb_queue_tail(&priv->cm.skb_queue, skb); | 1400 | skb_queue_tail(&priv->cm.skb_queue, skb); |
1401 | if (e) | 1401 | if (e) |
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_main.c b/drivers/infiniband/ulp/ipoib/ipoib_main.c index 69c6304cc94..e319d91f60a 100644 --- a/drivers/infiniband/ulp/ipoib/ipoib_main.c +++ b/drivers/infiniband/ulp/ipoib/ipoib_main.c | |||
@@ -561,7 +561,7 @@ static void neigh_add_path(struct sk_buff *skb, struct net_device *dev) | |||
561 | struct ipoib_neigh *neigh; | 561 | struct ipoib_neigh *neigh; |
562 | unsigned long flags; | 562 | unsigned long flags; |
563 | 563 | ||
564 | neigh = ipoib_neigh_alloc(skb->dst->neighbour, skb->dev); | 564 | neigh = ipoib_neigh_alloc(skb_dst(skb)->neighbour, skb->dev); |
565 | if (!neigh) { | 565 | if (!neigh) { |
566 | ++dev->stats.tx_dropped; | 566 | ++dev->stats.tx_dropped; |
567 | dev_kfree_skb_any(skb); | 567 | dev_kfree_skb_any(skb); |
@@ -570,9 +570,9 @@ static void neigh_add_path(struct sk_buff *skb, struct net_device *dev) | |||
570 | 570 | ||
571 | spin_lock_irqsave(&priv->lock, flags); | 571 | spin_lock_irqsave(&priv->lock, flags); |
572 | 572 | ||
573 | path = __path_find(dev, skb->dst->neighbour->ha + 4); | 573 | path = __path_find(dev, skb_dst(skb)->neighbour->ha + 4); |
574 | if (!path) { | 574 | if (!path) { |
575 | path = path_rec_create(dev, skb->dst->neighbour->ha + 4); | 575 | path = path_rec_create(dev, skb_dst(skb)->neighbour->ha + 4); |
576 | if (!path) | 576 | if (!path) |
577 | goto err_path; | 577 | goto err_path; |
578 | 578 | ||
@@ -605,7 +605,7 @@ static void neigh_add_path(struct sk_buff *skb, struct net_device *dev) | |||
605 | goto err_drop; | 605 | goto err_drop; |
606 | } | 606 | } |
607 | } else | 607 | } else |
608 | ipoib_send(dev, skb, path->ah, IPOIB_QPN(skb->dst->neighbour->ha)); | 608 | ipoib_send(dev, skb, path->ah, IPOIB_QPN(skb_dst(skb)->neighbour->ha)); |
609 | } else { | 609 | } else { |
610 | neigh->ah = NULL; | 610 | neigh->ah = NULL; |
611 | 611 | ||
@@ -635,15 +635,15 @@ static void ipoib_path_lookup(struct sk_buff *skb, struct net_device *dev) | |||
635 | struct ipoib_dev_priv *priv = netdev_priv(skb->dev); | 635 | struct ipoib_dev_priv *priv = netdev_priv(skb->dev); |
636 | 636 | ||
637 | /* Look up path record for unicasts */ | 637 | /* Look up path record for unicasts */ |
638 | if (skb->dst->neighbour->ha[4] != 0xff) { | 638 | if (skb_dst(skb)->neighbour->ha[4] != 0xff) { |
639 | neigh_add_path(skb, dev); | 639 | neigh_add_path(skb, dev); |
640 | return; | 640 | return; |
641 | } | 641 | } |
642 | 642 | ||
643 | /* Add in the P_Key for multicasts */ | 643 | /* Add in the P_Key for multicasts */ |
644 | skb->dst->neighbour->ha[8] = (priv->pkey >> 8) & 0xff; | 644 | skb_dst(skb)->neighbour->ha[8] = (priv->pkey >> 8) & 0xff; |
645 | skb->dst->neighbour->ha[9] = priv->pkey & 0xff; | 645 | skb_dst(skb)->neighbour->ha[9] = priv->pkey & 0xff; |
646 | ipoib_mcast_send(dev, skb->dst->neighbour->ha + 4, skb); | 646 | ipoib_mcast_send(dev, skb_dst(skb)->neighbour->ha + 4, skb); |
647 | } | 647 | } |
648 | 648 | ||
649 | static void unicast_arp_send(struct sk_buff *skb, struct net_device *dev, | 649 | static void unicast_arp_send(struct sk_buff *skb, struct net_device *dev, |
@@ -708,16 +708,16 @@ static int ipoib_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
708 | struct ipoib_neigh *neigh; | 708 | struct ipoib_neigh *neigh; |
709 | unsigned long flags; | 709 | unsigned long flags; |
710 | 710 | ||
711 | if (likely(skb->dst && skb->dst->neighbour)) { | 711 | if (likely(skb_dst(skb) && skb_dst(skb)->neighbour)) { |
712 | if (unlikely(!*to_ipoib_neigh(skb->dst->neighbour))) { | 712 | if (unlikely(!*to_ipoib_neigh(skb_dst(skb)->neighbour))) { |
713 | ipoib_path_lookup(skb, dev); | 713 | ipoib_path_lookup(skb, dev); |
714 | return NETDEV_TX_OK; | 714 | return NETDEV_TX_OK; |
715 | } | 715 | } |
716 | 716 | ||
717 | neigh = *to_ipoib_neigh(skb->dst->neighbour); | 717 | neigh = *to_ipoib_neigh(skb_dst(skb)->neighbour); |
718 | 718 | ||
719 | if (unlikely((memcmp(&neigh->dgid.raw, | 719 | if (unlikely((memcmp(&neigh->dgid.raw, |
720 | skb->dst->neighbour->ha + 4, | 720 | skb_dst(skb)->neighbour->ha + 4, |
721 | sizeof(union ib_gid))) || | 721 | sizeof(union ib_gid))) || |
722 | (neigh->dev != dev))) { | 722 | (neigh->dev != dev))) { |
723 | spin_lock_irqsave(&priv->lock, flags); | 723 | spin_lock_irqsave(&priv->lock, flags); |
@@ -743,7 +743,7 @@ static int ipoib_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
743 | return NETDEV_TX_OK; | 743 | return NETDEV_TX_OK; |
744 | } | 744 | } |
745 | } else if (neigh->ah) { | 745 | } else if (neigh->ah) { |
746 | ipoib_send(dev, skb, neigh->ah, IPOIB_QPN(skb->dst->neighbour->ha)); | 746 | ipoib_send(dev, skb, neigh->ah, IPOIB_QPN(skb_dst(skb)->neighbour->ha)); |
747 | return NETDEV_TX_OK; | 747 | return NETDEV_TX_OK; |
748 | } | 748 | } |
749 | 749 | ||
@@ -772,7 +772,7 @@ static int ipoib_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
772 | if ((be16_to_cpup((__be16 *) skb->data) != ETH_P_ARP) && | 772 | if ((be16_to_cpup((__be16 *) skb->data) != ETH_P_ARP) && |
773 | (be16_to_cpup((__be16 *) skb->data) != ETH_P_RARP)) { | 773 | (be16_to_cpup((__be16 *) skb->data) != ETH_P_RARP)) { |
774 | ipoib_warn(priv, "Unicast, no %s: type %04x, QPN %06x %pI6\n", | 774 | ipoib_warn(priv, "Unicast, no %s: type %04x, QPN %06x %pI6\n", |
775 | skb->dst ? "neigh" : "dst", | 775 | skb_dst(skb) ? "neigh" : "dst", |
776 | be16_to_cpup((__be16 *) skb->data), | 776 | be16_to_cpup((__be16 *) skb->data), |
777 | IPOIB_QPN(phdr->hwaddr), | 777 | IPOIB_QPN(phdr->hwaddr), |
778 | phdr->hwaddr + 4); | 778 | phdr->hwaddr + 4); |
@@ -817,7 +817,7 @@ static int ipoib_hard_header(struct sk_buff *skb, | |||
817 | * destination address onto the front of the skb so we can | 817 | * destination address onto the front of the skb so we can |
818 | * figure out where to send the packet later. | 818 | * figure out where to send the packet later. |
819 | */ | 819 | */ |
820 | if ((!skb->dst || !skb->dst->neighbour) && daddr) { | 820 | if ((!skb_dst(skb) || !skb_dst(skb)->neighbour) && daddr) { |
821 | struct ipoib_pseudoheader *phdr = | 821 | struct ipoib_pseudoheader *phdr = |
822 | (struct ipoib_pseudoheader *) skb_push(skb, sizeof *phdr); | 822 | (struct ipoib_pseudoheader *) skb_push(skb, sizeof *phdr); |
823 | memcpy(phdr->hwaddr, daddr, INFINIBAND_ALEN); | 823 | memcpy(phdr->hwaddr, daddr, INFINIBAND_ALEN); |
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_multicast.c b/drivers/infiniband/ulp/ipoib/ipoib_multicast.c index 425e31112ed..a0e97532e71 100644 --- a/drivers/infiniband/ulp/ipoib/ipoib_multicast.c +++ b/drivers/infiniband/ulp/ipoib/ipoib_multicast.c | |||
@@ -261,7 +261,7 @@ static int ipoib_mcast_join_finish(struct ipoib_mcast *mcast, | |||
261 | 261 | ||
262 | skb->dev = dev; | 262 | skb->dev = dev; |
263 | 263 | ||
264 | if (!skb->dst || !skb->dst->neighbour) { | 264 | if (!skb_dst(skb) || !skb_dst(skb)->neighbour) { |
265 | /* put pseudoheader back on for next time */ | 265 | /* put pseudoheader back on for next time */ |
266 | skb_push(skb, sizeof (struct ipoib_pseudoheader)); | 266 | skb_push(skb, sizeof (struct ipoib_pseudoheader)); |
267 | } | 267 | } |
@@ -707,10 +707,10 @@ void ipoib_mcast_send(struct net_device *dev, void *mgid, struct sk_buff *skb) | |||
707 | 707 | ||
708 | out: | 708 | out: |
709 | if (mcast && mcast->ah) { | 709 | if (mcast && mcast->ah) { |
710 | if (skb->dst && | 710 | if (skb_dst(skb) && |
711 | skb->dst->neighbour && | 711 | skb_dst(skb)->neighbour && |
712 | !*to_ipoib_neigh(skb->dst->neighbour)) { | 712 | !*to_ipoib_neigh(skb_dst(skb)->neighbour)) { |
713 | struct ipoib_neigh *neigh = ipoib_neigh_alloc(skb->dst->neighbour, | 713 | struct ipoib_neigh *neigh = ipoib_neigh_alloc(skb_dst(skb)->neighbour, |
714 | skb->dev); | 714 | skb->dev); |
715 | 715 | ||
716 | if (neigh) { | 716 | if (neigh) { |
diff --git a/drivers/net/pppol2tp.c b/drivers/net/pppol2tp.c index 5981debcde5..e7935d09c89 100644 --- a/drivers/net/pppol2tp.c +++ b/drivers/net/pppol2tp.c | |||
@@ -433,8 +433,7 @@ static void pppol2tp_recv_dequeue_skb(struct pppol2tp_session *session, struct s | |||
433 | * to the inner packet either | 433 | * to the inner packet either |
434 | */ | 434 | */ |
435 | secpath_reset(skb); | 435 | secpath_reset(skb); |
436 | dst_release(skb->dst); | 436 | skb_dst_drop(skb); |
437 | skb->dst = NULL; | ||
438 | nf_reset(skb); | 437 | nf_reset(skb); |
439 | 438 | ||
440 | po = pppox_sk(session_sock); | 439 | po = pppox_sk(session_sock); |
@@ -976,7 +975,7 @@ static int pppol2tp_sendmsg(struct kiocb *iocb, struct socket *sock, struct msgh | |||
976 | /* Calculate UDP checksum if configured to do so */ | 975 | /* Calculate UDP checksum if configured to do so */ |
977 | if (sk_tun->sk_no_check == UDP_CSUM_NOXMIT) | 976 | if (sk_tun->sk_no_check == UDP_CSUM_NOXMIT) |
978 | skb->ip_summed = CHECKSUM_NONE; | 977 | skb->ip_summed = CHECKSUM_NONE; |
979 | else if (!(skb->dst->dev->features & NETIF_F_V4_CSUM)) { | 978 | else if (!(skb_dst(skb)->dev->features & NETIF_F_V4_CSUM)) { |
980 | skb->ip_summed = CHECKSUM_COMPLETE; | 979 | skb->ip_summed = CHECKSUM_COMPLETE; |
981 | csum = skb_checksum(skb, 0, udp_len, 0); | 980 | csum = skb_checksum(skb, 0, udp_len, 0); |
982 | uh->check = csum_tcpudp_magic(inet->saddr, inet->daddr, | 981 | uh->check = csum_tcpudp_magic(inet->saddr, inet->daddr, |
@@ -1172,14 +1171,14 @@ static int pppol2tp_xmit(struct ppp_channel *chan, struct sk_buff *skb) | |||
1172 | nf_reset(skb); | 1171 | nf_reset(skb); |
1173 | 1172 | ||
1174 | /* Get routing info from the tunnel socket */ | 1173 | /* Get routing info from the tunnel socket */ |
1175 | dst_release(skb->dst); | 1174 | skb_dst_drop(skb); |
1176 | skb->dst = dst_clone(__sk_dst_get(sk_tun)); | 1175 | skb_dst_set(skb, dst_clone(__sk_dst_get(sk_tun))); |
1177 | pppol2tp_skb_set_owner_w(skb, sk_tun); | 1176 | pppol2tp_skb_set_owner_w(skb, sk_tun); |
1178 | 1177 | ||
1179 | /* Calculate UDP checksum if configured to do so */ | 1178 | /* Calculate UDP checksum if configured to do so */ |
1180 | if (sk_tun->sk_no_check == UDP_CSUM_NOXMIT) | 1179 | if (sk_tun->sk_no_check == UDP_CSUM_NOXMIT) |
1181 | skb->ip_summed = CHECKSUM_NONE; | 1180 | skb->ip_summed = CHECKSUM_NONE; |
1182 | else if (!(skb->dst->dev->features & NETIF_F_V4_CSUM)) { | 1181 | else if (!(skb_dst(skb)->dev->features & NETIF_F_V4_CSUM)) { |
1183 | skb->ip_summed = CHECKSUM_COMPLETE; | 1182 | skb->ip_summed = CHECKSUM_COMPLETE; |
1184 | csum = skb_checksum(skb, 0, udp_len, 0); | 1183 | csum = skb_checksum(skb, 0, udp_len, 0); |
1185 | uh->check = csum_tcpudp_magic(inet->saddr, inet->daddr, | 1184 | uh->check = csum_tcpudp_magic(inet->saddr, inet->daddr, |
diff --git a/drivers/s390/net/qeth_core_main.c b/drivers/s390/net/qeth_core_main.c index 2994aa1ed46..74c49d9a8db 100644 --- a/drivers/s390/net/qeth_core_main.c +++ b/drivers/s390/net/qeth_core_main.c | |||
@@ -2937,8 +2937,8 @@ int qeth_get_cast_type(struct qeth_card *card, struct sk_buff *skb) | |||
2937 | if (card->info.type == QETH_CARD_TYPE_OSN) | 2937 | if (card->info.type == QETH_CARD_TYPE_OSN) |
2938 | return cast_type; | 2938 | return cast_type; |
2939 | 2939 | ||
2940 | if (skb->dst && skb->dst->neighbour) { | 2940 | if (skb_dst(skb) && skb_dst(skb)->neighbour) { |
2941 | cast_type = skb->dst->neighbour->type; | 2941 | cast_type = skb_dst(skb)->neighbour->type; |
2942 | if ((cast_type == RTN_BROADCAST) || | 2942 | if ((cast_type == RTN_BROADCAST) || |
2943 | (cast_type == RTN_MULTICAST) || | 2943 | (cast_type == RTN_MULTICAST) || |
2944 | (cast_type == RTN_ANYCAST)) | 2944 | (cast_type == RTN_ANYCAST)) |
diff --git a/drivers/s390/net/qeth_l3_main.c b/drivers/s390/net/qeth_l3_main.c index cb64b0b534a..6f2386e9d6e 100644 --- a/drivers/s390/net/qeth_l3_main.c +++ b/drivers/s390/net/qeth_l3_main.c | |||
@@ -2549,9 +2549,9 @@ static void qeth_l3_fill_header(struct qeth_card *card, struct qeth_hdr *hdr, | |||
2549 | /* IPv4 */ | 2549 | /* IPv4 */ |
2550 | hdr->hdr.l3.flags = qeth_l3_get_qeth_hdr_flags4(cast_type); | 2550 | hdr->hdr.l3.flags = qeth_l3_get_qeth_hdr_flags4(cast_type); |
2551 | memset(hdr->hdr.l3.dest_addr, 0, 12); | 2551 | memset(hdr->hdr.l3.dest_addr, 0, 12); |
2552 | if ((skb->dst) && (skb->dst->neighbour)) { | 2552 | if ((skb_dst(skb)) && (skb_dst(skb)->neighbour)) { |
2553 | *((u32 *) (&hdr->hdr.l3.dest_addr[12])) = | 2553 | *((u32 *) (&hdr->hdr.l3.dest_addr[12])) = |
2554 | *((u32 *) skb->dst->neighbour->primary_key); | 2554 | *((u32 *) skb_dst(skb)->neighbour->primary_key); |
2555 | } else { | 2555 | } else { |
2556 | /* fill in destination address used in ip header */ | 2556 | /* fill in destination address used in ip header */ |
2557 | *((u32 *) (&hdr->hdr.l3.dest_addr[12])) = | 2557 | *((u32 *) (&hdr->hdr.l3.dest_addr[12])) = |
@@ -2562,9 +2562,9 @@ static void qeth_l3_fill_header(struct qeth_card *card, struct qeth_hdr *hdr, | |||
2562 | hdr->hdr.l3.flags = qeth_l3_get_qeth_hdr_flags6(cast_type); | 2562 | hdr->hdr.l3.flags = qeth_l3_get_qeth_hdr_flags6(cast_type); |
2563 | if (card->info.type == QETH_CARD_TYPE_IQD) | 2563 | if (card->info.type == QETH_CARD_TYPE_IQD) |
2564 | hdr->hdr.l3.flags &= ~QETH_HDR_PASSTHRU; | 2564 | hdr->hdr.l3.flags &= ~QETH_HDR_PASSTHRU; |
2565 | if ((skb->dst) && (skb->dst->neighbour)) { | 2565 | if ((skb_dst(skb)) && (skb_dst(skb)->neighbour)) { |
2566 | memcpy(hdr->hdr.l3.dest_addr, | 2566 | memcpy(hdr->hdr.l3.dest_addr, |
2567 | skb->dst->neighbour->primary_key, 16); | 2567 | skb_dst(skb)->neighbour->primary_key, 16); |
2568 | } else { | 2568 | } else { |
2569 | /* fill in destination address used in ip header */ | 2569 | /* fill in destination address used in ip header */ |
2570 | memcpy(hdr->hdr.l3.dest_addr, | 2570 | memcpy(hdr->hdr.l3.dest_addr, |
diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h index a3ae3c52583..9ef6eb20247 100644 --- a/include/linux/skbuff.h +++ b/include/linux/skbuff.h | |||
@@ -323,7 +323,6 @@ struct sk_buff { | |||
323 | struct net_device *dev; | 323 | struct net_device *dev; |
324 | 324 | ||
325 | union { | 325 | union { |
326 | struct dst_entry *dst; | ||
327 | unsigned long _skb_dst; | 326 | unsigned long _skb_dst; |
328 | }; | 327 | }; |
329 | #ifdef CONFIG_XFRM | 328 | #ifdef CONFIG_XFRM |
@@ -426,9 +425,19 @@ extern void skb_dma_unmap(struct device *dev, struct sk_buff *skb, | |||
426 | enum dma_data_direction dir); | 425 | enum dma_data_direction dir); |
427 | #endif | 426 | #endif |
428 | 427 | ||
428 | static inline struct dst_entry *skb_dst(const struct sk_buff *skb) | ||
429 | { | ||
430 | return (struct dst_entry *)skb->_skb_dst; | ||
431 | } | ||
432 | |||
433 | static inline void skb_dst_set(struct sk_buff *skb, struct dst_entry *dst) | ||
434 | { | ||
435 | skb->_skb_dst = (unsigned long)dst; | ||
436 | } | ||
437 | |||
429 | static inline struct rtable *skb_rtable(const struct sk_buff *skb) | 438 | static inline struct rtable *skb_rtable(const struct sk_buff *skb) |
430 | { | 439 | { |
431 | return (struct rtable *)skb->_skb_dst; | 440 | return (struct rtable *)skb_dst(skb); |
432 | } | 441 | } |
433 | 442 | ||
434 | extern void kfree_skb(struct sk_buff *skb); | 443 | extern void kfree_skb(struct sk_buff *skb); |
diff --git a/include/net/dst.h b/include/net/dst.h index 6be3b082a07..7fc409c19b3 100644 --- a/include/net/dst.h +++ b/include/net/dst.h | |||
@@ -195,6 +195,12 @@ struct dst_entry * dst_clone(struct dst_entry * dst) | |||
195 | } | 195 | } |
196 | 196 | ||
197 | extern void dst_release(struct dst_entry *dst); | 197 | extern void dst_release(struct dst_entry *dst); |
198 | static inline void skb_dst_drop(struct sk_buff *skb) | ||
199 | { | ||
200 | if (skb->_skb_dst) | ||
201 | dst_release(skb_dst(skb)); | ||
202 | skb->_skb_dst = 0UL; | ||
203 | } | ||
198 | 204 | ||
199 | /* Children define the path of the packet through the | 205 | /* Children define the path of the packet through the |
200 | * Linux networking. Thus, destinations are stackable. | 206 | * Linux networking. Thus, destinations are stackable. |
@@ -246,7 +252,7 @@ static inline void dst_negative_advice(struct dst_entry **dst_p) | |||
246 | 252 | ||
247 | static inline void dst_link_failure(struct sk_buff *skb) | 253 | static inline void dst_link_failure(struct sk_buff *skb) |
248 | { | 254 | { |
249 | struct dst_entry * dst = skb->dst; | 255 | struct dst_entry *dst = skb_dst(skb); |
250 | if (dst && dst->ops && dst->ops->link_failure) | 256 | if (dst && dst->ops && dst->ops->link_failure) |
251 | dst->ops->link_failure(skb); | 257 | dst->ops->link_failure(skb); |
252 | } | 258 | } |
@@ -265,13 +271,13 @@ static inline void dst_set_expires(struct dst_entry *dst, int timeout) | |||
265 | /* Output packet to network from transport. */ | 271 | /* Output packet to network from transport. */ |
266 | static inline int dst_output(struct sk_buff *skb) | 272 | static inline int dst_output(struct sk_buff *skb) |
267 | { | 273 | { |
268 | return skb->dst->output(skb); | 274 | return skb_dst(skb)->output(skb); |
269 | } | 275 | } |
270 | 276 | ||
271 | /* Input packet from network to transport. */ | 277 | /* Input packet from network to transport. */ |
272 | static inline int dst_input(struct sk_buff *skb) | 278 | static inline int dst_input(struct sk_buff *skb) |
273 | { | 279 | { |
274 | return skb->dst->input(skb); | 280 | return skb_dst(skb)->input(skb); |
275 | } | 281 | } |
276 | 282 | ||
277 | static inline struct dst_entry *dst_check(struct dst_entry *dst, u32 cookie) | 283 | static inline struct dst_entry *dst_check(struct dst_entry *dst, u32 cookie) |
diff --git a/include/net/inet6_hashtables.h b/include/net/inet6_hashtables.h index f74665d7bea..22c73a77cd9 100644 --- a/include/net/inet6_hashtables.h +++ b/include/net/inet6_hashtables.h | |||
@@ -100,7 +100,7 @@ static inline struct sock *__inet6_lookup_skb(struct inet_hashinfo *hashinfo, | |||
100 | 100 | ||
101 | if (unlikely(sk = skb_steal_sock(skb))) | 101 | if (unlikely(sk = skb_steal_sock(skb))) |
102 | return sk; | 102 | return sk; |
103 | else return __inet6_lookup(dev_net(skb->dst->dev), hashinfo, | 103 | else return __inet6_lookup(dev_net(skb_dst(skb)->dev), hashinfo, |
104 | &ipv6_hdr(skb)->saddr, sport, | 104 | &ipv6_hdr(skb)->saddr, sport, |
105 | &ipv6_hdr(skb)->daddr, ntohs(dport), | 105 | &ipv6_hdr(skb)->daddr, ntohs(dport), |
106 | inet6_iif(skb)); | 106 | inet6_iif(skb)); |
diff --git a/include/net/inet_hashtables.h b/include/net/inet_hashtables.h index a44e2248b2e..d522dcf3031 100644 --- a/include/net/inet_hashtables.h +++ b/include/net/inet_hashtables.h | |||
@@ -385,7 +385,7 @@ static inline struct sock *__inet_lookup_skb(struct inet_hashinfo *hashinfo, | |||
385 | if (unlikely(sk = skb_steal_sock(skb))) | 385 | if (unlikely(sk = skb_steal_sock(skb))) |
386 | return sk; | 386 | return sk; |
387 | else | 387 | else |
388 | return __inet_lookup(dev_net(skb->dst->dev), hashinfo, | 388 | return __inet_lookup(dev_net(skb_dst(skb)->dev), hashinfo, |
389 | iph->saddr, sport, | 389 | iph->saddr, sport, |
390 | iph->daddr, dport, inet_iif(skb)); | 390 | iph->daddr, dport, inet_iif(skb)); |
391 | } | 391 | } |
diff --git a/include/net/ip6_route.h b/include/net/ip6_route.h index 5f53db7e4e5..0e1b8aebaff 100644 --- a/include/net/ip6_route.h +++ b/include/net/ip6_route.h | |||
@@ -142,7 +142,7 @@ static inline void ip6_dst_store(struct sock *sk, struct dst_entry *dst, | |||
142 | 142 | ||
143 | static inline int ipv6_unicast_destination(struct sk_buff *skb) | 143 | static inline int ipv6_unicast_destination(struct sk_buff *skb) |
144 | { | 144 | { |
145 | struct rt6_info *rt = (struct rt6_info *) skb->dst; | 145 | struct rt6_info *rt = (struct rt6_info *) skb_dst(skb); |
146 | 146 | ||
147 | return rt->rt6i_flags & RTF_LOCAL; | 147 | return rt->rt6i_flags & RTF_LOCAL; |
148 | } | 148 | } |
diff --git a/include/net/xfrm.h b/include/net/xfrm.h index 2e9f5c0018a..736bca45088 100644 --- a/include/net/xfrm.h +++ b/include/net/xfrm.h | |||
@@ -994,7 +994,7 @@ static inline int __xfrm_policy_check2(struct sock *sk, int dir, | |||
994 | return __xfrm_policy_check(sk, ndir, skb, family); | 994 | return __xfrm_policy_check(sk, ndir, skb, family); |
995 | 995 | ||
996 | return (!net->xfrm.policy_count[dir] && !skb->sp) || | 996 | return (!net->xfrm.policy_count[dir] && !skb->sp) || |
997 | (skb->dst->flags & DST_NOPOLICY) || | 997 | (skb_dst(skb)->flags & DST_NOPOLICY) || |
998 | __xfrm_policy_check(sk, ndir, skb, family); | 998 | __xfrm_policy_check(sk, ndir, skb, family); |
999 | } | 999 | } |
1000 | 1000 | ||
@@ -1048,7 +1048,7 @@ static inline int xfrm_route_forward(struct sk_buff *skb, unsigned short family) | |||
1048 | struct net *net = dev_net(skb->dev); | 1048 | struct net *net = dev_net(skb->dev); |
1049 | 1049 | ||
1050 | return !net->xfrm.policy_count[XFRM_POLICY_OUT] || | 1050 | return !net->xfrm.policy_count[XFRM_POLICY_OUT] || |
1051 | (skb->dst->flags & DST_NOXFRM) || | 1051 | (skb_dst(skb)->flags & DST_NOXFRM) || |
1052 | __xfrm_route_forward(skb, family); | 1052 | __xfrm_route_forward(skb, family); |
1053 | } | 1053 | } |
1054 | 1054 | ||
diff --git a/net/atm/br2684.c b/net/atm/br2684.c index bfa8fa9894f..2912665fc58 100644 --- a/net/atm/br2684.c +++ b/net/atm/br2684.c | |||
@@ -228,7 +228,7 @@ static int br2684_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
228 | struct br2684_dev *brdev = BRPRIV(dev); | 228 | struct br2684_dev *brdev = BRPRIV(dev); |
229 | struct br2684_vcc *brvcc; | 229 | struct br2684_vcc *brvcc; |
230 | 230 | ||
231 | pr_debug("br2684_start_xmit, skb->dst=%p\n", skb->dst); | 231 | pr_debug("br2684_start_xmit, skb_dst(skb)=%p\n", skb_dst(skb)); |
232 | read_lock(&devs_lock); | 232 | read_lock(&devs_lock); |
233 | brvcc = pick_outgoing_vcc(skb, brdev); | 233 | brvcc = pick_outgoing_vcc(skb, brdev); |
234 | if (brvcc == NULL) { | 234 | if (brvcc == NULL) { |
diff --git a/net/atm/clip.c b/net/atm/clip.c index fb7623c080f..e65a3b1477f 100644 --- a/net/atm/clip.c +++ b/net/atm/clip.c | |||
@@ -369,16 +369,16 @@ static int clip_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
369 | unsigned long flags; | 369 | unsigned long flags; |
370 | 370 | ||
371 | pr_debug("clip_start_xmit (skb %p)\n", skb); | 371 | pr_debug("clip_start_xmit (skb %p)\n", skb); |
372 | if (!skb->dst) { | 372 | if (!skb_dst(skb)) { |
373 | printk(KERN_ERR "clip_start_xmit: skb->dst == NULL\n"); | 373 | printk(KERN_ERR "clip_start_xmit: skb_dst(skb) == NULL\n"); |
374 | dev_kfree_skb(skb); | 374 | dev_kfree_skb(skb); |
375 | dev->stats.tx_dropped++; | 375 | dev->stats.tx_dropped++; |
376 | return 0; | 376 | return 0; |
377 | } | 377 | } |
378 | if (!skb->dst->neighbour) { | 378 | if (!skb_dst(skb)->neighbour) { |
379 | #if 0 | 379 | #if 0 |
380 | skb->dst->neighbour = clip_find_neighbour(skb->dst, 1); | 380 | skb_dst(skb)->neighbour = clip_find_neighbour(skb_dst(skb), 1); |
381 | if (!skb->dst->neighbour) { | 381 | if (!skb_dst(skb)->neighbour) { |
382 | dev_kfree_skb(skb); /* lost that one */ | 382 | dev_kfree_skb(skb); /* lost that one */ |
383 | dev->stats.tx_dropped++; | 383 | dev->stats.tx_dropped++; |
384 | return 0; | 384 | return 0; |
@@ -389,7 +389,7 @@ static int clip_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
389 | dev->stats.tx_dropped++; | 389 | dev->stats.tx_dropped++; |
390 | return 0; | 390 | return 0; |
391 | } | 391 | } |
392 | entry = NEIGH2ENTRY(skb->dst->neighbour); | 392 | entry = NEIGH2ENTRY(skb_dst(skb)->neighbour); |
393 | if (!entry->vccs) { | 393 | if (!entry->vccs) { |
394 | if (time_after(jiffies, entry->expires)) { | 394 | if (time_after(jiffies, entry->expires)) { |
395 | /* should be resolved */ | 395 | /* should be resolved */ |
@@ -406,7 +406,7 @@ static int clip_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
406 | } | 406 | } |
407 | pr_debug("neigh %p, vccs %p\n", entry, entry->vccs); | 407 | pr_debug("neigh %p, vccs %p\n", entry, entry->vccs); |
408 | ATM_SKB(skb)->vcc = vcc = entry->vccs->vcc; | 408 | ATM_SKB(skb)->vcc = vcc = entry->vccs->vcc; |
409 | pr_debug("using neighbour %p, vcc %p\n", skb->dst->neighbour, vcc); | 409 | pr_debug("using neighbour %p, vcc %p\n", skb_dst(skb)->neighbour, vcc); |
410 | if (entry->vccs->encap) { | 410 | if (entry->vccs->encap) { |
411 | void *here; | 411 | void *here; |
412 | 412 | ||
diff --git a/net/bridge/br_netfilter.c b/net/bridge/br_netfilter.c index e0ceb66a9ec..d22f611e400 100644 --- a/net/bridge/br_netfilter.c +++ b/net/bridge/br_netfilter.c | |||
@@ -242,7 +242,7 @@ static int br_nf_pre_routing_finish_ipv6(struct sk_buff *skb) | |||
242 | return 0; | 242 | return 0; |
243 | } | 243 | } |
244 | dst_hold(&rt->u.dst); | 244 | dst_hold(&rt->u.dst); |
245 | skb->dst = &rt->u.dst; | 245 | skb_dst_set(skb, &rt->u.dst); |
246 | 246 | ||
247 | skb->dev = nf_bridge->physindev; | 247 | skb->dev = nf_bridge->physindev; |
248 | nf_bridge_push_encap_header(skb); | 248 | nf_bridge_push_encap_header(skb); |
@@ -322,7 +322,7 @@ static int br_nf_pre_routing_finish_bridge(struct sk_buff *skb) | |||
322 | 322 | ||
323 | skb->dev = bridge_parent(skb->dev); | 323 | skb->dev = bridge_parent(skb->dev); |
324 | if (skb->dev) { | 324 | if (skb->dev) { |
325 | struct dst_entry *dst = skb->dst; | 325 | struct dst_entry *dst = skb_dst(skb); |
326 | 326 | ||
327 | nf_bridge_pull_encap_header(skb); | 327 | nf_bridge_pull_encap_header(skb); |
328 | 328 | ||
@@ -375,7 +375,7 @@ static int br_nf_pre_routing_finish(struct sk_buff *skb) | |||
375 | /* - Bridged-and-DNAT'ed traffic doesn't | 375 | /* - Bridged-and-DNAT'ed traffic doesn't |
376 | * require ip_forwarding. */ | 376 | * require ip_forwarding. */ |
377 | if (((struct dst_entry *)rt)->dev == dev) { | 377 | if (((struct dst_entry *)rt)->dev == dev) { |
378 | skb->dst = (struct dst_entry *)rt; | 378 | skb_dst_set(skb, (struct dst_entry *)rt); |
379 | goto bridged_dnat; | 379 | goto bridged_dnat; |
380 | } | 380 | } |
381 | /* we are sure that forwarding is disabled, so printing | 381 | /* we are sure that forwarding is disabled, so printing |
@@ -389,7 +389,7 @@ free_skb: | |||
389 | kfree_skb(skb); | 389 | kfree_skb(skb); |
390 | return 0; | 390 | return 0; |
391 | } else { | 391 | } else { |
392 | if (skb->dst->dev == dev) { | 392 | if (skb_dst(skb)->dev == dev) { |
393 | bridged_dnat: | 393 | bridged_dnat: |
394 | /* Tell br_nf_local_out this is a | 394 | /* Tell br_nf_local_out this is a |
395 | * bridged frame */ | 395 | * bridged frame */ |
@@ -412,7 +412,7 @@ bridged_dnat: | |||
412 | return 0; | 412 | return 0; |
413 | } | 413 | } |
414 | dst_hold(&rt->u.dst); | 414 | dst_hold(&rt->u.dst); |
415 | skb->dst = &rt->u.dst; | 415 | skb_dst_set(skb, &rt->u.dst); |
416 | } | 416 | } |
417 | 417 | ||
418 | skb->dev = nf_bridge->physindev; | 418 | skb->dev = nf_bridge->physindev; |
@@ -633,10 +633,8 @@ static unsigned int br_nf_local_in(unsigned int hook, struct sk_buff *skb, | |||
633 | { | 633 | { |
634 | struct rtable *rt = skb_rtable(skb); | 634 | struct rtable *rt = skb_rtable(skb); |
635 | 635 | ||
636 | if (rt && rt == bridge_parent_rtable(in)) { | 636 | if (rt && rt == bridge_parent_rtable(in)) |
637 | dst_release(&rt->u.dst); | 637 | skb_dst_drop(skb); |
638 | skb->dst = NULL; | ||
639 | } | ||
640 | 638 | ||
641 | return NF_ACCEPT; | 639 | return NF_ACCEPT; |
642 | } | 640 | } |
@@ -851,7 +849,7 @@ static unsigned int br_nf_post_routing(unsigned int hook, struct sk_buff *skb, | |||
851 | return NF_ACCEPT; | 849 | return NF_ACCEPT; |
852 | 850 | ||
853 | #ifdef CONFIG_NETFILTER_DEBUG | 851 | #ifdef CONFIG_NETFILTER_DEBUG |
854 | if (skb->dst == NULL) { | 852 | if (skb_dst(skb) == NULL) { |
855 | printk(KERN_INFO "br_netfilter post_routing: skb->dst == NULL\n"); | 853 | printk(KERN_INFO "br_netfilter post_routing: skb->dst == NULL\n"); |
856 | goto print_error; | 854 | goto print_error; |
857 | } | 855 | } |
diff --git a/net/core/dev.c b/net/core/dev.c index e2fcc5f1017..34b49a6a22f 100644 --- a/net/core/dev.c +++ b/net/core/dev.c | |||
@@ -1693,10 +1693,9 @@ int dev_hard_start_xmit(struct sk_buff *skb, struct net_device *dev, | |||
1693 | * If device doesnt need skb->dst, release it right now while | 1693 | * If device doesnt need skb->dst, release it right now while |
1694 | * its hot in this cpu cache | 1694 | * its hot in this cpu cache |
1695 | */ | 1695 | */ |
1696 | if ((dev->priv_flags & IFF_XMIT_DST_RELEASE) && skb->dst) { | 1696 | if (dev->priv_flags & IFF_XMIT_DST_RELEASE) |
1697 | dst_release(skb->dst); | 1697 | skb_dst_drop(skb); |
1698 | skb->dst = NULL; | 1698 | |
1699 | } | ||
1700 | rc = ops->ndo_start_xmit(skb, dev); | 1699 | rc = ops->ndo_start_xmit(skb, dev); |
1701 | if (rc == 0) | 1700 | if (rc == 0) |
1702 | txq_trans_update(txq); | 1701 | txq_trans_update(txq); |
diff --git a/net/core/neighbour.c b/net/core/neighbour.c index a1cbce7fdae..c54229befcf 100644 --- a/net/core/neighbour.c +++ b/net/core/neighbour.c | |||
@@ -1088,8 +1088,8 @@ int neigh_update(struct neighbour *neigh, const u8 *lladdr, u8 new, | |||
1088 | struct neighbour *n1 = neigh; | 1088 | struct neighbour *n1 = neigh; |
1089 | write_unlock_bh(&neigh->lock); | 1089 | write_unlock_bh(&neigh->lock); |
1090 | /* On shaper/eql skb->dst->neighbour != neigh :( */ | 1090 | /* On shaper/eql skb->dst->neighbour != neigh :( */ |
1091 | if (skb->dst && skb->dst->neighbour) | 1091 | if (skb_dst(skb) && skb_dst(skb)->neighbour) |
1092 | n1 = skb->dst->neighbour; | 1092 | n1 = skb_dst(skb)->neighbour; |
1093 | n1->output(skb); | 1093 | n1->output(skb); |
1094 | write_lock_bh(&neigh->lock); | 1094 | write_lock_bh(&neigh->lock); |
1095 | } | 1095 | } |
@@ -1182,7 +1182,7 @@ EXPORT_SYMBOL(neigh_compat_output); | |||
1182 | 1182 | ||
1183 | int neigh_resolve_output(struct sk_buff *skb) | 1183 | int neigh_resolve_output(struct sk_buff *skb) |
1184 | { | 1184 | { |
1185 | struct dst_entry *dst = skb->dst; | 1185 | struct dst_entry *dst = skb_dst(skb); |
1186 | struct neighbour *neigh; | 1186 | struct neighbour *neigh; |
1187 | int rc = 0; | 1187 | int rc = 0; |
1188 | 1188 | ||
@@ -1229,7 +1229,7 @@ EXPORT_SYMBOL(neigh_resolve_output); | |||
1229 | int neigh_connected_output(struct sk_buff *skb) | 1229 | int neigh_connected_output(struct sk_buff *skb) |
1230 | { | 1230 | { |
1231 | int err; | 1231 | int err; |
1232 | struct dst_entry *dst = skb->dst; | 1232 | struct dst_entry *dst = skb_dst(skb); |
1233 | struct neighbour *neigh = dst->neighbour; | 1233 | struct neighbour *neigh = dst->neighbour; |
1234 | struct net_device *dev = neigh->dev; | 1234 | struct net_device *dev = neigh->dev; |
1235 | 1235 | ||
@@ -1298,8 +1298,7 @@ void pneigh_enqueue(struct neigh_table *tbl, struct neigh_parms *p, | |||
1298 | if (time_before(tbl->proxy_timer.expires, sched_next)) | 1298 | if (time_before(tbl->proxy_timer.expires, sched_next)) |
1299 | sched_next = tbl->proxy_timer.expires; | 1299 | sched_next = tbl->proxy_timer.expires; |
1300 | } | 1300 | } |
1301 | dst_release(skb->dst); | 1301 | skb_dst_drop(skb); |
1302 | skb->dst = NULL; | ||
1303 | dev_hold(skb->dev); | 1302 | dev_hold(skb->dev); |
1304 | __skb_queue_tail(&tbl->proxy_queue, skb); | 1303 | __skb_queue_tail(&tbl->proxy_queue, skb); |
1305 | mod_timer(&tbl->proxy_timer, sched_next); | 1304 | mod_timer(&tbl->proxy_timer, sched_next); |
diff --git a/net/core/skbuff.c b/net/core/skbuff.c index 8e815e685f2..6adf19ec95c 100644 --- a/net/core/skbuff.c +++ b/net/core/skbuff.c | |||
@@ -381,7 +381,7 @@ static void kfree_skbmem(struct sk_buff *skb) | |||
381 | 381 | ||
382 | static void skb_release_head_state(struct sk_buff *skb) | 382 | static void skb_release_head_state(struct sk_buff *skb) |
383 | { | 383 | { |
384 | dst_release(skb->dst); | 384 | skb_dst_drop(skb); |
385 | #ifdef CONFIG_XFRM | 385 | #ifdef CONFIG_XFRM |
386 | secpath_put(skb->sp); | 386 | secpath_put(skb->sp); |
387 | #endif | 387 | #endif |
@@ -521,7 +521,7 @@ static void __copy_skb_header(struct sk_buff *new, const struct sk_buff *old) | |||
521 | new->transport_header = old->transport_header; | 521 | new->transport_header = old->transport_header; |
522 | new->network_header = old->network_header; | 522 | new->network_header = old->network_header; |
523 | new->mac_header = old->mac_header; | 523 | new->mac_header = old->mac_header; |
524 | new->dst = dst_clone(old->dst); | 524 | skb_dst_set(new, dst_clone(skb_dst(old))); |
525 | #ifdef CONFIG_XFRM | 525 | #ifdef CONFIG_XFRM |
526 | new->sp = secpath_get(old->sp); | 526 | new->sp = secpath_get(old->sp); |
527 | #endif | 527 | #endif |
diff --git a/net/dccp/ipv4.c b/net/dccp/ipv4.c index 2cf48ba0dbb..a0a36c9e6cc 100644 --- a/net/dccp/ipv4.c +++ b/net/dccp/ipv4.c | |||
@@ -507,7 +507,7 @@ static void dccp_v4_ctl_send_reset(struct sock *sk, struct sk_buff *rxskb) | |||
507 | const struct iphdr *rxiph; | 507 | const struct iphdr *rxiph; |
508 | struct sk_buff *skb; | 508 | struct sk_buff *skb; |
509 | struct dst_entry *dst; | 509 | struct dst_entry *dst; |
510 | struct net *net = dev_net(rxskb->dst->dev); | 510 | struct net *net = dev_net(skb_dst(rxskb)->dev); |
511 | struct sock *ctl_sk = net->dccp.v4_ctl_sk; | 511 | struct sock *ctl_sk = net->dccp.v4_ctl_sk; |
512 | 512 | ||
513 | /* Never send a reset in response to a reset. */ | 513 | /* Never send a reset in response to a reset. */ |
@@ -528,7 +528,7 @@ static void dccp_v4_ctl_send_reset(struct sock *sk, struct sk_buff *rxskb) | |||
528 | rxiph = ip_hdr(rxskb); | 528 | rxiph = ip_hdr(rxskb); |
529 | dccp_hdr(skb)->dccph_checksum = dccp_v4_csum_finish(skb, rxiph->saddr, | 529 | dccp_hdr(skb)->dccph_checksum = dccp_v4_csum_finish(skb, rxiph->saddr, |
530 | rxiph->daddr); | 530 | rxiph->daddr); |
531 | skb->dst = dst_clone(dst); | 531 | skb_dst_set(skb, dst_clone(dst)); |
532 | 532 | ||
533 | bh_lock_sock(ctl_sk); | 533 | bh_lock_sock(ctl_sk); |
534 | err = ip_build_and_send_pkt(skb, ctl_sk, | 534 | err = ip_build_and_send_pkt(skb, ctl_sk, |
diff --git a/net/dccp/ipv6.c b/net/dccp/ipv6.c index b963f35c65f..05ea7440d9e 100644 --- a/net/dccp/ipv6.c +++ b/net/dccp/ipv6.c | |||
@@ -314,8 +314,9 @@ static void dccp_v6_ctl_send_reset(struct sock *sk, struct sk_buff *rxskb) | |||
314 | struct ipv6hdr *rxip6h; | 314 | struct ipv6hdr *rxip6h; |
315 | struct sk_buff *skb; | 315 | struct sk_buff *skb; |
316 | struct flowi fl; | 316 | struct flowi fl; |
317 | struct net *net = dev_net(rxskb->dst->dev); | 317 | struct net *net = dev_net(skb_dst(rxskb)->dev); |
318 | struct sock *ctl_sk = net->dccp.v6_ctl_sk; | 318 | struct sock *ctl_sk = net->dccp.v6_ctl_sk; |
319 | struct dst_entry *dst; | ||
319 | 320 | ||
320 | if (dccp_hdr(rxskb)->dccph_type == DCCP_PKT_RESET) | 321 | if (dccp_hdr(rxskb)->dccph_type == DCCP_PKT_RESET) |
321 | return; | 322 | return; |
@@ -342,8 +343,9 @@ static void dccp_v6_ctl_send_reset(struct sock *sk, struct sk_buff *rxskb) | |||
342 | security_skb_classify_flow(rxskb, &fl); | 343 | security_skb_classify_flow(rxskb, &fl); |
343 | 344 | ||
344 | /* sk = NULL, but it is safe for now. RST socket required. */ | 345 | /* sk = NULL, but it is safe for now. RST socket required. */ |
345 | if (!ip6_dst_lookup(ctl_sk, &skb->dst, &fl)) { | 346 | if (!ip6_dst_lookup(ctl_sk, &dst, &fl)) { |
346 | if (xfrm_lookup(net, &skb->dst, &fl, NULL, 0) >= 0) { | 347 | if (xfrm_lookup(net, &dst, &fl, NULL, 0) >= 0) { |
348 | skb_dst_set(skb, dst); | ||
347 | ip6_xmit(ctl_sk, skb, &fl, NULL, 0); | 349 | ip6_xmit(ctl_sk, skb, &fl, NULL, 0); |
348 | DCCP_INC_STATS_BH(DCCP_MIB_OUTSEGS); | 350 | DCCP_INC_STATS_BH(DCCP_MIB_OUTSEGS); |
349 | DCCP_INC_STATS_BH(DCCP_MIB_OUTRSTS); | 351 | DCCP_INC_STATS_BH(DCCP_MIB_OUTRSTS); |
diff --git a/net/dccp/output.c b/net/dccp/output.c index 36bcc00654d..c0e88c16d08 100644 --- a/net/dccp/output.c +++ b/net/dccp/output.c | |||
@@ -350,7 +350,7 @@ struct sk_buff *dccp_make_response(struct sock *sk, struct dst_entry *dst, | |||
350 | /* Reserve space for headers. */ | 350 | /* Reserve space for headers. */ |
351 | skb_reserve(skb, sk->sk_prot->max_header); | 351 | skb_reserve(skb, sk->sk_prot->max_header); |
352 | 352 | ||
353 | skb->dst = dst_clone(dst); | 353 | skb_dst_set(skb, dst_clone(dst)); |
354 | 354 | ||
355 | dreq = dccp_rsk(req); | 355 | dreq = dccp_rsk(req); |
356 | if (inet_rsk(req)->acked) /* increase ISS upon retransmission */ | 356 | if (inet_rsk(req)->acked) /* increase ISS upon retransmission */ |
diff --git a/net/decnet/af_decnet.c b/net/decnet/af_decnet.c index bccb3887773..a5e3a593e47 100644 --- a/net/decnet/af_decnet.c +++ b/net/decnet/af_decnet.c | |||
@@ -1075,6 +1075,7 @@ static int dn_accept(struct socket *sock, struct socket *newsock, int flags) | |||
1075 | int err = 0; | 1075 | int err = 0; |
1076 | unsigned char type; | 1076 | unsigned char type; |
1077 | long timeo = sock_rcvtimeo(sk, flags & O_NONBLOCK); | 1077 | long timeo = sock_rcvtimeo(sk, flags & O_NONBLOCK); |
1078 | struct dst_entry *dst; | ||
1078 | 1079 | ||
1079 | lock_sock(sk); | 1080 | lock_sock(sk); |
1080 | 1081 | ||
@@ -1102,8 +1103,9 @@ static int dn_accept(struct socket *sock, struct socket *newsock, int flags) | |||
1102 | } | 1103 | } |
1103 | release_sock(sk); | 1104 | release_sock(sk); |
1104 | 1105 | ||
1105 | dst_release(xchg(&newsk->sk_dst_cache, skb->dst)); | 1106 | dst = skb_dst(skb); |
1106 | skb->dst = NULL; | 1107 | dst_release(xchg(&newsk->sk_dst_cache, dst)); |
1108 | skb_dst_set(skb, NULL); | ||
1107 | 1109 | ||
1108 | DN_SK(newsk)->state = DN_CR; | 1110 | DN_SK(newsk)->state = DN_CR; |
1109 | DN_SK(newsk)->addrrem = cb->src_port; | 1111 | DN_SK(newsk)->addrrem = cb->src_port; |
diff --git a/net/decnet/dn_neigh.c b/net/decnet/dn_neigh.c index 05b5aa05e50..923786bd6d0 100644 --- a/net/decnet/dn_neigh.c +++ b/net/decnet/dn_neigh.c | |||
@@ -204,7 +204,7 @@ static void dn_short_error_report(struct neighbour *neigh, struct sk_buff *skb) | |||
204 | 204 | ||
205 | static int dn_neigh_output_packet(struct sk_buff *skb) | 205 | static int dn_neigh_output_packet(struct sk_buff *skb) |
206 | { | 206 | { |
207 | struct dst_entry *dst = skb->dst; | 207 | struct dst_entry *dst = skb_dst(skb); |
208 | struct dn_route *rt = (struct dn_route *)dst; | 208 | struct dn_route *rt = (struct dn_route *)dst; |
209 | struct neighbour *neigh = dst->neighbour; | 209 | struct neighbour *neigh = dst->neighbour; |
210 | struct net_device *dev = neigh->dev; | 210 | struct net_device *dev = neigh->dev; |
@@ -224,7 +224,7 @@ static int dn_neigh_output_packet(struct sk_buff *skb) | |||
224 | 224 | ||
225 | static int dn_long_output(struct sk_buff *skb) | 225 | static int dn_long_output(struct sk_buff *skb) |
226 | { | 226 | { |
227 | struct dst_entry *dst = skb->dst; | 227 | struct dst_entry *dst = skb_dst(skb); |
228 | struct neighbour *neigh = dst->neighbour; | 228 | struct neighbour *neigh = dst->neighbour; |
229 | struct net_device *dev = neigh->dev; | 229 | struct net_device *dev = neigh->dev; |
230 | int headroom = dev->hard_header_len + sizeof(struct dn_long_packet) + 3; | 230 | int headroom = dev->hard_header_len + sizeof(struct dn_long_packet) + 3; |
@@ -270,7 +270,7 @@ static int dn_long_output(struct sk_buff *skb) | |||
270 | 270 | ||
271 | static int dn_short_output(struct sk_buff *skb) | 271 | static int dn_short_output(struct sk_buff *skb) |
272 | { | 272 | { |
273 | struct dst_entry *dst = skb->dst; | 273 | struct dst_entry *dst = skb_dst(skb); |
274 | struct neighbour *neigh = dst->neighbour; | 274 | struct neighbour *neigh = dst->neighbour; |
275 | struct net_device *dev = neigh->dev; | 275 | struct net_device *dev = neigh->dev; |
276 | int headroom = dev->hard_header_len + sizeof(struct dn_short_packet) + 2; | 276 | int headroom = dev->hard_header_len + sizeof(struct dn_short_packet) + 2; |
@@ -313,7 +313,7 @@ static int dn_short_output(struct sk_buff *skb) | |||
313 | */ | 313 | */ |
314 | static int dn_phase3_output(struct sk_buff *skb) | 314 | static int dn_phase3_output(struct sk_buff *skb) |
315 | { | 315 | { |
316 | struct dst_entry *dst = skb->dst; | 316 | struct dst_entry *dst = skb_dst(skb); |
317 | struct neighbour *neigh = dst->neighbour; | 317 | struct neighbour *neigh = dst->neighbour; |
318 | struct net_device *dev = neigh->dev; | 318 | struct net_device *dev = neigh->dev; |
319 | int headroom = dev->hard_header_len + sizeof(struct dn_short_packet) + 2; | 319 | int headroom = dev->hard_header_len + sizeof(struct dn_short_packet) + 2; |
diff --git a/net/decnet/dn_nsp_out.c b/net/decnet/dn_nsp_out.c index da04f459337..a65e929ce76 100644 --- a/net/decnet/dn_nsp_out.c +++ b/net/decnet/dn_nsp_out.c | |||
@@ -85,7 +85,7 @@ static void dn_nsp_send(struct sk_buff *skb) | |||
85 | dst = sk_dst_check(sk, 0); | 85 | dst = sk_dst_check(sk, 0); |
86 | if (dst) { | 86 | if (dst) { |
87 | try_again: | 87 | try_again: |
88 | skb->dst = dst; | 88 | skb_dst_set(skb, dst); |
89 | dst_output(skb); | 89 | dst_output(skb); |
90 | return; | 90 | return; |
91 | } | 91 | } |
@@ -582,7 +582,7 @@ static __inline__ void dn_nsp_do_disc(struct sock *sk, unsigned char msgflg, | |||
582 | * to be able to send disc packets out which have no socket | 582 | * to be able to send disc packets out which have no socket |
583 | * associations. | 583 | * associations. |
584 | */ | 584 | */ |
585 | skb->dst = dst_clone(dst); | 585 | skb_dst_set(skb, dst_clone(dst)); |
586 | dst_output(skb); | 586 | dst_output(skb); |
587 | } | 587 | } |
588 | 588 | ||
@@ -611,7 +611,7 @@ void dn_nsp_return_disc(struct sk_buff *skb, unsigned char msgflg, | |||
611 | int ddl = 0; | 611 | int ddl = 0; |
612 | gfp_t gfp = GFP_ATOMIC; | 612 | gfp_t gfp = GFP_ATOMIC; |
613 | 613 | ||
614 | dn_nsp_do_disc(NULL, msgflg, reason, gfp, skb->dst, ddl, | 614 | dn_nsp_do_disc(NULL, msgflg, reason, gfp, skb_dst(skb), ddl, |
615 | NULL, cb->src_port, cb->dst_port); | 615 | NULL, cb->src_port, cb->dst_port); |
616 | } | 616 | } |
617 | 617 | ||
diff --git a/net/decnet/dn_route.c b/net/decnet/dn_route.c index 0cc4394117d..1d6ca8a98dc 100644 --- a/net/decnet/dn_route.c +++ b/net/decnet/dn_route.c | |||
@@ -678,7 +678,7 @@ out: | |||
678 | 678 | ||
679 | static int dn_output(struct sk_buff *skb) | 679 | static int dn_output(struct sk_buff *skb) |
680 | { | 680 | { |
681 | struct dst_entry *dst = skb->dst; | 681 | struct dst_entry *dst = skb_dst(skb); |
682 | struct dn_route *rt = (struct dn_route *)dst; | 682 | struct dn_route *rt = (struct dn_route *)dst; |
683 | struct net_device *dev = dst->dev; | 683 | struct net_device *dev = dst->dev; |
684 | struct dn_skb_cb *cb = DN_SKB_CB(skb); | 684 | struct dn_skb_cb *cb = DN_SKB_CB(skb); |
@@ -717,7 +717,7 @@ error: | |||
717 | static int dn_forward(struct sk_buff *skb) | 717 | static int dn_forward(struct sk_buff *skb) |
718 | { | 718 | { |
719 | struct dn_skb_cb *cb = DN_SKB_CB(skb); | 719 | struct dn_skb_cb *cb = DN_SKB_CB(skb); |
720 | struct dst_entry *dst = skb->dst; | 720 | struct dst_entry *dst = skb_dst(skb); |
721 | struct dn_dev *dn_db = dst->dev->dn_ptr; | 721 | struct dn_dev *dn_db = dst->dev->dn_ptr; |
722 | struct dn_route *rt; | 722 | struct dn_route *rt; |
723 | struct neighbour *neigh = dst->neighbour; | 723 | struct neighbour *neigh = dst->neighbour; |
@@ -730,7 +730,7 @@ static int dn_forward(struct sk_buff *skb) | |||
730 | goto drop; | 730 | goto drop; |
731 | 731 | ||
732 | /* Ensure that we have enough space for headers */ | 732 | /* Ensure that we have enough space for headers */ |
733 | rt = (struct dn_route *)skb->dst; | 733 | rt = (struct dn_route *)skb_dst(skb); |
734 | header_len = dn_db->use_long ? 21 : 6; | 734 | header_len = dn_db->use_long ? 21 : 6; |
735 | if (skb_cow(skb, LL_RESERVED_SPACE(rt->u.dst.dev)+header_len)) | 735 | if (skb_cow(skb, LL_RESERVED_SPACE(rt->u.dst.dev)+header_len)) |
736 | goto drop; | 736 | goto drop; |
@@ -1392,7 +1392,8 @@ make_route: | |||
1392 | goto e_neighbour; | 1392 | goto e_neighbour; |
1393 | 1393 | ||
1394 | hash = dn_hash(rt->fl.fld_src, rt->fl.fld_dst); | 1394 | hash = dn_hash(rt->fl.fld_src, rt->fl.fld_dst); |
1395 | dn_insert_route(rt, hash, (struct dn_route **)&skb->dst); | 1395 | dn_insert_route(rt, hash, &rt); |
1396 | skb_dst_set(skb, &rt->u.dst); | ||
1396 | 1397 | ||
1397 | done: | 1398 | done: |
1398 | if (neigh) | 1399 | if (neigh) |
@@ -1424,7 +1425,7 @@ static int dn_route_input(struct sk_buff *skb) | |||
1424 | struct dn_skb_cb *cb = DN_SKB_CB(skb); | 1425 | struct dn_skb_cb *cb = DN_SKB_CB(skb); |
1425 | unsigned hash = dn_hash(cb->src, cb->dst); | 1426 | unsigned hash = dn_hash(cb->src, cb->dst); |
1426 | 1427 | ||
1427 | if (skb->dst) | 1428 | if (skb_dst(skb)) |
1428 | return 0; | 1429 | return 0; |
1429 | 1430 | ||
1430 | rcu_read_lock(); | 1431 | rcu_read_lock(); |
@@ -1437,7 +1438,7 @@ static int dn_route_input(struct sk_buff *skb) | |||
1437 | (rt->fl.iif == cb->iif)) { | 1438 | (rt->fl.iif == cb->iif)) { |
1438 | dst_use(&rt->u.dst, jiffies); | 1439 | dst_use(&rt->u.dst, jiffies); |
1439 | rcu_read_unlock(); | 1440 | rcu_read_unlock(); |
1440 | skb->dst = (struct dst_entry *)rt; | 1441 | skb_dst_set(skb, (struct dst_entry *)rt); |
1441 | return 0; | 1442 | return 0; |
1442 | } | 1443 | } |
1443 | } | 1444 | } |
@@ -1449,7 +1450,7 @@ static int dn_route_input(struct sk_buff *skb) | |||
1449 | static int dn_rt_fill_info(struct sk_buff *skb, u32 pid, u32 seq, | 1450 | static int dn_rt_fill_info(struct sk_buff *skb, u32 pid, u32 seq, |
1450 | int event, int nowait, unsigned int flags) | 1451 | int event, int nowait, unsigned int flags) |
1451 | { | 1452 | { |
1452 | struct dn_route *rt = (struct dn_route *)skb->dst; | 1453 | struct dn_route *rt = (struct dn_route *)skb_dst(skb); |
1453 | struct rtmsg *r; | 1454 | struct rtmsg *r; |
1454 | struct nlmsghdr *nlh; | 1455 | struct nlmsghdr *nlh; |
1455 | unsigned char *b = skb_tail_pointer(skb); | 1456 | unsigned char *b = skb_tail_pointer(skb); |
@@ -1554,7 +1555,7 @@ static int dn_cache_getroute(struct sk_buff *in_skb, struct nlmsghdr *nlh, void | |||
1554 | err = dn_route_input(skb); | 1555 | err = dn_route_input(skb); |
1555 | local_bh_enable(); | 1556 | local_bh_enable(); |
1556 | memset(cb, 0, sizeof(struct dn_skb_cb)); | 1557 | memset(cb, 0, sizeof(struct dn_skb_cb)); |
1557 | rt = (struct dn_route *)skb->dst; | 1558 | rt = (struct dn_route *)skb_dst(skb); |
1558 | if (!err && -rt->u.dst.error) | 1559 | if (!err && -rt->u.dst.error) |
1559 | err = rt->u.dst.error; | 1560 | err = rt->u.dst.error; |
1560 | } else { | 1561 | } else { |
@@ -1570,7 +1571,7 @@ static int dn_cache_getroute(struct sk_buff *in_skb, struct nlmsghdr *nlh, void | |||
1570 | skb->dev = NULL; | 1571 | skb->dev = NULL; |
1571 | if (err) | 1572 | if (err) |
1572 | goto out_free; | 1573 | goto out_free; |
1573 | skb->dst = &rt->u.dst; | 1574 | skb_dst_set(skb, &rt->u.dst); |
1574 | if (rtm->rtm_flags & RTM_F_NOTIFY) | 1575 | if (rtm->rtm_flags & RTM_F_NOTIFY) |
1575 | rt->rt_flags |= RTCF_NOTIFY; | 1576 | rt->rt_flags |= RTCF_NOTIFY; |
1576 | 1577 | ||
@@ -1622,15 +1623,15 @@ int dn_cache_dump(struct sk_buff *skb, struct netlink_callback *cb) | |||
1622 | rt = rcu_dereference(rt->u.dst.dn_next), idx++) { | 1623 | rt = rcu_dereference(rt->u.dst.dn_next), idx++) { |
1623 | if (idx < s_idx) | 1624 | if (idx < s_idx) |
1624 | continue; | 1625 | continue; |
1625 | skb->dst = dst_clone(&rt->u.dst); | 1626 | skb_dst_set(skb, dst_clone(&rt->u.dst)); |
1626 | if (dn_rt_fill_info(skb, NETLINK_CB(cb->skb).pid, | 1627 | if (dn_rt_fill_info(skb, NETLINK_CB(cb->skb).pid, |
1627 | cb->nlh->nlmsg_seq, RTM_NEWROUTE, | 1628 | cb->nlh->nlmsg_seq, RTM_NEWROUTE, |
1628 | 1, NLM_F_MULTI) <= 0) { | 1629 | 1, NLM_F_MULTI) <= 0) { |
1629 | dst_release(xchg(&skb->dst, NULL)); | 1630 | skb_dst_drop(skb); |
1630 | rcu_read_unlock_bh(); | 1631 | rcu_read_unlock_bh(); |
1631 | goto done; | 1632 | goto done; |
1632 | } | 1633 | } |
1633 | dst_release(xchg(&skb->dst, NULL)); | 1634 | skb_dst_drop(skb); |
1634 | } | 1635 | } |
1635 | rcu_read_unlock_bh(); | 1636 | rcu_read_unlock_bh(); |
1636 | } | 1637 | } |
diff --git a/net/ipv4/arp.c b/net/ipv4/arp.c index 816494f271a..8a3881e28ac 100644 --- a/net/ipv4/arp.c +++ b/net/ipv4/arp.c | |||
@@ -468,7 +468,7 @@ int arp_find(unsigned char *haddr, struct sk_buff *skb) | |||
468 | __be32 paddr; | 468 | __be32 paddr; |
469 | struct neighbour *n; | 469 | struct neighbour *n; |
470 | 470 | ||
471 | if (!skb->dst) { | 471 | if (!skb_dst(skb)) { |
472 | printk(KERN_DEBUG "arp_find is called with dst==NULL\n"); | 472 | printk(KERN_DEBUG "arp_find is called with dst==NULL\n"); |
473 | kfree_skb(skb); | 473 | kfree_skb(skb); |
474 | return 1; | 474 | return 1; |
diff --git a/net/ipv4/icmp.c b/net/ipv4/icmp.c index 94f75efae93..97c410e8438 100644 --- a/net/ipv4/icmp.c +++ b/net/ipv4/icmp.c | |||
@@ -591,13 +591,13 @@ void icmp_send(struct sk_buff *skb_in, int type, int code, __be32 info) | |||
591 | goto relookup_failed; | 591 | goto relookup_failed; |
592 | 592 | ||
593 | /* Ugh! */ | 593 | /* Ugh! */ |
594 | odst = skb_in->dst; | 594 | odst = skb_dst(skb_in); |
595 | err = ip_route_input(skb_in, fl.fl4_dst, fl.fl4_src, | 595 | err = ip_route_input(skb_in, fl.fl4_dst, fl.fl4_src, |
596 | RT_TOS(tos), rt2->u.dst.dev); | 596 | RT_TOS(tos), rt2->u.dst.dev); |
597 | 597 | ||
598 | dst_release(&rt2->u.dst); | 598 | dst_release(&rt2->u.dst); |
599 | rt2 = skb_rtable(skb_in); | 599 | rt2 = skb_rtable(skb_in); |
600 | skb_in->dst = odst; | 600 | skb_dst_set(skb_in, odst); |
601 | } | 601 | } |
602 | 602 | ||
603 | if (err) | 603 | if (err) |
@@ -659,7 +659,7 @@ static void icmp_unreach(struct sk_buff *skb) | |||
659 | u32 info = 0; | 659 | u32 info = 0; |
660 | struct net *net; | 660 | struct net *net; |
661 | 661 | ||
662 | net = dev_net(skb->dst->dev); | 662 | net = dev_net(skb_dst(skb)->dev); |
663 | 663 | ||
664 | /* | 664 | /* |
665 | * Incomplete header ? | 665 | * Incomplete header ? |
@@ -822,7 +822,7 @@ static void icmp_echo(struct sk_buff *skb) | |||
822 | { | 822 | { |
823 | struct net *net; | 823 | struct net *net; |
824 | 824 | ||
825 | net = dev_net(skb->dst->dev); | 825 | net = dev_net(skb_dst(skb)->dev); |
826 | if (!net->ipv4.sysctl_icmp_echo_ignore_all) { | 826 | if (!net->ipv4.sysctl_icmp_echo_ignore_all) { |
827 | struct icmp_bxm icmp_param; | 827 | struct icmp_bxm icmp_param; |
828 | 828 | ||
@@ -873,7 +873,7 @@ static void icmp_timestamp(struct sk_buff *skb) | |||
873 | out: | 873 | out: |
874 | return; | 874 | return; |
875 | out_err: | 875 | out_err: |
876 | ICMP_INC_STATS_BH(dev_net(skb->dst->dev), ICMP_MIB_INERRORS); | 876 | ICMP_INC_STATS_BH(dev_net(skb_dst(skb)->dev), ICMP_MIB_INERRORS); |
877 | goto out; | 877 | goto out; |
878 | } | 878 | } |
879 | 879 | ||
diff --git a/net/ipv4/igmp.c b/net/ipv4/igmp.c index afabd2758b6..01b4284ed69 100644 --- a/net/ipv4/igmp.c +++ b/net/ipv4/igmp.c | |||
@@ -311,7 +311,7 @@ static struct sk_buff *igmpv3_newpack(struct net_device *dev, int size) | |||
311 | return NULL; | 311 | return NULL; |
312 | } | 312 | } |
313 | 313 | ||
314 | skb->dst = &rt->u.dst; | 314 | skb_dst_set(skb, &rt->u.dst); |
315 | skb->dev = dev; | 315 | skb->dev = dev; |
316 | 316 | ||
317 | skb_reserve(skb, LL_RESERVED_SPACE(dev)); | 317 | skb_reserve(skb, LL_RESERVED_SPACE(dev)); |
@@ -659,7 +659,7 @@ static int igmp_send_report(struct in_device *in_dev, struct ip_mc_list *pmc, | |||
659 | return -1; | 659 | return -1; |
660 | } | 660 | } |
661 | 661 | ||
662 | skb->dst = &rt->u.dst; | 662 | skb_dst_set(skb, &rt->u.dst); |
663 | 663 | ||
664 | skb_reserve(skb, LL_RESERVED_SPACE(dev)); | 664 | skb_reserve(skb, LL_RESERVED_SPACE(dev)); |
665 | 665 | ||
diff --git a/net/ipv4/ip_forward.c b/net/ipv4/ip_forward.c index 0761cd9bbd1..a2991bc8e32 100644 --- a/net/ipv4/ip_forward.c +++ b/net/ipv4/ip_forward.c | |||
@@ -42,7 +42,7 @@ static int ip_forward_finish(struct sk_buff *skb) | |||
42 | { | 42 | { |
43 | struct ip_options * opt = &(IPCB(skb)->opt); | 43 | struct ip_options * opt = &(IPCB(skb)->opt); |
44 | 44 | ||
45 | IP_INC_STATS_BH(dev_net(skb->dst->dev), IPSTATS_MIB_OUTFORWDATAGRAMS); | 45 | IP_INC_STATS_BH(dev_net(skb_dst(skb)->dev), IPSTATS_MIB_OUTFORWDATAGRAMS); |
46 | 46 | ||
47 | if (unlikely(opt->optlen)) | 47 | if (unlikely(opt->optlen)) |
48 | ip_forward_options(skb); | 48 | ip_forward_options(skb); |
@@ -123,7 +123,7 @@ sr_failed: | |||
123 | 123 | ||
124 | too_many_hops: | 124 | too_many_hops: |
125 | /* Tell the sender its packet died... */ | 125 | /* Tell the sender its packet died... */ |
126 | IP_INC_STATS_BH(dev_net(skb->dst->dev), IPSTATS_MIB_INHDRERRORS); | 126 | IP_INC_STATS_BH(dev_net(skb_dst(skb)->dev), IPSTATS_MIB_INHDRERRORS); |
127 | icmp_send(skb, ICMP_TIME_EXCEEDED, ICMP_EXC_TTL, 0); | 127 | icmp_send(skb, ICMP_TIME_EXCEEDED, ICMP_EXC_TTL, 0); |
128 | drop: | 128 | drop: |
129 | kfree_skb(skb); | 129 | kfree_skb(skb); |
diff --git a/net/ipv4/ip_fragment.c b/net/ipv4/ip_fragment.c index 7985346653b..1f1b82475ea 100644 --- a/net/ipv4/ip_fragment.c +++ b/net/ipv4/ip_fragment.c | |||
@@ -573,7 +573,7 @@ int ip_defrag(struct sk_buff *skb, u32 user) | |||
573 | struct ipq *qp; | 573 | struct ipq *qp; |
574 | struct net *net; | 574 | struct net *net; |
575 | 575 | ||
576 | net = skb->dev ? dev_net(skb->dev) : dev_net(skb->dst->dev); | 576 | net = skb->dev ? dev_net(skb->dev) : dev_net(skb_dst(skb)->dev); |
577 | IP_INC_STATS_BH(net, IPSTATS_MIB_REASMREQDS); | 577 | IP_INC_STATS_BH(net, IPSTATS_MIB_REASMREQDS); |
578 | 578 | ||
579 | /* Start by cleaning up the memory. */ | 579 | /* Start by cleaning up the memory. */ |
diff --git a/net/ipv4/ip_gre.c b/net/ipv4/ip_gre.c index 85ddad45a91..44e2a3d2359 100644 --- a/net/ipv4/ip_gre.c +++ b/net/ipv4/ip_gre.c | |||
@@ -643,8 +643,7 @@ static int ipgre_rcv(struct sk_buff *skb) | |||
643 | stats->rx_packets++; | 643 | stats->rx_packets++; |
644 | stats->rx_bytes += len; | 644 | stats->rx_bytes += len; |
645 | skb->dev = tunnel->dev; | 645 | skb->dev = tunnel->dev; |
646 | dst_release(skb->dst); | 646 | skb_dst_drop(skb); |
647 | skb->dst = NULL; | ||
648 | nf_reset(skb); | 647 | nf_reset(skb); |
649 | 648 | ||
650 | skb_reset_network_header(skb); | 649 | skb_reset_network_header(skb); |
@@ -698,7 +697,7 @@ static int ipgre_tunnel_xmit(struct sk_buff *skb, struct net_device *dev) | |||
698 | if ((dst = tiph->daddr) == 0) { | 697 | if ((dst = tiph->daddr) == 0) { |
699 | /* NBMA tunnel */ | 698 | /* NBMA tunnel */ |
700 | 699 | ||
701 | if (skb->dst == NULL) { | 700 | if (skb_dst(skb) == NULL) { |
702 | stats->tx_fifo_errors++; | 701 | stats->tx_fifo_errors++; |
703 | goto tx_error; | 702 | goto tx_error; |
704 | } | 703 | } |
@@ -712,7 +711,7 @@ static int ipgre_tunnel_xmit(struct sk_buff *skb, struct net_device *dev) | |||
712 | else if (skb->protocol == htons(ETH_P_IPV6)) { | 711 | else if (skb->protocol == htons(ETH_P_IPV6)) { |
713 | struct in6_addr *addr6; | 712 | struct in6_addr *addr6; |
714 | int addr_type; | 713 | int addr_type; |
715 | struct neighbour *neigh = skb->dst->neighbour; | 714 | struct neighbour *neigh = skb_dst(skb)->neighbour; |
716 | 715 | ||
717 | if (neigh == NULL) | 716 | if (neigh == NULL) |
718 | goto tx_error; | 717 | goto tx_error; |
@@ -766,10 +765,10 @@ static int ipgre_tunnel_xmit(struct sk_buff *skb, struct net_device *dev) | |||
766 | if (df) | 765 | if (df) |
767 | mtu = dst_mtu(&rt->u.dst) - dev->hard_header_len - tunnel->hlen; | 766 | mtu = dst_mtu(&rt->u.dst) - dev->hard_header_len - tunnel->hlen; |
768 | else | 767 | else |
769 | mtu = skb->dst ? dst_mtu(skb->dst) : dev->mtu; | 768 | mtu = skb_dst(skb) ? dst_mtu(skb_dst(skb)) : dev->mtu; |
770 | 769 | ||
771 | if (skb->dst) | 770 | if (skb_dst(skb)) |
772 | skb->dst->ops->update_pmtu(skb->dst, mtu); | 771 | skb_dst(skb)->ops->update_pmtu(skb_dst(skb), mtu); |
773 | 772 | ||
774 | if (skb->protocol == htons(ETH_P_IP)) { | 773 | if (skb->protocol == htons(ETH_P_IP)) { |
775 | df |= (old_iph->frag_off&htons(IP_DF)); | 774 | df |= (old_iph->frag_off&htons(IP_DF)); |
@@ -783,14 +782,14 @@ static int ipgre_tunnel_xmit(struct sk_buff *skb, struct net_device *dev) | |||
783 | } | 782 | } |
784 | #ifdef CONFIG_IPV6 | 783 | #ifdef CONFIG_IPV6 |
785 | else if (skb->protocol == htons(ETH_P_IPV6)) { | 784 | else if (skb->protocol == htons(ETH_P_IPV6)) { |
786 | struct rt6_info *rt6 = (struct rt6_info *)skb->dst; | 785 | struct rt6_info *rt6 = (struct rt6_info *)skb_dst(skb); |
787 | 786 | ||
788 | if (rt6 && mtu < dst_mtu(skb->dst) && mtu >= IPV6_MIN_MTU) { | 787 | if (rt6 && mtu < dst_mtu(skb_dst(skb)) && mtu >= IPV6_MIN_MTU) { |
789 | if ((tunnel->parms.iph.daddr && | 788 | if ((tunnel->parms.iph.daddr && |
790 | !ipv4_is_multicast(tunnel->parms.iph.daddr)) || | 789 | !ipv4_is_multicast(tunnel->parms.iph.daddr)) || |
791 | rt6->rt6i_dst.plen == 128) { | 790 | rt6->rt6i_dst.plen == 128) { |
792 | rt6->rt6i_flags |= RTF_MODIFIED; | 791 | rt6->rt6i_flags |= RTF_MODIFIED; |
793 | skb->dst->metrics[RTAX_MTU-1] = mtu; | 792 | skb_dst(skb)->metrics[RTAX_MTU-1] = mtu; |
794 | } | 793 | } |
795 | } | 794 | } |
796 | 795 | ||
@@ -837,8 +836,8 @@ static int ipgre_tunnel_xmit(struct sk_buff *skb, struct net_device *dev) | |||
837 | memset(&(IPCB(skb)->opt), 0, sizeof(IPCB(skb)->opt)); | 836 | memset(&(IPCB(skb)->opt), 0, sizeof(IPCB(skb)->opt)); |
838 | IPCB(skb)->flags &= ~(IPSKB_XFRM_TUNNEL_SIZE | IPSKB_XFRM_TRANSFORMED | | 837 | IPCB(skb)->flags &= ~(IPSKB_XFRM_TUNNEL_SIZE | IPSKB_XFRM_TRANSFORMED | |
839 | IPSKB_REROUTED); | 838 | IPSKB_REROUTED); |
840 | dst_release(skb->dst); | 839 | skb_dst_drop(skb); |
841 | skb->dst = &rt->u.dst; | 840 | skb_dst_set(skb, &rt->u.dst); |
842 | 841 | ||
843 | /* | 842 | /* |
844 | * Push down and install the IPIP header. | 843 | * Push down and install the IPIP header. |
diff --git a/net/ipv4/ip_input.c b/net/ipv4/ip_input.c index cea784b0aa4..490ce20faf3 100644 --- a/net/ipv4/ip_input.c +++ b/net/ipv4/ip_input.c | |||
@@ -329,7 +329,7 @@ static int ip_rcv_finish(struct sk_buff *skb) | |||
329 | * Initialise the virtual path cache for the packet. It describes | 329 | * Initialise the virtual path cache for the packet. It describes |
330 | * how the packet travels inside Linux networking. | 330 | * how the packet travels inside Linux networking. |
331 | */ | 331 | */ |
332 | if (skb->dst == NULL) { | 332 | if (skb_dst(skb) == NULL) { |
333 | int err = ip_route_input(skb, iph->daddr, iph->saddr, iph->tos, | 333 | int err = ip_route_input(skb, iph->daddr, iph->saddr, iph->tos, |
334 | skb->dev); | 334 | skb->dev); |
335 | if (unlikely(err)) { | 335 | if (unlikely(err)) { |
@@ -344,9 +344,9 @@ static int ip_rcv_finish(struct sk_buff *skb) | |||
344 | } | 344 | } |
345 | 345 | ||
346 | #ifdef CONFIG_NET_CLS_ROUTE | 346 | #ifdef CONFIG_NET_CLS_ROUTE |
347 | if (unlikely(skb->dst->tclassid)) { | 347 | if (unlikely(skb_dst(skb)->tclassid)) { |
348 | struct ip_rt_acct *st = per_cpu_ptr(ip_rt_acct, smp_processor_id()); | 348 | struct ip_rt_acct *st = per_cpu_ptr(ip_rt_acct, smp_processor_id()); |
349 | u32 idx = skb->dst->tclassid; | 349 | u32 idx = skb_dst(skb)->tclassid; |
350 | st[idx&0xFF].o_packets++; | 350 | st[idx&0xFF].o_packets++; |
351 | st[idx&0xFF].o_bytes += skb->len; | 351 | st[idx&0xFF].o_bytes += skb->len; |
352 | st[(idx>>16)&0xFF].i_packets++; | 352 | st[(idx>>16)&0xFF].i_packets++; |
diff --git a/net/ipv4/ip_options.c b/net/ipv4/ip_options.c index 7e1074ffdbd..94bf105ef3c 100644 --- a/net/ipv4/ip_options.c +++ b/net/ipv4/ip_options.c | |||
@@ -143,7 +143,7 @@ int ip_options_echo(struct ip_options * dopt, struct sk_buff * skb) | |||
143 | __be32 addr; | 143 | __be32 addr; |
144 | 144 | ||
145 | memcpy(&addr, sptr+soffset-1, 4); | 145 | memcpy(&addr, sptr+soffset-1, 4); |
146 | if (inet_addr_type(dev_net(skb->dst->dev), addr) != RTN_LOCAL) { | 146 | if (inet_addr_type(dev_net(skb_dst(skb)->dev), addr) != RTN_LOCAL) { |
147 | dopt->ts_needtime = 1; | 147 | dopt->ts_needtime = 1; |
148 | soffset += 8; | 148 | soffset += 8; |
149 | } | 149 | } |
@@ -624,12 +624,12 @@ int ip_options_rcv_srr(struct sk_buff *skb) | |||
624 | memcpy(&nexthop, &optptr[srrptr-1], 4); | 624 | memcpy(&nexthop, &optptr[srrptr-1], 4); |
625 | 625 | ||
626 | rt = skb_rtable(skb); | 626 | rt = skb_rtable(skb); |
627 | skb->dst = NULL; | 627 | skb_dst_set(skb, NULL); |
628 | err = ip_route_input(skb, nexthop, iph->saddr, iph->tos, skb->dev); | 628 | err = ip_route_input(skb, nexthop, iph->saddr, iph->tos, skb->dev); |
629 | rt2 = skb_rtable(skb); | 629 | rt2 = skb_rtable(skb); |
630 | if (err || (rt2->rt_type != RTN_UNICAST && rt2->rt_type != RTN_LOCAL)) { | 630 | if (err || (rt2->rt_type != RTN_UNICAST && rt2->rt_type != RTN_LOCAL)) { |
631 | ip_rt_put(rt2); | 631 | ip_rt_put(rt2); |
632 | skb->dst = &rt->u.dst; | 632 | skb_dst_set(skb, &rt->u.dst); |
633 | return -EINVAL; | 633 | return -EINVAL; |
634 | } | 634 | } |
635 | ip_rt_put(rt); | 635 | ip_rt_put(rt); |
diff --git a/net/ipv4/ip_output.c b/net/ipv4/ip_output.c index 8d845ebfcca..3d6167fb2d9 100644 --- a/net/ipv4/ip_output.c +++ b/net/ipv4/ip_output.c | |||
@@ -95,7 +95,7 @@ int __ip_local_out(struct sk_buff *skb) | |||
95 | 95 | ||
96 | iph->tot_len = htons(skb->len); | 96 | iph->tot_len = htons(skb->len); |
97 | ip_send_check(iph); | 97 | ip_send_check(iph); |
98 | return nf_hook(PF_INET, NF_INET_LOCAL_OUT, skb, NULL, skb->dst->dev, | 98 | return nf_hook(PF_INET, NF_INET_LOCAL_OUT, skb, NULL, skb_dst(skb)->dev, |
99 | dst_output); | 99 | dst_output); |
100 | } | 100 | } |
101 | 101 | ||
@@ -118,7 +118,7 @@ static int ip_dev_loopback_xmit(struct sk_buff *newskb) | |||
118 | __skb_pull(newskb, skb_network_offset(newskb)); | 118 | __skb_pull(newskb, skb_network_offset(newskb)); |
119 | newskb->pkt_type = PACKET_LOOPBACK; | 119 | newskb->pkt_type = PACKET_LOOPBACK; |
120 | newskb->ip_summed = CHECKSUM_UNNECESSARY; | 120 | newskb->ip_summed = CHECKSUM_UNNECESSARY; |
121 | WARN_ON(!newskb->dst); | 121 | WARN_ON(!skb_dst(newskb)); |
122 | netif_rx(newskb); | 122 | netif_rx(newskb); |
123 | return 0; | 123 | return 0; |
124 | } | 124 | } |
@@ -176,7 +176,7 @@ EXPORT_SYMBOL_GPL(ip_build_and_send_pkt); | |||
176 | 176 | ||
177 | static inline int ip_finish_output2(struct sk_buff *skb) | 177 | static inline int ip_finish_output2(struct sk_buff *skb) |
178 | { | 178 | { |
179 | struct dst_entry *dst = skb->dst; | 179 | struct dst_entry *dst = skb_dst(skb); |
180 | struct rtable *rt = (struct rtable *)dst; | 180 | struct rtable *rt = (struct rtable *)dst; |
181 | struct net_device *dev = dst->dev; | 181 | struct net_device *dev = dst->dev; |
182 | unsigned int hh_len = LL_RESERVED_SPACE(dev); | 182 | unsigned int hh_len = LL_RESERVED_SPACE(dev); |
@@ -217,14 +217,14 @@ static inline int ip_skb_dst_mtu(struct sk_buff *skb) | |||
217 | struct inet_sock *inet = skb->sk ? inet_sk(skb->sk) : NULL; | 217 | struct inet_sock *inet = skb->sk ? inet_sk(skb->sk) : NULL; |
218 | 218 | ||
219 | return (inet && inet->pmtudisc == IP_PMTUDISC_PROBE) ? | 219 | return (inet && inet->pmtudisc == IP_PMTUDISC_PROBE) ? |
220 | skb->dst->dev->mtu : dst_mtu(skb->dst); | 220 | skb_dst(skb)->dev->mtu : dst_mtu(skb_dst(skb)); |
221 | } | 221 | } |
222 | 222 | ||
223 | static int ip_finish_output(struct sk_buff *skb) | 223 | static int ip_finish_output(struct sk_buff *skb) |
224 | { | 224 | { |
225 | #if defined(CONFIG_NETFILTER) && defined(CONFIG_XFRM) | 225 | #if defined(CONFIG_NETFILTER) && defined(CONFIG_XFRM) |
226 | /* Policy lookup after SNAT yielded a new policy */ | 226 | /* Policy lookup after SNAT yielded a new policy */ |
227 | if (skb->dst->xfrm != NULL) { | 227 | if (skb_dst(skb)->xfrm != NULL) { |
228 | IPCB(skb)->flags |= IPSKB_REROUTED; | 228 | IPCB(skb)->flags |= IPSKB_REROUTED; |
229 | return dst_output(skb); | 229 | return dst_output(skb); |
230 | } | 230 | } |
@@ -296,7 +296,7 @@ int ip_mc_output(struct sk_buff *skb) | |||
296 | 296 | ||
297 | int ip_output(struct sk_buff *skb) | 297 | int ip_output(struct sk_buff *skb) |
298 | { | 298 | { |
299 | struct net_device *dev = skb->dst->dev; | 299 | struct net_device *dev = skb_dst(skb)->dev; |
300 | 300 | ||
301 | IP_UPD_PO_STATS(dev_net(dev), IPSTATS_MIB_OUT, skb->len); | 301 | IP_UPD_PO_STATS(dev_net(dev), IPSTATS_MIB_OUT, skb->len); |
302 | 302 | ||
@@ -355,7 +355,7 @@ int ip_queue_xmit(struct sk_buff *skb, int ipfragok) | |||
355 | } | 355 | } |
356 | sk_setup_caps(sk, &rt->u.dst); | 356 | sk_setup_caps(sk, &rt->u.dst); |
357 | } | 357 | } |
358 | skb->dst = dst_clone(&rt->u.dst); | 358 | skb_dst_set(skb, dst_clone(&rt->u.dst)); |
359 | 359 | ||
360 | packet_routed: | 360 | packet_routed: |
361 | if (opt && opt->is_strictroute && rt->rt_dst != rt->rt_gateway) | 361 | if (opt && opt->is_strictroute && rt->rt_dst != rt->rt_gateway) |
@@ -401,8 +401,8 @@ static void ip_copy_metadata(struct sk_buff *to, struct sk_buff *from) | |||
401 | to->pkt_type = from->pkt_type; | 401 | to->pkt_type = from->pkt_type; |
402 | to->priority = from->priority; | 402 | to->priority = from->priority; |
403 | to->protocol = from->protocol; | 403 | to->protocol = from->protocol; |
404 | dst_release(to->dst); | 404 | skb_dst_drop(to); |
405 | to->dst = dst_clone(from->dst); | 405 | skb_dst_set(to, dst_clone(skb_dst(from))); |
406 | to->dev = from->dev; | 406 | to->dev = from->dev; |
407 | to->mark = from->mark; | 407 | to->mark = from->mark; |
408 | 408 | ||
@@ -1294,7 +1294,7 @@ int ip_push_pending_frames(struct sock *sk) | |||
1294 | * on dst refcount | 1294 | * on dst refcount |
1295 | */ | 1295 | */ |
1296 | inet->cork.dst = NULL; | 1296 | inet->cork.dst = NULL; |
1297 | skb->dst = &rt->u.dst; | 1297 | skb_dst_set(skb, &rt->u.dst); |
1298 | 1298 | ||
1299 | if (iph->protocol == IPPROTO_ICMP) | 1299 | if (iph->protocol == IPPROTO_ICMP) |
1300 | icmp_out_count(net, ((struct icmphdr *) | 1300 | icmp_out_count(net, ((struct icmphdr *) |
diff --git a/net/ipv4/ipip.c b/net/ipv4/ipip.c index 0c6e7bf18a4..93e2b787da2 100644 --- a/net/ipv4/ipip.c +++ b/net/ipv4/ipip.c | |||
@@ -370,8 +370,7 @@ static int ipip_rcv(struct sk_buff *skb) | |||
370 | tunnel->dev->stats.rx_packets++; | 370 | tunnel->dev->stats.rx_packets++; |
371 | tunnel->dev->stats.rx_bytes += skb->len; | 371 | tunnel->dev->stats.rx_bytes += skb->len; |
372 | skb->dev = tunnel->dev; | 372 | skb->dev = tunnel->dev; |
373 | dst_release(skb->dst); | 373 | skb_dst_drop(skb); |
374 | skb->dst = NULL; | ||
375 | nf_reset(skb); | 374 | nf_reset(skb); |
376 | ipip_ecn_decapsulate(iph, skb); | 375 | ipip_ecn_decapsulate(iph, skb); |
377 | netif_rx(skb); | 376 | netif_rx(skb); |
@@ -447,15 +446,15 @@ static int ipip_tunnel_xmit(struct sk_buff *skb, struct net_device *dev) | |||
447 | if (tiph->frag_off) | 446 | if (tiph->frag_off) |
448 | mtu = dst_mtu(&rt->u.dst) - sizeof(struct iphdr); | 447 | mtu = dst_mtu(&rt->u.dst) - sizeof(struct iphdr); |
449 | else | 448 | else |
450 | mtu = skb->dst ? dst_mtu(skb->dst) : dev->mtu; | 449 | mtu = skb_dst(skb) ? dst_mtu(skb_dst(skb)) : dev->mtu; |
451 | 450 | ||
452 | if (mtu < 68) { | 451 | if (mtu < 68) { |
453 | stats->collisions++; | 452 | stats->collisions++; |
454 | ip_rt_put(rt); | 453 | ip_rt_put(rt); |
455 | goto tx_error; | 454 | goto tx_error; |
456 | } | 455 | } |
457 | if (skb->dst) | 456 | if (skb_dst(skb)) |
458 | skb->dst->ops->update_pmtu(skb->dst, mtu); | 457 | skb_dst(skb)->ops->update_pmtu(skb_dst(skb), mtu); |
459 | 458 | ||
460 | df |= (old_iph->frag_off&htons(IP_DF)); | 459 | df |= (old_iph->frag_off&htons(IP_DF)); |
461 | 460 | ||
@@ -502,8 +501,8 @@ static int ipip_tunnel_xmit(struct sk_buff *skb, struct net_device *dev) | |||
502 | memset(&(IPCB(skb)->opt), 0, sizeof(IPCB(skb)->opt)); | 501 | memset(&(IPCB(skb)->opt), 0, sizeof(IPCB(skb)->opt)); |
503 | IPCB(skb)->flags &= ~(IPSKB_XFRM_TUNNEL_SIZE | IPSKB_XFRM_TRANSFORMED | | 502 | IPCB(skb)->flags &= ~(IPSKB_XFRM_TUNNEL_SIZE | IPSKB_XFRM_TRANSFORMED | |
504 | IPSKB_REROUTED); | 503 | IPSKB_REROUTED); |
505 | dst_release(skb->dst); | 504 | skb_dst_drop(skb); |
506 | skb->dst = &rt->u.dst; | 505 | skb_dst_set(skb, &rt->u.dst); |
507 | 506 | ||
508 | /* | 507 | /* |
509 | * Push down and install the IPIP header. | 508 | * Push down and install the IPIP header. |
diff --git a/net/ipv4/ipmr.c b/net/ipv4/ipmr.c index 69dd058283e..ffd98610446 100644 --- a/net/ipv4/ipmr.c +++ b/net/ipv4/ipmr.c | |||
@@ -651,7 +651,7 @@ static int ipmr_cache_report(struct net *net, | |||
651 | ip_hdr(skb)->protocol = 0; /* Flag to the kernel this is a route add */ | 651 | ip_hdr(skb)->protocol = 0; /* Flag to the kernel this is a route add */ |
652 | msg = (struct igmpmsg *)skb_network_header(skb); | 652 | msg = (struct igmpmsg *)skb_network_header(skb); |
653 | msg->im_vif = vifi; | 653 | msg->im_vif = vifi; |
654 | skb->dst = dst_clone(pkt->dst); | 654 | skb_dst_set(skb, dst_clone(skb_dst(pkt))); |
655 | 655 | ||
656 | /* | 656 | /* |
657 | * Add our header | 657 | * Add our header |
@@ -1201,7 +1201,7 @@ static void ip_encap(struct sk_buff *skb, __be32 saddr, __be32 daddr) | |||
1201 | iph->protocol = IPPROTO_IPIP; | 1201 | iph->protocol = IPPROTO_IPIP; |
1202 | iph->ihl = 5; | 1202 | iph->ihl = 5; |
1203 | iph->tot_len = htons(skb->len); | 1203 | iph->tot_len = htons(skb->len); |
1204 | ip_select_ident(iph, skb->dst, NULL); | 1204 | ip_select_ident(iph, skb_dst(skb), NULL); |
1205 | ip_send_check(iph); | 1205 | ip_send_check(iph); |
1206 | 1206 | ||
1207 | memset(&(IPCB(skb)->opt), 0, sizeof(IPCB(skb)->opt)); | 1207 | memset(&(IPCB(skb)->opt), 0, sizeof(IPCB(skb)->opt)); |
@@ -1212,7 +1212,7 @@ static inline int ipmr_forward_finish(struct sk_buff *skb) | |||
1212 | { | 1212 | { |
1213 | struct ip_options * opt = &(IPCB(skb)->opt); | 1213 | struct ip_options * opt = &(IPCB(skb)->opt); |
1214 | 1214 | ||
1215 | IP_INC_STATS_BH(dev_net(skb->dst->dev), IPSTATS_MIB_OUTFORWDATAGRAMS); | 1215 | IP_INC_STATS_BH(dev_net(skb_dst(skb)->dev), IPSTATS_MIB_OUTFORWDATAGRAMS); |
1216 | 1216 | ||
1217 | if (unlikely(opt->optlen)) | 1217 | if (unlikely(opt->optlen)) |
1218 | ip_forward_options(skb); | 1218 | ip_forward_options(skb); |
@@ -1290,8 +1290,8 @@ static void ipmr_queue_xmit(struct sk_buff *skb, struct mfc_cache *c, int vifi) | |||
1290 | vif->pkt_out++; | 1290 | vif->pkt_out++; |
1291 | vif->bytes_out += skb->len; | 1291 | vif->bytes_out += skb->len; |
1292 | 1292 | ||
1293 | dst_release(skb->dst); | 1293 | skb_dst_drop(skb); |
1294 | skb->dst = &rt->u.dst; | 1294 | skb_dst_set(skb, &rt->u.dst); |
1295 | ip_decrease_ttl(ip_hdr(skb)); | 1295 | ip_decrease_ttl(ip_hdr(skb)); |
1296 | 1296 | ||
1297 | /* FIXME: forward and output firewalls used to be called here. | 1297 | /* FIXME: forward and output firewalls used to be called here. |
@@ -1543,8 +1543,7 @@ static int __pim_rcv(struct sk_buff *skb, unsigned int pimlen) | |||
1543 | skb->protocol = htons(ETH_P_IP); | 1543 | skb->protocol = htons(ETH_P_IP); |
1544 | skb->ip_summed = 0; | 1544 | skb->ip_summed = 0; |
1545 | skb->pkt_type = PACKET_HOST; | 1545 | skb->pkt_type = PACKET_HOST; |
1546 | dst_release(skb->dst); | 1546 | skb_dst_drop(skb); |
1547 | skb->dst = NULL; | ||
1548 | reg_dev->stats.rx_bytes += skb->len; | 1547 | reg_dev->stats.rx_bytes += skb->len; |
1549 | reg_dev->stats.rx_packets++; | 1548 | reg_dev->stats.rx_packets++; |
1550 | nf_reset(skb); | 1549 | nf_reset(skb); |
diff --git a/net/ipv4/netfilter.c b/net/ipv4/netfilter.c index fdf6811c31a..1725dc0ef68 100644 --- a/net/ipv4/netfilter.c +++ b/net/ipv4/netfilter.c | |||
@@ -12,7 +12,7 @@ | |||
12 | /* route_me_harder function, used by iptable_nat, iptable_mangle + ip_queue */ | 12 | /* route_me_harder function, used by iptable_nat, iptable_mangle + ip_queue */ |
13 | int ip_route_me_harder(struct sk_buff *skb, unsigned addr_type) | 13 | int ip_route_me_harder(struct sk_buff *skb, unsigned addr_type) |
14 | { | 14 | { |
15 | struct net *net = dev_net(skb->dst->dev); | 15 | struct net *net = dev_net(skb_dst(skb)->dev); |
16 | const struct iphdr *iph = ip_hdr(skb); | 16 | const struct iphdr *iph = ip_hdr(skb); |
17 | struct rtable *rt; | 17 | struct rtable *rt; |
18 | struct flowi fl = {}; | 18 | struct flowi fl = {}; |
@@ -41,8 +41,8 @@ int ip_route_me_harder(struct sk_buff *skb, unsigned addr_type) | |||
41 | return -1; | 41 | return -1; |
42 | 42 | ||
43 | /* Drop old route. */ | 43 | /* Drop old route. */ |
44 | dst_release(skb->dst); | 44 | skb_dst_drop(skb); |
45 | skb->dst = &rt->u.dst; | 45 | skb_dst_set(skb, &rt->u.dst); |
46 | } else { | 46 | } else { |
47 | /* non-local src, find valid iif to satisfy | 47 | /* non-local src, find valid iif to satisfy |
48 | * rp-filter when calling ip_route_input. */ | 48 | * rp-filter when calling ip_route_input. */ |
@@ -50,7 +50,7 @@ int ip_route_me_harder(struct sk_buff *skb, unsigned addr_type) | |||
50 | if (ip_route_output_key(net, &rt, &fl) != 0) | 50 | if (ip_route_output_key(net, &rt, &fl) != 0) |
51 | return -1; | 51 | return -1; |
52 | 52 | ||
53 | odst = skb->dst; | 53 | odst = skb_dst(skb); |
54 | if (ip_route_input(skb, iph->daddr, iph->saddr, | 54 | if (ip_route_input(skb, iph->daddr, iph->saddr, |
55 | RT_TOS(iph->tos), rt->u.dst.dev) != 0) { | 55 | RT_TOS(iph->tos), rt->u.dst.dev) != 0) { |
56 | dst_release(&rt->u.dst); | 56 | dst_release(&rt->u.dst); |
@@ -60,18 +60,22 @@ int ip_route_me_harder(struct sk_buff *skb, unsigned addr_type) | |||
60 | dst_release(odst); | 60 | dst_release(odst); |
61 | } | 61 | } |
62 | 62 | ||
63 | if (skb->dst->error) | 63 | if (skb_dst(skb)->error) |
64 | return -1; | 64 | return -1; |
65 | 65 | ||
66 | #ifdef CONFIG_XFRM | 66 | #ifdef CONFIG_XFRM |
67 | if (!(IPCB(skb)->flags & IPSKB_XFRM_TRANSFORMED) && | 67 | if (!(IPCB(skb)->flags & IPSKB_XFRM_TRANSFORMED) && |
68 | xfrm_decode_session(skb, &fl, AF_INET) == 0) | 68 | xfrm_decode_session(skb, &fl, AF_INET) == 0) { |
69 | if (xfrm_lookup(net, &skb->dst, &fl, skb->sk, 0)) | 69 | struct dst_entry *dst = skb_dst(skb); |
70 | skb_dst_set(skb, NULL); | ||
71 | if (xfrm_lookup(net, &dst, &fl, skb->sk, 0)) | ||
70 | return -1; | 72 | return -1; |
73 | skb_dst_set(skb, dst); | ||
74 | } | ||
71 | #endif | 75 | #endif |
72 | 76 | ||
73 | /* Change in oif may mean change in hh_len. */ | 77 | /* Change in oif may mean change in hh_len. */ |
74 | hh_len = skb->dst->dev->hard_header_len; | 78 | hh_len = skb_dst(skb)->dev->hard_header_len; |
75 | if (skb_headroom(skb) < hh_len && | 79 | if (skb_headroom(skb) < hh_len && |
76 | pskb_expand_head(skb, hh_len - skb_headroom(skb), 0, GFP_ATOMIC)) | 80 | pskb_expand_head(skb, hh_len - skb_headroom(skb), 0, GFP_ATOMIC)) |
77 | return -1; | 81 | return -1; |
@@ -92,7 +96,7 @@ int ip_xfrm_me_harder(struct sk_buff *skb) | |||
92 | if (xfrm_decode_session(skb, &fl, AF_INET) < 0) | 96 | if (xfrm_decode_session(skb, &fl, AF_INET) < 0) |
93 | return -1; | 97 | return -1; |
94 | 98 | ||
95 | dst = skb->dst; | 99 | dst = skb_dst(skb); |
96 | if (dst->xfrm) | 100 | if (dst->xfrm) |
97 | dst = ((struct xfrm_dst *)dst)->route; | 101 | dst = ((struct xfrm_dst *)dst)->route; |
98 | dst_hold(dst); | 102 | dst_hold(dst); |
@@ -100,11 +104,11 @@ int ip_xfrm_me_harder(struct sk_buff *skb) | |||
100 | if (xfrm_lookup(dev_net(dst->dev), &dst, &fl, skb->sk, 0) < 0) | 104 | if (xfrm_lookup(dev_net(dst->dev), &dst, &fl, skb->sk, 0) < 0) |
101 | return -1; | 105 | return -1; |
102 | 106 | ||
103 | dst_release(skb->dst); | 107 | skb_dst_drop(skb); |
104 | skb->dst = dst; | 108 | skb_dst_set(skb, dst); |
105 | 109 | ||
106 | /* Change in oif may mean change in hh_len. */ | 110 | /* Change in oif may mean change in hh_len. */ |
107 | hh_len = skb->dst->dev->hard_header_len; | 111 | hh_len = skb_dst(skb)->dev->hard_header_len; |
108 | if (skb_headroom(skb) < hh_len && | 112 | if (skb_headroom(skb) < hh_len && |
109 | pskb_expand_head(skb, hh_len - skb_headroom(skb), 0, GFP_ATOMIC)) | 113 | pskb_expand_head(skb, hh_len - skb_headroom(skb), 0, GFP_ATOMIC)) |
110 | return -1; | 114 | return -1; |
diff --git a/net/ipv4/netfilter/ipt_REJECT.c b/net/ipv4/netfilter/ipt_REJECT.c index 0b4b6e0ff2b..c93ae44bff2 100644 --- a/net/ipv4/netfilter/ipt_REJECT.c +++ b/net/ipv4/netfilter/ipt_REJECT.c | |||
@@ -108,17 +108,16 @@ static void send_reset(struct sk_buff *oldskb, int hook) | |||
108 | addr_type = RTN_LOCAL; | 108 | addr_type = RTN_LOCAL; |
109 | 109 | ||
110 | /* ip_route_me_harder expects skb->dst to be set */ | 110 | /* ip_route_me_harder expects skb->dst to be set */ |
111 | dst_hold(oldskb->dst); | 111 | skb_dst_set(nskb, dst_clone(skb_dst(oldskb))); |
112 | nskb->dst = oldskb->dst; | ||
113 | 112 | ||
114 | if (ip_route_me_harder(nskb, addr_type)) | 113 | if (ip_route_me_harder(nskb, addr_type)) |
115 | goto free_nskb; | 114 | goto free_nskb; |
116 | 115 | ||
117 | niph->ttl = dst_metric(nskb->dst, RTAX_HOPLIMIT); | 116 | niph->ttl = dst_metric(skb_dst(nskb), RTAX_HOPLIMIT); |
118 | nskb->ip_summed = CHECKSUM_NONE; | 117 | nskb->ip_summed = CHECKSUM_NONE; |
119 | 118 | ||
120 | /* "Never happens" */ | 119 | /* "Never happens" */ |
121 | if (nskb->len > dst_mtu(nskb->dst)) | 120 | if (nskb->len > dst_mtu(skb_dst(nskb))) |
122 | goto free_nskb; | 121 | goto free_nskb; |
123 | 122 | ||
124 | nf_ct_attach(nskb, oldskb); | 123 | nf_ct_attach(nskb, oldskb); |
diff --git a/net/ipv4/netfilter/nf_nat_standalone.c b/net/ipv4/netfilter/nf_nat_standalone.c index b7dd695691a..5567bd0d075 100644 --- a/net/ipv4/netfilter/nf_nat_standalone.c +++ b/net/ipv4/netfilter/nf_nat_standalone.c | |||
@@ -167,10 +167,9 @@ nf_nat_in(unsigned int hooknum, | |||
167 | 167 | ||
168 | ret = nf_nat_fn(hooknum, skb, in, out, okfn); | 168 | ret = nf_nat_fn(hooknum, skb, in, out, okfn); |
169 | if (ret != NF_DROP && ret != NF_STOLEN && | 169 | if (ret != NF_DROP && ret != NF_STOLEN && |
170 | daddr != ip_hdr(skb)->daddr) { | 170 | daddr != ip_hdr(skb)->daddr) |
171 | dst_release(skb->dst); | 171 | skb_dst_drop(skb); |
172 | skb->dst = NULL; | 172 | |
173 | } | ||
174 | return ret; | 173 | return ret; |
175 | } | 174 | } |
176 | 175 | ||
diff --git a/net/ipv4/raw.c b/net/ipv4/raw.c index f774651f0a4..3dc9171a272 100644 --- a/net/ipv4/raw.c +++ b/net/ipv4/raw.c | |||
@@ -343,7 +343,7 @@ static int raw_send_hdrinc(struct sock *sk, void *from, size_t length, | |||
343 | 343 | ||
344 | skb->priority = sk->sk_priority; | 344 | skb->priority = sk->sk_priority; |
345 | skb->mark = sk->sk_mark; | 345 | skb->mark = sk->sk_mark; |
346 | skb->dst = dst_clone(&rt->u.dst); | 346 | skb_dst_set(skb, dst_clone(&rt->u.dst)); |
347 | 347 | ||
348 | skb_reset_network_header(skb); | 348 | skb_reset_network_header(skb); |
349 | iph = ip_hdr(skb); | 349 | iph = ip_hdr(skb); |
diff --git a/net/ipv4/route.c b/net/ipv4/route.c index f20060ac2f0..a849bb15d86 100644 --- a/net/ipv4/route.c +++ b/net/ipv4/route.c | |||
@@ -1118,7 +1118,7 @@ restart: | |||
1118 | if (rp) | 1118 | if (rp) |
1119 | *rp = rth; | 1119 | *rp = rth; |
1120 | else | 1120 | else |
1121 | skb->dst = &rth->u.dst; | 1121 | skb_dst_set(skb, &rth->u.dst); |
1122 | return 0; | 1122 | return 0; |
1123 | } | 1123 | } |
1124 | 1124 | ||
@@ -1217,7 +1217,7 @@ restart: | |||
1217 | if (rp) | 1217 | if (rp) |
1218 | *rp = rt; | 1218 | *rp = rt; |
1219 | else | 1219 | else |
1220 | skb->dst = &rt->u.dst; | 1220 | skb_dst_set(skb, &rt->u.dst); |
1221 | return 0; | 1221 | return 0; |
1222 | } | 1222 | } |
1223 | 1223 | ||
@@ -2251,7 +2251,7 @@ int ip_route_input(struct sk_buff *skb, __be32 daddr, __be32 saddr, | |||
2251 | dst_use(&rth->u.dst, jiffies); | 2251 | dst_use(&rth->u.dst, jiffies); |
2252 | RT_CACHE_STAT_INC(in_hit); | 2252 | RT_CACHE_STAT_INC(in_hit); |
2253 | rcu_read_unlock(); | 2253 | rcu_read_unlock(); |
2254 | skb->dst = &rth->u.dst; | 2254 | skb_dst_set(skb, &rth->u.dst); |
2255 | return 0; | 2255 | return 0; |
2256 | } | 2256 | } |
2257 | RT_CACHE_STAT_INC(in_hlist_search); | 2257 | RT_CACHE_STAT_INC(in_hlist_search); |
@@ -2934,7 +2934,7 @@ static int inet_rtm_getroute(struct sk_buff *in_skb, struct nlmsghdr* nlh, void | |||
2934 | if (err) | 2934 | if (err) |
2935 | goto errout_free; | 2935 | goto errout_free; |
2936 | 2936 | ||
2937 | skb->dst = &rt->u.dst; | 2937 | skb_dst_set(skb, &rt->u.dst); |
2938 | if (rtm->rtm_flags & RTM_F_NOTIFY) | 2938 | if (rtm->rtm_flags & RTM_F_NOTIFY) |
2939 | rt->rt_flags |= RTCF_NOTIFY; | 2939 | rt->rt_flags |= RTCF_NOTIFY; |
2940 | 2940 | ||
@@ -2975,15 +2975,15 @@ int ip_rt_dump(struct sk_buff *skb, struct netlink_callback *cb) | |||
2975 | continue; | 2975 | continue; |
2976 | if (rt_is_expired(rt)) | 2976 | if (rt_is_expired(rt)) |
2977 | continue; | 2977 | continue; |
2978 | skb->dst = dst_clone(&rt->u.dst); | 2978 | skb_dst_set(skb, dst_clone(&rt->u.dst)); |
2979 | if (rt_fill_info(net, skb, NETLINK_CB(cb->skb).pid, | 2979 | if (rt_fill_info(net, skb, NETLINK_CB(cb->skb).pid, |
2980 | cb->nlh->nlmsg_seq, RTM_NEWROUTE, | 2980 | cb->nlh->nlmsg_seq, RTM_NEWROUTE, |
2981 | 1, NLM_F_MULTI) <= 0) { | 2981 | 1, NLM_F_MULTI) <= 0) { |
2982 | dst_release(xchg(&skb->dst, NULL)); | 2982 | skb_dst_drop(skb); |
2983 | rcu_read_unlock_bh(); | 2983 | rcu_read_unlock_bh(); |
2984 | goto done; | 2984 | goto done; |
2985 | } | 2985 | } |
2986 | dst_release(xchg(&skb->dst, NULL)); | 2986 | skb_dst_drop(skb); |
2987 | } | 2987 | } |
2988 | rcu_read_unlock_bh(); | 2988 | rcu_read_unlock_bh(); |
2989 | } | 2989 | } |
diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c index 319c8852644..5a1ca2698c8 100644 --- a/net/ipv4/tcp_ipv4.c +++ b/net/ipv4/tcp_ipv4.c | |||
@@ -590,7 +590,7 @@ static void tcp_v4_send_reset(struct sock *sk, struct sk_buff *skb) | |||
590 | arg.csumoffset = offsetof(struct tcphdr, check) / 2; | 590 | arg.csumoffset = offsetof(struct tcphdr, check) / 2; |
591 | arg.flags = (sk && inet_sk(sk)->transparent) ? IP_REPLY_ARG_NOSRCCHECK : 0; | 591 | arg.flags = (sk && inet_sk(sk)->transparent) ? IP_REPLY_ARG_NOSRCCHECK : 0; |
592 | 592 | ||
593 | net = dev_net(skb->dst->dev); | 593 | net = dev_net(skb_dst(skb)->dev); |
594 | ip_send_reply(net->ipv4.tcp_sock, skb, | 594 | ip_send_reply(net->ipv4.tcp_sock, skb, |
595 | &arg, arg.iov[0].iov_len); | 595 | &arg, arg.iov[0].iov_len); |
596 | 596 | ||
@@ -617,7 +617,7 @@ static void tcp_v4_send_ack(struct sk_buff *skb, u32 seq, u32 ack, | |||
617 | ]; | 617 | ]; |
618 | } rep; | 618 | } rep; |
619 | struct ip_reply_arg arg; | 619 | struct ip_reply_arg arg; |
620 | struct net *net = dev_net(skb->dst->dev); | 620 | struct net *net = dev_net(skb_dst(skb)->dev); |
621 | 621 | ||
622 | memset(&rep.th, 0, sizeof(struct tcphdr)); | 622 | memset(&rep.th, 0, sizeof(struct tcphdr)); |
623 | memset(&arg, 0, sizeof(arg)); | 623 | memset(&arg, 0, sizeof(arg)); |
diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c index 79c39dc9b01..416fc4c2e7e 100644 --- a/net/ipv4/tcp_output.c +++ b/net/ipv4/tcp_output.c | |||
@@ -2202,7 +2202,7 @@ struct sk_buff *tcp_make_synack(struct sock *sk, struct dst_entry *dst, | |||
2202 | /* Reserve space for headers. */ | 2202 | /* Reserve space for headers. */ |
2203 | skb_reserve(skb, MAX_TCP_HEADER); | 2203 | skb_reserve(skb, MAX_TCP_HEADER); |
2204 | 2204 | ||
2205 | skb->dst = dst_clone(dst); | 2205 | skb_dst_set(skb, dst_clone(dst)); |
2206 | 2206 | ||
2207 | mss = dst_metric(dst, RTAX_ADVMSS); | 2207 | mss = dst_metric(dst, RTAX_ADVMSS); |
2208 | if (tp->rx_opt.user_mss && tp->rx_opt.user_mss < mss) | 2208 | if (tp->rx_opt.user_mss && tp->rx_opt.user_mss < mss) |
diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c index 7a1d1ce22e6..8f4158d7c9a 100644 --- a/net/ipv4/udp.c +++ b/net/ipv4/udp.c | |||
@@ -328,7 +328,7 @@ static inline struct sock *__udp4_lib_lookup_skb(struct sk_buff *skb, | |||
328 | if (unlikely(sk = skb_steal_sock(skb))) | 328 | if (unlikely(sk = skb_steal_sock(skb))) |
329 | return sk; | 329 | return sk; |
330 | else | 330 | else |
331 | return __udp4_lib_lookup(dev_net(skb->dst->dev), iph->saddr, sport, | 331 | return __udp4_lib_lookup(dev_net(skb_dst(skb)->dev), iph->saddr, sport, |
332 | iph->daddr, dport, inet_iif(skb), | 332 | iph->daddr, dport, inet_iif(skb), |
333 | udptable); | 333 | udptable); |
334 | } | 334 | } |
@@ -1237,7 +1237,7 @@ int __udp4_lib_rcv(struct sk_buff *skb, struct udp_table *udptable, | |||
1237 | struct sock *sk; | 1237 | struct sock *sk; |
1238 | struct udphdr *uh; | 1238 | struct udphdr *uh; |
1239 | unsigned short ulen; | 1239 | unsigned short ulen; |
1240 | struct rtable *rt = (struct rtable*)skb->dst; | 1240 | struct rtable *rt = skb_rtable(skb); |
1241 | __be32 saddr, daddr; | 1241 | __be32 saddr, daddr; |
1242 | struct net *net = dev_net(skb->dev); | 1242 | struct net *net = dev_net(skb->dev); |
1243 | 1243 | ||
diff --git a/net/ipv4/xfrm4_input.c b/net/ipv4/xfrm4_input.c index 4ec2162a437..f9f922a0ba8 100644 --- a/net/ipv4/xfrm4_input.c +++ b/net/ipv4/xfrm4_input.c | |||
@@ -23,7 +23,7 @@ int xfrm4_extract_input(struct xfrm_state *x, struct sk_buff *skb) | |||
23 | 23 | ||
24 | static inline int xfrm4_rcv_encap_finish(struct sk_buff *skb) | 24 | static inline int xfrm4_rcv_encap_finish(struct sk_buff *skb) |
25 | { | 25 | { |
26 | if (skb->dst == NULL) { | 26 | if (skb_dst(skb) == NULL) { |
27 | const struct iphdr *iph = ip_hdr(skb); | 27 | const struct iphdr *iph = ip_hdr(skb); |
28 | 28 | ||
29 | if (ip_route_input(skb, iph->daddr, iph->saddr, iph->tos, | 29 | if (ip_route_input(skb, iph->daddr, iph->saddr, iph->tos, |
diff --git a/net/ipv4/xfrm4_mode_tunnel.c b/net/ipv4/xfrm4_mode_tunnel.c index 7135279f3f8..3444f3b34ec 100644 --- a/net/ipv4/xfrm4_mode_tunnel.c +++ b/net/ipv4/xfrm4_mode_tunnel.c | |||
@@ -28,7 +28,7 @@ static inline void ipip_ecn_decapsulate(struct sk_buff *skb) | |||
28 | */ | 28 | */ |
29 | static int xfrm4_mode_tunnel_output(struct xfrm_state *x, struct sk_buff *skb) | 29 | static int xfrm4_mode_tunnel_output(struct xfrm_state *x, struct sk_buff *skb) |
30 | { | 30 | { |
31 | struct dst_entry *dst = skb->dst; | 31 | struct dst_entry *dst = skb_dst(skb); |
32 | struct iphdr *top_iph; | 32 | struct iphdr *top_iph; |
33 | int flags; | 33 | int flags; |
34 | 34 | ||
@@ -41,7 +41,7 @@ static int xfrm4_mode_tunnel_output(struct xfrm_state *x, struct sk_buff *skb) | |||
41 | top_iph->ihl = 5; | 41 | top_iph->ihl = 5; |
42 | top_iph->version = 4; | 42 | top_iph->version = 4; |
43 | 43 | ||
44 | top_iph->protocol = xfrm_af2proto(skb->dst->ops->family); | 44 | top_iph->protocol = xfrm_af2proto(skb_dst(skb)->ops->family); |
45 | 45 | ||
46 | /* DS disclosed */ | 46 | /* DS disclosed */ |
47 | top_iph->tos = INET_ECN_encapsulate(XFRM_MODE_SKB_CB(skb)->tos, | 47 | top_iph->tos = INET_ECN_encapsulate(XFRM_MODE_SKB_CB(skb)->tos, |
diff --git a/net/ipv4/xfrm4_output.c b/net/ipv4/xfrm4_output.c index 8c3180adddb..c908bd99bcb 100644 --- a/net/ipv4/xfrm4_output.c +++ b/net/ipv4/xfrm4_output.c | |||
@@ -29,7 +29,7 @@ static int xfrm4_tunnel_check_size(struct sk_buff *skb) | |||
29 | if (!(ip_hdr(skb)->frag_off & htons(IP_DF)) || skb->local_df) | 29 | if (!(ip_hdr(skb)->frag_off & htons(IP_DF)) || skb->local_df) |
30 | goto out; | 30 | goto out; |
31 | 31 | ||
32 | dst = skb->dst; | 32 | dst = skb_dst(skb); |
33 | mtu = dst_mtu(dst); | 33 | mtu = dst_mtu(dst); |
34 | if (skb->len > mtu) { | 34 | if (skb->len > mtu) { |
35 | icmp_send(skb, ICMP_DEST_UNREACH, ICMP_FRAG_NEEDED, htonl(mtu)); | 35 | icmp_send(skb, ICMP_DEST_UNREACH, ICMP_FRAG_NEEDED, htonl(mtu)); |
@@ -72,7 +72,7 @@ EXPORT_SYMBOL(xfrm4_prepare_output); | |||
72 | static int xfrm4_output_finish(struct sk_buff *skb) | 72 | static int xfrm4_output_finish(struct sk_buff *skb) |
73 | { | 73 | { |
74 | #ifdef CONFIG_NETFILTER | 74 | #ifdef CONFIG_NETFILTER |
75 | if (!skb->dst->xfrm) { | 75 | if (!skb_dst(skb)->xfrm) { |
76 | IPCB(skb)->flags |= IPSKB_REROUTED; | 76 | IPCB(skb)->flags |= IPSKB_REROUTED; |
77 | return dst_output(skb); | 77 | return dst_output(skb); |
78 | } | 78 | } |
@@ -87,6 +87,6 @@ static int xfrm4_output_finish(struct sk_buff *skb) | |||
87 | int xfrm4_output(struct sk_buff *skb) | 87 | int xfrm4_output(struct sk_buff *skb) |
88 | { | 88 | { |
89 | return NF_HOOK_COND(PF_INET, NF_INET_POST_ROUTING, skb, | 89 | return NF_HOOK_COND(PF_INET, NF_INET_POST_ROUTING, skb, |
90 | NULL, skb->dst->dev, xfrm4_output_finish, | 90 | NULL, skb_dst(skb)->dev, xfrm4_output_finish, |
91 | !(IPCB(skb)->flags & IPSKB_REROUTED)); | 91 | !(IPCB(skb)->flags & IPSKB_REROUTED)); |
92 | } | 92 | } |
diff --git a/net/ipv6/exthdrs.c b/net/ipv6/exthdrs.c index 1c7f400a3cf..4aae658e550 100644 --- a/net/ipv6/exthdrs.c +++ b/net/ipv6/exthdrs.c | |||
@@ -277,7 +277,7 @@ static int ipv6_destopt_rcv(struct sk_buff *skb) | |||
277 | if (!pskb_may_pull(skb, skb_transport_offset(skb) + 8) || | 277 | if (!pskb_may_pull(skb, skb_transport_offset(skb) + 8) || |
278 | !pskb_may_pull(skb, (skb_transport_offset(skb) + | 278 | !pskb_may_pull(skb, (skb_transport_offset(skb) + |
279 | ((skb_transport_header(skb)[1] + 1) << 3)))) { | 279 | ((skb_transport_header(skb)[1] + 1) << 3)))) { |
280 | IP6_INC_STATS_BH(dev_net(skb->dst->dev), ip6_dst_idev(skb->dst), | 280 | IP6_INC_STATS_BH(dev_net(skb_dst(skb)->dev), ip6_dst_idev(skb_dst(skb)), |
281 | IPSTATS_MIB_INHDRERRORS); | 281 | IPSTATS_MIB_INHDRERRORS); |
282 | kfree_skb(skb); | 282 | kfree_skb(skb); |
283 | return -1; | 283 | return -1; |
@@ -288,7 +288,7 @@ static int ipv6_destopt_rcv(struct sk_buff *skb) | |||
288 | dstbuf = opt->dst1; | 288 | dstbuf = opt->dst1; |
289 | #endif | 289 | #endif |
290 | 290 | ||
291 | dst = dst_clone(skb->dst); | 291 | dst = dst_clone(skb_dst(skb)); |
292 | if (ip6_parse_tlv(tlvprocdestopt_lst, skb)) { | 292 | if (ip6_parse_tlv(tlvprocdestopt_lst, skb)) { |
293 | dst_release(dst); | 293 | dst_release(dst); |
294 | skb->transport_header += (skb_transport_header(skb)[1] + 1) << 3; | 294 | skb->transport_header += (skb_transport_header(skb)[1] + 1) << 3; |
@@ -333,7 +333,7 @@ static int ipv6_rthdr_rcv(struct sk_buff *skb) | |||
333 | if (!pskb_may_pull(skb, skb_transport_offset(skb) + 8) || | 333 | if (!pskb_may_pull(skb, skb_transport_offset(skb) + 8) || |
334 | !pskb_may_pull(skb, (skb_transport_offset(skb) + | 334 | !pskb_may_pull(skb, (skb_transport_offset(skb) + |
335 | ((skb_transport_header(skb)[1] + 1) << 3)))) { | 335 | ((skb_transport_header(skb)[1] + 1) << 3)))) { |
336 | IP6_INC_STATS_BH(net, ip6_dst_idev(skb->dst), | 336 | IP6_INC_STATS_BH(net, ip6_dst_idev(skb_dst(skb)), |
337 | IPSTATS_MIB_INHDRERRORS); | 337 | IPSTATS_MIB_INHDRERRORS); |
338 | kfree_skb(skb); | 338 | kfree_skb(skb); |
339 | return -1; | 339 | return -1; |
@@ -343,7 +343,7 @@ static int ipv6_rthdr_rcv(struct sk_buff *skb) | |||
343 | 343 | ||
344 | if (ipv6_addr_is_multicast(&ipv6_hdr(skb)->daddr) || | 344 | if (ipv6_addr_is_multicast(&ipv6_hdr(skb)->daddr) || |
345 | skb->pkt_type != PACKET_HOST) { | 345 | skb->pkt_type != PACKET_HOST) { |
346 | IP6_INC_STATS_BH(net, ip6_dst_idev(skb->dst), | 346 | IP6_INC_STATS_BH(net, ip6_dst_idev(skb_dst(skb)), |
347 | IPSTATS_MIB_INADDRERRORS); | 347 | IPSTATS_MIB_INADDRERRORS); |
348 | kfree_skb(skb); | 348 | kfree_skb(skb); |
349 | return -1; | 349 | return -1; |
@@ -358,7 +358,7 @@ looped_back: | |||
358 | * processed by own | 358 | * processed by own |
359 | */ | 359 | */ |
360 | if (!addr) { | 360 | if (!addr) { |
361 | IP6_INC_STATS_BH(net, ip6_dst_idev(skb->dst), | 361 | IP6_INC_STATS_BH(net, ip6_dst_idev(skb_dst(skb)), |
362 | IPSTATS_MIB_INADDRERRORS); | 362 | IPSTATS_MIB_INADDRERRORS); |
363 | kfree_skb(skb); | 363 | kfree_skb(skb); |
364 | return -1; | 364 | return -1; |
@@ -384,7 +384,7 @@ looped_back: | |||
384 | goto unknown_rh; | 384 | goto unknown_rh; |
385 | /* Silently discard invalid RTH type 2 */ | 385 | /* Silently discard invalid RTH type 2 */ |
386 | if (hdr->hdrlen != 2 || hdr->segments_left != 1) { | 386 | if (hdr->hdrlen != 2 || hdr->segments_left != 1) { |
387 | IP6_INC_STATS_BH(net, ip6_dst_idev(skb->dst), | 387 | IP6_INC_STATS_BH(net, ip6_dst_idev(skb_dst(skb)), |
388 | IPSTATS_MIB_INHDRERRORS); | 388 | IPSTATS_MIB_INHDRERRORS); |
389 | kfree_skb(skb); | 389 | kfree_skb(skb); |
390 | return -1; | 390 | return -1; |
@@ -403,7 +403,7 @@ looped_back: | |||
403 | n = hdr->hdrlen >> 1; | 403 | n = hdr->hdrlen >> 1; |
404 | 404 | ||
405 | if (hdr->segments_left > n) { | 405 | if (hdr->segments_left > n) { |
406 | IP6_INC_STATS_BH(net, ip6_dst_idev(skb->dst), | 406 | IP6_INC_STATS_BH(net, ip6_dst_idev(skb_dst(skb)), |
407 | IPSTATS_MIB_INHDRERRORS); | 407 | IPSTATS_MIB_INHDRERRORS); |
408 | icmpv6_param_prob(skb, ICMPV6_HDR_FIELD, | 408 | icmpv6_param_prob(skb, ICMPV6_HDR_FIELD, |
409 | ((&hdr->segments_left) - | 409 | ((&hdr->segments_left) - |
@@ -417,7 +417,7 @@ looped_back: | |||
417 | if (skb_cloned(skb)) { | 417 | if (skb_cloned(skb)) { |
418 | /* the copy is a forwarded packet */ | 418 | /* the copy is a forwarded packet */ |
419 | if (pskb_expand_head(skb, 0, 0, GFP_ATOMIC)) { | 419 | if (pskb_expand_head(skb, 0, 0, GFP_ATOMIC)) { |
420 | IP6_INC_STATS_BH(net, ip6_dst_idev(skb->dst), | 420 | IP6_INC_STATS_BH(net, ip6_dst_idev(skb_dst(skb)), |
421 | IPSTATS_MIB_OUTDISCARDS); | 421 | IPSTATS_MIB_OUTDISCARDS); |
422 | kfree_skb(skb); | 422 | kfree_skb(skb); |
423 | return -1; | 423 | return -1; |
@@ -440,13 +440,13 @@ looped_back: | |||
440 | if (xfrm6_input_addr(skb, (xfrm_address_t *)addr, | 440 | if (xfrm6_input_addr(skb, (xfrm_address_t *)addr, |
441 | (xfrm_address_t *)&ipv6_hdr(skb)->saddr, | 441 | (xfrm_address_t *)&ipv6_hdr(skb)->saddr, |
442 | IPPROTO_ROUTING) < 0) { | 442 | IPPROTO_ROUTING) < 0) { |
443 | IP6_INC_STATS_BH(net, ip6_dst_idev(skb->dst), | 443 | IP6_INC_STATS_BH(net, ip6_dst_idev(skb_dst(skb)), |
444 | IPSTATS_MIB_INADDRERRORS); | 444 | IPSTATS_MIB_INADDRERRORS); |
445 | kfree_skb(skb); | 445 | kfree_skb(skb); |
446 | return -1; | 446 | return -1; |
447 | } | 447 | } |
448 | if (!ipv6_chk_home_addr(dev_net(skb->dst->dev), addr)) { | 448 | if (!ipv6_chk_home_addr(dev_net(skb_dst(skb)->dev), addr)) { |
449 | IP6_INC_STATS_BH(net, ip6_dst_idev(skb->dst), | 449 | IP6_INC_STATS_BH(net, ip6_dst_idev(skb_dst(skb)), |
450 | IPSTATS_MIB_INADDRERRORS); | 450 | IPSTATS_MIB_INADDRERRORS); |
451 | kfree_skb(skb); | 451 | kfree_skb(skb); |
452 | return -1; | 452 | return -1; |
@@ -458,7 +458,7 @@ looped_back: | |||
458 | } | 458 | } |
459 | 459 | ||
460 | if (ipv6_addr_is_multicast(addr)) { | 460 | if (ipv6_addr_is_multicast(addr)) { |
461 | IP6_INC_STATS_BH(net, ip6_dst_idev(skb->dst), | 461 | IP6_INC_STATS_BH(net, ip6_dst_idev(skb_dst(skb)), |
462 | IPSTATS_MIB_INADDRERRORS); | 462 | IPSTATS_MIB_INADDRERRORS); |
463 | kfree_skb(skb); | 463 | kfree_skb(skb); |
464 | return -1; | 464 | return -1; |
@@ -468,17 +468,17 @@ looped_back: | |||
468 | ipv6_addr_copy(addr, &ipv6_hdr(skb)->daddr); | 468 | ipv6_addr_copy(addr, &ipv6_hdr(skb)->daddr); |
469 | ipv6_addr_copy(&ipv6_hdr(skb)->daddr, &daddr); | 469 | ipv6_addr_copy(&ipv6_hdr(skb)->daddr, &daddr); |
470 | 470 | ||
471 | dst_release(xchg(&skb->dst, NULL)); | 471 | skb_dst_drop(skb); |
472 | ip6_route_input(skb); | 472 | ip6_route_input(skb); |
473 | if (skb->dst->error) { | 473 | if (skb_dst(skb)->error) { |
474 | skb_push(skb, skb->data - skb_network_header(skb)); | 474 | skb_push(skb, skb->data - skb_network_header(skb)); |
475 | dst_input(skb); | 475 | dst_input(skb); |
476 | return -1; | 476 | return -1; |
477 | } | 477 | } |
478 | 478 | ||
479 | if (skb->dst->dev->flags&IFF_LOOPBACK) { | 479 | if (skb_dst(skb)->dev->flags&IFF_LOOPBACK) { |
480 | if (ipv6_hdr(skb)->hop_limit <= 1) { | 480 | if (ipv6_hdr(skb)->hop_limit <= 1) { |
481 | IP6_INC_STATS_BH(net, ip6_dst_idev(skb->dst), | 481 | IP6_INC_STATS_BH(net, ip6_dst_idev(skb_dst(skb)), |
482 | IPSTATS_MIB_INHDRERRORS); | 482 | IPSTATS_MIB_INHDRERRORS); |
483 | icmpv6_send(skb, ICMPV6_TIME_EXCEED, ICMPV6_EXC_HOPLIMIT, | 483 | icmpv6_send(skb, ICMPV6_TIME_EXCEED, ICMPV6_EXC_HOPLIMIT, |
484 | 0, skb->dev); | 484 | 0, skb->dev); |
@@ -494,7 +494,7 @@ looped_back: | |||
494 | return -1; | 494 | return -1; |
495 | 495 | ||
496 | unknown_rh: | 496 | unknown_rh: |
497 | IP6_INC_STATS_BH(net, ip6_dst_idev(skb->dst), IPSTATS_MIB_INHDRERRORS); | 497 | IP6_INC_STATS_BH(net, ip6_dst_idev(skb_dst(skb)), IPSTATS_MIB_INHDRERRORS); |
498 | icmpv6_param_prob(skb, ICMPV6_HDR_FIELD, | 498 | icmpv6_param_prob(skb, ICMPV6_HDR_FIELD, |
499 | (&hdr->type) - skb_network_header(skb)); | 499 | (&hdr->type) - skb_network_header(skb)); |
500 | return -1; | 500 | return -1; |
@@ -552,11 +552,11 @@ void ipv6_exthdrs_exit(void) | |||
552 | **********************************/ | 552 | **********************************/ |
553 | 553 | ||
554 | /* | 554 | /* |
555 | * Note: we cannot rely on skb->dst before we assign it in ip6_route_input(). | 555 | * Note: we cannot rely on skb_dst(skb) before we assign it in ip6_route_input(). |
556 | */ | 556 | */ |
557 | static inline struct inet6_dev *ipv6_skb_idev(struct sk_buff *skb) | 557 | static inline struct inet6_dev *ipv6_skb_idev(struct sk_buff *skb) |
558 | { | 558 | { |
559 | return skb->dst ? ip6_dst_idev(skb->dst) : __in6_dev_get(skb->dev); | 559 | return skb_dst(skb) ? ip6_dst_idev(skb_dst(skb)) : __in6_dev_get(skb->dev); |
560 | } | 560 | } |
561 | 561 | ||
562 | /* Router Alert as of RFC 2711 */ | 562 | /* Router Alert as of RFC 2711 */ |
@@ -581,7 +581,7 @@ static int ipv6_hop_jumbo(struct sk_buff *skb, int optoff) | |||
581 | { | 581 | { |
582 | const unsigned char *nh = skb_network_header(skb); | 582 | const unsigned char *nh = skb_network_header(skb); |
583 | u32 pkt_len; | 583 | u32 pkt_len; |
584 | struct net *net = dev_net(skb->dst->dev); | 584 | struct net *net = dev_net(skb_dst(skb)->dev); |
585 | 585 | ||
586 | if (nh[optoff + 1] != 4 || (optoff & 3) != 2) { | 586 | if (nh[optoff + 1] != 4 || (optoff & 3) != 2) { |
587 | LIMIT_NETDEBUG(KERN_DEBUG "ipv6_hop_jumbo: wrong jumbo opt length/alignment %d\n", | 587 | LIMIT_NETDEBUG(KERN_DEBUG "ipv6_hop_jumbo: wrong jumbo opt length/alignment %d\n", |
diff --git a/net/ipv6/inet6_connection_sock.c b/net/ipv6/inet6_connection_sock.c index 3c3732d50c1..cc4797dd832 100644 --- a/net/ipv6/inet6_connection_sock.c +++ b/net/ipv6/inet6_connection_sock.c | |||
@@ -228,7 +228,7 @@ int inet6_csk_xmit(struct sk_buff *skb, int ipfragok) | |||
228 | __inet6_csk_dst_store(sk, dst, NULL, NULL); | 228 | __inet6_csk_dst_store(sk, dst, NULL, NULL); |
229 | } | 229 | } |
230 | 230 | ||
231 | skb->dst = dst_clone(dst); | 231 | skb_dst_set(skb, dst_clone(dst)); |
232 | 232 | ||
233 | /* Restore final destination back after routing done */ | 233 | /* Restore final destination back after routing done */ |
234 | ipv6_addr_copy(&fl.fl6_dst, &np->daddr); | 234 | ipv6_addr_copy(&fl.fl6_dst, &np->daddr); |
diff --git a/net/ipv6/ip6_input.c b/net/ipv6/ip6_input.c index bc1a920c34a..c3a07d75b5f 100644 --- a/net/ipv6/ip6_input.c +++ b/net/ipv6/ip6_input.c | |||
@@ -48,7 +48,7 @@ | |||
48 | 48 | ||
49 | inline int ip6_rcv_finish( struct sk_buff *skb) | 49 | inline int ip6_rcv_finish( struct sk_buff *skb) |
50 | { | 50 | { |
51 | if (skb->dst == NULL) | 51 | if (skb_dst(skb) == NULL) |
52 | ip6_route_input(skb); | 52 | ip6_route_input(skb); |
53 | 53 | ||
54 | return dst_input(skb); | 54 | return dst_input(skb); |
@@ -91,7 +91,7 @@ int ipv6_rcv(struct sk_buff *skb, struct net_device *dev, struct packet_type *pt | |||
91 | * arrived via the sending interface (ethX), because of the | 91 | * arrived via the sending interface (ethX), because of the |
92 | * nature of scoping architecture. --yoshfuji | 92 | * nature of scoping architecture. --yoshfuji |
93 | */ | 93 | */ |
94 | IP6CB(skb)->iif = skb->dst ? ip6_dst_idev(skb->dst)->dev->ifindex : dev->ifindex; | 94 | IP6CB(skb)->iif = skb_dst(skb) ? ip6_dst_idev(skb_dst(skb))->dev->ifindex : dev->ifindex; |
95 | 95 | ||
96 | if (unlikely(!pskb_may_pull(skb, sizeof(*hdr)))) | 96 | if (unlikely(!pskb_may_pull(skb, sizeof(*hdr)))) |
97 | goto err; | 97 | goto err; |
@@ -161,7 +161,7 @@ static int ip6_input_finish(struct sk_buff *skb) | |||
161 | int nexthdr, raw; | 161 | int nexthdr, raw; |
162 | u8 hash; | 162 | u8 hash; |
163 | struct inet6_dev *idev; | 163 | struct inet6_dev *idev; |
164 | struct net *net = dev_net(skb->dst->dev); | 164 | struct net *net = dev_net(skb_dst(skb)->dev); |
165 | 165 | ||
166 | /* | 166 | /* |
167 | * Parse extension headers | 167 | * Parse extension headers |
@@ -169,7 +169,7 @@ static int ip6_input_finish(struct sk_buff *skb) | |||
169 | 169 | ||
170 | rcu_read_lock(); | 170 | rcu_read_lock(); |
171 | resubmit: | 171 | resubmit: |
172 | idev = ip6_dst_idev(skb->dst); | 172 | idev = ip6_dst_idev(skb_dst(skb)); |
173 | if (!pskb_pull(skb, skb_transport_offset(skb))) | 173 | if (!pskb_pull(skb, skb_transport_offset(skb))) |
174 | goto discard; | 174 | goto discard; |
175 | nhoff = IP6CB(skb)->nhoff; | 175 | nhoff = IP6CB(skb)->nhoff; |
@@ -242,8 +242,8 @@ int ip6_mc_input(struct sk_buff *skb) | |||
242 | struct ipv6hdr *hdr; | 242 | struct ipv6hdr *hdr; |
243 | int deliver; | 243 | int deliver; |
244 | 244 | ||
245 | IP6_UPD_PO_STATS_BH(dev_net(skb->dst->dev), | 245 | IP6_UPD_PO_STATS_BH(dev_net(skb_dst(skb)->dev), |
246 | ip6_dst_idev(skb->dst), IPSTATS_MIB_INMCAST, | 246 | ip6_dst_idev(skb_dst(skb)), IPSTATS_MIB_INMCAST, |
247 | skb->len); | 247 | skb->len); |
248 | 248 | ||
249 | hdr = ipv6_hdr(skb); | 249 | hdr = ipv6_hdr(skb); |
diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c index 735a2bf4b5f..c8dc8e5a822 100644 --- a/net/ipv6/ip6_output.c +++ b/net/ipv6/ip6_output.c | |||
@@ -78,7 +78,7 @@ int __ip6_local_out(struct sk_buff *skb) | |||
78 | len = 0; | 78 | len = 0; |
79 | ipv6_hdr(skb)->payload_len = htons(len); | 79 | ipv6_hdr(skb)->payload_len = htons(len); |
80 | 80 | ||
81 | return nf_hook(PF_INET6, NF_INET_LOCAL_OUT, skb, NULL, skb->dst->dev, | 81 | return nf_hook(PF_INET6, NF_INET_LOCAL_OUT, skb, NULL, skb_dst(skb)->dev, |
82 | dst_output); | 82 | dst_output); |
83 | } | 83 | } |
84 | 84 | ||
@@ -96,7 +96,7 @@ EXPORT_SYMBOL_GPL(ip6_local_out); | |||
96 | 96 | ||
97 | static int ip6_output_finish(struct sk_buff *skb) | 97 | static int ip6_output_finish(struct sk_buff *skb) |
98 | { | 98 | { |
99 | struct dst_entry *dst = skb->dst; | 99 | struct dst_entry *dst = skb_dst(skb); |
100 | 100 | ||
101 | if (dst->hh) | 101 | if (dst->hh) |
102 | return neigh_hh_output(dst->hh, skb); | 102 | return neigh_hh_output(dst->hh, skb); |
@@ -117,7 +117,7 @@ static int ip6_dev_loopback_xmit(struct sk_buff *newskb) | |||
117 | __skb_pull(newskb, skb_network_offset(newskb)); | 117 | __skb_pull(newskb, skb_network_offset(newskb)); |
118 | newskb->pkt_type = PACKET_LOOPBACK; | 118 | newskb->pkt_type = PACKET_LOOPBACK; |
119 | newskb->ip_summed = CHECKSUM_UNNECESSARY; | 119 | newskb->ip_summed = CHECKSUM_UNNECESSARY; |
120 | WARN_ON(!newskb->dst); | 120 | WARN_ON(!skb_dst(newskb)); |
121 | 121 | ||
122 | netif_rx(newskb); | 122 | netif_rx(newskb); |
123 | return 0; | 123 | return 0; |
@@ -126,7 +126,7 @@ static int ip6_dev_loopback_xmit(struct sk_buff *newskb) | |||
126 | 126 | ||
127 | static int ip6_output2(struct sk_buff *skb) | 127 | static int ip6_output2(struct sk_buff *skb) |
128 | { | 128 | { |
129 | struct dst_entry *dst = skb->dst; | 129 | struct dst_entry *dst = skb_dst(skb); |
130 | struct net_device *dev = dst->dev; | 130 | struct net_device *dev = dst->dev; |
131 | 131 | ||
132 | skb->protocol = htons(ETH_P_IPV6); | 132 | skb->protocol = htons(ETH_P_IPV6); |
@@ -134,7 +134,7 @@ static int ip6_output2(struct sk_buff *skb) | |||
134 | 134 | ||
135 | if (ipv6_addr_is_multicast(&ipv6_hdr(skb)->daddr)) { | 135 | if (ipv6_addr_is_multicast(&ipv6_hdr(skb)->daddr)) { |
136 | struct ipv6_pinfo* np = skb->sk ? inet6_sk(skb->sk) : NULL; | 136 | struct ipv6_pinfo* np = skb->sk ? inet6_sk(skb->sk) : NULL; |
137 | struct inet6_dev *idev = ip6_dst_idev(skb->dst); | 137 | struct inet6_dev *idev = ip6_dst_idev(skb_dst(skb)); |
138 | 138 | ||
139 | if (!(dev->flags & IFF_LOOPBACK) && (!np || np->mc_loop) && | 139 | if (!(dev->flags & IFF_LOOPBACK) && (!np || np->mc_loop) && |
140 | ((mroute6_socket(dev_net(dev)) && | 140 | ((mroute6_socket(dev_net(dev)) && |
@@ -172,21 +172,21 @@ static inline int ip6_skb_dst_mtu(struct sk_buff *skb) | |||
172 | struct ipv6_pinfo *np = skb->sk ? inet6_sk(skb->sk) : NULL; | 172 | struct ipv6_pinfo *np = skb->sk ? inet6_sk(skb->sk) : NULL; |
173 | 173 | ||
174 | return (np && np->pmtudisc == IPV6_PMTUDISC_PROBE) ? | 174 | return (np && np->pmtudisc == IPV6_PMTUDISC_PROBE) ? |
175 | skb->dst->dev->mtu : dst_mtu(skb->dst); | 175 | skb_dst(skb)->dev->mtu : dst_mtu(skb_dst(skb)); |
176 | } | 176 | } |
177 | 177 | ||
178 | int ip6_output(struct sk_buff *skb) | 178 | int ip6_output(struct sk_buff *skb) |
179 | { | 179 | { |
180 | struct inet6_dev *idev = ip6_dst_idev(skb->dst); | 180 | struct inet6_dev *idev = ip6_dst_idev(skb_dst(skb)); |
181 | if (unlikely(idev->cnf.disable_ipv6)) { | 181 | if (unlikely(idev->cnf.disable_ipv6)) { |
182 | IP6_INC_STATS(dev_net(skb->dst->dev), idev, | 182 | IP6_INC_STATS(dev_net(skb_dst(skb)->dev), idev, |
183 | IPSTATS_MIB_OUTDISCARDS); | 183 | IPSTATS_MIB_OUTDISCARDS); |
184 | kfree_skb(skb); | 184 | kfree_skb(skb); |
185 | return 0; | 185 | return 0; |
186 | } | 186 | } |
187 | 187 | ||
188 | if ((skb->len > ip6_skb_dst_mtu(skb) && !skb_is_gso(skb)) || | 188 | if ((skb->len > ip6_skb_dst_mtu(skb) && !skb_is_gso(skb)) || |
189 | dst_allfrag(skb->dst)) | 189 | dst_allfrag(skb_dst(skb))) |
190 | return ip6_fragment(skb, ip6_output2); | 190 | return ip6_fragment(skb, ip6_output2); |
191 | else | 191 | else |
192 | return ip6_output2(skb); | 192 | return ip6_output2(skb); |
@@ -202,7 +202,7 @@ int ip6_xmit(struct sock *sk, struct sk_buff *skb, struct flowi *fl, | |||
202 | struct net *net = sock_net(sk); | 202 | struct net *net = sock_net(sk); |
203 | struct ipv6_pinfo *np = inet6_sk(sk); | 203 | struct ipv6_pinfo *np = inet6_sk(sk); |
204 | struct in6_addr *first_hop = &fl->fl6_dst; | 204 | struct in6_addr *first_hop = &fl->fl6_dst; |
205 | struct dst_entry *dst = skb->dst; | 205 | struct dst_entry *dst = skb_dst(skb); |
206 | struct ipv6hdr *hdr; | 206 | struct ipv6hdr *hdr; |
207 | u8 proto = fl->proto; | 207 | u8 proto = fl->proto; |
208 | int seg_len = skb->len; | 208 | int seg_len = skb->len; |
@@ -222,7 +222,7 @@ int ip6_xmit(struct sock *sk, struct sk_buff *skb, struct flowi *fl, | |||
222 | if (skb_headroom(skb) < head_room) { | 222 | if (skb_headroom(skb) < head_room) { |
223 | struct sk_buff *skb2 = skb_realloc_headroom(skb, head_room); | 223 | struct sk_buff *skb2 = skb_realloc_headroom(skb, head_room); |
224 | if (skb2 == NULL) { | 224 | if (skb2 == NULL) { |
225 | IP6_INC_STATS(net, ip6_dst_idev(skb->dst), | 225 | IP6_INC_STATS(net, ip6_dst_idev(skb_dst(skb)), |
226 | IPSTATS_MIB_OUTDISCARDS); | 226 | IPSTATS_MIB_OUTDISCARDS); |
227 | kfree_skb(skb); | 227 | kfree_skb(skb); |
228 | return -ENOBUFS; | 228 | return -ENOBUFS; |
@@ -276,7 +276,7 @@ int ip6_xmit(struct sock *sk, struct sk_buff *skb, struct flowi *fl, | |||
276 | 276 | ||
277 | mtu = dst_mtu(dst); | 277 | mtu = dst_mtu(dst); |
278 | if ((skb->len <= mtu) || skb->local_df || skb_is_gso(skb)) { | 278 | if ((skb->len <= mtu) || skb->local_df || skb_is_gso(skb)) { |
279 | IP6_UPD_PO_STATS(net, ip6_dst_idev(skb->dst), | 279 | IP6_UPD_PO_STATS(net, ip6_dst_idev(skb_dst(skb)), |
280 | IPSTATS_MIB_OUT, skb->len); | 280 | IPSTATS_MIB_OUT, skb->len); |
281 | return NF_HOOK(PF_INET6, NF_INET_LOCAL_OUT, skb, NULL, dst->dev, | 281 | return NF_HOOK(PF_INET6, NF_INET_LOCAL_OUT, skb, NULL, dst->dev, |
282 | dst_output); | 282 | dst_output); |
@@ -286,7 +286,7 @@ int ip6_xmit(struct sock *sk, struct sk_buff *skb, struct flowi *fl, | |||
286 | printk(KERN_DEBUG "IPv6: sending pkt_too_big to self\n"); | 286 | printk(KERN_DEBUG "IPv6: sending pkt_too_big to self\n"); |
287 | skb->dev = dst->dev; | 287 | skb->dev = dst->dev; |
288 | icmpv6_send(skb, ICMPV6_PKT_TOOBIG, 0, mtu, skb->dev); | 288 | icmpv6_send(skb, ICMPV6_PKT_TOOBIG, 0, mtu, skb->dev); |
289 | IP6_INC_STATS(net, ip6_dst_idev(skb->dst), IPSTATS_MIB_FRAGFAILS); | 289 | IP6_INC_STATS(net, ip6_dst_idev(skb_dst(skb)), IPSTATS_MIB_FRAGFAILS); |
290 | kfree_skb(skb); | 290 | kfree_skb(skb); |
291 | return -EMSGSIZE; | 291 | return -EMSGSIZE; |
292 | } | 292 | } |
@@ -416,7 +416,7 @@ static inline int ip6_forward_finish(struct sk_buff *skb) | |||
416 | 416 | ||
417 | int ip6_forward(struct sk_buff *skb) | 417 | int ip6_forward(struct sk_buff *skb) |
418 | { | 418 | { |
419 | struct dst_entry *dst = skb->dst; | 419 | struct dst_entry *dst = skb_dst(skb); |
420 | struct ipv6hdr *hdr = ipv6_hdr(skb); | 420 | struct ipv6hdr *hdr = ipv6_hdr(skb); |
421 | struct inet6_skb_parm *opt = IP6CB(skb); | 421 | struct inet6_skb_parm *opt = IP6CB(skb); |
422 | struct net *net = dev_net(dst->dev); | 422 | struct net *net = dev_net(dst->dev); |
@@ -485,7 +485,7 @@ int ip6_forward(struct sk_buff *skb) | |||
485 | IP6_INC_STATS(net, ip6_dst_idev(dst), IPSTATS_MIB_INDISCARDS); | 485 | IP6_INC_STATS(net, ip6_dst_idev(dst), IPSTATS_MIB_INDISCARDS); |
486 | goto drop; | 486 | goto drop; |
487 | } | 487 | } |
488 | dst = skb->dst; | 488 | dst = skb_dst(skb); |
489 | 489 | ||
490 | /* IPv6 specs say nothing about it, but it is clear that we cannot | 490 | /* IPv6 specs say nothing about it, but it is clear that we cannot |
491 | send redirects to source routed frames. | 491 | send redirects to source routed frames. |
@@ -566,8 +566,8 @@ static void ip6_copy_metadata(struct sk_buff *to, struct sk_buff *from) | |||
566 | to->pkt_type = from->pkt_type; | 566 | to->pkt_type = from->pkt_type; |
567 | to->priority = from->priority; | 567 | to->priority = from->priority; |
568 | to->protocol = from->protocol; | 568 | to->protocol = from->protocol; |
569 | dst_release(to->dst); | 569 | skb_dst_drop(to); |
570 | to->dst = dst_clone(from->dst); | 570 | skb_dst_set(to, dst_clone(skb_dst(from))); |
571 | to->dev = from->dev; | 571 | to->dev = from->dev; |
572 | to->mark = from->mark; | 572 | to->mark = from->mark; |
573 | 573 | ||
@@ -624,7 +624,7 @@ int ip6_find_1stfragopt(struct sk_buff *skb, u8 **nexthdr) | |||
624 | static int ip6_fragment(struct sk_buff *skb, int (*output)(struct sk_buff *)) | 624 | static int ip6_fragment(struct sk_buff *skb, int (*output)(struct sk_buff *)) |
625 | { | 625 | { |
626 | struct sk_buff *frag; | 626 | struct sk_buff *frag; |
627 | struct rt6_info *rt = (struct rt6_info*)skb->dst; | 627 | struct rt6_info *rt = (struct rt6_info*)skb_dst(skb); |
628 | struct ipv6_pinfo *np = skb->sk ? inet6_sk(skb->sk) : NULL; | 628 | struct ipv6_pinfo *np = skb->sk ? inet6_sk(skb->sk) : NULL; |
629 | struct ipv6hdr *tmp_hdr; | 629 | struct ipv6hdr *tmp_hdr; |
630 | struct frag_hdr *fh; | 630 | struct frag_hdr *fh; |
@@ -632,7 +632,7 @@ static int ip6_fragment(struct sk_buff *skb, int (*output)(struct sk_buff *)) | |||
632 | __be32 frag_id = 0; | 632 | __be32 frag_id = 0; |
633 | int ptr, offset = 0, err=0; | 633 | int ptr, offset = 0, err=0; |
634 | u8 *prevhdr, nexthdr = 0; | 634 | u8 *prevhdr, nexthdr = 0; |
635 | struct net *net = dev_net(skb->dst->dev); | 635 | struct net *net = dev_net(skb_dst(skb)->dev); |
636 | 636 | ||
637 | hlen = ip6_find_1stfragopt(skb, &prevhdr); | 637 | hlen = ip6_find_1stfragopt(skb, &prevhdr); |
638 | nexthdr = *prevhdr; | 638 | nexthdr = *prevhdr; |
@@ -644,9 +644,9 @@ static int ip6_fragment(struct sk_buff *skb, int (*output)(struct sk_buff *)) | |||
644 | * check should be redundant, but it's free.) | 644 | * check should be redundant, but it's free.) |
645 | */ | 645 | */ |
646 | if (!skb->local_df) { | 646 | if (!skb->local_df) { |
647 | skb->dev = skb->dst->dev; | 647 | skb->dev = skb_dst(skb)->dev; |
648 | icmpv6_send(skb, ICMPV6_PKT_TOOBIG, 0, mtu, skb->dev); | 648 | icmpv6_send(skb, ICMPV6_PKT_TOOBIG, 0, mtu, skb->dev); |
649 | IP6_INC_STATS(net, ip6_dst_idev(skb->dst), | 649 | IP6_INC_STATS(net, ip6_dst_idev(skb_dst(skb)), |
650 | IPSTATS_MIB_FRAGFAILS); | 650 | IPSTATS_MIB_FRAGFAILS); |
651 | kfree_skb(skb); | 651 | kfree_skb(skb); |
652 | return -EMSGSIZE; | 652 | return -EMSGSIZE; |
@@ -696,7 +696,7 @@ static int ip6_fragment(struct sk_buff *skb, int (*output)(struct sk_buff *)) | |||
696 | *prevhdr = NEXTHDR_FRAGMENT; | 696 | *prevhdr = NEXTHDR_FRAGMENT; |
697 | tmp_hdr = kmemdup(skb_network_header(skb), hlen, GFP_ATOMIC); | 697 | tmp_hdr = kmemdup(skb_network_header(skb), hlen, GFP_ATOMIC); |
698 | if (!tmp_hdr) { | 698 | if (!tmp_hdr) { |
699 | IP6_INC_STATS(net, ip6_dst_idev(skb->dst), | 699 | IP6_INC_STATS(net, ip6_dst_idev(skb_dst(skb)), |
700 | IPSTATS_MIB_FRAGFAILS); | 700 | IPSTATS_MIB_FRAGFAILS); |
701 | return -ENOMEM; | 701 | return -ENOMEM; |
702 | } | 702 | } |
@@ -809,7 +809,7 @@ slow_path: | |||
809 | 809 | ||
810 | if ((frag = alloc_skb(len+hlen+sizeof(struct frag_hdr)+LL_ALLOCATED_SPACE(rt->u.dst.dev), GFP_ATOMIC)) == NULL) { | 810 | if ((frag = alloc_skb(len+hlen+sizeof(struct frag_hdr)+LL_ALLOCATED_SPACE(rt->u.dst.dev), GFP_ATOMIC)) == NULL) { |
811 | NETDEBUG(KERN_INFO "IPv6: frag: no memory for new fragment!\n"); | 811 | NETDEBUG(KERN_INFO "IPv6: frag: no memory for new fragment!\n"); |
812 | IP6_INC_STATS(net, ip6_dst_idev(skb->dst), | 812 | IP6_INC_STATS(net, ip6_dst_idev(skb_dst(skb)), |
813 | IPSTATS_MIB_FRAGFAILS); | 813 | IPSTATS_MIB_FRAGFAILS); |
814 | err = -ENOMEM; | 814 | err = -ENOMEM; |
815 | goto fail; | 815 | goto fail; |
@@ -873,16 +873,16 @@ slow_path: | |||
873 | if (err) | 873 | if (err) |
874 | goto fail; | 874 | goto fail; |
875 | 875 | ||
876 | IP6_INC_STATS(net, ip6_dst_idev(skb->dst), | 876 | IP6_INC_STATS(net, ip6_dst_idev(skb_dst(skb)), |
877 | IPSTATS_MIB_FRAGCREATES); | 877 | IPSTATS_MIB_FRAGCREATES); |
878 | } | 878 | } |
879 | IP6_INC_STATS(net, ip6_dst_idev(skb->dst), | 879 | IP6_INC_STATS(net, ip6_dst_idev(skb_dst(skb)), |
880 | IPSTATS_MIB_FRAGOKS); | 880 | IPSTATS_MIB_FRAGOKS); |
881 | kfree_skb(skb); | 881 | kfree_skb(skb); |
882 | return err; | 882 | return err; |
883 | 883 | ||
884 | fail: | 884 | fail: |
885 | IP6_INC_STATS(net, ip6_dst_idev(skb->dst), | 885 | IP6_INC_STATS(net, ip6_dst_idev(skb_dst(skb)), |
886 | IPSTATS_MIB_FRAGFAILS); | 886 | IPSTATS_MIB_FRAGFAILS); |
887 | kfree_skb(skb); | 887 | kfree_skb(skb); |
888 | return err; | 888 | return err; |
@@ -1516,10 +1516,10 @@ int ip6_push_pending_frames(struct sock *sk) | |||
1516 | skb->priority = sk->sk_priority; | 1516 | skb->priority = sk->sk_priority; |
1517 | skb->mark = sk->sk_mark; | 1517 | skb->mark = sk->sk_mark; |
1518 | 1518 | ||
1519 | skb->dst = dst_clone(&rt->u.dst); | 1519 | skb_dst_set(skb, dst_clone(&rt->u.dst)); |
1520 | IP6_UPD_PO_STATS(net, rt->rt6i_idev, IPSTATS_MIB_OUT, skb->len); | 1520 | IP6_UPD_PO_STATS(net, rt->rt6i_idev, IPSTATS_MIB_OUT, skb->len); |
1521 | if (proto == IPPROTO_ICMPV6) { | 1521 | if (proto == IPPROTO_ICMPV6) { |
1522 | struct inet6_dev *idev = ip6_dst_idev(skb->dst); | 1522 | struct inet6_dev *idev = ip6_dst_idev(skb_dst(skb)); |
1523 | 1523 | ||
1524 | ICMP6MSGOUT_INC_STATS_BH(net, idev, icmp6_hdr(skb)->icmp6_type); | 1524 | ICMP6MSGOUT_INC_STATS_BH(net, idev, icmp6_hdr(skb)->icmp6_type); |
1525 | ICMP6_INC_STATS_BH(net, idev, ICMP6_MIB_OUTMSGS); | 1525 | ICMP6_INC_STATS_BH(net, idev, ICMP6_MIB_OUTMSGS); |
@@ -1545,8 +1545,8 @@ void ip6_flush_pending_frames(struct sock *sk) | |||
1545 | struct sk_buff *skb; | 1545 | struct sk_buff *skb; |
1546 | 1546 | ||
1547 | while ((skb = __skb_dequeue_tail(&sk->sk_write_queue)) != NULL) { | 1547 | while ((skb = __skb_dequeue_tail(&sk->sk_write_queue)) != NULL) { |
1548 | if (skb->dst) | 1548 | if (skb_dst(skb)) |
1549 | IP6_INC_STATS(sock_net(sk), ip6_dst_idev(skb->dst), | 1549 | IP6_INC_STATS(sock_net(sk), ip6_dst_idev(skb_dst(skb)), |
1550 | IPSTATS_MIB_OUTDISCARDS); | 1550 | IPSTATS_MIB_OUTDISCARDS); |
1551 | kfree_skb(skb); | 1551 | kfree_skb(skb); |
1552 | } | 1552 | } |
diff --git a/net/ipv6/ip6_tunnel.c b/net/ipv6/ip6_tunnel.c index af256d47fd3..404d16a97d5 100644 --- a/net/ipv6/ip6_tunnel.c +++ b/net/ipv6/ip6_tunnel.c | |||
@@ -532,8 +532,8 @@ ip4ip6_err(struct sk_buff *skb, struct inet6_skb_parm *opt, | |||
532 | if (!skb2) | 532 | if (!skb2) |
533 | return 0; | 533 | return 0; |
534 | 534 | ||
535 | dst_release(skb2->dst); | 535 | skb_dst_drop(skb2); |
536 | skb2->dst = NULL; | 536 | |
537 | skb_pull(skb2, offset); | 537 | skb_pull(skb2, offset); |
538 | skb_reset_network_header(skb2); | 538 | skb_reset_network_header(skb2); |
539 | eiph = ip_hdr(skb2); | 539 | eiph = ip_hdr(skb2); |
@@ -560,21 +560,21 @@ ip4ip6_err(struct sk_buff *skb, struct inet6_skb_parm *opt, | |||
560 | ip_rt_put(rt); | 560 | ip_rt_put(rt); |
561 | goto out; | 561 | goto out; |
562 | } | 562 | } |
563 | skb2->dst = (struct dst_entry *)rt; | 563 | skb_dst_set(skb2, (struct dst_entry *)rt); |
564 | } else { | 564 | } else { |
565 | ip_rt_put(rt); | 565 | ip_rt_put(rt); |
566 | if (ip_route_input(skb2, eiph->daddr, eiph->saddr, eiph->tos, | 566 | if (ip_route_input(skb2, eiph->daddr, eiph->saddr, eiph->tos, |
567 | skb2->dev) || | 567 | skb2->dev) || |
568 | skb2->dst->dev->type != ARPHRD_TUNNEL) | 568 | skb_dst(skb2)->dev->type != ARPHRD_TUNNEL) |
569 | goto out; | 569 | goto out; |
570 | } | 570 | } |
571 | 571 | ||
572 | /* change mtu on this route */ | 572 | /* change mtu on this route */ |
573 | if (rel_type == ICMP_DEST_UNREACH && rel_code == ICMP_FRAG_NEEDED) { | 573 | if (rel_type == ICMP_DEST_UNREACH && rel_code == ICMP_FRAG_NEEDED) { |
574 | if (rel_info > dst_mtu(skb2->dst)) | 574 | if (rel_info > dst_mtu(skb_dst(skb2))) |
575 | goto out; | 575 | goto out; |
576 | 576 | ||
577 | skb2->dst->ops->update_pmtu(skb2->dst, rel_info); | 577 | skb_dst(skb2)->ops->update_pmtu(skb_dst(skb2), rel_info); |
578 | } | 578 | } |
579 | 579 | ||
580 | icmp_send(skb2, rel_type, rel_code, htonl(rel_info)); | 580 | icmp_send(skb2, rel_type, rel_code, htonl(rel_info)); |
@@ -606,8 +606,7 @@ ip6ip6_err(struct sk_buff *skb, struct inet6_skb_parm *opt, | |||
606 | if (!skb2) | 606 | if (!skb2) |
607 | return 0; | 607 | return 0; |
608 | 608 | ||
609 | dst_release(skb2->dst); | 609 | skb_dst_drop(skb2); |
610 | skb2->dst = NULL; | ||
611 | skb_pull(skb2, offset); | 610 | skb_pull(skb2, offset); |
612 | skb_reset_network_header(skb2); | 611 | skb_reset_network_header(skb2); |
613 | 612 | ||
@@ -720,8 +719,7 @@ static int ip6_tnl_rcv(struct sk_buff *skb, __u16 protocol, | |||
720 | skb->pkt_type = PACKET_HOST; | 719 | skb->pkt_type = PACKET_HOST; |
721 | memset(skb->cb, 0, sizeof(struct inet6_skb_parm)); | 720 | memset(skb->cb, 0, sizeof(struct inet6_skb_parm)); |
722 | skb->dev = t->dev; | 721 | skb->dev = t->dev; |
723 | dst_release(skb->dst); | 722 | skb_dst_drop(skb); |
724 | skb->dst = NULL; | ||
725 | nf_reset(skb); | 723 | nf_reset(skb); |
726 | 724 | ||
727 | dscp_ecn_decapsulate(t, ipv6h, skb); | 725 | dscp_ecn_decapsulate(t, ipv6h, skb); |
@@ -885,8 +883,8 @@ static int ip6_tnl_xmit2(struct sk_buff *skb, | |||
885 | } | 883 | } |
886 | if (mtu < IPV6_MIN_MTU) | 884 | if (mtu < IPV6_MIN_MTU) |
887 | mtu = IPV6_MIN_MTU; | 885 | mtu = IPV6_MIN_MTU; |
888 | if (skb->dst) | 886 | if (skb_dst(skb)) |
889 | skb->dst->ops->update_pmtu(skb->dst, mtu); | 887 | skb_dst(skb)->ops->update_pmtu(skb_dst(skb), mtu); |
890 | if (skb->len > mtu) { | 888 | if (skb->len > mtu) { |
891 | *pmtu = mtu; | 889 | *pmtu = mtu; |
892 | err = -EMSGSIZE; | 890 | err = -EMSGSIZE; |
@@ -910,8 +908,8 @@ static int ip6_tnl_xmit2(struct sk_buff *skb, | |||
910 | kfree_skb(skb); | 908 | kfree_skb(skb); |
911 | skb = new_skb; | 909 | skb = new_skb; |
912 | } | 910 | } |
913 | dst_release(skb->dst); | 911 | skb_dst_drop(skb); |
914 | skb->dst = dst_clone(dst); | 912 | skb_dst_set(skb, dst_clone(dst)); |
915 | 913 | ||
916 | skb->transport_header = skb->network_header; | 914 | skb->transport_header = skb->network_header; |
917 | 915 | ||
diff --git a/net/ipv6/ip6mr.c b/net/ipv6/ip6mr.c index 228be551e9c..a35d8fc55b0 100644 --- a/net/ipv6/ip6mr.c +++ b/net/ipv6/ip6mr.c | |||
@@ -398,10 +398,9 @@ static int pim6_rcv(struct sk_buff *skb) | |||
398 | skb->protocol = htons(ETH_P_IPV6); | 398 | skb->protocol = htons(ETH_P_IPV6); |
399 | skb->ip_summed = 0; | 399 | skb->ip_summed = 0; |
400 | skb->pkt_type = PACKET_HOST; | 400 | skb->pkt_type = PACKET_HOST; |
401 | dst_release(skb->dst); | 401 | skb_dst_drop(skb); |
402 | reg_dev->stats.rx_bytes += skb->len; | 402 | reg_dev->stats.rx_bytes += skb->len; |
403 | reg_dev->stats.rx_packets++; | 403 | reg_dev->stats.rx_packets++; |
404 | skb->dst = NULL; | ||
405 | nf_reset(skb); | 404 | nf_reset(skb); |
406 | netif_rx(skb); | 405 | netif_rx(skb); |
407 | dev_put(reg_dev); | 406 | dev_put(reg_dev); |
@@ -849,7 +848,7 @@ static int ip6mr_cache_report(struct net *net, struct sk_buff *pkt, mifi_t mifi, | |||
849 | ipv6_addr_copy(&msg->im6_src, &ipv6_hdr(pkt)->saddr); | 848 | ipv6_addr_copy(&msg->im6_src, &ipv6_hdr(pkt)->saddr); |
850 | ipv6_addr_copy(&msg->im6_dst, &ipv6_hdr(pkt)->daddr); | 849 | ipv6_addr_copy(&msg->im6_dst, &ipv6_hdr(pkt)->daddr); |
851 | 850 | ||
852 | skb->dst = dst_clone(pkt->dst); | 851 | skb_dst_set(skb, dst_clone(skb_dst(pkt))); |
853 | skb->ip_summed = CHECKSUM_UNNECESSARY; | 852 | skb->ip_summed = CHECKSUM_UNNECESSARY; |
854 | } | 853 | } |
855 | 854 | ||
@@ -1487,7 +1486,7 @@ int ip6mr_ioctl(struct sock *sk, int cmd, void __user *arg) | |||
1487 | 1486 | ||
1488 | static inline int ip6mr_forward2_finish(struct sk_buff *skb) | 1487 | static inline int ip6mr_forward2_finish(struct sk_buff *skb) |
1489 | { | 1488 | { |
1490 | IP6_INC_STATS_BH(dev_net(skb->dst->dev), ip6_dst_idev(skb->dst), | 1489 | IP6_INC_STATS_BH(dev_net(skb_dst(skb)->dev), ip6_dst_idev(skb_dst(skb)), |
1491 | IPSTATS_MIB_OUTFORWDATAGRAMS); | 1490 | IPSTATS_MIB_OUTFORWDATAGRAMS); |
1492 | return dst_output(skb); | 1491 | return dst_output(skb); |
1493 | } | 1492 | } |
@@ -1532,8 +1531,8 @@ static int ip6mr_forward2(struct sk_buff *skb, struct mfc6_cache *c, int vifi) | |||
1532 | if (!dst) | 1531 | if (!dst) |
1533 | goto out_free; | 1532 | goto out_free; |
1534 | 1533 | ||
1535 | dst_release(skb->dst); | 1534 | skb_dst_drop(skb); |
1536 | skb->dst = dst; | 1535 | skb_dst_set(skb, dst); |
1537 | 1536 | ||
1538 | /* | 1537 | /* |
1539 | * RFC1584 teaches, that DVMRP/PIM router must deliver packets locally | 1538 | * RFC1584 teaches, that DVMRP/PIM router must deliver packets locally |
@@ -1722,7 +1721,7 @@ int ip6mr_get_route(struct net *net, | |||
1722 | { | 1721 | { |
1723 | int err; | 1722 | int err; |
1724 | struct mfc6_cache *cache; | 1723 | struct mfc6_cache *cache; |
1725 | struct rt6_info *rt = (struct rt6_info *)skb->dst; | 1724 | struct rt6_info *rt = (struct rt6_info *)skb_dst(skb); |
1726 | 1725 | ||
1727 | read_lock(&mrt_lock); | 1726 | read_lock(&mrt_lock); |
1728 | cache = ip6mr_cache_find(net, &rt->rt6i_src.addr, &rt->rt6i_dst.addr); | 1727 | cache = ip6mr_cache_find(net, &rt->rt6i_src.addr, &rt->rt6i_dst.addr); |
diff --git a/net/ipv6/mcast.c b/net/ipv6/mcast.c index 4b48819a5b8..4b264ed40a8 100644 --- a/net/ipv6/mcast.c +++ b/net/ipv6/mcast.c | |||
@@ -1448,6 +1448,7 @@ static void mld_sendpack(struct sk_buff *skb) | |||
1448 | struct net *net = dev_net(skb->dev); | 1448 | struct net *net = dev_net(skb->dev); |
1449 | int err; | 1449 | int err; |
1450 | struct flowi fl; | 1450 | struct flowi fl; |
1451 | struct dst_entry *dst; | ||
1451 | 1452 | ||
1452 | IP6_UPD_PO_STATS(net, idev, IPSTATS_MIB_OUT, skb->len); | 1453 | IP6_UPD_PO_STATS(net, idev, IPSTATS_MIB_OUT, skb->len); |
1453 | 1454 | ||
@@ -1459,9 +1460,9 @@ static void mld_sendpack(struct sk_buff *skb) | |||
1459 | IPPROTO_ICMPV6, csum_partial(skb_transport_header(skb), | 1460 | IPPROTO_ICMPV6, csum_partial(skb_transport_header(skb), |
1460 | mldlen, 0)); | 1461 | mldlen, 0)); |
1461 | 1462 | ||
1462 | skb->dst = icmp6_dst_alloc(skb->dev, NULL, &ipv6_hdr(skb)->daddr); | 1463 | dst = icmp6_dst_alloc(skb->dev, NULL, &ipv6_hdr(skb)->daddr); |
1463 | 1464 | ||
1464 | if (!skb->dst) { | 1465 | if (!dst) { |
1465 | err = -ENOMEM; | 1466 | err = -ENOMEM; |
1466 | goto err_out; | 1467 | goto err_out; |
1467 | } | 1468 | } |
@@ -1470,7 +1471,8 @@ static void mld_sendpack(struct sk_buff *skb) | |||
1470 | &ipv6_hdr(skb)->saddr, &ipv6_hdr(skb)->daddr, | 1471 | &ipv6_hdr(skb)->saddr, &ipv6_hdr(skb)->daddr, |
1471 | skb->dev->ifindex); | 1472 | skb->dev->ifindex); |
1472 | 1473 | ||
1473 | err = xfrm_lookup(net, &skb->dst, &fl, NULL, 0); | 1474 | err = xfrm_lookup(net, &dst, &fl, NULL, 0); |
1475 | skb_dst_set(skb, dst); | ||
1474 | if (err) | 1476 | if (err) |
1475 | goto err_out; | 1477 | goto err_out; |
1476 | 1478 | ||
@@ -1775,6 +1777,7 @@ static void igmp6_send(struct in6_addr *addr, struct net_device *dev, int type) | |||
1775 | IPV6_TLV_ROUTERALERT, 2, 0, 0, | 1777 | IPV6_TLV_ROUTERALERT, 2, 0, 0, |
1776 | IPV6_TLV_PADN, 0 }; | 1778 | IPV6_TLV_PADN, 0 }; |
1777 | struct flowi fl; | 1779 | struct flowi fl; |
1780 | struct dst_entry *dst; | ||
1778 | 1781 | ||
1779 | if (type == ICMPV6_MGM_REDUCTION) | 1782 | if (type == ICMPV6_MGM_REDUCTION) |
1780 | snd_addr = &in6addr_linklocal_allrouters; | 1783 | snd_addr = &in6addr_linklocal_allrouters; |
@@ -1828,8 +1831,8 @@ static void igmp6_send(struct in6_addr *addr, struct net_device *dev, int type) | |||
1828 | 1831 | ||
1829 | idev = in6_dev_get(skb->dev); | 1832 | idev = in6_dev_get(skb->dev); |
1830 | 1833 | ||
1831 | skb->dst = icmp6_dst_alloc(skb->dev, NULL, &ipv6_hdr(skb)->daddr); | 1834 | dst = icmp6_dst_alloc(skb->dev, NULL, &ipv6_hdr(skb)->daddr); |
1832 | if (!skb->dst) { | 1835 | if (!dst) { |
1833 | err = -ENOMEM; | 1836 | err = -ENOMEM; |
1834 | goto err_out; | 1837 | goto err_out; |
1835 | } | 1838 | } |
@@ -1838,11 +1841,11 @@ static void igmp6_send(struct in6_addr *addr, struct net_device *dev, int type) | |||
1838 | &ipv6_hdr(skb)->saddr, &ipv6_hdr(skb)->daddr, | 1841 | &ipv6_hdr(skb)->saddr, &ipv6_hdr(skb)->daddr, |
1839 | skb->dev->ifindex); | 1842 | skb->dev->ifindex); |
1840 | 1843 | ||
1841 | err = xfrm_lookup(net, &skb->dst, &fl, NULL, 0); | 1844 | err = xfrm_lookup(net, &dst, &fl, NULL, 0); |
1842 | if (err) | 1845 | if (err) |
1843 | goto err_out; | 1846 | goto err_out; |
1844 | 1847 | ||
1845 | 1848 | skb_dst_set(skb, dst); | |
1846 | err = NF_HOOK(PF_INET6, NF_INET_LOCAL_OUT, skb, NULL, skb->dev, | 1849 | err = NF_HOOK(PF_INET6, NF_INET_LOCAL_OUT, skb, NULL, skb->dev, |
1847 | dst_output); | 1850 | dst_output); |
1848 | out: | 1851 | out: |
diff --git a/net/ipv6/ndisc.c b/net/ipv6/ndisc.c index 1d13d996498..9eb68e92cc1 100644 --- a/net/ipv6/ndisc.c +++ b/net/ipv6/ndisc.c | |||
@@ -530,7 +530,7 @@ void ndisc_send_skb(struct sk_buff *skb, | |||
530 | return; | 530 | return; |
531 | } | 531 | } |
532 | 532 | ||
533 | skb->dst = dst; | 533 | skb_dst_set(skb, dst); |
534 | 534 | ||
535 | idev = in6_dev_get(dst->dev); | 535 | idev = in6_dev_get(dst->dev); |
536 | IP6_UPD_PO_STATS(net, idev, IPSTATS_MIB_OUT, skb->len); | 536 | IP6_UPD_PO_STATS(net, idev, IPSTATS_MIB_OUT, skb->len); |
@@ -1612,7 +1612,7 @@ void ndisc_send_redirect(struct sk_buff *skb, struct neighbour *neigh, | |||
1612 | len, IPPROTO_ICMPV6, | 1612 | len, IPPROTO_ICMPV6, |
1613 | csum_partial(icmph, len, 0)); | 1613 | csum_partial(icmph, len, 0)); |
1614 | 1614 | ||
1615 | buff->dst = dst; | 1615 | skb_dst_set(buff, dst); |
1616 | idev = in6_dev_get(dst->dev); | 1616 | idev = in6_dev_get(dst->dev); |
1617 | IP6_UPD_PO_STATS(net, idev, IPSTATS_MIB_OUT, skb->len); | 1617 | IP6_UPD_PO_STATS(net, idev, IPSTATS_MIB_OUT, skb->len); |
1618 | err = NF_HOOK(PF_INET6, NF_INET_LOCAL_OUT, buff, NULL, dst->dev, | 1618 | err = NF_HOOK(PF_INET6, NF_INET_LOCAL_OUT, buff, NULL, dst->dev, |
diff --git a/net/ipv6/netfilter.c b/net/ipv6/netfilter.c index 834cea69fb5..d5ed92b1434 100644 --- a/net/ipv6/netfilter.c +++ b/net/ipv6/netfilter.c | |||
@@ -12,7 +12,7 @@ | |||
12 | 12 | ||
13 | int ip6_route_me_harder(struct sk_buff *skb) | 13 | int ip6_route_me_harder(struct sk_buff *skb) |
14 | { | 14 | { |
15 | struct net *net = dev_net(skb->dst->dev); | 15 | struct net *net = dev_net(skb_dst(skb)->dev); |
16 | struct ipv6hdr *iph = ipv6_hdr(skb); | 16 | struct ipv6hdr *iph = ipv6_hdr(skb); |
17 | struct dst_entry *dst; | 17 | struct dst_entry *dst; |
18 | struct flowi fl = { | 18 | struct flowi fl = { |
@@ -28,9 +28,15 @@ int ip6_route_me_harder(struct sk_buff *skb) | |||
28 | 28 | ||
29 | #ifdef CONFIG_XFRM | 29 | #ifdef CONFIG_XFRM |
30 | if (!(IP6CB(skb)->flags & IP6SKB_XFRM_TRANSFORMED) && | 30 | if (!(IP6CB(skb)->flags & IP6SKB_XFRM_TRANSFORMED) && |
31 | xfrm_decode_session(skb, &fl, AF_INET6) == 0) | 31 | xfrm_decode_session(skb, &fl, AF_INET6) == 0) { |
32 | if (xfrm_lookup(net, &skb->dst, &fl, skb->sk, 0)) | 32 | struct dst_entry *dst2 = skb_dst(skb); |
33 | |||
34 | if (xfrm_lookup(net, &dst2, &fl, skb->sk, 0)) { | ||
35 | skb_dst_set(skb, NULL); | ||
33 | return -1; | 36 | return -1; |
37 | } | ||
38 | skb_dst_set(skb, dst2); | ||
39 | } | ||
34 | #endif | 40 | #endif |
35 | 41 | ||
36 | if (dst->error) { | 42 | if (dst->error) { |
@@ -41,9 +47,9 @@ int ip6_route_me_harder(struct sk_buff *skb) | |||
41 | } | 47 | } |
42 | 48 | ||
43 | /* Drop old route. */ | 49 | /* Drop old route. */ |
44 | dst_release(skb->dst); | 50 | skb_dst_drop(skb); |
45 | 51 | ||
46 | skb->dst = dst; | 52 | skb_dst_set(skb, dst); |
47 | return 0; | 53 | return 0; |
48 | } | 54 | } |
49 | EXPORT_SYMBOL(ip6_route_me_harder); | 55 | EXPORT_SYMBOL(ip6_route_me_harder); |
diff --git a/net/ipv6/netfilter/ip6t_REJECT.c b/net/ipv6/netfilter/ip6t_REJECT.c index 5a2d0a41694..5a7f00cd15c 100644 --- a/net/ipv6/netfilter/ip6t_REJECT.c +++ b/net/ipv6/netfilter/ip6t_REJECT.c | |||
@@ -112,7 +112,7 @@ static void send_reset(struct net *net, struct sk_buff *oldskb) | |||
112 | return; | 112 | return; |
113 | } | 113 | } |
114 | 114 | ||
115 | nskb->dst = dst; | 115 | skb_dst_set(nskb, dst); |
116 | 116 | ||
117 | skb_reserve(nskb, hh_len + dst->header_len); | 117 | skb_reserve(nskb, hh_len + dst->header_len); |
118 | 118 | ||
diff --git a/net/ipv6/raw.c b/net/ipv6/raw.c index e99307fba0b..36a090d87a3 100644 --- a/net/ipv6/raw.c +++ b/net/ipv6/raw.c | |||
@@ -625,7 +625,7 @@ static int rawv6_send_hdrinc(struct sock *sk, void *from, int length, | |||
625 | 625 | ||
626 | skb->priority = sk->sk_priority; | 626 | skb->priority = sk->sk_priority; |
627 | skb->mark = sk->sk_mark; | 627 | skb->mark = sk->sk_mark; |
628 | skb->dst = dst_clone(&rt->u.dst); | 628 | skb_dst_set(skb, dst_clone(&rt->u.dst)); |
629 | 629 | ||
630 | skb_put(skb, length); | 630 | skb_put(skb, length); |
631 | skb_reset_network_header(skb); | 631 | skb_reset_network_header(skb); |
diff --git a/net/ipv6/reassembly.c b/net/ipv6/reassembly.c index e9ac7a12f59..54a387d31e1 100644 --- a/net/ipv6/reassembly.c +++ b/net/ipv6/reassembly.c | |||
@@ -267,7 +267,7 @@ static int ip6_frag_queue(struct frag_queue *fq, struct sk_buff *skb, | |||
267 | struct sk_buff *prev, *next; | 267 | struct sk_buff *prev, *next; |
268 | struct net_device *dev; | 268 | struct net_device *dev; |
269 | int offset, end; | 269 | int offset, end; |
270 | struct net *net = dev_net(skb->dst->dev); | 270 | struct net *net = dev_net(skb_dst(skb)->dev); |
271 | 271 | ||
272 | if (fq->q.last_in & INET_FRAG_COMPLETE) | 272 | if (fq->q.last_in & INET_FRAG_COMPLETE) |
273 | goto err; | 273 | goto err; |
@@ -277,7 +277,7 @@ static int ip6_frag_queue(struct frag_queue *fq, struct sk_buff *skb, | |||
277 | ((u8 *)(fhdr + 1) - (u8 *)(ipv6_hdr(skb) + 1))); | 277 | ((u8 *)(fhdr + 1) - (u8 *)(ipv6_hdr(skb) + 1))); |
278 | 278 | ||
279 | if ((unsigned int)end > IPV6_MAXPLEN) { | 279 | if ((unsigned int)end > IPV6_MAXPLEN) { |
280 | IP6_INC_STATS_BH(net, ip6_dst_idev(skb->dst), | 280 | IP6_INC_STATS_BH(net, ip6_dst_idev(skb_dst(skb)), |
281 | IPSTATS_MIB_INHDRERRORS); | 281 | IPSTATS_MIB_INHDRERRORS); |
282 | icmpv6_param_prob(skb, ICMPV6_HDR_FIELD, | 282 | icmpv6_param_prob(skb, ICMPV6_HDR_FIELD, |
283 | ((u8 *)&fhdr->frag_off - | 283 | ((u8 *)&fhdr->frag_off - |
@@ -310,7 +310,7 @@ static int ip6_frag_queue(struct frag_queue *fq, struct sk_buff *skb, | |||
310 | /* RFC2460 says always send parameter problem in | 310 | /* RFC2460 says always send parameter problem in |
311 | * this case. -DaveM | 311 | * this case. -DaveM |
312 | */ | 312 | */ |
313 | IP6_INC_STATS_BH(net, ip6_dst_idev(skb->dst), | 313 | IP6_INC_STATS_BH(net, ip6_dst_idev(skb_dst(skb)), |
314 | IPSTATS_MIB_INHDRERRORS); | 314 | IPSTATS_MIB_INHDRERRORS); |
315 | icmpv6_param_prob(skb, ICMPV6_HDR_FIELD, | 315 | icmpv6_param_prob(skb, ICMPV6_HDR_FIELD, |
316 | offsetof(struct ipv6hdr, payload_len)); | 316 | offsetof(struct ipv6hdr, payload_len)); |
@@ -434,7 +434,7 @@ static int ip6_frag_queue(struct frag_queue *fq, struct sk_buff *skb, | |||
434 | return -1; | 434 | return -1; |
435 | 435 | ||
436 | err: | 436 | err: |
437 | IP6_INC_STATS(net, ip6_dst_idev(skb->dst), | 437 | IP6_INC_STATS(net, ip6_dst_idev(skb_dst(skb)), |
438 | IPSTATS_MIB_REASMFAILS); | 438 | IPSTATS_MIB_REASMFAILS); |
439 | kfree_skb(skb); | 439 | kfree_skb(skb); |
440 | return -1; | 440 | return -1; |
@@ -576,9 +576,9 @@ static int ipv6_frag_rcv(struct sk_buff *skb) | |||
576 | struct frag_hdr *fhdr; | 576 | struct frag_hdr *fhdr; |
577 | struct frag_queue *fq; | 577 | struct frag_queue *fq; |
578 | struct ipv6hdr *hdr = ipv6_hdr(skb); | 578 | struct ipv6hdr *hdr = ipv6_hdr(skb); |
579 | struct net *net = dev_net(skb->dst->dev); | 579 | struct net *net = dev_net(skb_dst(skb)->dev); |
580 | 580 | ||
581 | IP6_INC_STATS_BH(net, ip6_dst_idev(skb->dst), IPSTATS_MIB_REASMREQDS); | 581 | IP6_INC_STATS_BH(net, ip6_dst_idev(skb_dst(skb)), IPSTATS_MIB_REASMREQDS); |
582 | 582 | ||
583 | /* Jumbo payload inhibits frag. header */ | 583 | /* Jumbo payload inhibits frag. header */ |
584 | if (hdr->payload_len==0) | 584 | if (hdr->payload_len==0) |
@@ -595,17 +595,17 @@ static int ipv6_frag_rcv(struct sk_buff *skb) | |||
595 | /* It is not a fragmented frame */ | 595 | /* It is not a fragmented frame */ |
596 | skb->transport_header += sizeof(struct frag_hdr); | 596 | skb->transport_header += sizeof(struct frag_hdr); |
597 | IP6_INC_STATS_BH(net, | 597 | IP6_INC_STATS_BH(net, |
598 | ip6_dst_idev(skb->dst), IPSTATS_MIB_REASMOKS); | 598 | ip6_dst_idev(skb_dst(skb)), IPSTATS_MIB_REASMOKS); |
599 | 599 | ||
600 | IP6CB(skb)->nhoff = (u8 *)fhdr - skb_network_header(skb); | 600 | IP6CB(skb)->nhoff = (u8 *)fhdr - skb_network_header(skb); |
601 | return 1; | 601 | return 1; |
602 | } | 602 | } |
603 | 603 | ||
604 | if (atomic_read(&net->ipv6.frags.mem) > net->ipv6.frags.high_thresh) | 604 | if (atomic_read(&net->ipv6.frags.mem) > net->ipv6.frags.high_thresh) |
605 | ip6_evictor(net, ip6_dst_idev(skb->dst)); | 605 | ip6_evictor(net, ip6_dst_idev(skb_dst(skb))); |
606 | 606 | ||
607 | if ((fq = fq_find(net, fhdr->identification, &hdr->saddr, &hdr->daddr, | 607 | if ((fq = fq_find(net, fhdr->identification, &hdr->saddr, &hdr->daddr, |
608 | ip6_dst_idev(skb->dst))) != NULL) { | 608 | ip6_dst_idev(skb_dst(skb)))) != NULL) { |
609 | int ret; | 609 | int ret; |
610 | 610 | ||
611 | spin_lock(&fq->q.lock); | 611 | spin_lock(&fq->q.lock); |
@@ -617,12 +617,12 @@ static int ipv6_frag_rcv(struct sk_buff *skb) | |||
617 | return ret; | 617 | return ret; |
618 | } | 618 | } |
619 | 619 | ||
620 | IP6_INC_STATS_BH(net, ip6_dst_idev(skb->dst), IPSTATS_MIB_REASMFAILS); | 620 | IP6_INC_STATS_BH(net, ip6_dst_idev(skb_dst(skb)), IPSTATS_MIB_REASMFAILS); |
621 | kfree_skb(skb); | 621 | kfree_skb(skb); |
622 | return -1; | 622 | return -1; |
623 | 623 | ||
624 | fail_hdr: | 624 | fail_hdr: |
625 | IP6_INC_STATS(net, ip6_dst_idev(skb->dst), IPSTATS_MIB_INHDRERRORS); | 625 | IP6_INC_STATS(net, ip6_dst_idev(skb_dst(skb)), IPSTATS_MIB_INHDRERRORS); |
626 | icmpv6_param_prob(skb, ICMPV6_HDR_FIELD, skb_network_header_len(skb)); | 626 | icmpv6_param_prob(skb, ICMPV6_HDR_FIELD, skb_network_header_len(skb)); |
627 | return -1; | 627 | return -1; |
628 | } | 628 | } |
diff --git a/net/ipv6/route.c b/net/ipv6/route.c index 032a5ec391c..658293ea05b 100644 --- a/net/ipv6/route.c +++ b/net/ipv6/route.c | |||
@@ -800,7 +800,7 @@ void ip6_route_input(struct sk_buff *skb) | |||
800 | if (rt6_need_strict(&iph->daddr) && skb->dev->type != ARPHRD_PIMREG) | 800 | if (rt6_need_strict(&iph->daddr) && skb->dev->type != ARPHRD_PIMREG) |
801 | flags |= RT6_LOOKUP_F_IFACE; | 801 | flags |= RT6_LOOKUP_F_IFACE; |
802 | 802 | ||
803 | skb->dst = fib6_rule_lookup(net, &fl, flags, ip6_pol_route_input); | 803 | skb_dst_set(skb, fib6_rule_lookup(net, &fl, flags, ip6_pol_route_input)); |
804 | } | 804 | } |
805 | 805 | ||
806 | static struct rt6_info *ip6_pol_route_output(struct net *net, struct fib6_table *table, | 806 | static struct rt6_info *ip6_pol_route_output(struct net *net, struct fib6_table *table, |
@@ -911,7 +911,7 @@ static void ip6_link_failure(struct sk_buff *skb) | |||
911 | 911 | ||
912 | icmpv6_send(skb, ICMPV6_DEST_UNREACH, ICMPV6_ADDR_UNREACH, 0, skb->dev); | 912 | icmpv6_send(skb, ICMPV6_DEST_UNREACH, ICMPV6_ADDR_UNREACH, 0, skb->dev); |
913 | 913 | ||
914 | rt = (struct rt6_info *) skb->dst; | 914 | rt = (struct rt6_info *) skb_dst(skb); |
915 | if (rt) { | 915 | if (rt) { |
916 | if (rt->rt6i_flags&RTF_CACHE) { | 916 | if (rt->rt6i_flags&RTF_CACHE) { |
917 | dst_set_expires(&rt->u.dst, 0); | 917 | dst_set_expires(&rt->u.dst, 0); |
@@ -1868,7 +1868,7 @@ int ipv6_route_ioctl(struct net *net, unsigned int cmd, void __user *arg) | |||
1868 | static int ip6_pkt_drop(struct sk_buff *skb, int code, int ipstats_mib_noroutes) | 1868 | static int ip6_pkt_drop(struct sk_buff *skb, int code, int ipstats_mib_noroutes) |
1869 | { | 1869 | { |
1870 | int type; | 1870 | int type; |
1871 | struct dst_entry *dst = skb->dst; | 1871 | struct dst_entry *dst = skb_dst(skb); |
1872 | switch (ipstats_mib_noroutes) { | 1872 | switch (ipstats_mib_noroutes) { |
1873 | case IPSTATS_MIB_INNOROUTES: | 1873 | case IPSTATS_MIB_INNOROUTES: |
1874 | type = ipv6_addr_type(&ipv6_hdr(skb)->daddr); | 1874 | type = ipv6_addr_type(&ipv6_hdr(skb)->daddr); |
@@ -1895,7 +1895,7 @@ static int ip6_pkt_discard(struct sk_buff *skb) | |||
1895 | 1895 | ||
1896 | static int ip6_pkt_discard_out(struct sk_buff *skb) | 1896 | static int ip6_pkt_discard_out(struct sk_buff *skb) |
1897 | { | 1897 | { |
1898 | skb->dev = skb->dst->dev; | 1898 | skb->dev = skb_dst(skb)->dev; |
1899 | return ip6_pkt_drop(skb, ICMPV6_NOROUTE, IPSTATS_MIB_OUTNOROUTES); | 1899 | return ip6_pkt_drop(skb, ICMPV6_NOROUTE, IPSTATS_MIB_OUTNOROUTES); |
1900 | } | 1900 | } |
1901 | 1901 | ||
@@ -1908,7 +1908,7 @@ static int ip6_pkt_prohibit(struct sk_buff *skb) | |||
1908 | 1908 | ||
1909 | static int ip6_pkt_prohibit_out(struct sk_buff *skb) | 1909 | static int ip6_pkt_prohibit_out(struct sk_buff *skb) |
1910 | { | 1910 | { |
1911 | skb->dev = skb->dst->dev; | 1911 | skb->dev = skb_dst(skb)->dev; |
1912 | return ip6_pkt_drop(skb, ICMPV6_ADM_PROHIBITED, IPSTATS_MIB_OUTNOROUTES); | 1912 | return ip6_pkt_drop(skb, ICMPV6_ADM_PROHIBITED, IPSTATS_MIB_OUTNOROUTES); |
1913 | } | 1913 | } |
1914 | 1914 | ||
@@ -2366,7 +2366,7 @@ static int inet6_rtm_getroute(struct sk_buff *in_skb, struct nlmsghdr* nlh, void | |||
2366 | skb_reserve(skb, MAX_HEADER + sizeof(struct ipv6hdr)); | 2366 | skb_reserve(skb, MAX_HEADER + sizeof(struct ipv6hdr)); |
2367 | 2367 | ||
2368 | rt = (struct rt6_info*) ip6_route_output(net, NULL, &fl); | 2368 | rt = (struct rt6_info*) ip6_route_output(net, NULL, &fl); |
2369 | skb->dst = &rt->u.dst; | 2369 | skb_dst_set(skb, &rt->u.dst); |
2370 | 2370 | ||
2371 | err = rt6_fill_node(net, skb, rt, &fl.fl6_dst, &fl.fl6_src, iif, | 2371 | err = rt6_fill_node(net, skb, rt, &fl.fl6_dst, &fl.fl6_src, iif, |
2372 | RTM_NEWROUTE, NETLINK_CB(in_skb).pid, | 2372 | RTM_NEWROUTE, NETLINK_CB(in_skb).pid, |
diff --git a/net/ipv6/sit.c b/net/ipv6/sit.c index b3a59bd40f0..68e52308e55 100644 --- a/net/ipv6/sit.c +++ b/net/ipv6/sit.c | |||
@@ -575,8 +575,7 @@ static int ipip6_rcv(struct sk_buff *skb) | |||
575 | tunnel->dev->stats.rx_packets++; | 575 | tunnel->dev->stats.rx_packets++; |
576 | tunnel->dev->stats.rx_bytes += skb->len; | 576 | tunnel->dev->stats.rx_bytes += skb->len; |
577 | skb->dev = tunnel->dev; | 577 | skb->dev = tunnel->dev; |
578 | dst_release(skb->dst); | 578 | skb_dst_drop(skb); |
579 | skb->dst = NULL; | ||
580 | nf_reset(skb); | 579 | nf_reset(skb); |
581 | ipip6_ecn_decapsulate(iph, skb); | 580 | ipip6_ecn_decapsulate(iph, skb); |
582 | netif_rx(skb); | 581 | netif_rx(skb); |
@@ -638,8 +637,8 @@ static int ipip6_tunnel_xmit(struct sk_buff *skb, struct net_device *dev) | |||
638 | if (dev->priv_flags & IFF_ISATAP) { | 637 | if (dev->priv_flags & IFF_ISATAP) { |
639 | struct neighbour *neigh = NULL; | 638 | struct neighbour *neigh = NULL; |
640 | 639 | ||
641 | if (skb->dst) | 640 | if (skb_dst(skb)) |
642 | neigh = skb->dst->neighbour; | 641 | neigh = skb_dst(skb)->neighbour; |
643 | 642 | ||
644 | if (neigh == NULL) { | 643 | if (neigh == NULL) { |
645 | if (net_ratelimit()) | 644 | if (net_ratelimit()) |
@@ -663,8 +662,8 @@ static int ipip6_tunnel_xmit(struct sk_buff *skb, struct net_device *dev) | |||
663 | if (!dst) { | 662 | if (!dst) { |
664 | struct neighbour *neigh = NULL; | 663 | struct neighbour *neigh = NULL; |
665 | 664 | ||
666 | if (skb->dst) | 665 | if (skb_dst(skb)) |
667 | neigh = skb->dst->neighbour; | 666 | neigh = skb_dst(skb)->neighbour; |
668 | 667 | ||
669 | if (neigh == NULL) { | 668 | if (neigh == NULL) { |
670 | if (net_ratelimit()) | 669 | if (net_ratelimit()) |
@@ -714,7 +713,7 @@ static int ipip6_tunnel_xmit(struct sk_buff *skb, struct net_device *dev) | |||
714 | if (tiph->frag_off) | 713 | if (tiph->frag_off) |
715 | mtu = dst_mtu(&rt->u.dst) - sizeof(struct iphdr); | 714 | mtu = dst_mtu(&rt->u.dst) - sizeof(struct iphdr); |
716 | else | 715 | else |
717 | mtu = skb->dst ? dst_mtu(skb->dst) : dev->mtu; | 716 | mtu = skb_dst(skb) ? dst_mtu(skb_dst(skb)) : dev->mtu; |
718 | 717 | ||
719 | if (mtu < 68) { | 718 | if (mtu < 68) { |
720 | stats->collisions++; | 719 | stats->collisions++; |
@@ -723,8 +722,8 @@ static int ipip6_tunnel_xmit(struct sk_buff *skb, struct net_device *dev) | |||
723 | } | 722 | } |
724 | if (mtu < IPV6_MIN_MTU) | 723 | if (mtu < IPV6_MIN_MTU) |
725 | mtu = IPV6_MIN_MTU; | 724 | mtu = IPV6_MIN_MTU; |
726 | if (tunnel->parms.iph.daddr && skb->dst) | 725 | if (tunnel->parms.iph.daddr && skb_dst(skb)) |
727 | skb->dst->ops->update_pmtu(skb->dst, mtu); | 726 | skb_dst(skb)->ops->update_pmtu(skb_dst(skb), mtu); |
728 | 727 | ||
729 | if (skb->len > mtu) { | 728 | if (skb->len > mtu) { |
730 | icmpv6_send(skb, ICMPV6_PKT_TOOBIG, 0, mtu, dev); | 729 | icmpv6_send(skb, ICMPV6_PKT_TOOBIG, 0, mtu, dev); |
@@ -768,8 +767,8 @@ static int ipip6_tunnel_xmit(struct sk_buff *skb, struct net_device *dev) | |||
768 | skb_reset_network_header(skb); | 767 | skb_reset_network_header(skb); |
769 | memset(&(IPCB(skb)->opt), 0, sizeof(IPCB(skb)->opt)); | 768 | memset(&(IPCB(skb)->opt), 0, sizeof(IPCB(skb)->opt)); |
770 | IPCB(skb)->flags = 0; | 769 | IPCB(skb)->flags = 0; |
771 | dst_release(skb->dst); | 770 | skb_dst_drop(skb); |
772 | skb->dst = &rt->u.dst; | 771 | skb_dst_set(skb, &rt->u.dst); |
773 | 772 | ||
774 | /* | 773 | /* |
775 | * Push down and install the IPIP header. | 774 | * Push down and install the IPIP header. |
diff --git a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c index ea37741062a..53b6a4192b1 100644 --- a/net/ipv6/tcp_ipv6.c +++ b/net/ipv6/tcp_ipv6.c | |||
@@ -981,9 +981,10 @@ static void tcp_v6_send_response(struct sk_buff *skb, u32 seq, u32 ack, u32 win, | |||
981 | struct tcphdr *th = tcp_hdr(skb), *t1; | 981 | struct tcphdr *th = tcp_hdr(skb), *t1; |
982 | struct sk_buff *buff; | 982 | struct sk_buff *buff; |
983 | struct flowi fl; | 983 | struct flowi fl; |
984 | struct net *net = dev_net(skb->dst->dev); | 984 | struct net *net = dev_net(skb_dst(skb)->dev); |
985 | struct sock *ctl_sk = net->ipv6.tcp_sk; | 985 | struct sock *ctl_sk = net->ipv6.tcp_sk; |
986 | unsigned int tot_len = sizeof(struct tcphdr); | 986 | unsigned int tot_len = sizeof(struct tcphdr); |
987 | struct dst_entry *dst; | ||
987 | __be32 *topt; | 988 | __be32 *topt; |
988 | 989 | ||
989 | if (ts) | 990 | if (ts) |
@@ -1052,8 +1053,9 @@ static void tcp_v6_send_response(struct sk_buff *skb, u32 seq, u32 ack, u32 win, | |||
1052 | * Underlying function will use this to retrieve the network | 1053 | * Underlying function will use this to retrieve the network |
1053 | * namespace | 1054 | * namespace |
1054 | */ | 1055 | */ |
1055 | if (!ip6_dst_lookup(ctl_sk, &buff->dst, &fl)) { | 1056 | if (!ip6_dst_lookup(ctl_sk, &dst, &fl)) { |
1056 | if (xfrm_lookup(net, &buff->dst, &fl, NULL, 0) >= 0) { | 1057 | if (xfrm_lookup(net, &dst, &fl, NULL, 0) >= 0) { |
1058 | skb_dst_set(buff, dst); | ||
1057 | ip6_xmit(ctl_sk, buff, &fl, NULL, 0); | 1059 | ip6_xmit(ctl_sk, buff, &fl, NULL, 0); |
1058 | TCP_INC_STATS_BH(net, TCP_MIB_OUTSEGS); | 1060 | TCP_INC_STATS_BH(net, TCP_MIB_OUTSEGS); |
1059 | if (rst) | 1061 | if (rst) |
diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c index 8905712cfbb..fc333d85472 100644 --- a/net/ipv6/udp.c +++ b/net/ipv6/udp.c | |||
@@ -177,10 +177,9 @@ static struct sock *__udp6_lib_lookup_skb(struct sk_buff *skb, | |||
177 | 177 | ||
178 | if (unlikely(sk = skb_steal_sock(skb))) | 178 | if (unlikely(sk = skb_steal_sock(skb))) |
179 | return sk; | 179 | return sk; |
180 | else | 180 | return __udp6_lib_lookup(dev_net(skb_dst(skb)->dev), &iph->saddr, sport, |
181 | return __udp6_lib_lookup(dev_net(skb->dst->dev), &iph->saddr, sport, | 181 | &iph->daddr, dport, inet6_iif(skb), |
182 | &iph->daddr, dport, inet6_iif(skb), | 182 | udptable); |
183 | udptable); | ||
184 | } | 183 | } |
185 | 184 | ||
186 | /* | 185 | /* |
diff --git a/net/ipv6/xfrm6_mode_tunnel.c b/net/ipv6/xfrm6_mode_tunnel.c index e20529b4c82..3927832227b 100644 --- a/net/ipv6/xfrm6_mode_tunnel.c +++ b/net/ipv6/xfrm6_mode_tunnel.c | |||
@@ -31,7 +31,7 @@ static inline void ipip6_ecn_decapsulate(struct sk_buff *skb) | |||
31 | */ | 31 | */ |
32 | static int xfrm6_mode_tunnel_output(struct xfrm_state *x, struct sk_buff *skb) | 32 | static int xfrm6_mode_tunnel_output(struct xfrm_state *x, struct sk_buff *skb) |
33 | { | 33 | { |
34 | struct dst_entry *dst = skb->dst; | 34 | struct dst_entry *dst = skb_dst(skb); |
35 | struct ipv6hdr *top_iph; | 35 | struct ipv6hdr *top_iph; |
36 | int dsfield; | 36 | int dsfield; |
37 | 37 | ||
@@ -45,7 +45,7 @@ static int xfrm6_mode_tunnel_output(struct xfrm_state *x, struct sk_buff *skb) | |||
45 | 45 | ||
46 | memcpy(top_iph->flow_lbl, XFRM_MODE_SKB_CB(skb)->flow_lbl, | 46 | memcpy(top_iph->flow_lbl, XFRM_MODE_SKB_CB(skb)->flow_lbl, |
47 | sizeof(top_iph->flow_lbl)); | 47 | sizeof(top_iph->flow_lbl)); |
48 | top_iph->nexthdr = xfrm_af2proto(skb->dst->ops->family); | 48 | top_iph->nexthdr = xfrm_af2proto(skb_dst(skb)->ops->family); |
49 | 49 | ||
50 | dsfield = XFRM_MODE_SKB_CB(skb)->tos; | 50 | dsfield = XFRM_MODE_SKB_CB(skb)->tos; |
51 | dsfield = INET_ECN_encapsulate(dsfield, dsfield); | 51 | dsfield = INET_ECN_encapsulate(dsfield, dsfield); |
diff --git a/net/ipv6/xfrm6_output.c b/net/ipv6/xfrm6_output.c index 5ee5a031bc9..c4f4eef032a 100644 --- a/net/ipv6/xfrm6_output.c +++ b/net/ipv6/xfrm6_output.c | |||
@@ -30,7 +30,7 @@ EXPORT_SYMBOL(xfrm6_find_1stfragopt); | |||
30 | static int xfrm6_tunnel_check_size(struct sk_buff *skb) | 30 | static int xfrm6_tunnel_check_size(struct sk_buff *skb) |
31 | { | 31 | { |
32 | int mtu, ret = 0; | 32 | int mtu, ret = 0; |
33 | struct dst_entry *dst = skb->dst; | 33 | struct dst_entry *dst = skb_dst(skb); |
34 | 34 | ||
35 | mtu = dst_mtu(dst); | 35 | mtu = dst_mtu(dst); |
36 | if (mtu < IPV6_MIN_MTU) | 36 | if (mtu < IPV6_MIN_MTU) |
@@ -90,6 +90,6 @@ static int xfrm6_output_finish(struct sk_buff *skb) | |||
90 | 90 | ||
91 | int xfrm6_output(struct sk_buff *skb) | 91 | int xfrm6_output(struct sk_buff *skb) |
92 | { | 92 | { |
93 | return NF_HOOK(PF_INET6, NF_INET_POST_ROUTING, skb, NULL, skb->dst->dev, | 93 | return NF_HOOK(PF_INET6, NF_INET_POST_ROUTING, skb, NULL, skb_dst(skb)->dev, |
94 | xfrm6_output_finish); | 94 | xfrm6_output_finish); |
95 | } | 95 | } |
diff --git a/net/netfilter/ipvs/ip_vs_xmit.c b/net/netfilter/ipvs/ip_vs_xmit.c index 425ab144f15..5874657af7f 100644 --- a/net/netfilter/ipvs/ip_vs_xmit.c +++ b/net/netfilter/ipvs/ip_vs_xmit.c | |||
@@ -260,8 +260,8 @@ ip_vs_bypass_xmit(struct sk_buff *skb, struct ip_vs_conn *cp, | |||
260 | ip_send_check(ip_hdr(skb)); | 260 | ip_send_check(ip_hdr(skb)); |
261 | 261 | ||
262 | /* drop old route */ | 262 | /* drop old route */ |
263 | dst_release(skb->dst); | 263 | skb_dst_drop(skb); |
264 | skb->dst = &rt->u.dst; | 264 | skb_dst_set(skb, &rt->u.dst); |
265 | 265 | ||
266 | /* Another hack: avoid icmp_send in ip_fragment */ | 266 | /* Another hack: avoid icmp_send in ip_fragment */ |
267 | skb->local_df = 1; | 267 | skb->local_df = 1; |
@@ -324,8 +324,8 @@ ip_vs_bypass_xmit_v6(struct sk_buff *skb, struct ip_vs_conn *cp, | |||
324 | } | 324 | } |
325 | 325 | ||
326 | /* drop old route */ | 326 | /* drop old route */ |
327 | dst_release(skb->dst); | 327 | skb_dst_drop(skb); |
328 | skb->dst = &rt->u.dst; | 328 | skb_dst_set(skb, &rt->u.dst); |
329 | 329 | ||
330 | /* Another hack: avoid icmp_send in ip_fragment */ | 330 | /* Another hack: avoid icmp_send in ip_fragment */ |
331 | skb->local_df = 1; | 331 | skb->local_df = 1; |
@@ -388,8 +388,8 @@ ip_vs_nat_xmit(struct sk_buff *skb, struct ip_vs_conn *cp, | |||
388 | goto tx_error_put; | 388 | goto tx_error_put; |
389 | 389 | ||
390 | /* drop old route */ | 390 | /* drop old route */ |
391 | dst_release(skb->dst); | 391 | skb_dst_drop(skb); |
392 | skb->dst = &rt->u.dst; | 392 | skb_dst_set(skb, &rt->u.dst); |
393 | 393 | ||
394 | /* mangle the packet */ | 394 | /* mangle the packet */ |
395 | if (pp->dnat_handler && !pp->dnat_handler(skb, pp, cp)) | 395 | if (pp->dnat_handler && !pp->dnat_handler(skb, pp, cp)) |
@@ -465,8 +465,8 @@ ip_vs_nat_xmit_v6(struct sk_buff *skb, struct ip_vs_conn *cp, | |||
465 | goto tx_error_put; | 465 | goto tx_error_put; |
466 | 466 | ||
467 | /* drop old route */ | 467 | /* drop old route */ |
468 | dst_release(skb->dst); | 468 | skb_dst_drop(skb); |
469 | skb->dst = &rt->u.dst; | 469 | skb_dst_set(skb, &rt->u.dst); |
470 | 470 | ||
471 | /* mangle the packet */ | 471 | /* mangle the packet */ |
472 | if (pp->dnat_handler && !pp->dnat_handler(skb, pp, cp)) | 472 | if (pp->dnat_handler && !pp->dnat_handler(skb, pp, cp)) |
@@ -553,8 +553,8 @@ ip_vs_tunnel_xmit(struct sk_buff *skb, struct ip_vs_conn *cp, | |||
553 | IP_VS_DBG_RL("ip_vs_tunnel_xmit(): mtu less than 68\n"); | 553 | IP_VS_DBG_RL("ip_vs_tunnel_xmit(): mtu less than 68\n"); |
554 | goto tx_error; | 554 | goto tx_error; |
555 | } | 555 | } |
556 | if (skb->dst) | 556 | if (skb_dst(skb)) |
557 | skb->dst->ops->update_pmtu(skb->dst, mtu); | 557 | skb_dst(skb)->ops->update_pmtu(skb_dst(skb), mtu); |
558 | 558 | ||
559 | df |= (old_iph->frag_off & htons(IP_DF)); | 559 | df |= (old_iph->frag_off & htons(IP_DF)); |
560 | 560 | ||
@@ -596,8 +596,8 @@ ip_vs_tunnel_xmit(struct sk_buff *skb, struct ip_vs_conn *cp, | |||
596 | memset(&(IPCB(skb)->opt), 0, sizeof(IPCB(skb)->opt)); | 596 | memset(&(IPCB(skb)->opt), 0, sizeof(IPCB(skb)->opt)); |
597 | 597 | ||
598 | /* drop old route */ | 598 | /* drop old route */ |
599 | dst_release(skb->dst); | 599 | skb_dst_drop(skb); |
600 | skb->dst = &rt->u.dst; | 600 | skb_dst_set(skb, &rt->u.dst); |
601 | 601 | ||
602 | /* | 602 | /* |
603 | * Push down and install the IPIP header. | 603 | * Push down and install the IPIP header. |
@@ -665,8 +665,8 @@ ip_vs_tunnel_xmit_v6(struct sk_buff *skb, struct ip_vs_conn *cp, | |||
665 | IP_VS_DBG_RL("ip_vs_tunnel_xmit_v6(): mtu less than 1280\n"); | 665 | IP_VS_DBG_RL("ip_vs_tunnel_xmit_v6(): mtu less than 1280\n"); |
666 | goto tx_error; | 666 | goto tx_error; |
667 | } | 667 | } |
668 | if (skb->dst) | 668 | if (skb_dst(skb)) |
669 | skb->dst->ops->update_pmtu(skb->dst, mtu); | 669 | skb_dst(skb)->ops->update_pmtu(skb_dst(skb), mtu); |
670 | 670 | ||
671 | if (mtu < ntohs(old_iph->payload_len) + sizeof(struct ipv6hdr)) { | 671 | if (mtu < ntohs(old_iph->payload_len) + sizeof(struct ipv6hdr)) { |
672 | icmpv6_send(skb, ICMPV6_PKT_TOOBIG, 0, mtu, skb->dev); | 672 | icmpv6_send(skb, ICMPV6_PKT_TOOBIG, 0, mtu, skb->dev); |
@@ -702,8 +702,8 @@ ip_vs_tunnel_xmit_v6(struct sk_buff *skb, struct ip_vs_conn *cp, | |||
702 | memset(&(IPCB(skb)->opt), 0, sizeof(IPCB(skb)->opt)); | 702 | memset(&(IPCB(skb)->opt), 0, sizeof(IPCB(skb)->opt)); |
703 | 703 | ||
704 | /* drop old route */ | 704 | /* drop old route */ |
705 | dst_release(skb->dst); | 705 | skb_dst_drop(skb); |
706 | skb->dst = &rt->u.dst; | 706 | skb_dst_set(skb, &rt->u.dst); |
707 | 707 | ||
708 | /* | 708 | /* |
709 | * Push down and install the IPIP header. | 709 | * Push down and install the IPIP header. |
@@ -775,8 +775,8 @@ ip_vs_dr_xmit(struct sk_buff *skb, struct ip_vs_conn *cp, | |||
775 | ip_send_check(ip_hdr(skb)); | 775 | ip_send_check(ip_hdr(skb)); |
776 | 776 | ||
777 | /* drop old route */ | 777 | /* drop old route */ |
778 | dst_release(skb->dst); | 778 | skb_dst_drop(skb); |
779 | skb->dst = &rt->u.dst; | 779 | skb_dst_set(skb, &rt->u.dst); |
780 | 780 | ||
781 | /* Another hack: avoid icmp_send in ip_fragment */ | 781 | /* Another hack: avoid icmp_send in ip_fragment */ |
782 | skb->local_df = 1; | 782 | skb->local_df = 1; |
@@ -828,8 +828,8 @@ ip_vs_dr_xmit_v6(struct sk_buff *skb, struct ip_vs_conn *cp, | |||
828 | } | 828 | } |
829 | 829 | ||
830 | /* drop old route */ | 830 | /* drop old route */ |
831 | dst_release(skb->dst); | 831 | skb_dst_drop(skb); |
832 | skb->dst = &rt->u.dst; | 832 | skb_dst_set(skb, &rt->u.dst); |
833 | 833 | ||
834 | /* Another hack: avoid icmp_send in ip_fragment */ | 834 | /* Another hack: avoid icmp_send in ip_fragment */ |
835 | skb->local_df = 1; | 835 | skb->local_df = 1; |
@@ -900,8 +900,8 @@ ip_vs_icmp_xmit(struct sk_buff *skb, struct ip_vs_conn *cp, | |||
900 | goto tx_error_put; | 900 | goto tx_error_put; |
901 | 901 | ||
902 | /* drop the old route when skb is not shared */ | 902 | /* drop the old route when skb is not shared */ |
903 | dst_release(skb->dst); | 903 | skb_dst_drop(skb); |
904 | skb->dst = &rt->u.dst; | 904 | skb_dst_set(skb, &rt->u.dst); |
905 | 905 | ||
906 | ip_vs_nat_icmp(skb, pp, cp, 0); | 906 | ip_vs_nat_icmp(skb, pp, cp, 0); |
907 | 907 | ||
@@ -975,8 +975,8 @@ ip_vs_icmp_xmit_v6(struct sk_buff *skb, struct ip_vs_conn *cp, | |||
975 | goto tx_error_put; | 975 | goto tx_error_put; |
976 | 976 | ||
977 | /* drop the old route when skb is not shared */ | 977 | /* drop the old route when skb is not shared */ |
978 | dst_release(skb->dst); | 978 | skb_dst_drop(skb); |
979 | skb->dst = &rt->u.dst; | 979 | skb_dst_set(skb, &rt->u.dst); |
980 | 980 | ||
981 | ip_vs_nat_icmp_v6(skb, pp, cp, 0); | 981 | ip_vs_nat_icmp_v6(skb, pp, cp, 0); |
982 | 982 | ||
diff --git a/net/netfilter/nf_conntrack_proto_gre.c b/net/netfilter/nf_conntrack_proto_gre.c index 117b80112fc..a6d6ec320fb 100644 --- a/net/netfilter/nf_conntrack_proto_gre.c +++ b/net/netfilter/nf_conntrack_proto_gre.c | |||
@@ -176,7 +176,7 @@ static bool gre_invert_tuple(struct nf_conntrack_tuple *tuple, | |||
176 | static bool gre_pkt_to_tuple(const struct sk_buff *skb, unsigned int dataoff, | 176 | static bool gre_pkt_to_tuple(const struct sk_buff *skb, unsigned int dataoff, |
177 | struct nf_conntrack_tuple *tuple) | 177 | struct nf_conntrack_tuple *tuple) |
178 | { | 178 | { |
179 | struct net *net = dev_net(skb->dev ? skb->dev : skb->dst->dev); | 179 | struct net *net = dev_net(skb->dev ? skb->dev : skb_dst(skb)->dev); |
180 | const struct gre_hdr_pptp *pgrehdr; | 180 | const struct gre_hdr_pptp *pgrehdr; |
181 | struct gre_hdr_pptp _pgrehdr; | 181 | struct gre_hdr_pptp _pgrehdr; |
182 | __be16 srckey; | 182 | __be16 srckey; |
diff --git a/net/netfilter/xt_TCPMSS.c b/net/netfilter/xt_TCPMSS.c index 4f3b1f80879..eda64c1cb1e 100644 --- a/net/netfilter/xt_TCPMSS.c +++ b/net/netfilter/xt_TCPMSS.c | |||
@@ -73,11 +73,11 @@ tcpmss_mangle_packet(struct sk_buff *skb, | |||
73 | } | 73 | } |
74 | 74 | ||
75 | if (info->mss == XT_TCPMSS_CLAMP_PMTU) { | 75 | if (info->mss == XT_TCPMSS_CLAMP_PMTU) { |
76 | if (dst_mtu(skb->dst) <= minlen) { | 76 | if (dst_mtu(skb_dst(skb)) <= minlen) { |
77 | if (net_ratelimit()) | 77 | if (net_ratelimit()) |
78 | printk(KERN_ERR "xt_TCPMSS: " | 78 | printk(KERN_ERR "xt_TCPMSS: " |
79 | "unknown or invalid path-MTU (%u)\n", | 79 | "unknown or invalid path-MTU (%u)\n", |
80 | dst_mtu(skb->dst)); | 80 | dst_mtu(skb_dst(skb))); |
81 | return -1; | 81 | return -1; |
82 | } | 82 | } |
83 | if (in_mtu <= minlen) { | 83 | if (in_mtu <= minlen) { |
@@ -86,7 +86,7 @@ tcpmss_mangle_packet(struct sk_buff *skb, | |||
86 | "invalid path-MTU (%u)\n", in_mtu); | 86 | "invalid path-MTU (%u)\n", in_mtu); |
87 | return -1; | 87 | return -1; |
88 | } | 88 | } |
89 | newmss = min(dst_mtu(skb->dst), in_mtu) - minlen; | 89 | newmss = min(dst_mtu(skb_dst(skb)), in_mtu) - minlen; |
90 | } else | 90 | } else |
91 | newmss = info->mss; | 91 | newmss = info->mss; |
92 | 92 | ||
diff --git a/net/netfilter/xt_policy.c b/net/netfilter/xt_policy.c index 328bd20ddd2..4cbfebda8fa 100644 --- a/net/netfilter/xt_policy.c +++ b/net/netfilter/xt_policy.c | |||
@@ -86,7 +86,7 @@ match_policy_out(const struct sk_buff *skb, const struct xt_policy_info *info, | |||
86 | unsigned short family) | 86 | unsigned short family) |
87 | { | 87 | { |
88 | const struct xt_policy_elem *e; | 88 | const struct xt_policy_elem *e; |
89 | const struct dst_entry *dst = skb->dst; | 89 | const struct dst_entry *dst = skb_dst(skb); |
90 | int strict = info->flags & XT_POLICY_MATCH_STRICT; | 90 | int strict = info->flags & XT_POLICY_MATCH_STRICT; |
91 | int i, pos; | 91 | int i, pos; |
92 | 92 | ||
diff --git a/net/netfilter/xt_realm.c b/net/netfilter/xt_realm.c index 67419287bc7..484d1689bfd 100644 --- a/net/netfilter/xt_realm.c +++ b/net/netfilter/xt_realm.c | |||
@@ -25,7 +25,7 @@ static bool | |||
25 | realm_mt(const struct sk_buff *skb, const struct xt_match_param *par) | 25 | realm_mt(const struct sk_buff *skb, const struct xt_match_param *par) |
26 | { | 26 | { |
27 | const struct xt_realm_info *info = par->matchinfo; | 27 | const struct xt_realm_info *info = par->matchinfo; |
28 | const struct dst_entry *dst = skb->dst; | 28 | const struct dst_entry *dst = skb_dst(skb); |
29 | 29 | ||
30 | return (info->id == (dst->tclassid & info->mask)) ^ info->invert; | 30 | return (info->id == (dst->tclassid & info->mask)) ^ info->invert; |
31 | } | 31 | } |
diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c index 6da9f38ef5c..4f76e5552d8 100644 --- a/net/packet/af_packet.c +++ b/net/packet/af_packet.c | |||
@@ -372,8 +372,7 @@ static int packet_rcv_spkt(struct sk_buff *skb, struct net_device *dev, struct | |||
372 | goto oom; | 372 | goto oom; |
373 | 373 | ||
374 | /* drop any routing info */ | 374 | /* drop any routing info */ |
375 | dst_release(skb->dst); | 375 | skb_dst_drop(skb); |
376 | skb->dst = NULL; | ||
377 | 376 | ||
378 | /* drop conntrack reference */ | 377 | /* drop conntrack reference */ |
379 | nf_reset(skb); | 378 | nf_reset(skb); |
@@ -621,8 +620,7 @@ static int packet_rcv(struct sk_buff *skb, struct net_device *dev, struct packet | |||
621 | 620 | ||
622 | skb_set_owner_r(skb, sk); | 621 | skb_set_owner_r(skb, sk); |
623 | skb->dev = NULL; | 622 | skb->dev = NULL; |
624 | dst_release(skb->dst); | 623 | skb_dst_drop(skb); |
625 | skb->dst = NULL; | ||
626 | 624 | ||
627 | /* drop conntrack reference */ | 625 | /* drop conntrack reference */ |
628 | nf_reset(skb); | 626 | nf_reset(skb); |
diff --git a/net/sched/cls_flow.c b/net/sched/cls_flow.c index 0ef4e3065bc..9402a7fd378 100644 --- a/net/sched/cls_flow.c +++ b/net/sched/cls_flow.c | |||
@@ -84,7 +84,7 @@ static u32 flow_get_dst(const struct sk_buff *skb) | |||
84 | case htons(ETH_P_IPV6): | 84 | case htons(ETH_P_IPV6): |
85 | return ntohl(ipv6_hdr(skb)->daddr.s6_addr32[3]); | 85 | return ntohl(ipv6_hdr(skb)->daddr.s6_addr32[3]); |
86 | default: | 86 | default: |
87 | return addr_fold(skb->dst) ^ (__force u16)skb->protocol; | 87 | return addr_fold(skb_dst(skb)) ^ (__force u16)skb->protocol; |
88 | } | 88 | } |
89 | } | 89 | } |
90 | 90 | ||
@@ -163,7 +163,7 @@ static u32 flow_get_proto_dst(const struct sk_buff *skb) | |||
163 | break; | 163 | break; |
164 | } | 164 | } |
165 | default: | 165 | default: |
166 | res = addr_fold(skb->dst) ^ (__force u16)skb->protocol; | 166 | res = addr_fold(skb_dst(skb)) ^ (__force u16)skb->protocol; |
167 | } | 167 | } |
168 | 168 | ||
169 | return res; | 169 | return res; |
@@ -251,8 +251,8 @@ fallback: | |||
251 | static u32 flow_get_rtclassid(const struct sk_buff *skb) | 251 | static u32 flow_get_rtclassid(const struct sk_buff *skb) |
252 | { | 252 | { |
253 | #ifdef CONFIG_NET_CLS_ROUTE | 253 | #ifdef CONFIG_NET_CLS_ROUTE |
254 | if (skb->dst) | 254 | if (skb_dst(skb)) |
255 | return skb->dst->tclassid; | 255 | return skb_dst(skb)->tclassid; |
256 | #endif | 256 | #endif |
257 | return 0; | 257 | return 0; |
258 | } | 258 | } |
diff --git a/net/sched/cls_route.c b/net/sched/cls_route.c index bdf1f4172ee..dd872d5383e 100644 --- a/net/sched/cls_route.c +++ b/net/sched/cls_route.c | |||
@@ -137,7 +137,7 @@ static int route4_classify(struct sk_buff *skb, struct tcf_proto *tp, | |||
137 | u32 id, h; | 137 | u32 id, h; |
138 | int iif, dont_cache = 0; | 138 | int iif, dont_cache = 0; |
139 | 139 | ||
140 | if ((dst = skb->dst) == NULL) | 140 | if ((dst = skb_dst(skb)) == NULL) |
141 | goto failure; | 141 | goto failure; |
142 | 142 | ||
143 | id = dst->tclassid; | 143 | id = dst->tclassid; |
diff --git a/net/sched/em_meta.c b/net/sched/em_meta.c index b6b588bed4e..266151ae85a 100644 --- a/net/sched/em_meta.c +++ b/net/sched/em_meta.c | |||
@@ -246,11 +246,11 @@ META_COLLECTOR(int_tcindex) | |||
246 | 246 | ||
247 | META_COLLECTOR(int_rtclassid) | 247 | META_COLLECTOR(int_rtclassid) |
248 | { | 248 | { |
249 | if (unlikely(skb->dst == NULL)) | 249 | if (unlikely(skb_dst(skb) == NULL)) |
250 | *err = -1; | 250 | *err = -1; |
251 | else | 251 | else |
252 | #ifdef CONFIG_NET_CLS_ROUTE | 252 | #ifdef CONFIG_NET_CLS_ROUTE |
253 | dst->value = skb->dst->tclassid; | 253 | dst->value = skb_dst(skb)->tclassid; |
254 | #else | 254 | #else |
255 | dst->value = 0; | 255 | dst->value = 0; |
256 | #endif | 256 | #endif |
diff --git a/net/sched/sch_sfq.c b/net/sched/sch_sfq.c index 33133d27b53..8706920a6d4 100644 --- a/net/sched/sch_sfq.c +++ b/net/sched/sch_sfq.c | |||
@@ -149,7 +149,7 @@ static unsigned sfq_hash(struct sfq_sched_data *q, struct sk_buff *skb) | |||
149 | break; | 149 | break; |
150 | } | 150 | } |
151 | default: | 151 | default: |
152 | h = (unsigned long)skb->dst ^ skb->protocol; | 152 | h = (unsigned long)skb_dst(skb) ^ skb->protocol; |
153 | h2 = (unsigned long)skb->sk; | 153 | h2 = (unsigned long)skb->sk; |
154 | } | 154 | } |
155 | 155 | ||
diff --git a/net/sched/sch_teql.c b/net/sched/sch_teql.c index a886496bdc3..cb1cb1e76b9 100644 --- a/net/sched/sch_teql.c +++ b/net/sched/sch_teql.c | |||
@@ -222,7 +222,7 @@ __teql_resolve(struct sk_buff *skb, struct sk_buff *skb_res, struct net_device * | |||
222 | { | 222 | { |
223 | struct netdev_queue *dev_queue = netdev_get_tx_queue(dev, 0); | 223 | struct netdev_queue *dev_queue = netdev_get_tx_queue(dev, 0); |
224 | struct teql_sched_data *q = qdisc_priv(dev_queue->qdisc); | 224 | struct teql_sched_data *q = qdisc_priv(dev_queue->qdisc); |
225 | struct neighbour *mn = skb->dst->neighbour; | 225 | struct neighbour *mn = skb_dst(skb)->neighbour; |
226 | struct neighbour *n = q->ncache; | 226 | struct neighbour *n = q->ncache; |
227 | 227 | ||
228 | if (mn->tbl == NULL) | 228 | if (mn->tbl == NULL) |
@@ -262,8 +262,8 @@ static inline int teql_resolve(struct sk_buff *skb, | |||
262 | return -ENODEV; | 262 | return -ENODEV; |
263 | 263 | ||
264 | if (dev->header_ops == NULL || | 264 | if (dev->header_ops == NULL || |
265 | skb->dst == NULL || | 265 | skb_dst(skb) == NULL || |
266 | skb->dst->neighbour == NULL) | 266 | skb_dst(skb)->neighbour == NULL) |
267 | return 0; | 267 | return 0; |
268 | return __teql_resolve(skb, skb_res, dev); | 268 | return __teql_resolve(skb, skb_res, dev); |
269 | } | 269 | } |
diff --git a/net/sctp/output.c b/net/sctp/output.c index f0c91df59d4..b7641144451 100644 --- a/net/sctp/output.c +++ b/net/sctp/output.c | |||
@@ -405,10 +405,10 @@ int sctp_packet_transmit(struct sctp_packet *packet) | |||
405 | sctp_assoc_sync_pmtu(asoc); | 405 | sctp_assoc_sync_pmtu(asoc); |
406 | } | 406 | } |
407 | } | 407 | } |
408 | nskb->dst = dst_clone(tp->dst); | 408 | dst = dst_clone(tp->dst); |
409 | if (!nskb->dst) | 409 | skb_dst_set(nskb, dst); |
410 | if (dst) | ||
410 | goto no_route; | 411 | goto no_route; |
411 | dst = nskb->dst; | ||
412 | 412 | ||
413 | /* Build the SCTP header. */ | 413 | /* Build the SCTP header. */ |
414 | sh = (struct sctphdr *)skb_push(nskb, sizeof(struct sctphdr)); | 414 | sh = (struct sctphdr *)skb_push(nskb, sizeof(struct sctphdr)); |
diff --git a/net/sunrpc/xprtsock.c b/net/sunrpc/xprtsock.c index e1859614601..6c2d6158655 100644 --- a/net/sunrpc/xprtsock.c +++ b/net/sunrpc/xprtsock.c | |||
@@ -918,7 +918,7 @@ static void xs_udp_data_ready(struct sock *sk, int len) | |||
918 | UDPX_INC_STATS_BH(sk, UDP_MIB_INDATAGRAMS); | 918 | UDPX_INC_STATS_BH(sk, UDP_MIB_INDATAGRAMS); |
919 | 919 | ||
920 | /* Something worked... */ | 920 | /* Something worked... */ |
921 | dst_confirm(skb->dst); | 921 | dst_confirm(skb_dst(skb)); |
922 | 922 | ||
923 | xprt_adjust_cwnd(task, copied); | 923 | xprt_adjust_cwnd(task, copied); |
924 | xprt_update_rtt(task); | 924 | xprt_update_rtt(task); |
diff --git a/net/xfrm/xfrm_input.c b/net/xfrm/xfrm_input.c index b4a13178fb4..e0009c17d80 100644 --- a/net/xfrm/xfrm_input.c +++ b/net/xfrm/xfrm_input.c | |||
@@ -251,8 +251,7 @@ resume: | |||
251 | nf_reset(skb); | 251 | nf_reset(skb); |
252 | 252 | ||
253 | if (decaps) { | 253 | if (decaps) { |
254 | dst_release(skb->dst); | 254 | skb_dst_drop(skb); |
255 | skb->dst = NULL; | ||
256 | netif_rx(skb); | 255 | netif_rx(skb); |
257 | return 0; | 256 | return 0; |
258 | } else { | 257 | } else { |
diff --git a/net/xfrm/xfrm_output.c b/net/xfrm/xfrm_output.c index c235597ba8d..b9fe13138c0 100644 --- a/net/xfrm/xfrm_output.c +++ b/net/xfrm/xfrm_output.c | |||
@@ -22,7 +22,7 @@ static int xfrm_output2(struct sk_buff *skb); | |||
22 | 22 | ||
23 | static int xfrm_state_check_space(struct xfrm_state *x, struct sk_buff *skb) | 23 | static int xfrm_state_check_space(struct xfrm_state *x, struct sk_buff *skb) |
24 | { | 24 | { |
25 | struct dst_entry *dst = skb->dst; | 25 | struct dst_entry *dst = skb_dst(skb); |
26 | int nhead = dst->header_len + LL_RESERVED_SPACE(dst->dev) | 26 | int nhead = dst->header_len + LL_RESERVED_SPACE(dst->dev) |
27 | - skb_headroom(skb); | 27 | - skb_headroom(skb); |
28 | int ntail = dst->dev->needed_tailroom - skb_tailroom(skb); | 28 | int ntail = dst->dev->needed_tailroom - skb_tailroom(skb); |
@@ -39,7 +39,7 @@ static int xfrm_state_check_space(struct xfrm_state *x, struct sk_buff *skb) | |||
39 | 39 | ||
40 | static int xfrm_output_one(struct sk_buff *skb, int err) | 40 | static int xfrm_output_one(struct sk_buff *skb, int err) |
41 | { | 41 | { |
42 | struct dst_entry *dst = skb->dst; | 42 | struct dst_entry *dst = skb_dst(skb); |
43 | struct xfrm_state *x = dst->xfrm; | 43 | struct xfrm_state *x = dst->xfrm; |
44 | struct net *net = xs_net(x); | 44 | struct net *net = xs_net(x); |
45 | 45 | ||
@@ -94,12 +94,13 @@ resume: | |||
94 | goto error_nolock; | 94 | goto error_nolock; |
95 | } | 95 | } |
96 | 96 | ||
97 | if (!(skb->dst = dst_pop(dst))) { | 97 | dst = dst_pop(dst); |
98 | if (!dst) { | ||
98 | XFRM_INC_STATS(net, LINUX_MIB_XFRMOUTERROR); | 99 | XFRM_INC_STATS(net, LINUX_MIB_XFRMOUTERROR); |
99 | err = -EHOSTUNREACH; | 100 | err = -EHOSTUNREACH; |
100 | goto error_nolock; | 101 | goto error_nolock; |
101 | } | 102 | } |
102 | dst = skb->dst; | 103 | skb_dst_set(skb, dst); |
103 | x = dst->xfrm; | 104 | x = dst->xfrm; |
104 | } while (x && !(x->outer_mode->flags & XFRM_MODE_FLAG_TUNNEL)); | 105 | } while (x && !(x->outer_mode->flags & XFRM_MODE_FLAG_TUNNEL)); |
105 | 106 | ||
@@ -119,16 +120,16 @@ int xfrm_output_resume(struct sk_buff *skb, int err) | |||
119 | while (likely((err = xfrm_output_one(skb, err)) == 0)) { | 120 | while (likely((err = xfrm_output_one(skb, err)) == 0)) { |
120 | nf_reset(skb); | 121 | nf_reset(skb); |
121 | 122 | ||
122 | err = skb->dst->ops->local_out(skb); | 123 | err = skb_dst(skb)->ops->local_out(skb); |
123 | if (unlikely(err != 1)) | 124 | if (unlikely(err != 1)) |
124 | goto out; | 125 | goto out; |
125 | 126 | ||
126 | if (!skb->dst->xfrm) | 127 | if (!skb_dst(skb)->xfrm) |
127 | return dst_output(skb); | 128 | return dst_output(skb); |
128 | 129 | ||
129 | err = nf_hook(skb->dst->ops->family, | 130 | err = nf_hook(skb_dst(skb)->ops->family, |
130 | NF_INET_POST_ROUTING, skb, | 131 | NF_INET_POST_ROUTING, skb, |
131 | NULL, skb->dst->dev, xfrm_output2); | 132 | NULL, skb_dst(skb)->dev, xfrm_output2); |
132 | if (unlikely(err != 1)) | 133 | if (unlikely(err != 1)) |
133 | goto out; | 134 | goto out; |
134 | } | 135 | } |
@@ -179,7 +180,7 @@ static int xfrm_output_gso(struct sk_buff *skb) | |||
179 | 180 | ||
180 | int xfrm_output(struct sk_buff *skb) | 181 | int xfrm_output(struct sk_buff *skb) |
181 | { | 182 | { |
182 | struct net *net = dev_net(skb->dst->dev); | 183 | struct net *net = dev_net(skb_dst(skb)->dev); |
183 | int err; | 184 | int err; |
184 | 185 | ||
185 | if (skb_is_gso(skb)) | 186 | if (skb_is_gso(skb)) |
@@ -202,7 +203,7 @@ int xfrm_inner_extract_output(struct xfrm_state *x, struct sk_buff *skb) | |||
202 | struct xfrm_mode *inner_mode; | 203 | struct xfrm_mode *inner_mode; |
203 | if (x->sel.family == AF_UNSPEC) | 204 | if (x->sel.family == AF_UNSPEC) |
204 | inner_mode = xfrm_ip2inner_mode(x, | 205 | inner_mode = xfrm_ip2inner_mode(x, |
205 | xfrm_af2proto(skb->dst->ops->family)); | 206 | xfrm_af2proto(skb_dst(skb)->ops->family)); |
206 | else | 207 | else |
207 | inner_mode = x->inner_mode; | 208 | inner_mode = x->inner_mode; |
208 | 209 | ||
diff --git a/net/xfrm/xfrm_policy.c b/net/xfrm/xfrm_policy.c index 9c068ab3a83..cb81ca35b0d 100644 --- a/net/xfrm/xfrm_policy.c +++ b/net/xfrm/xfrm_policy.c | |||
@@ -2027,6 +2027,8 @@ int __xfrm_route_forward(struct sk_buff *skb, unsigned short family) | |||
2027 | { | 2027 | { |
2028 | struct net *net = dev_net(skb->dev); | 2028 | struct net *net = dev_net(skb->dev); |
2029 | struct flowi fl; | 2029 | struct flowi fl; |
2030 | struct dst_entry *dst; | ||
2031 | int res; | ||
2030 | 2032 | ||
2031 | if (xfrm_decode_session(skb, &fl, family) < 0) { | 2033 | if (xfrm_decode_session(skb, &fl, family) < 0) { |
2032 | /* XXX: we should have something like FWDHDRERROR here. */ | 2034 | /* XXX: we should have something like FWDHDRERROR here. */ |
@@ -2034,7 +2036,11 @@ int __xfrm_route_forward(struct sk_buff *skb, unsigned short family) | |||
2034 | return 0; | 2036 | return 0; |
2035 | } | 2037 | } |
2036 | 2038 | ||
2037 | return xfrm_lookup(net, &skb->dst, &fl, NULL, 0) == 0; | 2039 | dst = skb_dst(skb); |
2040 | |||
2041 | res = xfrm_lookup(net, &dst, &fl, NULL, 0) == 0; | ||
2042 | skb_dst_set(skb, dst); | ||
2043 | return res; | ||
2038 | } | 2044 | } |
2039 | EXPORT_SYMBOL(__xfrm_route_forward); | 2045 | EXPORT_SYMBOL(__xfrm_route_forward); |
2040 | 2046 | ||
diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c index 2fcad7c33ea..4bfc6153ad4 100644 --- a/security/selinux/hooks.c +++ b/security/selinux/hooks.c | |||
@@ -4503,7 +4503,7 @@ static unsigned int selinux_ip_postroute(struct sk_buff *skb, int ifindex, | |||
4503 | * when the packet is on it's final way out. | 4503 | * when the packet is on it's final way out. |
4504 | * NOTE: there appear to be some IPv6 multicast cases where skb->dst | 4504 | * NOTE: there appear to be some IPv6 multicast cases where skb->dst |
4505 | * is NULL, in this case go ahead and apply access control. */ | 4505 | * is NULL, in this case go ahead and apply access control. */ |
4506 | if (skb->dst != NULL && skb->dst->xfrm != NULL) | 4506 | if (skb_dst(skb) != NULL && skb_dst(skb)->xfrm != NULL) |
4507 | return NF_ACCEPT; | 4507 | return NF_ACCEPT; |
4508 | #endif | 4508 | #endif |
4509 | secmark_active = selinux_secmark_enabled(); | 4509 | secmark_active = selinux_secmark_enabled(); |
diff --git a/security/selinux/xfrm.c b/security/selinux/xfrm.c index c0eb72013d6..72b18452e1a 100644 --- a/security/selinux/xfrm.c +++ b/security/selinux/xfrm.c | |||
@@ -447,7 +447,7 @@ int selinux_xfrm_postroute_last(u32 isec_sid, struct sk_buff *skb, | |||
447 | struct dst_entry *dst; | 447 | struct dst_entry *dst; |
448 | int rc = 0; | 448 | int rc = 0; |
449 | 449 | ||
450 | dst = skb->dst; | 450 | dst = skb_dst(skb); |
451 | 451 | ||
452 | if (dst) { | 452 | if (dst) { |
453 | struct dst_entry *dst_test; | 453 | struct dst_entry *dst_test; |