我必须将 L2 数据包包装在 mbuf 中吗?如果是,那么如何?

Do I have to wrap L2 packets in mbufs? If yes, then how?

我有字节数组形式的 L2 数据包,我想使用 DPDK 将它们发送到互联网。 L2 数据包在辅助 DPDK 应用程序中,计划将它们发送到主要 DPDK 应用程序。

我想到了以下内容(在辅助应用程序内):

  1. 从共享内存池中获取一个 mbuf
  2. 将L2数据包放入mbuf
  3. 将 mbuf 放在共享环上供主节点使用

主 DPDK 将从共享环中取出它们并使用 rte_tx_eth_burst()

发送它们

我的问题是我不确定是否应该将 L2 数据包包装在 mbufs 中。 如果我应该,那我该怎么办?

到目前为止我得到的是:

            let mut my_buffer = self.do_rte_mempool_get();
            while let Err(er) = my_buffer {
                warn!("rte_mempool_get failed, trying again.");
                my_buffer = self.do_rte_mempool_get();
                // it may fail if not enough entries are available.
            }
            warn!("rte_mempool_get success");
           
            //STEP ONE UNTIL HERE
            
            // Let's just send an empty packet for starters.
            let my_buffer = my_buffer.unwrap();

            // STEP TWO MISSING

            

            let mut res = self.do_rte_ring_enqueue(my_buffer);
            // it may fail if not enough room in the ring to enqueue
            while let Err(er) = res {
                warn!("rte_ring_enqueue failed, trying again.");
                res = self.do_rte_ring_enqueue(my_buffer);
            }
            warn!("rte_ring_enqueue success");
            
            // STEP THREE UNTIL HERE

这是 Rust 代码,我为 DPDK 的 C 绑定创建了包装器。

有多种方法可以将所需的数据包从 DPDK 接口发送出去。如

  1. 使用 rte_eth_tx_burst
  2. 从主节点发送数据包
  3. 使用 rte_eth_tx_burst
  4. 从辅助发送数据包
  5. 从次要到主要共享数据包(字节)数组
  6. 从次要到主要共享完整构建的 mbuf

实际问题是 My problem is that I am not sure if I should wrap the L2 packets in mbufs or not. And if I should, then how could I do it? 而不是 How to send L2 packets to the internet using DPDK?

答案取决于用例,可以将字节数组或完整的公式化 mbuf 从次要发送到主要。

将字节数组发送到主节点的优点:

  1. 无需从 mbuf 池中为 mbuf 实例分配
  2. 无需复制到mbuf数据位置的具体位置
  3. 无需更新mbuf headers

发送mbuf primary的优点:

  1. mbuf可以简单验证直接通过tx_burst
  2. 发送出去
  3. 无需同步或使用不同的 tx queues。
  4. 辅助应用程序可以使用最少的 DPDK 库构建,并且也没有 driver PMD。

因此可以根据实际意图做出决定。