Hey

Here we go with the MeterMod messages, still todo is:

- parsers methods for DSCP and experimenter
- OFPMeterConfigStats should parse all MeterBandTypes, not only common header
- THX for all comments in advance

>From 3fca86530024f3b7d2429a72609981e606398085 Mon Sep 17 00:00:00 2001
From: Aeschlimann Philipp <a...@zhaw.ch>
Date: Wed, 5 Jun 2013 15:16:35 +0200
Subject: [PATCH] Send MeterMod messages

Signed-off-by: Philipp Aeschlimann <a...@zhaw.ch>
---
 ryu/ofproto/ofproto_v1_3_parser.py | 88 ++++++++++++++++++++++++++++++++++++--
 1 file changed, 84 insertions(+), 4 deletions(-)

diff --git a/ryu/ofproto/ofproto_v1_3_parser.py
b/ryu/ofproto/ofproto_v1_3_parser.py
index 524994d..83fe037 100644
--- a/ryu/ofproto/ofproto_v1_3_parser.py
+++ b/ryu/ofproto/ofproto_v1_3_parser.py
@@ -1947,6 +1947,26 @@ class OFPPortMod(MsgBase):
                       ofproto_v1_3.OFP_HEADER_SIZE,
                       self.port_no, self.hw_addr, self.config,
                       self.mask, self.advertise)
+
+
+@_set_msg_type(ofproto_v1_3.OFPT_METER_MOD)
+class OFPMeterMod(MsgBase):
+    def __init__(self, datapath, command, flags, meter_id, bands):
+        super(OFPMeterMod, self).__init__(datapath)
+        self.command = command
+        self.flags = flags
+        self.meter_id = meter_id
+        self.bands = bands
+
+    def _serialize_body(self):
+        msg_pack_into(ofproto_v1_3.OFP_METER_MOD_PACK_STR, self.buf,
+                      ofproto_v1_3.OFP_HEADER_SIZE,
+                      self.command, self.flags, self.meter_id)
+
+        offset = ofproto_v1_3.OFP_METER_MOD_SIZE
+        for b in self.bands:
+            b.serialize(self.buf, offset)
+            offset += b.len


 @_set_msg_type(ofproto_v1_3.OFPT_TABLE_MOD)
@@ -2467,12 +2487,24 @@ class OFPMeterStatsReply(OFPMultipartReply):
         super(OFPMeterStatsReply, self).__init__(datapath)


-class OFPMeterBandHeader(object):
-    def __init__(self, type_, len_, rate, burst_size):
+class OFPMeterBand(object):
+    def __init__(self, type_, len_):
         self.type = type_
         self.len = len_
-        self.rate = rate
-        self.burst_size = burst_size
+
+
+class OFPMeterBandHeader(OFPMeterBand):
+    @staticmethod
+    def register_meter_band_type(type_, len_):
+        def _register_meter_band_type(cls):
+            cls.type = type_
+            cls.len = len_
+            return cls
+        return _register_meter_band_type
+
+    def __init__(self):
+        cls = self.__class__
+        super(OFPMeterBandHeader, self).__init__(cls.type, cls.len)

     @classmethod
     def parser(cls, buf, offset):
@@ -2481,6 +2513,53 @@ class OFPMeterBandHeader(object):
         return cls(*band_header)


+@OFPMeterBandHeader.register_meter_band_type(ofproto_v1_3.OFPMBT_DROP,
+
ofproto_v1_3.OFP_METER_BAND_DROP_SIZE)
+class OFPMeterBandDrop(OFPMeterBandHeader):
+    def __init__(self, rate, burst_size):
+        super(OFPMeterBandDrop, self).__init__()
+        self.rate = rate
+        self.burst_size = burst_size
+
+    def serialize(self, buf, offset):
+        msg_pack_into(ofproto_v1_3.OFP_METER_BAND_DROP_PACK_STR, buf, offset,
+                      self.type, self.len, self.rate, self.burst_size)
+
+
+@OFPMeterBandHeader.register_meter_band_type(ofproto_v1_3.OFPMBT_DSCP_REMARK,
+
ofproto_v1_3.OFP_METER_BAND_DSCP_REMARK_SIZE)
+class OFPMeterBandDscpRemark(OFPMeterBandHeader):
+    def __init__(self, rate, burst_size, prec_level):
+        super(OFPMeterBandDscpRemark, self).__init__()
+        self.rate = rate
+        self.burst_size = burst_size
+        self.prec_level = prec_level
+
+    def serialize(self, buf, offset):
+        msg_pack_into(ofproto_v1_3.OFP_METER_BAND_DSCP_REMARK_PACK_STR, buf,
+                      offset, self.type, self.len, self.rate, self.burst_size,
+                      self.prec_level)
+
+    # TODO: Add parser method here
+
+
+@OFPMeterBandHeader.register_meter_band_type(ofproto_v1_3.OFPMBT_EXPERIMENTER,
+
ofproto_v1_3.OFP_METER_BAND_EXPERIMENTER_SIZE)
+class OFPMeterBandExperimenter(OFPMeterBandHeader):
+    def __init__(self, rate, burst_size, experimenter):
+        super(OFPMeterBandDscpRemark, self).__init__()
+        self.rate = rate
+        self.burst_size = burst_size
+        self.experimenter = experimenter
+
+    def serialize(self, buf, offset):
+        msg_pack_into(ofproto_v1_3.OFP_METER_BAND_EXPERIMENTER_PACK_STR, buf,
+                      offset, self.type, self.len, self.rate, self.burst_size,
+                      self.experimenter)
+
+    # TODO: Add parser method here
+
+
 class OFPMeterConfigStats(object):
     def __init__(self):
         super(OFPMeterConfigStats, self).__init__()
@@ -2502,6 +2581,7 @@ class OFPMeterConfigStats(object):
         length = ofproto_v1_3.OFP_METER_CONFIG_SIZE
         while length < meter_config.length:
             band_header = OFPMeterBandHeader.parser(buf, offset)
+            #TODO: Parse all types of MeterBands, not only common header
             meter_config.bands.append(band_header)
             offset += band_header.len
             length += band_header.len
--
1.8.3

g *pae

--
ZHAW - Zurich University of Applied Sciences
Institute of Applied Information Technology InIT
InIT Cloud Computing Laboratory ICCLab

Philipp Aeschlimann
Researcher
Obere Kirchgasse 2
CH-8401 Winterthur

Tel. +41 58 934 6964 (intern 6964)
mailto:a...@zhaw.ch
www.zhaw.ch
www.cloudcomp.ch

GPG IDKey: 647E122E
Fingerprint: 47B7 8D8A 98D1 E91D 4B7C E261 D88C BE9E 647E 122E

------------------------------------------------------------------------------
How ServiceNow helps IT people transform IT departments:
1. A cloud service to automate IT design, transition and operations
2. Dashboards that offer high-level views of enterprise services
3. A single system of record for all IT processes
http://p.sf.net/sfu/servicenow-d2d-j
_______________________________________________
Ryu-devel mailing list
Ryu-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/ryu-devel

Reply via email to