Iwamoto-san, any comment on this? 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