* [PATCH] ipv6: Fix ip6_xmit to send fragments if ipfragok is true
@ 2008-07-31 5:55 Wei Yongjun
2008-07-31 8:20 ` Herbert Xu
0 siblings, 1 reply; 7+ messages in thread
From: Wei Yongjun @ 2008-07-31 5:55 UTC (permalink / raw)
To: David Miller; +Cc: netdev@vger.kernel.org, Herbert Xu
SCTP used ip6_xmit() to send fragments after received ICMP packet too
big message. But while send packet used ip6_xmit, the skb->local_df is
not initialized. So when skb if enter ip6_fragment
<../cgi-bin/global.cgi?pattern=ip6_fragment&type=reference>(), the following
code will discard the skb.
ip6_fragment(...)
{
if (!skb->local_df) {
...
return -EMSGSIZE;
}
...
}
SCTP do the following step:
1. send packet ip6_xmit(skb, ipfragok=0)
2. received ICMP packet too big message
3. if PMTUD_ENABLE: ip6_xmit(skb, ipfragok=1)
This bug come from patch (b5c15fc004ac83b7ad280acbe0fd4bbed7e2c8d4)
[IPV6]: Fix reversed local_df test in ip6_fragment
which commit by Herbert Xu.
This patch fixed the problem.
Signed-off-by: Wei Yongjun <yjwei@cn.fujitsu.com>
---
net/ipv6/ip6_output.c | 4 ++++
1 files changed, 4 insertions(+), 0 deletions(-)
diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c
index 6407c64..a678c71 100644
--- a/net/ipv6/ip6_output.c
+++ b/net/ipv6/ip6_output.c
@@ -236,6 +236,10 @@ int ip6_xmit(struct sock *sk, struct sk_buff *skb, struct flowi *fl,
skb_reset_network_header(skb);
hdr = ipv6_hdr(skb);
+ /* Allow local fragmentation. */
+ if (np && np->pmtudisc < IPV6_PMTUDISC_DO)
+ skb->local_df = 1;
+
/*
* Fill in the IPv6 header
*/
^ permalink raw reply related [flat|nested] 7+ messages in thread* Re: [PATCH] ipv6: Fix ip6_xmit to send fragments if ipfragok is true 2008-07-31 5:55 [PATCH] ipv6: Fix ip6_xmit to send fragments if ipfragok is true Wei Yongjun @ 2008-07-31 8:20 ` Herbert Xu 2008-07-31 9:11 ` Wei Yongjun 0 siblings, 1 reply; 7+ messages in thread From: Herbert Xu @ 2008-07-31 8:20 UTC (permalink / raw) To: Wei Yongjun; +Cc: David Miller, netdev@vger.kernel.org On Thu, Jul 31, 2008 at 01:55:57PM +0800, Wei Yongjun wrote: > SCTP used ip6_xmit() to send fragments after received ICMP packet too > big message. But while send packet used ip6_xmit, the skb->local_df is > not initialized. So when skb if enter ip6_fragment > <../cgi-bin/global.cgi?pattern=ip6_fragment&type=reference>(), the following > code will discard the skb. That sounds broken. ip6_xmit is for TCP-like protocols that perform PMTU-discovery. Therefore it should never fragment locally. So either SCTP needs to do the same, or it should switch to something other than ip6_xmit. Cheers, -- Visit Openswan at http://www.openswan.org/ Email: Herbert Xu ~{PmV>HI~} <herbert@gondor.apana.org.au> Home Page: http://gondor.apana.org.au/~herbert/ PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH] ipv6: Fix ip6_xmit to send fragments if ipfragok is true 2008-07-31 8:20 ` Herbert Xu @ 2008-07-31 9:11 ` Wei Yongjun 2008-07-31 9:23 ` Herbert Xu 0 siblings, 1 reply; 7+ messages in thread From: Wei Yongjun @ 2008-07-31 9:11 UTC (permalink / raw) To: Herbert Xu; +Cc: David Miller, netdev@vger.kernel.org Herbert Xu wrote: > On Thu, Jul 31, 2008 at 01:55:57PM +0800, Wei Yongjun wrote: > >> SCTP used ip6_xmit() to send fragments after received ICMP packet too >> big message. But while send packet used ip6_xmit, the skb->local_df is >> not initialized. So when skb if enter ip6_fragment >> <../cgi-bin/global.cgi?pattern=ip6_fragment&type=reference>(), the following >> code will discard the skb. >> > > That sounds broken. ip6_xmit is for TCP-like protocols that > perform PMTU-discovery. Therefore it should never fragment > locally. > > So either SCTP needs to do the same, or it should switch to > something other than ip6_xmit. > So what does the ipfragok paramater means? TCP used ip6_xmit always set ipfragok = 0. But if ipfragok=1, what will happend? If ipfragok = 0, and skb->len > mtu, ip6_xmit will discard the skb. If ipfragok=1, ip6_xmit will pass skb to ip6_output() and send skb used ip6_fragment(), but skb will be discard since local_df is 0, it seems that ipfragok has no effect. skb->local_df is set to 1 if np->pmtudisc < IPV6_PMTUDISC_DO in other place, so I think it may also set to 1 if np->pmtudisc < IPV6_PMTUDISC_DO, and send the skb used ip6_fragment(). Is this correct? As I know, if I send skb in IPv4 used ip_queue_xmit(ipfragok=1), skb will be send in fragments if len > mtu. int ip6_xmit(struct sock *sk, struct sk_buff *skb, struct flowi *fl, struct ipv6_txoptions *opt, int ipfragok) { ... mtu = dst_mtu(dst); if ((skb->len <= mtu) || ipfragok || skb_is_gso(skb)) { IP6_INC_STATS(ip6_dst_idev(skb->dst), IPSTATS_MIB_OUTREQUESTS); return NF_HOOK(PF_INET6, NF_INET_LOCAL_OUT, skb, NULL, dst->dev, dst_output); } if (net_ratelimit()) printk(KERN_DEBUG "IPv6: sending pkt_too_big to self\n"); ... } int ip6_output(struct sk_buff *skb) { if ((skb->len > ip6_skb_dst_mtu(skb) && !skb_is_gso(skb)) || dst_allfrag(skb->dst)) return ip6_fragment(skb, ip6_output2); else return ip6_output2(skb); } ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH] ipv6: Fix ip6_xmit to send fragments if ipfragok is true 2008-07-31 9:11 ` Wei Yongjun @ 2008-07-31 9:23 ` Herbert Xu 2008-07-31 9:55 ` [PATCHv2] " Wei Yongjun 0 siblings, 1 reply; 7+ messages in thread From: Herbert Xu @ 2008-07-31 9:23 UTC (permalink / raw) To: Wei Yongjun; +Cc: David Miller, netdev@vger.kernel.org On Thu, Jul 31, 2008 at 05:11:56PM +0800, Wei Yongjun wrote: > > So what does the ipfragok paramater means? > TCP used ip6_xmit always set ipfragok = 0. But if ipfragok=1, what will > happend? OK it's already been butchered for SCTP :) In that case you should set local_df iff ipfragok is true. Cheers, -- Visit Openswan at http://www.openswan.org/ Email: Herbert Xu ~{PmV>HI~} <herbert@gondor.apana.org.au> Home Page: http://gondor.apana.org.au/~herbert/ PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt ^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCHv2] ipv6: Fix ip6_xmit to send fragments if ipfragok is true 2008-07-31 9:23 ` Herbert Xu @ 2008-07-31 9:55 ` Wei Yongjun 2008-07-31 10:41 ` Herbert Xu 0 siblings, 1 reply; 7+ messages in thread From: Wei Yongjun @ 2008-07-31 9:55 UTC (permalink / raw) To: Herbert Xu; +Cc: David Miller, netdev@vger.kernel.org SCTP used ip6_xmit() to send fragments after received ICMP packet too big message. But while send packet used ip6_xmit, the skb->local_df is not initialized. So when skb if enter ip6_fragment(), the following code will discard the skb. ip6_fragment(...) { if (!skb->local_df) { ... return -EMSGSIZE; } ... } SCTP do the following step: 1. send packet ip6_xmit(skb, ipfragok=0) 2. received ICMP packet too big message 3. if PMTUD_ENABLE: ip6_xmit(skb, ipfragok=1) This patch fixed the problem by set local_df if ipfragok is true. Signed-off-by: Wei Yongjun <yjwei@cn.fujitsu.com> --- net/ipv6/ip6_output.c | 4 ++++ 1 files changed, 4 insertions(+), 0 deletions(-) diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c index 6407c64..0969f2a 100644 --- a/net/ipv6/ip6_output.c +++ b/net/ipv6/ip6_output.c @@ -236,6 +236,10 @@ int ip6_xmit(struct sock *sk, struct sk_buff *skb, struct flowi *fl, skb_reset_network_header(skb); hdr = ipv6_hdr(skb); + /* Allow local fragmentation. */ + if (ipfragok) + skb->local_df = 1; + /* * Fill in the IPv6 header */ -- 1.5.3.8 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCHv2] ipv6: Fix ip6_xmit to send fragments if ipfragok is true 2008-07-31 9:55 ` [PATCHv2] " Wei Yongjun @ 2008-07-31 10:41 ` Herbert Xu 2008-08-01 3:47 ` David Miller 0 siblings, 1 reply; 7+ messages in thread From: Herbert Xu @ 2008-07-31 10:41 UTC (permalink / raw) To: Wei Yongjun; +Cc: David Miller, netdev@vger.kernel.org On Thu, Jul 31, 2008 at 05:55:29PM +0800, Wei Yongjun wrote: > SCTP used ip6_xmit() to send fragments after received ICMP packet too > big message. But while send packet used ip6_xmit, the skb->local_df is > not initialized. So when skb if enter ip6_fragment(), the following > code will discard the skb. > > ip6_fragment(...) > { > if (!skb->local_df) { > ... > return -EMSGSIZE; > } > ... > } > > SCTP do the following step: > 1. send packet ip6_xmit(skb, ipfragok=0) > 2. received ICMP packet too big message > 3. if PMTUD_ENABLE: ip6_xmit(skb, ipfragok=1) > > This patch fixed the problem by set local_df if ipfragok is true. > > Signed-off-by: Wei Yongjun <yjwei@cn.fujitsu.com> Acked-by: Herbert Xu <herbert@gondor.apana.org.au> Thanks, -- Visit Openswan at http://www.openswan.org/ Email: Herbert Xu ~{PmV>HI~} <herbert@gondor.apana.org.au> Home Page: http://gondor.apana.org.au/~herbert/ PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCHv2] ipv6: Fix ip6_xmit to send fragments if ipfragok is true 2008-07-31 10:41 ` Herbert Xu @ 2008-08-01 3:47 ` David Miller 0 siblings, 0 replies; 7+ messages in thread From: David Miller @ 2008-08-01 3:47 UTC (permalink / raw) To: herbert; +Cc: yjwei, netdev From: Herbert Xu <herbert@gondor.apana.org.au> Date: Thu, 31 Jul 2008 18:41:50 +0800 > On Thu, Jul 31, 2008 at 05:55:29PM +0800, Wei Yongjun wrote: > > SCTP used ip6_xmit() to send fragments after received ICMP packet too > > big message. But while send packet used ip6_xmit, the skb->local_df is > > not initialized. So when skb if enter ip6_fragment(), the following > > code will discard the skb. > > > > ip6_fragment(...) > > { > > if (!skb->local_df) { > > ... > > return -EMSGSIZE; > > } > > ... > > } > > > > SCTP do the following step: > > 1. send packet ip6_xmit(skb, ipfragok=0) > > 2. received ICMP packet too big message > > 3. if PMTUD_ENABLE: ip6_xmit(skb, ipfragok=1) > > > > This patch fixed the problem by set local_df if ipfragok is true. > > > > Signed-off-by: Wei Yongjun <yjwei@cn.fujitsu.com> > > Acked-by: Herbert Xu <herbert@gondor.apana.org.au> Applied, and I'll queue this up for -stable. Thanks everyone. ^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2008-08-01 3:47 UTC | newest] Thread overview: 7+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2008-07-31 5:55 [PATCH] ipv6: Fix ip6_xmit to send fragments if ipfragok is true Wei Yongjun 2008-07-31 8:20 ` Herbert Xu 2008-07-31 9:11 ` Wei Yongjun 2008-07-31 9:23 ` Herbert Xu 2008-07-31 9:55 ` [PATCHv2] " Wei Yongjun 2008-07-31 10:41 ` Herbert Xu 2008-08-01 3:47 ` David Miller
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).