前言

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


本文目录

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


P4语言

4A架构和DDD结合 4a架构包括哪些_学习


4A架构和DDD结合 4a架构包括哪些_学习_02

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

P4架构模型

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

4A架构和DDD结合 4a架构包括哪些_学习_03

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

4A架构和DDD结合 4a架构包括哪些_控制块_04


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

4A架构和DDD结合 4a架构包括哪些_控制块_05

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

P4可编程块

4A架构和DDD结合 4a架构包括哪些_字段_06

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

P4编程举例

头定义

4A架构和DDD结合 4a架构包括哪些_学习_07

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

解析器实现

4A架构和DDD结合 4a架构包括哪些_4A架构和DDD结合_08

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

什么是 match-action pipeline?

4A架构和DDD结合 4a架构包括哪些_控制块_09

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

控制块:table实现

4A架构和DDD结合 4a架构包括哪些_字段_10

  • 表块分为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块实现

4A架构和DDD结合 4a架构包括哪些_P4_11

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

P4 程序编译和执行

4A架构和DDD结合 4a架构包括哪些_控制块_12

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