目录
- 一.前置知识
- 二.实验过程记录
- 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 知识点
- 四.实验完成测试
一.前置知识
- Linux基础命令(vim)
- V!Model的架构图
- P4代码基本结构
- P4基本语法
- Mininet
二.实验过程记录
1.找到实验文件
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不到
- 跑起服务
make run
插一个知识点:
"make"是linux的一个工具,通过读取文件makefile来执行操作
所以这里的命令就是:会查找 Makefile 中名为 run 的目标,并执行与之相关的命令。
-
观察数据包传输情况
会发现全部ping不通,也就代表basic.p4中的丢弃所有的包是成功的 -
停止服务
make stop
make clean
三. 编写解决方案
1.Parse部分
Parse采用状态机风格
有三个预定义的状态:start, accept, reject
1.1 Code
1.2 知识点解析
state xxx{} 定义state "xxxx"
transition xxx; 跳转到state "xxx"select(){} 和 switch操作一样,不过不需要break;
select(data){valA: stateA;valB: stateB;......default: stateDefault;
}
所以本段code的思路是
①先从start这个state开始,直接跳到解析etherHead的部分
②从数据包里提取出Ethernet header
③判断包头中的Type是否为Ipv4
④若是,则跳转到pares_IPv4
2.Ingress部分
Match-Action 的流水线集合
2.1 Code
2.2 知识点解析
- 定义一个处理IPv4包转发的action,用于更新head的信息
- 在表中按照destAddr的lpm进行匹配action
- valid是header里的一个隐藏field,isValid可以判断ipv4头是否有效
3.Deparse部分
3.1 Code
3.2 知识点
①emit 用于将头部字段添加到正在构建的数据包中。
②写与Parse的extract的反逻辑就行