This patch will revert the API of NXAction for the following report. https://bugs.launchpad.net/dragonflow/+bug/1599367 revert commit id: a01f8f0aa03cd85df25555fc07e7217c2a79e7f0
Add the utility method for ofs_nbits. Since the zone_src in NXActionCT was not possible to specify string, update zone_src of NXActionCT for the uniformity. Therefore,you will be able to specify string of OXM/NXM fields for zone_src. 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 | 253 ++++++++++----------- .../of13/ovs-ofctl-of13-action_ct.packet | Bin 104 -> 104 bytes ryu/tests/packet_data_generator3/gen.py | 2 +- .../json/of13/ovs-ofctl-of13-action_ct.packet.json | 5 +- .../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 ++----- 12 files changed, 188 insertions(+), 203 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..6bd9b55 100644 --- a/ryu/ofproto/nx_actions.py +++ b/ryu/ofproto/nx_actions.py @@ -15,6 +15,7 @@ # limitations under the License. import six +import base64 import struct @@ -356,18 +357,18 @@ def generate(ofp_name, ofpp_name): ================ ====================================================== 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 +378,10 @@ def generate(ofp_name, ofpp_name): ] } - def __init__(self, start, end, dst, value, + 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 +389,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 +399,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 +668,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 +681,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 +696,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 +711,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 +720,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 +859,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 +883,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 +896,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 +937,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 +961,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 +976,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 +2367,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 +2380,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 +2400,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 +2409,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 +2422,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 +2429,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 +2443,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 +2454,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 +2464,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 +2479,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 +2497,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 +2516,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 +2553,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 +2567,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 +2592,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 +2609,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 +2624,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 +2636,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 +2662,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,26 +2675,27 @@ 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 = "reg0", + zone_ofs_nbits = nicira_ext.ofs_nbits(4, 31), + recirc_table = 4, + alg = 0, + actions = [])] """ _subtype = nicira_ext.NXAST_CT # flags, zone_src, zone_ofs_nbits, recirc_table, # pad, alg - _fmt_str = '!HIHB3xH' + _fmt_str = '!H4sHB3xH' + _TYPE = {'ascii': []} # appended before to_jsondict() + # Followed by actions def __init__(self, flags, zone_src, - zone_start, - zone_end, + zone_ofs_nbits, recirc_table, alg, actions, @@ -2740,8 +2703,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 @@ -2749,14 +2711,20 @@ def generate(ofp_name, ofpp_name): @classmethod def parser(cls, buf): (flags, - zone_src, + oxm_data, zone_ofs_nbits, 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):] + + # OXM/NXM field + if oxm_data == b'\x00' * 4: + zone_src = 0 + else: + (n, len_) = ofp.oxm_parse_header(oxm_data, 0) + zone_src = ofp.oxm_to_user_header(n) + # actions actions = [] while len(rest) > 0: @@ -2764,23 +2732,41 @@ 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() + # If zone_src is zero, zone_ofs_nbits is zone_imm + if self.zone_src == 0: + zone_src = b'\x00' * 4 + # For backward compatibility + elif isinstance(self.zone_src, six.integer_types): + zone_src = struct.pack('!I', self.zone_src) + else: + zone_src = bytearray() + oxm = ofp.oxm_from_user_header(self.zone_src) + ofp.oxm_serialize_header(oxm, zone_src, 0) + msg_pack_into(self._fmt_str, data, 0, self.flags, - self.zone_src, - zone_ofs_nbits, + six.binary_type(zone_src), + self.zone_ofs_nbits, self.recirc_table, self.alg) for a in self.actions: a.serialize(data, len(data)) return data + def to_jsondict(self, encode_string=base64.b64encode): + if (isinstance(self.zone_src, (str, six.text_type)) and + 'zone_src' not in self._TYPE['ascii']): + self._TYPE['ascii'].append('zone_src') + elif (isinstance(self.zone_src, six.integer_types) and + 'zone_src' in self._TYPE['ascii']): + self._TYPE['ascii'].remove('zone_src') + return super(NXActionCT, self).to_jsondict(encode_string) + class NXActionNAT(NXAction): """ Network address translation action @@ -2824,9 +2810,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/packet_data/of13/ovs-ofctl-of13-action_ct.packet b/ryu/tests/packet_data/of13/ovs-ofctl-of13-action_ct.packet index 3aff2bdc3e516a200a34604ce6236b10b247cd03..5eb733f969fbabe7d5d88ec279422b3d5fd286d0 100644 GIT binary patch delta 16 Ucmd1Em=Md&$iTuV&B6cz02<K&?f?J) delta 16 Rcmd1Em=Md&00Jyv5&#+90nGpa diff --git a/ryu/tests/packet_data_generator3/gen.py b/ryu/tests/packet_data_generator3/gen.py index 65f91a7..92676e4 100644 --- a/ryu/tests/packet_data_generator3/gen.py +++ b/ryu/tests/packet_data_generator3/gen.py @@ -108,7 +108,7 @@ MESSAGES = [ 'args': (['table=3,', 'importance=39032'] + ['dl_type=0x0800,ct_state=-trk'] + - ['actions=ct(table=4)'])}, + ['actions=ct(table=4,zone=NXM_NX_REG0[4..31])'])}, {'name': 'action_ct_exec', 'versions': [4], 'cmd': 'add-flow', 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..b1157e9 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,9 +21,8 @@ "recirc_table": 4, "subtype": 35, "type": 65535, - "zone_start": 0, - "zone_end": 0, - "zone_src": 0 + "zone_ofs_nbits": 283, + "zone_src": "reg0" } } ], 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