Discussion:
[Ryu-devel] Deleting a single flow entry
Aqsa Malik
2016-11-23 15:02:28 UTC
Permalink
Hi All,

I want to delete a single flow entry from the switch table.

Here are the flow entries in my switch:

OFPST_FLOW reply (OF1.3) (xid=0x2):
cookie=0x0, duration=176.841s, table=0, n_packets=0, n_bytes=0,
priority=35,icmp6,ipv6_dst=2001:db8:0:f101::1 actions=output:1
cookie=0x0, duration=176.841s, table=0, n_packets=0, n_bytes=0,
priority=1,icmp6,ipv6_src=2001:db8:0:f101::1
actions=set_field:fe80::200:ff:fe00:1->ipv6_src,output:2
cookie=0x0, duration=176.843s, table=0, n_packets=0, n_bytes=0,
priority=0,arp actions=NORMAL
cookie=0x0, duration=176.841s, table=0, n_packets=0, n_bytes=0,
priority=0,icmp6 actions=CONTROLLER:65509

and here is my code:

table_id=0
parser = datapath.ofproto_parser
ofproto = datapath.ofproto
match = parser.OFPMatch()
instructions = [parser.OFPActionOutput(1)]
dpid=1
priority=35
flow_mod = datapath.ofproto_parser.OFPFlowMod(datapath, cookie=0,
cookie_mask=0, table_id=0, hard_timeout=0, priority=priority,
buffer_id=ofproto.OFPCML_NO_BUFFER, out_port=ofproto.OFPP_ANY,
out_group=ofproto.OFPG_ANY, command=datapath.ofproto.OFPFC_DELETE,
match=match, instructions=instructions)

datapath.send_msg(flow_mod)

but it does not delete any flow entry. Also I am not sure what to add in
the "match" and "instructions".
--
Aqsa Malik

visit my blog at
http://www.techiworld4u.blogspot.com
Iwase Yusuke
2016-11-24 03:06:37 UTC
Permalink
Hi,

First, which field you want to use as the keys of the delete command?

If you want to delete a flow by priority, you need to use OFPFC_MODIFY_STRICT command instead.
But please note OFPFC_MODIFY_STRICT command requires all match fields to be strictly matched.

e.g.) The following deletes the flow after sleeping 3 seconds
$ git diff
diff --git a/ryu/app/simple_switch_13.py b/ryu/app/simple_switch_13.py
index 3e7c598..0172d84 100644
--- a/ryu/app/simple_switch_13.py
+++ b/ryu/app/simple_switch_13.py
@@ -21,6 +21,8 @@ from ryu.ofproto import ofproto_v1_3
from ryu.lib.packet import packet
from ryu.lib.packet import ethernet
from ryu.lib.packet import ether_types
+from ryu.lib.packet import in_proto
+from ryu.lib import hub


class SimpleSwitch13(app_manager.RyuApp):
@@ -48,6 +50,35 @@ class SimpleSwitch13(app_manager.RyuApp):
ofproto.OFPCML_NO_BUFFER)]
self.add_flow(datapath, 0, match, actions)

+ actions = [parser.OFPActionOutput(1)]
+ match = parser.OFPMatch(eth_type=ether_types.ETH_TYPE_IPV6,
+ ipv6_dst='2001:db8::1',
+ ip_proto=in_proto.IPPROTO_ICMPV6)
+
+ self.add_flow(datapath, 35, match, actions)
+
+ hub.spawn(self.del_icmp_flow, datapath)
+
+ def del_icmp_flow(self, datapath):
+ parser = datapath.ofproto_parser
+ ofproto = datapath.ofproto
+
+ hub.sleep(3)
+
+ match = parser.OFPMatch(eth_type=ether_types.ETH_TYPE_IPV6,
+ ipv6_dst='2001:db8::1',
+ ip_proto=in_proto.IPPROTO_ICMPV6)
+ priority = 35
+ flow_mod = datapath.ofproto_parser.OFPFlowMod(
+ datapath,
+ priority=priority,
+ out_port=1,
+ out_group=ofproto.OFPG_ANY,
+ command=datapath.ofproto.OFPFC_DELETE_STRICT,
+ match=match)
+
+ datapath.send_msg(flow_mod)
+
def add_flow(self, datapath, priority, match, actions, buffer_id=None):
ofproto = datapath.ofproto
parser = datapath.ofproto_parser


mininet> sh ovs-ofctl dump-flows s1
NXST_FLOW reply (xid=0x4):
cookie=0x0, duration=1.754s, table=0, n_packets=0, n_bytes=0, idle_age=717, priority=35,icmp6,ipv6_dst=2001:db8::1 actions=output:1
cookie=0x0, duration=1.755s, table=0, n_packets=0, n_bytes=0, idle_age=1284, priority=0 actions=CONTROLLER:65535
mininet> sh ovs-ofctl dump-flows s1
NXST_FLOW reply (xid=0x4):
cookie=0x0, duration=2.359s, table=0, n_packets=0, n_bytes=0, idle_age=718, priority=35,icmp6,ipv6_dst=2001:db8::1 actions=output:1
cookie=0x0, duration=2.360s, table=0, n_packets=0, n_bytes=0, idle_age=1285, priority=0 actions=CONTROLLER:65535
mininet> sh ovs-ofctl dump-flows s1
NXST_FLOW reply (xid=0x4):
cookie=0x0, duration=2.852s, table=0, n_packets=0, n_bytes=0, idle_age=718, priority=35,icmp6,ipv6_dst=2001:db8::1 actions=output:1
cookie=0x0, duration=2.853s, table=0, n_packets=0, n_bytes=0, idle_age=1285, priority=0 actions=CONTROLLER:65535
mininet> sh ovs-ofctl dump-flows s1
NXST_FLOW reply (xid=0x4):
cookie=0x0, duration=3.721s, table=0, n_packets=0, n_bytes=0, idle_age=1286, priority=0 actions=CONTROLLER:65535
mininet>


Thanks,
Iwase
Post by Aqsa Malik
Hi All,
I want to delete a single flow entry from the switch table.
cookie=0x0, duration=176.841s, table=0, n_packets=0, n_bytes=0,
priority=35,icmp6,ipv6_dst=2001:db8:0:f101::1 actions=output:1
cookie=0x0, duration=176.841s, table=0, n_packets=0, n_bytes=0,
priority=1,icmp6,ipv6_src=2001:db8:0:f101::1
actions=set_field:fe80::200:ff:fe00:1->ipv6_src,output:2
cookie=0x0, duration=176.843s, table=0, n_packets=0, n_bytes=0,
priority=0,arp actions=NORMAL
cookie=0x0, duration=176.841s, table=0, n_packets=0, n_bytes=0,
priority=0,icmp6 actions=CONTROLLER:65509
table_id=0
parser = datapath.ofproto_parser
ofproto = datapath.ofproto
match = parser.OFPMatch()
instructions = [parser.OFPActionOutput(1)]
dpid=1
priority=35
flow_mod = datapath.ofproto_parser.OFPFlowMod(datapath, cookie=0,
cookie_mask=0, table_id=0, hard_timeout=0, priority=priority,
buffer_id=ofproto.OFPCML_NO_BUFFER, out_port=ofproto.OFPP_ANY,
out_group=ofproto.OFPG_ANY, command=datapath.ofproto.OFPFC_DELETE,
match=match, instructions=instructions)
datapath.send_msg(flow_mod)
but it does not delete any flow entry. Also I am not sure what to add in
the "match" and "instructions".
------------------------------------------------------------------------------
_______________________________________________
Ryu-devel mailing list
https://lists.sourceforge.net/lists/listinfo/ryu-devel
------------------------------------------------------------------------------
Aqsa Malik
2016-11-24 15:02:41 UTC
Permalink
Hi Iwase,

Thank you so much. I had no idea I had to define all the match entries like
that. However it is not working for me for some reason, my flow is still
there.

Also is there any help or documentation that can guide me in translating
the Ryu curl commands in to the python alternatives?

Thanks
Post by Iwase Yusuke
Hi,
First, which field you want to use as the keys of the delete command?
If you want to delete a flow by priority, you need to use
OFPFC_MODIFY_STRICT command instead.
But please note OFPFC_MODIFY_STRICT command requires all match fields to
be strictly matched.
e.g.) The following deletes the flow after sleeping 3 seconds
$ git diff
diff --git a/ryu/app/simple_switch_13.py b/ryu/app/simple_switch_13.py
index 3e7c598..0172d84 100644
--- a/ryu/app/simple_switch_13.py
+++ b/ryu/app/simple_switch_13.py
@@ -21,6 +21,8 @@ from ryu.ofproto import ofproto_v1_3
from ryu.lib.packet import packet
from ryu.lib.packet import ethernet
from ryu.lib.packet import ether_types
+from ryu.lib.packet import in_proto
+from ryu.lib import hub
ofproto.OFPCML_NO_BUFFER)]
self.add_flow(datapath, 0, match, actions)
+ actions = [parser.OFPActionOutput(1)]
+ match = parser.OFPMatch(eth_type=ether_types.ETH_TYPE_IPV6,
+ ipv6_dst='2001:db8::1',
+ ip_proto=in_proto.IPPROTO_ICMPV6)
+
+ self.add_flow(datapath, 35, match, actions)
+
+ hub.spawn(self.del_icmp_flow, datapath)
+
+ parser = datapath.ofproto_parser
+ ofproto = datapath.ofproto
+
+ hub.sleep(3)
+
+ match = parser.OFPMatch(eth_type=ether_types.ETH_TYPE_IPV6,
+ ipv6_dst='2001:db8::1',
+ ip_proto=in_proto.IPPROTO_ICMPV6)
+ priority = 35
+ flow_mod = datapath.ofproto_parser.OFPFlowMod(
+ datapath,
+ priority=priority,
+ out_port=1,
+ out_group=ofproto.OFPG_ANY,
+ command=datapath.ofproto.OFPFC_DELETE_STRICT,
+ match=match)
+
+ datapath.send_msg(flow_mod)
+
def add_flow(self, datapath, priority, match, actions,
ofproto = datapath.ofproto
parser = datapath.ofproto_parser
mininet> sh ovs-ofctl dump-flows s1
cookie=0x0, duration=1.754s, table=0, n_packets=0, n_bytes=0,
idle_age=717, priority=35,icmp6,ipv6_dst=2001:db8::1 actions=output:1
cookie=0x0, duration=1.755s, table=0, n_packets=0, n_bytes=0,
idle_age=1284, priority=0 actions=CONTROLLER:65535
mininet> sh ovs-ofctl dump-flows s1
cookie=0x0, duration=2.359s, table=0, n_packets=0, n_bytes=0,
idle_age=718, priority=35,icmp6,ipv6_dst=2001:db8::1 actions=output:1
cookie=0x0, duration=2.360s, table=0, n_packets=0, n_bytes=0,
idle_age=1285, priority=0 actions=CONTROLLER:65535
mininet> sh ovs-ofctl dump-flows s1
cookie=0x0, duration=2.852s, table=0, n_packets=0, n_bytes=0,
idle_age=718, priority=35,icmp6,ipv6_dst=2001:db8::1 actions=output:1
cookie=0x0, duration=2.853s, table=0, n_packets=0, n_bytes=0,
idle_age=1285, priority=0 actions=CONTROLLER:65535
mininet> sh ovs-ofctl dump-flows s1
cookie=0x0, duration=3.721s, table=0, n_packets=0, n_bytes=0,
idle_age=1286, priority=0 actions=CONTROLLER:65535
mininet>
Thanks,
Iwase
Post by Aqsa Malik
Hi All,
I want to delete a single flow entry from the switch table.
cookie=0x0, duration=176.841s, table=0, n_packets=0, n_bytes=0,
priority=35,icmp6,ipv6_dst=2001:db8:0:f101::1 actions=output:1
cookie=0x0, duration=176.841s, table=0, n_packets=0, n_bytes=0,
priority=1,icmp6,ipv6_src=2001:db8:0:f101::1
actions=set_field:fe80::200:ff:fe00:1->ipv6_src,output:2
cookie=0x0, duration=176.843s, table=0, n_packets=0, n_bytes=0,
priority=0,arp actions=NORMAL
cookie=0x0, duration=176.841s, table=0, n_packets=0, n_bytes=0,
priority=0,icmp6 actions=CONTROLLER:65509
table_id=0
parser = datapath.ofproto_parser
ofproto = datapath.ofproto
match = parser.OFPMatch()
instructions = [parser.OFPActionOutput(1)]
dpid=1
priority=35
flow_mod = datapath.ofproto_parser.OFPFlowMod(datapath, cookie=0,
cookie_mask=0, table_id=0, hard_timeout=0, priority=priority,
buffer_id=ofproto.OFPCML_NO_BUFFER, out_port=ofproto.OFPP_ANY,
out_group=ofproto.OFPG_ANY, command=datapath.ofproto.OFPFC_DELETE,
match=match, instructions=instructions)
datapath.send_msg(flow_mod)
but it does not delete any flow entry. Also I am not sure what to add in
the "match" and "instructions".
------------------------------------------------------------
------------------
_______________________________________________
Ryu-devel mailing list
https://lists.sourceforge.net/lists/listinfo/ryu-devel
--
Aqsa Malik

visit my blog at
http://www.techiworld4u.blogspot.com
Iwase Yusuke
2016-11-25 01:03:28 UTC
Permalink
Hi,
Post by Aqsa Malik
Hi Iwase,
Thank you so much. I had no idea I had to define all the match entries like
that. However it is not working for me for some reason, my flow is still
there.
Hummm... if it is difficult to define the typical match field in your flow,
how about using cookie/cookie_mask field?
Modify and Delete command can apply the filter by cookie value if cookie_mask
contain a value other than 0.
Post by Aqsa Malik
Also is there any help or documentation that can guide me in translating
the Ryu curl commands in to the python alternatives?
Are you using ofctl_rest.py now?
http://ryu.readthedocs.io/en/latest/app/ofctl_rest.html

"ryu.lib.ofctl_v1_3" is translating the inputs of REST API into the OpenFlow
message classes, but there is no documentation to translate REST API command
format into RyuApp python code, IIRC.
https://github.com/osrg/ryu/blob/master/ryu/lib/ofctl_v1_3.py

If it is difficult to use directly the OpenFlow message classes defined in
"ryu.ofproto.ofproto_v1_3_parser", how about trying "ryu.lib.ofctl_v1_3"?
"ryu.lib.ofctl_v1_3" can send the OpenFlow messages by using dict of str
format arguments, and a little more easy to implement your RyuApps.

Thanks,
Iwase
Post by Aqsa Malik
Thanks
Post by Iwase Yusuke
Hi,
First, which field you want to use as the keys of the delete command?
If you want to delete a flow by priority, you need to use
OFPFC_MODIFY_STRICT command instead.
But please note OFPFC_MODIFY_STRICT command requires all match fields to
be strictly matched.
e.g.) The following deletes the flow after sleeping 3 seconds
$ git diff
diff --git a/ryu/app/simple_switch_13.py b/ryu/app/simple_switch_13.py
index 3e7c598..0172d84 100644
--- a/ryu/app/simple_switch_13.py
+++ b/ryu/app/simple_switch_13.py
@@ -21,6 +21,8 @@ from ryu.ofproto import ofproto_v1_3
from ryu.lib.packet import packet
from ryu.lib.packet import ethernet
from ryu.lib.packet import ether_types
+from ryu.lib.packet import in_proto
+from ryu.lib import hub
ofproto.OFPCML_NO_BUFFER)]
self.add_flow(datapath, 0, match, actions)
+ actions = [parser.OFPActionOutput(1)]
+ match = parser.OFPMatch(eth_type=ether_types.ETH_TYPE_IPV6,
+ ipv6_dst='2001:db8::1',
+ ip_proto=in_proto.IPPROTO_ICMPV6)
+
+ self.add_flow(datapath, 35, match, actions)
+
+ hub.spawn(self.del_icmp_flow, datapath)
+
+ parser = datapath.ofproto_parser
+ ofproto = datapath.ofproto
+
+ hub.sleep(3)
+
+ match = parser.OFPMatch(eth_type=ether_types.ETH_TYPE_IPV6,
+ ipv6_dst='2001:db8::1',
+ ip_proto=in_proto.IPPROTO_ICMPV6)
+ priority = 35
+ flow_mod = datapath.ofproto_parser.OFPFlowMod(
+ datapath,
+ priority=priority,
+ out_port=1,
+ out_group=ofproto.OFPG_ANY,
+ command=datapath.ofproto.OFPFC_DELETE_STRICT,
+ match=match)
+
+ datapath.send_msg(flow_mod)
+
def add_flow(self, datapath, priority, match, actions,
ofproto = datapath.ofproto
parser = datapath.ofproto_parser
mininet> sh ovs-ofctl dump-flows s1
cookie=0x0, duration=1.754s, table=0, n_packets=0, n_bytes=0,
idle_age=717, priority=35,icmp6,ipv6_dst=2001:db8::1 actions=output:1
cookie=0x0, duration=1.755s, table=0, n_packets=0, n_bytes=0,
idle_age=1284, priority=0 actions=CONTROLLER:65535
mininet> sh ovs-ofctl dump-flows s1
cookie=0x0, duration=2.359s, table=0, n_packets=0, n_bytes=0,
idle_age=718, priority=35,icmp6,ipv6_dst=2001:db8::1 actions=output:1
cookie=0x0, duration=2.360s, table=0, n_packets=0, n_bytes=0,
idle_age=1285, priority=0 actions=CONTROLLER:65535
mininet> sh ovs-ofctl dump-flows s1
cookie=0x0, duration=2.852s, table=0, n_packets=0, n_bytes=0,
idle_age=718, priority=35,icmp6,ipv6_dst=2001:db8::1 actions=output:1
cookie=0x0, duration=2.853s, table=0, n_packets=0, n_bytes=0,
idle_age=1285, priority=0 actions=CONTROLLER:65535
mininet> sh ovs-ofctl dump-flows s1
cookie=0x0, duration=3.721s, table=0, n_packets=0, n_bytes=0,
idle_age=1286, priority=0 actions=CONTROLLER:65535
mininet>
Thanks,
Iwase
Post by Aqsa Malik
Hi All,
I want to delete a single flow entry from the switch table.
cookie=0x0, duration=176.841s, table=0, n_packets=0, n_bytes=0,
priority=35,icmp6,ipv6_dst=2001:db8:0:f101::1 actions=output:1
cookie=0x0, duration=176.841s, table=0, n_packets=0, n_bytes=0,
priority=1,icmp6,ipv6_src=2001:db8:0:f101::1
actions=set_field:fe80::200:ff:fe00:1->ipv6_src,output:2
cookie=0x0, duration=176.843s, table=0, n_packets=0, n_bytes=0,
priority=0,arp actions=NORMAL
cookie=0x0, duration=176.841s, table=0, n_packets=0, n_bytes=0,
priority=0,icmp6 actions=CONTROLLER:65509
table_id=0
parser = datapath.ofproto_parser
ofproto = datapath.ofproto
match = parser.OFPMatch()
instructions = [parser.OFPActionOutput(1)]
dpid=1
priority=35
flow_mod = datapath.ofproto_parser.OFPFlowMod(datapath, cookie=0,
cookie_mask=0, table_id=0, hard_timeout=0, priority=priority,
buffer_id=ofproto.OFPCML_NO_BUFFER, out_port=ofproto.OFPP_ANY,
out_group=ofproto.OFPG_ANY, command=datapath.ofproto.OFPFC_DELETE,
match=match, instructions=instructions)
datapath.send_msg(flow_mod)
but it does not delete any flow entry. Also I am not sure what to add in
the "match" and "instructions".
------------------------------------------------------------
------------------
_______________________________________________
Ryu-devel mailing list
https://lists.sourceforge.net/lists/listinfo/ryu-devel
------------------------------------------------------------------------------
_______________________________________________
Ryu-devel mailing list
https://lists.sourceforge.net/lists/listinfo/ryu-devel
------------------------------------------------------------------------------
Continue reading on narkive:
Loading...