Add support for the Nicira extension mark (NXM_NX_PKT_MARK),
 Add support for match and action.
 This extension is important as it is the only mark that stay persistence
across virtual switches.
Added support for 1.3,1.4,1.5 Openflow proto
Tried to follow the unit test example, but I am not sure if I need to add
more tests, please review let me know if I need to add/modify the patch.
Thanks,
Eran


 From e1689abfd5dc323eee404ec0631914dfa51ffedf Mon Sep 17 00:00:00 2001
From: eran gampel <[email protected]>
Date: Thu, 11 Jun 2015 09:22:06 +0300
Subject: [PATCH] Add support for the nicira extension mark
(NXM_NX_PKT_MARK),
 Add support for match and action set via NXAction ReMove This extension is
 important as it is the only mark that stay persistence across virtual
 switches Signed-off-by: Eran Gampel [email protected]

Signed-off-by: eran gampel <[email protected]>
---
 ryu/ofproto/nx_match.py                            | 26
+++++++++++++++++++++-
 ryu/ofproto/ofproto_parser.py                      |  1 -
 ryu/ofproto/ofproto_v1_0.py                        |  3 +++
 ryu/ofproto/ofproto_v1_3.py                        |  1 +
 ryu/ofproto/ofproto_v1_4.py                        |  1 +
 ryu/ofproto/ofproto_v1_5.py                        |  1 +
 .../json/of13/4-60-ofp_flow_mod.packet.json        |  7 ++++++
 7 files changed, 38 insertions(+), 2 deletions(-)

diff --git a/ryu/ofproto/nx_match.py b/ryu/ofproto/nx_match.py
index 38ce02b..b6af752 100644
--- a/ryu/ofproto/nx_match.py
+++ b/ryu/ofproto/nx_match.py
@@ -23,7 +23,6 @@ from ryu.lib import mac
 from ryu.lib.pack_utils import msg_pack_into
 from . import ofproto_v1_0
 from . import inet
-
 import logging
 LOG = logging.getLogger('ryu.ofproto.nx_match')

@@ -90,6 +89,7 @@ class Flow(object):
         self.nw_frag = 0
         self.regs = [0] * FLOW_N_REGS
         self.ipv6_label = 0
+        self.pkt_mark = 0


 class FlowWildcards(object):
@@ -111,6 +111,7 @@ class FlowWildcards(object):
         self.regs_bits = 0
         self.regs_mask = [0] * FLOW_N_REGS
         self.wildcards = ofproto_v1_0.OFPFW_ALL
+        self.pkt_mark_mask = 0


 class ClsRule(object):
@@ -291,6 +292,10 @@ class ClsRule(object):
         self.flow.regs[reg_idx] = value
         self.wc.regs_bits |= (1 << reg_idx)

+    def set_pkt_mark_masked(self, pkt_mark, mask):
+        self.flow.pkt_mark = pkt_mark
+        self.wc.pkt_mark_mask = mask
+
     def flow_format(self):
         # Tunnel ID is only supported by NXM
         if self.wc.tun_id_mask != 0:
@@ -913,6 +918,18 @@ class MFRegister(MFField):
                 else:
                     return self._put(buf, offset, rule.flow.regs[i])

+@_register_make
+@_set_nxm_headers([ofproto_v1_0.NXM_NX_PKT_MARK,
+                    ofproto_v1_0.NXM_NX_PKT_MARK_W])
+class MFPktMark(MFField):
+    @classmethod
+    def make(cls, header):
+        return cls(header, MF_PACK_STRING_BE32)
+
+    def put(self, buf, offset, rule):
+        return self.putm(buf, offset, rule.flow.pkt_mark,
+                rule.wc.pkt_mark_mask)
+

 def serialize_nxm_match(rule, buf, offset):
     old_offset = offset
@@ -1071,6 +1088,13 @@ def serialize_nxm_match(rule, buf, offset):
             header = ofproto_v1_0.NXM_NX_IP_FRAG_W
         offset += nxm_put(buf, offset, header, rule)

+    if rule.flow.pkt_mark != 0:
+        if rule.wc.pkt_mark_mask == UINT32_MAX:
+            header = ofproto_v1_0.NXM_NX_PKT_MARK
+        else:
+            header = ofproto_v1_0.NXM_NX_PKT_MARK_W
+        offset += nxm_put(buf, offset, header, rule)
+
     # Tunnel Id
     if rule.wc.tun_id_mask != 0:
         if rule.wc.tun_id_mask == UINT64_MAX:
diff --git a/ryu/ofproto/ofproto_parser.py b/ryu/ofproto/ofproto_parser.py
index 86b8439..ee394f0 100644
--- a/ryu/ofproto/ofproto_parser.py
+++ b/ryu/ofproto/ofproto_parser.py
@@ -26,7 +26,6 @@ from ryu import utils
 from ryu.lib import stringify

 from . import ofproto_common
-
 LOG = logging.getLogger('ryu.ofproto.ofproto_parser')


diff --git a/ryu/ofproto/ofproto_v1_0.py b/ryu/ofproto/ofproto_v1_0.py
index bab5cc8..795b74b 100644
--- a/ryu/ofproto/ofproto_v1_0.py
+++ b/ryu/ofproto/ofproto_v1_0.py
@@ -582,6 +582,9 @@ NXM_NX_IP_ECN = nxm_header(0x0001, 28, 1)

 NXM_NX_IP_TTL = nxm_header(0x0001, 29, 1)

+NXM_NX_PKT_MARK = nxm_header(0x0001, 33, 4)
+NXM_NX_PKT_MARK_W = nxm_header_w(0x0001, 33, 4)
+

 def nxm_nx_reg(idx):
     return nxm_header(0x0001, idx, 4)
diff --git a/ryu/ofproto/ofproto_v1_3.py b/ryu/ofproto/ofproto_v1_3.py
index b431d08..3124500 100644
--- a/ryu/ofproto/ofproto_v1_3.py
+++ b/ryu/ofproto/ofproto_v1_3.py
@@ -1189,6 +1189,7 @@ oxm_types = [
     oxm_fields.ONFExperimenter('actset_output', 43, type_desc.Int4),
     oxm_fields.NiciraExtended1('tun_ipv4_src', 31, type_desc.IPv4Addr),
     oxm_fields.NiciraExtended1('tun_ipv4_dst', 32, type_desc.IPv4Addr),
+    oxm_fields.NiciraExtended1('pkt_mark', 33, type_desc.Int4),

     # The following definition is merely for testing 64-bit experimenter
OXMs.
     # Following Open vSwitch, we use dp_hash for this purpose.
diff --git a/ryu/ofproto/ofproto_v1_4.py b/ryu/ofproto/ofproto_v1_4.py
index 6542b6f..067892d 100644
--- a/ryu/ofproto/ofproto_v1_4.py
+++ b/ryu/ofproto/ofproto_v1_4.py
@@ -391,6 +391,7 @@ oxm_types = [
     oxm_fields.OpenFlowBasic('pbb_uca', 41, type_desc.Int1),
     oxm_fields.NiciraExtended1('tun_ipv4_src', 31, type_desc.IPv4Addr),
     oxm_fields.NiciraExtended1('tun_ipv4_dst', 32, type_desc.IPv4Addr),
+    oxm_fields.NiciraExtended1('pkt_mark', 33, type_desc.Int4)
 ]

 oxm_fields.generate(__name__)
diff --git a/ryu/ofproto/ofproto_v1_5.py b/ryu/ofproto/ofproto_v1_5.py
index eb7183f..5a81f1f 100644
--- a/ryu/ofproto/ofproto_v1_5.py
+++ b/ryu/ofproto/ofproto_v1_5.py
@@ -432,6 +432,7 @@ oxm_types = [
     oxm_fields.OpenFlowBasic('packet_type', 44, type_desc.Int4),
     oxm_fields.NiciraExtended1('tun_ipv4_src', 31, type_desc.IPv4Addr),
     oxm_fields.NiciraExtended1('tun_ipv4_dst', 32, type_desc.IPv4Addr),
+    oxm_fields.NiciraExtended1('pkt_mark', 33, type_desc.Int4)
 ]

 oxm_fields.generate(__name__)
diff --git a/ryu/tests/unit/ofproto/json/of13/4-60-ofp_flow_mod.packet.json
b/ryu/tests/unit/ofproto/json/of13/4-60-ofp_flow_mod.packet.json
index 1c594e8..448d035 100644
--- a/ryu/tests/unit/ofproto/json/of13/4-60-ofp_flow_mod.packet.json
+++ b/ryu/tests/unit/ofproto/json/of13/4-60-ofp_flow_mod.packet.json
@@ -305,6 +305,13 @@
                      "mask": null,
                      "value": "1.2.3.4"
                   }
+               },
+               {
+                  "OXMTlv": {
+                     "field": "pkt_mark",
+                     "mask": null,
+                     "value": "283686952306183"
+                  }
                }
             ],
             "type": 1
-- 
1.9.1
From e1689abfd5dc323eee404ec0631914dfa51ffedf Mon Sep 17 00:00:00 2001
From: eran gampel <[email protected]>
Date: Thu, 11 Jun 2015 09:22:06 +0300
Subject: [PATCH] Add support for the nicira extension mark (NXM_NX_PKT_MARK),
 Add support for match and action set via NXAction ReMove This extension is
 important as it is the only mark that stay persistence across virtual
 switches Signed-off-by: Eran Gampel [email protected]

Signed-off-by: eran gampel <[email protected]>
---
 ryu/ofproto/nx_match.py                            | 26 +++++++++++++++++++++-
 ryu/ofproto/ofproto_parser.py                      |  1 -
 ryu/ofproto/ofproto_v1_0.py                        |  3 +++
 ryu/ofproto/ofproto_v1_3.py                        |  1 +
 ryu/ofproto/ofproto_v1_4.py                        |  1 +
 ryu/ofproto/ofproto_v1_5.py                        |  1 +
 .../json/of13/4-60-ofp_flow_mod.packet.json        |  7 ++++++
 7 files changed, 38 insertions(+), 2 deletions(-)

diff --git a/ryu/ofproto/nx_match.py b/ryu/ofproto/nx_match.py
index 38ce02b..b6af752 100644
--- a/ryu/ofproto/nx_match.py
+++ b/ryu/ofproto/nx_match.py
@@ -23,7 +23,6 @@ from ryu.lib import mac
 from ryu.lib.pack_utils import msg_pack_into
 from . import ofproto_v1_0
 from . import inet
-
 import logging
 LOG = logging.getLogger('ryu.ofproto.nx_match')
 
@@ -90,6 +89,7 @@ class Flow(object):
         self.nw_frag = 0
         self.regs = [0] * FLOW_N_REGS
         self.ipv6_label = 0
+        self.pkt_mark = 0
 
 
 class FlowWildcards(object):
@@ -111,6 +111,7 @@ class FlowWildcards(object):
         self.regs_bits = 0
         self.regs_mask = [0] * FLOW_N_REGS
         self.wildcards = ofproto_v1_0.OFPFW_ALL
+        self.pkt_mark_mask = 0
 
 
 class ClsRule(object):
@@ -291,6 +292,10 @@ class ClsRule(object):
         self.flow.regs[reg_idx] = value
         self.wc.regs_bits |= (1 << reg_idx)
 
+    def set_pkt_mark_masked(self, pkt_mark, mask):
+        self.flow.pkt_mark = pkt_mark
+        self.wc.pkt_mark_mask = mask
+
     def flow_format(self):
         # Tunnel ID is only supported by NXM
         if self.wc.tun_id_mask != 0:
@@ -913,6 +918,18 @@ class MFRegister(MFField):
                 else:
                     return self._put(buf, offset, rule.flow.regs[i])
 
+@_register_make
+@_set_nxm_headers([ofproto_v1_0.NXM_NX_PKT_MARK,
+                    ofproto_v1_0.NXM_NX_PKT_MARK_W])
+class MFPktMark(MFField):
+    @classmethod
+    def make(cls, header):
+        return cls(header, MF_PACK_STRING_BE32)
+
+    def put(self, buf, offset, rule):
+        return self.putm(buf, offset, rule.flow.pkt_mark,
+                rule.wc.pkt_mark_mask)
+
 
 def serialize_nxm_match(rule, buf, offset):
     old_offset = offset
@@ -1071,6 +1088,13 @@ def serialize_nxm_match(rule, buf, offset):
             header = ofproto_v1_0.NXM_NX_IP_FRAG_W
         offset += nxm_put(buf, offset, header, rule)
 
+    if rule.flow.pkt_mark != 0:
+        if rule.wc.pkt_mark_mask == UINT32_MAX:
+            header = ofproto_v1_0.NXM_NX_PKT_MARK
+        else:
+            header = ofproto_v1_0.NXM_NX_PKT_MARK_W
+        offset += nxm_put(buf, offset, header, rule)
+
     # Tunnel Id
     if rule.wc.tun_id_mask != 0:
         if rule.wc.tun_id_mask == UINT64_MAX:
diff --git a/ryu/ofproto/ofproto_parser.py b/ryu/ofproto/ofproto_parser.py
index 86b8439..ee394f0 100644
--- a/ryu/ofproto/ofproto_parser.py
+++ b/ryu/ofproto/ofproto_parser.py
@@ -26,7 +26,6 @@ from ryu import utils
 from ryu.lib import stringify
 
 from . import ofproto_common
-
 LOG = logging.getLogger('ryu.ofproto.ofproto_parser')
 
 
diff --git a/ryu/ofproto/ofproto_v1_0.py b/ryu/ofproto/ofproto_v1_0.py
index bab5cc8..795b74b 100644
--- a/ryu/ofproto/ofproto_v1_0.py
+++ b/ryu/ofproto/ofproto_v1_0.py
@@ -582,6 +582,9 @@ NXM_NX_IP_ECN = nxm_header(0x0001, 28, 1)
 
 NXM_NX_IP_TTL = nxm_header(0x0001, 29, 1)
 
+NXM_NX_PKT_MARK = nxm_header(0x0001, 33, 4)
+NXM_NX_PKT_MARK_W = nxm_header_w(0x0001, 33, 4)
+
 
 def nxm_nx_reg(idx):
     return nxm_header(0x0001, idx, 4)
diff --git a/ryu/ofproto/ofproto_v1_3.py b/ryu/ofproto/ofproto_v1_3.py
index b431d08..3124500 100644
--- a/ryu/ofproto/ofproto_v1_3.py
+++ b/ryu/ofproto/ofproto_v1_3.py
@@ -1189,6 +1189,7 @@ oxm_types = [
     oxm_fields.ONFExperimenter('actset_output', 43, type_desc.Int4),
     oxm_fields.NiciraExtended1('tun_ipv4_src', 31, type_desc.IPv4Addr),
     oxm_fields.NiciraExtended1('tun_ipv4_dst', 32, type_desc.IPv4Addr),
+    oxm_fields.NiciraExtended1('pkt_mark', 33, type_desc.Int4),
 
     # The following definition is merely for testing 64-bit experimenter OXMs.
     # Following Open vSwitch, we use dp_hash for this purpose.
diff --git a/ryu/ofproto/ofproto_v1_4.py b/ryu/ofproto/ofproto_v1_4.py
index 6542b6f..067892d 100644
--- a/ryu/ofproto/ofproto_v1_4.py
+++ b/ryu/ofproto/ofproto_v1_4.py
@@ -391,6 +391,7 @@ oxm_types = [
     oxm_fields.OpenFlowBasic('pbb_uca', 41, type_desc.Int1),
     oxm_fields.NiciraExtended1('tun_ipv4_src', 31, type_desc.IPv4Addr),
     oxm_fields.NiciraExtended1('tun_ipv4_dst', 32, type_desc.IPv4Addr),
+    oxm_fields.NiciraExtended1('pkt_mark', 33, type_desc.Int4)
 ]
 
 oxm_fields.generate(__name__)
diff --git a/ryu/ofproto/ofproto_v1_5.py b/ryu/ofproto/ofproto_v1_5.py
index eb7183f..5a81f1f 100644
--- a/ryu/ofproto/ofproto_v1_5.py
+++ b/ryu/ofproto/ofproto_v1_5.py
@@ -432,6 +432,7 @@ oxm_types = [
     oxm_fields.OpenFlowBasic('packet_type', 44, type_desc.Int4),
     oxm_fields.NiciraExtended1('tun_ipv4_src', 31, type_desc.IPv4Addr),
     oxm_fields.NiciraExtended1('tun_ipv4_dst', 32, type_desc.IPv4Addr),
+    oxm_fields.NiciraExtended1('pkt_mark', 33, type_desc.Int4)
 ]
 
 oxm_fields.generate(__name__)
diff --git a/ryu/tests/unit/ofproto/json/of13/4-60-ofp_flow_mod.packet.json b/ryu/tests/unit/ofproto/json/of13/4-60-ofp_flow_mod.packet.json
index 1c594e8..448d035 100644
--- a/ryu/tests/unit/ofproto/json/of13/4-60-ofp_flow_mod.packet.json
+++ b/ryu/tests/unit/ofproto/json/of13/4-60-ofp_flow_mod.packet.json
@@ -305,6 +305,13 @@
                      "mask": null, 
                      "value": "1.2.3.4"
                   }
+               },
+               {
+                  "OXMTlv": {
+                     "field": "pkt_mark",
+                     "mask": null,
+                     "value": "283686952306183"
+                  }
                }
             ], 
             "type": 1
-- 
1.9.1

------------------------------------------------------------------------------
_______________________________________________
Ryu-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/ryu-devel

Reply via email to