P4-可编程语言代码学习
(1).behavioral-model
简称bmv2
P4程序首先经过p4c-bm模块编译成JSON格式的配置文件,然后将配置文件载入到bmv2中,转化成能实现交换机功能的数据结构。
behavioral-model模块最重要的是simple-switch,即实现P4语言标准中抽象交换机模型,另外两个目标是(simple_router,l2_switch)
(2)p4-hlir
将P4代码转换成高级中间表示的前端编译器,该编译器的目的是使得后端编译器开发者从语法分析和目标无关的语义检查的负担中解放出来。
(3)p4c-bm
behavior model的后端编译器,建立在p4-hilr的顶部,该模块以P4程序作为输入,输出一个可以载入到behavioral model的JSON配置文件
(4) P4-build
需要手动生成的基础设施库,为执行P4程序编译、安装PD库
(5)switch
内含switch.p4程序样例以及通过SAI、SwitchAPI和Switchlink操作交换机所需的所有库,可独立于p
4factory运行
(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本身并不支持)。
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比特的位串),但如果需要对位串进行某些数学运算时,位串长度必须是8的整数倍(如:16、32、64bit)。无符号整型支持如表2所示运算。
运算符 |
描述 |
==,!= |
测试是否相等或不等,运算结果为布尔型。 |
<,>,<=,>= |
无符号数比较,操作数的长度(W)要求相同,运算结果为布尔型。 |
&,|,^ |
按位运算符,操作数的长度(W)要求相同,运算结果为无符号整型。 |
~ |
运算结果为操作数的补码。 |
<<,>> |
左移运算符操作数为无符号整型,右移运算符操作数必须是无符号数或非负整数。此运算符为逻辑位移。 |
+(单目) |
单目加运算,效果同no-op。 |
-(单目) |
单目减运算,计算结果为2W减去操作数,W为操作数长度。 |
+(双目) |
二目加运算,操作数的长度(W)要求相同。计算结果为操作数的算术和,且运算结果长度也必须为W,超过则截断。 |
-(双目) |
二目减运算,操作数的长度(W)要求相同。计算结果为操作数的算术差。 |
* |
无符号乘法运算,操作数的长度(W)要求相同,计算结果为无符号数且长度与操作数相等。 |
表2 无符号整型支持的运算
3)有符号整型(int(W))
有符号整型(signed integers)支持如表3所示运算。
运算符 |
描述 |
==,!= |
测试是否相等或不等,运算结果为布尔型。 |
<,>,<=,>= |
有符号数比较,操作数的长度(W)要求相同,运算结果为布尔型。 |
&,|,^ |
按位运算符,操作数的长度(W)要求相同,运算结果为无符号整型。 |
~ |
运算结果为操作数的补码。 |
<<,>> |
左移运算符操作数为有符号整型,右移运算符操作数必须是无符号数或非负整数。此运算符为逻辑位移。 |
+(单目) |
单目加运算,效果同no-op。 |
-(单目) |
单目减运算,运算结果有符号整型,且长度与操作数相等。 |
+(双目) |
二目加运算,操作数数据类型必须相同,运算结果也为同类型。 |
-(双目) |
二目减运算,操作数数据类型必须相同,运算结果也为同类型。 |
* |
有符号乘法运算,操作数的长度(W)要求相同,计算结果为有符号数且长度与操作数相等。 |
表3 有符号整型支持的运算
(4)变长位串(varbit)
变长位串(dynamically-sized bit-strings)不支持算术、比较、按位运算,甚至不支持类型转换。该数据类型在定义时会指定一个静态的最大宽度值,解析器会提取变长位串数据并设置一个值作为长度。
(5)无限精度整型(int)
无限精度整数(infinite-precision integers)支持如表4所示运算。
运算符 |
描述 |
==,!= |
测试是否相等或不等,操作数必须都是整型(int)运算结果为布尔型。 |
<,>,<=,>= |
有符号数比较,操作数类型都必须是整形,运算结果为布尔型。 |
<<,>> |
右移运算符操作数必须为正整数;左移运算结果和操作数相同。a<<b等价于ax2b,a>>b等价于a/2b。 |
+(单目) |
单目加运算,效果同no-op。 |
-(单目) |
单目减运算,运算结果为整型,且该运算不会导致溢出。 |
+(双目) |
二目加运算,操作数类型都必须是整型,运算结果为整型,且该运算不会导致溢出。 |
-(双目) |
二目减运算,操作数类型都必须是整型,计算结果为整型,且该运算不会导致溢出。 |
* |
无符号乘法运算,操作数必须都是整形,计算结果为整形,该运算不会导致溢出。 |
/,% |
二目有符号除法和取模运算,操作数必须是正整数,运算结果为正整数。 |
最新文章
- (备忘)Rect和RectF的区别
- javascript学习之时间组件
- myString操作符重载
- lua表排序
- maven项目Tomcat controller 404
- tomcat PermGen space
- ?Object-C获取手机设备信息
- 关于 self 和 super 在oc 中 的疑惑 与 分析
- Linux编程之定制带级别的log
- leiningen安装记录
- Hive 执行计划
- 搞懂MySQL分区
- kafka 日常使用和数据副本模型的理解
- appium 点击物理按键
- MyEclipse持续性开发教程:用JPA和Spring管理数据(二)
- NB-IOT/LoRa/Zigbee无线组网方案对比
- github贡献代码步骤
- js遍历json的key和value
- Mysql 创建普通用户、数据库、表、插入记录,用户赋权
- 转 maven3常用命令、java项目搭建、web项目搭建详细图解