diff --git a/ryu/ofproto/ofproto_v1_5_parser.py b/ryu/ofproto/ofproto_v1_5_parser.py index 3c9d9983..b351ebe4 100644 --- a/ryu/ofproto/ofproto_v1_5_parser.py +++ b/ryu/ofproto/ofproto_v1_5_parser.py @@ -5957,6 +5957,7 @@ class OFPSetAsync(MsgBase): self.buf += bin_props +@_register_parser @_set_msg_type(ofproto.OFPT_BUNDLE_CONTROL) class OFPBundleCtrlMsg(MsgBase): """ @@ -5996,7 +5997,8 @@ class OFPBundleCtrlMsg(MsgBase): [ofp.OFPBF_ATOMIC], []) datapath.send_msg(req) """ - def __init__(self, datapath, bundle_id, type_, flags, properties): + def __init__(self, datapath, bundle_id=None, type_=None, flags=None, + properties=None): super(OFPBundleCtrlMsg, self).__init__(datapath) self.bundle_id = bundle_id self.type = type_ @@ -6013,6 +6015,25 @@ class OFPBundleCtrlMsg(MsgBase): self.type, self.flags) self.buf += bin_props + @classmethod + def parser(cls, datapath, version, msg_type, msg_len, xid, buf): + msg = super(OFPBundleCtrlMsg, cls).parser(datapath, version, + msg_type, msg_len, + xid, buf) + (bundle_id, type_, flags) = struct.unpack_from( + ofproto.OFP_BUNDLE_CTRL_MSG_PACK_STR, buf, + ofproto.OFP_HEADER_SIZE) + msg.bundle_id = bundle_id + msg.type = type_ + msg.flags = flags + msg.properties = [] + rest = msg.buf[ofproto.OFP_BUNDLE_CTRL_MSG_SIZE:] + while rest: + p, rest = OFPBundleProp.parse(rest) + msg.properties.append(p) + + return msg + @_set_msg_type(ofproto.OFPT_BUNDLE_ADD_MESSAGE) class OFPBundleAddMsg(MsgInMsgBase): diff --git a/ryu/tests/unit/ofproto/test_parser.py b/ryu/tests/unit/ofproto/test_parser.py index 76d023f1..3da5cd72 100644 --- a/ryu/tests/unit/ofproto/test_parser.py +++ b/ryu/tests/unit/ofproto/test_parser.py @@ -145,7 +145,7 @@ implemented = { ofproto_v1_5.OFPT_ROLE_STATUS: (True, False), ofproto_v1_5.OFPT_TABLE_STATUS: (True, False), ofproto_v1_5.OFPT_REQUESTFORWARD: (False, True), - ofproto_v1_5.OFPT_BUNDLE_CONTROL: (False, True), + ofproto_v1_5.OFPT_BUNDLE_CONTROL: (True, True), ofproto_v1_5.OFPT_BUNDLE_ADD_MESSAGE: (False, True), }, }