私が知る限り、OpenFlow は Pox はおろか、この概念をサポートしていません。Pox はスイッチにパケットを生成するように指示できますが、この別のパケットをここに送信するアクションを持つフロー テーブル エントリはありません。
ただし、これを実装できる可能な方法は次のとおりです。
TCP プロトコルとポート番号の一致には 2 つのアクションがあります。アクション番号 1 はパケットを送信し、アクション番号 2 はパケットをフロー テーブル用の予備テーブルに送信します。
このテーブルには、このダミー パケットを送信するようにパケットを変更するアクションがあります。特定のものを作成することはできませんでしたが、宛先 IP を意味のない値に変更したり、意味のない VLAN を一種の sudo マーカーとして設定したりすることはできます。
編集:ユーザーは、予備のテーブルの意味を明確にするように求めたので、使用する予定のプロセスを表示する pox コマンドをいくつか見つけようとします。最初に、基本的な pox コマンドの多くについてこのwiki をお勧めします。これは少し古く、場合によっては間違っていますが、非常に便利です。
予備のテーブルを述べるとき、openflow 1.3 で有効になった概念について話しています。つまり、すべてのフロー テーブルが処理のために単一のリストである必要はありません。代わりに、すべてのパケットは処理のためにテーブル 0 に移動できます。アクションが、テーブル 0 で見つかったものに基づいて、拡張処理またはよりターゲットを絞った処理のためにパケットをテーブル 5 に送信できると述べている場合。これにより、より用途の広いアクションが可能になります。この新しい概念は、テーブルのテーブル、または最終要素がフロー テーブル エントリである 2 次元配列と考えることができます。テーブルという言葉が出てきて申し訳ありませんが、この概念に別の言葉を選んでくれたらいいのにと思います。
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))