P4语法(2) Parser
2024-10-15 14:30:18
这里参考学习了:
Parser
关于parser
在P4程序中,有着大量的首部(header)和首部实例,但每次只有部分首部实例会对数据包进行操作,而parser会用于生成描述数据包进行哪些匹配动作操作的中间表示(Intermediate Representation),这些解析后表示规定了对数据包生效的实例,可以认为是一组对数据包生效的实例的集合。
p416中的parser
不同于p414,不需要定义多个parser,并在多个parser间切换,只需要定义一个parser,并在parser中写不同的状态(state),通过accept(接受)和reject(拒绝)决定parser是否成功解析一个包。
类型声明
参数中至少有一个参数packet_in,表示处理的接受数据包。输出内容可以是struct或者一般的封包参照。
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;//接受
}
}
最新文章
- jQuery最基础最全面的选择器大览
- poj1323-Game Prediction(贪心思想)
- mysql批量替换单字段
- Windows7无法访问(远程登录)Windows 2003共享问题解决
- Useful Qt Examples
- Json lib集成stucts2的使用方法 抛出 NestableRuntimeException异常的解决办法
- VB 增强的部件与引用
- jsonp跨域请求学习笔记
- JUit——(三)JUnit核心对象(测试、测试类、Suit和Runner)
- PHP学习(1)——我为什么要学PHP
- 如何解决串session:
- CentOS 7静默安装Oracle 11g R2数据库软件
- How to get all Errors from ASP.Net MVC modelState?
- vue中的slot插槽
- thinkphp 3.2.3在nginx+php下的url重写配置经验
- C++11新特性——大括号初始化
- .Net中的序列化和反序列化详解
- 设置UCHome注册登陆退出的跳转页自定义
- BASE64Encoder及BASE64Decoder编译器找不到问题
- PPP interface for lwIP