82599 网卡 DPDK vxlan inner L4 checksum offload

本文详细介绍了如何通过IXGBE驱动将内层报文的Checksum计算任务Offload到网卡,涉及DPDK mbuf结构的调整和OL_FLAGS配置,以及VxLAN报文的UDP checksum处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

思想

以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。

参考:dpdk mbuf lib

参考

https://decodezp.github.io/2019/07/16/test15-dpdk-vxlan-csum-offload/
### OVS-DPDKVXLAN集成 #### 配置环境准备 为了实现Open vSwitch (OVS) 和 Data Plane Development Kit (DPDK) 的 VXLAN 功能,需确保操作系统内核支持 IOMMU 并已启用 Hugepages。这些设置对于提高性能至关重要[^1]。 #### 安装依赖包 在配置之前,应先安装必要的软件包: ```bash sudo apt-get update && sudo apt-get install -y \ build-essential libssl-dev libffi-dev python-dev \ python-pip bridge-utils iputils-ping net-tools ethtool \ linux-headers-$(uname -r) ``` #### 编译并安装OVS-DPDK 获取最新版源码编译安装带有 DPDK 支持的 Open vSwitch 版本非常重要。这一步骤能保证获得最新的特性和修复的安全漏洞。 ```bash git clone https://github.com/openvswitch/ovs.git cd ovs ./boot.sh ./configure --with-dpdk=/usr/local/ make sudo make install ``` #### 启动OVS服务 启动前要确认 `dpdk-init` 已经被加载到 `/etc/default/openvswitch-switch` 文件中,并设置了适当数量的巨大页数。 ```bash sudo systemctl enable openvswitch-switch sudo systemctl start openvswitch-switch ``` #### 设置HugePages 编辑 grub 参数来增加 hugepage 数量: ```bash echo 'default_hugepagesz=1G hugepagesz=1G hugepages=4' | sudo tee -a /etc/default/grub sudo update-grub reboot ``` #### 创建VXLAN隧道端口 创建基于 DPDKVXLAN 接口用于跨物理位置的数据中心间通信。 ```bash ovs-vsctl add-br br0 -- set Bridge br0 datapath_type=netdev ovs-vsctl add-port br0 dpdk0 -- set Interface dpdk0 type=dpdk options:dpdk-devargs=0000:0b:00.0 ovs-vsctl add-port br0 vxlan0 -- set interface vxlan0 type=vxlan options:remote_ip=<REMOTE_IP> options:key=flow ``` 以上命令假设远程 IP 地址 `<REMOTE_IP>` 是目标数据中心内的另一台服务器地址;实际操作时请替换为具体数值。 #### 测试连接性 通过 ping 或者其他网络诊断工具验证两个站点之间的连通性是否正常工作。 ```bash ping <REMOTE_IP> ``` 如果一切顺利,则表明已经成功完成了 OVS-DPDKVXLAN 的集成配置过程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值