我正在尝试在多个控制器之间重定向ofp_packet_in
数据包。例如,假设有两个控制器c1,c2
和一个开关s1
。 s1
被分配到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
数据包,以及新的重定向数据包
很明显,它们具有相同的有效负载(OpenFlow数据包)。
但是,c1
不接受此数据包,并警告这是虚拟的OpenFlowNexus。这是错误:
我想,即使of_packet_in
向<{1}}发送合法 OpenFlow c2
,c2
也不知道&# 34;谁c1
&#34; ,c1
使用OpenFlow c1
向of_hello
注册<{1}},{{ 1}},....因此,of_features_request
会丢弃c2
发送的OpenFlow of_packet_in
,并说虚拟。
我只想让c1
处理由c2
重定向的Packet_In
。通过这种方式,c1
可以计算并安装c2
中发生的table-miss
事件的表条目。
也许我可以使用其他控制器,如泛光灯,ONOS ......来解决这个问题。也许这个问题无法解决。感谢您分享您的想法,祝福。
我使用的是POX 0.2.0(鲤鱼)
答案 0 :(得分:0)
你将c1连接到c2,好像c1是一个开关,你希望c2像这样对待c1。但是,c1并没有像这样代表自己。实际上,c1并没有以任何方式将自己介绍给c2。连接到控制器的每个交换机都遵循某种标识协议,您可以在ConnectionUp处理程序中看到这种情况。 c1不会在c2处触发此处理程序。
c1可以将自己标识为切换到c2,然后将数据包重定向到它。但是,在我看来,这太麻烦了。我建议c1在带外连接到c2,并在自己的协议(规则)中与c2通信。例如,c2等待不同端口上的连接。当c1连接时,c2等待重定向的数据包。 c1将具有所需上下文的数据包重定向到c2,c2在收到数据包和所需的上下文时决定采取行动。