DPDK源码分析之(1)libmbuf模块补充
Author:OnceDay Date:2024年7月2日
漫漫长路,有人对你笑过嘛...
全系列文档可参考专栏:源码分析_Once-Day的博客-CSDN博客
参考文档:
- DPDK download
- Getting Started Guide for Linux --- documentation (dpdk.org)
- Sample Applications User Guides --- documentation (dpdk.org)
- 14. Mbuf Library --- Data Plane Development Kit 24.07.0-rc1 documentation (dpdk.org)
- dpdk/lib/mbuf at main · DPDK/dpdk · GitHub
- TCP/IP Illustrated, Volume 2: The Implementation (kohala.com)
- DPDK源码分析之(1)libmbuf模块-CSDN博客
文章目录
-
-
- DPDK源码分析之(1)libmbuf模块补充
-
- [3. offload信息](#3. offload信息)
-
- [3.1 Rx卸载信息](#3.1 Rx卸载信息)
- [4. 动态字段(dynamic fields)](#4. 动态字段(dynamic fields))
-
- [4.1 数据结构定义](#4.1 数据结构定义)
- [4.2 动态字段API操作](#4.2 动态字段API操作)
- [4.3 动态字段处理](#4.3 动态字段处理)
- [5. 自定义内存池操作](#5. 自定义内存池操作)
-
- [5.1 API操作](#5.1 API操作)
- [6. 报文类型](#6. 报文类型)
-
- [6.1 类型值枚举](#6.1 类型值枚举)
-
3. offload信息
3.1 Rx卸载信息
这些标志位也携带了数据包类型信息,由于接收(RX)和发送(TX)共享这些标志位,对其修改需要谨慎,主要规则如下:
- 接收(RX)标志位从第0位开始,新定义的标志位添加在之前标志位的左边。
- 最高的3个比特位是为通用的mbuf(内存缓冲区)标志保留的。
- 发送(TX)标志位从第60位(即63-3)开始,新定义的标志位添加在之前标志位的右边,即应该从高位往低位定义,而不是从低位往高位。
- 保持这些标志位与
rte_get_rx_ol_flag_name()
和rte_get_tx_ol_flag_name()
函数同步。
标识 | 值 | 描述 |
---|---|---|
RTE_MBUF_F_RX_VLAN | (1ULL << 0) | 802.1q VLAN报文,TCI ID记录在mbuf->vlan_tci里面。 如果没有RTE_MBUF_F_RX_VLAN_STRIPPED标记,则VLAN数据未被剥离。 |
RTE_MBUF_F_RX_RSS_HASH | (1ULL << 1) | 表示数据包有RSS(Receive Side Scaling)哈希值。 |
RTE_MBUF_F_RX_FDIR | (1ULL << 2) | 表示数据包匹配了特定的流向。 |
RTE_MBUF_F_RX_OUTER_IP_CKSUM_BAD | (1ULL << 5) | 表示数据包最外层的IP校验和已被硬件检查并且是错误的。 |
RTE_MBUF_F_RX_VLAN_STRIPPED | (1ULL << 6) | 表示数据包的VLAN标签以及被剥离保存在mbuf->vlan_tci里。 |
RTE_MBUF_F_RX_IP_CKSUM_MASK | ((1ULL << 4)|(1ULL << 7)) | |
RTE_MBUF_F_RX_IP_CKSUM_UNKNOWN | 0 | 未知的IP检验和检查结果 |
RTE_MBUF_F_RX_IP_CKSUM_BAD | (1ULL << 4) | the IP checksum in the packet is wrong |
RTE_MBUF_F_RX_IP_CKSUM_GOOD | (1ULL << 7) | the IP checksum in the packet is valid |
RTE_MBUF_F_RX_IP_CKSUM_NONE | ((1ULL << 4)|(1ULL << 7)) | 表示数据包的IP校验和在数据包中不正确, 但IP数据的完整性已经通过其他方式验证。 |
RTE_MBUF_F_RX_L4_CKSUM_MASK | ((1ULL << 3)|(1ULL << 8)) | |
RTE_MBUF_F_RX_L4_CKSUM_UNKNOWN | 0 | no information about the RX L4 checksum |
RTE_MBUF_F_RX_L4_CKSUM_BAD | (1ULL << 3) | the L4 checksum in the packet is wrong |
RTE_MBUF_F_RX_L4_CKSUM_GOOD | (1ULL << 8) | the L4 checksum in the packet is valid |
RTE_MBUF_F_RX_L4_CKSUM_NONE | ((1ULL << 3)|(1ULL << 8)) | 表示数据包的L4校验和在数据包中不正确, 但L4数据的完整性已经通过其他方式验证。 |
RTE_MBUF_F_RX_IEEE1588_PTP | (1ULL << 9) | 符合IEEE 1588精确时间协议(Precision Time Protocol, PTP)标准 的二层以太网精确时间报文。 |
RTE_MBUF_F_RX_IEEE1588_TMST | (1ULL << 10) | 包含IEEE 1588精确时间协议(Precision Time Protocol, PTP)时间戳 的二层(L2)或四层(L4)网络数据包。 |
RTE_MBUF_F_RX_FDIR_ID | (1ULL << 13) | 当数据包匹配流向识别(Flow Director, FDIR)规则时, 报告相应的流向ID(Flow Director ID, FD ID)。 |
RTE_MBUF_F_RX_FDIR_FLX | (1ULL << 14) | 当数据包匹配流向识别(Flow Director, FDIR)规则时, 报告规则中配置的灵活字节(flexible bytes)。 |
RTE_MBUF_F_RX_QINQ_STRIPPED | (1ULL << 15) | 表示数据包的QINQ标签以及被剥离保存在mbuf->vlan_tci_outer里。 RTE_MBUF_F_RX_VLAN和RTE_MBUF_F_RX_QINQ需要被设置。 |
RTE_MBUF_F_RX_LRO | (1ULL << 16) | 数据包被硬件或虚拟驱动程序合并时,驱动程序会设置该标识。 这个标志表示mbuf中的m->tso_segsz 字段是有效的, 并且其值被设置为原始数据包的段大小(segment size)。 |
RTE_MBUF_F_RX_SEC_OFFLOAD | (1ULL << 18) | 表示数据包经过了安全卸载处理,即某些安全操作已经由硬件完成。 |
RTE_MBUF_F_RX_SEC_OFFLOAD_FAILED | (1ULL << 19) | 表示数据包的安全卸载处理失败。 这可能是由于硬件错误、配置问题、不支持的算法等。 |
RTE_MBUF_F_RX_QINQ | (1ULL << 20) | 表示数据包是一个双VLAN(QinQ)数据包,即包含两层VLAN标签。 |
RTE_MBUF_F_RX_OUTER_L4_CKSUM_MASK | ((1ULL << 21)|(1ULL << 22)) | 表示外层(outer)四层(L4)校验和状态的标志掩码 |
RTE_MBUF_F_RX_OUTER_L4_CKSUM_UNKNOWN | 0 | 表示没有关于外层四层校验和的信息。 |
RTE_MBUF_F_RX_OUTER_L4_CKSUM_BAD | (1ULL << 21) | 表示数据包中的外层四层校验和是错误的。 |
RTE_MBUF_F_RX_OUTER_L4_CKSUM_GOOD | (1ULL << 22) | 表示数据包中的外层四层校验和是正确的。 |
RTE_MBUF_F_RX_OUTER_L4_CKSUM_INVALID | ((1ULL << 21)|(1ULL << 22)) | 表示外层四层校验和状态无效。 |
RTE_MBUF_F_FIRST_FREE | (1ULL << 23) | 需要一开始就重置的最大标识位(Rx从0位往上) |
RTE_MBUF_F_LAST_FREE | (1ULL << 40) | 需要最后重置的最小标识位(TX从60位往下) |
RTE_MBUF_F_TX_OUTER_UDP_CKSUM | (1ULL << 41) | 使能外部UDP校验和卸载功能。 |
RTE_MBUF_F_TX_UDP_SEG | (1ULL << 42) | UDP分段卸载功能,需要将MSS存放于mbuf->tso_segsz |
RTE_MBUF_F_TX_SEC_OFFLOAD | (1ULL << 43) | 安全处理卸载。 |
RTE_MBUF_F_TX_MACSEC | (1ULL << 44) | MACsec卸载功能,对数据包进行加密、完整性保护和重放保护。 |
RTE_MBUF_F_TX_TUNNEL_VXLAN | (0x1ULL << 45) | Bits 45:48 used for the tunnel type. |
RTE_MBUF_F_TX_TUNNEL_GRE | (0x2ULL << 45) | |
RTE_MBUF_F_TX_TUNNEL_IPIP | (0x3ULL << 45) | |
RTE_MBUF_F_TX_TUNNEL_GENEVE | (0x4ULL << 45) | |
RTE_MBUF_F_TX_TUNNEL_MPLSINUDP | (0x5ULL << 45) | |
RTE_MBUF_F_TX_TUNNEL_VXLAN_GPE | (0x6ULL << 45) | |
RTE_MBUF_F_TX_TUNNEL_GTP | (0x7ULL << 45) | |
RTE_MBUF_F_TX_TUNNEL_ESP | (0x8ULL << 45) | |
RTE_MBUF_F_TX_TUNNEL_IP | (0xDULL << 45) | Generic IP encapsulated tunnel type used for TSO and checksum offload. |
RTE_MBUF_F_TX_TUNNEL_UDP | (0xEULL << 45) | Generic UDP encapsulated tunnel type used for TSO and checksum offload. |
RTE_MBUF_F_TX_QINQ | (1ULL << 49) | Double VLAN insertion (QinQ) request to driver |
RTE_MBUF_F_TX_TCP_SEG | (1ULL << 50) | TCP segmentation offload |
RTE_MBUF_F_TX_IEEE1588_TMST | (1ULL << 51) | TX IEEE1588 packet to timestamp |
RTE_MBUF_F_TX_L4_NO_CKSUM | (0ULL << 52) | Disable L4 cksum of TX pkt |
RTE_MBUF_F_TX_TCP_CKSUM | (1ULL << 52) | TCP cksum of TX pkt |
RTE_MBUF_F_TX_SCTP_CKSUM | (2ULL << 52) | SCTP cksum of TX pkt |
RTE_MBUF_F_TX_UDP_CKSUM | (3ULL << 52) | UDP cksum of TX pkt |
RTE_MBUF_F_TX_L4_MASK | (3ULL << 52) | Mask for L4 cksum offload request |
RTE_MBUF_F_TX_IP_CKSUM | (1ULL << 54) | Offload the IP checksum in the hardware. |
RTE_MBUF_F_TX_IPV4 | (1ULL << 55) | Packet is IPv4. |
RTE_MBUF_F_TX_IPV6 | (1ULL << 56) | Packet is IPv6 |
RTE_MBUF_F_TX_VLAN | (1ULL << 57) | VLAN tag insertion request to driver |
RTE_MBUF_F_TX_OUTER_IP_CKSUM | (1ULL << 58) | Offload the IP checksum of an external header in the hardware |
RTE_MBUF_F_TX_OUTER_IPV4 | (1ULL << 59) | Packet outer header is IPv4 |
RTE_MBUF_F_TX_OUTER_IPV6 | (1ULL << 60) | Packet outer header is IPv6 |
RTE_MBUF_F_TX_OFFLOAD_MASK | 所有Tx offload的集合 | |
RTE_MBUF_F_EXTERNAL | (1ULL << 61) | Mbuf having an external buffer attached. shinfo in mbuf must be filled. |
RTE_MBUF_F_INDIRECT | (1ULL << 62) | Indirect attached mbuf |
4. 动态字段(dynamic fields)
DPDK中的rte_mbuf是一种用于存储网络数据包的内存结构。为了支持各种不同的功能,我们常常需要在mbuf中存储一些额外的信息。然而,mbuf结构体本身的空间是有限的,不可能为每个功能都预留一个固定的字段,否则可能会导致兼容性问题。
为了解决这个问题,DPDK引入了mbuf动态字段和标志的机制。通过这个机制,我们可以在运行时按需在mbuf中注册一些自定义的字段或标志位:
动态字段是mbuf中一段连续的内存区域,有特定的大小和对齐要求,可以用来存储一些与报文相关的元数据。
动态标志位是mbuf->ol_flags中的一个位,用来标记某种特性是否启用。
动态字段和标志位的分配可以是自动的,由DPDK的内存管理模块选择合适的位置,也可以由应用程序和驱动显式指定偏移量。
使用动态字段和标志位时,应用程序和驱动需要协同工作:
-
首先定义动态字段的参数,如名称、大小、对齐要求等,并用API函数注册。
-
驱动程序在适当的时候(如网卡初始化时)注册它需要使用的动态字段,并记录下分配的偏移量,供后续读写操作使用。
-
应用程序如果需要读写某个动态字段,也同样需要先注册,获得相同的偏移量,然后才能通过特定的宏来访问字段。
为了避免命名冲突,注册动态字段时应当遵循一定的命名规范,比如以"rte_"为前缀等。
总之,rte_mbuf动态字段和标志为我们提供了一种灵活的机制,可以在运行时按需添加自定义字段,且不影响原有mbuf结构的兼容性。
4.1 数据结构定义
相关的数据结构和宏定义如下:
yacas
/**
* Maximum length of the dynamic field or flag string.
*/
#define RTE_MBUF_DYN_NAMESIZE 64
/**
* Structure describing the parameters of a mbuf dynamic field.
*/
struct rte_mbuf_dynfield {
char name[RTE_MBUF_DYN_NAMESIZE]; /**< Name of the field. */
size_t size; /**< The number of bytes to reserve. */
size_t align; /**< The alignment constraint (power of 2). */
unsigned int flags; /**< Reserved for future use, must be 0. */
};
/**
* Structure describing the parameters of a mbuf dynamic flag.
*/
struct rte_mbuf_dynflag {
char name[RTE_MBUF_DYN_NAMESIZE]; /**< Name of the dynamic flag. */
unsigned int flags; /**< Reserved for future use, must be 0. */
};
4.2 动态字段API操作
API名字 | 描述 |
---|---|
rte_mbuf_dynfield_register | 注册一个动态字段,或者返回已存在动态字段的偏移量 |
rte_mbuf_dynfield_register_offset | 在指定偏移处注册一个动态字段,或者返回已存在动态字段的偏移量 |
rte_mbuf_dynfield_lookup | 寻址一个已经注册的动态mbuf字段 |
rte_mbuf_dynflag_register | 注册一个动态标志,或者返回已存在动态标志的偏移值 |
rte_mbuf_dynflag_register_bitnum | 在指定偏移处注册一个动态标志,或者返回已存在动态标志的偏移值 |
rte_mbuf_dynflag_lookup | 寻址一个已经注册的动态mbuf标志 |
RTE_MBUF_DYNFIELD | 返回对应偏移位置的动态字段 |
rte_mbuf_dyn_dump | dump动态字段的名字和标识 |
RTE_MBUF_DYNFIELD_METADATA_NAME | rte_flow_dynfield_metadata |
RTE_MBUF_DYNFLAG_METADATA_NAME | rte_flow_dynflag_metadata |
RTE_MBUF_DYNFIELD_TIMESTAMP_NAME | rte_dynfield_timestamp |
RTE_MBUF_DYNFLAG_RX_TIMESTAMP_NAME | rte_dynflag_rx_timestamp,驱动填充timestamp |
rte_mbuf_dyn_rx_timestamp_register | 注册rx timestamp字段 |
RTE_MBUF_DYNFLAG_TX_TIMESTAMP_NAME | rte_dynflag_tx_timestamp |
rte_mbuf_dyn_tx_timestamp_register | 注册tx timestamp字段 |
RTE_MBUF_DYNFIELD_IP_REASSEMBLY_NAME | 卸载IP重组到驱动上。 |
RTE_MBUF_DYNFLAG_IP_REASSEMBLY_INCOMPLETE_NAME | IP重组未完成的信息。 |
当PMD(Poll Mode Driver,轮询模式驱动)在发送数据包时看到数据包上设置了RTE_MBUF_DYNFLAG_TX_TIMESTAMP_NAME标志,它会尝试将数据包出现在网络上的时间与指定的数据包时间戳同步。如果指定的时间戳是在过去,那么它应该被忽略;如果是在遥远的未来,那么它应该被限制在某个合理的值内(在秒的范围内)。
这里没有根据时间戳对数据包进行任何重新排序,无论是对于突发中的数据包,还是对于整个突发,这完全是应用程序的责任,以所需的顺序生成数据包及其时间戳。时间戳可能只放在突发中的第一个数据包中,提供整个突发的调度。
这个功能的主要作用是:
-
允许应用程序控制数据包的发送时间,实现更精确的发送调度。
-
PMD驱动会尝试将数据包实际发送的时间与应用程序指定的时间戳对齐,提高发送时间的精确性。
-
如果应用程序指定的时间戳不合理(过去或太远的未来),PMD会进行适当的处理,如忽略或限制在合理范围内。
-
应用程序需要自行维护发送数据包的顺序和时间戳,DPDK不会对此进行额外的处理。
-
对于批量发送的数据包(burst),可以只在第一个包上设置时间戳,用于控制整个burst的发送时间。
4.3 动态字段处理
(1) init_shared_mem(void)
函数用于初始化mbuf动态字段的信息,首先会初始化一个和mbuf一样大小的结构体内存mbuf_shm,里面用于模拟mbuf的动态字段排布情况。
(2) mbuf_shm里面固定字段初始化为0值,动态字段初始化为1值,调用process_score()函数,对动态字段按照对齐属性划分,比如对齐到8字节的空间每个字节都填充为8 。
(3) rte_mbuf_set_platform_mempool_ops,
5. 自定义内存池操作
DPDK (Data Plane Development Kit) 是一个用于快速数据包处理的开源库和框架。DPDK提供了许多功能和API,用于优化和加速网络数据平面的处理。其中一个功能是RTE Mbuf Pool Ops,它与内存池(mempool)的操作有关。
在DPDK中,mbuf(memory buffer)是一种用于存储网络数据包的内存结构。为了高效地管理和分配mbuf,DPDK使用了内存池的概念。内存池是一组预先分配的固定大小的内存块,可以快速地从池中分配和释放mbuf。
RTE Mbuf Pool Ops提供了一组API,用于配置mbuf池的操作(ops)名称,这些操作主要由rte_pktmbuf_pool_create()
函数使用。通过设置合适的mbuf池操作,可以优化内存池的性能和效率。
RTE Mbuf Pool Ops的主要作用包括:
-
设置mbuf池的操作名称 :可以使用相关的API函数,如
rte_mbuf_best_mempool_ops()
,来设置当前可用的最佳内存池操作名称。这样,在创建mbuf池时,就可以使用优化后的操作函数。 -
查询可用的mbuf池操作 :通过调用
rte_mbuf_pool_ops_get()
函数,可以获取当前可用的mbuf池操作名称。这对于了解系统支持的内存池操作以及选择合适的操作非常有帮助。 -
自定义mbuf池操作:DPDK允许用户根据特定需求自定义mbuf池的操作函数。通过实现自定义的alloc、free、enqueue、dequeue等函数,并将其注册到DPDK中,可以对内存池的行为进行定制化控制。
通过使用RTE Mbuf Pool Ops,可以灵活地配置和优化mbuf池的操作,从而提高数据包处理的性能。这对于高性能网络应用程序的开发非常重要,因为高效的内存管理和数据包处理可以显著提升系统的吞吐量和响应时间。
5.1 API操作
API名字 | 描述 |
---|---|
rte_mbuf_set_platform_mempool_ops | 注册平台硬件mempool内存池操作API,任意时刻都只能注册一个值。 |
rte_mbuf_platform_mempool_ops | 获取平台硬件mempool内存池操作API。 |
rte_mbuf_set_user_mempool_ops | 设置用户偏好的内存池操作API集合。 |
rte_mbuf_user_mempool_ops | 获取用户偏好的内存池操作API集合。 |
rte_mbuf_best_mempool_ops | 获取最佳的内存池操作集合:用户定义,平台硬件支持,编译时指定。 |
6. 报文类型
用32位字段的结构来表示数据包类型,被分成了几个子字段,每个子字段表示了数据包在对应协议层的类型信息,字段的划分如下:
0-3
位表示二层(L2)类型。4-7
位表示三层(L3)或者外层三层(用于隧道封装)类型 。8-11
位表示四层(L4)或者外层四层(用于隧道封装)类型。12-15
位表示隧道类型。16-19
位表示内层二层类型。20-23
位表示内层三层类型。24-27
位表示内层四层类型。28-31
位是保留位。
每个字段的值都是索引式的,即从一个预定义的类型值集合中取出。为了兼容 Vector PMD,一些特定的三层和四层类型值要按照特定的方式编排在连续的7个比特位中。
同时,不同的硬件可能对同一个数据包识别出不同的数据包类型组合,因为不同硬件的报文识别能力可能不同。
yacas
<'ether type'=0x0800
| 'version'=4, 'protocol'=0x29
| 'version'=6, 'next header'=0x3A
| 'ICMPv6 header'>
will be recognized on i40e hardware as packet type combination of,
RTE_PTYPE_L2_ETHER |
RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
RTE_PTYPE_TUNNEL_IP |
RTE_PTYPE_INNER_L3_IPV6_EXT_UNKNOWN |
RTE_PTYPE_INNER_L4_ICMP.
yacas
<'ether type'=0x86DD
| 'version'=6, 'next header'=0x2F
| 'GRE header'
| 'version'=6, 'next header'=0x11
| 'UDP header'>
will be recognized on i40e hardware as packet type combination of,
RTE_PTYPE_L2_ETHER |
RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
RTE_PTYPE_TUNNEL_GRENAT |
RTE_PTYPE_INNER_L3_IPV6_EXT_UNKNOWN |
RTE_PTYPE_INNER_L4_UDP.
6.1 类型值枚举
类型名 | 值 | 描述 |
---|---|---|
RTE_PTYPE_UNKNOWN | 0x00000000 | 无任何报文类型信息 |
RTE_PTYPE_L2_ETHER | 0x00000001 | 常见的外层以太报文(`[0x0800 |
RTE_PTYPE_L2_ETHER_TIMESYNC | 0x00000002 | 二层时间同步报文(0x88F7 ) |
RTE_PTYPE_L2_ETHER_ARP | 0x00000003 | 二层ARP报文(0x0806 ) |
RTE_PTYPE_L2_ETHER_LLDP | 0x00000004 | LLDP (Link Layer Discovery Protocol)(0x88CC ) |
RTE_PTYPE_L2_ETHER_NSH | 0x00000005 | NSH (Network Service Header)(0x894F ) |
RTE_PTYPE_L2_ETHER_VLAN | 0x00000006 | VLAN packet type(0x8100 ) |
RTE_PTYPE_L2_ETHER_QINQ | 0x00000007 | QinQ packet type(0x88a8 ) |
RTE_PTYPE_L2_ETHER_PPPOE | 0x00000008 | PPPOE packet type(`[0x8863 |
RTE_PTYPE_L2_ETHER_FCOE | 0x00000009 | FCoE packet type(0x8906 ) |
RTE_PTYPE_L2_ETHER_MPLS | 0x0000000a | MPLS packet type(`[0x8847 |
RTE_PTYPE_L2_MASK | 0x0000000f | Mask of layer 2 packet types. |
下面标识用于tunnel报文L3外层 | ||
RTE_PTYPE_L3_IPV4 | 0x00000010 | IPv4(`0x0800 |
RTE_PTYPE_L3_IPV4_EXT | 0x00000030 | IPv4 With Options(`0x0800 |
RTE_PTYPE_L3_IPV6 | 0x00000040 | IPv6(`0x86dd |
RTE_PTYPE_L3_IPV4_EXT_UNKNOWN | 0x00000090 | IPv4,可能携带Options,也可能不携带Options |
RTE_PTYPE_L3_IPV6_EXT | 0x000000c0 | IPv6(`0x86dd |
RTE_PTYPE_L3_IPV6_EXT_UNKNOWN | 0x000000e0 | IPv6(`0x86dd |
RTE_PTYPE_L3_MASK | 0x000000f0 | Mask of layer 3 packet types. |
下面标识用于tunnel报文L4外层 | ||
RTE_PTYPE_L4_TCP | 0x00000100 | TCP,协议6,无分帧。 |
RTE_PTYPE_L4_UDP | 0x00000200 | UDP,协议17,无分帧。 |
RTE_PTYPE_L4_FRAG | 0x00000300 | IPv4分帧报文,只能被识别为三层报文,因为四层的信息可能不完整。 |
RTE_PTYPE_L4_SCTP | 0x00000400 | SCTP (Stream Control Transmission Protocol) 协议132。 |
RTE_PTYPE_L4_ICMP | 0x00000500 | ICMP,IPv4协议为1,IPv6协议为0x3a。 |
RTE_PTYPE_L4_NONFRAG | 0x00000600 | 非上述识别出来的其他L40协议报文(非TCP/UDP/FRAG/SCTP/ICMP)。 |
RTE_PTYPE_L4_IGMP | 0x00000700 | IPv4 IGMP报文,协议2 |
RTE_PTYPE_L4_MASK | 0x00000f00 | Mask of layer 4 packet types. |
下面标识用于隧道协议 | ||
RTE_PTYPE_TUNNEL_IP | 0x00001000 | IPIP协议,协议4/41 |
RTE_PTYPE_TUNNEL_GRE | 0x00002000 | GRE协议,协议47 |
RTE_PTYPE_TUNNEL_VXLAN | 0x00003000 | VXLAN协议,协议17+目的端口4789 |
RTE_PTYPE_TUNNEL_NVGRE | 0x00004000 | NVGRE协议,协议47+协议类型0x6558 |
RTE_PTYPE_TUNNEL_GENEVE | 0x00005000 | GENEVE协议,协议17+目的端口6081 |
RTE_PTYPE_TUNNEL_GRENAT | 0x00006000 | Teredo, VXLAN, GRE混合, |
RTE_PTYPE_TUNNEL_GTPC | 0x00007000 | GTP-C控制报文,协议号17,端口2123 |
RTE_PTYPE_TUNNEL_GTPU | 0x00008000 | GTP-U用户数据报文,协议号17,端口2152 |
RTE_PTYPE_TUNNEL_ESP | 0x00009000 | ESP(IP层安全封装负载),协议50 |
RTE_PTYPE_TUNNEL_L2TP | 0x0000a000 | L2TP报文,V2(UDP+目的端口1701),V3(IP协议115) |
RTE_PTYPE_TUNNEL_VXLAN_GPE | 0x0000b000 | VXLAN-GPE,UDP协议+目的端口4790 |
RTE_PTYPE_TUNNEL_MPLS_IN_GRE | 0x0000c000 | MPLS-in-GRE,GRE+0x8848协议 |
RTE_PTYPE_TUNNEL_MPLS_IN_UDP | 0x0000d000 | MPLS-in-UDP,UDP+目的端口6635 |
RTE_PTYPE_TUNNEL_MASK | 0x0000f000 | Mask of tunneling packet types. |
下面标识用于隧道内层L2报文 | ||
RTE_PTYPE_INNER_L2_ETHER | 0x00010000 | IPv4或者IPv6 |
RTE_PTYPE_INNER_L2_ETHER_VLAN | 0x00020000 | VLAN报文,ID范围1-4095 |
RTE_PTYPE_INNER_L2_ETHER_QINQ | 0x00030000 | QINQ报文 |
RTE_PTYPE_INNER_L2_MASK | 0x000f0000 | Mask of inner layer 2 packet types. |
下面标识用于隧道内层L3报文 | ||
RTE_PTYPE_INNER_L3_IPV4 | 0x00100000 | IPv4协议,不携带Options。 |
RTE_PTYPE_INNER_L3_IPV4_EXT | 0x00200000 | IPv4协议,携带Options。 |
RTE_PTYPE_INNER_L3_IPV6 | 0x00300000 | IPv6协议,不包括选项扩展头部。 |
RTE_PTYPE_INNER_L3_IPV4_EXT_UNKNOWN | 0x00400000 | IPv4协议,不区分是否携带Options。 |
RTE_PTYPE_INNER_L3_IPV6_EXT | 0x00500000 | IPv6协议,携带选项扩展头部。 |
RTE_PTYPE_INNER_L3_IPV6_EXT_UNKNOWN | 0x00600000 | IPv6协议,不区分是否携带选项扩展头部。 |
RTE_PTYPE_INNER_L3_MASK | 0x00f00000 | Mask of inner layer 3 packet types. |
下面标识用于隧道内层L4报文 | ||
RTE_PTYPE_INNER_L4_TCP | 0x01000000 | TCP且IP不分片报文 |
RTE_PTYPE_INNER_L4_UDP | 0x02000000 | UDP且IP不分片报文 |
RTE_PTYPE_INNER_L4_FRAG | 0x03000000 | L4且IP分片报文 |
RTE_PTYPE_INNER_L4_SCTP | 0x04000000 | SCTP且IP不分片报文 |
RTE_PTYPE_INNER_L4_ICMP | 0x05000000 | ICMP且IP不分片报文 |
RTE_PTYPE_INNER_L4_NONFRAG | 0x06000000 | L4报文且IP不分片,但不属于以上类型 |
RTE_PTYPE_INNER_L4_MASK | 0x0f000000 | Mask of inner layer 4 packet types. |
RTE_PTYPE_ALL_MASK | 0x0fffffff | All valid layer masks. |
以及几个API函数: rte_get_ptype_l2_name,rte_get_ptype_l3_name,rte_get_ptype_l4_name,rte_get_ptype_tunnel_name,rte_get_ptype_inner_l2_name,rte_get_ptype_inner_l3_name,rte_get_ptype_inner_l4_name,rte_get_ptype_name。