Hannes Frederic Sowa <han...@stressinduktion.org> writes: > On Thu, Jun 22, 2017, at 22:57, Paolo Abeni wrote: >> >> Can you please check if the following patch fixes the issue? Only >> compiled tested here. >> >> Thanks!!! >> --- >> diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c >> index 067a607..80d89fe 100644 >> --- a/net/ipv4/udp.c >> +++ b/net/ipv4/udp.c >> @@ -1446,16 +1446,19 @@ static struct sk_buff >> *__first_packet_length(struct sock *sk, >> { >> struct sk_buff *skb; >> >> - while ((skb = skb_peek(rcvq)) != NULL && >> - udp_lib_checksum_complete(skb)) { >> - __UDP_INC_STATS(sock_net(sk), UDP_MIB_CSUMERRORS, >> - IS_UDPLITE(sk)); >> - __UDP_INC_STATS(sock_net(sk), UDP_MIB_INERRORS, >> - IS_UDPLITE(sk)); >> - atomic_inc(&sk->sk_drops); >> - __skb_unlink(skb, rcvq); >> - *total += skb->truesize; >> - kfree_skb(skb); >> + while ((skb = skb_peek(rcvq)) != NULL) { >> + if (udp_lib_checksum_complete(skb)) { >> + __UDP_INC_STATS(sock_net(sk), UDP_MIB_CSUMERRORS, >> + IS_UDPLITE(sk)); >> + __UDP_INC_STATS(sock_net(sk), UDP_MIB_INERRORS, >> + IS_UDPLITE(sk)); >> + atomic_inc(&sk->sk_drops); >> + __skb_unlink(skb, rcvq); >> + *total += skb->truesize; >> + kfree_skb(skb); >> + } else { >> + udp_set_dev_scratch(skb); > > It needs a "break;" here. > >> + } >> } >> return skb; >> }
That works! $ wget google.com --2017-06-23 16:56:31-- http://google.com/ Resolving proxy.pmdw.com (proxy.pmdw.com)... 10.1.2.3 Connecting to proxy.pmdw.com (proxy.pmdw.com)|10.1.2.3|:3128... connected. Proxy request sent, awaiting response... 302 Found Location: http://www.google.com.au/?gfe_rd=cr&ei=n7tMWeb9JYPr8wfg4LXYAQ [following] --2017-06-23 16:56:31-- http://www.google.com.au/?gfe_rd=cr&ei=n7tMWeb9JYPr8wfg4LXYAQ Reusing existing connection to proxy.pmdw.com:3128. Proxy request sent, awaiting response... 200 OK Length: unspecified [text/html] Saving to: ‘index.html’ The patch had whitespace issues or something and I had to apply it by hand, here's what I actually tested. cheers diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c index 067a607917f9..d3227c1bbe8e 100644 --- a/net/ipv4/udp.c +++ b/net/ipv4/udp.c @@ -1446,16 +1446,20 @@ static struct sk_buff *__first_packet_length(struct sock *sk, { struct sk_buff *skb; - while ((skb = skb_peek(rcvq)) != NULL && - udp_lib_checksum_complete(skb)) { - __UDP_INC_STATS(sock_net(sk), UDP_MIB_CSUMERRORS, - IS_UDPLITE(sk)); - __UDP_INC_STATS(sock_net(sk), UDP_MIB_INERRORS, - IS_UDPLITE(sk)); - atomic_inc(&sk->sk_drops); - __skb_unlink(skb, rcvq); - *total += skb->truesize; - kfree_skb(skb); + while ((skb = skb_peek(rcvq)) != NULL) { + if (udp_lib_checksum_complete(skb)) { + __UDP_INC_STATS(sock_net(sk), UDP_MIB_CSUMERRORS, + IS_UDPLITE(sk)); + __UDP_INC_STATS(sock_net(sk), UDP_MIB_INERRORS, + IS_UDPLITE(sk)); + atomic_inc(&sk->sk_drops); + __skb_unlink(skb, rcvq); + *total += skb->truesize; + kfree_skb(skb); + } else { + udp_set_dev_scratch(skb); + break; + } } return skb; }