diff options
-rw-r--r-- | ryu/controller/ofp_handler.py | 23 | ||||
-rw-r--r-- | ryu/ofproto/ofproto_utils.py | 123 | ||||
-rw-r--r-- | ryu/ofproto/ofproto_v1_0.py | 5 | ||||
-rw-r--r-- | ryu/ofproto/ofproto_v1_2.py | 3 | ||||
-rw-r--r-- | ryu/ofproto/ofproto_v1_3.py | 4 | ||||
-rw-r--r-- | ryu/ofproto/ofproto_v1_4.py | 4 | ||||
-rw-r--r-- | ryu/ofproto/ofproto_v1_5.py | 4 |
7 files changed, 164 insertions, 2 deletions
diff --git a/ryu/controller/ofp_handler.py b/ryu/controller/ofp_handler.py index 553e9f43..cc64b1f4 100644 --- a/ryu/controller/ofp_handler.py +++ b/ryu/controller/ofp_handler.py @@ -31,6 +31,7 @@ from ryu.controller.controller import OpenFlowController from ryu.controller.handler import set_ev_handler from ryu.controller.handler import HANDSHAKE_DISPATCHER, CONFIG_DISPATCHER,\ MAIN_DISPATCHER +from ryu.ofproto import ofproto_parser # The state transition: HANDSHAKE -> CONFIG -> MAIN @@ -249,5 +250,23 @@ class OFPHandler(ryu.base.app_manager.RyuApp): [HANDSHAKE_DISPATCHER, CONFIG_DISPATCHER, MAIN_DISPATCHER]) def error_msg_handler(self, ev): msg = ev.msg - self.logger.debug('error msg ev %s type 0x%x code 0x%x %s', - msg, msg.type, msg.code, utils.hex_array(msg.data)) + ofp = msg.datapath.ofproto + (version, msg_type, msg_len, xid) = ofproto_parser.header(msg.data) + self.logger.debug('EventOFPErrorMsg received.') + self.logger.debug( + 'version=%s, msg_type=%s, msg_len=%s, xid=%s', hex(msg.version), + hex(msg.msg_type), hex(msg.msg_len), hex(msg.xid)) + self.logger.debug( + ' `-- msg_type: %s', ofp.ofp_msg_type_to_str(msg.msg_type)) + self.logger.debug( + "OFPErrorMsg(type=%s, code=%s, data=b'%s')", hex(msg.type), + hex(msg.code), utils.binary_str(msg.data)) + self.logger.debug( + ' |-- type: %s', ofp.ofp_error_type_to_str(msg.type)) + self.logger.debug( + ' |-- code: %s', ofp.ofp_error_code_to_str(msg.type, msg.code)) + self.logger.debug( + ' `-- data: version=%s, msg_type=%s, msg_len=%s, xid=%s', + hex(version), hex(msg_type), hex(msg_len), hex(xid)) + self.logger.debug( + ' `-- msg_type: %s', ofp.ofp_msg_type_to_str(msg_type)) diff --git a/ryu/ofproto/ofproto_utils.py b/ryu/ofproto/ofproto_utils.py new file mode 100644 index 00000000..939a2ffb --- /dev/null +++ b/ryu/ofproto/ofproto_utils.py @@ -0,0 +1,123 @@ +# Copyright (C) 2015 Nippon Telegraph and Telephone Corporation. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or +# implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import re + + +def generate(modname): + import sys + import functools + + mod = sys.modules[modname] + + def add_attr(k, v): + setattr(mod, k, v) + + add_attr('ofp_msg_type_to_str', + functools.partial(_msg_type_to_str, mod)) + add_attr('ofp_error_type_to_str', + functools.partial(_error_type_to_str, mod)) + add_attr('ofp_error_code_to_str', + functools.partial(_error_code_to_str, mod)) + add_attr('ofp_error_to_jsondict', + functools.partial(_error_to_jsondict, mod)) + + +def _get_value_name(mod, value, pattern): + for k, v in mod.__dict__.items(): + if k.startswith(pattern): + if v == value: + return k + return 'Unknown' + + +def _msg_type_to_str(mod, type_): + """ + This method is registered as ofp_msg_type_to_str(type_) method + into ryu.ofproto.ofproto_v1_* modules. + And this method returns the message type as a string value for given + 'type' defined in ofp_type enum. + + Example:: + + >>> ofproto.ofp_msg_type_to_str(14) + 'OFPT_FLOW_MOD(14)' + """ + return '%s(%d)' % (_get_value_name(mod, type_, 'OFPT_'), type_) + + +def _error_type_to_str(mod, type_): + """ + This method is registered as ofp_error_type_to_str(type_) method + into ryu.ofproto.ofproto_v1_* modules. + And this method returns the error type as a string value for given + 'type' defined in ofp_error_msg structure. + + Example:: + + >>> ofproto.ofp_error_type_to_str(4) + 'OFPET_BAD_MATCH(4)' + """ + return '%s(%d)' % (_get_value_name(mod, type_, 'OFPET_'), type_) + + +def _get_error_names(mod, type_, code): + t_name = _get_value_name(mod, type_, 'OFPET_') + if t_name == 'Unknown': + return 'Unknown', 'Unknown' + # Construct error code name pattern + # e.g.) "OFPET_BAD_MATCH" -> "OFPBMC_" + if t_name == 'OFPET_FLOW_MONITOR_FAILED': + c_name_p = 'OFPMOFC_' + else: + c_name_p = 'OFP' + for m in re.findall("_(.)", t_name): + c_name_p += m.upper() + c_name_p += 'C_' + c_name = _get_value_name(mod, code, c_name_p) + return t_name, c_name + + +def _error_code_to_str(mod, type_, code): + """ + This method is registered as ofp_error_code_to_str(type_, code) method + into ryu.ofproto.ofproto_v1_* modules. + And this method returns the error code as a string value for given + 'type' and 'code' defined in ofp_error_msg structure. + + Example:: + + >>> ofproto.ofp_error_code_to_str(4, 9) + 'OFPBMC_BAD_PREREQ(9)' + """ + (_, c_name) = _get_error_names(mod, type_, code) + return '%s(%d)' % (c_name, code) + + +def _error_to_jsondict(mod, type_, code): + """ + This method is registered as ofp_error_to_jsondict(type_, code) method + into ryu.ofproto.ofproto_v1_* modules. + And this method returns ofp_error_msg as a json format for given + 'type' and 'code' defined in ofp_error_msg structure. + + Example:: + + >>> ofproto.ofp_error_to_jsondict(4, 9) + {'code': 'OFPBMC_BAD_PREREQ(9)', 'type': 'OFPET_BAD_MATCH(4)'} + """ + (t_name, c_name) = _get_error_names(mod, type_, code) + return {'type': '%s(%d)' % (t_name, type_), + 'code': '%s(%d)' % (c_name, code)} diff --git a/ryu/ofproto/ofproto_v1_0.py b/ryu/ofproto/ofproto_v1_0.py index c4499ef5..4cac2626 100644 --- a/ryu/ofproto/ofproto_v1_0.py +++ b/ryu/ofproto/ofproto_v1_0.py @@ -20,6 +20,8 @@ OpenFlow 1.0 definitions. from struct import calcsize +from ryu.ofproto import ofproto_utils + MAX_XID = 0xffffffff @@ -492,6 +494,9 @@ OFP_QUEUE_PROP_MIN_RATE_SIZE = 16 assert (calcsize(OFP_QUEUE_PROP_MIN_RATE_PACK_STR) + OFP_QUEUE_PROP_HEADER_SIZE == OFP_QUEUE_PROP_MIN_RATE_SIZE) +# generate utility methods +ofproto_utils.generate(__name__) + def nxm_header__(vendor, field, hasmask, length): return (vendor << 16) | (field << 9) | (hasmask << 8) | length diff --git a/ryu/ofproto/ofproto_v1_2.py b/ryu/ofproto/ofproto_v1_2.py index 9f6c26aa..a53b4bf1 100644 --- a/ryu/ofproto/ofproto_v1_2.py +++ b/ryu/ofproto/ofproto_v1_2.py @@ -19,6 +19,7 @@ OpenFlow 1.2 definitions. """ from ryu.lib import type_desc +from ryu.ofproto import ofproto_utils from ryu.ofproto import oxm_fields from struct import calcsize @@ -831,6 +832,8 @@ oxm_types = [ oxm_fields.generate(__name__) +# generate utility methods +ofproto_utils.generate(__name__) # define constants OFP_VERSION = 0x03 diff --git a/ryu/ofproto/ofproto_v1_3.py b/ryu/ofproto/ofproto_v1_3.py index c3adc612..cf7a48d5 100644 --- a/ryu/ofproto/ofproto_v1_3.py +++ b/ryu/ofproto/ofproto_v1_3.py @@ -19,6 +19,7 @@ OpenFlow 1.3 definitions. """ from ryu.lib import type_desc +from ryu.ofproto import ofproto_utils from ryu.ofproto import oxm_fields from struct import calcsize @@ -1229,6 +1230,9 @@ OFP_PROP_EXPERIMENTER_SIZE = 12 assert (calcsize(OFP_PROP_EXPERIMENTER_PACK_STR) == OFP_PROP_EXPERIMENTER_SIZE) +# generate utility methods +ofproto_utils.generate(__name__) + # define constants OFP_VERSION = 0x04 OFP_TCP_PORT = 6633 diff --git a/ryu/ofproto/ofproto_v1_4.py b/ryu/ofproto/ofproto_v1_4.py index 345846e4..250c0e12 100644 --- a/ryu/ofproto/ofproto_v1_4.py +++ b/ryu/ofproto/ofproto_v1_4.py @@ -19,6 +19,7 @@ OpenFlow 1.4 definitions. """ from ryu.lib import type_desc +from ryu.ofproto import ofproto_utils from ryu.ofproto import oxm_fields from struct import calcsize @@ -1482,6 +1483,9 @@ OFP_PROP_EXPERIMENTER_SIZE = 12 assert (calcsize(OFP_PROP_EXPERIMENTER_PACK_STR) == OFP_PROP_EXPERIMENTER_SIZE) +# generate utility methods +ofproto_utils.generate(__name__) + # define constants OFP_VERSION = 0x05 OFP_TCP_PORT = 6653 diff --git a/ryu/ofproto/ofproto_v1_5.py b/ryu/ofproto/ofproto_v1_5.py index 31e5cc05..be5bd147 100644 --- a/ryu/ofproto/ofproto_v1_5.py +++ b/ryu/ofproto/ofproto_v1_5.py @@ -19,6 +19,7 @@ OpenFlow 1.5 definitions. """ from ryu.lib import type_desc +from ryu.ofproto import ofproto_utils from ryu.ofproto import oxm_fields from ryu.ofproto import oxs_fields @@ -1818,6 +1819,9 @@ OFP_PROP_EXPERIMENTER_SIZE = 12 assert (calcsize(OFP_PROP_EXPERIMENTER_PACK_STR) == OFP_PROP_EXPERIMENTER_SIZE) +# generate utility methods +ofproto_utils.generate(__name__) + # define constants OFP_VERSION = 0x06 OFP_TCP_PORT = 6653 |