POX - 安装规则,该规则表示每当某个数据包与ofp_match匹配时发送虚拟数据包

时间:2016-03-19 16:36:49

标签: python tcp openflow sdn pox

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

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

我很欣赏那个非常糟糕的伪代码,但它应该说明我尝试做的事情比我试图解释它要好一些。

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

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

由于

1 个答案:

答案 0 :(得分:0)

据我所知,答案是没有OpenFlow不支持这个概念,更不用说Pox了。 Pox可以告诉交换机生成一个数据包,但是没有流表条目,其中包含发送此其他数据包的操作。

这可以实现的可能方式如下:

  1. TCP协议和端口号匹配有两个动作。第一个动作发送数据包,动作号2将数据包发送到流表的一些备用表。

  2. 在此表中有一个操作来修改数据包以发送此虚拟数据包。您无法制作特定的一个,但您可以说将目标IP修改为某些无意义的值,或将某些无意义的VLAN设置为一种sudo标记。

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

    当说明备用表时,我说的是openflow 1.3启用的概念,它表示所有流表不必是单个列表进行处理。相反,所有数据包都可以转到表0进行处理,然后如果动作声明它可以将数据包发送到表5以进行扩展处理,或者根据找到的表0进行更有针对性的处理。这允许更多样化的操作,您可以将这个新概念视为表格或二维数组,其中最终元素是流表条目。对不起,单词表出现了很多,我希望他们为这个概念选择一个不同的词。

    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)
    

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