draft-ietf-rtgwg-yang-rip-04.txt   draft-ietf-rtgwg-yang-rip-05.txt 
Network Working Group X. Liu Network Working Group X. Liu
Internet-Draft Jabil Internet-Draft Jabil
Intended status: Standards Track P. Sarda Intended status: Standards Track P. Sarda
Expires: December 8, 2017 Ericsson Expires: April 3, 2018 Ericsson
V. Choudhary V. Choudhary
Huawei Technologies Individual
June 6, 2017 September 30, 2017
A YANG Data Model for Routing Information Protocol (RIP) A YANG Data Model for Routing Information Protocol (RIP)
draft-ietf-rtgwg-yang-rip-04 draft-ietf-rtgwg-yang-rip-05
Abstract Abstract
This document describes a data model for the Routing Information This document describes a data model for the Routing Information
Protocol (RIP). Both RIP version 2 and RIPng are covered. Protocol (RIP). Both RIP version 2 and RIPng are covered.
Status of This Memo Status of This Memo
This Internet-Draft is submitted in full conformance with the This Internet-Draft is submitted in full conformance with the
provisions of BCP 78 and BCP 79. provisions of BCP 78 and BCP 79.
skipping to change at page 1, line 34 skipping to change at page 1, line 34
Internet-Drafts are working documents of the Internet Engineering Internet-Drafts are working documents of the Internet Engineering
Task Force (IETF). Note that other groups may also distribute Task Force (IETF). Note that other groups may also distribute
working documents as Internet-Drafts. The list of current Internet- working documents as Internet-Drafts. The list of current Internet-
Drafts is at http://datatracker.ietf.org/drafts/current/. Drafts is at http://datatracker.ietf.org/drafts/current/.
Internet-Drafts are draft documents valid for a maximum of six months Internet-Drafts are draft documents valid for a maximum of six months
and may be updated, replaced, or obsoleted by other documents at any and may be updated, replaced, or obsoleted by other documents at any
time. It is inappropriate to use Internet-Drafts as reference time. It is inappropriate to use Internet-Drafts as reference
material or to cite them other than as "work in progress." material or to cite them other than as "work in progress."
This Internet-Draft will expire on December 8, 2017. This Internet-Draft will expire on April 3, 2018.
Copyright Notice Copyright Notice
Copyright (c) 2017 IETF Trust and the persons identified as the Copyright (c) 2017 IETF Trust and the persons identified as the
document authors. All rights reserved. document authors. All rights reserved.
This document is subject to BCP 78 and the IETF Trust's Legal This document is subject to BCP 78 and the IETF Trust's Legal
Provisions Relating to IETF Documents Provisions Relating to IETF Documents
(http://trustee.ietf.org/license-info) in effect on the date of (http://trustee.ietf.org/license-info) in effect on the date of
publication of this document. Please review these documents publication of this document. Please review these documents
skipping to change at page 2, line 16 skipping to change at page 2, line 16
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 2 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 2
1.1. Terminology . . . . . . . . . . . . . . . . . . . . . . . 2 1.1. Terminology . . . . . . . . . . . . . . . . . . . . . . . 2
1.2. Tree Diagrams . . . . . . . . . . . . . . . . . . . . . . 3 1.2. Tree Diagrams . . . . . . . . . . . . . . . . . . . . . . 3
1.3. Prefixes in Data Node Names . . . . . . . . . . . . . . . 3 1.3. Prefixes in Data Node Names . . . . . . . . . . . . . . . 3
2. Design of the Data Model . . . . . . . . . . . . . . . . . . 4 2. Design of the Data Model . . . . . . . . . . . . . . . . . . 4
2.1. Scope of the Model . . . . . . . . . . . . . . . . . . . 4 2.1. Scope of the Model . . . . . . . . . . . . . . . . . . . 4
2.2. Relation with Core Routing Framework . . . . . . . . . . 4 2.2. Relation with Core Routing Framework . . . . . . . . . . 4
2.3. Protocol Configuration . . . . . . . . . . . . . . . . . 5 2.3. Protocol Configuration . . . . . . . . . . . . . . . . . 5
2.4. Protocol States . . . . . . . . . . . . . . . . . . . . . 5 2.4. Protocol States . . . . . . . . . . . . . . . . . . . . . 5
2.5. RPC Operations . . . . . . . . . . . . . . . . . . . . . 6 2.5. RPC Operations . . . . . . . . . . . . . . . . . . . . . 7
2.6. Notifications . . . . . . . . . . . . . . . . . . . . . . 6 2.6. Notifications . . . . . . . . . . . . . . . . . . . . . . 7
2.7. Optional Features . . . . . . . . . . . . . . . . . . . . 7 2.7. Optional Features . . . . . . . . . . . . . . . . . . . . 7
3. Tree Structure . . . . . . . . . . . . . . . . . . . . . . . 7 3. Tree Structure . . . . . . . . . . . . . . . . . . . . . . . 7
4. YANG Module . . . . . . . . . . . . . . . . . . . . . . . . . 11 4. YANG Module . . . . . . . . . . . . . . . . . . . . . . . . . 11
5. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 36 5. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 35
6. Security Considerations . . . . . . . . . . . . . . . . . . . 37 6. Security Considerations . . . . . . . . . . . . . . . . . . . 35
7. References . . . . . . . . . . . . . . . . . . . . . . . . . 37 7. References . . . . . . . . . . . . . . . . . . . . . . . . . 36
7.1. Normative References . . . . . . . . . . . . . . . . . . 37 7.1. Normative References . . . . . . . . . . . . . . . . . . 36
7.2. Informative References . . . . . . . . . . . . . . . . . 39 7.2. Informative References . . . . . . . . . . . . . . . . . 37
Appendix A. Data Tree Example . . . . . . . . . . . . . . . . . 40 Appendix A. Data Tree Example . . . . . . . . . . . . . . . . . 39
Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 43 Appendix B. YANG Model for Non-NMDA Compliant Implementations . 43
B.1. Non-NMDA YANG Module . . . . . . . . . . . . . . . . . . 43
B.2. Non-NMDA Model Tree Structure . . . . . . . . . . . . . . 68
Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 73
1. Introduction 1. Introduction
This document introduces a YANG [RFC7950] data model for the Routing This document introduces a YANG [RFC7950] data model for the Routing
Information Protocol (RIP) [RFC2453][RFC2080]. RIP was designed to Information Protocol (RIP) [RFC2453][RFC2080]. RIP was designed to
work as an Interior Gateway Protocol (IGP) in moderate-size work as an Interior Gateway Protocol (IGP) in moderate-size
Autonomous Systems (AS). Autonomous Systems (AS).
This YANG model supports both RIP version 2 and RIPng. RIP version 2 This YANG model supports both RIP version 2 and RIPng. RIP version 2
(defined in [RFC2453]) supports IPv4. RIPng (defined in [RFC2080]) (defined in [RFC2453]) supports IPv4. RIPng (defined in [RFC2080])
skipping to change at page 3, line 37 skipping to change at page 4, line 5
shown. shown.
1.3. Prefixes in Data Node Names 1.3. Prefixes in Data Node Names
In this document, names of data nodes, actions, and other data model In this document, names of data nodes, actions, and other data model
objects are often used without a prefix, as long as it is clear from objects are often used without a prefix, as long as it is clear from
the context in which YANG module each name is defined. Otherwise, the context in which YANG module each name is defined. Otherwise,
names are prefixed using the standard prefix associated with the names are prefixed using the standard prefix associated with the
corresponding YANG module, as shown in Table 1. corresponding YANG module, as shown in Table 1.
+-----------+-----------------+---------------------------------+ +-----------+-----------------+-----------------------------------+
| Prefix | YANG module | Reference | | Prefix | YANG module | Reference |
+-----------+-----------------+---------------------------------+ +-----------+-----------------+-----------------------------------+
| yang | ietf-yang-types | [RFC6991] | | yang | ietf-yang-types | [RFC6991] |
| inet | ietf-inet-types | [RFC6991] | | inet | ietf-inet-types | [RFC6991] |
| if | ietf-interfaces | [RFC7223] | | if | ietf-interfaces | [I-D.bjorklund-netmod-rfc7223bis] |
| ip | ietf-ip | [RFC7277] | | ip | ietf-ip | [I-D.bjorklund-netmod-rfc7277bis] |
| rt | ietf-routing | [RFC8022] | | rt | ietf-routing-2 | [I-D.acee-netmod-rfc8022bis] |
| bfd | ietf-bfd | [I-D.ietf-bfd-yang] | | bfd | ietf-bfd | [I-D.ietf-bfd-yang] |
| isis | ietf-isis | [I-D.ietf-isis-yang-isis-cfg] | | isis | ietf-isis | [I-D.ietf-isis-yang-isis-cfg] |
| key-chain | ietf-key-chain | [I-D.ietf-rtgwg-yang-key-chain] | | key-chain | ietf-key-chain | [RFC8177] |
| ospf | ietf-ospf | [I-D.ietf-ospf-yang] | | ospf | ietf-ospf | [I-D.ietf-ospf-yang] |
+-----------+-----------------+---------------------------------+ +-----------+-----------------+-----------------------------------+
Table 1: Prefixes and Corresponding YANG Modules Table 1: Prefixes and Corresponding YANG Modules
2. Design of the Data Model 2. Design of the Data Model
2.1. Scope of the Model 2.1. Scope of the Model
The model covers RIP version 2 [RFC2453] and RIPng [RFC2080] The model covers RIP version 2 [RFC2453] and RIPng [RFC2080]
protocols. The model is designed to be implemented on a device where protocols. The model is designed to be implemented on a device where
RIP version 2 or RIPng is implemented, and can be used to: RIP version 2 or RIPng is implemented, and can be used to:
skipping to change at page 4, line 23 skipping to change at page 4, line 39
o Configure the RIP version 2 or RIPng protocol. o Configure the RIP version 2 or RIPng protocol.
o Manage the protocol operational behaviors. o Manage the protocol operational behaviors.
o Retrieve the protocol operational status. o Retrieve the protocol operational status.
The capabilities describe in [RFC1724] are covered. The capabilities describe in [RFC1724] are covered.
2.2. Relation with Core Routing Framework 2.2. Relation with Core Routing Framework
This model augments the core routing data model "ietf-routing" This model augments the core routing data model "ietf-routing-2"
specified in [RFC8022]. specified in [I-D.acee-netmod-rfc8022bis].
+--rw routing +--rw routing
+--rw router-id? +--rw router-id?
+--rw control-plane-protocols +--rw control-plane-protocols
| +--rw control-plane-protocol* [type name] | +--rw control-plane-protocol* [type name]
| +--rw type | +--rw type
| +--rw name | +--rw name
| +--rw rip <= Augmented by this Model | +--rw rip <= Augmented by this Model
... ...
+--ro routing-state
+--ro router-id?
+--ro control-plane-protocols
| +--ro control-plane-protocol* [type name]
| +--ro type
| +--ro name
| +--ro rip <= Augmented by this Model
...
The "rip" container instantiates a RIP protocol entity that supports The "rip" container instantiates a RIP protocol entity that supports
RIP version 2 or RIPng. Depending on the implementation of "ietf- RIP version 2 or RIPng. Depending on the implementation of "ietf-
routing", a RIP instance MAY belong to a logical router or network routing-2", a RIP instance MAY belong to a logical router or network
instance. instance.
2.3. Protocol Configuration 2.3. Protocol Configuration
The model structure for the protocol configuration is as shown below: The model structure for the protocol configuration is as shown below:
augment /rt:routing/rt:control-plane-protocols/ augment /rt:routing/rt:control-plane-protocols/
rt:control-plane-protocol: rt:control-plane-protocol:
+--rw rip +--rw rip
+--rw <per instance configuration> +--rw <per instance configuration>
skipping to change at page 6, line 5 skipping to change at page 6, line 5
o Protocol instance (RIP version 2 or RIPng) o Protocol instance (RIP version 2 or RIPng)
o Interface o Interface
o Neighbor o Neighbor
2.4. Protocol States 2.4. Protocol States
The model structure for the protocol states is as shown below: The model structure for the protocol states is as shown below:
augment /rt:routing-state/rt:control-plane-protocols/ augment /rt:routing/rt:control-plane-protocols/
rt:control-plane-protocol: rt:control-plane-protocol:
+--ro rip +--rw rip
+--ro <per instance operational states> +--ro <per instance operational states>
+--ro interface* [interface] +--rw interface* [interface]
| +--ro interface if:interface-ref | +--rw interface if:interface-ref
| +--ro <per instance operational states> | +--ro <per instance operational states>
| +--ro statistics {interface-statistics}? | +--ro statistics {interface-statistics}?
| +--ro <per instance statistics> | +--ro <per instance statistics>
+--ro ipv4 +--ro ipv4
| +--ro neighbors | +--ro neighbors
| | +--ro neighbor* [ipv4-address] | | +--ro neighbor* [ipv4-address]
| | +--ro <per neighbor IPv4 operational states> | | +--ro <per neighbor IPv4 operational states>
| +--ro routes | +--ro routes
| +--ro route* [ipv4-prefix] | +--ro route* [ipv4-prefix]
| +--ro <IPv4 RIP route states> | +--ro <IPv4 RIP route states>
skipping to change at page 6, line 32 skipping to change at page 6, line 32
| +--ro neighbors | +--ro neighbors
| | +--ro neighbor* [ipv6-address] | | +--ro neighbor* [ipv6-address]
| | +--ro <per neighbor IPv6 operational states> | | +--ro <per neighbor IPv6 operational states>
| +--ro routes | +--ro routes
| +--ro route* [ipv6-prefix] | +--ro route* [ipv6-prefix]
| +--ro ipv6-prefix inet:ipv6-prefix | +--ro ipv6-prefix inet:ipv6-prefix
| +--ro <IPv4 RIP route states> | +--ro <IPv4 RIP route states>
+--ro statistics {global-statistics}? +--ro statistics {global-statistics}?
+--ro <per instance statistics> +--ro <per instance statistics>
This model conforms to the Network Management Datastore Architecture
(NMDA) [I-D.ietf-netmod-revised-datastores]. The operational state
data is combined with the associated configuration data in the same
hierarchy [I-D.ietf-netmod-rfc6087bis]. When protocol states are
retrieved from the NMDA operational state datastore, the returned
states cover all "config true" (rw) and "config false" (ro) nodes
defined in the schema.
The model allows to retrieve protocol states at the following levels: The model allows to retrieve protocol states at the following levels:
o Protocol instance (RIP version 2 or RIPng) o Protocol instance (RIP version 2 or RIPng)
o Interface o Interface
o Neighbor o Neighbor
o Route o Route
skipping to change at page 7, line 26 skipping to change at page 7, line 36
This model defines several features are beyond the basic RIP This model defines several features are beyond the basic RIP
configuration and it is the responsibility of each vendor to decide configuration and it is the responsibility of each vendor to decide
whether to support a given feature on a device. whether to support a given feature on a device.
3. Tree Structure 3. Tree Structure
This document defines the YANG module "ietf-rip", which has the This document defines the YANG module "ietf-rip", which has the
following tree structure: following tree structure:
module: ietf-rip module: ietf-rip
augment /rt:routing/rt:control-plane-protocols augment /rt:routing/rt:control-plane-protocols
/rt:control-plane-protocol: /rt:control-plane-protocol:
+--rw rip +--rw rip
+--rw originate-default-route! +--rw originate-default-route
| +--rw route-policy? route-policy-ref | +--rw enabled? boolean
+--rw default-metric? uint8 | +--rw route-policy? route-policy-ref
+--rw distance? uint8 +--rw default-metric? uint8
+--rw triggered-update-threshold? uint8 +--rw distance? uint8
+--rw maximum-paths? uint8 +--rw triggered-update-threshold? uint8
+--rw output-delay? uint8 +--rw maximum-paths? uint8
+--rw distribute-list* [prefix-set-name direction] +--rw output-delay? uint8
| +--rw prefix-set-name prefix-set-ref +--rw distribute-list* [prefix-set-name direction]
| +--rw direction enumeration | +--rw prefix-set-name prefix-set-ref
| +--rw if-name? if:interface-ref | +--rw direction enumeration
+--rw redistribute | +--rw if-name? if:interface-ref
| +--rw bgp* [asn] +--rw redistribute
| | +--rw asn inet:as-number | +--rw bgp* [asn]
| | +--rw metric? uint8 | | +--rw asn inet:as-number
| | +--rw route-policy? route-policy-ref | | +--rw metric? uint8
| +--rw cg-nat! | | +--rw route-policy? route-policy-ref
| | +--rw metric? uint8 | +--rw cg-nat!
| | +--rw route-policy? route-policy-ref | | +--rw metric? uint8
| +--rw connected! | | +--rw route-policy? route-policy-ref
| | +--rw metric? uint8 | +--rw connected!
| | +--rw route-policy? route-policy-ref | | +--rw metric? uint8
| +--rw ipsec! | | +--rw route-policy? route-policy-ref
| | +--rw metric? uint8 | +--rw ipsec!
| | +--rw route-policy? route-policy-ref | | +--rw metric? uint8
| +--rw isis* [instance] | | +--rw route-policy? route-policy-ref
| | +--rw instance leafref | +--rw isis* [instance]
| | +--rw level? enumeration | | +--rw instance -> ../../../../..
| | +--rw metric? uint8 /rt:control-plane-protocol/name
| | +--rw route-policy? route-policy-ref | | +--rw level? enumeration
| +--rw nat! | | +--rw metric? uint8
| | +--rw metric? uint8 | | +--rw route-policy? route-policy-ref
| | +--rw route-policy? route-policy-ref | +--rw nat!
| +--rw ospfv2* [instance] | | +--rw metric? uint8
| | +--rw instance leafref | | +--rw route-policy? route-policy-ref
| | +--rw route-type? ospf:route-type | +--rw ospfv2* [instance]
| | +--rw metric? uint8 | | +--rw instance -> ../../../../..
| | +--rw route-policy? route-policy-ref /rt:control-plane-protocol/name
| +--rw ospfv3* [instance] | | +--rw route-type? ospf:route-type
| | +--rw instance leafref | | +--rw metric? uint8
| | +--rw route-type? ospf:route-type | | +--rw route-policy? route-policy-ref
| | +--rw metric? uint8 | +--rw ospfv3* [instance]
| | +--rw route-policy? route-policy-ref | | +--rw instance -> ../../../../..
| +--rw ripv2* [instance] /rt:control-plane-protocol/name
| | +--rw instance leafref | | +--rw route-type? ospf:route-type
| | +--rw metric? uint8 | | +--rw metric? uint8
| | +--rw route-policy? route-policy-ref | | +--rw route-policy? route-policy-ref
| +--rw ripng* [instance] | +--rw ripv2* [instance]
| | +--rw instance leafref | | +--rw instance -> ../../../../..
| | +--rw metric? uint8 /rt:control-plane-protocol/name
| | +--rw route-policy? route-policy-ref | | +--rw metric? uint8
| +--rw static! | | +--rw route-policy? route-policy-ref
| +--rw metric? uint8 | +--rw ripng* [instance]
| +--rw route-policy? route-policy-ref | | +--rw instance -> ../../../../..
+--rw timers /rt:control-plane-protocol/name
| +--rw update-interval? uint16 | | +--rw metric? uint8
| +--rw invalid-interval? uint16 | | +--rw route-policy? route-policy-ref
| +--rw holddown-interval? uint16 | +--rw static!
| +--rw flush-interval? uint16 | +--rw metric? uint8
+--rw interfaces | +--rw route-policy? route-policy-ref
+--rw interface* [interface] +--rw timers
+--rw interface if:interface-ref | +--rw update-interval? uint16
+--rw authentication | +--rw invalid-interval? uint16
| +--rw (auth-type-selection)? | +--rw holddown-interval? uint16
| +--:(auth-key-chain) | +--rw flush-interval? uint16
| | +--rw key-chain? +--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 key-chain:key-chain-ref
| +--:(auth-key) | | +--:(auth-key)
| +--rw key? string | | +--rw key? string
| +--rw crypto-algorithm? identityref | | +--rw crypto-algorithm? identityref
+--rw bfd {bfd}? | +--rw bfd {bfd}?
| +--rw enabled? boolean | | +--rw enabled? boolean
| +--rw local-multiplier? bfd-multiplier | +--rw cost? uint8
| +--rw (interval-config-type)? | +--rw neighbors {explicit-neighbors}?
| +--:(tx-rx-intervals) | | +--rw neighbor* [address]
| | +--rw desired-min-tx-interval uint32 | | +--rw address inet:ip-address
| | +--rw required-min-rx-interval uint32 | +--rw no-listen? empty
| +--:(single-interval) | +--rw originate-default-route
| +--rw min-interval uint32 | | +--rw enabled? boolean
+--rw cost? uint8 | | +--rw route-policy? route-policy-ref
+--rw neighbors {explicit-neighbors}? | +--rw passive? empty
| +--rw neighbor* [address] | +--rw split-horizon? enumeration
| +--rw address inet:ip-address | +--rw summary-address
+--rw no-listen? empty | | +--rw address? inet:ip-prefix
+--rw originate-default-route! | | +--rw metric? uint8
| +--rw route-policy? route-policy-ref | +--rw timers
+--rw passive? empty | | +--rw update-interval? uint16
+--rw split-horizon? enumeration | | +--rw invalid-interval? uint16
+--rw summary-address | | +--rw holddown-interval? uint16
| +--rw address? inet:ip-prefix | | +--rw flush-interval? uint16
| +--rw metric? uint8 | +--ro oper-status? enumeration
+--rw timers | +--ro next-full-update? uint32
+--rw update-interval? uint16 | +--ro valid-address? boolean
+--rw invalid-interval? uint16 | +--ro statistics {interface-statistics}?
+--rw holddown-interval? uint16 | +--ro discontinuity-time? yang:date-and-time
+--rw flush-interval? uint16 | +--ro bad-packets-rcvd? yang:counter32
augment /rt:routing-state/rt:control-plane-protocols | +--ro bad-routes-rcvd? yang:counter32
/rt:control-plane-protocol: | +--ro updates-sent? yang:counter32
+--ro rip +--ro next-triggered-update? uint32
+--ro originate-default-route! +--ro num-of-routes? uint32
| +--ro route-policy? route-policy-ref +--ro ipv4
+--ro default-metric? uint8 | +--ro neighbors
+--ro distance? uint8 | | +--ro neighbor* [ipv4-address]
+--ro triggered-update-threshold? uint8 | | +--ro ipv4-address inet:ipv4-address
+--ro maximum-paths? uint8 | | +--ro last-update? yang:date-and-time
+--ro output-delay? uint8 | | +--ro bad-packets-rcvd? yang:counter32
+--ro distribute-list* [prefix-set-name direction] | | +--ro bad-routes-rcvd? yang:counter32
| +--ro prefix-set-name prefix-set-ref | +--ro routes
| +--ro direction enumeration | +--ro route* [ipv4-prefix]
| +--ro if-name? if:interface-ref | +--ro ipv4-prefix
+--ro next-triggered-update? uint32 inet:ipv4-prefix
+--ro num-of-routes? uint32 | +--ro next-hop?
+--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 inet:ipv4-address
| +--ro interface? if:interface-ref | +--ro interface?
| +--ro redistributed? boolean if:interface-ref
| +--ro route-type? enumeration | +--ro redistributed? boolean
| +--ro metric? uint8 | +--ro route-type? enumeration
| +--ro expire-time? uint16 | +--ro metric? uint8
| +--ro deleted? boolean | +--ro expire-time? uint16
| +--ro holddown? boolean | +--ro deleted? boolean
| +--ro need-triggered-update? boolean | +--ro holddown? boolean
| +--ro inactive? boolean | +--ro need-triggered-update? boolean
| +--ro flush-expire-before-holddown? boolean | +--ro inactive? boolean
+--ro ipv6 | +--ro flush-expire-before-holddown? boolean
| +--ro neighbors +--ro ipv6
| | +--ro neighbor* [ipv6-address] | +--ro neighbors
| | +--ro ipv6-address inet:ipv6-address | | +--ro neighbor* [ipv6-address]
| | +--ro last-update? yang:date-and-time | | +--ro ipv6-address inet:ipv6-address
| | +--ro bad-packets-rcvd? yang:counter32 | | +--ro last-update? yang:date-and-time
| | +--ro bad-routes-rcvd? yang:counter32 | | +--ro bad-packets-rcvd? yang:counter32
| +--ro routes | | +--ro bad-routes-rcvd? yang:counter32
| +--ro route* [ipv6-prefix] | +--ro routes
| +--ro ipv6-prefix inet:ipv6-prefix | +--ro route* [ipv6-prefix]
| +--ro next-hop? | +--ro ipv6-prefix
inet:ipv6-prefix
| +--ro next-hop?
inet:ipv6-address inet:ipv6-address
| +--ro interface? if:interface-ref | +--ro interface?
| +--ro redistributed? boolean if:interface-ref
| +--ro route-type? enumeration | +--ro redistributed? boolean
| +--ro metric? uint8 | +--ro route-type? enumeration
| +--ro expire-time? uint16 | +--ro metric? uint8
| +--ro deleted? boolean | +--ro expire-time? uint16
| +--ro holddown? boolean | +--ro deleted? boolean
| +--ro need-triggered-update? boolean | +--ro holddown? boolean
| +--ro inactive? boolean | +--ro need-triggered-update? boolean
| +--ro flush-expire-before-holddown? boolean | +--ro inactive? boolean
+--ro statistics {global-statistics}? | +--ro flush-expire-before-holddown? boolean
+--ro discontinuity-time? yang:date-and-time +--ro statistics {global-statistics}?
+--ro requests-rcvd? yang:counter32 +--ro discontinuity-time? yang:date-and-time
+--ro requests-sent? yang:counter32 +--ro requests-rcvd? yang:counter32
+--ro responses-rcvd? yang:counter32 +--ro requests-sent? yang:counter32
+--ro responses-sent? yang:counter32 +--ro responses-rcvd? yang:counter32
rpcs: +--ro responses-sent? yang:counter32
+---x clear-rip-route
+---w input rpcs:
+---w rip-instance? leafref +---x clear-rip-route
+---w input
+---w rip-instance? -> /rt:routing
/control-plane-protocols/control-plane-protocol/name
4. YANG Module 4. YANG Module
<CODE BEGINS> file "ietf-rip@2017-06-05.yang" <CODE BEGINS> file "ietf-rip@2017-09-27.yang"
module ietf-rip { module ietf-rip {
yang-version 1.1; yang-version 1.1;
namespace "urn:ietf:params:xml:ns:yang:ietf-rip"; namespace "urn:ietf:params:xml:ns:yang:ietf-rip";
prefix rip; prefix rip;
import ietf-inet-types { import ietf-inet-types {
prefix "inet"; prefix "inet";
} }
skipping to change at page 12, line 4 skipping to change at page 11, line 32
import ietf-inet-types { import ietf-inet-types {
prefix "inet"; prefix "inet";
} }
import ietf-yang-types { import ietf-yang-types {
prefix "yang"; prefix "yang";
} }
import ietf-interfaces { import ietf-interfaces {
prefix "if"; prefix "if";
} }
import ietf-ip { import ietf-ip {
prefix "ip"; prefix "ip";
} }
import ietf-routing { import ietf-routing-2 {
prefix "rt"; prefix "rt";
} }
import ietf-key-chain { import ietf-key-chain {
prefix "key-chain"; prefix "key-chain";
} }
import ietf-bfd {
prefix "bfd";
}
import ietf-ospf { import ietf-ospf {
prefix "ospf"; prefix "ospf";
} }
import ietf-isis { import ietf-isis {
prefix "isis"; prefix "isis";
} }
organization "IETF Routing Area Working Group (rtgwg)"; organization "IETF Routing Area Working Group (rtgwg)";
contact contact
"WG Web: <http://tools.ietf.org/wg/rgtwg/> "WG Web: <http://tools.ietf.org/wg/rgtwg/>
WG List: <mailto:rgtwg@ietf.org> WG List: <mailto:rgtwg@ietf.org>
skipping to change at page 12, line 50 skipping to change at page 12, line 27
WG Chair: Chris Bowers WG Chair: Chris Bowers
<mailto:cbowers@juniper.net> <mailto:cbowers@juniper.net>
Editor: Xufeng Liu Editor: Xufeng Liu
<mailto:xufeng_liu@jabil.com> <mailto:xufeng_liu@jabil.com>
Editor: Prateek Sarda Editor: Prateek Sarda
<mailto:prateek.sarda@ericsson.com> <mailto:prateek.sarda@ericsson.com>
Editor: Vikram Choudhary Editor: Vikram Choudhary
<mailto:vikram.choudhary@huawei.com>"; <mailto:vikschw@gmail.com>";
description description
"This YANG module defines a model for managing Routing "This YANG module defines a model for managing Routing
Information Protocol (RIP), including RIP version 2 and RIPng. Information Protocol (RIP), including RIP version 2 and RIPng.
Copyright (c) 2016 IETF Trust and the persons identified as Copyright (c) 2016 IETF Trust and the persons identified as
authors of the code. All rights reserved. authors of the code. All rights reserved.
Redistribution and use in source and binary forms, with or Redistribution and use in source and binary forms, with or
without modification, is permitted pursuant to, and subject to without modification, is permitted pursuant to, and subject to
the license terms contained in, the Simplified BSD License set the license terms contained in, the Simplified BSD License set
forth in Section 4.c of the IETF Trust's Legal Provisions forth in Section 4.c of the IETF Trust's Legal Provisions
Relating to IETF Documents Relating to IETF Documents
(http://trustee.ietf.org/license-info)."; (http://trustee.ietf.org/license-info).";
revision 2017-06-05 { revision 2017-09-27 {
description description
"Initial revision."; "Initial revision.";
reference reference
"RFC 2453: RIP Version 2. "RFC 2453: RIP Version 2.
RFC 2080: RIPng for IPv6. RFC 2080: RIPng for IPv6.
RFC 1724: RIP Version 2 MIB Extension."; RFC 1724: RIP Version 2 MIB Extension.";
} }
/* /*
* Features * Features
*/ */
feature bfd { feature bfd {
description description
"This feature indicates that the RIP implementation on the "This feature indicates that the RIP implementation on the
system supports BFD (Bidirectional Forwarding Detection)."; system supports BFD (Bidirectional Forwarding Detection).";
} }
feature bfd-protocol-parameters { feature bfd-protocol-parameters {
skipping to change at page 14, line 17 skipping to change at page 13, line 44
per-interface statistic data related to RIP."; per-interface statistic data related to RIP.";
} }
/* /*
* Typedefs * Typedefs
*/ */
typedef prefix-set-ref { typedef prefix-set-ref {
type string; type string;
description description
"A type for a reference to a prefix list."; "A type for a reference to a prefix set.
The string value is the name identifier for uniquely
identifying the referenced prefix set, which contains a list
of prefixes that a routing policy can applied. The definition
of such a prefix set is outside the scope of this document.";
} }
typedef route-policy-ref { typedef route-policy-ref {
type string; type string;
description description
"A type for a reference to a route policy."; "A type for a reference to a route policy.
The string value is the name identifier for uniquely
identifying the referenced routing policy, which contains one
or more policy rules that can be used for a routing decision.
The definition of such a routing policy is outside the scope
of this document.";
} }
/* /*
* Identities * Identities
*/ */
identity rip { identity rip {
base "rt:routing-protocol"; base rt:routing-protocol;
description "Identity for the RIP routing protocol."; description "Identity for the RIP routing protocol.";
} }
identity ripv2 { identity ripv2 {
base "rip:rip"; base rip:rip;
description "Identity for RIPv2 (RIP version 2)."; description "Identity for RIPv2 (RIP version 2).";
} }
identity ripng { identity ripng {
base "rip:rip"; base rip:rip;
description "Identity for RIPng."; description "Identity for RIPng.";
} }
/* /*
* Groupings * Groupings
*/ */
grouping originate-default-route-container { grouping originate-default-route-container {
description description
"Containing settings whether to originate the default route "Containing settings whether to originate the default route
in RIP routing instance."; in RIP routing instance.";
container originate-default-route { container originate-default-route {
presence "Present if originating default route is enabled.";
description description
"Injects the default route into the RIP (RIPv2 or RIPng) "Injects the default route into the RIP (RIPv2 or RIPng)
routing instance."; routing instance.";
leaf enabled {
type boolean;
default false;
description
"'true' if originating default route is enabled.";
}
leaf route-policy { leaf route-policy {
type route-policy-ref; type route-policy-ref;
description description
"The conditions of the route policy are applied to the "The conditions of the route policy are applied to the
default route."; default route.";
} }
} }
} }
grouping redistribute-container { grouping redistribute-container {
skipping to change at page 24, line 48 skipping to change at page 24, line 41
description "The route is inactive."; description "The route is inactive.";
} }
leaf flush-expire-before-holddown { leaf flush-expire-before-holddown {
type boolean; type boolean;
description description
"The flush timer expired before holddown time."; "The flush timer expired before holddown time.";
} }
} // route-attribute } // route-attribute
/* /*
* Configuration data nodes * Configuration data and operational state data nodes
*/ */
augment "/rt:routing/rt:control-plane-protocols/" augment "/rt:routing/rt:control-plane-protocols/"
+ "rt:control-plane-protocol" { + "rt:control-plane-protocol" {
when "derived-from(rt:type, 'rip:rip')" { when "derived-from(rt:type, 'rip:rip')" {
description description
"This augment is only valid for a routing protocol instance "This augment is only valid for a routing protocol instance
of RIP (type 'ripv2' or 'ripng')."; of RIP (type 'ripv2' or 'ripng').";
} }
description "RIP augmentation."; description "RIP augmentation.";
skipping to change at page 25, line 11 skipping to change at page 25, line 4
*/ */
augment "/rt:routing/rt:control-plane-protocols/" augment "/rt:routing/rt:control-plane-protocols/"
+ "rt:control-plane-protocol" { + "rt:control-plane-protocol" {
when "derived-from(rt:type, 'rip:rip')" { when "derived-from(rt:type, 'rip:rip')" {
description description
"This augment is only valid for a routing protocol instance "This augment is only valid for a routing protocol instance
of RIP (type 'ripv2' or 'ripng')."; of RIP (type 'ripv2' or 'ripng').";
} }
description "RIP augmentation."; description "RIP augmentation.";
container rip { container rip {
description description
"RIP configuration data."; "RIP data.";
uses global-attributes; uses global-attributes;
uses distribute-lists; uses distribute-lists;
uses redistribute-container; uses redistribute-container;
uses timers-container; uses timers-container;
container interfaces { container interfaces {
description description
"Containing a list of RIP interfaces."; "Containing a list of RIP interfaces.";
list interface { list interface {
skipping to change at page 26, line 9 skipping to change at page 25, line 49
container authentication { container authentication {
when "derived-from-or-self(" when "derived-from-or-self("
+ "../../../../rt:type, 'rip:ripv2')" { + "../../../../rt:type, 'rip:ripv2')" {
description "Only applicable to RIPv2."; description "Only applicable to RIPv2.";
} }
description description
"Enables authentication and specifies the "Enables authentication and specifies the
authentication scheme for the RIP interface"; authentication scheme for the RIP interface";
choice auth-type-selection { choice auth-type-selection {
description description
"Specify the authentication scheme. "Specify the authentication scheme.";
The use of the key-chain reference here is reference
designed to align with other proposed protocol "RFC8177: YANG Data Model for Key Chains.";
models.";
case auth-key-chain { case auth-key-chain {
leaf key-chain { leaf key-chain {
type key-chain:key-chain-ref; type key-chain:key-chain-ref;
description description
"key-chain name"; "key-chain name.";
} }
} }
case auth-key { case auth-key {
leaf key { leaf key {
type string; type string;
description description
"Key string in ASCII format."; "Key string in ASCII format.";
} }
leaf crypto-algorithm { leaf crypto-algorithm {
type identityref { type identityref {
skipping to change at page 26, line 39 skipping to change at page 26, line 31
} }
description description
"Cryptographic algorithm associated with key."; "Cryptographic algorithm associated with key.";
} }
} }
} }
} }
container bfd { container bfd {
if-feature bfd; if-feature bfd;
description "BFD operation."; description "BFD configuration.";
leaf enabled { leaf enabled {
type boolean; type boolean;
default false;
description description
"True if BFD is enabled for the interface."; "'true' if BFD is enabled for the interface.";
}
uses bfd:bfd-grouping-base-cfg-parms {
if-feature bfd-protocol-parameters;
} }
} }
leaf cost { leaf cost {
type uint8 { type uint8 {
range 1..16; range 1..16;
} }
default 1; default 1;
description description
"Interface cost."; "Interface cost.";
skipping to change at page 27, line 30 skipping to change at page 27, line 19
leaf address { leaf address {
type inet:ip-address; type inet:ip-address;
description "Neighbor IP address."; description "Neighbor IP address.";
} }
} }
} }
leaf no-listen { leaf no-listen {
type empty; type empty;
description description
"Disable the specified interface to receive (listen to) "Disables listening to and processing of RIPv2 or RIPng
and process RIPv2 or RIPng packets."; packets on the specified interface.";
} }
uses originate-default-route-container; uses originate-default-route-container;
leaf passive { leaf passive {
type empty; type empty;
description description
"Disables sending of RIPv2 or RIPng packets on the "Disables sending of RIPv2 or RIPng packets on the
specified interface."; specified interface.";
} }
leaf split-horizon { leaf split-horizon {
type enumeration { type enumeration {
enum disabled {
description
"Disables split-horizon processing.";
}
enum simple { enum simple {
description description
"Enables simple split-horizon processing."; "Enables simple split-horizon processing.";
} }
enum poison-reverse { enum poison-reverse {
description description
"Enables split-horizon processing with poison "Enables split-horizon processing with poison
reverse."; reverse.";
} }
} }
default simple; default simple;
description description
"Enables RIPv2 or RIPng split-horizon processing on the "Controls RIPv2 or RIPng split-horizon processing on
specified interface."; the specified interface.";
} }
container summary-address { container summary-address {
description description
"Summarizes information about RIPv2 or RIPng routes "Summarizes information about RIPv2 or RIPng routes
sent over the specified interface in RIPv2 or RIPng sent over the specified interface in RIPv2 or RIPng
update packets."; update packets.";
leaf address { leaf address {
type inet:ip-prefix; type inet:ip-prefix;
description description
skipping to change at page 28, line 39 skipping to change at page 28, line 33
range 0..16; range 0..16;
} }
description description
"Metric used for the route. If this attribute is not "Metric used for the route. If this attribute is not
used, the value set through the default-metric used, the value set through the default-metric
attribute in RIPv2 or RIPng router configuration is attribute in RIPv2 or RIPng router configuration is
used for the route. "; used for the route. ";
} }
} }
uses timers-container; uses timers-container;
} // interface
} // interfaces
} // container rip
}
/*
* Operational state data nodes
*/
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 { /* Operational state */
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.";
}
leaf oper-status { leaf oper-status {
type enumeration { type enumeration {
enum up { enum up {
description description
"RIPv2 or RIPng is operational on this interface."; "RIPv2 or RIPng is operational on this interface.";
} }
enum down { enum down {
description description
"RIPv2 or RIPng is not operational on this "RIPv2 or RIPng is not operational on this
interface."; interface.";
skipping to change at page 30, line 4 skipping to change at page 28, line 47
type enumeration { type enumeration {
enum up { enum up {
description description
"RIPv2 or RIPng is operational on this interface."; "RIPv2 or RIPng is operational on this interface.";
} }
enum down { enum down {
description description
"RIPv2 or RIPng is not operational on this "RIPv2 or RIPng is not operational on this
interface."; interface.";
} }
} }
config false;
description description
"Operational state."; "Operational state.";
} }
leaf cost {
type uint8 {
range 1..16;
}
default 1;
description
"Interface cost.";
}
leaf listen {
type boolean;
description
"The interface is enabled to receive (listen to)
and process RIPv2 or RIPng packets.";
}
leaf next-full-update { leaf next-full-update {
type uint32; type uint32;
config false;
description description
"Next full update time."; "Next full update time.";
} }
leaf originate-default-route {
type boolean;
description
"'true' if originating default route is enabled.";
}
leaf passive {
type boolean;
description
"Sending RIP packets is disabled on the interface.";
}
leaf poison-reverse {
type boolean;
description
"'true' if Split Horizon with Poisoned Reverse is
enabled.";
}
leaf split-horizon {
type boolean;
description
"'true' if Split Horizon processing is enabled.";
}
leaf valid-address { leaf valid-address {
type boolean; type boolean;
config false;
description description
"The interface has a valid address."; "The interface has a valid address.";
} }
uses timers-container;
container statistics { container statistics {
if-feature interface-statistics; if-feature interface-statistics;
config false;
description description
"Interface statistic counters."; "Interface statistic counters.";
leaf discontinuity-time { leaf discontinuity-time {
type yang:date-and-time; type yang:date-and-time;
description description
"The time on the most recent occasion at which any "The time on the most recent occasion at which any
one or more of the statistic counters suffered a one or more of the statistic counters suffered a
discontinuity. If no such discontinuities have discontinuity. If no such discontinuities have
occurred since the last re-initialization of the occurred since the last re-initialization of the
local management subsystem, then this node contains local management subsystem, then this node contains
skipping to change at page 31, line 50 skipping to change at page 30, line 11
description description
"The number of triggered RIP updates actually "The number of triggered RIP updates actually
sent on this interface. This explicitly does sent on this interface. This explicitly does
NOT include full updates sent containing new NOT include full updates sent containing new
information."; information.";
} }
} }
} // interface } // interface
} // interfaces } // interfaces
/* Operational state */
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 { container ipv4 {
when "derived-from-or-self(../../rt:type, 'rip:ripv2')" { when "derived-from-or-self(../../rt:type, 'rip:ripv2')" {
description description
"IPv4 address family is supported by RIPv2."; "IPv4 address family is supported by RIPv2.";
} }
config false;
description description
"IPv4 address family information."; "IPv4 address family information.";
container neighbors { container neighbors {
description description
"IPv4 neighbor information."; "IPv4 neighbor information.";
list neighbor { list neighbor {
key "ipv4-address"; key "ipv4-address";
description description
"A RIPv2 neighbor."; "A RIPv2 neighbor.";
skipping to change at page 33, line 32 skipping to change at page 32, line 9
} }
uses route-attributes; uses route-attributes;
} // route } // route
} // routes } // routes
} // ipv4 } // ipv4
container ipv6 { container ipv6 {
when "derived-from-or-self(../../rt:type, 'rip:ripng')" { when "derived-from-or-self(../../rt:type, 'rip:ripng')" {
description description
"IPv6 address family is supported by RIPng."; "IPv6 address family is supported by RIPng.";
} }
config false;
description description
"IPv6 address family information."; "IPv6 address family information.";
container neighbors { container neighbors {
description description
"IPv6 neighbor information."; "IPv6 neighbor information.";
list neighbor { list neighbor {
key "ipv6-address"; key "ipv6-address";
description description
"A RIPng neighbor."; "A RIPng neighbor.";
skipping to change at page 35, line 4 skipping to change at page 33, line 30
description description
"Next hop IPv6 address."; "Next hop IPv6 address.";
} }
leaf interface { leaf interface {
type if:interface-ref; type if:interface-ref;
description description
"The interface that the route uses."; "The interface that the route uses.";
} }
uses route-attributes; uses route-attributes;
} // route } // route
} // routes } // routes
} // ipv6 } // ipv6
container statistics { container statistics {
if-feature global-statistics; if-feature global-statistics;
config false;
description description
"Global statistic counters."; "Global statistic counters.";
leaf discontinuity-time { leaf discontinuity-time {
type yang:date-and-time; type yang:date-and-time;
description description
"The time on the most recent occasion at which any one "The time on the most recent occasion at which any one
or more of the statistic counters suffered a or more of the statistic counters suffered a
discontinuity. If no such discontinuities have occurred discontinuity. If no such discontinuities have occurred
since the last re-initialization of the local since the last re-initialization of the local
management subsystem, then this node contains the time management subsystem, then this node contains the time
skipping to change at page 35, line 42 skipping to change at page 34, line 21
leaf responses-rcvd { leaf responses-rcvd {
type yang:counter32; type yang:counter32;
description description
"The number of responses received by RIP."; "The number of responses received by RIP.";
} }
leaf responses-sent { leaf responses-sent {
type yang:counter32; type yang:counter32;
description description
"The number of responses sent by RIP."; "The number of responses sent by RIP.";
} }
} } // statistics
} // rip } // container rip
} // augment }
/* /*
* RPCs * RPCs
*/ */
rpc clear-rip-route { rpc clear-rip-route {
description description
"Clears RIP routes from the IP routing table and routes "Clears RIP routes from the IP routing table and routes
redistributed into the RIP protocol for the specified RIP redistributed into the RIP protocol for the specified RIP
instance or for all RIP instances in the current context."; instance or for all RIP instances in the current context.";
skipping to change at page 37, line 12 skipping to change at page 35, line 36
reference: RFC XXXX reference: RFC XXXX
-------------------------------------------------------------------- --------------------------------------------------------------------
6. Security Considerations 6. Security Considerations
The configuration, state, and action data defined in this document The configuration, state, and action data defined in this document
are designed to be accessed via a management protocol with a secure are designed to be accessed via a management protocol with a secure
transport layer, such as NETCONF [RFC6241]. The NETCONF access transport layer, such as NETCONF [RFC6241]. The NETCONF access
control model [RFC6536] provides the means to restrict access for control model [RFC6536] provides the means to restrict access for
particular NETCONF users to a preconfigured subset of all available particular NETCONF users to a preconfigured subset of all available
NETCONF protocol operations and content. NETCONF protocol operations and contents.
A number of configuration data nodes defined in this document are A number of configuration data nodes defined in this document are
writable/creatable/deletable (i.e., "config true" in YANG terms, writable/creatable/deletable (i.e., "config true" in YANG terms,
which is the default). These data nodes may be considered sensitive which is the default). These data nodes may be considered sensitive
or vulnerable in some network environments. Write operations to or vulnerable in some network environments. Write operations to
these data nodes, such as "edit-config" in NETCONF, can have negative these data nodes, such as "edit-config" in NETCONF, can have negative
effects on the network if the protocol operations are not properly effects on the network if the protocol operations are not properly
protected. The vulnerable "config true" parameters and subtrees are protected. The vulnerable "config true" parameters and subtrees are
the following: the following:
skipping to change at page 37, line 40 skipping to change at page 36, line 16
This data model also defines a RPC "clear-rip-route", which may This data model also defines a RPC "clear-rip-route", which may
affect the routing subsystem in the same way as described above. affect the routing subsystem in the same way as described above.
7. References 7. References
7.1. Normative References 7.1. Normative References
[RFC2119] Bradner, S., "Key words for use in RFCs to Indicate [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate
Requirement Levels", BCP 14, RFC 2119, Requirement Levels", BCP 14, RFC 2119,
DOI 10.17487/RFC2119, March 1997, DOI 10.17487/RFC2119, March 1997, <https://www.rfc-
<http://www.rfc-editor.org/info/rfc2119>. editor.org/info/rfc2119>.
[RFC2453] Malkin, G., "RIP Version 2", STD 56, RFC 2453, [RFC2453] Malkin, G., "RIP Version 2", STD 56, RFC 2453,
DOI 10.17487/RFC2453, November 1998, DOI 10.17487/RFC2453, November 1998, <https://www.rfc-
<http://www.rfc-editor.org/info/rfc2453>. editor.org/info/rfc2453>.
[RFC2080] Malkin, G. and R. Minnear, "RIPng for IPv6", RFC 2080, [RFC2080] Malkin, G. and R. Minnear, "RIPng for IPv6", RFC 2080,
DOI 10.17487/RFC2080, January 1997, DOI 10.17487/RFC2080, January 1997, <https://www.rfc-
<http://www.rfc-editor.org/info/rfc2080>. editor.org/info/rfc2080>.
[RFC3688] Mealling, M., "The IETF XML Registry", BCP 81, RFC 3688, [RFC3688] Mealling, M., "The IETF XML Registry", BCP 81, RFC 3688,
DOI 10.17487/RFC3688, January 2004, DOI 10.17487/RFC3688, January 2004, <https://www.rfc-
<http://www.rfc-editor.org/info/rfc3688>. editor.org/info/rfc3688>.
[RFC6241] Enns, R., Ed., Bjorklund, M., Ed., Schoenwaelder, J., Ed., [RFC6241] Enns, R., Ed., Bjorklund, M., Ed., Schoenwaelder, J., Ed.,
and A. Bierman, Ed., "Network Configuration Protocol and A. Bierman, Ed., "Network Configuration Protocol
(NETCONF)", RFC 6241, DOI 10.17487/RFC6241, June 2011, (NETCONF)", RFC 6241, DOI 10.17487/RFC6241, June 2011,
<http://www.rfc-editor.org/info/rfc6241>. <https://www.rfc-editor.org/info/rfc6241>.
[RFC6991] Schoenwaelder, J., Ed., "Common YANG Data Types", [RFC6991] Schoenwaelder, J., Ed., "Common YANG Data Types",
RFC 6991, DOI 10.17487/RFC6991, July 2013, RFC 6991, DOI 10.17487/RFC6991, July 2013,
<http://www.rfc-editor.org/info/rfc6991>. <https://www.rfc-editor.org/info/rfc6991>.
[RFC7223] Bjorklund, M., "A YANG Data Model for Interface
Management", RFC 7223, DOI 10.17487/RFC7223, May 2014,
<http://www.rfc-editor.org/info/rfc7223>.
[RFC7277] Bjorklund, M., "A YANG Data Model for IP Management",
RFC 7277, DOI 10.17487/RFC7277, June 2014,
<http://www.rfc-editor.org/info/rfc7277>.
[RFC7950] Bjorklund, M., Ed., "The YANG 1.1 Data Modeling Language", [RFC7950] Bjorklund, M., Ed., "The YANG 1.1 Data Modeling Language",
RFC 7950, DOI 10.17487/RFC7950, August 2016, RFC 7950, DOI 10.17487/RFC7950, August 2016,
<http://www.rfc-editor.org/info/rfc7950>. <https://www.rfc-editor.org/info/rfc7950>.
[RFC8022] Lhotka, L. and A. Lindem, "A YANG Data Model for Routing [RFC8177] Lindem, A., Ed., Qu, Y., Yeung, D., Chen, I., and J.
Management", RFC 8022, DOI 10.17487/RFC8022, November Zhang, "YANG Data Model for Key Chains", RFC 8177,
2016, <http://www.rfc-editor.org/info/rfc8022>. DOI 10.17487/RFC8177, June 2017, <https://www.rfc-
editor.org/info/rfc8177>.
[I-D.ietf-rtgwg-yang-key-chain] [I-D.bjorklund-netmod-rfc7223bis]
Lindem, A., Qu, Y., Yeung, D., Chen, I., and Z. Zhang, Bjorklund, M., "A YANG Data Model for Interface
"Routing Key Chain YANG Data Model", draft-ietf-rtgwg- Management", draft-bjorklund-netmod-rfc7223bis-00 (work in
yang-key-chain-24 (work in progress), April 2017. progress), August 2017.
[I-D.bjorklund-netmod-rfc7277bis]
Bjorklund, M., "A YANG Data Model for IP Management",
draft-bjorklund-netmod-rfc7277bis-00 (work in progress),
August 2017.
[I-D.acee-netmod-rfc8022bis]
Lhotka, L., Lindem, A., and Y. Qu, "A YANG Data Model for
Routing Management (NDMA Version)", draft-acee-netmod-
rfc8022bis-02 (work in progress), September 2017.
[I-D.ietf-bfd-yang]
Rahman, R., Zheng, L., Jethanandani, M., Networks, J., and
G. Mirsky, "YANG Data Model for Bidirectional Forwarding
Detection (BFD)", draft-ietf-bfd-yang-06 (work in
progress), June 2017.
[I-D.ietf-isis-yang-isis-cfg] [I-D.ietf-isis-yang-isis-cfg]
Litkowski, S., Yeung, D., Lindem, A., Zhang, Z., and L. Litkowski, S., Yeung, D., Lindem, A., Zhang, Z., and L.
Lhotka, "YANG Data Model for IS-IS protocol", draft-ietf- Lhotka, "YANG Data Model for IS-IS protocol", draft-ietf-
isis-yang-isis-cfg-17 (work in progress), March 2017. isis-yang-isis-cfg-18 (work in progress), July 2017.
[I-D.ietf-bfd-yang]
Rahman, R., Zheng, L., Networks, J., Jethanandani, M., and
G. Mirsky, "Yang Data Model for Bidirectional Forwarding
Detection (BFD)", draft-ietf-bfd-yang-05 (work in
progress), March 2017.
[I-D.ietf-netconf-rfc5277bis] [I-D.ietf-ospf-yang]
Clemm, A., Prieto, A., Voit, E., Nilsen-Nygaard, E., Yeung, D., Qu, Y., Zhang, Z., Chen, I., and A. Lindem,
Tripathy, A., Chisholm, S., and H. Trevino, "Subscribing "Yang Data Model for OSPF Protocol", draft-ietf-ospf-
to Event Notifications", draft-ietf-netconf-rfc5277bis-01 yang-08 (work in progress), July 2017.
(work in progress), October 2016.
[I-D.ietf-netconf-yang-push] [I-D.ietf-netmod-revised-datastores]
Clemm, A., Voit, E., Prieto, A., Tripathy, A., Nilsen- Bjorklund, M., Schoenwaelder, J., Shafer, P., Watsen, K.,
Nygaard, E., Bierman, A., and B. Lengyel, "Subscribing to and R. Wilton, "Network Management Datastore
YANG datastore push updates", draft-ietf-netconf-yang- Architecture", draft-ietf-netmod-revised-datastores-04
push-06 (work in progress), April 2017. (work in progress), August 2017.
7.2. Informative References 7.2. Informative References
[RFC1724] Malkin, G. and F. Baker, "RIP Version 2 MIB Extension", [RFC1724] Malkin, G. and F. Baker, "RIP Version 2 MIB Extension",
RFC 1724, DOI 10.17487/RFC1724, November 1994, RFC 1724, DOI 10.17487/RFC1724, November 1994,
<http://www.rfc-editor.org/info/rfc1724>. <https://www.rfc-editor.org/info/rfc1724>.
[RFC6536] Bierman, A. and M. Bjorklund, "Network Configuration [RFC6536] Bierman, A. and M. Bjorklund, "Network Configuration
Protocol (NETCONF) Access Control Model", RFC 6536, Protocol (NETCONF) Access Control Model", RFC 6536,
DOI 10.17487/RFC6536, March 2012, DOI 10.17487/RFC6536, March 2012, <https://www.rfc-
<http://www.rfc-editor.org/info/rfc6536>. editor.org/info/rfc6536>.
[RFC7951] Lhotka, L., "JSON Encoding of Data Modeled with YANG", [RFC7951] Lhotka, L., "JSON Encoding of Data Modeled with YANG",
RFC 7951, DOI 10.17487/RFC7951, August 2016, RFC 7951, DOI 10.17487/RFC7951, August 2016,
<http://www.rfc-editor.org/info/rfc7951>. <https://www.rfc-editor.org/info/rfc7951>.
[I-D.ietf-ospf-yang] [I-D.ietf-netconf-rfc5277bis]
Yeung, D., Qu, Y., Zhang, Z., Chen, I., and A. Lindem, Clemm, A., Prieto, A., Voit, E., Nilsen-Nygaard, E.,
"Yang Data Model for OSPF Protocol", draft-ietf-ospf- Tripathy, A., Chisholm, S., and H. Trevino, "Subscribing
yang-07 (work in progress), March 2017. to Event Notifications", draft-ietf-netconf-rfc5277bis-01
(work in progress), October 2016.
[I-D.ietf-netconf-yang-push]
Clemm, A., Voit, E., Prieto, A., Tripathy, A., Nilsen-
Nygaard, E., Bierman, A., and B. Lengyel, "Subscribing to
YANG datastore push updates", draft-ietf-netconf-yang-
push-09 (work in progress), September 2017.
[I-D.ietf-netmod-rfc6087bis]
Bierman, A., "Guidelines for Authors and Reviewers of YANG
Data Model Documents", draft-ietf-netmod-rfc6087bis-14
(work in progress), September 2017.
Appendix A. Data Tree Example Appendix A. Data Tree Example
This section contains an example of an instance data tree in the JSON This section contains an example of an instance data tree in the JSON
encoding [RFC7951], containing both configuration and state data. encoding [RFC7951], containing both configuration and state data.
+---------------------+ +---------------------+
| | | |
| Router 203.0.113.1 | | Router 203.0.113.1 |
| | | |
skipping to change at page 40, line 26 skipping to change at page 39, line 26
|192.0.2.1 |192.0.2.1
| |
| |
|192.0.2.2 |192.0.2.2
+----------+----------+ +----------+----------+
| | | |
| Another Router | | Another Router |
| | | |
+---------------------+ +---------------------+
The instance data tree for Router 203.0.113.1 in the above figure The configuration instance data tree for Router 203.0.113.1 in the
could be as follows: above figure could be as follows:
{ {
"ietf-interfaces:interfaces": { "ietf-interfaces:interfaces": {
"interface": [ "interface": [
{ {
"name": "eth1", "name": "eth1",
"type": "iana-if-type:ethernetCsmacd",
"description": "An interface with RIPv2 enabled.", "description": "An interface with RIPv2 enabled.",
"type": "iana-if-type:ethernetCsmacd",
"ietf-ip:ipv4": { "ietf-ip:ipv4": {
"address": [ "address": [
{ {
"ip": "192.0.2.1", "ip": "192.0.2.1",
"prefix-length": 24 "prefix-length": 24
} }
], ],
"forwarding": true "forwarding": true
} }
} }
] ]
}, },
"ietf-interfaces:interfaces-state": { "ietf-routing-2:routing": {
"interface": [
{
"name": "eth1",
"type": "iana-if-type:ethernetCsmacd",
"phys-address": "00:0C:42:E5:B1:E9",
"oper-status": "up",
"statistics": {
"discontinuity-time": "2016-10-24T17:11:27+02:00"
},
"ietf-ip:ipv4": {
"forwarding": true,
"mtu": 1500,
"address": [
{
"ip": "192.0.2.1",
"prefix-length": 24
}
]
}
}
]
},
"ietf-routing:routing": {
"router-id": "203.0.113.1", "router-id": "203.0.113.1",
"control-plane-protocols": { "control-plane-protocols": {
"control-plane-protocol": [ "control-plane-protocol": [
{ {
"type": "ietf-rip:ripv2", "type": "ietf-rip:ripv2",
"name": "ripv2-1", "name": "ripv2-1",
"description": "RIPv2 instance ripv2-1.", "description": "RIPv2 instance ripv2-1.",
"ietf-rip:rip": { "ietf-rip:rip": {
"redistribute": { "redistribute": {
"connected": { "connected": {
skipping to change at page 41, line 47 skipping to change at page 40, line 49
{ {
"interface": "eth1", "interface": "eth1",
"split-horizon": "poison-reverse" "split-horizon": "poison-reverse"
} }
] ]
} }
} }
} }
] ]
} }
}
}
The cooresponding operational state data for Router 203.0.113.1 could
be as follows:
{
"ietf-interfaces:interfaces": {
"interface": [
{
"name": "eth1",
"description": "An interface with RIPv2 enabled.",
"type": "iana-if-type:ethernetCsmacd",
"phys-address": "00:0C:42:E5:B1:E9",
"oper-status": "up",
"statistics": {
"discontinuity-time": "2016-10-24T17:11:27+02:00"
},
"ietf-ip:ipv4": {
"forwarding": true,
"mtu": 1500,
"address": [
{
"ip": "192.0.2.1",
"prefix-length": 24
}
]
}
}
]
}, },
"ietf-routing:routing-state": { "ietf-routing-2:routing": {
"router-id": "203.0.113.1",
"interfaces": { "interfaces": {
"interface": [ "interface": [
"eth1" "eth1"
] ]
}, },
"control-plane-protocols": { "control-plane-protocols": {
"control-plane-protocol": [ "control-plane-protocol": [
{ {
"type": "ietf-rip:rip", "type": "ietf-rip:rip",
"name": "ripv2-1" "name": "ripv2-1"
"ietf-rip:rip": { "ietf-rip:rip": {
"default-metric": 1, "default-metric": 1,
"next-triggered-update": 5 "next-triggered-update": 5
skipping to change at page 42, line 21 skipping to change at page 42, line 5
"name": "ripv2-1" "name": "ripv2-1"
"ietf-rip:rip": { "ietf-rip:rip": {
"default-metric": 1, "default-metric": 1,
"next-triggered-update": 5 "next-triggered-update": 5
"interfaces": { "interfaces": {
"interface": [ "interface": [
{ {
"interface": "eth1", "interface": "eth1",
"oper-status": "up", "oper-status": "up",
"cost": 1, "cost": 1,
"listen": true, "split-horizon": "poison-reverse",
"passive": false,
"poison-reverse": true,
"split-horizon": true,
"valid-address": true "valid-address": true
} }
] ]
}, },
"ipv4" { "ipv4" {
"neighbors": { "neighbors": {
"neighbor": [ "neighbor": [
{ {
"address": "192.0.2.2" "address": "192.0.2.2"
} }
skipping to change at page 43, line 22 skipping to change at page 43, line 4
"requests-rcvd": 523, "requests-rcvd": 523,
"requests-sent": 262, "requests-sent": 262,
"responses-rcvd": 261, "responses-rcvd": 261,
"responses-sent": 523 "responses-sent": 523
} }
} }
} }
] ]
} }
} }
}
Appendix B. YANG Model for Non-NMDA Compliant Implementations
The YANG data model defined so far in this document is designed to be
used in conjunction with implementations that support the Network
Management Datastore Architecture (NMDA) defined in
[I-D.ietf-netmod-revised-datastores]. However, currently there are
existing implementations that are not NMDA compliant. In order for
such implementations to be used temporarily until NMDA
implementations are available, this section describes the following
non-NMDA version of the equivalent model.
B.1. Non-NMDA YANG Module
<CODE BEGINS> file "ietf-rip@2017-09-25.yang"
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-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:rgtwg@ietf.org>
WG Chair: Jeff Tantsura
<mailto:jefftant.ietf@gmail.com>
WG Chair: Chris Bowers
<mailto:cbowers@juniper.net>
Editor: Xufeng Liu
<mailto:xufeng_liu@jabil.com>
Editor: Prateek Sarda
<mailto:prateek.sarda@ericsson.com>
Editor: Vikram Choudhary
<mailto:vikschw@gmail.com>";
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-09-25 {
description
"Initial revision.";
reference
"RFC 2453: RIP Version 2.
RFC 2080: RIPng for IPv6.
RFC 1724: RIP Version 2 MIB Extension.";
}
/*
* Features
*/
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.";
}
/*
* Typedefs
*/
typedef prefix-set-ref {
type string;
description
"A type for a reference to a prefix set.
The string value is the name identifier for uniquely
identifying the referenced prefix set, which contains a list
of prefixes that a routing policy can applied. The definition
of such a prefix set is outside the scope of this document.";
}
typedef route-policy-ref {
type string;
description
"A type for a reference to a route policy.
The string value is the name identifier for uniquely
identifying the referenced routing policy, which contains one
or more policy rules that can be used for a routing decision.
The definition of such a routing policy is outside the scope
of this document.";
}
/*
* Identities
*/
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.";
}
/*
* Groupings
*/
grouping originate-default-route-container {
description
"Containing settings whether to originate the default route
in RIP routing instance.";
container originate-default-route {
description
"Injects the default route into the RIP (RIPv2 or RIPng)
routing instance.";
leaf enabled {
type boolean;
default false;
description
"'true' if originating default route is enabled.";
}
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;
}
} // redistribute
} // redistribute-container
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.";
}
} // redistribute-route-policy-attributes
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.";
}
} // timers
}
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.";
}
} // global-attributes
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.";
}
}
} // distribute-lists
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.";
}
} // route-attribute
/*
* Configuration data nodes
*/
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').";
}
description "RIP augmentation.";
container rip {
description
"RIP configuration data.";
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.";
reference
"RFC8177: YANG Data Model for Key Chains.";
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 configuration.";
leaf enabled {
type boolean;
default false;
description
"'true' if BFD is enabled for the interface.";
}
}
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
"Disables listening to and processing of RIPv2 or RIPng
packets on the specified interface.";
}
uses originate-default-route-container;
leaf passive {
type empty;
description
"Disables sending of RIPv2 or RIPng packets on the
specified interface.";
}
leaf split-horizon {
type enumeration {
enum disabled {
description
"Disables split-horizon processing.";
}
enum simple {
description
"Enables simple split-horizon processing.";
}
enum poison-reverse {
description
"Enables split-horizon processing with poison
reverse.";
}
}
default simple;
description
"Controls RIPv2 or RIPng split-horizon processing on
the specified interface.";
}
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;
} // interface
} // interfaces
} // container rip
}
/*
* Operational state data nodes
*/
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 augmentation.";
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.";
}
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.";
}
}
description
"Operational state.";
}
leaf cost {
type uint8 {
range 1..16;
}
default 1;
description
"Interface cost.";
}
leaf next-full-update {
type uint32;
description
"Next full update time.";
}
leaf no-listen {
type empty;
description
"Listening to and processing of RIPv2 or RIPng packets
are disabled on the specified interface.";
}
uses originate-default-route-container;
leaf passive {
type empty;
description
"Sending of RIPv2 or RIPng packets is disabled on the
specified interface.";
}
leaf split-horizon {
type enumeration {
enum disabled {
description
"Split-horizon processing is disabled.";
}
enum simple {
description
"Simple split-horizon processing is enabled.";
}
enum poison-reverse {
description
"Split-horizon processing with poison reverse is
enabled.";
}
}
description
"State of RIPv2 or RIPng split-horizon processing on
the specified interface.";
}
leaf valid-address {
type boolean;
description
"The interface has a valid address.";
}
uses timers-container;
container statistics {
if-feature interface-statistics;
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.";
}
}
} // interface
} // interfaces
container ipv4 {
when "derived-from-or-self(../../rt:type, 'rip:ripv2')" {
description
"IPv4 address family is supported by RIPv2.";
}
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).";
}
} // neighbor
} // neighbors
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;
} // route
} // routes
} // ipv4
container ipv6 {
when "derived-from-or-self(../../rt:type, 'rip:ripng')" {
description
"IPv6 address family is supported by RIPng.";
}
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).";
}
} // neighbor
} // neighbors
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;
} // route
} // routes
} // ipv6
container statistics {
if-feature global-statistics;
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.";
}
}
} // rip
} // augment
/*
* RPCs
*/
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.";
}
}
} // rcp clear-rip-route
} }
<CODE ENDS>
B.2. Non-NMDA Model Tree Structure
module: ietf-rip
augment /rt:routing/rt:control-plane-protocols
/rt:control-plane-protocol:
+--rw rip
+--rw originate-default-route
| +--rw enabled? boolean
| +--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 cost? uint8
+--rw neighbors {explicit-neighbors}?
| +--rw neighbor* [address]
| +--rw address inet:ip-address
+--rw no-listen? empty
+--rw originate-default-route
| +--rw enabled? boolean
| +--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 enabled? boolean
| +--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 next-full-update? uint32
| +--ro no-listen? empty
| +--ro originate-default-route
| | +--ro enabled? boolean
| | +--ro route-policy? route-policy-ref
| +--ro passive? empty
| +--ro split-horizon? enumeration
| +--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
Authors' Addresses Authors' Addresses
Xufeng Liu Xufeng Liu
Jabil Jabil
8281 Greensboro Drive, Suite 200 8281 Greensboro Drive, Suite 200
McLean VA 22102 McLean VA 22102
USA USA
EMail: Xufeng_Liu@jabil.com EMail: Xufeng_Liu@jabil.com
Prateek Sarda Prateek Sarda
Ericsson Ericsson
Fern Icon, Survey No 28 and 36/5, Doddanakundi Village Fern Icon, Survey No 28 and 36/5, Doddanakundi Village
Bangalore Karnataka 560037 Bangalore Karnataka 560037
India India
EMail: prateek.sarda@ericsson.com EMail: prateek.sarda@ericsson.com
Vikram Choudhary Vikram Choudhary
Huawei Technologies Individual
Divyashree Techno Park, Whitefield Bangalore 560066
Bangalore Karnataka 560037
India India
EMail: vikram.choudhary@huawei.com EMail: vikschw@gmail.com
 End of changes. 92 change blocks. 
449 lines changed or deleted 1823 lines changed or added

This html diff was produced by rfcdiff 1.45. The latest version is available from http://tools.ietf.org/tools/rfcdiff/