如何解决我是否必须将 L2 数据包包装在 mbufs 中?如果是,那么如何?
我有字节数组形式的 L2 数据包,我想使用 DPDK 将它们发送到互联网。 L2 数据包位于辅助 DPDK 应用中,计划将它们发送到主 DPDK 应用。
我想到了以下内容(在辅助应用中):
- 从共享内存池中获取 mbuf
- 将 L2 数据包放入 mbuf
- 将 mbuf 放在共享环上以供主要使用
主 DPDK 将从共享环中取出它们并使用 rte_tx_eth_burst() 发送它们
我的问题是我不确定是否应该将 L2 数据包包装在 mbuf 中。 如果我应该做,那我该怎么做?
到目前为止我得到的是:
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 代码,我为 C 绑定到 DPDK 创建了包装器。
解决方法
有多种方法可以从 DPDK 接口发送所需的数据包。比如
- 使用 rte_eth_tx_burst 从主节点发送数据包
- 使用 rte_eth_tx_burst 从 Secondary 发送数据包
- 从次要到主要共享数据包(字节)数组
- 从次要到主要共享完全构建的 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 标头
发送 mbuf primary 的好处:
- mbuf 可以简单地验证并通过 tx_burst 直接发送
- 无需同步或使用不同的 tx 队列。
- 可以使用最少的 DPDK 库构建辅助应用程序,也无需驱动程序 PMD。
因此可以根据实际意图做出决定。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。