summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorFUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>2012-12-01 00:17:00 +0900
committerFUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>2012-12-15 06:36:48 +0900
commitaa3ab7d30f659f99ac149f2529fa7af36e277792 (patch)
treef22f470560d8f60c84a5b64a68b4d45a9432d868
parent70194beabe99749bbfd2ecdede13c9059ecfb04e (diff)
of1.3: support OFPHET_VERSIONBITMAP
Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
-rw-r--r--ryu/ofproto/ofproto_v1_3.py17
-rw-r--r--ryu/ofproto/ofproto_v1_3_parser.py46
2 files changed, 63 insertions, 0 deletions
diff --git a/ryu/ofproto/ofproto_v1_3.py b/ryu/ofproto/ofproto_v1_3.py
index e2869df3..021b2d50 100644
--- a/ryu/ofproto/ofproto_v1_3.py
+++ b/ryu/ofproto/ofproto_v1_3.py
@@ -1006,6 +1006,23 @@ OFP_EXPERIMENTER_HEADER_SIZE = 16
assert (calcsize(OFP_EXPERIMENTER_HEADER_PACK_STR) + OFP_HEADER_SIZE
== OFP_EXPERIMENTER_HEADER_SIZE)
+# struct ofp_hello
+OFP_HELLO_HEADER_SIZE = 8
+
+# struct ofp_hello_elem_header
+OFP_HELLO_ELEM_HEADER_PACK_STR = '!HH'
+OFP_HELLO_ELEM_HEADER_SIZE = 4
+assert (calcsize(OFP_HELLO_ELEM_HEADER_PACK_STR) == OFP_HELLO_ELEM_HEADER_SIZE)
+
+# enum ofp_hello_elem_type
+OFPHET_VERSIONBITMAP = 1
+
+# struct ofp_hello_elem_versionbitmap
+OFP_HELLO_ELEM_VERSIONBITMAP_HEADER_PACK_STR = '!HH'
+OFP_HELLO_ELEM_VERSIONBITMAP_HEADER_SIZE = 4
+assert (calcsize(OFP_HELLO_ELEM_VERSIONBITMAP_HEADER_PACK_STR) ==
+ OFP_HELLO_ELEM_VERSIONBITMAP_HEADER_SIZE)
+
# OXM
diff --git a/ryu/ofproto/ofproto_v1_3_parser.py b/ryu/ofproto/ofproto_v1_3_parser.py
index db31dea8..11dd365c 100644
--- a/ryu/ofproto/ofproto_v1_3_parser.py
+++ b/ryu/ofproto/ofproto_v1_3_parser.py
@@ -56,6 +56,52 @@ class OFPHello(MsgBase):
def __init__(self, datapath):
super(OFPHello, self).__init__(datapath)
+ @classmethod
+ def parser(cls, datapath, version, msg_type, msg_len, xid, buf):
+ msg = super(OFPHello, cls).parser(datapath, version, msg_type,
+ msg_len, xid, buf)
+
+ offset = ofproto_v1_3.OFP_HELLO_HEADER_SIZE
+ elems = []
+ while offset < msg.msg_len:
+ type_, length = struct.unpack_from(
+ ofproto_v1_3.OFP_HELLO_ELEM_HEADER_PACK_STR, msg.buf, offset)
+
+ # better to register Hello Element classes but currently
+ # Only VerisonBitmap is supported so let's be simple.
+
+ if type_ == ofproto_v1_3.OFPHET_VERSIONBITMAP:
+ elem = OFPHelloElemVersionBitmap.parser(msg.buf, offset)
+ elems.append(elem)
+
+ offset += length
+ msg.elements = elems
+ return msg
+
+
+class OFPHelloElemVersionBitmap(object):
+ def __init__(self, type_, length, bitmaps):
+ super(OFPHelloElemVersionBitmap, self).__init__()
+ self.type = type_
+ self.length = length
+ self.bitmaps = bitmaps
+
+ @classmethod
+ def parser(cls, buf, offset):
+ type_, length = struct.unpack_from(
+ ofproto_v1_3.OFP_HELLO_ELEM_VERSIONBITMAP_HEADER_PACK_STR,
+ buf, offset)
+ 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:
+ bitmap = struct.unpack_from('!I', buf, offset)
+ bitmaps.append(bitmap)
+ bitmaps_len -= 4
+
+ return cls(type_, length, bitmaps)
+
@_register_parser
@_set_msg_type(ofproto_v1_3.OFPT_ERROR)