【问题标题】:x710 VF use dpdk rte_flow_valida() return Function not implementedx710 VF 使用 dpdk rte_flow_valida() 返回函数未实现
【发布时间】:2021-09-17 02:27:15
【问题描述】:

操作系统:CentOS 7.3

DPDK:19.08

我使用一个X710网卡,在内核驱动i40e中创建2个VF,并在VF 0上绑定vfio-pci驱动并启动一个DPDK PMD应用程序。

然后我尝试使用rte_flow 创建一个流规则,但是当我调用rte_flow_validate() 时它返回-38,功能未实现

是不是表示这个VF不支持rte_flow API?还是需要在 VF 上设置一些配置或标志?

【问题讨论】:

  • 请分享代码 sn-p 以了解您尝试从 VF NIC 卸载哪些功能?
  • 请澄清您的具体问题或提供其他详细信息以准确突出您的需求。正如目前所写的那样,很难准确地说出你在问什么。

标签: virtualization dpdk


【解决方案1】:

X710 (Fortville) NIC 的 PF 和 VF 都支持 DPDK RTE_FLOW,操作如下:

  1. RTE_FLOW_ACTION_TYPE_QUEUE
  2. RTE_FLOW_ACTION_TYPE_DROP
  3. RTE_FLOW_ACTION_TYPE_PASSTHRU
  4. RTE_FLOW_ACTION_TYPE_MARK
  5. RTE_FLOW_ACTION_TYPE_RSS

DPDK API 的返回值-38 不是Function not implemented,实际上是I40E_ERR_OPCODE_MISMATCH。这意味着查找参数或匹配案例配置不正确。适用于 X710 VF 的代码片段,分享如下

/* configure for 2 RX queues */

struct rte_flow_attr attr = { .ingress = 1 };
struct rte_flow_item pattern[10];
struct rte_flow_action actions[10];
struct rte_flow_item_eth eth;
struct rte_flow_item_eth eth_mask;
struct rte_flow_item_vlan vlan;
struct rte_flow_item_vlan vlan_mask;
struct rte_flow_item_ipv4 ipv4;
struct rte_flow_item_ipv4 ipv4_mask;
struct rte_flow *flow;
struct rte_flow_action_mark mark = { .id = 0xdeadbeef };
struct rte_flow_action_queue queue = { .index = 0x3 };

memset(&pattern, 0, sizeof(pattern));
memset(&actions, 0, sizeof(actions));
memset(&attr, 0, sizeof(attr));
attr.group = 0;
attr.priority = 0;
attr.ingress = 1;
attr.egress = 0;

memset(&eth_mask, 0, sizeof(struct rte_flow_item_eth));
pattern[0].type = RTE_FLOW_ITEM_TYPE_ETH;
pattern[0].spec = ð
pattern[0].last = NULL;
pattern[0].mask = NULL;

memset(&vlan_mask, 0, sizeof(struct rte_flow_item_vlan));
pattern[1].type = RTE_FLOW_ITEM_TYPE_VLAN;
pattern[1].spec = &vlan;
pattern[1].last = NULL;
pattern[1].mask = NULL;


/* set the dst ipv4 packet to the required value */
pattern[1].type = RTE_FLOW_ITEM_TYPE_IPV4;
pattern[1].spec = NULL;
pattern[1].last = NULL;
pattern[1].mask = NULL;

pattern[2].type = RTE_FLOW_ITEM_TYPE_UDP;
pattern[2].spec = NULL;
pattern[2].last = NULL;
pattern[2].mask = NULL;

/* end the pattern array */
pattern[3].type = RTE_FLOW_ITEM_TYPE_END;

/* create the drop action */
actions[0].type = RTE_FLOW_ACTION_TYPE_MARK;
actions[0].conf = &mark;
actions[1].type = RTE_FLOW_ACTION_TYPE_END;

注意:在 cmets 中请求 @myzhu 以共享实际代码 sn-p 以解决问题的根本原因。

【讨论】:

  • 谢谢你,varghese。我只是使用 dpdk 示例
  • 示例:Flow_filtering 并且什么都不做。它今天工作一次,但现在不再工作
  • @myzhu 你是说我共享的示例代码工作一次然后就没有工作了吗?如果是,则 VF 使用有问题。我们可以进行实时调试吗?
  • 不,@Vipin Varghese,我的意思是 DPDK 源代码中的 RTE_FLOW 示例----flow_filtering。我在内核模式下创建 VF 并使用 dpdk-devbind.py 在 vfio-pci 中绑定一个 VF,然后在其上运行 flow_filtering。我在使用 vf 并设置 VF 信任之前先调高 pf。
  • 啊,好的,@myzhu 你说的是,通过答案中给出的示例代码,你可以使流过滤工作。是对的吗?如果没有,我很乐意检查(实时调试)/相同的代码 sn-p 在 X710 上与 VF 一起使用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-06-19
  • 1970-01-01
  • 2021-06-27
相关资源
最近更新 更多