On 7/12/24 23:30, Mike Pattrick wrote:
> 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.
Hi, Mike. Not a full review yet, but could you, please, explain in
more details why we need to adjust TSO segment size here?
In order to ensure packet delivery, MTU inside VM / container must be
smaller than the physical network MTU by the size of the tunnel header.
So, tso_segsz of the packet received from such a VM or container should
be already small enough. Or am I missing something?
Best regards, Ilya Maximets.
>
> 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);
_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev