P4语言编程详解


1.源码目录结构


P4项目源码可以在github上直接获取(https://github.com/p4lang)。P4项目由很多个单独的模块组成,每个模块就是一个子项目,下面分别简单介绍一下各模块的功能。

(1)behavioral-model
模拟P4数据平面的用户态软件交换机,使用C++语言编写,简称bmv2。P4程序首先经过p4c-bm模块编译成JSON格式的配置文件,然后将配置文件载入到bmv2,转化成能实现交换机功能的数据结构。

behavioral-model模块是架构无关的,可以实现各种P4编程目标。该模块主要实现三个目标,其中最重要的是 simple_switch,即实现P4语言标准中抽象交换机模型。另外两个目标是(simple_router,l2_switch),这两个目标是作 为教学示例。

(2)p4-hlir
将P4代码转换成高级中间表示的前端编译器,目前的高级中间表示的展示形式与python对象的层次结构相同。该编译器的目的是使得后端编译器开发者从语法分析和目标无关的语义检查的负担中解放出来。

(3)p4c-bm
behavioral modal的后端编译器,建立在p4-hilr的顶部,该模块以P4程序作为输入,输出一个可以载入到behavioral model的JSON配置文件。

(4)p4-build
需要手动生成的基础设施库,为执行P4程序编译、安装PD库。

(5)switch
内含switch.p4程序样例以及通过SAI、SwitchAPI和Switchlink操作交换机所需的所有库,可独立于p4factory运行 。

(6)ntf(Network Test Framework)
网络测试框架,内含用以执行bmv2上应用的网络测试样例。该框架中集成了mininet和docker,方便用户进行测试。

(7)p4factory
内含整套用以运行和开发基于behavioral model的P4程序环境的代码,帮助用户快速开发P4程序。

(8)ptf
数据平面测试框架,基于unittest框架实现,内含标准Python版本。该框架中的大部分代码从floodlight项目中的OFTest框架移植而来,框架的实现和开发可参考OFTest框架文档。

(9)scapy-vxlan
基于Scapy项目,barefoot对其进行了定制,支持更多协议的数据包包头的伪造和解析,目前支持 VXLAN和ERSPAN-like(Scapy本身并不支持)。

(10)tutorials
P4语言教程,内含8个教程,覆盖了P4语言中的解析器、动作、状态存储、匹配-动作表、等基础组件。
1)cpoy_to_cpu:基本动作clone_ingress_to_egress教程
2)meter:计量表教程
3)TLV_parsing:IPv4数据包解析教程
4)register:寄存器读写状态教程
5)counter:计数器教程
6)action_profile:ECMP动作摘要教程
7)resubmit:数据包冲提交到入端口流水线教程
8)simple_nat:TCP流量的完全圆锥形NAT网络教程
注:P4语言项目库中的SAI、mininet及thrift是从其他开源项目完全fork而来,这里不展开讨论。

2.P4语言标准

当前P4语言标准的最新版本为《The P4 Language Specification Version1.1》(以下简称V1.1),目前版本的P4语言编译器已经基本实现了P4语言标准中的绝大部分特性 ,部分特性尚在开发之中。

2.1 基础数据类型及操作

P4语言中定义了5种基础数据类型,分别是:bool、bit、int、varbit、int。(注:此处W代表长度,通常使用十进制数字表示,如 bit)通常情况下,不同的数据类型之间可以相互转换,并且所有的二目运算符都要求数据类型保持一致,除了位移操作符(shifts)。

(1)布尔型(bool)
布尔型(Boolean),值为true或false,非整数型。布尔类型数据可进行如表1所示运算。

运算符

描述

and

二目运算符,操作数必须都为布尔型,运算结果为布尔型。

or

二目运算符,操作数必须都为布尔型,运算结果为布尔型。

not

单目运算符,操作数必须为布尔型,运算结果为布尔型。

==,!=

测试是否相等或不等,运算结果为布尔型。

表1 布尔型支持的运算

(2)无符号整型(bit)
无符号整型(unsigned integers)也叫位串(bit-string)。位串是以比特位形式表示的任意长度的数(如:bit<127>,表示长度为127比特 的位串),但如果需要对位串进行某些数学运算时,位串长度必须是8的整数倍(如:16、32、64bit)。无符号整型支持如表2所示运算。

运算符

描述

==,!=

测试是否相等或不等,运算结果为布尔型。

<,>,<=,>=

无符号数比较,操作数的长度(W)要求相同,运算结果为布尔型。

&,|,^

按位运算符,操作数的长度(W)要求相同,运算结果为无符号整型。

运算结果为操作数的补码。

<<,>>

左移运算符操作数为无符号整型,右移运算符操作数必须是无符号数或非负整数。此运算符为逻辑位移。

+(单目)

单目加运算,效果同no-op。

-(单目)

单目减运算,计算结果为2W减去操作数,W为操作数长度。

+(双目)

二目加运算,操作数的长度(W)要求相同。计算结果为操作数的算术和,且运算结果长度也

  • 0
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值