summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorFUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>2012-05-28 17:11:17 +0900
committerFUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>2012-05-28 17:11:17 +0900
commit0c74a7755cdfe37c7ed0d3bbcc64c8d393301ac9 (patch)
tree3904188379a020fa5ad7e00c6de2eeeb46b5da31
parent840aea5d39ab0c355b23617fcf9624b4ad8854f9 (diff)
Add Switch to Controller Vendor message support
This enabls a vendor to register vendor's specific parser to handle Switch to Controller Vendor messages. An object that vendor's parser returns is placed at msg.data. Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
-rw-r--r--ryu/ofproto/ofproto_v1_0_parser.py17
1 files changed, 16 insertions, 1 deletions
diff --git a/ryu/ofproto/ofproto_v1_0_parser.py b/ryu/ofproto/ofproto_v1_0_parser.py
index e781ab0d..9517e4f5 100644
--- a/ryu/ofproto/ofproto_v1_0_parser.py
+++ b/ryu/ofproto/ofproto_v1_0_parser.py
@@ -1048,6 +1048,15 @@ class OFPEchoReply(MsgBase):
@_register_parser
@_set_msg_type(ofproto_v1_0.OFPT_VENDOR)
class OFPVendor(MsgBase):
+ _VENDORS = {}
+
+ @staticmethod
+ def register_vendor(id_):
+ def _register_vendor(cls):
+ OFPVendor._VENDORS[id_] = cls
+ return cls
+ return _register_vendor
+
def __init__(self, datapath):
super(OFPVendor, self).__init__(datapath)
self.data = None
@@ -1060,7 +1069,13 @@ class OFPVendor(MsgBase):
(msg.vendor,) = struct.unpack_from(
ofproto_v1_0.OFP_VENDOR_HEADER_PACK_STR, msg.buf,
ofproto_v1_0.OFP_HEADER_SIZE)
- msg.data = msg.buf[ofproto_v1_0.OFP_VENDOR_HEADER_SIZE:]
+
+ cls_ = cls._VENDORS.get(msg.vendor)
+ if cls_:
+ msg.data = cls_.parser(datapath, msg.buf, 0)
+ else:
+ msg.data = msg.buf[ofproto_v1_0.OFP_VENDOR_HEADER_SIZE:]
+
return msg
def serialize_header(self):