鲲鹏社区首页
中文
注册
开发者
我要评分
获取效率
正确性
完整性
易理解
在线提单
论坛求助

fix parser

对于常见报文类型和常见报文结构,代码里配备了默认的硬件解析器。在没有自定义报文的情况下,用户可直接使用hydra_parser.hdr架构文件中提供的hdr_fix_parser作为解析器,简化编程。

硬件解析失败的报文,会上送至上层软件进行处理,例如构造flag为0的异常TCP报文,会统一转发至上层软件处理。

硬件解析器

硬件解析器支持的默认协议如下所示。

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;
    vxlan_t               vxlan;
    geneve_t              geneve;
    nvgre_t               nvgre;
    ethernet_t            inner_ethernet;
    vlan_t                inner_vlan;
    l3_union_t            inner_l3;
    l4_union_t            inner_l4;
}
表1 硬件解析器使用场景

场景

报文类型

最大解析深度

备注

非隧道报文

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;