udp6: fix jumbogram reception
Since commit67a51780ae
("ipv6: udp: leverage scratch area helpers") udp6_recvmsg() read the skb len from the scratch area, to avoid a cache miss. But the UDP6 rx path support RFC 2675 UDPv6 jumbograms, and their length exceeds the 16 bits available in the scratch area. As a side effect the length returned by recvmsg() is: <ingress datagram len> % (1<<16) This commit addresses the issue allocating one more bit in the IP6CB flags field and setting it for incoming jumbograms. Such field is still in the first cacheline, so at recvmsg() time we can check it and fallback to access skb->len if required, without a measurable overhead. Fixes:67a51780ae
("ipv6: udp: leverage scratch area helpers") Signed-off-by: Paolo Abeni <pabeni@redhat.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:

committed by
David S. Miller

parent
ddab82821f
commit
cb891fa6a1
@@ -328,6 +328,15 @@ struct sock *udp6_lib_lookup(struct net *net, const struct in6_addr *saddr, __be
|
||||
EXPORT_SYMBOL_GPL(udp6_lib_lookup);
|
||||
#endif
|
||||
|
||||
/* do not use the scratch area len for jumbogram: their length execeeds the
|
||||
* scratch area space; note that the IP6CB flags is still in the first
|
||||
* cacheline, so checking for jumbograms is cheap
|
||||
*/
|
||||
static int udp6_skb_len(struct sk_buff *skb)
|
||||
{
|
||||
return unlikely(inet6_is_jumbogram(skb)) ? skb->len : udp_skb_len(skb);
|
||||
}
|
||||
|
||||
/*
|
||||
* This should be easy, if there is something there we
|
||||
* return it, otherwise we block.
|
||||
@@ -358,7 +367,7 @@ try_again:
|
||||
if (!skb)
|
||||
return err;
|
||||
|
||||
ulen = udp_skb_len(skb);
|
||||
ulen = udp6_skb_len(skb);
|
||||
copied = len;
|
||||
if (copied > ulen - off)
|
||||
copied = ulen - off;
|
||||
|
Reference in New Issue
Block a user