>>
>> Hi,team.
>>     Some switches add padding bytes to packets smaller than 64 bytes that 
>> are sent from outside.
>> However, in our netdev_tnl_push_ip_header processing, we directly set 
>> l2_pad_size to 0.
>> I believe that l2_pad_size should be reassigned with the value it originally 
>> carried.
>> After making this modification, the L4 checksum for my inner packets became 
>> correct.
>>
>> https://github.com/openvswitch/ovs/blob/main/lib/netdev-native-tnl.c#L166
>>
>> Currently, I can resolve the issue with the following modification, but I am 
>> unsure if this
>> approach is the most correct, or if there are other places that also need 
>> the same modification.
>>
>> diff --git a/lib/netdev-native-tnl.c b/lib/netdev-native-tnl.c
>> index dd598ce31..1084dbe91 100644
>> --- a/lib/netdev-native-tnl.c
>> +++ b/lib/netdev-native-tnl.c
>> @@ -163,7 +163,9 @@ netdev_tnl_push_ip_header(struct dp_packet *packet,
>>      memcpy(eth, header, size);
>>      /* The encapsulated packet has type Ethernet. Adjust dp_packet. */
>>      packet->packet_type = htonl(PT_ETH);
>> +    uint16_t l2_pad_size = packet->l2_pad_size;
>>      dp_packet_reset_offsets(packet);
>> +    packet->l2_pad_size = l2_pad_size;
>>      packet->l3_ofs = sizeof (struct eth_header);
>
>I don't think we need to carry this padding over a tunnel.
>I did not test but I wonder if adjusting ip_tot_size is better.
>
>Something like:
>
>@@ -158,7 +158,8 @@ netdev_tnl_push_ip_header(struct dp_packet
>*packet, const void *header,
>     struct ovs_16aligned_ip6_hdr *ip6;
>
>     eth = dp_packet_push_uninit(packet, size);
>-    *ip_tot_size = dp_packet_size(packet) - sizeof (struct eth_header);
>+    *ip_tot_size = dp_packet_size(packet) - dp_packet_l2_pad_size(packet)
>+                   - sizeof (struct eth_header);
>
>     memcpy(eth, header, size);
>     /* The encapsulated packet has type Ethernet. Adjust dp_packet. */
>
>
>-- 
>David Marchand

Thank you very much for your modification. However, when I verified this 
modification, 
I found that while sending Geneve-encapsulated packets on the output, the 
software 
calculation of the inner TCP checksum is still incorrect. I think your 
modification approach 
might be targeting the checksum of the outer packet. However, if l2_pad_size is 
incorrect 
and the padding bytes are non-zero, it will cause the inner L4 checksum to be 
incorrect.

https://github.com/openvswitch/ovs/blob/main/lib/packets.c#L1997 



Jun Wang
_______________________________________________
discuss mailing list
disc...@openvswitch.org
https://mail.openvswitch.org/mailman/listinfo/ovs-discuss

Reply via email to