前言

可以通过此博客了解P4部署硬件的流程以及编程结构,对重要的match-action部分内容进行了补充。

本文目录

  • 前言
  • P4语言
  • P4架构模型
  • P4可编程块
  • P4编程举例
    • 头定义
    • 解析器实现
    • 什么是 match-action pipeline?
    • 控制块:table实现
      • key
      • action
      • 其他属性
    • 控制块:apply块实现
  • P4 程序编译和执行
  • 参考资料

P4语言


  • P416在P414的基础上降低了语言的复杂度以及提供了核心语言库。
  • 最重要的就是P416引入了P4架构模型,定义给定数据平面存在的所有功能块。

P4架构模型

下面是P4通用架构模型介绍:

  • 数据包将以流水线的形式被处理,将逐个访问所有块。
  • 所有块分为固定块和可编程块。


tips:P4部署设备有好几种,每一种的架构细看不太一样,需要根据厂商给的架构模型来设计程序。目前我所了解到的由V1MODLE、PSA、PISA、VSA、TNA。

  • PISA架构中所有块都是可编程的

P4可编程块

  • 解析器:一种状态机,标识正在处理的数据包头。
  • 控制块:匹配-动作表、执行检查和验证、解析等。

P4编程举例

头定义

所有需要使用的协议都需要自定义格式;左边的片段定义了ethernet的头部和ipv4的报头,右上片段自定义了一个协议报头,右下片段可以将所有结构体结合在一个结构体中。

解析器实现

  • 解析器就像一个状态机,定义每个状态的结构。

什么是 match-action pipeline?

  • pipeline中每个独立的control块有独立的表

控制块:table实现

  • 表块分为action和table部分,其中table里面有一个key用于匹配定义条件,action定义相关操作。

补充资料:P4语法(3)Table,Action - 水喵桑 - 博客园 (cnblogs.com)

匹配动作表定义了匹配字段(key)、动作(action)等相关属性,其处理数据包的流程:

  1. 建立其匹配字段key
  2. 数据包中去匹配table中的key中的字段,并获得要执行的"action"。
  3. 执行动作action

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类型

  • 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<48> dstAddr,bit<9> port){standard_metadata.egress_spec = port;hdr.ethernet.srcAddr = hdr.ethernet.dstAddr;hdr.ethernet.dstAddr = dstAddr;hdr.ipv4.ttl = hdr.ipv4.ttl - 1;
}

其他属性

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

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

控制块:apply块实现

  • 每个控制块包含一个apply子块,定义数据包处理中那个表会被使用以及应用的顺序。
  • 示例中的代码就是定义了ecmp_group和ecmp_nhop两个表的使用及顺序。

P4 程序编译和执行

  1. 检查设备符合的模型架构,了解模型功能以及限制
  2. 编写完整的P4代码
  3. 使用设备制造商提供的编译器编译P4代码
  4. 编译器将代码编译成特定的二进制文件,该二进制文件被加载到目标设备。
  5. 控制平面软件管理和控制由P4定义的数据平面,例如使用一些开源软件作为终端控制器。

参考资料

  1. 【P4可编程】ONF2021 P4Workshop-从四个维度看P4可编程交换机_哔哩哔哩_bilibili
  2. P416 Programming for Intel Tofino Using Intel P4 Studio - Vladimir Gurevich & Andy Fingerhut, Intel - YouTube
  3. P4 programming language - introduction to network programming with P4 - YouTube
    Note:主要来源于第三个视频,讲的很好,适合浅显了解。深入了解建议直接看p4官网和官方库。

【P4lang】什么是P4?相关推荐

  1. P4 前端编译器p4c-bm、后端编译器bmv2命令安装 make error问题

    参考:Github 安装p4c-bm: sudo pip install -r requirements.txtsudo pip install -r requirements_v1_1.txt // ...

  2. P4编程环境安装(ubuntu16.04,p4c+bmv2+mininet+PI+tutorial)

    安装过程 我的安装过程大多参考(copy)P4编程环境搭建+实现tutorials中basic的案例,并对某些安装出现的问题进行简要说明. 我使用的版本环境如下: Ubuntu 16.04 Deskt ...

  3. P4 Tutorial 快速上手 (1) 教程库简介

    P4 Tutorial 快速上手 (1) 教程库简介 提示:本系列仅适用于软件交换机BMv2 P4 Tutorial 快速上手系列 (2) 文章目录 P4 Tutorial 快速上手 (1) 教程库简 ...

  4. P4/tutorials/exercises 官方练习

    写在前面 Basic Forwarding (基础ipv4转发) Basic Tunneling(隧道) P4Runtime(控制器) Explicit Congestion Notification ...

  5. P4 Tutorial 快速上手 (3) Basic_tunnel

    P4 Tutorial 快速上手 (3) Basic_tunnel 提示:本系列仅适用于软件交换机BMv2 P4 Tutorial 快速上手 (2) 文章目录 P4 Tutorial 快速上手 (3) ...

  6. P4使用Ubuntu中安装教程

    /*************************************/ 补充,2020年5月11日 13点18分 有同学说网络环境啥的,获取安装包比较困难,我把大概要用的安装包放到百度网盘了, ...

  7. P4 安装bmv2 详细教程(更新中。。)

    Ubuntu版本 20.04 1.下载 && 安装依赖 Github链接: GitHub - p4lang/behavioral-model: The reference P4 sof ...

  8. p4 编程语言环境配置

    文章目录 前言 建议直接看第二种方法 第一种方法:p4官方教程里的方法(不建议,我没安装成功) 1.1 下载并安装 Virtual Box 1.2 下载并安装 Vagrant 1.3 利用 Vagra ...

  9. P4 compiler(p4factory) 的安装和使用

    最近在研究SDN P4 的编译器(p4factory),以下是关于P4的安装和简要使用. p4factory安装 1.下载P4源码 github上(https://github.com/p4lang/ ...

最新文章

  1. 禁止直接在浏览器输入网址访问的代码
  2. C-二维数组,多维数组
  3. 蛋白质折叠的霰弹枪方法
  4. zookeeper 日志查看_每天使用的注册中心zookeeper,流量暴涨怎么办?
  5. webstack响应式网站导航html源码kyuan 本地静态化版
  6. diy 多路监控_如何通过此DIY设置监控空气质量
  7. 乐玩自动化测试模块_五大测试框架介绍,附带全套黑马自动化测试视频教程(完结)...
  8. 数据结构预算法(六) 数组和矩阵(1)
  9. 显示隐藏-display(HTML、CSS)
  10. js打印(控件)及多种方式
  11. 《Python程序设计实例教程》课后习题参考答案
  12. Unity实现播放Ogg格式视频功能实现
  13. Jetpack DataStore 你总要了解一下吧?
  14. Face Swapping: Automatically Replacing Faces in Photographs论文阅读
  15. CAD高版本窗体阵列LISP_[转载]AutoCAD高版本怎么把阵列对话框调出来?
  16. 做抖音有哪些变现方式
  17. MEM/MBA 写作-论证有效性分析(09)逻辑缺陷-误用百分数滑坡谬误
  18. $().ajaxSubmit is not a function解决方案
  19. 华为 Telnet aaa认证模式
  20. 三剑客 文本处理awk

热门文章

  1. 蛮力算法解决问题(c语言)
  2. QCustomPlot 1.0.1学习(5)-Sinc函数绘制
  3. matlab画sinc函数及其有意思的性质
  4. Ubuntu(乌班图)修改阿里云镜像源详细步骤及安装gcc编译器
  5. C++ windy数
  6. 联想服务器AR系列,联想正式发布AR一体机:晨星AR
  7. 论文阅读——Segment Medical Image Using U-Net Combining Recurrent Residuals and Attention
  8. 次坐标从0开始_定位基础-坐标变换
  9. 腾讯安卓开发面试,腾讯+字节+阿里面经真题汇总,Android篇
  10. php完美导出word,php导出生成word的方法