summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorSimon Horman <horms@verge.net.au>2014-02-24 13:07:09 +0900
committerFUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>2014-02-27 08:12:19 +0900
commitda74cda7a49391915f88c474a15484d037fda9b5 (patch)
treeb1e49f517b76fe4e0757e4e836451b892002e5e6
parenta9aa84de42091c444b9bb20c6d80f1d69ac26bf5 (diff)
of14: Add OFPPropCommonExperimenter4ByteData
There are several different experimenter properties in OF1.4 which are identical in structure. They have experimenter, exp_type and data fields. The data field is an array of 4-byte words. This patch adds OFPPropCommonExperimenter4ByteData which provides a parser and serializer for such properties and can be inherited by a subclass which implements one of the properties. This patch also uses OFPPropCommonExperimenter4ByteData to implement queue desc properties and table mod properties. It is planned to use OFPPropCommonExperimenter4ByteData to implement role properties. Signed-off-by: Simon Horman <horms@verge.net.au> Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
-rw-r--r--ryu/ofproto/ofproto_v1_4_parser.py138
1 files changed, 58 insertions, 80 deletions
diff --git a/ryu/ofproto/ofproto_v1_4_parser.py b/ryu/ofproto/ofproto_v1_4_parser.py
index 3f80d791..ac8ebb3e 100644
--- a/ryu/ofproto/ofproto_v1_4_parser.py
+++ b/ryu/ofproto/ofproto_v1_4_parser.py
@@ -788,6 +788,60 @@ class OFPPropBase(StringifyMixin):
return prop, rest
+class OFPPropCommonExperimenter4ByteData(StringifyMixin):
+ _DATA_ELEMENT_PACK_STR = '!I'
+ _PACK_STR = '!HHII'
+
+ def __init__(self, type_=None, length=None, experimenter=None,
+ exp_type=None, data=None):
+ self.type = type_
+ self.length = length
+ self.experimenter = experimenter
+ self.exp_type = exp_type
+ self.data = data
+
+ @classmethod
+ def parser(cls, buf):
+ exp = cls()
+ (exp.type, exp.length, exp.experimenter,
+ exp.exp_type) = struct.unpack_from(
+ ofproto.OFP_TABLE_MOD_PROP_EXPERIMENTER_PACK_STR, buf, 0)
+
+ # Parse trailing data, a list of 4-byte words
+ exp.data = []
+ pack_size = struct.calcsize(cls._DATA_ELEMENT_PACK_STR)
+ offset = ofproto.OFP_TABLE_MOD_PROP_EXPERIMENTER_SIZE
+ while offset < exp.length:
+ (word,) = struct.unpack_from(cls._DATA_ELEMENT_PACK_STR,
+ buf, offset)
+ exp.data.append(word)
+ offset += pack_size
+
+ return exp
+
+ def serialize(self):
+ data_buf = bytearray()
+ if len(self.data):
+ ofproto_parser.msg_pack_into('!%dI' % len(self.data),
+ data_buf, 0, *self.data)
+
+ #fixup
+ self.length = struct.calcsize(self._PACK_STR)
+ self.length += len(data_buf)
+
+ buf = bytearray()
+ msg_pack_into(self._PACK_STR, buf,
+ 0, self.type, self.length, self.experimenter,
+ self.exp_type)
+ buf += data_buf
+
+ # Pad
+ pad_len = utils.round_up(self.length, 8) - self.length
+ ofproto_parser.msg_pack_into("%dx" % pad_len, buf, len(buf))
+
+ return buf
+
+
class OFPPortProp(OFPPropBase):
_TYPES = {}
@@ -873,57 +927,8 @@ class OFPTableModPropVacancy(StringifyMixin):
@OFPTableModProp.register_type(ofproto.OFPTMPT_EXPERIMENTER)
-class OFPTableModPropExperimenter(StringifyMixin):
- _DATA_ELEMENT_PACK_STR = '!I'
-
- def __init__(self, type_=None, length=None, experimenter=None,
- exp_type=None, data=None):
- self.type = type_
- self.length = length
- self.experimenter = experimenter
- self.exp_type = exp_type
- self.data = data
-
- @classmethod
- def parser(cls, buf):
- exp = cls()
- (exp.type, exp.length, exp.experimenter,
- exp.exp_type) = struct.unpack_from(
- ofproto.OFP_TABLE_MOD_PROP_EXPERIMENTER_PACK_STR, buf, 0)
-
- # Parse trailing data, a list of 4-byte words
- exp.data = []
- pack_size = struct.calcsize(cls._DATA_ELEMENT_PACK_STR)
- offset = ofproto.OFP_TABLE_MOD_PROP_EXPERIMENTER_SIZE
- while offset < exp.length:
- (word,) = struct.unpack_from(cls._DATA_ELEMENT_PACK_STR,
- buf, offset)
- exp.data.append(word)
- offset += pack_size
-
- return exp
-
- def serialize(self):
- data_buf = bytearray()
- if len(self.data):
- ofproto_parser.msg_pack_into('!%dI' % len(self.data),
- data_buf, 0, *self.data)
-
- #fixup
- self.length = ofproto.OFP_TABLE_MOD_PROP_EXPERIMENTER_SIZE
- self.length += len(data_buf)
-
- buf = bytearray()
- msg_pack_into(ofproto.OFP_TABLE_MOD_PROP_EXPERIMENTER_PACK_STR, buf,
- 0, self.type, self.length, self.experimenter,
- self.exp_type)
- buf += data_buf
-
- # Pad
- pad_len = utils.round_up(self.length, 8) - self.length
- ofproto_parser.msg_pack_into("%dx" % pad_len, buf, len(buf))
-
- return buf
+class OFPTableModPropExperimenter(OFPPropCommonExperimenter4ByteData):
+ pass
class OFPQueueDescProp(OFPPropBase):
@@ -961,35 +966,8 @@ class OFPQueueDescPropMaxRate(StringifyMixin):
@OFPQueueDescProp.register_type(ofproto.OFPQDPT_EXPERIMENTER)
-class OFPQueueDescPropExperimenter(StringifyMixin):
- _DATA_ELEMENT_PACK_STR = '!I'
-
- def __init__(self, type_=None, length=None, experimenter=None,
- exp_type=None, data=None):
- self.type = type_
- self.length = length
- self.experimenter = experimenter
- self.exp_type = exp_type
- self.data = data
-
- @classmethod
- def parser(cls, buf):
- exp = cls()
- (exp.type, exp.length, exp.experimenter,
- exp.exp_type) = struct.unpack_from(
- ofproto.OFP_QUEUE_DESC_PROP_EXPERIMENTER_PACK_STR, buf, 0)
-
- # Parse trailing data, a list of 4-byte words
- exp.data = []
- pack_size = struct.calcsize(cls._DATA_ELEMENT_PACK_STR)
- offset = ofproto.OFP_QUEUE_DESC_PROP_EXPERIMENTER_SIZE
- while offset < exp.length:
- (word,) = struct.unpack_from(cls._DATA_ELEMENT_PACK_STR,
- buf, offset)
- exp.data.append(word)
- offset += pack_size
-
- return exp
+class OFPQueueDescPropExperimenter(OFPPropCommonExperimenter4ByteData):
+ pass
class OFPMatchField(StringifyMixin):