P4语言编程快速开始

经过前两篇的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架构图的区别。

图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:

图2 bmv2运行时CLI

4、p4factory

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

cd p4factory

./autogen.sh

./configure

//创建虚拟以太网口

./sudo p4factory/tools/veth_setup.sh

5、动动手

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

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

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

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

原文发布于微信公众号 - SDNLAB(SDNLAB)

原文发表时间:2016-11-11

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏idba

如何做一个靠谱的发号器

在使用数据库时,表的主键经常会使用数据库的自增(auto_increment)来产生。这当然很方便也很高效。但是使用自增也会带来一些麻烦。如果从一个数据库以外的...

1316
来自专栏北京马哥教育

黑客们会用到哪些Python技术?

学Python最简单的方法是什么?推荐阅读:Python开发工程师成长魔法 Python已经成为漏洞开发领域的行业标准,读者会发现大多数概念验证工具都是用Pyt...

8128

Cloudify中的部署组合

[这篇文章是由DeWayne Filppi撰写的。]

38810
来自专栏杂烩

一种海量日志存储、分析解决方案V1.1 原

针对上一个版本https://my.oschina.net/shyloveliyi/blog/786337,有如下更新:

983
来自专栏程序员互动联盟

【高级编程】Linux read系统调用

最近一个项目做了一个模拟u盘的设备,但是在read虚拟u盘的内容时必须每次都从磁盘内读取,而不是从系统的cache中读取,由于这个问题,就查资料看了下read的...

37611
来自专栏任浩强的运维生涯

nginx关于限制请求数和连接数

nginx轻巧功能强大,能承受几百并发量,ddos攻击几乎没有影响到nginx自身的工作,但是,太多的请求就开始影响后端服务了。所以必须要在nginx做相应的限...

1790
来自专栏哲学驱动设计

性能优化总结(六):预加载、聚合SQL应用实例

    前面已经把原理都讲了一遍,这篇主要是给出一个应用的实例。该实例取自GIX4,比较复杂。 领域模型:     领域模型间的关系,如下: ? 右边模型链的具...

3445
来自专栏点滴积累

linux下快速列出文件列表的方法

前言 这两天碰到一个很棘手的问题,需要读取出ubuntu系统中某个目录下所有文件,由于服务器中存储的文件实在太多,导致此过程效率十分低下,动辄需要等待一个小时之...

3305
来自专栏机器学习养成记

静态爬虫与地址经纬度转换(python)

“ 本文通过一个小例子,展示了用python进行静态爬虫的方法,并且将爬取下来的城市列表,通过调用百度地图api,返回对应经纬度。” ---- requests...

5178
来自专栏思考的代码世界

Python网络数据采集之使用API|第03天

百度百科关于API的解释:API(Application Programming Interface,应用程序编程接口)是一些预先定义的函数,目的是提供应用程序...

4987

扫码关注云+社区