C语言 使用DPDK剥离MPLS报头

oprakyz7  于 2022-12-03  发布在  其他
关注(0)|答案(1)|浏览(160)

我正在尝试使用DPDK剥离MPLS报头,我已经使用flow_filtering示例应用程序作为开始,并尝试在模式中添加另一项:以太网MPLS IPv4 END,我添加了以下操作:RTE_FLOW_ACTION_TYPE_OF_POP_MPLS RTE_FLOW_ACTION_TYPE_END但在执行代码时会引发以下错误:无法创建流16消息:不支持的操作。
下面是代码片段:

action[0].type = RTE_FLOW_ACTION_TYPE_OF_POP_MPLS;
    action[1].type = RTE_FLOW_ACTION_TYPE_END;

    
    pattern[0].type = RTE_FLOW_ITEM_TYPE_ETH;

    pattern[1].type = RTE_FLOW_ITEM_TYPE_MPLS;
    
    memset(&ip_spec, 0, sizeof(struct rte_flow_item_ipv4));
    memset(&ip_mask, 0, sizeof(struct rte_flow_item_ipv4));
    ip_spec.hdr.dst_addr = htonl(dest_ip);
    ip_mask.hdr.dst_addr = dest_mask;
    ip_spec.hdr.src_addr = htonl(src_ip);
    ip_mask.hdr.src_addr = src_mask;
    pattern[2].type = RTE_FLOW_ITEM_TYPE_IPV4;
    pattern[2].spec = &ip_spec;
    pattern[2].mask = &ip_mask;

    pattern[3].type = RTE_FLOW_ITEM_TYPE_END;

    res = rte_flow_validate(port_id, &attr, pattern, action, error);

通过删除模式[1]。类型= RTE_FLOW_ITEM_TYPE_MPLS;操作[0]。类型= POP MPLS的路由流操作类型;.代码工作正常。
我试图改变模式中的MPLS顺序,即使MPLS头驻留在L2和L3层之间,但没有使用。
版本号:
Linux操作系统:CentOS 7
DPDK日期:19.08.2
网卡:X520
固件版本:18.5.17

roejwanj

roejwanj1#

对于Intel NIC X520,错误消息***Flow cannot be created 16(无法创建流)消息:不支持的操作***是正确的预期行为。因此DPDK IXGBE PMD驱动程序中没有问题。
说明:

  1. RTE_FLOW是基于硬件卸载的NIC,用于过滤和修改入口和出口方向的数据包,更多详细信息here
    1.有多个过滤器标签(如vlan,IP,TCP,UDP,MPLS)沿着各种操作项(push pop vlan,push pop mpsl,dec inc mpls ttl,...等)。但不是所有的过滤器和操作都被所有的NIC支持(因为这些是可选的)。
    1.请参阅***表1.3网络驱动程序中rte_flow操作的可用性***(链接here),该表将每个NIC PMDMap到操作。未显示IXGBE以支持MPLS操作。
    1.检查PMD代码here,甚至显示支持的过滤器字段。
const struct rte_flow_item_ipv4 *ipv4_spec;
    const struct rte_flow_item_ipv4 *ipv4_mask;
    const struct rte_flow_item_tcp *tcp_spec;
    const struct rte_flow_item_tcp *tcp_mask;
    const struct rte_flow_item_udp *udp_spec;
    const struct rte_flow_item_udp *udp_mask;
    const struct rte_flow_item_sctp *sctp_spec;
    const struct rte_flow_item_sctp *sctp_mask;
    const struct rte_flow_item_eth *eth_spec;
    const struct rte_flow_item_eth *eth_mask;
    const struct rte_flow_item_vlan *vlan_spec;
    const struct rte_flow_item_vlan *vlan_mask;

因此,代码和IXGBE PMD行为是一致的,没有错误。X550支持不支持的功能是不正确的。
[编辑-1] according to the sheet, none of the drivers support the "of_pop_mpls" action which implies that we can't strip off the MPLS header using RTE_FLOWS
这是正确的理解,到目前为止,目前可用的基础NIC显示没有支持MPLS POP/PUSH。但我熟悉的英特尔NIC FM 10 K允许MPLS POP/PUSH,但我没有看到DPDK支持该NIC。因此,您有2个选项,

  • 使用智能网卡实现硬件
  • 使用DPDK RX回调调用弹出MPLS标签的函数和推送MPLS标签的TX回调

注意:大多数NIC支持PTYPE,也可以解析MPLS和保存tinrte_mbuf。这在使用软件方法时也会有所帮助。

相关问题