继续官网的教程
实施基本隧道
介绍
在本练习中,我们将为您在上一个分配中完成的IP路由器添加对基本隧道协议的支持。为此,我们将定义一个新的头类型来封装IP数据包并修改交换机以使用我们的新头执行路由。
新的头类型将包含一个协议ID,它指示要封装的数据包的类型,以及用于路由的目标ID。
第1步:运行(不完整的)入门代码
与之前的步骤相同,在shell中运行
make run
这里有一个问题,如果使用原始的basic_tunnel.p4来运行,编译时就会报错
AttributeError: Could not find 'MyIngress.myTunnel_exact' of type tables
../../utils/Makefile:27: recipe for target 'run' failed
说在运行../../utils/Makefile的27行时的run失败
我们来看看这一行让run什么了
run: build
sudo python $(RUN_SCRIPT) -t $(TOPO) $(run_args)
好像看不出来什么,那报错的第一句说找不到MyIngress.myTunnel_exact
我们看到这个中间有个.的结构非常眼熟,应该是某个函数,也就是说缺失这个函数,那么我就去找了找原始版本的basic_tunnel.p4,里面确实没有这个函数。
ok那么接下来我们就把函数写出来,参考solution里的脚本,运行新的basic_tunnel.p4,就编译成功出现mininet的界面了。
每台交换机都根据目的IP地址进行转发。您的工作是更改交换机功能,以便他们使用我们的新隧道头来决定目标端口。
第2步:实施基本隧道
该basic_tunnel.p4文件包含基本IP路由器的实现。它还包含标记的注释TODO,指示您需要实现的功能。basic_tunnel.p4 如果数据包中不存在封装头,则交换机的完整实现将能够基于自定义封装头的内容转发以及执行正常的IP转发。
你的工作是做以下事情:
注意:添加了一个新的头类型myTunnel_t,其中包含两个16位字段:proto_id和dst_id。
注:该myTunnel_t头已被添加到headers结构。
TODO:更新解析器,根据以太网头中的字段提取myTunnel头或头。与myTunnel标头对应的etherType是。如果== (即0x0800),解析器还应该在头部之后提取头部。ipv4etherType0x1212ipv4myTunnelproto_idTYPE_IPV4
TODO:定义一个名为的新操作myTunnel_forward,它只是将出口端口(即总线的egress_spec字段standard_metadata)设置为控制平面提供的端口号。
TODO:定义一个名为的新表myTunnel_exact,它dst_id在myTunnel标题的字段上执行完全匹配。如果表中myTunnel_forward存在匹配项,则此表应调用该drop操作,否则应调用该操作。
TODO:如果标头有效,则更新控制块中的apply语句MyIngress以应用新定义的myTunnel_exact表myTunnel。否则,ipv4_lpm如果ipv4标头有效,则调用该表。
TODO:更新逆解析器发出的ethernet,然后myTunnel,然后ipv4头。请记住,如果解析器有效,则只会发出标头。标头的隐式有效性位由解析器在提取时设置。因此,无需在此处检查标头有效性。
TODO:为新定义的表添加静态规则,以便交换机为每个可能的值正确转发dst_id。请参阅下图,了解拓扑的端口配置以及我们如何为主机分配ID。对于此步骤,您需要将转发规则添加到sX-runtime.json文件中。
第3步:运行您的解决方案
按照步骤1中的说明进行操作。这次发送数据包 h1时h2尝试使用以下命令发送使用新myTunnel标头的数据包。
./send.py 10.0.2.2 "P4 is cool!" --dst_id 2
您应该看到h2包含MyTunnel标头的数据包到达。另请注意,更改目标IP地址不会阻止数据包到达h2。这是因为当MyTunnel报头在数据包中时,交换机不再使用IP报头进行路由。
Python Scapy本身不支持myTunnel头类型,因此我们提供了一个文件myTunnel_header.py,该文件为我们的新自定义头添加了对Scapy的支持。如果您有兴趣学习如何操作,请随意检查此文件。
网友评论