X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=openflow-protocol-impl%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fopenflowjava%2Fprotocol%2Fimpl%2Fcore%2FPublishingChannelInitializer.java;h=5a35864b4184f429daa3585dbdb7208090ba5fd3;hb=1adc52b6fedfc7ecdb03cb6cab5ae7da3bfb52e4;hp=fdd2d1dad793f167e77b7b5058317ee486f1ee3e;hpb=1fe648172a622601f42a3b1c5e53e17f4d41d14b;p=openflowjava.git diff --git a/openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/core/PublishingChannelInitializer.java b/openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/core/PublishingChannelInitializer.java index fdd2d1da..5a35864b 100644 --- a/openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/core/PublishingChannelInitializer.java +++ b/openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/core/PublishingChannelInitializer.java @@ -1,74 +1,133 @@ -package org.opendaylight.openflowjava.protocol.impl.core; - -import io.netty.channel.Channel; -import io.netty.channel.ChannelInitializer; -import io.netty.channel.group.DefaultChannelGroup; -import io.netty.channel.socket.SocketChannel; - -import java.util.Iterator; - -import org.opendaylight.openflowjava.protocol.api.connection.SwitchConnectionHandler; -import org.opendaylight.openflowjava.protocol.impl.connection.ConnectionAdapterFactory; -import org.opendaylight.openflowjava.protocol.impl.connection.ConnectionFacade; -import org.opendaylight.openflowjava.protocol.impl.core.TcpHandler.COMPONENT_NAMES; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * @author michal.polkorab - * - */ -public class PublishingChannelInitializer extends ChannelInitializer { - - private static final Logger LOGGER = LoggerFactory - .getLogger(PublishingChannelInitializer.class); - private DefaultChannelGroup allChannels; - private SwitchConnectionHandler switchConnectionHandler; - - /** - * default ctor - */ - public PublishingChannelInitializer() { - allChannels = new DefaultChannelGroup("netty-receiver", null); - } - - @Override - protected void initChannel(SocketChannel ch) { - LOGGER.debug("building pipeline"); - // TODO - call switchConnectionHandler accept first - allChannels.add(ch); - ConnectionFacade connectionAdapter = null; - connectionAdapter = ConnectionAdapterFactory.createConnectionAdapter(ch); - try { - LOGGER.debug("calling plugin: "+switchConnectionHandler); - switchConnectionHandler.onSwitchConnected(connectionAdapter); - connectionAdapter.checkListeners(); - ch.pipeline().addLast(COMPONENT_NAMES.TLS_DETECTOR.name(), new TlsDetector()); - ch.pipeline().addLast(COMPONENT_NAMES.DELEGATING_INBOUND_HANDLER.name(), new DelegatingInboundHandler(connectionAdapter)); - } catch (Exception e) { - LOGGER.error(e.getMessage(), e); - ch.close(); - } - } - - /** - * @return iterator through active connections - */ - public Iterator getConnectionIterator() { - return allChannels.iterator(); - } - - /** - * @return amount of active channels - */ - public int size() { - return allChannels.size(); - } - - /** - * @param switchConnectionHandler the switchConnectionHandler to set - */ - public void setSwitchConnectionHandler(SwitchConnectionHandler switchConnectionHandler) { - this.switchConnectionHandler = switchConnectionHandler; - } -} +/* + * Copyright (c) 2013 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.impl.core; + +import io.netty.channel.Channel; +import io.netty.channel.ChannelInitializer; +import io.netty.channel.group.DefaultChannelGroup; +import io.netty.channel.socket.SocketChannel; + +import java.net.InetAddress; +import java.util.Iterator; +import java.util.concurrent.TimeUnit; + +import org.opendaylight.openflowjava.protocol.api.connection.SwitchConnectionHandler; +import org.opendaylight.openflowjava.protocol.impl.connection.ConnectionAdapterFactory; +import org.opendaylight.openflowjava.protocol.impl.connection.ConnectionFacade; +import org.opendaylight.openflowjava.protocol.impl.core.TcpHandler.COMPONENT_NAMES; +import org.opendaylight.openflowjava.protocol.impl.serialization.SerializationFactory; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Initializes the channel + * @author michal.polkorab + */ +public class PublishingChannelInitializer extends ChannelInitializer { + + private static final Logger LOGGER = LoggerFactory + .getLogger(PublishingChannelInitializer.class); + private DefaultChannelGroup allChannels; + private SwitchConnectionHandler switchConnectionHandler; + private long switchIdleTimeout; + private boolean encryption; + private SerializationFactory serializationFactory; + + /** + * default ctor + */ + public PublishingChannelInitializer() { + allChannels = new DefaultChannelGroup("netty-receiver", null); + } + + @Override + protected void initChannel(SocketChannel ch) { + InetAddress switchAddress = ch.remoteAddress().getAddress(); + int port = ch.localAddress().getPort(); + int remotePort = ch.remoteAddress().getPort(); + LOGGER.info("Incoming connection from (remote address): " + switchAddress.toString() + + ":" + remotePort + " --> :" + port); + if (!switchConnectionHandler.accept(switchAddress)) { + ch.disconnect(); + LOGGER.info("Incoming connection rejected"); + return; + } + LOGGER.info("Incoming connection accepted - building pipeline"); + allChannels.add(ch); + ConnectionFacade connectionFacade = null; + connectionFacade = ConnectionAdapterFactory.createConnectionFacade(ch); + try { + LOGGER.debug("calling plugin: "+switchConnectionHandler); + switchConnectionHandler.onSwitchConnected(connectionFacade); + connectionFacade.checkListeners(); + TlsDetector tlsDetector; + ch.pipeline().addLast(COMPONENT_NAMES.IDLE_HANDLER.name(), new IdleHandler(switchIdleTimeout, 0, 0, TimeUnit.MILLISECONDS)); + if (encryption) { + tlsDetector = new TlsDetector(); + tlsDetector.setConnectionFacade(connectionFacade); + ch.pipeline().addLast(COMPONENT_NAMES.TLS_DETECTOR.name(), tlsDetector); + } + ch.pipeline().addLast(COMPONENT_NAMES.OF_FRAME_DECODER.name(), new OFFrameDecoder()); + ch.pipeline().addLast(COMPONENT_NAMES.OF_VERSION_DETECTOR.name(), new OFVersionDetector()); + ch.pipeline().addLast(COMPONENT_NAMES.OF_DECODER.name(), new OFDecoder()); + OFEncoder ofEncoder = new OFEncoder(); + ofEncoder.setSerializationFactory(serializationFactory); + ch.pipeline().addLast(COMPONENT_NAMES.OF_ENCODER.name(), ofEncoder); + ch.pipeline().addLast(COMPONENT_NAMES.DELEGATING_INBOUND_HANDLER.name(), new DelegatingInboundHandler(connectionFacade)); + if (!encryption) { + connectionFacade.fireConnectionReadyNotification(); + } + } catch (Exception e) { + LOGGER.error(e.getMessage(), e); + ch.close(); + } + } + + /** + * @return iterator through active connections + */ + public Iterator getConnectionIterator() { + return allChannels.iterator(); + } + + /** + * @return amount of active channels + */ + public int size() { + return allChannels.size(); + } + + /** + * @param switchConnectionHandler the switchConnectionHandler to set + */ + public void setSwitchConnectionHandler(SwitchConnectionHandler switchConnectionHandler) { + this.switchConnectionHandler = switchConnectionHandler; + } + + /** + * @param switchIdleTimeout the switchIdleTimeout to set + */ + public void setSwitchIdleTimeout(long switchIdleTimeout) { + this.switchIdleTimeout = switchIdleTimeout; + } + + /** + * @param tlsSupported + */ + public void setEncryption(boolean tlsSupported) { + encryption = tlsSupported; + } + + /** + * @param serializationFactory + */ + public void setSerializationFactory(SerializationFactory serializationFactory) { + this.serializationFactory = serializationFactory; + } +}