Dear [Support Team / DPDK Developers / Intel Support],

I hope this message finds you well.

I'm currently developing a server application based on DPDK 24.11, using an Intel X710 NIC with the i40e driver. In my application, I'm leveraging RTE Flow to filter UDP packets based on specific IP addresses and ports.

To direct matching traffic, I initially used the QUEUE action, but I observed that only one CPU core reaches 100% utilization, while the others remain idle. This indicates that RSS is being bypassed, resulting in a processing bottleneck.

To address this, I tried replacing the QUEUE action with RSS, but I encountered the following validation error:

Validation Failure: RSS Queues not supported when pattern specified

This raises a few questions:

Below is a relevant snippet of the flow rule I'm using:

int flow_filtering(uint16_t port_id, uint32_t ip_addr, uint16_t udp_port) {
struct rte_flow_error error;
struct rte_flow_attr attr = {
.ingress = 1,
.priority = 0
};
struct rte_flow_item pattern[4];
struct rte_flow_action action[2];
struct rte_flow *flow;

// Configuration Ethernet
memset(pattern, 0, sizeof(pattern));
pattern[0].type = RTE_FLOW_ITEM_TYPE_ETH;

// Configuration IPv4
struct rte_flow_item_ipv4 ipv4_spec = { .hdr.dst_addr = RTE_BE32(ip_addr) };
struct rte_flow_item_ipv4 ipv4_mask = { .hdr.dst_addr = RTE_BE32(0xFFFFFFFF) };
pattern[1].type = RTE_FLOW_ITEM_TYPE_IPV4;
pattern[1].spec = &ipv4_spec;
pattern[1].mask = &ipv4_mask;

// Configuration UDP
struct rte_flow_item_udp udp_spec = { .hdr.dst_port = RTE_BE16(udp_port) };
struct rte_flow_item_udp udp_mask = { .hdr.dst_port = RTE_BE16(0xFFFF) };
pattern[2].type = RTE_FLOW_ITEM_TYPE_UDP;
pattern[2].spec = &udp_spec;
pattern[2].mask = &udp_mask;

pattern[3].type = RTE_FLOW_ITEM_TYPE_END;

// Configuration RSS
uint16_t rss_queues[] = {0, 1, 2, 3, 4, 5};
struct rte_flow_action_rss rss_conf = {
.func = RTE_ETH_HASH_FUNCTION_DEFAULT,
.types = RTE_ETH_RSS_NONFRAG_IPV4_UDP,
.key_len = 0,
.queue_num = 6,
.queue = rss_queues
};

action[0].type = RTE_FLOW_ACTION_TYPE_RSS;
action[0].conf = &rss_conf;
action[1].type = RTE_FLOW_ACTION_TYPE_END;

if (rte_flow_validate(port_id, &attr, pattern, action, &error) != 0) {
printf("Validation failed: %s\n", error.message);
return -1;
}
flow = rte_flow_create(port_id, &attr, pattern, action, &error);
if (flow == NULL) {
printf("Error creating flow rule: %s\n", error.message);
return -1;
}

printf("Flow rule created for IP %u.%u.%u.%u and UDP port %u\n",
(ip_addr >> 24) & 0xFF, (ip_addr >> 16) & 0xFF,
(ip_addr >> 8) & 0xFF, ip_addr & 0xFF, udp_port);

return 0;
}

Any guidance or clarification would be greatly appreciated.

Best regards,

Sid-Ali