在DPDK 20.11中,可以通过设置接收队列的轮询模式为”全局轮询”(也称为”RSS全局轮询”)来实现轮询所有接收队列。这种模式下,所有接收队列都将被周期性地轮询以进行数据包处理。
要启用此模式,请使用rte_eth_dev_configure函数配置设备,并将rxmode字段中的mq_mode设置为RTE_ETH_MQ_RX_RSS(RSS多队列接收)或RTE_ETH_MQ_RX_VMDQ_RSS(虚拟化多队列RSS接收)。然后,在reta_conf参数中指定RETA表以定义如何将数据包分发到不同的接收队列。
以下是一个示例:
struct rte_eth_conf port_conf = {
.rxmode = {
.mq_mode = RTE_ETH_MQ_RX_RSS, // 或者 RTE_ETH_MQ_RX_VMDQ_RSS
.max_rx_pkt_len = ETHER_MAX_LEN,
.split_hdr_size = 0,
.header_split = 0, /**< Header Split disabled */
.hw_ip_checksum = 1, /**< IP checksum offload enabled */
.hw_vlan_filter = 0, /**< VLAN filtering enabled */
.jumbo_frame = 0, /**< Jumbo Frame Support disabled */
.hw_strip_crc = 1, /**< CRC stripped by hardware */
},
};
// 配置RETA表
struct rte_eth_rss_reta_entry64 reta_conf[ETH_RSS_RETA_SIZE_512];
memset(reta_conf, 0, sizeof(reta_conf));
for (int i = 0; i < ETH_RSS_RETA_SIZE_512; i++) {
uint8_t queue_idx = i % nb_rx_queues;
reta_conf[i].mask = 1ULL << queue_idx;
reta_conf[i].reta[0] = queue_idx;
}
// 配置设备
if (rte_eth_dev_configure(port_id, nb_rx_queues, nb_tx_queues, &port_conf) != 0) {
rte_exit(EXIT_FAILURE, "Failed to configure Ethernet device\n");
}
// 配置RETA表
if (rte_eth_dev_rss_reta_update(port_id, reta_conf, ETH_RSS_RETA_SIZE_512) != 0) {
rte_exit(EXIT_FAILURE, "Failed to configure RSS redirection table\n");
}
在上面的示例中,我们使用RTE_ETH_MQ_RX_RSS模式配置了rxmode字段,并指定了一个包含所有接收队列索引的RETA表。这将使所有接收队列被周期性地轮询以进行数据包处理。