import com.google.common.annotations.Beta;
import java.net.InetSocketAddress;
import java.util.concurrent.Future;
+import org.opendaylight.openflowjava.protocol.api.extensibility.AlienMessageListener;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OpenflowProtocolListener;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OpenflowProtocolService;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.system.rev130927.SystemNotificationsListener;
* @return address of the remote end - address of a switch if connected
*/
InetSocketAddress getRemoteAddress();
+
/**
* @param messageListener here will be pushed all messages from switch
*/
*/
void setSystemListener(SystemNotificationsListener systemListener);
+ /**
+ * Set handler for alien messages received from device
+ * @param alienMessageListener here will be pushed all alien messages from switch
+ */
+ void setAlienMessageListener(AlienMessageListener alienMessageListener);
+
/**
* Throws exception if any of required listeners is missing
*/
--- /dev/null
+/*
+ * Copyright (c) 2017 Pantheon Technologies s.r.o. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.openflowjava.protocol.api.extensibility;
+
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OfHeader;
+
+public interface AlienMessageListener {
+
+ /**
+ * Handler for alien but successfully deserialized messages for device
+ * @param message alien message
+ */
+ void onAlienMessage(OfHeader message);
+}
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;
private ConnectionReadyListener connectionReadyListener;
private OpenflowProtocolListener messageListener;
private SystemNotificationsListener systemListener;
+ private AlienMessageListener alienMessageListener;
private AbstractOutboundQueueManager<?, ?> outputManager;
private OFVersionDetector versionDetector;
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);
}
} 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());
}