From: Romain Lenglet<romain.leng...@berabera.info>
The C++ implementation allowed passing the 64-bit opaque cookie with
every flow command, but not the Python wrapper.
---
src/nox/coreapps/pyrt/context.i | 3 ++-
src/nox/lib/core.py | 26 ++++++++++++++++++--------
2 files changed, 20 insertions(+), 9 deletions(-)
diff --git a/src/nox/coreapps/pyrt/context.i
b/src/nox/coreapps/pyrt/context.i
index 803513d..6172a75 100644
--- a/src/nox/coreapps/pyrt/context.i
+++ b/src/nox/coreapps/pyrt/context.i
@@ -96,7 +96,8 @@ public:
void send_flow_command(uint64_t datapath_id, ofp_flow_mod_command,
const ofp_match&, uint16_t idle_timeout,
uint16_t hard_timeout, const Nonowning_buffer&
actions,
- uint32_t buffer_id, uint16_t priority);
+ uint32_t buffer_id, uint16_t priority,
+ uint64_t cookie);
int close_openflow_connection(uint64_t datapathid);
diff --git a/src/nox/lib/core.py b/src/nox/lib/core.py
index 37bae36..910e5c7 100644
--- a/src/nox/lib/core.py
+++ b/src/nox/lib/core.py
@@ -249,7 +249,8 @@ class Component:
def send_flow_command(self, dp_id, command, attrs,
priority=openflow.OFP_DEFAULT_PRIORITY,
add_args=None,
- hard_timeout=openflow.OFP_FLOW_PERMANENT):
+ hard_timeout=openflow.OFP_FLOW_PERMANENT,
+ cookie=0):
m = set_match(attrs)
if m == None:
return False
@@ -265,7 +266,8 @@ class Component:
buffer_id = UINT32_MAX
self.ctxt.send_flow_command(dp_id, command, m, idle_timeout,
- hard_timeout, oactions, buffer_id,
priority)
+ hard_timeout, oactions, buffer_id,
priority,
+ cookie)
return True
@@ -294,7 +296,7 @@ class Component:
else:
self.send_openflow_packet(dp_id, packet, actions, inport)
- def delete_datapath_flow(self, dp_id, attrs):
+ def delete_datapath_flow(self, dp_id, attrs, cookie=0):
"""
Delete all flow entries matching the passed in (potentially
wildcarded) flow
@@ -302,10 +304,12 @@ class Component:
dp_id - datapath to delete the entries from
attrs - the flow as a dictionary (described above)
"""
- return self.send_flow_command(dp_id, openflow.OFPFC_DELETE,
attrs)
+ return self.send_flow_command(dp_id, openflow.OFPFC_DELETE,
attrs,
+ cookie=cookie)
def delete_strict_datapath_flow(self, dp_id, attrs,
- priority=openflow.OFP_DEFAULT_PRIORITY):
+
priority=openflow.OFP_DEFAULT_PRIORITY,
+ cookie=0):
"""
Strictly delete the flow entry matching the passed in
(potentially
wildcarded) flow. i.e. matched flow have exactly the same
@@ -315,9 +319,11 @@ class Component:
attrs - the flow as a dictionary (described above)
priority - the priority of the entry to be deleted (only
meaningful
for entries with wildcards)
+ cookie - the opaque controller-issued identifier associated with
the
+ flow
"""
return self.send_flow_command(dp_id,
openflow.OFPFC_DELETE_STRICT,
- attrs, priority)
+ attrs, priority, cookie=cookie)
###########################################################################
# The following methods manipulate a flow entry in a datapath.
@@ -342,7 +348,7 @@ class Component:
def install_datapath_flow(self, dp_id, attrs, idle_timeout,
hard_timeout,
actions, buffer_id=None,
priority=openflow.OFP_DEFAULT_PRIORITY,
- inport=None, packet=None):
+ inport=None, packet=None, cookie=0):
"""
Add a flow entry to datapath
@@ -372,12 +378,16 @@ class Component:
inport - When packet is sent, the port on which packet came in as
input,
so that it can be omitted from any OFPP_FLOOD outputs.
+
+ cookie - the opaque controller-issued identifier associated with
the
+ flow
"""
if buffer_id == None:
buffer_id = UINT32_MAX
self.send_flow_command(dp_id, openflow.OFPFC_ADD, attrs,
priority,
- (idle_timeout, actions, buffer_id),
hard_timeout)
+ (idle_timeout, actions, buffer_id),
hard_timeout,
+ cookie=cookie)
if buffer_id == UINT32_MAX and packet != None:
for action in actions: