我正在尝试克隆数据包并更改克隆数据包中的各种第2/3/4层头字段。
根据DPDK存储库和互联网上提供的示例,几乎所有示例都使用了rte_pktmbuf_prepend()。在预先添加所需的标头之后,将更改这些新添加的标头以反映各个字段的较新值。据我所知, rte_pktmbuf_clone()将克隆所有段,为什么我们不能更改克隆数据包中的头字段,为什么我们需要在克隆后添加标题包吗
此外,在ipv4_multicast(DPDK示例应用程序)中,首先使用 rte_pktmbuf_adj()删除标头,然后在数据包前添加新标头。 因此,在某些示例中,首先删除标头,然后添加新标头,在其他一些示例中,添加新标头。为什么我们需要这样做?
感谢。
相关链接:
http://dpdk.org/ml/archives/dev/2014-March/001589.html
http://dpdk.org/ml/archives/dev/2014-March/001583.html
http://dpdk.readthedocs.io/en/v17.08/sample_app_ug/ipv4_multicast.html
答案 0 :(得分:1)
在DPDK中(和许多其他库一样),mbufs背后的想法是分割数据(即内部带有IP包的以太网帧)和元数据(即链中的缓冲区数,指向下一个缓冲区的指针,标志,总长度)等)。
给定mbuf的rte_pktmbuf_clone()
分配另一个元数据。此元数据附加到原始mbuf数据,即原始和克隆的mbuf在克隆后共享相同的数据,但具有两个单独的元数据。这在Programer's Guide.
现在回答你的问题。
为什么我们无法更改克隆数据包中的标头字段?为什么我们需要在克隆数据包后添加标头?
实际上,我们可以更改克隆数据包中的数据包标头,但由于(克隆之后)两个mbuf共享相同的缓冲区数据,因此更改数据一个mbuf将更改另一个数据,因为mbuf数据是共享的。
一些示例的目标是同时将相同的mbuf发送到N个目的地。最简单的解决方案是:
不幸的是,制作N个数据副本只是为了在一开始就改变几个字节并不是最有效的解决方案。所以我们克隆数据包,即:
现在,由于所有N个mbuf共享相同的数据,我们无法更改N个不同目的地的数据包标头。因此,我们只为包头分配另一个mbuf,即:
因此,该过程比以前更复杂,但可能会表现出更好的性能,因为我们从不复制数据包数据,在某些情况下可能高达~65K。
因此,在某些示例中,首先删除标头,然后添加新标头,在其他一些示例中,添加新标头。为什么我们需要这样做?
这取决于是否需要更改数据包标头并将其发送出去,或者我们需要使用N个不同的数据包标头进行N次复制,如上所述。总体而言,DPDK非常注重绩效,因此我们可以理所当然地认为,所有这些并发症都是有原因的......