2 * Copyright (c) 2013 Pantheon Technologies s.r.o. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
10 package org.opendaylight.openflowjava.protocol.impl.connection;
12 import org.opendaylight.openflowjava.protocol.api.connection.ConnectionConfiguration;
13 import org.opendaylight.openflowjava.protocol.api.connection.SwitchConnectionHandler;
14 import org.opendaylight.openflowjava.protocol.api.extensibility.DeserializerRegistry;
15 import org.opendaylight.openflowjava.protocol.api.extensibility.MessageCodeKey;
16 import org.opendaylight.openflowjava.protocol.api.extensibility.MessageTypeKey;
17 import org.opendaylight.openflowjava.protocol.api.extensibility.OFGeneralDeserializer;
18 import org.opendaylight.openflowjava.protocol.api.extensibility.OFGeneralSerializer;
19 import org.opendaylight.openflowjava.protocol.api.extensibility.SerializerRegistry;
20 import org.opendaylight.openflowjava.protocol.api.keys.MatchEntryDeserializerKey;
21 import org.opendaylight.openflowjava.protocol.api.keys.MatchEntrySerializerKey;
22 import org.opendaylight.openflowjava.protocol.api.keys.experimenter.ExperimenterActionDeserializerKey;
23 import org.opendaylight.openflowjava.protocol.api.keys.experimenter.ExperimenterActionSerializerKey;
24 import org.opendaylight.openflowjava.protocol.api.keys.experimenter.ExperimenterDeserializerKey;
25 import org.opendaylight.openflowjava.protocol.api.keys.experimenter.ExperimenterInstructionDeserializerKey;
26 import org.opendaylight.openflowjava.protocol.api.keys.experimenter.ExperimenterInstructionSerializerKey;
27 import org.opendaylight.openflowjava.protocol.api.keys.experimenter.ExperimenterSerializerKey;
28 import org.opendaylight.openflowjava.protocol.impl.core.PublishingChannelInitializerFactory;
29 import org.opendaylight.openflowjava.protocol.impl.core.TcpHandler;
30 import org.opendaylight.openflowjava.protocol.impl.deserialization.DeserializationFactory;
31 import org.opendaylight.openflowjava.protocol.impl.deserialization.DeserializerRegistryImpl;
32 import org.opendaylight.openflowjava.protocol.impl.serialization.SerializationFactory;
33 import org.opendaylight.openflowjava.protocol.impl.serialization.SerializerRegistryImpl;
34 import org.opendaylight.openflowjava.protocol.spi.connection.SwitchConnectionProvider;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.MatchField;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.OxmClassBase;
37 import org.slf4j.Logger;
38 import org.slf4j.LoggerFactory;
40 import com.google.common.util.concurrent.ListenableFuture;
41 import com.google.common.util.concurrent.SettableFuture;
44 * Exposed class for server handling
46 * @author michal.polkorab
48 public class SwitchConnectionProviderImpl implements SwitchConnectionProvider {
50 private static final Logger LOGGER = LoggerFactory
51 .getLogger(SwitchConnectionProviderImpl.class);
52 private SwitchConnectionHandler switchConnectionHandler;
53 private ServerFacade serverFacade;
54 private ConnectionConfiguration connConfig;
55 private SerializationFactory serializationFactory;
56 private SerializerRegistry serializerRegistry;
57 private DeserializerRegistry deserializerRegistry;
58 private DeserializationFactory deserializationFactory;
61 public SwitchConnectionProviderImpl() {
62 serializerRegistry = new SerializerRegistryImpl();
63 serializerRegistry.init();
64 serializationFactory = new SerializationFactory();
65 serializationFactory.setSerializerTable(serializerRegistry);
66 deserializerRegistry = new DeserializerRegistryImpl();
67 deserializerRegistry.init();
68 deserializationFactory = new DeserializationFactory();
69 deserializationFactory.setRegistry(deserializerRegistry);
73 public void setConfiguration(ConnectionConfiguration connConfig) {
74 this.connConfig = connConfig;
78 public void setSwitchConnectionHandler(SwitchConnectionHandler switchConnectionHandler) {
79 LOGGER.debug("setSwitchConnectionHandler");
80 this.switchConnectionHandler = switchConnectionHandler;
84 public ListenableFuture<Boolean> shutdown() {
85 LOGGER.debug("Shutdown summoned");
86 //TODO: provide exception in case of: not started, not configured (already stopped)
87 ListenableFuture<Boolean> result = serverFacade.shutdown();
92 public ListenableFuture<Boolean> startup() {
93 LOGGER.debug("Startup summoned");
94 serverFacade = createAndConfigureServer();
96 LOGGER.debug("Starting ..");
97 ListenableFuture<Boolean> result = null;
99 if (serverFacade == null) {
100 throw new IllegalStateException("No server configured");
102 if (serverFacade.getIsOnlineFuture().isDone()) {
103 throw new IllegalStateException("Server already running");
105 if (switchConnectionHandler == null) {
106 throw new IllegalStateException("switchConnectionHandler is not set");
108 new Thread(serverFacade).start();
109 result = serverFacade.getIsOnlineFuture();
110 } catch (Exception e) {
111 SettableFuture<Boolean> exResult = SettableFuture.create();
112 exResult.setException(e);
121 private TcpHandler createAndConfigureServer() {
122 LOGGER.debug("Configuring ..");
123 TcpHandler server = new TcpHandler(connConfig.getAddress(), connConfig.getPort());
124 PublishingChannelInitializerFactory factory = new PublishingChannelInitializerFactory();
125 factory.setSwitchConnectionHandler(switchConnectionHandler);
126 factory.setSwitchIdleTimeout(connConfig.getSwitchIdleTimeout());
127 factory.setTlsConfig(connConfig.getTlsConfiguration());
128 factory.setSerializationFactory(serializationFactory);
129 factory.setDeserializationFactory(deserializationFactory);
130 server.setChannelInitializer(factory.createPublishingChannelInitializer());
131 server.setThreadConfig(connConfig.getThreadConfiguration());
138 public ServerFacade getServerFacade() {
143 public void close() throws Exception {
148 public boolean unregisterSerializer(ExperimenterSerializerKey key) {
149 return serializerRegistry.unregisterSerializer((MessageTypeKey<?>) key);
153 public boolean unregisterDeserializer(ExperimenterDeserializerKey key) {
154 return deserializerRegistry.unregisterDeserializer((MessageCodeKey) key);
158 public void registerActionSerializer(ExperimenterActionSerializerKey key,
159 OFGeneralSerializer serializer) {
160 serializerRegistry.registerSerializer(key, serializer);
164 public void registerActionDeserializer(ExperimenterActionDeserializerKey key,
165 OFGeneralDeserializer deserializer) {
166 deserializerRegistry.registerDeserializer(key, deserializer);
170 public void registerInstructionSerializer(ExperimenterInstructionSerializerKey key,
171 OFGeneralSerializer serializer) {
172 serializerRegistry.registerSerializer(key, serializer);
176 public void registerInstructionDeserializer(ExperimenterInstructionDeserializerKey key,
177 OFGeneralDeserializer deserializer) {
178 deserializerRegistry.registerDeserializer(key, deserializer);
182 public <OXM_CLASS extends OxmClassBase, OXM_TYPE extends MatchField> void registerMatchEntrySerializer(MatchEntrySerializerKey<OXM_CLASS, OXM_TYPE> key,
183 OFGeneralSerializer serializer) {
184 serializerRegistry.registerSerializer(key, serializer);
188 public void registerMatchEntryDeserializer(MatchEntryDeserializerKey key,
189 OFGeneralDeserializer deserializer) {
190 deserializerRegistry.registerDeserializer(key, deserializer);