新版的p4编译器编译p4-14

p4c test.p4 -o meter --std p4-14 #p4-14和p4-16存在较大差异,参考p4代码时需注意

p4语言特性

  • 无符号数bit类型的操作:此处我暂不明确是否包含 varbit

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

p4程序处理流程

v1model
  • p4程序默认的包处理流程(不写入任何处理流程)

    1. 没有任何流表(默认的操作是 NoAction)

    1. 简单的模拟包

  1. 默认从入端口转发出去

  • 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)

      1. 添加寄存器的文档说明
      2. 更新元数据说明
      3. 修改了 resubmit 等外部变量的说明
    • 652bc4af6d0dea30e51c84927c3b42e92c2b7ca3 (Mon Jul 8 15:55:15 2019)

      1. 删除了六个标准元数据

        1. clone_spec
        2. drop
        3. recirculate_port
        4. lf_field_list
        5. resubmit_flag
        6. recirculate_flag
    • 858cdf483dd7d245060d8caedb329596b2477816 (Mon Jul 8 14:10:53 2019)

      1. 修改了诸多 extern object 的注释

        1. extern counter
        2. extern meter
        3. extern void digest(in bit<32> receiver, in T data);
        4. extern void verify_checksum<T, O>(in bool condition, in T data, inout O checksum, HashAlgorithm algo);
        5. extern void update_checksum<T, O>(in bool condition, in T data, inout O checksum, HashAlgorithm algo);
        6. extern void verify_checksum_with_payload
        7. extern void update_checksum_with_payload
        8. extern void resubmit(in T data);
        9. extern void recirculate(in T data);
        10. extern void clone(in CloneType type, in bit<32> session);
        11. extern void clone3(in CloneType type, in bit<32> session, in T data);
        12. v1model 的 package 的各个部分
    • bc7b75bd1892ab230c2ec2d125af8529cf092f4a (Mon Apr 4 13:33:49 2016)

      1. P4 v1.2 compiler prototype
      2. 诸多 extern object 添加的日志

p4 学习笔记的更多相关文章

  1. C#数字图像处理算法学习笔记(三)--图像几何变换

    C#数字图像处理算法学习笔记(三)--图像几何变换 几何图像处理包括 图像的平移变换,镜像变换,旋转变换,伸缩变换,在这里仅以水平镜像为例,通过代码来理解其基本操作方式: 翻转前:

  2. Webpack新手入门教程(学习笔记)

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; text-align: center; font: 30.0px Helvetica; color: #000000 } ...

  3. FFmpeg Basic学习笔记(3)

    视频叠加--画中画效果 overlay video filter 视频叠加比较常见的应用场景是台标的叠加,在画面左上角.右上角.左下角或右下角叠加台标. ffmpeg提供的overlay filter ...

  4. OracleDesigner学习笔记1――安装篇

    OracleDesigner学习笔记1――安装篇   QQ:King MSN:qiutianwh@msn.com Email:qqking@gmail.com 一.       前言 Oracle是当 ...

  5. C++ Primer学习笔记(二)

    题外话:一工作起来就没有大段的时间学习了,如何充分利用碎片时间是个好问题. 接  C++ Primer学习笔记(一)   27.与 vector 类型相比,数组的显著缺陷在于:数组的长度是固定的,无法 ...

  6. 23 DesignPatterns学习笔记:C++语言实现 --- 2.6 Facade

    23 DesignPatterns学习笔记:C++语言实现 --- 2.6 Facade 2016-07-22 (www.cnblogs.com/icmzn) 模式理解

  7. 23 DesignPatterns学习笔记:C++语言实现 --- 1.1 Factory

    23 DesignPatterns学习笔记:C++语言实现 --- 1.1 Factory 2016-07-18 13:03:43 模式理解

  8. Flink学习笔记:异步I/O访问外部数据

    本文为<Flink大数据项目实战>学习笔记,想通过视频系统学习Flink这个最火爆的大数据计算框架的同学,推荐学习课程: Flink大数据项目实战:http://t.cn/EJtKhaz ...

  9. amazeui学习笔记一(开始使用3)--兼容性列表compatibility

    amazeui学习笔记一(开始使用3)--兼容性列表compatibility 一.总结 1.不要用ie做前端测试,不要碰ie,尽量用google 浏览器: 按照微软官方的说法,IE 开发者工具中的浏 ...

随机推荐

  1. Palindromes UVA - 401

    ​ A regular palindrome is a string of numbers or letters that is the same forward as backward. For e ...

  2. IDEA关于-javaagent中文路径导致无法debug的初步解决方案

    IDEA明明是装在D盘的纯英文路径,而且java的相关环境变量全部是在英文路径,结果还是因为中文路径的问题导致无法debug.仔细观察,发现这个中文路径是作为java的-javaagent的参数输入的 ...

  3. Google字体API使用简单示例

    一.前面的话 Google总会做些造福大众的事情,例如提供了web在线字体的API,这玩意其实去年就有了,但是字体种类手指头+脚趾头就可以数出来.but 最近,貌似Google对字体API进行了升级, ...

  4. 逆向工程第005篇:跨越CM4验证机制的鸿沟(下)

    一.前言 本文是逆向分析CM4系列的最后一篇,我会将该游戏的序列号验证机制分析完毕,进而编写出注册码生成器. 二.分析第二个验证循环 延续上一篇文章的内容,来到如下代码处: 图1 上述代码并没有特别需 ...

  5. hdu4995 (不错的小模拟)

    题意:       输入n,m,k ,给你n个点,他们在一个一维坐标上,每个点有两个值,一个是坐标,另一个是价值,然后有m组操作,每次操作给一个坐标,意思就是把当前这个坐标的点距离他最近的k个点(相等 ...

  6. Linux配置NTP时间服务器(date、hwclock、NTP服务器的配置)

    目录 date命令 hwclock命令 NTP服务的部署 服务端 客户端 date命令 date 命令的作用是查看和设置Linux中的系统日期时间 date                      ...

  7. Python中Selenium模块的使用

    目录 Selenium的介绍.配置和调用 Selenium的配置 Selenium的调用 Selenium的使用 定位 定位元素的使用 定位下拉标签元素 在iframe框架之间切换 上传文件 Webd ...

  8. 用户模式下的线程同步的分析(Windows核心编程)

    线程同步 同一进程或者同一线程可以生成许多不同的子线程来完成规定的任务,但是多个线程同时运行的情况下可能需要对某个资源进行读写访问,比如以下这个情况:创建两个线程对同一资源进行访问,最后打印出这个资源 ...

  9. Win64 驱动内核编程-34.对抗与枚举MiniFilter

    对抗与枚举MiniFilter MiniFilter 是目前杀毒软件用来实现"文件系统自我保护"和"文件实时监控"的方法. 由于 MiniFilter 模型简单 ...

  10. 【Git】2. Git常用命令详解、版本切换原理

    一.新增文件 1.设置用户签名 签名的作用就是为了区分不同的人,方便查看版本的时候知道操作的人是谁.首次安装好git之后必须设置一下签名,否则无法提交代码. 另外,这里设置的签名跟你登录到远程仓的账号 ...