Add RFC8349 models 52/74552/15
authorRobert Varga <robert.varga@pantheon.tech>
Thu, 26 Jul 2018 22:16:39 +0000 (00:16 +0200)
committerRobert Varga <robert.varga@pantheon.tech>
Fri, 27 Jul 2018 10:12:07 +0000 (12:12 +0200)
This adds  ietf-routing, ietf-ipv4-unicast-routing and
ietf-ipv6-unicast-routing.

JIRA: MDSAL-332
Change-Id: I3bda7f14c617ed1af1b505d1f8511c0bfe31f8a0
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
13 files changed:
model/artifacts/pom.xml
model/features/features-mdsal-model/pom.xml
model/features/odl-mdsal-model-rfc8349/pom.xml [new file with mode: 0644]
model/features/pom.xml
model/ietf/pom.xml
model/ietf/rfc8349-ietf-ipv4-unicast-routing/pom.xml [new file with mode: 0644]
model/ietf/rfc8349-ietf-ipv4-unicast-routing/src/main/yang/ietf-ipv4-unicast-routing@2018-03-13.yang [new file with mode: 0644]
model/ietf/rfc8349-ietf-ipv6-unicast-routing/pom.xml [new file with mode: 0644]
model/ietf/rfc8349-ietf-ipv6-unicast-routing/src/main/yang/ietf-ipv6-router-advertisements@2018-03-13.yang [new file with mode: 0644]
model/ietf/rfc8349-ietf-ipv6-unicast-routing/src/main/yang/ietf-ipv6-unicast-routing@2018-03-13.yang [new file with mode: 0644]
model/ietf/rfc8349-ietf-routing/pom.xml [new file with mode: 0644]
model/ietf/rfc8349-ietf-routing/src/main/yang/ietf-routing@2018-03-13.yang [new file with mode: 0644]
model/ietf/rfc8349/pom.xml [new file with mode: 0644]

index b5605c4c289f608224401bdcfbdecf2af9d92b92..b051cbd64e25c1726b45fd098a33561b095275c1 100644 (file)
                 <version>1.0.0-SNAPSHOT</version>
             </dependency>
 
+            <!-- RFC8349 -->
+            <dependency>
+                <groupId>org.opendaylight.mdsal.binding.model.ietf</groupId>
+                <artifactId>rfc8349</artifactId>
+                <version>1.0.0-SNAPSHOT</version>
+            </dependency>
+            <dependency>
+                <groupId>org.opendaylight.mdsal.binding.model.ietf</groupId>
+                <artifactId>rfc8349-ietf-routing</artifactId>
+                <version>1.0.0-SNAPSHOT</version>
+            </dependency>
+            <dependency>
+                <groupId>org.opendaylight.mdsal.binding.model.ietf</groupId>
+                <artifactId>rfc8349-ietf-ipv4-unicast-routing</artifactId>
+                <version>1.0.0-SNAPSHOT</version>
+            </dependency>
+            <dependency>
+                <groupId>org.opendaylight.mdsal.binding.model.ietf</groupId>
+                <artifactId>rfc8349-ietf-ipv6-unicast-routing</artifactId>
+                <version>1.0.0-SNAPSHOT</version>
+            </dependency>
+
             <!-- draft-bierman-netconf-restconf-02 -->
             <!-- FIXME: upgrade to RFC8040 -->
             <dependency>
                 <classifier>features</classifier>
                 <type>xml</type>
             </dependency>
+            <dependency>
+                <groupId>org.opendaylight.mdsal.model</groupId>
+                <artifactId>odl-mdsal-model-rfc8349</artifactId>
+                <version>1.0.0-SNAPSHOT</version>
+                <classifier>features</classifier>
+                <type>xml</type>
+            </dependency>
 
             <dependency>
                 <groupId>org.opendaylight.mdsal.model</groupId>
index e136a6463c92a49acb51c9ddb336231040f8f086..feb3c83d3f0955cd91cd4b19214ac1c252edcb04 100644 (file)
             <classifier>features</classifier>
             <type>xml</type>
         </dependency>
+        <dependency>
+            <groupId>org.opendaylight.mdsal.model</groupId>
+            <artifactId>odl-mdsal-model-rfc8349</artifactId>
+            <classifier>features</classifier>
+            <type>xml</type>
+        </dependency>
+
         <dependency>
             <groupId>org.opendaylight.mdsal.model</groupId>
             <artifactId>odl-mdsal-model-draft-bierman-netconf-restconf-02</artifactId>
             <classifier>features</classifier>
             <type>xml</type>
         </dependency>
+
         <dependency>
             <groupId>org.opendaylight.mdsal.model</groupId>
             <artifactId>odl-mdsal-model-odl-l2-types</artifactId>
diff --git a/model/features/odl-mdsal-model-rfc8349/pom.xml b/model/features/odl-mdsal-model-rfc8349/pom.xml
new file mode 100644 (file)
index 0000000..5569648
--- /dev/null
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright © 2018 Pantheon Technologies, s.r.o. and others.  All rights reserved.
+
+ This program and the accompanying materials are made available under the
+ terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ and is available at http://www.eclipse.org/legal/epl-v10.html
+ -->
+<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.opendaylight.odlparent</groupId>
+        <artifactId>single-feature-parent</artifactId>
+        <version>3.1.3</version>
+        <relativePath/>
+    </parent>
+
+    <groupId>org.opendaylight.mdsal.model</groupId>
+    <artifactId>odl-mdsal-model-rfc8349</artifactId>
+    <version>1.0.0-SNAPSHOT</version>
+    <packaging>feature</packaging>
+
+    <name>OpenDaylight :: MD-SAL :: Model :: RFC8349</name>
+
+    <dependencyManagement>
+        <dependencies>
+            <dependency>
+                <groupId>org.opendaylight.mdsal.model</groupId>
+                <artifactId>mdsal-model-artifacts</artifactId>
+                <version>0.13.0-SNAPSHOT</version>
+                <scope>import</scope>
+                <type>pom</type>
+            </dependency>
+        </dependencies>
+    </dependencyManagement>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.opendaylight.mdsal.model</groupId>
+            <artifactId>odl-mdsal-model-rfc6991</artifactId>
+            <classifier>features</classifier>
+            <type>xml</type>
+        </dependency>
+        <dependency>
+            <groupId>org.opendaylight.mdsal.binding.model.ietf</groupId>
+            <artifactId>rfc8349</artifactId>
+        </dependency>
+    </dependencies>
+</project>
index 3d67b9902e50b0c4febb29d9bc91d3cdd51c5565..1d48b0c0fdae922e6744eb3bfa5642a98a73c6a2 100644 (file)
@@ -37,6 +37,7 @@
         <module>odl-mdsal-model-rfc8344</module>
         <module>odl-mdsal-model-rfc8345</module>
         <module>odl-mdsal-model-rfc8345-non-nmda</module>
+        <module>odl-mdsal-model-rfc8349</module>
 
         <!-- IETF drafts -->
         <module>odl-mdsal-model-draft-bierman-netconf-restconf-02</module>
index a97231aad2c1db76172abd047896496696d5413b..51d83f1112011ace5227def8749f449b1c6c8e04 100644 (file)
         <module>rfc8345-ietf-network-topology</module>
         <module>rfc8345-ietf-network-topology-state</module>
 
+        <!-- RFC8349 Routing Management -->
+        <module>rfc8349</module>
+        <module>rfc8349-ietf-routing</module>
+        <module>rfc8349-ietf-ipv4-unicast-routing</module>
+        <module>rfc8349-ietf-ipv6-unicast-routing</module>
+
         <module>ietf-packet-fields</module>
         <module>ietf-access-control-list</module>
         <module>ietf-lisp-address-types</module>
diff --git a/model/ietf/rfc8349-ietf-ipv4-unicast-routing/pom.xml b/model/ietf/rfc8349-ietf-ipv4-unicast-routing/pom.xml
new file mode 100644 (file)
index 0000000..22f7ff5
--- /dev/null
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- vi: set et smarttab sw=4 tabstop=4: -->
+<!--
+ Copyright (c) 2018 Pantheon Technologies, s.ro. and others.  All rights reserved.
+
+ This program and the accompanying materials are made available under the
+ terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ and is available at http://www.eclipse.org/legal/epl-v10.html
+-->
+<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.opendaylight.mdsal</groupId>
+        <artifactId>binding-parent</artifactId>
+        <version>0.13.0-SNAPSHOT</version>
+        <relativePath>../../../binding/binding-parent</relativePath>
+    </parent>
+
+    <groupId>org.opendaylight.mdsal.binding.model.ietf</groupId>
+    <artifactId>rfc8349-ietf-ipv4-unicast-routing</artifactId>
+    <version>1.0.0-SNAPSHOT</version>
+    <packaging>bundle</packaging>
+
+    <name>${project.artifactId}</name>
+    <description>RFC8349 ietf-ipv4-unicast-routing</description>
+
+    <dependencyManagement>
+        <dependencies>
+            <dependency>
+                <groupId>org.opendaylight.mdsal.model</groupId>
+                <artifactId>mdsal-model-artifacts</artifactId>
+                <version>0.13.0-SNAPSHOT</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+        </dependencies>
+    </dependencyManagement>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.opendaylight.mdsal.model</groupId>
+            <artifactId>ietf-inet-types-2013-07-15</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.opendaylight.mdsal.binding.model.ietf</groupId>
+            <artifactId>rfc8349-ietf-routing</artifactId>
+        </dependency>
+    </dependencies>
+</project>
diff --git a/model/ietf/rfc8349-ietf-ipv4-unicast-routing/src/main/yang/ietf-ipv4-unicast-routing@2018-03-13.yang b/model/ietf/rfc8349-ietf-ipv4-unicast-routing/src/main/yang/ietf-ipv4-unicast-routing@2018-03-13.yang
new file mode 100644 (file)
index 0000000..7db3fc9
--- /dev/null
@@ -0,0 +1,377 @@
+module ietf-ipv4-unicast-routing {
+  yang-version "1.1";
+  namespace
+    "urn:ietf:params:xml:ns:yang:ietf-ipv4-unicast-routing";
+  prefix "v4ur";
+
+  import ietf-routing {
+    prefix "rt";
+    description
+      "An 'ietf-routing' module version that is compatible with
+       the Network Management Datastore Architecture (NMDA)
+       is required.";
+  }
+
+  import ietf-inet-types {
+    prefix "inet";
+  }
+  organization
+    "IETF NETMOD (Network Modeling) Working Group";
+  contact
+    "WG Web:   <https://datatracker.ietf.org/wg/netmod/>
+     WG List:  <mailto:rtgwg@ietf.org>
+
+     Editor:   Ladislav Lhotka
+               <mailto:lhotka@nic.cz>
+               Acee Lindem
+               <mailto:acee@cisco.com>
+               Yingzhen Qu
+               <mailto:yingzhen.qu@huawei.com>";
+
+  description
+    "This YANG module augments the 'ietf-routing' module with basic
+     parameters for IPv4 unicast routing.  The model fully conforms
+     to the Network Management Datastore Architecture (NMDA).
+
+     Copyright (c) 2018 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
+     (https://trustee.ietf.org/license-info).
+
+     This version of this YANG module is part of RFC 8349; see
+     the RFC itself for full legal notices.";
+
+  revision 2018-03-13 {
+    description
+      "Network Management Datastore Architecture (NMDA) revision.";
+    reference
+      "RFC 8349: A YANG Data Model for Routing Management
+                 (NMDA Version)";
+  }
+
+  revision 2016-11-04 {
+       description
+         "Initial revision.";
+       reference
+         "RFC 8022: A YANG Data Model for Routing Management";
+  }
+
+  /* Identities */
+
+  identity ipv4-unicast {
+    base rt:ipv4;
+    description
+      "This identity represents the IPv4 unicast address family.";
+  }
+
+  augment "/rt:routing/rt:ribs/rt:rib/rt:routes/rt:route" {
+    when "derived-from-or-self(../../rt:address-family, "
+       + "'v4ur:ipv4-unicast')" {
+      description
+        "This augment is valid only for IPv4 unicast.";
+    }
+    description
+      "This leaf augments an IPv4 unicast route.";
+    leaf destination-prefix {
+      type inet:ipv4-prefix;
+      description
+        "IPv4 destination prefix.";
+    }
+  }
+
+  augment "/rt:routing/rt:ribs/rt:rib/rt:routes/rt:route/"
+        + "rt:next-hop/rt:next-hop-options/rt:simple-next-hop" {
+    when "derived-from-or-self(../../../rt:address-family, "
+       + "'v4ur:ipv4-unicast')" {
+      description
+        "This augment is valid only for IPv4 unicast.";
+    }
+    description
+      "Augments the 'simple-next-hop' case in IPv4 unicast routes.";
+    leaf next-hop-address {
+      type inet:ipv4-address;
+      description
+        "IPv4 address of the next hop.";
+    }
+  }
+
+  augment "/rt:routing/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" {
+    when "derived-from-or-self(../../../../../rt:address-family, "
+       + "'v4ur:ipv4-unicast')" {
+      description
+        "This augment is valid only for IPv4 unicast.";
+    }
+    description
+      "This leaf augments the 'next-hop-list' case of IPv4 unicast
+       routes.";
+    leaf address {
+      type inet:ipv4-address;
+      description
+        "IPv4 address of the next hop.";
+    }
+  }
+
+  augment
+    "/rt:routing/rt:ribs/rt:rib/rt:active-route/rt:input" {
+    when "derived-from-or-self(../rt:address-family, "
+       + "'v4ur:ipv4-unicast')" {
+      description
+        "This augment is valid only for IPv4 unicast RIBs.";
+    }
+    description
+      "This augment adds the input parameter of the 'active-route'
+       action.";
+    leaf destination-address {
+      type inet:ipv4-address;
+      description
+        "IPv4 destination address.";
+    }
+  }
+
+  augment "/rt:routing/rt:ribs/rt:rib/rt:active-route/"
+        + "rt:output/rt:route" {
+    when "derived-from-or-self(../../rt:address-family, "
+       + "'v4ur:ipv4-unicast')" {
+      description
+        "This augment is valid only for IPv4 unicast.";
+    }
+    description
+      "This augment adds the destination prefix to the reply of the
+       'active-route' action.";
+    leaf destination-prefix {
+      type inet:ipv4-prefix;
+      description
+        "IPv4 destination prefix.";
+    }
+  }
+
+  augment "/rt:routing/rt:ribs/rt:rib/rt:active-route/"
+        + "rt:output/rt:route/rt:next-hop/rt:next-hop-options/"
+        + "rt:simple-next-hop" {
+    when "derived-from-or-self(../../../rt:address-family, "
+       + "'v4ur:ipv4-unicast')" {
+      description
+        "This augment is valid only for IPv4 unicast.";
+    }
+    description
+      "Augments the 'simple-next-hop' case in the reply to the
+       'active-route' action.";
+    leaf next-hop-address {
+      type inet:ipv4-address;
+      description
+        "IPv4 address of the next hop.";
+    }
+  }
+
+  augment "/rt:routing/rt:ribs/rt:rib/rt:active-route/"
+        + "rt:output/rt:route/rt:next-hop/rt:next-hop-options/"
+        + "rt:next-hop-list/rt:next-hop-list/rt:next-hop" {
+    when "derived-from-or-self(../../../../../rt:address-family, "
+       + "'v4ur:ipv4-unicast')" {
+      description
+        "This augment is valid only for IPv4 unicast.";
+    }
+    description
+      "Augments the 'next-hop-list' case in the reply to the
+       'active-route' action.";
+    leaf next-hop-address {
+      type inet:ipv4-address;
+      description
+        "IPv4 address of the next hop.";
+    }
+  }
+
+  augment "/rt:routing/rt:control-plane-protocols/"
+        + "rt:control-plane-protocol/rt:static-routes" {
+    description
+      "This augment defines the 'static' pseudo-protocol
+       with data specific to IPv4 unicast.";
+    container ipv4 {
+      description
+        "Support for a 'static' pseudo-protocol instance
+         consists of a list of routes.";
+      list route {
+        key "destination-prefix";
+        description
+          "A list of static routes.";
+        leaf destination-prefix {
+          type inet:ipv4-prefix;
+          mandatory true;
+          description
+            "IPv4 destination prefix.";
+        }
+        leaf description {
+          type string;
+          description
+            "Textual description of the route.";
+        }
+        container next-hop {
+          description
+            "Support for next-hop.";
+          uses rt:next-hop-content {
+            augment "next-hop-options/simple-next-hop" {
+              description
+                "Augments the 'simple-next-hop' case in IPv4 static
+                 routes.";
+              leaf next-hop-address {
+                type inet:ipv4-address;
+                description
+                  "IPv4 address of the next hop.";
+              }
+            }
+            augment "next-hop-options/next-hop-list/next-hop-list/"
+                  + "next-hop" {
+              description
+                "Augments the 'next-hop-list' case in IPv4 static
+                 routes.";
+              leaf next-hop-address {
+                type inet:ipv4-address;
+                description
+                  "IPv4 address of the next hop.";
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+
+  /*
+   * The subsequent data nodes are obviated and obsoleted
+   * by the Network Management Datastore Architecture
+   * as described in RFC 8342.
+   */
+  augment "/rt:routing-state/rt:ribs/rt:rib/rt:routes/rt:route" {
+    when "derived-from-or-self(../../rt:address-family, "
+         + "'v4ur:ipv4-unicast')" {
+      description
+        "This augment is valid only for IPv4 unicast.";
+    }
+    status obsolete;
+    description
+      "This leaf augments an IPv4 unicast route.";
+    leaf destination-prefix {
+      type inet:ipv4-prefix;
+      status obsolete;
+      description
+        "IPv4 destination prefix.";
+    }
+  }
+  augment "/rt:routing-state/rt:ribs/rt:rib/rt:routes/rt:route/"
+          + "rt:next-hop/rt:next-hop-options/rt:simple-next-hop" {
+    when "derived-from-or-self(
+            ../../../rt:address-family, 'v4ur:ipv4-unicast')" {
+      description
+        "This augment is valid only for IPv4 unicast.";
+    }
+    status obsolete;
+    description
+      "Augments the 'simple-next-hop' case in IPv4 unicast routes.";
+    leaf next-hop-address {
+      type inet:ipv4-address;
+      status obsolete;
+      description
+        "IPv4 address of the next hop.";
+    }
+  }
+  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" {
+    when "derived-from-or-self(../../../../../rt:address-family,
+            'v4ur:ipv4-unicast')" {
+      description
+        "This augment is valid only for IPv4 unicast.";
+    }
+    status obsolete;
+    description
+      "This leaf augments the 'next-hop-list' case of IPv4 unicast
+       routes.";
+    leaf address {
+      type inet:ipv4-address;
+      status obsolete;
+      description
+        "IPv4 address of the next hop.";
+    }
+  }
+  augment "/rt:routing-state/rt:ribs/rt:rib/rt:active-route/"
+          + "rt:input" {
+    when "derived-from-or-self(../rt:address-family,
+            'v4ur:ipv4-unicast')" {
+      description
+        "This augment is valid only for IPv4 unicast RIBs.";
+    }
+    status obsolete;
+    description
+      "This augment adds the input parameter of the 'active-route'
+       action.";
+    leaf destination-address {
+      type inet:ipv4-address;
+      status obsolete;
+      description
+        "IPv4 destination address.";
+    }
+  }
+  augment "/rt:routing-state/rt:ribs/rt:rib/rt:active-route/"
+          + "rt:output/rt:route" {
+    when "derived-from-or-self(../../rt:address-family,
+            'v4ur:ipv4-unicast')" {
+      description
+        "This augment is valid only for IPv4 unicast.";
+    }
+    status obsolete;
+    description
+      "This augment adds the destination prefix to the reply of the
+       'active-route' action.";
+    leaf destination-prefix {
+      type inet:ipv4-prefix;
+      status obsolete;
+      description
+        "IPv4 destination prefix.";
+    }
+  }
+  augment "/rt:routing-state/rt:ribs/rt:rib/rt:active-route/"
+          + "rt:output/rt:route/rt:next-hop/rt:next-hop-options/"
+          + "rt:simple-next-hop" {
+    when "derived-from-or-self(../../../rt:address-family,
+            'v4ur:ipv4-unicast')" {
+      description
+        "This augment is valid only for IPv4 unicast.";
+    }
+    status obsolete;
+    description
+      "Augments the 'simple-next-hop' case in the reply to the
+       'active-route' action.";
+    leaf next-hop-address {
+      type inet:ipv4-address;
+      status obsolete;
+      description
+        "IPv4 address of the next hop.";
+    }
+  }
+  augment "/rt:routing-state/rt:ribs/rt:rib/rt:active-route/"
+          + "rt:output/rt:route/rt:next-hop/rt:next-hop-options/"
+          + "rt:next-hop-list/rt:next-hop-list/rt:next-hop" {
+    when "derived-from-or-self(../../../../../rt:address-family,
+            'v4ur:ipv4-unicast')" {
+      description
+        "This augment is valid only for IPv4 unicast.";
+    }
+    status obsolete;
+    description
+      "Augments the 'next-hop-list' case in the reply to the
+       'active-route' action.";
+    leaf next-hop-address {
+      type inet:ipv4-address;
+      status obsolete;
+      description
+        "IPv4 address of the next hop.";
+    }
+  }
+}
diff --git a/model/ietf/rfc8349-ietf-ipv6-unicast-routing/pom.xml b/model/ietf/rfc8349-ietf-ipv6-unicast-routing/pom.xml
new file mode 100644 (file)
index 0000000..0703f8f
--- /dev/null
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- vi: set et smarttab sw=4 tabstop=4: -->
+<!--
+ Copyright (c) 2018 Pantheon Technologies, s.ro. and others.  All rights reserved.
+
+ This program and the accompanying materials are made available under the
+ terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ and is available at http://www.eclipse.org/legal/epl-v10.html
+-->
+<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.opendaylight.mdsal</groupId>
+        <artifactId>binding-parent</artifactId>
+        <version>0.13.0-SNAPSHOT</version>
+        <relativePath>../../../binding/binding-parent</relativePath>
+    </parent>
+
+    <groupId>org.opendaylight.mdsal.binding.model.ietf</groupId>
+    <artifactId>rfc8349-ietf-ipv6-unicast-routing</artifactId>
+    <version>1.0.0-SNAPSHOT</version>
+    <packaging>bundle</packaging>
+
+    <name>${project.artifactId}</name>
+    <description>RFC8349 ietf-ipv6-unicast-routing</description>
+
+    <dependencyManagement>
+        <dependencies>
+            <dependency>
+                <groupId>org.opendaylight.mdsal.model</groupId>
+                <artifactId>mdsal-model-artifacts</artifactId>
+                <version>0.13.0-SNAPSHOT</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+        </dependencies>
+    </dependencyManagement>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.opendaylight.mdsal.binding.model.ietf</groupId>
+            <artifactId>rfc8344</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.opendaylight.mdsal.binding.model.ietf</groupId>
+            <artifactId>rfc8349-ietf-routing</artifactId>
+        </dependency>
+    </dependencies>
+</project>
diff --git a/model/ietf/rfc8349-ietf-ipv6-unicast-routing/src/main/yang/ietf-ipv6-router-advertisements@2018-03-13.yang b/model/ietf/rfc8349-ietf-ipv6-unicast-routing/src/main/yang/ietf-ipv6-router-advertisements@2018-03-13.yang
new file mode 100644 (file)
index 0000000..294e231
--- /dev/null
@@ -0,0 +1,501 @@
+submodule ietf-ipv6-router-advertisements {
+  yang-version "1.1";
+
+  belongs-to ietf-ipv6-unicast-routing {
+    prefix "v6ur";
+  }
+
+  import ietf-inet-types {
+    prefix "inet";
+  }
+
+  import ietf-interfaces {
+    prefix "if";
+    description
+      "An 'ietf-interfaces' module version that is compatible with
+       the Network Management Datastore Architecture (NMDA)
+       is required.";
+  }
+
+  import ietf-ip {
+    prefix "ip";
+    description
+      "An 'ietf-ip' module version that is compatible with
+       the Network Management Datastore Architecture (NMDA)
+       is required.";
+  }
+
+  organization
+    "IETF NETMOD (Network Modeling) Working Group";
+  contact
+    "WG Web:   <https://datatracker.ietf.org/wg/netmod/>
+     WG List:  <mailto:rtgwg@ietf.org>
+
+     Editor:   Ladislav Lhotka
+               <mailto:lhotka@nic.cz>
+               Acee Lindem
+               <mailto:acee@cisco.com>
+               Yingzhen Qu
+               <mailto:yingzhen.qu@huawei.com>";
+
+  description
+    "This YANG module augments the 'ietf-ip' module with
+     parameters for IPv6 Router Advertisements.  The model fully
+     conforms to the Network Management Datastore
+     Architecture (NMDA).
+
+     Copyright (c) 2018 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
+     (https://trustee.ietf.org/license-info).
+
+     This version of this YANG module is part of RFC 8349; see
+     the RFC itself for full legal notices.";
+
+  reference
+    "RFC 4861: Neighbor Discovery for IP version 6 (IPv6)";
+
+  revision 2018-03-13 {
+    description
+      "Network Management Datastore Architecture (NMDA) revision.";
+    reference
+      "RFC 8349: A YANG Data Model for Routing Management
+                 (NMDA Version)";
+  }
+
+  revision 2016-11-04 {
+       description
+         "Initial revision.";
+       reference
+         "RFC 8022: A YANG Data Model for Routing Management";
+  }
+
+  augment "/if:interfaces/if:interface/ip:ipv6" {
+    description
+      "Augments interface configuration with parameters of IPv6
+       Router Advertisements.";
+    container ipv6-router-advertisements {
+      description
+        "Support for IPv6 Router Advertisements.";
+      leaf send-advertisements {
+        type boolean;
+        default "false";
+        description
+          "A flag indicating whether or not the router sends
+           periodic Router Advertisements and responds to
+           Router Solicitations.";
+        reference
+          "RFC 4861: Neighbor Discovery for IP version 6 (IPv6)
+                     - AdvSendAdvertisements";
+      }
+      leaf max-rtr-adv-interval {
+        type uint16 {
+          range "4..65535";
+        }
+        units "seconds";
+        default "600";
+        description
+          "The maximum time allowed between sending unsolicited
+           multicast Router Advertisements from the interface.";
+        reference
+          "RFC 4861: Neighbor Discovery for IP version 6 (IPv6)
+                     - MaxRtrAdvInterval";
+      }
+      leaf min-rtr-adv-interval {
+        type uint16 {
+          range "3..1350";
+        }
+        units "seconds";
+        must ". <= 0.75 * ../max-rtr-adv-interval" {
+          description
+            "The value MUST NOT be greater than 75% of
+             'max-rtr-adv-interval'.";
+        }
+        description
+          "The minimum time allowed between sending unsolicited
+           multicast Router Advertisements from the interface.
+
+           The default value to be used operationally if this
+           leaf is not configured is determined as follows:
+
+           - if max-rtr-adv-interval >= 9 seconds, the default
+             value is 0.33 * max-rtr-adv-interval;
+
+           - otherwise, it is 0.75 * max-rtr-adv-interval.";
+        reference
+          "RFC 4861: Neighbor Discovery for IP version 6 (IPv6)
+                     - MinRtrAdvInterval";
+      }
+      leaf managed-flag {
+        type boolean;
+        default "false";
+        description
+          "The value to be placed in the 'Managed address
+           configuration' flag field in the Router
+           Advertisement.";
+        reference
+          "RFC 4861: Neighbor Discovery for IP version 6 (IPv6)
+                     - AdvManagedFlag";
+      }
+      leaf other-config-flag {
+        type boolean;
+        default "false";
+        description
+          "The value to be placed in the 'Other configuration'
+           flag field in the Router Advertisement.";
+        reference
+          "RFC 4861: Neighbor Discovery for IP version 6 (IPv6)
+                     - AdvOtherConfigFlag";
+      }
+      leaf link-mtu {
+        type uint32;
+        default "0";
+        description
+          "The value to be placed in MTU options sent by the
+           router.  A value of zero indicates that no MTU options
+           are sent.";
+        reference
+          "RFC 4861: Neighbor Discovery for IP version 6 (IPv6)
+                     - AdvLinkMTU";
+      }
+      leaf reachable-time {
+        type uint32 {
+          range "0..3600000";
+        }
+        units "milliseconds";
+        default "0";
+        description
+          "The value to be placed in the Reachable Time field in
+           the Router Advertisement messages sent by the router.
+           A value of zero means unspecified (by this router).";
+        reference
+          "RFC 4861: Neighbor Discovery for IP version 6 (IPv6)
+                     - AdvReachableTime";
+      }
+      leaf retrans-timer {
+        type uint32;
+        units "milliseconds";
+        default "0";
+        description
+          "The value to be placed in the Retrans Timer field in
+           the Router Advertisement messages sent by the router.
+           A value of zero means unspecified (by this router).";
+        reference
+          "RFC 4861: Neighbor Discovery for IP version 6 (IPv6)
+                     - AdvRetransTimer";
+      }
+      leaf cur-hop-limit {
+        type uint8;
+        description
+          "The value to be placed in the Cur Hop Limit field in
+           the Router Advertisement messages sent by the router.
+           A value of zero means unspecified (by this router).
+
+           If this parameter is not configured, the device SHOULD
+           use the IANA-specified value for the default IPv4
+           Time to Live (TTL) parameter that was in effect at the
+           time of implementation.";
+        reference
+          "RFC 3232: Assigned Numbers: RFC 1700 is Replaced by
+                     an On-line Database
+           RFC 4861: Neighbor Discovery for IP version 6 (IPv6)
+                     - AdvCurHopLimit
+           IANA: IP Parameters
+                 (https://www.iana.org/assignments/ip-parameters)";
+      }
+      leaf default-lifetime {
+        type uint16 {
+          range "0..65535";
+        }
+        units "seconds";
+        description
+          "The value to be placed in the Router Lifetime field of
+           Router Advertisements sent from the interface, in
+           seconds.  It MUST be either zero or between
+           max-rtr-adv-interval and 9000 seconds.  A value of zero
+           indicates that the router is not to be used as a
+           default router.  These limits may be overridden by
+           specific documents that describe how IPv6 operates over
+           different link layers.
+
+           If this parameter is not configured, the device SHOULD
+           use a value of 3 * max-rtr-adv-interval.";
+        reference
+          "RFC 4861: Neighbor Discovery for IP version 6 (IPv6)
+                     - AdvDefaultLifetime";
+      }
+      container prefix-list {
+        description
+          "Support for prefixes to be placed in Prefix
+           Information options in Router Advertisement messages
+           sent from the interface.
+
+           Prefixes that are advertised by default but do not
+           have their entries in the child 'prefix' list are
+           advertised with the default values of all parameters.
+
+           The link-local prefix SHOULD NOT be included in the
+           list of advertised prefixes.";
+        reference
+          "RFC 4861: Neighbor Discovery for IP version 6 (IPv6)
+                     - AdvPrefixList";
+        list prefix {
+          key "prefix-spec";
+          description
+            "Support for an advertised prefix entry.";
+          leaf prefix-spec {
+            type inet:ipv6-prefix;
+            description
+              "IPv6 address prefix.";
+          }
+          choice control-adv-prefixes {
+            default "advertise";
+            description
+              "Either (1) the prefix is explicitly removed from the
+               set of advertised prefixes or (2) the parameters with
+               which the prefix is advertised are specified (default
+               case).";
+            leaf no-advertise {
+              type empty;
+              description
+                "The prefix will not be advertised.
+
+                 This can be used for removing the prefix from
+                 the default set of advertised prefixes.";
+            }
+            case advertise {
+              leaf valid-lifetime {
+                type uint32;
+                units "seconds";
+                default "2592000";
+                description
+                  "The value to be placed in the Valid Lifetime
+                   in the Prefix Information option.  The
+                   designated value of all 1's (0xffffffff)
+                    represents infinity.";
+                reference
+                  "RFC 4861: Neighbor Discovery for IP version 6
+                             (IPv6) - AdvValidLifetime";
+              }
+              leaf on-link-flag {
+                type boolean;
+                default "true";
+                description
+                  "The value to be placed in the on-link flag
+                   ('L-bit') field in the Prefix Information
+                   option.";
+                reference
+                  "RFC 4861: Neighbor Discovery for IP version 6
+                             (IPv6) - AdvOnLinkFlag";
+              }
+              leaf preferred-lifetime {
+                type uint32;
+                units "seconds";
+                must ". <= ../valid-lifetime" {
+                  description
+                    "This value MUST NOT be greater than
+                     valid-lifetime.";
+                }
+                default "604800";
+                description
+                  "The value to be placed in the Preferred
+                   Lifetime in the Prefix Information option.
+                   The designated value of all 1's (0xffffffff)
+                   represents infinity.";
+                reference
+                  "RFC 4861: Neighbor Discovery for IP version 6
+                             (IPv6) - AdvPreferredLifetime";
+              }
+              leaf autonomous-flag {
+                type boolean;
+                default "true";
+                description
+                  "The value to be placed in the Autonomous Flag
+                   field in the Prefix Information option.";
+                reference
+                  "RFC 4861: Neighbor Discovery for IP version 6
+                             (IPv6) - AdvAutonomousFlag";
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+
+  /*
+   * The subsequent data nodes are obviated and obsoleted
+   * by the Network Management Datastore Architecture
+   * as described in RFC 8342.
+   */
+  augment "/if:interfaces-state/if:interface/ip:ipv6" {
+    status obsolete;
+    description
+      "Augments interface state data with parameters of IPv6
+       Router Advertisements.";
+    container ipv6-router-advertisements {
+      status obsolete;
+      description
+        "Parameters of IPv6 Router Advertisements.";
+      leaf send-advertisements {
+        type boolean;
+        status obsolete;
+        description
+          "A flag indicating whether or not the router sends
+           periodic Router Advertisements and responds to
+           Router Solicitations.";
+      }
+      leaf max-rtr-adv-interval {
+        type uint16 {
+          range "4..1800";
+        }
+        units "seconds";
+        status obsolete;
+        description
+          "The maximum time allowed between sending unsolicited
+           multicast Router Advertisements from the interface.";
+      }
+      leaf min-rtr-adv-interval {
+        type uint16 {
+          range "3..1350";
+        }
+        units "seconds";
+        status obsolete;
+        description
+          "The minimum time allowed between sending unsolicited
+           multicast Router Advertisements from the interface.";
+      }
+      leaf managed-flag {
+        type boolean;
+        status obsolete;
+        description
+          "The value that is placed in the 'Managed address
+           configuration' flag field in the Router Advertisement.";
+      }
+      leaf other-config-flag {
+        type boolean;
+        status obsolete;
+        description
+          "The value that is placed in the 'Other configuration' flag
+           field in the Router Advertisement.";
+      }
+      leaf link-mtu {
+        type uint32;
+        status obsolete;
+        description
+          "The value that is placed in MTU options sent by the
+           router.  A value of zero indicates that no MTU options
+           are sent.";
+      }
+      leaf reachable-time {
+        type uint32 {
+          range "0..3600000";
+        }
+        units "milliseconds";
+        status obsolete;
+        description
+          "The value that is placed in the Reachable Time field in
+           the Router Advertisement messages sent by the router.  A
+           value of zero means unspecified (by this router).";
+      }
+      leaf retrans-timer {
+        type uint32;
+        units "milliseconds";
+        status obsolete;
+        description
+          "The value that is placed in the Retrans Timer field in the
+           Router Advertisement messages sent by the router.  A value
+           of zero means unspecified (by this router).";
+      }
+      leaf cur-hop-limit {
+        type uint8;
+        status obsolete;
+        description
+          "The value that is placed in the Cur Hop Limit field in the
+           Router Advertisement messages sent by the router.  A value
+           of zero means unspecified (by this router).";
+      }
+      leaf default-lifetime {
+        type uint16 {
+          range "0..9000";
+        }
+        units "seconds";
+        status obsolete;
+        description
+          "The value that is placed in the Router Lifetime field of
+           Router Advertisements sent from the interface, in seconds.
+           A value of zero indicates that the router is not to be
+           used as a default router.";
+      }
+      container prefix-list {
+        status obsolete;
+        description
+          "A list of prefixes that are placed in Prefix Information
+           options in Router Advertisement messages sent from the
+           interface.
+
+           By default, these are all prefixes that the router
+           advertises via routing protocols as being on-link for the
+           interface from which the advertisement is sent.";
+        list prefix {
+          key "prefix-spec";
+          status obsolete;
+          description
+            "Advertised prefix entry and its parameters.";
+          leaf prefix-spec {
+            type inet:ipv6-prefix;
+            status obsolete;
+            description
+              "IPv6 address prefix.";
+          }
+          leaf valid-lifetime {
+            type uint32;
+            units "seconds";
+            status obsolete;
+            description
+              "The value that is placed in the Valid Lifetime in the
+               Prefix Information option.  The designated value of
+               all 1's (0xffffffff) represents infinity.
+
+               An implementation SHOULD keep this value constant in
+               consecutive advertisements, except when it is
+               explicitly changed in configuration.";
+          }
+          leaf on-link-flag {
+            type boolean;
+            status obsolete;
+            description
+              "The value that is placed in the on-link flag ('L-bit')
+               field in the Prefix Information option.";
+          }
+          leaf preferred-lifetime {
+            type uint32;
+            units "seconds";
+            status obsolete;
+            description
+              "The value that is placed in the Preferred Lifetime in
+               the Prefix Information option, in seconds.  The
+               designated value of all 1's (0xffffffff) represents
+               infinity.
+
+               An implementation SHOULD keep this value constant in
+               consecutive advertisements, except when it is
+               explicitly changed in configuration.";
+          }
+          leaf autonomous-flag {
+            type boolean;
+            status obsolete;
+            description
+              "The value that is placed in the Autonomous Flag field
+               in the Prefix Information option.";
+          }
+        }
+      }
+    }
+  }
+}
diff --git a/model/ietf/rfc8349-ietf-ipv6-unicast-routing/src/main/yang/ietf-ipv6-unicast-routing@2018-03-13.yang b/model/ietf/rfc8349-ietf-ipv6-unicast-routing/src/main/yang/ietf-ipv6-unicast-routing@2018-03-13.yang
new file mode 100644 (file)
index 0000000..6a8e7e3
--- /dev/null
@@ -0,0 +1,387 @@
+module ietf-ipv6-unicast-routing {
+  yang-version "1.1";
+  namespace
+    "urn:ietf:params:xml:ns:yang:ietf-ipv6-unicast-routing";
+  prefix "v6ur";
+
+  import ietf-routing {
+    prefix "rt";
+    description
+      "An 'ietf-routing' module version that is compatible with
+       the Network Management Datastore Architecture (NMDA)
+       is required.";
+  }
+
+  import ietf-inet-types {
+    prefix "inet";
+    description
+      "An 'ietf-interfaces' module version that is compatible with
+       the Network Management Datastore Architecture (NMDA)
+       is required.";
+  }
+
+  include ietf-ipv6-router-advertisements {
+    revision-date 2018-03-13;
+  }
+  organization
+    "IETF NETMOD (Network Modeling) Working Group";
+  contact
+    "WG Web:   <https://datatracker.ietf.org/wg/netmod/>
+     WG List:  <mailto:rtgwg@ietf.org>
+
+     Editor:   Ladislav Lhotka
+               <mailto:lhotka@nic.cz>
+               Acee Lindem
+               <mailto:acee@cisco.com>
+               Yingzhen Qu
+               <mailto:yingzhen.qu@huawei.com>";
+
+  description
+    "This YANG module augments the 'ietf-routing' module with basic
+     parameters for IPv6 unicast routing.  The model fully conforms
+     to the Network Management Datastore Architecture (NMDA).
+
+     Copyright (c) 2018 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
+     (https://trustee.ietf.org/license-info).
+
+     This version of this YANG module is part of RFC 8349; see
+     the RFC itself for full legal notices.";
+
+  revision 2018-03-13 {
+    description
+      "Network Management Datastore Architecture (NMDA) revision.";
+    reference
+      "RFC 8349: A YANG Data Model for Routing Management
+                 (NMDA Version)";
+  }
+
+  /* Identities */
+
+  revision 2016-11-04 {
+       description
+         "Initial revision.";
+       reference
+         "RFC 8022: A YANG Data Model for Routing Management";
+  }
+
+  identity ipv6-unicast {
+    base rt:ipv6;
+    description
+      "This identity represents the IPv6 unicast address family.";
+  }
+
+  augment "/rt:routing/rt:ribs/rt:rib/rt:routes/rt:route" {
+    when "derived-from-or-self(../../rt:address-family, "
+       + "'v6ur:ipv6-unicast')" {
+      description
+        "This augment is valid only for IPv6 unicast.";
+    }
+    description
+      "This leaf augments an IPv6 unicast route.";
+    leaf destination-prefix {
+      type inet:ipv6-prefix;
+      description
+        "IPv6 destination prefix.";
+    }
+  }
+
+  augment "/rt:routing/rt:ribs/rt:rib/rt:routes/rt:route/"
+        + "rt:next-hop/rt:next-hop-options/rt:simple-next-hop" {
+    when "derived-from-or-self(../../../rt:address-family, "
+       + "'v6ur:ipv6-unicast')" {
+      description
+        "This augment is valid only for IPv6 unicast.";
+    }
+    description
+      "Augments the 'simple-next-hop' case in IPv6 unicast routes.";
+    leaf next-hop-address {
+      type inet:ipv6-address;
+      description
+        "IPv6 address of the next hop.";
+    }
+  }
+
+  augment "/rt:routing/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" {
+    when "derived-from-or-self(../../../../../rt:address-family, "
+       + "'v6ur:ipv6-unicast')" {
+      description
+        "This augment is valid only for IPv6 unicast.";
+    }
+    description
+      "This leaf augments the 'next-hop-list' case of IPv6 unicast
+       routes.";
+    leaf address {
+      type inet:ipv6-address;
+      description
+        "IPv6 address of the next hop.";
+    }
+  }
+
+  augment
+    "/rt:routing/rt:ribs/rt:rib/rt:active-route/rt:input" {
+    when "derived-from-or-self(../rt:address-family, "
+       + "'v6ur:ipv6-unicast')" {
+      description
+        "This augment is valid only for IPv6 unicast RIBs.";
+    }
+    description
+      "This augment adds the input parameter of the 'active-route'
+       action.";
+    leaf destination-address {
+      type inet:ipv6-address;
+      description
+        "IPv6 destination address.";
+    }
+  }
+
+  augment "/rt:routing/rt:ribs/rt:rib/rt:active-route/"
+        + "rt:output/rt:route" {
+    when "derived-from-or-self(../../rt:address-family, "
+       + "'v6ur:ipv6-unicast')" {
+      description
+        "This augment is valid only for IPv6 unicast.";
+    }
+    description
+      "This augment adds the destination prefix to the reply of the
+       'active-route' action.";
+    leaf destination-prefix {
+      type inet:ipv6-prefix;
+      description
+        "IPv6 destination prefix.";
+    }
+  }
+
+  augment "/rt:routing/rt:ribs/rt:rib/rt:active-route/"
+        + "rt:output/rt:route/rt:next-hop/rt:next-hop-options/"
+        + "rt:simple-next-hop" {
+    when "derived-from-or-self(../../../rt:address-family, "
+       + "'v6ur:ipv6-unicast')" {
+      description
+        "This augment is valid only for IPv6 unicast.";
+    }
+    description
+      "Augments the 'simple-next-hop' case in the reply to the
+       'active-route' action.";
+    leaf next-hop-address {
+      type inet:ipv6-address;
+      description
+        "IPv6 address of the next hop.";
+    }
+  }
+
+  augment "/rt:routing/rt:ribs/rt:rib/rt:active-route/"
+        + "rt:output/rt:route/rt:next-hop/rt:next-hop-options/"
+        + "rt:next-hop-list/rt:next-hop-list/rt:next-hop" {
+    when "derived-from-or-self(../../../../../rt:address-family, "
+       + "'v6ur:ipv6-unicast')" {
+      description
+        "This augment is valid only for IPv6 unicast.";
+    }
+    description
+      "Augments the 'next-hop-list' case in the reply to the
+       'active-route' action.";
+    leaf next-hop-address {
+      type inet:ipv6-address;
+      description
+        "IPv6 address of the next hop.";
+    }
+  }
+
+  /* Data node augmentations */
+
+  augment "/rt:routing/rt:control-plane-protocols/"
+        + "rt:control-plane-protocol/rt:static-routes" {
+    description
+      "This augment defines the 'static' pseudo-protocol
+       with data specific to IPv6 unicast.";
+    container ipv6 {
+      description
+        "Support for a 'static' pseudo-protocol instance
+         consists of a list of routes.";
+      list route {
+        key "destination-prefix";
+        description
+          "A list of static routes.";
+        leaf destination-prefix {
+          type inet:ipv6-prefix;
+          mandatory true;
+          description
+            "IPv6 destination prefix.";
+        }
+        leaf description {
+          type string;
+          description
+            "Textual description of the route.";
+        }
+        container next-hop {
+          description
+            "Next hop for the route.";
+          uses rt:next-hop-content {
+            augment "next-hop-options/simple-next-hop" {
+              description
+                "Augments the 'simple-next-hop' case in IPv6 static
+                 routes.";
+              leaf next-hop-address {
+                type inet:ipv6-address;
+                description
+                  "IPv6 address of the next hop.";
+              }
+            }
+            augment "next-hop-options/next-hop-list/next-hop-list/"
+                  + "next-hop" {
+              description
+                "Augments the 'next-hop-list' case in IPv6 static
+                 routes.";
+              leaf next-hop-address {
+                type inet:ipv6-address;
+                description
+                  "IPv6 address of the next hop.";
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+
+  /*
+   * The subsequent data nodes are obviated and obsoleted
+   * by the Network Management Datastore Architecture
+   * as described in RFC 8342.
+   */
+  augment "/rt:routing-state/rt:ribs/rt:rib/rt:routes/rt:route" {
+    when "derived-from-or-self(../../rt:address-family,
+            'v6ur:ipv6-unicast')" {
+      description
+        "This augment is valid only for IPv6 unicast.";
+    }
+    status obsolete;
+    description
+      "This leaf augments an IPv6 unicast route.";
+    leaf destination-prefix {
+      type inet:ipv6-prefix;
+      status obsolete;
+      description
+        "IPv6 destination prefix.";
+    }
+  }
+  augment "/rt:routing-state/rt:ribs/rt:rib/rt:routes/rt:route/"
+          + "rt:next-hop/rt:next-hop-options/rt:simple-next-hop" {
+    when "derived-from-or-self(../../../rt:address-family,
+            'v6ur:ipv6-unicast')" {
+      description
+        "This augment is valid only for IPv6 unicast.";
+    }
+    status obsolete;
+    description
+      "Augments the 'simple-next-hop' case in IPv6 unicast routes.";
+    leaf next-hop-address {
+      type inet:ipv6-address;
+      status obsolete;
+      description
+        "IPv6 address of the next hop.";
+    }
+  }
+  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" {
+    when "derived-from-or-self(../../../../../rt:address-family,
+            'v6ur:ipv6-unicast')" {
+      description
+        "This augment is valid only for IPv6 unicast.";
+    }
+    status obsolete;
+    description
+      "This leaf augments the 'next-hop-list' case of IPv6 unicast
+       routes.";
+    leaf address {
+      type inet:ipv6-address;
+      status obsolete;
+      description
+        "IPv6 address of the next hop.";
+    }
+  }
+  augment "/rt:routing-state/rt:ribs/rt:rib/"
+          + "rt:active-route/rt:input" {
+    when "derived-from-or-self(../rt:address-family,
+            'v6ur:ipv6-unicast')" {
+      description
+        "This augment is valid only for IPv6 unicast RIBs.";
+    }
+    status obsolete;
+    description
+      "This augment adds the input parameter of the 'active-route'
+       action.";
+    leaf destination-address {
+      type inet:ipv6-address;
+      status obsolete;
+      description
+        "IPv6 destination address.";
+    }
+  }
+  augment "/rt:routing-state/rt:ribs/rt:rib/rt:active-route/"
+          + "rt:output/rt:route" {
+    when "derived-from-or-self(../../rt:address-family,
+            'v6ur:ipv6-unicast')" {
+      description
+        "This augment is valid only for IPv6 unicast.";
+    }
+    status obsolete;
+    description
+      "This augment adds the destination prefix to the reply of the
+       'active-route' action.";
+    leaf destination-prefix {
+      type inet:ipv6-prefix;
+      status obsolete;
+      description
+        "IPv6 destination prefix.";
+    }
+  }
+  augment "/rt:routing-state/rt:ribs/rt:rib/rt:active-route/"
+          + "rt:output/rt:route/rt:next-hop/rt:next-hop-options/"
+          + "rt:simple-next-hop" {
+    when "derived-from-or-self(../../../rt:address-family,
+            'v6ur:ipv6-unicast')" {
+      description
+        "This augment is valid only for IPv6 unicast.";
+    }
+    status obsolete;
+    description
+      "Augments the 'simple-next-hop' case in the reply to the
+       'active-route' action.";
+    leaf next-hop-address {
+      type inet:ipv6-address;
+      status obsolete;
+      description
+        "IPv6 address of the next hop.";
+    }
+  }
+  augment "/rt:routing-state/rt:ribs/rt:rib/rt:active-route/"
+          + "rt:output/rt:route/rt:next-hop/rt:next-hop-options/"
+          + "rt:next-hop-list/rt:next-hop-list/rt:next-hop" {
+    when "derived-from-or-self(../../../../../rt:address-family,
+            'v6ur:ipv6-unicast')" {
+      description
+        "This augment is valid only for IPv6 unicast.";
+    }
+    status obsolete;
+    description
+      "Augments the 'next-hop-list' case in the reply to the
+       'active-route' action.";
+    leaf next-hop-address {
+      type inet:ipv6-address;
+      status obsolete;
+      description
+        "IPv6 address of the next hop.";
+    }
+  }
+}
diff --git a/model/ietf/rfc8349-ietf-routing/pom.xml b/model/ietf/rfc8349-ietf-routing/pom.xml
new file mode 100644 (file)
index 0000000..31f44c5
--- /dev/null
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- vi: set et smarttab sw=4 tabstop=4: -->
+<!--
+ Copyright (c) 2018 Pantheon Technologies, s.ro. and others.  All rights reserved.
+
+ This program and the accompanying materials are made available under the
+ terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ and is available at http://www.eclipse.org/legal/epl-v10.html
+-->
+<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.opendaylight.mdsal</groupId>
+        <artifactId>binding-parent</artifactId>
+        <version>0.13.0-SNAPSHOT</version>
+        <relativePath>../../../binding/binding-parent</relativePath>
+    </parent>
+
+    <groupId>org.opendaylight.mdsal.binding.model.ietf</groupId>
+    <artifactId>rfc8349-ietf-routing</artifactId>
+    <version>1.0.0-SNAPSHOT</version>
+    <packaging>bundle</packaging>
+
+    <name>${project.artifactId}</name>
+    <description>RFC8349 ietf-routing</description>
+
+    <dependencyManagement>
+        <dependencies>
+            <dependency>
+                <groupId>org.opendaylight.mdsal.model</groupId>
+                <artifactId>mdsal-model-artifacts</artifactId>
+                <version>0.13.0-SNAPSHOT</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+        </dependencies>
+    </dependencyManagement>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.opendaylight.mdsal.model</groupId>
+            <artifactId>ietf-yang-types-20130715</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.opendaylight.mdsal.binding.model.ietf</groupId>
+            <artifactId>rfc8343</artifactId>
+        </dependency>
+    </dependencies>
+</project>
diff --git a/model/ietf/rfc8349-ietf-routing/src/main/yang/ietf-routing@2018-03-13.yang b/model/ietf/rfc8349-ietf-routing/src/main/yang/ietf-routing@2018-03-13.yang
new file mode 100644 (file)
index 0000000..9e259f0
--- /dev/null
@@ -0,0 +1,684 @@
+module ietf-routing {
+  yang-version "1.1";
+  namespace "urn:ietf:params:xml:ns:yang:ietf-routing";
+  prefix "rt";
+
+  import ietf-yang-types {
+    prefix "yang";
+  }
+
+  import ietf-interfaces {
+    prefix "if";
+    description
+      "An 'ietf-interfaces' module version that is compatible with
+       the Network Management Datastore Architecture (NMDA)
+       is required.";
+  }
+
+  organization
+    "IETF NETMOD (Network Modeling) Working Group";
+  contact
+    "WG Web:   <https://datatracker.ietf.org/wg/netmod/>
+     WG List:  <mailto:rtgwg@ietf.org>
+
+     Editor:   Ladislav Lhotka
+               <mailto:lhotka@nic.cz>
+               Acee Lindem
+               <mailto:acee@cisco.com>
+               Yingzhen Qu
+               <mailto:yingzhen.qu@huawei.com>";
+
+  description
+    "This YANG module defines essential components for the management
+     of a routing subsystem.  The model fully conforms to the Network
+     Management Datastore Architecture (NMDA).
+
+     Copyright (c) 2018 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
+     (https://trustee.ietf.org/license-info).
+     This version of this YANG module is part of RFC 8349; see
+     the RFC itself for full legal notices.";
+
+  revision 2018-03-13 {
+    description
+      "Network Management Datastore Architecture (NMDA) revision.";
+    reference
+      "RFC 8349: A YANG Data Model for Routing Management
+                 (NMDA Version)";
+  }
+
+  revision 2016-11-04 {
+       description
+         "Initial revision.";
+       reference
+         "RFC 8022: A YANG Data Model for Routing Management";
+  }
+
+  /* Features */
+  feature multiple-ribs {
+    description
+      "This feature indicates that the server supports
+       user-defined RIBs.
+
+       Servers that do not advertise this feature SHOULD provide
+       exactly one system-controlled RIB per supported address family
+       and also make it the default RIB.  This RIB then appears as an
+       entry in the list '/routing/ribs/rib'.";
+  }
+
+  feature router-id {
+    description
+      "This feature indicates that the server supports an explicit
+       32-bit router ID that is used by some routing protocols.
+
+       Servers that do not advertise this feature set a router ID
+       algorithmically, usually to one of the configured IPv4
+       addresses.  However, this algorithm is implementation
+       specific.";
+  }
+
+  /* Identities */
+
+  identity address-family {
+    description
+      "Base identity from which identities describing address
+       families are derived.";
+  }
+  identity ipv4 {
+    base address-family;
+    description
+      "This identity represents an IPv4 address family.";
+  }
+
+  identity ipv6 {
+    base address-family;
+    description
+      "This identity represents an IPv6 address family.";
+  }
+
+  identity control-plane-protocol {
+    description
+      "Base identity from which control-plane protocol identities are
+       derived.";
+  }
+
+  identity routing-protocol {
+    base control-plane-protocol;
+    description
+      "Identity from which Layer 3 routing protocol identities are
+       derived.";
+  }
+
+  identity direct {
+    base routing-protocol;
+    description
+      "Routing pseudo-protocol that provides routes to directly
+       connected networks.";
+  }
+
+  identity static {
+    base routing-protocol;
+    description
+      "'Static' routing pseudo-protocol.";
+  }
+
+  /* Type Definitions */
+
+  typedef route-preference {
+    type uint32;
+    description
+      "This type is used for route preferences.";
+  }
+
+  /* Groupings */
+
+  grouping address-family {
+    description
+      "This grouping provides a leaf identifying an address
+       family.";
+    leaf address-family {
+      type identityref {
+        base address-family;
+      }
+      mandatory true;
+      description
+        "Address family.";
+    }
+  }
+
+  grouping router-id {
+    description
+      "This grouping provides a router ID.";
+    leaf router-id {
+      type yang:dotted-quad;
+      description
+        "A 32-bit number in the form of a dotted quad that is used by
+         some routing protocols identifying a router.";
+      reference
+        "RFC 2328: OSPF Version 2";
+    }
+  }
+
+  grouping special-next-hop {
+    description
+      "This grouping provides a leaf with an enumeration of special
+       next hops.";
+    leaf special-next-hop {
+      type enumeration {
+        enum blackhole {
+          description
+            "Silently discard the packet.";
+        }
+        enum unreachable {
+          description
+            "Discard the packet and notify the sender with an error
+             message indicating that the destination host is
+             unreachable.";
+        }
+        enum prohibit {
+          description
+            "Discard the packet and notify the sender with an error
+             message indicating that the communication is
+             administratively prohibited.";
+        }
+        enum receive {
+          description
+            "The packet will be received by the local system.";
+        }
+      }
+      description
+        "Options for special next hops.";
+    }
+  }
+
+  grouping next-hop-content {
+    description
+      "Generic parameters of next hops in static routes.";
+    choice next-hop-options {
+      mandatory true;
+      description
+        "Options for next hops in static routes.
+
+         It is expected that further cases will be added through
+         augments from other modules.";
+      case simple-next-hop {
+        description
+          "This case represents a simple next hop consisting of the
+           next-hop address and/or outgoing interface.
+
+           Modules for address families MUST augment this case with a
+           leaf containing a next-hop address of that address
+           family.";
+        leaf outgoing-interface {
+          type if:interface-ref;
+          description
+            "Name of the outgoing interface.";
+        }
+      }
+      case special-next-hop {
+        uses special-next-hop;
+      }
+      case next-hop-list {
+        container next-hop-list {
+          description
+            "Container for multiple next hops.";
+          list next-hop {
+            key "index";
+            description
+              "An entry in a next-hop list.
+
+               Modules for address families MUST augment this list
+               with a leaf containing a next-hop address of that
+               address family.";
+            leaf index {
+              type string;
+              description
+                "A user-specified identifier utilized 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 outgoing-interface {
+              type if:interface-ref;
+              description
+                "Name of the outgoing interface.";
+            }
+          }
+        }
+      }
+    }
+  }
+
+  grouping next-hop-state-content {
+    description
+      "Generic state parameters of next hops.";
+    choice next-hop-options {
+      mandatory true;
+      description
+        "Options for next hops.
+
+         It is expected that further cases will be added through
+         augments from other modules, e.g., for recursive
+         next hops.";
+      case simple-next-hop {
+        description
+          "This case represents a simple next hop consisting of the
+           next-hop address and/or outgoing interface.
+
+           Modules for address families MUST augment this case with a
+           leaf containing a next-hop address of that address
+           family.";
+        leaf outgoing-interface {
+          type if:interface-ref;
+          description
+            "Name of the outgoing interface.";
+        }
+      }
+      case special-next-hop {
+        uses special-next-hop;
+      }
+      case next-hop-list {
+        container next-hop-list {
+          description
+            "Container for multiple next hops.";
+          list next-hop {
+            description
+              "An entry in a next-hop list.
+
+               Modules for address families MUST augment this list
+               with a leaf containing a next-hop address of that
+               address family.";
+            leaf outgoing-interface {
+              type if:interface-ref;
+              description
+                "Name of the outgoing interface.";
+            }
+          }
+        }
+      }
+    }
+  }
+
+  grouping route-metadata {
+    description
+      "Common route metadata.";
+    leaf source-protocol {
+      type identityref {
+        base routing-protocol;
+      }
+      mandatory true;
+      description
+        "Type of the routing protocol from which the route
+         originated.";
+    }
+    leaf active {
+      type empty;
+      description
+        "The presence of this leaf indicates that the route is
+         preferred among all routes in the same RIB that have the
+         same destination prefix.";
+    }
+    leaf last-updated {
+      type yang:date-and-time;
+      description
+        "Timestamp of the last modification of the route.  If the
+         route was never modified, it is the time when the route was
+         inserted into the RIB.";
+    }
+  }
+
+  /* Data nodes */
+
+  container routing {
+    description
+      "Configuration parameters for the routing subsystem.";
+    uses router-id {
+      if-feature "router-id";
+      description
+        "Support for the global router ID.  Routing protocols
+         that use a router ID can use this parameter or override it
+         with another value.";
+    }
+    container interfaces {
+      config false;
+      description
+        "Network-layer interfaces used for routing.";
+      leaf-list interface {
+        type if:interface-ref;
+        description
+          "Each entry is a reference to the name of a configured
+           network-layer interface.";
+      }
+    }
+    container control-plane-protocols {
+      description
+        "Support for control-plane protocol instances.";
+      list control-plane-protocol {
+        key "type name";
+        description
+          "Each entry contains a control-plane protocol instance.";
+        leaf type {
+          type identityref {
+            base control-plane-protocol;
+          }
+          description
+            "Type of the control-plane protocol -- an identity
+             derived from the 'control-plane-protocol'
+             base identity.";
+        }
+        leaf name {
+          type string;
+          description
+            "An arbitrary name of the control-plane protocol
+             instance.";
+        }
+        leaf description {
+          type string;
+          description
+            "Textual description of the control-plane protocol
+             instance.";
+        }
+        container static-routes {
+          when "derived-from-or-self(../type, 'rt:static')" {
+            description
+              "This container is only valid for the 'static' routing
+               protocol.";
+          }
+          description
+            "Support for the 'static' pseudo-protocol.
+
+             Address-family-specific modules augment this node with
+             their lists of routes.";
+        }
+      }
+    }
+    container ribs {
+      description
+        "Support for RIBs.";
+      list rib {
+        key "name";
+        description
+          "Each entry contains a configuration for a RIB identified
+           by the 'name' key.
+
+           Entries having the same key as a system-controlled entry
+           in the list '/routing/ribs/rib' are used for
+           configuring parameters of that entry.  Other entries
+           define additional user-controlled RIBs.";
+        leaf name {
+          type string;
+          description
+            "The name of the RIB.
+
+             For system-controlled entries, the value of this leaf
+             must be the same as the name of the corresponding entry
+             in the operational state.
+
+             For user-controlled entries, an arbitrary name can be
+             used.";
+        }
+        uses address-family {
+          description
+            "The address family of the system-controlled RIB.";
+        }
+
+        leaf default-rib {
+          if-feature "multiple-ribs";
+          type boolean;
+          default "true";
+          config false;
+          description
+            "This flag has the value of 'true' if and only if the RIB
+             is the default RIB for the given address family.
+
+             By default, control-plane protocols place their routes
+             in the default RIBs.";
+        }
+        container routes {
+          config false;
+          description
+            "Current contents of the RIB.";
+          list route {
+            description
+              "A RIB route entry.  This data node MUST be augmented
+               with information specific to routes of each address
+               family.";
+            leaf route-preference {
+              type route-preference;
+              description
+                "This route attribute, also known as 'administrative
+                 distance', allows for selecting the preferred route
+                 among routes with the same destination prefix.  A
+                 smaller value indicates a route that is
+                 more preferred.";
+            }
+            container next-hop {
+              description
+                "Route's next-hop attribute.";
+              uses next-hop-state-content;
+            }
+            uses route-metadata;
+          }
+        }
+        action active-route {
+          description
+            "Return the active RIB route that is used for the
+             destination address.
+
+             Address-family-specific modules MUST augment input
+             parameters with a leaf named 'destination-address'.";
+          output {
+            container route {
+              description
+                "The active RIB route for the specified destination.
+
+                 If no route exists in the RIB for the destination
+                 address, no output is returned.
+
+                 Address-family-specific modules MUST augment this
+                 container with appropriate route contents.";
+              container next-hop {
+                description
+                  "Route's next-hop attribute.";
+                uses next-hop-state-content;
+              }
+              uses route-metadata;
+            }
+          }
+        }
+        leaf description {
+          type string;
+          description
+            "Textual description of the RIB.";
+        }
+      }
+    }
+  }
+
+  /*
+   * The subsequent data nodes are obviated and obsoleted
+   * by the Network Management Datastore Architecture
+   * as described in RFC 8342.
+   */
+  container routing-state {
+    config false;
+    status obsolete;
+    description
+      "State data of the routing subsystem.";
+    uses router-id {
+      status obsolete;
+      description
+        "Global router ID.
+
+         It may be either configured or assigned algorithmically by
+         the implementation.";
+    }
+    container interfaces {
+      status obsolete;
+      description
+        "Network-layer interfaces used for routing.";
+      leaf-list interface {
+        type if:interface-state-ref;
+        status obsolete;
+        description
+          "Each entry is a reference to the name of a configured
+           network-layer interface.";
+      }
+    }
+    container control-plane-protocols {
+      status obsolete;
+      description
+        "Container for the list of routing protocol instances.";
+      list control-plane-protocol {
+        key "type name";
+        status obsolete;
+        description
+          "State data of a control-plane protocol instance.
+
+           An implementation MUST provide exactly one
+           system-controlled instance of the 'direct'
+           pseudo-protocol.  Instances of other control-plane
+           protocols MAY be created by configuration.";
+        leaf type {
+          type identityref {
+            base control-plane-protocol;
+          }
+          status obsolete;
+          description
+            "Type of the control-plane protocol.";
+        }
+        leaf name {
+          type string;
+          status obsolete;
+          description
+            "The name of the control-plane protocol instance.
+
+             For system-controlled instances, this name is
+             persistent, i.e., it SHOULD NOT change across
+             reboots.";
+        }
+      }
+    }
+    container ribs {
+      status obsolete;
+      description
+        "Container for RIBs.";
+      list rib {
+        key "name";
+        min-elements 1;
+        status obsolete;
+        description
+          "Each entry represents a RIB identified by the 'name'
+           key.  All routes in a RIB MUST belong to the same address
+           family.
+
+           An implementation SHOULD provide one system-controlled
+           default RIB for each supported address family.";
+        leaf name {
+          type string;
+          status obsolete;
+          description
+            "The name of the RIB.";
+        }
+        uses address-family {
+          status obsolete;
+          description
+            "The address family of the RIB.";
+        }
+        leaf default-rib {
+          if-feature "multiple-ribs";
+          type boolean;
+          default "true";
+          status obsolete;
+          description
+            "This flag has the value of 'true' if and only if the
+             RIB is the default RIB for the given address family.
+
+             By default, control-plane protocols place their routes
+             in the default RIBs.";
+        }
+        container routes {
+          status obsolete;
+          description
+            "Current contents of the RIB.";
+          list route {
+            status obsolete;
+            description
+              "A RIB route entry.  This data node MUST be augmented
+               with information specific to routes of each address
+               family.";
+            leaf route-preference {
+              type route-preference;
+              status obsolete;
+              description
+                "This route attribute, also known as 'administrative
+                 distance', allows for selecting the preferred route
+                 among routes with the same destination prefix.  A
+                 smaller value indicates a route that is
+                 more preferred.";
+            }
+            container next-hop {
+              status obsolete;
+              description
+                "Route's next-hop attribute.";
+              uses next-hop-state-content {
+                status obsolete;
+                description
+                  "Route's next-hop attribute operational state.";
+              }
+            }
+            uses route-metadata {
+              status obsolete;
+              description
+                "Route metadata.";
+            }
+          }
+        }
+        action active-route {
+          status obsolete;
+          description
+            "Return the active RIB route that is used for the
+             destination address.
+
+             Address-family-specific modules MUST augment input
+             parameters with a leaf named 'destination-address'.";
+          output {
+            container route {
+              status obsolete;
+              description
+                "The active RIB route for the specified
+                 destination.
+
+                 If no route exists in the RIB for the destination
+                 address, no output is returned.
+
+                 Address-family-specific modules MUST augment this
+                 container with appropriate route contents.";
+              container next-hop {
+                status obsolete;
+                description
+                  "Route's next-hop attribute.";
+                uses next-hop-state-content {
+                  status obsolete;
+                  description
+                    "Active route state data.";
+                }
+              }
+              uses route-metadata {
+                status obsolete;
+                description
+                  "Active route metadata.";
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+}
diff --git a/model/ietf/rfc8349/pom.xml b/model/ietf/rfc8349/pom.xml
new file mode 100644 (file)
index 0000000..26769ee
--- /dev/null
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- vi: set et smarttab sw=4 tabstop=4: -->
+<!--
+ Copyright (c) 2013 Cisco Systems, Inc. and others.  All rights reserved.
+
+ This program and the accompanying materials are made available under the
+ terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ and is available at http://www.eclipse.org/legal/epl-v10.html
+-->
+<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.opendaylight.odlparent</groupId>
+        <artifactId>bundle-parent</artifactId>
+        <version>3.1.3</version>
+        <relativePath/>
+    </parent>
+
+    <groupId>org.opendaylight.mdsal.binding.model.ietf</groupId>
+    <artifactId>rfc8349</artifactId>
+    <version>1.0.0-SNAPSHOT</version>
+    <packaging>bundle</packaging>
+
+    <name>${project.artifactId}</name>
+    <description>RFC8349 Routing Management</description>
+
+    <dependencyManagement>
+        <dependencies>
+            <dependency>
+                <groupId>org.opendaylight.mdsal.model</groupId>
+                <artifactId>mdsal-model-artifacts</artifactId>
+                <version>0.13.0-SNAPSHOT</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+        </dependencies>
+    </dependencyManagement>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.opendaylight.mdsal.binding.model.ietf</groupId>
+            <artifactId>rfc8349-ietf-routing</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.opendaylight.mdsal.binding.model.ietf</groupId>
+            <artifactId>rfc8349-ietf-ipv4-unicast-routing</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.opendaylight.mdsal.binding.model.ietf</groupId>
+            <artifactId>rfc8349-ietf-ipv6-unicast-routing</artifactId>
+        </dependency>
+    </dependencies>
+</project>