Перенаправить пакет ofp_packet_in между несколькими контроллерами в POX?

Я пытаюсь перенаправить 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 и нового пакета перенаправления.

of_packet_in пакет:  ‹code› of_packet_in ‹/code› пакет

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

Понятно, что у них одинаковая полезная нагрузка (пакет OpenFlow).

Однако c2 не принимает этот пакет и предупреждает, что это фиктивный OpenFlowNexus. Это ошибка:  ошибка c2

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


person jiexray    schedule 13.06.2018    source источник


Ответы (1)


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

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

person Daniel    schedule 13.06.2018
comment
Спасибо, что поделились своей идеей. Это правда. Я обнаружил, что код в pox/pox/openflow/of_01.py тесно связан с моей проблемой. После вызова handle_FEATURES_REPLY() для con.ofnexus устанавливается значение core.OpenFlowConnectionArbiter.getNexus(con), которое напрямую связано с core.openflow и косвенно - с настроенным _handle_packet_in. Однако изначально con.ofnexus равно _dummyOFNexus. Поэтому поднимите на пустышку OpenFlowNexus. Теперь я пытаюсь вручную установить для этого манекена con.ofnexus значение core.OpenFlowConnectionArbiter.getNexus(con). Это работает, но, возможно, есть некоторые потенциальные ошибки ~ - person jiexray; 14.06.2018