删除与特定cookie匹配的流 - OpenVSwitch的{OpenFlow 1.3.5 Spec支持

时间:2018-04-23 00:10:05

标签: openflow openvswitch ryu

根据OpenFlow 1.3.5规范,第44页指定了以下内容:

  

如果cookie_mask字段包含,则还可以通过cookie值过滤修改和删除命令   除0以外的值。此约束是两者中cookie_mask指定的位   flow mod的cookie字段和flow条目的cookie值必须相等。换一种说法,   (flow entry.cookie& flow mod.cookie mask)==(flow mod.cookie& flow mod.cookie mask)。

现在,使用基于Ryu python的控制器,我尝试通过指定流的cookie值来删除流,但过程不成功。

以下代码是我使用的测试示例。

from ryu.base.app_manager import RyuApp
from ryu.controller.dpset import EventDP
from ryu.controller.handler import MAIN_DISPATCHER
from ryu.controller.handler import set_ev_cls
from ryu.ofproto import ofproto_v1_3
from ryu.ofproto import ether, inet

class MPLS_Testing(RyuApp):
  OFP_VERSIONS = [ofproto_v1_3.OFP_VERSION]

  @set_ev_cls(EventDP, MAIN_DISPATCHER)
  def switch_connect_event(self, ev):
    ofp_parser = ev.dp.ofproto_parser
    ofp = ev.dp.ofproto
    datapath_obj = ev.dp
    if ev.enter:
      datapath_obj.send_msg(  # Removes all flows registered in this switch.
        ofp_parser.OFPFlowMod(
          datapath=datapath_obj,
          table_id=ofp.OFPTT_ALL,
          command=ofp.OFPFC_DELETE,
          out_port=ofp.OFPP_ANY,
          out_group=ofp.OFPG_ANY,
        )
      )
      add_label_flow = ofp_parser.OFPFlowMod(
        datapath=datapath_obj,            
        cookie=1,        
        table_id=0,
        command=ofp.OFPFC_ADD,
        match=ofp_parser.OFPMatch(
          in_port=1
        ),
        instructions=[
          ofp_parser.OFPInstructionActions(
            ofp.OFPIT_APPLY_ACTIONS,
            [
              ofp_parser.OFPActionPushMpls(),
              ofp_parser.OFPActionSetField(mpls_label=16),
            ]
          ),
          ofp_parser.OFPInstructionGotoTable(table_id=1),
        ]
      )
      datapath_obj.send_msg(add_label_flow)

      add_label_flow2 = ofp_parser.OFPFlowMod(
        datapath=datapath_obj,            
        cookie=2,
        table_id=1,
        command=ofp.OFPFC_ADD,            
        match=ofp_parser.OFPMatch(
          in_port=1
        ),
        instructions=[
          ofp_parser.OFPInstructionActions(
            ofp.OFPIT_APPLY_ACTIONS,
            [
              ofp_parser.OFPActionPushMpls(),
              ofp_parser.OFPActionSetField(mpls_label=12),
            ]
          ),
          ofp_parser.OFPInstructionGotoTable(table_id=2),
        ]
      )
      datapath_obj.send_msg(add_label_flow2)

      # Deletes flow with cookie equal to 2.
      datapath_obj.send_msg(
        ofp_parser.OFPFlowMod(
          cookie=2,
          cookie_mask=0xFFFFFFFFFFFFFFFF,
          datapath=datapath_obj,
          command=ofp.OFPFC_DELETE,
          out_port=ofp.OFPP_ANY,
          out_group=ofp.OFPG_ANY,
        )
      )

有人能告诉我,当从表中删除流时,OpenVSwitch 2.9是否支持cookie匹配? OpenFlow 1.3.5规范明确指出,当cookie_mask不为零时,Delete命令也可以使用cookie值过滤流。目前,我有点迷失在这里。

1 个答案:

答案 0 :(得分:0)

我已经找到了遗漏的内容。

@pchaigno感谢您的支持。

table_id = OFPTT_ALL似乎缺少OFPFlowMod 信息。初始化对象时, Ryu 似乎默认此值为零。因此,用作OFPFlowMod命令的OFPFC_DELETE消息 Ryu 默认情况下会添加table_id = 0匹配要求。

因此,当使用 Ryu 时,从Switch切换cookie等于2的流的正确消息结构是:

ofp_parser.OFPFlowMod(
    datapath=datapath_obj,
    cookie=2,
    cookie_mask=0xFFFFFFFFFFFFFFFF,
    table_id=ofp.OFPTT_ALL,
    command=ofp.OFPFC_DELETE,
    out_port=ofp.OFPP_ANY,
    out_group=ofp.OFPG_ANY
)

根据标准,out_port必须等于OFPP_ANYout_group OFPG_ANY字段必须等于table_id,否则两个字段都将被视为匹配要求。 似乎table_id = OFPTT_ALL字段遵循几乎相同的逻辑,需要a >>> import time >>> >>> time.monotonic() 452782.067158593 >>> >>> a = time.monotonic() >>> time.sleep(1) >>> b = time.monotonic() >>> print(b-a) 1.001658110995777 匹配所有表格。

我现在认为这个问题已经解决了。