p4 学习笔记
新版的p4编译器编译p4-14
p4c test.p4 -o meter --std p4-14 #p4-14和p4-16存在较大差异,参考p4代码时需注意
p4语言特性
- 无符号数bit类型的操作:此处我暂不明确是否包含 varbit

变长bit类型操作(只有有限的复制和比较操作)

p4程序处理流程
v1model
p4程序默认的包处理流程(不写入任何处理流程)
- 没有任何流表(默认的操作是 NoAction)

- 简单的模拟包

- 默认从入端口转发出去

- Egress控制块的作用(无法修改出端口)

(图片从 2014_arxiv_P4: Programming Protocol-Independent Packet Processor,即提出p4概念的论文中翻译而来)
v1model.p4源码阅读记录
外部对象(extern object)
extern void resubmit<T>(in T data);在 igress 控制块中调用将保留标准和用户元数据(保留的是 igress 控制块结束时候的值,不是调用resubmit时候的值)
只能用于 igress 控制块,且只能执行一次(若多次调用,也只是重新提交一个包)
extern void recirculate<T>(in T data);在 egress 控制块中调用将保留标准和用户元数据(保留的是 egress 控制块结束时候的值,不是调用recirculate时候的值)
只能用于 egress 控制块,且只能执行提供一次(若多次调用,也只是重新循环一个包)
extern void clone(in CloneType type, in bit<32> session);不保留标准和用户元数据
本质上类似与调用 clone3
extern void clone3<T>(in CloneType type, in bit<32> session, in T data);
支持的原语操作(p4-14和p4-16系统提供的函数)
- modify_field
- modify_field_rng_uniform
- add_to_field
- subtract_from_field
- add
- subtract
- bit_xor
- bit_and
- shift_left
- shift_right
- drop
- mark_to_drop
- generate_digest
- add_header
- add_header_fast
- copy_header
- clone_ingress_pkt_to_egress
- clone_egress_pkt_to_egress
- resubmit
- recirculate
- modify_field_with_hash_based_offset
- no_op
- execute_meter
- count
- register_read提供
- register_write
- truncate
commit
19cd6964994671a6da027e07c77d7d30c6ec99ce(Tue Jan 28 14:40:00 2020)- 添加寄存器的文档说明
- 更新元数据说明
- 修改了 resubmit 等外部变量的说明
652bc4af6d0dea30e51c84927c3b42e92c2b7ca3(Mon Jul 8 15:55:15 2019)- 删除了六个标准元数据
- clone_spec
- drop
- recirculate_port
- lf_field_list
- resubmit_flag
- recirculate_flag
- 删除了六个标准元数据
858cdf483dd7d245060d8caedb329596b2477816(Mon Jul 8 14:10:53 2019)- 修改了诸多 extern object 的注释
- extern counter
- extern meter
- extern void digest(in bit<32> receiver, in T data);
- extern void verify_checksum<T, O>(in bool condition, in T data, inout O checksum, HashAlgorithm algo);
- extern void update_checksum<T, O>(in bool condition, in T data, inout O checksum, HashAlgorithm algo);
- extern void verify_checksum_with_payload
- extern void update_checksum_with_payload
- extern void resubmit(in T data);
- extern void recirculate(in T data);
- extern void clone(in CloneType type, in bit<32> session);
- extern void clone3(in CloneType type, in bit<32> session, in T data);
- v1model 的 package 的各个部分
- 修改了诸多 extern object 的注释
bc7b75bd1892ab230c2ec2d125af8529cf092f4a(Mon Apr 4 13:33:49 2016)- P4 v1.2 compiler prototype
- 诸多 extern object 添加的日志
p4 学习笔记的更多相关文章
- C#数字图像处理算法学习笔记(三)--图像几何变换
C#数字图像处理算法学习笔记(三)--图像几何变换 几何图像处理包括 图像的平移变换,镜像变换,旋转变换,伸缩变换,在这里仅以水平镜像为例,通过代码来理解其基本操作方式: 翻转前:
- Webpack新手入门教程(学习笔记)
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; text-align: center; font: 30.0px Helvetica; color: #000000 } ...
- FFmpeg Basic学习笔记(3)
视频叠加--画中画效果 overlay video filter 视频叠加比较常见的应用场景是台标的叠加,在画面左上角.右上角.左下角或右下角叠加台标. ffmpeg提供的overlay filter ...
- OracleDesigner学习笔记1――安装篇
OracleDesigner学习笔记1――安装篇 QQ:King MSN:qiutianwh@msn.com Email:qqking@gmail.com 一. 前言 Oracle是当 ...
- C++ Primer学习笔记(二)
题外话:一工作起来就没有大段的时间学习了,如何充分利用碎片时间是个好问题. 接 C++ Primer学习笔记(一) 27.与 vector 类型相比,数组的显著缺陷在于:数组的长度是固定的,无法 ...
- 23 DesignPatterns学习笔记:C++语言实现 --- 2.6 Facade
23 DesignPatterns学习笔记:C++语言实现 --- 2.6 Facade 2016-07-22 (www.cnblogs.com/icmzn) 模式理解
- 23 DesignPatterns学习笔记:C++语言实现 --- 1.1 Factory
23 DesignPatterns学习笔记:C++语言实现 --- 1.1 Factory 2016-07-18 13:03:43 模式理解
- Flink学习笔记:异步I/O访问外部数据
本文为<Flink大数据项目实战>学习笔记,想通过视频系统学习Flink这个最火爆的大数据计算框架的同学,推荐学习课程: Flink大数据项目实战:http://t.cn/EJtKhaz ...
- amazeui学习笔记一(开始使用3)--兼容性列表compatibility
amazeui学习笔记一(开始使用3)--兼容性列表compatibility 一.总结 1.不要用ie做前端测试,不要碰ie,尽量用google 浏览器: 按照微软官方的说法,IE 开发者工具中的浏 ...
随机推荐
- C语言-内存函数的实现(一)之memcpy
C语言中的内存函数有如下这些 memcpy memmove memcmp memset 下面看看memcpy函数 memcpy 我们想想,之前有那个字符串拷贝的函数,即strcpy函数.都有拷贝的函数 ...
- Day17_101_IO_FileReaderAndFileWriterCopy
IO_FileReaderAndFileWriterCopy * 代码: import java.io.FileNotFoundException; import java.io.FileReader ...
- 以 DEBUG 方式深入理解线程的底层运行原理
说到线程的底层运行原理,想必各位也应该知道我们今天不可避免的要讲到 JVM 了.其实大家明白了 Java 的运行时数据区域,也就明白了线程的底层原理,不过把这些东西明明白白写在纸面上的,网络上的文章并 ...
- Nginx配置图片请求
Nginx的下载安装这里就不赘述了, 在Nginx的配置文件nginx.conf 或者 自定义的配置文件中加入如下配置. server { listen 80; server_ ...
- 缓冲区溢出分析第08课:MS06-040漏洞研究——动态调试
前言 经过上次的分析,我们已经知道了MS06-040漏洞的本质,那么这次我们就通过编程实现漏洞的利用. 编写漏洞利用程序的框架 这里我使用的是VC++6.0进行编写,需要将包含有漏洞的netapi32 ...
- Netcat瑞士军刀的简单使用
目录 Netcat 常用参数: 常见的用法: 端口扫描: 聊天 文件传输 反弹shell 蜜罐 Netcat Netcat 常称为 nc,拥有"瑞士军刀"的美誉.nc 小巧强悍,可 ...
- Windows下包管理工具Bower的安装和使用
目录 安装Bower Bower的使用 安装Bower Windows下安装Bower之前,先安装好 nodejs 和 msysgit 环境 然后我们就可以使用npm包管理工具下载并全局安装bower ...
- 安装google cloud sdk报错解决方法总结(超全)
前提:python环境最好是2.7,如果是python3可能会出很多小毛病:能用64位系统就尽量用64位,32位系统安装也很多毛病 一.Error1:Unzip Failed: Error openi ...
- 【python】Leetcode每日一题-直方图的水量(接雨水)
[python]Leetcode每日一题-直方图的水量(接雨水) [题目描述] 给定一个直方图(也称柱状图),假设有人从上面源源不断地倒水,最后直方图能存多少水量?直方图的宽度为 1. 上面是由数组 ...
- flex布局的使用
一.Flex布局是什么? Flex是Flexible Box的缩写,意为"弹性布局",用来为盒状模型提供最大的灵活性. 任何一个容器都可以指定为Flex布局. .box{ disp ...