2016-05-23 8 views
1

Мне нужно идентифицировать контрольный пакет из RYU-контроллера Python. Другими словами: Как я могу выполнить следующую инструкцию?Как я могу идентифицировать пакет с переключателем Ryu-to-to?

If (I receive a OFPT_PACKET_OUT msg from ryu-controller) 
    do something (for example all control traffic must mirroring to an output port) 

И как я могу соответствовать этому правилу?

Я видел в спецификации OpenFlow v1.3, что есть зарезервированный порт ofproto.OFPP_CONTROLLER: как я могу использовать его как входной порт?

От OFv1.3 спецификации .: «OFPP_CONTROLLER:. Представляет собой канал управления с контроллером OpenFlow Может быть использован в качестве входного порта или в качестве выходного порта

При использовании в качестве выходного порта, инкапсулирования. пакет в пакетном сообщении и отправить его с использованием протокола OpenFlow.

При использовании в качестве входного порта укажите пакет, исходящий от контроллера. "

Спасибо за помощь.

+0

Мне нужно идентифицировать только сообщения OFPT_PACKET_OUT от контроллера –

ответ

1

Что касается первой части вашего вопроса, давайте посмотрим, базовый коммутатор уровня 2, который просто заливает входящие пакеты на все выходные порты:

from ryu.base import app_manager 
from ryu.controller import ofp_event 
from ryu.controller.handler import MAIN_DISPATCHER 
from ryu.controller.handler import set_ev_cls 

class L2Switch(app_manager.RyuApp): 
    def __init__(self, *args, **kwargs): 
     super(L2Switch, self).__init__(*args, **kwargs) 

    @set_ev_cls(ofp_event.EventOFPPacketIn, MAIN_DISPATCHER) 
    def packet_in_handler(self, ev): 
     msg = ev.msg 
     dp = msg.datapath 
     ofp = dp.ofproto 
     ofp_parser = dp.ofproto_parser 

     actions = [ofp_parser.OFPActionOutput(ofp.OFPP_FLOOD)] 
     out = ofp_parser.OFPPacketOut(
      datapath=dp, buffer_id=msg.buffer_id, in_port=msg.in_port, 
      actions=actions) 
     dp.send_msg(out) 

Последние два утверждения являются

out = ofp_parser.OFPPacketOut(
    datapath=dp, buffer_id=msg.buffer_id, in_port=msg.in_port, 
    actions=actions) 
dp.send_msg(out) 

Эти операторы генерируют сообщение packet_out, однако я не думаю, что есть соответствующее событие, которое возникает для сообщения packet_out (как сообщение packet_in генерирует событие EventOFPPacketIn, которое могут быть обнаружены в коде, и к нему может быть присоединен метод). Я много не использовал API Ryu, но я думаю, что причина проста. Сообщение packet_out отправляется через код, и вы можете просто добавить еще несколько строк кода после строк, генерирующих это событие. Эти несколько строк могут выполнять все, что вы хотите сделать, при генерации сообщения packet_out. Например, в приведенном выше коде вы можете просто добавить трафик, контролирующий трафик, на определенный порт после строки dp.send_msg(out). Исправьте/отредактируйте мой ответ, если я ошибаюсь.