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 <[email protected]> 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 <[email protected]>
>>> ---
>>> 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
>>> [email protected]
>>> 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
>> [email protected]
>> 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
[email protected]
https://lists.sourceforge.net/lists/listinfo/ryu-devel