When prepending a tunnel header to a packet marked for segmentation, we
need to adjust the segment size. Failure to do so can result in packets
that are larger than the intended MTU post segmentation.
Fixes: 084c8087292c ("userspace: Support VXLAN and GENEVE TSO.")
Signed-off-by: Mike Pattrick <[email protected]>
---
lib/netdev-native-tnl.c | 11 +++++++++++
1 file changed, 11 insertions(+)
diff --git a/lib/netdev-native-tnl.c b/lib/netdev-native-tnl.c
index 16c56608d..78c91b5fa 100644
--- a/lib/netdev-native-tnl.c
+++ b/lib/netdev-native-tnl.c
@@ -161,6 +161,17 @@ netdev_tnl_push_ip_header(struct dp_packet *packet, const
void *header,
*ip_tot_size = dp_packet_size(packet) - sizeof (struct eth_header);
memcpy(eth, header, size);
+
+ /* The prepended header may cause TSO marked packets to exceed the intended
+ * MTU on segmentation. */
+ if (dp_packet_hwol_is_tso(packet)) {
+ uint16_t tso_segsz = dp_packet_get_tso_segsz(packet);
+ if (tso_segsz > size) {
+ tso_segsz -= size;
+ dp_packet_set_tso_segsz(packet, tso_segsz);
+ }
+ }
+
/* The encapsulated packet has type Ethernet. Adjust dp_packet. */
packet->packet_type = htonl(PT_ETH);
dp_packet_reset_offsets(packet);
--
2.39.3
_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev