[dpdk-dev] [PATCH 0/3] i40e VXLAN TX checksum rework

Olivier MATZ olivier.matz at 6wind.com
Thu Nov 27 10:44:47 CET 2014


Hi Jijiang,

Please find below some comments about the specifications. The global
picture looks fine to me.

I've not reviewed the patch right now, but it's in the pipe.

On 11/27/2014 09:18 AM, Jijiang Liu wrote:
> We have got some feedback about backward compatibility of VXLAN TX checksum offload API with 1G/10G NIC after the i40e VXLAN TX checksum codes were applied, so we have to rework the APIs on i40e, including the changes of mbuf, i40e PMD and csum engine.
>
> The main changes in mbuf are as follows,
> In place of removing PKT_TX_VXLAN_CKSUM, we introducing 2 new flags: PKT_TX_OUT_IP_CKSUM, PKT_TX_UDP_TUNNEL_PKT, and a new field: l4_tun_len.

What about PKT_TX_OUT_UDP_CKSUM instead of PKT_TX_UDP_TUNNEL_PKT? It's
maybe more coherent with the other names.


> Replace the inner_l2_len and the inner_l3_len field with the outer_l2_len and outer_l3_len field.
>
> The existing flags are listed below,
> PKT_TX_IP_CKSUM:     HW IPv4 checksum for non-tunnelling packet/ HW inner IPv4 checksum for tunnelling packet
> PKT_TX_TCP_CKSUM:    HW TCP checksum for non-tunnelling packet/ HW inner TCP checksum for tunnelling packet
> PKT_TX_SCTP_CKSUM:   HW SCTP checksum for non-tunnelling packet/ HW inner SCTP checksum for tunnelling packet
> PKT_TX_UDP_CKSUM:    HW SCTP checksum for non-tunnelling packet/ HW inner SCTP checksum for tunnelling packet
> PKT_TX_IPV4:        IPv4 with no HW checksum offload for non-tunnelling packet/inner IPv4 with no HW checksum offload for tunnelling packet
> PKT_TX_IPV6:        IPv6 non-tunnelling packet/ inner IPv6 with no HW checksum offload for tunnelling packet

As I suggested in the TSO thread, I think the following semantics
is easier to understand for the user:

   - PKT_TX_IP_CKSUM: tell the NIC to compute IP cksum

   - PKT_TX_IPV4: tell the NIC it's an IPv4 packet. Required for L4
     checksum offload or TSO.

   - PKT_TX_IPV6: tell the NIC it's an IPv6 packet. Required for L4
     checksum offload or TSO.

I think it won't make a big difference in the FVL driver.


> let's use a few examples to demonstrate how to use these flags:
> Let say we have a tunnel packet: eth_hdr_out/ipv4_hdr_out/udp_hdr_out/vxlan_hdr/ehtr_hdr_in/ipv4_hdr_in/tcp_hdr_in.There could be several scenarios:
>
> A) User requests HW offload for ipv4_hdr_out checksum.
> He doesn't care is it a tunnelled packet or not.
> So he sets:
>
> mb->l2_len =  eth_hdr_out;
> mb->l3_len = ipv4_hdr_out;
> mb->ol_flags |= PKT_TX_IPV4_CSUM;
>
> B) User is aware that it is a tunnelled packet and requests HW offload for ipv4_hdr_in and tcp_hdr_in *only*.
> He doesn't care about outer IP checksum offload.
> In that case, for FVL  he has 2 choices:
>     1. Treat that packet as a 'proper' tunnelled packet, and fill all the fields:
>       mb->l2_len =  eth_hdr_in;
>       mb->l3_len = ipv4_hdr_in;
>       mb->outer_l2_len = eth_hdr_out;
>       mb->outer_l3_len = ipv4_hdr_out;
>       mb->l4tun_len = vxlan_hdr;
>       mb->ol_flags |= PKT_TX_UDP_TUNNEL_PKT | PKT_TX_IP_CKSUM |  PKT_TX_TCP_CKSUM;
>
>     2. As user doesn't care about outer IP hdr checksum, he can treat everything before ipv4_hdr_in as L2 header.
>     So he knows, that it is a tunnelled packet, but makes HW to treat it as ordinary (non-tunnelled) packet:
>       mb->l2_len = eth_hdr_out + ipv4_hdr_out + udp_hdr_out + vxlan_hdr + ehtr_hdr_in;
>       mb->l3_len = ipv4_hdr_in;
>       mb->ol_flags |= PKT_TX_IP_CKSUM |  PKT_TX_TCP_CKSUM;
>
> i40e PMD will support both B.1 and B.2.
> ixgbe/igb/em PMD supports only B.2.
> if HW supports both - it will be up to user app which method to choose.

I think we should have a flag to advertise outer ip and outer udp
checksum offload support, so the application knows which mode can
be used.


Regards,
Olivier



More information about the dev mailing list