HC2VPP-256: MPLS API 44/9044/6
authorMarek Gradzki <mgradzki@cisco.com>
Wed, 25 Oct 2017 08:45:48 +0000 (10:45 +0200)
committerMarek Gradzki <mgradzki@cisco.com>
Mon, 6 Nov 2017 06:46:08 +0000 (06:46 +0000)
Adds following models:
- hc2vpp-ietf-mpls
- hc2vpp-ietf-mpls-static
- hc2vpp-ietf-routing-types

Models were modified due to YANGTOOLS/MDSAL issues
and some problems with the models itself.
More information can be found in the YANG files.

Original YANG files were downloaded from

https://github.com/ietf-mpls-yang/te/

Change-Id: I3d04a3bf8be026fbe74a6f5833d38e980490e737
Signed-off-by: Marek Gradzki <mgradzki@cisco.com>
mpls/api/asciidoc/Readme.adoc [new file with mode: 0644]
mpls/api/pom.xml [new file with mode: 0644]
mpls/api/src/main/yang/hc2vpp-ietf-mpls-static@2017-03-10.yang [new file with mode: 0644]
mpls/api/src/main/yang/hc2vpp-ietf-mpls@2017-07-02.yang [new file with mode: 0644]
mpls/api/src/main/yang/hc2vpp-ietf-routing-types@2017-02-27.yang [new file with mode: 0644]
mpls/asciidoc/Readme.adoc [new file with mode: 0644]
mpls/pom.xml [new file with mode: 0644]
pom.xml

diff --git a/mpls/api/asciidoc/Readme.adoc b/mpls/api/asciidoc/Readme.adoc
new file mode 100644 (file)
index 0000000..35ae1b0
--- /dev/null
@@ -0,0 +1,14 @@
+= mpls-api
+
+Hc2vpp implementation of MPLS uses following ietf models:
+- ietf-mpls
+- ietf-mpls-static
+- ietf-routing-types
+
+Models were modified due to YANGTOOLS/MDSAL issues
+and some problems with the models itself.
+More information can be found in yang files.
+
+Original YANG files were downloaded from
+
+https://github.com/ietf-mpls-yang/te/
\ No newline at end of file
diff --git a/mpls/api/pom.xml b/mpls/api/pom.xml
new file mode 100644 (file)
index 0000000..8c4f814
--- /dev/null
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (c) 2017 Cisco and/or its affiliates.
+ 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>io.fd.hc2vpp.common</groupId>
+        <artifactId>api-parent</artifactId>
+        <version>1.18.01-SNAPSHOT</version>
+        <relativePath>../../common/api-parent</relativePath>
+    </parent>
+
+    <groupId>io.fd.hc2vpp.mpls</groupId>
+    <artifactId>mpls-api</artifactId>
+    <name>${project.artifactId}</name>
+    <version>1.18.01-SNAPSHOT</version>
+
+    <dependencies>
+        <dependency>
+            <groupId>io.fd.hc2vpp.routing</groupId>
+            <artifactId>routing-api</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.opendaylight.mdsal.model</groupId>
+            <artifactId>ietf-inet-types-2013-07-15</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.opendaylight.mdsal.model</groupId>
+            <artifactId>ietf-interfaces</artifactId>
+        </dependency>
+    </dependencies>
+</project>
\ No newline at end of file
diff --git a/mpls/api/src/main/yang/hc2vpp-ietf-mpls-static@2017-03-10.yang b/mpls/api/src/main/yang/hc2vpp-ietf-mpls-static@2017-03-10.yang
new file mode 100644 (file)
index 0000000..143d870
--- /dev/null
@@ -0,0 +1,317 @@
+module hc2vpp-ietf-mpls-static {
+
+  namespace "urn:ietf:params:xml:ns:yang:ietf-mpls-static";
+
+  prefix "mpls-static";
+
+  import hc2vpp-ietf-mpls {
+    prefix mpls;
+  }
+
+/*
+  TODO: changed to modified version of ietf-routing that we use
+  Set back to ietf-routing after HC2VPP-253 is resolved.
+*/
+  import hc2vpp-ietf-routing {
+    prefix "rt";
+  }
+
+  import hc2vpp-ietf-routing-types {
+    prefix "rt-types";
+  }
+
+  import ietf-inet-types {
+    prefix inet;
+  }
+
+  import ietf-interfaces {
+    prefix "if";
+  }
+
+  /* Import TE generic types */
+  /*
+  Yangtools has some issues with ietf-te model.
+  There is no plan to support tunnels currently, so we simply comment this out.
+  TODO: remove comment after following issues are resolved:
+  https://jira.opendaylight.org/browse/MDSAL-182
+  https://jira.opendaylight.org/browse/YANGTOOLS-677
+
+  import ietf-te {
+    prefix te;
+  }
+*/
+
+  organization "IETF MPLS Working Group";
+
+  contact
+    "WG Web:   <http://tools.ietf.org/wg/mpls/>
+
+     WG List:  <mailto:mpls@ietf.org>
+
+     WG Chair: Loa Andersson
+               <mailto:loa@pi.nu>
+
+     WG Chair: Ross Callon
+               <mailto:rcallon@juniper.net>
+
+     WG Chair: George Swallow
+               <mailto:swallow.ietf@gmail.com>
+
+     Editor:   Tarek Saad
+               <mailto:tsaad@cisco.com>
+
+     Editor:   Kamran Raza
+               <mailto:skraza@cisco.com>
+
+     Editor:   Rakesh Gandhi
+               <mailto:rgandhi@cisco.com>
+
+     Editor:   Xufeng Liu
+               <mailto: xufeng.liu.ietf@gmail.com>
+
+     Editor:   Vishnu Pavan Beeram
+               <mailto:vbeeram@juniper.net>
+
+     Editor:   Himanshu Shah
+               <mailto:hshah@ciena.com>
+
+     Editor:   Igor Bryskin
+               <mailto: Igor.Bryskin@huawei.com>
+
+     Editor:   Xia Chen
+               <mailto:jescia.chenxia@huawei.com>
+
+     Editor:   Raqib Jones
+               <mailto:raqib@Brocade.com>
+
+     Editor:   Bin Wen
+               <mailto:Bin_Wen@cable.comcast.com>";
+
+  description
+     "This YANG module augments the 'ietf-routing' module with basic
+     configuration and operational state data for MPLS static";
+
+/*
+TODO: 2017-07-02 defines grouping in-segment but does not use it.
+Bump to newer version after the issue is resolved.
+*/
+  revision "2017-03-10" {
+    description
+      "Latest revision:
+        - Addressed MPLS-RT review comments";
+    reference "RFC 3031: A YANG Data Model for Static MPLS LSPs";
+  }
+
+  typedef static-lsp-ref {
+    type leafref {
+      path "/rt:routing/mpls:mpls/mpls-static:static-lsps/" +
+           "mpls-static:static-lsp/mpls-static:name";
+    }
+    description
+      "This type is used by data models that need to reference
+       configured static LSP.";
+  }
+
+  grouping path-basic_config {
+    description "common definitions for statics";
+
+    leaf next-hop {
+      type inet:ip-address;
+      description "next hop IP address for the LSP";
+    }
+
+    leaf outgoing-label {
+      type rt-types:mpls-label;
+      description
+        "label value to push at the current hop for the
+         LSP";
+    }
+
+    leaf outgoing-interface {
+      type if:interface-ref;
+      description
+        "The outgoing interface";
+    }
+  }
+
+  grouping path-properties_config {
+    description
+      "MPLS path properties";
+    leaf path-index {
+      type uint16;
+      description
+        "Path identifier";
+    }
+
+    leaf backup-path-index {
+      type uint16;
+      description
+        "Backup path identifier";
+    }
+
+    leaf next-hop {
+      type inet:ip-address;
+      description
+        "The address of the next-hop";
+    }
+
+    leaf-list outgoing-labels {
+      type rt-types:mpls-label;
+      ordered-by user;
+      description
+        "The outgoing MPLS labels to impose";
+    }
+
+    leaf outgoing-interface {
+      type if:interface-ref;
+      description
+        "The outgoing interface";
+    }
+
+    leaf loadshare {
+      type uint16;
+      description
+        "This value is used to compute a loadshare to perform un-equal
+         load balancing when multiple outgoing path(s) are specified. A
+         share is computed as a ratio of this number to the total under
+         all configured path(s).";
+    }
+
+    leaf role {
+      type enumeration {
+        enum PRIMARY {
+          description
+            "Path as primary traffic carrying";
+        }
+        enum BACKUP {
+          description
+            "Path acts as backup";
+        }
+        enum PRIMARY_AND_BACKUP {
+          description
+            "Path acts as primary and backup simultaneously";
+        }
+      }
+      description
+        "The MPLS path role";
+    }
+  }
+
+  grouping static-lsp_config {
+    description "common definitions for static LSPs";
+
+    container in-segment {
+      description
+        "MPLS incoming segment";
+      choice type {
+        description
+          "Basic FEC choice";
+        case ip-prefix {
+          leaf ip-prefix {
+            type inet:ip-prefix;
+            description "An IP prefix";
+          }
+        }
+        case mpls-label {
+          leaf incoming-label {
+            type rt-types:mpls-label;
+            description "label value on the incoming packet";
+          }
+        }
+        /*
+        Currently not supported. Commented out due to ODL issues (MDSAL-182, YANGTOOLS-677).
+        case tunnel {
+          leaf tunnel {
+            type te:tunnel-ref;
+            description "TE tunnel FEC mapping";
+          }
+        }
+        */
+      }
+      leaf incoming-interface {
+        type if:interface-ref;
+        description
+          "Optional incoming interface if FEC is restricted
+           to traffic incoming on a specific interface";
+      }
+    }
+
+    leaf operation {
+      type enumeration {
+        enum impose-and-forward {
+          description
+            "Operation impose outgoing label(s) and forward to
+             next-hop";
+        }
+        enum pop-and-forward {
+          description
+            "Operation pop incoming label and forward to next-hop";
+        }
+        enum pop-impose-and-forward {
+          description
+            "Operation pop incoming label, impose one or more
+             outgoing label(s) and forward to next-hop";
+        }
+        enum swap-and-forward {
+          description
+            "Operation swap incoming label, with outgoing label and
+             forward to next-hop";
+        }
+        enum pop-and-lookup {
+          description
+            "Operation pop incoming label and perform a lookup";
+        }
+      }
+      description
+        "The MPLS operation to be executed on the incoming packet";
+    }
+
+    choice out-segment {
+      description "The MPLS out-segment type choice";
+      case simple-path {
+        uses path-basic_config;
+      }
+      case path-list {
+        list paths {
+          key path-index;
+          description
+            "The list of MPLS paths associated with the FEC";
+          uses path-properties_config;
+        }
+      }
+    }
+  }
+
+  grouping static-lsp {
+    description "grouping for top level list of static LSPs";
+    container config {
+      description
+        "Holds the intended configuration";
+      uses static-lsp_config;
+    }
+    container state {
+      config false;
+      description
+        "Holds the state and inuse configuration";
+      uses static-lsp_config;
+    }
+  }
+
+  augment "/rt:routing/mpls:mpls" {
+    description "Augmentations for MPLS Static LSPs";
+    container static-lsps {
+      description
+        "Statically configured LSPs, without dynamic signaling";
+      list static-lsp {
+        key name;
+        description "list of defined static LSPs";
+
+        leaf name {
+          type string;
+          description "name to identify the LSP";
+        }
+        uses static-lsp;
+      }
+    }
+  }
+}
diff --git a/mpls/api/src/main/yang/hc2vpp-ietf-mpls@2017-07-02.yang b/mpls/api/src/main/yang/hc2vpp-ietf-mpls@2017-07-02.yang
new file mode 100644 (file)
index 0000000..7aa1a5c
--- /dev/null
@@ -0,0 +1,397 @@
+module hc2vpp-ietf-mpls {
+
+  namespace "urn:ietf:params:xml:ns:yang:ietf-mpls";
+
+  prefix "mpls";
+
+/*
+  TODO: changed to modified version of ietf-routing that we use
+  Set back to ietf-routing after HC2VPP-253 is resolved.
+*/
+  import hc2vpp-ietf-routing {
+    prefix "rt";
+  }
+
+  import ietf-interfaces {
+    prefix "if";
+  }
+
+  import hc2vpp-ietf-routing-types {
+    prefix "rt-types";
+  }
+
+  organization "IETF MPLS Working Group";
+
+  contact
+    "WG Web:   <http://tools.ietf.org/wg/mpls/>
+
+     WG List:  <mailto:mpls@ietf.org>
+
+     WG Chair: Loa Andersson
+               <mailto:loa@pi.nu>
+
+     WG Chair: Ross Callon
+               <mailto:rcallon@juniper.net>
+
+     WG Chair: George Swallow
+               <mailto:swallow.ietf@gmail.com>
+
+     Editor:   Tarek Saad
+               <mailto:tsaad@cisco.com>
+
+     Editor:   Kamran Raza
+               <mailto:skraza@cisco.com>
+
+     Editor:   Rakesh Gandhi
+               <mailto:rgandhi@cisco.com>
+
+     Editor:   Xufeng Liu
+               <mailto: xufeng.liu.ietf@gmail.com>
+
+     Editor:   Vishnu Pavan Beeram
+               <mailto:vbeeram@juniper.net>
+
+     Editor:   Himanshu Shah
+               <mailto:hshah@ciena.com>
+
+     Editor:   Igor Bryskin
+               <mailto: Igor.Bryskin@huawei.com>
+
+     Editor:   Xia Chen
+               <mailto:jescia.chenxia@huawei.com>
+
+     Editor:   Raqib Jones
+               <mailto:raqib@Brocade.com>
+
+     Editor:   Bin Wen
+               <mailto:Bin_Wen@cable.comcast.com>";
+
+  description
+    "This YANG module defines the essential components for the
+     management of the MPLS subsystem.";
+
+  revision "2017-07-02" {
+    description
+      "Latest revision:
+        - Addressed MPLS-RT review comments";
+    reference "RFC 3031: A YANG Data Model for base MPLS";
+  }
+
+  /* Identities */
+
+  identity mpls {
+    base rt:address-family;
+    description
+      "This identity represents the MPLS address family.";
+  }
+
+  identity label-block-alloc-mode {
+    description
+      "Base identity label-block allocation mode";
+  }
+
+  identity label-block-alloc-mode-manager {
+    base label-block-alloc-mode;
+    description
+      "Label block allocation on reserved block
+       is managed by label manager";
+  }
+
+  identity label-block-alloc-mode-application {
+    base label-block-alloc-mode;
+    description
+      "Label block allocation on reserved block
+       is managed by application";
+  }
+
+  typedef nhlfe-role {
+    type enumeration {
+      enum PRIMARY {
+        description
+          "Next-hop acts as primary traffic carrying";
+      }
+      enum BACKUP {
+        description
+          "Next-hop acts as backup";
+      }
+      enum PRIMARY_AND_BACKUP {
+        description
+          "Next-hop acts as primary and backup simultaneously";
+      }
+    }
+    description "The next-hop role";
+  }
+
+  grouping nhlfe-simple-contents {
+    description
+      "MPLS simple NHLFE contents";
+    list remote-labels {
+      key "index";
+      description "Remote label list";
+      leaf index {
+        type uint8 {
+          range "0..255";
+        }
+        description
+          "Index of the label. Index 0 indicates
+           top of the label stack";
+      }
+      leaf label {
+        type rt-types:mpls-label;
+        description
+          "The outgoing MPLS labels to impose";
+      }
+    }
+  }
+
+  grouping nhlfe-contents {
+    description
+      "MPLS NHLFE contents";
+    leaf index {
+      type string;
+      description
+        "A user-specified identifier utilised to uniquely
+         reference the next-hop entry in the next-hop list.
+         The value of this index has no semantic meaning
+         other than for referencing the entry.";
+    }
+
+    leaf backup-index {
+      type string;
+      description
+        "A user-specified identifier utilised to uniquely
+         reference the backup next-hop entry in the NHLFE list.
+         The value of this index has no semantic meaning
+         other than for referencing the entry.";
+    }
+
+    leaf loadshare {
+      type uint16;
+      description
+        "This value is used to compute a loadshare to perform un-equal
+         load balancing when multiple outgoing next-hop(s) are
+         specified. A share is computed as a ratio of this number to the
+         total under all next-hops(s).";
+    }
+
+    leaf role {
+      type nhlfe-role;
+      description "NHLFE role";
+    }
+    uses nhlfe-simple-contents;
+  }
+
+  grouping interface-mpls_config {
+    description "MPLS interface contents grouping";
+    leaf enabled {
+      type boolean;
+      description
+        "'true' if mpls encapsulation is enabled on the
+         interface. 'false' if mpls encapsulation is enabled
+         on the interface.";
+    }
+    leaf mtu {
+      type uint32;
+      description
+        "MPLS Maximum Transmission Unit (MTU)";
+    }
+  }
+
+  grouping interfaces-mpls {
+    description "List of MPLS interfaces";
+    list interface {
+      key "name";
+      description "List of MPLS interfaces";
+      leaf name {
+        type if:interface-ref;
+        description
+          "The name of a configured MPLS interface";
+      }
+      container config {
+        description "Holds intended configuration";
+        uses interface-mpls_config;
+      }
+      container state {
+        config false;
+        description "Holds inuse configuration";
+        uses interface-mpls_config;
+      }
+    }
+  }
+
+  grouping label-block_config {
+    description "Label-block configuration items";
+    leaf index {
+      type string;
+      description
+        "A user-specified identifier utilised to uniquely
+         reference the next-hop entry in the next-hop list.
+         The value of this index has no semantic meaning
+         other than for referencing the entry.";
+    }
+    leaf start-label {
+      type rt-types:mpls-label;
+      description "Label-block start";
+    }
+    leaf end-label {
+      type rt-types:mpls-label;
+      description "Label-block end";
+    }
+    leaf block-allocation-mode {
+      type identityref {
+        base label-block-alloc-mode;
+      }
+      description "Label-block allocation mode";
+    }
+  }
+
+  grouping label-block_state {
+    description "Label-block state items";
+    leaf free-labels-count {
+      when
+      "../block-allocation-mode = 'label-block-alloc-mode-manager'";
+      type uint32;
+      description "Label-block free labels count";
+    }
+    leaf inuse-labels-count {
+      when
+      "../block-allocation-mode = 'label-block-alloc-mode-manager'";
+      type uint32;
+      description "Label-block inuse labels count";
+    }
+  }
+
+  grouping globals_config {
+    description "MPLS global configuration leafs grouping";
+    leaf ttl-propagate {
+      type boolean;
+      default 'true';
+      description "Propagate TTL between IP and MPLS";
+    }
+  }
+
+  grouping globals {
+    description "MPLS global configuration grouping";
+    container config {
+      description "Holds intended configuration";
+      uses globals_config;
+    }
+    container state {
+      config false;
+      description "Holds inuse configuration";
+      uses globals_config;
+    }
+  }
+  grouping label-blocks {
+    description "Label-block allocation grouping";
+    container label-blocks {
+      description "Label-block allocation container";
+      list label-block {
+        must "start-label >= end-label" {
+          error-message "start-label can not be less than end-label";
+        }
+        key index;
+        unique "start-label end-label";
+        leaf index {
+          type leafref {
+            path "../config/index";
+          }
+          description "Label-block index";
+        }
+        leaf start-label {
+          type leafref {
+            path "../config/start-label";
+          }
+          description
+            "Label-block start label reference";
+        }
+        leaf end-label {
+          type leafref {
+            path "../config/end-label";
+          }
+          description
+            "Label-block end label reference";
+        }
+        description "List of MPLS label-blocks";
+        container config {
+          description "Holds intended configuration";
+          uses label-block_config;
+        }
+        container state {
+          config false;
+          description "Holds inuse configuration";
+          uses label-block_config;
+          uses label-block_state;
+        }
+      }
+    }
+  }
+
+  augment "/rt:routing" {
+    description "MPLS augmentation.";
+    container mpls {
+      description
+        "MPLS container, to be used as an augmentation target node
+         other MPLS sub-features config, e.g. MPLS static LSP, MPLS
+         LDP LSPs, and Trafic Engineering MPLS LSP Tunnels, etc.";
+        uses globals;
+        uses label-blocks;
+        uses interfaces-mpls;
+    }
+  }
+
+  /* State data */
+  augment "/rt:routing-state/rt:ribs/rt:rib/rt:routes/rt:route" {
+    description
+      "This leaf augments an IPv4 unicast route.";
+    leaf local-label {
+      type rt-types:mpls-label;
+      description
+        "MPLS local label.";
+    }
+  }
+/*
+  TODO: we use older routing model which does not define next-hop container under route.
+  Uncomment following augmentation after HC2VPP-253 is resolved.
+
+  augment "/rt:routing-state/rt:ribs/rt:rib/rt:routes/rt:route/"
+        + "rt:next-hop/rt:next-hop-options/rt:simple-next-hop" {
+    description
+      "Augment 'simple-next-hop' case in IPv4 unicast routes.";
+    uses nhlfe-simple-contents;
+  }
+
+  augment "/rt:routing-state/rt:ribs/rt:rib/rt:routes/rt:route/"
+        + "rt:next-hop/rt:next-hop-options/rt:next-hop-list/"
+        + "rt:next-hop-list/rt:next-hop" {
+    description
+      "This leaf augments the 'next-hop-list' case of IPv4 unicast
+       routes.";
+    uses nhlfe-contents;
+  }
+
+  */
+
+/*
+  TODO(HC2VPP-253): we use older routing model which does not define active-route
+  as action but as an RPC.
+  Even after bump to ietf-routing@2016-08-18, we would fail due to
+  https://jira.opendaylight.org/browse/YANGTOOLS-822
+
+  augment
+    "/rt:routing-state/rt:ribs/rt:rib/rt:active-route/rt:input" {
+    description
+      "This augment adds the input parameter of the 'active-route'
+       action.";
+    uses nhlfe-contents;
+  }
+
+  augment "/rt:routing-state/rt:ribs/rt:rib/rt:active-route/"
+        + "rt:output/rt:route" {
+    description
+      "This augment adds the destination prefix to the reply of the
+       'active-route' action.";
+    uses nhlfe-contents;
+  }
+*/
+}
diff --git a/mpls/api/src/main/yang/hc2vpp-ietf-routing-types@2017-02-27.yang b/mpls/api/src/main/yang/hc2vpp-ietf-routing-types@2017-02-27.yang
new file mode 100644 (file)
index 0000000..b39357a
--- /dev/null
@@ -0,0 +1,723 @@
+module hc2vpp-ietf-routing-types {
+
+  namespace "urn:ietf:params:xml:ns:yang:ietf-routing-types";
+  prefix "rt-types";
+
+  import ietf-yang-types {
+    prefix "yang";
+  }
+
+  import ietf-inet-types {
+    prefix "inet";
+  }
+
+  organization "IETF Routing Area Working Group (rtgwg)";
+
+  contact
+      "Routing Area Working Group - <rtgwg@ietf.org>";
+
+  description
+    "This module contains a collection of YANG data types
+     considered generally useful for routing protocols.";
+
+  revision 2017-02-27 {
+    description
+      "Initial revision.";
+    reference
+      "RFC TBD: Routing YANG Data Types";
+  }
+
+  /*** collection of types related to routing ***/
+  typedef router-id {
+    type yang:dotted-quad;
+    description
+      "A 32-bit number in the dotted quad format assigned to each
+       router. This number uniquely identifies the router within an
+       Autonomous System.";
+  }
+
+  // address-family
+  identity address-family {
+    description
+      "Base identity from which identities describing address
+       families are derived.";
+  }
+
+  identity ipv4 {
+    base address-family;
+    description
+      "This identity represents IPv4 address family.";
+  }
+
+  identity ipv6 {
+    base address-family;
+    description
+      "This identity represents IPv6 address family.";
+  }
+
+  //The rest of the values deinfed in the IANA registry
+
+  identity nsap {
+    base address-family;
+    description
+      "Address family from IANA registry.";
+  }
+  identity hdlc {
+    base address-family;
+    description
+      "(8-bit multidrop)
+        Address family from IANA registry.";
+  }
+  identity bbn1822 {
+    base address-family;
+    description
+      "AHIP (BBN report #1822)
+       Address family from IANA registry.";
+  }
+  identity ieee802 {
+    base address-family;
+    description
+      "(includes all 802 media plus Ethernet canonical format)
+       Address family from IANA registry.";
+  }
+  identity e163 {
+    base address-family;
+    description
+      "Address family from IANA registry.";
+  }
+  identity e164 {
+    base address-family;
+    description
+      "SMDS, Frame Relay, ATM
+       Address family from IANA registry.";
+  }
+  identity f69 {
+    base address-family;
+    description
+      "(Telex)
+       Address family from IANA registry.";
+  }
+  identity x121 {
+    base address-family;
+    description
+      "(X.25, Frame Relay)
+       Address family from IANA registry.";
+  }
+  identity ipx {
+    base address-family;
+    description
+      "Address family from IANA registry.";
+  }
+  identity appletalk {
+    base address-family;
+    description
+      "Address family from IANA registry.";
+  }
+  identity decnet-iv {
+    base address-family;
+    description
+      "Decnet IV
+       Address family from IANA registry.";
+  }
+  identity vines {
+    base address-family;
+    description
+      "Banyan Vines
+       Address family from IANA registry.";
+  }
+  identity e164-nsap {
+    base address-family;
+    description
+      "E.164 with NSAP format subaddress
+       Address family from IANA registry.";
+  }
+  identity dns {
+    base address-family;
+    description
+      "Domain Name System
+       Address family from IANA registry.";
+  }
+  identity dn {
+    base address-family;
+    description
+      "Distinguished Name
+       Address family from IANA registry.";
+  }
+  identity as-num {
+    base address-family;
+    description
+      "AS Number
+       Address family from IANA registry.";
+  }
+  identity xtp-v4 {
+    base address-family;
+    description
+      "XTP over IPv4
+       Address family from IANA registry.";
+  }
+  identity xtp-v6 {
+    base address-family;
+    description
+      "XTP over IPv6
+       Address family from IANA registry.";
+  }
+  identity xtp {
+    base address-family;
+    description
+      "XTP native mode XTP
+       Address family from IANA registry.";
+  }
+  identity fc-port {
+    base address-family;
+    description
+      "Fibre Channel World-Wide Port Name
+       Address family from IANA registry.";
+  }
+  identity fc-node {
+    base address-family;
+    description
+      "Fibre Channel World-Wide Node Name
+       Address family from IANA registry.";
+  }
+  identity gwid {
+    base address-family;
+    description
+      "Address family from IANA registry.";
+  }
+  identity l2vpn {
+    base address-family;
+    description
+      "Address family from IANA registry.";
+  }
+  identity mpls-tp-section-eid {
+    base address-family;
+    description
+      "MPLS-TP Section Endpoint Identifier
+       Address family from IANA registry.";
+  }
+  identity mpls-tp-lsp-eid {
+    base address-family;
+    description
+      "MPLS-TP LSP Endpoint Identifier
+       Address family from IANA registry.";
+  }
+  identity mpls-tp-pwe-eid {
+    base address-family;
+    description
+      "MPLS-TP Pseudowire Endpoint Identifier
+       Address family from IANA registry.";
+  }
+  identity mt-v4 {
+    base address-family;
+    description
+      "Multi-Topology IPv4.
+       Address family from IANA registry.";
+  }
+  identity mt-v6 {
+    base address-family;
+    description
+      "Multi-Topology IPv6.
+       Address family from IANA registry.";
+  }
+
+  /*** collection of types related to VPN ***/
+  typedef route-target {
+    type string {
+      pattern
+        '(0:(6553[0-5]|655[0-2]\d|65[0-4]\d{2}|6[0-4]\d{3}|'
+      + '[0-5]?\d{0,3}\d):(429496729[0-5]|42949672[0-8]\d|'
+      + '4294967[01]\d{2}|429496[0-6]\d{3}|42949[0-5]\d{4}|'
+      + '4294[0-8]\d{5}|429[0-3]\d{6}|42[0-8]\d{7}|4[01]\d{8}|'
+      + '[0-3]?\d{0,8}\d))|'
+      + '(1:(((\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])\.){3}(\d|[1-9]\d|'
+      + '1\d{2}|2[0-4]\d|25[0-5])):(6553[0-5]|655[0-2]\d|'
+      + '65[0-4]\d{2}|6[0-4]\d{3}|[0-5]?\d{0,3}\d))|'
+      + '(2:(429496729[0-5]|42949672[0-8]\d|4294967[01]\d{2}|'
+      + '429496[0-6]\d{3}|42949[0-5]\d{4}|4294[0-8]\d{5}|'
+      + '429[0-3]\d{6}|42[0-8]\d{7}|4[01]\d{8}|[0-3]?\d{0,8}\d):'
+      + '(6553[0-5]|655[0-2]\d|65[0-4]\d{2}|6[0-4]\d{3}|'
+      + '[0-5]?\d{0,3}\d))';
+    }
+    description
+      "A route target is an 8-octet BGP extended community
+       initially identifying a set of sites in a BGP
+       VPN (RFC 4364). However, it has since taken on a more
+       general role in BGP route filtering.
+       A route target consists of three fields:
+       a 2-octet type field, an administrator field,
+       and an assigned number field.
+       According to the data formats for type 0, 1, and 2 defined in
+       RFC4360 and RFC5668, the encoding pattern is defined as:
+
+       0:2-octet-asn:4-octet-number
+       1:4-octet-ipv4addr:2-octet-number
+       2:4-octet-asn:2-octet-number.
+
+       Some valid examples are: 0:100:100, 1:1.1.1.1:100, and
+       2:1234567890:203.";
+    reference
+      "RFC4360: BGP Extended Communities Attribute.
+       RFC5668: 4-Octet AS Specific BGP Extended Community.";
+  }
+
+  typedef route-target-type {
+    type enumeration {
+      enum "import" {
+        value "0";
+        description
+          "The route target applies to route import.";
+       }
+      enum "export" {
+        value "1";
+        description
+          "The route target applies to route export.";
+       }
+      enum "both" {
+        value "2";
+        description
+          "The route target applies to both route import and
+           route export.";
+       }
+    }
+    description
+      "Indicates the role a route target takes
+       in route filtering.";
+    reference
+      "RFC4364: BGP/MPLS IP Virtual Private Networks (VPNs).";
+  }
+
+  typedef route-distinguisher {
+    type string {
+      pattern
+        '(0:(6553[0-5]|655[0-2]\d|65[0-4]\d{2}|6[0-4]\d{3}|'
+      + '[0-5]?\d{0,3}\d):(429496729[0-5]|42949672[0-8]\d|'
+      + '4294967[01]\d{2}|429496[0-6]\d{3}|42949[0-5]\d{4}|'
+      + '4294[0-8]\d{5}|429[0-3]\d{6}|42[0-8]\d{7}|4[01]\d{8}|'
+      + '[0-3]?\d{0,8}\d))|'
+      + '(1:(((\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])\.){3}(\d|[1-9]\d|'
+      + '1\d{2}|2[0-4]\d|25[0-5])):(6553[0-5]|655[0-2]\d|'
+      + '65[0-4]\d{2}|6[0-4]\d{3}|[0-5]?\d{0,3}\d))|'
+      + '(2:(429496729[0-5]|42949672[0-8]\d|4294967[01]\d{2}|'
+      + '429496[0-6]\d{3}|42949[0-5]\d{4}|4294[0-8]\d{5}|'
+      + '429[0-3]\d{6}|42[0-8]\d{7}|4[01]\d{8}|[0-3]?\d{0,8}\d):'
+      + '(6553[0-5]|655[0-2]\d|65[0-4]\d{2}|6[0-4]\d{3}|'
+      + '[0-5]?\d{0,3}\d))|'
+      + '(([3-9a-fA-F]|[1-9a-fA-F][\da-fA-F]{1,3}):'
+      + '[\da-fA-F]{1,12})';
+    }
+    description
+      "A route distinguisher is an 8-octet value used to distinguish
+       routes from different BGP VPNs (RFC 4364). A route
+       distinguisher consists of three fields: A 2-octet type field,
+       an administrator field, and an assigned number field.
+       According to the data formats for type 0, 1, and 2 defined in
+       RFC4364, the encoding pattern is defined as:
+
+       0:2-octet-asn:4-octet-number
+       1:4-octet-ipv4addr:2-octet-number
+       2:4-octet-asn:2-octet-number.
+       2-octet-other-hex-number:6-octet-hex-number
+
+       Some valid examples are: 0:100:100, 1:1.1.1.1:100, and
+       2:1234567890:203.";
+    reference
+      "RFC4364: BGP/MPLS IP Virtual Private Networks (VPNs).";
+  }
+
+  /*** collection of types common to multicast ***/
+  typedef ipv4-multicast-group-address {
+    type inet:ipv4-address {
+      pattern '(2((2[4-9])|(3[0-9]))\.).*';
+    }
+    description
+      "This type represents an IPv4 multicast group address,
+       which is in the range from 224.0.0.0 to 239.255.255.255.";
+    reference
+      "RFC1112: Host Extensions for IP Multicasting.";
+  }
+
+  typedef ipv6-multicast-group-address {
+    type inet:ipv6-address {
+      pattern
+        '(([fF]{2}[0-9a-fA-F]{2}):).*';
+    }
+    description
+      "This type represents an IPv6 multicast group address,
+       which is in the range of FF00::/8.";
+    reference
+      "RFC4291: IP Version 6 Addressing Architecture. Sec 2.7.
+       RFC7346: IPv6 Multicast Address Scopes.";
+  }
+
+  typedef ip-multicast-group-address {
+    type union {
+      type ipv4-multicast-group-address;
+      type ipv6-multicast-group-address;
+    }
+    description
+     "This type represents an IP multicast group address and is IP
+      version neutral. The format of the textual representation
+      implies the IP version.";
+  }
+
+  typedef ipv4-multicast-source-address {
+    type union {
+      type enumeration {
+        enum 'any' {
+        /*
+        ODL does not support * as enum name (how it should be named to java identifier?)
+        enum '*' {
+        */
+          description
+          "Any source address.";
+        }
+      }
+      type inet:ipv4-address;
+    }
+    description
+      "Multicast source IPv4 address type.";
+  }
+
+  typedef ipv6-multicast-source-address {
+    type union {
+      type enumeration {
+        enum 'any' {
+        /*
+        ODL does not support * as enum name (how it should be named to java identifier?)
+        enum '*' {
+        */
+          description
+          "Any source address.";
+        }
+      }
+      type inet:ipv6-address;
+    }
+    description
+      "Multicast source IPv6 address type.";
+  }
+
+  /*** collection of types common to protocols ***/
+  typedef bandwidth-ieee-float32 {
+    type string {
+      pattern
+        '0[xX](0((\.0?)?[pP](\+)?0?|(\.0?))|'
+      + '1(\.([\da-fA-F]{0,5}[02468aAcCeE]?)?)?[pP](\+)?(12[0-7]|'
+      + '1[01]\d|0?\d?\d)?)';
+    }
+    description
+      "Bandwidth in IEEE 754 floating point 32-bit binary format:
+       (-1)**(S) * 2**(Exponent-127) * (1 + Fraction),
+       where Exponent uses 8 bits, and Fraction uses 23 bits.
+       The units are octets per second.
+       The encoding format is the external hexadecimal-significand
+       character sequences specified in IEEE 754 and C99,
+       restricted to be normalized, non-negative, and non-fraction:
+       0x1.hhhhhhp{+}d or 0X1.HHHHHHP{+}D
+       where 'h' and 'H' are hexadecimal digits, 'd' and 'D' are
+       integers in the range of [0..127].
+       When six hexadecimal digits are used for 'hhhhhh' or 'HHHHHH',
+       the least significant digit must be an even number.
+       'x' and 'X' indicate hexadecimal; 'p' and 'P' indicate power
+       of two.
+       Some examples are: 0x0p0, 0x1p10, and 0x1.abcde2p+20";
+    reference
+      "IEEE Std 754-2008: IEEE Standard for Floating-Point
+       Arithmetic.";
+  }
+
+  typedef link-access-type {
+    type enumeration {
+      enum "broadcast" {
+        description
+        "Specify broadcast multi-access network.";
+      }
+      enum "non-broadcast-multiaccess" {
+        description
+        "Specify Non-Broadcast Multi-Access (NBMA) network.";
+      }
+      enum "point-to-multipoint" {
+        description
+        "Specify point-to-multipoint network.";
+      }
+      enum "point-to-point" {
+        description
+        "Specify point-to-point network.";
+      }
+    }
+    description
+      "Link access type.";
+  }
+
+  typedef timer-multiplier {
+    type uint8;
+    description
+      "The number of timer value intervals that should be
+       interpreted as a failure.";
+  }
+
+  typedef timer-value-seconds16 {
+    type union {
+      type uint16 {
+        range "1..65535";
+        }
+      type enumeration {
+        enum "infinity" {
+          description "The timer is set to infinity.";
+        }
+        enum "not-set" {
+          description "The timer is not set.";
+        }
+      }
+    }
+    units seconds;
+    description "Timer value type, in seconds (16 bit range).";
+  }
+
+  typedef timer-value-seconds32 {
+    type union {
+      type uint32 {
+        range "1..4294967295";
+        }
+      type enumeration {
+        enum "infinity" {
+          description "The timer is set to infinity.";
+        }
+        enum "not-set" {
+          description "The timer is not set.";
+        }
+      }
+    }
+    units seconds;
+    description "Timer value type, in seconds (32 bit range).";
+  }
+
+  typedef timer-value-milliseconds {
+    type union {
+      type uint32{
+        range "1..4294967295";
+        }
+      type enumeration {
+        enum "infinity" {
+          description "The timer is set to infinity.";
+        }
+        enum "not-set" {
+          description "The timer is not set.";
+        }
+      }
+    }
+    units milliseconds;
+    description "Timer value type, in milliseconds.";
+  }
+
+  /*** collection of types related to MPLS/GMPLS ***/
+  typedef generalized-label {
+    type binary;
+    description
+      "Generalized label. Nodes sending and receiving the
+       Generalized Label know the kinds of link they are
+       using. Hence, the Generalized Label does not identify
+       its type.  Instead, nodes are expected to know from
+       the context and type of label to expect.";
+    reference "RFC3471: Section 3.2";
+  }
+
+  identity mpls-label-special-purpose-value {
+    description
+      "Base identity for deriving identities describing
+       special-purpose Multiprotocol Label Switching (MPLS) label
+       values.";
+    reference
+      "RFC7274: Allocating and Retiring Special-Purpose MPLS
+       Labels.";
+  }
+
+  identity ipv4-explicit-null-label {
+    base mpls-label-special-purpose-value;
+    description
+      "This identity represents the IPv4 Explicit NULL Label.";
+    reference
+      "RFC3032: MPLS Label Stack Encoding. Section 2.1.";
+  }
+
+  identity router-alert-label {
+    base mpls-label-special-purpose-value;
+    description
+      "This identity represents the Router Alert Label.";
+    reference
+      "RFC3032: MPLS Label Stack Encoding. Section 2.1.";
+  }
+
+  identity ipv6-explicit-null-label {
+    base mpls-label-special-purpose-value;
+    description
+      "This identity represents the IPv6 Explicit NULL Label.";
+    reference
+      "RFC3032: MPLS Label Stack Encoding. Section 2.1.";
+  }
+
+  identity implicit-null-label {
+    base mpls-label-special-purpose-value;
+    description
+      "This identity represents the Implicit NULL Label.";
+    reference
+      "RFC3032: MPLS Label Stack Encoding. Section 2.1.";
+  }
+
+  identity entropy-label-indicator {
+    base mpls-label-special-purpose-value;
+    description
+      "This identity represents the Entropy Label Indicator.";
+    reference
+      "RFC6790: The Use of Entropy Labels in MPLS Forwarding.
+       Sections 3 and 10.1.";
+  }
+
+  identity gal-label {
+    base mpls-label-special-purpose-value;
+    description
+      "This identity represents the Generic Associated Channel Label
+       (GAL).";
+    reference
+      "RFC5586: MPLS Generic Associated Channel.
+       Sections 4 and 10.";
+  }
+
+  identity oam-alert-label {
+    base mpls-label-special-purpose-value;
+    description
+      "This identity represents the OAM Alert Label.";
+    reference
+      "RFC3429: Assignment of the 'OAM Alert Label' for Multiprotocol
+       Label Switching Architecture (MPLS) Operation and Maintenance
+       (OAM) Functions.
+       Sections 3 and 6.";
+  }
+
+  identity extension-label {
+    base mpls-label-special-purpose-value;
+    description
+      "This identity represents the Extension Label.";
+    reference
+      "RFC7274: Allocating and Retiring Special-Purpose MPLS Labels.
+       Sections 3.1 and 5.";
+  }
+
+  typedef mpls-label-special-purpose {
+    type identityref {
+      base mpls-label-special-purpose-value;
+    }
+    description
+      "This type represents the special-purpose Multiprotocol Label
+       Switching (MPLS) label values.";
+    reference
+      "RFC3032: MPLS Label Stack Encoding.
+       RFC7274: Allocating and Retiring Special-Purpose MPLS
+       Labels.";
+  }
+
+  typedef mpls-label-general-use {
+    type uint32 {
+      range "16..1048575";
+    }
+    description
+      "The 20 bits label values in an MPLS label stack entry,
+       specified in RFC3032. This label value does not include
+       the encodings of Traffic Class and TTL (time to live).
+       The label range specified by this type is for general use,
+       with special-purpose MPLS label values excluded.";
+    reference
+      "RFC3032: MPLS Label Stack Encoding.";
+  }
+
+
+  typedef mpls-label {
+/*
+TODO: binding generator creates invalid type bindings, so we changed type to uint32.
+Change back after https://jira.opendaylight.org/browse/MDSAL-269 is resolved.
+    type union {
+      type mpls-label-special-purpose;
+      type mpls-label-general-use;
+    }
+*/
+    type mpls-label-general-use;
+    description
+      "The 20 bits label values in an MPLS label stack entry,
+       specified in RFC3032. This label value does not include
+       the encodings of Traffic Class and TTL (time to live).";
+    reference
+      "RFC3032: MPLS Label Stack Encoding.";
+  }
+
+  /*
+   * Groupings
+   */
+  grouping mpls-label-stack {
+    description
+      "A grouping that specifies an MPLS label stack.";
+    container mpls-label-stack {
+      description
+        "Container for a list of MPLS label stack entries.";
+      list entry {
+        key "id";
+        description
+          "List of MPLS label stack entries.";
+        leaf id {
+          type uint8;
+          description
+            "Identifies the sequence of an MPLS label stack entries.
+             An entry with smaller ID value is precedes an entry in
+             the label stack with a smaller ID.";
+        }
+        leaf label {
+          type rt-types:mpls-label;
+          description
+            "Label value.";
+        }
+        leaf ttl {
+          type uint8;
+          description
+            "Time to Live (TTL).";
+          reference
+            "RFC3032: MPLS Label Stack Encoding.";
+        }
+        leaf traffic-class {
+          type uint8 {
+            range "0..7";
+          }
+          description
+            "Traffic Class (TC).";
+          reference
+            "RFC5462: Multiprotocol Label Switching (MPLS) Label
+             Stack Entry: 'EXP' Field Renamed to 'Traffic Class'
+             Field.";
+        }
+      }
+    }
+  } // mpls-label-stack
+
+  grouping vpn-route-targets {
+    description
+      "A grouping that specifies Route Target import-export rules
+       used in the BGP enabled Virtual Private Networks (VPNs).";
+    reference
+      "RFC4364: BGP/MPLS IP Virtual Private Networks (VPNs).
+       RFC4664: Framework for Layer 2 Virtual Private Networks
+       (L2VPNs)";
+    list vpn-target {
+      key route-target;
+      description
+        "List of Route Targets.";
+      leaf route-target {
+        type rt-types:route-target;
+        description
+          "Route Target value";
+      }
+      leaf route-target-type {
+        type rt-types:route-target-type;
+        mandatory true;
+        description
+          "Import/export type of the Route Target.";
+      }
+    }
+  } // vpn-route-targets
+}
diff --git a/mpls/asciidoc/Readme.adoc b/mpls/asciidoc/Readme.adoc
new file mode 100644 (file)
index 0000000..01337f1
--- /dev/null
@@ -0,0 +1,3 @@
+= mpls-aggregator
+
+Overview of mpls-aggregator
\ No newline at end of file
diff --git a/mpls/pom.xml b/mpls/pom.xml
new file mode 100644 (file)
index 0000000..ee5f646
--- /dev/null
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (c) 2017 Cisco and/or its affiliates.
+ 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">
+
+    <parent>
+        <groupId>io.fd.hc2vpp.common</groupId>
+        <artifactId>hc2vpp-parent</artifactId>
+        <version>1.18.01-SNAPSHOT</version>
+        <relativePath>../common/hc2vpp-parent</relativePath>
+    </parent>
+
+    <groupId>io.fd.hc2vpp.mpls</groupId>
+    <artifactId>mpls-aggregator</artifactId>
+    <version>1.18.01-SNAPSHOT</version>
+    <name>${project.artifactId}</name>
+    <packaging>pom</packaging>
+    <modelVersion>4.0.0</modelVersion>
+    <description>Aggregator for Hc2vpp Mpls plugin</description>
+
+    <modules>
+        <module>api</module>
+    </modules>
+
+    <!-- DO NOT install or deploy the repo root pom as it's only needed to initiate a build -->
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-deploy-plugin</artifactId>
+                <configuration>
+                    <skip>true</skip>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-install-plugin</artifactId>
+                <configuration>
+                    <skip>true</skip>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+</project>
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index 4958f4b..50a326a 100644 (file)
--- a/pom.xml
+++ b/pom.xml
@@ -54,5 +54,6 @@
     <module>it</module>
     <module>interface-role</module>
     <module>bgp</module>
+    <module>mpls</module>
   </modules>
 </project>
\ No newline at end of file