*/
void init() {
this.controller.addMessageListener(OFType.FLOW_REMOVED, this);
+ this.controller.addMessageListener(OFType.ERROR, this);
registerWithOSGIConsole();
}
public void receive(ISwitch sw, OFMessage msg) {
if (msg instanceof OFFlowRemoved) {
handleFlowRemovedMessage(sw, (OFFlowRemoved) msg);
+ } else if (msg instanceof OFError) {
+ handleErrorMessage(sw, (OFError) msg);
}
}
}
}
+ 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) {
* 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);
}
}
}
+ @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() {
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();