mirror of
https://github.com/faucetsdn/ryu.git
synced 2026-05-08 22:06:10 +02:00
Add OF1.4 error message support
Signed-off-by: Simon Horman <horms@verge.net.au> Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
This commit is contained in:
parent
c8440ab494
commit
0d0bd4592f
@ -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):
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user