Added support for switch idle state
[openflowjava.git] / openflow-protocol-impl / src / main / java / org / opendaylight / openflowjava / protocol / impl / core / PublishingChannelInitializer.java
1 package org.opendaylight.openflowjava.protocol.impl.core;\r
2 \r
3 import io.netty.channel.Channel;\r
4 import io.netty.channel.ChannelInitializer;\r
5 import io.netty.channel.group.DefaultChannelGroup;\r
6 import io.netty.channel.socket.SocketChannel;\r
7 \r
8 import java.net.InetAddress;\r
9 import java.util.Iterator;\r
10 import java.util.concurrent.TimeUnit;\r
11 \r
12 import org.opendaylight.openflowjava.protocol.api.connection.SwitchConnectionHandler;\r
13 import org.opendaylight.openflowjava.protocol.impl.connection.ConnectionAdapterFactory;\r
14 import org.opendaylight.openflowjava.protocol.impl.connection.ConnectionFacade;\r
15 import org.opendaylight.openflowjava.protocol.impl.core.TcpHandler.COMPONENT_NAMES;\r
16 import org.slf4j.Logger;\r
17 import org.slf4j.LoggerFactory;\r
18 \r
19 /**\r
20  * @author michal.polkorab\r
21  *\r
22  */\r
23 public class PublishingChannelInitializer extends ChannelInitializer<SocketChannel> {\r
24 \r
25     private static final Logger LOGGER = LoggerFactory\r
26             .getLogger(PublishingChannelInitializer.class);\r
27     private DefaultChannelGroup allChannels;\r
28     private SwitchConnectionHandler switchConnectionHandler;\r
29     private long switchIdleTimeout;\r
30     \r
31     /**\r
32      * default ctor\r
33      */\r
34     public PublishingChannelInitializer() {\r
35         allChannels = new DefaultChannelGroup("netty-receiver", null);\r
36     }\r
37     \r
38     @Override\r
39     protected void initChannel(SocketChannel ch) {\r
40         InetAddress switchAddress = ch.remoteAddress().getAddress();\r
41         LOGGER.info("Incoming connection from (remote address): " + switchAddress.toString());\r
42         if (!switchConnectionHandler.accept(switchAddress)) {\r
43             ch.disconnect();\r
44             LOGGER.info("Incoming connection rejected");\r
45             return;\r
46         }\r
47         LOGGER.info("Incoming connection accepted - building pipeline");\r
48         allChannels.add(ch);\r
49         ConnectionFacade connectionAdapter = null;\r
50         connectionAdapter = ConnectionAdapterFactory.createConnectionAdapter(ch);\r
51         try {\r
52             LOGGER.debug("calling plugin: "+switchConnectionHandler);\r
53             switchConnectionHandler.onSwitchConnected(connectionAdapter);\r
54             connectionAdapter.checkListeners();\r
55             ch.pipeline().addLast(COMPONENT_NAMES.IDLE_HANDLER.name(), new IdleHandler(switchIdleTimeout, 0, 0, TimeUnit.MILLISECONDS));\r
56             ch.pipeline().addLast(COMPONENT_NAMES.TLS_DETECTOR.name(), new TlsDetector());\r
57             ch.pipeline().addLast(COMPONENT_NAMES.DELEGATING_INBOUND_HANDLER.name(), new DelegatingInboundHandler(connectionAdapter));\r
58         } catch (Exception e) {\r
59             LOGGER.error(e.getMessage(), e);\r
60             ch.close();\r
61         }\r
62     }\r
63     \r
64     /**\r
65      * @return iterator through active connections\r
66      */\r
67     public Iterator<Channel> getConnectionIterator() {\r
68         return allChannels.iterator();\r
69     }\r
70 \r
71     /**\r
72      * @return amount of active channels\r
73      */\r
74     public int size() {\r
75         return allChannels.size();\r
76     }\r
77     \r
78     /**\r
79      * @param switchConnectionHandler the switchConnectionHandler to set\r
80      */\r
81     public void setSwitchConnectionHandler(SwitchConnectionHandler switchConnectionHandler) {\r
82         this.switchConnectionHandler = switchConnectionHandler;\r
83     }\r
84 \r
85     /**\r
86      * @param switchIdleTimeout the switchIdleTimeout to set\r
87      */\r
88     public void setSwitchIdleTimeout(long switchIdleTimeout) {\r
89         this.switchIdleTimeout = switchIdleTimeout;\r
90     }\r
91     \r
92 }\r