sdn - 在 POX 中的多个控制器之间重定向“ofp_packet_in”数据包?
问题描述
我正在尝试ofp_packet_in
在多个控制器之间重定向数据包。例如,假设有两个控制器c1,c2
和一个开关s1
。s1
分配给c1
。现在,c1
收到一个Packet_In
from switch 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
处理程序。
我使用wireshark捕获of_packet_in
数据包,以及新的重定向数据包
很明显,它们具有相同的有效载荷(OpenFlow 数据包)。
但是,c2
不接受此数据包,并警告这是虚拟的 OpenFlowNexus。这是错误:
我猜,即使c1
发送一个合法的OpenFlowof_packet_in
给c2
,c2
也不知道“谁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(鲤鱼)
解决方案
您将 c1 连接到 c2,就好像 c1 是一个开关一样,并且您希望 c2 像这样对待 c1。然而,c1 并没有像这样代表自己。事实上,c1 并没有向 c2 介绍自己。每个连接到控制器的交换机都遵循特定的识别协议,您可以在 ConnectionUp 处理程序中看到这种情况。c1 不会在 c2 处触发此处理程序。
c1 可以将自己标识为到 c2 的交换机,然后将数据包重定向到它。但是,在我看来,这太麻烦了。我建议 c1 带外连接到 c2 并以他们自己的协议(规则)与 c2 通信。例如,c2 等待不同端口上的连接。当 c1 连接时,c2 等待重定向的数据包。c1 将具有所需上下文的数据包重定向到 c2,c2 在收到数据包和所需上下文后决定采取行动。
推荐阅读
- keras - 运行 Tensorflow 2.0 代码会给出“ValueError:tf.function-decorated 函数试图在非首次调用时创建变量”。我究竟做错了什么?
- xml - 如何使用 Xquery 和 FLOWR 迭代并返回每个结果?
- spring - Spring Data / Hibernate 使用 Postgres 保存实体,在冲突更新某些字段时使用插入
- cordova - 如何在 PhoneGap config.xml 中从 npm / github 引用 cordova-plugin
- google-chrome - Cloud-flare 通用证书上的 ERR_INVALID_CERT_AUTHORITY(怀疑是谷歌浏览器)
- javascript - 在小数点左侧填充 2 位,在右侧填充 1
- c++ - 如何定义一个可以在没有联合的情况下保存 uintptr_t 或 uint32_t 的类型?
- powershell - Powershell 无法仅将文件从一个目录移动到另一个目录?
- c++ - 有没有办法在 C++ 中创建类型变量?
- python-3.x - 如何在 python3 脚本中导入 gimp?