Message ID | 1382116431-28758-3-git-send-email-jiri@resnulli.us |
---|---|
State | Changes Requested, archived |
Delegated to: | David Miller |
Headers | show |
Hello. On 10/18/2013 09:13 PM, Jiri Pirko wrote: > Now, if user application does: > 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. > introduced by: > commit e89e9cf539a28df7d0eb1d0a545368e9920b34ac "[IPv4/IPv6]: UFO Scatter-gather approach" > Signed-off-by: Jiri Pirko <jiri@resnulli.us> > --- > net/ipv6/ip6_output.c | 26 ++++++++++++++------------ > 1 file changed, 14 insertions(+), 12 deletions(-) > diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c > index a54c45c..c6cfa2f 100644 > --- a/net/ipv6/ip6_output.c > +++ b/net/ipv6/ip6_output.c [...] > @@ -1036,20 +1035,23 @@ static inline int ip6_ufo_append_data(struct sock *sk, > skb->transport_header = skb->network_header + fragheaderlen; > > skb->protocol = htons(ETH_P_IPV6); > - skb->ip_summed = CHECKSUM_PARTIAL; > skb->csum = 0; > > - /* Specify the length of each IPv6 datagram fragment. > - * It has to be a multiple of 8. > - */ > - skb_shinfo(skb)->gso_size = (mtu - fragheaderlen - > - sizeof(struct frag_hdr)) & ~7; > - skb_shinfo(skb)->gso_type = SKB_GSO_UDP; > - ipv6_select_ident(&fhdr, rt); > - skb_shinfo(skb)->ip6_frag_id = fhdr.identification; > __skb_queue_tail(&sk->sk_write_queue, skb); > - } > + } else if (skb_is_gso(skb)) > + goto append; According to Documentation/CodingStyle, there should be {} in both arms of *if* statement if there's {} in one of them. WBR, Sergei -- 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
Fri, Oct 18, 2013 at 08:44:43PM CEST, sergei.shtylyov@cogentembedded.com wrote: >Hello. > >On 10/18/2013 09:13 PM, Jiri Pirko wrote: > >>Now, if user application does: >>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. > >>introduced by: >>commit e89e9cf539a28df7d0eb1d0a545368e9920b34ac "[IPv4/IPv6]: UFO Scatter-gather approach" > >>Signed-off-by: Jiri Pirko <jiri@resnulli.us> >>--- >> net/ipv6/ip6_output.c | 26 ++++++++++++++------------ >> 1 file changed, 14 insertions(+), 12 deletions(-) > >>diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c >>index a54c45c..c6cfa2f 100644 >>--- a/net/ipv6/ip6_output.c >>+++ b/net/ipv6/ip6_output.c >[...] >>@@ -1036,20 +1035,23 @@ static inline int ip6_ufo_append_data(struct sock *sk, >> skb->transport_header = skb->network_header + fragheaderlen; >> >> skb->protocol = htons(ETH_P_IPV6); >>- skb->ip_summed = CHECKSUM_PARTIAL; >> skb->csum = 0; >> >>- /* Specify the length of each IPv6 datagram fragment. >>- * It has to be a multiple of 8. >>- */ >>- skb_shinfo(skb)->gso_size = (mtu - fragheaderlen - >>- sizeof(struct frag_hdr)) & ~7; >>- skb_shinfo(skb)->gso_type = SKB_GSO_UDP; >>- ipv6_select_ident(&fhdr, rt); >>- skb_shinfo(skb)->ip6_frag_id = fhdr.identification; >> __skb_queue_tail(&sk->sk_write_queue, skb); >>- } >>+ } else if (skb_is_gso(skb)) >>+ goto append; > > According to Documentation/CodingStyle, there should be {} in both >arms of *if* statement if there's {} in one of them. Yep, you are right. I wonder why scripts/checkpatch.pl do not warn about this. I will send v2. Thanks > >WBR, Sergei > -- 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/ipv6/ip6_output.c b/net/ipv6/ip6_output.c index a54c45c..c6cfa2f 100644 --- a/net/ipv6/ip6_output.c +++ b/net/ipv6/ip6_output.c @@ -1008,6 +1008,7 @@ static inline int ip6_ufo_append_data(struct sock *sk, { struct sk_buff *skb; + struct frag_hdr fhdr; int err; /* There is support for UDP large send offload by network @@ -1015,8 +1016,6 @@ static inline int ip6_ufo_append_data(struct sock *sk, * udp datagram */ if ((skb = skb_peek_tail(&sk->sk_write_queue)) == NULL) { - struct frag_hdr fhdr; - skb = sock_alloc_send_skb(sk, hh_len + fragheaderlen + transhdrlen + 20, (flags & MSG_DONTWAIT), &err); @@ -1036,20 +1035,23 @@ static inline int ip6_ufo_append_data(struct sock *sk, skb->transport_header = skb->network_header + fragheaderlen; skb->protocol = htons(ETH_P_IPV6); - skb->ip_summed = CHECKSUM_PARTIAL; skb->csum = 0; - /* Specify the length of each IPv6 datagram fragment. - * It has to be a multiple of 8. - */ - skb_shinfo(skb)->gso_size = (mtu - fragheaderlen - - sizeof(struct frag_hdr)) & ~7; - skb_shinfo(skb)->gso_type = SKB_GSO_UDP; - ipv6_select_ident(&fhdr, rt); - skb_shinfo(skb)->ip6_frag_id = fhdr.identification; __skb_queue_tail(&sk->sk_write_queue, skb); - } + } else if (skb_is_gso(skb)) + goto append; + + skb->ip_summed = CHECKSUM_PARTIAL; + /* Specify the length of each IPv6 datagram fragment. + * It has to be a multiple of 8. + */ + skb_shinfo(skb)->gso_size = (mtu - fragheaderlen - + sizeof(struct frag_hdr)) & ~7; + skb_shinfo(skb)->gso_type = SKB_GSO_UDP; + ipv6_select_ident(&fhdr, rt); + skb_shinfo(skb)->ip6_frag_id = fhdr.identification; +append: return skb_append_datato_frags(sk, skb, getfrag, from, (length - transhdrlen)); }
Now, if user application does: 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. introduced by: commit e89e9cf539a28df7d0eb1d0a545368e9920b34ac "[IPv4/IPv6]: UFO Scatter-gather approach" Signed-off-by: Jiri Pirko <jiri@resnulli.us> --- net/ipv6/ip6_output.c | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-)