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>
*/
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;
+ }
}
<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 -->
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;
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;
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;
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);
}
}
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();
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 {
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;
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;
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
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;
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