近年来,协议无关(protocol-independent)的数据包处理在网络领域算是一个比较火的概念。但是,DPDK的初衷并不是为了实现协议无关的数据包处理,而是为了加速数据包的处理过程。那么,如何使用DPDK来解析我们自定义的头部呢?本文将给出一种可行的方式供读者参考。
假设我们希望定义名字为my_header的头部:
struct my_header {
uint16_t id;
uint16_t flag;
}
并且将该头部放置在以太网头部和ipv4头部之间,即数据包格式如下:
| ethernet header |
| my header |
| ipv4 header |
| data |
在这种情况下,dpdk是无法自动为我们进行数据包的解析工作的,因为这个数据包已经不是一个符合网络协议栈标准的数据包了。所以,我们只能自己来解析这个数据包来获取我们想要的头部数据。
我们知道,在dpdk中,每个数据包都被存在rte_mbuf这个结构体中,为了叙述方便,我们用m来表示指向一个数据包的指针,即:
struct rte_mbuf *m;
为了能解析数据包的头部,我们要借助两个定义在rte_mbuf_core.h文件中的宏:</