经过前两篇的P4理论介绍,相信大家已经对P4有个基本的了解了,本片文章为大家带来P4语言编程实战。


1、系统环境安装


P4项目的官方文档上都是以Ubuntu为例,笔者惯用的linux系统也是Ubuntu,因此本篇文章中的实验都基于Ubuntu14.04完成的。开始安装环境之前,记得先下载P4项目源码(https://github.com/p4lang)。


本篇文章主要介绍如何手动编译安装P4开发环境并使用虚拟交换机(bmv2)进行实验,如果不想手动下载源码或单独编译、安装每个模块,也可以选择下载已经集成了P4编译开发环境Ubuntu系统镜像。传送门:https://drive.google.com/file/d/0BxHYRsv-PNVvaEpZYnJ5LTAyZkk/edit。注:请自备翻墙梯子。


2、环境依赖包


P4项目主要由C++和Python语言开发,同时需要对源码进行编译安装,所以需要安装许多环境依赖包。当然,这里并不需要手动将安装每个依赖包,运行p4factory目录下的install_deps.sh脚本,可以一键安装所有的依赖包,包括运行bmv2所必须的thrift、nanomsg和nnpy等组件。


./install_deps.sh


由于我们是在虚拟环境下使用进行实验,所以需要创建多个虚拟以太网口。


./sudo p4factory/tools/veth_setup.sh

3、模块依赖


P4项目由很多模块组成,部分模块与模块之间存在依赖关系,安装也就必须按照依赖关系先后安装。每个子项目的作用在上篇文章《P4语言编程详解》中已介绍,这里不再赘述。图1中展示了P4项目主要模块的依赖关系,在进行编译安装时可以参考该依赖关系选择安装顺序。这里需要注意模块依赖图与P4架构图的区别。

P4语言编程快速开始_java

图1 主要模块依赖关系图


To make your life easier,P4项目中对各个子模块的安装提供了完备的脚本,安装了各个子模块后就能直接使用对应模块的CLI脚本,CLI的详细使用方法可以使用-h参数查看命令帮助。


(1)安装hlir

cd p4-hlir

sudo python ./setup install


安装后提供的CLI:p4-validate,p4-shell, p4-graphs。


(2)安装p4c-bm

cd p4c-bm

sudo pip install –r requirements.txt

sudo python setup.py install


安装后提供的CLI:p4c-bmv2。


(3)安装behavioral-model(bmv2)

cd  behavioral-model

./autogen.sh

./configure

make


Bmv2作为交换机提供了一系列的运行时CLI:

P4语言编程快速开始_java_02

图2 bmv2运行时CLI



4、p4factory


P4项目中同时也提供了p4factory模块,该模块可以单独编译运行,目的就是方便用户/开发者快速开始。


cd p4factory

./autogen.sh

./configure

//创建虚拟以太网口

./sudo p4factory/tools/veth_setup.sh

5、动动手


环境安装完毕之后,就可以开始着手运行一些P4程序示例了。本章主要从源码-运行-抓包-脚本等方面介绍simple_router示例实验。


在看具体实例之前先回顾一下P4程序定义数据平面的流程:

P4语言编程快速开始_java_03

图3 P4程序定义数据平面流程


这里介绍一下笔者在看P4程序时候的方法,仅供大家参考:首先,从流控制程序(control)开始,查看流水线(pipeline)中应用的匹配-动作表(table)有哪些;然后,依次查看每个table中可以匹配的字段(field)以及可以执行的动作(action),理清pipline中的match-action模型;最后,查看包头(header)和解析器(parser),获悉在pipeline中进行match-action的包头实例中存储的数据。