diff options
author | FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp> | 2012-05-14 12:48:42 +0900 |
---|---|---|
committer | FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp> | 2012-05-14 12:48:42 +0900 |
commit | 17979ffefa4138098732e9da9aa408da97a3c5a5 (patch) | |
tree | 4fa3ffbd40c289771b4ec3ccc2e7289573dccbf4 | |
parent | 37b633d832fc459ea4837222c9b7db432a6eb930 (diff) |
add Nicira Extension NXAST_BUNDLE and NXAST_BUNDLE_LOAD support
Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
-rw-r--r-- | ryu/ofproto/ofproto_v1_0.py | 18 | ||||
-rw-r--r-- | ryu/ofproto/ofproto_v1_0_parser.py | 85 |
2 files changed, 98 insertions, 5 deletions
diff --git a/ryu/ofproto/ofproto_v1_0.py b/ryu/ofproto/ofproto_v1_0.py index c45f3162..b7acd5fb 100644 --- a/ryu/ofproto/ofproto_v1_0.py +++ b/ryu/ofproto/ofproto_v1_0.py @@ -238,6 +238,8 @@ NXAST_REG_MOVE = 6 NXAST_REG_LOAD = 7 NXAST_SET_TUNNEL64 = 9 NXAST_MULTIPATH = 10 +NXAST_BUNDLE = 12 +NXAST_BUNDLE_LOAD = 13 NXAST_RESUBMIT_TABLE = 14 NX_ACTION_RESUBMIT_PACK_STR = '!HHIHHB3x' @@ -264,6 +266,10 @@ NX_ACTION_MULTIPATH_PACK_STR = '!HHIHHH2xHHI2xHI' NX_ACTION_MULTIPATH_SIZE = 32 assert calcsize(NX_ACTION_MULTIPATH_PACK_STR) == NX_ACTION_MULTIPATH_SIZE +NX_ACTION_BUNDLE_PACK_STR = '!HHIHHHHIHHI4x' +NX_ACTION_BUNDLE_SIZE = 32 +assert calcsize(NX_ACTION_BUNDLE_PACK_STR) == NX_ACTION_BUNDLE_SIZE + NX_ACTION_HEADER_PACK_STR = '!HHIH' NX_ACTION_HEADER_SIZE = 10 assert calcsize(NX_ACTION_HEADER_PACK_STR) == NX_ACTION_HEADER_SIZE @@ -572,7 +578,7 @@ NXM_OF_ETH_DST_W = nxm_header_w(0x0000, 1, 6) NXM_OF_ETH_SRC = nxm_header(0x0000, 2, 6) NXM_OF_ETH_TYPE = nxm_header(0x0000, 3, 2) -NXM_OF_VLAN_TCI = nxm_header(0x0000, 4, 2) +NXM_OF_VLAN_TCI = nxm_header(0x0000, 4, 2) NXM_OF_VLAN_TCI_W = nxm_header_w(0x0000, 4, 2) NXM_OF_IP_TOS = nxm_header(0x0000, 5, 1) @@ -617,14 +623,16 @@ NXM_NX_ND_SLL = nxm_header(0x0001, 24, 6) NXM_NX_ND_TLL = nxm_header(0x0001, 25, 6) +NXM_NX_IP_ECN = nxm_header(0x0001, 28, 1) + + def nxm_nx_reg(idx): return nxm_header(0x0001, idx, 4) + def nxm_nx_reg_w(idx): return nxm_header_w(0x0001, idx, 4) -NXM_NX_IP_ECN = nxm_header(0x0001, 28, 1) - NXM_HEADER_PACK_STRING = '!I' # enum nx_hash_fields @@ -636,3 +644,7 @@ NX_MP_ALG_MODULO_N = 0 NX_MP_ALG_HASH_THRESHOLD = 1 NX_MP_ALG_HRW = 2 NX_MP_ALG_ITER_HASH = 3 + +# enum nx_bd_algorithm +NX_BD_ALG_ACTIVE_BACKUP = 0 +NX_BD_ALG_HRW = 1 diff --git a/ryu/ofproto/ofproto_v1_0_parser.py b/ryu/ofproto/ofproto_v1_0_parser.py index f345de8e..d2f8cd14 100644 --- a/ryu/ofproto/ofproto_v1_0_parser.py +++ b/ryu/ofproto/ofproto_v1_0_parser.py @@ -403,7 +403,6 @@ class NXActionHeader(object): return cls return _register_nx_action_subtype - def __init__(self, subtype_, len_): self.type = ofproto_v1_0.OFPAT_VENDOR self.len = len_ @@ -421,6 +420,7 @@ class NXActionHeader(object): cls_ = cls._NX_ACTION_SUBTYPES.get(subtype) return cls_.parser(buf, offset) + class NXActionResubmitBase(NXActionHeader): def __init__(self, subtype, in_port, table): assert subtype in (ofproto_v1_0.NXAST_RESUBMIT, @@ -481,6 +481,7 @@ class NXActionSetTunnel(NXActionHeader): ofproto_v1_0.NX_ACTION_SET_TUNNEL_PACK_STR, buf, offset) return cls(tun_id) + @NXActionHeader.register_nx_action_subtype(ofproto_v1_0.NXAST_REG_MOVE) class NXActionRegMove(NXActionHeader): def __init__(self, n_bits, src_ofs, dst_ofs, src, dst): @@ -542,7 +543,7 @@ class NXActionSetTunnel64(NXActionHeader): msg_pack_into(ofproto_v1_0.NX_ACTION_SET_TUNNEL64_PACK_STR, buf, offset, self.type, self.len, self.vendor, self.subtype, self.tun_id) - + @classmethod def parser(cls, buf, offset): type_, len_, vendor, subtype, in_port, table = struct.unpack_from( @@ -580,6 +581,86 @@ class NXActionMultipath(NXActionHeader): dst) +class NXActionBundleBase(NXActionHeader): + def __init__(self, subtype, algorithm, fields, basis, slave_type, n_slaves, + ofs_nbits, dst, slaves): + _len = ofproto_v1_0.NX_ACTION_BUNDLE_SIZE + len(slaves) * 2 + _len += (_len % 8) + super(NXActionBundleBase, self).__init__(subtype, _len) + + self.algorithm = algorithm + self.fields = fields + self.basis = basis + self.slave_type = slave_type + self.n_slaves = n_slaves + self.ofs_nbits = ofs_nbits + self.dst = dst + self.slaves = slaves + + def serialize(self, buf, offset): + slave_offset = offset + ofproto_v1_0.NX_ACTION_BUNDLE_SIZE + + for s in self.slaves: + msg_pack_into('!H', buf, slave_offset, s) + slave_offset += 2 + + pad_len = (len(self.slaves) * 2 + + ofproto_v1_0.NX_ACTION_BUNDLE_SIZE) % 8 + + if pad_len != 0: + msg_pack_into('%dx' % pad_len, buf, slave_offset) + + msg_pack_into(ofproto_v1_0.NX_ACTION_BUNDLE_PACK_STR, buf, + offset, self.type, self.len, self.vendor, self.subtype, + self.algorithm, self.fields, self.basis, + self.slave_type, self.n_slaves, + self.ofs_nbits, self.dst) + + @classmethod + def parser(cls, action_cls, buf, offset): + type_, len_, vendor, subtype, algorithm, fields, basis,\ + slave_type, n_slaves, ofs_nbits, dst = struct.unpack_from( + ofproto_v1_0.NX_ACTION_BUNDLE_PACK_STR, buf, offset) + slave_offset = offset + ofproto_v1_0.NX_ACTION_BUNDLE_SIZE + + slaves = [] + for i in range(0, n_slaves): + s = struct.unpack_from('!H', buf, slave_offset) + slaves.append(s[0]) + slave_offset += 2 + + return action_cls(algorithm, fields, basis, slave_type, + n_slaves, ofs_nbits, dst, slaves) + + +@NXActionHeader.register_nx_action_subtype(ofproto_v1_0.NXAST_BUNDLE) +class NXActionBundle(NXActionBundleBase): + def __init__(self, algorithm, fields, basis, slave_type, n_slaves, + ofs_nbits, dst, slaves): + super(NXActionBundle, self).__init__( + ofproto_v1_0.NXAST_BUNDLE, + algorithm, fields, basis, slave_type, n_slaves, + ofs_nbits, dst, slaves) + + @classmethod + def parser(cls, buf, offset): + return NXActionBundleBase.parser(NXActionBundle, buf, offset) + + +@NXActionHeader.register_nx_action_subtype(ofproto_v1_0.NXAST_BUNDLE_LOAD) +class NXActionBundleLoad(NXActionBundleBase): + def __init__(self, algorithm, fields, basis, slave_type, n_slaves, + ofs_nbits, dst, slaves): + super(NXActionBundleLoad, self).__init__( + ofproto_v1_0.NXAST_BUNDLE_LOAD, + algorithm, fields, basis, slave_type, n_slaves, + ofs_nbits, dst, slaves) + + @classmethod + def parser(cls, buf, offset): + return NXActionBundleBase.parser(NXActionBundleLoad, buf, offset) + + class OFPDescStats(collections.namedtuple('OFPDescStats', ('mfr_desc', 'hw_desc', 'sw_desc', 'serial_num', 'dp_desc'))): @classmethod |