diff --git a/ryu/ofproto/ofproto_v1_3_parser.py b/ryu/ofproto/ofproto_v1_3_parser.py index 04b7b049..2f8a0358 100644 --- a/ryu/ofproto/ofproto_v1_3_parser.py +++ b/ryu/ofproto/ofproto_v1_3_parser.py @@ -198,6 +198,11 @@ class OFPErrorMsg(MsgBase): @classmethod def parser(cls, datapath, version, msg_type, msg_len, xid, buf): + type_, = struct.unpack_from('!H', buffer(buf), + ofproto_v1_3.OFP_HEADER_SIZE) + if type_ == ofproto_v1_3.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( @@ -213,6 +218,27 @@ class OFPErrorMsg(MsgBase): 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_v1_3.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_v1_3.OFP_ERROR_EXPERIMENTER_MSG_PACK_STR, msg.buf, + ofproto_v1_3.OFP_HEADER_SIZE) + msg.data = msg.buf[ofproto_v1_3.OFP_ERROR_EXPERIMENTER_MSG_SIZE:] + return msg + + @_register_parser @_set_msg_type(ofproto_v1_3.OFPT_ECHO_REQUEST) class OFPEchoRequest(MsgBase):