rte_pktmbuf_mtod_offset(mbufs, struct rte_ipv4_hdr *, sizeof(struct rte_ether_hdr))
和 (struct rte_ipv4_hdr *)(ehdr+1)
都可以用于获取指向 rte_mbuf
对象中的某个数据包头部的指针,但是它们有以下区别:
rte_pktmbuf_mtod_offset()
宏是 DPDK 提供的工具宏,可以帮助开发人员在不同平台上实现跨平台兼容性。而(struct rte_ipv4_hdr *)(ehdr+1)
是 C 语言原生支持的运算符,没有 DPDK 宏那么通用。rte_pktmbuf_mtod_offset()
宏需要传入一个指向rte_mbuf
对象的指针和一个偏移量参数来计算得到最终的指针。而(struct rte_ipv4_hdr *)(ehdr+1)
直接使用了一个指向 Ethernet 头部结构体后面的位置(即跳过了 Ethernet 头部),这样可以直接得到 IPv4 头部结构体的指针。- 在实际使用时,如果数据包头部紧密相连(比如 TCP/UDP 报文),并且能够保证头部长度正确,则两种方式都可以正常工作。但是如果存在间隔或者 padding 字节,或者要跳过多个头部,则建议使用
rte_pktmbuf_mtod_offset()
宏来进行偏移量计算。