首先打开readme文件,如下图所示,因为代码不完整所以"make run"指令会失败
接着往下看可以看到第一处要补的地方是在数据包解析器这里。
然后打开basic_tunnel.p4文件到达解析器位置 ,很明显需要我们处理my_Tunnel这一标头
从上面readme文件可知,首先在ethernet解析器那里应该根据etherType来选择解析my_Tunnel还是ipv4,接着我们得知应该在处理过my_Tunnel后再处理ipv4,因此应该把对my_Tunnel的处理置于ipv4上方,并且只有proto_id等于TYPE_IPV4时才执行ipv4的解析,补充如下图所示:
同样先看readme文件,这里是有三个要求:定义一个action;定义一个表;补充apply
所以我们先定义一个action设置egress_spec等于控制平面提供的port;接着定义一个名为myTunnel_exact的表 ,key指定为hdr.myTunnel.dst_id,如果匹配执行myTunnel_forward,否则drop;最后在apply增加一个判断语句:如果hdr.myTunnel是有效的,应用myTunnel_exact这个表
如下图所示这里缺少对myTunnel标头的emit,补上即可
接下来就是执行"make run"创建我们的拓扑
执行"xterm h1 h2"显示出h1和h2的虚拟终端
对h2执行"./receive.py"命令运行这一文件使得它能够收到数据包
在h1上执行"./send.py 10.0.2.2 "P4 is cool""命令,将这一数据包发送给地址为10.0.2.2的主机也就是h2,可以看到h2成功接收到
在h1上执行"./send.py 10.0.3.3 "hhhhh""命令,将这一数据包发送给地址为10.0.3.3的主机也就是h3,可以看到h3成功接收到
在h1上执行"./send.py 10.0.2.2 --dst_id 2 "sdjjds""命令,因为存在myTunnel报头的dst_id字段,所以优先根据这一字段进行匹配也就是会发送到h2,如下所示h2成功接收到
在h1终端上修改目的ip10.0.2.2为其他乱七八糟的ip地址但是后面还是指定dst_id 2,可以看到还是h2成功接收
最后执行"exit"命令退出并关闭xterm,执行"make stop"和"make clean"命令,清除创建的拓扑