[ONOS-5989] YANG based L3VPN: Provide the skeleton structure with L3SM model
Change-Id: Ib72b92cef6b3f62f35eef6e10a811308f7b43b3f
diff --git a/apps/l3vpn/BUCK b/apps/l3vpn/BUCK
new file mode 100644
index 0000000..1c6d6ef
--- /dev/null
+++ b/apps/l3vpn/BUCK
@@ -0,0 +1,19 @@
+APPS = [
+ 'org.onosproject.yang',
+]
+
+BUNDLES = [
+ '//apps/l3vpn/netl3vpn:onos-apps-l3vpn-netl3vpn',
+ '//apps/l3vpn/yangmodel:onos-apps-l3vpn-yangmodel',
+]
+
+onos_app(
+ app_name = 'org.onosproject.l3vpn',
+ title = 'YANG L3VPN App',
+ category = 'L3VPN APP',
+ url = 'http://onosproject.org',
+ included_bundles = BUNDLES,
+ description = 'L3VPN YANG Application',
+ required_apps = APPS,
+)
+
diff --git a/apps/l3vpn/netl3vpn/BUCK b/apps/l3vpn/netl3vpn/BUCK
new file mode 100644
index 0000000..47b8c9a
--- /dev/null
+++ b/apps/l3vpn/netl3vpn/BUCK
@@ -0,0 +1,16 @@
+COMPILE_DEPS = [
+ '//lib:CORE_DEPS',
+ '//apps/l3vpn/yangmodel:onos-apps-l3vpn-yangmodel',
+ '//lib:onos-yang-model',
+ '//lib:onos-yang-runtime',
+]
+
+TEST_DEPS = [
+ '//lib:TEST_ADAPTERS',
+ '//utils/osgi:onlab-osgi-tests',
+]
+
+osgi_jar_with_tests(
+ deps = COMPILE_DEPS,
+ test_deps = TEST_DEPS,
+)
diff --git a/apps/l3vpn/netl3vpn/pom.xml b/apps/l3vpn/netl3vpn/pom.xml
new file mode 100644
index 0000000..2ce1d09
--- /dev/null
+++ b/apps/l3vpn/netl3vpn/pom.xml
@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright 2017-present Open Networking Laboratory
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.onosproject</groupId>
+ <artifactId>onos-app-l3vpn</artifactId>
+ <version>1.10.0-SNAPSHOT</version>
+ <relativePath>../pom.xml</relativePath>
+ </parent>
+
+ <artifactId>onos-app-l3vpn-netl3vpn</artifactId>
+ <packaging>bundle</packaging>
+
+ <description>IETF L3VPN Service Model</description>
+
+ <properties>
+ <yang-tool-version>1.12.0-b5</yang-tool-version>
+ </properties>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.onosproject</groupId>
+ <artifactId>onlab-junit</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.onosproject</groupId>
+ <artifactId>onos-yang-model</artifactId>
+ <version>${yang-tool-version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.onosproject</groupId>
+ <artifactId>onos-yang-runtime</artifactId>
+ <version>${yang-tool-version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.onosproject</groupId>
+ <artifactId>onos-app-l3vpn-yangmodel</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ </dependencies>
+</project>
diff --git a/apps/l3vpn/netl3vpn/src/main/java/org/onosproject/l3vpn/netl3vpn/NetL3vpnManager.java b/apps/l3vpn/netl3vpn/src/main/java/org/onosproject/l3vpn/netl3vpn/NetL3vpnManager.java
new file mode 100644
index 0000000..2535173
--- /dev/null
+++ b/apps/l3vpn/netl3vpn/src/main/java/org/onosproject/l3vpn/netl3vpn/NetL3vpnManager.java
@@ -0,0 +1,106 @@
+/*
+ * Copyright 2017-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.l3vpn.netl3vpn;
+
+import org.apache.felix.scr.annotations.Activate;
+import org.apache.felix.scr.annotations.Component;
+import org.apache.felix.scr.annotations.Deactivate;
+import org.apache.felix.scr.annotations.Reference;
+import org.apache.felix.scr.annotations.ReferenceCardinality;
+import org.onosproject.core.CoreService;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev20130715.IetfInetTypes;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.l3vpn.svc.rev20160730.IetfL3VpnSvc;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev20130715.IetfYangTypes;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.l3vpn.svc.ext.rev20160730.L3VpnSvcExt;
+import org.onosproject.yang.model.YangModel;
+import org.onosproject.yang.model.YangModuleId;
+import org.onosproject.yang.runtime.DefaultAppModuleInfo;
+import org.onosproject.yang.runtime.DefaultModelRegistrationParam;
+import org.onosproject.yang.runtime.ModelRegistrationParam;
+import org.onosproject.yang.runtime.YangModelRegistry;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.Iterator;
+
+import static org.onosproject.yang.runtime.helperutils.YangApacheUtils.getYangModel;
+
+/**
+ * The IETF net l3vpn manager implementation.
+ */
+@Component(immediate = true)
+public class NetL3vpnManager {
+
+ private static final String APP_ID = "org.onosproject.app.l3vpn";
+ private final Logger log = LoggerFactory.getLogger(getClass());
+
+ @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+ protected CoreService coreService;
+
+ @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+ protected YangModelRegistry modelRegistry;
+
+ private ModelRegistrationParam regParam = null;
+
+ @Activate
+ protected void activate() {
+ coreService.registerApplication(APP_ID);
+ log.info("Started");
+ //TODO implementation
+ }
+
+ @Deactivate
+ protected void deactivate() {
+ modelRegistry.unregisterModel(regParam);
+ log.info("Stopped");
+ }
+
+ private void registerModel() {
+ YangModel model = getYangModel(getClass());
+ Iterator<YangModuleId> it = model.getYangModulesId().iterator();
+
+ //Create model registration param.
+ ModelRegistrationParam.Builder b =
+ DefaultModelRegistrationParam.builder().setYangModel(model);
+
+ YangModuleId id;
+ while (it.hasNext()) {
+ id = it.next();
+ switch (id.moduleName()) {
+ case "ietf-inet-types":
+ b.addAppModuleInfo(id, new DefaultAppModuleInfo(
+ IetfInetTypes.class, null));
+ break;
+ case "ietf-l3vpn-svc":
+ b.addAppModuleInfo(id, new DefaultAppModuleInfo(
+ IetfL3VpnSvc.class, null));
+ break;
+ case "ietf-yang-types":
+ b.addAppModuleInfo(id, new DefaultAppModuleInfo(
+ IetfYangTypes.class, null));
+ break;
+ case "l3vpn-svc-ext":
+ b.addAppModuleInfo(id, new DefaultAppModuleInfo(
+ L3VpnSvcExt.class, null));
+ break;
+ default:
+ break;
+ }
+ }
+ regParam = b.build();
+ modelRegistry.registerModel(regParam);
+ }
+}
diff --git a/apps/l3vpn/netl3vpn/src/main/java/org/onosproject/l3vpn/netl3vpn/package-info.java b/apps/l3vpn/netl3vpn/src/main/java/org/onosproject/l3vpn/netl3vpn/package-info.java
new file mode 100644
index 0000000..de5783a
--- /dev/null
+++ b/apps/l3vpn/netl3vpn/src/main/java/org/onosproject/l3vpn/netl3vpn/package-info.java
@@ -0,0 +1,20 @@
+/*
+ * Copyright 2017-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * The implementations of IETF l3vpn net YANG.
+ */
+package org.onosproject.l3vpn.netl3vpn;
diff --git a/apps/l3vpn/pom.xml b/apps/l3vpn/pom.xml
new file mode 100644
index 0000000..faa3170
--- /dev/null
+++ b/apps/l3vpn/pom.xml
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright 2017-present Open Networking Laboratory
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.onosproject</groupId>
+ <artifactId>onos-apps</artifactId>
+ <version>1.10.0-SNAPSHOT</version>
+ <relativePath>../pom.xml</relativePath>
+ </parent>
+
+ <artifactId>onos-app-l3vpn</artifactId>
+ <packaging>pom</packaging>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.onosproject</groupId>
+ <artifactId>onos-yang-model</artifactId>
+ <version>1.12.0-b5</version>
+ </dependency>
+ </dependencies>
+
+ <modules>
+ <module>netl3vpn</module>
+ <module>yangmodel</module>
+ </modules>
+
+ <description>L3VPN YANG Application</description>
+</project>
+
diff --git a/apps/l3vpn/yangmodel/BUCK b/apps/l3vpn/yangmodel/BUCK
new file mode 100644
index 0000000..386be7b
--- /dev/null
+++ b/apps/l3vpn/yangmodel/BUCK
@@ -0,0 +1,13 @@
+COMPILE_DEPS = [
+ '//lib:CORE_DEPS',
+ '//lib:onos-yang-model',
+]
+
+yang_osgi_jar(
+ deps = COMPILE_DEPS,
+ name = 'onos-apps-l3vpn-yangmodel',
+ srcs = glob(['src/main/**/*.yang']),
+ visibility = [
+ 'PUBLIC'
+ ],
+)
\ No newline at end of file
diff --git a/apps/l3vpn/yangmodel/pom.xml b/apps/l3vpn/yangmodel/pom.xml
new file mode 100644
index 0000000..a2bfbd22
--- /dev/null
+++ b/apps/l3vpn/yangmodel/pom.xml
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright 2017-present Open Networking Laboratory
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.onosproject</groupId>
+ <artifactId>onos-app-l3vpn</artifactId>
+ <version>1.10.0-SNAPSHOT</version>
+ <relativePath>../pom.xml</relativePath>
+ </parent>
+
+ <artifactId>onos-app-l3vpn-yangmodel</artifactId>
+ <packaging>bundle</packaging>
+
+ <description>IETF L3VPN YANG models</description>
+
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.onosproject</groupId>
+ <artifactId>onos-yang-maven-plugin</artifactId>
+ <version>1.11</version>
+ <executions>
+ <execution>
+ <goals>
+ <goal>yang2java</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
+ <!-- Fix maven plugin version together with fix for buck -->
+</project>
diff --git a/apps/l3vpn/yangmodel/src/main/yang/ietf-inet-types.yang b/apps/l3vpn/yangmodel/src/main/yang/ietf-inet-types.yang
new file mode 100755
index 0000000..51a44a3
--- /dev/null
+++ b/apps/l3vpn/yangmodel/src/main/yang/ietf-inet-types.yang
@@ -0,0 +1,454 @@
+ module ietf-inet-types {
+
+ yang-version 1;
+
+ namespace
+ "urn:ietf:params:xml:ns:yang:ietf-inet-types";
+
+ prefix inet;
+
+ organization
+ "IETF NETMOD (NETCONF Data Modeling Language) Working Group";
+
+ contact
+ "WG Web: <http://tools.ietf.org/wg/netmod/>
+ WG List: <mailto:netmod@ietf.org>
+
+ WG Chair: David Kessens
+ <mailto:david.kessens@nsn.com>
+
+ WG Chair: Juergen Schoenwaelder
+ <mailto:j.schoenwaelder@jacobs-university.de>
+
+ Editor: Juergen Schoenwaelder
+ <mailto:j.schoenwaelder@jacobs-university.de>";
+
+ description
+ "This module contains a collection of generally useful derived
+ YANG data types for Internet addresses and related things.
+
+ Copyright (c) 2013 IETF Trust and the persons identified as
+ authors of the code. All rights reserved.
+
+ Redistribution and use in source and binary forms, with or
+ without modification, is permitted pursuant to, and subject
+ to the license terms contained in, the Simplified BSD License
+ set forth in Section 4.c of the IETF Trust's Legal Provisions
+ Relating to IETF Documents
+ (http://trustee.ietf.org/license-info).
+
+ This version of this YANG module is part of RFC 6991; see
+ the RFC itself for full legal notices.";
+
+ revision "2013-07-15" {
+ description
+ "This revision adds the following new data types:
+ - ip-address-no-zone
+ - ipv4-address-no-zone
+ - ipv6-address-no-zone";
+ reference
+ "RFC 6991: Common YANG Data Types";
+
+ }
+
+ revision "2010-09-24" {
+ description "Initial revision.";
+ reference
+ "RFC 6021: Common YANG Data Types";
+
+ }
+
+
+ typedef ip-version {
+ type enumeration {
+ enum "unknown" {
+ value 0;
+ description
+ "An unknown or unspecified version of the Internet
+ protocol.";
+ }
+ enum "ipv4" {
+ value 1;
+ description
+ "The IPv4 protocol as defined in RFC 791.";
+ }
+ enum "ipv6" {
+ value 2;
+ description
+ "The IPv6 protocol as defined in RFC 2460.";
+ }
+ }
+ description
+ "This value represents the version of the IP protocol.
+
+ In the value set and its semantics, this type is equivalent
+ to the InetVersion textual convention of the SMIv2.";
+ reference
+ "RFC 791: Internet Protocol
+ RFC 2460: Internet Protocol, Version 6 (IPv6) Specification
+ RFC 4001: Textual Conventions for Internet Network Addresses";
+
+ }
+
+ typedef dscp {
+ type uint8 {
+ range "0..63";
+ }
+ description
+ "The dscp type represents a Differentiated Services Code Point
+ that may be used for marking packets in a traffic stream.
+ In the value set and its semantics, this type is equivalent
+ to the Dscp textual convention of the SMIv2.";
+ reference
+ "RFC 3289: Management Information Base for the Differentiated
+ Services Architecture
+ RFC 2474: Definition of the Differentiated Services Field
+ (DS Field) in the IPv4 and IPv6 Headers
+ RFC 2780: IANA Allocation Guidelines For Values In
+ the Internet Protocol and Related Headers";
+
+ }
+
+ typedef ipv6-flow-label {
+ type uint32 {
+ range "0..1048575";
+ }
+ description
+ "The ipv6-flow-label type represents the flow identifier or Flow
+ Label in an IPv6 packet header that may be used to
+ discriminate traffic flows.
+
+ In the value set and its semantics, this type is equivalent
+ to the IPv6FlowLabel textual convention of the SMIv2.";
+ reference
+ "RFC 3595: Textual Conventions for IPv6 Flow Label
+ RFC 2460: Internet Protocol, Version 6 (IPv6) Specification";
+
+ }
+
+ typedef port-number {
+ type uint16 {
+ range "0..65535";
+ }
+ description
+ "The port-number type represents a 16-bit port number of an
+ Internet transport-layer protocol such as UDP, TCP, DCCP, or
+ SCTP. Port numbers are assigned by IANA. A current list of
+ all assignments is available from <http://www.iana.org/>.
+
+ Note that the port number value zero is reserved by IANA. In
+ situations where the value zero does not make sense, it can
+ be excluded by subtyping the port-number type.
+ In the value set and its semantics, this type is equivalent
+ to the InetPortNumber textual convention of the SMIv2.";
+ reference
+ "RFC 768: User Datagram Protocol
+ RFC 793: Transmission Control Protocol
+ RFC 4960: Stream Control Transmission Protocol
+ RFC 4340: Datagram Congestion Control Protocol (DCCP)
+ RFC 4001: Textual Conventions for Internet Network Addresses";
+
+ }
+
+ typedef as-number {
+ type uint32;
+ description
+ "The as-number type represents autonomous system numbers
+ which identify an Autonomous System (AS). An AS is a set
+ of routers under a single technical administration, using
+ an interior gateway protocol and common metrics to route
+ packets within the AS, and using an exterior gateway
+ protocol to route packets to other ASes. IANA maintains
+ the AS number space and has delegated large parts to the
+ regional registries.
+
+ Autonomous system numbers were originally limited to 16
+ bits. BGP extensions have enlarged the autonomous system
+ number space to 32 bits. This type therefore uses an uint32
+ base type without a range restriction in order to support
+ a larger autonomous system number space.
+
+ In the value set and its semantics, this type is equivalent
+ to the InetAutonomousSystemNumber textual convention of
+ the SMIv2.";
+ reference
+ "RFC 1930: Guidelines for creation, selection, and registration
+ of an Autonomous System (AS)
+ RFC 4271: A Border Gateway Protocol 4 (BGP-4)
+ RFC 4001: Textual Conventions for Internet Network Addresses
+ RFC 6793: BGP Support for Four-Octet Autonomous System (AS)
+ Number Space";
+
+ }
+
+ typedef ip-address {
+ type union {
+ type ipv4-address;
+ type ipv6-address;
+ }
+ description
+ "The ip-address type represents an IP address and is IP
+ version neutral. The format of the textual representation
+ implies the IP version. This type supports scoped addresses
+ by allowing zone identifiers in the address format.";
+ reference
+ "RFC 4007: IPv6 Scoped Address Architecture";
+
+ }
+
+ typedef ipv4-address {
+ type string {
+ pattern
+ '(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(%[\p{N}\p{L}]+)?';
+ }
+ description
+ "The ipv4-address type represents an IPv4 address in
+ dotted-quad notation. The IPv4 address may include a zone
+ index, separated by a % sign.
+
+ The zone index is used to disambiguate identical address
+ values. For link-local addresses, the zone index will
+ typically be the interface index number or the name of an
+ interface. If the zone index is not present, the default
+ zone of the device will be used.
+
+ The canonical format for the zone index is the numerical
+ format";
+ }
+
+ typedef ipv6-address {
+ type string {
+ pattern
+ '((:|[0-9a-fA-F]{0,4}):)([0-9a-fA-F]{0,4}:){0,5}((([0-9a-fA-F]{0,4}:)?(:|[0-9a-fA-F]{0,4}))|(((25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])))(%[\p{N}\p{L}]+)?';
+ pattern
+ '(([^:]+:){6}(([^:]+:[^:]+)|(.*\..*)))|((([^:]+:)*[^:]+)?::(([^:]+:)*[^:]+)?)(%.+)?';
+ }
+ description
+ "The ipv6-address type represents an IPv6 address in full,
+ mixed, shortened, and shortened-mixed notation. The IPv6
+ address may include a zone index, separated by a % sign.
+
+ The zone index is used to disambiguate identical address
+ values. For link-local addresses, the zone index will
+ typically be the interface index number or the name of an
+ interface. If the zone index is not present, the default
+ zone of the device will be used.
+
+
+
+ The canonical format of IPv6 addresses uses the textual
+ representation defined in Section 4 of RFC 5952. The
+ canonical format for the zone index is the numerical
+ format as described in Section 11.2 of RFC 4007.";
+ reference
+ "RFC 4291: IP Version 6 Addressing Architecture
+ RFC 4007: IPv6 Scoped Address Architecture
+ RFC 5952: A Recommendation for IPv6 Address Text
+ Representation";
+
+ }
+
+ typedef ip-address-no-zone {
+ type union {
+ type ipv4-address-no-zone;
+ type ipv6-address-no-zone;
+ }
+ description
+ "The ip-address-no-zone type represents an IP address and is
+ IP version neutral. The format of the textual representation
+ implies the IP version. This type does not support scoped
+ addresses since it does not allow zone identifiers in the
+ address format.";
+ reference
+ "RFC 4007: IPv6 Scoped Address Architecture";
+
+ }
+
+ typedef ipv4-address-no-zone {
+ type ipv4-address {
+ pattern '[0-9\.]*';
+ }
+ description
+ "An IPv4 address without a zone index. This type, derived from
+ ipv4-address, may be used in situations where the zone is
+ known from the context and hence no zone index is needed.";
+ }
+
+ typedef ipv6-address-no-zone {
+ type ipv6-address {
+ pattern '[0-9a-fA-F:\.]*';
+ }
+ description
+ "An IPv6 address without a zone index. This type, derived from
+ ipv6-address, may be used in situations where the zone is
+ known from the context and hence no zone index is needed.";
+ reference
+ "RFC 4291: IP Version 6 Addressing Architecture
+ RFC 4007: IPv6 Scoped Address Architecture
+ RFC 5952: A Recommendation for IPv6 Address Text
+ Representation";
+
+ }
+
+ typedef ip-prefix {
+ type union {
+ type ipv4-prefix;
+ type ipv6-prefix;
+ }
+ description
+ "The ip-prefix type represents an IP prefix and is IP
+ version neutral. The format of the textual representations
+ implies the IP version.";
+ }
+
+ typedef ipv4-prefix {
+ type string {
+ pattern
+ '(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])/(([0-9])|([1-2][0-9])|(3[0-2]))';
+ }
+ description
+ "The ipv4-prefix type represents an IPv4 address prefix.
+ The prefix length is given by the number following the
+ slash character and must be less than or equal to 32.
+
+ A prefix length value of n corresponds to an IP address
+ mask that has n contiguous 1-bits from the most
+ significant bit (MSB) and all other bits set to 0.
+
+ The canonical format of an IPv4 prefix has all bits of
+ the IPv4 address set to zero that are not part of the
+ IPv4 prefix.";
+ }
+
+ typedef ipv6-prefix {
+ type string {
+ pattern
+ '((:|[0-9a-fA-F]{0,4}):)([0-9a-fA-F]{0,4}:){0,5}((([0-9a-fA-F]{0,4}:)?(:|[0-9a-fA-F]{0,4}))|(((25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])))(/(([0-9])|([0-9]{2})|(1[0-1][0-9])|(12[0-8])))';
+ pattern
+ '(([^:]+:){6}(([^:]+:[^:]+)|(.*\..*)))|((([^:]+:)*[^:]+)?::(([^:]+:)*[^:]+)?)(/.+)';
+ }
+ description
+ "The ipv6-prefix type represents an IPv6 address prefix.
+ The prefix length is given by the number following the
+ slash character and must be less than or equal to 128.
+
+ A prefix length value of n corresponds to an IP address
+ mask that has n contiguous 1-bits from the most
+ significant bit (MSB) and all other bits set to 0.
+
+ The IPv6 address should have all bits that do not belong
+ to the prefix set to zero.
+
+ The canonical format of an IPv6 prefix has all bits of
+ the IPv6 address set to zero that are not part of the
+ IPv6 prefix. Furthermore, the IPv6 address is represented
+ as defined in Section 4 of RFC 5952.";
+ reference
+ "RFC 5952: A Recommendation for IPv6 Address Text
+ Representation";
+
+ }
+
+ typedef domain-name {
+ type string {
+ length "1..253";
+ pattern
+ '((([a-zA-Z0-9_]([a-zA-Z0-9\-_]){0,61})?[a-zA-Z0-9]\.)*([a-zA-Z0-9_]([a-zA-Z0-9\-_]){0,61})?[a-zA-Z0-9]\.?)|\.';
+ }
+ description
+ "The domain-name type represents a DNS domain name. The
+ name SHOULD be fully qualified whenever possible.
+
+ Internet domain names are only loosely specified. Section
+ 3.5 of RFC 1034 recommends a syntax (modified in Section
+ 2.1 of RFC 1123). The pattern above is intended to allow
+ for current practice in domain name use, and some possible
+ future expansion. It is designed to hold various types of
+ domain names, including names used for A or AAAA records
+ (host names) and other records, such as SRV records. Note
+ that Internet host names have a stricter syntax (described
+ in RFC 952) than the DNS recommendations in RFCs 1034 and
+ 1123, and that systems that want to store host names in
+ schema nodes using the domain-name type are recommended to
+ adhere to this stricter standard to ensure interoperability.
+
+ The encoding of DNS names in the DNS protocol is limited
+ to 255 characters. Since the encoding consists of labels
+ prefixed by a length bytes and there is a trailing NULL
+ byte, only 253 characters can appear in the textual dotted
+ notation.
+
+ The description clause of schema nodes using the domain-name
+ type MUST describe when and how these names are resolved to
+ IP addresses. Note that the resolution of a domain-name value
+ may require to query multiple DNS records (e.g., A for IPv4
+ and AAAA for IPv6). The order of the resolution process and
+ which DNS record takes precedence can either be defined
+ explicitly or may depend on the configuration of the
+ resolver.
+
+ Domain-name values use the US-ASCII encoding. Their canonical
+ format uses lowercase US-ASCII characters. Internationalized
+ domain names MUST be A-labels as per RFC 5890.";
+ reference
+ "RFC 952: DoD Internet Host Table Specification
+ RFC 1034: Domain Names - Concepts and Facilities
+ RFC 1123: Requirements for Internet Hosts -- Application
+ and Support
+ RFC 2782: A DNS RR for specifying the location of services
+ (DNS SRV)
+ RFC 5890: Internationalized Domain Names in Applications
+ (IDNA): Definitions and Document Framework";
+
+ }
+
+ typedef host {
+ type union {
+ type ip-address;
+ type domain-name;
+ }
+ description
+ "The host type represents either an IP address or a DNS
+ domain name.";
+ }
+
+ typedef uri {
+ type string;
+ description
+ "The uri type represents a Uniform Resource Identifier
+ (URI) as defined by STD 66.
+
+ Objects using the uri type MUST be in US-ASCII encoding,
+ and MUST be normalized as described by RFC 3986 Sections
+ 6.2.1, 6.2.2.1, and 6.2.2.2. All unnecessary
+ percent-encoding is removed, and all case-insensitive
+ characters are set to lowercase except for hexadecimal
+ digits, which are normalized to uppercase as described in
+ Section 6.2.2.1.
+
+ The purpose of this normalization is to help provide
+ unique URIs. Note that this normalization is not
+ sufficient to provide uniqueness. Two URIs that are
+ textually distinct after this normalization may still be
+ equivalent.
+
+ Objects using the uri type may restrict the schemes that
+ they permit. For example, 'data:' and 'urn:' schemes
+ might not be appropriate.
+
+ A zero-length URI is not a valid URI. This can be used to
+ express 'URI absent' where required.
+
+ In the value set and its semantics, this type is equivalent
+ to the Uri SMIv2 textual convention defined in RFC 5017.";
+ reference
+ "RFC 3986: Uniform Resource Identifier (URI): Generic Syntax
+ RFC 3305: Report from the Joint W3C/IETF URI Planning Interest
+ Group: Uniform Resource Identifiers (URIs), URLs,
+ and Uniform Resource Names (URNs): Clarifications
+ and Recommendations
+ RFC 5017: MIB Textual Conventions for Uniform Resource
+ Identifiers (URIs)";
+
+ }
+ }
\ No newline at end of file
diff --git a/apps/l3vpn/yangmodel/src/main/yang/ietf-l3vpn-svc@2016-07-30.yang b/apps/l3vpn/yangmodel/src/main/yang/ietf-l3vpn-svc@2016-07-30.yang
new file mode 100755
index 0000000..dbd60dc
--- /dev/null
+++ b/apps/l3vpn/yangmodel/src/main/yang/ietf-l3vpn-svc@2016-07-30.yang
@@ -0,0 +1,2599 @@
+module ietf-l3vpn-svc {
+
+ namespace "urn:ietf:params:xml:ns:yang:ietf-l3vpn-svc";
+
+ prefix l3vpn-svc;
+
+ import ietf-inet-types {
+ prefix inet;
+ }
+
+ import ietf-yang-types {
+ prefix yang;
+ }
+
+ organization
+ "IETF L3SM Working Group";
+
+ contact
+ "WG List: <mailto:l3sm@ietf.org>
+
+ Editor:
+
+ ";
+
+ description
+ "The YANG module defines a generic service configuration
+ model for Layer 3 VPN common across all of the vendor
+ implementations.";
+
+ revision 2016-07-30 {
+ description
+ "Eliminated warnings";
+ reference
+ "draft-ietf-l3sm-l3vpn-service-yang-11";
+ }
+
+ revision 2016-07-05 {
+ description
+ "Draft text update";
+ reference
+ "draft-ietf-l3sm-l3vpn-service-yang-11";
+ }
+ revision 2016-06-27 {
+ description
+ "
+ * Removed templates
+ * Add site-network-access-type
+ * Add a leaf number-of-dynamic-address in case
+ of pe-dhcp addressing;
+
+ ";
+ reference "draft-ietf-l3sm-l3vpn-service-yang-10";
+ }
+ revision 2016-06-10 {
+ description
+ "Add site-vpn-flavor NNI";
+ reference "draft-ietf-l3sm-l3vpn-service-yang-09";
+ }
+ revision 2016-06-09 {
+ description
+ "Traffic protection moved to site level.
+ Decouple operational-requirements in two containers.
+ ";
+ reference "draft-ietf-l3sm-l3vpn-service-yang-08";
+ }
+ revision 2016-06-06 {
+ description
+ "Set config false to actual-site-start and stop
+ Add a container before cloud-access list
+ Add a container before authorized-sites list
+ Add a container before denied-sites list
+ Modified access-diversity modeling
+ Replacing type placement diversity by an identity";
+ reference "draft-ietf-l3sm-l3vpn-service-yang-07";
+ }
+ revision 2016-04-19 {
+ description
+ "* remove reference to core routing model :
+ created new address family identities
+ * added features
+ * Modified bearer parameters
+ * Modified union for ipv4/ipv6 addresses to ip-address
+ type
+ * Add BSR parameters for multicast
+ * Add applications matching for QoS classification
+ ";
+ reference "draft-ietf-l3sm-l3vpn-service-yang-06";
+ }
+ revision 2016-04-05 {
+ description
+ "
+ * Added linecard diverse for site diversity
+ * Added a new diversity enum in placement-diversity : none
+ * Added state to site location
+
+ ";
+ reference "";
+ }
+ revision 2016-03-11 {
+ description
+ "
+ * Modify VPN policy and creating a vpn-policy-list
+ * Add VPN policy reference and VPN ID reference
+ under site-network-access
+ ";
+ reference "draft-ietf-l3sm-l3vpn-service-yang-05";
+ }
+ revision 2016-01-04 {
+ description
+ "
+ * Add extranet-vpn container in vpn-svc
+ * Creating top level containers
+ * Refine groupings
+ * Added site-vpn-flavor
+ ";
+ reference "draft-ietf-l3sm-l3vpn-service-yang-03";
+ }
+ revision 2016-01-04 {
+ description
+ "
+ * qos-profile moved to choice
+ * vpn leaf moved to vpn-id in vpn-policy
+ * added ordered-by user to qos classification list
+ * moved traffic protection to access availability
+ * creating a choice in matching filter for VPN policy
+ * added dot1p matching field in flow-definition
+ ";
+ reference "";
+ }
+ revision 2015-12-07 {
+ description
+ "
+ * A site is now a collection of site-accesses.
+ This was introduced to support M to N availability.
+ * Site-availability has been removed, replaced by
+ availability parameters under site-accesses
+ * Added transport-constraints within vpn-svc
+ ";
+ reference "draft-ietf-l3sm-l3vpn-service-yang-02";
+ }
+ revision 2015-11-03 {
+ description "
+ * Add ToS support in match-flow
+ * nexthop in cascaded lan as mandatory
+ * customer-specific-info deleted and moved to routing
+ protocols
+ * customer-lan-connection modified : need prefix and CE address
+ * add choice in managing PE-CE addressing
+ * Simplifying traffic protection
+ ";
+ reference "";
+ }
+ revision 2015-09-10 {
+ description "
+ * Refine groupings for vpn-svc
+ * Removed name in vpn-svc
+ * id in vpn-svc moved to string
+ * Rename id in vpn-svc to vpn-id
+ * Changed key of vpn-svc list to vpn-id
+ * Add DSCP support in flow definition
+ ";
+ reference "";
+ }
+ revision 2015-08-07 {
+ description
+ "
+ Multicast :
+ * Removed ACL from security
+ * Add FW for site and cloud access
+ ";
+ reference "";
+ }
+ revision 2015-08-05 {
+ description
+ "
+ Multicast :
+ * Removed anycast-rp identity as discovery mechanism
+ * Added rp-group mappings for multicast
+ * Added flag for provider managed RP.
+ ";
+ reference "";
+ }
+ revision 2015-08-03 {
+ description
+ " * Creating multiple reusable groupings
+ * Added mpls leaf in vpn-svc for carrier's carrier case
+ * Modify identity single to single-site
+ * Modify site-type to site-role and also child identities.
+ * Creating OAM container under site and moved BFD in.
+ * Creating flow-definition grouping to be reused
+ in ACL, QoS ...
+ * Simplified VPN policy.
+ * Adding multicast static group to RP mappings.
+ * Removed native-vpn and site-role from global site
+ cfg, now managed within the VPN policy.
+ * Creating a separate list for site templates.
+ ";
+ reference "draft-ietf-l3sm-l3vpn-service-yang-01";
+ }
+ revision 2015-07-02 {
+ reference "draft-ietf-l3sm-l3vpn-service-yang-00";
+ }
+ revision 2015-04-24 {
+ description "
+ * Add encryption parameters
+ * Adding holdtime for BFD.
+ * Add postal address in location
+ ";
+ reference "draft-lstd-l3sm-l3vpn-service-yang-00";
+ }
+ revision 2015-02-05 {
+ description "Initial revision.";
+ reference "draft-l3vpn-service-yang-00";
+ }
+
+ /* Features */
+
+ feature cloud-access {
+ description
+ "Allow VPN to connect to a Cloud Service
+ provider.";
+ }
+ feature multicast {
+ description
+ "Enables multicast capabilities in a VPN";
+ }
+ feature ipv4 {
+ description
+ "Enables IPv4 support in a VPN";
+ }
+ feature ipv6 {
+ description
+ "Enables IPv6 support in a VPN";
+ }
+ feature carrierscarrier {
+ description
+ "Enables support of carrier's carrier";
+ }
+ feature traffic-engineering {
+ description
+ "Enables support of transport constraint.";
+ }
+ feature traffic-engineering-multicast {
+ description
+ "Enables support of transport constraint
+ for multicast.";
+ }
+ feature extranet-vpn {
+ description
+ "Enables support of extranet VPNs";
+ }
+ feature site-diversity {
+ description
+ "Enables support of site diversity constraints";
+ }
+ feature encryption {
+ description
+ "Enables support of encryption";
+ }
+ feature qos {
+ description
+ "Enables support of Class of Services";
+ }
+ feature qos-custom {
+ description
+ "Enables support of custom qos profile";
+ }
+ feature rtg-bgp {
+ description
+ "Enables support of BGP routing protocol.";
+ }
+ feature rtg-rip {
+ description
+ "Enables support of RIP routing protocol.";
+ }
+ feature rtg-ospf {
+ description
+ "Enables support of OSPF routing protocol.";
+ }
+ feature rtg-ospf-sham-link {
+ description
+ "Enables support of OSPF sham-links.";
+ }
+ feature rtg-vrrp {
+ description
+ "Enables support of VRRP routing protocol.";
+ }
+ feature fast-reroute {
+ description
+ "Enables support of Fast Reroute.";
+ }
+ feature bfd {
+ description
+ "Enables support of BFD.";
+ }
+ feature always-on {
+ description
+ "Enables support for always-on access
+ constraint.";
+ }
+ feature requested-type {
+ description
+ "Enables support for requested-type access
+ constraint.";
+ }
+ feature bearer-reference {
+ description
+ "Enables support for bearer-reference access
+ constraint.";
+ }
+
+ /* Typedefs */
+
+ typedef svc-id {
+ type string;
+ description
+ "Defining a type of service component
+ identificators.";
+ }
+
+ typedef template-id {
+ type string;
+ description
+ "Defining a type of service template
+ identificators.";
+ }
+
+ /* Identities */
+
+ identity site-network-access-type {
+ description
+ "Base identity for site-network-access type";
+ }
+ identity point-to-point {
+ base site-network-access-type;
+ description
+ "Identity for point-to-point connection";
+ }
+ identity multipoint {
+ base site-network-access-type;
+ description
+ "Identity for multipoint connection
+ Example : ethernet broadcast segment";
+ }
+ identity placement-diversity {
+ description
+ "Base identity for site placement
+ constraints";
+ }
+ identity pe-diverse {
+ base placement-diversity;
+ description
+ "Identity for PE diversity";
+ }
+ identity pop-diverse {
+ base placement-diversity;
+ description
+ "Identity for POP diversity";
+ }
+ identity linecard-diverse {
+ base placement-diversity;
+ description
+ "Identity for linecard diversity";
+ }
+ identity same-pe {
+ base placement-diversity;
+ description
+ "Identity for having sites connected
+ on the same PE";
+ }
+ identity same-bearer {
+ base placement-diversity;
+ description
+ "Identity for having sites connected
+ using the same bearer";
+ }
+ identity customer-application {
+ description
+ "Base identity for customer application";
+ }
+ identity web {
+ base customer-application;
+ description
+ "Identity for web application (e.g. HTTP,HTTPS)";
+ }
+ identity mail {
+ base customer-application;
+ description
+ "Identity for mail applications";
+ }
+ identity file-transfer {
+ base customer-application;
+ description
+ "Identity for file transfer applications (
+ e.g. FTP, SFTP, ...)";
+ }
+ identity database {
+ base customer-application;
+ description
+ "Identity for database applications";
+ }
+ identity social {
+ base customer-application;
+ description
+ "Identity for social network applications";
+ }
+ identity games {
+ base customer-application;
+ description
+ "Identity for gaming applications";
+ }
+ identity p2p {
+ base customer-application;
+ description
+ "Identity for peer to peer applications";
+ }
+ identity network-management {
+ base customer-application;
+ description
+ "Identity for management applications (e.g. telnet
+ syslog, snmp ...)";
+ }
+ identity voice {
+ base customer-application;
+ description
+ "Identity for voice applications";
+ }
+ identity video {
+ base customer-application;
+ description
+ "Identity for video conference applications";
+ }
+ identity address-family {
+ description
+ "Base identity for an address family.";
+ }
+ identity ipv4 {
+ base address-family;
+ description
+ "Identity for IPv4 address family.";
+ }
+ identity ipv6 {
+ base address-family;
+ description
+ "Identity for IPv6 address family.";
+ }
+ identity site-vpn-flavor {
+ description
+ "Base identity for the site VPN service flavor.";
+ }
+ identity site-vpn-flavor-single {
+ base site-vpn-flavor;
+ description
+ "Base identity for the site VPN service flavor.
+ Used when the site belongs to only one VPN.";
+ }
+ identity site-vpn-flavor-multi {
+ base site-vpn-flavor;
+ description
+ "Base identity for the site VPN service flavor.
+ Used when a logical connection of a site
+ belongs to multiple VPNs.";
+ }
+ identity site-vpn-flavor-sub {
+ base site-vpn-flavor;
+ description
+ "Base identity for the site VPN service flavor.
+ Used when a site has multiple logical connections.
+ Each of the connection may belong to different
+ multiple VPNs.";
+ }
+ identity site-vpn-flavor-nni {
+ base site-vpn-flavor;
+ description
+ "Base identity for the site VPN service flavor.
+ Used to describe a NNI option A connection.";
+ }
+ identity transport-constraint {
+ description
+ "Base identity for transport constraint.";
+ }
+ identity tc-latency {
+ base transport-constraint;
+ description
+ "Base identity for transport constraint
+ based on latency.";
+ }
+ identity tc-jitter {
+ base transport-constraint;
+ description
+ "Base identity for transport constraint
+ based on jitter.";
+ }
+ identity tc-bandwidth {
+ base transport-constraint;
+ description
+ "Base identity for transport constraint
+ based on bandwidth.";
+ }
+ identity tc-path-diversity {
+ base transport-constraint;
+ description
+ "Base identity for transport constraint
+ based on path diversity.";
+ }
+ identity tc-site-diversity {
+ base transport-constraint;
+ description
+ "Base identity for transport constraint
+ based on site diversity.";
+ }
+ identity management {
+ description
+ "Base identity for site management scheme.";
+ }
+ identity co-managed {
+ base management;
+ description
+ "Base identity for comanaged site.";
+ }
+ identity customer-managed {
+ base management;
+ description
+ "Base identity for customer managed site.";
+ }
+ identity provider-managed {
+ base management;
+ description
+ "Base identity for provider managed site.";
+ }
+ identity address-allocation-type {
+ description
+ "Base identity for address-allocation-type
+ for PE-CE link.";
+ }
+ identity pe-dhcp {
+ base address-allocation-type;
+ description
+ "PE router provides DHCP service to CE.";
+ }
+ identity static-address {
+ base address-allocation-type;
+ description
+ "PE-CE addressing is static.";
+ }
+ identity slaac {
+ base address-allocation-type;
+ description
+ "Use IPv6 SLAAC.";
+ }
+ identity site-role {
+ description
+ "Base identity for site type.";
+ }
+ identity any-to-any-role {
+ base site-role;
+ description
+ "Site in a any to any IPVPN.";
+ }
+ identity spoke-role {
+ base site-role;
+ description
+ "Spoke Site in a Hub & Spoke IPVPN.";
+ }
+ identity hub-role {
+ base site-role;
+ description
+ "Hub Site in a Hub & Spoke IPVPN.";
+ }
+ identity vpn-topology {
+ description
+ "Base identity for VPN topology.";
+ }
+ identity any-to-any {
+ base vpn-topology;
+ description
+ "Identity for any to any VPN topology.";
+ }
+ identity hub-spoke {
+ base vpn-topology;
+ description
+ "Identity for Hub'n'Spoke VPN topology.";
+ }
+ identity hub-spoke-disjoint {
+ base vpn-topology;
+ description
+ "Identity for Hub'n'Spoke VPN topology
+ where Hubs cannot talk between each other.";
+ }
+ identity multicast-tree-type {
+ description
+ "Base identity for multicast tree type.";
+ }
+ identity ssm-tree-type {
+ base multicast-tree-type;
+ description
+ "Identity for SSM tree type.";
+ }
+ identity asm-tree-type {
+ base multicast-tree-type;
+ description
+ "Identity for ASM tree type.";
+ }
+ identity bidir-tree-type {
+ base multicast-tree-type;
+ description
+ "Identity for BiDir tree type.";
+ }
+ identity multicast-rp-discovery-type {
+ description
+ "Base identity for rp discovery type.";
+ }
+ identity auto-rp {
+ base multicast-rp-discovery-type;
+ description
+ "Base identity for auto-rp discovery type.";
+ }
+ identity static-rp {
+ base multicast-rp-discovery-type;
+ description
+ "Base identity for static type.";
+ }
+ identity bsr-rp {
+ base multicast-rp-discovery-type;
+ description
+ "Base identity for BDR discovery type.";
+ }
+ identity routing-protocol-type {
+ description
+ "Base identity for routing-protocol type.";
+ }
+ identity ospf {
+ base routing-protocol-type;
+ description
+ "Identity for OSPF protocol type.";
+ }
+ identity bgp {
+ base routing-protocol-type;
+ description
+ "Identity for BGP protocol type.";
+ }
+ identity static {
+ base routing-protocol-type;
+ description
+ "Identity for static routing protocol type.";
+ }
+ identity rip {
+ base routing-protocol-type;
+ description
+ "Identity for RIP protocol type.";
+ }
+ identity rip-ng {
+ base routing-protocol-type;
+ description
+ "Identity for RIPng protocol type.";
+ }
+ identity vrrp {
+ base routing-protocol-type;
+ description
+ "Identity for VRRP protocol type.
+ This is to be used when LAn are directly connected
+ to provider Edge routers.";
+ }
+ identity direct {
+ base routing-protocol-type;
+ description
+ "Identity for direct protocol type.
+ .";
+ }
+ identity protocol-type {
+ description
+ "Base identity for protocol field type.";
+ }
+ identity tcp {
+ base protocol-type;
+ description
+ "TCP protocol type.";
+ }
+ identity udp {
+ base protocol-type;
+ description
+ "UDP protocol type.";
+ }
+ identity icmp {
+ base protocol-type;
+ description
+ "icmp protocol type.";
+ }
+ identity icmp6 {
+ base protocol-type;
+ description
+ "icmp v6 protocol type.";
+ }
+ identity gre {
+ base protocol-type;
+ description
+ "GRE protocol type.";
+ }
+ identity ipip {
+ base protocol-type;
+ description
+ "IPinIP protocol type.";
+ }
+ identity hop-by-hop {
+ base protocol-type;
+ description
+ "Hop by Hop IPv6 header type.";
+ }
+ identity routing {
+ base protocol-type;
+ description
+ "Routing IPv6 header type.";
+ }
+ identity esp {
+ base protocol-type;
+ description
+ "ESP header type.";
+ }
+ identity ah {
+ base protocol-type;
+ description
+ "AH header type.";
+ }
+
+ /* Groupings */
+
+ grouping vpn-service-cloud-access {
+ container cloud-accesses {
+ list cloud-access {
+ if-feature cloud-access;
+ key cloud-identifier;
+
+ leaf cloud-identifier {
+ type string;
+ description
+ "Identification of cloud service. Local
+ admin meaning.";
+ }
+ container authorized-sites {
+ list authorized-site {
+ key site-id;
+
+ leaf site-id {
+ type leafref {
+ path "/l3vpn-svc/sites/site/site-id";
+ }
+ description
+ "Site ID.";
+ }
+ description
+ "List of authorized sites.";
+ }
+ description
+ "Configuration of authorized sites";
+ }
+ container denied-sites {
+ list denied-site {
+ key site-id;
+
+ leaf site-id {
+ type leafref {
+ path "/l3vpn-svc/sites/site/site-id";
+ }
+ description
+ "Site ID.";
+ }
+ description
+ "List of denied sites.";
+ }
+ description
+ "Configuration of denied sites";
+ }
+ leaf nat-enabled {
+ type boolean;
+ description
+ "Control if NAT is required or not.";
+ }
+ leaf customer-nat-address {
+ type inet:ipv4-address;
+ description
+ "NAT address to be used in case of public
+ or shared cloud.
+ This is to be used in case customer is providing
+ the public address.";
+ }
+ description
+ "Cloud access configuration.";
+ }
+ description
+ "Container for cloud access configurations";
+ }
+ description
+ "grouping for vpn cloud definition";
+ }
+
+ grouping multicast-rp-group-cfg {
+ choice group-format {
+ case startend {
+ leaf group-start {
+ type inet:ip-address;
+ description
+ "First group address.";
+ }
+ leaf group-end {
+ type inet:ip-address;
+ description
+ "Last group address.";
+ }
+ }
+ case singleaddress {
+ leaf group-address {
+ type inet:ip-address;
+ description
+ "Group address";
+ }
+ }
+ description
+ "Choice for group format.";
+ }
+ description
+ "Definition of groups for
+ RP to group mapping.";
+ }
+
+ grouping vpn-service-multicast {
+ container multicast {
+ if-feature multicast;
+ leaf enabled {
+ type boolean;
+ default false;
+ description
+ "Enable multicast.";
+ }
+ container customer-tree-flavors {
+ list tree-flavor {
+ key type;
+
+ leaf type {
+ type identityref {
+ base multicast-tree-type;
+ }
+ description
+ "Type of tree to be used.";
+ }
+ description
+ "List of tree flavors.";
+ }
+ description
+ "Type of trees used by customer.";
+ }
+ container rp {
+ container rp-group-mappings {
+ list rp-group-mapping {
+ key "id";
+
+ leaf id {
+ type uint16;
+ description
+ "Unique identifier for the mapping.";
+ }
+ container provider-managed {
+ leaf enabled {
+ type boolean;
+ default false;
+ description
+ "Set to true, if the RP must be a
+ provider
+ managed node.
+ Set to false, if it is a customer
+ managed node.";
+ }
+
+ leaf rp-redundancy {
+ when "../enabled = 'true'" {
+ description
+ "Relevant when RP
+ is provider managed.";
+ }
+ type boolean;
+ default false;
+ description
+ "If true, redundancy
+ mechanism for RP is required.";
+ }
+ leaf optimal-traffic-delivery {
+ when "../enabled = 'true'" {
+ description
+ "Relevant when RP
+ is provider managed.";
+ }
+ type boolean;
+ default false;
+ description
+ "If true, SP must ensure
+ that traffic uses an optimal path.";
+ }
+ description
+ "Parameters for provider managed RP.";
+ }
+
+ leaf rp-address {
+ when "../provider-managed/enabled='false'" {
+ description
+ "Relevant when RP
+ is provider managed.";
+ }
+ type inet:ip-address;
+ description
+ "Defines the address of the
+ RendezvousPoint.
+ Used if RP is customer managed.";
+ }
+
+ container groups {
+ list group {
+ key id;
+
+ leaf id {
+ type uint16;
+ description
+ "Identifier for the group.";
+ }
+ uses multicast-rp-group-cfg;
+ description
+ "List of groups.";
+ }
+ description
+ "Multicast groups associated with RP.";
+ }
+
+ description
+ "List of RP to group mappings.";
+ }
+ description
+ "RP to group mappings.";
+ }
+ container rp-discovery {
+ leaf rp-discovery-type {
+ type identityref {
+ base multicast-rp-discovery-type;
+ }
+ default static-rp;
+ description
+ "Type of RP discovery used.";
+ }
+ container bsr-candidates {
+ when "../rp-discovery-type='bsr-rp'" {
+ description
+ "Only applicable if discovery type
+ is BSR-RP";
+ }
+ list bsr-candidate {
+ key address;
+
+ leaf address {
+ type inet:ip-address;
+ description
+ "Address of BSR candidate";
+ }
+
+ description
+ "List of customer BSR candidates";
+ }
+ description
+ "Customer BSR candidates address";
+ }
+ description
+ "RP discovery parameters";
+ }
+
+ description
+ "RendezvousPoint parameters.";
+ }
+ description
+ "Multicast global parameters for the VPN service.";
+ }
+ description
+ "grouping for multicast vpn definition";
+ }
+
+ grouping vpn-service-mpls {
+ leaf carrierscarrier {
+ if-feature carrierscarrier;
+ type boolean;
+ default false;
+ description
+ "The VPN is using Carrier's Carrier,
+ and so MPLS is required.";
+ }
+ description
+ "grouping for mpls CsC definition";
+ }
+
+ grouping customer-location-info {
+ container location {
+ leaf address {
+ type string;
+ description
+ "Address (number and street)
+ of the site.";
+
+ }
+ leaf zip-code {
+ type string;
+ description
+ "ZIP code of the site.";
+ }
+ leaf state {
+ type string;
+ description
+ "State of the site.
+ This leaf can also be used
+ to describe a region
+ for country who does not have
+ states.
+ ";
+ }
+ leaf city {
+ type string;
+ description
+ "City of the site.";
+ }
+ leaf country-code {
+ type string;
+ description
+ "Country of the site.";
+ }
+ description
+ "Location of the site.";
+ }
+ description
+ "This grouping defines customer location
+ parameters";
+ }
+
+ grouping site-diversity {
+ container site-diversity {
+ if-feature site-diversity;
+
+ container groups {
+ list group {
+ key group-id;
+
+ leaf group-id {
+ type string;
+ description
+ "Group-id the site
+ is belonging to";
+ }
+ description
+ "List of group-id";
+ }
+ description
+ "Groups the site
+ is belonging to.
+ All site network accesses will
+ inherit those group values.";
+ }
+ description
+ "Diversity constraint type.";
+ }
+ description
+ "This grouping defines site diversity
+ parameters";
+ }
+
+ grouping access-diversity {
+ container access-diversity {
+ if-feature site-diversity;
+ container groups {
+ list group {
+ key group-id;
+
+ leaf group-id {
+ type string;
+ description
+ "Group-id the site network access
+ is belonging to";
+ }
+ description
+ "List of group-id";
+ }
+ description
+ "Groups the site network access
+ is belonging to";
+ }
+ container constraints {
+ list constraint {
+ key constraint-type;
+
+ leaf constraint-type {
+ type identityref {
+ base placement-diversity;
+ }
+ description
+ "Diversity constraint type.";
+ }
+ container target {
+ choice target-flavor {
+ case id {
+ list group {
+ key group-id;
+
+ leaf group-id {
+ type string;
+ description
+ "The constraint will apply
+ against this particular
+ group-id";
+ }
+ description
+ "List of groups";
+ }
+ }
+ case all-accesses {
+ leaf all-other-accesses {
+ type empty;
+ description
+ "The constraint will apply
+ against all other site network
+ access
+ of this site";
+ }
+ }
+ case all-groups {
+ leaf all-other-groups {
+ type empty;
+ description
+ "The constraint will apply
+ against all other groups the
+ customer
+ is managing";
+ }
+ }
+ description
+ "Choice for the group definition";
+ }
+ description
+ "The constraint will apply against
+ this list of groups";
+ }
+ description
+ "List of constraints";
+ }
+ description
+ "Constraints for placing this site
+ network access";
+ }
+
+ description
+ "Diversity parameters.";
+ }
+ description
+ "This grouping defines access diversity
+ parameters";
+ }
+
+ grouping operational-requirements {
+ leaf requested-site-start {
+ type yang:date-and-time;
+ description
+ "Optional leaf indicating requested date
+ and time
+ when the service at a particular site is
+ expected
+ to start";
+ }
+
+ leaf requested-site-stop {
+ type yang:date-and-time;
+ description
+ "Optional leaf indicating requested date
+ and time
+ when the service at a particular site is
+ expected
+ to stop";
+ }
+ description
+ "This grouping defines some operational parameters
+ parameters";
+ }
+
+ grouping operational-requirements-ops {
+ leaf actual-site-start {
+ type yang:date-and-time;
+ config false;
+ description
+ "Optional leaf indicating actual date
+ and time
+ when the service at a particular site
+ actually
+ started";
+ }
+ leaf actual-site-stop {
+ type yang:date-and-time;
+ config false;
+ description
+ "Optional leaf indicating actual date
+ and time
+ when the service at a particular site
+ actually
+ stopped";
+ }
+ description
+ "This grouping defines some operational parameters
+ parameters";
+ }
+
+ grouping flow-definition {
+ container match-flow {
+ leaf dscp {
+ type uint8 {
+ range "0 .. 63";
+ }
+ description
+ "DSCP value.";
+ }
+ leaf tos {
+ type uint8 {
+ range "0 .. 254";
+ }
+ description
+ "TOS value.";
+ }
+ leaf dot1p {
+ type uint8 {
+ range "0 .. 7";
+ }
+ description
+ "802.1p matching.";
+ }
+ leaf ipv4-src-prefix {
+ type inet:ipv4-prefix;
+ description
+ "Match on IPv4 src address.";
+ }
+ leaf ipv6-src-prefix {
+ type inet:ipv6-prefix;
+ description
+ "Match on IPv6 src address.";
+ }
+ leaf ipv4-dst-prefix {
+ type inet:ipv4-prefix;
+ description
+ "Match on IPv4 dst address.";
+ }
+ leaf ipv6-dst-prefix {
+ type inet:ipv6-prefix;
+ description
+ "Match on IPv6 dst address.";
+ }
+ leaf l4-src-port {
+ type uint16;
+ description
+ "Match on layer 4 src port.";
+ }
+ leaf l4-dst-port {
+ type uint16;
+ description
+ "Match on layer 4 dst port.";
+ }
+ leaf protocol-field {
+ type union {
+ type uint8;
+ type identityref {
+ base protocol-type;
+ }
+ }
+ description
+ "Match on IPv4 protocol or
+ Ipv6 Next Header
+ field.";
+ }
+
+ description
+ "Describe flow matching
+ criterions.";
+ }
+ description
+ "Flow definition based on criteria.";
+ }
+
+ grouping site-service-basic {
+ leaf svc-input-bandwidth {
+ type uint32;
+ units bps;
+ description
+ "From the PE perspective, the service input
+ bandwidth of the connection.";
+ }
+ leaf svc-output-bandwidth {
+ type uint32;
+ units bps;
+ description
+ "From the PE perspective, the service output
+ bandwidth of the connection.";
+ }
+ leaf svc-mtu {
+ type uint16;
+ units bytes;
+ description
+ "MTU at service level.
+ If the service is IP,
+ it refers to the IP MTU.";
+ }
+ description
+ "Defines basic service parameters for a site.";
+ }
+
+ grouping site-protection {
+ container traffic-protection {
+ if-feature fast-reroute;
+ leaf enabled {
+ type boolean;
+ description
+ "Enables
+ traffic protection of access link.";
+ }
+
+ description
+ "Fast reroute service parameters
+ for the site.";
+ }
+ description
+ "Defines protection service parameters for a site.";
+ }
+
+ grouping site-service-mpls {
+ container carrierscarrier {
+ if-feature carrierscarrier;
+ leaf signalling-type {
+ type enumeration {
+ enum "ldp" {
+ description
+ "Use LDP as signalling
+ protocol between PE and CE.";
+ }
+ enum "bgp" {
+ description
+ "Use BGP 3107 as signalling
+ protocol between PE and CE.
+ In this case, bgp must be also
+ configured
+ as routing-protocol.
+ ";
+ }
+ }
+ description
+ "MPLS signalling type.";
+ }
+ description
+ "This container is used when customer provides
+ MPLS based services.
+ This is used in case of Carrier's
+ Carrier.";
+ }
+ description
+ "Defines MPLS service parameters for a site.";
+ }
+
+ grouping site-service-qos-profile {
+ container qos {
+ if-feature qos;
+ container qos-classification-policy {
+ list rule {
+ key id;
+ ordered-by user;
+
+ leaf id {
+ type uint16;
+ description
+ "ID of the rule.";
+ }
+
+ choice match-type {
+ case match-flow {
+ uses flow-definition;
+ }
+ case match-application {
+ leaf match-application {
+ type identityref {
+ base customer-application;
+ }
+ description
+ "Defines the application
+ to match.";
+ }
+ }
+ description
+ "Choice for classification";
+ }
+
+ leaf target-class-id {
+ type string;
+ description
+ "Identification of the
+ class of service.
+ This identifier is internal to
+ the administration.";
+ }
+
+ description
+ "List of marking rules.";
+ }
+ description
+ "Need to express marking rules ...";
+ }
+ container qos-profile {
+
+ choice qos-profile {
+ description
+ "Choice for QoS profile.
+ Can be standard profile or custom.";
+ case standard {
+ leaf profile {
+ type string;
+ description
+ "QoS profile to be used";
+ }
+ }
+ case custom {
+ container classes {
+ if-feature qos-custom;
+ list class {
+ key class-id;
+
+ leaf class-id {
+ type string;
+ description
+ "Identification of the
+ class of service.
+ This identifier is internal to
+ the administration.";
+ }
+ leaf rate-limit {
+ type uint8;
+ units percent;
+ description
+ "To be used if class must
+ be rate
+ limited. Expressed as
+ percentage of the svc-bw.";
+ }
+ leaf priority-level {
+ type uint8;
+ description
+ "Defines the level of the
+ class in
+ term of priority queueing.
+ The higher the level is the
+ higher
+ is the priority.";
+ }
+ leaf guaranteed-bw-percent {
+ type uint8;
+ units percent;
+ description
+ "To be used to define the
+ guaranteed
+ BW in percent of the svc-bw
+ available at the priority-level.";
+ }
+ description
+ "List of class of services.";
+ }
+ description
+ "Container for
+ list of class of services.";
+ }
+
+ }
+
+ }
+ description
+ "Qos profile configuration.";
+ }
+ description
+ "QoS configuration.";
+ }
+ description
+ "This grouping defines QoS parameters
+ for a site";
+
+ }
+
+ grouping site-security-authentication {
+ container authentication {
+ description
+ "Authentication parameters";
+ }
+ description
+ "This grouping defines authentication
+ parameters
+ for a site";
+ }
+
+ grouping site-security-encryption {
+ container encryption {
+ if-feature encryption;
+ leaf enabled {
+ type boolean;
+ description
+ "If true, access encryption is required.";
+ }
+ leaf layer {
+ type enumeration {
+ enum layer2 {
+ description
+ "Encryption will occur at layer2.";
+ }
+ enum layer3 {
+ description
+ "IPSec is requested.";
+ }
+ }
+ description
+ "Layer on which encryption is applied.";
+ }
+ container encryption-profile {
+ choice profile {
+ case provider-profile {
+ leaf profile-name {
+ type string;
+ description
+ "Name of the SP profile
+ to be applied.";
+ }
+ }
+ case customer-profile {
+ leaf algorithm {
+ type string;
+ description
+ "Encryption algorithm to
+ be used.";
+ }
+ choice key-type {
+ case psk {
+ leaf preshared-key {
+ type string;
+ description
+ "Key coming from
+ customer.";
+ }
+ }
+ case pki {
+
+ }
+ description
+ "Type of keys to be used.";
+ }
+ }
+ description
+ "Choice of profile.";
+ }
+ description
+ "Profile of encryption to be applied.";
+ }
+ description
+ "Encryption parameters.";
+ }
+ description
+ "This grouping defines encryption parameters
+ for a site";
+ }
+
+ grouping site-attachment-bearer {
+ container bearer {
+ container requested-type {
+ if-feature requested-type;
+ leaf requested-type {
+ type string;
+ description
+ "Type of requested bearer Ethernet, DSL,
+ Wireless ...
+ Operator specific.";
+ }
+ leaf strict {
+ type boolean;
+ default false;
+ description
+ "define if the requested-type is a preference
+ or a strict requirement.";
+ }
+ description
+ "Container for requested type.";
+ }
+ leaf always-on {
+ if-feature always-on;
+ type boolean;
+ default true;
+ description
+ "Request for an always on access type.
+ This means no Dial access type for
+ example.";
+ }
+ leaf bearer-reference {
+ if-feature bearer-reference;
+ type string;
+ description
+ "This is an internal reference for the
+ service provider.
+ Used ";
+ }
+ description
+ "Bearer specific parameters.
+ To be augmented.";
+ }
+ description
+ "Defines physical properties of
+ a site attachment.";
+ }
+
+ grouping site-routing {
+ container routing-protocols {
+ list routing-protocol {
+ key type;
+
+ leaf type {
+ type identityref {
+ base routing-protocol-type;
+ }
+ description
+ "Type of routing protocol.";
+ }
+
+
+ container ospf {
+ when "../type = 'ospf'" {
+ description
+ "Only applies
+ when protocol is OSPF.";
+ }
+ if-feature rtg-ospf;
+ leaf-list address-family {
+ type identityref {
+ base address-family;
+ }
+ description
+ "Address family to be activated.";
+ }
+ leaf area-address {
+ type yang:dotted-quad;
+ description
+ "Area address.";
+ }
+ leaf metric {
+ type uint16;
+ description
+ "Metric of PE-CE link.";
+ }
+ container sham-links {
+ if-feature rtg-ospf-sham-link;
+ list sham-link {
+ key target-site;
+
+ leaf target-site {
+ type svc-id;
+ description
+ "Target site for the sham link
+ connection.
+ The site is referred through it's ID.";
+ }
+ leaf metric {
+ type uint16;
+ description
+ "Metric of the sham link.";
+ }
+ description
+ "Creates a shamlink with another
+ site";
+ }
+ description
+ "List of Sham links";
+ }
+ description
+ "OSPF specific configuration.";
+ }
+
+ container bgp {
+
+ when "../type = 'bgp'" {
+ description
+ "Only applies when
+ protocol is BGP.";
+ }
+ if-feature rtg-bgp;
+ leaf autonomous-system {
+ type uint32;
+ description
+ "AS number.";
+ }
+ leaf-list address-family {
+ type identityref {
+ base address-family;
+ }
+ description
+ "Address family to be activated.";
+ }
+ description
+ "BGP specific configuration.";
+ }
+ container static {
+ when "../type = 'static'" {
+ description
+ "Only applies when protocol
+ is static.";
+ }
+
+ container cascaded-lan-prefixes {
+ list ipv4-lan-prefixes {
+ if-feature ipv4;
+ key "lan next-hop";
+
+ leaf lan {
+ type inet:ipv4-prefix;
+ description
+ "Lan prefixes.";
+ }
+ leaf lan-tag {
+ type string;
+ description
+ "Internal tag to be used in vpn
+ policies.";
+ }
+ leaf next-hop {
+ type inet:ipv4-address;
+ description
+ "Nexthop address to use at customer
+ side.";
+ }
+ description "
+ List of LAN prefixes for
+ the site.
+ ";
+ }
+ list ipv6-lan-prefixes {
+ if-feature ipv6;
+ key "lan next-hop";
+
+ leaf lan {
+ type inet:ipv6-prefix;
+ description
+ "Lan prefixes.";
+ }
+ leaf lan-tag {
+ type string;
+ description
+ "Internal tag to be used
+ in vpn policies.";
+ }
+ leaf next-hop {
+ type inet:ipv6-address;
+ description
+ "Nexthop address to use at
+ customer side.";
+ }
+ description "
+ List of LAN prefixes for the site.
+ ";
+ }
+ description
+ "LAN prefixes from the customer.";
+ }
+ description
+ "Static routing
+ specific configuration.";
+ }
+ container rip {
+
+ when "../type = 'rip'" {
+ description
+ "Only applies when
+ protocol is RIP.";
+ }
+ if-feature rtg-rip;
+ leaf-list address-family {
+ type identityref {
+ base address-family;
+ }
+ description
+ "Address family to be
+ activated.";
+ }
+
+ description
+ "RIP routing specific
+ configuration.";
+ }
+
+
+ container vrrp {
+
+ when "../type = 'vrrp'" {
+ description
+ "Only applies when
+ protocol is VRRP.";
+ }
+ if-feature rtg-vrrp;
+ leaf-list address-family {
+ type identityref {
+ base address-family;
+ }
+ description
+ "Address family to be activated.";
+ }
+ description
+ "VRRP routing specific configuration.";
+ }
+
+
+ description
+ "List of routing protocols used
+ on the site.
+ Need to be augmented.";
+ }
+ description
+ "Defines routing protocols.";
+ }
+ description
+ "Grouping for routing protocols.";
+ }
+
+ grouping site-attachment-ip-connection {
+ container ip-connection {
+ container ipv4 {
+ if-feature ipv4;
+ leaf address-allocation-type {
+ type identityref {
+ base address-allocation-type;
+ }
+
+ default "static-address";
+ description
+ "Defines how addresses are allocated.
+ ";
+ }
+
+ leaf number-of-dynamic-address {
+ when
+ "../address-allocation-type = 'pe-dhcp'"
+ {
+ description
+ "Only applies when
+ protocol allocation type is static";
+ }
+ type uint8;
+ default 1;
+ description
+ "Describes the number of IP addresses the
+ customer requires";
+ }
+ container addresses {
+ when
+ "../address-allocation-type = 'static-address'" {
+ description
+ "Only applies when
+ protocol allocation type is static";
+ }
+ leaf provider-address {
+ type inet:ipv4-address;
+ description
+ "Provider side address.";
+ }
+ leaf customer-address {
+ type inet:ipv4-address;
+ description
+ "Customer side address.";
+ }
+ leaf mask {
+ type uint8 {
+ range "0..32";
+ }
+ description
+ "Subnet mask expressed
+ in bits";
+ }
+ description
+ "Describes IP addresses used";
+ }
+ description
+ "IPv4 specific parameters";
+
+ }
+ container ipv6 {
+ if-feature ipv6;
+ leaf address-allocation-type {
+ type identityref {
+ base address-allocation-type;
+ }
+ default "static-address";
+ description
+ "Defines how addresses are allocated.
+ ";
+ }
+ leaf number-of-dynamic-address {
+ when
+ "../address-allocation-type = 'pe-dhcp'" {
+ description
+ "Only applies when
+ protocol allocation type is static";
+ }
+ type uint8;
+ default 1;
+ description
+ "Describes the number of IP addresses the
+ customer requires";
+ }
+ container addresses {
+ when
+ "../address-allocation-type = 'static-address'" {
+ description
+ "Only applies when
+ protocol allocation type is static";
+ }
+ leaf provider-address {
+ type inet:ipv6-address;
+ description
+ "Provider side address.";
+ }
+ leaf customer-address {
+ type inet:ipv6-address;
+ description
+ "Customer side address.";
+ }
+ leaf mask {
+ type uint8 {
+ range "0..128";
+
+ }
+ description
+ "Subnet mask expressed
+ in bits";
+ }
+ description
+ "Describes IP addresses used";
+ }
+
+ description
+ "IPv6 specific parameters";
+
+ }
+ container oam {
+ container bfd {
+ if-feature bfd;
+ leaf bfd-enabled {
+ type boolean;
+ description
+ "BFD activation";
+ }
+
+ choice holdtime {
+ case profile {
+ leaf profile-name {
+ type string;
+ description
+ "Service provider well
+ known profile.";
+ }
+ description
+ "Service provider well
+ known profile.";
+ }
+ case fixed {
+ leaf fixed-value {
+ type uint32;
+ units msec;
+ description
+ "Expected holdtime
+ expressed
+ in msec.";
+ }
+ }
+ description
+ "Choice for holdtime flavor.";
+ }
+ description
+ "Container for BFD.";
+ }
+ description
+ "Define the OAM used on the connection.";
+ }
+ description
+ "Defines connection parameters.";
+ }
+ description
+ "This grouping defines IP connection parameters.";
+ }
+
+ grouping site-service-multicast {
+ container multicast {
+ if-feature multicast;
+ leaf multicast-site-type {
+ type enumeration {
+ enum receiver-only {
+ description
+ "The site has only receivers.";
+ }
+ enum source-only {
+ description
+ "The site has only sources.";
+ }
+ enum source-receiver {
+ description
+ "The site has both
+ sources & receivers.";
+ }
+ }
+ default "source-receiver";
+ description
+ "Type of multicast site.";
+ }
+ container multicast-transport-protocol {
+ leaf ipv4 {
+ if-feature ipv4;
+ type boolean;
+ default true;
+ description
+ "Enables ipv4 multicast transport";
+ }
+ leaf ipv6 {
+ if-feature ipv6;
+ type boolean;
+ default false;
+ description
+ "Enables ipv6 multicast transport";
+ }
+ description
+ "Defines protocol to transport multicast.";
+ }
+ leaf protocol-type {
+ type enumeration {
+ enum host {
+ description
+ "
+ Hosts are directly connected
+ to the provider network.
+ Host protocols like IGMP, MLD
+ are required.
+ ";
+ }
+ enum router {
+ description
+ "
+ Hosts are behind a customer router.
+ PIM will be implemented.
+ ";
+ }
+ enum both {
+ description
+ "Some Hosts are behind a customer
+ router and some others are directly
+ connected to the provider network.
+ Both host and routing protocols must be
+ used. Typically IGMP and PIM will be
+ implemented.
+ ";
+ }
+ }
+ default "both";
+ description
+ "Multicast protocol type to be used
+ with the customer site.";
+ }
+
+ description
+ "Multicast parameters for the site.";
+ }
+ description
+ "Multicast parameters for the site.";
+ }
+
+ grouping site-management {
+ container management {
+ leaf type {
+ type identityref {
+ base management;
+ }
+ description
+ "Management type of the connection.";
+ }
+ leaf management-transport {
+ type identityref {
+ base address-family;
+ }
+ description
+ "Transport protocol used for management.";
+ }
+ leaf address {
+ type inet:ip-address;
+ description
+ "Management address";
+ }
+
+ description
+ "Management configuration";
+ }
+ description
+ "Management parameters for the site.";
+ }
+
+ grouping site-vpn-flavor-profile {
+ leaf site-vpn-flavor {
+ type identityref {
+ base site-vpn-flavor;
+ }
+ default site-vpn-flavor-single;
+ description
+ "Defines if the site
+ is a single VPN site, or multiVPN or ...";
+ }
+ description
+ "Grouping for site-vpn-flavor.";
+ }
+
+ grouping site-vpn-policy {
+ container vpn-policy-list {
+ list vpn-policy {
+ key vpn-policy-id;
+
+ leaf vpn-policy-id {
+ type svc-id;
+ description
+ "Unique identifier for
+ the VPN policy.";
+ }
+
+ list entries {
+ key id;
+
+ leaf id {
+ type svc-id;
+ description
+ "Unique identifier for
+ the policy entry.";
+ }
+ container filter {
+ choice lan {
+ case lan-prefix {
+ container lan-prefixes {
+ list ipv4-lan-prefixes {
+ if-feature ipv4;
+ key lan;
+
+ leaf lan {
+ type inet:ipv4-prefix;
+ description
+ "Lan prefixes.";
+ }
+ description "
+ List of LAN prefixes
+ for the site.
+ ";
+ }
+ list ipv6-lan-prefixes {
+ if-feature ipv6;
+ key lan;
+
+ leaf lan {
+ type inet:ipv6-prefix;
+ description
+ "Lan prefixes.";
+ }
+ description "
+ List of LAN prefixes
+ for the site.
+ ";
+ }
+ description
+ "LAN prefixes from the customer.";
+ }
+ }
+ case lan-tag {
+ leaf-list lan-tag {
+ type string;
+ description
+ "List of lan-tags to be matched.";
+ }
+ }
+ description
+ "Choice for LAN matching type";
+ }
+ description
+ "If used, it permit to split site LANs
+ among multiple VPNs.
+ If no filter used, all the LANs will be
+ part of the same VPNs with the same
+ role.";
+ }
+ container vpn {
+ leaf vpn-id {
+ type leafref {
+ path "/l3vpn-svc/vpn-services/vpn-svc/vpn-id";
+ }
+ mandatory true;
+ description
+ "Reference to an IPVPN.";
+ }
+ leaf site-role {
+ type identityref {
+ base site-role;
+ }
+ mandatory true;
+ description
+ "Role of the site in the IPVPN.";
+ }
+ description
+ "List of VPNs the LAN is associated to.";
+ }
+ description
+ "List of entries for export policy.";
+ }
+ description
+ "List of VPN policies.";
+ }
+ description
+ "VPN policy.";
+ }
+ description
+ "VPN policy parameters for the site.";
+ }
+
+ grouping site-maximum-routes {
+ container maximum-routes {
+ list address-family {
+ key af;
+
+ leaf af {
+ type identityref {
+ base address-family;
+ }
+ description
+ "Address-family.";
+ }
+ leaf maximum-routes {
+ type uint32;
+ description
+ "Maximum prefixes the VRF can
+ accept for this
+ address-family.";
+ }
+ description
+ "List of address families.";
+ }
+
+ description
+ "Define maximum-routes for the VRF.";
+ }
+ description
+ "Define maximum-routes for the site.";
+ }
+
+ grouping site-security {
+ container security {
+ uses site-security-authentication;
+ uses site-security-encryption;
+
+ description
+ "Site specific security parameters.";
+ }
+ description
+ "Grouping for security parameters.";
+ }
+
+ grouping site-service {
+ container service {
+ uses site-service-basic;
+ uses site-service-qos-profile;
+ uses site-service-mpls;
+ uses site-service-multicast;
+
+ description
+ "Service parameters on the attachement.";
+ }
+ description
+ "Grouping for service parameters.";
+ }
+
+ grouping transport-constraint-profile {
+ list constraint-list {
+ key constraint-type;
+
+ leaf constraint-type {
+ type identityref {
+ base transport-constraint;
+ }
+ description
+ "Constraint type to be applied.";
+ }
+ leaf constraint-opaque-value {
+ type string;
+ description
+ "Opaque value that can be used to
+ specify constraint parameters.";
+ }
+ description
+ "List of constraints";
+ }
+ description
+ "Grouping for transport constraint.";
+ }
+
+ grouping transport-constraints {
+ container transport-constraints {
+ if-feature traffic-engineering;
+ container unicast-transport-constraints {
+ list constraint {
+ key constraint-id;
+
+ leaf constraint-id {
+ type svc-id;
+ description
+ "Defines an ID for the constraint
+ rule.";
+ }
+
+ leaf site1 {
+ type svc-id;
+ description
+ "The ID refers to one site end.";
+ }
+ leaf site2 {
+ type svc-id;
+ description
+ "The ID refers to the other
+ site end.";
+ }
+ uses transport-constraint-profile;
+ description
+ "List of constraints.
+ Constraints are bidirectional.";
+ }
+ description
+ "Unicast transport constraints.";
+ }
+ container multicast-transport-constraints {
+ if-feature traffic-engineering-multicast;
+ list constraint {
+ key constraint-id;
+
+ leaf constraint-id {
+ type svc-id;
+ description
+ "Defines an ID for the constraint
+ rule.";
+ }
+
+ leaf src-site {
+ type svc-id;
+ description
+ "The ID refers to source site.";
+ }
+ leaf dst-site {
+ type svc-id;
+ description
+ "The ID refers to the receiver
+ site.";
+ }
+ uses transport-constraint-profile;
+ description
+ "List of constraints.
+ Constraints are unidirectional.";
+ }
+ description
+ "Multicast transport constraints.";
+ }
+ description
+ "transport constraints.";
+ }
+ description
+ "Grouping for transport constraints
+ description.";
+ }
+
+ grouping vpn-extranet {
+ container extranet-vpns {
+ if-feature extranet-vpn;
+ list extranet-vpn {
+ key vpn-id;
+
+ leaf vpn-id {
+ type svc-id;
+ description
+ "Identifies the target VPN";
+ }
+ leaf local-sites-role {
+ type identityref {
+ base site-role;
+ }
+ description
+ "This describes the role of the
+ local sites in the target VPN topology.";
+ }
+ description
+ "List of extranet VPNs the local
+ VPN is attached to.";
+ }
+ description
+ "Container for extranet vpn cfg.";
+ }
+ description
+ "grouping for extranet VPN configuration.
+ Extranet provides a way to interconnect all sites
+ from two VPNs in a easy way.";
+ }
+
+ grouping site-attachment-availability {
+ container availability {
+ leaf access-priority {
+ type uint32;
+ default 1;
+ description
+ "Defines the priority for the access.
+ The highest the priority value is,
+ the highest the
+ preference of the access is.";
+ }
+ description
+ "Availability parameters
+ (used for multihoming)";
+ }
+ description
+ "Defines site availability parameters.";
+ }
+
+ grouping access-vpn-policy {
+ container vpn-attachment {
+ choice attachment-flavor {
+ case vpn-policy-id {
+ leaf vpn-policy-id {
+ type leafref {
+ path "/l3vpn-svc/sites/site/"+
+ "vpn-policy-list/vpn-policy/"+
+ "vpn-policy-id";
+ }
+ description
+ "Reference to a VPN policy.";
+ }
+ }
+ case vpn-id {
+ leaf vpn-id {
+ type leafref {
+ path "/l3vpn-svc/vpn-services"+
+ "/vpn-svc/vpn-id";
+ }
+ description
+ "Reference to a VPN.";
+ }
+ leaf site-role {
+ type identityref {
+ base site-role;
+ }
+ mandatory true;
+ description
+ "Role of the site in the IPVPN.";
+ }
+ }
+ mandatory true;
+ description
+ "Choice for VPN attachment flavor.";
+ }
+ description
+ "Defines VPN attachment of a site.";
+ }
+ description
+ "Defines the VPN attachment rules
+ for a site logical access.";
+ }
+
+ grouping vpn-svc-cfg {
+ leaf vpn-id {
+ type svc-id;
+ description
+ "VPN identifier. Local administration meaning.";
+ }
+ leaf customer-name {
+ type string;
+ description
+ "Name of the customer.";
+ }
+ leaf topology {
+ type identityref {
+ base vpn-topology;
+ }
+ default "any-to-any";
+ description
+ "VPN topology.";
+ }
+
+ uses vpn-service-cloud-access;
+ uses vpn-service-multicast;
+ uses vpn-service-mpls;
+ uses transport-constraints;
+ uses vpn-extranet;
+
+ description
+ "grouping for vpn-svc configuration.";
+ }
+
+ grouping site-top-level-cfg {
+ uses operational-requirements;
+ uses customer-location-info;
+ uses site-diversity;
+ uses site-management;
+ uses site-vpn-policy;
+ uses site-vpn-flavor-profile;
+ uses site-maximum-routes;
+ uses site-security;
+ uses site-service;
+ uses site-protection;
+ uses site-routing;
+
+ description
+ "Grouping for site top level cfg.";
+ }
+
+ grouping site-network-access-top-level-cfg {
+ leaf site-network-access-type {
+ type identityref {
+ base site-network-access-type;
+ }
+ default "point-to-point";
+ description
+ "Describes the type of connection, e.g. :
+ point-to-point or multipoint";
+ }
+ uses access-diversity;
+ uses site-attachment-bearer;
+ uses site-attachment-ip-connection;
+ uses site-security;
+ uses site-service;
+ uses site-routing;
+ uses site-attachment-availability;
+ uses access-vpn-policy;
+
+ description
+ "Grouping for site network access
+ top level cfg.";
+ }
+
+ /* Main blocks */
+
+ container l3vpn-svc {
+ container vpn-services {
+ list vpn-svc {
+ key vpn-id;
+
+ uses vpn-svc-cfg;
+
+ description "
+ List of VPN services.
+
+ ";
+ }
+ description
+ "top level container
+ for the VPN services.";
+ }
+
+ container sites {
+ list site {
+ key site-id;
+
+ leaf site-id {
+ type svc-id;
+ description
+ "Identifier of the site.";
+ }
+
+ uses site-top-level-cfg;
+ uses operational-requirements-ops;
+
+ container site-network-accesses {
+ list site-network-access {
+ key site-network-access-id;
+
+ leaf site-network-access-id {
+ type svc-id;
+ description
+ "Identifier for the access";
+ }
+ uses site-network-access-top-level-cfg;
+
+ description
+ "List of accesses for a site.";
+ }
+ description
+ "List of accesses for a site.";
+ }
+
+ description "List of sites.";
+ }
+ description
+ "Container for sites";
+ }
+
+ description
+ "Main container for L3VPN service configuration.";
+ }
+}
\ No newline at end of file
diff --git a/apps/l3vpn/yangmodel/src/main/yang/ietf-yang-types.yang b/apps/l3vpn/yangmodel/src/main/yang/ietf-yang-types.yang
new file mode 100755
index 0000000..3f87464
--- /dev/null
+++ b/apps/l3vpn/yangmodel/src/main/yang/ietf-yang-types.yang
@@ -0,0 +1,473 @@
+module ietf-yang-types {
+
+ namespace "urn:ietf:params:xml:ns:yang:ietf-yang-types";
+ prefix "yang";
+
+ organization
+ "IETF NETMOD (NETCONF Data Modeling Language) Working Group";
+
+ contact
+ "WG Web: <http://tools.ietf.org/wg/netmod/>
+ WG List: <mailto:netmod@ietf.org>
+
+ WG Chair: David Kessens
+ <mailto:david.kessens@nsn.com>
+
+ WG Chair: Juergen Schoenwaelder
+ <mailto:j.schoenwaelder@jacobs-university.de>
+
+ Editor: Juergen Schoenwaelder
+ <mailto:j.schoenwaelder@jacobs-university.de>";
+
+ description
+ "This module contains a collection of generally useful derived
+ YANG data types.
+
+ Copyright (c) 2013 IETF Trust and the persons identified as
+ authors of the code. All rights reserved.
+
+ Redistribution and use in source and binary forms, with or
+ without modification, is permitted pursuant to, and subject
+ to the license terms contained in, the Simplified BSD License
+ set forth in Section 4.c of the IETF Trust's Legal Provisions
+ Relating to IETF Documents
+ (http://trustee.ietf.org/license-info).
+
+ This version of this YANG module is part of RFC 6991; see
+ the RFC itself for full legal notices.";
+
+ revision 2013-07-15 {
+ description
+ "This revision adds the following new data types:
+ - yang-identifier
+ - hex-string
+ - uuid
+ - dotted-quad";
+ reference
+ "RFC 6991: Common YANG Data Types";
+ }
+
+ revision 2010-09-24 {
+ description
+ "Initial revision.";
+ reference
+ "RFC 6021: Common YANG Data Types";
+ }
+
+ /*** collection of counter and gauge types ***/
+
+ typedef counter32 {
+ type uint32;
+ description
+ "The counter32 type represents a non-negative integer
+ that monotonically increases until it reaches a
+ maximum value of 2^32-1 (4294967295 decimal), when it
+ wraps around and starts increasing again from zero.
+
+ Counters have no defined 'initial' value, and thus, a
+ single value of a counter has (in general) no information
+ content. Discontinuities in the monotonically increasing
+ value normally occur at re-initialization of the
+ management system, and at other times as specified in the
+ description of a schema node using this type. If such
+ other times can occur, for example, the creation of
+ a schema node of type counter32 at times other than
+ re-initialization, then a corresponding schema node
+ should be defined, with an appropriate type, to indicate
+ the last discontinuity.
+
+ The counter32 type should not be used for configuration
+ schema nodes. A default statement SHOULD NOT be used in
+ combination with the type counter32.
+
+ In the value set and its semantics, this type is equivalent
+ to the Counter32 type of the SMIv2.";
+ reference
+ "RFC 2578: Structure of Management Information Version 2
+ (SMIv2)";
+ }
+
+ typedef zero-based-counter32 {
+ type yang:counter32;
+ default "0";
+ description
+ "The zero-based-counter32 type represents a counter32
+ that has the defined 'initial' value zero.
+
+ A schema node of this type will be set to zero (0) on creation
+ and will thereafter increase monotonically until it reaches
+ a maximum value of 2^32-1 (4294967295 decimal), when it
+ wraps around and starts increasing again from zero.
+
+ Provided that an application discovers a new schema node
+ of this type within the minimum time to wrap, it can use the
+ 'initial' value as a delta. It is important for a management
+ station to be aware of this minimum time and the actual time
+ between polls, and to discard data if the actual time is too
+ long or there is no defined minimum time.
+ In the value set and its semantics, this type is equivalent
+ to the ZeroBasedCounter32 textual convention of the SMIv2.";
+ reference
+ "RFC 4502: Remote Network Monitoring Management Information
+ Base Version 2";
+ }
+
+ typedef counter64 {
+ type uint64;
+ description
+ "The counter64 type represents a non-negative integer
+ that monotonically increases until it reaches a
+ maximum value of 2^64-1 (18446744073709551615 decimal),
+ when it wraps around and starts increasing again from zero.
+
+ Counters have no defined 'initial' value, and thus, a
+ single value of a counter has (in general) no information
+ content. Discontinuities in the monotonically increasing
+ value normally occur at re-initialization of the
+ management system, and at other times as specified in the
+ description of a schema node using this type. If such
+ other times can occur, for example, the creation of
+ a schema node of type counter64 at times other than
+ re-initialization, then a corresponding schema node
+ should be defined, with an appropriate type, to indicate
+ the last discontinuity.
+
+ The counter64 type should not be used for configuration
+ schema nodes. A default statement SHOULD NOT be used in
+ combination with the type counter64.
+
+ In the value set and its semantics, this type is equivalent
+ to the Counter64 type of the SMIv2.";
+ reference
+ "RFC 2578: Structure of Management Information Version 2
+ (SMIv2)";
+ }
+
+ typedef zero-based-counter64 {
+ type yang:counter64;
+ default "0";
+ description
+ "The zero-based-counter64 type represents a counter64 that
+ has the defined 'initial' value zero.
+ A schema node of this type will be set to zero (0) on creation
+ and will thereafter increase monotonically until it reaches
+ a maximum value of 2^64-1 (18446744073709551615 decimal),
+ when it wraps around and starts increasing again from zero.
+
+ Provided that an application discovers a new schema node
+ of this type within the minimum time to wrap, it can use the
+ 'initial' value as a delta. It is important for a management
+ station to be aware of this minimum time and the actual time
+ between polls, and to discard data if the actual time is too
+ long or there is no defined minimum time.
+
+ In the value set and its semantics, this type is equivalent
+ to the ZeroBasedCounter64 textual convention of the SMIv2.";
+ reference
+ "RFC 2856: Textual Conventions for Additional High Capacity
+ Data Types";
+ }
+
+ typedef gauge32 {
+ type uint32;
+ description
+ "The gauge32 type represents a non-negative integer, which
+ may increase or decrease, but shall never exceed a maximum
+ value, nor fall below a minimum value. The maximum value
+ cannot be greater than 2^32-1 (4294967295 decimal), and
+ the minimum value cannot be smaller than 0. The value of
+ a gauge32 has its maximum value whenever the information
+ being modeled is greater than or equal to its maximum
+ value, and has its minimum value whenever the information
+ being modeled is smaller than or equal to its minimum value.
+ If the information being modeled subsequently decreases
+ below (increases above) the maximum (minimum) value, the
+ gauge32 also decreases (increases).
+
+ In the value set and its semantics, this type is equivalent
+ to the Gauge32 type of the SMIv2.";
+ reference
+ "RFC 2578: Structure of Management Information Version 2
+ (SMIv2)";
+ }
+
+ typedef gauge64 {
+ type uint64;
+ description
+ "The gauge64 type represents a non-negative integer, which
+ may increase or decrease, but shall never exceed a maximum
+ value, nor fall below a minimum value. The maximum value
+ cannot be greater than 2^64-1 (18446744073709551615), and
+ the minimum value cannot be smaller than 0. The value of
+ a gauge64 has its maximum value whenever the information
+ being modeled is greater than or equal to its maximum
+ value, and has its minimum value whenever the information
+ being modeled is smaller than or equal to its minimum value.
+ If the information being modeled subsequently decreases
+ below (increases above) the maximum (minimum) value, the
+ gauge64 also decreases (increases).
+
+ In the value set and its semantics, this type is equivalent
+ to the CounterBasedGauge64 SMIv2 textual convention defined
+ in RFC 2856";
+ reference
+ "RFC 2856: Textual Conventions for Additional High Capacity
+ Data Types";
+ }
+
+ /*** collection of identifier-related types ***/
+
+ typedef object-identifier {
+ type string {
+ pattern '(([0-1](\.[1-3]?[0-9]))|(2\.(0|([1-9]\d*))))'
+ + '(\.(0|([1-9]\d*)))*';
+ }
+ description
+ "The object-identifier type represents administratively
+ assigned names in a registration-hierarchical-name tree.
+
+ Values of this type are denoted as a sequence of numerical
+ non-negative sub-identifier values. Each sub-identifier
+ value MUST NOT exceed 2^32-1 (4294967295). Sub-identifiers
+ are separated by single dots and without any intermediate
+ whitespace.
+
+ The ASN.1 standard restricts the value space of the first
+ sub-identifier to 0, 1, or 2. Furthermore, the value space
+ of the second sub-identifier is restricted to the range
+ 0 to 39 if the first sub-identifier is 0 or 1. Finally,
+ the ASN.1 standard requires that an object identifier
+ has always at least two sub-identifiers. The pattern
+ captures these restrictions.
+
+ Although the number of sub-identifiers is not limited,
+ module designers should realize that there may be
+ implementations that stick with the SMIv2 limit of 128
+ sub-identifiers.
+
+ This type is a superset of the SMIv2 OBJECT IDENTIFIER type
+ since it is not restricted to 128 sub-identifiers. Hence,
+ this type SHOULD NOT be used to represent the SMIv2 OBJECT
+ IDENTIFIER type; the object-identifier-128 type SHOULD be
+ used instead.";
+ reference
+ "ISO9834-1: Information technology -- Open Systems
+ Interconnection -- Procedures for the operation of OSI
+ Registration Authorities: General procedures and top
+ arcs of the ASN.1 Object Identifier tree";
+ }
+
+ typedef object-identifier-128 {
+ type object-identifier {
+ pattern '\d*(\.\d*){1,127}';
+ }
+ description
+ "This type represents object-identifiers restricted to 128
+ sub-identifiers.
+
+ In the value set and its semantics, this type is equivalent
+ to the OBJECT IDENTIFIER type of the SMIv2.";
+ reference
+ "RFC 2578: Structure of Management Information Version 2
+ (SMIv2)";
+ }
+
+ typedef yang-identifier {
+ type string {
+ length "1..max";
+ pattern '[a-zA-Z_][a-zA-Z0-9\-_.]*';
+ pattern '.|..|[^xX].*|.[^mM].*|..[^lL].*';
+ }
+ description
+ "A YANG identifier string as defined by the 'identifier'
+ rule in Section 12 of RFC 6020. An identifier must
+ start with an alphabetic character or an underscore
+ followed by an arbitrary sequence of alphabetic or
+ numeric characters, underscores, hyphens, or dots.
+
+ A YANG identifier MUST NOT start with any possible
+ combination of the lowercase or uppercase character
+ sequence 'xml'.";
+ reference
+ "RFC 6020: YANG - A Data Modeling Language for the Network
+ Configuration Protocol (NETCONF)";
+ }
+
+ /*** collection of types related to date and time***/
+
+ typedef date-and-time {
+ type string {
+ pattern '\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d+)?'
+ + '(Z|[\+\-]\d{2}:\d{2})';
+ }
+ description
+ "The date-and-time type is a profile of the ISO 8601
+ standard for representation of dates and times using the
+ Gregorian calendar. The profile is defined by the
+ date-time production in Section 5.6 of RFC 3339.
+
+ The date-and-time type is compatible with the dateTime XML
+ schema type with the following notable exceptions:
+
+ (a) The date-and-time type does not allow negative years.
+
+ (b) The date-and-time time-offset -00:00 indicates an unknown
+ time zone (see RFC 3339) while -00:00 and +00:00 and Z
+ all represent the same time zone in dateTime.
+
+ (c) The canonical format (see below) of data-and-time values
+ differs from the canonical format used by the dateTime XML
+ schema type, which requires all times to be in UTC using
+ the time-offset 'Z'.
+
+ This type is not equivalent to the DateAndTime textual
+ convention of the SMIv2 since RFC 3339 uses a different
+ separator between full-date and full-time and provides
+ higher resolution of time-secfrac.
+
+ The canonical format for date-and-time values with a known time
+ zone uses a numeric time zone offset that is calculated using
+ the device's configured known offset to UTC time. A change of
+ the device's offset to UTC time will cause date-and-time values
+ to change accordingly. Such changes might happen periodically
+ in case a server follows automatically daylight saving time
+ (DST) time zone offset changes. The canonical format for
+ date-and-time values with an unknown time zone (usually
+ referring to the notion of local time) uses the time-offset
+ -00:00.";
+ reference
+ "RFC 3339: Date and Time on the Internet: Timestamps
+ RFC 2579: Textual Conventions for SMIv2
+ XSD-TYPES: XML Schema Part 2: Datatypes Second Edition";
+ }
+
+ typedef timeticks {
+ type uint32;
+ description
+ "The timeticks type represents a non-negative integer that
+ represents the time, modulo 2^32 (4294967296 decimal), in
+ hundredths of a second between two epochs. When a schema
+ node is defined that uses this type, the description of
+ the schema node identifies both of the reference epochs.
+
+ In the value set and its semantics, this type is equivalent
+ to the TimeTicks type of the SMIv2.";
+ reference
+ "RFC 2578: Structure of Management Information Version 2
+ (SMIv2)";
+ }
+
+ typedef timestamp {
+ type yang:timeticks;
+ description
+ "The timestamp type represents the value of an associated
+ timeticks schema node at which a specific occurrence
+ happened. The specific occurrence must be defined in the
+ description of any schema node defined using this type. When
+ the specific occurrence occurred prior to the last time the
+ associated timeticks attribute was zero, then the timestamp
+ value is zero. Note that this requires all timestamp values
+ to be reset to zero when the value of the associated timeticks
+ attribute reaches 497+ days and wraps around to zero.
+
+ The associated timeticks schema node must be specified
+ in the description of any schema node using this type.
+
+ In the value set and its semantics, this type is equivalent
+ to the TimeStamp textual convention of the SMIv2.";
+ reference
+ "RFC 2579: Textual Conventions for SMIv2";
+ }
+
+ /*** collection of generic address types ***/
+
+ typedef phys-address {
+ type string {
+ pattern '([0-9a-fA-F]{2}(:[0-9a-fA-F]{2})*)?';
+ }
+
+ description
+ "Represents media- or physical-level addresses represented
+ as a sequence octets, each octet represented by two hexadecimal
+ numbers. Octets are separated by colons. The canonical
+ representation uses lowercase characters.
+
+ In the value set and its semantics, this type is equivalent
+ to the PhysAddress textual convention of the SMIv2.";
+ reference
+ "RFC 2579: Textual Conventions for SMIv2";
+ }
+
+ typedef mac-address {
+ type string {
+ pattern '[0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){5}';
+ }
+ description
+ "The mac-address type represents an IEEE 802 MAC address.
+ The canonical representation uses lowercase characters.
+
+ In the value set and its semantics, this type is equivalent
+ to the MacAddress textual convention of the SMIv2.";
+ reference
+ "IEEE 802: IEEE Standard for Local and Metropolitan Area
+ Networks: Overview and Architecture
+ RFC 2579: Textual Conventions for SMIv2";
+ }
+
+ /*** collection of XML-specific types ***/
+
+ typedef xpath1.0 {
+ type string;
+ description
+ "This type represents an XPATH 1.0 expression.
+
+ When a schema node is defined that uses this type, the
+ description of the schema node MUST specify the XPath
+ context in which the XPath expression is evaluated.";
+ reference
+ "XPATH: XML Path Language (XPath) Version 1.0";
+ }
+
+ /*** collection of string types ***/
+
+ typedef hex-string {
+ type string {
+ pattern '([0-9a-fA-F]{2}(:[0-9a-fA-F]{2})*)?';
+ }
+
+ description
+ "A hexadecimal string with octets represented as hex digits
+ separated by colons. The canonical representation uses
+ lowercase characters.";
+ }
+
+ typedef uuid {
+ type string {
+ pattern '[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-'
+ + '[0-9a-fA-F]{4}-[0-9a-fA-F]{12}';
+ }
+ description
+ "A Universally Unique IDentifier in the string representation
+ defined in RFC 4122. The canonical representation uses
+ lowercase characters.
+
+ The following is an example of a UUID in string representation:
+ f81d4fae-7dec-11d0-a765-00a0c91e6bf6
+ ";
+ reference
+ "RFC 4122: A Universally Unique IDentifier (UUID) URN
+ Namespace";
+ }
+
+ typedef dotted-quad {
+ type string {
+ pattern
+ '(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}'
+ + '([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])';
+ }
+ description
+ "An unsigned 32-bit number expressed in the dotted-quad
+ notation, i.e., four octets written as decimal numbers
+ and separated with the '.' (full stop) character.";
+ }
+ }
\ No newline at end of file
diff --git a/apps/l3vpn/yangmodel/src/main/yang/l3vpn-svc-ext@2016-07-30.yang b/apps/l3vpn/yangmodel/src/main/yang/l3vpn-svc-ext@2016-07-30.yang
new file mode 100644
index 0000000..e3fecb6
--- /dev/null
+++ b/apps/l3vpn/yangmodel/src/main/yang/l3vpn-svc-ext@2016-07-30.yang
@@ -0,0 +1,362 @@
+module l3vpn-svc-ext {
+ yang-version 1;
+ namespace "urn:ietf:params:xml:ns:yang:l3vpn:svc:ext";
+ prefix "l3vpn-svc-ext";
+
+ import ietf-inet-types { prefix inet; }
+ import ietf-l3vpn-svc { prefix l3vpn; }
+
+ revision 2016-07-30 {
+ description
+ "Eliminated warnings";
+ }
+
+ revision "2016-07-20" {
+ description "Initial revision of extended l3vpn yang model";
+ }
+
+ typedef short-as-number {
+ type inet:as-number {
+ range 0..65535;
+ }
+ }
+
+ typedef route-distinguisher {
+ reference "https://tools.ietf.org/html/rfc4364#section-4.2";
+ type union {
+ type rd-ipv4;
+ type rd-as;
+ type rd-as2;
+ }
+ }
+
+ typedef rd-ipv4 {
+ type string {
+ /* IPv4 : 2B number */
+ pattern '((([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}'
+ + '([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5]))'
+ + ':'
+ + '([0-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|'
+ + '[1-5][0-9][0-9][0-9][0-9]|6[0-4][0-9][0-9][0-9]|'
+ + '65[0-4][0-9][0-9]|655[0-2][0-9]|6553[0-5])';
+ }
+ }
+
+ typedef rd-as {
+ type string {
+ /* 2B AS : 4B number */
+ pattern '([0-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|'
+ + '[1-5][0-9][0-9][0-9][0-9]|6[0-4][0-9][0-9][0-9]|'
+ + '65[0-4][0-9][0-9]|655[0-2][0-9]|6553[0-5])'
+ + ':'
+ + '([0-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|'
+ + '[1-9][0-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9][0-9]|'
+ + '[1-9][0-9][0-9][0-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]|'
+ + '[1-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]|[1-3][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]|'
+ + '4[0-1][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]|42[0-8][0-9][0-9][0-9][0-9][0-9][0-9][0-9]|'
+ + '429[0-3][0-9][0-9][0-9][0-9][0-9][0-9]|4294[0-8][0-9][0-9][0-9][0-9][0-9]|'
+ + '42949[0-5][0-9][0-9][0-9][0-9]|429496[0-6][0-9][0-9][0-9]|4294967[0-1][0-9][0-9]|'
+ + '42949672[0-8][0-9]|429496729[0-5])';
+ }
+ }
+
+ typedef rd-as2 {
+ type string {
+ /* 4B AS : 2B number */
+ pattern '([0-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|'
+ + '[1-9][0-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9][0-9]|'
+ + '[1-9][0-9][0-9][0-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]|'
+ + '[1-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]|[1-3][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]|'
+ + '4[0-1][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]|42[0-8][0-9][0-9][0-9][0-9][0-9][0-9][0-9]|'
+ + '429[0-3][0-9][0-9][0-9][0-9][0-9][0-9]|4294[0-8][0-9][0-9][0-9][0-9][0-9]|'
+ + '42949[0-5][0-9][0-9][0-9][0-9]|429496[0-6][0-9][0-9][0-9]|4294967[0-1][0-9][0-9]|'
+ + '42949672[0-8][0-9]|429496729[0-5])'
+ + ':'
+ + '([0-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|'
+ + '[1-5][0-9][0-9][0-9][0-9]|6[0-4][0-9][0-9][0-9]|'
+ + '65[0-4][0-9][0-9]|655[0-2][0-9]|6553[0-5])';
+ }
+ }
+
+ identity tc-demanded-tunnel {
+ base l3vpn:transport-constraint;
+ description "on-demand tunnel.";
+ }
+
+ grouping class-profile {
+ list qos-class {
+ key class-id;
+ leaf class-id {
+ type string;
+ description
+ "Identification of the
+ class of service.
+ This identifier is internal to
+ the administration.";
+ }
+ leaf rate-limit {
+ type uint8;
+ units percent;
+ description
+ "To be used if class must
+ be rate
+ limited. Expressed as
+ percentage of the svc-bw.";
+ }
+ leaf priority-level {
+ type uint8;
+ description
+ "Defines the level of the
+ class in
+ term of priority queueing.
+ The higher the level is the
+ higher
+ is the priority.";
+ }
+ leaf guaranteed-bw-percent {
+ type uint8;
+ units percent;
+ description
+ "To be used to define the
+ guaranteed
+ BW in percent of the svc-bw
+ available at the priority-level.";
+ }
+ description
+ "List of class of services.";
+ }
+ }
+
+ augment "/l3vpn:l3vpn-svc/l3vpn:sites/l3vpn:site/l3vpn:site-network-accesses/l3vpn:site-network-access/l3vpn:service/l3vpn:qos/l3vpn:qos-profile/l3vpn:qos-profile" {
+ case custom-unicom {
+ container inbound-classes {
+ uses class-profile;
+ }
+ container outbound-classes {
+ uses class-profile;
+ }
+ }
+ }
+
+ grouping bearer-attachment-grouping {
+ container bearer-attachment {
+ leaf pe-name {
+ type string;
+ }
+ leaf pe-mgmt-ip {
+ type inet:ipv4-address;
+ }
+ description "attached PE";
+ }
+ }
+
+ augment "/l3vpn:l3vpn-svc/l3vpn:sites/l3vpn:site/l3vpn:site-network-accesses/l3vpn:site-network-access/l3vpn:bearer" {
+ uses bearer-attachment-grouping;
+ }
+
+ grouping requested-type-grouping {
+ container requested-type-profile {
+ choice requested-type-choice {
+ case dot1q-case {
+ container dot1q {
+ leaf physical-if {
+ description "physical interface name.";
+ type string;
+ }
+ leaf vlan-id {
+ type uint16 {
+ range "1..4096";
+ }
+ }
+ }
+ }
+ case physical-case {
+ container physical {
+ leaf physical-if {
+ description "physical interface name.";
+ type string;
+ }
+ }
+ }
+ }
+ leaf circuit-id {
+ description "circuit description for PE-CE port.";
+ type string;
+ }
+ }
+ }
+
+ augment "/l3vpn:l3vpn-svc/l3vpn:sites/l3vpn:site/l3vpn:site-network-accesses/l3vpn:site-network-access/l3vpn:bearer/l3vpn:requested-type" {
+ uses requested-type-grouping;
+ }
+
+ grouping bfd-grouping {
+ leaf bfd-enabled {
+ type boolean;
+ description
+ "BFD activation";
+ }
+ choice holdtime {
+ case profile {
+ leaf profile-name {
+ type string;
+ description
+ "Service provider well
+ known profile.";
+ }
+ description
+ "Service provider well
+ known profile.";
+ }
+ case fixed {
+ leaf fixed-value {
+ type uint32;
+ units msec;
+ description
+ "Expected holdtime
+ expressed
+ in msec.";
+ }
+ }
+ case dynamic {
+ container dynamic-value {
+ leaf interval {
+ type uint16;
+ units msec;
+ default 500;
+ }
+ leaf multiplier {
+ type uint16;
+ default 3;
+ }
+ description
+ "interval * multiplier is
+ timeout value.";
+ }
+ }
+ }
+ }
+
+ grouping bgp-profile {
+ leaf as-override {
+ type boolean;
+ default false;
+ }
+ container soo {
+ leaf soo-enabled {
+ type boolean;
+ }
+ leaf soo-value {
+ type string;
+ }
+ }
+ container password {
+ leaf password-enabled {
+ type boolean;
+ }
+ leaf password-value {
+ type string;
+ }
+ }
+ container bgp-timer {
+ leaf keep-alive {
+ type uint16;
+ default 60;
+ units "seconds";
+ }
+ leaf hold-time {
+ type uint16;
+ default 180;
+ units "seconds";
+ }
+ }
+ container bfd {
+ uses bfd-grouping;
+ }
+ }
+
+ augment "/l3vpn:l3vpn-svc/l3vpn:sites/l3vpn:site/l3vpn:site-network-accesses/l3vpn:site-network-access/l3vpn:routing-protocols/l3vpn:routing-protocol/l3vpn:bgp" {
+ uses bgp-profile;
+ }
+
+ augment "/l3vpn:l3vpn-svc/l3vpn:vpn-services/l3vpn:vpn-svc/l3vpn:transport-constraints/l3vpn:unicast-transport-constraints/l3vpn:constraint/l3vpn:constraint-list" {
+ leaf constraint-opaque-value2 {
+ type string;
+ description
+ "Opaque value that can be used to
+ specify constraint parameters.";
+ }
+ }
+
+ grouping route-ipv4-extended-community {
+ reference "http://tools.ietf.org/html/rfc4360";
+ leaf global-administrator {
+ type inet:ipv4-address;
+ }
+ leaf local-administrator {
+ type uint16;
+ }
+ }
+
+ grouping extended-community {
+ choice extended-community {
+ reference "http://tools.ietf.org/html/rfc4360#section-4";
+ default route-target-extended-community-case;
+ case route-target-extended-community-case {
+ container route-target-extended-community {
+ leaf global-administrator {
+ type short-as-number;
+ }
+ leaf local-administrator {
+ type uint32;
+ }
+ }
+ }
+ case route-target-ipv4-case {
+ container route-target-ipv4 {
+ uses route-ipv4-extended-community;
+ }
+ }
+ case route-target-extended-community-case2 {
+ container route-target-extended-community2 {
+ leaf global-administrator {
+ type uint32;
+ }
+ leaf local-administrator {
+ type uint16;
+ }
+ }
+ }
+ }
+ }
+
+ grouping rdrt-profile {
+ choice site-role {
+ case custom-case {
+ container custom {
+ list import-rt {
+ key imrt-id;
+ leaf imrt-id {
+ type string;
+ }
+ uses extended-community;
+ }
+ list export-rt {
+ key exrt-id;
+ leaf exrt-id {
+ type string;
+ }
+ uses extended-community;
+ }
+ leaf rd {
+ type route-distinguisher;
+ }
+ }
+ }
+ }
+ }
+
+ augment "/l3vpn:l3vpn-svc/l3vpn:sites/l3vpn:site/l3vpn:site-network-accesses/l3vpn:site-network-access/l3vpn:vpn-attachment" {
+ uses rdrt-profile;
+ }
+}
\ No newline at end of file