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