summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorYusuke Iwase <iwase.yusuke0@gmail.com>2015-08-19 11:07:01 +0900
committerFUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>2015-08-20 18:28:40 +0900
commit742644a21de25feeb0aeb906674fefa1651c9cff (patch)
treee189605c04dc6b52772f58e5ca70309eda5807b6
parentf99d0cf84a20609fdb812d8a500d195e73879a3f (diff)
ofproto_v1_3_parser: Add OFPQueuePropExperimenter support
This patch is the implementation for the following TODO. - # TODO: add ofp_queue_prop_experimenter Signed-off-by: IWASE Yusuke <iwase.yusuke0@gmail.com> Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
-rw-r--r--ryu/ofproto/ofproto_v1_3_parser.py55
1 files changed, 38 insertions, 17 deletions
diff --git a/ryu/ofproto/ofproto_v1_3_parser.py b/ryu/ofproto/ofproto_v1_3_parser.py
index 467f3fa1..89ab05a3 100644
--- a/ryu/ofproto/ofproto_v1_3_parser.py
+++ b/ryu/ofproto/ofproto_v1_3_parser.py
@@ -5678,18 +5678,14 @@ class OFPQueueProp(OFPQueuePropHeader):
_QUEUE_PROP_PROPERTIES = {}
@staticmethod
- def register_queue_property(property_, len_):
+ def register_queue_property(property_):
def _register_queue_property(cls):
- cls.cls_property = property_
- cls.cls_len = len_
- OFPQueueProp._QUEUE_PROP_PROPERTIES[cls.cls_property] = cls
+ OFPQueueProp._QUEUE_PROP_PROPERTIES[property_] = cls
return cls
return _register_queue_property
- def __init__(self):
- cls = self.__class__
- super(OFPQueueProp, self).__init__(cls.cls_property,
- cls.cls_len)
+ def __init__(self, property_=None, len_=None):
+ super(OFPQueueProp, self).__init__(property_, len_)
@classmethod
def parser(cls, buf, offset):
@@ -5697,13 +5693,17 @@ class OFPQueueProp(OFPQueuePropHeader):
ofproto.OFP_QUEUE_PROP_HEADER_PACK_STR,
buf, offset)
cls_ = cls._QUEUE_PROP_PROPERTIES.get(property_)
- offset += ofproto.OFP_QUEUE_PROP_HEADER_SIZE
- return cls_.parser(buf, offset)
+ p = cls_.parser(buf, offset + ofproto.OFP_QUEUE_PROP_HEADER_SIZE)
+ p.property = property_
+ p.len = len_
+ if property_ == ofproto.OFPQT_EXPERIMENTER:
+ rest = buf[offset + ofproto.OFP_QUEUE_PROP_EXPERIMENTER_SIZE:
+ offset + len_]
+ p.parse_experimenter_data(rest)
+ return p
-@OFPQueueProp.register_queue_property(
- ofproto.OFPQT_MIN_RATE,
- ofproto.OFP_QUEUE_PROP_MIN_RATE_SIZE)
+@OFPQueueProp.register_queue_property(ofproto.OFPQT_MIN_RATE)
class OFPQueuePropMinRate(OFPQueueProp):
def __init__(self, rate, property_=None, len_=None):
super(OFPQueuePropMinRate, self).__init__()
@@ -5716,9 +5716,7 @@ class OFPQueuePropMinRate(OFPQueueProp):
return cls(rate)
-@OFPQueueProp.register_queue_property(
- ofproto.OFPQT_MAX_RATE,
- ofproto.OFP_QUEUE_PROP_MAX_RATE_SIZE)
+@OFPQueueProp.register_queue_property(ofproto.OFPQT_MAX_RATE)
class OFPQueuePropMaxRate(OFPQueueProp):
def __init__(self, rate, property_=None, len_=None):
super(OFPQueuePropMaxRate, self).__init__()
@@ -5731,7 +5729,30 @@ class OFPQueuePropMaxRate(OFPQueueProp):
return cls(rate)
-# TODO: add ofp_queue_prop_experimenter
+@OFPQueueProp.register_queue_property(ofproto.OFPQT_EXPERIMENTER)
+class OFPQueuePropExperimenter(OFPQueueProp):
+ _EXPERIMENTER_DATA_PACK_STR = '!B'
+ _EXPERIMENTER_DATA_SIZE = 1
+
+ def __init__(self, experimenter, data=None, property_=None, len_=None):
+ super(OFPQueuePropExperimenter, self).__init__()
+ self.experimenter = experimenter
+ self.data = data
+
+ @classmethod
+ def parser(cls, buf, offset):
+ (experimenter,) = struct.unpack_from(
+ ofproto.OFP_QUEUE_PROP_EXPERIMENTER_PACK_STR, buf, offset)
+ return cls(experimenter)
+
+ def parse_experimenter_data(self, rest):
+ data = []
+ while rest:
+ (d,) = struct.unpack_from(
+ self._EXPERIMENTER_DATA_PACK_STR, rest, 0)
+ data.append(d)
+ rest = rest[self._EXPERIMENTER_DATA_SIZE:]
+ self.data = data
class OFPPacketQueue(StringifyMixin):