当前位置:   article > 正文

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

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

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

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

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

  1. #define MAX_RX_QUEUE_PER_PORT 1
  2. #define MAX_TX_QUEUE_PER_PORT 1
  3. #define RX_RING_SIZE 128
  4. #define TX_RING_SIZE 512
  5. static const struct rte_eth_conf dev_conf_default = {
  6. .rxmode = {.max_rx_pkt_len = ETHER_MAX_LEN}
  7. };
  8. static void
  9. init_port(void)
  10. {
  11. int nb_port = 0;
  12. int portid = 0;
  13. int ret = 0;
  14. nb_port = rte_eth_dev_count_avail();
  15. if(!nb_port){
  16. rte_exit(EXIT_FAILURE, "No support eth found\n");
  17. }
  18. printf("nb_port = %d\n", nb_port);
  19. for(portid=0;portid < nb_port;portid++){
  20. ret = rte_eth_dev_configure(portid, MAX_RX_QUEUE_PER_PORT, MAX_TX_QUEUE_PER_PORT, &dev_conf_default);
  21. if (ret < 0) {
  22. rte_exit(EXIT_FAILURE, "Cannot configure device: err=%d, port=%u\n", ret, portid);
  23. }
  24. ret = rte_eth_rx_queue_setup(portid, 0, RX_RING_SIZE, rte_eth_dev_socket_id(portid), NULL, pktmbuf_pool[0]);
  25. if (ret < 0) {
  26. rte_exit(EXIT_FAILURE, "rte_eth_rx_queue_setup:err=%d, port=%u\n", ret, portid);
  27. }
  28. ret = rte_eth_tx_queue_setup(portid, 0, TX_RING_SIZE, rte_eth_dev_socket_id(portid), NULL);
  29. if (ret < 0) {
  30. rte_exit(EXIT_FAILURE, "rte_eth_tx_queue_setup:err=%d, port=%u\n", ret, portid);
  31. }
  32. ret = rte_eth_dev_start(portid);
  33. if (ret < 0) {
  34. rte_exit(EXIT_FAILURE, "rte_eth_dev_start:err=%d, port=%u\n", ret, portid);
  35. }
  36. rte_eth_promiscuous_enable(portid);
  37. }
  38. }

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

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

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

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

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

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号