上一节我们讲述了如何申请内存池缓冲区以便接下来创建 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 队列。
下一节我们将描述如何从网卡收取报文并存放于队列。
还没有评论,来说两句吧...