这里参考学习了:

P4语言规范

P4台湾社群


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;//接受
}
}

 

最新文章

  1. jQuery最基础最全面的选择器大览
  2. poj1323-Game Prediction(贪心思想)
  3. mysql批量替换单字段
  4. Windows7无法访问(远程登录)Windows 2003共享问题解决
  5. Useful Qt Examples
  6. Json lib集成stucts2的使用方法 抛出 NestableRuntimeException异常的解决办法
  7. VB 增强的部件与引用
  8. jsonp跨域请求学习笔记
  9. JUit——(三)JUnit核心对象(测试、测试类、Suit和Runner)
  10. PHP学习(1)——我为什么要学PHP
  11. 如何解决串session:
  12. CentOS 7静默安装Oracle 11g R2数据库软件
  13. How to get all Errors from ASP.Net MVC modelState?
  14. vue中的slot插槽
  15. thinkphp 3.2.3在nginx+php下的url重写配置经验
  16. C++11新特性——大括号初始化
  17. .Net中的序列化和反序列化详解
  18. 设置UCHome注册登陆退出的跳转页自定义
  19. BASE64Encoder及BASE64Decoder编译器找不到问题
  20. PPP interface for lwIP

热门文章

  1. 前端优化:css雪碧图实践应用详解
  2. 对象转换成JSON字符串
  3. python学习笔记:第14天 内置函数补充和递归
  4. 使用gogs和glide来轻松拉取golang第三方库
  5. 使用JAX-WS(JWS)发布WebService(一)
  6. mybatis入门(二):增删改查
  7. 通过c#操作word文档的其他方式
  8. 使用cgroups来控制磁盘IO带宽
  9. LeetCode: 56. Merge Intervals(Medium)
  10. MySQL高级-性能分析Explain