ZBLOG

dpdk20.11如何设置轮询所有的接收队列

在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表。这将使所有接收队列被周期性地轮询以进行数据包处理。

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://sdn.0voice.com/?id=1230

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?