P4-Tutorials-Multicast
实施组播
说明:翻译自P4官方教程P4 Tutorial的Implementing Multicast
介绍
本练习的目的是编写一个P4程序,该程序将数据包多播到一组端口。
交换机收到以太网数据包后,将根据目标MAC地址查找输出端口。如果未命中,则交换机在属于多播组的端口上广播数据包(如果入口端口出现在该组中,则该数据包将在出口管道中被丢弃)。
apply {
// 修剪将要发送到入端口的组播数据包以防止环路
if (standard_metadata.egress_port == standard_metadata.ingress_port)
drop();
}
您的交换机将具有一个表,控制平面将使用静态规则填充该表。每个规则会将一个以太网MAC地址映射到输出端口。我们已经定义了控制平面规则,因此您只需要实现P4程序的数据平面逻辑即可。
在本练习中,我们将使用星形拓扑。它是一台连接四个主机的交换机,如下所示:
h1 h2
\ /
\ /
s1
/ \
/ \
h3 h4
我们的P4程序将针对在P4.org的bmv2软件交换机上实现的V1Model架构编写。可以在以下位置找到V1Model的体系结构文件:/usr/local/share/p4c/p4include/v1model.p4。该文件描述了体系结构中P4可编程元素的接口,受支持的外部元素以及体系结构的标准元数据字段。我们鼓励您看看它。
剧透警报:
solution
子目录中有参考解决方案。随时将您的实现与参考进行比较。
步骤1:运行(不完整的)初始代码
该README文件所在的目录还包含一个P4程序框架multicast.p4
,该程序最初会丢弃所有数据包。您的工作将是扩展此框架程序,以正确转发以太网数据包。
在此之前,让我们编译不完整的内容,multicast.p4
并在Mininet中调出一个开关来测试其行为。
-
在您的shell中,运行:
make run
这将:
- 编译
multicast.p4
和 - 在Mininet中启动sig-topo,并使用适当的P4程序+表条目配置所有交换机,并且
- 使用pod-topo / topology.json中列出的命令配置所有主机
- 编译
-
现在,您应该看到一个Mininet命令提示符。尝试在拓扑中的主机之间ping通:
mininet > h1 ping h2 mininet > pingall
-
键入
exit
以保留每个xterm和Mininet命令行。然后,停止mininet:make stop
并删除所有pcap,构建文件和日志:
make clean
ping失败,因为每个交换机均根据multicast.p4
进行了编程,从而在到达时丢弃了所有数据包。您的工作是扩展此文件,以便它转发数据包。
关于控制平面的注释
P4程序定义了一个数据包处理管道,但是每个表中的规则都由控制平面插入。当规则与数据包匹配时,将使用控制平面提供的参数作为规则的一部分来调用其动作。
在本练习中,我们已经为您实现了控制平面逻辑。作为启动Mininet实例的一部分,该make run
命令将在每个交换机的表中安装数据包处理规则。这些定义在sX-runtime.json
文件中,其中X
对应于交换机号。
重要提示:我们使用P4Runtime安装控制平面规则。文件的内容sX-runtime.json
指的是表,键和操作的特定名称,这些名称由编译器生成的P4Info文件中定义(build/basic.p4.p4info.txt
执行后查找文件make run
)。P4程序中添加或重命名表,键或操作的任何更改将需要反映在这些sX-runtime.json
文件中。
步骤2:实施L2组播
该multicast.p4
文件包含一个框架P4程序,其关键逻辑部分已被TODO
注释替换。您的实现应遵循此文件中给出的结构—将每个TODO
实现替换为实现缺失部分的逻辑。
一个完整的multicast.p4
将包含以下组件:
- 以太网的标头类型定义(
ethernet_t
) - 使用丢弃数据包的动作
mark_to_drop()
。 -
TODO:一种action(称为
multicast
),将数据包的多个副本发送到一组输出端口。
action multicast() {
standard_metadata.mcast_grp = 1;
}
-
TODO:将
multicast
操作添加到可用操作列表中 -
TODO:设置
multicast
为表的默认操作mac_lookup
table mac_lookup {
key = {
hdr.ethernet.dstAddr : exact;
}
actions = {
multicast;
mac_forward;
drop;
}
size = 1024;
default_action = multicast;
}
步骤3:运行您的解决方案
按照步骤1,这一次的指示,你应该能够之间成功地ping h1
,h2
和h3
而不是h4
在拓扑。
-
TODO:将端口4添加到文件中的多播组
sig-topo/s1-runtime.json
精神食粮
其他要考虑的问题:
- 您将如何增强程序以响应ARP请求?
- 您将如何增强程序以支持从控制器学习MAC?
故障排除
在开发程序时,可能会出现一些问题:
-
multicast.p4
可能无法编译。在这种情况下,make run
将报告编译器发出的错误并暂停。 -
multicast.p4
可能会编译,但无法在尝试使用P4Runtime安装的s1-runtime.json
文件中支持控制平面规则make run
。在这种情况下,make run
如果无法安装控制平面规则,将报告错误。使用这些错误消息来修复您的multicast.p4
。 -
multicast.p4
可能会编译,并且可能会安装控制平面规则,但是交换机可能无法以所需的方式处理数据包。这些logs/sX.log
文件包含详细的日志,描述每个交换机如何处理每个数据包。输出是详尽的,可以帮助您查明实现中的逻辑错误。
清理Mininet
在上面的后两种情况下,make run
可能会使Mininet实例在后台运行。使用以下命令清除这些实例:
make stop