<pluginExecution>\r
<pluginExecutionFilter>\r
<groupId>\r
- org.opendaylight.controller\r
+ org.opendaylight.yangtools\r
</groupId>\r
<artifactId>\r
yang-maven-plugin\r
</artifactId>\r
<versionRange>\r
- [0.5,)\r
+ (0.5.6,)\r
</versionRange>\r
<goals>\r
<goal>\r
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
- <version>4.0.4.Final</version>
+ <version>4.0.8.Final</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
+++ /dev/null
-/* Copyright (C)2013 Pantheon Technologies, s.r.o. All rights reserved. */\r
-package org.openflow.core;\r
-\r
-import io.netty.buffer.ByteBuf;\r
-import org.slf4j.LoggerFactory;\r
-\r
-/**\r
- *\r
- * @author michal.polkorab\r
- */\r
-public class DeserializationFactory {\r
-\r
- private static final org.slf4j.Logger LOGGER = LoggerFactory.getLogger(DeserializationFactory.class);\r
-\r
- /**\r
- * Transforms ByteBuf into correct POJO message\r
- * @param inputBuffer \r
- */\r
- public DeserializationFactory(ByteBuf inputBuffer) {\r
- short type = inputBuffer.readUnsignedByte();\r
-\r
- switch (type) {\r
- // HELLO\r
- case 0: {\r
- LOGGER.info("OFPT_HELLO received");\r
- \r
- byte[] hello = new byte[]{0x04, 0x0, 0x0, 0x08, 0x0, 0x0, 0x0, 0x01};\r
- //out.writeBytes(hello);\r
- break;\r
- }\r
- // ERROR\r
- case 1:\r
- LOGGER.info("OFPT_ERROR received");\r
- break;\r
- // ECHO_REQUEST\r
- case 2: {\r
- LOGGER.info("OFPT_ECHO_REQUEST received");\r
- byte[] echoReply = new byte[]{0x04, 0x03, 0x00, 0x08};\r
- // TODO - append original data field\r
- break;\r
- }\r
- // ECHO_REPLY\r
- case 3:\r
- LOGGER.info("OFPT_ECHO_REPLY received");\r
- break;\r
- // EXPERIMENTER\r
- case 4:\r
- LOGGER.info("OFPT_ECHO_REPLY received");\r
- break;\r
- // FEATURES_REQUEST\r
- case 5:\r
- LOGGER.info("OFPT_FEATURES_REQUEST received");\r
- break;\r
- // FEATURES_REPLY\r
- case 6:\r
- LOGGER.info("OFPT_FEATURES_REPLY received");\r
- break;\r
- // GET_CONFIG_REQUEST\r
- case 7:\r
- LOGGER.info("OFPT_ECHO_REPLY received");\r
- break;\r
- // GET_CONFIG_REPLY\r
- case 8:\r
- LOGGER.info("OFPT_ECHO_REPLY received");\r
- break;\r
- // SET_CONFIG\r
- case 9:\r
- LOGGER.info("OFPT_ECHO_REPLY received");\r
- break;\r
- // PACKET_IN\r
- case 10:\r
- LOGGER.info("OFPT_ECHO_REPLY received");\r
- break;\r
- // FLOW_REMOVED\r
- case 11:\r
- LOGGER.info("OFPT_ECHO_REPLY received");\r
- break;\r
- // PORT_STATUS\r
- case 12:\r
- LOGGER.info("OFPT_ECHO_REPLY received");\r
- break;\r
- // PACKET_OUT\r
- case 13:\r
- LOGGER.info("OFPT_ECHO_REPLY received");\r
- break;\r
- // FLOW_MOD\r
- case 14:\r
- LOGGER.info("OFPT_ECHO_REPLY received");\r
- break;\r
- // GROUP_MOD\r
- case 15:\r
- LOGGER.info("OFPT_ECHO_REPLY received");\r
- break;\r
- // PORT_MOD\r
- case 16:\r
- LOGGER.info("OFPT_ECHO_REPLY received");\r
- break;\r
- // TABLE_MOD\r
- case 17:\r
- LOGGER.info("OFPT_ECHO_REPLY received");\r
- break;\r
- // MULTIPART_REQUEST\r
- case 18:\r
- LOGGER.info("OFPT_ECHO_REPLY received");\r
- break;\r
- // MULTIPART_REPLY\r
- case 19:\r
- LOGGER.info("OFPT_ECHO_REPLY received");\r
- break;\r
- // BARRIER_REQUEST\r
- case 20:\r
- LOGGER.info("OFPT_ECHO_REPLY received");\r
- break;\r
- // BARRIER_REPLY\r
- case 21:\r
- LOGGER.info("OFPT_ECHO_REPLY received");\r
- break;\r
- // QUEUE_GET_CONFIG_REQUEST\r
- case 22:\r
- LOGGER.info("OFPT_ECHO_REPLY received");\r
- break;\r
- // QUEUE_GET_CONFIG_REPLY\r
- case 23:\r
- LOGGER.info("OFPT_ECHO_REPLY received");\r
- break;\r
- // ROLE_REQUEST\r
- case 24:\r
- LOGGER.info("OFPT_ECHO_REPLY received");\r
- break;\r
- // ROLE_REPLY \r
- case 25:\r
- LOGGER.info("OFPT_ECHO_REPLY received");\r
- break;\r
- // GET_ASYNC_REQUEST\r
- case 26:\r
- LOGGER.info("OFPT_ECHO_REPLY received");\r
- break;\r
- // GET_ASYNC_REPLY\r
- case 27:\r
- LOGGER.info("OFPT_ECHO_REPLY received");\r
- break;\r
- // SET_ASYNC\r
- case 28:\r
- LOGGER.info("OFPT_ECHO_REPLY received");\r
- break;\r
- // METER_MOD\r
- case 29:\r
- LOGGER.info("OFPT_ECHO_REPLY received");\r
- break;\r
-\r
- default:\r
- LOGGER.info("Received message type: " + type);\r
- break;\r
- }\r
- }\r
-}\r
+++ /dev/null
-/* Copyright (C)2013 Pantheon Technologies, s.r.o. All rights reserved. */\r
-\r
-package org.openflow.core;\r
-\r
-/**\r
- *\r
- * @author michal.polkorab\r
- */\r
-public abstract class SerializationFactory {\r
- // TODO - implement this class funcionality\r
- \r
- \r
-}\r
--- /dev/null
+/* Copyright (C)2013 Pantheon Technologies, s.r.o. All rights reserved. */\r
+package org.openflow.deserialization.factories;\r
+\r
+import io.netty.buffer.ByteBuf;\r
+\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.EchoOutput;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.EchoOutputBuilder;\r
+import org.openflow.lib.deserialization.OfDeserializer;\r
+\r
+/**\r
+ * @author michal.polkorab\r
+ *\r
+ */\r
+public class EchoReplyMessageFactory implements OfDeserializer<EchoOutput> {\r
+\r
+ private static EchoReplyMessageFactory instance;\r
+\r
+ private EchoReplyMessageFactory() {\r
+ // do nothing, just singleton\r
+ }\r
+ \r
+ /**\r
+ * @return singleton factory\r
+ */\r
+ public static EchoReplyMessageFactory getInstance() {\r
+ if (instance == null) {\r
+ instance = new EchoReplyMessageFactory();\r
+ }\r
+ return instance;\r
+ }\r
+ \r
+ /* (non-Javadoc)\r
+ * @see org.openflow.core.deserialization.OfDeserializer#createMessage(io.netty.buffer.ByteBuf, short)\r
+ */\r
+ @Override\r
+ public EchoOutput bufferToMessage(ByteBuf rawMessage, short version) {\r
+ EchoOutputBuilder eob = new EchoOutputBuilder();\r
+ eob.setVersion(version);\r
+ eob.setXid(rawMessage.readUnsignedInt());\r
+ // read the rest of EchoReply message\r
+ eob.setData(rawMessage.readBytes(rawMessage.readableBytes()).array());\r
+ return eob.build();\r
+ }\r
+\r
+}\r
--- /dev/null
+/* Copyright (C)2013 Pantheon Technologies, s.r.o. All rights reserved. */\r
+package org.openflow.deserialization.factories;\r
+\r
+import io.netty.buffer.ByteBuf;\r
+\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.EchoRequestMessage;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.EchoRequestMessageBuilder;\r
+import org.openflow.lib.deserialization.OfDeserializer;\r
+\r
+/**\r
+ * @author michal.polkorab\r
+ *\r
+ */\r
+public class EchoRequestMessageFactory implements OfDeserializer<EchoRequestMessage>{\r
+\r
+ \r
+ private static EchoRequestMessageFactory instance;\r
+\r
+ private EchoRequestMessageFactory() {\r
+ // do nothing, just singleton\r
+ }\r
+ \r
+ /**\r
+ * @return singleton factory\r
+ */\r
+ public static EchoRequestMessageFactory getInstance() {\r
+ if (instance == null) {\r
+ instance = new EchoRequestMessageFactory();\r
+ }\r
+ return instance;\r
+ }\r
+\r
+ @Override\r
+ public EchoRequestMessage bufferToMessage(ByteBuf rawMessage, short version) {\r
+ EchoRequestMessageBuilder emb = new EchoRequestMessageBuilder();\r
+ emb.setVersion(version);\r
+ emb.setXid(rawMessage.readUnsignedInt());\r
+ // read the rest of EchoRequest message\r
+ emb.setData(rawMessage.readBytes(rawMessage.readableBytes()).array());\r
+ return emb.build();\r
+ }\r
+}\r
--- /dev/null
+/* Copyright (C)2013 Pantheon Technologies, s.r.o. All rights reserved. */\r
+package org.openflow.deserialization.factories;\r
+\r
+import io.netty.buffer.ByteBuf;\r
+\r
+import java.math.BigInteger;\r
+\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetFeaturesOutput;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetFeaturesOutputBuilder;\r
+import org.openflow.lib.deserialization.OfDeserializer;\r
+\r
+/**\r
+ * @author michal.polkorab\r
+ *\r
+ */\r
+public class FeaturesReplyMessageFactory implements OfDeserializer<GetFeaturesOutput>{\r
+ \r
+ private static final byte PADDING_IN_FEATURES_REPLY_HEADER = 2;\r
+ \r
+ private static FeaturesReplyMessageFactory instance;\r
+\r
+ private FeaturesReplyMessageFactory() {\r
+ // do nothing, just singleton\r
+ }\r
+ \r
+ /**\r
+ * @return singleton factory\r
+ */\r
+ public static FeaturesReplyMessageFactory getInstance() {\r
+ if (instance == null) {\r
+ instance = new FeaturesReplyMessageFactory();\r
+ }\r
+ return instance;\r
+ }\r
+ \r
+ /* (non-Javadoc)\r
+ * @see org.openflow.core.deserialization.OfDeserializer#createMessage(io.netty.buffer.ByteBuf, short)\r
+ */\r
+ @Override\r
+ public GetFeaturesOutput bufferToMessage(ByteBuf rawMessage, short version) {\r
+ GetFeaturesOutputBuilder gfob = new GetFeaturesOutputBuilder();\r
+ gfob.setVersion(version);\r
+ gfob.setXid(rawMessage.readUnsignedInt());\r
+ \r
+ // TODO - unsigned long - check for appropriate process\r
+ byte[] datapathId = new byte[8];\r
+ rawMessage.readBytes(datapathId);\r
+ gfob.setDatapathId(new BigInteger(datapathId));\r
+ \r
+ gfob.setBuffers(rawMessage.readUnsignedInt());\r
+ gfob.setTables(rawMessage.readUnsignedByte());\r
+ gfob.setAuxiliaryId(rawMessage.readUnsignedByte());\r
+ rawMessage.skipBytes(PADDING_IN_FEATURES_REPLY_HEADER);\r
+ gfob.setCapabilities(rawMessage.readUnsignedInt());\r
+ gfob.setReserved(rawMessage.readUnsignedInt());\r
+ return gfob.build();\r
+ }\r
+\r
+}\r
--- /dev/null
+/* Copyright (C)2013 Pantheon Technologies, s.r.o. All rights reserved. */\r
+package org.openflow.deserialization.factories;\r
+\r
+import io.netty.buffer.ByteBuf;\r
+\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.HelloMessage;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.HelloMessageBuilder;\r
+import org.openflow.lib.deserialization.OfDeserializer;\r
+\r
+/**\r
+ * @author michal.polkorab\r
+ *\r
+ */\r
+public class HelloMessageFactory implements OfDeserializer<HelloMessage> {\r
+\r
+ private static HelloMessageFactory instance;\r
+ \r
+ private HelloMessageFactory() {\r
+ // do nothing, just singleton\r
+ }\r
+ \r
+ /**\r
+ * @return singleton factory\r
+ */\r
+ public static HelloMessageFactory getInstance() {\r
+ if (instance == null) {\r
+ instance = new HelloMessageFactory();\r
+ }\r
+ return instance;\r
+ }\r
+ \r
+ @Override\r
+ public HelloMessage bufferToMessage(ByteBuf rawMessage, short version) {\r
+ HelloMessageBuilder hmb = new HelloMessageBuilder();\r
+ hmb.setVersion(version);\r
+ hmb.setXid(rawMessage.readUnsignedInt());\r
+ return hmb.build();\r
+ }\r
+}\r
/* Copyright (C)2013 Pantheon Technologies, s.r.o. All rights reserved. */\r
-package org.openflow.core;\r
+package org.openflow.lib;\r
\r
import io.netty.buffer.ByteBuf;\r
import io.netty.channel.ChannelHandlerContext;\r
import io.netty.channel.ChannelInboundHandlerAdapter;\r
-import org.openflow.util.ByteBufUtils;\r
\r
+import org.openflow.lib.deserialization.DeserializationFactory;\r
+import org.openflow.util.ByteBufUtils;\r
import org.slf4j.Logger;\r
import org.slf4j.LoggerFactory;\r
\r
*\r
* @author michal.polkorab\r
*/\r
-public class OF13Codec extends ChannelInboundHandlerAdapter {\r
+public class Of13Codec extends ChannelInboundHandlerAdapter {\r
\r
// TODO - fix with enum in API\r
private static final int MESSAGE_TYPES = 29;\r
- private static final Logger LOGGER = LoggerFactory.getLogger(OF13Codec.class);\r
+ private static final Logger LOGGER = LoggerFactory.getLogger(Of13Codec.class);\r
\r
/**\r
* Constructor of class\r
*/\r
- public OF13Codec() {\r
+ public Of13Codec() {\r
LOGGER.info("Creating OF 1.3 Codec");\r
\r
}\r
if (LOGGER.isDebugEnabled()) {\r
LOGGER.debug(ByteBufUtils.byteBufToHexString(bb));\r
}\r
-\r
+ \r
+ bb.markReaderIndex();\r
short type = bb.readUnsignedByte();\r
int length = bb.readUnsignedShort();\r
long xid = bb.readUnsignedInt();\r
-\r
+ bb.resetReaderIndex();\r
\r
if (!checkOFHeader(type, length)) {\r
bb.discardReadBytes();\r
return;\r
}\r
\r
+ // TODO - change hardcoded version to constant, enum, ...\r
+ DeserializationFactory.bufferToMessage(bb, (short) 0x04);\r
+ \r
+ // TODO - delete this switch case after completing deserialization factory\r
ByteBuf out = ctx.alloc().buffer();\r
switch (type) {\r
case 0: {\r
}\r
\r
private static boolean checkOFHeader(short type, int length) {\r
- return !((type > MESSAGE_TYPES) || (length < OFFrameDecoder.LENGTH_OF_HEADER));\r
+ return !((type > MESSAGE_TYPES) || (length < OfFrameDecoder.LENGTH_OF_HEADER));\r
}\r
}\r
/* Copyright (C)2013 Pantheon Technologies, s.r.o. All rights reserved. */
-package org.openflow.core;
+package org.openflow.lib;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.ByteToMessageDecoder;
+
import java.util.List;
+
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import org.openflow.core.TCPHandler.COMPONENT_NAMES;
+import org.openflow.lib.TcpHandler.COMPONENT_NAMES;
/**
* Class for decoding incoming messages into message frames.
*
* @author michal.polkorab
*/
-public class OFFrameDecoder extends ByteToMessageDecoder {
+public class OfFrameDecoder extends ByteToMessageDecoder {
/** Length of OpenFlow 1.3 header */
public static final byte LENGTH_OF_HEADER = 8;
private static final byte LENGTH_INDEX_IN_HEADER = 2;
- private static final Logger LOGGER = LoggerFactory.getLogger(OFFrameDecoder.class);
+ private static final Logger LOGGER = LoggerFactory.getLogger(OfFrameDecoder.class);
/**
* Constructor of class.
*/
- public OFFrameDecoder() {
+ public OfFrameDecoder() {
LOGGER.info("Creating OFFrameDecoder");
}
private static void enableOFVersionDetector(ChannelHandlerContext ctx) {
if (ctx.pipeline().get(COMPONENT_NAMES.OF_VERSION_DETECTOR.name()) == null) {
LOGGER.info("Adding OFVD");
- ctx.pipeline().addLast(COMPONENT_NAMES.OF_VERSION_DETECTOR.name(), new OFVersionDetector());
+ ctx.pipeline().addLast(COMPONENT_NAMES.OF_VERSION_DETECTOR.name(), new OfVersionDetector());
} else {
LOGGER.debug("OFVD already in pipeline");
}
/* Copyright (C)2013 Pantheon Technologies, s.r.o. All rights reserved. */
-package org.openflow.core;
+package org.openflow.lib;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.ByteToMessageDecoder;
+
import java.util.List;
+
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import org.openflow.core.TCPHandler.COMPONENT_NAMES;
+import org.openflow.lib.TcpHandler.COMPONENT_NAMES;
/**
* Class that detects version of used OpenFlow Protocol and engages right OFCodec into
*
* @author michal.polkorab
*/
-public class OFVersionDetector extends ByteToMessageDecoder {
+public class OfVersionDetector extends ByteToMessageDecoder {
- private static final byte OF13_VERSION_ID = 0x04;
- private static final Logger LOGGER = LoggerFactory.getLogger(OFVersionDetector.class);
+ /** Version number of OpenFlow 1.3 protocol */
+ public static final byte OF13_VERSION_ID = 0x04;
+ private static final Logger LOGGER = LoggerFactory.getLogger(OfVersionDetector.class);
/**
* Constructor of class.
*/
- public OFVersionDetector() {
+ public OfVersionDetector() {
LOGGER.info("Creating OFVersionDetector");
}
private static void enableOF13Codec(ChannelHandlerContext chc) {
if (chc.pipeline().get(COMPONENT_NAMES.OF_CODEC.name()) == null) {
LOGGER.info("Engaging OF13Codec");
- chc.pipeline().addLast(COMPONENT_NAMES.OF_CODEC.name(), new OF13Codec());
+ chc.pipeline().addLast(COMPONENT_NAMES.OF_CODEC.name(), new Of13Codec());
} else {
LOGGER.debug("OF13Codec already in pipeline");
}
-package org.openflow.core;\r
-\r
-import java.util.Iterator;\r
-\r
-import org.openflow.core.TCPHandler.COMPONENT_NAMES;\r
+package org.openflow.lib;\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.openflow.lib.TcpHandler.COMPONENT_NAMES;\r
\r
/**\r
* @author michal.polkorab\r
*\r
*/\r
-public class PublishingChannelInitializer extends ChannelInitializer<SocketChannel> {\r
+public class PublishingChannelInitializer extends ChannelInitializer<Channel> {\r
\r
private DefaultChannelGroup allChannels;\r
\r
}\r
\r
@Override\r
- protected void initChannel(SocketChannel ch) throws Exception {\r
+ protected void initChannel(Channel ch) throws Exception {\r
allChannels.add(ch);\r
- ch.pipeline().addLast(COMPONENT_NAMES.TLS_DETECTOR.name(), new TLSDetector());\r
+ ch.pipeline().addLast(COMPONENT_NAMES.TLS_DETECTOR.name(), new TlsDetector());\r
}\r
\r
/**\r
/* Copyright (C)2013 Pantheon Technologies, s.r.o. All rights reserved. */
-package org.openflow.core;
+package org.openflow.lib;
import java.security.KeyStore;
import java.security.Security;
/* Copyright (C)2013 Pantheon Technologies, s.r.o. All rights reserved. */
-package org.openflow.core;
+package org.openflow.lib;
-import java.io.FileNotFoundException;
import java.io.InputStream;
/**
* InputStream instance of key
*
* @return key as InputStream
- * @throws FileNotFoundException
*/
- public static InputStream asInputStream() throws FileNotFoundException {
+ public static InputStream asInputStream() {
InputStream in = SslKeyStore.class.getResourceAsStream(filename);
+ if (in == null) {
+ throw new IllegalStateException("KeyStore file not found: " + filename);
+ }
return in;
}
/* Copyright (C)2013 Pantheon Technologies, s.r.o. All rights reserved. */
-package org.openflow.core;
+package org.openflow.lib;
import javax.net.ssl.ManagerFactoryParameters;
import javax.net.ssl.TrustManager;
/* Copyright (C)2013 Pantheon Technologies, s.r.o. All rights reserved. */
-package org.openflow.core;
+package org.openflow.lib;
import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelFuture;
import io.netty.handler.logging.LogLevel;
import io.netty.handler.logging.LoggingHandler;
+import java.net.InetSocketAddress;
+
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
*
* @author michal.polkorab
*/
-public class TCPHandler extends Thread {
+public class TcpHandler extends Thread {
private int port;
+ private String address;
private NioEventLoopGroup workerGroup;
private NioEventLoopGroup bossGroup;
- private static final Logger LOGGER = LoggerFactory.getLogger(TCPHandler.class);
+ private static final Logger LOGGER = LoggerFactory.getLogger(TcpHandler.class);
private SettableFuture<Boolean> isOnlineFuture;
*
* @param port listening port of TCPHandler server
*/
- public TCPHandler(int port) {
+ public TcpHandler(int port) {
this.port = port;
channelInitializer = new PublishingChannelInitializer();
isOnlineFuture = SettableFuture.create();
.childOption(ChannelOption.SO_KEEPALIVE, true);
ChannelFuture f = b.bind(port).sync();
+
+ InetSocketAddress isa = (InetSocketAddress) f.channel().localAddress();
+ address = isa.getHostName().toString();
+ port = isa.getPort();
isOnlineFuture.set(true);
LOGGER.info("Switch listener started and ready to accept incoming connections on port: " + port);
f.channel().closeFuture().sync();
}
/**
- * Shuts down {@link TCPHandler}}
+ * Shuts down {@link TcpHandler}}
*/
public void shutdown() {
workerGroup.shutdownGracefully();
} else {
port = 6633;
}
- new TCPHandler(port).start();
+ new TcpHandler(port).start();
}
/**
return isOnlineFuture;
}
+ /**
+ * @return the port
+ */
+ public int getPort() {
+ return port;
+ }
+
+ /**
+ * @return the address
+ */
+ public String getAddress() {
+ return address;
+ }
+
}
/* Copyright (C)2013 Pantheon Technologies, s.r.o. All rights reserved. */
-package org.openflow.core;
+package org.openflow.lib;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelPipeline;
import io.netty.handler.codec.ByteToMessageDecoder;
import io.netty.handler.ssl.SslHandler;
+
import java.util.List;
+
import javax.net.ssl.SSLEngine;
+
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import org.openflow.core.TCPHandler.COMPONENT_NAMES;
+import org.openflow.lib.TcpHandler.COMPONENT_NAMES;
import org.openflow.util.ByteBufUtils;
/**
*
* @author michal.polkorab
*/
-public class TLSDetector extends ByteToMessageDecoder {
+public class TlsDetector extends ByteToMessageDecoder {
private boolean detectSsl;
private static final Logger LOGGER = LoggerFactory
- .getLogger(TLSDetector.class);
+ .getLogger(TlsDetector.class);
/**
* Constructor of class
*/
- public TLSDetector() {
+ public TlsDetector() {
LOGGER.info("Creating TLS Detector");
detectSsl = true;
}
ChannelPipeline p = ctx.channel().pipeline();
if (p.get(COMPONENT_NAMES.OF_FRAME_DECODER.name()) == null) {
LOGGER.debug("Engaging OFFrameDecoder");
- p.addLast(COMPONENT_NAMES.OF_FRAME_DECODER.name(), new OFFrameDecoder());
+ p.addLast(COMPONENT_NAMES.OF_FRAME_DECODER.name(), new OfFrameDecoder());
} else {
LOGGER.debug("OFFD already in pipeline");
}
--- /dev/null
+/* Copyright (C)2013 Pantheon Technologies, s.r.o. All rights reserved. */\r
+package org.openflow.lib.deserialization;\r
+\r
+import java.util.HashMap;\r
+import java.util.Map;\r
+\r
+import org.openflow.deserialization.factories.EchoReplyMessageFactory;\r
+import org.openflow.deserialization.factories.EchoRequestMessageFactory;\r
+import org.openflow.deserialization.factories.FeaturesReplyMessageFactory;\r
+import org.openflow.deserialization.factories.HelloMessageFactory;\r
+import org.openflow.lib.OfVersionDetector;\r
+\r
+/**\r
+ * @author michal.polkorab\r
+ *\r
+ */\r
+public class DecoderTable {\r
+ \r
+ private static final short OF13 = OfVersionDetector.OF13_VERSION_ID;\r
+ private Map<MessageTypeCodeKey, OfDeserializer<?>> table;\r
+ private static DecoderTable instance;\r
+ \r
+ \r
+ private DecoderTable() {\r
+ // do nothing\r
+ }\r
+ \r
+ /**\r
+ * @return singleton instance\r
+ */\r
+ public static DecoderTable getInstance() {\r
+ if (instance == null) {\r
+ synchronized (DecoderTable.class) {\r
+ instance = new DecoderTable();\r
+ instance.init();\r
+ }\r
+ }\r
+ return instance;\r
+ }\r
+ \r
+ /**\r
+ * Decoder table provisioning\r
+ */\r
+ public void init() {\r
+ table = new HashMap<>();\r
+ table.put(new MessageTypeCodeKey(OF13, (short) 0), HelloMessageFactory.getInstance());\r
+ table.put(new MessageTypeCodeKey(OF13, (short) 2), EchoRequestMessageFactory.getInstance());\r
+ table.put(new MessageTypeCodeKey(OF13, (short) 3), EchoReplyMessageFactory.getInstance());\r
+ table.put(new MessageTypeCodeKey(OF13, (short) 6), FeaturesReplyMessageFactory.getInstance());\r
+ }\r
+ \r
+ /**\r
+ * @param msgTypeKey\r
+ * @return decoder for given message types\r
+ */\r
+ public OfDeserializer<?> getDecoder(MessageTypeCodeKey msgTypeKey) {\r
+ return table.get(msgTypeKey);\r
+ }\r
+\r
+}\r
--- /dev/null
+/* Copyright (C)2013 Pantheon Technologies, s.r.o. All rights reserved. */\r
+package org.openflow.lib.deserialization;\r
+\r
+import io.netty.buffer.ByteBuf;\r
+\r
+import org.opendaylight.yangtools.yang.binding.DataObject;\r
+\r
+/**\r
+ *\r
+ * @author michal.polkorab\r
+ */\r
+public abstract class DeserializationFactory {\r
+\r
+ /**\r
+ * Transforms ByteBuf into correct POJO message\r
+ * @param rawMessage \r
+ * @param version version decoded from OpenFlow protocol message\r
+ * @return correct POJO as DataObject\r
+ */\r
+ public static DataObject bufferToMessage(ByteBuf rawMessage, short version) {\r
+ DataObject dataObject = null;\r
+ short type = rawMessage.readUnsignedByte();\r
+ \r
+ // TODO - check if no change happened, so that skipping length would cause problems\r
+ rawMessage.skipBytes(Short.SIZE / Byte.SIZE);\r
+\r
+ MessageTypeCodeKey msgTypeCodeKey = new MessageTypeCodeKey(version, type);\r
+ OfDeserializer<?> decoder = DecoderTable.getInstance().getDecoder(msgTypeCodeKey);\r
+ dataObject = decoder.bufferToMessage(rawMessage, version);\r
+ /* \r
+ Type Message\r
+ 0: HELLO\r
+ 1: ERROR\r
+ 2: ECHO_REQUEST\r
+ 3: ECHO_REPLY\r
+ 4: EXPERIMENTER\r
+ 5: FEATURES_REQUEST\r
+ 6: FEATURES_REPLY\r
+ 7: GET_CONFIG_REQUEST\r
+ 8: GET_CONFIG_REPLY\r
+ 9: SET_CONFIG\r
+ 10: PACKET_IN\r
+ 11: FLOW_REMOVED\r
+ 12: PORT_STATUS\r
+ 13: PACKET_OUT\r
+ 14: FLOW_MOD\r
+ 15: GROUP_MOD\r
+ 16: PORT_MOD\r
+ 17: TABLE_MOD\r
+ 18: MULTIPART_REQUEST\r
+ 19: MULTIPART_REPLY\r
+ 20: BARRIER_REQUEST\r
+ 21: BARRIER_REPLY\r
+ 22: QUEUE_GET_CONFIG_REQUEST\r
+ 23: QUEUE_GET_CONFIG_REPLY\r
+ 24: ROLE_REQUEST\r
+ 25: ROLE_REPLY \r
+ 26: GET_ASYNC_REQUEST\r
+ 27: GET_ASYNC_REPLY\r
+ 28: SET_ASYNC\r
+ 29: METER_MOD\r
+ */\r
+ return dataObject;\r
+ }\r
+}\r
--- /dev/null
+/* Copyright (C)2013 Pantheon Technologies, s.r.o. All rights reserved. */\r
+package org.openflow.lib.deserialization;\r
+\r
+/**\r
+ * @author michal.polkorab\r
+ *\r
+ */\r
+public class MessageTypeCodeKey {\r
+\r
+ private final short msgType;\r
+ private final short msgVersion;\r
+\r
+ /**\r
+ * @param msgVersion protocol version\r
+ * @param msgType type code of message\r
+ */\r
+ public MessageTypeCodeKey(short msgVersion, short msgType) {\r
+ this.msgType = msgType;\r
+ this.msgVersion = msgVersion;\r
+ }\r
+\r
+ /**\r
+ * @return the msgType\r
+ */\r
+ public short getMsgType() {\r
+ return msgType;\r
+ }\r
+\r
+ /**\r
+ * @return the msgVersion\r
+ */\r
+ public short getMsgVersion() {\r
+ return msgVersion;\r
+ }\r
+\r
+ @Override\r
+ public int hashCode() {\r
+ final int prime = 31;\r
+ int result = 1;\r
+ result = prime * result + msgType;\r
+ result = prime * result + msgVersion;\r
+ return result;\r
+ }\r
+\r
+ @Override\r
+ public boolean equals(Object obj) {\r
+ if (this == obj)\r
+ return true;\r
+ if (obj == null)\r
+ return false;\r
+ if (getClass() != obj.getClass())\r
+ return false;\r
+ MessageTypeCodeKey other = (MessageTypeCodeKey) obj;\r
+ if (msgType != other.msgType)\r
+ return false;\r
+ if (msgVersion != other.msgVersion)\r
+ return false;\r
+ return true;\r
+ }\r
+ \r
+}\r
--- /dev/null
+/* Copyright (C)2013 Pantheon Technologies, s.r.o. All rights reserved. */\r
+package org.openflow.lib.deserialization;\r
+\r
+import org.opendaylight.yangtools.yang.binding.DataObject;\r
+\r
+import io.netty.buffer.ByteBuf;\r
+\r
+/**\r
+ * @author michal.polkorab\r
+ *\r
+ * @param <E> message code type\r
+ */\r
+public interface OfDeserializer<E extends DataObject> {\r
+\r
+ /**\r
+ * Transforms byte message into POJO/DTO (of type E).\r
+ * Assumes that input ByteBuf's readerIndex is pointing on length in OpenFlow header\r
+ * \r
+ * @param rawMessage message as bytes in ByteBuf\r
+ * @param version version of used OF Protocol\r
+ * @return HelloMessage as DataObject\r
+ */\r
+ public abstract E bufferToMessage(ByteBuf rawMessage, short version);\r
+\r
+}\r
--- /dev/null
+/* Copyright (C)2013 Pantheon Technologies, s.r.o. All rights reserved. */\r
+package org.openflow.lib.serialization;\r
+\r
+import java.util.HashMap;\r
+import java.util.Map;\r
+\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.HelloInput;\r
+import org.opendaylight.yangtools.yang.binding.DataObject;\r
+import org.openflow.lib.OfVersionDetector;\r
+import org.openflow.lib.serialization.factories.HelloInputMessageFactory;\r
+\r
+/**\r
+ * @author michal.polkorab\r
+ *\r
+ */\r
+public class EncoderTable {\r
+ \r
+ private static final short OF13 = OfVersionDetector.OF13_VERSION_ID;\r
+ private static EncoderTable instance;\r
+ private Map<MessageTypeKey<?>, OfSerializer<?>> table;\r
+ \r
+\r
+ private EncoderTable() {\r
+ // do nothing\r
+ }\r
+ \r
+ /**\r
+ * @return singleton instance\r
+ */\r
+ public static EncoderTable getInstance() {\r
+ if (instance == null) {\r
+ synchronized (EncoderTable.class) {\r
+ instance = new EncoderTable();\r
+ instance.init();\r
+ }\r
+ }\r
+ return instance;\r
+ }\r
+ \r
+ /**\r
+ * Encoder table provisioning\r
+ */\r
+ public void init() {\r
+ table = new HashMap<>();\r
+ table.put(new MessageTypeKey<>(OF13, HelloInput.class), HelloInputMessageFactory.getInstance());\r
+ }\r
+ \r
+ /**\r
+ * @param msgTypeKey\r
+ * @return encoder for current type of message (msgTypeKey)\r
+ */\r
+ @SuppressWarnings("unchecked")\r
+ public <E extends DataObject> OfSerializer<E> getEncoder(MessageTypeKey<E> msgTypeKey) {\r
+ return (OfSerializer<E>) table.get(msgTypeKey);\r
+ }\r
+\r
+}\r
--- /dev/null
+/* Copyright (C)2013 Pantheon Technologies, s.r.o. All rights reserved. */\r
+package org.openflow.lib.serialization;\r
+\r
+import org.opendaylight.yangtools.yang.binding.DataObject;\r
+\r
+/**\r
+ * @author michal.polkorab\r
+ * @param <E> message type (class)\r
+ *\r
+ */\r
+public class MessageTypeKey<E extends DataObject> {\r
+\r
+ private final Class<E> msgType;\r
+ private final short msgVersion;\r
+ \r
+ /**\r
+ * @param msgVersion protocol version\r
+ * @param msgType type of message\r
+ */\r
+ public MessageTypeKey(short msgVersion, Class<E> msgType) {\r
+ super();\r
+ this.msgType = msgType;\r
+ this.msgVersion = msgVersion;\r
+ }\r
+ \r
+ /**\r
+ * @return msgVersion\r
+ */\r
+ public short getMsgVersion() {\r
+ return msgVersion;\r
+ }\r
+\r
+ /**\r
+ * @return the msgType\r
+ */\r
+ public Class<E> getMsgType() {\r
+ return msgType;\r
+ }\r
+\r
+ @Override\r
+ public int hashCode() {\r
+ final int prime = 31;\r
+ int result = 1;\r
+ result = prime * result + ((msgType == null) ? 0 : msgType.hashCode());\r
+ result = prime * result + msgVersion;\r
+ return result;\r
+ }\r
+\r
+ @Override\r
+ public boolean equals(Object obj) {\r
+ if (this == obj)\r
+ return true;\r
+ if (obj == null)\r
+ return false;\r
+ if (getClass() != obj.getClass())\r
+ return false;\r
+ MessageTypeKey<?> other = (MessageTypeKey<?>) obj;\r
+ if (msgType == null) {\r
+ if (other.msgType != null)\r
+ return false;\r
+ } else if (!msgType.equals(other.msgType))\r
+ return false;\r
+ if (msgVersion != other.msgVersion)\r
+ return false;\r
+ return true;\r
+ }\r
+ \r
+}\r
--- /dev/null
+/* Copyright (C)2013 Pantheon Technologies, s.r.o. All rights reserved. */\r
+package org.openflow.lib.serialization;\r
+\r
+import io.netty.buffer.ByteBuf;\r
+\r
+import org.opendaylight.yangtools.yang.binding.DataObject;\r
+\r
+/**\r
+ * @author michal.polkorab\r
+ *\r
+ * @param <E> message type\r
+ */\r
+public interface OfSerializer <E extends DataObject> {\r
+\r
+ /**\r
+ * Transforms POJO/DTO into byte message (ByteBuf).\r
+ * @param version version of used OF Protocol\r
+ * @param out ByteBuf used for output\r
+ * @param message message that will be transformed into ByteBuf\r
+ */\r
+ public abstract void messageToBuffer(short version, ByteBuf out, E message);\r
+}\r
--- /dev/null
+/* Copyright (C)2013 Pantheon Technologies, s.r.o. All rights reserved. */\r
+package org.openflow.lib.serialization;\r
+\r
+import io.netty.buffer.ByteBuf;\r
+\r
+import org.opendaylight.yangtools.yang.binding.DataObject;\r
+\r
+/**\r
+ * @author michal.polkorab\r
+ *\r
+ */\r
+public class SerializationFactory {\r
+\r
+ /**\r
+ * Transforms POJO message into ByteBuf\r
+ * @param version version used for encoding received message\r
+ * @param out ByteBuf for storing and sending transformed message\r
+ * @param message POJO message\r
+ */\r
+ public static <E extends DataObject> void messageToBuffer(short version, ByteBuf out, E message) {\r
+ @SuppressWarnings("unchecked")\r
+ MessageTypeKey<E> msgTypeKey = new MessageTypeKey<E>(version, (Class<E>) message.getClass());\r
+ OfSerializer<E> encoder = EncoderTable.getInstance().getEncoder(msgTypeKey);\r
+ encoder.messageToBuffer(version, out, message);\r
+ /* \r
+ Type Message\r
+ 0: HELLO\r
+ 1: ERROR\r
+ 2: ECHO_REQUEST\r
+ 3: ECHO_REPLY\r
+ 4: EXPERIMENTER\r
+ 5: FEATURES_REQUEST\r
+ 6: FEATURES_REPLY\r
+ 7: GET_CONFIG_REQUEST\r
+ 8: GET_CONFIG_REPLY\r
+ 9: SET_CONFIG\r
+ 10: PACKET_IN\r
+ 11: FLOW_REMOVED\r
+ 12: PORT_STATUS\r
+ 13: PACKET_OUT\r
+ 14: FLOW_MOD\r
+ 15: GROUP_MOD\r
+ 16: PORT_MOD\r
+ 17: TABLE_MOD\r
+ 18: MULTIPART_REQUEST\r
+ 19: MULTIPART_REPLY\r
+ 20: BARRIER_REQUEST\r
+ 21: BARRIER_REPLY\r
+ 22: QUEUE_GET_CONFIG_REQUEST\r
+ 23: QUEUE_GET_CONFIG_REPLY\r
+ 24: ROLE_REQUEST\r
+ 25: ROLE_REPLY \r
+ 26: GET_ASYNC_REQUEST\r
+ 27: GET_ASYNC_REPLY\r
+ 28: SET_ASYNC\r
+ 29: METER_MOD\r
+ */\r
+ }\r
+}\r
--- /dev/null
+/* Copyright (C)2013 Pantheon Technologies, s.r.o. All rights reserved. */\r
+package org.openflow.lib.serialization.factories;\r
+\r
+import io.netty.buffer.ByteBuf;\r
+\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.HelloInput;\r
+import org.openflow.lib.OfFrameDecoder;\r
+import org.openflow.lib.serialization.OfSerializer;\r
+\r
+/**\r
+ * @author michal.polkorab\r
+ *\r
+ */\r
+public class HelloInputMessageFactory implements OfSerializer<HelloInput>{\r
+\r
+ /** Code type of HelloMessage */\r
+ public static final byte MESSAGE_TYPE = 0;\r
+ private static HelloInputMessageFactory instance;\r
+ \r
+ private HelloInputMessageFactory() {\r
+ // do nothing, just singleton\r
+ }\r
+ \r
+ /**\r
+ * @return singleton factory\r
+ */\r
+ public static HelloInputMessageFactory getInstance() {\r
+ if (instance == null) {\r
+ instance = new HelloInputMessageFactory();\r
+ }\r
+ return instance;\r
+ }\r
+\r
+ @Override\r
+ public void messageToBuffer(short version, ByteBuf out, HelloInput message) {\r
+ out.writeByte(message.getVersion());\r
+ out.writeByte(MESSAGE_TYPE);\r
+ out.writeShort(OfFrameDecoder.LENGTH_OF_HEADER);\r
+ out.writeInt(message.getXid().intValue());\r
+ // TODO - fill list of elements into ByteBuf, check length too\r
+ }\r
+ \r
+ \r
+\r
+ \r
+ \r
+}\r
/* Copyright (C)2013 Pantheon Technologies, s.r.o. All rights reserved. */\r
-package org.openflow.core;\r
+package org.openflow.lib;\r
\r
import io.netty.buffer.ByteBuf;\r
import io.netty.channel.ChannelHandlerContext;\r
/* Copyright (C)2013 Pantheon Technologies, s.r.o. All rights reserved. */\r
-package org.openflow.core;\r
+package org.openflow.lib;\r
\r
import io.netty.buffer.ByteBuf;\r
import io.netty.channel.embedded.EmbeddedChannel;\r
+\r
import org.junit.Assert;\r
import org.junit.Before;\r
import org.junit.Test;\r
+import org.openflow.lib.OfFrameDecoder;\r
\r
/**\r
- * Testing class of {@link OFFrameDecoder}\r
+ * Testing class of {@link OfFrameDecoder}\r
* @author michal.polkorab\r
*/\r
public class OFFrameDecoderTest {\r
*/\r
@Before\r
public void setUp() {\r
- embch = new EmbeddedChannel(new OFFrameDecoder());\r
+ embch = new EmbeddedChannel(new OfFrameDecoder());\r
}\r
\r
/**\r
- * Test of decoding {@link OFFrameDecoder#decode(io.netty.channel.ChannelHandlerContext, io.netty.buffer.ByteBuf, java.util.List)}\r
+ * Test of decoding {@link OfFrameDecoder#decode(io.netty.channel.ChannelHandlerContext, io.netty.buffer.ByteBuf, java.util.List)}\r
* @throws Exception \r
*/\r
@Test\r
}\r
\r
/**\r
- * Test of decoding {@link OFFrameDecoder#decode(io.netty.channel.ChannelHandlerContext, io.netty.buffer.ByteBuf, java.util.List)}\r
+ * Test of decoding {@link OfFrameDecoder#decode(io.netty.channel.ChannelHandlerContext, io.netty.buffer.ByteBuf, java.util.List)}\r
* @throws Exception \r
*/\r
@Test\r
}\r
\r
/**\r
- * Test of decoding {@link OFFrameDecoder#decode(io.netty.channel.ChannelHandlerContext, io.netty.buffer.ByteBuf, java.util.List)}\r
+ * Test of decoding {@link OfFrameDecoder#decode(io.netty.channel.ChannelHandlerContext, io.netty.buffer.ByteBuf, java.util.List)}\r
* @throws Exception \r
*/\r
@Test\r
}\r
\r
/**\r
- * Test of decoding {@link OFFrameDecoder#decode(io.netty.channel.ChannelHandlerContext, io.netty.buffer.ByteBuf, java.util.List)}\r
+ * Test of decoding {@link OfFrameDecoder#decode(io.netty.channel.ChannelHandlerContext, io.netty.buffer.ByteBuf, java.util.List)}\r
* @throws Exception \r
*/\r
@Test\r
/* Copyright (C)2013 Pantheon Technologies, s.r.o. All rights reserved. */\r
-package org.openflow.core;\r
+package org.openflow.lib;\r
\r
import io.netty.buffer.ByteBuf;\r
import io.netty.channel.embedded.EmbeddedChannel;\r
import org.junit.Assert;\r
import org.junit.Before;\r
import org.junit.Test;\r
-import org.openflow.core.TCPHandler.COMPONENT_NAMES;\r
+import org.openflow.lib.OfVersionDetector;\r
+import org.openflow.lib.TcpHandler.COMPONENT_NAMES;\r
\r
/**\r
*\r
*/\r
@Before\r
public void setUp() {\r
- embch = new EmbeddedChannel(new OFVersionDetector());\r
+ embch = new EmbeddedChannel(new OfVersionDetector());\r
}\r
\r
/**\r
- * Test of decode {@link OFVersionDetector#decode(io.netty.channel.ChannelHandlerContext, io.netty.buffer.ByteBuf, java.util.List)\r
+ * Test of decode {@link OfVersionDetector#decode(io.netty.channel.ChannelHandlerContext, io.netty.buffer.ByteBuf, java.util.List)\r
* }\r
* @throws Exception \r
*/\r
}\r
\r
/**\r
- * Test of decode {@link OFVersionDetector#decode(io.netty.channel.ChannelHandlerContext, io.netty.buffer.ByteBuf, java.util.List)\r
+ * Test of decode {@link OfVersionDetector#decode(io.netty.channel.ChannelHandlerContext, io.netty.buffer.ByteBuf, java.util.List)\r
* }\r
* @throws Exception \r
*/\r
/* Copyright (C)2013 Pantheon Technologies, s.r.o. All rights reserved. */
-package org.openflow.core;
+package org.openflow.lib;
import io.netty.channel.Channel;
import io.netty.util.concurrent.Future;
-import java.io.IOException;
-import java.net.InetAddress;
-import java.net.ServerSocket;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.concurrent.ExecutionException;
+import java.util.concurrent.TimeUnit;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
-import org.openflow.clients.SimpleClient;
+import org.openflow.lib.clients.SimpleClient;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
*/
public class TCPHandlerTest {
- /**
- *
- */
+ /** Name of file in which OpenFLow protocol messages are stored in binary format */
private static final String OF_BINARY_MESSAGE_INPUT_TXT = "OFBinaryMessageInput.txt";
protected static final Logger LOGGER = LoggerFactory
.getLogger(TCPHandlerTest.class);
+ private static final long CONNECTION_TIMEOUT = 2000;
+
protected int port;
protected String address;
- protected TCPHandler tcphandler;
+ protected TcpHandler tcphandler;
/**
* @throws InterruptedException
*/
@Before
public void setUp() throws InterruptedException, ExecutionException {
- getFreePortAndAddress();
- tcphandler = new TCPHandler(port);
+ tcphandler = new TcpHandler(0);
tcphandler.start();
tcphandler.getIsOnlineFuture().get();
+ port = tcphandler.getPort();
+ address = tcphandler.getAddress();
}
/**
- * stop {@link TCPHandler}
+ * stop {@link TcpHandler}
*/
@After
public void tearDown() {
}
/**
- * Test of connections in {@link TCPHandler} - accepting connection of 1
+ * Test of connections in {@link TcpHandler} - accepting connection of 1
* client
* @throws InterruptedException
* @throws ExecutionException
}
/**
- * Test of connections in {@link TCPHandler} - accepting connection of 10
+ * Test of connections in {@link TcpHandler} - accepting connection of 10
* clients
* @throws InterruptedException
* @throws ExecutionException
}
/**
- * Test of disconnecting in {@link TCPHandler} - shutting down connection of 10
+ * Test of disconnecting in {@link TcpHandler} - shutting down connection of 10
* clients
* @throws InterruptedException
* @throws ExecutionException
sc.start();
}
for (SimpleClient sc : clientsHorde) {
- sc.getIsOnlineFuture().get();
+ try {
+ sc.getIsOnlineFuture().get(CONNECTION_TIMEOUT, TimeUnit.MILLISECONDS);
+ } catch (Exception e) {
+ LOGGER.error(e.getMessage(), e);
+ throw new ExecutionException(e);
+ }
}
return clientsHorde;
}
/**
- * Test of disconnecting in {@link TCPHandler} - shutting down connection of 1
+ * Test of disconnecting in {@link TcpHandler} - shutting down connection of 1
* client
* @throws InterruptedException
* @throws ExecutionException
toBeDisconnected.sync();
}
}
-
- /**
- * Finds free port and determines host ip address
- */
- private void getFreePortAndAddress() {
- try {
- ServerSocket ss = new ServerSocket(0);
- port = ss.getLocalPort();
- InetAddress ia = InetAddress.getLocalHost();
- InetAddress[] all = InetAddress.getAllByName(ia.getHostName());
- address = all[0].getHostAddress();
- ss.close();
- } catch (IOException ex) {
- LOGGER.error(ex.toString());
- }
- }
}
/* Copyright (C)2013 Pantheon Technologies, s.r.o. All rights reserved. */\r
-package org.openflow.core;\r
+package org.openflow.lib;\r
\r
import io.netty.buffer.ByteBuf;\r
import io.netty.channel.embedded.EmbeddedChannel;\r
import org.junit.Assert;\r
import org.junit.Before;\r
import org.junit.Test;\r
-import org.openflow.core.TCPHandler.COMPONENT_NAMES;\r
+import org.openflow.lib.TcpHandler;\r
+import org.openflow.lib.TlsDetector;\r
+import org.openflow.lib.TcpHandler.COMPONENT_NAMES;\r
\r
/**\r
*\r
*/\r
@Before\r
public void setUp() {\r
- TLSDetector tlsDetector = new TLSDetector();\r
+ TlsDetector tlsDetector = new TlsDetector();\r
embch = new EmbeddedChannel(new DummyDecoder());\r
- embch.pipeline().addFirst(TCPHandler.COMPONENT_NAMES.TLS_DETECTOR.name(), tlsDetector);\r
+ embch.pipeline().addFirst(TcpHandler.COMPONENT_NAMES.TLS_DETECTOR.name(), tlsDetector);\r
}\r
\r
/**\r
- * Test of decode {@link TLSDetector#decode(io.netty.channel.ChannelHandlerContext, io.netty.buffer.ByteBuf, java.util.List) }\r
+ * Test of decode {@link TlsDetector#decode(io.netty.channel.ChannelHandlerContext, io.netty.buffer.ByteBuf, java.util.List) }\r
* @throws Exception \r
*/\r
@Test\r
/* Copyright (C)2013 Pantheon Technologies, s.r.o. All rights reserved. */
-package org.openflow.clients;
+package org.openflow.lib.clients;
import io.netty.bootstrap.Bootstrap;
import io.netty.buffer.ByteBuf;
private void init() {
isOnlineFuture = SettableFuture.create();
}
+
/**
* Starting class of {@link SimpleClient}
*/
/* Copyright (C)2013 Pantheon Technologies, s.r.o. All rights reserved. */\r
\r
-package org.openflow.clients;\r
+package org.openflow.lib.clients;\r
\r
import io.netty.buffer.ByteBuf;\r
import io.netty.channel.ChannelHandlerContext;\r
LOGGER.info("SimpleClientHandler - end of read");\r
}\r
\r
+/* (non-Javadoc)\r
+ * @see io.netty.channel.ChannelInboundHandlerAdapter#channelActive(io.netty.channel.ChannelHandlerContext)\r
+ */\r
+ @Override\r
+ public void channelActive(ChannelHandlerContext ctx) throws Exception {\r
+ System.out.println("CLIENT IS ACTIVE");\r
+ //super.channelActive(ctx);\r
+ }\r
+ \r
+ \r
}\r
/* Copyright (C)2013 Pantheon Technologies, s.r.o. All rights reserved. */
-package org.openflow.clients;
+package org.openflow.lib.clients;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelPipeline;
import javax.net.ssl.SSLEngine;
-import org.openflow.core.SslContextFactory;
+import org.openflow.lib.SslContextFactory;
import com.google.common.util.concurrent.SettableFuture;
--- /dev/null
+/* Copyright (C)2013 Pantheon Technologies, s.r.o. All rights reserved. */\r
+package org.openflow.lib.deserialization.factories;\r
+\r
+import io.netty.buffer.ByteBuf;\r
+\r
+import org.junit.Assert;\r
+import org.junit.Test;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.EchoOutput;\r
+import org.openflow.deserialization.factories.EchoReplyMessageFactory;\r
+import org.openflow.lib.util.BufferHelper;\r
+\r
+/**\r
+ * @author michal.polkorab\r
+ *\r
+ */\r
+public class EchoReplyMessageFactoryTest {\r
+\r
+ /**\r
+ * Testing {@link EchoReplyMessageFactory} for correct translation into POJO\r
+ */\r
+ @Test\r
+ public void testWithEmptyDataField() {\r
+ ByteBuf bb = BufferHelper.buildBuffer(new byte[0]);\r
+ EchoOutput builtByFactory = EchoReplyMessageFactory.getInstance().bufferToMessage(bb, HelloMessageFactoryTest.VERSION_YET_SUPPORTED);\r
+\r
+ Assert.assertTrue(builtByFactory.getVersion() == HelloMessageFactoryTest.VERSION_YET_SUPPORTED);\r
+ Assert.assertEquals(builtByFactory.getXid().longValue(), 16909060L);\r
+ }\r
+ \r
+ /**\r
+ * Testing {@link EchoReplyMessageFactory} for correct translation into POJO\r
+ */\r
+ @Test\r
+ public void testWithDataFieldSet() {\r
+ byte[] data = new byte[]{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07};\r
+ ByteBuf bb = BufferHelper.buildBuffer(data);\r
+ EchoOutput builtByFactory = EchoReplyMessageFactory.getInstance().bufferToMessage(bb, HelloMessageFactoryTest.VERSION_YET_SUPPORTED);\r
+\r
+ Assert.assertTrue(builtByFactory.getVersion() == HelloMessageFactoryTest.VERSION_YET_SUPPORTED);\r
+ Assert.assertEquals(builtByFactory.getXid().longValue(), 16909060L);\r
+ Assert.assertArrayEquals(builtByFactory.getData(), data);\r
+ }\r
+\r
+}\r
--- /dev/null
+/* Copyright (C)2013 Pantheon Technologies, s.r.o. All rights reserved. */\r
+package org.openflow.lib.deserialization.factories;\r
+\r
+import io.netty.buffer.ByteBuf;\r
+\r
+import org.junit.Assert;\r
+import org.junit.Test;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.EchoRequestMessage;\r
+import org.openflow.deserialization.factories.EchoRequestMessageFactory;\r
+import org.openflow.lib.util.BufferHelper;\r
+\r
+/**\r
+ * @author michal.polkorab\r
+ *\r
+ */\r
+public class EchoRequestMessageFactoryTest {\r
+\r
+ /**\r
+ * Testing {@link EchoRequestMessageFactory} for correct translation into POJO\r
+ */\r
+ @Test\r
+ public void testWithEmptyDataField() {\r
+ ByteBuf bb = BufferHelper.buildBuffer(new byte[0]);\r
+ EchoRequestMessage builtByFactory = EchoRequestMessageFactory.getInstance().bufferToMessage(bb, HelloMessageFactoryTest.VERSION_YET_SUPPORTED);\r
+\r
+ Assert.assertTrue(builtByFactory.getVersion() == HelloMessageFactoryTest.VERSION_YET_SUPPORTED);\r
+ Assert.assertEquals(builtByFactory.getXid().longValue(), 16909060L);\r
+ }\r
+ \r
+ /**\r
+ * Testing {@link EchoRequestMessageFactory} for correct translation into POJO\r
+ */\r
+ @Test\r
+ public void testWithDataFieldSet() {\r
+ byte[] data = new byte[]{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07};\r
+ ByteBuf bb = BufferHelper.buildBuffer(data);\r
+ EchoRequestMessage builtByFactory = EchoRequestMessageFactory.getInstance().bufferToMessage(bb, HelloMessageFactoryTest.VERSION_YET_SUPPORTED);\r
+\r
+ Assert.assertTrue(builtByFactory.getVersion() == HelloMessageFactoryTest.VERSION_YET_SUPPORTED);\r
+ Assert.assertEquals(builtByFactory.getXid().longValue(), 16909060L);\r
+ }\r
+\r
+}\r
--- /dev/null
+/* Copyright (C)2013 Pantheon Technologies, s.r.o. All rights reserved. */\r
+package org.openflow.lib.deserialization.factories;\r
+\r
+import io.netty.buffer.ByteBuf;\r
+\r
+import org.junit.Assert;\r
+import org.junit.Test;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetFeaturesOutput;\r
+import org.openflow.deserialization.factories.FeaturesReplyMessageFactory;\r
+import org.openflow.lib.util.BufferHelper;\r
+\r
+/**\r
+ * @author michal.polkorab\r
+ *\r
+ */\r
+public class FeaturesReplyMessageFactoryTest {\r
+\r
+ /**\r
+ * Testing {@link FeaturesReplyMessageFactory} for correct translation into POJO\r
+ */\r
+ @Test\r
+ public void test() {\r
+ byte[] data = new byte[]{ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, \r
+ 0x00, 0x01, 0x02, 0x03, 0x01, 0x01, 0x00, 0x00,\r
+ 0x00, 0x01, 0x02, 0x03, 0x00, 0x01, 0x02, 0x03 };\r
+ ByteBuf bb = BufferHelper.buildBuffer(data);\r
+ GetFeaturesOutput builtByFactory = FeaturesReplyMessageFactory.getInstance().bufferToMessage(bb, HelloMessageFactoryTest.VERSION_YET_SUPPORTED);\r
+\r
+ Assert.assertTrue(builtByFactory.getVersion() == HelloMessageFactoryTest.VERSION_YET_SUPPORTED);\r
+ Assert.assertEquals(builtByFactory.getXid().longValue(), 16909060L);\r
+ Assert.assertTrue(builtByFactory.getTables() == 1);\r
+ Assert.assertTrue(builtByFactory.getAuxiliaryId() == 1);\r
+ Assert.assertEquals(66051L, builtByFactory.getBuffers().longValue());\r
+ Assert.assertEquals(66051L, builtByFactory.getCapabilities().longValue());\r
+ Assert.assertEquals(66051L, builtByFactory.getReserved().longValue());\r
+ Assert.assertTrue(builtByFactory.getDatapathId().longValue() == 283686952306183L);\r
+ }\r
+\r
+}\r
--- /dev/null
+/* Copyright (C)2013 Pantheon Technologies, s.r.o. All rights reserved. */\r
+package org.openflow.lib.deserialization.factories;\r
+\r
+import io.netty.buffer.ByteBuf;\r
+\r
+import org.junit.Assert;\r
+import org.junit.Test;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.HelloMessage;\r
+import org.openflow.deserialization.factories.HelloMessageFactory;\r
+import org.openflow.lib.util.BufferHelper;\r
+\r
+/**\r
+ * @author michal.polkorab\r
+ *\r
+ */\r
+public class HelloMessageFactoryTest {\r
+ \r
+ /** Number of currently supported version / codec */\r
+ public static final short VERSION_YET_SUPPORTED = 0x04;\r
+ /** Index of Xid in OpenFlow 1.3 header */\r
+ public static final byte INDEX_OF_XID_IN_HEADER = 4;\r
+\r
+ /**\r
+ * Testing {@link HelloMessageFactory} for correct translation into POJO\r
+ */\r
+ @Test\r
+ public void test() {\r
+ ByteBuf bb = BufferHelper.buildBuffer(new byte[0]);\r
+ HelloMessage builtByFactory = HelloMessageFactory.getInstance().bufferToMessage(bb, VERSION_YET_SUPPORTED);\r
+\r
+ Assert.assertTrue(builtByFactory.getVersion() == VERSION_YET_SUPPORTED);\r
+ Assert.assertEquals(builtByFactory.getXid().longValue(), 16909060L);\r
+ }\r
+}\r
--- /dev/null
+/* Copyright (C)2013 Pantheon Technologies, s.r.o. All rights reserved. */\r
+package org.openflow.lib.serialization.factories;\r
+\r
+import io.netty.buffer.ByteBuf;\r
+import io.netty.buffer.UnpooledByteBufAllocator;\r
+\r
+import org.junit.Assert;\r
+import org.junit.Test;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.HelloInput;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.HelloInputBuilder;\r
+import org.openflow.lib.OfFrameDecoder;\r
+import org.openflow.lib.deserialization.factories.HelloMessageFactoryTest;\r
+\r
+/**\r
+ * @author michal.polkorab\r
+ *\r
+ */\r
+public class HelloInputMessageFactoryTest {\r
+\r
+ private static final byte HELLO_MESSAGE_CODE_TYPE = 0;\r
+ /**\r
+ * Testing of {@link HelloInputMessageFactory} for correct translation from POJO\r
+ */\r
+ @Test\r
+ public void testWithoutElementsSet() {\r
+ HelloInputBuilder hib = new HelloInputBuilder();\r
+ hib.setVersion(HelloMessageFactoryTest.VERSION_YET_SUPPORTED);\r
+ hib.setXid(16909060L);\r
+ HelloInput hi = hib.build();\r
+ \r
+ ByteBuf out = UnpooledByteBufAllocator.DEFAULT.buffer();\r
+ HelloInputMessageFactory himf = HelloInputMessageFactory.getInstance();\r
+ himf.messageToBuffer(HelloMessageFactoryTest.VERSION_YET_SUPPORTED, out, hi);\r
+ \r
+ Assert.assertTrue(out.readByte() == HelloMessageFactoryTest.VERSION_YET_SUPPORTED);\r
+ Assert.assertTrue(out.readByte() == HELLO_MESSAGE_CODE_TYPE);\r
+ Assert.assertTrue(out.readUnsignedShort() == OfFrameDecoder.LENGTH_OF_HEADER);\r
+ Assert.assertTrue(out.readUnsignedInt() == 16909060L);\r
+ }\r
+\r
+}\r
--- /dev/null
+/* Copyright (C)2013 Pantheon Technologies, s.r.o. All rights reserved. */\r
+package org.openflow.lib.util;\r
+\r
+import io.netty.buffer.ByteBuf;\r
+import io.netty.buffer.UnpooledByteBufAllocator;\r
+\r
+/**\r
+ * @author michal.polkorab\r
+ *\r
+ */\r
+public abstract class BufferHelper {\r
+\r
+ /**\r
+ * \r
+ */\r
+ private static final byte[] XID = new byte[]{0x01, 0x02, 0x03, 0x04};\r
+\r
+ /**\r
+ * @param payload\r
+ * @return ByteBuf filled with OpenFlow protocol message without first 2 bytes\r
+ */\r
+ public static ByteBuf buildBuffer(byte[] payload) {\r
+ ByteBuf bb = UnpooledByteBufAllocator.DEFAULT.buffer();\r
+ bb.writeBytes(XID);\r
+ bb.writeBytes(payload);\r
+ return bb;\r
+ }\r
+\r
+}\r