POX - 安装一个规则,当某个数据包匹配 ofp_match 时发送一个虚拟数据包

POX - Installing a rule which says to send a dummy packet whenever a certain packet matches an ofp_match

是否可以在交换机上安装一个规则,指示交换机执行以下操作:

If packet_in is TCP:
    send ( dummy packet )
    send (packet_in)
    send ( dummy packet)
else:
    send (packet_in)

我很欣赏那是非常糟糕的伪代码,但它应该比我试图解释它更好地说明我正在尝试做的事情。

基本上,我试图通过传输虚拟数据包来space 完成项目的 TCP 数据包传输,而不必要求将每个 TCP 数据包都发送到控制器。我希望交换机正常运行,但是当它收到一个发往某个端口的 TCP 数据包时,我希望交换机也从同一端口传输一个虚拟数据包(我已经构建),前往同一目的地。

我知道可能有一些更好的方法来实现我想要实现的目标 - 我乐于接受建议!

谢谢

据我所知答案是否定的 OpenFlow 不支持这个概念更不用说 Pox 了。 Pox 可以告诉交换机生成一个数据包,但是没有流 table 条目具有将另一个数据包发送到这里的操作。

一种可能的实现方式如下:

  1. 匹配TCP协议和端口号有两个动作。第一个动作发送数据包,第二个动作将数据包发送到某个备用 table 以供流 tables.

  2. 在这个table中有一个修改数据包的动作来发送这个虚拟数据包。你不能制作一个特定的,但你可以说将目标 IP 修改为一些无意义的值或将一些无意义的 VLAN 设置为一种 sudo 标记。

编辑: 用户要求澄清我所说的备用 table 是什么意思,所以我将尝试找到一些 pox 命令来显示我计划使用的过程。 首先,我会建议 this wiki 了解很多基本的 pox 命令,它有点过时,在某些情况下是错误的,但总的来说它非常有用。

当陈述备用 table 时,我在谈论 openflow 1.3 启用的概念,它表示所有流 table 不必是单个列表即可进行处理。相反,所有数据包都可以转到 table 0 进行处理,然后如果操作声明它可以将数据包发送到 table 5 以进行扩展处理或根据 table 0 发现的内容进行更有针对性的处理.这允许更通用的操作,您可以将这个新概念视为 table 的 table 或最终元素为流 table 条目的二维数组。抱歉 table 这个词经常出现我希望他们为这个概念选择一个不同的词。

默认情况下,Pox 不支持此概念,因为它使用 OpenFlow1.0,但是有一个扩展可以启用它,可以找到更多信息 here。一些重要的作品可以在下面找到。

# 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)

在此示例中,启用了多 table 支持,然后添加一个流,将所有数据包发送到控制器和 table 1,从那里 table 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))