diff options
author | Simon Horman <horms@verge.net.au> | 2014-01-29 12:06:21 +0900 |
---|---|---|
committer | FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp> | 2014-01-29 12:43:55 +0900 |
commit | 8daae74fa9272d61a3c79ab55a88c0f361bc17c4 (patch) | |
tree | 1b7ced4ee1d3274b397d9ec5a2732bd871e5ac60 | |
parent | 2f36dd628fcd7d535cce83f52e2e09765d5ebbe5 (diff) |
Add OF1.4 meter band drop
This will be used by meter statistics messages
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.py | 6 | ||||
-rw-r--r-- | ryu/ofproto/ofproto_v1_4_parser.py | 54 |
2 files changed, 60 insertions, 0 deletions
diff --git a/ryu/ofproto/ofproto_v1_4.py b/ryu/ofproto/ofproto_v1_4.py index 70f7b45f..acdf627e 100644 --- a/ryu/ofproto/ofproto_v1_4.py +++ b/ryu/ofproto/ofproto_v1_4.py @@ -653,6 +653,12 @@ OFPMF_PKTPS = 1 << 1 # Rate value in packet/sec. OFPMF_BURST = 1 << 2 # Do burst size. OFPMF_STATS = 1 << 3 # Collect statistics. +# struct ofp_meter_band_header +OFP_METER_BAND_HEADER_PACK_STR = '!HHII' +OFP_METER_BAND_HEADER_SIZE = 12 +assert (calcsize(OFP_METER_BAND_HEADER_PACK_STR) == + OFP_METER_BAND_HEADER_SIZE) + # struct ofp_meter_mod OFP_METER_MOD_PACK_STR = '!HHI' OFP_METER_MOD_SIZE = 16 diff --git a/ryu/ofproto/ofproto_v1_4_parser.py b/ryu/ofproto/ofproto_v1_4_parser.py index 0578c6e6..4b35a309 100644 --- a/ryu/ofproto/ofproto_v1_4_parser.py +++ b/ryu/ofproto/ofproto_v1_4_parser.py @@ -2127,6 +2127,60 @@ class OFPGroupFeaturesStatsReply(OFPMultipartReply): super(OFPGroupFeaturesStatsReply, self).__init__(datapath, **kwargs) +class OFPMeterBand(StringifyMixin): + def __init__(self, type_, len_): + super(OFPMeterBand, self).__init__() + self.type = type_ + self.len = len_ + + +class OFPMeterBandHeader(OFPMeterBand): + _METER_BAND = {} + + @staticmethod + def register_meter_band_type(type_, len_): + def _register_meter_band_type(cls): + OFPMeterBandHeader._METER_BAND[type_] = cls + cls.cls_meter_band_type = type_ + cls.cls_meter_band_len = len_ + return cls + return _register_meter_band_type + + def __init__(self): + cls = self.__class__ + super(OFPMeterBandHeader, self).__init__(cls.cls_meter_band_type, + cls.cls_meter_band_len) + + @classmethod + def parser(cls, buf, offset): + type_, len_, _rate, _burst_size = struct.unpack_from( + ofproto.OFP_METER_BAND_HEADER_PACK_STR, buf, offset) + cls_ = cls._METER_BAND[type_] + assert cls_.cls_meter_band_len == len_ + return cls_.parser(buf, offset) + + +@OFPMeterBandHeader.register_meter_band_type( + ofproto.OFPMBT_DROP, ofproto.OFP_METER_BAND_DROP_SIZE) +class OFPMeterBandDrop(OFPMeterBandHeader): + def __init__(self, rate, burst_size, type_=None, len_=None): + super(OFPMeterBandDrop, self).__init__() + self.rate = rate + self.burst_size = burst_size + + def serialize(self, buf, offset): + msg_pack_into(ofproto.OFP_METER_BAND_DROP_PACK_STR, buf, offset, + self.type, self.len, self.rate, self.burst_size) + + @classmethod + def parser(cls, buf, offset): + type_, len_, rate, burst_size = struct.unpack_from( + ofproto.OFP_METER_BAND_DROP_PACK_STR, buf, offset) + assert cls.cls_meter_band_type == type_ + assert cls.cls_meter_band_len == len_ + return cls(rate, burst_size) + + class OFPExperimenterMultipart(ofproto_parser.namedtuple( 'OFPExperimenterMultipart', ('experimenter', 'exp_type', 'data'))): |