DPDK 流规则不适用于 UDP 流量

问题描述 投票:0回答:0

问题

我正在尝试使用 DPDK 流规则根据 UDP 目标端口将接收到的 UDP 数据包路由到不同的队列。我的流程在运行时通过了验证

rte_flow_validate()
。但是,无论目标端口如何,数据包仍然全部到达每个设备上的队列 0,就好像没有配置流规则一样。 有人知道为什么流程规则可能没有按预期应用吗?

代码

下面是我编写的用于配置此流规则的函数。现在,这个函数在配置和启动我的设备后立即被调用。 (我曾尝试在其他地方调用它,但没有成功。有关详细信息,请参阅故障排除部分)

rte_flow * configure_udp_flow(uint16_t device_id, uint16_t udp_dst_port, uint16_t queue_id)
{
    rte_flow *flow = NULL;
    rte_flow_attr attr;
    rte_flow_item pattern[5];
    rte_flow_action action[5];
    rte_flow_action_queue queue;
    struct rte_flow_item_eth eth_spec;
    rte_flow_item_ipv4 ip_spec;
    rte_flow_item_udp udp_spec;
    rte_flow_item_udp udp_mask;

    memset(&attr, 0, sizeof(rte_flow_attr));
    memset(pattern, 0, sizeof(pattern));
    memset(action, 0, sizeof(action));
    memset(&queue, 0, sizeof(rte_flow_action_queue));
    memset(&eth_spec, 0, sizeof(rte_flow_item_eth));
    memset(&ip_spec, 0, sizeof(rte_flow_item_ipv4));
    memset(&udp_spec, 0, sizeof(rte_flow_item_udp));
    memset(&udp_mask, 0, sizeof(rte_flow_item_udp));

    attr.ingress = 1;

    // First level pattern, ETH, apply no actions
    pattern[0].type = RTE_FLOW_ITEM_TYPE_ETH;
    pattern[0].spec = &eth_spec;

    // Second level pattern, IP, apply no actions
    pattern[1].type = RTE_FLOW_ITEM_TYPE_IPV4;
    pattern[1].spec = &ip_spec;

    // Third level, UDP, match UDP destination port
    pattern[2].type = RTE_FLOW_ITEM_TYPE_UDP;
    udp_spec.hdr.dst_port = htons(udp_dst_port);
    pattern[2].spec = &udp_spec;
    udp_mask.hdr.dst_port = 0xffff;
    pattern[2].mask = &udp_mask;

    // Set pattern end
    pattern[3].type = RTE_FLOW_ITEM_TYPE_END;
    
    // Set action to move packet to queue
    action[0].type = RTE_FLOW_ACTION_TYPE_QUEUE;
    queue.index = queue_id;
    action[0].conf = &queue;
    action[1].type = RTE_FLOW_ACTION_TYPE_END;

    // Validate and create
    rte_flow_error flow_error;
    int res = rte_flow_validate(device_id, &attr, pattern, action, &flow_error);
    if (res < 0)
    {
        spdlog::error("Could not configure flow rule: {0}", flow_error.message);
        return flow;
    }
    
    flow = rte_flow_create(device_id, &attr, pattern, action, &flow_error);
    
    return flow;
}

故障排除

我试过以下方法:

  • 为 udp 规范应用了各种掩码。
    • 全1
    • 全0
    • 仅目的端口字段全为 1,其余位设置为 0
    • 仅目标端口字段全为 0,其余位设置为 1
  • 将对我的函数
    configure_udp_flow()
    的调用移动到配置的不同部分
    • 在每个设备的配置开始时
    • 在配置结束时,就在我启动每个设备之前
    • 在我启动每个设备后立即
  • 设置不同字节顺序的端口
    • 网络订单
    • 房东订单
  • 故意配置无效的流程规则以确认验证步骤有效
    • 验证步骤有效并向控制台打印一条错误消息。
  • 已验证传入的 UDP 数据包在其标头中具有预期的目标端口值
udp dpdk
© www.soinside.com 2019 - 2024. All rights reserved.