Message ID | 20131002112052.GC1528@minipsycho.brq.redhat.com |
---|---|
State | RFC, archived |
Delegated to: | David Miller |
Headers | show |
> This patch should fix this on ipv4 as well: > > Subject: ip_output: do skb ufo init for peeked non ufo skb as well > Is it an official patch ? s/Subject:/[PATCH]/ > Now, if user application does: Any idea when the bug was added (commit id + title) ? > sendto len<mtu flag MSG_MORE > sendto len>mtu flag 0 > The skb is not treated as fragmented one because it is not initialized > that way. So move the initialization to fix this. > > Signed-off-by: Jiri Pirko <jiri@resnulli.us> > --- > net/ipv4/ip_output.c | 14 +++++++++----- > 1 file changed, 9 insertions(+), 5 deletions(-) > > diff --git a/net/ipv4/ip_output.c b/net/ipv4/ip_output.c > index a04d872..bd21c5d 100644 > --- a/net/ipv4/ip_output.c > +++ b/net/ipv4/ip_output.c > @@ -772,15 +772,19 @@ static inline int ip_ufo_append_data(struct sock *sk, > /* initialize protocol header pointer */ > skb->transport_header = skb->network_header + fragheaderlen; > > - skb->ip_summed = CHECKSUM_PARTIAL; > skb->csum = 0; Any idea why we have skb->csum = 0 here ? Thanks ! -- 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
Wed, Oct 02, 2013 at 01:53:55PM CEST, eric.dumazet@gmail.com wrote: > >> This patch should fix this on ipv4 as well: >> >> Subject: ip_output: do skb ufo init for peeked non ufo skb as well >> > >Is it an official patch ? s/Subject:/[PATCH]/ Yes. I thought that to state "Subject:" is enough for patchwork to parse it. Apparently not :/ > >> Now, if user application does: > >Any idea when the bug was added (commit id + title) ? This is hard to say. This code is more or less broken from the very beginning, which is: commit e89e9cf539a28df7d0eb1d0a545368e9920b34ac "[IPv4/IPv6]: UFO Scatter-gather approach" > >> sendto len<mtu flag MSG_MORE >> sendto len>mtu flag 0 >> The skb is not treated as fragmented one because it is not initialized >> that way. So move the initialization to fix this. >> >> Signed-off-by: Jiri Pirko <jiri@resnulli.us> >> --- >> net/ipv4/ip_output.c | 14 +++++++++----- >> 1 file changed, 9 insertions(+), 5 deletions(-) >> >> diff --git a/net/ipv4/ip_output.c b/net/ipv4/ip_output.c >> index a04d872..bd21c5d 100644 >> --- a/net/ipv4/ip_output.c >> +++ b/net/ipv4/ip_output.c >> @@ -772,15 +772,19 @@ static inline int ip_ufo_append_data(struct sock *sk, >> /* initialize protocol header pointer */ >> skb->transport_header = skb->network_header + fragheaderlen; >> >> - skb->ip_summed = CHECKSUM_PARTIAL; >> skb->csum = 0; > >Any idea why we have skb->csum = 0 here ? If I understand this correctly, that can be removed from here. > >Thanks ! > > -- 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/net/ipv4/ip_output.c b/net/ipv4/ip_output.c index a04d872..bd21c5d 100644 --- a/net/ipv4/ip_output.c +++ b/net/ipv4/ip_output.c @@ -772,15 +772,19 @@ static inline int ip_ufo_append_data(struct sock *sk, /* initialize protocol header pointer */ skb->transport_header = skb->network_header + fragheaderlen; - skb->ip_summed = CHECKSUM_PARTIAL; skb->csum = 0; - /* specify the length of each IP datagram fragment */ - skb_shinfo(skb)->gso_size = maxfraglen - fragheaderlen; - skb_shinfo(skb)->gso_type = SKB_GSO_UDP; + __skb_queue_tail(queue, skb); - } + } else if (skb_is_gso(skb)) + goto append; + + skb->ip_summed = CHECKSUM_PARTIAL; + /* specify the length of each IP datagram fragment */ + skb_shinfo(skb)->gso_size = maxfraglen - fragheaderlen; + skb_shinfo(skb)->gso_type = SKB_GSO_UDP; +append: return skb_append_datato_frags(sk, skb, getfrag, from, (length - transhdrlen)); }