【发布时间】:2020-06-19 22:57:04
【问题描述】:
我正在使用 DPDK。它提供了一个发送数据包的函数:rte_eth_tx_burst。 但是这个功能只是将数据包放入以太网设备的发送队列中,然后以太网设备等待更多的数据包,然后将它们一串发送。
有没有办法可以将数据包放入以太网设备发送队列,并使其立即发送数据包?
【问题讨论】:
标签: linux network-programming dpdk
我正在使用 DPDK。它提供了一个发送数据包的函数:rte_eth_tx_burst。 但是这个功能只是将数据包放入以太网设备的发送队列中,然后以太网设备等待更多的数据包,然后将它们一串发送。
有没有办法可以将数据包放入以太网设备发送队列,并使其立即发送数据包?
【问题讨论】:
标签: linux network-programming dpdk
通常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。
【讨论】:
rte_eth_tx_burst 实际上会尽快发送数据包。以太网设备不等待更多数据包。 'burst' 部分是释放 CPU 资源,而不是 NIC 资源,它会立即将所有数据包描述符放入队列中。如果传输队列是空的(因为 DPDK 接管了你的端口,它应该是)那么数据包应该立即发送。
如果您想了解内存和 NIC 之间的数据传输是如何工作的,here's a good summary.
如果您出于某种原因想要一个接一个地处理数据包,您可以只使用 1 作为突发大小。
【讨论】: