- 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
