- fix bitmap offset calculation
- un-tuple bitmap. The result of struct.unpack is a tuple
- OFPHelloElemVerionsBitmap parser needs to be aware padding
- make OFPHelloElemVerionsBitmap parse bitmap into the list of versions
- make OFPHello always have elements attribute

Signed-off-by: Isaku Yamahata <[email protected]>
---
Changes v2 -> v3:
- drop serializer

Changes v1 -> v2:
- bitmap[0] instead of bitmap as unpack result is array
- offset
---
 ryu/ofproto/ofproto_v1_3_parser.py |   25 ++++++++++++++++++-------
 1 file changed, 18 insertions(+), 7 deletions(-)

diff --git a/ryu/ofproto/ofproto_v1_3_parser.py 
b/ryu/ofproto/ofproto_v1_3_parser.py
index 87da413..ef98543 100644
--- a/ryu/ofproto/ofproto_v1_3_parser.py
+++ b/ryu/ofproto/ofproto_v1_3_parser.py
@@ -55,6 +55,7 @@ def msg_parser(datapath, version, msg_type, msg_len, xid, 
buf):
 class OFPHello(MsgBase):
     def __init__(self, datapath):
         super(OFPHello, self).__init__(datapath)
+        self.elements = None
 
     @classmethod
     def parser(cls, datapath, version, msg_type, msg_len, xid, buf):
@@ -80,27 +81,37 @@ class OFPHello(MsgBase):
 
 
 class OFPHelloElemVersionBitmap(object):
-    def __init__(self, type_, length, bitmaps):
+    def __init__(self, versions):
         super(OFPHelloElemVersionBitmap, self).__init__()
-        self.type = type_
-        self.length = length
-        self.bitmaps = bitmaps
+        self.type = ofproto_v1_3.OFPHET_VERSIONBITMAP
+        self.length = None
+        self.bitmaps = None
+        self.versions = versions
 
     @classmethod
     def parser(cls, buf, offset):
         type_, length = struct.unpack_from(
             ofproto_v1_3.OFP_HELLO_ELEM_VERSIONBITMAP_HEADER_PACK_STR,
             buf, offset)
+        assert type_ == ofproto_v1_3.OFPHET_VERSIONBITMAP
+
         bitmaps_len = (length -
                        ofproto_v1_3.OFP_HELLO_ELEM_VERSIONBITMAP_HEADER_SIZE)
         offset += ofproto_v1_3.OFP_HELLO_ELEM_VERSIONBITMAP_HEADER_SIZE
         bitmaps = []
-        while bitmaps_len > 0:
+        while bitmaps_len >= 4:
             bitmap = struct.unpack_from('!I', buf, offset)
-            bitmaps.append(bitmap)
+            bitmaps.append(bitmap[0])
+            offset += 4
             bitmaps_len -= 4
 
-        return cls(type_, length, bitmaps)
+        versions = [i * 32 + shift
+                    for i, bitmap in enumerate(bitmaps)
+                    for shift in range(31) if bitmap & (1 << shift)]
+        elem = cls(versions)
+        elem.length = length
+        elem.bitmaps = bitmaps
+        return elem
 
 
 @_register_parser
-- 
1.7.10.4


------------------------------------------------------------------------------
LogMeIn Rescue: Anywhere, Anytime Remote support for IT. Free Trial
Remotely access PCs and mobile devices and provide instant support
Improve your efficiency, and focus on delivering more value-add services
Discover what IT Professionals Know. Rescue delivers
http://p.sf.net/sfu/logmein_12329d2d
_______________________________________________
Ryu-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/ryu-devel

Reply via email to