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.core;
12 import com.google.common.util.concurrent.ListenableFuture;
13 import com.google.common.util.concurrent.SettableFuture;
14 import io.netty.channel.nio.NioEventLoopGroup;
15 import org.opendaylight.openflowjava.protocol.api.connection.ConnectionConfiguration;
16 import org.opendaylight.openflowjava.protocol.api.connection.SwitchConnectionHandler;
17 import org.opendaylight.openflowjava.protocol.api.extensibility.DeserializerRegistry;
18 import org.opendaylight.openflowjava.protocol.api.extensibility.OFDeserializer;
19 import org.opendaylight.openflowjava.protocol.api.extensibility.OFGeneralDeserializer;
20 import org.opendaylight.openflowjava.protocol.api.extensibility.OFGeneralSerializer;
21 import org.opendaylight.openflowjava.protocol.api.extensibility.OFSerializer;
22 import org.opendaylight.openflowjava.protocol.api.extensibility.SerializerRegistry;
23 import org.opendaylight.openflowjava.protocol.api.keys.ActionSerializerKey;
24 import org.opendaylight.openflowjava.protocol.api.keys.ExperimenterActionDeserializerKey;
25 import org.opendaylight.openflowjava.protocol.api.keys.ExperimenterDeserializerKey;
26 import org.opendaylight.openflowjava.protocol.api.keys.ExperimenterIdDeserializerKey;
27 import org.opendaylight.openflowjava.protocol.api.keys.ExperimenterIdSerializerKey;
28 import org.opendaylight.openflowjava.protocol.api.keys.ExperimenterInstructionDeserializerKey;
29 import org.opendaylight.openflowjava.protocol.api.keys.ExperimenterSerializerKey;
30 import org.opendaylight.openflowjava.protocol.api.keys.InstructionSerializerKey;
31 import org.opendaylight.openflowjava.protocol.api.keys.MatchEntryDeserializerKey;
32 import org.opendaylight.openflowjava.protocol.api.keys.MatchEntrySerializerKey;
33 import org.opendaylight.openflowjava.protocol.api.keys.MessageCodeKey;
34 import org.opendaylight.openflowjava.protocol.api.keys.MessageTypeKey;
35 import org.opendaylight.openflowjava.protocol.impl.deserialization.DeserializationFactory;
36 import org.opendaylight.openflowjava.protocol.impl.deserialization.DeserializerRegistryImpl;
37 import org.opendaylight.openflowjava.protocol.impl.serialization.SerializationFactory;
38 import org.opendaylight.openflowjava.protocol.impl.serialization.SerializerRegistryImpl;
39 import org.opendaylight.openflowjava.protocol.spi.connection.SwitchConnectionProvider;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.config.rev140630.TransportProtocol;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.MatchField;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.OxmClassBase;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.ErrorMessage;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.experimenter.core.ExperimenterDataOfChoice;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.band.header.meter.band.MeterBandExperimenterCase;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.queue.property.header.QueueProperty;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.table.features.properties.grouping.TableFeatureProperties;
48 import org.slf4j.Logger;
49 import org.slf4j.LoggerFactory;
52 * Exposed class for server handling<br>
53 * C - {@link MatchEntrySerializerKey} parameter representing oxm_class (see specification)<br>
54 * F - {@link MatchEntrySerializerKey} parameter representing oxm_field (see specification)
56 * @author michal.polkorab
58 public class SwitchConnectionProviderImpl implements SwitchConnectionProvider, ConnectionInitializer {
60 private static final Logger LOGGER = LoggerFactory
61 .getLogger(SwitchConnectionProviderImpl.class);
62 private SwitchConnectionHandler switchConnectionHandler;
63 private ServerFacade serverFacade;
64 private ConnectionConfiguration connConfig;
65 private SerializationFactory serializationFactory;
66 private SerializerRegistry serializerRegistry;
67 private DeserializerRegistry deserializerRegistry;
68 private DeserializationFactory deserializationFactory;
69 private TcpConnectionInitializer connectionInitializer;
72 public SwitchConnectionProviderImpl() {
73 serializerRegistry = new SerializerRegistryImpl();
74 serializerRegistry.init();
75 serializationFactory = new SerializationFactory();
76 serializationFactory.setSerializerTable(serializerRegistry);
77 deserializerRegistry = new DeserializerRegistryImpl();
78 deserializerRegistry.init();
79 deserializationFactory = new DeserializationFactory();
80 deserializationFactory.setRegistry(deserializerRegistry);
84 public void setConfiguration(ConnectionConfiguration connConfig) {
85 this.connConfig = connConfig;
89 public void setSwitchConnectionHandler(SwitchConnectionHandler switchConnectionHandler) {
90 LOGGER.debug("setSwitchConnectionHandler");
91 this.switchConnectionHandler = switchConnectionHandler;
95 public ListenableFuture<Boolean> shutdown() {
96 LOGGER.debug("Shutdown summoned");
97 if(serverFacade == null){
98 LOGGER.warn("Can not shutdown - not configured or started");
99 throw new IllegalStateException("SwitchConnectionProvider is not started or not configured.");
101 return serverFacade.shutdown();
105 public ListenableFuture<Boolean> startup() {
106 LOGGER.debug("Startup summoned");
107 ListenableFuture<Boolean> result = null;
109 serverFacade = createAndConfigureServer();
110 if (switchConnectionHandler == null) {
111 throw new IllegalStateException("SwitchConnectionHandler is not set");
113 new Thread(serverFacade).start();
114 result = serverFacade.getIsOnlineFuture();
115 } catch (Exception e) {
116 SettableFuture<Boolean> exResult = SettableFuture.create();
117 exResult.setException(e);
126 private ServerFacade createAndConfigureServer() {
127 LOGGER.debug("Configuring ..");
128 ServerFacade server = null;
129 ChannelInitializerFactory factory = new ChannelInitializerFactory();
130 factory.setSwitchConnectionHandler(switchConnectionHandler);
131 factory.setSwitchIdleTimeout(connConfig.getSwitchIdleTimeout());
132 factory.setTlsConfig(connConfig.getTlsConfiguration());
133 factory.setSerializationFactory(serializationFactory);
134 factory.setDeserializationFactory(deserializationFactory);
135 TransportProtocol transportProtocol = (TransportProtocol) connConfig.getTransferProtocol();
136 if (transportProtocol.equals(TransportProtocol.TCP) || transportProtocol.equals(TransportProtocol.TLS)) {
137 server = new TcpHandler(connConfig.getAddress(), connConfig.getPort());
138 TcpChannelInitializer channelInitializer = factory.createPublishingChannelInitializer();
139 ((TcpHandler) server).setChannelInitializer(channelInitializer);
140 ((TcpHandler) server).initiateEventLoopGroups(connConfig.getThreadConfiguration());
142 NioEventLoopGroup workerGroupFromTcpHandler = ((TcpHandler) server).getWorkerGroup();
143 connectionInitializer = new TcpConnectionInitializer(workerGroupFromTcpHandler);
144 connectionInitializer.setChannelInitializer(channelInitializer);
145 connectionInitializer.run();
146 } else if (transportProtocol.equals(TransportProtocol.UDP)){
147 server = new UdpHandler(connConfig.getAddress(), connConfig.getPort());
148 ((UdpHandler) server).setChannelInitializer(factory.createUdpChannelInitializer());
150 throw new IllegalStateException("Unknown transport protocol received: " + transportProtocol);
152 server.setThreadConfig(connConfig.getThreadConfiguration());
159 public ServerFacade getServerFacade() {
164 public void close() throws Exception {
169 public boolean unregisterSerializer(ExperimenterSerializerKey key) {
170 return serializerRegistry.unregisterSerializer((MessageTypeKey<?>) key);
174 public boolean unregisterDeserializer(ExperimenterDeserializerKey key) {
175 return deserializerRegistry.unregisterDeserializer((MessageCodeKey) key);
179 public void registerActionSerializer(ActionSerializerKey<?> key,
180 OFGeneralSerializer serializer) {
181 serializerRegistry.registerSerializer(key, serializer);
185 public void registerActionDeserializer(ExperimenterActionDeserializerKey key,
186 OFGeneralDeserializer deserializer) {
187 deserializerRegistry.registerDeserializer(key, deserializer);
191 public void registerInstructionSerializer(InstructionSerializerKey<?> key,
192 OFGeneralSerializer serializer) {
193 serializerRegistry.registerSerializer(key, serializer);
197 public void registerInstructionDeserializer(ExperimenterInstructionDeserializerKey key,
198 OFGeneralDeserializer deserializer) {
199 deserializerRegistry.registerDeserializer(key, deserializer);
203 public <C extends OxmClassBase, F extends MatchField> void registerMatchEntrySerializer(MatchEntrySerializerKey<C, F> key,
204 OFGeneralSerializer serializer) {
205 serializerRegistry.registerSerializer(key, serializer);
209 public void registerMatchEntryDeserializer(MatchEntryDeserializerKey key,
210 OFGeneralDeserializer deserializer) {
211 deserializerRegistry.registerDeserializer(key, deserializer);
215 public void registerErrorDeserializer(ExperimenterIdDeserializerKey key,
216 OFDeserializer<ErrorMessage> deserializer) {
217 deserializerRegistry.registerDeserializer(key, deserializer);
221 public void registerExperimenterMessageDeserializer(ExperimenterIdDeserializerKey key,
222 OFDeserializer<? extends ExperimenterDataOfChoice> deserializer) {
223 deserializerRegistry.registerDeserializer(key, deserializer);
227 public void registerMultipartReplyMessageDeserializer(ExperimenterIdDeserializerKey key,
228 OFDeserializer<? extends ExperimenterDataOfChoice> deserializer) {
229 deserializerRegistry.registerDeserializer(key, deserializer);
233 public void registerMultipartReplyTFDeserializer(ExperimenterIdDeserializerKey key,
234 OFGeneralDeserializer deserializer) {
235 deserializerRegistry.registerDeserializer(key, deserializer);
239 public void registerQueuePropertyDeserializer(ExperimenterIdDeserializerKey key,
240 OFDeserializer<QueueProperty> deserializer) {
241 deserializerRegistry.registerDeserializer(key, deserializer);
245 public void registerMeterBandDeserializer(ExperimenterIdDeserializerKey key,
246 OFDeserializer<MeterBandExperimenterCase> deserializer) {
247 deserializerRegistry.registerDeserializer(key, deserializer);
251 public void registerExperimenterMessageSerializer(ExperimenterIdSerializerKey<? extends ExperimenterDataOfChoice> key,
252 OFSerializer<? extends ExperimenterDataOfChoice> serializer) {
253 serializerRegistry.registerSerializer(key, serializer);
257 public void registerMultipartRequestSerializer(ExperimenterIdSerializerKey<? extends ExperimenterDataOfChoice> key,
258 OFSerializer<? extends ExperimenterDataOfChoice> serializer) {
259 serializerRegistry.registerSerializer(key, serializer);
263 public void registerMultipartRequestTFSerializer(ExperimenterIdSerializerKey<TableFeatureProperties> key,
264 OFGeneralSerializer serializer) {
265 serializerRegistry.registerSerializer(key, serializer);
269 public void registerMeterBandSerializer(ExperimenterIdSerializerKey<MeterBandExperimenterCase> key,
270 OFSerializer<MeterBandExperimenterCase> serializer) {
271 serializerRegistry.registerSerializer(key, serializer);
275 public void initiateConnection(String host, int port) {
276 connectionInitializer.initiateConnection(host, port);