Перенаправить пакет «ofp_packet_in» между несколькими контроллерами в POX? - PullRequest
0 голосов
/ 13 июня 2018

Я пытаюсь перенаправить пакет 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: imageof_packet_in packet">

пакет перенаправления: redirect packet

Ясно, что они имеют одинаковую полезную нагрузку (пакет OpenFlow).

Однако c2 не делаетt принять этот пакет и предупредить, что это фиктивный OpenFlowNexus.Это ошибка: c2 error

Я думаю, даже если 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 (карп)

1 Ответ

0 голосов
/ 13 июня 2018

Вы подключаете c1 к c2, как если бы c1 был коммутатором, и вы ожидаете, что c2 будет обращаться с c1 таким образом.Однако c1 не представлял себя таким.На самом деле, с1 никак не представился с2.Каждый коммутатор, который подключается к контроллеру, следует определенному протоколу идентификации, и вы можете видеть это в обработчике ConnectionUp.c1 не запускает этот обработчик на c2.

c1 может идентифицировать себя как коммутатор к c2 и затем перенаправлять пакеты к нему.Однако, на мой взгляд, это слишком громоздко.Я бы порекомендовал c1 подключаться к c2 вне диапазона и общаться с c2 по их собственному протоколу (правила).Например, c2 ожидает подключения к другому порту.Когда c1 соединяется, c2 ожидает перенаправленных пакетов.c1 перенаправляет пакет с требуемым контекстом на c2, а c2 принимает решение о действии после получения пакета и требуемого контекста.

...