Я пытаюсь перенаправить пакет 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
.
Я использую wireshark для захвата пакета of_packet_in
, а новый пакет redirect
of_packet_in
package: of_packet_in packet">
пакет перенаправления:
Ясно, что они имеют одинаковую полезную нагрузку (пакет OpenFlow).
Однако c2
не делаетt принять этот пакет и предупредить, что это фиктивный OpenFlowNexus.Это ошибка:
Я думаю, даже если c1
отправляет легальный OpenFlow of_packet_in
в c2
, c2
имеетпонятия не имеем "кто c1
" , поскольку c1
имеет , а не зарегистрировано в c1
с использованием OpenFlow of_hello
, of_features_request
, .... Следовательно,c2
отбрасывает OpenFlow of_packet_in
, отправленный c1
, и говорит: dummy .
Я хочу разрешить c2
обрабатывать Packet_In
, перенаправленный c1
.Таким образом, c2
может рассчитать и установить записи таблицы для события table-miss
, произошедшего в s1
.
Может быть, я могу использовать другие контроллеры, такие как прожектор, ONOS ..., для решения этой проблемы.Может быть, эта проблема не может быть решена.Спасибо, что поделились своей идеей, наилучшие пожелания.
Я использую POX 0.2.0 (карп)