diff options
author | Yusuke Iwase <iwase.yusuke0@gmail.com> | 2015-08-19 11:07:01 +0900 |
---|---|---|
committer | FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp> | 2015-08-20 18:28:40 +0900 |
commit | 742644a21de25feeb0aeb906674fefa1651c9cff (patch) | |
tree | e189605c04dc6b52772f58e5ca70309eda5807b6 | |
parent | f99d0cf84a20609fdb812d8a500d195e73879a3f (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.py | 55 |
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): |