1

我构建了一个自定义 mininet 拓扑:2 个主机,它们之间有 2 个交换机:

 Host1====Switch1====Switch2====Host2

用 ONOS 填充流表后,设置工作正常。但我无法处理转发到 SDN 控制器的数据包。

作为控制器,我使用自己的 onos-app。

我尝试了一些 ping 并用 tcpdump 嗅探接口。当一台主机 ping 另一台主机时,主机会发送一个 arp 请求。该请求到达另一台主机并回复。即使回复到达正确的 ping 主机。但后来……什么都没有发生。我希望第一个主机在收到正确的 arp 回复后发送 ping。但相反,它完全没有任何作用。这甚至不能只使用一个开关。 截图tcpdump:左上host1,右上host2,中间switch

为什么 ping 本身不启动?你知道我做错了什么吗?谢谢你。

4

2 回答 2

3

你使用 ONOS 还是 RYU?看来您正在使用 RYU。

如果您是 RYU:您是否正确设置了控制器。使用提供的控制器代码(如simple_switch_13.py )运行 RYU 。看看这是否有效。

如果你是ONOS,你安装了功能吗?根据本教程,您应该安装一个功能。就像是:

onos> feature:install onos-app-fwd

我不知道您是如何对开关进行编程的,但是对于两个控制器,请注意您应该为两个方向添加流。此外,有时流的生命周期非常短,当数据包到达时,它们已经过期。

如果这些都没有帮助,您能否提供更多详细信息。

于 2015-06-29T21:40:21.377 回答
2

好的。问题解决了:-D

这就是问题所在:

onos-core 本身为 ARP、IPv4 和 IPv6 设置默认规则,将数据包重定向到控制器。即使 onos-core 将这样的默认规则写入交换机的流表中,也不意味着所有数据包都到达您的应用程序。在我的情况下,只有 ARP 数据包到达我的应用程序,而不是 IPv4 数据包。因此,我必须在我的应用程序的“@Activate”部分添加 3 行。

@Activate
    public void activate() {
    appId = coreService.registerApplication("org.onosproject.ifwd");

    packetService.addProcessor(processor, PacketProcessor.ADVISOR_MAX + 2);

    //***ADD THESE 3 LINES*********************************************************
    TrafficSelector.Builder selector = DefaultTrafficSelector.builder();
    selector.matchEthType(Ethernet.TYPE_IPV4);
    packetService.requestPackets(selector.build(), PacketPriority.REACTIVE, appId);
    //*****************************************************************************

} 
于 2015-06-30T09:53:54.180 回答