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

Reply via email to