美文网首页
P4-Tutorials-Multicast

P4-Tutorials-Multicast

作者: SmartSloth | 来源:发表于2020-05-21 00:24 被阅读0次

    实施组播

    说明:翻译自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

    精神食粮

    其他要考虑的问题:

    • 您将如何增强程序以响应ARP请求?
    • 您将如何增强程序以支持从控制器学习MAC?

    故障排除

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

    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
    

    相关文章

      网友评论

          本文标题:P4-Tutorials-Multicast

          本文链接:https://www.haomeiwen.com/subject/xakaohtx.html