2016-12-07 12 views
2

Как отправить поток, чтобы удалить пакет с помощью Ryu? Я узнал из учебников, как отправить пакет из записи потока:Ryu Controller Drop Packet

  1. я определяю действие: actions = [ofp_parser.OFPActionOutput(ofp.OFPP_FLOOD)]
  2. Тогда сама запись: out = ofp_parser.OFPPacketOut(datapath=dp, buffer_id=msg.buffer_id, in_port=msg.in_port,actions=actions)
  3. Отправить сообщение для коммутатора: dp.send_msg(out)

Я пытаюсь найти документацию, чтобы этот код упал пакет вместо затопления, без успеха. Я предполагаю, что мне придется изменить действия на первом шаге и fp_parser.OFPPacketOut на втором шаге. Мне нужен кто-то более опытный на Рю и развиваться, чтобы указать мне в правильном направлении. Спасибо.

+0

Я новичок в Ryu, и я также встретил ту же проблему. Не могли бы вы поделиться своим кодом для меня? Я очень ценю это! – Charlie

ответ

0

Назначение по умолчанию для пакета в OpenFlow - это удаление пакета. Поэтому, если у вас есть правило потока, которое при его совпадении вы хотите удалить пакет, вы должны просто иметь инструкцию для CLEAR_ACTIONS, а затем никакой другой инструкции, а это означает, что никакие другие таблицы не будут обрабатываться, так как нет инструкции для обработки (go к) другой таблице и никаких действий по ней.

Помните, что помните о приоритетах вашего потока. Если у вас есть несколько правил потока, которые будут соответствовать пакету, тот, который имеет наивысший приоритет, будет тем, который вступит в силу. Таким образом, ваш пакет «drop» может быть скрыт за правилом потока с более высоким приоритетом.

Вот какой-то код, который у меня есть, который потеряет весь трафик, соответствующий данному EtherType, если предположить, что пакет с более высоким приоритетом не совпадает. Функция зависит от пары переменных экземпляра, а именно: datapath, proto и парсер.

def dropEthType(self, 
       match_eth_type = 0x0800): 
    parser = self.parser 
    proto = self.proto 
    match = parser.OFPMatch(eth_type = match_eth_type) 
    instruction = [ 
     parser.OFPInstructionActions(proto.OFPIT_CLEAR_ACTIONS, []) 
     ] 
    msg = parser.OFPFlowMod(self.datapath, 
          table_id = OFDPA_FLOW_TABLE_ID_ACL_POLICY, 
          priority = 1, 
          command = proto.OFPFC_ADD, 
          match = match, 
          instructions = instruction 
          ) 
    self._log("dropEthType : %s" % str(msg)) 
    reply = api.send_msg(self.ryuapp, msg) 
    if reply: 
     raise Exception 
+0

Алан, не работает для меня, появляется следующая ошибка Файл «/home/ubuntu/ryu/ryu/app/experiment.py», строка 94, в _packet_in_handler dropout = parser.OFPInstructionActions (type = ofproto.OFPIT_CLEAR_ACTIONS) TypeError: __init __() получил неожиданный аргумент ключевого слова 'type' – HSC

+0

Я пробовал много вариантов, и я до сих пор не могу заставить код работать. Я использую simple_switch_13.py от ryu, чтобы проверить ваше предложение о том, чтобы удалить пакеты, исходящие из определенного MAC-адреса на mininet, например, 00: 00: 00: 00: 00: 02, используя условие if. Если я пользователь «вернусь» вместо кода, который вы предложили, он работает, но я снова получаю сообщение packagein каждый раз, и этого я хочу избежать. – HSC

+0

@HSC Посмотрите на редактирование, которое я только что сделал, и посмотрим, поможет ли это. – AlanObject