首页 > 解决方案 > 在 POX 中的多个控制器之间重定向“ofp_packet_in”数据包?

问题描述

我正在尝试ofp_packet_in在多个控制器之间重定向数据包。例如,假设有两个控制器c1,c2和一个开关s1s1分配给c1。现在,c1收到一个Packet_Infrom switch s1。一般来说,s1应该处理掉这个Packet_In我想要做的是将这个发送Packet_Inc2并让c2处理这个Packet_In

我正在尝试通过 POX 实现我的想法,但我遇到了一些错误。

这是 的代码c1,仅_handle_packet_in显示:

def _handle_PacketIn(self, event):
    log.debug("Switch %s has a PacketIn: [port: %d, ...]", event.dpid, event.port)
    self._redirect_packet(event)

def _redirect_packet(self, event):
    log.debug("Send packet to 6634!")
    TCP_IP = '10.0.2.15'
    TCP_PORT = 6634
    BUFFER_SIZE = 1024
    packet = event.ofp
    # I attach all the payload of OpenFlow Packet_In to the new packet
    MESSAGE = packet.pack() 
    # MESSAGE = MESSAGE + 'Hello world'

    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect((TCP_IP, TCP_PORT))
    s.send(MESSAGE)
    # s.close()

然后我启动 Mininet 并构建拓扑。(这里的拓扑结构和正式的描述差别不大,但是从Mininet例子controllers2.py中可以清楚并修改)

from mininet.net import Mininet
from mininet.node import Controller, OVSSwitch
from mininet.cli import CLI
from mininet.log import setLogLevel
from mininet.node import RemoteController

def multiControllerNet():
    "Create a network from semi-scratch with multiple controllers."

    net = Mininet( controller=Controller, switch=OVSSwitch, autoSetMacs=True )

    print "*** Creating (reference) controllers"
    # c1 = net.addController( 'c1', port=6633 )
    # c2 = net.addController( 'c2', port=6634 )
    c1 = net.addController('c1', controller=RemoteController, ip='10.0.2.15', port=6633)
    c2 = net.addController('c2', controller=RemoteController, ip='10.0.2.15', port=6634)

    print "*** Creating switches"
    s1 = net.addSwitch( 's1' )
    s2 = net.addSwitch( 's2' )

    print "*** Creating hosts"
    hosts1 = [ net.addHost( 'h%d' % n ) for n in 3, 4 ]
    hosts2 = [ net.addHost( 'h%d' % n ) for n in 5, 6 ]

    print "*** Creating links"
    for h in hosts1:
        net.addLink( s1, h )
    for h in hosts2:
        net.addLink( s2, h )
    net.addLink( s1, s2 )

    print "*** Starting network"
    net.build()
    # c1.start()
    c2.start()
    s1.start( [ c1 ] )
    # s1.start([c2])
    s2.start( [ c2 ] )
    # s2.start([c2])

    # print "*** Testing network"
    # net.pingAll()

    print "*** Running CLI"
    CLI( net )

    print "*** Stopping network"
    net.stop()

if __name__ == '__main__':
    setLogLevel( 'info' )  # for CLI output
    multiControllerNet()

然后,我在我的主机上启动两个具有不同端口的控制器,6633, 6634. 打开c1 ../pox.py openflow.of_01 --port=6633 --address=10.0.2.15 openflow_test log.level --DEBUG 并且,打开c2 ../pox.py openflow.of_01 --port=6634 --address=10.0.2.15 openflow_test_2 log.level --DEBUG

c1只有_handle_packet_in上面显示的处理程序。c2没有功能。

我尝试pingh3(由 控制c1)到h5(由 控制器控制c2)之间,以触发_handle_packet_in处理程序。

我使用wireshark捕获of_packet_in数据包,以及新的重定向数据包

of_packet_in包: <code>of_packet_in</code> 数据包

重定向数据包: 重定向数据包

很明显,它们具有相同的有效载荷(OpenFlow 数据包)。

但是,c2不接受此数据包,并警告这是虚拟的 OpenFlowNexus。这是错误: c2 错误

我猜,即使c1发送一个合法的OpenFlowof_packet_inc2c2也不知道“谁c1,因为c1没有注册c1使用 OpenFlow ,,, of_hello....of_features_request所以,c2丢弃of_packet_in发送的 OpenFlow c1,说dummy

我只想让c2处理Packet_In重定向的c1. 通过这种方式,c2可以计算和安装table-miss发生在 中的事件的表条目s1

也许我可以使用其他控制器,如泛光灯、ONOS ......来解决这个问题。也许这个问题无法解决。感谢您分享您的想法,祝您好运。

我正在使用 POX 0.2.0(鲤鱼)

标签: sdnopenflowpox

解决方案


您将 c1 连接到 c2,就好像 c1 是一个开关一样,并且您希望 c2 像这样对待 c1。然而,c1 并没有像这样代表自己。事实上,c1 并没有向 c2 介绍自己。每个连接到控制器的交换机都遵循特定的识别协议,您可以在 ConnectionUp 处理程序中看到这种情况。c1 不会在 c2 处触发此处理程序。

c1 可以将自己标识为到 c2 的交换机,然后将数据包重定向到它。但是,在我看来,这太麻烦了。我建议 c1 带外连接到 c2 并以他们自己的协议(规则)与 c2 通信。例如,c2 等待不同端口上的连接。当 c1 连接时,c2 等待重定向的数据包。c1 将具有所需上下文的数据包重定向到 c2,c2 在收到数据包和所需上下文后决定采取行动。


推荐阅读