BUG-636: Add configuration option to PCEP 45/6545/5
authorRobert Varga <rovarga@cisco.com>
Sat, 26 Apr 2014 12:27:54 +0000 (14:27 +0200)
committerRobert Varga <rovarga@cisco.com>
Tue, 29 Apr 2014 11:28:19 +0000 (13:28 +0200)
This patch adds the ability to configure a RFC2385 key on a PCEP server
session. The configuration is accepted only if the runtime supports it,
e.g. PCEPTopologyProviderModule checks for presence before ever
attempting to use it.

Change-Id: I349cdef08655ec56ba2ed413f67ab187b0a9fc0c
Signed-off-by: Robert Varga <rovarga@cisco.com>
17 files changed:
integration-tests/src/test/java/org/opendaylight/protocol/integration/PcepApiBundleTest.java
integration-tests/src/test/java/org/opendaylight/protocol/integration/PcepImplBundleTest.java
integration-tests/src/test/java/org/opendaylight/protocol/integration/PcepSpiBundleTest.java
integration-tests/src/test/java/org/opendaylight/protocol/integration/pcep/AbstractPcepOsgiTest.java
pcep/api-config/src/main/yang/pcep.yang
pcep/api/pom.xml
pcep/api/src/main/java/org/opendaylight/protocol/pcep/PCEPDispatcher.java
pcep/impl-config/pom.xml
pcep/impl-config/src/main/java/org/opendaylight/controller/config/yang/pcep/impl/PCEPDispatcherImplModule.java
pcep/impl-config/src/main/yang/odl-pcep-impl-cfg.yang
pcep/impl/pom.xml
pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/PCEPDispatcherImpl.java
pcep/pom.xml
pcep/topology-provider-config/pom.xml
pcep/topology-provider-config/src/main/java/org/opendaylight/controller/config/yang/pcep/topology/provider/PCEPTopologyProviderModule.java
pcep/topology-provider-config/src/main/yang/config-pcep-topology-provider.yang
pcep/topology-provider/src/main/java/org/opendaylight/bgpcep/pcep/topology/provider/PCEPTopologyProvider.java

index 422a69b7357fc3e64375220c5773861db0ab8ae8..7762598237877d4a50043e72cf46e69fddbd43ec 100644 (file)
@@ -14,7 +14,7 @@ import com.google.common.collect.Lists;
 public final class PcepApiBundleTest extends AbstractBundleTest {
        @Override
        protected Collection<String> prerequisiteBundles() {
-               return Lists.newArrayList("concepts", "rsvp-api", "util");
+               return Lists.newArrayList("concepts", "rsvp-api", "tcpmd5-api", "util");
        }
 
        @Override
index d431a7d8159854c85680aecc4fdf434a0c510b47..97e6a3d5d82747240b2144134272632107c34d1b 100644 (file)
@@ -16,7 +16,7 @@ public final class PcepImplBundleTest extends AbstractBundleTest {
        protected Collection<String> prerequisiteBundles() {
                return Lists.newArrayList("concepts", "pcep-api", "pcep-spi", "pcep-api-config", "pcep-ietf-stateful02", "pcep-ietf-stateful07", "pcep-topology-api",
                                "pcep-tunnel-api", "rsvp-api", "programming-api", "programming-topology-api", "topology-api", "topology-tunnel-api",
-                               "programming-tunnel-api", "util");
+                               "programming-tunnel-api", "tcpmd5-api", "tcpmd5-jni", "tcpmd5-netty", "tcpmd5-nio", "util");
        }
 
        @Override
index 39b91b4cc9172d80c2fd1875c31b8c319e8ec06e..e70793f1569d5341c0c3c4c57f0fae980600342c 100644 (file)
@@ -14,7 +14,7 @@ import com.google.common.collect.Lists;
 public final class PcepSpiBundleTest extends AbstractBundleTest {
        @Override
        protected Collection<String> prerequisiteBundles() {
-               return Lists.newArrayList("concepts", "pcep-api", "rsvp-api", "util");
+               return Lists.newArrayList("concepts", "pcep-api", "rsvp-api", "tcpmd5-api", "util");
        }
 
        @Override
index 02cd00bc6b9a4042a5b706cc2d7d12039516f0b1..69ca438bcb9c8c430a3e2edf12af63e47f0af00f 100644 (file)
@@ -75,6 +75,10 @@ public class AbstractPcepOsgiTest {
                                mavenBundle("org.opendaylight.bgpcep", "pcep-spi").versionAsInProject(), //
                                mavenBundle("org.opendaylight.bgpcep", "pcep-ietf-stateful02").versionAsInProject(), //
                                mavenBundle("org.opendaylight.bgpcep", "pcep-ietf-stateful07").versionAsInProject(), //
+                               mavenBundle("org.opendaylight.bgpcep", "tcpmd5-api").versionAsInProject(), //
+                               mavenBundle("org.opendaylight.bgpcep", "tcpmd5-jni").versionAsInProject(), //
+                               mavenBundle("org.opendaylight.bgpcep", "tcpmd5-netty").versionAsInProject(), //
+                               mavenBundle("org.opendaylight.bgpcep", "tcpmd5-nio").versionAsInProject(), //
                                mavenBundle("org.opendaylight.bgpcep", "topology-api").versionAsInProject(), //
                                mavenBundle("org.opendaylight.bgpcep", "topology-tunnel-api").versionAsInProject(), //
                                mavenBundle("org.opendaylight.bgpcep", "programming-topology-api").versionAsInProject(), //
index 67cf117ad39c3758352fd172933483ca03647dd1..c7397605cdcab0e26ee350be6e3665810644809b 100644 (file)
@@ -43,6 +43,5 @@ module pcep {
         base "config:service-type";
         config:java-class "org.opendaylight.protocol.pcep.PCEPSessionProposalFactory";
     }
-
 }
 
index fded5ea2d7cbeb3b9fb0aca2d451f6bc5867a259..5eb597f672716508918a12ba5d52df2b2f3533dc 100644 (file)
             <groupId>${project.groupId}</groupId>
             <artifactId>rsvp-api</artifactId>
         </dependency>
+        <dependency>
+            <groupId>${project.groupId}</groupId>
+            <artifactId>tcpmd5-api</artifactId>
+        </dependency>
         <dependency>
             <groupId>io.netty</groupId>
             <artifactId>netty-transport</artifactId>
index ca9fb73c08d17f7b5914bf1bcbf541e2cb91be51..ac7ce0a2a233b914bcf9730fb43960243cee1a0f 100644 (file)
@@ -11,6 +11,7 @@ import io.netty.channel.ChannelFuture;
 
 import java.net.InetSocketAddress;
 
+import org.opendaylight.bgpcep.tcpmd5.KeyMapping;
 import org.opendaylight.protocol.framework.SessionListenerFactory;
 
 /**
@@ -19,10 +20,20 @@ import org.opendaylight.protocol.framework.SessionListenerFactory;
 public interface PCEPDispatcher {
        /**
         * Creates server. Each server needs three factories to pass their instances to client sessions.
-        * 
+        *
         * @param address to be bound with the server
         * @param listenerFactory to create listeners for clients
         * @return instance of PCEPServer
         */
        ChannelFuture createServer(InetSocketAddress address, SessionListenerFactory<PCEPSessionListener> listenerFactory);
+
+       /**
+        * Creates server. Each server needs three factories to pass their instances to client sessions.
+        *
+        * @param address to be bound with the server
+        * @param keys RFC2385 key mapping
+        * @param listenerFactory to create listeners for clients
+        * @return instance of PCEPServer
+        */
+       ChannelFuture createServer(InetSocketAddress address, KeyMapping keys, SessionListenerFactory<PCEPSessionListener> listenerFactory);
 }
index 909f2baff7be776466486f7aba51ce25c44167bc..3804ac9b3309ed2144ad729851f34d5120b6b3cc 100644 (file)
             <groupId>${project.groupId}</groupId>
             <artifactId>pcep-ietf-stateful02</artifactId>
         </dependency>
+        <dependency>
+            <groupId>${project.groupId}</groupId>
+            <artifactId>tcpmd5-netty-cfg</artifactId>
+        </dependency>
 
         <!--test dependencies -->
         <dependency>
index 848af3461c3b7f3bba7e4b65157f3c3ff09f95d8..7cb0ca707f116bb6a753d21ea75e19c263499018 100644 (file)
@@ -62,7 +62,8 @@ org.opendaylight.controller.config.yang.pcep.impl.AbstractPCEPDispatcherImplModu
 
                final PCEPDispatcherImpl instance = new PCEPDispatcherImpl(
                                getPcepExtensionsDependency().getMessageHandlerRegistry(),
-                               negFactory, getBossGroupDependency(), getWorkerGroupDependency());
+                               negFactory, getBossGroupDependency(), getWorkerGroupDependency(),
+                               getMd5ChannelFactoryDependency(), getMd5ServerChannelFactoryDependency());
                return instance;
        }
 }
index 0de2c539d5c7242beb468a849b130c64cd5e8fdc..a38c56aae6a5a81d919220b3479759a6bb470018 100644 (file)
@@ -8,6 +8,7 @@ module odl-pcep-impl-cfg {
     import pcep { prefix pcep; revision-date 2013-04-09; }
     import config-pcep-spi { prefix spi; revision-date 2013-11-15; }
     import netty { prefix netty; revision-date 2013-11-19; }
+    import odl-tcpmd5-netty-cfg { prefix tcpmd5; revision-date 2014-04-27; }
 
     organization "Cisco Systems, Inc.";
 
@@ -49,7 +50,7 @@ module odl-pcep-impl-cfg {
     identity pcep-parser-ietf-stateful07 {
         base config:module-type;
         config:provided-service spi:extension;
-       config:java-name-prefix IetfStateful07PCEPParser;
+        config:java-name-prefix IetfStateful07PCEPParser;
     }
 
     augment "/config:modules/config:module/config:configuration" {
@@ -58,8 +59,8 @@ module odl-pcep-impl-cfg {
         }
     }
 
-       identity pcep-parser-ietf-initiated00 {
-               base config:module-type;
+    identity pcep-parser-ietf-initiated00 {
+        base config:module-type;
         config:provided-service spi:extension;
         config:java-name-prefix IetfInitiated00PCEPParser;
     }
@@ -67,7 +68,7 @@ module odl-pcep-impl-cfg {
     augment "/config:modules/config:module/config:configuration" {
         case pcep-parser-ietf-initiated00 {
             when "/config:modules/config:module/config:type = 'pcep-parser-ietf-initiated00'";
-           }
+        }
     }
 
     identity pcep-parser-ietf-stateful02 {
@@ -82,8 +83,8 @@ module odl-pcep-impl-cfg {
         }
     }
 
-       identity pcep-parser-crabbe-initiated00 {
-               base config:module-type;
+    identity pcep-parser-crabbe-initiated00 {
+        base config:module-type;
         config:provided-service spi:extension;
         config:java-name-prefix CrabbeInitiated00PCEPParser;
     }
@@ -153,6 +154,24 @@ module odl-pcep-impl-cfg {
                     }
                 }
             }
+
+            container md5-channel-factory {
+                uses config:service-ref {
+                    refine type {
+                        mandatory false;
+                        config:required-identity tcpmd5:md5-channel-factory;
+                    }
+                }
+            }
+
+            container md5-server-channel-factory {
+                uses config:service-ref {
+                    refine type {
+                        mandatory false;
+                        config:required-identity tcpmd5:md5-server-channel-factory;
+                    }
+                }
+            }
         }
     }
 
index 70243cf9f806bb8b444bc8cfaf4223fcaadd3e61..4e2e512d2f29bcccc43becc41f1446e01718b51a 100644 (file)
             <groupId>${project.groupId}</groupId>
             <artifactId>util</artifactId>
         </dependency>
+        <dependency>
+            <groupId>${project.groupId}</groupId>
+            <artifactId>tcpmd5-netty</artifactId>
+        </dependency>
 
         <dependency>
             <groupId>org.opendaylight.controller</groupId>
index fec0f2168fc87614b403b48d13e07d553a26370e..37cbadf135fcbffa9d56e8635fa4ffacab86cbed 100644 (file)
@@ -7,6 +7,8 @@
  */
 package org.opendaylight.protocol.pcep.impl;
 
+import io.netty.bootstrap.Bootstrap;
+import io.netty.bootstrap.ServerBootstrap;
 import io.netty.channel.ChannelFuture;
 import io.netty.channel.EventLoopGroup;
 import io.netty.channel.socket.SocketChannel;
@@ -14,6 +16,10 @@ import io.netty.util.concurrent.Promise;
 
 import java.net.InetSocketAddress;
 
+import org.opendaylight.bgpcep.tcpmd5.KeyMapping;
+import org.opendaylight.bgpcep.tcpmd5.netty.MD5ChannelFactory;
+import org.opendaylight.bgpcep.tcpmd5.netty.MD5ChannelOption;
+import org.opendaylight.bgpcep.tcpmd5.netty.MD5ServerChannelFactory;
 import org.opendaylight.protocol.framework.AbstractDispatcher;
 import org.opendaylight.protocol.framework.SessionListenerFactory;
 import org.opendaylight.protocol.framework.SessionNegotiatorFactory;
@@ -30,22 +36,69 @@ import com.google.common.base.Preconditions;
 public class PCEPDispatcherImpl extends AbstractDispatcher<PCEPSessionImpl, PCEPSessionListener> implements PCEPDispatcher, AutoCloseable {
 
        private final SessionNegotiatorFactory<Message, PCEPSessionImpl, PCEPSessionListener> snf;
+       private final MD5ServerChannelFactory<?> scf;
+       private final MD5ChannelFactory<?> cf;
        private final PCEPHandlerFactory hf;
+       private KeyMapping keys;
 
        /**
         * Creates an instance of PCEPDispatcherImpl, gets the default selector and opens it.
         */
        public PCEPDispatcherImpl(final MessageRegistry registry,
-                       final SessionNegotiatorFactory<Message, PCEPSessionImpl, PCEPSessionListener> negotiatorFactory, EventLoopGroup bossGroup,
-                       EventLoopGroup workerGroup) {
+                       final SessionNegotiatorFactory<Message, PCEPSessionImpl, PCEPSessionListener> negotiatorFactory, final EventLoopGroup bossGroup,
+                       final EventLoopGroup workerGroup) {
+               this(registry, negotiatorFactory, bossGroup, workerGroup, null, null);
+       }
+
+       /**
+        * Creates an instance of PCEPDispatcherImpl, gets the default selector and opens it.
+        */
+       public PCEPDispatcherImpl(final MessageRegistry registry,
+                       final SessionNegotiatorFactory<Message, PCEPSessionImpl, PCEPSessionListener> negotiatorFactory, final EventLoopGroup bossGroup,
+                       final EventLoopGroup workerGroup, final MD5ChannelFactory<?> cf, final MD5ServerChannelFactory<?> scf) {
                super(bossGroup, workerGroup);
+               this.cf = cf;
+               this.scf = scf;
                this.snf = Preconditions.checkNotNull(negotiatorFactory);
                this.hf = new PCEPHandlerFactory(registry);
        }
 
        @Override
-       public ChannelFuture createServer(final InetSocketAddress address, final SessionListenerFactory<PCEPSessionListener> listenerFactory) {
-               return super.createServer(address, new PipelineInitializer<PCEPSessionImpl>() {
+       public synchronized ChannelFuture createServer(final InetSocketAddress address, final SessionListenerFactory<PCEPSessionListener> listenerFactory) {
+               return createServer(address, null, listenerFactory);
+       }
+
+       @Override
+       public void close() {
+       }
+
+       @Override
+       protected void customizeBootstrap(final Bootstrap b) {
+               if (keys != null && !keys.isEmpty()) {
+                       if (cf == null) {
+                               throw new UnsupportedOperationException("No key access instance available, cannot use key mapping");
+                       }
+                       b.channelFactory(cf);
+                       b.option(MD5ChannelOption.TCP_MD5SIG, keys);
+               }
+       }
+
+       @Override
+       protected void customizeBootstrap(final ServerBootstrap b) {
+               if (keys != null && !keys.isEmpty()) {
+                       if (scf == null) {
+                               throw new UnsupportedOperationException("No key access instance available, cannot use key mapping");
+                       }
+                       b.channelFactory(scf);
+                       b.option(MD5ChannelOption.TCP_MD5SIG, keys);
+               }
+       }
+
+       @Override
+       public synchronized ChannelFuture createServer(final InetSocketAddress address, final KeyMapping keys,
+                       final SessionListenerFactory<PCEPSessionListener> listenerFactory) {
+               this.keys = keys;
+               ChannelFuture ret = super.createServer(address, new PipelineInitializer<PCEPSessionImpl>() {
                        @Override
                        public void initializeChannel(final SocketChannel ch, final Promise<PCEPSessionImpl> promise) {
                                ch.pipeline().addLast(PCEPDispatcherImpl.this.hf.getDecoders());
@@ -53,9 +106,8 @@ public class PCEPDispatcherImpl extends AbstractDispatcher<PCEPSessionImpl, PCEP
                                ch.pipeline().addLast(PCEPDispatcherImpl.this.hf.getEncoders());
                        }
                });
-       }
 
-       @Override
-       public void close() {
+               this.keys = null;
+               return ret;
        }
 }
index 028e51caef5b174ec66f86a589127d44501ccacb..3f02262cbc06c7be6d20938922833b16507429e9 100644 (file)
                 <artifactId>topology-tunnel-api</artifactId>
                 <version>${project.version}</version>
             </dependency>
+            <dependency>
+                <groupId>${project.groupId}</groupId>
+                <artifactId>tcpmd5-api</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>${project.groupId}</groupId>
+                <artifactId>tcpmd5-api-cfg</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>${project.groupId}</groupId>
+                <artifactId>tcpmd5-netty</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>${project.groupId}</groupId>
+                <artifactId>tcpmd5-netty-cfg</artifactId>
+                <version>${project.version}</version>
+            </dependency>
 
         </dependencies>
     </dependencyManagement>
index b6bba586f9410c4e340255007c59b017dfcc16c9..db5f11249136ee4edfd28766f7d4cd903e88eb93 100644 (file)
             <groupId>${project.groupId}</groupId>
             <artifactId>pcep-api-config</artifactId>
         </dependency>
+        <dependency>
+            <groupId>${project.groupId}</groupId>
+            <artifactId>pcep-impl-config</artifactId>
+        </dependency>
         <dependency>
             <groupId>${project.groupId}</groupId>
             <artifactId>programming-spi-config</artifactId>
             <groupId>${project.groupId}</groupId>
             <artifactId>topology-api-config</artifactId>
         </dependency>
+        <dependency>
+            <groupId>${project.groupId}</groupId>
+            <artifactId>tcpmd5-api-cfg</artifactId>
+        </dependency>
         <dependency>
             <groupId>org.opendaylight.controller</groupId>
             <artifactId>sal-binding-config</artifactId>
@@ -64,6 +72,7 @@
             <groupId>org.opendaylight.yangtools.model</groupId>
             <artifactId>ietf-inet-types</artifactId>
         </dependency>
+
         <!--test dependencies -->
         <dependency>
             <groupId>junit</groupId>
index 44f5cf6faaeebea7463cf75c97b4ff67716d76e6..ada3e3391c1b8b3fadc1d463736e519ed9b4368a 100644 (file)
  */
 package org.opendaylight.controller.config.yang.pcep.topology.provider;
 
+import java.lang.management.ManagementFactory;
 import java.net.InetAddress;
 import java.net.InetSocketAddress;
 import java.util.concurrent.ExecutionException;
 
+import javax.management.AttributeNotFoundException;
+import javax.management.InstanceNotFoundException;
+import javax.management.MBeanException;
+import javax.management.MBeanServer;
+import javax.management.ReflectionException;
+
 import org.opendaylight.bgpcep.pcep.topology.provider.PCEPTopologyProvider;
+import org.opendaylight.bgpcep.tcpmd5.KeyMapping;
 import org.opendaylight.controller.config.api.JmxAttributeValidationException;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpAddress;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology;
@@ -30,13 +38,14 @@ import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import com.google.common.base.Charsets;
 import com.google.common.net.InetAddresses;
 
 /**
  *
  */
 public final class PCEPTopologyProviderModule extends
-               org.opendaylight.controller.config.yang.pcep.topology.provider.AbstractPCEPTopologyProviderModule {
+org.opendaylight.controller.config.yang.pcep.topology.provider.AbstractPCEPTopologyProviderModule {
        private static final Logger LOG = LoggerFactory.getLogger(PCEPTopologyProviderModule.class);
 
        public PCEPTopologyProviderModule(final org.opendaylight.controller.config.api.ModuleIdentifier identifier,
@@ -51,12 +60,31 @@ public final class PCEPTopologyProviderModule extends
        }
 
        @Override
-       public void validate() {
-               super.validate();
+       public void customValidation() {
                JmxAttributeValidationException.checkNotNull(getTopologyId(), "is not set.", this.topologyIdJmxAttribute);
                JmxAttributeValidationException.checkNotNull(getListenAddress(), "is not set.", this.listenAddressJmxAttribute);
                JmxAttributeValidationException.checkNotNull(getListenPort(), "is not set.", this.listenPortJmxAttribute);
                JmxAttributeValidationException.checkNotNull(getStatefulPlugin(), "is not set.", this.statefulPluginJmxAttribute);
+               if (getPassword() != null) {
+                       /*
+                        *  This is a nasty hack, but we don't have another clean solution. We cannot allow
+                        *  password being set if the injected dispatcher does not have the optional
+                        *  md5-server-channel-factory set.
+                        *
+                        *  FIXME: this is a use case for Module interfaces, e.g. PCEPDispatcherImplModule
+                        *         should something like isMd5ServerSupported()
+                        */
+                       final MBeanServer srv = ManagementFactory.getPlatformMBeanServer();
+                       Object scf;
+                       try {
+                               // FIXME: AbstractPCEPDispatcherImplModule.md5ServerChannelFactoryJmxAttribute.getAttributeName()
+                               scf = srv.getAttribute(getDispatcher(), "Md5ServerChannelFactory");
+                               JmxAttributeValidationException.checkCondition(scf != null, "Underlying dispatcher does not support MD5 server", this.passwordJmxAttribute);
+                       } catch (AttributeNotFoundException | InstanceNotFoundException
+                                       | MBeanException | ReflectionException e) {
+                               JmxAttributeValidationException.wrap(e, passwordJmxAttribute);
+                       }
+               }
        }
 
        private InetAddress listenAddress() {
@@ -75,8 +103,17 @@ public final class PCEPTopologyProviderModule extends
                final InstanceIdentifier<Topology> topology = InstanceIdentifier.builder(NetworkTopology.class).child(Topology.class,
                                new TopologyKey(getTopologyId())).toInstance();
                final InetSocketAddress address = new InetSocketAddress(listenAddress(), getListenPort().getValue());
+
+               final KeyMapping keys;
+               if (getPassword() != null) {
+                       keys = new KeyMapping();
+                       keys.put(InetAddresses.forString("0.0.0.0"), getPassword().getValue().getBytes(Charsets.UTF_8));
+               } else {
+                       keys = null;
+               }
+
                try {
-                       return PCEPTopologyProvider.create(getDispatcherDependency(), address, getSchedulerDependency(), getDataProviderDependency(),
+                       return PCEPTopologyProvider.create(getDispatcherDependency(), address, keys, getSchedulerDependency(), getDataProviderDependency(),
                                        getRpcRegistryDependency(), topology, getStatefulPluginDependency());
                } catch (InterruptedException | ExecutionException e) {
                        LOG.error("Failed to instantiate topology provider at {}", address, e);
index e68256f3188485304a5dbf161befd31761963168..29cc34a9c70343e2359ab0c9310e5c5d0f88506e 100644 (file)
@@ -11,6 +11,7 @@ module config-pcep-topology-provider {
     import network-topology { prefix nt; revision-date 2013-10-21; }
     import pcep { prefix pcep; revision-date 2013-04-09; }
     import opendaylight-md-sal-binding { prefix mdsal; revision-date 2013-10-28; }
+    import odl-tcpmd5-cfg { prefix tcpmd5; revision-date 2014-04-27; }
 
     organization "Cisco Systems, Inc.";
 
@@ -143,6 +144,11 @@ module config-pcep-topology-provider {
                 type inet:port-number;
                 default 4189;
             }
+
+            leaf password {
+                type tcpmd5:rfc2385-key;
+                description "RFC2385 shared secret";
+            }
         }
     }
 }
index 6c063171d2547075b97da557de6b8e7d1f9f91de..09ca79a448de5422cebaf6c70280356458ed2f7d 100644 (file)
@@ -15,6 +15,7 @@ import java.net.InetSocketAddress;
 import java.util.concurrent.ExecutionException;
 
 import org.opendaylight.bgpcep.programming.spi.InstructionScheduler;
+import org.opendaylight.bgpcep.tcpmd5.KeyMapping;
 import org.opendaylight.bgpcep.topology.DefaultTopologyReference;
 import org.opendaylight.controller.sal.binding.api.BindingAwareBroker;
 import org.opendaylight.controller.sal.binding.api.RpcProviderRegistry;
@@ -50,6 +51,7 @@ public final class PCEPTopologyProvider extends DefaultTopologyReference impleme
        }
 
        public static PCEPTopologyProvider create(final PCEPDispatcher dispatcher, final InetSocketAddress address,
+                       final KeyMapping keys,
                        final InstructionScheduler scheduler, final DataProviderService dataService, final RpcProviderRegistry rpcRegistry,
                        final InstanceIdentifier<Topology> topology, final TopologySessionListenerFactory listenerFactory)
                                        throws InterruptedException, ExecutionException {