Commit d19d56ddc88e7895429ef118db9c83c7bbe3ce6a
Committed by
David S. Miller
1 parent
de213e5eed
Exists in
master
and in
39 other branches
net: Introduce skb_tunnel_rx() helper
skb rxhash should be cleared when a skb is handled by a tunnel before being delivered again, so that correct packet steering can take place. There are other cleanups and accounting that we can factorize in a new helper, skb_tunnel_rx() Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Showing 7 changed files with 34 additions and 34 deletions Side-by-side Diff
include/net/dst.h
... | ... | @@ -226,6 +226,26 @@ |
226 | 226 | } |
227 | 227 | } |
228 | 228 | |
229 | + | |
230 | +/** | |
231 | + * skb_tunnel_rx - prepare skb for rx reinsert | |
232 | + * @skb: buffer | |
233 | + * @dev: tunnel device | |
234 | + * | |
235 | + * After decapsulation, packet is going to re-enter (netif_rx()) our stack, | |
236 | + * so make some cleanups, and perform accounting. | |
237 | + */ | |
238 | +static inline void skb_tunnel_rx(struct sk_buff *skb, struct net_device *dev) | |
239 | +{ | |
240 | + skb->dev = dev; | |
241 | + /* TODO : stats should be SMP safe */ | |
242 | + dev->stats.rx_packets++; | |
243 | + dev->stats.rx_bytes += skb->len; | |
244 | + skb->rxhash = 0; | |
245 | + skb_dst_drop(skb); | |
246 | + nf_reset(skb); | |
247 | +} | |
248 | + | |
229 | 249 | /* Children define the path of the packet through the |
230 | 250 | * Linux networking. Thus, destinations are stackable. |
231 | 251 | */ |
net/ipv4/ip_gre.c
... | ... | @@ -538,7 +538,6 @@ |
538 | 538 | struct ip_tunnel *tunnel; |
539 | 539 | int offset = 4; |
540 | 540 | __be16 gre_proto; |
541 | - unsigned int len; | |
542 | 541 | |
543 | 542 | if (!pskb_may_pull(skb, 16)) |
544 | 543 | goto drop_nolock; |
... | ... | @@ -629,8 +628,6 @@ |
629 | 628 | tunnel->i_seqno = seqno + 1; |
630 | 629 | } |
631 | 630 | |
632 | - len = skb->len; | |
633 | - | |
634 | 631 | /* Warning: All skb pointers will be invalidated! */ |
635 | 632 | if (tunnel->dev->type == ARPHRD_ETHER) { |
636 | 633 | if (!pskb_may_pull(skb, ETH_HLEN)) { |
... | ... | @@ -644,11 +641,7 @@ |
644 | 641 | skb_postpull_rcsum(skb, eth_hdr(skb), ETH_HLEN); |
645 | 642 | } |
646 | 643 | |
647 | - stats->rx_packets++; | |
648 | - stats->rx_bytes += len; | |
649 | - skb->dev = tunnel->dev; | |
650 | - skb_dst_drop(skb); | |
651 | - nf_reset(skb); | |
644 | + skb_tunnel_rx(skb, tunnel->dev); | |
652 | 645 | |
653 | 646 | skb_reset_network_header(skb); |
654 | 647 | ipgre_ecn_decapsulate(iph, skb); |
net/ipv4/ipip.c
... | ... | @@ -374,11 +374,8 @@ |
374 | 374 | skb->protocol = htons(ETH_P_IP); |
375 | 375 | skb->pkt_type = PACKET_HOST; |
376 | 376 | |
377 | - tunnel->dev->stats.rx_packets++; | |
378 | - tunnel->dev->stats.rx_bytes += skb->len; | |
379 | - skb->dev = tunnel->dev; | |
380 | - skb_dst_drop(skb); | |
381 | - nf_reset(skb); | |
377 | + skb_tunnel_rx(skb, tunnel->dev); | |
378 | + | |
382 | 379 | ipip_ecn_decapsulate(iph, skb); |
383 | 380 | netif_rx(skb); |
384 | 381 | rcu_read_unlock(); |
net/ipv4/ipmr.c
... | ... | @@ -1831,14 +1831,12 @@ |
1831 | 1831 | skb->mac_header = skb->network_header; |
1832 | 1832 | skb_pull(skb, (u8*)encap - skb->data); |
1833 | 1833 | skb_reset_network_header(skb); |
1834 | - skb->dev = reg_dev; | |
1835 | 1834 | skb->protocol = htons(ETH_P_IP); |
1836 | 1835 | skb->ip_summed = 0; |
1837 | 1836 | skb->pkt_type = PACKET_HOST; |
1838 | - skb_dst_drop(skb); | |
1839 | - reg_dev->stats.rx_bytes += skb->len; | |
1840 | - reg_dev->stats.rx_packets++; | |
1841 | - nf_reset(skb); | |
1837 | + | |
1838 | + skb_tunnel_rx(skb, reg_dev); | |
1839 | + | |
1842 | 1840 | netif_rx(skb); |
1843 | 1841 | dev_put(reg_dev); |
1844 | 1842 |
net/ipv6/ip6_tunnel.c
... | ... | @@ -723,14 +723,10 @@ |
723 | 723 | skb->protocol = htons(protocol); |
724 | 724 | skb->pkt_type = PACKET_HOST; |
725 | 725 | memset(skb->cb, 0, sizeof(struct inet6_skb_parm)); |
726 | - skb->dev = t->dev; | |
727 | - skb_dst_drop(skb); | |
728 | - nf_reset(skb); | |
729 | 726 | |
730 | - dscp_ecn_decapsulate(t, ipv6h, skb); | |
727 | + skb_tunnel_rx(skb, t->dev); | |
731 | 728 | |
732 | - t->dev->stats.rx_packets++; | |
733 | - t->dev->stats.rx_bytes += skb->len; | |
729 | + dscp_ecn_decapsulate(t, ipv6h, skb); | |
734 | 730 | netif_rx(skb); |
735 | 731 | rcu_read_unlock(); |
736 | 732 | return 0; |
net/ipv6/ip6mr.c
... | ... | @@ -658,14 +658,12 @@ |
658 | 658 | skb->mac_header = skb->network_header; |
659 | 659 | skb_pull(skb, (u8 *)encap - skb->data); |
660 | 660 | skb_reset_network_header(skb); |
661 | - skb->dev = reg_dev; | |
662 | 661 | skb->protocol = htons(ETH_P_IPV6); |
663 | 662 | skb->ip_summed = 0; |
664 | 663 | skb->pkt_type = PACKET_HOST; |
665 | - skb_dst_drop(skb); | |
666 | - reg_dev->stats.rx_bytes += skb->len; | |
667 | - reg_dev->stats.rx_packets++; | |
668 | - nf_reset(skb); | |
664 | + | |
665 | + skb_tunnel_rx(skb, reg_dev); | |
666 | + | |
669 | 667 | netif_rx(skb); |
670 | 668 | dev_put(reg_dev); |
671 | 669 | return 0; |
net/ipv6/sit.c
... | ... | @@ -566,11 +566,9 @@ |
566 | 566 | kfree_skb(skb); |
567 | 567 | return 0; |
568 | 568 | } |
569 | - tunnel->dev->stats.rx_packets++; | |
570 | - tunnel->dev->stats.rx_bytes += skb->len; | |
571 | - skb->dev = tunnel->dev; | |
572 | - skb_dst_drop(skb); | |
573 | - nf_reset(skb); | |
569 | + | |
570 | + skb_tunnel_rx(skb, tunnel->dev); | |
571 | + | |
574 | 572 | ipip6_ecn_decapsulate(iph, skb); |
575 | 573 | netif_rx(skb); |
576 | 574 | rcu_read_unlock(); |