思想
以IXGBE驱动为例,看一下如何让把内层报文Checksum的计算Offload给网卡。
本质上来说,是在DPDK的mbuf结构中:
将L2 Header的长度配置为外层VxLAN报文+内层L2 Header的总长度,这样对网卡来说,该mbuf对应的报文就是一个L2 Header长得令人发指的普通非隧道报文。
但是这样就可以计算内层L3/L4 Header的Checksum了。
ixgbe_tx_offload
在DPDK的IXGBE驱动代码中有如下结构体:
/** Offload features */
union ixgbe_tx_offload {
uint64_t data[2];
struct {
uint64_t l2_len:7; /**< L2 (MAC) Header Length. */
uint64_t l3_len:9; /**< L3 (IP) Header Length. */
uint64_t l4_len:8; /**< L4 (TCP/UDP) Header Length. */
uint64_t tso_segsz:16; /**< TCP TSO segment size */
uint64_t vlan_tci:16;
/**< VLAN Tag Control Identifier (CPU order). */
/* fields for TX offloading of tunnels */
uint64_t outer_l3_len:8; /**< Outer L3 (IP) Hdr Length. */
uint64_t outer_l2_len:8; /**< Outer L2 (MAC) Hdr Length. */
#ifdef RTE_LIBRTE_SECURITY
/* inline ipsec related*/
uint64_t sa_idx:8; /**< TX SA database entry index */
uint64_t sec_pad_len:4; /**< padding length */
#endif
};
};
这里面l2_len是占了7个比特位,也就是说你外层报文头长度+内层L2 Header长度不要大于127Byte。
另外代码中还有一些ol_flags的配置,也需要结合需求一起配置。
ol_flags
ol_flags: offload features flag.
网卡支持的 offload 特性 和 Mbuf 的 ol_flags 标记对应。
1》网卡支持 TX_OFFLOAD_IPV4_CKSUM
说明网卡支持 发包的tx ipv4 checksum,那么就可以给 mbuf 的 ol_flags 设置上 PKT_TX_IPV4 | PKT_TX_IP_CSUM 标记。
在网卡发包时,发现mbuf存在这样的标记 && 自身支持 tx ipv4 offload ,就会进行 tx ipv4 offload.
对于 vxlan报文:
外层的 UDP的checksum也可以不进行软件计算,直接设置为0.
内层的 TCP/UDP 的checksum 通过 rte_ipv4_phdr_cksum 计算伪头的checksum, 然后进行offload。
参考
https://decodezp.github.io/2019/07/16/test15-dpdk-vxlan-csum-offload/