Hi Fujita-San Iwamoto-San As you indicated, Add to commit message on modification of NXActionRegLoad.
This patch will revert the API of NXAction for the following report. https://bugs.launchpad.net/dragonflow/+bug/1599367 revert commit id: 3c3896fd77f274ce953dcb78795aa5cc4fde6c65 This patch reverts recently introduced start and end arguments. Add the utility method for ofs_nbits. NXActionRegLoad now takes ofs_nbits argument instead of ofs and nbits even with this revert. Additionally, update test cases and documents. Thanks, On 2016年07月27日 09:33, IWAMOTO Toshihiro wrote: > At Wed, 27 Jul 2016 07:02:29 +0900 (JST), > FUJITA Tomonori wrote: >> >> Iwamoto-san, any comment on this? > > It might be helpful to mention > > - NXActionRegLoad now takes ofs_nbits argument instead of ofs and > nbits even with this revert > > and being a bit explicit about what this patch reverts: > > - this commit reverts recently introduced start and end arguments > > in the commit message. > > Other than that, I'm fine with this patch. > > >> On Fri, 22 Jul 2016 13:59:48 +0900 >> Shinpei Muraoka <shinpei.mura...@gmail.com> wrote: >> >>> This patch will revert the API of NXAction for the following report. >>> https://bugs.launchpad.net/dragonflow/+bug/1599367 >>> revert commit id: 3c3896fd77f274ce953dcb78795aa5cc4fde6c65 >>> >>> Add the utility method for ofs_nbits. >>> >>> Additionally, update test cases and documents. >>> >>> Signed-off-by: Shinpei Muraoka <shinpei.mura...@gmail.com> >>> --- >>> doc/source/nicira_ext_ref.rst | 1 + >>> ryu/ofproto/nicira_ext.py | 33 +++ >>> ryu/ofproto/nx_actions.py | 226 >>> ++++++++------------- >>> .../json/of13/ovs-ofctl-of13-action_ct.packet.json | 3 +- >>> .../of13/ovs-ofctl-of13-action_ct_exec.packet.json | 3 +- >>> .../of13/ovs-ofctl-of13-action_ct_nat.packet.json | 3 +- >>> .../ovs-ofctl-of13-action_ct_nat_v6.packet.json | 3 +- >>> ...s-ofctl-of13-match_load_nx_register.packet.json | 5 +- >>> ...s-ofctl-of13-match_move_nx_register.packet.json | 7 +- >>> ryu/tests/unit/ofproto/test_parser_v10.py | 76 +++---- >>> 10 files changed, 154 insertions(+), 206 deletions(-) >>> >>> diff --git a/doc/source/nicira_ext_ref.rst b/doc/source/nicira_ext_ref.rst >>> index 1385079..739349c 100644 >>> --- a/doc/source/nicira_ext_ref.rst >>> +++ b/doc/source/nicira_ext_ref.rst >>> @@ -57,6 +57,7 @@ The followings shows the supported NXAction classes in >>> OpenFlow1.0 or later >>> .. autoclass:: NXFlowSpecMatch >>> .. autoclass:: NXFlowSpecLoad >>> .. autoclass:: NXFlowSpecOutput >>> +.. autofunction:: ryu.ofproto.nicira_ext.ofs_nbits >>> >>> .. _nx_match_structures: >>> >>> diff --git a/ryu/ofproto/nicira_ext.py b/ryu/ofproto/nicira_ext.py >>> index 57c62c6..e2fca47 100644 >>> --- a/ryu/ofproto/nicira_ext.py >>> +++ b/ryu/ofproto/nicira_ext.py >>> @@ -278,6 +278,39 @@ NX_NAT_RANGE_PROTO_MIN = 1 << 4 >>> NX_NAT_RANGE_PROTO_MAX = 1 << 5 >>> >>> >>> +def ofs_nbits(start, end): >>> + """ >>> + The utility method for ofs_nbits >>> + >>> + This method is used in the class to set the ofs_nbits. >>> + >>> + This method converts start/end bits into ofs_nbits required to >>> + specify the bit range of OXM/NXM fields. >>> + >>> + ofs_nbits can be calculated as following:: >>> + >>> + ofs_nbits = (start << 6) + (end - start) >>> + >>> + The parameter start/end means the OXM/NXM field of ovs-ofctl command. >>> + >>> + .. >>> + field[start..end] >>> + .. >>> + >>> + +------------------------------------------+ >>> + | *field*\ **[**\ *start*\..\ *end*\ **]** | >>> + +------------------------------------------+ >>> + >>> + ================ ====================================================== >>> + Attribute Description >>> + ================ ====================================================== >>> + start Start bit for OXM/NXM field >>> + end End bit for OXM/NXM field >>> + ================ ====================================================== >>> + """ >>> + return (start << 6) + (end - start) >>> + >>> + >>> def nxm_header__(vendor, field, hasmask, length): >>> return (vendor << 16) | (field << 9) | (hasmask << 8) | length >>> >>> diff --git a/ryu/ofproto/nx_actions.py b/ryu/ofproto/nx_actions.py >>> index 94c2213..9c97123 100644 >>> --- a/ryu/ofproto/nx_actions.py >>> +++ b/ryu/ofproto/nx_actions.py >>> @@ -340,34 +340,27 @@ def generate(ofp_name, ofpp_name): >>> class NXActionRegLoad(NXAction): >>> """ >>> Load literal value action >>> - >>> This action loads a literal value into a field or part of a field. >>> - >>> And equivalent to the followings action of ovs-ofctl command. >>> - >>> .. >>> load:value->dst[start..end] >>> .. >>> - >>> +-----------------------------------------------------------------+ >>> | **load**\:\ *value*\->\ *dst*\ **[**\ *start*\..\ *end*\ **]** | >>> +-----------------------------------------------------------------+ >>> - >>> ================ >>> ====================================================== >>> Attribute Description >>> ================ >>> ====================================================== >>> - start Start bit for destination field >>> - end End bit for destination field >>> + ofs_nbits Start and End for the OXM/NXM field. >>> + Setting method refer to the >>> ``nicira_ext.ofs_nbits`` >>> dst OXM/NXM header for destination field >>> value OXM/NXM value to be loaded >>> ================ >>> ====================================================== >>> - >>> Example:: >>> - >>> - actions += [parser.NXActionRegLoad(start=4, >>> - end=31, >>> - dst="eth_dst", >>> - value=0x112233)] >>> + actions += [parser.NXActionRegLoad( >>> + ofs_nbits=nicira_ext.ofs_nbits(4, 31), >>> + dst="eth_dst", >>> + value=0x112233)] >>> """ >>> _subtype = nicira_ext.NXAST_REG_LOAD >>> _fmt_str = '!HIQ' # ofs_nbits, dst, value >>> @@ -377,11 +370,11 @@ def generate(ofp_name, ofpp_name): >>> ] >>> } >>> >>> - def __init__(self, start, end, dst, value, >>> - type_=None, len_=None, experimenter=None, >>> subtype=None): >>> + def __init__(self, ofs_nbits, dst, value, >>> + type_=None, len_=None, experimenter=None, >>> + subtype=None): >>> super(NXActionRegLoad, self).__init__() >>> - self.start = start >>> - self.end = end >>> + self.ofs_nbits = ofs_nbits >>> self.dst = dst >>> self.value = value >>> >>> @@ -389,11 +382,9 @@ def generate(ofp_name, ofpp_name): >>> def parser(cls, buf): >>> (ofs_nbits, dst, value,) = struct.unpack_from( >>> cls._fmt_str, buf, 0) >>> - start = ofs_nbits >> 6 >>> - end = (ofs_nbits & 0x3f) + start >>> # Right-shift instead of using oxm_parse_header for >>> simplicity... >>> dst_name = ofp.oxm_to_user_header(dst >> 9) >>> - return cls(start, end, dst_name, value) >>> + return cls(ofs_nbits, dst_name, value) >>> >>> def serialize_body(self): >>> hdr_data = bytearray() >>> @@ -401,10 +392,9 @@ def generate(ofp_name, ofpp_name): >>> ofp.oxm_serialize_header(n, hdr_data, 0) >>> (dst_num,) = struct.unpack_from('!I', >>> six.binary_type(hdr_data), 0) >>> >>> - ofs_nbits = (self.start << 6) + (self.end - self.start) >>> data = bytearray() >>> msg_pack_into(self._fmt_str, data, 0, >>> - ofs_nbits, dst_num, self.value) >>> + self.ofs_nbits, dst_num, self.value) >>> return data >>> >>> class NXActionRegLoad2(NXAction): >>> @@ -671,11 +661,10 @@ def generate(ofp_name, ofpp_name): >>> Attribute Description >>> ================ >>> ====================================================== >>> src_field OXM/NXM header for source field >>> - src_start Start bit for source field >>> - src_end End bit for source field >>> dst_field OXM/NXM header for destination field >>> - dst_start Start bit for destination field >>> - dst_end End bit for destination field >>> + n_bits Number of bits >>> + src_ofs Starting bit offset in source >>> + dst_ofs Starting bit offset in destination >>> ================ >>> ====================================================== >>> >>> .. CAUTION:: >>> @@ -685,11 +674,10 @@ def generate(ofp_name, ofpp_name): >>> Example:: >>> >>> actions += [parser.NXActionRegMove(src_field="reg0", >>> - src_start=0, >>> - src_end=5, >>> dst_field="reg1", >>> - dst_start=10, >>> - dst_end=15)] >>> + n_bits=5, >>> + src_ofs=0 >>> + dst_ofs=10)] >>> """ >>> _subtype = nicira_ext.NXAST_REG_MOVE >>> _fmt_str = '!HHH' # n_bits, src_ofs, dst_ofs >>> @@ -701,16 +689,14 @@ def generate(ofp_name, ofpp_name): >>> ] >>> } >>> >>> - def __init__(self, src_field, src_start, src_end, >>> - dst_field, dst_start, dst_end, >>> + def __init__(self, src_field, dst_field, n_bits, src_ofs=0, >>> dst_ofs=0, >>> type_=None, len_=None, experimenter=None, >>> subtype=None): >>> super(NXActionRegMove, self).__init__() >>> + self.n_bits = n_bits >>> + self.src_ofs = src_ofs >>> + self.dst_ofs = dst_ofs >>> self.src_field = src_field >>> - self.src_start = src_start >>> - self.src_end = src_end >>> self.dst_field = dst_field >>> - self.dst_start = dst_start >>> - self.dst_end = dst_end >>> >>> @classmethod >>> def parser(cls, buf): >>> @@ -718,11 +704,6 @@ def generate(ofp_name, ofpp_name): >>> cls._fmt_str, buf, 0) >>> rest = buf[struct.calcsize(NXActionRegMove._fmt_str):] >>> >>> - src_start = src_ofs >>> - src_end = src_ofs + n_bits - 1 >>> - dst_start = dst_ofs >>> - dst_end = dst_ofs + n_bits - 1 >>> - >>> # src field >>> (n, len) = ofp.oxm_parse_header(rest, 0) >>> src_field = ofp.oxm_to_user_header(n) >>> @@ -732,17 +713,14 @@ def generate(ofp_name, ofpp_name): >>> dst_field = ofp.oxm_to_user_header(n) >>> rest = rest[len:] >>> # ignore padding >>> - return cls(src_field, src_start, src_end, >>> - dst_field, dst_start, dst_end) >>> + return cls(src_field, dst_field=dst_field, n_bits=n_bits, >>> + src_ofs=src_ofs, dst_ofs=dst_ofs) >>> >>> def serialize_body(self): >>> # fixup >>> data = bytearray() >>> - n_bits = self.src_end - self.src_start + 1 >>> - assert n_bits == self.dst_end - self.dst_start + 1 >>> - >>> msg_pack_into(self._fmt_str, data, 0, >>> - n_bits, self.src_start, self.dst_start) >>> + self.n_bits, self.src_ofs, self.dst_ofs) >>> # src field >>> n = ofp.oxm_from_user_header(self.src_field) >>> ofp.oxm_serialize_header(n, data, len(data)) >>> @@ -874,18 +852,18 @@ def generate(ofp_name, ofpp_name): >>> ================ >>> ====================================================== >>> Attribute Description >>> ================ >>> ====================================================== >>> - start Start bit for source field >>> - end End bit for source field >>> + ofs_nbits Start and End for the OXM/NXM field. >>> + Setting method refer to the >>> ``nicira_ext.ofs_nbits`` >>> src OXM/NXM header for source field >>> max_len Max length to send to controller >>> ================ >>> ====================================================== >>> >>> Example:: >>> >>> - actions += [parser.NXActionOutputReg(start=8080, >>> - end=10, >>> - src="reg0", >>> - max_len=1024)] >>> + actions += [parser.NXActionOutputReg( >>> + ofs_nbits=nicira_ext.ofs_nbits(4, 31), >>> + src="reg0", >>> + max_len=1024)] >>> """ >>> _subtype = nicira_ext.NXAST_OUTPUT_REG >>> >>> @@ -898,14 +876,12 @@ def generate(ofp_name, ofpp_name): >>> } >>> >>> def __init__(self, >>> - start, >>> - end, >>> + ofs_nbits, >>> src, >>> max_len, >>> type_=None, len_=None, experimenter=None, >>> subtype=None): >>> super(NXActionOutputReg, self).__init__() >>> - self.start = start >>> - self.end = end >>> + self.ofs_nbits = ofs_nbits >>> self.src = src >>> self.max_len = max_len >>> >>> @@ -913,23 +889,19 @@ def generate(ofp_name, ofpp_name): >>> def parser(cls, buf): >>> (ofs_nbits, oxm_data, max_len) = struct.unpack_from( >>> cls._fmt_str, buf, 0) >>> - start = ofs_nbits >> 6 >>> - end = (ofs_nbits & 0x3f) + start >>> (n, len_) = ofp.oxm_parse_header(oxm_data, 0) >>> src = ofp.oxm_to_user_header(n) >>> - return cls(start, >>> - end, >>> + return cls(ofs_nbits, >>> src, >>> max_len) >>> >>> def serialize_body(self): >>> data = bytearray() >>> src = bytearray() >>> - ofs_nbits = (self.start << 6) + (self.end - self.start) >>> oxm = ofp.oxm_from_user_header(self.src) >>> ofp.oxm_serialize_header(oxm, src, 0), >>> msg_pack_into(self._fmt_str, data, 0, >>> - ofs_nbits, >>> + self.ofs_nbits, >>> six.binary_type(src), >>> self.max_len) >>> return data >>> @@ -958,22 +930,22 @@ def generate(ofp_name, ofpp_name): >>> ================ >>> ====================================================== >>> Attribute Description >>> ================ >>> ====================================================== >>> - start Start bit for source field >>> - end End bit for source field >>> + ofs_nbits Start and End for the OXM/NXM field. >>> + Setting method refer to the >>> ``nicira_ext.ofs_nbits`` >>> src OXM/NXM header for source field >>> max_len Max length to send to controller >>> ================ >>> ====================================================== >>> >>> Example:: >>> >>> - actions += [parser.NXActionOutputReg(start=8080, >>> - end=10, >>> - src="reg0", >>> - max_len=1024)] >>> + actions += [parser.NXActionOutputReg2( >>> + ofs_nbits=nicira_ext.ofs_nbits(4, 31), >>> + src="reg0", >>> + max_len=1024)] >>> """ >>> _subtype = nicira_ext.NXAST_OUTPUT_REG2 >>> >>> - # start, end, src, max_len >>> + # ofs_nbits, src, max_len >>> _fmt_str = '!HH4s' >>> _TYPE = { >>> 'ascii': [ >>> @@ -982,14 +954,12 @@ def generate(ofp_name, ofpp_name): >>> } >>> >>> def __init__(self, >>> - start, >>> - end, >>> + ofs_nbits, >>> src, >>> max_len, >>> type_=None, len_=None, experimenter=None, >>> subtype=None): >>> super(NXActionOutputReg2, self).__init__() >>> - self.start = start >>> - self.end = end >>> + self.ofs_nbits = ofs_nbits >>> self.src = src >>> self.max_len = max_len >>> >>> @@ -999,23 +969,19 @@ def generate(ofp_name, ofpp_name): >>> max_len, >>> oxm_data) = struct.unpack_from( >>> cls._fmt_str, buf, 0) >>> - start = ofs_nbits >> 6 >>> - end = (ofs_nbits & 0x3f) + start >>> (n, len_) = ofp.oxm_parse_header(oxm_data, 0) >>> src = ofp.oxm_to_user_header(n) >>> - return cls(start, >>> - end, >>> + return cls(ofs_nbits, >>> src, >>> max_len) >>> >>> def serialize_body(self): >>> data = bytearray() >>> oxm_data = bytearray() >>> - ofs_nbits = (self.start << 6) + (self.end - self.start) >>> oxm = ofp.oxm_from_user_header(self.src) >>> ofp.oxm_serialize_header(oxm, oxm_data, 0), >>> msg_pack_into(self._fmt_str, data, 0, >>> - ofs_nbits, >>> + self.ofs_nbits, >>> self.max_len, >>> six.binary_type(oxm_data)) >>> offset = len(data) >>> @@ -2394,8 +2360,8 @@ def generate(ofp_name, ofpp_name): >>> algorithm One of NX_MP_ALG_*. >>> max_link Number of output links >>> arg Algorithm-specific argument >>> - start Start bit for source field >>> - end End bit for source field >>> + ofs_nbits Start and End for the OXM/NXM field. >>> + Setting method refer to the >>> ``nicira_ext.ofs_nbits`` >>> dst OXM/NXM header for source field >>> ================ >>> ====================================================== >>> >>> @@ -2407,8 +2373,7 @@ def generate(ofp_name, ofpp_name): >>> algorithm=nicira_ext.NX_MP_ALG_HRW, >>> max_link=5, >>> arg=0, >>> - start=4, >>> - end=31, >>> + ofs_nbits=nicira_ext.ofs_nbits(4, 31), >>> dst="reg2")] >>> """ >>> _subtype = nicira_ext.NXAST_MULTIPATH >>> @@ -2428,8 +2393,7 @@ def generate(ofp_name, ofpp_name): >>> algorithm, >>> max_link, >>> arg, >>> - start, >>> - end, >>> + ofs_nbits, >>> dst, >>> type_=None, len_=None, experimenter=None, >>> subtype=None): >>> super(NXActionMultipath, self).__init__() >>> @@ -2438,8 +2402,7 @@ def generate(ofp_name, ofpp_name): >>> self.algorithm = algorithm >>> self.max_link = max_link >>> self.arg = arg >>> - self.start = start >>> - self.end = end >>> + self.ofs_nbits = ofs_nbits >>> self.dst = dst >>> >>> @classmethod >>> @@ -2452,8 +2415,6 @@ def generate(ofp_name, ofpp_name): >>> ofs_nbits, >>> oxm_data) = struct.unpack_from( >>> cls._fmt_str, buf, 0) >>> - start = ofs_nbits >> 6 >>> - end = (ofs_nbits & 0x3f) + start >>> (n, len_) = ofp.oxm_parse_header(oxm_data, 0) >>> dst = ofp.oxm_to_user_header(n) >>> return cls(fields, >>> @@ -2461,14 +2422,12 @@ def generate(ofp_name, ofpp_name): >>> algorithm, >>> max_link, >>> arg, >>> - start, >>> - end, >>> + ofs_nbits, >>> dst) >>> >>> def serialize_body(self): >>> data = bytearray() >>> dst = bytearray() >>> - ofs_nbits = (self.start << 6) + (self.end - self.start) >>> oxm = ofp.oxm_from_user_header(self.dst) >>> ofp.oxm_serialize_header(oxm, dst, 0), >>> msg_pack_into(self._fmt_str, data, 0, >>> @@ -2477,7 +2436,7 @@ def generate(ofp_name, ofpp_name): >>> self.algorithm, >>> self.max_link, >>> self.arg, >>> - ofs_nbits, >>> + self.ofs_nbits, >>> six.binary_type(dst)) >>> >>> return data >>> @@ -2488,7 +2447,7 @@ def generate(ofp_name, ofpp_name): >>> _fmt_str = '!HHHIHH' >>> >>> def __init__(self, algorithm, fields, basis, slave_type, n_slaves, >>> - start, end, dst, slaves): >>> + ofs_nbits, dst, slaves): >>> super(_NXActionBundleBase, self).__init__() >>> self.len = utils.round_up( >>> nicira_ext.NX_ACTION_BUNDLE_0_SIZE + len(slaves) * 2, 8) >>> @@ -2498,8 +2457,7 @@ def generate(ofp_name, ofpp_name): >>> self.basis = basis >>> self.slave_type = slave_type >>> self.n_slaves = n_slaves >>> - self.start = start >>> - self.end = end >>> + self.ofs_nbits = ofs_nbits >>> self.dst = dst >>> >>> assert isinstance(slaves, (list, tuple)) >>> @@ -2514,8 +2472,6 @@ def generate(ofp_name, ofpp_name): >>> (algorithm, fields, basis, >>> slave_type, n_slaves, ofs_nbits, dst) = struct.unpack_from( >>> cls._fmt_str + 'I', buf, 0) >>> - start = ofs_nbits >> 6 >>> - end = (ofs_nbits & 0x3f) + start >>> >>> offset = (nicira_ext.NX_ACTION_BUNDLE_0_SIZE - >>> nicira_ext.NX_ACTION_HEADER_0_SIZE - 8) >>> @@ -2534,10 +2490,9 @@ def generate(ofp_name, ofpp_name): >>> slave_offset += 2 >>> >>> return cls(algorithm, fields, basis, slave_type, >>> - n_slaves, start, end, dst, slaves) >>> + n_slaves, ofs_nbits, dst, slaves) >>> >>> def serialize_body(self): >>> - ofs_nbits = (self.start << 6) + (self.end - self.start) >>> data = bytearray() >>> slave_offset = (nicira_ext.NX_ACTION_BUNDLE_0_SIZE - >>> nicira_ext.NX_ACTION_HEADER_0_SIZE) >>> @@ -2554,7 +2509,7 @@ def generate(ofp_name, ofpp_name): >>> msg_pack_into(self._fmt_str, data, 0, >>> self.algorithm, self.fields, self.basis, >>> self.slave_type, self.n_slaves, >>> - ofs_nbits) >>> + self.ofs_nbits) >>> offset = (nicira_ext.NX_ACTION_BUNDLE_0_SIZE - >>> nicira_ext.NX_ACTION_HEADER_0_SIZE - 8) >>> >>> @@ -2591,8 +2546,7 @@ def generate(ofp_name, ofpp_name): >>> basis Universal hash parameter >>> slave_type Type of slaves(must be NXM_OF_IN_PORT) >>> n_slaves Number of slaves >>> - start Start bit for source field(must be zero) >>> - end End bit for source field(must be zero) >>> + ofs_nbits Start and End for the OXM/NXM field. (must be >>> zero) >>> dst OXM/NXM header for source field(must be zero) >>> slaves List of slaves >>> ================ >>> ====================================================== >>> @@ -2606,19 +2560,18 @@ def generate(ofp_name, ofpp_name): >>> basis=0, >>> slave_type=nicira_ext.NXM_OF_IN_PORT, >>> n_slaves=2, >>> - start=0, >>> - end=0, >>> + ofs_nbits=0, >>> dst=0, >>> slaves=[2, 3])] >>> """ >>> _subtype = nicira_ext.NXAST_BUNDLE >>> >>> def __init__(self, algorithm, fields, basis, slave_type, n_slaves, >>> - start, end, dst, slaves): >>> - # NXAST_BUNDLE actions should have 'start' 'end' and 'dst' >>> zeroed. >>> + ofs_nbits, dst, slaves): >>> + # NXAST_BUNDLE actions should have 'sofs_nbits' and 'dst' >>> zeroed. >>> super(NXActionBundle, self).__init__( >>> algorithm, fields, basis, slave_type, n_slaves, >>> - start=0, end=0, dst=0, slaves=slaves) >>> + ofs_nbits=0, dst=0, slaves=slaves) >>> >>> class NXActionBundleLoad(_NXActionBundleBase): >>> """ >>> @@ -2632,12 +2585,13 @@ def generate(ofp_name, ofpp_name): >>> >>> .. >>> bundle_load(fields, basis, algorithm, slave_type, >>> - slaves:[ s1, s2,...]) >>> + dst[start..end], slaves:[ s1, s2,...]) >>> .. >>> >>> +-----------------------------------------------------------+ >>> | **bundle_load(**\ *fields*\, \ *basis*\, \ *algorithm*\, | >>> - | *slave_type*\, \ *slaves*\:[ \ *s1*\, \ *s2*\,...]\ **)** | >>> + | *slave_type*\, \ *dst*\[\ *start*\... \*emd*\], | >>> + | \ *slaves*\:[ \ *s1*\, \ *s2*\,...]\ **)** | | >>> +-----------------------------------------------------------+ >>> >>> ================ >>> ====================================================== >>> @@ -2648,8 +2602,8 @@ def generate(ofp_name, ofpp_name): >>> basis Universal hash parameter >>> slave_type Type of slaves(must be NXM_OF_IN_PORT) >>> n_slaves Number of slaves >>> - start Start bit for source field >>> - end End bit for source field >>> + ofs_nbits Start and End for the OXM/NXM field. >>> + Setting method refer to the >>> ``nicira_ext.ofs_nbits`` >>> dst OXM/NXM header for source field >>> slaves List of slaves >>> ================ >>> ====================================================== >>> @@ -2663,8 +2617,7 @@ def generate(ofp_name, ofpp_name): >>> basis=0, >>> slave_type=nicira_ext.NXM_OF_IN_PORT, >>> n_slaves=2, >>> - start=4, >>> - end=31, >>> + ofs_nbits=nicira_ext.ofs_nbits(4, 31), >>> dst="reg0", >>> slaves=[2, 3])] >>> """ >>> @@ -2676,10 +2629,10 @@ def generate(ofp_name, ofpp_name): >>> } >>> >>> def __init__(self, algorithm, fields, basis, slave_type, n_slaves, >>> - start, end, dst, slaves): >>> + ofs_nbits, dst, slaves): >>> super(NXActionBundleLoad, self).__init__( >>> algorithm, fields, basis, slave_type, n_slaves, >>> - start, end, dst, slaves) >>> + ofs_nbits, dst, slaves) >>> >>> class NXActionCT(NXAction): >>> """ >>> @@ -2702,8 +2655,10 @@ def generate(ofp_name, ofpp_name): >>> ================ >>> ====================================================== >>> flags Zero or more(Unspecified flag bits must be zero.) >>> zone_src OXM/NXM header for source field >>> - zone_start Start bit for source field >>> - zone_end End bit for source field >>> + zone_ofs_nbits Start and End for the OXM/NXM field. >>> + Setting method refer to the >>> ``nicira_ext.ofs_nbits``. >>> + If you need set the Immediate value for zone, >>> + zone_src must be set to zero. >>> recirc_table Recirculate to a specific table >>> alg Well-known port number for the protocol >>> actions Zero or more actions may immediately follow this >>> @@ -2713,13 +2668,13 @@ def generate(ofp_name, ofpp_name): >>> Example:: >>> >>> match = parser.OFPMatch(eth_type=0x0800, ct_state=(0,32)) >>> - actions += [parser.NXActionCT(flags = 1, >>> - zone_src = 0, >>> - zone_start = 0, >>> - zone_end = 0, >>> - recirc_table = 4, >>> - alg = 0, >>> - actions = [])] >>> + actions += [parser.NXActionCT( >>> + flags = 1, >>> + zone_src = 0, >>> + zone_ofs_nbits = 0, >>> + recirc_table = 4, >>> + alg = 0, >>> + actions = [])] >>> """ >>> _subtype = nicira_ext.NXAST_CT >>> >>> @@ -2731,8 +2686,7 @@ def generate(ofp_name, ofpp_name): >>> def __init__(self, >>> flags, >>> zone_src, >>> - zone_start, >>> - zone_end, >>> + zone_ofs_nbits, >>> recirc_table, >>> alg, >>> actions, >>> @@ -2740,8 +2694,7 @@ def generate(ofp_name, ofpp_name): >>> super(NXActionCT, self).__init__() >>> self.flags = flags >>> self.zone_src = zone_src >>> - self.zone_start = zone_start >>> - self.zone_end = zone_end >>> + self.zone_ofs_nbits = zone_ofs_nbits >>> self.recirc_table = recirc_table >>> self.alg = alg >>> self.actions = actions >>> @@ -2754,8 +2707,6 @@ def generate(ofp_name, ofpp_name): >>> recirc_table, >>> alg,) = struct.unpack_from( >>> cls._fmt_str, buf, 0) >>> - zone_start = zone_ofs_nbits >> 6 >>> - zone_end = (zone_ofs_nbits & 0x3f) + zone_start >>> rest = buf[struct.calcsize(cls._fmt_str):] >>> # actions >>> actions = [] >>> @@ -2764,17 +2715,15 @@ def generate(ofp_name, ofpp_name): >>> actions.append(action) >>> rest = rest[action.len:] >>> >>> - return cls(flags, zone_src, zone_start, zone_end, recirc_table, >>> + return cls(flags, zone_src, zone_ofs_nbits, recirc_table, >>> alg, actions) >>> >>> def serialize_body(self): >>> - zone_ofs_nbits = ((self.zone_start << 6) + >>> - (self.zone_end - self.zone_start)) >>> data = bytearray() >>> msg_pack_into(self._fmt_str, data, 0, >>> self.flags, >>> self.zone_src, >>> - zone_ofs_nbits, >>> + self.zone_ofs_nbits, >>> self.recirc_table, >>> self.alg) >>> for a in self.actions: >>> @@ -2824,9 +2773,8 @@ def generate(ofp_name, ofpp_name): >>> actions += [ >>> parser.NXActionCT( >>> flags = 1, >>> - zone_src = 0, >>> - zone_start = 0, >>> - zone_end = 0, >>> + zone_src = "reg0", >>> + zone_ofs_nbits = nicira_ext.ofs_nbits(4, 31), >>> recirc_table = 255, >>> alg = 0, >>> actions = [ >>> diff --git >>> a/ryu/tests/unit/ofproto/json/of13/ovs-ofctl-of13-action_ct.packet.json >>> b/ryu/tests/unit/ofproto/json/of13/ovs-ofctl-of13-action_ct.packet.json >>> index 473b54f..0cd1e20 100644 >>> --- a/ryu/tests/unit/ofproto/json/of13/ovs-ofctl-of13-action_ct.packet.json >>> +++ b/ryu/tests/unit/ofproto/json/of13/ovs-ofctl-of13-action_ct.packet.json >>> @@ -21,8 +21,7 @@ >>> "recirc_table": 4, >>> "subtype": 35, >>> "type": 65535, >>> - "zone_start": 0, >>> - "zone_end": 0, >>> + "zone_ofs_nbits": 0, >>> "zone_src": 0 >>> } >>> } >>> diff --git >>> a/ryu/tests/unit/ofproto/json/of13/ovs-ofctl-of13-action_ct_exec.packet.json >>> >>> b/ryu/tests/unit/ofproto/json/of13/ovs-ofctl-of13-action_ct_exec.packet.json >>> index 7cecad7..a163aba 100644 >>> --- >>> a/ryu/tests/unit/ofproto/json/of13/ovs-ofctl-of13-action_ct_exec.packet.json >>> +++ >>> b/ryu/tests/unit/ofproto/json/of13/ovs-ofctl-of13-action_ct_exec.packet.json >>> @@ -35,8 +35,7 @@ >>> "recirc_table": 255, >>> "subtype": 35, >>> "type": 65535, >>> - "zone_start": 0, >>> - "zone_end": 0, >>> + "zone_ofs_nbits": 0, >>> "zone_src": 0 >>> } >>> } >>> diff --git >>> a/ryu/tests/unit/ofproto/json/of13/ovs-ofctl-of13-action_ct_nat.packet.json >>> b/ryu/tests/unit/ofproto/json/of13/ovs-ofctl-of13-action_ct_nat.packet.json >>> index b63c226..ef6a7d9 100644 >>> --- >>> a/ryu/tests/unit/ofproto/json/of13/ovs-ofctl-of13-action_ct_nat.packet.json >>> +++ >>> b/ryu/tests/unit/ofproto/json/of13/ovs-ofctl-of13-action_ct_nat.packet.json >>> @@ -37,8 +37,7 @@ >>> "recirc_table": 255, >>> "subtype": 35, >>> "type": 65535, >>> - "zone_start": 0, >>> - "zone_end": 0, >>> + "zone_ofs_nbits": 0, >>> "zone_src": 0 >>> } >>> } >>> diff --git >>> a/ryu/tests/unit/ofproto/json/of13/ovs-ofctl-of13-action_ct_nat_v6.packet.json >>> >>> b/ryu/tests/unit/ofproto/json/of13/ovs-ofctl-of13-action_ct_nat_v6.packet.json >>> index e50d561..cca4625 100644 >>> --- >>> a/ryu/tests/unit/ofproto/json/of13/ovs-ofctl-of13-action_ct_nat_v6.packet.json >>> +++ >>> b/ryu/tests/unit/ofproto/json/of13/ovs-ofctl-of13-action_ct_nat_v6.packet.json >>> @@ -37,8 +37,7 @@ >>> "recirc_table": 255, >>> "subtype": 35, >>> "type": 65535, >>> - "zone_start": 0, >>> - "zone_end": 0, >>> + "zone_ofs_nbits": 0, >>> "zone_src": 0 >>> } >>> } >>> diff --git >>> a/ryu/tests/unit/ofproto/json/of13/ovs-ofctl-of13-match_load_nx_register.packet.json >>> >>> b/ryu/tests/unit/ofproto/json/of13/ovs-ofctl-of13-match_load_nx_register.packet.json >>> index 05ced1e..c60851a 100644 >>> --- >>> a/ryu/tests/unit/ofproto/json/of13/ovs-ofctl-of13-match_load_nx_register.packet.json >>> +++ >>> b/ryu/tests/unit/ofproto/json/of13/ovs-ofctl-of13-match_load_nx_register.packet.json >>> @@ -16,8 +16,7 @@ >>> "dst": "reg0", >>> "experimenter": 8992, >>> "len": 24, >>> - "end": 31, >>> - "start": 4, >>> + "ofs_nbits": 283, >>> "subtype": 7, >>> "type": 65535, >>> "value": 233495534 >>> @@ -26,7 +25,7 @@ >>> ], >>> "len": 32, >>> "type": 4 >>> - } >>> + } >>> } >>> ], >>> "match": { >>> diff --git >>> a/ryu/tests/unit/ofproto/json/of13/ovs-ofctl-of13-match_move_nx_register.packet.json >>> >>> b/ryu/tests/unit/ofproto/json/of13/ovs-ofctl-of13-match_move_nx_register.packet.json >>> index d31294e..7457278 100644 >>> --- >>> a/ryu/tests/unit/ofproto/json/of13/ovs-ofctl-of13-match_move_nx_register.packet.json >>> +++ >>> b/ryu/tests/unit/ofproto/json/of13/ovs-ofctl-of13-match_move_nx_register.packet.json >>> @@ -13,14 +13,13 @@ >>> "actions": [ >>> { >>> "NXActionRegMove": { >>> - "dst_end": 5, >>> "dst_field": "reg1", >>> - "dst_start": 0, >>> + "dst_ofs": 0, >>> "experimenter": 8992, >>> "len": 24, >>> - "src_end": 15, >>> + "n_bits": 6, >>> "src_field": "reg0", >>> - "src_start": 10, >>> + "src_ofs": 10, >>> "subtype": 6, >>> "type": 65535 >>> } >>> diff --git a/ryu/tests/unit/ofproto/test_parser_v10.py >>> b/ryu/tests/unit/ofproto/test_parser_v10.py >>> index 55edc77..eefb65f 100644 >>> --- a/ryu/tests/unit/ofproto/test_parser_v10.py >>> +++ b/ryu/tests/unit/ofproto/test_parser_v10.py >>> @@ -1391,10 +1391,6 @@ class TestNXActionRegMove(unittest.TestCase): >>> dst_ofs = {'buf': b'\xdc\x67', 'val': 56423} >>> src_field = {'buf': b'\x00\x01\x00\x04', 'val': "reg0", "val2": 65540} >>> dst_field = {'buf': b'\x00\x01\x02\x04', 'val': "reg1", "val2": 66052} >>> - src_start = 62371 >>> - src_end = 78138 >>> - dst_start = 56423 >>> - dst_end = 72190 >>> >>> buf = type_['buf'] \ >>> + len_['buf'] \ >>> @@ -1407,11 +1403,10 @@ class TestNXActionRegMove(unittest.TestCase): >>> + dst_field['buf'] >>> >>> c = NXActionRegMove(src_field['val'], >>> - src_start, >>> - src_end, >>> dst_field['val'], >>> - dst_start, >>> - dst_end) >>> + n_bits['val'], >>> + src_ofs['val'], >>> + dst_ofs['val']) >>> >>> def setUp(self): >>> pass >>> @@ -1422,23 +1417,21 @@ class TestNXActionRegMove(unittest.TestCase): >>> def test_init(self): >>> eq_(self.subtype['val'], self.c.subtype) >>> eq_(self.src_field['val'], self.c.src_field) >>> - eq_(self.src_start, self.c.src_start) >>> - eq_(self.src_end, self.c.src_end) >>> eq_(self.dst_field['val'], self.c.dst_field) >>> - eq_(self.dst_start, self.c.dst_start) >>> - eq_(self.dst_end, self.c.dst_end) >>> + eq_(self.n_bits['val'], self.c.n_bits) >>> + eq_(self.src_field['val'], self.c.src_field) >>> + eq_(self.dst_field['val'], self.c.dst_field) >>> >>> def test_parser(self): >>> res = OFPActionVendor.parser(self.buf, 0) >>> eq_(self.type_['val'], res.type) >>> eq_(self.len_['val'], res.len) >>> eq_(self.subtype['val'], res.subtype) >>> + eq_(self.src_ofs['val'], res.src_ofs) >>> + eq_(self.dst_ofs['val'], res.dst_ofs) >>> + eq_(self.n_bits['val'], res.n_bits) >>> eq_(self.src_field['val'], res.src_field) >>> - eq_(self.src_start, res.src_start) >>> - eq_(self.src_end, res.src_end) >>> eq_(self.dst_field['val'], res.dst_field) >>> - eq_(self.dst_start, res.dst_start) >>> - eq_(self.dst_end, res.dst_end) >>> >>> def test_serialize(self): >>> buf = bytearray() >>> @@ -1485,8 +1478,7 @@ class TestNXActionRegLoad(unittest.TestCase): >>> + dst['buf'] \ >>> + value['buf'] >>> >>> - c = NXActionRegLoad(start, >>> - end, >>> + c = NXActionRegLoad(ofs_nbits['val'], >>> dst['val'], >>> value['val']) >>> >>> @@ -1498,8 +1490,7 @@ class TestNXActionRegLoad(unittest.TestCase): >>> >>> def test_init(self): >>> eq_(self.subtype['val'], self.c.subtype) >>> - eq_(self.start, self.c.start) >>> - eq_(self.end, self.c.end) >>> + eq_(self.ofs_nbits['val'], self.c.ofs_nbits) >>> eq_(self.dst['val'], self.c.dst) >>> eq_(self.value['val'], self.c.value) >>> >>> @@ -1507,8 +1498,7 @@ class TestNXActionRegLoad(unittest.TestCase): >>> res = OFPActionVendor.parser(self.buf, 0) >>> eq_(self.type_['val'], res.type) >>> eq_(self.len_['val'], res.len) >>> - eq_(self.start, self.c.start) >>> - eq_(self.end, self.c.end) >>> + eq_(self.ofs_nbits['val'], self.c.ofs_nbits) >>> eq_(self.dst['val'], res.dst) >>> eq_(self.value['val'], res.value) >>> >>> @@ -1626,8 +1616,7 @@ class TestNXActionMultipath(unittest.TestCase): >>> algorithm['val'], >>> max_link['val'], >>> arg['val'], >>> - start, >>> - end, >>> + ofs_nbits['val'], >>> dst['val']) >>> >>> def setUp(self): >>> @@ -1643,8 +1632,7 @@ class TestNXActionMultipath(unittest.TestCase): >>> eq_(self.algorithm['val'], self.c.algorithm) >>> eq_(self.max_link['val'], self.c.max_link) >>> eq_(self.arg['val'], self.c.arg) >>> - eq_(self.start, self.c.start) >>> - eq_(self.end, self.c.end) >>> + eq_(self.ofs_nbits['val'], self.c.ofs_nbits) >>> eq_(self.dst['val'], self.c.dst) >>> >>> def test_parser(self): >>> @@ -1657,8 +1645,7 @@ class TestNXActionMultipath(unittest.TestCase): >>> eq_(self.algorithm['val'], res.algorithm) >>> eq_(self.max_link['val'], res.max_link) >>> eq_(self.arg['val'], res.arg) >>> - eq_(self.start, res.start) >>> - eq_(self.end, res.end) >>> + eq_(self.ofs_nbits['val'], res.ofs_nbits) >>> eq_(self.dst['val'], res.dst) >>> >>> def test_serialize(self): >>> @@ -1705,8 +1692,6 @@ class TestNXActionBundle(unittest.TestCase): >>> >>> slaves_buf = (b'\x00\x01', b'\x00\x02') >>> slaves_val = (1, 2) >>> - start = 0 >>> - end = 0 >>> >>> _len = len_['val'] + len(slaves_val) * 2 >>> _len += (_len % 8) >>> @@ -1731,8 +1716,7 @@ class TestNXActionBundle(unittest.TestCase): >>> basis['val'], >>> slave_type['val'], >>> n_slaves['val'], >>> - start, >>> - end, >>> + ofs_nbits['val'], >>> dst['val'], >>> slaves_val) >>> >>> @@ -1749,8 +1733,7 @@ class TestNXActionBundle(unittest.TestCase): >>> eq_(self.basis['val'], self.c.basis) >>> eq_(self.slave_type['val'], self.c.slave_type) >>> eq_(self.n_slaves['val'], self.c.n_slaves) >>> - eq_(self.start, self.c.start) >>> - eq_(self.end, self.c.end) >>> + eq_(self.ofs_nbits['val'], self.c.ofs_nbits) >>> eq_(self.dst['val'], self.c.dst) >>> >>> # slaves >>> @@ -1768,8 +1751,7 @@ class TestNXActionBundle(unittest.TestCase): >>> eq_(self.basis['val'], res.basis) >>> eq_(self.slave_type['val'], res.slave_type) >>> eq_(self.n_slaves['val'], res.n_slaves) >>> - eq_(self.start, res.start) >>> - eq_(self.end, res.end) >>> + eq_(self.ofs_nbits['val'], res.ofs_nbits) >>> eq_(self.dst['val'], res.dst) >>> >>> # slaves >>> @@ -1821,8 +1803,6 @@ class TestNXActionBundleLoad(unittest.TestCase): >>> ofs_nbits = {'buf': b'\xd2\x9d', 'val': 53917} >>> dst = {'buf': b'\x00\x01\x00\x04', 'val': "reg0", 'val2': 65540} >>> zfill = b'\x00' * 4 >>> - start = 842 >>> - end = 871 >>> >>> slaves_buf = (b'\x00\x01', b'\x00\x02') >>> slaves_val = (1, 2) >>> @@ -1850,8 +1830,7 @@ class TestNXActionBundleLoad(unittest.TestCase): >>> basis['val'], >>> slave_type['val'], >>> n_slaves['val'], >>> - start, >>> - end, >>> + ofs_nbits['val'], >>> dst['val'], >>> slaves_val) >>> >>> @@ -1868,8 +1847,7 @@ class TestNXActionBundleLoad(unittest.TestCase): >>> eq_(self.basis['val'], self.c.basis) >>> eq_(self.slave_type['val'], self.c.slave_type) >>> eq_(self.n_slaves['val'], self.c.n_slaves) >>> - eq_(self.start, self.c.start) >>> - eq_(self.end, self.c.end) >>> + eq_(self.ofs_nbits['val'], self.c.ofs_nbits) >>> eq_(self.dst['val'], self.c.dst) >>> >>> # slaves >>> @@ -1887,8 +1865,7 @@ class TestNXActionBundleLoad(unittest.TestCase): >>> eq_(self.basis['val'], res.basis) >>> eq_(self.slave_type['val'], res.slave_type) >>> eq_(self.n_slaves['val'], res.n_slaves) >>> - eq_(self.start, res.start) >>> - eq_(self.end, res.end) >>> + eq_(self.ofs_nbits['val'], res.ofs_nbits) >>> eq_(self.dst['val'], res.dst) >>> >>> # slaves >>> @@ -1935,8 +1912,6 @@ class TestNXActionOutputReg(unittest.TestCase): >>> src = {'buf': b'\x00\x01\x00\x04', 'val': "reg0", 'val2': 65540} >>> max_len = {'buf': b'\x00\x08', 'val': ofproto.OFP_ACTION_OUTPUT_SIZE} >>> zfill = b'\x00' * 6 >>> - start = 1017 >>> - end = 1073 >>> >>> buf = type_['buf'] \ >>> + len_['buf'] \ >>> @@ -1947,8 +1922,7 @@ class TestNXActionOutputReg(unittest.TestCase): >>> + max_len['buf'] \ >>> + zfill >>> >>> - c = NXActionOutputReg(start, >>> - end, >>> + c = NXActionOutputReg(ofs_nbits['val'], >>> src['val'], >>> max_len['val']) >>> >>> @@ -1960,8 +1934,7 @@ class TestNXActionOutputReg(unittest.TestCase): >>> >>> def test_init(self): >>> eq_(self.subtype['val'], self.c.subtype) >>> - eq_(self.start, self.c.start) >>> - eq_(self.end, self.c.end) >>> + eq_(self.ofs_nbits['val'], self.c.ofs_nbits) >>> eq_(self.src['val'], self.c.src) >>> eq_(self.max_len['val'], self.c.max_len) >>> >>> @@ -1970,8 +1943,7 @@ class TestNXActionOutputReg(unittest.TestCase): >>> eq_(self.type_['val'], res.type) >>> eq_(self.len_['val'], res.len) >>> eq_(self.subtype['val'], res.subtype) >>> - eq_(self.start, self.c.start) >>> - eq_(self.end, self.c.end) >>> + eq_(self.ofs_nbits['val'], self.c.ofs_nbits) >>> eq_(self.src['val'], res.src) >>> eq_(self.max_len['val'], res.max_len) >>> >>> -- >>> 1.9.1 >>> >>> >>> ------------------------------------------------------------------------------ >>> What NetFlow Analyzer can do for you? Monitors network bandwidth and traffic >>> patterns at an interface-level. Reveals which users, apps, and protocols are >>> consuming the most bandwidth. Provides multi-vendor support for NetFlow, >>> J-Flow, sFlow and other flows. Make informed decisions using capacity >>> planning >>> reports.http://sdm.link/zohodev2dev >>> _______________________________________________ >>> Ryu-devel mailing list >>> Ryu-devel@lists.sourceforge.net >>> https://lists.sourceforge.net/lists/listinfo/ryu-devel >>> >> >> ------------------------------------------------------------------------------ >> What NetFlow Analyzer can do for you? Monitors network bandwidth and traffic >> patterns at an interface-level. Reveals which users, apps, and protocols are >> consuming the most bandwidth. Provides multi-vendor support for NetFlow, >> J-Flow, sFlow and other flows. Make informed decisions using capacity >> planning >> reports.http://sdm.link/zohodev2dev >> _______________________________________________ >> Ryu-devel mailing list >> Ryu-devel@lists.sourceforge.net >> https://lists.sourceforge.net/lists/listinfo/ryu-devel >> ------------------------------------------------------------------------------ What NetFlow Analyzer can do for you? Monitors network bandwidth and traffic patterns at an interface-level. Reveals which users, apps, and protocols are consuming the most bandwidth. Provides multi-vendor support for NetFlow, J-Flow, sFlow and other flows. Make informed decisions using capacity planning reports.http://sdm.link/zohodev2dev _______________________________________________ Ryu-devel mailing list Ryu-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/ryu-devel