Message ID | 1283068124.2277.230.camel@edumazet-laptop |
---|---|
State | Rejected, archived |
Delegated to: | David Miller |
Headers | show |
On Sun, Aug 29, 2010 at 12:48 AM, Eric Dumazet <eric.dumazet@gmail.com> wrote: > It seems we forget to reset skb->ip_summed to CHECKSUM_NONE in various > tunnels (gre, ipip, sit, ip6_tunnel), before re-entering stack. > > Add ip_summed initialization in skb_tunnel_rx(), and remove it from > ipmr / ip6mr > > Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com> This is intentional behavior. For CHECKSUM_COMPLETE packets we subtract off the checksum of the encapsulating headers that we remove so we can still get the benefit of checksum hardware for the inner packet as well. GRE does this using skb_postpull_rcsum(), for IPIP it is implicit because the outer IP header was already removed, etc. -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/include/net/dst.h b/include/net/dst.h index 81d1413..2ef5580 100644 --- a/include/net/dst.h +++ b/include/net/dst.h @@ -237,6 +237,7 @@ static inline void skb_dst_force(struct sk_buff *skb) */ static inline void skb_tunnel_rx(struct sk_buff *skb, struct net_device *dev) { + skb->ip_summed = CHECKSUM_NONE; skb->dev = dev; /* TODO : stats should be SMP safe */ dev->stats.rx_packets++; diff --git a/net/ipv4/ipmr.c b/net/ipv4/ipmr.c index 179fcab..70fa43b 100644 --- a/net/ipv4/ipmr.c +++ b/net/ipv4/ipmr.c @@ -1837,7 +1837,6 @@ static int __pim_rcv(struct mr_table *mrt, struct sk_buff *skb, skb_pull(skb, (u8*)encap - skb->data); skb_reset_network_header(skb); skb->protocol = htons(ETH_P_IP); - skb->ip_summed = 0; skb->pkt_type = PACKET_HOST; skb_tunnel_rx(skb, reg_dev); diff --git a/net/ipv6/ip6mr.c b/net/ipv6/ip6mr.c index 66078da..c4d0146 100644 --- a/net/ipv6/ip6mr.c +++ b/net/ipv6/ip6mr.c @@ -661,7 +661,6 @@ static int pim6_rcv(struct sk_buff *skb) skb_pull(skb, (u8 *)encap - skb->data); skb_reset_network_header(skb); skb->protocol = htons(ETH_P_IPV6); - skb->ip_summed = 0; skb->pkt_type = PACKET_HOST; skb_tunnel_rx(skb, reg_dev);
It seems we forget to reset skb->ip_summed to CHECKSUM_NONE in various tunnels (gre, ipip, sit, ip6_tunnel), before re-entering stack. Add ip_summed initialization in skb_tunnel_rx(), and remove it from ipmr / ip6mr Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com> --- include/net/dst.h | 1 + net/ipv4/ipmr.c | 1 - net/ipv6/ip6mr.c | 1 - 3 files changed, 1 insertion(+), 2 deletions(-) -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html