/**
* 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.listener;
import java.util.concurrent.Future;
import org.opendaylight.openflowjava.protocol.api.connection.ConnectionReadyListener;
import org.opendaylight.openflowplugin.api.openflow.connection.ConnectionContext;
import org.opendaylight.openflowplugin.api.openflow.connection.HandshakeContext;
import org.opendaylight.openflowplugin.openflow.md.core.HandshakeStepWrapper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* oneshot listener - once connection is ready, initiate handshake (if not already started by device)
*/
public class ConnectionReadyListenerImpl implements ConnectionReadyListener {
private static final Logger LOG = LoggerFactory.getLogger(ConnectionReadyListenerImpl.class);
private ConnectionContext connectionContext;
private HandshakeContext handshakeContext;
/**
* @param connectionContext
* @param handshakeContext
*/
public ConnectionReadyListenerImpl(ConnectionContext connectionContext,
HandshakeContext handshakeContext) {
this.connectionContext = connectionContext;
this.handshakeContext = handshakeContext;
}
@Override
public void onConnectionReady() {
if(LOG.isDebugEnabled()) {
LOG.debug("device is connected and ready-to-use (pipeline prepared): {}",
connectionContext.getConnectionAdapter().getRemoteAddress());
}
if (connectionContext.getConnectionState() == null) {
synchronized (connectionContext) {
if (connectionContext.getConnectionState() == null) {
connectionContext.changeStateToHandshaking();
HandshakeStepWrapper handshakeStepWrapper = new HandshakeStepWrapper(
null, handshakeContext.getHandshakeManager(), connectionContext.getConnectionAdapter());
final Future<?> handshakeResult = handshakeContext.getHandshakePool().submit(handshakeStepWrapper);
try {
// as we run not in netty thread, need to remain in sync lock until initial handshake step processed
handshakeResult.get();
} catch (Exception e) {
LOG.error("failed to process onConnectionReady event on device {}, reason {}",
connectionContext.getConnectionAdapter().getRemoteAddress(),
e);
connectionContext.closeConnection(false);
try {
handshakeContext.close();
} catch (Exception e1) {
LOG.error("failed to close handshake context for device {}, reason {}",
connectionContext.getConnectionAdapter().getRemoteAddress(),
e1
);
}
}
} else {
LOG.debug("already touched by hello message from device {} after second check",
connectionContext.getConnectionAdapter().getRemoteAddress());
}
}
} else {
LOG.debug("already touched by hello message from device {} after first check",
connectionContext.getConnectionAdapter().getRemoteAddress());
}
}
}