【问题标题】:(DPDK) Is there a way to make the Ethernet Device send packet instantly?(DPDK) 有没有办法让以太网设备立即发送数据包?
【发布时间】:2020-06-19 22:57:04
【问题描述】:

我正在使用 DPDK。它提供了一个发送数据包的函数:rte_eth_tx_burst。 但是这个功能只是将数据包放入以太网设备的发送队列中,然后以太网设备等待更多的数据包,然后将它们一串发送。

有没有办法可以将数据包放入以太网设备发送队列,并使其立即发送数据包?

【问题讨论】:

    标签: linux network-programming dpdk


    【解决方案1】:

    通常rte_eth_tx_burst()不仅将数据包放入TX队列,还会通知网卡开始传输。当然,这取决于 PMD 和设备,但设备等待更多数据包的情况并不常见。

    例如,对于e1000 PMD(支持整个系列的 NIC),rte_eth_tx_burst()eth_igb_xmit_pkts() 结尾。在这个函数的最底部有信号给网卡:

        /*
         * Set the Transmit Descriptor Tail (TDT).
         */
        E1000_PCI_REG_WRITE_RELAXED(txq->tdt_reg_addr, tx_id);
    

    基本上,这是对设备寄存器的写入,更新队列的尾部并使 NIC (唤醒并)开始传输。多亏了 DMA,NIC 可以在 RAM 中直接访问 TX 队列和要传输的缓冲区,因此传输将(最终)由 NIC 完成,而不会阻塞 CPU。

    【讨论】:

      【解决方案2】:

      rte_eth_tx_burst 实际上会尽快发送数据包。以太网设备不等待更多数据包。 'burst' 部分是释放 CPU 资源,而不是 NIC 资源,它会立即将所有数据包描述符放入队列中。如果传输队列是空的(因为 DPDK 接管了你的端口,它应该是)那么数据包应该立即发送。

      如果您想了解内存和 NIC 之间的数据传输是如何工作的,here's a good summary.

      如果您出于某种原因想要一个接一个地处理数据包,您可以只使用 1 作为突发大小。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-11-29
        • 1970-01-01
        • 2017-03-02
        • 1970-01-01
        • 2014-03-16
        • 1970-01-01
        • 1970-01-01
        • 2021-10-14
        相关资源
        最近更新 更多