流表项莫名地被删除 无故消失的解决方法和参考 流表删除的三种方式 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的生存时间以及统计数据等。
- 流表项莫名地被删除 无故消失的解决方法和参考 流表删除的三种方式 OFPFC_DELETE_STRICT OFPFC_DELETE
- 类对象的堆内存莫名被删除调试方案
- 由于技术相关的文章和资源被无故删除,本博客停止更新,并转移到 Medium
- 硬盘空间莫名消失解决方法
- Eclipse Project 无故消失的解决办法
- 设置(创建)主键和外键的三种方式 和 删除含有主键外键的表顺序
- PHP删除HTMl标签的三种解决方法
- Oracle10g 闪回表地恢复被意外删除的表
- MySQL 三种删除方式的区别:delete truncate drop
- c++ map删除元素的三种方式
- 一篇被无故消失很多次的博文---韩寒《1988 我想和这个世界谈谈》读后
- 几种删除表空间的方式
- Linux Mint(Ubuntu)下rabbitvcs右键菜单莫名消失的解决方法
- 删除MySQL的方式
- LitePal的修改和删除操作(三)
- 【坑】tomcat中上传的图片文件无故消失
- 对象序列化后部分属性无故消失的解决办法
- RecycleVIew添加和删除,以及三种展现方式
- hiho1576 子树中的最小权值【dfs序】
- 单链表逆序(就地逆置和头插)
- angular删除表格
- 介绍几个绕开JS验证的方法(服务器端验证是必要的)
- 文章标题
- 流表项莫名地被删除 无故消失的解决方法和参考 流表删除的三种方式 OFPFC_DELETE_STRICT OFPFC_DELETE
- 浏览器中F5和CTRL F5的行为区别
- javabean是什么和总结javabean的两种使用方式
- Codeforces 434 Div. 2 A
- 51nod 1444 破坏道路 最短路
- RMQ算法的学习(区间最值问题)NYOJ 119 士兵杀敌(三)
- Android开发过程中的一些小问题
- 树梅派 moudbus
- include指令和include动作的区别