X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=openflowplugin-impl%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fopenflowplugin%2Fimpl%2Fconnection%2FConnectionManagerImpl.java;h=3507dd1eddea324b27a6c44df089c5d9a1e50fe0;hb=13e1d5e6c0237b9378d60526dd8c1d79db6d2b49;hp=544e7124ba44bb6627efc050820b2803a5715545;hpb=62e60da3eb606ded7bf443dd025b8de51cb9d2ab;p=openflowplugin.git diff --git a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/connection/ConnectionManagerImpl.java b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/connection/ConnectionManagerImpl.java index 544e7124ba..3507dd1edd 100644 --- a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/connection/ConnectionManagerImpl.java +++ b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/connection/ConnectionManagerImpl.java @@ -1,70 +1,62 @@ -/** +/* * Copyright (c) 2015 Cisco Systems, Inc. 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.openflowplugin.impl.connection; import java.net.InetAddress; -import java.util.concurrent.ArrayBlockingQueue; -import java.util.concurrent.TimeUnit; +import java.util.concurrent.ExecutorService; import org.opendaylight.openflowjava.protocol.api.connection.ConnectionAdapter; import org.opendaylight.openflowjava.protocol.api.connection.ConnectionReadyListener; +import org.opendaylight.openflowplugin.api.OFConstants; 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.md.core.ConnectionConductor; +import org.opendaylight.openflowplugin.api.openflow.device.handlers.DeviceDisconnectedHandler; import org.opendaylight.openflowplugin.api.openflow.md.core.HandshakeListener; import org.opendaylight.openflowplugin.api.openflow.md.core.HandshakeManager; +import org.opendaylight.openflowplugin.impl.common.DeviceConnectionRateLimiter; import org.opendaylight.openflowplugin.impl.connection.listener.ConnectionReadyListenerImpl; import org.opendaylight.openflowplugin.impl.connection.listener.HandshakeListenerImpl; 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.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.openflow.provider.config.rev160510.OpenflowProviderConfig; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -/** - * - */ public class ConnectionManagerImpl implements ConnectionManager { private static final Logger LOG = LoggerFactory.getLogger(ConnectionManagerImpl.class); - private static final int HELLO_LIMIT = 20; - private final boolean bitmapNegotiationEnabled = true; + private static final boolean BITMAP_NEGOTIATION_ENABLED = true; private DeviceConnectedHandler deviceConnectedHandler; - private final long echoReplyTimeout; - - public ConnectionManagerImpl(long echoReplyTimeout) { - this.echoReplyTimeout = echoReplyTimeout; + private final OpenflowProviderConfig config; + private final ExecutorService executorService; + private final DeviceConnectionRateLimiter deviceConnectionRateLimiter; + private DeviceDisconnectedHandler deviceDisconnectedHandler; + + public ConnectionManagerImpl(final OpenflowProviderConfig config, final ExecutorService executorService) { + this.config = config; + this.executorService = executorService; + this.deviceConnectionRateLimiter = new DeviceConnectionRateLimiter(config); } - @Override public void onSwitchConnected(final ConnectionAdapter connectionAdapter) { - - LOG.trace("preparing handshake: {}", connectionAdapter.getRemoteAddress()); - - final int handshakeThreadLimit = 1; - 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(executorService, handshakeManager); handshakeListener.setHandshakeContext(handshakeContext); connectionContext.setHandshakeContext(handshakeContext); @@ -77,49 +69,23 @@ public class ConnectionManagerImpl implements ConnectionManager { new OpenflowProtocolListenerInitialImpl(connectionContext, handshakeContext); connectionAdapter.setMessageListener(ofMessageListener); - final SystemNotificationsListener systemListener = new SystemNotificationsListenerImpl(connectionContext, echoReplyTimeout); + final SystemNotificationsListener systemListener = new SystemNotificationsListenerImpl( + connectionContext, config.getEchoReplyTimeout().getValue().toJava(), executorService); connectionAdapter.setSystemListener(systemListener); LOG.trace("connection ballet finished"); } - /** - * @param connectionIdentifier - * @param handshakeThreadLimit - * @return - */ - private static ThreadPoolLoggingExecutor createHandshakePool( - final String connectionIdentifier, final int handshakeThreadLimit) { - return new ThreadPoolLoggingExecutor(handshakeThreadLimit, - handshakeThreadLimit, 0L, TimeUnit.MILLISECONDS, - new ArrayBlockingQueue(HELLO_LIMIT), "OFHandshake-" + connectionIdentifier); - } - - /** - * @param connectionAdapter - * @param handshakeListener - * @return - */ private HandshakeManager createHandshakeManager(final ConnectionAdapter connectionAdapter, final HandshakeListener handshakeListener) { HandshakeManagerImpl handshakeManager = new HandshakeManagerImpl(connectionAdapter, - ConnectionConductor.versionOrder.get(0), - ConnectionConductor.versionOrder); - handshakeManager.setUseVersionBitmap(isBitmapNegotiationEnabled()); - handshakeManager.setHandshakeListener(handshakeListener); - handshakeManager.setErrorHandler(new ErrorHandlerSimpleImpl()); + OFConstants.VERSION_ORDER.get(0), + OFConstants.VERSION_ORDER, new ErrorHandlerSimpleImpl(), handshakeListener, BITMAP_NEGOTIATION_ENABLED, + deviceConnectionRateLimiter); return handshakeManager; } - /** - * @return parameter dedicated to hello message content - */ - public boolean isBitmapNegotiationEnabled() { - return bitmapNegotiationEnabled; - } - - @Override public boolean accept(final InetAddress switchAddress) { // TODO add connection accept logic based on address @@ -130,4 +96,9 @@ public class ConnectionManagerImpl implements ConnectionManager { public void setDeviceConnectedHandler(final DeviceConnectedHandler deviceConnectedHandler) { this.deviceConnectedHandler = deviceConnectedHandler; } + + @Override + public void setDeviceDisconnectedHandler(final DeviceDisconnectedHandler deviceDisconnectedHandler) { + this.deviceDisconnectedHandler = deviceDisconnectedHandler; + } }