接下来是p4Runtime的尝试
使用P4Runtime实现控制平面
介绍
在本练习中,我们将使用P4Runtime将流条目发送到交换机,而不是使用交换机的CLI。我们将基于您在basic_tunnel练习中使用的相同P4程序。P4程序已经重命名为advanced_tunnel.py并且已经增加了两个计数器(ingressTunnelCounter,egressTunnelCounter)和两个新动作(myTunnel_ingress,myTunnel_egress)。
您将使用目标中的入门程序mycontroller.py和一些帮助程序库p4runtime_lib来创建在主机1和2之间隧道传输所需的表条目。
第1步:运行(不完整的)入门代码
此分配的起始代码位于一个名为的文件中mycontroller.py,它将仅安装在两台主机之间隧道传输所需的一些规则。
让我们首先编译新的P4程序,启动网络,使用mycontroller.py 安装一些规则,并查看ingressTunnelCounter事情是否按预期工作。
在你的shell中,运行:
make
这会:
编译advanced_tunnel.p4,
启动一个Mininet实例与三个开关(s1,s2,s3)以三角形构造中,每个连接到一个主机(h1,h2,h3),和
分配的IP地址10.0.1.1,10.0.2.2,10.0.3.3于相应的主机。
您现在应该看到Mininet命令提示符。在h1和h2之间启动ping:
mininet > h1 ping h2
因为有在交换机没有规则,你应该没有收到任何回复呢。你应该让ping在这个shell中运行。
打开另一个shell并运行入门代码:
cd ~ / tutorials / exercises / p4runtime
./mycontroller.py
这将advanced_tunnel.p4在交换机上安装程序并推送隧道入口规则。程序每2秒打印一次隧道入口和出口计数器。您应该看到s1的入口隧道计数器增加:(此时在之前的shell中要运行h1 ping h2,可以在后一个shell中看到package的个数:
s1 MyIngress.ingressTunnelCounter 100: 8 packets (784 bytes)
在不断增加)
其他计数器应保持为零。
按Ctrl-C到第二个外壳停止mycontroller.py
每个交换机当前都根据目标IP地址将流量映射到隧道。您的工作是根据隧道ID编写转发交换机之间流量的规则。
第2步:实施隧道转发
该mycontroller.py文件是执行以下操作的基本控制器平面:
建立与P4Runtime服务的交换机的gRPC连接。
将P4程序推送到每个开关。
为h1和h2之间的两个隧道写入隧道入口和隧道出口规则。
每2秒读取一次隧道入口和出口计数器。
它还包含标记的注释TODO,指示您需要实现的功能。
您的工作是writeTunnelRules在隧道ID匹配的函数中编写隧道传输规则,并将数据包转发到下一跳。
在本练习中,您将与目录中的某些类和方法进行交互p4runtime_lib。以下是目录中每个文件的摘要:
·helper.py
包含P4InfoHelper用于解析p4info文件的类。
提供实体名称与ID号之间的转换方法。
构建P4Runtime表条目的P4程序相关部分。
·switch.py
包含SwitchConnection抓取gRPC客户端存根的类,并建立与交换机的连接。
提供构造P4Runtime协议缓冲区消息的辅助方法,并进行P4Runtime gRPC服务调用。
·bmv2.py
包含Bmv2SwitchConnection扩展SwitchConnections并提供BMv2特定设备有效负载以加载P4程序。
·convert.py
提供方便的方法,从友好的字符串和数字到协议缓冲区消息所需的字节串进行编码和解码。
使用者 helper.py
第3步:运行您的解决方案
按照步骤1中的说明进行操作。如果Mininet网络仍在运行,则只需在第二个shell中运行以下命令:
./my_controller.py
您应该开始在Mininet提示符中看到ICMP回复,您应该开始看到所有计数器的值开始递增。
额外的信用和思想的食物 (Extra Credit and Food for Thought)
您可能会注意到打印的规则mycontroller.py包含实体ID而不是表名。您可以使用P4Info帮助程序将这些ID转换为条目名称。
此外,您可能想要考虑以下事项:
什么关于拓扑的假设被纳入您的实现?你需要如何改变它以获得更真实的网络?
为什么入口和出口计数器之间的字节计数器不同?
ICMP回复中的TTL是多少?为什么它的价值呢?提示:主机发送的报文的默认TTL为64。
网友评论