---
title: 混合parser
description: "Hydra支持用户在使用自定义parser的同时使用硬件解析器，让用户减少编码工作量并获得更优的性能。"
url: https://www.hikunpeng.com/document/detail/zh/flexda/devguide/dpak_dev0046.html
sourcePath: /source/zh/flexda/devguide/dpak_dev0046.html
indexId: 8c2861384bb216f2885bde4294a4ac1744f30f034038b7e32dab5bd1b38e31b944
---
# 混合parser

Hydra支持用户在使用自定义parser的同时使用硬件解析器，让用户减少编码工作量并获得更优的性能。

#### 前提条件

使用混合parser必须遵循特定的语法要求。主要有两点要求：

- 用户必须在自定义parser的start state块起始处显式调用硬件解析器hdr_fix_parser。
- 用户若显示调用了hdr_fix_parser，则外层的自定义parser的第二个参数必须包含成员字段hdr_fix，其类型为hdr_fix_headers，字段名与字段类型必须严格符合要求。

- 调用hdr_fix_parser时不需要传递参数，即使传递了也会被自动忽略。
- Hydra本身不支持此情况以外的任何parser嵌套调用。


#### 解析方式

使用混合parser时，硬件解析器会帮助用户完成一部分报文头的解析，用户需要在此基础上继续向后解析报文。为了帮助用户定位报文解析完成的进度，在packet_in中提供了两个接口：


- layers_e hdr_last_layer_get();
  该接口返回硬件解析器解析完成的最后一层报文的层级，返回值是layers_e枚举。

- bit<16> hdr_last_layer_type_get();
  该接口返回硬件解析器解析完成的最后一层报文的协议类型，返回值是bit<16>无符号整数。


用户可以根据以上两个接口的返回值来决定下一步跳转到哪个解析步骤。


#### 混合parser使用示例

混合parser使用示例如下，可查看《Data Acceleration Kit 26.1.RC1 FlexDA 编程框架 API参考》，了解具体函数作用。

```
struct my_headers {
hdr_fix_headers       hdr_fix;
l3_union_t            inner_l3;
l4_union_t            inner_l4;
}
parser my_parser(packet_in packet, out my_headers hdr) {
state start {
hdr_fix_parser();
transition parse_1;
}
state parse_1 {
layers_e layer = packet.hdr_last_layer_get();
transition select(layer) {
layers_e.inner_l2 : parse_inner_l2;
default : accept;
}
}
state parse_inner_l2 {
packet.extract(hdr.hdr_fix.inner_l2, TYPE_ETH, layers_e.inner_l2);
/* ... */
}
}
RX_OVS(
my_parser(),
MyPrePipe(),
MyPostPipe()
) main;
```
