文章目录

  • P4学习笔记(三)P4编程语言简介
    • 基本数据类型
    • Typedef
    • 声明和初始化变量
    • 元数据
    • 参考资料

P4学习笔记(三)P4编程语言简介


上图展示了P4语言主要结构,下面简单讲解一下P4的基本语法

基本数据类型

header ethernet_h {bit<48>  dstAddr;bit<48>  srcAddr;bit<16>  etherType;
}
header vlan_tag_h {bit<3>  pri;bit<1>  cfi;bit<12>  vid;bit<16>  ether_type;
}
struct my_headers_ht {ethernet_h ethernet;vlan_tag_h[2] vlan_tag;
}

基本类型

  • bit 无符号整型,也称为:位串,是具有n位的位字符串的类型,bit等价于bit<1>
  • int 有符号整型,n>=2。
  • varbit 变长位串
  • bool: 布尔类型,true/false

派生类型

  • header: 有序成员集合

    • 位对齐
    • 可以包含bit, int, varbit
  • struct: 无序成员集合
    • 没有对齐限制
    • 能够包含所有基本类型以及派生类型

Typedef

typedef bit<48> EthernetAddress;
typedef bit<32> IPv4Address;// Standard Ethernet header
header Ethernet_h {EthernetAddress dstAddr;EthernetAddress srcAddr;bit<16> etherType;
}
  • typedef 和c语言中一样的意思,相当于取一个类型别名

声明和初始化变量

bit<16> my_var;
bit<8> another_var=5const bit<16> ETHERTYPE_IPV4 = 0x0800;header ethernet_h {bit<48>  dstAddr;bit<48>  srcAddr;bit<16>  etherType;
}
header vlan_tag_h {bit<3>  pri;bit<1>  cfi;bit<12>  vid;bit<16>  ether_type;
}
ethernet_h eth;
vlan_tag_h vtag={3w2,0, 12w13, 16w0x8847}

元数据

元数据是用来携带数据和配置性和西,元数据的申明与包头类似,但在实例化的时候有所不同,而且包头和元数据在字段值的约束上存在一定的差别。元数据分为两种,一种是用来携带P4程序运行过程中产生的数据的用户自定义元数据(User-Defined Metadata),如首部字段的运算结果等。另一种是固有元数据(Intrinsic Metadata),用于携带交换机自身的配置信息,如数据包进入交换机时的端口号等。

struct ingress_metadata_t{}
metadate ingress_metadata_t ingress_metadata;

有8种固有元数据,这些元数据携带了数据包相关的状态信息。

字段 描述
ingress_port 数据包的入端口,解析之前设置,只读
packet_length 数据包的字节数,当交换机在快速转发模式下,该元数据不能在动作(action)中匹配或引用。只读。
egress_spec 在入端口流水线的匹配-动作过程之后设置,指定数据包出端口,可以是物理端口、逻辑端口或者多播组。
egress_instance 用于区分复制后数据包实例的标识符。只读。
instance_type 数据包实例类型:正常(Normal)、入端口复制(ingress clone)、出端口复制(egress clone)、再循环(recirculated)。
parser_sratus 解析器解析结果,0表示无错误,其实数字代表了对应的错误类型
parser_error_location 指向P4程序错误发生处。

注意点:

  • 包头类型的长度需要字节对齐,即长度必须是8bit的整数倍。
  • 包头中字段长度可以是可变值,也可以是首部中其他字段值计算后的值。而元数据中的字段长度只能是定值。
  • 只有包头能够实例化成数组,元数据则不行。
  • 实例化时,首部中已定义名称的字段的值会被初始化成程序中的指定值,如果首部中只定义字段名称而未指定值,字段的值将会被初始化成0。

参考资料

1、https://p4.org/assets/P4_tutorial_01_basics.gslide.pdf

P4学习笔记(三)P4编程语言简介相关推荐

  1. P4学习笔记(一)初识P4

    P4学习笔记(一)初识P4 P4学习笔记(二)一个简单P4交换机实现 文章目录 P4简介 P4提供的核心抽象 P4的优点 本系列我学习P4的学习笔记,很多是翻译自官方文档, 很多不是很准确的地方,建议 ...

  2. P4学习笔记(二)一个简单P4交换机实现

    P4学习笔记(一)初始P4 P4学习笔记(二)一个简单P4交换机实现 文章目录 1. 架构模型 2.预定义模块详细描述 2.1 Arbiter 模块 2.2 Parser runtime 模块 2.3 ...

  3. HoloLens开发学习笔记(一):HoloLens简介

    HoloLens开发学习笔记(一):HoloLens简介 一.HoloLens简介 Microsoft HoloLens是Windows Holographic的使用主要设备.HoloLens是一个W ...

  4. OPENMP学习笔记(1)——简介,模型,运行

    OPENMP学习笔记(1)--简介,模型,运行 简介: OpenMP的英文全称是Open Multiprocessing,一种应用程序接口(API,即Application Program Inter ...

  5. SurfaceFlinger学习笔记(三)之SurfaceFlinger进程

    概述 本系列是基于android Q 即android10 SurfaceFlinger学习笔记(一)应用启动流程 SurfaceFlinger学习笔记(二)之Surface SurfaceFling ...

  6. J2EE学习笔记三:EJB基础概念和知识 收藏

    J2EE学习笔记三:EJB基础概念和知识 收藏 EJB正是J2EE的旗舰技术,因此俺直接跳到这一章来了,前面的几章都是讲Servlet和JSP以及JDBC的,俺都懂一些.那么EJB和通常我们所说的Ja ...

  7. tensorflow学习笔记(三十二):conv2d_transpose (解卷积)

    tensorflow学习笔记(三十二):conv2d_transpose ("解卷积") deconv解卷积,实际是叫做conv_transpose, conv_transpose ...

  8. Ethernet/IP 学习笔记三

    Ethernet/IP 学习笔记三 原文为硕士论文: 工业以太网Ethernet/IP扫描器的研发 知网网址: http://kns.cnki.net/KCMS/detail/detail.aspx? ...

  9. JavaScript学习笔记01【基础——简介、基础语法、运算符、特殊语法、流程控制语句】

    w3school 在线教程:https://www.w3school.com.cn JavaScript学习笔记01[基础--简介.基础语法.运算符.特殊语法.流程控制语句][day01] JavaS ...

最新文章

  1. UBI系统原理分析【转】
  2. win7组策略-计算机配置,win7系统组策略设置系统配置模块的操作方法
  3. 网络编程懒人入门(三):快速理解TCP协议一篇就够
  4. 谷歌退出中国几成定局 谈判已谈崩
  5. 使Docker容器拥有可被宿主机以外的机器直接访问的独立IP
  6. android studio yasea,yasea: RTMP streaming client for Android.
  7. Go语言标准库之strconv
  8. Ratingbar UseGuide
  9. .NET:默认是按值传递的
  10. 惠普1020打印机查看已打印页数
  11. 颜色,色相环知识分享
  12. 微信小程序数据拼接_微信小程序数据处理
  13. 新手gxf学python---万年历
  14. Cisco 路由器密码重置步骤
  15. 怎么更换驾驶证上面的照片?教你如何更换驾驶证照片
  16. 因果推断 | 因果关系推断-系列电子书资源
  17. 大数据技术之Flume
  18. htmla标签下划线去除_html超链接的下划线怎么去掉?a标签去下划线的方法都在这里...
  19. 大数据流的在线Heavy Hitters算法(上篇):基于计数器的方法
  20. Ubuntu中使用apt-get时无法搜索软件的解决方法

热门文章

  1. NAPI(New API)的一些浅见
  2. 1.初识C语言----什么是C语言,为什么要学C语言?
  3. PLSQL开发笔记和小结
  4. Linux定时清理日志
  5. Matlab/simulink通信系统仿真入门操作
  6. 第8天-信息收集——站点搭建,WAF等
  7. python2.7安装pyqt5版本,py3
  8. 归并排序java_Java经典排序算法之归并排序详解
  9. PHP的LZF压缩扩展工具
  10. JAVA泛型尖括号中的 T 和 ? 有什么区别?