* 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.openflowplugin.impl.connection;
-import org.opendaylight.openflowplugin.openflow.md.core.ErrorHandlerSimpleImpl;
+package org.opendaylight.openflowplugin.impl.connection;
import java.net.InetAddress;
-import java.util.concurrent.ArrayBlockingQueue;
-import java.util.concurrent.TimeUnit;
-
+import java.util.concurrent.ThreadPoolExecutor;
import org.opendaylight.openflowjava.protocol.api.connection.ConnectionAdapter;
import org.opendaylight.openflowjava.protocol.api.connection.ConnectionReadyListener;
import org.opendaylight.openflowplugin.api.openflow.connection.ConnectionContext;
import org.opendaylight.openflowplugin.api.openflow.connection.ConnectionManager;
import org.opendaylight.openflowplugin.api.openflow.connection.HandshakeContext;
import org.opendaylight.openflowplugin.api.openflow.device.handlers.DeviceConnectedHandler;
-import org.opendaylight.openflowplugin.api.openflow.device.handlers.MessageHandler;
+import org.opendaylight.openflowplugin.api.openflow.device.handlers.DeviceDisconnectedHandler;
import org.opendaylight.openflowplugin.api.openflow.md.core.ConnectionConductor;
import org.opendaylight.openflowplugin.api.openflow.md.core.HandshakeListener;
import org.opendaylight.openflowplugin.api.openflow.md.core.HandshakeManager;
import org.opendaylight.openflowplugin.impl.connection.listener.ConnectionReadyListenerImpl;
import org.opendaylight.openflowplugin.impl.connection.listener.HandshakeListenerImpl;
-import org.opendaylight.openflowplugin.impl.connection.listener.OpenflowProtocolListenerImpl;
+import org.opendaylight.openflowplugin.impl.connection.listener.OpenflowProtocolListenerInitialImpl;
import org.opendaylight.openflowplugin.impl.connection.listener.SystemNotificationsListenerImpl;
+import org.opendaylight.openflowplugin.openflow.md.core.ErrorHandlerSimpleImpl;
import org.opendaylight.openflowplugin.openflow.md.core.HandshakeManagerImpl;
-import org.opendaylight.openflowplugin.openflow.md.core.ThreadPoolLoggingExecutor;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OpenflowProtocolListener;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.system.rev130927.SystemNotificationsListener;
import org.slf4j.Logger;
public class ConnectionManagerImpl implements ConnectionManager {
private static final Logger LOG = LoggerFactory.getLogger(ConnectionManagerImpl.class);
- private static final int HELLO_LIMIT = 20;
- private boolean bitmapNegotiationEnabled = true;
+ private static final boolean BITMAP_NEGOTIATION_ENABLED = true;
private DeviceConnectedHandler deviceConnectedHandler;
+ private long echoReplyTimeout = 2000;
+ private final ThreadPoolExecutor threadPool;
+ private DeviceDisconnectedHandler deviceDisconnectedHandler;
+
+ public ConnectionManagerImpl(final ThreadPoolExecutor threadPool) {
+ this.threadPool = threadPool;
+ }
@Override
public void onSwitchConnected(final ConnectionAdapter connectionAdapter) {
- LOG.trace("preparing handshake");
-
- final int handshakeThreadLimit = 1; //TODO: move to constants/parametrize
- final ThreadPoolLoggingExecutor handshakePool = createHandshakePool(
- connectionAdapter.getRemoteAddress().toString(), handshakeThreadLimit);
-
LOG.trace("prepare connection context");
final ConnectionContext connectionContext = new ConnectionContextImpl(connectionAdapter);
+ connectionContext.setDeviceDisconnectedHandler(this.deviceDisconnectedHandler);
HandshakeListener handshakeListener = new HandshakeListenerImpl(connectionContext, deviceConnectedHandler);
final HandshakeManager handshakeManager = createHandshakeManager(connectionAdapter, handshakeListener);
LOG.trace("prepare handshake context");
- HandshakeContext handshakeContext = new HandshakeContextImpl(handshakePool, handshakeManager);
+ HandshakeContext handshakeContext = new HandshakeContextImpl(threadPool, handshakeManager);
+ handshakeListener.setHandshakeContext(handshakeContext);
+ connectionContext.setHandshakeContext(handshakeContext);
LOG.trace("prepare connection listeners");
final ConnectionReadyListener connectionReadyListener = new ConnectionReadyListenerImpl(
connectionAdapter.setConnectionReadyListener(connectionReadyListener);
final OpenflowProtocolListener ofMessageListener =
- new OpenflowProtocolListenerImpl(connectionContext, handshakeContext);
+ new OpenflowProtocolListenerInitialImpl(connectionContext, handshakeContext);
connectionAdapter.setMessageListener(ofMessageListener);
- final SystemNotificationsListener systemListener = new SystemNotificationsListenerImpl(connectionContext);
+ final SystemNotificationsListener systemListener = new SystemNotificationsListenerImpl(connectionContext, echoReplyTimeout, threadPool);
connectionAdapter.setSystemListener(systemListener);
- LOG.trace("connection balet finished");
- }
-
- /**
- * @param connectionIdentifier
- * @param handshakeThreadLimit
- * @return
- */
- private static ThreadPoolLoggingExecutor createHandshakePool(
- final String connectionIdentifier, int handshakeThreadLimit) {
- return new ThreadPoolLoggingExecutor(handshakeThreadLimit,
- handshakeThreadLimit, 0L, TimeUnit.MILLISECONDS,
- new ArrayBlockingQueue<Runnable>(HELLO_LIMIT), "OFHandshake-" + connectionIdentifier);
+ LOG.trace("connection ballet finished");
}
/**
* @return
*/
private HandshakeManager createHandshakeManager(final ConnectionAdapter connectionAdapter,
- HandshakeListener handshakeListener) {
+ final HandshakeListener handshakeListener) {
HandshakeManagerImpl handshakeManager = new HandshakeManagerImpl(connectionAdapter,
- ConnectionConductor.versionOrder.get(0),
- ConnectionConductor.versionOrder);
- handshakeManager.setUseVersionBitmap(isBitmapNegotiationEnabled());
+ ConnectionConductor.VERSION_ORDER.get(0),
+ ConnectionConductor.VERSION_ORDER);
+ handshakeManager.setUseVersionBitmap(BITMAP_NEGOTIATION_ENABLED);
handshakeManager.setHandshakeListener(handshakeListener);
handshakeManager.setErrorHandler(new ErrorHandlerSimpleImpl());
return handshakeManager;
}
- /**
- * @return parameter dedicated to hello message content
- */
- public boolean isBitmapNegotiationEnabled() {
- return bitmapNegotiationEnabled ;
- }
-
- /**
- * @param bitmapNegotiationEnabled the bitmapNegotiationEnabled to set
- */
- public void setBitmapNegotiationEnabled(boolean bitmapNegotiationEnabled) {
- this.bitmapNegotiationEnabled = bitmapNegotiationEnabled;
- }
-
@Override
- public boolean accept(InetAddress switchAddress) {
+ public boolean accept(final InetAddress switchAddress) {
// TODO add connection accept logic based on address
return true;
}
@Override
- public void setDeviceConnectedHandler(DeviceConnectedHandler deviceConnectedHandler) {
+ public void setDeviceConnectedHandler(final DeviceConnectedHandler deviceConnectedHandler) {
this.deviceConnectedHandler = deviceConnectedHandler;
}
@Override
- public void setMessageHandler(MessageHandler arg0) {
- // TODO Auto-generated method stub
+ public void setDeviceDisconnectedHandler(final DeviceDisconnectedHandler deviceDisconnectedHandler) {
+ this.deviceDisconnectedHandler = deviceDisconnectedHandler;
+ }
+ @Override
+ public void setEchoReplyTimeout(long echoReplyTimeout){
+ this.echoReplyTimeout = echoReplyTimeout;
}
}