【DPDK学习路径】七、创建RX/TX队列

发布于:2024-06-29 ⋅ 阅读:(15) ⋅ 点赞:(0)

        上一节我们讲述了如何申请内存池缓冲区以便接下来创建 RX 队列,这一节我们将给出具体如何创建 RX/TX 队列。

        在 DPDK 中提供了 rte_eth_rx_queue_setup 及 rte_eth_tx_queue_setup 这两个接口用于接收/发送队列的创建。 

        下面给出一个为各个网卡创建RX/TX 队列的实例:

#define MAX_RX_QUEUE_PER_PORT 1
#define MAX_TX_QUEUE_PER_PORT 1
#define RX_RING_SIZE 128
#define TX_RING_SIZE 512

static const struct rte_eth_conf dev_conf_default = {
    .rxmode = {.max_rx_pkt_len = ETHER_MAX_LEN}
};


static void
init_port(void)
{
    int nb_port = 0;
    int portid = 0;
    int ret = 0;

    nb_port = rte_eth_dev_count_avail();
    if(!nb_port){
        rte_exit(EXIT_FAILURE, "No support eth found\n");
    }
    printf("nb_port = %d\n", nb_port);

    for(portid=0;portid < nb_port;portid++){

        ret = rte_eth_dev_configure(portid, MAX_RX_QUEUE_PER_PORT, MAX_TX_QUEUE_PER_PORT, &dev_conf_default);
        if (ret < 0) {
               rte_exit(EXIT_FAILURE, "Cannot configure device: err=%d, port=%u\n", ret, portid);
        }

        ret = rte_eth_rx_queue_setup(portid, 0, RX_RING_SIZE, rte_eth_dev_socket_id(portid), NULL, pktmbuf_pool[0]);
        if (ret < 0) {
               rte_exit(EXIT_FAILURE, "rte_eth_rx_queue_setup:err=%d, port=%u\n", ret, portid);
        }

        ret = rte_eth_tx_queue_setup(portid, 0, TX_RING_SIZE, rte_eth_dev_socket_id(portid), NULL);
        if (ret < 0) {
               rte_exit(EXIT_FAILURE, "rte_eth_tx_queue_setup:err=%d, port=%u\n", ret, portid);
        }

        ret = rte_eth_dev_start(portid);
        if (ret < 0) {
               rte_exit(EXIT_FAILURE, "rte_eth_dev_start:err=%d, port=%u\n", ret, portid);
        }

        rte_eth_promiscuous_enable(portid);
    }
}

        首先统计网卡数量,然后依次遍历网卡,这里的网卡指的是搭建DPDK环境时绑定到DPDK上的网卡,而非虚拟机上存在的全部网卡。对于每个网卡,首先配置,然后创建RX队列,然后创建TX队列,最后启动网卡,并开启混杂模式。

        在这里,我们仅为每个网卡开启一个RX队列及一个TX队列,因此都设置为1。RX_RING_SIZE 及 TX_RING_SIZE 依赖于实际的机器配置,可以自行修改。

        之所以开启混杂模式,是为了更方便打印出报文,因为目前没有配置IP,也没有了解网卡的mac是多少,即使是使用发包工具也无从下手。

        现在,我们已经成功为所有绑定在DPDK上的网卡创建了相应的 RX/TX 队列。

        下一节我们将描述如何从网卡收取报文并存放于队列。


网站公告

今日签到

点亮在社区的每一天
去签到