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
