From: Yi Yang <yangy...@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 <yangy...@inspur.com> --- lib/librte_gso/gso_udp4.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lib/librte_gso/gso_udp4.c b/lib/librte_gso/gso_udp4.c index 21fea09..6fa68f2 100644 --- a/lib/librte_gso/gso_udp4.c +++ b/lib/librte_gso/gso_udp4.c @@ -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, -- 1.8.3.1