P4学习(四)实验一:Basic Forwarding

目录

  • 一.前置知识
  • 二.实验过程记录
    • 1.找到实验文件
    • 2.拓扑图
    • 3.明确实验内容
    • 4.实验初体验
  • 三. 编写解决方案
    • 1.Parse部分
      • 1.1 Code
      • 1.2 知识点解析
    • 2.Ingress部分
      • 2.1 Code
      • 2.2 知识点解析
    • 3.Deparse部分
      • 3.1 Code
      • 3.2 知识点
  • 四.实验完成测试

一.前置知识

  1. Linux基础命令(vim)
  2. V!Model的架构图
  3. P4代码基本结构
  4. P4基本语法
  5. Mininet

二.实验过程记录

1.找到实验文件

P4学习(四)实验一:Basic Forwarding_第1张图片

2.拓扑图

P4学习(四)实验一:Basic Forwarding_第2张图片

3.明确实验内容

The objective of this exercise is to write a P4 program that implements basic forwarding. To keep things simple, we will just implement forwarding for IPv4.

4.实验初体验

basic.p4初始设置了丢弃所有的数据包,所以一开始会ping不到

  1. 跑起服务
make run

插一个知识点:
"make"是linux的一个工具,通过读取文件makefile来执行操作
所以这里的命令就是:会查找 Makefile 中名为 run 的目标,并执行与之相关的命令。

在这里插入图片描述

  1. 观察数据包传输情况
    P4学习(四)实验一:Basic Forwarding_第3张图片
    会发现全部ping不通,也就代表basic.p4中的丢弃所有的包是成功的

  2. 停止服务

make stop
make clean

三. 编写解决方案

1.Parse部分

在这里插入图片描述

Parse采用状态机风格
有三个预定义的状态:start, accept, reject

1.1 Code

P4学习(四)实验一:Basic Forwarding_第4张图片

1.2 知识点解析

state xxx{} 定义state "xxxx"
transition xxx; 跳转到state "xxx"

select(){} 和 switch操作一样,不过不需要breakselect(data){
	valA: stateA;
	valB: stateB;
	......
	default: stateDefault;
}

所以本段code的思路是
①先从start这个state开始,直接跳到解析etherHead的部分
②从数据包里提取出Ethernet header
③判断包头中的Type是否为Ipv4
④若是,则跳转到pares_IPv4

2.Ingress部分

Match-Action 的流水线集合

2.1 Code

P4学习(四)实验一:Basic Forwarding_第5张图片
P4学习(四)实验一:Basic Forwarding_第6张图片P4学习(四)实验一:Basic Forwarding_第7张图片

2.2 知识点解析

  1. 定义一个处理IPv4包转发的action,用于更新head的信息
  2. 在表中按照destAddr的lpm进行匹配action
  3. valid是header里的一个隐藏field,isValid可以判断ipv4头是否有效

3.Deparse部分

3.1 Code

P4学习(四)实验一:Basic Forwarding_第8张图片

3.2 知识点

①emit 用于将头部字段添加到正在构建的数据包中。
②写与Parse的extract的反逻辑就行

四.实验完成测试

P4学习(四)实验一:Basic Forwarding_第9张图片

你可能感兴趣的:(p4,P4,SDN,OpenFlow,网络,网络协议)