From 0d0bd4592fa4b4368011723249f06b04c97dec7b Mon Sep 17 00:00:00 2001 From: Simon Horman Date: Wed, 29 Jan 2014 12:06:08 +0900 Subject: Add OF1.4 error message support Signed-off-by: Simon Horman Signed-off-by: FUJITA Tomonori --- ryu/ofproto/ofproto_v1_4_parser.py | 107 +++++++++++++++++++++++++++++++++++++ 1 file changed, 107 insertions(+) diff --git a/ryu/ofproto/ofproto_v1_4_parser.py b/ryu/ofproto/ofproto_v1_4_parser.py index 2bd2427d..9abb1137 100644 --- a/ryu/ofproto/ofproto_v1_4_parser.py +++ b/ryu/ofproto/ofproto_v1_4_parser.py @@ -183,6 +183,113 @@ class OFPEchoRequest(MsgBase): self.buf += self.data +@_register_parser +@_set_msg_type(ofproto.OFPT_ERROR) +class OFPErrorMsg(MsgBase): + """ + Error message + + The switch notifies controller of problems by this message. + + ========== ========================================================= + Attribute Description + ========== ========================================================= + type High level type of error + code Details depending on the type + data Variable length data depending on the type and code + ========== ========================================================= + + ``type`` attribute corresponds to ``type_`` parameter of __init__. + + Types and codes are defined in ``ryu.ofproto.ofproto``. + + ============================= =========== + Type Code + ============================= =========== + OFPET_HELLO_FAILED OFPHFC_* + OFPET_BAD_REQUEST OFPBRC_* + OFPET_BAD_ACTION OFPBAC_* + OFPET_BAD_INSTRUCTION OFPBIC_* + OFPET_BAD_MATCH OFPBMC_* + OFPET_FLOW_MOD_FAILED OFPFMFC_* + OFPET_GROUP_MOD_FAILED OFPGMFC_* + OFPET_PORT_MOD_FAILED OFPPMFC_* + OFPET_TABLE_MOD_FAILED OFPTMFC_* + OFPET_QUEUE_OP_FAILED OFPQOFC_* + OFPET_SWITCH_CONFIG_FAILED OFPSCFC_* + OFPET_ROLE_REQUEST_FAILED OFPRRFC_* + OFPET_METER_MOD_FAILED OFPMMFC_* + OFPET_TABLE_FEATURES_FAILED OFPTFFC_* + OFPET_EXPERIMENTER N/A + ============================= =========== + + Example:: + + @set_ev_cls(ofp_event.EventOFPErrorMsg, + [HANDSHAKE_DISPATCHER, CONFIG_DISPATCHER, MAIN_DISPATCHER]) + def error_msg_handler(self, ev): + msg = ev.msg + + self.logger.debug('OFPErrorMsg received: type=0x%02x code=0x%02x ' + 'message=%s', + msg.type, msg.code, utils.hex_array(msg.data)) + """ + def __init__(self, datapath, type_=None, code=None, data=None): + super(OFPErrorMsg, self).__init__(datapath) + self.type = type_ + self.code = code + self.data = data + + @classmethod + def parser(cls, datapath, version, msg_type, msg_len, xid, buf): + type_, = struct.unpack_from('!H', buffer(buf), + ofproto.OFP_HEADER_SIZE) + if type_ == ofproto.OFPET_EXPERIMENTER: + return OFPErrorExperimenterMsg.parser(datapath, version, msg_type, + msg_len, xid, buf) + msg = super(OFPErrorMsg, cls).parser(datapath, version, msg_type, + msg_len, xid, buf) + msg.type, msg.code = struct.unpack_from( + ofproto.OFP_ERROR_MSG_PACK_STR, msg.buf, + ofproto.OFP_HEADER_SIZE) + msg.data = msg.buf[ofproto.OFP_ERROR_MSG_SIZE:] + return msg + + def _serialize_body(self): + assert self.data is not None + msg_pack_into(ofproto.OFP_ERROR_MSG_PACK_STR, self.buf, + ofproto.OFP_HEADER_SIZE, self.type, self.code) + self.buf += self.data + + +class OFPErrorExperimenterMsg(MsgBase): + def __init__(self, datapath, type_=None, exp_type=None, experimenter=None, + data=None): + super(OFPErrorExperimenterMsg, self).__init__(datapath) + self.type = ofproto.OFPET_EXPERIMENTER + self.exp_type = exp_type + self.experimenter = experimenter + self.data = data + + @classmethod + def parser(cls, datapath, version, msg_type, msg_len, xid, buf): + cls.cls_msg_type = msg_type + msg = super(OFPErrorExperimenterMsg, cls).parser( + datapath, version, msg_type, msg_len, xid, buf) + msg.type, msg.exp_type, msg.experimenter = struct.unpack_from( + ofproto.OFP_ERROR_EXPERIMENTER_MSG_PACK_STR, msg.buf, + ofproto.OFP_HEADER_SIZE) + msg.data = msg.buf[ofproto.OFP_ERROR_EXPERIMENTER_MSG_SIZE:] + return msg + + def _serialize_body(self): + assert self.data is not None + msg_pack_into(ofproto.OFP_ERROR_EXPERIMENTER_MSG_PACK_STR, + self.buf, ofproto.OFP_HEADER_SIZE, + self.type, self.exp_type, self.experimenter) + self.buf += self.data + + @_register_parser @_set_msg_type(ofproto.OFPT_ECHO_REPLY) class OFPEchoReply(MsgBase): -- cgit v1.2.3