This patch fixes to parse experimenter_data of ofp_*_prop_experimenter
as a list of uint32_t values at OFPPropCommonExperimenter4ByteData.

Signed-off-by: IWASE Yusuke <[email protected]>
---
 ryu/ofproto/ofproto_v1_4_parser.py | 23 ++++++++++++++++++++---
 ryu/ofproto/ofproto_v1_5_parser.py | 23 ++++++++++++++++++++---
 2 files changed, 40 insertions(+), 6 deletions(-)

diff --git a/ryu/ofproto/ofproto_v1_4_parser.py 
b/ryu/ofproto/ofproto_v1_4_parser.py
index f9efba5..d2c22f1 100644
--- a/ryu/ofproto/ofproto_v1_4_parser.py
+++ b/ryu/ofproto/ofproto_v1_4_parser.py
@@ -881,6 +881,8 @@ class OFPPropBase(StringifyMixin):
 
 class OFPPropCommonExperimenter4ByteData(StringifyMixin):
     _PACK_STR = '!HHII'
+    _EXPERIMENTER_DATA_PACK_STR = '!I'
+    _EXPERIMENTER_DATA_SIZE = 4
 
     def __init__(self, type_=None, length=None, experimenter=None,
                  exp_type=None, data=bytearray()):
@@ -894,19 +896,34 @@ class OFPPropCommonExperimenter4ByteData(StringifyMixin):
     def parser(cls, buf):
         (type_, length, experimenter, exp_type) = struct.unpack_from(
             ofproto.OFP_PROP_EXPERIMENTER_PACK_STR, buf, 0)
-        data = buf[ofproto.OFP_PROP_EXPERIMENTER_SIZE:length]
+
+        rest = buf[ofproto.OFP_PROP_EXPERIMENTER_SIZE:length]
+        data = []
+        while rest:
+            (d,) = struct.unpack_from(
+                cls._EXPERIMENTER_DATA_PACK_STR, rest, 0)
+            data.append(d)
+            rest = rest[cls._EXPERIMENTER_DATA_SIZE:]
+
         return cls(type_, length, experimenter, exp_type, data)
 
     def serialize(self):
+        offset = 0
+        bin_data = bytearray()
+        for d in self.data:
+            msg_pack_into(self._EXPERIMENTER_DATA_PACK_STR,
+                          bin_data, offset, d)
+            offset += self._EXPERIMENTER_DATA_SIZE
+
         # fixup
         self.length = struct.calcsize(self._PACK_STR)
-        self.length += len(self.data)
+        self.length += len(bin_data)
 
         buf = bytearray()
         msg_pack_into(self._PACK_STR, buf,
                       0, self.type, self.length, self.experimenter,
                       self.exp_type)
-        buf += self.data
+        buf += bin_data
 
         # Pad
         pad_len = utils.round_up(self.length, 8) - self.length
diff --git a/ryu/ofproto/ofproto_v1_5_parser.py 
b/ryu/ofproto/ofproto_v1_5_parser.py
index e548f2e..0c72d64 100644
--- a/ryu/ofproto/ofproto_v1_5_parser.py
+++ b/ryu/ofproto/ofproto_v1_5_parser.py
@@ -1025,6 +1025,8 @@ class OFPPropBase(StringifyMixin):
 
 class OFPPropCommonExperimenter4ByteData(StringifyMixin):
     _PACK_STR = '!HHII'
+    _EXPERIMENTER_DATA_PACK_STR = '!I'
+    _EXPERIMENTER_DATA_SIZE = 4
 
     def __init__(self, type_=None, length=None, experimenter=None,
                  exp_type=None, data=bytearray()):
@@ -1038,19 +1040,34 @@ class 
OFPPropCommonExperimenter4ByteData(StringifyMixin):
     def parser(cls, buf):
         (type_, length, experimenter, exp_type) = struct.unpack_from(
             ofproto.OFP_PROP_EXPERIMENTER_PACK_STR, buf, 0)
-        data = buf[ofproto.OFP_PROP_EXPERIMENTER_SIZE:length]
+
+        rest = buf[ofproto.OFP_PROP_EXPERIMENTER_SIZE:length]
+        data = []
+        while rest:
+            (d,) = struct.unpack_from(
+                cls._EXPERIMENTER_DATA_PACK_STR, rest, 0)
+            data.append(d)
+            rest = rest[cls._EXPERIMENTER_DATA_SIZE:]
+
         return cls(type_, length, experimenter, exp_type, data)
 
     def serialize(self):
+        offset = 0
+        bin_data = bytearray()
+        for d in self.data:
+            msg_pack_into(self._EXPERIMENTER_DATA_PACK_STR,
+                          bin_data, offset, d)
+            offset += self._EXPERIMENTER_DATA_SIZE
+
         # fixup
         self.length = struct.calcsize(self._PACK_STR)
-        self.length += len(self.data)
+        self.length += len(bin_data)
 
         buf = bytearray()
         msg_pack_into(self._PACK_STR, buf,
                       0, self.type, self.length, self.experimenter,
                       self.exp_type)
-        buf += self.data
+        buf += bin_data
 
         # Pad
         pad_len = utils.round_up(self.length, 8) - self.length
-- 
1.9.1


------------------------------------------------------------------------------
_______________________________________________
Ryu-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/ryu-devel

Reply via email to