diff options
author | Eric Dumazet <eric.dumazet@gmail.com> | 2010-05-18 01:36:55 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2010-05-18 01:36:55 -0400 |
commit | d19d56ddc88e7895429ef118db9c83c7bbe3ce6a (patch) | |
tree | c0db76f3527c88c95a8793c871f62d628fb3fd1d /net/ipv4 | |
parent | de213e5eedecdfb1b1eea7e6be28bc64cac5c078 (diff) |
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>
Diffstat (limited to 'net/ipv4')
-rw-r--r-- | net/ipv4/ip_gre.c | 9 | ||||
-rw-r--r-- | net/ipv4/ipip.c | 7 | ||||
-rw-r--r-- | net/ipv4/ipmr.c | 8 |
3 files changed, 6 insertions, 18 deletions
diff --git a/net/ipv4/ip_gre.c b/net/ipv4/ip_gre.c index fe381d12ecdd..498cf69c7977 100644 --- a/net/ipv4/ip_gre.c +++ b/net/ipv4/ip_gre.c | |||
@@ -538,7 +538,6 @@ static int ipgre_rcv(struct sk_buff *skb) | |||
538 | struct ip_tunnel *tunnel; | 538 | struct ip_tunnel *tunnel; |
539 | int offset = 4; | 539 | int offset = 4; |
540 | __be16 gre_proto; | 540 | __be16 gre_proto; |
541 | unsigned int len; | ||
542 | 541 | ||
543 | if (!pskb_may_pull(skb, 16)) | 542 | if (!pskb_may_pull(skb, 16)) |
544 | goto drop_nolock; | 543 | goto drop_nolock; |
@@ -629,8 +628,6 @@ static int ipgre_rcv(struct sk_buff *skb) | |||
629 | tunnel->i_seqno = seqno + 1; | 628 | tunnel->i_seqno = seqno + 1; |
630 | } | 629 | } |
631 | 630 | ||
632 | len = skb->len; | ||
633 | |||
634 | /* Warning: All skb pointers will be invalidated! */ | 631 | /* Warning: All skb pointers will be invalidated! */ |
635 | if (tunnel->dev->type == ARPHRD_ETHER) { | 632 | if (tunnel->dev->type == ARPHRD_ETHER) { |
636 | if (!pskb_may_pull(skb, ETH_HLEN)) { | 633 | if (!pskb_may_pull(skb, ETH_HLEN)) { |
@@ -644,11 +641,7 @@ static int ipgre_rcv(struct sk_buff *skb) | |||
644 | skb_postpull_rcsum(skb, eth_hdr(skb), ETH_HLEN); | 641 | skb_postpull_rcsum(skb, eth_hdr(skb), ETH_HLEN); |
645 | } | 642 | } |
646 | 643 | ||
647 | stats->rx_packets++; | 644 | skb_tunnel_rx(skb, tunnel->dev); |
648 | stats->rx_bytes += len; | ||
649 | skb->dev = tunnel->dev; | ||
650 | skb_dst_drop(skb); | ||
651 | nf_reset(skb); | ||
652 | 645 | ||
653 | skb_reset_network_header(skb); | 646 | skb_reset_network_header(skb); |
654 | ipgre_ecn_decapsulate(iph, skb); | 647 | ipgre_ecn_decapsulate(iph, skb); |
diff --git a/net/ipv4/ipip.c b/net/ipv4/ipip.c index 0b27b14dcc9d..7fd636711037 100644 --- a/net/ipv4/ipip.c +++ b/net/ipv4/ipip.c | |||
@@ -374,11 +374,8 @@ static int ipip_rcv(struct sk_buff *skb) | |||
374 | skb->protocol = htons(ETH_P_IP); | 374 | skb->protocol = htons(ETH_P_IP); |
375 | skb->pkt_type = PACKET_HOST; | 375 | skb->pkt_type = PACKET_HOST; |
376 | 376 | ||
377 | tunnel->dev->stats.rx_packets++; | 377 | skb_tunnel_rx(skb, tunnel->dev); |
378 | tunnel->dev->stats.rx_bytes += skb->len; | 378 | |
379 | skb->dev = tunnel->dev; | ||
380 | skb_dst_drop(skb); | ||
381 | nf_reset(skb); | ||
382 | ipip_ecn_decapsulate(iph, skb); | 379 | ipip_ecn_decapsulate(iph, skb); |
383 | netif_rx(skb); | 380 | netif_rx(skb); |
384 | rcu_read_unlock(); | 381 | rcu_read_unlock(); |
diff --git a/net/ipv4/ipmr.c b/net/ipv4/ipmr.c index 7a7ee1cc3b5a..217ebe035b34 100644 --- a/net/ipv4/ipmr.c +++ b/net/ipv4/ipmr.c | |||
@@ -1831,14 +1831,12 @@ static int __pim_rcv(struct mr_table *mrt, struct sk_buff *skb, | |||
1831 | skb->mac_header = skb->network_header; | 1831 | skb->mac_header = skb->network_header; |
1832 | skb_pull(skb, (u8*)encap - skb->data); | 1832 | skb_pull(skb, (u8*)encap - skb->data); |
1833 | skb_reset_network_header(skb); | 1833 | skb_reset_network_header(skb); |
1834 | skb->dev = reg_dev; | ||
1835 | skb->protocol = htons(ETH_P_IP); | 1834 | skb->protocol = htons(ETH_P_IP); |
1836 | skb->ip_summed = 0; | 1835 | skb->ip_summed = 0; |
1837 | skb->pkt_type = PACKET_HOST; | 1836 | skb->pkt_type = PACKET_HOST; |
1838 | skb_dst_drop(skb); | 1837 | |
1839 | reg_dev->stats.rx_bytes += skb->len; | 1838 | skb_tunnel_rx(skb, reg_dev); |
1840 | reg_dev->stats.rx_packets++; | 1839 | |
1841 | nf_reset(skb); | ||
1842 | netif_rx(skb); | 1840 | netif_rx(skb); |
1843 | dev_put(reg_dev); | 1841 | dev_put(reg_dev); |
1844 | 1842 | ||