P4Runtime参照P4Runtime--基于mininet和bmv2环境的解析 - forestj - 博客园 (cnblogs.com)
目录
一 实验简介
在本练习中,我们将使用P4Runtime将流表项发送到交换机,而不是使用交换机的CLI。我们将构建与basic_tunnel练习中使用的相同的P4程序。P4程序已重命名为advanced_tunnel。P4程序中还增加了两个计数器(ingressTunnelCounter, egressTunnelCounter)和两个新动(myTunnel_ingress, myTunnel_egress)。本次实验将使用脚本文件mycontroller.py和p4runtime_lib目录中的几个辅助库来创建主机1和主机2之间的通道通信所需的表项。
二 实验步骤
1.创建拓扑
首先编译新的P4程序,启动网络,使用它来安装一些规则
make run
注:这里我使用make run命令创建好网络拓扑结构后执行h1 ping h2操作后发现是ping不通的,因为没有下发流表项的匹配规则。

2.运行脚本mycontroller.py下发流表项
P4程序定义了一个包处理管道,但是每个表中的规则由控制平面插入。在本实验中,实现我们的控制平面,而不是像在前面的练习中那样安装静态表项,P4程序还定义了开关管道和控制平面之间的接口。因此我们这里需要实现mycontroller.py中的TODO部分内容
mycontroller.py文件是一个基本的控制器平面,执行以下操作:
1.为P4Runtime服务建立到交换机的gRPC连接。
2.将P4程序推送到每个交换机。
3.为h1和h2之间的两条隧道写入隧道入和隧道出规则。
4.每2秒读取隧道入口和出口计数器。
在本练习中,还需要与p4runtime_lib目录中的一些类和方法进行交互。以下是该目录中每个文件的摘要:
- helper.py
包含用于解析p4info文件的P4InfoHelper类。
提供实体名称与ID号之间的转换方法。
构建P4Runtime表项的P4程序相关部分。
- switch.py
包含SwitchConnection类,该类获取gRPC客户端存根,并建立到交换机的连接。
提供构建P4Runtime协议缓冲区消息并进行P4Runtime gRPC服务调用的帮助器方法。
- bmv2.py
包含Bmv2SwitchConnection,它扩展了SwitchConnections,并提供了特定于bmv2的设备负载来加载P4程序。
- convert.py
提供方便的方法,将友好的字符串和数字编码和解码为协议缓冲区消息所需的字节字符串。
由helper.py使用.
导入P4Runtime库
sys.path.append(
os.path.join(os.path.dirname(os.path.abspath(__file__)),
'../../utils/'))
import p4runtime_lib.bmv2
from p4runtime_lib.error_utils import printGrpcError
from p4runtime_lib.switch import ShutdownAllSwitchConnections
import p4runtime_lib.helper
写入隧道规则
(1) Tunnel Ingress Rule 入接口规则
ipv4_lpm表中入口交换机上的隧道进入规则将流量封装到指定ID的隧道中
# 1) Tunnel Ingress Rule
table_entry = p4info_helper.buildTableEntry(
table_name="MyIngress.ipv4_lpm",
match_fields={
"hdr.ipv4.dstAddr": (dst_ip_addr, 32)
},
action_name="MyIngress.myTunnel_ingress",
action_params={
"dst_id": tunnel_id,
})
ingress_sw.WriteTableEntry(table_entry)
print("Installed ingress tunnel rule on %s" % ingress_sw.name)
(2)Tunnel Transit Rule 转发规则

最低0.47元/天 解锁文章
1631

被折叠的 条评论
为什么被折叠?



