From: Yi Yang Date: Thu, 17 Sep 2020 02:12:49 +0000 (+0800) Subject: gso: fix payload unit size for UDP X-Git-Url: http://git.droids-corp.org/?a=commitdiff_plain;h=b9b75d9b5c9dbc71ee12f77e9abe089492708aae;p=dpdk.git gso: fix payload unit size for UDP Fragment offset of IPv4 header is measured in units of 8 bytes. Fragment offset of UDP fragments will be wrong after GSO if pyld_unit_size isn't multiple of 8. Say pyld_unit_size is 1500, fragment offset of the second UDP fragment will be 187 (i.e. 1500 / 8), which means 1496, and it will result in 4-byte data loss (1500 - 1496 = 4). So UDP GRO will reassemble out a wrong packet. Fixes: b166d4f30b66 ("gso: support UDP/IPv4 fragmentation") Cc: stable@dpdk.org Signed-off-by: Yi Yang Acked-by: Jiayu Hu --- diff --git a/lib/librte_gso/gso_udp4.c b/lib/librte_gso/gso_udp4.c index 21fea09273..6fa68f243a 100644 --- a/lib/librte_gso/gso_udp4.c +++ b/lib/librte_gso/gso_udp4.c @@ -69,7 +69,10 @@ gso_udp4_segment(struct rte_mbuf *pkt, return 1; } - pyld_unit_size = gso_size - hdr_offset; + /* pyld_unit_size must be a multiple of 8 because frag_off + * uses 8 bytes as unit. + */ + pyld_unit_size = (gso_size - hdr_offset) & ~7U; /* Segment the payload */ ret = gso_do_segment(pkt, hdr_offset, pyld_unit_size, direct_pool,