【发布时间】:2018-06-13 05:05:47
【问题描述】:
我正在尝试在多个控制器之间重定向 ofp_packet_in 数据包。例如,假设有两个控制器c1,c2 和一个交换机s1。 s1 分配给 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数据包
很明显,它们具有相同的有效负载(OpenFlow 数据包)。
但是,c2 不接受此数据包,并警告说这是虚拟的 OpenFlowNexus。这是错误:
我猜,即使c1 向c2 发送合法 OpenFlow of_packet_in,c2 也不知道“谁是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(鲤鱼)
【问题讨论】: