流表项莫名地被删除 无故消失的解决方法和参考 流表删除的三种方式 OFPFC_DELETE_STRICT OFPFC_DELETE

来源:互联网 发布:达科塔约翰逊知乎 编辑:程序博客网 时间:2024/05/22 15:19

问题描述

在进行一个实验的时候,需要进行增添和删除流表项的操作,遇到了一个问题,在我删除一个指定表项,添加一个指定表项之后,原先流表中的一个不相关的表项也不见了。
代码如下:

ofp = datapath.ofprotoofp_parser = datapath.ofproto_parsercookie = cookie_mask = 0table_id = 0idle_timeout = 1000hard_timeout = 1000priority = ip_to_bin(node.ipv4_src[1]).count("0")+1buffer_id = ofp.OFP_NO_BUFFERmatch = ofp_parser.OFPMatch(eth_type=flow_info[0],            ipv4_src=node.ipv4_src, ipv4_dst=node.ipv4_dst)actions=[]actions.append(parser.OFPActionOutput(node.action))inst = [ofp_parser.OFPInstructionActions(ofp.OFPIT_APPLY_ACTIONS,actions)]req = ofp_parser.OFPFlowMod(datapath, cookie, cookie_mask,                            table_id, ofp.OFPFC_DELETE_STRICT,                            idle_timeout, hard_timeout,                            priority, buffer_id,                            node.action, ofp.OFPG_ANY,                            ofp.OFPFF_SEND_FLOW_REM,                            match,inst)datapath.send_msg(req)self.logger.info("**********entry sibling node 1 is deleted*************") print node.ipv4_src,"is deleted","priority:",prioritymatch = ofp_parser.OFPMatch(eth_type=flow_info[0],            ipv4_src=sibling_node.ipv4_src, ipv4_dst=sibling_node.ipv4_dst)actions=[]actions.append(parser.OFPActionOutput(sibling_node.action))inst = [ofp_parser.OFPInstructionActions(ofp.OFPIT_APPLY_ACTIONS,actions)]req = ofp_parser.OFPFlowMod(datapath, cookie, cookie_mask,                            table_id, ofp.OFPFC_DELETE_STRICT,                            idle_timeout, hard_timeout,                            priority, buffer_id,                            sibling_node.action, ofp.OFPG_ANY,                            ofp.OFPFF_SEND_FLOW_REM,                            match,inst)datapath.send_msg(req)self.logger.info("**********entry sibling node 2 is deleted*************")print sibling_node.ipv4_src,"is deleted","priority:",prioritypri = ip_to_bin(node.parent.ipv4_src[1]).count("0")+1actions=[]actions.append(parser.OFPActionOutput(node.parent.action))match = parser.OFPMatch(eth_type=flow_info[0],ipv4_src=node.parent.ipv4_src,ipv4_dst=node.parent.ipv4_dst)self.add_flow(datapath, pri, match, actions,idle_timeout=1000, hard_timeout=1000)self.logger.info("**********entry sibling node parent is added*************")print node.parent.ipv4_src,"is added","priority:",pri

解决方法

查看源码中所有关于删除表项的操作,发现除了OFPFC_DELETE外,还有另外一个指定的参数,叫OFPFC_DELETE_STRICT,网上关于他们比较的资料很少,我找到有如下的论述:

OFPFC_DELETE Flow Entry 刪除
OFPFC_DELETE_STRICT 嚴格的 Flow Entry 刪除

再回想我在之前的一篇文章中写到的flow_mod的参数中写的很全面,避免删除不掉的情况,从需求上也很符合OFPFC_DELETE_STRICT字面的特点,于是将代码中的OFPFC_DELETE 进行了替换。问题就得到了解决,具体他们的区别是什么,还需要继续深究。同时给可能遇到这个问题的朋友一个可能的解决方法。

流表项删除的三种方式

同时,在寻找被删除的原因的过程中,了解到了流表被删除的三种方式,比原先自己想的要多一种。

Flow Entry可以通过三种方式从Flow Table里被移除:
1)通过Remote Controller直接发送移除Flow Entry的消息,
2)通过OpenFlow Switch的过期机制,
3)OpenFlow Switch的逐出机制。

  OpenFlow Switch过期机制的运行行为独立于Remote Controller,仅依赖于当前Flow Entries的状态和配置。每一个Flow Entry有一个与之关联的 idle_timeout 和 hard_timeout,如果 hard_timeout 值不为 0 ,那么OpenFlow Switch需要记住这条Flow Entry的生成时间,当其生存时间达到指定的 hard_timeout 时间时,将被逐出Flow Table,而不管之前有多少个数据包与之成功匹配;如果 idle_timeout 值不为 0 ,那么OpenFlow Switch需要记住最后一次与该Flow Entry成功匹配的时间,当超过指定 idle_timeout 时间仍未有能成功匹配的数据包,那么该Flow Entry将会被逐出Flow Table。

  Remote Controller也可以发送 Flow Deletion 消息(OFPFC_DELETE 或者 OFPFC_DELETE_STRICT)给OpenFlow Switch;Flow Entries 也可能是由于Group或者Meter的移除而被移除。

  当OpenFlow Switch需要回收资源时,Flow Entries 也有可能被逐出Flow Table。该机制对于OpenFlow Switch实现者来说是一个可选的特性,其必须按照规范来决定哪些Flow Entries被逐出,可能会依照Flow Entry参数、资源映射关系或者其他内部约束等。

  当一个Flow Entry会移除时,OpenFlow Switch必须检查该Flow Entry的 OFPFF_SEND_FLOW_REM 值,如果该值被设置了,那么必须发送一个Flow Removal消息给Remote Controller,每一个Flow Removal消息都包含一个完整的Flow Entry描述以及被移除的原因说明(过期、主要删除或者被逐出)、直到删除这刻该Flow Entry的生存时间以及统计数据等。

阅读全文
1 0
原创粉丝点击