So the conversion tool has worked OK on the RIP model as well, but I spotted a few areas where manual conversion is required (because the types/structure between config and state differ):

So along with the revision date, and a few FIX ME comments, the following few places also need to be manually tweaked/fixed:

rwilton@rwilton-lnx:~/ietf-models-to-combined/draft_modules$ pyang -f tree --ietf [email protected] > [email protected] [email protected]:1: warning: unexpected modulename "ietf-rip" in [email protected], should be ietf-rip-nmda [email protected]:1: warning: unexpected latest revision "2017-06-05" in [email protected], should be 2017-09-21
[email protected]:740: error: unexpected keyword "type"
<- Means that config and state type differ.

[email protected]:761: error: unexpected keyword "type"
<- Means that config and state type differ.

[email protected]:818: error: there is already a child node to "interface" at [email protected]:636 with the name "originate-default-route" defined at [email protected]:731 (at [email protected]:141) <- Trying to merge an "originate-default-route" leaf from the state tree with the "originate-default-route" container in the equivalent config tree.

RIB YANG model converted to NMDA structure attached.

Thanks,
Rob


On 20/09/2017 18:27, Alia Atlas wrote:
As is customary, I have done my AD review of draft-ietf-rtgwg-yang-rip-04. First, I would like to thank the authors, Xufeng, Prateek, and Vikram, as well as the WG for their work on this document.

My one major issue is that this does not conform to the NMDA guidelines - where augmenting -state models is not preferred.  It is quite acceptable to have that in an appendix, if there are implementations. I do see the shepherd's write-up indicates a partial implementation exists. There is some tooling to help convert a model to conform to NMDA; I've cc'd Rob Wilton, who was working on that.

I also have some questions.

1) For the prefix-set-ref, I don't see any information about what the string should contain.

2) For the route-policy-ref, I don't see any information about what the string should contain.

Nits:
a) p.26:"choice auth-type-selection {
                 description
                   "Specify the authentication scheme.
                    The use of the key-chain reference here is
                    designed to align with other proposed protocol
                    models.";"
   Since the key-chain model is approved for RFC publication, the description can be updated.

Once the model conforms to the NMDA guidelines, I will be happy to advance this draft to IETF Last Call.

Thanks,
Alia

module: ietf-rip
  augment /rt:routing/rt:control-plane-protocols/rt:control-plane-protocol:
    +--rw rip
       +--rw originate-default-route!
       |  +--rw route-policy?   route-policy-ref
       +--rw default-metric?               uint8
       +--rw distance?                     uint8
       +--rw triggered-update-threshold?   uint8
       +--rw maximum-paths?                uint8
       +--rw output-delay?                 uint8
       +--rw distribute-list* [prefix-set-name direction]
       |  +--rw prefix-set-name    prefix-set-ref
       |  +--rw direction          enumeration
       |  +--rw if-name?           if:interface-ref
       +--rw redistribute
       |  +--rw bgp* [asn]
       |  |  +--rw asn             inet:as-number
       |  |  +--rw metric?         uint8
       |  |  +--rw route-policy?   route-policy-ref
       |  +--rw cg-nat!
       |  |  +--rw metric?         uint8
       |  |  +--rw route-policy?   route-policy-ref
       |  +--rw connected!
       |  |  +--rw metric?         uint8
       |  |  +--rw route-policy?   route-policy-ref
       |  +--rw ipsec!
       |  |  +--rw metric?         uint8
       |  |  +--rw route-policy?   route-policy-ref
       |  +--rw isis* [instance]
       |  |  +--rw instance        -> 
../../../../../rt:control-plane-protocol/name
       |  |  +--rw level?          enumeration
       |  |  +--rw metric?         uint8
       |  |  +--rw route-policy?   route-policy-ref
       |  +--rw nat!
       |  |  +--rw metric?         uint8
       |  |  +--rw route-policy?   route-policy-ref
       |  +--rw ospfv2* [instance]
       |  |  +--rw instance        -> 
../../../../../rt:control-plane-protocol/name
       |  |  +--rw route-type?     ospf:route-type
       |  |  +--rw metric?         uint8
       |  |  +--rw route-policy?   route-policy-ref
       |  +--rw ospfv3* [instance]
       |  |  +--rw instance        -> 
../../../../../rt:control-plane-protocol/name
       |  |  +--rw route-type?     ospf:route-type
       |  |  +--rw metric?         uint8
       |  |  +--rw route-policy?   route-policy-ref
       |  +--rw ripv2* [instance]
       |  |  +--rw instance        -> 
../../../../../rt:control-plane-protocol/name
       |  |  +--rw metric?         uint8
       |  |  +--rw route-policy?   route-policy-ref
       |  +--rw ripng* [instance]
       |  |  +--rw instance        -> 
../../../../../rt:control-plane-protocol/name
       |  |  +--rw metric?         uint8
       |  |  +--rw route-policy?   route-policy-ref
       |  +--rw static!
       |     +--rw metric?         uint8
       |     +--rw route-policy?   route-policy-ref
       +--rw timers
       |  +--rw update-interval?     uint16
       |  +--rw invalid-interval?    uint16
       |  +--rw holddown-interval?   uint16
       |  +--rw flush-interval?      uint16
       +--rw interfaces
       |  +--rw interface* [interface]
       |     +--rw interface                  if:interface-ref
       |     +--rw authentication
       |     |  +--rw (auth-type-selection)?
       |     |     +--:(auth-key-chain)
       |     |     |  +--rw key-chain?          key-chain:key-chain-ref
       |     |     +--:(auth-key)
       |     |        +--rw key?                string
       |     |        +--rw crypto-algorithm?   identityref
       |     +--rw bfd {bfd}?
       |     |  +--rw enabled?                    boolean
       |     |  +--rw local-multiplier?           bfd-multiplier
       |     |  +--rw (interval-config-type)?
       |     |     +--:(tx-rx-intervals)
       |     |     |  +--rw desired-min-tx-interval     uint32
       |     |     |  +--rw required-min-rx-interval    uint32
       |     |     +--:(single-interval)
       |     |        +--rw min-interval                uint32
       |     +--rw cost?                      uint8
       |     +--rw neighbors {explicit-neighbors}?
       |     |  +--rw neighbor* [address]
       |     |     +--rw address    inet:ip-address
       |     +--rw no-listen?                 empty
       |     +--rw originate-default-route!
       |     |  +--rw route-policy?   route-policy-ref
       |     +--rw passive?                   empty
       |     +--rw split-horizon?             enumeration
       |     +--rw summary-address
       |     |  +--rw address?   inet:ip-prefix
       |     |  +--rw metric?    uint8
       |     +--rw timers
       |     |  +--rw update-interval?     uint16
       |     |  +--rw invalid-interval?    uint16
       |     |  +--rw holddown-interval?   uint16
       |     |  +--rw flush-interval?      uint16
       |     +--ro oper-status?               enumeration
       |     +--ro listen?                    boolean
       |     +--ro next-full-update?          uint32
       |     +--ro originate-default-route?   boolean
       |     +--ro poison-reverse?            boolean
       |     +--ro valid-address?             boolean
       |     +--ro statistics {interface-statistics}?
       |        +--ro discontinuity-time?   yang:date-and-time
       |        +--ro bad-packets-rcvd?     yang:counter32
       |        +--ro bad-routes-rcvd?      yang:counter32
       |        +--ro updates-sent?         yang:counter32
       +--ro next-triggered-update?        uint32
       +--ro num-of-routes?                uint32
       +--ro ipv4
       |  +--ro neighbors
       |  |  +--ro neighbor* [ipv4-address]
       |  |     +--ro ipv4-address        inet:ipv4-address
       |  |     +--ro last-update?        yang:date-and-time
       |  |     +--ro bad-packets-rcvd?   yang:counter32
       |  |     +--ro bad-routes-rcvd?    yang:counter32
       |  +--ro routes
       |     +--ro route* [ipv4-prefix]
       |        +--ro ipv4-prefix                     inet:ipv4-prefix
       |        +--ro next-hop?                       inet:ipv4-address
       |        +--ro interface?                      if:interface-ref
       |        +--ro redistributed?                  boolean
       |        +--ro route-type?                     enumeration
       |        +--ro metric?                         uint8
       |        +--ro expire-time?                    uint16
       |        +--ro deleted?                        boolean
       |        +--ro holddown?                       boolean
       |        +--ro need-triggered-update?          boolean
       |        +--ro inactive?                       boolean
       |        +--ro flush-expire-before-holddown?   boolean
       +--ro ipv6
       |  +--ro neighbors
       |  |  +--ro neighbor* [ipv6-address]
       |  |     +--ro ipv6-address        inet:ipv6-address
       |  |     +--ro last-update?        yang:date-and-time
       |  |     +--ro bad-packets-rcvd?   yang:counter32
       |  |     +--ro bad-routes-rcvd?    yang:counter32
       |  +--ro routes
       |     +--ro route* [ipv6-prefix]
       |        +--ro ipv6-prefix                     inet:ipv6-prefix
       |        +--ro next-hop?                       inet:ipv6-address
       |        +--ro interface?                      if:interface-ref
       |        +--ro redistributed?                  boolean
       |        +--ro route-type?                     enumeration
       |        +--ro metric?                         uint8
       |        +--ro expire-time?                    uint16
       |        +--ro deleted?                        boolean
       |        +--ro holddown?                       boolean
       |        +--ro need-triggered-update?          boolean
       |        +--ro inactive?                       boolean
       |        +--ro flush-expire-before-holddown?   boolean
       +--ro statistics {global-statistics}?
          +--ro discontinuity-time?   yang:date-and-time
          +--ro requests-rcvd?        yang:counter32
          +--ro requests-sent?        yang:counter32
          +--ro responses-rcvd?       yang:counter32
          +--ro responses-sent?       yang:counter32

  rpcs:
    +---x clear-rip-route
       +---w input
          +---w rip-instance?   -> 
/rt:routing/control-plane-protocols/control-plane-protocol/name
module ietf-rip {
  yang-version 1.1;
  namespace "urn:ietf:params:xml:ns:yang:ietf-rip";
  prefix rip;

  import ietf-inet-types {
    prefix inet;
  }
  import ietf-yang-types {
    prefix yang;
  }
  import ietf-interfaces {
    prefix if;
  }
  import ietf-ip {
    prefix ip;
  }
  import ietf-routing {
    prefix rt;
  }
  import ietf-key-chain {
    prefix key-chain;
  }
  import ietf-bfd {
    prefix bfd;
  }
  import ietf-ospf {
    prefix ospf;
  }
  import ietf-isis {
    prefix isis;
  }

  organization
    "IETF Routing Area Working Group (rtgwg)";
  contact
    "WG Web:   <http://tools.ietf.org/wg/rgtwg/>
     WG List:  <mailto:[email protected]>

     WG Chair: Jeff Tantsura
               <mailto:[email protected]>

     WG Chair: Chris Bowers
               <mailto:[email protected]>

     Editor:   Xufeng Liu
               <mailto:[email protected]>

     Editor:   Prateek Sarda
               <mailto:[email protected]>

     Editor:   Vikram Choudhary
               <mailto:[email protected]>";
  description
    "This YANG module defines a model for managing Routing
     Information Protocol (RIP), including RIP version 2 and RIPng.

     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).";

  revision 2017-06-05 {
    description
      "Initial revision.";
    reference
      "RFC 2453: RIP Version 2.
       RFC 2080: RIPng for IPv6.
       RFC 1724: RIP Version 2 MIB Extension.";
  }

  feature bfd {
    description
      "This feature indicates that the RIP implementation on the
       system supports BFD (Bidirectional Forwarding Detection).";
  }

  feature bfd-protocol-parameters {
    description
      "BFD (Bidirectional Forwarding Detection) protocol specific
       parameters support on a RIP interface.";
  }

  feature explicit-neighbors {
    description
      "This feature indicates that the system supports explicit
       neighbor configuration on a RIP interface.";
  }

  feature global-statistics {
    description
      "This feature indicates that the system supports collecting
       global statistic data related to RIP.";
  }

  feature interface-statistics {
    description
      "This feature indicates that the system supports collecting
       per-interface statistic data related to RIP.";
  }

  typedef prefix-set-ref {
    type string;
    description
      "A type for a reference to a prefix list.";
  }

  typedef route-policy-ref {
    type string;
    description
      "A type for a reference to a route policy.";
  }

  identity rip {
    base rt:routing-protocol;
    description
      "Identity for the RIP routing protocol.";
  }

  identity ripv2 {
    base rip:rip;
    description
      "Identity for RIPv2 (RIP version 2).";
  }

  identity ripng {
    base rip:rip;
    description
      "Identity for RIPng.";
  }

  grouping originate-default-route-container {
    description
      "Containing settings whether to originate the default route
       in RIP routing instance.";
    container originate-default-route {
      presence "Present if originating default route is enabled.";
      description
        "Injects the default route into the RIP (RIPv2 or RIPng)
         routing instance.";
      leaf route-policy {
        type route-policy-ref;
        description
          "The conditions of the route policy are applied to the
           default route.";
      }
    }
  }

  grouping redistribute-container {
    description
      "Container of redistribute attributes.";
    container redistribute {
      description
        "Redistributes routes learned from other routing protocols
         into the RIP routing instance.";
      list bgp {
        key "asn";
        description
          "Redistributes routes from the specified BGP (Border
           Gateway Protocol) autonomous system (AS) into the RIP
           routing instance.";
        leaf asn {
          type inet:as-number;
          description
            "BGP autonomous system (AS) number.";
        }
        uses redistribute-route-policy-attributes;
      }
      container cg-nat {
        presence
          "Present if Carrier Grade Network Address Translation
           (CGNAT) routes are redistributed.";
        description
          "Carrier Grade Network Address Translation (CGNAT)
           routes.";
        uses redistribute-route-policy-attributes;
      }
      container connected {
        presence
          "Present if directly attached network routes are
           redistributed.";
        description
          "Redistributes directly attached networks into the RIP
           routing instance.";
        uses redistribute-route-policy-attributes;
      }
      container ipsec {
        presence
          "Present if IP security routing instance routes
           are redistributed.";
        description
          "Redistributes routes from the IP security routing
           instance into the RIP routing instance.";
        uses redistribute-route-policy-attributes;
      }
      list isis {
        key "instance";
        description
          "Redistributes IS-IS routes.";
        leaf instance {
          type leafref {
            path "../../../../../rt:control-plane-protocol/rt:name";
          }
          must 
"derived-from-or-self(../../../../../rt:control-plane-protocol[rt:name = 
current()]/rt:type, 'isis:isis')" {
            description
              "The type of the routing protocol must be 'isis'";
          }
          description
            "Redistributes routes from the specified IS-IS routing
             instance into the RIP routing instance.";
        }
        leaf level {
          type enumeration {
            enum "1" {
              description
                "IS-IS level 1 routes.";
            }
            enum "2" {
              description
                "IS-IS level 1 routes.";
            }
            enum "1-2" {
              description
                "IS-IS level 1-2 routes.";
            }
          }
          description
            "IS-IS level.";
        }
        uses redistribute-route-policy-attributes;
      }
      container nat {
        presence
          "Present if Network Address Translation (NAT) routes
           are redistributed.";
        description
          "Redistributes Network Address Translation (NAT)
           routes into the RIP routing instance.";
        uses redistribute-route-policy-attributes;
      }
      list ospfv2 {
        when "derived-from-or-self(../../../rt:type, 'rip:ripv2')" {
          description
            "Applicable to RIPv2.";
        }
        key "instance";
        description
          "Redistributes routes from the specified OSPFv2 routing
           instance into the RIPv2 routing instance.";
        leaf instance {
          type leafref {
            path "../../../../../rt:control-plane-protocol/rt:name";
          }
          must 
"derived-from-or-self(../../../../../rt:control-plane-protocol[rt:name = 
current()]/rt:type, 'ospf:ospfv2')" {
            description
              "The type of the routing protocol must be 'ospfv2'";
          }
          description
            "OSPFv2 instance ID. Redistributes routes from the
             specified OSPFv2 routing instance into the RIPv2 routing
             instance. ";
        }
        leaf route-type {
          type ospf:route-type;
          description
            "Redistributes only those OSPFv2 routes matching the
             specified route type into the RIPv2 routing instance.";
        }
        uses redistribute-route-policy-attributes;
      }
      list ospfv3 {
        when "derived-from-or-self(../../../rt:type, 'rip:ripng')" {
          description
            "Applicable to RIPng.";
        }
        key "instance";
        description
          "Redistributes routes from the specified OSPFv3 routing
           instance into the RIPng routing instance.";
        leaf instance {
          type leafref {
            path "../../../../../rt:control-plane-protocol/rt:name";
          }
          must 
"derived-from-or-self(../../../../../rt:control-plane-protocol[rt:name = 
current()]/rt:type, 'ospf:ospfv3')" {
            description
              "The type of the routing protocol must be 'ospfv3'";
          }
          description
            "OSPFv3 instance ID. Redistributes routes from the
             specified OSPFv3 routing instance into the RIPng routing
             instance. ";
        }
        leaf route-type {
          type ospf:route-type;
          description
            "Redistributes only those OSPFv3 routes matching the
             specified route type into the RIPng routing instance.";
        }
        uses redistribute-route-policy-attributes;
      }
      list ripv2 {
        when "derived-from-or-self(../../../rt:type, 'rip:ripv2')" {
          description
            "Applicable to RIPv2.";
        }
        key "instance";
        description
          "Redistributes routes from another RIPv2 routing instance
           into the current RIPv2 routing instance.";
        leaf instance {
          type leafref {
            path "../../../../../rt:control-plane-protocol/rt:name";
          }
          must 
"derived-from-or-self(../../../../../rt:control-plane-protocol[rt:name = 
current()]/rt:type, 'rip:ripv2')" {
            description
              "The type of the routing protocol must be 'ripv2'";
          }
          description
            "Redistributes routes from the specified RIPv2 routing
             instance into the RIPv2 routing instance.";
        }
        uses redistribute-route-policy-attributes;
      }
      list ripng {
        when "derived-from-or-self(../../../rt:type, 'rip:ripng')" {
          description
            "Applicable to RIPng.";
        }
        key "instance";
        description
          "Redistributes routes from another RIPng routing instance
           into the current RIPng routing instance.";
        leaf instance {
          type leafref {
            path "../../../../../rt:control-plane-protocol/rt:name";
          }
          must 
"derived-from-or-self(../../../../../rt:control-plane-protocol[rt:name = 
current()]/rt:type, 'rip:ripng')" {
            description
              "The type of the routing protocol must be 'ripng'";
          }
          description
            "Redistributes routes from the specified RIPng routing
             instance into the RIPng routing instance.";
        }
        uses redistribute-route-policy-attributes;
      }
      container static {
        presence "Present if redistributing static routes.";
        description
          "Redistributes static routes into the RIP routing
           instance.";
        uses redistribute-route-policy-attributes;
      }
    }
  }

  grouping redistribute-route-policy-attributes {
    description
      "Attributes for redistributing a route policy.";
    leaf metric {
      type uint8 {
        range "0..16";
      }
      description
        "Metric used for the redistributed route. If a metric is
         not specified, the metric configured with the
         default-metric attribute in RIP router configuration is
         used. If the default-metric attribute has not been
         configured, the default metric for redistributed routes
         is 0.";
    }
    leaf route-policy {
      type route-policy-ref;
      description
        "Applies the conditions of the specified route policy to
         routes that are redistributed into the RIP routing
         instance.";
    }
  }

  grouping timers-container {
    description
      "Container for settings of basic timers";
    container timers {
      must 'invalid-interval >= (update-interval * 3)' {
        description
          "invalid-interval must be at least three times the value
           for the update-interval argument.";
      }
      must 'flush-interval > invalid-interval' {
        description
          "flush-interval must be larger than the value for the
           invalid-interval argument";
      }
      description
        "Timers for the specified RIPv2 or RIPng instance or
         interface.";
      leaf update-interval {
        type uint16 {
          range "1..32767";
        }
        units "seconds";
        default "30";
        description
          "Interval at which RIPv2 or RIPng updates are sent.";
      }
      leaf invalid-interval {
        type uint16 {
          range "1..32767";
        }
        units "seconds";
        default "180";
        description
          "Interval before a route is declared invalid after no
           updates are received. This value is at least three times
           the value for the update-interval argument.";
      }
      leaf holddown-interval {
        type uint16 {
          range "1..32767";
        }
        units "seconds";
        default "180";
        description
          "Interval before better routes are released.";
      }
      leaf flush-interval {
        type uint16 {
          range "1..32767";
        }
        units "seconds";
        default "240";
        description
          "Interval before a route is flushed from the routing
           table. This value must be larger than the value for the
           invalid-interval argument.";
      }
    }
  }

  grouping global-attributes {
    description
      "Global configuration and state attributes.";
    uses originate-default-route-container;
    leaf default-metric {
      type uint8 {
        range "0..16";
      }
      default "0";
      description
        "Set the default metric.";
    }
    leaf distance {
      type uint8 {
        range "1..255";
      }
      default "120";
      description
        "The administrative distance of the RIPv2 or RIPng for the
         current RIPv2 or RIPng instance.";
    }
    leaf triggered-update-threshold {
      type uint8 {
        range "1..30";
      }
      units "seconds";
      default "5";
      description
        "This attribute is used to suppress triggered updates.
         When the arrival of a regularly scheduled update matches the
         number of seconds or is less than the number seconds
         configured with this attribute, the triggered update is
         suppressed.";
    }
    leaf maximum-paths {
      type uint8 {
        range "1..16";
      }
      default "8";
      description
        "The number of multiple equal-cost RIPv2 or RIPng routes
         that can be used as the best paths for balancing the load
         of outgoing traffic packets.";
    }
    leaf output-delay {
      type uint8 {
        range "1..50";
      }
      units "milliseconds";
      description
        "A delay time between packets sent in multipacket
         RIPv2 or RIPng updates.";
    }
  }

  grouping distribute-lists {
    description
      "Grouping for distribute lists.";
    list distribute-list {
      key "prefix-set-name direction";
      description
        "List of distribute-lists, which are used to filter in-coming
         or out-going routing updates.";
      leaf prefix-set-name {
        type prefix-set-ref;
        description
          "Reference to a prefix list to be applied to RIPv2 or
           RIPng packets.";
      }
      leaf direction {
        type enumeration {
          enum "in" {
            description
              "Apply the distribute-list to in-coming routes.";
          }
          enum "out" {
            description
              "Apply the distribute-list to out-going routes.";
          }
        }
        description
          "Direction of the routing updates.";
      }
      leaf if-name {
        type if:interface-ref;
        description
          "Reference to an interface to which the prefix list is
           applied.";
      }
    }
  }

  grouping route-attributes {
    description
      "Grouping for route attributes.";
    leaf redistributed {
      type boolean;
      description
        "Redistributed routes";
    }
    leaf route-type {
      type enumeration {
        enum "connected" {
          description
            "Connected route.";
        }
        enum "external" {
          description
            "External route.";
        }
        enum "external-backup" {
          description
            "External backup route.";
        }
        enum "rip" {
          description
            "RIP route.";
        }
      }
      description
        "Route type.";
    }
    leaf metric {
      type uint8 {
        range "0..16";
      }
      description
        "Route metric.";
    }
    leaf expire-time {
      type uint16;
      description
        "Expiration time.";
    }
    leaf deleted {
      type boolean;
      description
        "Deleted route.";
    }
    leaf holddown {
      type boolean;
      description
        "Holddown route.";
    }
    leaf need-triggered-update {
      type boolean;
      description
        "The route needs triggered update.";
    }
    leaf inactive {
      type boolean;
      description
        "The route is inactive.";
    }
    leaf flush-expire-before-holddown {
      type boolean;
      description
        "The flush timer expired before holddown time.";
    }
  }

  augment "/rt:routing/rt:control-plane-protocols/rt:control-plane-protocol" {
    when "derived-from(rt:type, 'rip:rip')" {
      description
        "This augment is only valid for a routing protocol instance
         of RIP (type 'ripv2' or 'ripng').

         FROM STATE TREE (FIX ME):
         This augment is only valid for a routing protocol instance
         of type 'ripv2' or 'ripng'.";
    }
    description
      "RIP augmentation.

       FROM STATE TREE (FIX ME):
       RIP state.";
    container rip {
      description
        "RIP configuration data.

         FROM STATE TREE (FIX ME):
         RIP operational state.";
      uses global-attributes;
      uses distribute-lists;
      uses redistribute-container;
      uses timers-container;
      container interfaces {
        description
          "Containing a list of RIP interfaces.";
        list interface {
          key "interface";
          description
            "List of RIP interfaces.";
          leaf interface {
            type if:interface-ref;
            must "(derived-from-or-self(../../../../rt:type, 'rip:ripv2') and 
/if:interfaces/if:interface[if:name=current()]/ip:ipv4) or 
(derived-from-or-self(../../../../rt:type, 'rip:ripng') and 
/if:interfaces/if:interface[if:name=current()]/ip:ipv6)" {
              error-message "Invalid interface type.";
              description
                "RIPv2 can be enabled on IPv4 interfae, and
                 RIPng can be enabled on IPv6 interface.";
            }
            description
              "Enable RIP on this interface.";
          }
          container authentication {
            when "derived-from-or-self(../../../../rt:type, 'rip:ripv2')" {
              description
                "Only applicable to RIPv2.";
            }
            description
              "Enables authentication and specifies the
               authentication scheme for the RIP interface";
            choice auth-type-selection {
              description
                "Specify the authentication scheme.
                 The use of the key-chain reference here is
                 designed to align with other proposed protocol
                 models.";
              case auth-key-chain {
                leaf key-chain {
                  type key-chain:key-chain-ref;
                  description
                    "key-chain name";
                }
              }
              case auth-key {
                leaf key {
                  type string;
                  description
                    "Key string in ASCII format.";
                }
                leaf crypto-algorithm {
                  type identityref {
                    base key-chain:crypto-algorithm;
                  }
                  description
                    "Cryptographic algorithm associated with key.";
                }
              }
            }
          }
          container bfd {
            if-feature "bfd";
            description
              "BFD operation.";
            leaf enabled {
              type boolean;
              description
                "True if BFD is enabled for the interface.";
            }
            uses bfd:bfd-grouping-base-cfg-parms {
              if-feature "bfd-protocol-parameters";
            }
          }
          leaf cost {
            type uint8 {
              range "1..16";
            }
            default "1";
            description
              "Interface cost.";
          }
          container neighbors {
            if-feature "explicit-neighbors";
            description
              "Specifies the RIP neighbors. Useful for a
               non-broadcast multiple access (NBMA) network.";
            list neighbor {
              key "address";
              description
                "Specify a RIP neighbor on a non-broadcast network.";
              leaf address {
                type inet:ip-address;
                description
                  "Neighbor IP address.";
              }
            }
          }
          leaf no-listen {
            type empty;
            description
              "Disable the specified interface to receive (listen to)
               and process RIPv2 or RIPng packets.";
          }
          uses originate-default-route-container;
          leaf passive {
            type empty;
            description
              "Disables sending of RIPv2 or RIPng packets on the
               specified interface.

               FROM STATE TREE (FIX ME):
               Sending RIP packets is disabled on the interface.";
            type boolean;
          }
          leaf split-horizon {
            type enumeration {
              enum "simple" {
                description
                  "Enables simple split-horizon processing.";
              }
              enum "poison-reverse" {
                description
                  "Enables split-horizon processing with poison
                   reverse.";
              }
            }
            default "simple";
            description
              "Enables RIPv2 or RIPng split-horizon processing on the
               specified interface.

               FROM STATE TREE (FIX ME):
               'true' if Split Horizon processing is enabled.";
            type boolean;
          }
          container summary-address {
            description
              "Summarizes information about RIPv2 or RIPng routes
               sent over the specified interface in RIPv2 or RIPng
               update packets.";
            leaf address {
              type inet:ip-prefix;
              description
                "IPv4 address, in the form A.B.C.D, and the prefix
                 length, separated by the slash (/) character;
                 or IPv6 address, in the form A:B:C:D:E:F:G:H, and
                 the prefix length, separated by the slash (/)
                 character.";
            }
            leaf metric {
              type uint8 {
                range "0..16";
              }
              description
                "Metric used for the route. If this attribute is not
                 used, the value set through the default-metric
                 attribute in RIPv2 or RIPng router configuration is
                 used for the route. ";
            }
          }
          uses timers-container;
          leaf oper-status {
            type enumeration {
              enum "up" {
                description
                  "RIPv2 or RIPng is operational on this interface.";
              }
              enum "down" {
                description
                  "RIPv2 or RIPng is not operational on this
                   interface.";
              }
            }
            config false;
            description
              "Operational state.";
          }
          leaf listen {
            type boolean;
            config false;
            description
              "The interface is enabled to receive (listen to)
               and process RIPv2 or RIPng packets.";
          }
          leaf next-full-update {
            type uint32;
            config false;
            description
              "Next full update time.";
          }
          leaf originate-default-route {
            type boolean;
            config false;
            description
              "'true' if originating default route is enabled.";
          }
          leaf poison-reverse {
            type boolean;
            config false;
            description
              "'true' if Split Horizon with Poisoned Reverse is
               enabled.";
          }
          leaf valid-address {
            type boolean;
            config false;
            description
              "The interface has a valid address.";
          }
          container statistics {
            if-feature "interface-statistics";
            config false;
            description
              "Interface statistic counters.";
            leaf discontinuity-time {
              type yang:date-and-time;
              description
                "The time on the most recent occasion at which any
                 one or more of the statistic counters suffered a
                 discontinuity. If no such discontinuities have
                 occurred since the last re-initialization of the
                 local management subsystem, then this node contains
                 the time the local management subsystem
                 re-initialized itself.";
            }
            leaf bad-packets-rcvd {
              type yang:counter32;
              description
                "The number of RIP invalid packets received by
                 the RIP process which were subsequently discarded
                 for any reason (e.g. a version 0 packet, or an
                 unknown command type).";
            }
            leaf bad-routes-rcvd {
              type yang:counter32;
              description
                "The number of routes, in valid RIP packets,
                 which were ignored for any reason (e.g. unknown
                 address family, or invalid metric).";
            }
            leaf updates-sent {
              type yang:counter32;
              description
                "The number of triggered RIP updates actually
                 sent on this interface.  This explicitly does
                 NOT include full updates sent containing new
                 information.";
            }
          }
        }
      }
      leaf next-triggered-update {
        type uint32;
        config false;
        description
          "Next triggered update.";
      }
      leaf num-of-routes {
        type uint32;
        config false;
        description
          "The number of routes.";
      }
      container ipv4 {
        when "derived-from-or-self(../../rt:type, 'rip:ripv2')" {
          description
            "IPv4 address family is supported by RIPv2.";
        }
        config false;
        description
          "IPv4 address family information.";
        container neighbors {
          description
            "IPv4 neighbor information.";
          list neighbor {
            key "ipv4-address";
            description
              "A RIPv2 neighbor.";
            leaf ipv4-address {
              type inet:ipv4-address;
              description
                "IP address that a RIP neighbor is using as its
                 source address.";
            }
            leaf last-update {
              type yang:date-and-time;
              description
                "The time when the most recent RIP update was
                 received from this neighbor.";
            }
            leaf bad-packets-rcvd {
              type yang:counter32;
              description
                "The number of RIP invalid packets received from
                 this neighbor which were subsequently discarded
                 for any reason (e.g. a version 0 packet, or an
                 unknown command type).";
            }
            leaf bad-routes-rcvd {
              type yang:counter32;
              description
                "The number of routes received from this neighbor,
                 in valid RIP packets, which were ignored for any
                 reason (e.g. unknown address family, or invalid
                 metric).";
            }
          }
        }
        container routes {
          description
            "IPv4 route information.";
          list route {
            key "ipv4-prefix";
            description
              "A RIPv2 IPv4 route.";
            leaf ipv4-prefix {
              type inet:ipv4-prefix;
              description
                "IP address (in the form A.B.C.D) and prefix length,
                 separated by the slash (/) character. The range of
                 values for the prefix-length is 0 to 32.";
            }
            leaf next-hop {
              type inet:ipv4-address;
              description
                "Next hop IPv4 address.";
            }
            leaf interface {
              type if:interface-ref;
              description
                "The interface that the route uses.";
            }
            uses route-attributes;
          }
        }
      }
      container ipv6 {
        when "derived-from-or-self(../../rt:type, 'rip:ripng')" {
          description
            "IPv6 address family is supported by RIPng.";
        }
        config false;
        description
          "IPv6 address family information.";
        container neighbors {
          description
            "IPv6 neighbor information.";
          list neighbor {
            key "ipv6-address";
            description
              "A RIPng neighbor.";
            leaf ipv6-address {
              type inet:ipv6-address;
              description
                "IP address that a RIP neighbor is using as its
                 source address.";
            }
            leaf last-update {
              type yang:date-and-time;
              description
                "The time when the most recent RIP update was
                 received from this neighbor.";
            }
            leaf bad-packets-rcvd {
              type yang:counter32;
              description
                "The number of RIP invalid packets received from
                 this neighbor which were subsequently discarded
                 for any reason (e.g. a version 0 packet, or an
                 unknown command type).";
            }
            leaf bad-routes-rcvd {
              type yang:counter32;
              description
                "The number of routes received from this neighbor,
                 in valid RIP packets, which were ignored for any
                 reason (e.g. unknown address family, or invalid
                 metric).";
            }
          }
        }
        container routes {
          description
            "IPv6 route information.";
          list route {
            key "ipv6-prefix";
            description
              "A RIPng IPv6 route.";
            leaf ipv6-prefix {
              type inet:ipv6-prefix;
              description
                "IP address (in the canonical format defined in
                 RFC5952) and prefix length, separated by the slash
                 (/) character. The range of values for the
                 prefix-length is 0 to 128.";
            }
            leaf next-hop {
              type inet:ipv6-address;
              description
                "Next hop IPv6 address.";
            }
            leaf interface {
              type if:interface-ref;
              description
                "The interface that the route uses.";
            }
            uses route-attributes;
          }
        }
      }
      container statistics {
        if-feature "global-statistics";
        config false;
        description
          "Global statistic counters.";
        leaf discontinuity-time {
          type yang:date-and-time;
          description
            "The time on the most recent occasion at which any one
             or more of the statistic counters suffered a
             discontinuity. If no such discontinuities have occurred
             since the last re-initialization of the local
             management subsystem, then this node contains the time
             the local management subsystem re-initialized itself.";
        }
        leaf requests-rcvd {
          type yang:counter32;
          description
            "The number of requests received by RIP.";
        }
        leaf requests-sent {
          type yang:counter32;
          description
            "The number of requests sent by RIP.";
        }
        leaf responses-rcvd {
          type yang:counter32;
          description
            "The number of responses received by RIP.";
        }
        leaf responses-sent {
          type yang:counter32;
          description
            "The number of responses sent by RIP.";
        }
      }
    }
  }
  rpc clear-rip-route {
    description
      "Clears RIP routes from the IP routing table and routes
       redistributed into the RIP protocol for the specified RIP
       instance or for all RIP instances in the current context.";
    input {
      leaf rip-instance {
        type leafref {
          path 
"/rt:routing/rt:control-plane-protocols/rt:control-plane-protocol/rt:name";
        }
        description
          "Instance name identifying a specific RIP instance.
           This leaf is optional for the rpc.
           If it is specified, the rpc will clear all routes in the
           specified RIP instance;
           if it is not specified, the rpc will clear all routes in
           all RIP instances.";
      }
    }
  }
}
612c612,616
<          of RIP (type 'ripv2' or 'ripng').";
---
>          of RIP (type 'ripv2' or 'ripng').
> 
>          FROM STATE TREE (FIX ME):
>          This augment is only valid for a routing protocol instance
>          of type 'ripv2' or 'ripng'.";
615c619,622
<       "RIP augmentation.";
---
>       "RIP augmentation.
> 
>        FROM STATE TREE (FIX ME):
>        RIP state.";
618c625,628
<         "RIP configuration data.";
---
>         "RIP configuration data.
> 
>          FROM STATE TREE (FIX ME):
>          RIP operational state.";
726c736,740
<                specified interface.";
---
>                specified interface.
> 
>                FROM STATE TREE (FIX ME):
>                Sending RIP packets is disabled on the interface.";
>             type boolean;
743c757,761
<                specified interface.";
---
>                specified interface.
> 
>                FROM STATE TREE (FIX ME):
>                'true' if Split Horizon processing is enabled.";
>             type boolean;
771,810d788
<         }
<       }
<     }
<   }
<   augment 
"/rt:routing-state/rt:control-plane-protocols/rt:control-plane-protocol" {
<     when "derived-from(rt:type, 'rip:rip')" {
<       description
<         "This augment is only valid for a routing protocol instance
<          of type 'ripv2' or 'ripng'.";
<     }
<     description
<       "RIP state.";
<     container rip {
<       description
<         "RIP operational state.";
<       uses global-attributes;
<       uses distribute-lists;
<       leaf next-triggered-update {
<         type uint32;
<         description
<           "Next triggered update.";
<       }
<       leaf num-of-routes {
<         type uint32;
<         description
<           "The number of routes.";
<       }
<       uses timers-container;
<       container interfaces {
<         description
<           "Containing a list of RIP interfaces.";
<         list interface {
<           key "interface";
<           description
<             "List of RIP interfaces.";
<           leaf interface {
<             type if:interface-ref;
<             description
<               "Enable RIP on this interface.";
<           }
822a801
>             config false;
826,833d804
<           leaf cost {
<             type uint8 {
<               range "1..16";
<             }
<             default "1";
<             description
<               "Interface cost.";
<           }
835a807
>             config false;
841a814
>             config false;
846a820
>             config false;
850,854d823
<           leaf passive {
<             type boolean;
<             description
<               "Sending RIP packets is disabled on the interface.";
<           }
856a826
>             config false;
861,865d830
<           leaf split-horizon {
<             type boolean;
<             description
<               "'true' if Split Horizon processing is enabled.";
<           }
867a833
>             config false;
871d836
<           uses timers-container;
873a839
>             config false;
912a879,890
>       leaf next-triggered-update {
>         type uint32;
>         config false;
>         description
>           "Next triggered update.";
>       }
>       leaf num-of-routes {
>         type uint32;
>         config false;
>         description
>           "The number of routes.";
>       }
917a896
>         config false;
989a969
>         config false;
1059a1040
>         config false;
65,122c65,99
<           +--rw interface* [interface]
<              +--rw interface                  if:interface-ref
<              +--rw authentication
<              |  +--rw (auth-type-selection)?
<              |     +--:(auth-key-chain)
<              |     |  +--rw key-chain?          key-chain:key-chain-ref
<              |     +--:(auth-key)
<              |        +--rw key?                string
<              |        +--rw crypto-algorithm?   identityref
<              +--rw bfd {bfd}?
<              |  +--rw enabled?                    boolean
<              |  +--rw local-multiplier?           bfd-multiplier
<              |  +--rw (interval-config-type)?
<              |     +--:(tx-rx-intervals)
<              |     |  +--rw desired-min-tx-interval     uint32
<              |     |  +--rw required-min-rx-interval    uint32
<              |     +--:(single-interval)
<              |        +--rw min-interval                uint32
<              +--rw cost?                      uint8
<              +--rw neighbors {explicit-neighbors}?
<              |  +--rw neighbor* [address]
<              |     +--rw address    inet:ip-address
<              +--rw no-listen?                 empty
<              +--rw originate-default-route!
<              |  +--rw route-policy?   route-policy-ref
<              +--rw passive?                   empty
<              +--rw split-horizon?             enumeration
<              +--rw summary-address
<              |  +--rw address?   inet:ip-prefix
<              |  +--rw metric?    uint8
<              +--rw timers
<                 +--rw update-interval?     uint16
<                 +--rw invalid-interval?    uint16
<                 +--rw holddown-interval?   uint16
<                 +--rw flush-interval?      uint16
<   augment 
/rt:routing-state/rt:control-plane-protocols/rt:control-plane-protocol:
<     +--ro rip
<        +--ro originate-default-route!
<        |  +--ro route-policy?   route-policy-ref
<        +--ro default-metric?               uint8
<        +--ro distance?                     uint8
<        +--ro triggered-update-threshold?   uint8
<        +--ro maximum-paths?                uint8
<        +--ro output-delay?                 uint8
<        +--ro distribute-list* [prefix-set-name direction]
<        |  +--ro prefix-set-name    prefix-set-ref
<        |  +--ro direction          enumeration
<        |  +--ro if-name?           if:interface-ref
<        +--ro next-triggered-update?        uint32
<        +--ro num-of-routes?                uint32
<        +--ro timers
<        |  +--ro update-interval?     uint16
<        |  +--ro invalid-interval?    uint16
<        |  +--ro holddown-interval?   uint16
<        |  +--ro flush-interval?      uint16
<        +--ro interfaces
<        |  +--ro interface* [interface]
<        |     +--ro interface                  if:interface-ref
---
>        |  +--rw interface* [interface]
>        |     +--rw interface                  if:interface-ref
>        |     +--rw authentication
>        |     |  +--rw (auth-type-selection)?
>        |     |     +--:(auth-key-chain)
>        |     |     |  +--rw key-chain?          key-chain:key-chain-ref
>        |     |     +--:(auth-key)
>        |     |        +--rw key?                string
>        |     |        +--rw crypto-algorithm?   identityref
>        |     +--rw bfd {bfd}?
>        |     |  +--rw enabled?                    boolean
>        |     |  +--rw local-multiplier?           bfd-multiplier
>        |     |  +--rw (interval-config-type)?
>        |     |     +--:(tx-rx-intervals)
>        |     |     |  +--rw desired-min-tx-interval     uint32
>        |     |     |  +--rw required-min-rx-interval    uint32
>        |     |     +--:(single-interval)
>        |     |        +--rw min-interval                uint32
>        |     +--rw cost?                      uint8
>        |     +--rw neighbors {explicit-neighbors}?
>        |     |  +--rw neighbor* [address]
>        |     |     +--rw address    inet:ip-address
>        |     +--rw no-listen?                 empty
>        |     +--rw originate-default-route!
>        |     |  +--rw route-policy?   route-policy-ref
>        |     +--rw passive?                   empty
>        |     +--rw split-horizon?             enumeration
>        |     +--rw summary-address
>        |     |  +--rw address?   inet:ip-prefix
>        |     |  +--rw metric?    uint8
>        |     +--rw timers
>        |     |  +--rw update-interval?     uint16
>        |     |  +--rw invalid-interval?    uint16
>        |     |  +--rw holddown-interval?   uint16
>        |     |  +--rw flush-interval?      uint16
124d100
<        |     +--ro cost?                      uint8
128d103
<        |     +--ro passive?                   boolean
130d104
<        |     +--ro split-horizon?             boolean
132,136d105
<        |     +--ro timers
<        |     |  +--ro update-interval?     uint16
<        |     |  +--ro invalid-interval?    uint16
<        |     |  +--ro holddown-interval?   uint16
<        |     |  +--ro flush-interval?      uint16
141a111,112
>        +--ro next-triggered-update?        uint32
>        +--ro num-of-routes?                uint32
module: ietf-rip
  augment /rt:routing/rt:control-plane-protocols/rt:control-plane-protocol:
    +--rw rip
       +--rw originate-default-route!
       |  +--rw route-policy?   route-policy-ref
       +--rw default-metric?               uint8
       +--rw distance?                     uint8
       +--rw triggered-update-threshold?   uint8
       +--rw maximum-paths?                uint8
       +--rw output-delay?                 uint8
       +--rw distribute-list* [prefix-set-name direction]
       |  +--rw prefix-set-name    prefix-set-ref
       |  +--rw direction          enumeration
       |  +--rw if-name?           if:interface-ref
       +--rw redistribute
       |  +--rw bgp* [asn]
       |  |  +--rw asn             inet:as-number
       |  |  +--rw metric?         uint8
       |  |  +--rw route-policy?   route-policy-ref
       |  +--rw cg-nat!
       |  |  +--rw metric?         uint8
       |  |  +--rw route-policy?   route-policy-ref
       |  +--rw connected!
       |  |  +--rw metric?         uint8
       |  |  +--rw route-policy?   route-policy-ref
       |  +--rw ipsec!
       |  |  +--rw metric?         uint8
       |  |  +--rw route-policy?   route-policy-ref
       |  +--rw isis* [instance]
       |  |  +--rw instance        -> 
../../../../../rt:control-plane-protocol/name
       |  |  +--rw level?          enumeration
       |  |  +--rw metric?         uint8
       |  |  +--rw route-policy?   route-policy-ref
       |  +--rw nat!
       |  |  +--rw metric?         uint8
       |  |  +--rw route-policy?   route-policy-ref
       |  +--rw ospfv2* [instance]
       |  |  +--rw instance        -> 
../../../../../rt:control-plane-protocol/name
       |  |  +--rw route-type?     ospf:route-type
       |  |  +--rw metric?         uint8
       |  |  +--rw route-policy?   route-policy-ref
       |  +--rw ospfv3* [instance]
       |  |  +--rw instance        -> 
../../../../../rt:control-plane-protocol/name
       |  |  +--rw route-type?     ospf:route-type
       |  |  +--rw metric?         uint8
       |  |  +--rw route-policy?   route-policy-ref
       |  +--rw ripv2* [instance]
       |  |  +--rw instance        -> 
../../../../../rt:control-plane-protocol/name
       |  |  +--rw metric?         uint8
       |  |  +--rw route-policy?   route-policy-ref
       |  +--rw ripng* [instance]
       |  |  +--rw instance        -> 
../../../../../rt:control-plane-protocol/name
       |  |  +--rw metric?         uint8
       |  |  +--rw route-policy?   route-policy-ref
       |  +--rw static!
       |     +--rw metric?         uint8
       |     +--rw route-policy?   route-policy-ref
       +--rw timers
       |  +--rw update-interval?     uint16
       |  +--rw invalid-interval?    uint16
       |  +--rw holddown-interval?   uint16
       |  +--rw flush-interval?      uint16
       +--rw interfaces
          +--rw interface* [interface]
             +--rw interface                  if:interface-ref
             +--rw authentication
             |  +--rw (auth-type-selection)?
             |     +--:(auth-key-chain)
             |     |  +--rw key-chain?          key-chain:key-chain-ref
             |     +--:(auth-key)
             |        +--rw key?                string
             |        +--rw crypto-algorithm?   identityref
             +--rw bfd {bfd}?
             |  +--rw enabled?                    boolean
             |  +--rw local-multiplier?           bfd-multiplier
             |  +--rw (interval-config-type)?
             |     +--:(tx-rx-intervals)
             |     |  +--rw desired-min-tx-interval     uint32
             |     |  +--rw required-min-rx-interval    uint32
             |     +--:(single-interval)
             |        +--rw min-interval                uint32
             +--rw cost?                      uint8
             +--rw neighbors {explicit-neighbors}?
             |  +--rw neighbor* [address]
             |     +--rw address    inet:ip-address
             +--rw no-listen?                 empty
             +--rw originate-default-route!
             |  +--rw route-policy?   route-policy-ref
             +--rw passive?                   empty
             +--rw split-horizon?             enumeration
             +--rw summary-address
             |  +--rw address?   inet:ip-prefix
             |  +--rw metric?    uint8
             +--rw timers
                +--rw update-interval?     uint16
                +--rw invalid-interval?    uint16
                +--rw holddown-interval?   uint16
                +--rw flush-interval?      uint16
  augment 
/rt:routing-state/rt:control-plane-protocols/rt:control-plane-protocol:
    +--ro rip
       +--ro originate-default-route!
       |  +--ro route-policy?   route-policy-ref
       +--ro default-metric?               uint8
       +--ro distance?                     uint8
       +--ro triggered-update-threshold?   uint8
       +--ro maximum-paths?                uint8
       +--ro output-delay?                 uint8
       +--ro distribute-list* [prefix-set-name direction]
       |  +--ro prefix-set-name    prefix-set-ref
       |  +--ro direction          enumeration
       |  +--ro if-name?           if:interface-ref
       +--ro next-triggered-update?        uint32
       +--ro num-of-routes?                uint32
       +--ro timers
       |  +--ro update-interval?     uint16
       |  +--ro invalid-interval?    uint16
       |  +--ro holddown-interval?   uint16
       |  +--ro flush-interval?      uint16
       +--ro interfaces
       |  +--ro interface* [interface]
       |     +--ro interface                  if:interface-ref
       |     +--ro oper-status?               enumeration
       |     +--ro cost?                      uint8
       |     +--ro listen?                    boolean
       |     +--ro next-full-update?          uint32
       |     +--ro originate-default-route?   boolean
       |     +--ro passive?                   boolean
       |     +--ro poison-reverse?            boolean
       |     +--ro split-horizon?             boolean
       |     +--ro valid-address?             boolean
       |     +--ro timers
       |     |  +--ro update-interval?     uint16
       |     |  +--ro invalid-interval?    uint16
       |     |  +--ro holddown-interval?   uint16
       |     |  +--ro flush-interval?      uint16
       |     +--ro statistics {interface-statistics}?
       |        +--ro discontinuity-time?   yang:date-and-time
       |        +--ro bad-packets-rcvd?     yang:counter32
       |        +--ro bad-routes-rcvd?      yang:counter32
       |        +--ro updates-sent?         yang:counter32
       +--ro ipv4
       |  +--ro neighbors
       |  |  +--ro neighbor* [ipv4-address]
       |  |     +--ro ipv4-address        inet:ipv4-address
       |  |     +--ro last-update?        yang:date-and-time
       |  |     +--ro bad-packets-rcvd?   yang:counter32
       |  |     +--ro bad-routes-rcvd?    yang:counter32
       |  +--ro routes
       |     +--ro route* [ipv4-prefix]
       |        +--ro ipv4-prefix                     inet:ipv4-prefix
       |        +--ro next-hop?                       inet:ipv4-address
       |        +--ro interface?                      if:interface-ref
       |        +--ro redistributed?                  boolean
       |        +--ro route-type?                     enumeration
       |        +--ro metric?                         uint8
       |        +--ro expire-time?                    uint16
       |        +--ro deleted?                        boolean
       |        +--ro holddown?                       boolean
       |        +--ro need-triggered-update?          boolean
       |        +--ro inactive?                       boolean
       |        +--ro flush-expire-before-holddown?   boolean
       +--ro ipv6
       |  +--ro neighbors
       |  |  +--ro neighbor* [ipv6-address]
       |  |     +--ro ipv6-address        inet:ipv6-address
       |  |     +--ro last-update?        yang:date-and-time
       |  |     +--ro bad-packets-rcvd?   yang:counter32
       |  |     +--ro bad-routes-rcvd?    yang:counter32
       |  +--ro routes
       |     +--ro route* [ipv6-prefix]
       |        +--ro ipv6-prefix                     inet:ipv6-prefix
       |        +--ro next-hop?                       inet:ipv6-address
       |        +--ro interface?                      if:interface-ref
       |        +--ro redistributed?                  boolean
       |        +--ro route-type?                     enumeration
       |        +--ro metric?                         uint8
       |        +--ro expire-time?                    uint16
       |        +--ro deleted?                        boolean
       |        +--ro holddown?                       boolean
       |        +--ro need-triggered-update?          boolean
       |        +--ro inactive?                       boolean
       |        +--ro flush-expire-before-holddown?   boolean
       +--ro statistics {global-statistics}?
          +--ro discontinuity-time?   yang:date-and-time
          +--ro requests-rcvd?        yang:counter32
          +--ro requests-sent?        yang:counter32
          +--ro responses-rcvd?       yang:counter32
          +--ro responses-sent?       yang:counter32

  rpcs:
    +---x clear-rip-route
       +---w input
          +---w rip-instance?   -> 
/rt:routing/control-plane-protocols/control-plane-protocol/name
_______________________________________________
rtgwg mailing list
[email protected]
https://www.ietf.org/mailman/listinfo/rtgwg

Reply via email to