我必须将 L2 数据包包装在 mbuf 中吗?如果是,那么如何?
Do I have to wrap L2 packets in mbufs? If yes, then how?
我有字节数组形式的 L2 数据包,我想使用 DPDK 将它们发送到互联网。 L2 数据包在辅助 DPDK 应用程序中,计划将它们发送到主要 DPDK 应用程序。
我想到了以下内容(在辅助应用程序内):
- 从共享内存池中获取一个 mbuf
- 将L2数据包放入mbuf
- 将 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 接口发送出去。如
- 使用 rte_eth_tx_burst
从主节点发送数据包
- 使用 rte_eth_tx_burst
从辅助发送数据包
- 从次要到主要共享数据包(字节)数组
- 从次要到主要共享完整构建的 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 从次要发送到主要。
将字节数组发送到主节点的优点:
- 无需从 mbuf 池中为 mbuf 实例分配
- 无需复制到mbuf数据位置的具体位置
- 无需更新mbuf headers
发送mbuf primary的优点:
- mbuf可以简单验证直接通过tx_burst
发送出去
- 无需同步或使用不同的 tx queues。
- 辅助应用程序可以使用最少的 DPDK 库构建,并且也没有 driver PMD。
因此可以根据实际意图做出决定。
我有字节数组形式的 L2 数据包,我想使用 DPDK 将它们发送到互联网。 L2 数据包在辅助 DPDK 应用程序中,计划将它们发送到主要 DPDK 应用程序。
我想到了以下内容(在辅助应用程序内):
- 从共享内存池中获取一个 mbuf
- 将L2数据包放入mbuf
- 将 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 接口发送出去。如
- 使用 rte_eth_tx_burst 从主节点发送数据包
- 使用 rte_eth_tx_burst 从辅助发送数据包
- 从次要到主要共享数据包(字节)数组
- 从次要到主要共享完整构建的 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 从次要发送到主要。
将字节数组发送到主节点的优点:
- 无需从 mbuf 池中为 mbuf 实例分配
- 无需复制到mbuf数据位置的具体位置
- 无需更新mbuf headers
发送mbuf primary的优点:
- mbuf可以简单验证直接通过tx_burst 发送出去
- 无需同步或使用不同的 tx queues。
- 辅助应用程序可以使用最少的 DPDK 库构建,并且也没有 driver PMD。
因此可以根据实际意图做出决定。