From: Josh Hunt Date: Wed, 2 Oct 2019 17:29:22 +0000 (-0400) Subject: udp: fix gso_segs calculations X-Git-Tag: v5.2.20~122 X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=fba0b06b5941fe6bbca42d481a84cb4c2ccc0c50;p=users%2Fdwmw2%2Flinux.git udp: fix gso_segs calculations [ Upstream commit 44b321e5020d782ad6e8ae8183f09b163be6e6e2 ] Commit dfec0ee22c0a ("udp: Record gso_segs when supporting UDP segmentation offload") added gso_segs calculation, but incorrectly got sizeof() the pointer and not the underlying data type. In addition let's fix the v6 case. Fixes: bec1f6f69736 ("udp: generate gso with UDP_SEGMENT") Fixes: dfec0ee22c0a ("udp: Record gso_segs when supporting UDP segmentation offload") Signed-off-by: Josh Hunt Reviewed-by: Alexander Duyck Acked-by: Willem de Bruijn Signed-off-by: David S. Miller Signed-off-by: Greg Kroah-Hartman --- diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c index acab7738f7333..b43075bd66d83 100644 --- a/net/ipv4/udp.c +++ b/net/ipv4/udp.c @@ -868,7 +868,7 @@ static int udp_send_skb(struct sk_buff *skb, struct flowi4 *fl4, skb_shinfo(skb)->gso_size = cork->gso_size; skb_shinfo(skb)->gso_type = SKB_GSO_UDP_L4; - skb_shinfo(skb)->gso_segs = DIV_ROUND_UP(len - sizeof(uh), + skb_shinfo(skb)->gso_segs = DIV_ROUND_UP(len - sizeof(*uh), cork->gso_size); goto csum_partial; } diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c index 1258be19e1865..7cf85955b996d 100644 --- a/net/ipv6/udp.c +++ b/net/ipv6/udp.c @@ -1156,6 +1156,8 @@ static int udp_v6_send_skb(struct sk_buff *skb, struct flowi6 *fl6, skb_shinfo(skb)->gso_size = cork->gso_size; skb_shinfo(skb)->gso_type = SKB_GSO_UDP_L4; + skb_shinfo(skb)->gso_segs = DIV_ROUND_UP(len - sizeof(*uh), + cork->gso_size); goto csum_partial; }