Назначение по умолчанию для пакета в 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
Я новичок в Ryu, и я также встретил ту же проблему. Не могли бы вы поделиться своим кодом для меня? Я очень ценю это! – Charlie