重定向" ofp_packet_in" POX中多个控制器之间的数据包?

时间:2018-06-13 05:05:48

标签: sdn openflow pox

我正在尝试在多个控制器之间重定向ofp_packet_in数据包。例如,假设有两个控制器c1,c2和一个开关s1s1被分配到c1。现在,c1从切换Packet_In收到s1。通常,s1应该处理此Packet_In我要做的是将Packet_In发送给c2并让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没有任何功能。

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

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

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

重定向数据包: redirect packet

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

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

我想,即使of_packet_in向<{1}}发送合法 OpenFlow c2c2也不知道&# 34;谁c1&#34; c1使用OpenFlow c1of_hello 注册<{1}},{{ 1}},....因此,of_features_request会丢弃c2发送的OpenFlow of_packet_in,并说虚拟

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

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

我使用的是POX 0.2.0(鲤鱼)

1 个答案:

答案 0 :(得分:0)

你将c1连接到c2,好像c1是一个开关,你希望c2像这样对待c1。但是,c1并没有像这样代表自己。实际上,c1并没有以任何方式将自己介绍给c2。连接到控制器的每个交换机都遵循某种标识协议,您可以在ConnectionUp处理程序中看到这种情况。 c1不会在c2处触发此处理程序。

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