DOCA 文档 v2.10.0

BlueField 上的虚拟交换机

注意

有关使用 ASAP² direct 进行 OVS 卸载的通用信息,请参阅 MLNX_OFED 文档中“OVS Offload Using ASAP² Direct”部分。

注意

ASAP2 仅在嵌入式 (DPU) 模式下受支持。

NVIDIA® BlueField® 网络平台(DPU 或 SuperNIC)支持 ASAP2 技术。它利用了上一节中提到的表示器。BlueField 软件包包含 OVS 安装,该安装已支持 ASAP2。在 Arm 内核上运行的虚拟交换机允许我们将所有往返于主机功能的流量通过 Arm 内核,同时执行 OVS 支持的所有操作。ASAP2 允许我们通过编程 NIC 嵌入式交换机来卸载数据路径,从而避免了将每个数据包都通过 Arm 内核的需求。控制平面与使用标准 OVS 的情况相同。

OVS 网桥在 BFB 安装后首次启动 BlueField 时默认创建。

如果需要手动配置 OVS 网桥的默认设置,请运行

复制
已复制!
            

systemctl start openvswitch-switch.service ovs-vsctl add-port ovsbr1 p0 ovs-vsctl add-port ovsbr1 pf0hpf ovs-vsctl add-port ovsbr2 p1 ovs-vsctl add-port ovsbr2 pf1hpf

要验证桥接是否成功

复制
已复制!
            

$ ovs-vsctl show 9f635bd1-a9fd-4f30-9bdc-b3fa21f8940a Bridge ovsbr2 Port ovsbr2 Interface ovsbr2 type: internal Port p1 Interface p1 Port pf1sf0 Interface en3f1pf1sf0       Port pf1hpf Interface pf1hpf Bridge ovsbr1 Port pf0hpf Interface pf0hpf Port p0 Interface p0 Port ovsbr1 Interface ovsbr1 type: internal Port pf0sf0 Interface en3f0pf0sf0 ovs_version: "2.14.1"

主机现在已连接到网络。

注意

TC 卸载不支持 IPv6 分片数据包。要使 IPv6 分片数据包通过 OVS,特定端口的 MTU 必须设置为等于或大于分片数据包大小。IPv4 分片数据包可以进行 TC 卸载,因为 OVS 不会检查其数据包大小。

当 BlueField 连接到另一台机器上的另一个 BlueField 时,手动为连接的两端分配具有相同子网的 IP 地址。

  1. 假设链接连接到另一台主机上的 p3p1,请运行

    复制
    已复制!
                

    $ ifconfig p3p1 192.168.200.1/24 up

  2. 在 BlueField 连接到的主机上,运行

    复制
    已复制!
                

    $ ifconfig p4p2 192.168.200.2/24 up

  3. 让一方 ping 另一方。这是 BlueField ping 主机的示例

    复制
    已复制!
                

    $ ping 192.168.200.1

BlueFIeld-2 设备上配置了两个 SF,enp3s0f0s0enp3s0f1s0,它们的表示器是内置网桥的一部分。如果 DHCP 服务器存在,这些接口将从 DHCP 服务器获取 IP 地址。否则,可以从主机配置 IP 地址。可以通过 SF netdev 接口访问 BlueField。

例如

  1. 验证默认 OVS 配置。运行

    复制
    已复制!
                

    # ovs-vsctl show 5668f9a6-6b93-49cf-a72a-14fd64b4c82b Bridge ovsbr1 Port pf0hpf Interface pf0hpf Port ovsbr1 Interface ovsbr1 type: internal Port p0 Interface p0 Port en3f0pf0sf0            Interface en3f0pf0sf0 Bridge ovsbr2 Port en3f1pf1sf0 Interface en3f1pf1sf0 Port ovsbr2 Interface ovsbr2 type: internal Port pf1hpf Interface pf1hpf Port p1 Interface p1 ovs_version: "2.14.1"

  2. 验证 SF netdev 是否从 DHCP 服务器接收到 IP 地址。如果没有,则分配静态 IP。运行

    复制
    已复制!
                

    # ifconfig enp3s0f0s0 enp3s0f0s0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.200.125 netmask 255.255.255.0 broadcast 192.168.200.255 inet6 fe80::8e:bcff:fe36:19bc prefixlen 64 scopeid 0x20<link> ether 02:8e:bc:36:19:bc txqueuelen 1000 (Ethernet) RX packets 3730 bytes 1217558 (1.1 MiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 22 bytes 2220 (2.1 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

  3. 验证配置的 IP 地址的连接。运行

    复制
    已复制!
                

    # ping 192.168.200.25 -c 5 PING 192.168.200.25 (192.168.200.25) 56(84) bytes of data. 64 bytes from 192.168.200.25: icmp_seq=1 ttl=64 time=0.228 ms 64 bytes from 192.168.200.25: icmp_seq=2 ttl=64 time=0.175 ms 64 bytes from 192.168.200.25: icmp_seq=3 ttl=64 time=0.232 ms 64 bytes from 192.168.200.25: icmp_seq=4 ttl=64 time=0.174 ms 64 bytes from 192.168.200.25: icmp_seq=5 ttl=64 time=0.168 ms   --- 192.168.200.25 ping statistics --- 5 packets transmitted, 5 received, 0% packet loss, time 91ms rtt min/avg/max/mdev = 0.168/0.195/0.232/0.031 ms

要在 Windows 端为 RShim 或物理网络适配器设置 IP 地址,请在命令提示符中运行以下命令

复制
已复制!
            

PS C:\Users\Administrator> New-NetIPAddress -InterfaceAlias "Ethernet 16" -IPAddress "192.168.100.1" -PrefixLength 22

要获取接口名称,请在命令提示符中运行以下命令

复制
已复制!
            

PS C:\Users\Administrator> Get-NetAdapter

输出应提供与描述匹配的接口名称(例如,NVIDIA BlueField 管理网络适配器)。

复制
已复制!
            

Ethernet 2 NVIDIA ConnectX-4 Lx Ethernet Adapter 6 Not Present 24-8A-07-0D-E8-1D Ethernet 6 NVIDIA ConnectX-4 Lx Ethernet Ad...#2 23 Not Present 24-8A-07-0D-E8-1C Ethernet 16 NVIDIA BlueField Management Netw...#2 15 Up CA-FE-01-CA-FE-02

设置 IP 地址后,让一方 ping 另一方。

复制
已复制!
            

C:\Windows\system32>ping 192.168.100.2     Pinging 192.168.100.2 with 32 bytes of data: Reply from 192.168.100.2: bytes=32 time=148ms TTL=64 Reply from 192.168.100.2: bytes=32 time=152ms TTL=64 Reply from 192.168.100.2: bytes=32 time=158ms TTL=64 Reply from 192.168.100.2: bytes=32 time=158ms TTL=64

OVS 硬件卸载在安装后首次启动时由 /sbin/mlnx_bf_configure 脚本默认设置。

  1. 在相关接口上启用 TC 卸载。运行

    复制
    已复制!
                

    $ ethtool -K <PF> hw-tc-offload on

  2. 启用硬件卸载:运行以下命令(在启用硬件卸载后)

    复制
    已复制!
                

    $ ovs-vsctl set Open_vSwitch . Other_config:hw-offload=true

  3. 需要重启 OVS 才能应用配置

    • 对于 Ubuntu

      复制
      已复制!
                  

      $ systemctl restart openvswitch-switch

    • 对于 CentOS/RHEL

      复制
      已复制!
                  

      $ systemctl restart openvswitch

显示 OVS 配置

复制
已复制!
            

$ ovs-dpctl show system@ovs-system: lookups: hit:0 missed:0 lost:0 flows: 0 masks: hit:0 total:0 hit/pkt:0.00 port 0: ovs-system (internal) port 1: armbr1 (internal) port 2: p0 port 3: pf0hpf port 4: pf0vf0 port 5: pf0vf1 port 6: pf0vf2

此时,OVS 将自动尝试卸载所有规则。

要查看添加到 OVS 数据路径的所有规则

复制
已复制!
            

$ ovs-appctl dpctl/dump-flows

要查看卸载到硬件的规则

复制
已复制!
            

$ ovs-appctl dpctl/dump-flows type=offloaded

  1. 删除先前配置的 OVS 网桥。运行

    复制
    已复制!
                

    ovs-vsctl del-br <bridge-name>

    发出命令 ovs-vsctl show 以查看已配置的 OVS 网桥。

  2. 启用 Open vSwitch 服务。运行

    复制
    已复制!
                

    systemctl start openvswitch

  3. 配置巨页

    复制
    已复制!
                

    echo 1024 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages

  4. 配置 DPDK 套接字内存和限制。运行

    复制
    已复制!
                

    # ovs-vsctl set Open_vSwitch . other_config:dpdk-socket-limit=2048 # ovs-vsctl set Open_vSwitch . other_config:dpdk-socket-mem=2048

  5. 启用硬件卸载(默认禁用)。运行

    复制
    已复制!
                

    ovs-vsctl --no-wait set Open_vSwitch . other_config:dpdk-init=true ovs-vsctl --no-wait set Open_vSwitch . other_config:hw-offload=true

  6. 配置 DPDK 白名单。运行

    复制
    已复制!
                

    ovs-vsctl set Open_vSwitch . other_config:dpdk-extra="-a 0000:03:00.0,representor=[0,65535],dv_flow_en=1,dv_xmeta_en=1,sys_mem_en=1"

  7. 创建 OVS-DPDK 网桥。运行

    复制
    已复制!
                

    ovs-vsctl add-br br0-ovs -- set Bridge br0-ovs datapath_type=netdev -- br-set-external-id br0-ovs bridge-id br0-ovs -- set bridge br0-ovs fail-mode=standalone

  8. 将 PF 添加到 OVS。运行

    复制
    已复制!
                

    ovs-vsctl add-port br0-ovs p0 -- set Interface p0 type=dpdk options:dpdk-devargs=0000:03:00.0

  9. 将表示器添加到 OVS。运行

    复制
    已复制!
                

    ovs-vsctl add-port br0-ovs pf0vf0 -- set Interface pf0vf0 type=dpdk options:dpdk-devargs=0000:03:00.0,representor=[0] ovs-vsctl add-port br0-ovs pf0hpf -- set Interface pf0hpf type=dpdk options:dpdk-devargs=0000:03:00.0,representor=[65535]

  10. 重启 Open vSwitch 服务。此步骤是硬件卸载更改生效所必需的。

    • 对于 CentOS,运行

      复制
      已复制!
                  

      systemctl restart openvswitch

    • 对于 Debian/Ubuntu,运行

      复制
      已复制!
                  

      systemctl restart openvswitch-switch

有关 BlueField-2 设备的参考设置配置,请参阅文章“使用 BlueField-2 配置 OVS-DPDK 卸载”。

  1. 配置巨页。运行

    复制
    已复制!
                

    echo 1024 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages

  2. 运行 testpmd。

    • 对于 Ubuntu/Debian

      复制
      已复制!
                  

      env LD_LIBRARY_PATH=/opt/mellanox/dpdk/lib/aarch64-linux-gnu /opt/mellanox/dpdk/bin/dpdk-testpmd -a 03:00.0,representor=[0,65535] --socket-mem=1024 -- --total-num-mbufs=131000 -i

    • 对于 CentOS

      复制
      已复制!
                  

      env LD_LIBRARY_PATH=/opt/mellanox/dpdk/lib64/ /opt/mellanox/dpdk/bin/dpdk-testpmd -a 03:00.0,representor=[0,65535] --socket-mem=1024 -- --total-num-mbufs=131000 -i

有关包含端口显示的详细步骤,请参阅文章“在 BlueField-2 上配置 DPDK 并运行 testpmd”。

OVS 的老化超时以毫秒为单位给出,可以通过运行以下命令进行配置

复制
已复制!
            

$ ovs-vsctl set Open_vSwitch . other_config:max-idle=30000

此功能支持跟踪连接并存储有关这些连接状态的信息。当与 OVS 一起使用时,BlueField 可以卸载连接跟踪,以便已建立连接的流量绕过内核并直接进入硬件。

连接跟踪卸载同时支持源 NAT (SNAT) 和目标 NAT (DNAT)。

配置连接跟踪卸载

本节提供了一个配置 OVS 以卸载主机 PF0 的所有 IP 连接的示例。

  1. 启用 OVS 硬件卸载.

  2. 创建 OVS 连接跟踪网桥。运行

    复制
    已复制!
                

    $ ovs-vsctl add-br ctBr

  3. 将 p0 和 pf0hpf 添加到网桥。运行

    复制
    已复制!
                

    $ ovs-vsctl add-port ctBr p0 $ ovs-vsctl add-port ctBr pf0hpf

  4. 配置 ARP 数据包以正常运行。不符合的数据包将路由到表 1。运行

    复制
    已复制!
                

    $ ovs-ofctl add-flow ctBr "table=0,arp,action=normal" $ ovs-ofctl add-flow ctBr "table=0,ip,ct_state=-trk,action=ct(table=1)"

  5. 配置 RoCEv2 数据包以正常运行。RoCEv2 数据包遵循 UDP 端口 4791 和连接每个方向上的不同源端口。CT 不支持 RoCE 流量。为了从主机运行 RoCE,请在 ovs-ofctl add-flow ctBr "table=0,ip,ct_state=-trk,action=ct(table=1)" 之前添加以下行

    复制
    已复制!
                

    $ ovs-ofctl add-flow ctBr table=0,udp,tp_dst=4791,action=normal

    此规则允许 RoCEv2 UDP 数据包跳过连接跟踪规则。

  6. 配置新建立的流以允许进入连接跟踪网桥,然后正常运行。运行

    复制
    已复制!
                

    $ ovs-ofctl add-flow ctBr "table=1,priority=1,ip,ct_state=+trk+new,action=ct(commit),normal"

  7. 设置已建立的流以正常运行。运行

    复制
    已复制!
                

    $ ovs-ofctl add-flow ctBr "table=1,priority=1,ip,ct_state=+trk+est,action=normal"

使用 NAT 进行连接跟踪

本节提供了一个配置 OVS 以卸载主机 PF0 的所有 IP 连接并执行源网络地址转换 (SNAT) 的示例。服务器主机通过源 IP 从 2.2.2.1 向另一台主机上的 1.1.1.2 发送流量。Arm 执行 SNAT 并将源 IP 更改为 1.1.1.16。请注意,必须配置静态 ARP 或路由表才能找到该路由。

  1. 配置未跟踪的 IP 数据包以执行 nat。运行

    复制
    已复制!
                

    ovs-ofctl add-flow ctBr "table=0,ip,ct_state=-trk,action=ct(table=1,nat)"

  2. 配置新建立的流以执行 SNAT,并将源 IP 更改为 1.1.1.16。运行

    复制
    已复制!
                

    ovs-ofctl add-flow ctBr "table=1,in_port=pf0hpf,ip,ct_state=+trk+new,action=ct(commit,nat(src=1.1.1.16)), p0"

  3. 配置已建立的流以正常运行。运行

    复制
    已复制!
                

    ovs-ofctl add-flow ctBr "table=1,ip,ct_state=+trk+est,action=normal"

    Conntrack 显示已应用 SNAT 的连接。对于 Ubuntu 22.04 内核,运行 conntrack -L;对于较旧的内核版本,运行 cat /proc/net/nf_conntrack。示例输出

    复制
    已复制!
                

    ipv4 2 tcp 6 src=2.2.2.1 dst=1.1.1.2 sport=34541 dport=5001 src=1.1.1.2 dst=1.1.1.16 sport=5001 dport=34541 [OFFLOAD] mark=0 zone=1 use=3

查询连接跟踪卸载状态

从服务器主机(例如,iperf)在 PF0 上启动具有外部网络的流量。请注意,只有已建立的连接才能被卸载。TCP 应已完成握手,UDP 应已收到回复。

注意

当前不支持 ICMP。

要检查是否从 Arm 卸载了特定连接,对于 Ubuntu 22.04 内核,运行 conntrack -L;对于较旧的内核版本,运行 cat /proc/net/nf_conntrack

以下是卸载的 TCP 连接的示例输出

复制
已复制!
            

ipv4 2 tcp 6 src=1.1.1.2 dst=1.1.1.3 sport=51888 dport=5001 src=1.1.1.3 dst=1.1.1.2 sport=5001 dport=51888 [HW_OFFLOAD] mark=0 zone=0 use=3


基于流量模式的性能调整

卸载的流(包括连接跟踪)被添加到虚拟交换机 FDB 流表中。FDB 表具有一组流组。每个流组保存相同的流量模式流。例如,对于连接跟踪卸载的流,TCP 和 UDP 是不同的流量模式,它们最终会进入两个不同的流组。

流组具有保存流条目的有限大小。默认情况下,驱动程序有 4 个大型 FDB 流组。每个大型流组最多可以保存 4000000/(4+1)=800k 个不同的 5 元组流条目。对于具有超过 4 种流量模式的场景,驱动程序提供了一个模块参数 (num_of_groups) 以允许自定义和性能调整。

注意

每个大型流组的大小可以根据公式计算:大小 = 4000000/(num_of_groups+1)

要更改大型 FDB 流组的数量,请运行

复制
已复制!
            

$ echo <num_of_groups> > /sys/module/mlx5_core/parameters/num_of_groups

如果 FDB 表内没有流(没有流量运行并且所有卸载的流都已老化),则更改立即生效,并且可以在不重新加载驱动程序的情况下动态更改。

如果在更改此参数时存在残留的卸载流,则新配置仅在所有流老化后生效。

连接跟踪老化

除了 OVS 的老化之外,连接跟踪卸载还有自己的老化机制,默认老化时间为 30 秒。

最大跟踪连接数

注意

默认情况下,跟踪的卸载连接的最大数量限制为 1M。

操作系统具有最大跟踪连接数的默认设置,可以通过运行以下命令进行配置

复制
已复制!
            

$ /sbin/sysctl -w net.netfilter.nf_conntrack_max=1000000

这会将最大跟踪连接数(包括卸载和非卸载)设置更改为 100 万。

以下选项指定了卸载连接数的限制。例如

复制
已复制!
            

# devlink dev param set pci/${pci_dev} name ct_max_offloaded_conns value $max cmode runtime

默认情况下,此值从 BlueFiled 设置为 100 万。用户可以使用 devlink 命令选择不同的数字。

注意

使用连接跟踪时,请确保 net.netfilter.nf_conntrack_tcp_be_liberal=1


OVS 允许虚拟交换机标记 VF 流量。

对于 BlueField,OVS 可以将 VLAN 标记(VLAN 推送)添加到主机上运行的网络接口(PF 或 VF)发送的所有数据包,并从从线路到该接口的流量中剥离 VLAN 标记(VLAN 弹出)。我们在此处以虚拟交换机标记 (VST) 模式运行。这意味着主机/VM 接口不知道 VLAN 标记。这些规则也可以卸载到硬件嵌入式交换机。

要配置 OVS 以推送/弹出 VLAN,您需要在添加表示器端口的 OVS 命令行中添加 tag=$TAG 部分。因此,如果您想使用 VLAN ID 52 标记 VF0 的所有流量,则在将其表示器添加到网桥时,应使用以下命令

复制
已复制!
            

$ ovs-vsctl add-port armbr1 pf0vf0 tag=52

注意

如果在配置 VLAN 之前虚拟端口已连接到网桥,则需要先将其删除

复制
已复制!
            

$ ovs-vsctl del-port pf0vf0

在这种情况下,VF 0 发送的所有流量都将具有相同的 VLAN 标记。当使用 TC 接口时,我们可以按流设置 VLAN 标记,这在“使用 TC 接口配置卸载规则”部分中进行了解释。

VXLAN 隧道在 Arm 端创建并附加到 OVS。VXLAN 解封装/封装行为类似于正常的 VXLAN 行为,包括通过 hw_offload=true

为了允许 VXLAN 封装,上行链路表示器 (p0) 的 MTU 值应至少比主机 PF/VF 的 MTU 值大 50 字节。有关更多信息,请参阅“配置上行链路 MTU”。

配置 VXLAN 隧道

  1. p0 视为本地 VXLAN 隧道接口(或 VTEP)。

    注意

    为了与以下示例保持一致,假设 p0 配置了 1.1.1.1 IPv4 地址。

  2. 从任何 OVS 网桥中删除 p0

  3. 在 OVS arm-ovs 上构建 VXLAN 隧道。运行

    复制
    已复制!
                

    ovs-vsctl add-br arm-ovs -- add-port arm-ovs vxlan11 -- set interface vxlan11 type=vxlan options:local_ip=1.1.1.1 options:remote_ip=1.1.1.2 options:key=100 options:dst_port=4789

  4. 连接任何主机表示器(例如,pf0hpf),VXLAN 希望其连接到同一个 arm-ovs 网桥。

  5. 将 VXLAN 使用的 VTEP (p0) 的 MTU 配置为至少比主机表示器的 MTU 大 50 字节。

此时,主机不知道 BlueField 的 OVS 完成的任何 VXLAN 操作。如果 VXLAN 隧道的远程端设置正确,则任何遍历 arm-ovs 的网络流量都会进行 VXLAN 封装/解封装。

查询 OVS VXLAN hw_offload 规则

运行以下命令

复制
已复制!
            

ovs-appctl dpctl/dump-flows type=offloaded in_port(2),eth(src=ae:fd:f3:31:7e:7b,dst=a2:fb:09:85:84:48),eth_type(0x0800), packets:1, bytes:98, used:0.900s, actions:set(tunnel(tun_id=0x64,src=1.1.1.1,dst=1.1.1.2,tp_dst=4789,flags(key))),3 tunnel(tun_id=0x64,src=1.1.1.2,dst=1.1.1.1,tp_dst=4789,flags(+key)),in_port(3),eth(src=a2:fb:09:85:84:48,dst=ae:fd:f3:31:7e:7b),eth_type(0x0800), packets:75, bytes:7350, used:0.900s, actions:2

注意

对于主机 PF,为了使 VXLAN 使用默认的 1500 MTU 正常工作,请按照以下步骤操作。

  1. 禁用主机 PF 作为 Arm 的端口所有者(请参阅“零信任模式”部分)。运行

    复制
    已复制!
                

    $ mlxprivhost -d /dev/mst/mt41682_pciconf0 --disable_port_owner r

  2. VXLAN 隧道端点(在上面的示例中为 pf0hpf)的 MTU 必须小于隧道接口 (p0) 的 MTU,以考虑 VXLAN 标头的大小。例如,您可以将 P0 的 MTU 设置为 2000。


GRE 隧道在 Arm 端创建并附加到 OVS。GRE 解封装/封装行为类似于正常的 GRE 行为,包括通过 hw_offload=true

为了允许 GRE 封装,上行链路表示器 (p0) 的 MTU 值应至少比主机 PF/VF 的 MTU 值大 50 字节。

有关更多信息,请参阅“配置上行链路 MTU”。

配置 GRE 隧道

  1. p0 视为本地 GRE 隧道接口。p0 不应附加到任何 OVS 网桥。

    注意

    为了与以下示例保持一致,假设 p0 配置了 1.1.1.1 IPv4 地址,并且隧道的远程端为 1.1.1.2。

  2. 创建一个 OVS 网桥 br0,其中包含一个 GRE 隧道接口 gre0。运行

    复制
    已复制!
                

    ovs-vsctl add-port br0 gre0 -- set interface gre0 type=gre options:local_ip=1.1.1.1 options:remote_ip=1.1.1.2 options:key=100

  3. pf0hpf 添加到 br0

    复制
    已复制!
                

    ovs-vsctl add-port br0 pf0hpf

  4. 此时,主机 PF0 发送或接收的任何网络流量都在 BlueField OS 内部进行 GRE 处理。

查询 OVS GRE hw_offload 规则

运行以下命令

复制
已复制!
            

ovs-appctl dpctl/dump-flows type=offloaded recirc_id(0),in_port(3),eth(src=50:6b:4b:2f:0b:74,dst=de:d0:a3:63:0b:30),eth_type(0x0800),ipv4(frag=no), packets:878, bytes:122802, used:0.440s, actions:set(tunnel(tun_id=0x64,src=1.1.1.1,dst=1.1.1.2,ttl=64,flags(key))),2 tunnel(tun_id=0x64,src=1.1.1.1,dst=1.1.1.2,flags(+key)),recirc_id(0),in_port(2),eth(src=de:d0:a3:63:0b:30,dst=50:6b:4b:2f:0b:74),eth_type(0x0800),ipv4(frag=no), packets:995, bytes:97510, used:0.440s, actions:3

注意

对于主机 PF,为了使 GRE 使用默认的 1500 MTU 正常工作,请按照以下步骤操作。

  1. 禁用主机 PF 作为 Arm 的端口所有者(请参阅“零信任模式”部分)。运行

    复制
    已复制!
                

    $ mlxprivhost -d /dev/mst/mt41682_pciconf0 --disable_port_owner r

  2. GRE 隧道端点(在上面的示例中为 pf0hpf)的 MTU 必须小于隧道接口 (p0) 的 MTU,以考虑 GRE 标头的大小。例如,您可以将 P0 的 MTU 设置为 2000。


GENEVE 隧道在 Arm 端创建并附加到 OVS。GENEVE 解封装/封装行为类似于正常的 GENEVE 行为,包括通过 hw_offload=true

为了允许 GENEVE 封装,上行链路表示器 (p0) 的 MTU 值必须至少比主机 PF/VF 的 MTU 值大 50 字节。

有关更多信息,请参阅“配置上行链路 MTU”。

配置 GENEVE 隧道

  1. p0 视为本地 GENEVE 隧道接口。p0 不应附加到任何 OVS 网桥。

  2. 创建一个 OVS 网桥 br0,其中包含一个 GENEVE 隧道接口 gnv0。运行

    复制
    已复制!
                

    ovs-vsctl add-port br0 gnv0 -- set interface gnv0 type=geneve options:local_ip=1.1.1.1 options:remote_ip=1.1.1.2 options:key=100

  3. pf0hpf 添加到 br0

    复制
    已复制!
                

    ovs-vsctl add-port br0 pf0hpf

  4. 此时,主机 PF0 发送或接收的任何网络流量都在 BlueField OS 内部进行 GENEVE 处理。

GENEVE 支持选项。例如,您可以将选项 0xea55 添加到隧道元数据,运行

复制
已复制!
            

ovs-ofctl add-tlv-map geneve_br "{class=0xffff,type=0x0,len=4}->tun_metadata0" ovs-ofctl add-flow geneve_br ip,actions="set_field:0xea55->tun_metadata0",normal

注意

对于主机 PF,为了使 GENEVE 使用默认的 1500 MTU 正常工作,请按照以下步骤操作。

  1. 禁用主机 PF 作为 Arm 的端口所有者(请参阅“零信任模式”部分)。运行

    复制
    已复制!
                

    $ mlxprivhost -d /dev/mst/mt41682_pciconf0 --disable_port_owner r

  2. GENEVE 隧道端点(在上面的示例中为 pf0hpf)的 MTU 必须小于隧道接口 (p0) 的 MTU,以考虑 GENEVE 标头的大小。例如,您可以将 P0 的 MTU 设置为 2000。


也可以直接添加卸载规则,而不仅仅是通过 OVS,使用 tc 实用程序。要在所有表示器(即上行链路、PF 和 VF)上启用 TC 入口。

复制
已复制!
            

$ tc qdisc add dev p0 ingress $ tc qdisc add dev pf0hpf ingress $ tc qdisc add dev pf0vf0 ingress

L2 规则示例

以下规则删除与给定源和目标 MAC 地址匹配的所有数据包。

复制
已复制!
            

$ tc filter add dev pf0hpf protocol ip parent ffff: \ flower \ skip_sw \ dst_mac e4:11:22:11:4a:51 \ src_mac e4:11:22:11:4a:50 \ action drop


VLAN 规则示例

以下规则将 VLAN ID 100 推送到从 VF0 发送到线路的数据包(并通过上行链路表示器转发),并在将数据包发送到 VF 时剥离 VLAN。

复制
已复制!
            

$ tc filter add dev pf0vf0 protocol 802.1Q parent ffff: \ flower \ skip_sw \ dst_mac e4:11:22:11:4a:51 \ src_mac e4:11:22:11:4a:50 \ action vlan push id 100 \ action mirred egress redirect dev p0   $ tc filter add dev p0 protocol 802.1Q parent ffff: \ flower \ skip_sw \ dst_mac e4:11:22:11:4a:51 \ src_mac e4:11:22:11:4a:50 \ vlan_ethtype 0x800 \ vlan_id 100 \ vlan_prio 0 \ action vlan pop \ action mirred egress redirect dev pf0vf0


VXLAN 封装/解封装示例

复制
已复制!
            

$ tc filter add dev pf0vf0 protocol 0x806 parent ffff: \ flower \ skip_sw \ dst_mac e4:11:22:11:4a:51 \ src_mac e4:11:22:11:4a:50 \ action tunnel_key set \ src_ip 20.1.12.1 \ dst_ip 20.1.11.1 \ id 100 \ action mirred egress redirect dev vxlan100   $ tc filter add dev vxlan100 protocol 0x806 parent ffff: \ flower \ skip_sw \ dst_mac e4:11:22:11:4a:51 \ src_mac e4:11:22:11:4a:50 \ enc_src_ip 20.1.11.1 \ enc_dst_ip 20.1.12.1 \ enc_key_id 100 \ enc_dst_port 4789 \ action tunnel_key unset \ action mirred egress redirect dev pf0vf0


有关配置步骤,请参阅 MLNX_OFED 文档中 “OVS Offload Using ASAP² Direct > VirtIO Acceleration through Hardware vDPA”部分。

© 版权所有 2025 NVIDIA。 上次更新于 2025 年 2 月 12 日。