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 条评论
登录 后参与评论

相关文章

来自专栏编程

tornado全面剖析与实践系列1

猿助猿的技术栈是基于Tornado的, 在学习的过程中参考了很多文章, 但是内容大都碎片化, 缺少系统性讲解, 而且不少关于异步应用的内容还是基于过时的旧版本....

34690
来自专栏Ryan Miao

使用nginx代理跨域,使用nginx代理bing的每日一图

前言 自从搞清楚了跨域原理后一直自鸣得意,感觉跨域没啥问题了。而事实上对关于跨域的几个header的理解也有限,但那又如何,我能做到跨域就行了。今天想把博客背...

47880
来自专栏哲学驱动设计

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

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

40150
来自专栏游戏杂谈

PHP实现一个简单url路由功能

如果一个页面的内容呈现,需要根据url上传递的参数来进行渲染。很多时候可能是这样子写:xxx.com/xx?c=x&m=x&t=..,而我们看到的url往往是...

1.1K10
来自专栏石奈子的Java之路

原 荐 Java9 Module解惑

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

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

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

67580
来自专栏Linyb极客之路

Mysql max_allowed_packet自动重置为1024的情况

前几天在群里有个朋友问到max_allowed_packet被自动重置的问题,于是打算写个文章来描述下,因为遇到这个问题的人不少,但是提到的解决方案几乎没有。

52420
来自专栏GreenLeaves

Asp.Net Cache缓存技术学习

本文参考自Fish Li的细说 ASP.NET Cache 及其高级用法 一、前言,相信大多数做网站开发的都知道缓存技术对于网站的重要性,它对于网站的性能优化...

23480
来自专栏北京马哥教育

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

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

87680
来自专栏DeveWork

解决WordPress 打开Feed页面“This page contains the following errors…”的问题

趁着国庆假,今天解决了 Jeff的阳台 的Geekwork主题的几个bug。其中一个是打开feed页面(即http://www.jianhui.org/feed...

277100

扫码关注云+社区

领取腾讯云代金券