Message ID | 20100526102758.GA25914@gondor.apana.org.au |
---|---|
State | Superseded, archived |
Delegated to: | David Miller |
Headers | show |
On Wed, May 26, 2010 at 08:27:58PM +1000, Herbert Xu wrote: > ipv6: Add GSO support on forwarding path > > Currently we disallow GSO packets on the IPv6 forward path. > This patch fixes this. > > Note that I discovered that our existing GSO MTU checks (e.g., > IPv4 forwarding) are buggy in that they skip the check altogether, > hen they really should be checking gso_size instead. > > I have also been lazy here in that I haven't bothered to segment > the GSO packet by hand before generating an ICMP message. Someone > should add that to be 100% correct. > > Reported-by: Ralf Baechle <ralf@linux-mips.org> > Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au> I tested this on top of a 2.6.34 release kernel and asked the user experiencing the problem to re-test and the problem still persists. Unlike what I told you earlier on IRC my tester can trigger the issue by going to any page on linux-ax25.org from any XP, Vista or Windows 7 client. I've got three tcpdumps of the hang occuring on ftp.linux-ax25.org /pub/dl1bff.log /pub/dl1bff-2.log /pub/dl1bff-3.log The first two were taken with a 2.6.32 Fedora 12 kernel; the 3rd with a stock 2.6.34 kernel and your patch applied on top. The issue exists for quite a while; it has first been noticed with Fedora 11. Ralf -- 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/linux/skbuff.h b/include/linux/skbuff.h index 7cdfb4d..64f9c5a 100644 --- a/include/linux/skbuff.h +++ b/include/linux/skbuff.h @@ -2117,6 +2117,13 @@ static inline int skb_is_gso(const struct sk_buff *skb) return skb_shinfo(skb)->gso_size; } +static inline int skb_gso_len(const struct sk_buff *skb) +{ + return skb_is_gso(skb) ? + skb_shinfo(skb)->gso_size + skb_transport_offset(skb) : + skb->len; +} + static inline int skb_is_gso_v6(const struct sk_buff *skb) { return skb_shinfo(skb)->gso_type & SKB_GSO_TCPV6; diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c index cd963f6..8904767 100644 --- a/net/ipv6/ip6_output.c +++ b/net/ipv6/ip6_output.c @@ -507,7 +507,7 @@ int ip6_forward(struct sk_buff *skb) if (mtu < IPV6_MIN_MTU) mtu = IPV6_MIN_MTU; - if (skb->len > mtu) { + if (skb_gso_len(skb) > mtu) { /* Again, force OUTPUT device used as source address */ skb->dev = dst->dev; icmpv6_send(skb, ICMPV6_PKT_TOOBIG, 0, mtu);
Hi: ipv6: Add GSO support on forwarding path Currently we disallow GSO packets on the IPv6 forward path. This patch fixes this. Note that I discovered that our existing GSO MTU checks (e.g., IPv4 forwarding) are buggy in that they skip the check altogether, hen they really should be checking gso_size instead. I have also been lazy here in that I haven't bothered to segment the GSO packet by hand before generating an ICMP message. Someone should add that to be 100% correct. Reported-by: Ralf Baechle <ralf@linux-mips.org> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au> Cheers,