P4 Tutorial 快速上手 (3) Basic_tunnel

提示:本系列仅适用于软件交换机BMv2
P4 Tutorial 快速上手 (2)


文章目录

  • P4 Tutorial 快速上手 (3) Basic_tunnel
  • 简介
  • 一、转发原理
  • 二、代码解析
    • 1.包头部解析
    • 2.按目的主机ID转发
    • 3.包头填充
  • 三、运行结果
    • 1.连通实验
  • 总结
  • 附录

简介

代码库链接:https://github.com/p4lang/tutorials/tree/master/exercises/basic_tunnel
Basic_tunnel教程的目标是在basic.p4的基础上增加对隧道协议的支持。请注意在本练习中,拓扑改为了如下所示的三角形拓扑。当然,这对数据平面运行的P4代码几乎没有影响,只需修改控制平面的规则。关于流表下发、P4runtime协议等控制平面与数据平面交互的内容,将在系列(4)中进行介绍。


一、转发原理

同样,为了便于理解代码,首先对隧道协议的基本概念进行介绍。其主要思想是使用隧道头将其他用于转发的协议的头部封装起来,路由器在检测到检测到隧道头时便根据隧道头当中的地址信息转发数据包,而不再解析其他协议。常见的应用包括MPLS/IPsec/VPN等,通过将IP包头封装的方式到达易于实现流量工程或安全防护的目的。“隧道”是一个对此类协议形象的描述,数据包仅需知道隧道入口和出口的位置,而无需关心沿途需要如何转发,就像老司机在隧道中无需知道应该往哪开,因为修隧道的工人已经为你考虑好了~~。

在之前的basic_forwarding中已经实现了基于IPv4的转发功能,本练习考虑增加一个简单的隧道协议,即转发设备在解析到该数据包被隧道协议封装后,根据隧道头中的目的主机ID的值进行转发。因此需要增加的P4程序包括:

1.在接收的数据包后,需在对隧道协议的解析。
2.若数据包被封装在隧道头中,根据目的主机ID,通过精准匹配(exact)的方法获取到数据包的转发端口。

本练习同样在P4.org的BMv2软件交换机中实现的V1Model架构下编写。

二、代码解析

Basic_tunnel需要完成的代码十分简单,有了basic.p4的经验,直接在之前的程序基础上进行修改即可。

1.包头部解析

// TODO: Update the parser to parse the myTunnel header as well

与解析IPv4协议类似,在提取以太网帧头后首先需要判断上层协议类型,注意教程提供的不完整代码已经定义了隧道协议号:

TYPE_MYTUNNEL = 0x1212

因此在parse_ethernet状态中增加对隧道协议的判断,若是,则转换到parse_tunnel状态:

state parse_ethernet {packet.extract(hdr.ethernet);  // packet.extract将依据header定义按位提取比特并存在结构体中transition select(hdr.ethernet.etherType) { // select将根据选取的字段匹配下一状态TYPE_IPV4: parse_ipv4; // 当hdr.ethernet.etherType与TYPE_IPV4相同,即等于0x800跳转状态TYPE_MYTUNNEL: parse_tunnel; // 当hdr.ethernet.etherType与TYPE_MYTUNNEL相同,即等于0x1212则说明是经隧道封装的数据包default: accept; // 当无法识别网络层协议号时,默认动作为接收}}

与parse_ipv4类似,parse_tunnel具体定义如下:

state parse_ipv4 {packet.extract(hdr.tunnel);  // 依据header myTunnel_t的定义提取各字段transition accept;}

以上为basic_tunnel.p4中包头部解析部分需要补充的程序段,注意与solution中给出的方法不同,此处不再对被封装协议进行解析,更符合某些隧道协议的实际情况。在此可以对之前学习的状态的声明state,状态转移transiton,按header定义提取包头packet.extract()等关键方法进行回顾掌握。


2.按目的主机ID转发

与basic.p4相同,实现查表转发的核心代码仍在ingress中.首先需要确定在流程中如何应用转发表。该段程序在执行时由apply{}开始,需增加对数据包是否为隧道封装的数据包的判断,即通过hdr.tunnel.isValid()判断是否需要应用名为myTunnel_exact的Table:

 apply {if (hdr.ipv4.isValid()) {// Process IPv4 packetsipv4_lpm.apply();} else if (hdr.myTunnel.isValid()) {    // 在没有解析到IPv4包头时进一步判断隧道包头是否存在// process tunneled packetsmyTunnel_exact.apply();}}

与ipv4_lpm类似,交换机根据控制平面下发的转发规则判断应当如何处理数据包。各交换机对应的转发规则在pod-topo/sX-runtime.json中,X为交换机的id号。以交换机1为例,发往h3的隧道封装数据包对应表项为:

      "table": "MyIngress.myTunnel_exact",          // 对应的表的位置(MyIngress)与名称(myTunnel_exact)"match": {"hdr.myTunnel.dst_id": [3]                  // 匹配的目的主机ID为3},"action_name": "MyIngress.myTunnel_forward", // 对应的动作的位置(MyIngress)与名称(ipv4_forward)"action_params": {"port": 3                                   // 转发端口:1}

对于发往h3的数据包,交换机1将转发到3端口。相应的,参考ipv4_lpm的定义,myTunnel_exact的定义如下:

     table myTunnel_exact {key = {hdr.myTunnel.dst_id: exact;       // 唯一区别在于使用exact进行精确匹配}actions = {myTunnel_forward;                // 需要采取的转发动作,使用action关键字定义drop;}size = 1024;default_action = drop();}

出于练习的目的,在动作myTunnel_forward中简单地确定数据包发往的egress_port即可。对应代码更改如下:

 action myTunnel_forward(egressSpec_t port) {standard_metadata.egress_spec = port;}

3.包头填充

在包头解析阶段将数据包包头对应的比特提取后,需要在逆解析(封装阶段)进行重新填充,代码如下:

control MyDeparser(packet_out packet, in headers hdr) {apply {packet.emit(hdr.ethernet);  // 与packet.extract相反,填充以太帧头packet.emit(hdr.ipv4);      // 填充IPv4包头packet.emit(hdr.ipv4);      // 填充隧道包头}
}

以上修改完成后,下一步将结合代码库提供的send.py和receive.py进行测试,。


三、运行结果

1.连通实验

同样的mak run一下,首先测试下基本的IPv4转发是否正常,使用pingall进行测试:

利用xterm命令打开 h1, h2, 和 h3 终端,在 h2 和 h3 的终端运行:
python receive.py
然后,由h1尝试用隧道协议向h3发送"hello"消息,在终端键入:
python send.py 10.0.2.2 “Hello!” --dst_id=3

可以发现,h1 发送了一个目的IP为 h2 的IP地址的数据包,但是隧道封装的目的主机ID为3。在h2和h3可以观察到:

即仅有h3收到了数据包(通过PCAP文件夹下的抓包记录同样可验证),说明BMv2能够解析隧道协议并优先以隧道协议为转发凭据进行数据转发,。


总结

以上就是Basic_tunnel练习的主要内容,由于是对基础转发流程的回顾,因此几乎没有难点,但也为实现其他转发方案提供了基本思路。

下一步,将对实现控制平面与数据平面的交互的P4runtime进行说明。

附录

basic.p4完整程序
参考教程

P4 Tutorial 快速上手 (3) Basic_tunnel相关推荐

  1. P4 Tutorial 快速上手 (1) 教程库简介

    P4 Tutorial 快速上手 (1) 教程库简介 提示:本系列仅适用于软件交换机BMv2 P4 Tutorial 快速上手系列 (2) 文章目录 P4 Tutorial 快速上手 (1) 教程库简 ...

  2. NS3 Tutorial 中文版:第三章 快速上手

    [声明]允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任. http://yangfei1.blog.51cto.com/1471532/368586 ht ...

  3. 【Unity 实用工具篇】✨| Tutorial Master 2 游戏引导教程 快速上手

    前言 [Unity 实用工具篇]✨ | Tutorial Master 2 游戏引导教程 快速上手 一.Tutorial Master 2 介绍 1.1 基本概念 1.2 相关链接 1.3 效果展示 ...

  4. Tensorflow 10分钟快速上手

    Tensorflow 快速上手 系统版本 : Ubuntu 16.04LTS Python版本 : 3.6.1 Tensorflow 版本 : 1.0.1 本文依据教程 TensorFlow Tuto ...

  5. 【Microsoft Azure 的1024种玩法】三十. 使用Azure Data Studio之快速上手连接管理Azure SQL 数据库(一)

    [简介] Azure Data Studio 是一种跨平台的数据库工具,适合在 Windows.macOS 和 Linux 上使用本地和云数据平台的数据专业人员,Azure Data Studio 利 ...

  6. 迅为iTOP-3399开发板快速上手

    迅为iTOP-3399开发板快速上手 开箱体验 当你拿到 iTOP-3399 开发板,首先要检查以下配件,默认的配件如下所示: 1. 12V 电源适配器一个 2. TYPEC 线一根 3. 232 串 ...

  7. 【快速上手mac必备】常用优质mac软件推荐(音视频、办公、软件开发、辅助工具、系统管理、云存储)

    本文章的主要内容是我作为一名大四学生.准程序员.up主这三种身份来给大家推荐一下 mac 上好用的软件以及工具.本人也是从去年9月份开始从windows阵营转移到了mac阵营,刚开始使用的时候,也曾主 ...

  8. 【转】Vue.js 2.0 快速上手精华梳理

    Vue.js 2.0 快速上手精华梳理 Sandy 发掘代码技巧:公众号:daimajiqiao 自从Vue2.0发布后,Vue就成了前端领域的热门话题,github也突破了三万的star,那么对于新 ...

  9. 『转载』Debussy快速上手(Verdi相似)

    『转载』Debussy快速上手(Verdi相似) Debussy 是NOVAS Software, Inc(思源科技)发展的HDL Debug & Analysis tool,这套软体主要不是 ...

最新文章

  1. Csharp: FreeTextbox 编辑器控件运行时错误: 'FTB_ResizeGalleryArea' 未定义
  2. 解决Linux安装 VMware tools 工具的方法
  3. 随机接入响应(RAR,即MSG2)发送过程
  4. GNN论文笔记: Graph Neural Networks with convolutional ARMA filters
  5. html5怎么改变submit样式,html5中submit是按钮么
  6. unity 模型销毁_Unity3D常用 API 之实例化与销毁
  7. 树莓派4B设置静态IP
  8. P5212-SubString【LCT,SAM】
  9. C++之命名空间探究
  10. 医药吧网API接口开放
  11. 算法设计与分析(屈婉玲)pdf
  12. c语言love字符怎么打,love字母特殊符号
  13. PDF虚拟打印机的输出目录在注册表里
  14. 聊聊关于软件质量的思考
  15. 如何修改电驴服务器,电驴服务器怎样设置?能否上传一个优化设置了的
  16. SDHC和SDXC的区别总结
  17. Array Implementation of min-Heaps 最小堆数组实现
  18. Excel在两列排序不同的数据中查找出不同的数据
  19. mysql 数据汇总与分组
  20. 密码技术的典型应用——电子印章

热门文章

  1. Markdown 基础入门
  2. 青春岁月杂志青春岁月杂志社青春岁月编辑部2022年第11期目录
  3. epel yum 安装 trickle
  4. C++Primer PLus 第五版读书笔记
  5. 傅里叶变换、短时傅里叶变换、小波变换
  6. python + opencv 框选出图片中人脸
  7. 基于Windows系统的文件查重小程序
  8. 服务器监控管理工具大全
  9. 视觉工程师面试50问
  10. 【猛料】腾讯前总监受贿侵占数百万获刑9年