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
