Oops, I sent out the old one. This is the latest.

>From 93316e9b084a4e5037246291ce6ba3da41ba3bda Mon Sep 17 00:00:00 2001
Message-Id: 
<93316e9b084a4e5037246291ce6ba3da41ba3bda.1355819739.git.yamah...@valinux.co.jp>
In-Reply-To: <[email protected]>
References: <[email protected]>
From: Isaku Yamahata <[email protected]>
Date: Mon, 17 Dec 2012 17:02:55 +0900
Subject: [PATCH v2 2/4] ofproto_v1_3_parser.py: fix up OFPHello and
 OFPHelloElemVerionsBitmap and serializer

- OFPHelloElemVerionsBitmap parser needs to be aware padding.
- make OFPHelloElemVerionsBitmap parse bitmap into the list of versions
- make OFPHello always have elements attribute
- serializer for OFPHello and OFPHelloElemVerionsBitmap

Signed-off-by: Isaku Yamahata <[email protected]>
---
Changes v1 -> v2:
- bitmap[0] instead of bitmap as unpack result is array
- offset
---
 ryu/ofproto/ofproto_v1_3_parser.py |   60 +++++++++++++++++++++++++++++++-----
 1 file changed, 53 insertions(+), 7 deletions(-)

diff --git a/ryu/ofproto/ofproto_v1_3_parser.py 
b/ryu/ofproto/ofproto_v1_3_parser.py
index 11dd365..8156d25 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):
@@ -78,29 +79,74 @@ class OFPHello(MsgBase):
         msg.elements = elems
         return msg
 
+    def _serialize_body(self):
+        elems = self.elements or []
+        offset = ofproto_v1_3.OFP_HEADER_SIZE
+        for elem in elems:
+            elem.serialize(self.buf, offset)
+            offset += elem.length
+
 
 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
+
+    def serialize(self, buf, offset):
+        assert self.length is None
+        assert self.versions
+        assert self.bitmaps is None
+
+        bitmap_length = max(self.versions) / 32 + 1
+        bitmaps = [0] * bitmap_length
+        for version in self.versions:
+            bitmaps[version / 32] |= 1 << (version % 32)
+        self.bitmaps = bitmaps
+
+        elem_length = (ofproto_v1_3.OFP_HELLO_ELEM_HEADER_SIZE +
+                       bitmap_length * 4)
+        self.length = utils.round_up(elem_length, 8)
+
+        msg_pack_into(
+            ofproto_v1_3.OFP_HELLO_ELEM_VERSIONBITMAP_HEADER_PACK_STR,
+            buf, offset, self.type, self.length)
+
+        elem_offset = ofproto_v1_3.OFP_HELLO_ELEM_HEADER_SIZE
+        for bitmap in bitmaps:
+            msg_pack_into('!I', buf, offset + elem_offset, bitmap)
+            elem_offset += 4
+        pad_len = self.length - elem_offset
+        assert pad_len < 8
+        if pad_len > 0:
+            msg_pack_into('%dx' % pad_len, buf, offset + elem_offset)
 
 
 @_register_parser
-- 
1.7.10.4



-- 
yamahata

------------------------------------------------------------------------------
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