Table

table是p4的匹配——动作表,定义了匹配字段(key)、动作(action)和一些其他相关属性。

其处理数据包的流程:

  1. Key construction.建立其匹配字段
  2. Key lookup in a lookup table.The result of key lookup is an "action". 数据包中去匹配table中的key中的字段,并获得要执行的"action"。
  3. Action execution.执行动作。

key

key由一个个表单对组成(e:m),其中e是对应数据包中匹配的字段,而m是一个match_kind常数用来表示匹配的算法。

例如:

 key = {
hdr.ipv4.dstAddr:lpm;
}

这个就是以ipv4头的目的地址作为匹配字段,采用的是lpm(最长前缀字段)匹配方式。

p416 core现在提供三种默认的match_kind。

 match_kind{
lpm,//最长前缀字段
ternary,//三元匹配
exact//完全匹配
}

Action

table中的action list是列举了该table支持的action类型。用于action的匹配。

其他属性

p416提供了一些预设的其他属性:

  • default_action:当table miss的时候执行的动作。
  • counters:计数器
  • size:table大小
  • implementation:指定table实际运作方式,这部分通常取决于架构,例如v1model中actionprofile提供了通过hash的方式随机选择一个actionprofilemember去执行。
  • const entries:预设的table entry,在编译阶段会写到编译好的档案中。

Action

关于action,p4中在table里可以利用action去对封包做出处理,action非常类似于其他高级语言中所示的函数,抽象程度可以很高,并且表现出协议无关的特性。这也能体现一部分p4的扩展性。

action可以读取控制平面(control plane)提供的数据进行操作,然后根据action的代码内容影响数据平面(data plane)的工作。

对于action的定义:

 action action_name(parameter1,parameter2,……){
//语句块
}

而且p4有提供不少基本操作(Primitive Actions),这些action高度抽象,在p416中,大部分的基本操作被移动到了一些函数库中(arch.p4或者vendor.p4),部分操作依然保留在了core.p4中。更多详细的内容在spec中。

例如ipv4转发的code:

 action ipv4_forward(bit<> dstAddr,bit<> port){
standard_metadata.egress_spec = port;
hdr.ethernet.srcAddr = hdr.ethernet.dstAddr;
hdr.ethernet.dstAddr = dstAddr;
hdr.ipv4.ttl = hdr.ipv4.ttl - ;
}

样例

这里用tutorial中的ipv4转发代码做样例。

 action drop(){
mark_to_drop();//将要丢弃的包标记为丢弃
} action ipv4_forward(bit<> dstAddr,bit<> port){
standard_metadata.egress_spec = port;
hdr.ethernet.srcAddr = hdr.ethernet.dstAddr;
hdr.ethernet.dstAddr = dstAddr;
hdr.ipv4.ttl = hdr.ipv4.ttl - ;
}
table ipv4_lpm{
key = {
hdr.ipv4.dstAddr: lpm;
} actions = {
ipv6_forward;
drop;
NoAction;
} size = ; default_action = drop();
}

然后给一个switch中定义的流表项:

 {
"table": "MyIngress.ipv4_lpm",
"match": {
"hdr.ipv4.dstAddr": ["10.0.1.1", ]
},
"action_name": "MyIngress.ipv4_forward",
"action_params": {
"dstAddr": "00:00:00:00:01:01",
"port":
}
}

这个table就是对应ipv4.lpm的,匹配的dstAddr为10.0.1.1,执行的action为ipv4.forward,传入的两个参数为mac地址00:00:00:00:01:01,端口1。

P4语法(3)Table,Action的更多相关文章

  1. P4语法(4)Control block

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

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

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

  3. P4语法(2) Parser

    这里参考学习了: P4语言规范 P4台湾社群 Parser 关于parser 在P4程序中,有着大量的首部(header)和首部实例,但每次只有部分首部实例会对数据包进行操作,而parser会用于生成 ...

  4. Sublime P4语法高亮设置

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

  5. P4语法(5) Package

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

  6. MySQL create table语法详解

    前面在查建表时key和index的区别时,发现建表语句包含了太多信息,于是完整看看官方手册的这一小节. 该文章根据MySQL 5.7的手册作笔记,而MySQL 8.0该节地址如下: https://d ...

  7. HTML语法大全

      卷标 , 属性名称 , 简介  002 <! - - ... - -> 批注  003 <!> 跑马灯  004 <marquee>...</marque ...

  8. Oracle Update 语句语法与性能分析 - 多表关联

    Oracle Update 语句语法与性能分析 - 多表关联   为了方便起见,建立了以下简单模型,和构造了部分测试数据: 在某个业务受理子系统BSS中, SQL 代码 --客户资料表 create ...

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

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

随机推荐

  1. .net下redis和rabbitmq简单使用demo

    是参考 一下两篇博文整理了下. Redis:   https://www.cnblogs.com/5ishare/p/6492380.html RabbitMq:   https://www.cnbl ...

  2. tp5多入口配置

    手册里可能有写,但不是特别清晰,在这给个实例,有两种方式: 1.多个入口文件: 将public下的index.php复制一份,粘贴.重命名为对应模块的名字,如admin: 编辑admin.php的内容 ...

  3. nRF52832 BLE_DFU空中升级OTA(二)编译下载(SDK14.2.0)

    上一篇配置好了开发环境,现在就可以试着跑一下例程了,这里需要两个例程,一个是bootloader的,一个是应用程序的,其路径分别为: bootloader:SDK_14.2.0工程\examples\ ...

  4. linux3.4.2内核之块设备驱动

    1. 基本概念: 扇区(Sectors):任何块设备硬件对数据处理的基本单位.通常,1个扇区的大小为512byte.(对设备而言) 块  (Blocks):由Linux制定对内核或文件系统等数据处理的 ...

  5. 【Mac】安装 tesserocr 遇到的一些坑(‘cinttypes' file not found)

    问题描述 tesserocr 是 Python 的一个光学字符识别库,它其实是对 tesseract 做的一层 Python API 封装,所以在安装这个库之前我已经用 Homebrew 成功安装好了 ...

  6. tensorflow 模型权重导出

    tensorflow在保存权重模型时多使用tf.train.Saver().save 函数进行权重保存,保存的ckpt文件无法直接打开,不利于将模型权重导入到其他框架使用(如Caffe.Keras等) ...

  7. 纪中OJ 2019.02.15【NOIP提高组】模拟 B 组 梦回三国 比赛题解(第一个)

    声明 旁边的同学小 H(胡)对我说: “哟,比赛拿了 140,强!要知道,如果哥第三题 AC 了,哥就 230 了,你个废柴!!!(比赛实际分数 130 额呵)” 顿时,千万草泥马从我心中奔腾而过:你 ...

  8. 20155213 2016-2017-2 《Java程序设计》第六周学习总结

    20155213 2016-2017-2 <Java程序设计>第六周学习总结 教材学习内容总结 输入与输出 串流设计 流(Stream)是对「输入输出」的抽象,注意「输入输出」是相对程序而 ...

  9. 20145234黄斐《java程序设计》第二周

    教材学习内容总结 类型 Java可区分为基本类型(Primitive Type)和类类型(Class Type),其中类类型也叫参考类型(Reference Type). 字节类型,也叫byte类型, ...

  10. sql语句-6-高级查询