gso: fix pyld_unit_size issue for udp gso
Checks
Commit Message
From: Yi Yang <yangyi01@inspur.com>
IP fragment offset in IP header must be multiple of
8, if pyld_unit_size isn't multiple of 8, IP total
length will be wrong after reassemble, IP payload
also will be wrong because some data is lost on
reassembling.
This has been verified in OVS DPDK by VLAN TSO iperf3
UDP case.
Fixes: b166d4f30b66 ("gso: support UDP/IPv4 fragmentation")
Signed-off-by: Yi Yang <yangyi01@inspur.com>
---
lib/librte_gso/gso_udp4.c | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
@@ -69,7 +69,10 @@
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,