流表项莫名地被删除 无故消失的解决方法和参考 流表删除的三种方式 OFPFC_DELETE_STRICT OFPFC_DELETE
2017-09-18 19:31
567 查看
问题描述
在进行一个实验的时候,需要进行增添和删除流表项的操作,遇到了一个问题,在我删除一个指定表项,添加一个指定表项之后,原先流表中的一个不相关的表项也不见了。代码如下:
ofp = datapath.ofproto ofp_parser = datapath.ofproto_parser cookie = cookie_mask = 0 table_id = 0 idle_timeout = 1000 hard_timeout = 1000 priority = ip_to_bin(node.ipv4_src[1]).count("0")+1 buffer_id = ofp.OFP_NO_BUFFER match = 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:",priority match = 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:",priority pri = ip_to_bin(node.parent.ipv4_src[1]).count("0")+1 actions=[] 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的生存时间以及统计数据等。
相关文章推荐
- Delete of BizTalkServerIsolatedHost failed解决方法
- 诡异的问题:Excel做报表打印,莫名在根目录生成快捷方式的解决方法
- svn删除目录后提交显示xxx is out of date解决方法
- PHP删除HTMl标签的三种解决方法
- php删除html标签的三种解决方法
- delete语句执行不下去,删除不了数据,解决方法
- MFC CTreectrl 通过DeleteAllItems删除全部节点后,再插入节点不显示问题解决方法
- SQLSERVER误删除了Windows登录用户验证方式使用Windows身份验证的解决方法
- SQLSERVER误删除了Windows登录用户验证方式使用Windows身份验证的解决方法
- win7删除桌面文件需要刷新才会消失(2种解决方法)
- (当传递具有已删除行的 DataRow 集合时,更新要求有效的 DeleteCommand)解决方法
- jetty java文件无法删除 java文件占用 delete无效 运行时锁定静态资源的解决方法
- Linux Mint(Ubuntu)下rabbitvcs右键菜单莫名消失的解决方法
- svn删除目录后提交显示Item 'XXXX' is out of date解决方法
- Delete of BizTalkServerIsolatedHost failed解决方法
- 移动硬盘提示格式化解决的方法,未正确删除导致不能读取文件提示格式化解决方式
- 以popup方式呈现的viewcontroller中键盘消失的解决方法
- TOAD8.3.5 在SQL Editor 中编辑是Backspace键 Delete 键删除失效的问题解决方法
- Delete of BizTalkServerIsolatedHost failed解决方法
- 安全删除硬件图标消失的解决方法