From 2f3199b3a037b532cffe917451205e948be1697b Mon Sep 17 00:00:00 2001 From: Jason Ye Date: Wed, 24 Apr 2013 18:57:10 -0700 Subject: [PATCH] When plugin receives error msg from the switch regarding a flow message sent to the switch earlier, it will report the error thru SAL to notify upper FMs/applications. A request id associated with the offending message is also passed along. Signed-off-by: Jason Ye --- .../internal/ForwardingRulesManagerImpl.java | 5 +++++ .../internal/FlowProgrammerNotifier.java | 9 ++++++++ .../internal/FlowProgrammerService.java | 21 +++++++++++++++++++ .../IPluginOutFlowProgrammerService.java | 14 +++++++++++++ .../internal/FlowProgrammerService.java | 14 ++++++++++++- 5 files changed, 62 insertions(+), 1 deletion(-) diff --git a/opendaylight/forwardingrulesmanager/implementation/src/main/java/org/opendaylight/controller/forwardingrulesmanager/internal/ForwardingRulesManagerImpl.java b/opendaylight/forwardingrulesmanager/implementation/src/main/java/org/opendaylight/controller/forwardingrulesmanager/internal/ForwardingRulesManagerImpl.java index b82ab6f9a8..c86363fef6 100644 --- a/opendaylight/forwardingrulesmanager/implementation/src/main/java/org/opendaylight/controller/forwardingrulesmanager/internal/ForwardingRulesManagerImpl.java +++ b/opendaylight/forwardingrulesmanager/implementation/src/main/java/org/opendaylight/controller/forwardingrulesmanager/internal/ForwardingRulesManagerImpl.java @@ -2422,4 +2422,9 @@ public class ForwardingRulesManagerImpl implements IForwardingRulesManager, this.updateLocalDatabase(installedEntry, false); } + @Override + public void flowErrorReported(Node node, long rid, Object err) { + log.error("Got error {} for message rid {} from node {}", new Object[] { + err, rid, node }); + } } diff --git a/opendaylight/protocol_plugins/openflow/src/main/java/org/opendaylight/controller/protocol_plugin/openflow/internal/FlowProgrammerNotifier.java b/opendaylight/protocol_plugins/openflow/src/main/java/org/opendaylight/controller/protocol_plugin/openflow/internal/FlowProgrammerNotifier.java index 594164ddcf..cad0dfa807 100644 --- a/opendaylight/protocol_plugins/openflow/src/main/java/org/opendaylight/controller/protocol_plugin/openflow/internal/FlowProgrammerNotifier.java +++ b/opendaylight/protocol_plugins/openflow/src/main/java/org/opendaylight/controller/protocol_plugin/openflow/internal/FlowProgrammerNotifier.java @@ -83,4 +83,13 @@ public class FlowProgrammerNotifier implements IFlowProgrammerNotifier { } } + @Override + public void flowErrorReported(Node node, long rid, Object err) { + if (salNotifier != null) { + salNotifier.flowErrorReported(node, rid, err); + } else { + logger.warn("Unable to relay switch error message to upper layer"); + } + } + } diff --git a/opendaylight/protocol_plugins/openflow/src/main/java/org/opendaylight/controller/protocol_plugin/openflow/internal/FlowProgrammerService.java b/opendaylight/protocol_plugins/openflow/src/main/java/org/opendaylight/controller/protocol_plugin/openflow/internal/FlowProgrammerService.java index c8ae922902..4d3dca1878 100644 --- a/opendaylight/protocol_plugins/openflow/src/main/java/org/opendaylight/controller/protocol_plugin/openflow/internal/FlowProgrammerService.java +++ b/opendaylight/protocol_plugins/openflow/src/main/java/org/opendaylight/controller/protocol_plugin/openflow/internal/FlowProgrammerService.java @@ -117,6 +117,7 @@ public class FlowProgrammerService implements IPluginInFlowProgrammerService, */ void init() { this.controller.addMessageListener(OFType.FLOW_REMOVED, this); + this.controller.addMessageListener(OFType.ERROR, this); registerWithOSGIConsole(); } @@ -398,6 +399,8 @@ public class FlowProgrammerService implements IPluginInFlowProgrammerService, public void receive(ISwitch sw, OFMessage msg) { if (msg instanceof OFFlowRemoved) { handleFlowRemovedMessage(sw, (OFFlowRemoved) msg); + } else if (msg instanceof OFError) { + handleErrorMessage(sw, (OFError) msg); } } @@ -432,6 +435,24 @@ public class FlowProgrammerService implements IPluginInFlowProgrammerService, } } + private void handleErrorMessage(ISwitch sw, OFError errorMsg) { + Node node = NodeCreator.createOFNode(sw.getId()); + OFMessage offendingMsg = errorMsg.getOffendingMsg(); + Integer xid; + if (offendingMsg != null) { + xid = offendingMsg.getXid(); + } else { + xid = errorMsg.getXid(); + } + + long rid = getMessageRid(sw.getId(), xid); + for (Map.Entry containerNotifier : flowProgrammerNotifiers + .entrySet()) { + IFlowProgrammerNotifier notifier = containerNotifier.getValue(); + notifier.flowErrorReported(node, rid, errorMsg); + } + } + @Override public void tagUpdated(String containerName, Node n, short oldTag, short newTag, UpdateType t) { diff --git a/opendaylight/sal/api/src/main/java/org/opendaylight/controller/sal/flowprogrammer/IPluginOutFlowProgrammerService.java b/opendaylight/sal/api/src/main/java/org/opendaylight/controller/sal/flowprogrammer/IPluginOutFlowProgrammerService.java index 2836f77afa..f1b80272d4 100644 --- a/opendaylight/sal/api/src/main/java/org/opendaylight/controller/sal/flowprogrammer/IPluginOutFlowProgrammerService.java +++ b/opendaylight/sal/api/src/main/java/org/opendaylight/controller/sal/flowprogrammer/IPluginOutFlowProgrammerService.java @@ -28,4 +28,18 @@ public interface IPluginOutFlowProgrammerService { * and flow parameters fields. Actions may not be present. */ public void flowRemoved(Node node, Flow flow); + + /** + * Inform SAL that an error message has been received from a switch + * regarding a flow message previously sent to the switch. A Request ID + * associated with the offending message is also returned. + * + * @param node + * the network node on which the error reported + * @param rid + * the offending message request id + * @param err + * the error message + */ + public void flowErrorReported(Node node, long rid, Object err); } diff --git a/opendaylight/sal/implementation/src/main/java/org/opendaylight/controller/sal/implementation/internal/FlowProgrammerService.java b/opendaylight/sal/implementation/src/main/java/org/opendaylight/controller/sal/implementation/internal/FlowProgrammerService.java index f85420ee3e..1c63e4e200 100644 --- a/opendaylight/sal/implementation/src/main/java/org/opendaylight/controller/sal/implementation/internal/FlowProgrammerService.java +++ b/opendaylight/sal/implementation/src/main/java/org/opendaylight/controller/sal/implementation/internal/FlowProgrammerService.java @@ -261,6 +261,16 @@ public class FlowProgrammerService implements IFlowProgrammerService, } } + @Override + public void flowErrorReported(Node node, long rid, Object err) { + logger.error("Got error {} for message rid {} from node {}", + new Object[] { err, rid, node }); + + for (IFlowProgrammerListener l : listener) { + l.flowErrorReported(node, rid, err); + } + } + // ---------------- OSGI TEST CODE ------------------------------// private void registerWithOSGIConsole() { @@ -481,9 +491,11 @@ public class FlowProgrammerService implements IFlowProgrammerService, return flow; } - /* + /** * This Request ID generator starts with 1. Each aysnc message is * associated with an unique Request ID (!= 0). + * + * @return Request ID */ private long getNextRid() { return seq.getAndIncrement(); -- 2.36.6