diff options
author | FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp> | 2012-05-28 17:11:17 +0900 |
---|---|---|
committer | FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp> | 2012-05-28 17:11:17 +0900 |
commit | 0c74a7755cdfe37c7ed0d3bbcc64c8d393301ac9 (patch) | |
tree | 3904188379a020fa5ad7e00c6de2eeeb46b5da31 | |
parent | 840aea5d39ab0c355b23617fcf9624b4ad8854f9 (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.py | 17 |
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): |