我正在尝试使用 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(ð_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 = ð_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;
}
我试过以下方法:
configure_udp_flow()
的调用移动到配置的不同部分