BUG-4692: Migrate TCP-MD5 support in pcc-mock package to netty's native-epoll 69/39269/9
authorOm Prakash <op317q@att.com>
Wed, 1 Jun 2016 12:48:14 +0000 (08:48 -0400)
committerOm Prakash <op317q@att.com>
Wed, 1 Jun 2016 16:54:17 +0000 (12:54 -0400)
The reason for migration is that TCP-MD5 are part of the netty library so There is no need to inject any md5 config modules in pcc-mock package.
This change will include to extended concepts package change , upgrade Netty 4.0.33.Final -> 4.0.36.Final and remove the code of md5 package to use e-poll for this change.

Change-Id: I9bb7ba670e7cd40377edb1f237662ec7949c883f
Signed-off-by: Om Prakash <op317q@att.com>
concepts/src/main/java/org/opendaylight/protocol/concepts/KeyMapping.java
pcep/pcc-mock/pom.xml
pcep/pcc-mock/src/main/java/org/opendaylight/protocol/pcep/pcc/mock/PCCsBuilder.java
pcep/pcc-mock/src/main/java/org/opendaylight/protocol/pcep/pcc/mock/api/PCCDispatcher.java
pcep/pcc-mock/src/main/java/org/opendaylight/protocol/pcep/pcc/mock/protocol/PCCDispatcherImpl.java

index dc28dbdf2d294c06c4d1666ca98c224c2c93b540..302d48a0b5697919220b9ed8bd3c7ed8f5ea1280 100644 (file)
@@ -7,26 +7,45 @@
  */
 package org.opendaylight.protocol.concepts;
 
+import static com.google.common.base.Strings.isNullOrEmpty;
+
+import com.google.common.base.Charsets;
 import java.net.InetAddress;
 import java.util.HashMap;
 import java.util.Map;
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
 
 public final class KeyMapping extends HashMap<InetAddress, byte[]> {
     private static final long serialVersionUID = 1L;
 
-    public KeyMapping() {
+    private KeyMapping() {
         super();
     }
 
-    public KeyMapping(final int initialCapacity, final float loadFactor) {
+    private KeyMapping(final int initialCapacity, final float loadFactor) {
         super(initialCapacity, loadFactor);
     }
 
-    public KeyMapping(final int initialCapacity) {
+    private KeyMapping(final int initialCapacity) {
         super(initialCapacity);
     }
 
-    public KeyMapping(final Map<? extends InetAddress, ? extends byte[]> m) {
+    private KeyMapping(final Map<? extends InetAddress, ? extends byte[]> m) {
         super(m);
     }
+
+    public static KeyMapping getKeyMapping(@Nonnull final InetAddress inetAddress, @Nullable final String password){
+        if (!isNullOrEmpty(password)) {
+            final KeyMapping keyMapping = new KeyMapping();
+            keyMapping.put(inetAddress, password.getBytes(Charsets.US_ASCII));
+            return keyMapping;
+        }
+        return null;
+    }
+
+    public static KeyMapping getKeyMapping(){
+        final KeyMapping keyMapping = new KeyMapping();
+        return keyMapping;
+    }
 }
index 9a4cd6ed9e6882c1d46a47eadd5befa3ae7176ce..38999c891b0e05d09226b58a67f1fa4019ced17b 100644 (file)
       <artifactId>slf4j-api</artifactId>
     </dependency>
     <dependency>
-      <groupId>ch.qos.logback</groupId>
-      <artifactId>logback-classic</artifactId>
+      <groupId>io.netty</groupId>
+      <artifactId>netty-codec</artifactId>
     </dependency>
     <dependency>
-       <groupId>org.opendaylight.mdsal.model</groupId>
-       <artifactId>ietf-inet-types</artifactId>
+      <groupId>io.netty</groupId>
+      <artifactId>netty-buffer</artifactId>
     </dependency>
     <dependency>
-        <groupId>org.opendaylight.tcpmd5</groupId>
-        <artifactId>tcpmd5-jni</artifactId>
+      <groupId>io.netty</groupId>
+      <artifactId>netty-common</artifactId>
+     </dependency>
+     <dependency>
+      <groupId>io.netty</groupId>
+      <artifactId>netty-transport</artifactId>
     </dependency>
     <dependency>
-        <groupId>org.opendaylight.tcpmd5</groupId>
-        <artifactId>tcpmd5-netty</artifactId>
+      <groupId>io.netty</groupId>
+      <artifactId>netty-transport-native-epoll</artifactId>
+      <classifier>${os.detected.classifier}</classifier>
+    </dependency>
+    <dependency>
+      <groupId>io.netty</groupId>
+      <artifactId>netty-handler</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>ch.qos.logback</groupId>
+      <artifactId>logback-classic</artifactId>
     </dependency>
     <dependency>
-        <groupId>org.opendaylight.tcpmd5</groupId>
-        <artifactId>tcpmd5-api</artifactId>
+      <groupId>org.opendaylight.mdsal.model</groupId>
+      <artifactId>ietf-inet-types</artifactId>
     </dependency>
     <dependency>
-        <groupId>com.google.code.findbugs</groupId>
-        <artifactId>jsr305</artifactId>
+      <groupId>com.google.code.findbugs</groupId>
+      <artifactId>jsr305</artifactId>
     </dependency>
 
     <!-- Testing dependencies -->
index fccf0fb554fc2331a26280f739c672a45e5a3106..a85f879930f225c6624512b5dbe4e11e93b64e17 100644 (file)
@@ -8,9 +8,6 @@
 
 package org.opendaylight.protocol.pcep.pcc.mock;
 
-import static com.google.common.base.Strings.isNullOrEmpty;
-
-import com.google.common.base.Charsets;
 import com.google.common.base.Optional;
 import com.google.common.collect.Lists;
 import com.google.common.net.InetAddresses;
@@ -22,7 +19,7 @@ import java.net.InetSocketAddress;
 import java.util.List;
 import java.util.concurrent.ExecutionException;
 import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
+import org.opendaylight.protocol.concepts.KeyMapping;
 import org.opendaylight.protocol.pcep.PCEPCapability;
 import org.opendaylight.protocol.pcep.PCEPSessionListener;
 import org.opendaylight.protocol.pcep.PCEPSessionListenerFactory;
@@ -38,7 +35,6 @@ import org.opendaylight.protocol.pcep.pcc.mock.protocol.PCCSessionListener;
 import org.opendaylight.protocol.pcep.spi.PCEPExtensionProviderContext;
 import org.opendaylight.protocol.pcep.spi.pojo.ServiceLoaderPCEPExtensionProviderContext;
 import org.opendaylight.protocol.pcep.sync.optimizations.SyncOptimizationsActivator;
-import org.opendaylight.tcpmd5.api.KeyMapping;
 
 final class PCCsBuilder {
     private final int lsps;
@@ -99,7 +95,7 @@ final class PCCsBuilder {
                     public PCEPSessionListener getSessionListener() {
                         return new PCCSessionListener(remoteAddress.indexOf(pceAddress), tunnelManager, pcError);
                     }
-                }, snf, getKeyMapping(pceAddress.getAddress(), password), localAddress, initialDBVersion);
+                }, snf, KeyMapping.getKeyMapping(pceAddress.getAddress(), password), localAddress, initialDBVersion);
         }
     }
 
@@ -108,15 +104,6 @@ final class PCCsBuilder {
         return new DefaultPCEPSessionNegotiatorFactory(new BasePCEPSessionProposalFactory(this.deadTimer, this.keepAlive, capabilities), 0);
     }
 
-    private static KeyMapping getKeyMapping(@Nonnull final InetAddress inetAddress, @Nullable final String password) {
-        if (!isNullOrEmpty(password)) {
-            final KeyMapping keyMapping = new KeyMapping();
-            keyMapping.put(inetAddress, password.getBytes(Charsets.US_ASCII));
-            return keyMapping;
-        }
-        return null;
-    }
-
     private static void startActivators() {
         final PCCActivator pccActivator = new PCCActivator();
         final StatefulActivator stateful = new StatefulActivator();
index 43526a84d19c7fc2cb598650162f346a4732f632..4348026c0256bbf21081f4fe7e445d087097f180 100644 (file)
@@ -11,10 +11,10 @@ package org.opendaylight.protocol.pcep.pcc.mock.api;
 import io.netty.util.concurrent.Future;
 import java.math.BigInteger;
 import java.net.InetSocketAddress;
+import org.opendaylight.protocol.concepts.KeyMapping;
 import org.opendaylight.protocol.pcep.PCEPSession;
 import org.opendaylight.protocol.pcep.PCEPSessionListenerFactory;
 import org.opendaylight.protocol.pcep.PCEPSessionNegotiatorFactory;
-import org.opendaylight.tcpmd5.api.KeyMapping;
 
 public interface PCCDispatcher {
 
index 4e0eb70f3718fbe7f4f97d53c51316972fb1981e..b84200eacbcf71b30d33ad5488089de25288f322 100755 (executable)
@@ -8,11 +8,17 @@
 
 package org.opendaylight.protocol.pcep.pcc.mock.protocol;
 
+import com.google.common.base.Optional;
 import io.netty.bootstrap.Bootstrap;
 import io.netty.channel.ChannelHandlerContext;
 import io.netty.channel.ChannelInboundHandlerAdapter;
 import io.netty.channel.ChannelInitializer;
 import io.netty.channel.ChannelOption;
+import io.netty.channel.EventLoopGroup;
+import io.netty.channel.epoll.Epoll;
+import io.netty.channel.epoll.EpollChannelOption;
+import io.netty.channel.epoll.EpollEventLoopGroup;
+import io.netty.channel.epoll.EpollSocketChannel;
 import io.netty.channel.nio.NioEventLoopGroup;
 import io.netty.channel.socket.SocketChannel;
 import io.netty.channel.socket.nio.NioSocketChannel;
@@ -22,20 +28,13 @@ import java.net.InetSocketAddress;
 import java.util.concurrent.ExecutionException;
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
+import org.opendaylight.protocol.concepts.KeyMapping;
 import org.opendaylight.protocol.pcep.PCEPSession;
 import org.opendaylight.protocol.pcep.PCEPSessionListenerFactory;
 import org.opendaylight.protocol.pcep.PCEPSessionNegotiatorFactory;
 import org.opendaylight.protocol.pcep.impl.PCEPHandlerFactory;
 import org.opendaylight.protocol.pcep.pcc.mock.api.PCCDispatcher;
 import org.opendaylight.protocol.pcep.spi.MessageRegistry;
-import org.opendaylight.tcpmd5.api.DummyKeyAccessFactory;
-import org.opendaylight.tcpmd5.api.KeyAccessFactory;
-import org.opendaylight.tcpmd5.api.KeyMapping;
-import org.opendaylight.tcpmd5.jni.NativeKeyAccessFactory;
-import org.opendaylight.tcpmd5.jni.NativeSupportUnavailableException;
-import org.opendaylight.tcpmd5.netty.MD5ChannelFactory;
-import org.opendaylight.tcpmd5.netty.MD5ChannelOption;
-import org.opendaylight.tcpmd5.netty.MD5NioSocketChannelFactory;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -46,39 +45,15 @@ public final class PCCDispatcherImpl implements PCCDispatcher, AutoCloseable {
     private static final int CONNECT_TIMEOUT = 2000;
 
     private final PCEPHandlerFactory factory;
-    private final MD5ChannelFactory<?> cf;
-    private final NioEventLoopGroup workerGroup;
+    private final EventLoopGroup workerGroup;
 
     public PCCDispatcherImpl(@Nonnull final MessageRegistry registry) {
-        this.workerGroup = new NioEventLoopGroup();
-        this.factory = new PCEPHandlerFactory(registry);
-        this.cf = new MD5NioSocketChannelFactory(DeafultKeyAccessFactory.getKeyAccessFactory());
-    }
-
-    private static final class DeafultKeyAccessFactory {
-        private static final Logger LOG = LoggerFactory.getLogger(DeafultKeyAccessFactory.class);
-        private static final KeyAccessFactory FACTORY;
-
-        static {
-            KeyAccessFactory factory;
-
-            try {
-                factory = NativeKeyAccessFactory.getInstance();
-            } catch (final NativeSupportUnavailableException e) {
-                LOG.debug("Native key access not available, using no-op fallback", e);
-                factory = DummyKeyAccessFactory.getInstance();
-            }
-
-            FACTORY = factory;
-        }
-
-        private DeafultKeyAccessFactory() {
-            throw new UnsupportedOperationException("Utility class should never be instantiated");
-        }
-
-        public static KeyAccessFactory getKeyAccessFactory() {
-            return FACTORY;
+        if(Epoll.isAvailable()){
+            this.workerGroup = new EpollEventLoopGroup();
+        } else {
+            this.workerGroup = new NioEventLoopGroup();
         }
+        this.factory = new PCEPHandlerFactory(registry);
     }
 
     @Override
@@ -95,7 +70,8 @@ public final class PCCDispatcherImpl implements PCCDispatcher, AutoCloseable {
         final Bootstrap b = new Bootstrap();
         b.group(this.workerGroup);
         b.localAddress(localAddress);
-        setChannelFactory(b, keys);
+        final Optional<KeyMapping> optionalKey = Optional.fromNullable(keys);
+        setChannelFactory(b, optionalKey);
         b.option(ChannelOption.SO_KEEPALIVE, true);
         b.option(ChannelOption.MAX_MESSAGES_PER_READ, 1);
         final long retryTimer = reconnectTime == -1 ? 0 : reconnectTime;
@@ -129,18 +105,19 @@ public final class PCCDispatcherImpl implements PCCDispatcher, AutoCloseable {
         return promise;
     }
 
-    private void setChannelFactory(final Bootstrap bootstrap, final KeyMapping keys) {
-        if (keys != null && !keys.isEmpty()) {
-            if (this.cf == null) {
-                throw new UnsupportedOperationException("No key access instance available, cannot use key mapping");
-            }
-
-            LOG.debug("Adding MD5 keys {} to boostrap {}", keys, bootstrap);
-            bootstrap.channelFactory(this.cf);
-            bootstrap.option(MD5ChannelOption.TCP_MD5SIG, keys);
+    private void setChannelFactory(final Bootstrap bootstrap, final Optional<KeyMapping> keys) {
+        if(Epoll.isAvailable()) {
+            bootstrap.channel(EpollSocketChannel.class);
         } else {
             bootstrap.channel(NioSocketChannel.class);
         }
+        if (keys.isPresent()) {
+            if (Epoll.isAvailable()) {
+                bootstrap.option(EpollChannelOption.TCP_MD5SIG, keys.get());
+            } else {
+                throw new UnsupportedOperationException(Epoll.unavailabilityCause().getCause());
+            }
+        }
     }
 
     @Override