summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--ryu/controller/ofp_handler.py23
-rw-r--r--ryu/ofproto/ofproto_utils.py123
-rw-r--r--ryu/ofproto/ofproto_v1_0.py5
-rw-r--r--ryu/ofproto/ofproto_v1_2.py3
-rw-r--r--ryu/ofproto/ofproto_v1_3.py4
-rw-r--r--ryu/ofproto/ofproto_v1_4.py4
-rw-r--r--ryu/ofproto/ofproto_v1_5.py4
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