ofproto/nx_actions: Revert API of NXAction
This patch will revert the API of NXAction for the following report.
https://bugs.launchpad.net/dragonflow/+bug/1599367
revert commit id: 3c3896fd77
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.
Signed-off-by: Shinpei Muraoka <shinpei.muraoka@gmail.com>
Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
This commit is contained in:
parent
882262d861
commit
64ba9f1cdc
@ -57,6 +57,7 @@ The followings shows the supported NXAction classes in OpenFlow1.0 or later
|
|||||||
.. autoclass:: NXFlowSpecMatch
|
.. autoclass:: NXFlowSpecMatch
|
||||||
.. autoclass:: NXFlowSpecLoad
|
.. autoclass:: NXFlowSpecLoad
|
||||||
.. autoclass:: NXFlowSpecOutput
|
.. autoclass:: NXFlowSpecOutput
|
||||||
|
.. autofunction:: ryu.ofproto.nicira_ext.ofs_nbits
|
||||||
|
|
||||||
.. _nx_match_structures:
|
.. _nx_match_structures:
|
||||||
|
|
||||||
|
@ -278,6 +278,39 @@ NX_NAT_RANGE_PROTO_MIN = 1 << 4
|
|||||||
NX_NAT_RANGE_PROTO_MAX = 1 << 5
|
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):
|
def nxm_header__(vendor, field, hasmask, length):
|
||||||
return (vendor << 16) | (field << 9) | (hasmask << 8) | length
|
return (vendor << 16) | (field << 9) | (hasmask << 8) | length
|
||||||
|
|
||||||
|
@ -356,16 +356,16 @@ def generate(ofp_name, ofpp_name):
|
|||||||
================ ======================================================
|
================ ======================================================
|
||||||
Attribute Description
|
Attribute Description
|
||||||
================ ======================================================
|
================ ======================================================
|
||||||
start Start bit for destination field
|
ofs_nbits Start and End for the OXM/NXM field.
|
||||||
end End bit for destination field
|
Setting method refer to the ``nicira_ext.ofs_nbits``
|
||||||
dst OXM/NXM header for destination field
|
dst OXM/NXM header for destination field
|
||||||
value OXM/NXM value to be loaded
|
value OXM/NXM value to be loaded
|
||||||
================ ======================================================
|
================ ======================================================
|
||||||
|
|
||||||
Example::
|
Example::
|
||||||
|
|
||||||
actions += [parser.NXActionRegLoad(start=4,
|
actions += [parser.NXActionRegLoad(
|
||||||
end=31,
|
ofs_nbits=nicira_ext.ofs_nbits(4, 31),
|
||||||
dst="eth_dst",
|
dst="eth_dst",
|
||||||
value=0x112233)]
|
value=0x112233)]
|
||||||
"""
|
"""
|
||||||
@ -377,11 +377,11 @@ 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):
|
type_=None, len_=None, experimenter=None,
|
||||||
|
subtype=None):
|
||||||
super(NXActionRegLoad, self).__init__()
|
super(NXActionRegLoad, self).__init__()
|
||||||
self.start = start
|
self.ofs_nbits = ofs_nbits
|
||||||
self.end = end
|
|
||||||
self.dst = dst
|
self.dst = dst
|
||||||
self.value = value
|
self.value = value
|
||||||
|
|
||||||
@ -389,11 +389,9 @@ def generate(ofp_name, ofpp_name):
|
|||||||
def parser(cls, buf):
|
def parser(cls, buf):
|
||||||
(ofs_nbits, dst, value,) = struct.unpack_from(
|
(ofs_nbits, dst, value,) = struct.unpack_from(
|
||||||
cls._fmt_str, buf, 0)
|
cls._fmt_str, buf, 0)
|
||||||
start = ofs_nbits >> 6
|
|
||||||
end = (ofs_nbits & 0x3f) + start
|
|
||||||
# Right-shift instead of using oxm_parse_header for simplicity...
|
# Right-shift instead of using oxm_parse_header for simplicity...
|
||||||
dst_name = ofp.oxm_to_user_header(dst >> 9)
|
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):
|
def serialize_body(self):
|
||||||
hdr_data = bytearray()
|
hdr_data = bytearray()
|
||||||
@ -401,10 +399,9 @@ def generate(ofp_name, ofpp_name):
|
|||||||
ofp.oxm_serialize_header(n, hdr_data, 0)
|
ofp.oxm_serialize_header(n, hdr_data, 0)
|
||||||
(dst_num,) = struct.unpack_from('!I', six.binary_type(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()
|
data = bytearray()
|
||||||
msg_pack_into(self._fmt_str, data, 0,
|
msg_pack_into(self._fmt_str, data, 0,
|
||||||
ofs_nbits, dst_num, self.value)
|
self.ofs_nbits, dst_num, self.value)
|
||||||
return data
|
return data
|
||||||
|
|
||||||
class NXActionRegLoad2(NXAction):
|
class NXActionRegLoad2(NXAction):
|
||||||
@ -671,11 +668,10 @@ def generate(ofp_name, ofpp_name):
|
|||||||
Attribute Description
|
Attribute Description
|
||||||
================ ======================================================
|
================ ======================================================
|
||||||
src_field OXM/NXM header for source field
|
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_field OXM/NXM header for destination field
|
||||||
dst_start Start bit for destination field
|
n_bits Number of bits
|
||||||
dst_end End bit for destination field
|
src_ofs Starting bit offset in source
|
||||||
|
dst_ofs Starting bit offset in destination
|
||||||
================ ======================================================
|
================ ======================================================
|
||||||
|
|
||||||
.. CAUTION::
|
.. CAUTION::
|
||||||
@ -685,11 +681,10 @@ def generate(ofp_name, ofpp_name):
|
|||||||
Example::
|
Example::
|
||||||
|
|
||||||
actions += [parser.NXActionRegMove(src_field="reg0",
|
actions += [parser.NXActionRegMove(src_field="reg0",
|
||||||
src_start=0,
|
|
||||||
src_end=5,
|
|
||||||
dst_field="reg1",
|
dst_field="reg1",
|
||||||
dst_start=10,
|
n_bits=5,
|
||||||
dst_end=15)]
|
src_ofs=0
|
||||||
|
dst_ofs=10)]
|
||||||
"""
|
"""
|
||||||
_subtype = nicira_ext.NXAST_REG_MOVE
|
_subtype = nicira_ext.NXAST_REG_MOVE
|
||||||
_fmt_str = '!HHH' # n_bits, src_ofs, dst_ofs
|
_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,
|
def __init__(self, src_field, dst_field, n_bits, src_ofs=0, dst_ofs=0,
|
||||||
dst_field, dst_start, dst_end,
|
|
||||||
type_=None, len_=None, experimenter=None, subtype=None):
|
type_=None, len_=None, experimenter=None, subtype=None):
|
||||||
super(NXActionRegMove, self).__init__()
|
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_field = src_field
|
||||||
self.src_start = src_start
|
|
||||||
self.src_end = src_end
|
|
||||||
self.dst_field = dst_field
|
self.dst_field = dst_field
|
||||||
self.dst_start = dst_start
|
|
||||||
self.dst_end = dst_end
|
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def parser(cls, buf):
|
def parser(cls, buf):
|
||||||
@ -718,11 +711,6 @@ def generate(ofp_name, ofpp_name):
|
|||||||
cls._fmt_str, buf, 0)
|
cls._fmt_str, buf, 0)
|
||||||
rest = buf[struct.calcsize(NXActionRegMove._fmt_str):]
|
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
|
# src field
|
||||||
(n, len) = ofp.oxm_parse_header(rest, 0)
|
(n, len) = ofp.oxm_parse_header(rest, 0)
|
||||||
src_field = ofp.oxm_to_user_header(n)
|
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)
|
dst_field = ofp.oxm_to_user_header(n)
|
||||||
rest = rest[len:]
|
rest = rest[len:]
|
||||||
# ignore padding
|
# ignore padding
|
||||||
return cls(src_field, src_start, src_end,
|
return cls(src_field, dst_field=dst_field, n_bits=n_bits,
|
||||||
dst_field, dst_start, dst_end)
|
src_ofs=src_ofs, dst_ofs=dst_ofs)
|
||||||
|
|
||||||
def serialize_body(self):
|
def serialize_body(self):
|
||||||
# fixup
|
# fixup
|
||||||
data = bytearray()
|
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,
|
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
|
# src field
|
||||||
n = ofp.oxm_from_user_header(self.src_field)
|
n = ofp.oxm_from_user_header(self.src_field)
|
||||||
ofp.oxm_serialize_header(n, data, len(data))
|
ofp.oxm_serialize_header(n, data, len(data))
|
||||||
@ -874,16 +859,16 @@ def generate(ofp_name, ofpp_name):
|
|||||||
================ ======================================================
|
================ ======================================================
|
||||||
Attribute Description
|
Attribute Description
|
||||||
================ ======================================================
|
================ ======================================================
|
||||||
start Start bit for source field
|
ofs_nbits Start and End for the OXM/NXM field.
|
||||||
end End bit for source field
|
Setting method refer to the ``nicira_ext.ofs_nbits``
|
||||||
src OXM/NXM header for source field
|
src OXM/NXM header for source field
|
||||||
max_len Max length to send to controller
|
max_len Max length to send to controller
|
||||||
================ ======================================================
|
================ ======================================================
|
||||||
|
|
||||||
Example::
|
Example::
|
||||||
|
|
||||||
actions += [parser.NXActionOutputReg(start=8080,
|
actions += [parser.NXActionOutputReg(
|
||||||
end=10,
|
ofs_nbits=nicira_ext.ofs_nbits(4, 31),
|
||||||
src="reg0",
|
src="reg0",
|
||||||
max_len=1024)]
|
max_len=1024)]
|
||||||
"""
|
"""
|
||||||
@ -898,14 +883,12 @@ def generate(ofp_name, ofpp_name):
|
|||||||
}
|
}
|
||||||
|
|
||||||
def __init__(self,
|
def __init__(self,
|
||||||
start,
|
ofs_nbits,
|
||||||
end,
|
|
||||||
src,
|
src,
|
||||||
max_len,
|
max_len,
|
||||||
type_=None, len_=None, experimenter=None, subtype=None):
|
type_=None, len_=None, experimenter=None, subtype=None):
|
||||||
super(NXActionOutputReg, self).__init__()
|
super(NXActionOutputReg, self).__init__()
|
||||||
self.start = start
|
self.ofs_nbits = ofs_nbits
|
||||||
self.end = end
|
|
||||||
self.src = src
|
self.src = src
|
||||||
self.max_len = max_len
|
self.max_len = max_len
|
||||||
|
|
||||||
@ -913,23 +896,19 @@ def generate(ofp_name, ofpp_name):
|
|||||||
def parser(cls, buf):
|
def parser(cls, buf):
|
||||||
(ofs_nbits, oxm_data, max_len) = struct.unpack_from(
|
(ofs_nbits, oxm_data, max_len) = struct.unpack_from(
|
||||||
cls._fmt_str, buf, 0)
|
cls._fmt_str, buf, 0)
|
||||||
start = ofs_nbits >> 6
|
|
||||||
end = (ofs_nbits & 0x3f) + start
|
|
||||||
(n, len_) = ofp.oxm_parse_header(oxm_data, 0)
|
(n, len_) = ofp.oxm_parse_header(oxm_data, 0)
|
||||||
src = ofp.oxm_to_user_header(n)
|
src = ofp.oxm_to_user_header(n)
|
||||||
return cls(start,
|
return cls(ofs_nbits,
|
||||||
end,
|
|
||||||
src,
|
src,
|
||||||
max_len)
|
max_len)
|
||||||
|
|
||||||
def serialize_body(self):
|
def serialize_body(self):
|
||||||
data = bytearray()
|
data = bytearray()
|
||||||
src = bytearray()
|
src = bytearray()
|
||||||
ofs_nbits = (self.start << 6) + (self.end - self.start)
|
|
||||||
oxm = ofp.oxm_from_user_header(self.src)
|
oxm = ofp.oxm_from_user_header(self.src)
|
||||||
ofp.oxm_serialize_header(oxm, src, 0),
|
ofp.oxm_serialize_header(oxm, src, 0),
|
||||||
msg_pack_into(self._fmt_str, data, 0,
|
msg_pack_into(self._fmt_str, data, 0,
|
||||||
ofs_nbits,
|
self.ofs_nbits,
|
||||||
six.binary_type(src),
|
six.binary_type(src),
|
||||||
self.max_len)
|
self.max_len)
|
||||||
return data
|
return data
|
||||||
@ -958,22 +937,22 @@ def generate(ofp_name, ofpp_name):
|
|||||||
================ ======================================================
|
================ ======================================================
|
||||||
Attribute Description
|
Attribute Description
|
||||||
================ ======================================================
|
================ ======================================================
|
||||||
start Start bit for source field
|
ofs_nbits Start and End for the OXM/NXM field.
|
||||||
end End bit for source field
|
Setting method refer to the ``nicira_ext.ofs_nbits``
|
||||||
src OXM/NXM header for source field
|
src OXM/NXM header for source field
|
||||||
max_len Max length to send to controller
|
max_len Max length to send to controller
|
||||||
================ ======================================================
|
================ ======================================================
|
||||||
|
|
||||||
Example::
|
Example::
|
||||||
|
|
||||||
actions += [parser.NXActionOutputReg(start=8080,
|
actions += [parser.NXActionOutputReg2(
|
||||||
end=10,
|
ofs_nbits=nicira_ext.ofs_nbits(4, 31),
|
||||||
src="reg0",
|
src="reg0",
|
||||||
max_len=1024)]
|
max_len=1024)]
|
||||||
"""
|
"""
|
||||||
_subtype = nicira_ext.NXAST_OUTPUT_REG2
|
_subtype = nicira_ext.NXAST_OUTPUT_REG2
|
||||||
|
|
||||||
# start, end, src, max_len
|
# ofs_nbits, src, max_len
|
||||||
_fmt_str = '!HH4s'
|
_fmt_str = '!HH4s'
|
||||||
_TYPE = {
|
_TYPE = {
|
||||||
'ascii': [
|
'ascii': [
|
||||||
@ -982,14 +961,12 @@ def generate(ofp_name, ofpp_name):
|
|||||||
}
|
}
|
||||||
|
|
||||||
def __init__(self,
|
def __init__(self,
|
||||||
start,
|
ofs_nbits,
|
||||||
end,
|
|
||||||
src,
|
src,
|
||||||
max_len,
|
max_len,
|
||||||
type_=None, len_=None, experimenter=None, subtype=None):
|
type_=None, len_=None, experimenter=None, subtype=None):
|
||||||
super(NXActionOutputReg2, self).__init__()
|
super(NXActionOutputReg2, self).__init__()
|
||||||
self.start = start
|
self.ofs_nbits = ofs_nbits
|
||||||
self.end = end
|
|
||||||
self.src = src
|
self.src = src
|
||||||
self.max_len = max_len
|
self.max_len = max_len
|
||||||
|
|
||||||
@ -999,23 +976,19 @@ def generate(ofp_name, ofpp_name):
|
|||||||
max_len,
|
max_len,
|
||||||
oxm_data) = struct.unpack_from(
|
oxm_data) = struct.unpack_from(
|
||||||
cls._fmt_str, buf, 0)
|
cls._fmt_str, buf, 0)
|
||||||
start = ofs_nbits >> 6
|
|
||||||
end = (ofs_nbits & 0x3f) + start
|
|
||||||
(n, len_) = ofp.oxm_parse_header(oxm_data, 0)
|
(n, len_) = ofp.oxm_parse_header(oxm_data, 0)
|
||||||
src = ofp.oxm_to_user_header(n)
|
src = ofp.oxm_to_user_header(n)
|
||||||
return cls(start,
|
return cls(ofs_nbits,
|
||||||
end,
|
|
||||||
src,
|
src,
|
||||||
max_len)
|
max_len)
|
||||||
|
|
||||||
def serialize_body(self):
|
def serialize_body(self):
|
||||||
data = bytearray()
|
data = bytearray()
|
||||||
oxm_data = bytearray()
|
oxm_data = bytearray()
|
||||||
ofs_nbits = (self.start << 6) + (self.end - self.start)
|
|
||||||
oxm = ofp.oxm_from_user_header(self.src)
|
oxm = ofp.oxm_from_user_header(self.src)
|
||||||
ofp.oxm_serialize_header(oxm, oxm_data, 0),
|
ofp.oxm_serialize_header(oxm, oxm_data, 0),
|
||||||
msg_pack_into(self._fmt_str, data, 0,
|
msg_pack_into(self._fmt_str, data, 0,
|
||||||
ofs_nbits,
|
self.ofs_nbits,
|
||||||
self.max_len,
|
self.max_len,
|
||||||
six.binary_type(oxm_data))
|
six.binary_type(oxm_data))
|
||||||
offset = len(data)
|
offset = len(data)
|
||||||
@ -2394,8 +2367,8 @@ def generate(ofp_name, ofpp_name):
|
|||||||
algorithm One of NX_MP_ALG_*.
|
algorithm One of NX_MP_ALG_*.
|
||||||
max_link Number of output links
|
max_link Number of output links
|
||||||
arg Algorithm-specific argument
|
arg Algorithm-specific argument
|
||||||
start Start bit for source field
|
ofs_nbits Start and End for the OXM/NXM field.
|
||||||
end End bit for source field
|
Setting method refer to the ``nicira_ext.ofs_nbits``
|
||||||
dst OXM/NXM header for source field
|
dst OXM/NXM header for source field
|
||||||
================ ======================================================
|
================ ======================================================
|
||||||
|
|
||||||
@ -2407,8 +2380,7 @@ def generate(ofp_name, ofpp_name):
|
|||||||
algorithm=nicira_ext.NX_MP_ALG_HRW,
|
algorithm=nicira_ext.NX_MP_ALG_HRW,
|
||||||
max_link=5,
|
max_link=5,
|
||||||
arg=0,
|
arg=0,
|
||||||
start=4,
|
ofs_nbits=nicira_ext.ofs_nbits(4, 31),
|
||||||
end=31,
|
|
||||||
dst="reg2")]
|
dst="reg2")]
|
||||||
"""
|
"""
|
||||||
_subtype = nicira_ext.NXAST_MULTIPATH
|
_subtype = nicira_ext.NXAST_MULTIPATH
|
||||||
@ -2428,8 +2400,7 @@ def generate(ofp_name, ofpp_name):
|
|||||||
algorithm,
|
algorithm,
|
||||||
max_link,
|
max_link,
|
||||||
arg,
|
arg,
|
||||||
start,
|
ofs_nbits,
|
||||||
end,
|
|
||||||
dst,
|
dst,
|
||||||
type_=None, len_=None, experimenter=None, subtype=None):
|
type_=None, len_=None, experimenter=None, subtype=None):
|
||||||
super(NXActionMultipath, self).__init__()
|
super(NXActionMultipath, self).__init__()
|
||||||
@ -2438,8 +2409,7 @@ def generate(ofp_name, ofpp_name):
|
|||||||
self.algorithm = algorithm
|
self.algorithm = algorithm
|
||||||
self.max_link = max_link
|
self.max_link = max_link
|
||||||
self.arg = arg
|
self.arg = arg
|
||||||
self.start = start
|
self.ofs_nbits = ofs_nbits
|
||||||
self.end = end
|
|
||||||
self.dst = dst
|
self.dst = dst
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
@ -2452,8 +2422,6 @@ def generate(ofp_name, ofpp_name):
|
|||||||
ofs_nbits,
|
ofs_nbits,
|
||||||
oxm_data) = struct.unpack_from(
|
oxm_data) = struct.unpack_from(
|
||||||
cls._fmt_str, buf, 0)
|
cls._fmt_str, buf, 0)
|
||||||
start = ofs_nbits >> 6
|
|
||||||
end = (ofs_nbits & 0x3f) + start
|
|
||||||
(n, len_) = ofp.oxm_parse_header(oxm_data, 0)
|
(n, len_) = ofp.oxm_parse_header(oxm_data, 0)
|
||||||
dst = ofp.oxm_to_user_header(n)
|
dst = ofp.oxm_to_user_header(n)
|
||||||
return cls(fields,
|
return cls(fields,
|
||||||
@ -2461,14 +2429,12 @@ def generate(ofp_name, ofpp_name):
|
|||||||
algorithm,
|
algorithm,
|
||||||
max_link,
|
max_link,
|
||||||
arg,
|
arg,
|
||||||
start,
|
ofs_nbits,
|
||||||
end,
|
|
||||||
dst)
|
dst)
|
||||||
|
|
||||||
def serialize_body(self):
|
def serialize_body(self):
|
||||||
data = bytearray()
|
data = bytearray()
|
||||||
dst = bytearray()
|
dst = bytearray()
|
||||||
ofs_nbits = (self.start << 6) + (self.end - self.start)
|
|
||||||
oxm = ofp.oxm_from_user_header(self.dst)
|
oxm = ofp.oxm_from_user_header(self.dst)
|
||||||
ofp.oxm_serialize_header(oxm, dst, 0),
|
ofp.oxm_serialize_header(oxm, dst, 0),
|
||||||
msg_pack_into(self._fmt_str, data, 0,
|
msg_pack_into(self._fmt_str, data, 0,
|
||||||
@ -2477,7 +2443,7 @@ def generate(ofp_name, ofpp_name):
|
|||||||
self.algorithm,
|
self.algorithm,
|
||||||
self.max_link,
|
self.max_link,
|
||||||
self.arg,
|
self.arg,
|
||||||
ofs_nbits,
|
self.ofs_nbits,
|
||||||
six.binary_type(dst))
|
six.binary_type(dst))
|
||||||
|
|
||||||
return data
|
return data
|
||||||
@ -2488,7 +2454,7 @@ def generate(ofp_name, ofpp_name):
|
|||||||
_fmt_str = '!HHHIHH'
|
_fmt_str = '!HHHIHH'
|
||||||
|
|
||||||
def __init__(self, algorithm, fields, basis, slave_type, n_slaves,
|
def __init__(self, algorithm, fields, basis, slave_type, n_slaves,
|
||||||
start, end, dst, slaves):
|
ofs_nbits, dst, slaves):
|
||||||
super(_NXActionBundleBase, self).__init__()
|
super(_NXActionBundleBase, self).__init__()
|
||||||
self.len = utils.round_up(
|
self.len = utils.round_up(
|
||||||
nicira_ext.NX_ACTION_BUNDLE_0_SIZE + len(slaves) * 2, 8)
|
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.basis = basis
|
||||||
self.slave_type = slave_type
|
self.slave_type = slave_type
|
||||||
self.n_slaves = n_slaves
|
self.n_slaves = n_slaves
|
||||||
self.start = start
|
self.ofs_nbits = ofs_nbits
|
||||||
self.end = end
|
|
||||||
self.dst = dst
|
self.dst = dst
|
||||||
|
|
||||||
assert isinstance(slaves, (list, tuple))
|
assert isinstance(slaves, (list, tuple))
|
||||||
@ -2514,8 +2479,6 @@ def generate(ofp_name, ofpp_name):
|
|||||||
(algorithm, fields, basis,
|
(algorithm, fields, basis,
|
||||||
slave_type, n_slaves, ofs_nbits, dst) = struct.unpack_from(
|
slave_type, n_slaves, ofs_nbits, dst) = struct.unpack_from(
|
||||||
cls._fmt_str + 'I', buf, 0)
|
cls._fmt_str + 'I', buf, 0)
|
||||||
start = ofs_nbits >> 6
|
|
||||||
end = (ofs_nbits & 0x3f) + start
|
|
||||||
|
|
||||||
offset = (nicira_ext.NX_ACTION_BUNDLE_0_SIZE -
|
offset = (nicira_ext.NX_ACTION_BUNDLE_0_SIZE -
|
||||||
nicira_ext.NX_ACTION_HEADER_0_SIZE - 8)
|
nicira_ext.NX_ACTION_HEADER_0_SIZE - 8)
|
||||||
@ -2534,10 +2497,9 @@ def generate(ofp_name, ofpp_name):
|
|||||||
slave_offset += 2
|
slave_offset += 2
|
||||||
|
|
||||||
return cls(algorithm, fields, basis, slave_type,
|
return cls(algorithm, fields, basis, slave_type,
|
||||||
n_slaves, start, end, dst, slaves)
|
n_slaves, ofs_nbits, dst, slaves)
|
||||||
|
|
||||||
def serialize_body(self):
|
def serialize_body(self):
|
||||||
ofs_nbits = (self.start << 6) + (self.end - self.start)
|
|
||||||
data = bytearray()
|
data = bytearray()
|
||||||
slave_offset = (nicira_ext.NX_ACTION_BUNDLE_0_SIZE -
|
slave_offset = (nicira_ext.NX_ACTION_BUNDLE_0_SIZE -
|
||||||
nicira_ext.NX_ACTION_HEADER_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,
|
msg_pack_into(self._fmt_str, data, 0,
|
||||||
self.algorithm, self.fields, self.basis,
|
self.algorithm, self.fields, self.basis,
|
||||||
self.slave_type, self.n_slaves,
|
self.slave_type, self.n_slaves,
|
||||||
ofs_nbits)
|
self.ofs_nbits)
|
||||||
offset = (nicira_ext.NX_ACTION_BUNDLE_0_SIZE -
|
offset = (nicira_ext.NX_ACTION_BUNDLE_0_SIZE -
|
||||||
nicira_ext.NX_ACTION_HEADER_0_SIZE - 8)
|
nicira_ext.NX_ACTION_HEADER_0_SIZE - 8)
|
||||||
|
|
||||||
@ -2591,8 +2553,7 @@ def generate(ofp_name, ofpp_name):
|
|||||||
basis Universal hash parameter
|
basis Universal hash parameter
|
||||||
slave_type Type of slaves(must be NXM_OF_IN_PORT)
|
slave_type Type of slaves(must be NXM_OF_IN_PORT)
|
||||||
n_slaves Number of slaves
|
n_slaves Number of slaves
|
||||||
start Start bit for source field(must be zero)
|
ofs_nbits Start and End for the OXM/NXM field. (must be zero)
|
||||||
end End bit for source field(must be zero)
|
|
||||||
dst OXM/NXM header for source field(must be zero)
|
dst OXM/NXM header for source field(must be zero)
|
||||||
slaves List of slaves
|
slaves List of slaves
|
||||||
================ ======================================================
|
================ ======================================================
|
||||||
@ -2606,19 +2567,18 @@ def generate(ofp_name, ofpp_name):
|
|||||||
basis=0,
|
basis=0,
|
||||||
slave_type=nicira_ext.NXM_OF_IN_PORT,
|
slave_type=nicira_ext.NXM_OF_IN_PORT,
|
||||||
n_slaves=2,
|
n_slaves=2,
|
||||||
start=0,
|
ofs_nbits=0,
|
||||||
end=0,
|
|
||||||
dst=0,
|
dst=0,
|
||||||
slaves=[2, 3])]
|
slaves=[2, 3])]
|
||||||
"""
|
"""
|
||||||
_subtype = nicira_ext.NXAST_BUNDLE
|
_subtype = nicira_ext.NXAST_BUNDLE
|
||||||
|
|
||||||
def __init__(self, algorithm, fields, basis, slave_type, n_slaves,
|
def __init__(self, algorithm, fields, basis, slave_type, n_slaves,
|
||||||
start, end, dst, slaves):
|
ofs_nbits, dst, slaves):
|
||||||
# NXAST_BUNDLE actions should have 'start' 'end' and 'dst' zeroed.
|
# NXAST_BUNDLE actions should have 'sofs_nbits' and 'dst' zeroed.
|
||||||
super(NXActionBundle, self).__init__(
|
super(NXActionBundle, self).__init__(
|
||||||
algorithm, fields, basis, slave_type, n_slaves,
|
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):
|
class NXActionBundleLoad(_NXActionBundleBase):
|
||||||
"""
|
"""
|
||||||
@ -2632,12 +2592,13 @@ def generate(ofp_name, ofpp_name):
|
|||||||
|
|
||||||
..
|
..
|
||||||
bundle_load(fields, basis, algorithm, slave_type,
|
bundle_load(fields, basis, algorithm, slave_type,
|
||||||
slaves:[ s1, s2,...])
|
dst[start..end], slaves:[ s1, s2,...])
|
||||||
..
|
..
|
||||||
|
|
||||||
+-----------------------------------------------------------+
|
+-----------------------------------------------------------+
|
||||||
| **bundle_load(**\ *fields*\, \ *basis*\, \ *algorithm*\, |
|
| **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
|
basis Universal hash parameter
|
||||||
slave_type Type of slaves(must be NXM_OF_IN_PORT)
|
slave_type Type of slaves(must be NXM_OF_IN_PORT)
|
||||||
n_slaves Number of slaves
|
n_slaves Number of slaves
|
||||||
start Start bit for source field
|
ofs_nbits Start and End for the OXM/NXM field.
|
||||||
end End bit for source field
|
Setting method refer to the ``nicira_ext.ofs_nbits``
|
||||||
dst OXM/NXM header for source field
|
dst OXM/NXM header for source field
|
||||||
slaves List of slaves
|
slaves List of slaves
|
||||||
================ ======================================================
|
================ ======================================================
|
||||||
@ -2663,8 +2624,7 @@ def generate(ofp_name, ofpp_name):
|
|||||||
basis=0,
|
basis=0,
|
||||||
slave_type=nicira_ext.NXM_OF_IN_PORT,
|
slave_type=nicira_ext.NXM_OF_IN_PORT,
|
||||||
n_slaves=2,
|
n_slaves=2,
|
||||||
start=4,
|
ofs_nbits=nicira_ext.ofs_nbits(4, 31),
|
||||||
end=31,
|
|
||||||
dst="reg0",
|
dst="reg0",
|
||||||
slaves=[2, 3])]
|
slaves=[2, 3])]
|
||||||
"""
|
"""
|
||||||
@ -2676,10 +2636,10 @@ def generate(ofp_name, ofpp_name):
|
|||||||
}
|
}
|
||||||
|
|
||||||
def __init__(self, algorithm, fields, basis, slave_type, n_slaves,
|
def __init__(self, algorithm, fields, basis, slave_type, n_slaves,
|
||||||
start, end, dst, slaves):
|
ofs_nbits, dst, slaves):
|
||||||
super(NXActionBundleLoad, self).__init__(
|
super(NXActionBundleLoad, self).__init__(
|
||||||
algorithm, fields, basis, slave_type, n_slaves,
|
algorithm, fields, basis, slave_type, n_slaves,
|
||||||
start, end, dst, slaves)
|
ofs_nbits, dst, slaves)
|
||||||
|
|
||||||
class NXActionCT(NXAction):
|
class NXActionCT(NXAction):
|
||||||
"""
|
"""
|
||||||
@ -2702,8 +2662,10 @@ def generate(ofp_name, ofpp_name):
|
|||||||
================ ======================================================
|
================ ======================================================
|
||||||
flags Zero or more(Unspecified flag bits must be zero.)
|
flags Zero or more(Unspecified flag bits must be zero.)
|
||||||
zone_src OXM/NXM header for source field
|
zone_src OXM/NXM header for source field
|
||||||
zone_start Start bit for source field
|
zone_ofs_nbits Start and End for the OXM/NXM field.
|
||||||
zone_end End bit for source 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
|
recirc_table Recirculate to a specific table
|
||||||
alg Well-known port number for the protocol
|
alg Well-known port number for the protocol
|
||||||
actions Zero or more actions may immediately follow this
|
actions Zero or more actions may immediately follow this
|
||||||
@ -2713,10 +2675,10 @@ def generate(ofp_name, ofpp_name):
|
|||||||
Example::
|
Example::
|
||||||
|
|
||||||
match = parser.OFPMatch(eth_type=0x0800, ct_state=(0,32))
|
match = parser.OFPMatch(eth_type=0x0800, ct_state=(0,32))
|
||||||
actions += [parser.NXActionCT(flags = 1,
|
actions += [parser.NXActionCT(
|
||||||
|
flags = 1,
|
||||||
zone_src = 0,
|
zone_src = 0,
|
||||||
zone_start = 0,
|
zone_ofs_nbits = 0,
|
||||||
zone_end = 0,
|
|
||||||
recirc_table = 4,
|
recirc_table = 4,
|
||||||
alg = 0,
|
alg = 0,
|
||||||
actions = [])]
|
actions = [])]
|
||||||
@ -2731,8 +2693,7 @@ def generate(ofp_name, ofpp_name):
|
|||||||
def __init__(self,
|
def __init__(self,
|
||||||
flags,
|
flags,
|
||||||
zone_src,
|
zone_src,
|
||||||
zone_start,
|
zone_ofs_nbits,
|
||||||
zone_end,
|
|
||||||
recirc_table,
|
recirc_table,
|
||||||
alg,
|
alg,
|
||||||
actions,
|
actions,
|
||||||
@ -2740,8 +2701,7 @@ def generate(ofp_name, ofpp_name):
|
|||||||
super(NXActionCT, self).__init__()
|
super(NXActionCT, self).__init__()
|
||||||
self.flags = flags
|
self.flags = flags
|
||||||
self.zone_src = zone_src
|
self.zone_src = zone_src
|
||||||
self.zone_start = zone_start
|
self.zone_ofs_nbits = zone_ofs_nbits
|
||||||
self.zone_end = zone_end
|
|
||||||
self.recirc_table = recirc_table
|
self.recirc_table = recirc_table
|
||||||
self.alg = alg
|
self.alg = alg
|
||||||
self.actions = actions
|
self.actions = actions
|
||||||
@ -2754,8 +2714,6 @@ def generate(ofp_name, ofpp_name):
|
|||||||
recirc_table,
|
recirc_table,
|
||||||
alg,) = struct.unpack_from(
|
alg,) = struct.unpack_from(
|
||||||
cls._fmt_str, buf, 0)
|
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):]
|
rest = buf[struct.calcsize(cls._fmt_str):]
|
||||||
# actions
|
# actions
|
||||||
actions = []
|
actions = []
|
||||||
@ -2764,17 +2722,15 @@ def generate(ofp_name, ofpp_name):
|
|||||||
actions.append(action)
|
actions.append(action)
|
||||||
rest = rest[action.len:]
|
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)
|
alg, actions)
|
||||||
|
|
||||||
def serialize_body(self):
|
def serialize_body(self):
|
||||||
zone_ofs_nbits = ((self.zone_start << 6) +
|
|
||||||
(self.zone_end - self.zone_start))
|
|
||||||
data = bytearray()
|
data = bytearray()
|
||||||
msg_pack_into(self._fmt_str, data, 0,
|
msg_pack_into(self._fmt_str, data, 0,
|
||||||
self.flags,
|
self.flags,
|
||||||
self.zone_src,
|
self.zone_src,
|
||||||
zone_ofs_nbits,
|
self.zone_ofs_nbits,
|
||||||
self.recirc_table,
|
self.recirc_table,
|
||||||
self.alg)
|
self.alg)
|
||||||
for a in self.actions:
|
for a in self.actions:
|
||||||
@ -2824,9 +2780,8 @@ def generate(ofp_name, ofpp_name):
|
|||||||
actions += [
|
actions += [
|
||||||
parser.NXActionCT(
|
parser.NXActionCT(
|
||||||
flags = 1,
|
flags = 1,
|
||||||
zone_src = 0,
|
zone_src = "reg0",
|
||||||
zone_start = 0,
|
zone_ofs_nbits = nicira_ext.ofs_nbits(4, 31),
|
||||||
zone_end = 0,
|
|
||||||
recirc_table = 255,
|
recirc_table = 255,
|
||||||
alg = 0,
|
alg = 0,
|
||||||
actions = [
|
actions = [
|
||||||
|
@ -21,8 +21,7 @@
|
|||||||
"recirc_table": 4,
|
"recirc_table": 4,
|
||||||
"subtype": 35,
|
"subtype": 35,
|
||||||
"type": 65535,
|
"type": 65535,
|
||||||
"zone_start": 0,
|
"zone_ofs_nbits": 0,
|
||||||
"zone_end": 0,
|
|
||||||
"zone_src": 0
|
"zone_src": 0
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -35,8 +35,7 @@
|
|||||||
"recirc_table": 255,
|
"recirc_table": 255,
|
||||||
"subtype": 35,
|
"subtype": 35,
|
||||||
"type": 65535,
|
"type": 65535,
|
||||||
"zone_start": 0,
|
"zone_ofs_nbits": 0,
|
||||||
"zone_end": 0,
|
|
||||||
"zone_src": 0
|
"zone_src": 0
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -37,8 +37,7 @@
|
|||||||
"recirc_table": 255,
|
"recirc_table": 255,
|
||||||
"subtype": 35,
|
"subtype": 35,
|
||||||
"type": 65535,
|
"type": 65535,
|
||||||
"zone_start": 0,
|
"zone_ofs_nbits": 0,
|
||||||
"zone_end": 0,
|
|
||||||
"zone_src": 0
|
"zone_src": 0
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -37,8 +37,7 @@
|
|||||||
"recirc_table": 255,
|
"recirc_table": 255,
|
||||||
"subtype": 35,
|
"subtype": 35,
|
||||||
"type": 65535,
|
"type": 65535,
|
||||||
"zone_start": 0,
|
"zone_ofs_nbits": 0,
|
||||||
"zone_end": 0,
|
|
||||||
"zone_src": 0
|
"zone_src": 0
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -16,8 +16,7 @@
|
|||||||
"dst": "reg0",
|
"dst": "reg0",
|
||||||
"experimenter": 8992,
|
"experimenter": 8992,
|
||||||
"len": 24,
|
"len": 24,
|
||||||
"end": 31,
|
"ofs_nbits": 283,
|
||||||
"start": 4,
|
|
||||||
"subtype": 7,
|
"subtype": 7,
|
||||||
"type": 65535,
|
"type": 65535,
|
||||||
"value": 233495534
|
"value": 233495534
|
||||||
|
@ -13,14 +13,13 @@
|
|||||||
"actions": [
|
"actions": [
|
||||||
{
|
{
|
||||||
"NXActionRegMove": {
|
"NXActionRegMove": {
|
||||||
"dst_end": 5,
|
|
||||||
"dst_field": "reg1",
|
"dst_field": "reg1",
|
||||||
"dst_start": 0,
|
"dst_ofs": 0,
|
||||||
"experimenter": 8992,
|
"experimenter": 8992,
|
||||||
"len": 24,
|
"len": 24,
|
||||||
"src_end": 15,
|
"n_bits": 6,
|
||||||
"src_field": "reg0",
|
"src_field": "reg0",
|
||||||
"src_start": 10,
|
"src_ofs": 10,
|
||||||
"subtype": 6,
|
"subtype": 6,
|
||||||
"type": 65535
|
"type": 65535
|
||||||
}
|
}
|
||||||
|
@ -1391,10 +1391,6 @@ class TestNXActionRegMove(unittest.TestCase):
|
|||||||
dst_ofs = {'buf': b'\xdc\x67', 'val': 56423}
|
dst_ofs = {'buf': b'\xdc\x67', 'val': 56423}
|
||||||
src_field = {'buf': b'\x00\x01\x00\x04', 'val': "reg0", "val2": 65540}
|
src_field = {'buf': b'\x00\x01\x00\x04', 'val': "reg0", "val2": 65540}
|
||||||
dst_field = {'buf': b'\x00\x01\x02\x04', 'val': "reg1", "val2": 66052}
|
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'] \
|
buf = type_['buf'] \
|
||||||
+ len_['buf'] \
|
+ len_['buf'] \
|
||||||
@ -1407,11 +1403,10 @@ class TestNXActionRegMove(unittest.TestCase):
|
|||||||
+ dst_field['buf']
|
+ dst_field['buf']
|
||||||
|
|
||||||
c = NXActionRegMove(src_field['val'],
|
c = NXActionRegMove(src_field['val'],
|
||||||
src_start,
|
|
||||||
src_end,
|
|
||||||
dst_field['val'],
|
dst_field['val'],
|
||||||
dst_start,
|
n_bits['val'],
|
||||||
dst_end)
|
src_ofs['val'],
|
||||||
|
dst_ofs['val'])
|
||||||
|
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
pass
|
pass
|
||||||
@ -1422,23 +1417,21 @@ class TestNXActionRegMove(unittest.TestCase):
|
|||||||
def test_init(self):
|
def test_init(self):
|
||||||
eq_(self.subtype['val'], self.c.subtype)
|
eq_(self.subtype['val'], self.c.subtype)
|
||||||
eq_(self.src_field['val'], self.c.src_field)
|
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_field['val'], self.c.dst_field)
|
||||||
eq_(self.dst_start, self.c.dst_start)
|
eq_(self.n_bits['val'], self.c.n_bits)
|
||||||
eq_(self.dst_end, self.c.dst_end)
|
eq_(self.src_field['val'], self.c.src_field)
|
||||||
|
eq_(self.dst_field['val'], self.c.dst_field)
|
||||||
|
|
||||||
def test_parser(self):
|
def test_parser(self):
|
||||||
res = OFPActionVendor.parser(self.buf, 0)
|
res = OFPActionVendor.parser(self.buf, 0)
|
||||||
eq_(self.type_['val'], res.type)
|
eq_(self.type_['val'], res.type)
|
||||||
eq_(self.len_['val'], res.len)
|
eq_(self.len_['val'], res.len)
|
||||||
eq_(self.subtype['val'], res.subtype)
|
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_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_field['val'], res.dst_field)
|
||||||
eq_(self.dst_start, res.dst_start)
|
|
||||||
eq_(self.dst_end, res.dst_end)
|
|
||||||
|
|
||||||
def test_serialize(self):
|
def test_serialize(self):
|
||||||
buf = bytearray()
|
buf = bytearray()
|
||||||
@ -1485,8 +1478,7 @@ class TestNXActionRegLoad(unittest.TestCase):
|
|||||||
+ dst['buf'] \
|
+ dst['buf'] \
|
||||||
+ value['buf']
|
+ value['buf']
|
||||||
|
|
||||||
c = NXActionRegLoad(start,
|
c = NXActionRegLoad(ofs_nbits['val'],
|
||||||
end,
|
|
||||||
dst['val'],
|
dst['val'],
|
||||||
value['val'])
|
value['val'])
|
||||||
|
|
||||||
@ -1498,8 +1490,7 @@ class TestNXActionRegLoad(unittest.TestCase):
|
|||||||
|
|
||||||
def test_init(self):
|
def test_init(self):
|
||||||
eq_(self.subtype['val'], self.c.subtype)
|
eq_(self.subtype['val'], self.c.subtype)
|
||||||
eq_(self.start, self.c.start)
|
eq_(self.ofs_nbits['val'], self.c.ofs_nbits)
|
||||||
eq_(self.end, self.c.end)
|
|
||||||
eq_(self.dst['val'], self.c.dst)
|
eq_(self.dst['val'], self.c.dst)
|
||||||
eq_(self.value['val'], self.c.value)
|
eq_(self.value['val'], self.c.value)
|
||||||
|
|
||||||
@ -1507,8 +1498,7 @@ class TestNXActionRegLoad(unittest.TestCase):
|
|||||||
res = OFPActionVendor.parser(self.buf, 0)
|
res = OFPActionVendor.parser(self.buf, 0)
|
||||||
eq_(self.type_['val'], res.type)
|
eq_(self.type_['val'], res.type)
|
||||||
eq_(self.len_['val'], res.len)
|
eq_(self.len_['val'], res.len)
|
||||||
eq_(self.start, self.c.start)
|
eq_(self.ofs_nbits['val'], self.c.ofs_nbits)
|
||||||
eq_(self.end, self.c.end)
|
|
||||||
eq_(self.dst['val'], res.dst)
|
eq_(self.dst['val'], res.dst)
|
||||||
eq_(self.value['val'], res.value)
|
eq_(self.value['val'], res.value)
|
||||||
|
|
||||||
@ -1626,8 +1616,7 @@ class TestNXActionMultipath(unittest.TestCase):
|
|||||||
algorithm['val'],
|
algorithm['val'],
|
||||||
max_link['val'],
|
max_link['val'],
|
||||||
arg['val'],
|
arg['val'],
|
||||||
start,
|
ofs_nbits['val'],
|
||||||
end,
|
|
||||||
dst['val'])
|
dst['val'])
|
||||||
|
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
@ -1643,8 +1632,7 @@ class TestNXActionMultipath(unittest.TestCase):
|
|||||||
eq_(self.algorithm['val'], self.c.algorithm)
|
eq_(self.algorithm['val'], self.c.algorithm)
|
||||||
eq_(self.max_link['val'], self.c.max_link)
|
eq_(self.max_link['val'], self.c.max_link)
|
||||||
eq_(self.arg['val'], self.c.arg)
|
eq_(self.arg['val'], self.c.arg)
|
||||||
eq_(self.start, self.c.start)
|
eq_(self.ofs_nbits['val'], self.c.ofs_nbits)
|
||||||
eq_(self.end, self.c.end)
|
|
||||||
eq_(self.dst['val'], self.c.dst)
|
eq_(self.dst['val'], self.c.dst)
|
||||||
|
|
||||||
def test_parser(self):
|
def test_parser(self):
|
||||||
@ -1657,8 +1645,7 @@ class TestNXActionMultipath(unittest.TestCase):
|
|||||||
eq_(self.algorithm['val'], res.algorithm)
|
eq_(self.algorithm['val'], res.algorithm)
|
||||||
eq_(self.max_link['val'], res.max_link)
|
eq_(self.max_link['val'], res.max_link)
|
||||||
eq_(self.arg['val'], res.arg)
|
eq_(self.arg['val'], res.arg)
|
||||||
eq_(self.start, res.start)
|
eq_(self.ofs_nbits['val'], res.ofs_nbits)
|
||||||
eq_(self.end, res.end)
|
|
||||||
eq_(self.dst['val'], res.dst)
|
eq_(self.dst['val'], res.dst)
|
||||||
|
|
||||||
def test_serialize(self):
|
def test_serialize(self):
|
||||||
@ -1705,8 +1692,6 @@ class TestNXActionBundle(unittest.TestCase):
|
|||||||
|
|
||||||
slaves_buf = (b'\x00\x01', b'\x00\x02')
|
slaves_buf = (b'\x00\x01', b'\x00\x02')
|
||||||
slaves_val = (1, 2)
|
slaves_val = (1, 2)
|
||||||
start = 0
|
|
||||||
end = 0
|
|
||||||
|
|
||||||
_len = len_['val'] + len(slaves_val) * 2
|
_len = len_['val'] + len(slaves_val) * 2
|
||||||
_len += (_len % 8)
|
_len += (_len % 8)
|
||||||
@ -1731,8 +1716,7 @@ class TestNXActionBundle(unittest.TestCase):
|
|||||||
basis['val'],
|
basis['val'],
|
||||||
slave_type['val'],
|
slave_type['val'],
|
||||||
n_slaves['val'],
|
n_slaves['val'],
|
||||||
start,
|
ofs_nbits['val'],
|
||||||
end,
|
|
||||||
dst['val'],
|
dst['val'],
|
||||||
slaves_val)
|
slaves_val)
|
||||||
|
|
||||||
@ -1749,8 +1733,7 @@ class TestNXActionBundle(unittest.TestCase):
|
|||||||
eq_(self.basis['val'], self.c.basis)
|
eq_(self.basis['val'], self.c.basis)
|
||||||
eq_(self.slave_type['val'], self.c.slave_type)
|
eq_(self.slave_type['val'], self.c.slave_type)
|
||||||
eq_(self.n_slaves['val'], self.c.n_slaves)
|
eq_(self.n_slaves['val'], self.c.n_slaves)
|
||||||
eq_(self.start, self.c.start)
|
eq_(self.ofs_nbits['val'], self.c.ofs_nbits)
|
||||||
eq_(self.end, self.c.end)
|
|
||||||
eq_(self.dst['val'], self.c.dst)
|
eq_(self.dst['val'], self.c.dst)
|
||||||
|
|
||||||
# slaves
|
# slaves
|
||||||
@ -1768,8 +1751,7 @@ class TestNXActionBundle(unittest.TestCase):
|
|||||||
eq_(self.basis['val'], res.basis)
|
eq_(self.basis['val'], res.basis)
|
||||||
eq_(self.slave_type['val'], res.slave_type)
|
eq_(self.slave_type['val'], res.slave_type)
|
||||||
eq_(self.n_slaves['val'], res.n_slaves)
|
eq_(self.n_slaves['val'], res.n_slaves)
|
||||||
eq_(self.start, res.start)
|
eq_(self.ofs_nbits['val'], res.ofs_nbits)
|
||||||
eq_(self.end, res.end)
|
|
||||||
eq_(self.dst['val'], res.dst)
|
eq_(self.dst['val'], res.dst)
|
||||||
|
|
||||||
# slaves
|
# slaves
|
||||||
@ -1821,8 +1803,6 @@ class TestNXActionBundleLoad(unittest.TestCase):
|
|||||||
ofs_nbits = {'buf': b'\xd2\x9d', 'val': 53917}
|
ofs_nbits = {'buf': b'\xd2\x9d', 'val': 53917}
|
||||||
dst = {'buf': b'\x00\x01\x00\x04', 'val': "reg0", 'val2': 65540}
|
dst = {'buf': b'\x00\x01\x00\x04', 'val': "reg0", 'val2': 65540}
|
||||||
zfill = b'\x00' * 4
|
zfill = b'\x00' * 4
|
||||||
start = 842
|
|
||||||
end = 871
|
|
||||||
|
|
||||||
slaves_buf = (b'\x00\x01', b'\x00\x02')
|
slaves_buf = (b'\x00\x01', b'\x00\x02')
|
||||||
slaves_val = (1, 2)
|
slaves_val = (1, 2)
|
||||||
@ -1850,8 +1830,7 @@ class TestNXActionBundleLoad(unittest.TestCase):
|
|||||||
basis['val'],
|
basis['val'],
|
||||||
slave_type['val'],
|
slave_type['val'],
|
||||||
n_slaves['val'],
|
n_slaves['val'],
|
||||||
start,
|
ofs_nbits['val'],
|
||||||
end,
|
|
||||||
dst['val'],
|
dst['val'],
|
||||||
slaves_val)
|
slaves_val)
|
||||||
|
|
||||||
@ -1868,8 +1847,7 @@ class TestNXActionBundleLoad(unittest.TestCase):
|
|||||||
eq_(self.basis['val'], self.c.basis)
|
eq_(self.basis['val'], self.c.basis)
|
||||||
eq_(self.slave_type['val'], self.c.slave_type)
|
eq_(self.slave_type['val'], self.c.slave_type)
|
||||||
eq_(self.n_slaves['val'], self.c.n_slaves)
|
eq_(self.n_slaves['val'], self.c.n_slaves)
|
||||||
eq_(self.start, self.c.start)
|
eq_(self.ofs_nbits['val'], self.c.ofs_nbits)
|
||||||
eq_(self.end, self.c.end)
|
|
||||||
eq_(self.dst['val'], self.c.dst)
|
eq_(self.dst['val'], self.c.dst)
|
||||||
|
|
||||||
# slaves
|
# slaves
|
||||||
@ -1887,8 +1865,7 @@ class TestNXActionBundleLoad(unittest.TestCase):
|
|||||||
eq_(self.basis['val'], res.basis)
|
eq_(self.basis['val'], res.basis)
|
||||||
eq_(self.slave_type['val'], res.slave_type)
|
eq_(self.slave_type['val'], res.slave_type)
|
||||||
eq_(self.n_slaves['val'], res.n_slaves)
|
eq_(self.n_slaves['val'], res.n_slaves)
|
||||||
eq_(self.start, res.start)
|
eq_(self.ofs_nbits['val'], res.ofs_nbits)
|
||||||
eq_(self.end, res.end)
|
|
||||||
eq_(self.dst['val'], res.dst)
|
eq_(self.dst['val'], res.dst)
|
||||||
|
|
||||||
# slaves
|
# slaves
|
||||||
@ -1935,8 +1912,6 @@ class TestNXActionOutputReg(unittest.TestCase):
|
|||||||
src = {'buf': b'\x00\x01\x00\x04', 'val': "reg0", 'val2': 65540}
|
src = {'buf': b'\x00\x01\x00\x04', 'val': "reg0", 'val2': 65540}
|
||||||
max_len = {'buf': b'\x00\x08', 'val': ofproto.OFP_ACTION_OUTPUT_SIZE}
|
max_len = {'buf': b'\x00\x08', 'val': ofproto.OFP_ACTION_OUTPUT_SIZE}
|
||||||
zfill = b'\x00' * 6
|
zfill = b'\x00' * 6
|
||||||
start = 1017
|
|
||||||
end = 1073
|
|
||||||
|
|
||||||
buf = type_['buf'] \
|
buf = type_['buf'] \
|
||||||
+ len_['buf'] \
|
+ len_['buf'] \
|
||||||
@ -1947,8 +1922,7 @@ class TestNXActionOutputReg(unittest.TestCase):
|
|||||||
+ max_len['buf'] \
|
+ max_len['buf'] \
|
||||||
+ zfill
|
+ zfill
|
||||||
|
|
||||||
c = NXActionOutputReg(start,
|
c = NXActionOutputReg(ofs_nbits['val'],
|
||||||
end,
|
|
||||||
src['val'],
|
src['val'],
|
||||||
max_len['val'])
|
max_len['val'])
|
||||||
|
|
||||||
@ -1960,8 +1934,7 @@ class TestNXActionOutputReg(unittest.TestCase):
|
|||||||
|
|
||||||
def test_init(self):
|
def test_init(self):
|
||||||
eq_(self.subtype['val'], self.c.subtype)
|
eq_(self.subtype['val'], self.c.subtype)
|
||||||
eq_(self.start, self.c.start)
|
eq_(self.ofs_nbits['val'], self.c.ofs_nbits)
|
||||||
eq_(self.end, self.c.end)
|
|
||||||
eq_(self.src['val'], self.c.src)
|
eq_(self.src['val'], self.c.src)
|
||||||
eq_(self.max_len['val'], self.c.max_len)
|
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.type_['val'], res.type)
|
||||||
eq_(self.len_['val'], res.len)
|
eq_(self.len_['val'], res.len)
|
||||||
eq_(self.subtype['val'], res.subtype)
|
eq_(self.subtype['val'], res.subtype)
|
||||||
eq_(self.start, self.c.start)
|
eq_(self.ofs_nbits['val'], self.c.ofs_nbits)
|
||||||
eq_(self.end, self.c.end)
|
|
||||||
eq_(self.src['val'], res.src)
|
eq_(self.src['val'], res.src)
|
||||||
eq_(self.max_len['val'], res.max_len)
|
eq_(self.max_len['val'], res.max_len)
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user