Signed-off-by: Simon Horman <[email protected]>
---
 ryu/ofproto/ofproto_v1_4.py        |  5 +++++
 ryu/ofproto/ofproto_v1_4_parser.py | 40 ++++++++++++++++++++++++++++++++++++++
 2 files changed, 45 insertions(+)

diff --git a/ryu/ofproto/ofproto_v1_4.py b/ryu/ofproto/ofproto_v1_4.py
index 49d8341..1ccd843 100644
--- a/ryu/ofproto/ofproto_v1_4.py
+++ b/ryu/ofproto/ofproto_v1_4.py
@@ -916,6 +916,11 @@ OFP_ERROR_EXPERIMENTER_MSG_SIZE = 16
 assert (calcsize(OFP_ERROR_EXPERIMENTER_MSG_PACK_STR) +
         OFP_HEADER_SIZE) == OFP_ERROR_EXPERIMENTER_MSG_SIZE
 
+# struct ofp_experimenter_header
+OFP_EXPERIMENTER_HEADER_PACK_STR = '!II'
+OFP_EXPERIMENTER_HEADER_SIZE = 16
+assert (calcsize(OFP_EXPERIMENTER_HEADER_PACK_STR) + OFP_HEADER_SIZE
+        == OFP_EXPERIMENTER_HEADER_SIZE)
 
 # enum ofp_multipart_type
 OFPMP_DESC = 0
diff --git a/ryu/ofproto/ofproto_v1_4_parser.py 
b/ryu/ofproto/ofproto_v1_4_parser.py
index 8cbe3f1..cc9c24c 100644
--- a/ryu/ofproto/ofproto_v1_4_parser.py
+++ b/ryu/ofproto/ofproto_v1_4_parser.py
@@ -333,6 +333,46 @@ class OFPFeaturesRequest(MsgBase):
 
 
 @_register_parser
+@_set_msg_type(ofproto.OFPT_EXPERIMENTER)
+class OFPExperimenter(MsgBase):
+    """
+    Experimenter extension message
+
+    ============= =========================================================
+    Attribute     Description
+    ============= =========================================================
+    experimenter  Experimenter ID
+    exp_type      Experimenter defined
+    data          Experimenter defined arbitrary additional data
+    ============= =========================================================
+    """
+    def __init__(self, datapath, experimenter=None, exp_type=None, data=None):
+        super(OFPExperimenter, self).__init__(datapath)
+        self.experimenter = experimenter
+        self.exp_type = exp_type
+        self.data = data
+
+    @classmethod
+    def parser(cls, datapath, version, msg_type, msg_len, xid, buf):
+        msg = super(OFPExperimenter, cls).parser(datapath, version,
+                                                 msg_type, msg_len,
+                                                 xid, buf)
+        (msg.experimenter, msg.exp_type) = struct.unpack_from(
+            ofproto.OFP_EXPERIMENTER_HEADER_PACK_STR, msg.buf,
+            ofproto.OFP_HEADER_SIZE)
+        msg.data = msg.buf[ofproto.OFP_EXPERIMENTER_HEADER_SIZE:]
+
+        return msg
+
+    def _serialize_body(self):
+        assert self.data is not None
+        msg_pack_into(ofproto.OFP_EXPERIMENTER_HEADER_PACK_STR,
+                      self.buf, ofproto.OFP_HEADER_SIZE,
+                      self.experimenter, self.exp_type)
+        self.buf += self.data
+
+
+@_register_parser
 @_set_msg_type(ofproto.OFPT_FEATURES_REPLY)
 class OFPSwitchFeatures(MsgBase):
     """
-- 
1.8.4


------------------------------------------------------------------------------
CenturyLink Cloud: The Leader in Enterprise Cloud Services.
Learn Why More Businesses Are Choosing CenturyLink Cloud For
Critical Workloads, Development Environments & Everything In Between.
Get a Quote or Start a Free Trial Today. 
http://pubads.g.doubleclick.net/gampad/clk?id=119420431&iu=/4140/ostg.clktrk
_______________________________________________
Ryu-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/ryu-devel

Reply via email to