Насколько я знаю, ответ - нет, OpenFlow не поддерживает эту концепцию, не говоря уже о Pox. Pox может указать коммутатору сгенерировать пакет, но в таблице потоков нет записи с действием отправки этого другого пакета сюда.
Возможный способ, которым это может быть реализовано, заключается в следующем:
Сопоставление протокола TCP и номера порта имеет два действия. Действие номер один отправляет пакет, действие номер 2 отправляет пакет в какую-то запасную таблицу для таблиц потоков.
В этой таблице есть действие по изменению пакета для отправки этого фиктивного пакета. Вы не можете создать конкретный, но вы можете изменить IP-адрес назначения на какое-то бессмысленное значение или установить какую-то бессмысленную VLAN в качестве своего рода маркера sudo.
Изменить: пользователь попросил пояснить, что я имел в виду под запасной таблицей, поэтому я попытаюсь найти некоторые команды pox, чтобы показать процесс, который я планировал использовать. Во-первых, я бы посоветовал эту вики для многих основных команд pox. немного устарело и в некоторых случаях неверно, но в целом это очень полезно.
Говоря о запасной таблице, я говорю о концепции, которую поддерживает openflow 1.3, согласно которой все потоковые таблицы не должны быть единым списком для обработки. Вместо этого все пакеты могут отправляться в таблицу 0 для обработки, а затем, если действие указывает, что оно может отправить пакет, скажем, в таблицу 5 для расширенной обработки или более целенаправленной обработки на основе того, что найдено в таблице 0. Это позволяет выполнять более универсальные действия. Вы можете думать об этой новой концепции как о таблице таблиц или двумерном массиве, где конечными элементами являются записи потоковой таблицы. Извините, что слово «таблица» встречается часто, я бы хотел, чтобы они выбрали другое слово для этой концепции.
Pox по умолчанию не поддерживает эту концепцию, так как он использует OpenFlow1.0, однако есть расширение, которое включает его, и дополнительную информацию об этом можно найти здесь. Некоторые из важных частей можно найти ниже.
# Turn on Nicira packet_ins
msg = nx.nx_packet_in_format()
event.connection.send(msg)
# Turn on ability to specify table in flow_mods
msg = nx.nx_flow_mod_table_id()
event.connection.send(msg)
msg = nx.nx_flow_mod()
msg.priority = 1 # Low priority
msg.actions.append(of.ofp_action_output(port = of.OFPP_CONTROLLER))
msg.actions.append(nx.nx_action_resubmit.resubmit_table(table = 1))
event.connection.send(msg)
msg = nx.nx_flow_mod()
msg.table_id = 1
msg.priority = 1 # Low priority
msg.actions.append(of.ofp_action_output(port = of.OFPP_FLOOD))
event.connection.send(msg)
В этом примере включена поддержка нескольких таблиц, затем добавляется поток, который отправляет все пакеты на контроллер и в таблицу 1, оттуда в таблицу 1 входит поток, который говорит, что залить все пакеты. Надеюсь, это даст вам общее представление о том, как они работают.
Если вы еще не знаете, как редактировать пакеты с помощью pox, пример действия, которое можно добавить к списку действий для изменения mac-адреса назначения, будет следующим.
ofp_action_dl_addr.set_dst(EthAddr("01:02:03:04:05:06"))
Для vlan метод, который я предложил ранее, вы могли бы сделать
msg.actions.append(of.ofp_action_vlan_vid(vlan_vid=1234))
person
arduic
schedule
23.03.2016