fix parser
对于常见报文类型和常见报文结构,代码里配备了默认的硬件解析器。当硬件解析器支持的协议能够满足用户需求时,用户可以不使用自定义parser,选择使用hydra_parser.hdr架构文件中提供的hdr_fix_parser作为解析器,此时解析将由硬件来完成,可以简化编程并取得较好的性能。
硬件解析器
硬件解析器支持的默认协议如下所示。
header_union l3_union_t {
ipv4_t ipv4;
ipv6_t ipv6;
}
header_union l4_union_t {
tcp_t tcp;
udp_t udp;
icmp_t icmp;
}
header_union tunnel_union_t {
vxlan_t vxlan;
geneve_t geneve;
nvgre_t nvgre;
}
struct hdr_fix_headers {
ethernet_t ethernet;
vlan_t vlan;
l3_union_t l3;
l4_union_t l4;
tunnel_union_t tunnel;
ethernet_t inner_ethernet;
vlan_t inner_vlan;
l3_union_t inner_l3;
l4_union_t inner_l4;
}
场景 |
报文类型 |
最大解析深度 |
备注 |
|---|---|---|---|
非隧道报文 |
TCP(tso)、UDP(ufo)、ICMP |
L4 |
无 |
IPv4,IPv6 |
L3 |
无 |
|
其他 |
L2 |
无 |
|
隧道报文 |
vxlan、geneve |
外层隧道完全解析,隧道内层参考非隧道报文场景 |
不支持两层以上隧道 |
ipip、gre |
外层L3 |
无 |
使用示例
- 用户可直接使用hdr_fix_parser()作为parser组件实例化package,此时需要将hdr_fix_headers结构体作为control对应的入参,以在control中使用hdr_fix_parser解析结果。
- 用户不可自定义名为hdr_fix_headers的结构体,不可自定义名为hdr_fix_parser的parser组件,编译器会做相应的检查。
Fix Parser使用示例如下所示。
control MyPrePipe(in hdr_fix_headers hdr) {
/* body omitted*/
}
control MyPostPipe(in hdr_fix_headers hdr) {
/* body omitted*/
}
RX_OVS(
hdr_fix_parser(),
MyPrePipe(),
MyPostPipe()
) main;
父主题: packet parser