Extensibility support (serialization part)
[openflowjava.git] / openflow-protocol-impl / src / main / java / org / opendaylight / openflowjava / protocol / impl / core / PublishingChannelInitializer.java
index fdd2d1dad793f167e77b7b5058317ee486f1ee3e..5a35864b4184f429daa3585dbdb7208090ba5fd3 100644 (file)
-package org.opendaylight.openflowjava.protocol.impl.core;\r
-\r
-import io.netty.channel.Channel;\r
-import io.netty.channel.ChannelInitializer;\r
-import io.netty.channel.group.DefaultChannelGroup;\r
-import io.netty.channel.socket.SocketChannel;\r
-\r
-import java.util.Iterator;\r
-\r
-import org.opendaylight.openflowjava.protocol.api.connection.SwitchConnectionHandler;\r
-import org.opendaylight.openflowjava.protocol.impl.connection.ConnectionAdapterFactory;\r
-import org.opendaylight.openflowjava.protocol.impl.connection.ConnectionFacade;\r
-import org.opendaylight.openflowjava.protocol.impl.core.TcpHandler.COMPONENT_NAMES;\r
-import org.slf4j.Logger;\r
-import org.slf4j.LoggerFactory;\r
-\r
-/**\r
- * @author michal.polkorab\r
- *\r
- */\r
-public class PublishingChannelInitializer extends ChannelInitializer<SocketChannel> {\r
-\r
-    private static final Logger LOGGER = LoggerFactory\r
-            .getLogger(PublishingChannelInitializer.class);\r
-    private DefaultChannelGroup allChannels;\r
-    private SwitchConnectionHandler switchConnectionHandler;\r
-    \r
-    /**\r
-     * default ctor\r
-     */\r
-    public PublishingChannelInitializer() {\r
-        allChannels = new DefaultChannelGroup("netty-receiver", null);\r
-    }\r
-    \r
-    @Override\r
-    protected void initChannel(SocketChannel ch) {\r
-        LOGGER.debug("building pipeline");\r
-        // TODO - call switchConnectionHandler accept first\r
-        allChannels.add(ch);\r
-        ConnectionFacade connectionAdapter = null;\r
-        connectionAdapter = ConnectionAdapterFactory.createConnectionAdapter(ch);\r
-        try {\r
-            LOGGER.debug("calling plugin: "+switchConnectionHandler);\r
-            switchConnectionHandler.onSwitchConnected(connectionAdapter);\r
-            connectionAdapter.checkListeners();\r
-            ch.pipeline().addLast(COMPONENT_NAMES.TLS_DETECTOR.name(), new TlsDetector());\r
-            ch.pipeline().addLast(COMPONENT_NAMES.DELEGATING_INBOUND_HANDLER.name(), new DelegatingInboundHandler(connectionAdapter));\r
-        } catch (Exception e) {\r
-            LOGGER.error(e.getMessage(), e);\r
-            ch.close();\r
-        }\r
-    }\r
-    \r
-    /**\r
-     * @return iterator through active connections\r
-     */\r
-    public Iterator<Channel> getConnectionIterator() {\r
-        return allChannels.iterator();\r
-    }\r
-\r
-    /**\r
-     * @return amount of active channels\r
-     */\r
-    public int size() {\r
-        return allChannels.size();\r
-    }\r
-    \r
-    /**\r
-     * @param switchConnectionHandler the switchConnectionHandler to set\r
-     */\r
-    public void setSwitchConnectionHandler(SwitchConnectionHandler switchConnectionHandler) {\r
-        this.switchConnectionHandler = switchConnectionHandler;\r
-    }\r
-}\r
+/*
+ * 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<SocketChannel> {
+
+    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<Channel> 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;
+    }
+}