summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorIsaku Yamahata <yamahata@valinux.co.jp>2012-12-20 12:08:43 +0900
committerFUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>2012-12-20 20:14:42 +0900
commit2f3d989475715fda9cdbc190df32bb357ebe086a (patch)
tree5ba0ef47a9dd5e1b9c070c802cf559bedffa5f9e
parent4d2854468a903094c6ae316d16ee84a2e1c33a78 (diff)
of1.3: improve OFPHello and OFPHelloElemVerionsBitmap
- 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 <yamahata@valinux.co.jp> Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
-rw-r--r--ryu/ofproto/ofproto_v1_3_parser.py25
1 files changed, 18 insertions, 7 deletions
diff --git a/ryu/ofproto/ofproto_v1_3_parser.py b/ryu/ofproto/ofproto_v1_3_parser.py
index 87da4133..ef985439 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