From 0c74a7755cdfe37c7ed0d3bbcc64c8d393301ac9 Mon Sep 17 00:00:00 2001 From: FUJITA Tomonori Date: Mon, 28 May 2012 17:11:17 +0900 Subject: [PATCH] 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 --- ryu/ofproto/ofproto_v1_0_parser.py | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) 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):