Commit d19d56ddc88e7895429ef118db9c83c7bbe3ce6a

Authored by Eric Dumazet
Committed by David S. Miller
1 parent de213e5eed

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

... ... @@ -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 */
... ... @@ -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);
... ... @@ -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();
... ... @@ -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;
... ... @@ -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;
... ... @@ -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();