summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorFUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>2012-05-14 12:48:42 +0900
committerFUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>2012-05-14 12:48:42 +0900
commit17979ffefa4138098732e9da9aa408da97a3c5a5 (patch)
tree4fa3ffbd40c289771b4ec3ccc2e7289573dccbf4
parent37b633d832fc459ea4837222c9b7db432a6eb930 (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.py18
-rw-r--r--ryu/ofproto/ofproto_v1_0_parser.py85
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