P4-Tutorials-Multicast

2020-05-21  本文已影响0人  SmartSloth

实施组播

说明:翻译自P4官方教程P4 TutorialImplementing 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中调出一个开关来测试其行为。

  1. 在您的shell中,运行:

    make run
    

    这将:

    • 编译multicast.p4
    • 在Mininet中启动sig-topo,并使用适当的P4程序+表条目配置所有交换机,并且
    • 使用pod-topo / topology.json中列出的命令配置所有主机
  2. 现在,您应该看到一个Mininet命令提示符。尝试在拓扑中的主机之间ping通:

    mininet > h1 ping h2
    mininet > pingall
    
  3. 键入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将包含以下组件:

  1. 以太网的标头类型定义(ethernet_t
  2. 使用丢弃数据包的动作mark_to_drop()
  3. TODO:一种action(称为multicast),将数据包的多个副本发送到一组输出端口。
action multicast() {
    standard_metadata.mcast_grp = 1;
}
  1. TODO:multicast操作添加到可用操作列表中
  2. 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 h1h2h3而不是h4在拓扑。

  1. TODO:将端口4添加到文件中的多播组sig-topo/s1-runtime.json

精神食粮

其他要考虑的问题:

故障排除

在开发程序时,可能会出现一些问题:

  1. multicast.p4可能无法编译。在这种情况下,make run将报告编译器发出的错误并暂停。

  2. multicast.p4可能会编译,但无法在尝试使用P4Runtime安装的s1-runtime.json文件中支持控制平面规则make run。在这种情况下,make run如果无法安装控制平面规则,将报告错误。使用这些错误消息来修复您的multicast.p4

  3. multicast.p4可能会编译,并且可能会安装控制平面规则,但是交换机可能无法以所需的方式处理数据包。这些logs/sX.log文件包含详细的日志,描述每个交换机如何处理每个数据包。输出是详尽的,可以帮助您查明实现中的逻辑错误。

清理Mininet

在上面的后两种情况下,make run可能会使Mininet实例在后台运行。使用以下命令清除这些实例:

make stop
上一篇下一篇

猜你喜欢

热点阅读