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";
  }

  import ietf-inet-types {
    prefix "inet";
  }

  include ietf-ipv6-router-advertisements {
    revision-date 2016-11-04;
  }

  organization
    "IETF NETMOD (NETCONF Data Modeling Language) Working Group";

  contact
    "WG Web:   <https://datatracker.ietf.org/wg/netmod/>
     WG List:  <mailto:netmod@ietf.org>

     WG Chair: Lou Berger
               <mailto:lberger@labn.net>

     WG Chair: Kent Watsen
               <mailto:kwatsen@juniper.net>

     Editor:   Ladislav Lhotka
               <mailto:lhotka@nic.cz>

     Editor:   Acee Lindem
               <mailto:acee@cisco.com>";

  description
    "This YANG module augments the 'ietf-routing' module with basic
     configuration and state data for IPv6 unicast routing.

     Copyright (c) 2016 IETF Trust and the persons identified as
     authors of the code.  All rights reserved.

     Redistribution and use in source and binary forms, with or
     without modification, is permitted pursuant to, and subject to
     the license terms contained in, the Simplified BSD License set
     forth in Section 4.c of the IETF Trust's Legal Provisions
     Relating to IETF Documents
     (http://trustee.ietf.org/license-info).

     The key words 'MUST', 'MUST NOT', 'REQUIRED', 'SHALL', 'SHALL
     NOT', 'SHOULD', 'SHOULD NOT', 'RECOMMENDED', 'MAY', and
     'OPTIONAL' in the module text are to be interpreted as described
     in RFC 2119.

     This version of this YANG module is part of RFC 8022;
     see the RFC itself for full legal notices.";

  revision 2016-11-04 {
    description
      "Initial revision.";
    reference
      "RFC 8022: A YANG Data Model for Routing Management";
  }

  /* Identities */

  identity ipv6-unicast {
    base rt:ipv6;
    description
      "This identity represents the IPv6 unicast address family.";
  }

  /* State data */

  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.";
    }
    description
      "This leaf augments an IPv6 unicast route.";
    leaf destination-prefix {
      type inet:ipv6-prefix;
      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.";
    }
    description
      "Augment '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-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.";
    }
    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-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.";
    }
    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-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.";
    }
    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-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.";
    }
    description
      "Augment '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-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.";
    }
    description
      "Augment '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.";
    }
  }

  /* Configuration data */

  augment "/rt:routing/rt:control-plane-protocols/"
        + "rt:control-plane-protocol/rt:static-routes" {
    description
      "This augment defines the configuration of the 'static'
       pseudo-protocol with data specific to IPv6 unicast.";
    container ipv6 {
      description
        "Configuration of 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
            "Configuration of next-hop.";
          uses rt:next-hop-content {
            augment "next-hop-options/simple-next-hop" {
              description
                "Augment '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
                "Augment 'next-hop-list' case in IPv6 static
                 routes.";
              leaf next-hop-address {
                type inet:ipv6-address;
                description
                  "IPv6 address of the next hop.";
              }
            }
          }
        }
      }
    }
  }
}
