summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--ryu/app/ofctl/exception.py4
-rw-r--r--ryu/app/ofctl/service.py9
2 files changed, 12 insertions, 1 deletions
diff --git a/ryu/app/ofctl/exception.py b/ryu/app/ofctl/exception.py
index 90113aed..c49f33f2 100644
--- a/ryu/app/ofctl/exception.py
+++ b/ryu/app/ofctl/exception.py
@@ -27,3 +27,7 @@ class _ExceptionBase(exception.RyuException):
class UnexpectedMultiReply(_ExceptionBase):
message = 'Unexpected Multi replies %(result)s'
+
+
+class OFError(_ExceptionBase):
+ message = 'OpenFlow errors %(result)s'
diff --git a/ryu/app/ofctl/service.py b/ryu/app/ofctl/service.py
index e7e181c9..415834ef 100644
--- a/ryu/app/ofctl/service.py
+++ b/ryu/app/ofctl/service.py
@@ -62,6 +62,11 @@ class OfctlService(app_manager.RyuApp):
self.unobserve_event(ev_cls)
self.logger.debug('ofctl: stop observing %s' % (ev_cls,))
+ @staticmethod
+ def _is_error(msg):
+ return (ofp_event.ofp_msg_to_ev_cls(type(msg)) ==
+ ofp_event.EventOFPErrorMsg)
+
@set_ev_cls(ofp_event.EventOFPSwitchFeatures, CONFIG_DISPATCHER)
def _switch_features_handler(self, ev):
datapath = ev.msg.datapath
@@ -142,7 +147,9 @@ class OfctlService(app_manager.RyuApp):
req = si.xids.pop(xid)
if not req.reply_cls is None:
self._unobserve_msg(req.reply_cls)
- if req.reply_multi:
+ if any(self._is_error(r) for r in result):
+ rep = event.Reply(exception=exception.OFError(result=result))
+ elif req.reply_multi:
rep = event.Reply(result=result)
elif len(result) == 0:
rep = event.Reply()