mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-09-18 23:19:34 +02:00
udp: Support BIG TCP GSO packets where they can occur
Wherever a GSO packet can occur, and its length is used to fill the UDP header, use udp_set_len that assigns 0 if the length doesn't fit 16 bits, so that the packet can be properly parsed and segmented later, instead of having truncated length. Use udp_get_len in udp_validate_len to treat BIG TCP packets as valid. Signed-off-by: Alice Mikityanska <alice@isovalent.com> Reviewed-by: Willem de Bruijn <willemb@google.com> Link: https://patch.msgid.link/20260710134242.216538-4-alice.kernel@fastmail.im Reviewed-by: Nikolay Aleksandrov <razor@blackwall.org> Signed-off-by: Paolo Abeni <pabeni@redhat.com>
This commit is contained in:
committed by
Paolo Abeni
parent
842870cdfa
commit
47282504ad
+1
-1
@@ -1040,7 +1040,7 @@ static void fou_build_udp(struct sk_buff *skb, struct ip_tunnel_encap *e,
|
||||
|
||||
uh->dest = e->dport;
|
||||
uh->source = sport;
|
||||
udp_set_len_short(uh, skb->len);
|
||||
udp_set_len(uh, skb->len);
|
||||
udp_set_csum(!(e->flags & TUNNEL_ENCAP_FLAG_CSUM), skb,
|
||||
fl4->saddr, fl4->daddr, skb->len);
|
||||
|
||||
|
||||
+1
-1
@@ -30,7 +30,7 @@ static void fou6_build_udp(struct sk_buff *skb, struct ip_tunnel_encap *e,
|
||||
|
||||
uh->dest = e->dport;
|
||||
uh->source = sport;
|
||||
udp_set_len_short(uh, skb->len);
|
||||
udp_set_len(uh, skb->len);
|
||||
udp6_set_csum(!(e->flags & TUNNEL_ENCAP_FLAG_CSUM6), skb,
|
||||
&fl6->saddr, &fl6->daddr, skb->len);
|
||||
|
||||
|
||||
@@ -1100,7 +1100,7 @@ ipvs_gue_encap(struct net *net, struct sk_buff *skb,
|
||||
dport = cp->dest->tun_port;
|
||||
udph->dest = dport;
|
||||
udph->source = sport;
|
||||
udp_set_len_short(udph, skb->len);
|
||||
udp_set_len(udph, skb->len);
|
||||
udph->check = 0;
|
||||
|
||||
*next_protocol = IPPROTO_UDP;
|
||||
|
||||
@@ -45,7 +45,7 @@ static bool udp_validate_len(struct sk_buff *skb,
|
||||
const struct udphdr *hdr,
|
||||
unsigned int dataoff)
|
||||
{
|
||||
unsigned int udplen = udp_get_len_short(hdr);
|
||||
unsigned int udplen = udp_get_len(skb, hdr, dataoff);
|
||||
unsigned int skblen = skb->len - dataoff;
|
||||
|
||||
if (udplen > skblen || udplen < sizeof(*hdr))
|
||||
|
||||
+1
-1
@@ -231,7 +231,7 @@ static void psp_write_headers(struct net *net, struct sk_buff *skb, __be32 spi,
|
||||
uh->source = udp_flow_src_port(net, skb, 0, 0, false);
|
||||
}
|
||||
uh->check = 0;
|
||||
udp_set_len_short(uh, udp_len);
|
||||
udp_set_len(uh, udp_len);
|
||||
|
||||
psph->nexthdr = IPPROTO_TCP;
|
||||
psph->hdrlen = PSP_HDRLEN_NOOPT;
|
||||
|
||||
Reference in New Issue
Block a user