这里参考学习了:

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

 

P4语法(2) Parser的更多相关文章

  1. P4语法(5) Package

    Package 对于package这个概念,类似于将一个框架中各组成部件以一个规律进行打包,以正常运转. 基于一个架构去编写一个新的pipeline的时候,需要先了解初始化的时候需要提供那些东西,pa ...

  2. P4语法(1)基础数据类型和Header

    文章学习自:P4语言编程详解 由于原文有一点的年份,所以也继续阅读了相关的最新规范. P4语言规范 基础数据类型 布尔型(bool) 运算符 描述 and 双目运算符,结果为布尔型 or 双目运算符, ...

  3. Sublime P4语法高亮设置

    Github插件链接:p4-syntax-highlighter 首先安装Package Control. 进入Package界面,我的目录: /Users/wasdns/Library/Applic ...

  4. P4语法(4)Control block

    Control block Control block之中用于放置设计好的Table和Action. 可以把control block认为是pipeline的一个模板,之前用的v1model中就是in ...

  5. P4语法(3)Table,Action

    Table table是p4的匹配——动作表,定义了匹配字段(key).动作(action)和一些其他相关属性. 其处理数据包的流程: Key construction.建立其匹配字段 Key loo ...

  6. 【P4语言学习】Parser解析器

    参考文章:王垠:谈谈Parser 簡單介紹 P4 語言(一)- Parser 什么是Parser 传统的parser,一般出现在编译器和编译原理课程中,援引<谈谈Parser>的定义: 首 ...

  7. Run P4 without P4factory - A Simple Example In Tutorials. -2 附 simple_router源码

    /* Copyright 2013-present Barefoot Networks, Inc. Licensed under the Apache License, Version 2.0 (th ...

  8. p4-hlir/test源码 stateful.p4 control_flow_opt.p4

    stateful.p4 #include "includes/headers.p4" #include "includes/parser.p4" action ...

  9. arTemplate解析语法

    模板解析语法 defaults.parser = function (code, options) { // var match = code.match(/([\w\$]*)(\b.*)/); // ...

随机推荐

  1. JS原生评分组件

    JS原生评分组件 <html> <head> <meta http-equiv="Content-Type" content="text/h ...

  2. Elasticsearch 索引操作

    一.创建 语法: PUT /索引库名称 { "settings": { "number_of_shards": 分片数量, "number_of_re ...

  3. 在多字节的目标代码页中,没有此 Unicode 字符可以映射到的字符。 (#1113)

    报错 在使用MySQL-Front导入sql文件时报错1113:在多字节的目标代码页中,没有此 Unicode 字符可以映射到的字符. (#1113) 解决方案 导入.sql文件时,单击 选择文件对话 ...

  4. java synchronized 关键字原理

    Synchronized 关键字是解决并发问题常用解决方案,有以下三种使用方式: 同步普通方法,锁的是当前对象.同步静态方法,锁的是当前 Class 对象.同步块,锁的是 {} 中的对象. 实现原理: ...

  5. Makefile中的$(MAKE)

    今天看uboot2018顶层的Makefile中发现文件中export一个MAKE变量,export是为了向底层的Makefile传递这些变量参数,但是找了半天没有找到这个MAKE变量在哪定义的. 决 ...

  6. 教你阅读MSDN英文文档,迅速提升编程能力

    在教大家阅读英文文档之前,首先给大家明确一个概念.C#和.NET的区别? 有一定编程经验的同学应该多多少少知道这方面的概念,但是可能模糊,理解的不一定深刻.我在这里简单给出两者的基本定义: C#:仅仅 ...

  7. 使用MATLAB设计FIR滤波器

    1.      采用fir1函数设计,fir1函数可以设计低通.带通.高通.带阻等多种类型的具有严格线性相位特性的FIR滤波器.语法形式: b = fir1(n, wn) b = fir1(n, wn ...

  8. 天津Uber优步司机奖励政策(12月28日到12月29日)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...

  9. miniz库简介及使用

    miniz:Google开源库,它是单一的C源文件,紧缩/膨胀压缩库,使用zlib兼容API,ZIP归档读写,PNG写方式.关于miniz的更详细介绍可以参考:https://code.google. ...

  10. PHP数组中插入元素

    1. array_unshift()数组头插入新元素 $fruits = array('apple','pear','banana','orange'); array_unshift($fruits, ...