DCF简介

点击上方蓝字

关注我们吧

作者:李晓云;王海跃;邢蓓蕾(按姓氏排名)

一、DCF的诞生背景

在虚拟化网络应用中,I/O虚拟化是虚拟化技术的重要组成部分。相比纯虚拟化和半虚拟化,PCIe的SRIOV和Intel 的VT-d技术结合为高性能虚拟化I/O提供了方案。现在大部分主流网卡都已经支持了SR-IOV技术。SR-IOV规范引入了两个新的PCIe Function类型:PF(Physical Function)和VF(Virtual Function,虚拟功能)。可以在PF上生成VF,每个VF接口都有其独立的PCIe通道,每个虚拟机可占用一个或多个VF接口,这样虚拟机就可以直接访问自己的VF接口,而不需要Hypervisor的参与,从而大幅提升网络吞吐性能。

而随着SDN 和NFV技术的不断发展及吞吐性能的要求,越来越多的VNF(Virtual Network Function)基于SRIOV VF来开发。DPDK作为VNF的开发基础套件,其VF的Polling Mode正在被广泛使用, 同时PF作为配置面和管理面仍被首选使用Kernel Driver来控制。

Intel网卡一般的工作模式是PF driver 来访问/控制硬件资源,虚机中VF 所获得的资源则有PF 来分配。VF获得资源的渠道有两种:

  1. 可由虚机中的VF去配置。除了DMA相关的快速通道直接访问硬件以外,VF申请的资源需要由PF driver来仲裁和代理配置。PF和VF通过硬件提供的通道(Mailbox Queue)进行通信。

  2. 主机侧通过标准配置工具分配,比如Linux 系统中的ip link, tc 等。

随着产品的更新迭代,新一代Intel网卡(800 系列)提供了越来越多的灵活功能可以用来加速VNF,比如DDP (Dynamic Device Personalization),QoS等。这时标准的Linux tool缺乏相应的接口来控制。而DPDK作为Network Function开发的基础,拥有丰富的接口。那是不是可以由DPDK来完成这部分配置呢?

如果DPDK完成,脱离了Linux的标准接口,利用设备的配置空间以及User Space Driver的框架,是不是可以来控制硬件呢?答案是肯定的,这就是下面要讲的DCF(Device Config Function)。

二、DCF简介

DCF(Device Config Function)是设备控制功能,可以理解为升级版的可信VF(trust VF)。目前支持将Intel E800系列网卡的每个端口的可信VF 0设置为DCF,为该端口的其他VF配置如Switch,ACL之类的流表规则。在此之前,没有灵活可扩展的途径可以通过VF配置Switch,ACL的流表规则,只能通过如图1中路径2,由TC Flower之类的工具通过PF配置一些简单的协议规则。

图1: DCF示意图

如图1中路径1所示,在NFV环境下,远端的VIM(Virtualized Infrastructure Manager)通过向用户空间的DCF PMD配置规则,实现对于虚拟机中使用的VF的流表规则的配置。在这个过程中,PF的内核驱动负责管理DCF,包括赋予以及回收DCF的权限,为DCF提供一些必要的准备信息,以及DCF的正常/异常退出之后的现存规则的处理等。而可信VF 0在与PF的Kernel Driver通信,申请到DCF的权限之后,将收到的对于VF设置的规则封装成AdminQ Command的格式,通过Virtual Channel的消息传递给PF,PF收到后会判断Command是否在白名单内,如果在,则直接执行该AdminQ Command到硬件,实现对VF的规则配置。

三、如何使用DCF

如前文所述,DCF实际上就是可信任的VF 0,可以为其他VF提供Switch,ACL之类的流规则配置(DPDK 20.11可支持ACL)。使用DCF,需要Intel E800系列网卡的Kernel Driver和DPDK配合使用,需要内核驱动版本在1.0.4之上,DPDK的版本在20.05以上。

以端口enp24s0f0 (18:00.0)为例,下面是创建DCF,并使用DCF创建规则的具体步骤:

首先,需要创建并启动DCF。

1.为端口生成4个VF

echo 4 > /sys/bus/pci/devices/0000\:18\:00.0/sriov_numvfs

2.设置VF 0为可信任的VF

ip link set dev enp24s0f0 vf 0 trust on

3. 将VF 0绑定到DPDK并为其申请DCF权限

./usertools/dpdk-devbind.py -b vfio-pci 18:01.0

./build/app/dpdk-testpmd -l 22-25 -n 4 -w 18:01.0,cap=dcf -- -i

接下来,就可以验证DCF的功能,如图2所示,VF 0是DCF,不管其他VF加载的是DPDK的驱动(VF 1)还是kernel驱动(VF 2),都可以通过DCF创建规则,将流导向它们。

图2: DCF示例图

1.  在DCF中创建规则,将特定的流导向VF 1和VF 2

  • 创建规则1,将所有dst mac是68:05:ca:8d:ed:a8 ,ipv4 src ip是192.168.0.1,ipv4 dst ip是192.168.0.2,tos是4,ttl是3,tcp src port是25,tcp dst port是23的数据包发到VF 1

    testpmd> flow create 0 ingress pattern eth dst is 68:05:ca:8d:ed:a8 / ipv4 src is 192.168.0.1 dst is 192.168.0.2 tos is 4 ttl is 3 / tcp src is 25 dst is 23 / end actions vf id 1 / end

  • 创建规则2,将所有outer ipv4 dst ip是192.168.0.1,nvgre tni是8,inner ipv4 src ip是192.168.0.2,inner ipv4 dst ip是192.168.0.3,inner udp src port是50,inner udp dst port是23的tunnel数据包发到VF 2

    testpmd > flow create 0 ingress pattern eth / ipv4 dst is 192.168.0.1 / nvgre tni is 0x8 / eth / ipv4 src is 192.168.0.2 dst is 192.168.0.3 / udp src is 50 dst is 23 / end actions vf id 1 / end

2. 观察VF 1和VF 2是否可以收到匹配规则的数据包

  • 用DPDK观察VF 1(18:01.1),可以看到匹配上述规则1的数据包都可以被VF 1收到

    ./build/app/dpdk-testpmd -l 22-25 -n 4 -w 18:01.1 -- -i

    testpmd > set fwd rxonly

    testpmd > set verbose 1

    testpmd > start

  • 用tcpdump观察VF 2(enp24s1f2),可以看到匹配上述规则2的数据包都可以被VF 2收到

    tcpdump -e -nn -i enp24s1f2

四、DCF下一步的发展方向

目前,DCF只支持Intel E800系列网卡的每个端口将VF 0作为DCF,用来为其他VF下发Switch,ACL规则。但随着需求的变化和增长,DCF主要有三个方向的发展正在进行中。第一点是未来DCF将支持QoS的功能;第二点是未来将可以指定任意VF作为DCF;最后一点是未来可以存在多个DCF,每个DCF负责一个VF域,为该域中的所有VF配置流规则。

转载须知

DPDK与SPDK开源社区公众号文章转载声明

推荐阅读

CVL网卡的ADQ特性在SPDK的NVMF测试中的应用实例 - 上篇

CVL网卡的ADQ特性在SPDK的NVMF测试中的应用实例 - 下篇

点点“分享”,给我充点儿电吧~

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值