When plugin receives error msg from the switch regarding a flow message sent to the... 47/247/1 v0.4.0
authorJason Ye <yisye@cisco.com>
Thu, 25 Apr 2013 01:57:10 +0000 (18:57 -0700)
committerJason Ye <yisye@cisco.com>
Thu, 25 Apr 2013 01:57:10 +0000 (18:57 -0700)
Signed-off-by: Jason Ye <yisye@cisco.com>
opendaylight/forwardingrulesmanager/implementation/src/main/java/org/opendaylight/controller/forwardingrulesmanager/internal/ForwardingRulesManagerImpl.java
opendaylight/protocol_plugins/openflow/src/main/java/org/opendaylight/controller/protocol_plugin/openflow/internal/FlowProgrammerNotifier.java
opendaylight/protocol_plugins/openflow/src/main/java/org/opendaylight/controller/protocol_plugin/openflow/internal/FlowProgrammerService.java
opendaylight/sal/api/src/main/java/org/opendaylight/controller/sal/flowprogrammer/IPluginOutFlowProgrammerService.java
opendaylight/sal/implementation/src/main/java/org/opendaylight/controller/sal/implementation/internal/FlowProgrammerService.java

index b82ab6f9a850b43d0c41b6313538d96268b86e6e..c86363fef6afa613df1ed4de241dd18b9101e0e6 100644 (file)
@@ -2422,4 +2422,9 @@ public class ForwardingRulesManagerImpl implements IForwardingRulesManager,
         this.updateLocalDatabase(installedEntry, false);
     }
 
         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 });
+    }
 }
 }
index 594164ddcf800948197df5a9fc87159c84a03d1f..cad0dfa8078e0d642339d4f49d55ae4015290c75 100644 (file)
@@ -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");
+        }
+    }
+
 }
 }
index c8ae9229027895ca6e56bc8d7671270483deeb51..4d3dca187863d5943b69a06e8f2cf8c88e2aa11f 100644 (file)
@@ -117,6 +117,7 @@ public class FlowProgrammerService implements IPluginInFlowProgrammerService,
      */
     void init() {
         this.controller.addMessageListener(OFType.FLOW_REMOVED, this);
      */
     void init() {
         this.controller.addMessageListener(OFType.FLOW_REMOVED, this);
+        this.controller.addMessageListener(OFType.ERROR, this);
         registerWithOSGIConsole();
     }
 
         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);
     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<String, IFlowProgrammerNotifier> 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) {
     @Override
     public void tagUpdated(String containerName, Node n, short oldTag,
             short newTag, UpdateType t) {
index 2836f77afa64a0775b5281b9634874b393d780f2..f1b80272d43083da329a4528679c2b7562a7b978 100644 (file)
@@ -28,4 +28,18 @@ public interface IPluginOutFlowProgrammerService {
      *            and flow parameters fields. Actions may not be present.
      */
     public void flowRemoved(Node node, Flow flow);
      *            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);
 }
 }
index f85420ee3e099ff66394bf0f15b3f7fe74570cda..1c63e4e2005c1d04024ecca4c46a0276e92870e3 100644 (file)
@@ -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() {
     // ---------------- OSGI TEST CODE ------------------------------//
 
     private void registerWithOSGIConsole() {
@@ -481,9 +491,11 @@ public class FlowProgrammerService implements IFlowProgrammerService,
         return flow;
     }
 
         return flow;
     }
 
-    /*
+    /**
      * This Request ID generator starts with 1. Each aysnc message is
      * associated with an unique Request ID (!= 0).
      * 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();
      */
     private long getNextRid() {
         return seq.getAndIncrement();