Golang编程语言知识介绍


  • 首页

  • todo

  • 思考

  • life

  • food

  • OS

  • lua

  • redis

  • Golang

  • C

  • TCP/IP

  • ebpf

  • p4

  • OpenVPN

  • IPSec

  • L2TP

  • DNS

  • distributed

  • web

  • OpenWRT

  • 运维

  • Git

  • 鸟哥的私房菜

  • IT杂谈

  • 投资

  • About Me

  • 友情链接

  • FTP

  • 搜索
close

P4 语法之 Parser 转载系列 3

时间: 2023-09-12   |   分类: p4     |   阅读: 810 字 ~2分钟

这里参考学习了:

P4语言规范


Parser

关于parser

在P4程序中,有着大量的首部(header)和首部实例,但每次只有部分首部实例会对数据包进行操作,而parser会用于生成描述数据包进行哪些匹配动作操作的中间表示(Intermediate Representation),这些解析后表示规定了对数据包生效的实例,可以认为是一组对数据包生效的实例的集合。

p416中的parser

不同于p414,不需要定义多个parser,并在多个parser间切换,只需要定义一个parser,并在parser中写不同的状态(state),通过accept(接受)和reject(拒绝)决定parser是否成功解析一个包。

类型声明

参数中至少有一个参数packet_in,表示处理的接受数据包。输出内容可以是struct或者一般的封包参照。

1 parser parsername(packet_in pkt,out ...)

``其起始方式依然以start开始:

parser parsername(packet_in pkt,out ...){
     state start{
         ...
     }
     
     state state_name{
         ...
     }
}

对于其中常用的关键字语法:

  • extract:将目前的packet以特定的header取出来,取出来的各部分长度以header定义的为主。
  • select:类似于c中的switch case语法,取决于参数通过transition关键字决定接下来的跳转方向,另一个parser state 或 control function。
  • transition:在不同的state之间切换。

这里给出一个以太网ipv4的parser例子:

parser parser_ipv4(packet_in pkt,out eth,out ipv4){    
    state start{
        transition eth;//先转至以太网部分处理。
    }
    
    state eth{
        pkt.extract(eth);
        //根据以太网首部类型判断,除了ipv4以外的都抛出。
        transition select(eth.ethType){
            0x0800:i4;
            _:reject;//其余情况拒绝抛出。
        }
    }
    
    state i4{
        pkt.extract(ipv4);
        transition accept;//接受
    }
}

对于ipv6也是一个类似的逻辑:

parser parser_ipv6(packet_in pkt,out eth,out ipv4){
    
    state start{
        transition eth;
    }
    
    state eth{
        pkt.extract(eth);
        transition select(eth.ethType){
            0x86DD:i6;
            _:reject;//其余情况拒绝抛出。
        }
    }
    
    state i6{
        pkt.extract(ipv6);
        transition accept;//接受
    }
}

以上内容转载自本链接

#p4#
P4语法(3)Table,Action 转载系列 4
基础数据类型和Header-转载系列 2
shankusu2017@gmail.com

shankusu2017@gmail.com

日志
分类
标签
GitHub
© 2009 - 2025
粤ICP备2021068940号-1 粤公网安备44011302003059
0%