【问题标题】:Redirect "ofp_packet_in" packet among multiple controllers in POX?在 POX 中的多个控制器之间重定向“ofp_packet_in”数据包?
【发布时间】:2018-06-13 05:05:47
【问题描述】:

我正在尝试在多个控制器之间重定向 ofp_packet_in 数据包。例如,假设有两个控制器c1,c2 和一个交换机s1s1 分配给 c1。现在,c1 从开关s1 接收到Packet_In。一般来说,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 没有功能。

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

我使用wireshark捕获of_packet_in数据包,以及新的redirect数据包

of_packet_in 数据包:

重定向数据包:

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

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

我猜,即使c1c2 发送合法 OpenFlow of_packet_inc2 也不知道“谁是c1,因为c1已经没有使用OpenFlow注册到c1of_hello,of_features_request,....因此,c2丢弃c1发送的OpenFlowof_packet_in ,然后说 dummy

我只想让c2处理c1重定向的Packet_In。这样c2就可以为s1中发生的table-miss事件计算并安装表项。

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

我正在使用 POX 0.2.0(鲤鱼)

【问题讨论】:

    标签: sdn openflow pox


    【解决方案1】:

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

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

    【讨论】:

    • 感谢您分享您的想法。确实如此。我发现pox/pox/openflow/of_01.py 中的代码与我的问题密切相关。调用handle_FEATURES_REPLY()后,con.ofnexus设置为core.OpenFlowConnectionArbiter.getNexus(con),直接连接core.openflow,间接连接自定义的_handle_packet_in。但是,con.ofnexus 最初是 _dummyOFNexus。这就是为什么“提高虚拟 OpenFlowNexus”的原因。现在,我正在尝试手动将此虚拟con.ofnexus 设置为core.OpenFlowConnectionArbiter.getNexus(con)。它可以工作,但可能存在一些潜在的错误~
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-17
    • 1970-01-01
    相关资源
    最近更新 更多