Add method to register listener for unknown msg
[openflowjava.git] / openflow-protocol-impl / src / main / java / org / opendaylight / openflowjava / protocol / impl / core / connection / ConnectionAdapterImpl.java
index 8d9c87466a337039f15719754a57ccbf392118c4..e9de9ca253a27fbb178872ec46d6e139f555410e 100644 (file)
@@ -15,6 +15,7 @@ import java.net.InetSocketAddress;
 import org.opendaylight.openflowjava.protocol.api.connection.ConnectionReadyListener;
 import org.opendaylight.openflowjava.protocol.api.connection.OutboundQueueHandler;
 import org.opendaylight.openflowjava.protocol.api.connection.OutboundQueueHandlerRegistration;
+import org.opendaylight.openflowjava.protocol.api.extensibility.AlienMessageListener;
 import org.opendaylight.openflowjava.protocol.impl.core.OFVersionDetector;
 import org.opendaylight.openflowjava.protocol.impl.core.PipelineHandlers;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.EchoRequestMessage;
@@ -47,6 +48,7 @@ public class ConnectionAdapterImpl extends AbstractConnectionAdapterStatistics i
     private ConnectionReadyListener connectionReadyListener;
     private OpenflowProtocolListener messageListener;
     private SystemNotificationsListener systemListener;
+    private AlienMessageListener alienMessageListener;
     private AbstractOutboundQueueManager<?, ?> outputManager;
     private OFVersionDetector versionDetector;
 
@@ -80,6 +82,11 @@ public class ConnectionAdapterImpl extends AbstractConnectionAdapterStatistics i
         this.systemListener = systemListener;
     }
 
+    @Override
+    public void setAlienMessageListener(final AlienMessageListener alienMessageListener) {
+        this.alienMessageListener = alienMessageListener;
+    }
+
     @Override
     public void consumeDeviceMessage(final DataObject message) {
         LOG.debug("ConsumeIntern msg on {}", channel);
@@ -131,19 +138,24 @@ public class ConnectionAdapterImpl extends AbstractConnectionAdapterStatistics i
             }
         } else if (message instanceof OfHeader) {
             LOG.debug("OF header msg received");
+            boolean found = false;
 
             if (outputManager == null || !outputManager.onMessage((OfHeader) message)) {
                 final RpcResponseKey key = createRpcResponseKey((OfHeader) message);
                 final ResponseExpectedRpcListener<?> listener = findRpcResponse(key);
                 if (listener != null) {
+                    found = true;
                     LOG.debug("Corresponding rpcFuture found");
-                    listener.completed((OfHeader)message);
+                    listener.completed((OfHeader) message);
                     LOG.debug("After setting rpcFuture");
                     responseCache.invalidate(key);
-                } else {
-                    LOG.warn("received unexpected rpc response: {}", key);
                 }
             }
+
+            if (!found && alienMessageListener != null) {
+                LOG.debug("Alien message {} received", message.getImplementedInterface());
+                alienMessageListener.onAlienMessage((OfHeader) message);
+            }
         } else {
             LOG.warn("message listening not supported for type: {}", message.getClass());
         }