RYU 删除流表项 删除不掉 问题

来源:互联网 发布:淘宝女装模板 编辑:程序博客网 时间:2024/06/04 18:08

问题描述

在做实验的时候需要有删除流表的操作,但是在删除的时候发现并删除不掉,很是奇怪,最终在查阅了文档之后才发现貌似RYU对于FlowMod的匹配要求很高,很严格,需要指定很多参数

可以看到,上面的match部分就是in_port,eth_type,ipv4_src,ipv4_dst四个字段,所以 我原先的代码是这样的:

def del_flow(self, datapath, match):        ofproto = datapath.ofproto        parser = datapath.ofproto_parser        mod = parser.OFPFlowMod(            datapath=datapath, match=match, cookie=0,            command=ofproto.OFPFC_DELETE)        datapath.send_msg(mod)match = parser.OFPMatch(        in_port=3, eth_type=flow_info[0],        ipv4_src="10.0.0.1", ipv4_dst="10.0.0.2")self.del_flow(datapath, match)

之后在网上看到一种说是可能正确的更优雅的写法:

kwargs = dict(in_port=3, eth_type=flow_info[0],                    ipv4_src="10.0.0.1", ipv4_dst="10.0.0.2")match = parser.OFPMatch(**kwargs)

然而,都没有什么卵用(微笑

这个表项依旧是存在的

解决方法

http://ryu.readthedocs.io/en/latest/ofproto_v1_3_ref.html?highlight=OFPFlowMod

class ryu.ofproto.ofproto_v1_3_parser.OFPFlowMod(datapath, cookie=0, cookie_mask=0, table_id=0, command=0, idle_timeout=0, hard_timeout=0, priority=32768, buffer_id=4294967295, out_port=0, out_group=0, flags=0, match=None, instructions=None)


给出了OFPFlowMod的调用方法,仿照他的写法,改成了如下:

ofp = datapath.ofproto            ofp_parser = datapath.ofproto_parser            cookie = cookie_mask = 0            table_id = 0            idle_timeout = 15            hard_timeout = 60            priority = 1            buffer_id = ofp.OFP_NO_BUFFER            match = ofp_parser.OFPMatch(in_port=3, eth_type=flow_info[0],                        ipv4_src="10.0.0.1", ipv4_dst="10.0.0.2")            actions = []            inst = []            req = ofp_parser.OFPFlowMod(datapath, cookie, cookie_mask,                                       table_id, ofp.OFPFC_DELETE,                                       idle_timeout, hard_timeout,                                       priority, buffer_id,                                       2, ofp.OFPG_ANY,                                       ofp.OFPFF_SEND_FLOW_REM,                                       match, inst)            datapath.send_msg(req)

可以发现,参数的要求是很高的

试着删除一些参数,发现最简也就只能删掉inst字段,写成:

req = ofp_parser.OFPFlowMod(datapath, cookie, cookie_mask,                                        table_id, ofp.OFPFC_DELETE,                                        idle_timeout, hard_timeout,                                        priority, buffer_id,                                        2, ofp.OFPG_ANY,                                        ofp.OFPFF_SEND_FLOW_REM,                                        match)

ps,其中的2是流表的输出端口

总结

虽然有时候自己感觉匹配的已经很清楚了,还是太主观了,多看文档,照着文档弄总没错