draft-ietf-netmod-routing-cfg-10.txt   draft-ietf-netmod-routing-cfg-11.txt 
NETMOD L. Lhotka NETMOD L. Lhotka
Internet-Draft CZ.NIC Internet-Draft CZ.NIC
Intended status: Standards Track July 13, 2013 Intended status: Standards Track October 18, 2013
Expires: January 14, 2014 Expires: April 21, 2014
A YANG Data Model for Routing Management A YANG Data Model for Routing Management
draft-ietf-netmod-routing-cfg-10 draft-ietf-netmod-routing-cfg-11
Abstract Abstract
This document contains a specification of three YANG modules. This document contains a specification of three YANG modules.
Together they form the core routing data model which serves as a Together they form the core routing data model which serves as a
framework for configuring and managing a routing subsystem. It is framework for configuring and managing a routing subsystem. It is
expected that these modules will be augmented by additional YANG expected that these modules will be augmented by additional YANG
modules defining data models for individual routing protocols and modules defining data models for individual routing protocols and
other related functions. The core routing data model provides common other related functions. The core routing data model provides common
building blocks for such extensions - router instances, routes, building blocks for such extensions - routing instances, routes,
routing tables, routing protocols and route filters. routing information bases (RIB), routing protocols and route filters.
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.
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 January 14, 2014. This Internet-Draft will expire on April 21, 2014.
Copyright Notice Copyright Notice
Copyright (c) 2013 IETF Trust and the persons identified as the Copyright (c) 2013 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 17 skipping to change at page 2, line 17
Table of Contents Table of Contents
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . 4 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . 4
2. Terminology and Notation . . . . . . . . . . . . . . . . . . . 5 2. Terminology and Notation . . . . . . . . . . . . . . . . . . . 5
2.1. Glossary of New Terms . . . . . . . . . . . . . . . . . . 5 2.1. Glossary of New Terms . . . . . . . . . . . . . . . . . . 5
2.2. Tree Diagrams . . . . . . . . . . . . . . . . . . . . . . 6 2.2. Tree Diagrams . . . . . . . . . . . . . . . . . . . . . . 6
2.3. Prefixes in Data Node Names . . . . . . . . . . . . . . . 6 2.3. Prefixes in Data Node Names . . . . . . . . . . . . . . . 6
3. Objectives . . . . . . . . . . . . . . . . . . . . . . . . . . 8 3. Objectives . . . . . . . . . . . . . . . . . . . . . . . . . . 8
4. The Design of the Core Routing Data Model . . . . . . . . . . 9 4. The Design of the Core Routing Data Model . . . . . . . . . . 9
4.1. Router . . . . . . . . . . . . . . . . . . . . . . . . . . 12 4.1. System-Controlled and User-Controlled List Entries . . . . 12
4.1.1. Parameters of IPv6 Router Interfaces . . . . . . . . . 13 4.2. Simple versus Advanced Routers . . . . . . . . . . . . . . 13
4.2. Routes . . . . . . . . . . . . . . . . . . . . . . . . . . 15 5. Basic Building Blocks . . . . . . . . . . . . . . . . . . . . 15
4.3. Routing Tables . . . . . . . . . . . . . . . . . . . . . . 15 5.1. Routing Instance . . . . . . . . . . . . . . . . . . . . . 15
4.3.1. User-Defined Routing Tables . . . . . . . . . . . . . 16 5.1.1. Parameters of IPv6 Routing Instance Interfaces . . . . 16
4.4. Routing Protocols . . . . . . . . . . . . . . . . . . . . 17 5.2. Route . . . . . . . . . . . . . . . . . . . . . . . . . . 17
4.4.1. Routing Pseudo-Protocols . . . . . . . . . . . . . . . 17 5.3. Routing Information Base (RIB) . . . . . . . . . . . . . . 17
4.4.2. Defining New Routing Protocols . . . . . . . . . . . . 18 5.3.1. Multiple RIBs per Address Family . . . . . . . . . . . 18
4.5. Route Filters . . . . . . . . . . . . . . . . . . . . . . 19 5.4. Routing Protocol . . . . . . . . . . . . . . . . . . . . . 18
4.6. RPC Operations . . . . . . . . . . . . . . . . . . . . . . 20 5.4.1. Routing Pseudo-Protocols . . . . . . . . . . . . . . . 19
5. Interactions with Other YANG Modules . . . . . . . . . . . . . 21 5.4.2. Defining New Routing Protocols . . . . . . . . . . . . 21
5.1. Module "ietf-interfaces" . . . . . . . . . . . . . . . . . 21 5.5. Route Filter . . . . . . . . . . . . . . . . . . . . . . . 22
5.2. Module "ietf-ip" . . . . . . . . . . . . . . . . . . . . . 21 5.6. RPC Operations . . . . . . . . . . . . . . . . . . . . . . 23
6. Routing YANG Module . . . . . . . . . . . . . . . . . . . . . 23 6. Interactions with Other YANG Modules . . . . . . . . . . . . . 24
7. IPv4 Unicast Routing YANG Module . . . . . . . . . . . . . . . 42 6.1. Module "ietf-interfaces" . . . . . . . . . . . . . . . . . 24
8. IPv6 Unicast Routing YANG Module . . . . . . . . . . . . . . . 46 6.2. Module "ietf-ip" . . . . . . . . . . . . . . . . . . . . . 24
9. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 59 7. Routing YANG Module . . . . . . . . . . . . . . . . . . . . . 26
10. Security Considerations . . . . . . . . . . . . . . . . . . . 61 8. IPv4 Unicast Routing YANG Module . . . . . . . . . . . . . . . 48
11. Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . 62 9. IPv6 Unicast Routing YANG Module . . . . . . . . . . . . . . . 55
12. References . . . . . . . . . . . . . . . . . . . . . . . . . . 63 10. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 70
12.1. Normative References . . . . . . . . . . . . . . . . . . . 63 11. Security Considerations . . . . . . . . . . . . . . . . . . . 72
12.2. Informative References . . . . . . . . . . . . . . . . . . 63 12. Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . 73
Appendix A. The Complete Data Trees . . . . . . . . . . . . . . . 64 13. References . . . . . . . . . . . . . . . . . . . . . . . . . . 74
A.1. Configuration Data . . . . . . . . . . . . . . . . . . . . 64 13.1. Normative References . . . . . . . . . . . . . . . . . . . 74
A.2. Operational State Data . . . . . . . . . . . . . . . . . . 65 13.2. Informative References . . . . . . . . . . . . . . . . . . 74
Appendix B. Example: Adding a New Routing Protocol . . . . . . . 68 Appendix A. The Complete Data Trees . . . . . . . . . . . . . . . 75
Appendix C. Example: NETCONF <get> Reply . . . . . . . . . . . . 71 A.1. Configuration Data . . . . . . . . . . . . . . . . . . . . 75
Appendix D. Change Log . . . . . . . . . . . . . . . . . . . . . 77 A.2. Operational State Data . . . . . . . . . . . . . . . . . . 77
D.1. Changes Between Versions -09 and -10 . . . . . . . . . . . 77 Appendix B. Example: Adding a New Routing Protocol . . . . . . . 79
D.2. Changes Between Versions -08 and -09 . . . . . . . . . . . 77 Appendix C. Example: NETCONF <get> Reply . . . . . . . . . . . . 82
D.3. Changes Between Versions -07 and -08 . . . . . . . . . . . 77 Appendix D. Change Log . . . . . . . . . . . . . . . . . . . . . 88
D.4. Changes Between Versions -06 and -07 . . . . . . . . . . . 77 D.1. Changes Between Versions -10 and -11 . . . . . . . . . . . 88
D.5. Changes Between Versions -05 and -06 . . . . . . . . . . . 78 D.2. Changes Between Versions -09 and -10 . . . . . . . . . . . 88
D.6. Changes Between Versions -04 and -05 . . . . . . . . . . . 78 D.3. Changes Between Versions -08 and -09 . . . . . . . . . . . 89
D.7. Changes Between Versions -03 and -04 . . . . . . . . . . . 79 D.4. Changes Between Versions -07 and -08 . . . . . . . . . . . 89
D.8. Changes Between Versions -02 and -03 . . . . . . . . . . . 79 D.5. Changes Between Versions -06 and -07 . . . . . . . . . . . 89
D.9. Changes Between Versions -01 and -02 . . . . . . . . . . . 80 D.6. Changes Between Versions -05 and -06 . . . . . . . . . . . 89
D.10. Changes Between Versions -00 and -01 . . . . . . . . . . . 80 D.7. Changes Between Versions -04 and -05 . . . . . . . . . . . 90
Author's Address . . . . . . . . . . . . . . . . . . . . . . . . . 82 D.8. Changes Between Versions -03 and -04 . . . . . . . . . . . 90
D.9. Changes Between Versions -02 and -03 . . . . . . . . . . . 91
D.10. Changes Between Versions -01 and -02 . . . . . . . . . . . 91
D.11. Changes Between Versions -00 and -01 . . . . . . . . . . . 92
Author's Address . . . . . . . . . . . . . . . . . . . . . . . . . 93
1. Introduction 1. Introduction
This document contains a specification of the following YANG modules: This document contains a specification of the following YANG modules:
o Module "ietf-routing" provides generic components of a routing o Module "ietf-routing" provides generic components of a routing
data model. data model.
o Module "ietf-ipv4-unicast-routing" augments the "ietf-routing" o Module "ietf-ipv4-unicast-routing" augments the "ietf-routing"
module with additional data specific to IPv4 unicast. module with additional data specific to IPv4 unicast.
skipping to change at page 6, line 7 skipping to change at page 6, line 7
prefix, then it is up to the routing algorithm to select the prefix, then it is up to the routing algorithm to select the
active route (or several active routes in the case of multi-path active route (or several active routes in the case of multi-path
routing). routing).
core routing data model: YANG data model resulting from the core routing data model: YANG data model resulting from the
combination of "ietf-routing", "ietf-ipv4-unicast-routing" and combination of "ietf-routing", "ietf-ipv4-unicast-routing" and
"ietf-ipv6-unicast-routing" modules. "ietf-ipv6-unicast-routing" modules.
direct route: a route to a directly connected network. direct route: a route to a directly connected network.
routing information base (RIB): An object containing routes together
with other information. See Section 5.3 for details.
system-controlled entry: An entry of a list in operational state system-controlled entry: An entry of a list in operational state
data ("config false") that is created by the system independently data ("config false") that is created by the system independently
of what has been explicitly configured. An example is the default of what has been explicitly configured. See Section 4.1 for
routing table. A client cannot cause this entry to be deleted but details.
may be able to configure it.
user-controlled entry: An entry of a list in operational state data user-controlled entry: An entry of a list in operational state data
("config false") that is created and deleted as a direct ("config false") that is created and deleted as a direct
consequence of certain configuration changes. An example is an consequence of certain configuration changes. See Section 4.1 for
additional user-defined routing table. details.
2.2. Tree Diagrams 2.2. Tree Diagrams
A simplified graphical representation of the complete data tree is A simplified graphical representation of the complete data tree is
presented in Appendix A, and similar diagrams of its various subtrees presented in Appendix A, and similar diagrams of its various subtrees
appear in the main text. The meaning of the symbols in these appear in the main text. The meaning of the symbols in these
diagrams is as follows: diagrams is as follows:
o Brackets "[" and "]" enclose list keys. o Brackets "[" and "]" enclose list keys.
o Curly braces "{" and "}" contain names of optional features that
make the corresponding node conditional.
o Abbreviations before data node names: "rw" means configuration o Abbreviations before data node names: "rw" means configuration
(read-write) and "ro" state data (read-only). (read-write) and "ro" state data (read-only).
o Symbols after data node names: "?" means an optional node and "*" o Symbols after data node names: "?" means an optional node and "*"
denotes a "list" or "leaf-list". denotes a "list" or "leaf-list".
o Parentheses enclose choice and case nodes, and case nodes are also o Parentheses enclose choice and case nodes, and case nodes are also
marked with a colon (":"). marked with a colon (":").
o Ellipsis ("...") stands for contents of subtrees that are not o Ellipsis ("...") stands for contents of subtrees that are not
shown. shown.
2.3. Prefixes in Data Node Names 2.3. Prefixes in Data Node Names
In this document, names of data nodes, RPC methods and other data In this document, names of data nodes, RPC methods and other data
model objects are used mostly without a prefix, as long as it is model objects are often used without a prefix, as long as it is clear
clear from the context in which YANG module each name is defined. from the context in which YANG module each name is defined.
Otherwise, names are prefixed using the standard prefix associated Otherwise, names are prefixed using the standard prefix associated
with the corresponding YANG module, as shown in Table 1. with the corresponding YANG module, as shown in Table 1.
+--------+---------------------------+--------------+ +--------+---------------------------+-----------+
| Prefix | YANG module | Reference | | Prefix | YANG module | Reference |
+--------+---------------------------+--------------+ +--------+---------------------------+-----------+
| ianaaf | iana-afn-safi | [IANA-AF] | | if | ietf-interfaces | [YANG-IF] |
| | | | | | | |
| if | ietf-interfaces | [YANG-IF] | | ip | ietf-ip | [YANG-IP] |
| | | | | | | |
| ip | ietf-ip | [YANG-IP] | | rt | ietf-routing | Section 7 |
| | | | | | | |
| rt | ietf-routing | Section 6 | | v4ur | ietf-ipv4-unicast-routing | Section 8 |
| | | | | | | |
| v4ur | ietf-ipv4-unicast-routing | Section 7 | | v6ur | ietf-ipv6-unicast-routing | Section 9 |
| | | | | | | |
| v6ur | ietf-ipv6-unicast-routing | Section 8 | | yang | ietf-yang-types | [RFC6991] |
| | | | | | | |
| yang | ietf-yang-types | [RFC6021bis] | | inet | ietf-inet-types | [RFC6991] |
| | | | +--------+---------------------------+-----------+
| inet | ietf-inet-types | [RFC6021bis] |
+--------+---------------------------+--------------+
Table 1: Prefixes and corresponding YANG modules Table 1: Prefixes and corresponding YANG modules
3. Objectives 3. Objectives
The initial design of the core routing data model was driven by the The initial design of the core routing data model was driven by the
following objectives: following objectives:
o The data model should be suitable for the common address families, o The data model should be suitable for the common address families,
in particular IPv4 and IPv6, and for unicast and multicast in particular IPv4 and IPv6, and for unicast and multicast
routing, as well as Multiprotocol Label Switching (MPLS). routing, as well as Multiprotocol Label Switching (MPLS).
o Simple routing setups, such as static routing, should be o Simple routing setups, such as static routing, should be
configurable in a simple way, ideally without any need to develop configurable in a simple way, ideally without any need to develop
additional YANG modules. additional YANG modules.
o On the other hand, the core routing framework must allow for o On the other hand, the core routing framework must allow for
complicated setups involving multiple routing tables and multiple complicated setups involving multiple routing information bases
routing protocols, as well as controlled redistributions of (RIB) and multiple routing protocols, as well as controlled
routing information. redistributions of routing information.
o Device vendors will want to map the data models built on this o Device vendors will want to map the data models built on this
generic framework to their proprietary data models and generic framework to their proprietary data models and
configuration interfaces. Therefore, the framework should be configuration interfaces. Therefore, the framework should be
flexible enough to facilitate such a mapping and accommodate data flexible enough to facilitate such a mapping and accommodate data
models with different logic. models with different logic.
4. The Design of the Core Routing Data Model 4. The Design of the Core Routing Data Model
The core routing data model consists of three YANG modules. The The core routing data model consists of three YANG modules. The
first module, "ietf-routing", defines the generic components of a first module, "ietf-routing", defines the generic components of a
routing system. The other two modules, "ietf-ipv4-unicast-routing" routing system. The other two modules, "ietf-ipv4-unicast-routing"
and "ietf-ipv6-unicast-routing", augment the "ietf-routing" module and "ietf-ipv6-unicast-routing", augment the "ietf-routing" module
with additional data nodes that are needed for IPv4 and IPv6 unicast with additional data nodes that are needed for IPv4 and IPv6 unicast
routing, respectively. Figures 1 and 2 show abridged views of the routing, respectively. Figures 1 and 2 show abridged views of the
configuration and operational state data hierarchies. See Appendix A configuration and operational state data hierarchies. See Appendix A
for the complete data trees. for the complete data trees.
+--rw routing +--rw routing
+--rw router* [name] +--rw routing-instance* [name]
| +--rw name | +--rw name
| +--rw routing-instance-id?
| +--rw type? | +--rw type?
| +--rw enabled? | +--rw enabled?
| +--rw router-id? | +--rw router-id?
| +--rw description? | +--rw description?
| +--rw default-routing-tables | +--rw default-ribs
| | +--rw default-routing-table* [address-family safi] | | +--rw default-rib* [address-family]
| | +--rw address-family | | +--rw address-family
| | +--rw safi
| | +--rw name | | +--rw name
| +--rw interfaces | +--rw interfaces
| | +--rw interface* [name] | | +--rw interface* [name]
| | +--rw name | | +--rw name
| | +--rw v6ur:ipv6-router-advertisements | | +--rw v6ur:ipv6-router-advertisements
| | ... | | ...
| +--rw routing-protocols | +--rw routing-protocols
| +--rw routing-protocol* [name] | +--rw routing-protocol* [name]
| +--rw name | +--rw name
| +--rw description? | +--rw description?
| +--rw enabled? | +--rw enabled?
| +--rw type | +--rw type
| +--rw connected-routing-tables | +--rw connected-ribs
| | ... | | ...
| +--rw static-routes | +--rw static-routes
| ... | ...
+--rw routing-tables +--rw ribs
| +--rw routing-table* [name] | +--rw rib* [name]
| +--rw name | +--rw name
| +--rw id?
| +--rw address-family | +--rw address-family
| +--rw safi
| +--rw description? | +--rw description?
| +--rw recipient-routing-tables | +--rw recipient-ribs
| +--rw recipient-routing-table* [name] | +--rw recipient-rib* [rib-name]
| ... | ...
+--rw route-filters +--rw route-filters
+--rw route-filter* [name] +--rw route-filter* [name]
+--rw name +--rw name
+--rw description? +--rw description?
+--rw type +--rw type
Figure 1: Configuration data hierarchy. Figure 1: Configuration data hierarchy.
+--ro routing-state +--ro routing-state
+--ro router* [name] +--ro routing-instance* [id]
| +--ro name | +--ro id
| +--ro name?
| +--ro type? | +--ro type?
| +--ro router-id? | +--ro router-id?
| +--ro default-routing-tables | +--ro default-ribs
| | +--ro default-routing-table* [address-family safi] | | +--ro default-rib* [address-family]
| | +--ro address-family | | +--ro address-family
| | +--ro safi | | +--ro rib-id
| | +--ro name
| +--ro interfaces | +--ro interfaces
| | +--ro interface* [name] | | +--ro interface* [name]
| | +--ro name | | +--ro name
| | +--ro v6ur:ipv6-router-advertisements | | +--ro v6ur:ipv6-router-advertisements
| | ... | | ...
| +--ro routing-protocols | +--ro routing-protocols
| +--ro routing-protocol* [name] | +--ro routing-protocol* [name]
| +--ro name | +--ro name
| +--ro type | +--ro type
| +--ro connected-routing-tables | +--ro connected-ribs
| ... | ...
+--ro routing-tables +--ro ribs
| +--ro routing-table* [name] | +--ro rib* [id]
| +--ro name | +--ro id
| +--ro name?
| +--ro address-family | +--ro address-family
| +--ro safi
| +--ro routes | +--ro routes
| | +--ro route* | | +--ro route* [id]
| | ... | | ...
| +--ro recipient-routing-tables | +--ro recipient-ribs
| +--ro recipient-routing-table* [name] | +--ro recipient-rib* [rib-id]
| ... | ...
+--ro route-filters +--ro route-filters
+--ro route-filter* [name] +--ro route-filter* [name]
+--ro name +--ro name
+--ro type +--ro type
Figure 2: Operational state data hierarchy. Figure 2: Operational state data hierarchy.
As can be seen from Figures 1 and 2, the core routing data model As can be seen from Figures 1 and 2, the core routing data model
introduces several generic components of a routing framework: introduces several generic components of a routing framework: routing
routers, routing tables containing lists of routes, routing protocols instances, RIBs containing lists of routes, routing protocols and
and route filters. The following subsections describe these route filters. The following subsections describe these components
components in more detail. in more detail.
By combining the components in various ways, and possibly augmenting By combining the components in various ways, and possibly augmenting
them with appropriate contents defined in other modules, various them with appropriate contents defined in other modules, various
routing systems can be realized. routing systems can be realized.
+--------+ +--------+
| direct | +---+ +--------------+ +---+ +--------------+ | direct | +---+ +--------------+ +---+ +--------------+
| routes |--->| F |--->| |<---| F |<---| | | routes |--->| F |--->| |<---| F |<---| |
+--------+ +---+ | default | +---+ | additional | +--------+ +---+ | default | +---+ | additional |
| routing | | routing | | RIB | | RIB |
+--------+ +---+ | table | +---+ | table | +--------+ +---+ | | +---+ | |
| static |--->| F |--->| |--->| F |--->| | | static |--->| F |--->| |--->| F |--->| |
| routes | +---+ +--------------+ +---+ +--------------+ | routes | +---+ +--------------+ +---+ +--------------+
+--------+ ^ | ^ | +--------+ ^ | ^ |
| v | v | v | v
+---+ +---+ +---+ +---+ +---+ +---+ +---+ +---+
| F | | F | | F | | F | | F | | F | | F | | F |
+---+ +---+ +---+ +---+ +---+ +---+ +---+ +---+
^ | ^ | ^ | ^ |
| v | v | v | v
+----------+ +----------+ +----------+ +----------+
| routing | | routing | | routing | | routing |
| protocol | | protocol | | protocol | | protocol |
+----------+ +----------+ +----------+ +----------+
Figure 3: Example setup of a routing system Figure 3: Example setup of a routing system
The example in Figure 3 shows a typical (though certainly not the The example in Figure 3 shows a typical (though certainly not the
only possible) organization of a more complex routing subsystem for a only possible) organization of a more complex routing subsystem for a
single address family. Several of its features are worth mentioning: single address family. Several of its features are worth mentioning:
o Along with the default routing table, which is always present, an o Along with the default RIB, which is always present, an additional
additional routing table is configured. RIB is configured.
o Each routing protocol instance, including the "static" and o Each routing protocol instance, including the "static" and
"direct" pseudo-protocols, is connected to one routing table with "direct" pseudo-protocols, is connected to exactly one RIB with
which it can exchange routes (in both directions, except for the which it can exchange routes (in both directions, except for the
"static" and "direct" pseudo-protocols). "static" and "direct" pseudo-protocols).
o Routing tables may also be connected to each other and exchange o RIBs may also be connected to each other and exchange routes in
routes in either direction (or both). either direction (or both).
o Route exchanges along all connections may be controlled by means o Route exchanges along all connections may be controlled by means
of route filters, denoted by "F" in Figure 3. of route filters, denoted by "F" in Figure 3.
4.1. Router 4.1. System-Controlled and User-Controlled List Entries
Each router instance in the core routing data model represents a The core routing data model defines several lists, for example "rt:
logical router. The exact semantics of this term is left to routing-instance" or "rt:rib", that have to be populated with at
implementations. For example, router instances may be completely least one entry in any properly functioning device, and additional
entries may be configured by the user.
In such a list, the server creates the required item as a so-called
system-controlled entry in operational state data, i.e., inside the
"rt:routing-state" container.
Additional entries may be created in the configuration by the user
via the NETCONF protocol. These are the so-called user-controlled
entries. If the server accepts a configured user-controlled entry,
then this entry also appears in the operational state version of the
list.
Each version of the list (in operational state data and
configuration) uses its own set of list keys. In operational state,
the keys are unique numeric identifiers assigned by the server. In
configuration, the list keys are selected by the user.
The user may also provide supplemental configuration of system-
controlled entries. To do so, the user creates a new entry in the
configuration with an arbitrary key and desired configuration
contents. In order to bind this entry with the corresponding entry
in the operational state list, the user writes the operational state
key as a value of a special leaf that is defined in the data model
for this purpose.
An example can be seen in Appendix C: the "/routing-state/
routing-instance" list has a single system-controlled entry whose
"id" key has the value "1415926535". This entry is configured by the
"/routing/routing-instance" entry whose "name" key is "rtr0". The
binding with the operational state entry is established through the
value of the leaf "routing-instance-id".
Deleting a user-controlled entry from the configuration list results
in the removal of the corresponding entry in the operational state
list. In contrast, if a system-controlled entry is deleted from the
configuration list, only the extra configuration specified in that
entry is removed but the corresponding operational state entry
remains in the list.
4.2. Simple versus Advanced Routers
The core routing data model attempts to address devices with
elementary routing functions as well as advanced routers. For simple
devices, some parts and options of the data model are not needed and
represent unnecessary complications for the implementation.
Therefore, the core routing data model makes the advanced
functionality optional by means of a feature "advanced-router".
Specifically, the following objects and options are supported only in
devices that advertise the "advanced-router" feature:
o multiple RIBs per address family, and user-controlled RIB entries
in particular,
o routing protocols connected to non-default RIBs,
o RIBs configured as receivers of routes from other RIBs,
o routes with multiple nexthops.
See the "ietf-routing" module for details.
5. Basic Building Blocks
This section describes the essential components of the core routing
data model.
5.1. Routing Instance
Each routing instance in the core routing data model represents a
logical router. The exact semantics of this term are left to
implementations. For example, routing instances may be completely
isolated virtual routers or, alternatively, they may internally share isolated virtual routers or, alternatively, they may internally share
certain information. certain information.
A router instance together with its operational status is represented A routing instance together with its operational status is
as an entry of the list "/routing-state/router", and identified by a represented as an entry of the list "/routing-state/
unique name. Configuration of that router instance appears as entry routing-instance", and identified by a unique numeric identifier.
of the list "/routing/router" whose key is the router instance name. Configuration of that router instance appears as entry of the list
"/routing/routing-instance" whose key is a routing instance name
selected by the client.
An implementation MAY support multiple types of logical routers An implementation MAY support multiple types of logical routers
simultaneously. Instances of all router types are organized as simultaneously. Instances of all routing instance types are
entries of the same flat "router" list. In order to discriminate organized as entries of the same flat "routing-instance" list. In
router instances belonging to different types, the "type" leaf is order to discriminate routing instances belonging to different types,
defined as a child of the "router" node. the "type" leaf is defined as a child of the "routing-instance" node.
An implementation MAY create one or more system-controlled router An implementation MAY create one or more system-controlled routing
entries, and MAY also pose restrictions on allowed router types and instances, and MAY also pose restrictions on allowed routing instance
on the number of supported instances for each type. For example, a types and on the number of supported instances for each type. For
simple router implementation may support only one system-controlled example, a simple router implementation may support only one system-
router instance of the default type "standard-router" and may not controlled routing instance of the default type "rt:standard-routing-
allow creation of any user-controlled instances. instance" and may not allow creation of any user-controlled
instances.
Each network layer interface has to be assigned to one or more router Each network layer interface has to be assigned to one or more
instances in order to be able to participate in packet forwarding, routing instances in order to be able to participate in packet
routing protocols and other operations of those router instances. forwarding, routing protocols and other operations of those routing
The assignment is accomplished by creating a corresponding entry in instances. The assignment is accomplished by placing a corresponding
the list of router interfaces ("rt:interface"). The key of the list (system- or user-controlled) entry in the list of routing instance
entry is the name of a configured network layer interface, see the interfaces ("rt:interface"). The key of the list entry is the name
"ietf-interfaces" module [YANG-IF]. of a configured network layer interface, see the "ietf-interfaces"
module [YANG-IF].
In YANG terms, the list of router interfaces is modeled as the "list" In YANG terms, the list of routing instance interfaces is modeled as
node rather than "leaf-list" in order to allow for adding, via the "list" node rather than "leaf-list" in order to allow for adding,
augmentation, other configuration or state data related to the via augmentation, other configuration or state data related to the
corresponding router interface. corresponding interface.
Implementations MAY specify additional rules for the assignment of Implementations MAY specify additional rules for the assignment of
interfaces to logical routers. For example, it may be required that interfaces to routing instances. For example, it may be required
the sets of interfaces assigned to different logical routers be that the sets of interfaces assigned to different routing instances
disjoint. be disjoint.
4.1.1. Parameters of IPv6 Router Interfaces 5.1.1. Parameters of IPv6 Routing Instance Interfaces
The module "ietf-ipv6-unicast-routing" augments the definition of the The module "ietf-ipv6-unicast-routing" augments the definition of the
data node "rt:interface", in both configuration and operational state data node "rt:interface", in both configuration and operational state
data, with definitions of the following variables as required by data, with definitions of the following variables as required by
[RFC4861], sec. 6.2.1: [RFC4861], sec. 6.2.1:
o send-advertisements, o send-advertisements,
o max-rtr-adv-interval, o max-rtr-adv-interval,
o min-rtr-adv-interval, o min-rtr-adv-interval,
o managed-flag, o managed-flag,
o other-config-flag, o other-config-flag,
o link-mtu, o link-mtu,
o reachable-time, o reachable-time,
skipping to change at page 14, line 34 skipping to change at page 16, line 51
* valid-lifetime, * valid-lifetime,
* on-link-flag, * on-link-flag,
* preferred-lifetime, * preferred-lifetime,
* autonomous-flag. * autonomous-flag.
The definitions and descriptions of the above parameters can be found The definitions and descriptions of the above parameters can be found
in the text of the module "ietf-ipv6-unicast-routing" (Section 8). in the text of the module "ietf-ipv6-unicast-routing" (Section 9).
NOTES: NOTES:
1. The "IsRouter" flag, which is also required by [RFC4861], is 1. The "IsRouter" flag, which is also required by [RFC4861], is
implemented in the "ietf-ip" module [YANG-IP] (leaf "ip: implemented in the "ietf-ip" module [YANG-IP] (leaf "ip:
forwarding"). forwarding").
2. The original specification [RFC4861] allows the implementations 2. The original specification [RFC4861] allows the implementations
to decide whether the "valid-lifetime" and "preferred-lifetime" to decide whether the "valid-lifetime" and "preferred-lifetime"
parameters remain the same in consecutive advertisements, or parameters remain the same in consecutive advertisements, or
decrement in real time. However, the latter behavior seems decrement in real time. However, the latter behavior seems
problematic because the values might be reset again to the problematic because the values might be reset again to the
(higher) configured values after a configuration is reloaded. (higher) configured values after a configuration is reloaded.
Moreover, no implementation is known to use the decrementing Moreover, no implementation is known to use the decrementing
behavior. The "ietf-ipv6-unicast-routing" module therefore behavior. The "ietf-ipv6-unicast-routing" module therefore
assumes the former behavior with constant values. assumes the former behavior with constant values.
4.2. Routes 5.2. Route
Routes are basic elements of information in a routing system. The Routes are basic elements of information in a routing system. The
core routing data model defines only the following minimal set of core routing data model defines only the following minimal set of
route attributes: route attributes:
o "dest-prefix": IP prefix specifying the set of destination o destination prefix: IP prefix specifying the set of destination
addresses for which the route may be used. This attribute is addresses for which the route may be used. This attribute is
mandatory. mandatory.
o "next-hop": IP address of an adjacent router or host to which o next hop or action: outgoing interface, IP address of one or more
packets with destination addresses belonging to "dest-prefix" adjacent routers to which a packet should be forwarded, or other
should be sent. special action.
o "outgoing-interface": network interface that should be used for
sending packets with destination addresses belonging to "dest-
prefix".
The above list of route attributes suffices for a simple static The above list of route attributes suffices for a simple static
routing configuration. It is expected that future modules defining routing configuration. It is expected that future modules defining
routing protocols will add other route attributes such as metrics or routing protocols will add other route attributes such as metrics or
preferences. preferences.
Routes and their attributes are used both in configuration data, for Routes and their attributes are used both in configuration data, for
example as manually configured static routes, and in operational example as manually configured static routes, and in operational
state data, for example as entries in routing tables. state data, for example as entries in RIBs.
4.3. Routing Tables 5.3. Routing Information Base (RIB)
Routing tables are lists of routes complemented with administrative A routing information base (RIB) is a list of routes complemented
data, namely: with administrative data, namely:
o "source-protocol": type of the routing protocol from which the o "source-protocol": type of the routing protocol from which the
route was originally obtained. route was originally obtained.
o "last-updated": the date and time when the route was last updated, o "last-updated": the date and time when the route was last updated,
or inserted into the routing table. or inserted into the RIB.
Each routing table must contain only routes of the same address
family. Address family information consists of two parameters -
"address-family" and "safi" (Subsequent Address Family Identifier,
SAFI). The permitted values for these two parameters are defined by
IANA and represented using YANG enumeration datatypes "ianaaf:
address-family" and "ianaaf:subsequent-address-family" [IANA-AF].
In the core routing data model, routing tables are operational state
data represented as entries of the list "/routing-state/
routing-tables/routing-table". The contents of routing tables are
controlled and manipulated by routing protocol operations which may
result in route additions, removals and modifications. This also
includes manipulations via the "static" and/or "direct" pseudo-
protocols, see Section 4.4.1.
Routing tables are global, which means that a routing table may be
used by any or all router instances. However, an implementation MAY
specify rules and restrictions for sharing routing tables among
router instances.
Each router instance must have, for every supported address family,
one routing table selected as the so-called default routing table.
This selection is recorded in the list "default-routing-table". The
role of default routing tables is explained in Section 4.4.
Simple router implementations will typically create one system-
controlled routing table per supported address family, and declare it
as a default routing table (via a system-controlled entry of the
"default-routing-table" list).
4.3.1. User-Defined Routing Tables Each RIB MUST contain only routes of the same address family. In the
data model, address family is represented with an identity derived
from the "rt:address-family" base identity.
More complex router implementations allow for multiple routing tables In the core routing data model, RIBs are operational state data
per address family that are used for policy routing and other represented as entries of the list "/routing-state/ribs/rib". The
purposes. If it is the case, the NETCONF server SHALL advertise the contents of RIBs are controlled and manipulated by routing protocol
feature "user-defined-routing-tables". This feature activates operations which may result in route additions, removals and
additional nodes in both configuration and operational state data, modifications. This also includes manipulations via the "static"
and enables the client to: and/or "direct" pseudo-protocols, see Section 5.4.1.
o Configure new user-controlled routing tables by creating entries RIBs are global, which means that a RIB may be used by any or all
in the "/routing/routing-tables/routing-table" list. routing instances. However, an implementation MAY specify rules and
restrictions for sharing RIBs among routing instances.
o Configure any (system-controlled or user-controlled) routing table Each routing instance must have, for every supported address family,
as the default routing table for an address family. one RIB selected as the so-called default RIB. This selection is
recorded in the list "default-rib". The role of default RIBs is
explained in Section 5.4.
o Connect a routing protocol instance to a non-default routing table Simple router implementations that do not advertise the feature
(see Section 4.4). "advanced-router" will typically create one system-controlled RIB per
supported address family, and declare it as a default RIB (via a
system-controlled entry of the "default-rib" list).
o Configure a routing table as a recipient routing table of another 5.3.1. Multiple RIBs per Address Family
routing table (see below).
Every routing table can serve as a source of routes for other routing More complex router implementations advertising the "advanced-router"
tables of the same address family. To achieve this, one or more feature support multiple RIBs per address family that can be used for
recipient routing tables may be specified in the configuration of the policy routing and other purposes. Every RIB can then serve as a
source routing table. Optionally, a route filter may be configured source of routes for other RIBs of the same address family. To
for any or all recipient routing tables. Such a route filter then achieve this, one or more recipient RIBs may be specified in the
configuration of the source RIB. Optionally, a route filter may be
configured for any or all recipient RIBs. Such a route filter then
selects and/or manipulates the routes that are passed between the selects and/or manipulates the routes that are passed between the
source and recipient routing table. source and recipient RIB.
A routing table MUST NOT appear among its own recipient routing A RIB MUST NOT appear among its own recipient RIBs.
tables.
4.4. Routing Protocols 5.4. Routing Protocol
The core routing data model provides an open-ended framework for The core routing data model provides an open-ended framework for
defining multiple routing protocol instances within a router defining multiple routing protocol instances within a routing
instance. Each routing protocol instance MUST be assigned a type, instance. Each routing protocol instance MUST be assigned a type,
which is an identity derived from the "rt:routing-protocol" base which is an identity derived from the "rt:routing-protocol" base
identity. The core routing data model defines two identities for the identity. The core routing data model defines two identities for the
direct and static pseudo-protocols (Section 4.4.1). direct and static pseudo-protocols (Section 5.4.1).
Each routing protocol instance is connected to exactly one routing Each routing protocol instance is connected to exactly one RIB for
table for each address family that the routing protocol instance each address family that the routing protocol instance supports.
supports. Routes learned from the network by a routing protocol are Routes learned from the network by a routing protocol are normally
normally installed into the connected routing table(s) and, installed into the connected RIB(s) and, conversely, routes from the
conversely, routes from the connected routing table(s) are normally connected RIB(s) are normally injected into the routing protocol.
injected into the routing protocol. However, routing protocol However, routing protocol implementations MAY specify rules that
implementations MAY specify rules that restrict this exchange of restrict this exchange of routes in either direction (or both
routes in either direction (or both directions). directions).
On devices supporting the "user-defined-routing-tables" feature, a On devices supporting the "advanced-router" feature, any RIB (system-
routing table (system-controlled or user-controlled) is connected to controlled or user-controlled) may be connected to a routing protocol
a routing protocol instance by configuring a corresponding entry in instance by configuring a corresponding entry in the "connected-rib"
the "connected-routing-table" list. If such an entry is not list. If such an entry is not configured for an address family, then
configured for an address family, then the default routing table MUST the default RIB MUST be used as the connected RIB for this address
be used as the connected routing table for this address family. family.
In addition, two independent route filters (see Section 4.5) may be In addition, two independent route filters (see Section 5.5) may be
configured for each connected routing table to apply client-defined configured for each connected RIB to apply user-defined policies
policies controlling the exchange of routes in both directions controlling the exchange of routes in both directions between the
between the routing protocol instance and the connected routing routing protocol instance and the connected RIB:
table:
o import filter controls which routes are passed from the routing o import filter controls which routes are passed from the routing
protocol instance to the connected routing table, protocol instance to the connected RIB,
o export filter controls which routes the routing protocol instance o export filter controls which routes the routing protocol instance
receives from the connected routing table. receives from the connected RIB.
Note that the terms import and export are used from the viewpoint of Note that the terms import and export are used from the viewpoint of
a routing table. a RIB.
4.4.1. Routing Pseudo-Protocols 5.4.1. Routing Pseudo-Protocols
The core routing data model defines two special routing protocol The core routing data model defines two special routing protocol
types - "direct" and "static". Both are in fact pseudo-protocols, types - "direct" and "static". Both are in fact pseudo-protocols,
which means that they are confined to the local device and do not which means that they are confined to the local device and do not
exchange any routing information with neighboring routers. Routes exchange any routing information with neighboring routers. Routes
from both "direct" and "static" protocol instances are passed to the from both "direct" and "static" protocol instances are passed to the
connected routing table (subject to route filters, if any), but an connected RIB (subject to route filters, if any), but an exchange in
exchange in the opposite direction is not allowed. the opposite direction is not allowed.
Every router instance MUST implement exactly one instance of the Every routing instance MUST implement exactly one instance of the
"direct" pseudo-protocol type. The name of this instance MUST also "direct" pseudo-protocol type. The name of this instance MUST also
be "direct". It is the source of direct routes for all configured be "direct". It is the source of direct routes for all configured
address families. Direct routes are normally supplied by the address families. Direct routes are normally supplied by the
operating system kernel, based on the configuration of network operating system kernel, based on the configuration of network
interface addresses, see Section 5.2. The "direct" pseudo-protocol interface addresses, see Section 6.2. The "direct" pseudo-protocol
MUST always be connected to the default routing tables of all MUST always be connected to the default RIBs of all supported address
supported address families. Unlike other routing protocol types, families. Unlike other routing protocol types, this connection
this connection cannot be changed in the configuration. Direct cannot be changed in the configuration. Direct routes MAY be
routes MAY be filtered before they appear in the default routing filtered before they appear in the default RIB.
table.
A pseudo-protocol of the type "static" allows for specifying routes A pseudo-protocol of the type "static" allows for specifying routes
manually. It MAY be configured in zero or multiple instances, manually. It MAY be configured in zero or multiple instances,
although a typical configuration will have exactly one instance per although a typical configuration will have exactly one instance per
logical router. routing instance.
Static routes are configured within the "static-routes" container, Static routes are configured within the "static-routes" container,
see Figure 4. see Figure 4.
+--rw static-routes +--rw static-routes
+--rw v4ur:ipv4 +--rw v4ur:ipv4
| +--rw v4ur:route* [id] | +--rw v4ur:route* [id]
| +--rw v4ur:id | +--rw v4ur:id
| +--rw v4ur:description? | +--rw v4ur:description?
| +--rw v4ur:outgoing-interface? | +--rw v4ur:destination-prefix
| +--rw v4ur:dest-prefix | +--rw (nexthop-options)
| +--rw v4ur:next-hop? | +--:(special-nexthop)
| | +--rw v4ur:special-nexthop?
| +--:(simple-nexthop)
| | +--rw v4ur:gateway?
| | +--rw v4ur:outgoing-interface?
| +--:(nexthop-list) {rt:advanced-router}?
| +--rw v4ur:nexthop* [id]
| +--rw v4ur:id
| +--rw v4ur:address?
| +--rw v4ur:outgoing-interface?
| +--rw v4ur:priority?
| +--rw v4ur:weight?
+--rw v6ur:ipv6 +--rw v6ur:ipv6
+--rw v6ur:route* [id] +--rw v6ur:route* [id]
+--rw v6ur:id +--rw v6ur:id
+--rw v6ur:description? +--rw v6ur:description?
+--rw v6ur:outgoing-interface? +--rw v6ur:destination-prefix
+--rw v6ur:dest-prefix +--rw (nexthop-options)
+--rw v6ur:next-hop? +--:(special-nexthop)
| +--rw v6ur:special-nexthop?
+--:(simple-nexthop)
| +--rw v6ur:gateway?
| +--rw v6ur:outgoing-interface?
+--:(nexthop-list) {rt:advanced-router}?
+--rw v6ur:nexthop* [id]
+--rw v6ur:id
+--rw v6ur:address?
+--rw v6ur:outgoing-interface?
+--rw v6ur:priority?
+--rw v6ur:weight?
Figure 4: Structure of "static-routes" subtree. Figure 4: Structure of "static-routes" subtree.
4.4.2. Defining New Routing Protocols 5.4.2. Defining New Routing Protocols
It is expected that future YANG modules will create data models for It is expected that future YANG modules will create data models for
additional routing protocol types. Such a new module has to define additional routing protocol types. Such a new module has to define
the protocol-specific configuration and state data, and it has to fit the protocol-specific configuration and state data, and it has to fit
it into the core routing framework in the following way: it into the core routing framework in the following way:
o A new identity MUST be defined for the routing protocol and its o A new identity MUST be defined for the routing protocol and its
base identity MUST be set to "rt:routing-protocol", or to an base identity MUST be set to "rt:routing-protocol", or to an
identity derived from "rt:routing-protocol". identity derived from "rt:routing-protocol".
o Additional route attributes MAY be defined, preferably in one o Additional route attributes MAY be defined, preferably in one
place by means of defining a YANG grouping. The new attributes place by means of defining a YANG grouping. The new attributes
have to be inserted as state data by augmenting the definitions of have to be inserted as state data by augmenting the definitions of
the nodes the nodes
/rt:routing-tables/rt:routing-table/rt:route /rt:ribs/rt:rib/rt:route
and and
/rt:active-route/rt:output/rt:route, /rt:active-route/rt:output/rt:route,
and possibly other places in the configuration, state data and RPC and possibly other places in the configuration, state data and RPC
input or output. input or output.
o Configuration parameters and/or state data for the new protocol o Configuration parameters and/or state data for the new protocol
can be defined by augmenting the "routing-protocol" data node can be defined by augmenting the "routing-protocol" data node
under both "/routing" and "/routing-state". under both "/routing" and "/routing-state".
o Per-interface configuration, including activation of the routing o Per-interface configuration, including activation of the routing
protocol on individual interfaces, can use references to entries protocol on individual interfaces, can use references to entries
in the list of router interfaces (rt:interface). in the list of routing instance interfaces (rt:interface).
By using the "when" statement, the augmented configuration parameters By using the "when" statement, the augmented configuration parameters
and state data specific to the new protocol SHOULD be made and state data specific to the new protocol SHOULD be made
conditional and valid only if the value of "rt:type" or "rt:source- conditional and valid only if the value of "rt:type" or "rt:source-
protocol" is equal to the new protocol's identity. It is also protocol" is equal to the new protocol's identity. It is also
RECOMMENDED that the protocol-specific data be encapsulated in RECOMMENDED that the protocol-specific data be encapsulated in
appropriately named containers. appropriately named containers.
The above steps are implemented by the example YANG module for the The above steps are implemented by the example YANG module for the
RIP routing protocol in Appendix B. RIP routing protocol in Appendix B.
4.5. Route Filters 5.5. Route Filter
The core routing data model provides a skeleton for defining route The core routing data model provides a skeleton for defining route
filters that can be used to restrict the set of routes being filters that can be used to restrict the set of routes being
exchanged between a routing protocol instance and a connected routing exchanged between a routing protocol instance and a connected RIB, or
table, or between a source and a recipient routing table. Route between a source and a recipient RIB. Route filters may also
filters may also manipulate routes, i.e., add, delete, or modify manipulate routes, i.e., add, delete, or modify their attributes.
their attributes.
Route filters are global, which means that a configured route filter Route filters are global, which means that a configured route filter
may be used by any or all router instances. However, an may be used by any or all routing instances. However, an
implementation MAY specify rules and restrictions for sharing route implementation MAY specify rules and restrictions for sharing route
filters among router instances. filters among routing instances.
By itself, the route filtering framework defined in this document By itself, the route filtering framework defined in this document
allows for applying only two extreme routing policies which are allows for applying only two extreme routing policies which are
represented by the following pre-defined route filter types: represented by the following pre-defined route filter types:
o "deny-all-route-filter": all routes are blocked, o "deny-all-route-filter": all routes are blocked,
o "allow-all-route-filter": all routes are permitted. o "allow-all-route-filter": all routes are permitted.
The latter type is equivalent to no route filter. The latter type is equivalent to no route filter.
It is expected that more comprehensive route filtering frameworks It is expected that more comprehensive route filtering frameworks
will be developed separately. will be developed separately.
Each route filter is identified by a unique name. Its type MUST be Each route filter is identified by a unique name. Its type MUST be
specified by the "type" identity reference - this opens the space for specified by the "type" identity reference - this opens the space for
multiple route filtering framework implementations. multiple route filtering framework implementations.
4.6. RPC Operations 5.6. RPC Operations
The "ietf-routing" module defines two RPC operations: The "ietf-routing" module defines two RPC operations:
o active-route: query the routing system for the active route(s) o active-route: query the routing system for the active route(s)
that are currently used for sending datagrams to a destination that are currently used for sending datagrams to a destination
host whose address is passed as an input parameter. host whose address is passed as an input parameter.
o route-count: retrieve the total number of entries in a routing o route-count: retrieve the total number of entries in a RIB.
table.
5. Interactions with Other YANG Modules 6. Interactions with Other YANG Modules
The semantics of the core routing data model also depend on several The semantics of the core routing data model also depend on several
configuration parameters that are defined in other YANG modules. configuration parameters that are defined in other YANG modules.
5.1. Module "ietf-interfaces" 6.1. Module "ietf-interfaces"
The following boolean switch is defined in the "ietf-interfaces" YANG The following boolean switch is defined in the "ietf-interfaces" YANG
module [YANG-IF]: module [YANG-IF]:
/if:interfaces/if:interface/if:enabled /if:interfaces/if:interface/if:enabled
If this switch is set to "false" for a given network layer If this switch is set to "false" for a network layer interface,
interface, the device MUST behave exactly as if that interface was the device MUST behave exactly as if that interface was not
not assigned to any logical router at all. assigned to any routing instance at all.
5.2. Module "ietf-ip" 6.2. Module "ietf-ip"
The following boolean switches are defined in the "ietf-ip" YANG The following boolean switches are defined in the "ietf-ip" YANG
module [YANG-IP]: module [YANG-IP]:
/if:interfaces/if:interface/ip:ipv4/ip:enabled /if:interfaces/if:interface/ip:ipv4/ip:enabled
If this switch is set to "false" for a given interface, then all If this switch is set to "false" for a network layer interface,
IPv4 routing functions related to that interface MUST be disabled. then all IPv4 routing functions related to that interface MUST be
disabled.
/if:interfaces/if:interface/ip:ipv4/ip:forwarding /if:interfaces/if:interface/ip:ipv4/ip:forwarding
If this switch is set to "false" for a given interface, then the If this switch is set to "false" for a network layer interface,
forwarding of IPv4 datagrams to and from this interface MUST be then the forwarding of IPv4 datagrams to and from this interface
disabled. However, the interface may participate in other routing MUST be disabled. However, the interface may participate in other
functions, such as routing protocols. IPv4 routing functions, such as routing protocols.
/if:interfaces/if:interface/ip:ipv6/ip:enabled /if:interfaces/if:interface/ip:ipv6/ip:enabled
If this switch is set to "false" for a given interface, then all If this switch is set to "false" for a network layer interface,
IPv6 routing functions related to that interface MUST be disabled. then all IPv6 routing functions related to that interface MUST be
disabled.
/if:interfaces/if:interface/ip:ipv6/ip:forwarding /if:interfaces/if:interface/ip:ipv6/ip:forwarding
If this switch is set to "false" for a given interface, then the If this switch is set to "false" for a network layer interface,
forwarding of IPv6 datagrams to and from this interface MUST be then the forwarding of IPv6 datagrams to and from this interface
disabled. However, the interface may participate in other routing MUST be disabled. However, the interface may participate in other
functions, such as routing protocols. IPv6 routing functions, such as routing protocols.
In addition, the "ietf-ip" module allows for configuring IPv4 and In addition, the "ietf-ip" module allows for configuring IPv4 and
IPv6 addresses and network prefixes or masks on network layer IPv6 addresses and network prefixes or masks on network layer
interfaces. Configuration of these parameters on an enabled interfaces. Configuration of these parameters on an enabled
interface MUST result in an immediate creation of the corresponding interface MUST result in an immediate creation of the corresponding
direct route. The destination prefix of this route is set according direct route. The destination prefix of this route is set according
to the configured IP address and network prefix/mask, and the to the configured IP address and network prefix/mask, and the
interface is set as the outgoing interface for that route. interface is set as the outgoing interface for that route.
6. Routing YANG Module 7. Routing YANG Module
RFC Ed.: In this section, replace all occurrences of 'XXXX' with the RFC Ed.: In this section, replace all occurrences of 'XXXX' with the
actual RFC number and all occurrences of the revision date below with actual RFC number and all occurrences of the revision date below with
the date of RFC publication (and remove this note). the date of RFC publication (and remove this note).
<CODE BEGINS> file "ietf-routing@2013-07-13.yang" <CODE BEGINS> file "ietf-routing@2013-10-18.yang"
module ietf-routing { module ietf-routing {
namespace "urn:ietf:params:xml:ns:yang:ietf-routing"; namespace "urn:ietf:params:xml:ns:yang:ietf-routing";
prefix "rt"; prefix "rt";
import ietf-yang-types { import ietf-yang-types {
prefix "yang"; prefix "yang";
} }
import ietf-interfaces { import ietf-interfaces {
prefix "if"; prefix "if";
} }
import iana-afn-safi {
prefix "ianaaf";
}
organization organization
"IETF NETMOD (NETCONF Data Modeling Language) Working Group"; "IETF NETMOD (NETCONF Data Modeling Language) Working Group";
contact contact
"WG Web: <http://tools.ietf.org/wg/netmod/> "WG Web: <http://tools.ietf.org/wg/netmod/>
WG List: <mailto:netmod@ietf.org> WG List: <mailto:netmod@ietf.org>
WG Chair: David Kessens WG Chair: David Kessens
<mailto:david.kessens@nsn.com> <mailto:david.kessens@nsn.com>
skipping to change at page 24, line 17 skipping to change at page 27, line 13
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).
This version of this YANG module is part of RFC XXXX; see the This version of this YANG module is part of RFC XXXX; see the
RFC itself for full legal notices. RFC itself for full legal notices.
"; ";
revision 2013-07-13 { revision 2013-10-18 {
description description
"Initial revision."; "Initial revision.";
reference reference
"RFC XXXX: A YANG Data Model for Routing Management"; "RFC XXXX: A YANG Data Model for Routing Management";
} }
/* Features */ /* Features */
feature user-defined-routing-tables { feature advanced-router {
description description
"Indicates that the device supports additional routing tables "This feature indicates that the device supports advanced
defined by the user. routing functions, namely:
- user-defined RIBs,
- multi-path routes.
Devices that do not support this feature MUST provide exactly Devices that do not support this feature MUST provide exactly
one routing table per supported address family. These routing one system-controlled RIB per supported address family. These
tables then appear as entries of the list RIBs then appear as entries of the list
/routing-state/routing-tables/routing-table. /routing-state/ribs/rib.
"; ";
} }
/* Identities */ /* Identities */
identity router-type { identity address-family {
description description
"Base identity from which router type identities are derived. "Base identity from which identities describing address
families are derived.";
}
identity ipv4 {
base address-family;
description
"This identity represents IPv4 address family.";
}
identity ipv6 {
base address-family;
description
"This identity represents IPv6 address family.";
}
identity routing-instance-type {
description
"Base identity from which identities describing routing
instance types are derived.
It is primarily intended for discriminating among different It is primarily intended for discriminating among different
types of logical routers or router virtualization. types of logical routers or router virtualization.
"; ";
} }
identity standard-router { identity standard-routing-instance {
base router-type; base routing-instance-type;
description description
"This identity represents a standard router."; "This identity represents a default routing instance.";
} }
identity routing-protocol { identity routing-protocol {
description description
"Base identity from which routing protocol identities are "Base identity from which routing protocol identities are
derived."; derived.";
} }
identity direct { identity direct {
base routing-protocol; base routing-protocol;
skipping to change at page 25, line 45 skipping to change at page 29, line 16
} }
identity allow-all-route-filter { identity allow-all-route-filter {
base route-filter; base route-filter;
description description
"Route filter that permits all routes."; "Route filter that permits all routes.";
} }
/* Type Definitions */ /* Type Definitions */
typedef router-ref { typedef routing-instance-ref {
type leafref { type leafref {
path "/rt:routing/rt:router/rt:name"; path "/rt:routing/rt:routing-instance/rt:name";
} }
description description
"This type is used for leafs that reference a router instance "This type is used for leafs that reference a routing instance
configuration."; configuration.";
} }
typedef router-state-ref { typedef routing-instance-state-ref {
type leafref { type leafref {
path "/rt:routing-state/rt:router/rt:name"; path "/rt:routing-state/rt:routing-instance/rt:id";
} }
description description
"This type is used for leafs that reference state data of a "This type is used for leafs that reference state data of a
router instance."; routing instance.";
} }
typedef routing-table-ref { typedef rib-ref {
type leafref { type leafref {
path "/rt:routing/rt:routing-tables/rt:routing-table/rt:name"; path "/rt:routing/rt:ribs/rt:rib/rt:name";
} }
description description
"This type is used for leafs that reference a routing table "This type is used for leafs that reference a RIB
configuration."; configuration.";
} }
typedef routing-table-state-ref { typedef rib-state-ref {
type leafref { type leafref {
path "/rt:routing-state/rt:routing-tables/rt:routing-table/" path "/rt:routing-state/rt:ribs/rt:rib/rt:id";
+ "rt:name";
} }
description description
"This type is used for leafs that reference a routing table in "This type is used for leafs that reference a RIB in state
state data."; data.";
} }
typedef route-filter-ref { typedef route-filter-ref {
type leafref { type leafref {
path "/rt:routing/rt:route-filters/rt:route-filter/rt:name"; path "/rt:routing/rt:route-filters/rt:route-filter/rt:name";
} }
description description
"This type is used for leafs that reference a route filter "This type is used for leafs that reference a route filter
configuration."; configuration.";
} }
typedef route-filter-state-ref { typedef route-filter-state-ref {
skipping to change at page 27, line 4 skipping to change at page 30, line 22
typedef route-filter-state-ref { typedef route-filter-state-ref {
type leafref { type leafref {
path "/rt:routing-state/rt:route-filters/rt:route-filter/" path "/rt:routing-state/rt:route-filters/rt:route-filter/"
+ "rt:name"; + "rt:name";
} }
description description
"This type is used for leafs that reference a route filter in "This type is used for leafs that reference a route filter in
state data."; state data.";
} }
/* Groupings */ /* Groupings */
grouping afn-safi { grouping address-family {
description description
"This grouping provides two parameters specifying address "This grouping provides a leaf identifying an address
family and subsequent address family."; family.";
leaf address-family { leaf address-family {
type ianaaf:address-family; type identityref {
base address-family;
}
mandatory "true"; mandatory "true";
description description
"Address family."; "Address family.";
} }
leaf safi {
type ianaaf:subsequent-address-family;
mandatory "true";
description
"Subsequent address family.";
}
} }
grouping router-id { grouping router-id {
description description
"This grouping provides the definition of router ID."; "This grouping provides the definition of router ID.";
leaf router-id { leaf router-id {
type yang:dotted-quad; type yang:dotted-quad;
description description
"Router ID - 32-bit number in the form of a dotted quad."; "Router ID - 32-bit number in the form of a dotted quad.";
} }
} }
grouping route-content { grouping outgoing-interface {
description description
"Generic parameters of static routes (configuration)."; "This grouping defines the outgoing interface for use in
nexthops.";
leaf outgoing-interface { leaf outgoing-interface {
type if:interface-ref; type leafref {
path "/routing-state/routing-instance/interfaces/interface/"
+ "name";
}
description description
"Outgoing interface."; "Name of the outgoing interface.";
} }
} }
grouping route-state-content { grouping special-nexthop {
description description
"Generic parameters of routes in state data."; "This grouping provides the leaf for specifying special nexthop
leaf outgoing-interface { options.";
type if:interface-state-ref; leaf special-nexthop {
type enumeration {
enum blackhole {
description
"Silently discard the packet.";
}
enum unreachable {
description
"Discard the packet and notify the sender with an error
message indicating that the destination host is
unreachable.";
}
enum prohibit {
description
"Discard the packet and notify the sender with an error
message indicating that the communication is
administratively prohibited.";
}
enum receive {
description
"The packet will be received by the local network
device.";
}
}
description description
"Outgoing interface."; "Special nexthop options.";
} }
} }
/* RPC Methods */ grouping nexthop-classifiers {
rpc active-route {
description description
"Return the active route (or multiple routes, in the case of "This grouping provides two nexthop classifiers.";
multi-path routing) to a destination address. leaf priority {
type enumeration {
Parameters enum primary {
value "1";
1. 'router-name', description
"Primary nexthop.";
2. 'destination-address'. }
enum backup {
If the router instance with 'router-name' doesn't exist, then value "2";
this operation SHALL fail with error-tag 'data-missing' and description
error-app-tag 'router-not-found'. "Backup nexthop.";
}
If no active route for 'destination-address' exists, no output
is returned - the server SHALL send an <rpc-reply> containing
a single element <ok>.
";
input {
leaf router-name {
type router-state-ref;
mandatory "true";
description
"Name of the router instance whose forwarding information
base is being queried.";
} }
container destination-address { default "primary";
description description
"Network layer destination address. "Simple priority for distinguishing between primary and
backup nexthops.
Address family specific modules MUST augment this Backup nexthops are used if and only if no primary nexthops
container with a leaf named 'address'. are reachable.
"; ";
uses afn-safi;
}
} }
output { leaf weight {
list route { type uint8;
must ". = 0 or not(../../nexthop/weight = 0)" {
error-message "Illegal combination of zero and non-zero "
+ "nexthop weights.";
description description
"List of active routes. "Nexthop weights must be either all zero (equal
load-balancing) or all non-zero.";
}
default "0";
description
"This parameter specifies the weight of the nexthop for load
balancing. The number specifies the relative fraction of the
traffic that will use the corresponding nexthop.
Route contents specific for each address family is The default value of 0 represents equal load-balancing.
expected be defined through augmenting.
"; If both primary and backup nexthops are present, then the
uses afn-safi; weights for each priority level are used separately.
uses route-content; ";
}
} }
} }
rpc route-count { grouping nexthop-content {
description description
"Return the current number of routes in a routing table. "Generic parameters of nexthops in routes.";
choice nexthop-options {
Parameters: mandatory "true";
description
1. 'routing-table-name'. "Options for expressing the nexthop in routes.";
case special-nexthop {
If the routing table with the name specified in uses special-nexthop;
'routing-table-name' doesn't exist, then this operation SHALL
fail with error-tag 'data-missing' and error-app-tag
'routing-table-not-found'.
";
input {
leaf routing-table {
type routing-table-state-ref;
mandatory "true";
description
"Name of the routing table.";
} }
} case simple-nexthop {
output { uses outgoing-interface;
leaf number-of-routes { }
type uint32; case nexthop-list {
mandatory "true"; if-feature advanced-router;
description list nexthop {
"Number of routes in the routing table."; key "id";
description
"An entry of a nexthop list.";
leaf id {
type uint64;
description
"A numeric identifier of the entry, assigned by the
server.";
}
uses outgoing-interface;
uses nexthop-classifiers;
}
} }
} }
} }
grouping route-metadata {
description
"Route metadata.";
leaf source-protocol {
type identityref {
base routing-protocol;
}
mandatory "true";
description
"Type of the routing protocol from which the route
originated.";
}
leaf last-updated {
type yang:date-and-time;
description
"Time stamp of the last modification of the route. If the
route was never modified, it is the time when the route was
inserted into the RIB.";
}
}
/* Operational state data */ /* Operational state data */
container routing-state { container routing-state {
config "false"; config "false";
description description
"Operational state of the routing subsystem."; "Operational state of the routing subsystem.";
list router { list routing-instance {
key "name"; key "id";
description description
"Each list entry is a container for operational state data of "Each list entry is a container for operational state data of
a router instance. a routing instance.
An implementation MAY create one or more instances on its An implementation MAY create one or more system-controlled
own, other instances MAY be created by configuration. instances, other user-controlled instances MAY be created by
configuration.
"; ";
leaf id {
type uint64;
description
"Unique numeric identifier of the routing instance.";
}
leaf name { leaf name {
type string; type leafref {
path "/routing/routing-instance/name";
}
description description
"The name of the router instance."; "The name of the routing instance assigned in the
corresponding configuration entry (if any).
";
} }
leaf type { leaf type {
type identityref { type identityref {
base router-type; base routing-instance-type;
} }
default "rt:standard-router"; default "rt:standard-routing-instance";
description description
"The router type, primarily intended for discriminating "The routing instance type, primarily intended for
among different types of logical routers, route discriminating among different types of logical routers,
virtualization, master-slave arrangements etc., while route virtualization, master-slave arrangements etc.,
keeping all router instances in the same flat list. while keeping all routing instances in the same flat list.
"; ";
} }
uses router-id { uses router-id {
description description
"Global router ID. "Global router ID.
An implementation may choose a value if none is An implementation may choose a value if none is
configured. configured.
Routing protocols MAY override this global parameter. Routing protocols MAY override this global parameter.
"; ";
} }
container default-routing-tables { container default-ribs {
description description
"Default routing tables used by the router instance."; "Default RIBs used by the routing instance.";
list default-routing-table { list default-rib {
key "address-family safi"; key "address-family";
description description
"Each list entry specifies the default routing table for "Each list entry specifies the default RIB for one
one address family. address family.
The default routing table is operationally connected to The default RIB is operationally connected to all
all routing protocols for which a connected routing routing protocols for which a connected RIB has not been
table has not been explicitly configured. explicitly configured.
The 'direct' pseudo-protocol is always connected to the The 'direct' pseudo-protocol is always connected to the
default routing tables. default RIBs.
"; ";
uses address-family;
uses afn-safi; leaf rib-id {
leaf name { type rib-state-ref;
type routing-table-state-ref;
mandatory "true"; mandatory "true";
description description
"Name of an existing routing table to be used as the "Name of an existing RIB to be used as the default RIB
default routing table for the given router instance for the given routing instance and address family.";
and address family.";
} }
} }
} }
container interfaces { container interfaces {
description description
"Router interfaces."; "Network layer interfaces belonging to the routing
instance.";
list interface { list interface {
key "name"; key "name";
description description
"List of network layer interfaces assigned to the router "List of network layer interfaces assigned to the routing
instance."; instance.";
leaf name { leaf name {
type if:interface-state-ref; type if:interface-state-ref;
description description
"A reference to the name of a configured network layer "A reference to the name of a configured network layer
interface."; interface.";
} }
} }
} }
container routing-protocols { container routing-protocols {
skipping to change at page 32, line 4 skipping to change at page 36, line 23
"The name of the routing protocol instance."; "The name of the routing protocol instance.";
} }
leaf type { leaf type {
type identityref { type identityref {
base routing-protocol; base routing-protocol;
} }
mandatory "true"; mandatory "true";
description description
"Type of the routing protocol."; "Type of the routing protocol.";
} }
container connected-routing-tables { container connected-ribs {
if-feature user-defined-routing-tables; if-feature advanced-router;
description description
"Container for connected routing tables. "Container for connected RIBs.
"; ";
list connected-routing-table { list connected-rib {
key "name"; key "rib-id";
description description
"List of routing tables to which the routing protocol "List of RIBs to which the routing protocol instance
instance is connected (at most one routing table per is connected (at most one RIB per address family).
address family).
"; ";
leaf name { leaf rib-id {
type routing-table-state-ref; type rib-state-ref;
description description
"Name of an existing routing table."; "Name of an existing RIB.";
} }
leaf import-filter { leaf import-filter {
type route-filter-state-ref; type route-filter-state-ref;
description description
"Reference to a route filter that is used for "Reference to a route filter that is used for
filtering routes passed from this routing protocol filtering routes passed from this routing protocol
instance to the routing table specified by the instance to the RIB specified by the 'name'
'name' sibling node. sibling node.
If this leaf is not present, the behavior is If this leaf is not present, the behavior is
protocol-specific, but typically it means that all protocol-specific, but typically it means that all
routes are accepted. routes are accepted.
"; ";
} }
leaf export-filter { leaf export-filter {
type route-filter-state-ref; type route-filter-state-ref;
description description
"Reference to a route filter that is used for "Reference to a route filter that is used for
filtering routes passed from the routing table filtering routes passed from the RIB specified by
specified by the 'name' sibling node to this the 'name' sibling node to this routing protocol
routing protocol instance. instance.
If this leaf is not present, the behavior is If this leaf is not present, the behavior is
protocol-specific - typically it means that all protocol-specific - typically it means that all
routes are accepted. routes are accepted.
The 'direct' and 'static' pseudo-protocols accept The 'direct' and 'static' pseudo-protocols accept
no routes from any routing table. no routes from any RIB.
"; ";
} }
} }
} }
} }
} }
} }
container routing-tables { container ribs {
description description
"Container for routing tables."; "Container for RIBs.";
list routing-table { list rib {
key "name"; key "id";
description description
"Each entry represents a routing table identified by the "Each entry represents a RIB identified by the 'name' key.
'name' key. All routes in a routing table MUST belong to All routes in a RIB MUST belong to the same address
the same address family. family.
The server MUST create the default routing table for each The server MUST create the default RIB for each address
address family, and MAY create other routing tables. family, and MAY create other RIBs. Additional RIBs MAY be
Additional routing tables MAY be created in the created in the configuration.
configuration.
"; ";
leaf id {
type uint64;
description
"Unique numeric identifier of the RIB instance.";
}
leaf name { leaf name {
type string; type leafref {
path "/routing/ribs/rib/name";
}
description description
"The name of the routing table."; "The name of the RIB assigned in the corresponding
configuration entry (if any).";
} }
uses afn-safi; uses address-family;
container routes { container routes {
description description
"Current contents of the routing table."; "Current contents of the RIB.";
list route { list route {
key "id";
description description
"A routing table entry. This data node MUST be "A RIB route entry. This data node MUST be augmented
augmented with information specific for routes of each with information specific for routes of each address
address family."; family.";
uses route-state-content; leaf id {
leaf source-protocol { type uint64 {
type identityref { range "1..max";
base routing-protocol;
} }
mandatory "true";
description description
"Type of the routing protocol from which the route "Unique numeric identifier of the route.";
originated.";
}
leaf last-updated {
type yang:date-and-time;
description
"Time stamp of the last modification of the route. If
the route was never modified, it is the time when
the route was inserted into the routing table.";
} }
uses nexthop-content;
uses route-metadata;
} }
} }
container recipient-routing-tables { container recipient-ribs {
if-feature user-defined-routing-tables; if-feature advanced-router;
description description
"Container for recipient routing tables."; "Container for recipient RIBs.";
list recipient-routing-table { list recipient-rib {
key "name"; key "rib-id";
description description
"List of routing tables that receive routes from this "List of RIBs that receive routes from this RIB.";
routing table."; leaf rib-id {
leaf name { type rib-state-ref;
type routing-table-state-ref;
description description
"The name of the recipient routing table."; "The name of the recipient RIB.";
} }
leaf filter { leaf filter {
type route-filter-state-ref; type route-filter-state-ref;
description description
"A route filter which is applied to the routes passed "A route filter which is applied to the routes passed
to the recipient routing table."; to the recipient RIB.";
} }
} }
} }
} }
} }
container route-filters { container route-filters {
description description
"Container for route filters."; "Container for route filters.";
list route-filter { list route-filter {
key "name"; key "name";
description description
"Route filters are used for filtering and/or manipulating "Route filters are used for filtering and/or manipulating
routes that are passed between a routing protocol and a routes that are passed between a routing protocol and a
routing table and vice versa, or between two routing RIB and vice versa, or between two RIBs.
tables.
It is expected that other modules augment this list with It is expected that other modules augment this list with
contents specific for a particular route filter type. contents specific for a particular route filter type.
"; ";
leaf name { leaf name {
type string; type string;
description description
"The name of the route filter."; "The name of the route filter.";
} }
leaf type { leaf type {
skipping to change at page 35, line 20 skipping to change at page 39, line 36
} }
} }
} }
} }
/* Configuration Data */ /* Configuration Data */
container routing { container routing {
description description
"Configuration parameters for the routing subsystem."; "Configuration parameters for the routing subsystem.";
list router { list routing-instance {
key "name"; key "name";
unique "routing-instance-id";
description description
"Configuration of a router instance. "Configuration of a routing instance.
"; ";
leaf name { leaf name {
type string; type string;
description description
"The name of the router instance. "The name of the configured routing instance.";
}
The names for system-created router instances are assigned leaf routing-instance-id {
by the system. The same name then has to be used in the type uint64;
configuration. description
"Reference to a system-assigned numeric identifier of the
routing instance.
An arbitrary name may be chosen if the router instance is This leaf is essential for creating new configuration
created in the configuration. entries that refer to existing system-controlled routing
instances.
"; ";
} }
leaf type { leaf type {
type identityref { type identityref {
base router-type; base routing-instance-type;
} }
default "rt:standard-router"; default "rt:standard-routing-instance";
description description
"The router type."; "The type of the routing instance.";
} }
leaf enabled { leaf enabled {
type boolean; type boolean;
default "true"; default "true";
description description
"Enable/disable the router instance. "Enable/disable the routing instance.
If this parameter is false, the parent router instance is If this parameter is false, the parent routing instance is
disabled and does not appear in operational state data, disabled and does not appear in operational state data,
despite any other configuration that might be present. despite any other configuration that might be present.
"; ";
} }
uses router-id { uses router-id {
description description
"Configuration of the global router ID."; "Configuration of the global router ID.";
} }
leaf description { leaf description {
type string; type string;
description description
"Textual description of the router instance."; "Textual description of the routing instance.";
} }
container default-routing-tables { container default-ribs {
if-feature user-defined-routing-tables; if-feature advanced-router;
description description
"Configuration of the default routing tables used by the "Configuration of the default RIBs used by the routing
router instance. instance.
The default routing table for an addressed family if by The default RIB for an addressed family if by default
default connected to all routing protocol instances connected to all routing protocol instances supporting
supporting that address family, and always receives direct that address family, and always receives direct routes.
routes.
"; ";
list default-routing-table { list default-rib {
must "address-family=/routing/routing-tables/" must "address-family=/routing/ribs/rib[name=current()/"
+ "routing-table[name=current()/name]/" + "name]/address-family" {
+ "address-family and safi=/routing/routing-tables/"
+ "routing-table[name=current()/name]/safi" {
error-message "Address family mismatch."; error-message "Address family mismatch.";
description description
"The entry's address family MUST match that of the "The entry's address family MUST match that of the
referenced routing table."; referenced RIB.";
} }
key "address-family safi"; key "address-family";
description description
"Each list entry configures the default routing table for "Each list entry configures the default RIB for one
one address family."; address family.";
uses afn-safi; uses address-family;
leaf name { leaf name {
type string; type string;
mandatory "true"; mandatory "true";
description description
"Name of an existing routing table to be used as the "Name of an existing RIB to be used as the default RIB
default routing table for the given router instance for the given routing instance and address family.";
and address family.";
} }
} }
} }
container interfaces { container interfaces {
description description
"Configuration of router interface parameters."; "Configuration of the routing instance's interfaces.";
list interface { list interface {
key "name"; key "name";
description description
"List of network layer interfaces assigned to the router "List of network layer interfaces assigned to the routing
instance."; instance.";
leaf name { leaf name {
type if:interface-ref; type if:interface-ref;
description description
"A reference to the name of a configured network layer "A reference to the name of a configured network layer
interface."; interface.";
} }
} }
} }
container routing-protocols { container routing-protocols {
skipping to change at page 38, line 15 skipping to change at page 42, line 29
} }
leaf type { leaf type {
type identityref { type identityref {
base routing-protocol; base routing-protocol;
} }
mandatory "true"; mandatory "true";
description description
"Type of the routing protocol - an identity derived "Type of the routing protocol - an identity derived
from the 'routing-protocol' base identity."; from the 'routing-protocol' base identity.";
} }
container connected-routing-tables { container connected-ribs {
if-feature user-defined-routing-tables; if-feature advanced-router;
description description
"Configuration of connected routing tables. "Configuration of connected RIBs.
"; ";
list connected-routing-table { list connected-rib {
must "not(/routing/routing-tables/" must "not(/routing/ribs/rib[name=current()/"
+ "routing-table[name=current()/" + "preceding-sibling::connected-rib/"
+ "preceding-sibling::connected-routing-table/" + "name and address-family=/routing/ribs/"
+ "name and address-family=/routing/routing-tables/" + "rib[name=current()/name]/address-family])" {
+ "routing-table[name=current()/name]/" error-message
+ "address-family and safi=/routing/routing-tables/" "Duplicate address family for connected RIBs.";
+ "routing-table[name=current()/name]/safi])" {
error-message "Duplicate address family for "
+ "connected routing tables.";
description description
"For each AFN/SAFI pair there MUST NOT be more than "For each address family, there MUST NOT be more
one connected routing table."; than one connected RIB.";
} }
key "name"; key "rib-name";
description description
"List of routing tables to which the routing protocol "List of RIBs to which the routing protocol instance
instance is connected (at most one routing table per is connected (at most one RIB per address family).
address family).
If no connected routing table is configured for an If no connected RIB is configured for an address
address family, the routing protocol is connected to family, the routing protocol is connected to the
the default routing table for that address family. default RIB for that address family.
"; ";
leaf name { leaf rib-name {
type routing-table-ref; type rib-ref;
must "../../../type != 'rt:direct' or " must "../../../type != 'rt:direct' or "
+ "../../../../../default-routing-tables/ " + "../../../../../default-ribs/ "
+ "default-routing-table/name=." { + "default-rib/name=." {
error-message "The 'direct' protocol can be " error-message "The 'direct' protocol can be "
+ "connected only to a default " + "connected only to a default RIB.";
+ "routing table.";
description description
"For the 'direct' pseudo-protocol, the connected "For the 'direct' pseudo-protocol, the connected
routing table must always be a default routing RIB must always be a default RIB.";
table.";
} }
description description
"Name of an existing routing table."; "Name of an existing RIB.";
} }
leaf import-filter { leaf import-filter {
type route-filter-ref; type route-filter-ref;
description description
"Configuration of import filter."; "Configuration of import filter.";
} }
leaf export-filter { leaf export-filter {
type route-filter-ref; type route-filter-ref;
description description
"Configuration of export filter."; "Configuration of export filter.";
skipping to change at page 39, line 39 skipping to change at page 43, line 48
description description
"Configuration of the 'static' pseudo-protocol. "Configuration of the 'static' pseudo-protocol.
Address family specific modules augment this node with Address family specific modules augment this node with
their lists of routes. their lists of routes.
"; ";
} }
} }
} }
} }
container routing-tables { container ribs {
description description
"Configured routing tables."; "Configured RIBs.";
list routing-table { list rib {
key "name"; key "name";
unique "id";
description description
"Each entry represents a configured routing table "Each entry represents a configured RIB identified by the
identified by the 'name' key. 'name' key.
Entries having the same key as a system-provided entry of
the list /routing-state/routing-tables/routing-tables are
used for configuring parameters of that entry. Other
entries define additional user-provided routing tables.
Entries having the same key as a system-controlled entry
of the list /routing-state/ribs/rib are used for
configuring parameters of that entry. Other entries define
additional user-controlled RIBs.
"; ";
leaf name { leaf name {
type string; type string;
description description
"The name of the routing table."; "The name of the RIB.";
} }
uses afn-safi; leaf id {
type uint64;
description
"System-assigned numeric identifier of the RIB instance.
This leaf is essential for creating new configuration
entries that refer to existing system-controlled RIBs.
";
}
uses address-family;
leaf description { leaf description {
type string; type string;
description description
"Textual description of the routing table."; "Textual description of the RIB.";
} }
container recipient-routing-tables { container recipient-ribs {
if-feature user-defined-routing-tables; if-feature advanced-router;
description description
"Configuration of recipient routing tables."; "Configuration of recipient RIBs.";
list recipient-routing-table { list recipient-rib {
must "name != ../../name" { must "name != ../../name" {
error-message "Source and recipient routing tables " error-message
+ "are identical."; "Source and recipient RIBs are identical.";
description description
"A routing table MUST NOT appear among its recipient "A RIB MUST NOT appear among its recipient RIBs.";
routing tables.";
} }
must "/routing/routing-tables/" must "/routing/ribs/rib[name=current()/name]/"
+ "routing-table[name=current()/name]/" + "address-family=../../address-family" {
+ "address-family=../../address-family and /routing/"
+ "routing-tables/routing-table[name=current()/name]/"
+ "safi=../../safi" {
error-message "Address family mismatch."; error-message "Address family mismatch.";
description description
"Address family of the recipient routing table MUST "Address family of the recipient RIB MUST match that
match the source table."; of the source RIB.";
} }
key "name"; key "rib-name";
description description
"Each entry configures a recipient routing table."; "Each entry configures a recipient RIB.";
leaf name { leaf rib-name {
type routing-table-ref; type rib-ref;
description description
"The name of the recipient routing table."; "The name of the recipient RIB.";
} }
leaf filter { leaf filter {
type route-filter-ref; type route-filter-ref;
description description
"A route filter which is applied to the routes passed "A route filter which is applied to the routes passed
to the recipient routing table."; to the recipient RIB.";
} }
} }
} }
} }
} }
container route-filters { container route-filters {
description description
"Configuration of route filters."; "Configuration of route filters.";
list route-filter { list route-filter {
key "name"; key "name";
description description
skipping to change at page 41, line 37 skipping to change at page 46, line 4
type identityref { type identityref {
base route-filter; base route-filter;
} }
mandatory "true"; mandatory "true";
description description
"Type of the route filter.."; "Type of the route filter..";
} }
} }
} }
} }
/* RPC methods */
rpc active-route {
description
"Return the active route that a routing-instance uses for
sending packets to a destination address.
";
input {
leaf routing-instance-id {
type routing-instance-state-ref;
mandatory "true";
description
"Identifier of the routing instance whose forwarding
information base is being queried.
If the routing instance with 'id' equal to
'routing-instance-id' doesn't exist, then this operation
SHALL fail with error-tag 'data-missing' and error-app-tag
'routing-instance-not-found'.
";
}
container destination-address {
description
"Network layer destination address.
Address family specific modules MUST augment this
container with a leaf named 'address'.
";
uses address-family;
}
}
output {
container route {
description
"The active route for the specified destination.
If the routing instance has no active route for the
destination address, no output is returned - the server
SHALL send an <rpc-reply> containing a single element
<ok>.
Address family specific modules MUST augment this list
with appropriate route contents.
";
uses address-family;
uses nexthop-content;
uses route-metadata;
}
}
}
rpc route-count {
description
"Return the current number of routes in a RIB.
If the RIB with 'id' equal to 'rib-id' doesn't exist, then
this operation SHALL fail with error-tag 'data-missing' and
error-app-tag 'rib-not-found'.
";
input {
leaf rib-id {
type rib-state-ref;
mandatory "true";
description
"Identifier of the RIB.";
}
}
output {
leaf number-of-routes {
type uint64;
mandatory "true";
description
"Number of routes in the RIB.";
}
}
}
} }
<CODE ENDS> <CODE ENDS>
7. IPv4 Unicast Routing YANG Module 8. IPv4 Unicast Routing YANG Module
RFC Ed.: In this section, replace all occurrences of 'XXXX' with the RFC Ed.: In this section, replace all occurrences of 'XXXX' with the
actual RFC number and all occurrences of the revision date below with actual RFC number and all occurrences of the revision date below with
the date of RFC publication (and remove this note). the date of RFC publication (and remove this note).
<CODE BEGINS> file "ietf-ipv4-unicast-routing@2013-07-13.yang" <CODE BEGINS> file "ietf-ipv4-unicast-routing@2013-10-18.yang"
module ietf-ipv4-unicast-routing { module ietf-ipv4-unicast-routing {
namespace "urn:ietf:params:xml:ns:yang:ietf-ipv4-unicast-routing"; namespace "urn:ietf:params:xml:ns:yang:ietf-ipv4-unicast-routing";
prefix "v4ur"; prefix "v4ur";
import ietf-routing { import ietf-routing {
prefix "rt"; prefix "rt";
} }
skipping to change at page 43, line 14 skipping to change at page 49, line 14
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).
This version of this YANG module is part of RFC XXXX; see the This version of this YANG module is part of RFC XXXX; see the
RFC itself for full legal notices. RFC itself for full legal notices.
"; ";
revision 2013-07-13 { revision 2013-10-18 {
description description
"Initial revision."; "Initial revision.";
reference reference
"RFC XXXX: A YANG Data Model for Routing Management"; "RFC XXXX: A YANG Data Model for Routing Management";
} }
/* Groupings */ /* Identities */
grouping route-content { identity ipv4-unicast {
base rt:ipv4;
description description
"Parameters of IPv4 unicast routes."; "This identity represents the IPv4 unicast address family.";
leaf dest-prefix {
type inet:ipv4-prefix;
description
"IPv4 destination prefix.";
}
leaf next-hop {
type inet:ipv4-address;
description
"IPv4 address of the next hop.";
}
} }
/* RPC Methods */ /* Operational state data */
augment "/rt:active-route/rt:input/rt:destination-address" { augment "/rt:routing-state/rt:ribs/rt:rib/rt:routes/rt:route" {
when "rt:address-family='ipv4' and rt:safi='nlri-unicast'" { when "../../rt:address-family = 'v4ur:ipv4-unicast'" {
description description
"This augment is valid only for IPv4 unicast."; "This augment is valid only for IPv4 unicast.";
} }
description description
"The 'address' leaf augments the 'rt:destination-address' "This leaf augments an IPv4 unicast route.";
parameter of the 'rt:active-route' operation."; leaf destination-prefix {
leaf address { type inet:ipv4-prefix;
type inet:ipv4-address;
description description
"IPv4 destination address."; "IPv4 destination prefix.";
} }
} }
augment "/rt:active-route/rt:output/rt:route" { augment "/rt:routing-state/rt:ribs/rt:rib/rt:routes/rt:route/"
when "rt:address-family='ipv4' and rt:safi='nlri-unicast'" { + "rt:nexthop-options/rt:simple-nexthop" {
when "../../rt:address-family = 'v4ur:ipv4-unicast'" {
description description
"This augment is valid only for IPv4 unicast."; "This augment is valid only for IPv4 unicast.";
} }
description description
"Contents of the reply to 'rt:active-route' operation."; "This leaf augments the 'simple-nexthop' case of IPv4 unicast
uses route-content; routes.";
leaf gateway {
type inet:ipv4-address;
description
"IPv4 address of the gateway.";
}
} }
/* Operational state */ augment "/rt:routing-state/rt:ribs/rt:rib/rt:routes/rt:route/"
+ "rt:nexthop-options/rt:nexthop-list/rt:nexthop" {
augment "/rt:routing-state/rt:routing-tables/rt:routing-table/" when "../../../rt:address-family = 'v4ur:ipv4-unicast'" {
+ "rt:routes/rt:route" {
when "../../rt:address-family = 'ipv4' and ../../rt:safi = "
+ "'nlri-unicast'" {
description description
"This augment is valid only for IPv4 unicast."; "This augment is valid only for IPv4 unicast.";
} }
description description
"This augment defines the content of IPv4 unicast routes."; "This leaf augments the 'nexthop-list' case of IPv4 unicast
uses route-content; routes.";
leaf address {
type inet:ipv4-address;
description
"IPv4 address of the nexthop.";
}
} }
/* Configuration */ /* Configuration data */
augment "/rt:routing/rt:router/rt:routing-protocols/" augment "/rt:routing/rt:routing-instance/rt:routing-protocols/"
+ "rt:routing-protocol/rt:static-routes" { + "rt:routing-protocol/rt:static-routes" {
description description
"This augment defines the configuration of the 'static' "This augment defines the configuration of the 'static'
pseudo-protocol with data specific for IPv4 unicast."; pseudo-protocol with data specific to IPv4 unicast.";
container ipv4 { container ipv4 {
description description
"Configuration of a 'static' pseudo-protocol instance "Configuration of a 'static' pseudo-protocol instance
consists of a list of routes."; consists of a list of routes.";
list route { list route {
key "id"; key "id";
ordered-by "user"; ordered-by "user";
description description
"A user-ordered list of static routes."; "A user-ordered list of static routes.";
leaf id { leaf id {
type uint32 { type uint32 {
range "1..max"; range "1..max";
} }
description description
"Numeric identifier of the route. "Unique numeric identifier of the route.
It is not required that the routes be sorted by their This value is unrelated to system-assigned keys of
'id'. routes in RIBs.
"; ";
} }
leaf description { leaf description {
type string; type string;
description description
"Textual description of the route."; "Textual description of the route.";
} }
uses rt:route-content; leaf destination-prefix {
uses route-content { type inet:ipv4-prefix;
refine "dest-prefix" { mandatory "true";
mandatory "true"; description
"IPv4 destination prefix.";
}
choice nexthop-options {
mandatory "true";
description
"Options for expressing the nexthop in static routes.";
case special-nexthop {
uses rt:special-nexthop;
}
case simple-nexthop {
leaf gateway {
type inet:ipv4-address;
description
"IPv4 address of the gateway.";
}
leaf outgoing-interface {
type leafref {
path "../../../../../../rt:interfaces/rt:interface/"
+ "rt:name";
}
description
"Name of the outgoing interface.
Only interfaces configured for the parent routing
instance can be given.
";
}
}
case nexthop-list {
if-feature rt:advanced-router;
list nexthop {
key "id";
description
"An entry of a nexthop list.";
leaf id {
type uint32;
description
"Unique numeric identifier of the entry.
This value is unrelated to system-assigned keys of
nexthops in RIBs.
";
}
leaf address {
type inet:ipv4-address;
description
"IPv4 address of the nexthop.";
}
leaf outgoing-interface {
type leafref {
path "../../../../../../../rt:interfaces/"
+ "rt:interface/rt:name";
}
description
"Name of the outgoing interface.
Only interfaces configured for the parent routing
instance can be given.
";
}
uses rt:nexthop-classifiers;
}
} }
} }
} }
} }
} }
/* RPC methods */
augment "/rt:active-route/rt:input/rt:destination-address" {
when "rt:address-family='v4ur:ipv4-unicast'" {
description
"This augment is valid only for IPv4 unicast.";
}
description
"This leaf augments the 'rt:destination-address' parameter of
the 'rt:active-route' operation.";
leaf address {
type inet:ipv4-address;
description
"IPv4 destination address.";
}
}
augment "/rt:active-route/rt:output/rt:route" {
when "rt:address-family='v4ur:ipv4-unicast'" {
description
"This augment is valid only for IPv4 unicast.";
}
description
"This leaf augments the reply to the 'rt:active-route'
operation.";
leaf destination-prefix {
type inet:ipv4-prefix;
description
"IPv4 destination prefix.";
}
}
augment "/rt:active-route/rt:output/rt:route/rt:nexthop-options/"
+ "rt:simple-nexthop" {
when "rt:address-family='v4ur:ipv4-unicast'" {
description
"This augment is valid only for IPv4 unicast.";
}
description
"This leaf augments the 'simple-nexthop' case in the reply to
the 'rt:active-route' operation.";
leaf gateway {
type inet:ipv4-address;
description
"IPv4 address of the gateway.";
}
}
augment "/rt:active-route/rt:output/rt:route/rt:nexthop-options/"
+ "rt:nexthop-list/rt:nexthop" {
when "../rt:address-family='v4ur:ipv4-unicast'" {
description
"This augment is valid only for IPv4 unicast.";
}
if-feature rt:advanced-router;
description
"This leaf augments the 'nexthop-list' case in the reply to the
'rt:active-route' operation.";
leaf address {
type inet:ipv4-address;
description
"IPv4 address of the nexthop.";
}
}
} }
<CODE ENDS> <CODE ENDS>
8. IPv6 Unicast Routing YANG Module 9. IPv6 Unicast Routing YANG Module
RFC Ed.: In this section, replace all occurrences of 'XXXX' with the RFC Ed.: In this section, replace all occurrences of 'XXXX' with the
actual RFC number and all occurrences of the revision date below with actual RFC number and all occurrences of the revision date below with
the date of RFC publication (and remove this note). the date of RFC publication (and remove this note).
<CODE BEGINS> file "ietf-ipv6-unicast-routing@2013-07-13.yang" <CODE BEGINS> file "ietf-ipv6-unicast-routing@2013-10-18.yang"
module ietf-ipv6-unicast-routing { module ietf-ipv6-unicast-routing {
namespace "urn:ietf:params:xml:ns:yang:ietf-ipv6-unicast-routing"; namespace "urn:ietf:params:xml:ns:yang:ietf-ipv6-unicast-routing";
prefix "v6ur"; prefix "v6ur";
import ietf-routing { import ietf-routing {
prefix "rt"; prefix "rt";
} }
skipping to change at page 47, line 22 skipping to change at page 56, line 22
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).
This version of this YANG module is part of RFC XXXX; see the This version of this YANG module is part of RFC XXXX; see the
RFC itself for full legal notices. RFC itself for full legal notices.
"; ";
revision 2013-07-13 { revision 2013-10-18 {
description description
"Initial revision."; "Initial revision.";
reference reference
"RFC XXXX: A YANG Data Model for Routing Management"; "RFC XXXX: A YANG Data Model for Routing Management";
} }
/* Groupings */ /* Identities */
grouping route-content {
description
"Specific parameters of IPv6 unicast routes.";
leaf dest-prefix {
type inet:ipv6-prefix;
description
"IPv6 destination prefix.";
}
leaf next-hop {
type inet:ipv6-address;
description
"IPv6 address of the next hop.";
}
}
/* RPC Methods */
augment "/rt:active-route/rt:input/rt:destination-address" {
when "rt:address-family='ipv6' and rt:safi='nlri-unicast'" {
description
"This augment is valid only for IPv6 unicast.";
}
description
"The 'address' leaf augments the 'rt:destination-address'
parameter of the 'rt:active-route' operation.";
leaf address {
type inet:ipv6-address;
description
"IPv6 destination address.";
}
}
augment "/rt:active-route/rt:output/rt:route" { identity ipv6-unicast {
when "rt:address-family='ipv6' and rt:safi='nlri-unicast'" { base rt:ipv6;
description
"This augment is valid only for IPv6 unicast.";
}
description description
"Contents of the reply to 'rt:active-route' operation."; "This identity represents the IPv6 unicast address family.";
uses route-content;
} }
/* Operational state data */ /* Operational state data */
augment "/rt:routing-state/rt:router/rt:interfaces/rt:interface" { augment "/rt:routing-state/rt:routing-instance/rt:interfaces/"
+ "rt:interface" {
when "/if:interfaces/if:interface[if:name=current()/rt:name]/" when "/if:interfaces/if:interface[if:name=current()/rt:name]/"
+ "ip:ipv6/ip:enabled='true'" { + "ip:ipv6/ip:enabled='true'" {
description description
"This augment is only valid for router interfaces with "This augment is only valid for router interfaces with
enabled IPv6."; enabled IPv6.";
} }
description description
"IPv6-specific parameters of router interfaces."; "IPv6-specific parameters of router interfaces.";
container ipv6-router-advertisements { container ipv6-router-advertisements {
description description
skipping to change at page 53, line 19 skipping to change at page 61, line 32
the Prefix Information option."; the Prefix Information option.";
reference reference
"RFC 4861: Neighbor Discovery for IP version 6 (IPv6) - "RFC 4861: Neighbor Discovery for IP version 6 (IPv6) -
AdvAutonomousFlag."; AdvAutonomousFlag.";
} }
} }
} }
} }
} }
augment "/rt:routing-state/rt:routing-tables/rt:routing-table/" augment "/rt:routing-state/rt:ribs/rt:rib/rt:routes/rt:route" {
+ "rt:routes/rt:route" { when "../../rt:address-family = 'v6ur:ipv6-unicast'" {
when "../../rt:address-family = 'ipv6' and ../../rt:safi = "
+ "'nlri-unicast'" {
description description
"This augment is valid only for IPv6 unicast."; "This augment is valid only for IPv6 unicast.";
} }
description description
"This augment defines the content of IPv6 unicast routes."; "This leaf augments an IPv6 unicast route.";
uses route-content; leaf destination-prefix {
type inet:ipv6-prefix;
description
"IPv6 destination prefix.";
}
} }
/* Configuration */ augment "/rt:routing-state/rt:ribs/rt:rib/rt:routes/rt:route/"
+ "rt:nexthop-options/rt:simple-nexthop" {
when "../../rt:address-family = 'v6ur:ipv6-unicast'" {
description
"This augment is valid only for IPv6 unicast.";
}
description
"This leaf augments the 'simple-nexthop' case of IPv6 unicast
routes.";
leaf gateway {
type inet:ipv6-address;
description
"IPv6 address of the gateway.";
}
}
augment "/rt:routing/rt:router/rt:interfaces/rt:interface" { augment "/rt:routing-state/rt:ribs/rt:rib/rt:routes/rt:route/"
+ "rt:nexthop-options/rt:nexthop-list/rt:nexthop" {
when "../../../rt:address-family = 'v6ur:ipv6-unicast'" {
description
"This augment is valid only for IPv6 unicast.";
}
description
"This leaf augments the 'nexthop-list' case of IPv6 unicast
routes.";
leaf address {
type inet:ipv6-address;
description
"IPv6 address of the nexthop.";
}
}
/* Configuration data */
augment
"/rt:routing/rt:routing-instance/rt:interfaces/rt:interface" {
when "/if:interfaces/if:interface[if:name=current()/rt:name]/" when "/if:interfaces/if:interface[if:name=current()/rt:name]/"
+ "ip:ipv6/ip:enabled='true'" { + "ip:ipv6/ip:enabled='true'" {
description description
"This augment is only valid for router interfaces with "This augment is only valid for router interfaces with
enabled IPv6."; enabled IPv6.";
} }
description description
"Configuration of IPv6-specific parameters of router "Configuration of IPv6-specific parameters of router
interfaces."; interfaces.";
container ipv6-router-advertisements { container ipv6-router-advertisements {
skipping to change at page 57, line 28 skipping to change at page 66, line 28
"The value to be placed in the Autonomous Flag "The value to be placed in the Autonomous Flag
field in the Prefix Information option."; field in the Prefix Information option.";
} }
} }
} }
} }
} }
} }
} }
augment "/rt:routing/rt:router/rt:routing-protocols/" augment "/rt:routing/rt:routing-instance/rt:routing-protocols/"
+ "rt:routing-protocol/rt:static-routes" { + "rt:routing-protocol/rt:static-routes" {
description description
"This augment defines the configuration of the 'static' "This augment defines the configuration of the 'static'
pseudo-protocol with data specific for IPv6 unicast."; pseudo-protocol with data specific to IPv6 unicast.";
container ipv6 { container ipv6 {
description description
"Configuration of a 'static' pseudo-protocol instance "Configuration of a 'static' pseudo-protocol instance
consists of a list of routes."; consists of a list of routes.";
list route { list route {
key "id"; key "id";
ordered-by "user"; ordered-by "user";
description description
"A user-ordered list of static routes."; "A user-ordered list of static routes.";
leaf id { leaf id {
type uint32 { type uint32 {
range "1..max"; range "1..max";
} }
description description
"Numeric identifier of the route. "Unique numeric identifier of the route.
It is not required that the routes be sorted by their This value is unrelated to system-assigned keys of
'id'. routes in RIBs.
"; ";
} }
leaf description { leaf description {
type string; type string;
description description
"Textual description of the route."; "Textual description of the route.";
} }
uses rt:route-content; leaf destination-prefix {
uses route-content { type inet:ipv6-prefix;
refine "dest-prefix" { mandatory "true";
mandatory "true"; description
"IPv6 destination prefix.";
}
choice nexthop-options {
mandatory "true";
description
"Options for expressing the nexthop in static routes.";
case special-nexthop {
uses rt:special-nexthop;
}
case simple-nexthop {
leaf gateway {
type inet:ipv6-address;
description
"IPv6 address of the gateway.";
}
leaf outgoing-interface {
type leafref {
path "../../../../../../rt:interfaces/rt:interface/"
+ "rt:name";
}
description
"Name of the outgoing interface.
Only interfaces configured for the parent routing
instance can be given.
";
}
}
case nexthop-list {
if-feature rt:advanced-router;
list nexthop {
key "id";
description
"An entry of a nexthop list.";
leaf id {
type uint32;
description
"Unique numeric identifier of the entry.
This value is unrelated to system-assigned keys of
nexthops in RIBs.
";
}
leaf address {
type inet:ipv6-address;
description
"IPv6 address of the nexthop.";
}
leaf outgoing-interface {
type leafref {
path "../../../../../../../rt:interfaces/"
+ "rt:interface/rt:name";
}
description
"Name of the outgoing interface.
Only interfaces configured for the parent routing
instance can be given.
";
}
uses rt:nexthop-classifiers;
}
} }
} }
} }
} }
} }
/* RPC methods */
augment "/rt:active-route/rt:input/rt:destination-address" {
when "rt:address-family='v6ur:ipv6-unicast'" {
description
"This augment is valid only for IPv6 unicast.";
}
description
"This leaf augments the 'rt:destination-address' parameter of
the 'rt:active-route' operation.";
leaf address {
type inet:ipv6-address;
description
"IPv6 destination address.";
}
}
augment "/rt:active-route/rt:output/rt:route" {
when "rt:address-family='v6ur:ipv6-unicast'" {
description
"This augment is valid only for IPv6 unicast.";
}
description
"This leaf augments the reply to the 'rt:active-route'
operation.";
leaf destination-prefix {
type inet:ipv6-prefix;
description
"IPv6 destination prefix.";
}
}
augment "/rt:active-route/rt:output/rt:route/rt:nexthop-options/"
+ "rt:simple-nexthop" {
when "rt:address-family='v6ur:ipv6-unicast'" {
description
"This augment is valid only for IPv6 unicast.";
}
description
"This leaf augments the 'simple-nexthop' case in the reply to
the 'rt:active-route' operation.";
leaf gateway {
type inet:ipv6-address;
description
"IPv6 address of the gateway.";
}
}
augment "/rt:active-route/rt:output/rt:route/rt:nexthop-options/"
+ "rt:nexthop-list/rt:nexthop" {
when "../rt:address-family='v6ur:ipv6-unicast'" {
description
"This augment is valid only for IPv6 unicast.";
}
if-feature rt:advanced-router;
description
"This leaf augments the 'nexthop-list' case in the reply to the
'rt:active-route' operation.";
leaf address {
type inet:ipv6-address;
description
"IPv6 address of the nexthop.";
}
}
} }
<CODE ENDS> <CODE ENDS>
9. IANA Considerations 10. IANA Considerations
RFC Ed.: In this section, replace all occurrences of 'XXXX' with the RFC Ed.: In this section, replace all occurrences of 'XXXX' with the
actual RFC number (and remove this note). actual RFC number (and remove this note).
This document registers the following namespace URIs in the IETF XML This document registers the following namespace URIs in the IETF XML
registry [RFC3688]: registry [RFC3688]:
---------------------------------------------------------- ----------------------------------------------------------
URI: urn:ietf:params:xml:ns:yang:ietf-routing URI: urn:ietf:params:xml:ns:yang:ietf-routing
skipping to change at page 61, line 5 skipping to change at page 72, line 5
reference: RFC XXXX reference: RFC XXXX
------------------------------------------------------------------- -------------------------------------------------------------------
------------------------------------------------------------------- -------------------------------------------------------------------
name: ietf-ipv6-unicast-routing name: ietf-ipv6-unicast-routing
namespace: urn:ietf:params:xml:ns:yang:ietf-ipv6-unicast-routing namespace: urn:ietf:params:xml:ns:yang:ietf-ipv6-unicast-routing
prefix: v6ur prefix: v6ur
reference: RFC XXXX reference: RFC XXXX
------------------------------------------------------------------- -------------------------------------------------------------------
10. Security Considerations 11. Security Considerations
Configuration and state data conforming to the core routing data Configuration and state data conforming to the core routing data
model (defined in this document) are designed to be accessed via the model (defined in this document) are designed to be accessed via the
NETCONF protocol [RFC6241]. The lowest NETCONF layer is the secure NETCONF protocol [RFC6241]. The lowest NETCONF layer is the secure
transport layer and the mandatory-to-implement secure transport is transport layer and the mandatory-to-implement secure transport is
SSH [RFC6242]. SSH [RFC6242].
A number of data nodes defined in the YANG modules belonging to the A number of data nodes defined in the YANG modules belonging to the
configuration part of the core routing data model are writable/ configuration part of the core routing data model are writable/
creatable/deletable (i.e., "config true" in YANG terms, which is the creatable/deletable (i.e., "config true" in YANG terms, which is the
default). These data nodes may be considered sensitive or vulnerable default). These data nodes may be considered sensitive or vulnerable
in some network environments. Write operations to these data nodes, in some network environments. Write operations to these data nodes,
such as "edit-config", can have negative effects on the network if such as "edit-config", can have negative effects on the network if
the protocol operations are not properly protected. the protocol operations are not properly protected.
The vulnerable "config true" subtrees and data nodes are the The vulnerable "config true" subtrees and data nodes are the
following: following:
/routing/router/interfaces/interface This list assigns a network /routing/routing-instance/interfaces/interface This list assigns a
layer interface to a router instance and may also specify network layer interface to a routing instance and may also specify
interface parameters related to routing. interface parameters related to routing.
/routing/router/routing-protocols/routing-protocol This list /routing/routing-instance/routing-protocols/routing-protocol This
specifies the routing protocols configured on a device. list specifies the routing protocols configured on a device.
/routing/route-filters/route-filter This list specifies the /routing/route-filters/route-filter This list specifies the
configured route filters which represent administrative policies configured route filters which represent administrative policies
for redistributing and modifying routing information. for redistributing and modifying routing information.
/routing/routing-tables/routing-table This list specifies the /routing/ribs/rib This list specifies the RIBs configured for the
configured routing tables used by the device. device.
Unauthorized access to any of these lists can adversely affect the Unauthorized access to any of these lists can adversely affect the
routing subsystem of both the local device and the network. This may routing subsystem of both the local device and the network. This may
lead to network malfunctions, delivery of packets to inappropriate lead to network malfunctions, delivery of packets to inappropriate
destinations and other problems. destinations and other problems.
11. Acknowledgments 12. Acknowledgments
The author wishes to thank Martin Bjorklund, Joel Halpern,
Wes Hardaker, Andrew McGregor, Xiang Li, Thomas Morin, Tom Petch,
Bruno Rijsman, Juergen Schoenwaelder, Phil Shafer, Dave Thaler and
Yi Yang for their helpful comments and suggestions.
12. References The author wishes to thank Nitin Bahadur, Martin Bjorklund,
Joel Halpern, Wes Hardaker, Sriganesh Kini, Andrew McGregor,
Jan Medved, Xiang Li, Thomas Morin, Tom Petch, Bruno Rijsman,
Juergen Schoenwaelder, Phil Shafer, Dave Thaler and Yi Yang for their
helpful comments and suggestions.
12.1. Normative References 13. References
[IANA-AF] Bjorklund, M., "IANA Address Family Numbers and Subsequent 13.1. Normative References
Address Family Identifiers YANG Module",
draft-ietf-netmod-iana-afn-safi-00 (work in progress),
July 2013.
[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, March 1997. Requirement Levels", BCP 14, RFC 2119, March 1997.
[RFC3688] Mealling, M., "The IETF XML Registry", BCP 81, RFC 3688, [RFC3688] Mealling, M., "The IETF XML Registry", BCP 81, RFC 3688,
January 2004. January 2004.
[RFC4861] Narten, T., Nordmark, E., Simpson, W., and H. Soliman, [RFC4861] Narten, T., Nordmark, E., Simpson, W., and H. Soliman,
"Neighbor Discovery for IP version 6 (IPv6)", RFC 4861, "Neighbor Discovery for IP version 6 (IPv6)", RFC 4861,
September 2007. September 2007.
[RFC6020] Bjorklund, M., Ed., "YANG - A Data Modeling Language for [RFC6020] Bjorklund, M., Ed., "YANG - A Data Modeling Language for
Network Configuration Protocol (NETCONF)", RFC 6020, Network Configuration Protocol (NETCONF)", RFC 6020,
September 2010. September 2010.
[RFC6021bis]
Schoenwaelder, J., Ed., "Common YANG Data Types",
draft-ietf-netmod-rfc6021-bis-03 (work in progress),
May 2013.
[RFC6241] Enns, R., Bjorklund, M., Schoenwaelder, J., and A. [RFC6241] Enns, R., Bjorklund, M., Schoenwaelder, J., and A.
Bierman, "NETCONF Configuration Protocol", RFC 6241, Bierman, "NETCONF Configuration Protocol", RFC 6241,
June 2011. June 2011.
[RFC6991] Schoenwaelder, J., Ed., "Common YANG Data Types",
RFC 6991, July 2013.
[YANG-IF] Bjorklund, M., "A YANG Data Model for Interface [YANG-IF] Bjorklund, M., "A YANG Data Model for Interface
Management", draft-ietf-netmod-interfaces-cfg-12 (work in Management", draft-ietf-netmod-interfaces-cfg-12 (work in
progress), July 2013. progress), July 2013.
[YANG-IP] Bjorklund, M., "A YANG Data Model for IP Management", [YANG-IP] Bjorklund, M., "A YANG Data Model for IP Management",
draft-ietf-netmod-ip-cfg-09 (work in progress), draft-ietf-netmod-ip-cfg-10 (work in progress),
February 2013. August 2013.
12.2. Informative References 13.2. Informative References
[RFC6087] Bierman, A., "Guidelines for Authors and Reviewers of YANG [RFC6087] Bierman, A., "Guidelines for Authors and Reviewers of YANG
Data Model Documents", RFC 6087, January 2011. Data Model Documents", RFC 6087, January 2011.
[RFC6242] Wasserman, M., "Using the NETCONF Protocol over Secure [RFC6242] Wasserman, M., "Using the NETCONF Protocol over Secure
Shell (SSH)", RFC 6242, June 2011. Shell (SSH)", RFC 6242, June 2011.
Appendix A. The Complete Data Trees Appendix A. The Complete Data Trees
This appendix presents the complete configuration and operational This appendix presents the complete configuration and operational
state data trees of the core routing data model. state data trees of the core routing data model.
See Section 2.2 for an explanation of the symbols used. Data type of See Section 2.2 for an explanation of the symbols used. Data type of
every leaf node is shown near the right end of the corresponding every leaf node is shown near the right end of the corresponding
line. line.
A.1. Configuration Data A.1. Configuration Data
+--rw routing +--rw routing
+--rw router* [name] +--rw routing-instance* [name]
| +--rw name string | +--rw name string
| +--rw type? identityref | +--rw routing-instance-id? uint64
| +--rw enabled? boolean | +--rw type? identityref
| +--rw router-id? yang:dotted-quad | +--rw enabled? boolean
| +--rw description? string | +--rw router-id? yang:dotted-quad
| +--rw default-routing-tables | +--rw description? string
| | +--rw default-routing-table* [address-family safi] | +--rw default-ribs {advanced-router}?
| | +--rw address-family ianaaf:address-family | | +--rw default-rib* [address-family]
| | +--rw safi ianaaf:subsequent-address-family | | +--rw address-family identityref
| | +--rw name string | | +--rw name string
| +--rw interfaces | +--rw interfaces
| | +--rw interface* [name] | | +--rw interface* [name]
| | +--rw name if:interface-ref | | +--rw name if:interface-ref
| | +--rw v6ur:ipv6-router-advertisements | | +--rw v6ur:ipv6-router-advertisements
| | +--rw v6ur:send-advertisements? boolean | | +--rw v6ur:send-advertisements? boolean
| | +--rw v6ur:max-rtr-adv-interval? uint16 | | +--rw v6ur:max-rtr-adv-interval? uint16
| | +--rw v6ur:min-rtr-adv-interval? uint16 | | +--rw v6ur:min-rtr-adv-interval? uint16
| | +--rw v6ur:managed-flag? boolean | | +--rw v6ur:managed-flag? boolean
| | +--rw v6ur:other-config-flag? boolean | | +--rw v6ur:other-config-flag? boolean
| | +--rw v6ur:link-mtu? uint32 | | +--rw v6ur:link-mtu? uint32
| | +--rw v6ur:reachable-time? uint32 | | +--rw v6ur:reachable-time? uint32
| | +--rw v6ur:retrans-timer? uint32 | | +--rw v6ur:retrans-timer? uint32
| | +--rw v6ur:cur-hop-limit? uint8 | | +--rw v6ur:cur-hop-limit? uint8
| | +--rw v6ur:default-lifetime? uint16 | | +--rw v6ur:default-lifetime? uint16
| | +--rw v6ur:prefix-list | | +--rw v6ur:prefix-list
| | +--rw v6ur:prefix* [prefix-spec] | | +--rw v6ur:prefix* [prefix-spec]
| | +--rw v6ur:prefix-spec inet:ipv6-prefix | | +--rw v6ur:prefix-spec inet:ipv6-prefix
| | +--rw (control-adv-prefixes)? | | +--rw (control-adv-prefixes)?
| | +--:(no-advertise) | | +--:(no-advertise)
| | | +--rw v6ur:no-advertise? empty | | | +--rw v6ur:no-advertise? empty
| | +--:(advertise) | | +--:(advertise)
| | +--rw v6ur:valid-lifetime? uint32 | | +--rw v6ur:valid-lifetime? uint32
| | +--rw v6ur:on-link-flag? boolean | | +--rw v6ur:on-link-flag? boolean
| | +--rw v6ur:preferred-lifetime? uint32 | | +--rw v6ur:preferred-lifetime? uint32
| | +--rw v6ur:autonomous-flag? boolean | | +--rw v6ur:autonomous-flag? boolean
| +--rw routing-protocols | +--rw routing-protocols
| +--rw routing-protocol* [name] | +--rw routing-protocol* [name]
| +--rw name string | +--rw name string
| +--rw description? string | +--rw description? string
| +--rw enabled? boolean | +--rw enabled? boolean
| +--rw type identityref | +--rw type identityref
| +--rw connected-routing-tables | +--rw connected-ribs {advanced-router}?
| | +--rw connected-routing-table* [name] | | +--rw connected-rib* [rib-name]
| | +--rw name routing-table-ref | | +--rw rib-name rib-ref
| | +--rw import-filter? route-filter-ref | | +--rw import-filter? route-filter-ref
| | +--rw export-filter? route-filter-ref | | +--rw export-filter? route-filter-ref
| +--rw static-routes | +--rw static-routes
| +--rw v4ur:ipv4 | +--rw v4ur:ipv4
| | +--rw v4ur:route* [id] | | +--rw v4ur:route* [id]
| | +--rw v4ur:id uint32 | | +--rw v4ur:id uint32
| | +--rw v4ur:description? string | | +--rw v4ur:description? string
| | +--rw v4ur:outgoing-interface? if:interface-ref | | +--rw v4ur:destination-prefix inet:ipv4-prefix
| | +--rw v4ur:dest-prefix inet:ipv4-prefix | | +--rw (nexthop-options)
| | +--rw v4ur:next-hop? inet:ipv4-address | | +--:(special-nexthop)
| +--rw v6ur:ipv6 | | | +--rw v4ur:special-nexthop? enumeration
| +--rw v6ur:route* [id] | | +--:(simple-nexthop)
| +--rw v6ur:id uint32 | | | +--rw v4ur:gateway? inet:ipv4-address
| +--rw v6ur:description? string | | | +--rw v4ur:outgoing-interface? leafref
| +--rw v6ur:outgoing-interface? if:interface-ref | | +--:(nexthop-list) {rt:advanced-router}?
| +--rw v6ur:dest-prefix inet:ipv6-prefix | | +--rw v4ur:nexthop* [id]
| +--rw v6ur:next-hop? inet:ipv6-address | | +--rw v4ur:id uint32
+--rw routing-tables | | +--rw v4ur:address? inet:ipv4-address
| +--rw routing-table* [name] | | +--rw v4ur:outgoing-interface? leafref
| +--rw name string | | +--rw v4ur:priority? enumeration
| +--rw address-family ianaaf:address-family | | +--rw v4ur:weight? uint8
| +--rw safi ianaaf:subsequent-address-family | +--rw v6ur:ipv6
| +--rw description? string | +--rw v6ur:route* [id]
| +--rw recipient-routing-tables | +--rw v6ur:id uint32
| +--rw recipient-routing-table* [name] | +--rw v6ur:description? string
| +--rw name routing-table-ref | +--rw v6ur:destination-prefix inet:ipv6-prefix
| +--rw filter? route-filter-ref | +--rw (nexthop-options)
+--rw route-filters | +--:(special-nexthop)
+--rw route-filter* [name] | | +--rw v6ur:special-nexthop? enumeration
+--rw name string | +--:(simple-nexthop)
+--rw description? string | | +--rw v6ur:gateway? inet:ipv6-address
+--rw type identityref | | +--rw v6ur:outgoing-interface? leafref
| +--:(nexthop-list) {rt:advanced-router}?
| +--rw v6ur:nexthop* [id]
| +--rw v6ur:id uint32
| +--rw v6ur:address? inet:ipv6-address
| +--rw v6ur:outgoing-interface? leafref
| +--rw v6ur:priority? enumeration
| +--rw v6ur:weight? uint8
+--rw ribs
| +--rw rib* [name]
| +--rw name string
| +--rw id? uint64
| +--rw address-family identityref
| +--rw description? string
| +--rw recipient-ribs {advanced-router}?
| +--rw recipient-rib* [rib-name]
| +--rw rib-name rib-ref
| +--rw filter? route-filter-ref
+--rw route-filters
+--rw route-filter* [name]
+--rw name string
+--rw description? string
+--rw type identityref
A.2. Operational State Data A.2. Operational State Data
+--ro routing-state +--ro routing-state
+--ro router* [name] +--ro routing-instance* [id]
| +--ro name string | +--ro id uint64
| +--ro type? identityref | +--ro name? leafref
| +--ro router-id? yang:dotted-quad | +--ro type? identityref
| +--ro default-routing-tables | +--ro router-id? yang:dotted-quad
| | +--ro default-routing-table* [address-family safi] | +--ro default-ribs
| | +--ro address-family ianaaf:address-family | | +--ro default-rib* [address-family]
| | +--ro safi ianaaf:subsequent-address-family | | +--ro address-family identityref
| | +--ro name routing-table-state-ref | | +--ro rib-id rib-state-ref
| +--ro interfaces | +--ro interfaces
| | +--ro interface* [name] | | +--ro interface* [name]
| | +--ro name if:interface-state-ref | | +--ro name if:interface-state-ref
| | +--ro v6ur:ipv6-router-advertisements | | +--ro v6ur:ipv6-router-advertisements
| | +--ro v6ur:send-advertisements? boolean | | +--ro v6ur:send-advertisements? boolean
| | +--ro v6ur:max-rtr-adv-interval? uint16 | | +--ro v6ur:max-rtr-adv-interval? uint16
| | +--ro v6ur:min-rtr-adv-interval? uint16 | | +--ro v6ur:min-rtr-adv-interval? uint16
| | +--ro v6ur:managed-flag? boolean | | +--ro v6ur:managed-flag? boolean
| | +--ro v6ur:other-config-flag? boolean | | +--ro v6ur:other-config-flag? boolean
| | +--ro v6ur:link-mtu? uint32 | | +--ro v6ur:link-mtu? uint32
| | +--ro v6ur:reachable-time? uint32 | | +--ro v6ur:reachable-time? uint32
| | +--ro v6ur:retrans-timer? uint32 | | +--ro v6ur:retrans-timer? uint32
| | +--ro v6ur:cur-hop-limit? uint8 | | +--ro v6ur:cur-hop-limit? uint8
| | +--ro v6ur:default-lifetime? uint16 | | +--ro v6ur:default-lifetime? uint16
| | +--ro v6ur:prefix-list | | +--ro v6ur:prefix-list
| | +--ro v6ur:prefix* [prefix-spec] | | +--ro v6ur:prefix* [prefix-spec]
| | +--ro v6ur:prefix-spec inet:ipv6-prefix | | +--ro v6ur:prefix-spec inet:ipv6-prefix
| | +--ro v6ur:valid-lifetime? uint32 | | +--ro v6ur:valid-lifetime? uint32
| | +--ro v6ur:on-link-flag? boolean | | +--ro v6ur:on-link-flag? boolean
| | +--ro v6ur:preferred-lifetime? uint32 | | +--ro v6ur:preferred-lifetime? uint32
| | +--ro v6ur:autonomous-flag? boolean | | +--ro v6ur:autonomous-flag? boolean
| +--ro routing-protocols | +--ro routing-protocols
| +--ro routing-protocol* [name] | +--ro routing-protocol* [name]
| +--ro name string | +--ro name string
| +--ro type identityref | +--ro type identityref
| +--ro connected-routing-tables | +--ro connected-ribs {advanced-router}?
| +--ro connected-routing-table* [name] | +--ro connected-rib* [rib-id]
| +--ro name routing-table-state-ref | +--ro rib-id rib-state-ref
| +--ro import-filter? route-filter-state-ref | +--ro import-filter? route-filter-state-ref
| +--ro export-filter? route-filter-state-ref | +--ro export-filter? route-filter-state-ref
+--ro routing-tables +--ro ribs
| +--ro routing-table* [name] | +--ro rib* [id]
| +--ro name string | +--ro id uint64
| +--ro address-family ianaaf:address-family | +--ro name? leafref
| +--ro safi ianaaf:subsequent-address-family | +--ro address-family identityref
| +--ro routes | +--ro routes
| | +--ro route* | | +--ro route* [id]
| | +--ro outgoing-interface? if:interface-state-ref | | +--ro id uint64
| | +--ro source-protocol identityref | | +--ro (nexthop-options)
| | +--ro last-updated? yang:date-and-time | | | +--:(special-nexthop)
| | +--ro v4ur:dest-prefix? inet:ipv4-prefix | | | | +--ro special-nexthop? enumeration
| | +--ro v4ur:next-hop? inet:ipv4-address | | | +--:(simple-nexthop)
| | +--ro v6ur:dest-prefix? inet:ipv6-prefix | | | | +--ro outgoing-interface? leafref
| | +--ro v6ur:next-hop? inet:ipv6-address | | | | +--ro v4ur:gateway? inet:ipv4-address
| +--ro recipient-routing-tables | | | | +--ro v6ur:gateway? inet:ipv6-address
| +--ro recipient-routing-table* [name] | | | +--:(nexthop-list) {advanced-router}?
| +--ro name routing-table-state-ref | | | +--ro nexthop* [id]
| +--ro filter? route-filter-state-ref | | | +--ro id uint64
+--ro route-filters | | | +--ro outgoing-interface? leafref
+--ro route-filter* [name] | | | +--ro priority? enumeration
+--ro name string | | | +--ro weight? uint8
+--ro type identityref | | | +--ro v4ur:address? inet:ipv4-address
| | | +--ro v6ur:address? inet:ipv6-address
| | +--ro source-protocol identityref
| | +--ro last-updated? yang:date-and-time
| | +--ro v4ur:destination-prefix? inet:ipv4-prefix
| | +--ro v6ur:destination-prefix? inet:ipv6-prefix
| +--ro recipient-ribs {advanced-router}?
| +--ro recipient-rib* [rib-id]
| +--ro rib-id rib-state-ref
| +--ro filter? route-filter-state-ref
+--ro route-filters
+--ro route-filter* [name]
+--ro name string
+--ro type identityref
Appendix B. Example: Adding a New Routing Protocol Appendix B. Example: Adding a New Routing Protocol
This appendix demonstrates how the core routing data model can be This appendix demonstrates how the core routing data model can be
extended to support a new routing protocol. The YANG module extended to support a new routing protocol. The YANG module
"example-rip" shown below is intended only as an illustration rather "example-rip" shown below is intended only as an illustration rather
than a real definition of a data model for the RIP routing protocol. than a real definition of a data model for the RIP routing protocol.
For the sake of brevity, we do not follow all the guidelines For the sake of brevity, we do not follow all the guidelines
specified in [RFC6087]. See also Section 4.4.2. specified in [RFC6087]. See also Section 5.4.2.
module example-rip { module example-rip {
namespace "http://example.com/rip"; namespace "http://example.com/rip";
prefix "rip"; prefix "rip";
import ietf-routing { import ietf-routing {
prefix "rt"; prefix "rt";
} }
skipping to change at page 68, line 51 skipping to change at page 79, line 51
} }
leaf tag { leaf tag {
type uint16; type uint16;
default "0"; default "0";
description description
"This leaf may be used to carry additional info, e.g. AS "This leaf may be used to carry additional info, e.g. AS
number."; number.";
} }
} }
augment "/rt:routing-state/rt:routing-tables/rt:routing-table/" augment "/rt:routing-state/rt:ribs/rt:rib/rt:routes/rt:route" {
+ "rt:routes/rt:route" {
when "rt:source-protocol = 'rip:rip'" { when "rt:source-protocol = 'rip:rip'" {
description description
"This augment is only valid for a routes whose source "This augment is only valid for a routes whose source
protocol is RIP."; protocol is RIP.";
} }
description description
"RIP-specific route attributes."; "RIP-specific route attributes.";
uses route-content; uses route-content;
} }
augment "/rt:active-route/rt:output/rt:route" { augment "/rt:active-route/rt:output/rt:route" {
description description
"RIP-specific route attributes in the output of 'active-route' "RIP-specific route attributes in the output of 'active-route'
RPC."; RPC.";
uses route-content; uses route-content;
} }
augment "/rt:routing/rt:router/rt:routing-protocols/" augment "/rt:routing/rt:routing-instance/rt:routing-protocols/"
+ "rt:routing-protocol" { + "rt:routing-protocol" {
when "rt:type = 'rip:rip'" { when "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 type 'rip'."; of type 'rip'.";
} }
container rip { container rip {
description description
"RIP instance configuration."; "RIP instance configuration.";
container interfaces { container interfaces {
skipping to change at page 71, line 15 skipping to change at page 82, line 15
Appendix C. Example: NETCONF <get> Reply Appendix C. Example: NETCONF <get> Reply
This section contains a sample reply to the NETCONF <get> message, This section contains a sample reply to the NETCONF <get> message,
which could be sent by a server supporting (i.e., advertising them in which could be sent by a server supporting (i.e., advertising them in
the NETCONF <hello> message) the following YANG modules: the NETCONF <hello> message) the following YANG modules:
o ietf-interfaces [YANG-IF], o ietf-interfaces [YANG-IF],
o ietf-ip [YANG-IP], o ietf-ip [YANG-IP],
o ietf-routing (Section 6), o ietf-routing (Section 7),
o ietf-ipv4-unicast-routing (Section 7), o ietf-ipv4-unicast-routing (Section 8),
o ietf-ipv6-unicast-routing (Section 8). o ietf-ipv6-unicast-routing (Section 9).
We assume a simple network setup as shown in Figure 5: router "A" We assume a simple network setup as shown in Figure 5: router "A"
uses static default routes with the "ISP" router as the next hop. uses static default routes with the "ISP" router as the next hop.
IPv6 router advertisements are configured only on the "eth1" IPv6 router advertisements are configured only on the "eth1"
interface and disabled on the upstream "eth0" interface. interface and disabled on the upstream "eth0" interface.
+-----------------+ +-----------------+
| | | |
| Router ISP | | Router ISP |
| | | |
skipping to change at page 73, line 39 skipping to change at page 84, line 39
<if:oper-status>up</if:oper-status> <if:oper-status>up</if:oper-status>
<if:phys-address>00:0C:42:E5:B1:EA</if:phys-address> <if:phys-address>00:0C:42:E5:B1:EA</if:phys-address>
<if:statistics> <if:statistics>
<if:discontinuity-time> <if:discontinuity-time>
2013-07-02T17:11:27+00:59 2013-07-02T17:11:27+00:59
</if:discontinuity-time> </if:discontinuity-time>
</if:statistics> </if:statistics>
</if:interface> </if:interface>
</if:interfaces-state> </if:interfaces-state>
<rt:routing> <rt:routing>
<rt:router> <rt:routing-instance>
<rt:name>rtr0</rt:name> <rt:name>rtr0</rt:name>
<rt:routing-instance-id>1415926535</rt:routing-instance-id>
<rt:description>Router A</rt:description> <rt:description>Router A</rt:description>
<rt:interfaces> <rt:interfaces>
<rt:interface> <rt:interface>
<rt:name>eth1</rt:name> <rt:name>eth1</rt:name>
<v6ur:ipv6-router-advertisements> <v6ur:ipv6-router-advertisements>
<v6ur:send-advertisements>true</v6ur:send-advertisements> <v6ur:send-advertisements>true</v6ur:send-advertisements>
<v6ur:prefix-list> <v6ur:prefix-list>
<v6ur:prefix> <v6ur:prefix>
<v6ur:prefix-spec>2001:db8:0:2::/64</v6ur:prefix-spec> <v6ur:prefix-spec>2001:db8:0:2::/64</v6ur:prefix-spec>
</v6ur:prefix> </v6ur:prefix>
</v6ur:prefix-list>
</v6ur:prefix-list>
</v6ur:ipv6-router-advertisements> </v6ur:ipv6-router-advertisements>
</rt:interface> </rt:interface>
</rt:interfaces> </rt:interfaces>
<rt:routing-protocols> <rt:routing-protocols>
<rt:routing-protocol> <rt:routing-protocol>
<rt:name>st0</rt:name> <rt:name>st0</rt:name>
<rt:description> <rt:description>
Static routing is used for the internal network. Static routing is used for the internal network.
</rt:description> </rt:description>
<rt:type>rt:static</rt:type> <rt:type>rt:static</rt:type>
<rt:static-routes> <rt:static-routes>
<v4ur:ipv4> <v4ur:ipv4>
<v4ur:route> <v4ur:route>
<v4ur:id>1</v4ur:id> <v4ur:id>1</v4ur:id>
<v4ur:dest-prefix>0.0.0.0/0</v4ur:dest-prefix> <v4ur:destination-prefix>0.0.0.0/0</v4ur:destination-prefix>
<v4ur:next-hop>192.0.2.2</v4ur:next-hop> <v4ur:gateway>192.0.2.2</v4ur:gateway>
</v4ur:route> </v4ur:route>
</v4ur:ipv4> </v4ur:ipv4>
<v6ur:ipv6> <v6ur:ipv6>
<v6ur:route> <v6ur:route>
<v6ur:id>1</v6ur:id> <v6ur:id>1</v6ur:id>
<v6ur:dest-prefix>::/0</v6ur:dest-prefix> <v6ur:destination-prefix>::/0</v6ur:destination-prefix>
<v6ur:next-hop>2001:db8:0:1::2</v6ur:next-hop> <v6ur:gateway>2001:db8:0:1::2</v6ur:gateway>
</v6ur:route> </v6ur:route>
</v6ur:ipv6> </v6ur:ipv6>
</rt:static-routes> </rt:static-routes>
</rt:routing-protocol> </rt:routing-protocol>
</rt:routing-protocols> </rt:routing-protocols>
</rt:router> </rt:routing-instance>
</rt:routing> </rt:routing>
<rt:routing-state> <rt:routing-state>
<rt:router> <rt:routing-instance>
<rt:id>1415926535</rt:id>
<rt:name>rtr0</rt:name> <rt:name>rtr0</rt:name>
<rt:router-id>192.0.2.1</rt:router-id> <rt:router-id>192.0.2.1</rt:router-id>
<rt:default-routing-tables> <rt:default-ribs>
<rt:default-routing-table> <rt:default-rib>
<rt:address-family>ipv4</rt:address-family> <rt:address-family>v4ur:ipv4-unicast</rt:address-family>
<rt:safi>nlri-unicast</rt:safi> <rt:rib-id>897932384</rt:rib-id>
<rt:name>ipv4-unicast</rt:name> </rt:default-rib>
</rt:default-routing-table> <rt:default-rib>
<rt:default-routing-table> <rt:address-family>v6ur:ipv6-unicast</rt:address-family>
<rt:address-family>ipv6</rt:address-family> <rt:rib-id>751058209</rt:rib-id>
<rt:safi>nlri-unicast</rt:safi> </rt:default-rib>
<rt:name>ipv6-unicast</rt:name> </rt:default-ribs>
</rt:default-routing-table>
</rt:default-routing-tables>
<rt:interfaces> <rt:interfaces>
<rt:interface> <rt:interface>
<rt:name>eth0</rt:name> <rt:name>eth0</rt:name>
</rt:interface> </rt:interface>
<rt:interface> <rt:interface>
<rt:name>eth1</rt:name> <rt:name>eth1</rt:name>
<v6ur:ipv6-router-advertisements> <v6ur:ipv6-router-advertisements>
<v6ur:send-advertisements>true</v6ur:send-advertisements> <v6ur:send-advertisements>true</v6ur:send-advertisements>
<v6ur:prefix-list> <v6ur:prefix-list>
<v6ur:prefix> <v6ur:prefix>
skipping to change at page 75, line 24 skipping to change at page 86, line 24
</v6ur:prefix-list> </v6ur:prefix-list>
</v6ur:ipv6-router-advertisements> </v6ur:ipv6-router-advertisements>
</rt:interface> </rt:interface>
</rt:interfaces> </rt:interfaces>
<rt:routing-protocols> <rt:routing-protocols>
<rt:routing-protocol> <rt:routing-protocol>
<rt:name>st0</rt:name> <rt:name>st0</rt:name>
<rt:type>rt:static</rt:type> <rt:type>rt:static</rt:type>
</rt:routing-protocol> </rt:routing-protocol>
</rt:routing-protocols> </rt:routing-protocols>
</rt:router> </rt:routing-instance>
<rt:routing-tables> <rt:ribs>
<rt:routing-table> <rt:rib>
<rt:name>ipv4-unicast</rt:name> <rt:id>897932384</rt:id>
<rt:address-family>ipv4</rt:address-family> <rt:address-family>v4ur:ipv4-unicast</rt:address-family>
<rt:safi>nlri-unicast</rt:safi>
<rt:routes> <rt:routes>
<rt:route> <rt:route>
<v4ur:dest-prefix>192.0.2.1/24</v4ur:dest-prefix> <rt:id>626433832</rt:id>
<v4ur:destination-prefix>
192.0.2.1/24
</v4ur:destination-prefix>
<rt:outgoing-interface>eth0</rt:outgoing-interface> <rt:outgoing-interface>eth0</rt:outgoing-interface>
<rt:source-protocol>rt:direct</rt:source-protocol> <rt:source-protocol>rt:direct</rt:source-protocol>
<rt:last-updated>2013-07-02T17:11:27+01:00</rt:last-updated> <rt:last-updated>2013-07-02T17:11:27+01:00</rt:last-updated>
</rt:route> </rt:route>
<rt:route> <rt:route>
<v4ur:dest-prefix>198.51.100.0/24</v4ur:dest-prefix> <rt:id>795028841</rt:id>
<v4ur:destination-prefix>
198.51.100.0/24
</v4ur:destination-prefix>
<rt:outgoing-interface>eth1</rt:outgoing-interface> <rt:outgoing-interface>eth1</rt:outgoing-interface>
<rt:source-protocol>rt:direct</rt:source-protocol> <rt:source-protocol>rt:direct</rt:source-protocol>
<rt:last-updated>2013-07-02T17:11:27+01:00</rt:last-updated> <rt:last-updated>2013-07-02T17:11:27+01:00</rt:last-updated>
</rt:route> </rt:route>
<rt:route> <rt:route>
<v4ur:dest-prefix>0.0.0.0/0</v4ur:dest-prefix> <rt:id>971693993</rt:id>
<v4ur:destination-prefix>0.0.0.0/0</v4ur:destination-prefix>
<rt:source-protocol>rt:static</rt:source-protocol> <rt:source-protocol>rt:static</rt:source-protocol>
<v4ur:next-hop>192.0.2.2</v4ur:next-hop> <v4ur:gateway>192.0.2.2</v4ur:gateway>
<rt:last-updated>2013-07-02T18:02:45+01:00</rt:last-updated> <rt:last-updated>2013-07-02T18:02:45+01:00</rt:last-updated>
</rt:route> </rt:route>
</rt:routes> </rt:routes>
</rt:routing-table> </rt:rib>
<rt:routing-table> <rt:rib>
<rt:name>ipv6-unicast</rt:name> <rt:id>751058209</rt:id>
<rt:address-family>ipv6</rt:address-family> <rt:address-family>v6ur:ipv6-unicast</rt:address-family>
<rt:safi>nlri-unicast</rt:safi>
<rt:routes> <rt:routes>
<rt:route> <rt:route>
<v6ur:dest-prefix>2001:db8:0:1::/64</v6ur:dest-prefix> <rt:id>749445923</rt:id>
<v6ur:destination-prefix>
2001:db8:0:1::/64
</v6ur:destination-prefix>
<rt:outgoing-interface>eth0</rt:outgoing-interface> <rt:outgoing-interface>eth0</rt:outgoing-interface>
<rt:source-protocol>rt:direct</rt:source-protocol> <rt:source-protocol>rt:direct</rt:source-protocol>
<rt:last-updated>2013-07-02T17:11:27+01:00</rt:last-updated> <rt:last-updated>2013-07-02T17:11:27+01:00</rt:last-updated>
</rt:route> </rt:route>
<rt:route> <rt:route>
<v6ur:dest-prefix>2001:db8:0:2::/64</v6ur:dest-prefix> <rt:id>78164062</rt:id>
<v6ur:destination-prefix>
2001:db8:0:2::/64
</v6ur:destination-prefix>
<rt:outgoing-interface>eth1</rt:outgoing-interface> <rt:outgoing-interface>eth1</rt:outgoing-interface>
<rt:source-protocol>rt:direct</rt:source-protocol> <rt:source-protocol>rt:direct</rt:source-protocol>
<rt:last-updated>2013-07-02T17:11:27+01:00</rt:last-updated> <rt:last-updated>2013-07-02T17:11:27+01:00</rt:last-updated>
</rt:route> </rt:route>
<rt:route> <rt:route>
<v6ur:dest-prefix>::/0</v6ur:dest-prefix> <rt:id>862089986</rt:id>
<v6ur:next-hop>2001:db8:0:1::2</v6ur:next-hop> <v6ur:destination-prefix>::/0</v6ur:destination-prefix>
<v6ur:gateway>2001:db8:0:1::2</v6ur:gateway>
<rt:source-protocol>rt:static</rt:source-protocol> <rt:source-protocol>rt:static</rt:source-protocol>
<rt:last-updated>2013-07-02T18:02:45+01:00</rt:last-updated> <rt:last-updated>2013-07-02T18:02:45+01:00</rt:last-updated>
</rt:route> </rt:route>
</rt:routes> </rt:routes>
</rt:routing-table> </rt:rib>
</rt:routing-tables> </rt:ribs>
</rt:routing-state> </rt:routing-state>
</data> </data>
</rpc-reply> </rpc-reply>
Appendix D. Change Log Appendix D. Change Log
RFC Editor: remove this section upon publication as an RFC. RFC Editor: remove this section upon publication as an RFC.
D.1. Changes Between Versions -09 and -10 D.1. Changes Between Versions -10 and -11
o Migrated address families from IANA enumerations to identities.
o Terminology and node names aligned with the I2RS RIB model: router
-> routing instance, routing table -> RIB.
o Introduced uint64 keys for state lists: routing-instance, rib,
route, nexthop.
o Described the relationship between system-controlled and user-
controlled list entries.
o Feature "user-defined-routing-tables" changed into "advanced-
router".
o Made nexthop into a choice in order to allow for nexthop-list
(I2RS requirement).
o Added nexthop-list with entries having priorities (backup) and
weights (load balancing).
o Updated bibliography references.
D.2. Changes Between Versions -09 and -10
o Added subtree for operational state data ("/routing-state"). o Added subtree for operational state data ("/routing-state").
o Terms "system-controlled entry" and "user-controlled entry" o Terms "system-controlled entry" and "user-controlled entry"
defined and used. defined and used.
o New feature "user-defined-routing-tables". Nodes that are useful o New feature "user-defined-routing-tables". Nodes that are useful
only with user-defined routing tables are now conditional. only with user-defined routing tables are now conditional.
o Added grouping "router-id". o Added grouping "router-id".
o In routing tables, "source-protocol" attribute of routes now o In routing tables, "source-protocol" attribute of routes now
reports only protocol type, and its datatype is "identityref". reports only protocol type, and its datatype is "identityref".
o Renamed "main-routing-table" to "default-routing-table". o Renamed "main-routing-table" to "default-routing-table".
D.2. Changes Between Versions -08 and -09 D.3. Changes Between Versions -08 and -09
o Fixed "must" expresion for "connected-routing-table". o Fixed "must" expresion for "connected-routing-table".
o Simplified "must" expression for "main-routing-table". o Simplified "must" expression for "main-routing-table".
o Moved per-interface configuration of a new routing protocol under o Moved per-interface configuration of a new routing protocol under
'routing-protocol'. This also affects the 'example-rip' module. 'routing-protocol'. This also affects the 'example-rip' module.
D.3. Changes Between Versions -07 and -08 D.4. Changes Between Versions -07 and -08
o Changed reference from RFC6021 to RFC6021bis. o Changed reference from RFC6021 to RFC6021bis.
D.4. Changes Between Versions -06 and -07 D.5. Changes Between Versions -06 and -07
o The contents of <get-reply> in Appendix C was updated: "eth[01]" o The contents of <get-reply> in Appendix C was updated: "eth[01]"
is used as the value of "location", and "forwarding" is on for is used as the value of "location", and "forwarding" is on for
both interfaces and both IPv4 and IPv6. both interfaces and both IPv4 and IPv6.
o The "must" expression for "main-routing-table" was modified to o The "must" expression for "main-routing-table" was modified to
avoid redundant error messages reporting address family mismatch avoid redundant error messages reporting address family mismatch
when "name" points to a non-existent routing table. when "name" points to a non-existent routing table.
o The default behavior for IPv6 RA prefix advertisements was o The default behavior for IPv6 RA prefix advertisements was
clarified. clarified.
o Changed type of "rt:router-id" to "ip:dotted-quad". o Changed type of "rt:router-id" to "ip:dotted-quad".
o Type of "rt:router-id" changed to "yang:dotted-quad". o Type of "rt:router-id" changed to "yang:dotted-quad".
o Fixed missing prefixes in XPath expressions. o Fixed missing prefixes in XPath expressions.
D.5. Changes Between Versions -05 and -06 D.6. Changes Between Versions -05 and -06
o Document title changed: "Configuration" was replaced by o Document title changed: "Configuration" was replaced by
"Management". "Management".
o New typedefs "routing-table-ref" and "route-filter-ref". o New typedefs "routing-table-ref" and "route-filter-ref".
o Double slashes "//" were removed from XPath expressions and o Double slashes "//" were removed from XPath expressions and
replaced with the single "/". replaced with the single "/".
o Removed uniqueness requirement for "router-id". o Removed uniqueness requirement for "router-id".
skipping to change at page 78, line 33 skipping to change at page 90, line 11
o Complete data tree is now in Appendix A. o Complete data tree is now in Appendix A.
o Changed type of "source-protocol" from "leafref" to "string". o Changed type of "source-protocol" from "leafref" to "string".
o Clarified the relationship between routing protocol instances and o Clarified the relationship between routing protocol instances and
connected routing tables. connected routing tables.
o Added a must constraint saying that a routing table connected to o Added a must constraint saying that a routing table connected to
the direct pseudo-protocol must not be a main routing table. the direct pseudo-protocol must not be a main routing table.
D.6. Changes Between Versions -04 and -05 D.7. Changes Between Versions -04 and -05
o Routing tables are now global, i.e., "routing-tables" is a child o Routing tables are now global, i.e., "routing-tables" is a child
of "routing" rather than "router". of "routing" rather than "router".
o "must" statement for "static-routes" changed to "when". o "must" statement for "static-routes" changed to "when".
o Added "main-routing-tables" containing references to main routing o Added "main-routing-tables" containing references to main routing
tables for each address family. tables for each address family.
o Removed the defaults for "address-family" and "safi" and made them o Removed the defaults for "address-family" and "safi" and made them
skipping to change at page 79, line 21 skipping to change at page 90, line 46
o The "direct" pseudo-protocol is always connected to main routing o The "direct" pseudo-protocol is always connected to main routing
tables. tables.
o Entries in the list of connected routing tables renamed from o Entries in the list of connected routing tables renamed from
"routing-table" to "connected-routing-table". "routing-table" to "connected-routing-table".
o Added "must" constraint saying that a routing table must not be o Added "must" constraint saying that a routing table must not be
its own recipient. its own recipient.
D.7. Changes Between Versions -03 and -04 D.8. Changes Between Versions -03 and -04
o Changed "error-tag" for both RPC methods from "missing element" to o Changed "error-tag" for both RPC methods from "missing element" to
"data-missing". "data-missing".
o Removed the decrementing behavior for advertised IPv6 prefix o Removed the decrementing behavior for advertised IPv6 prefix
parameters "valid-lifetime" and "preferred-lifetime". parameters "valid-lifetime" and "preferred-lifetime".
o Changed the key of the static route lists from "seqno" to "id" o Changed the key of the static route lists from "seqno" to "id"
because the routes needn't be sorted. because the routes needn't be sorted.
o Added 'must' constraint saying that "preferred-lifetime" must not o Added 'must' constraint saying that "preferred-lifetime" must not
be greater than "valid-lifetime". be greater than "valid-lifetime".
D.8. Changes Between Versions -02 and -03 D.9. Changes Between Versions -02 and -03
o Module "iana-afn-safi" moved to I-D "iana-if-type". o Module "iana-afn-safi" moved to I-D "iana-if-type".
o Removed forwarding table. o Removed forwarding table.
o RPC "get-route" changed to "active-route". Its output is a list o RPC "get-route" changed to "active-route". Its output is a list
of routes (for multi-path routing). of routes (for multi-path routing).
o New RPC "route-count". o New RPC "route-count".
o For both RPCs, specification of negative responses was added. o For both RPCs, specification of negative responses was added.
o Relaxed separation of router instances. o Relaxed separation of router instances.
o Assignment of interfaces to router instances needn't be disjoint. o Assignment of interfaces to router instances needn't be disjoint.
o Route filters are now global. o Route filters are now global.
o Added "allow-all-route-filter" for symmetry. o Added "allow-all-route-filter" for symmetry.
o Added Section 5 about interactions with "ietf-interfaces" and o Added Section 6 about interactions with "ietf-interfaces" and
"ietf-ip". "ietf-ip".
o Added "router-id" leaf. o Added "router-id" leaf.
o Specified the names for IPv4/IPv6 unicast main routing tables. o Specified the names for IPv4/IPv6 unicast main routing tables.
o Route parameter "last-modified" changed to "age". o Route parameter "last-modified" changed to "age".
o Added container "recipient-routing-tables". o Added container "recipient-routing-tables".
D.9. Changes Between Versions -01 and -02 D.10. Changes Between Versions -01 and -02
o Added module "ietf-ipv6-unicast-routing". o Added module "ietf-ipv6-unicast-routing".
o The example in Appendix C now uses IP addresses from blocks o The example in Appendix C now uses IP addresses from blocks
reserved for documentation. reserved for documentation.
o Direct routes appear by default in the forwarding table. o Direct routes appear by default in the forwarding table.
o Network layer interfaces must be assigned to a router instance. o Network layer interfaces must be assigned to a router instance.
Additional interface configuration may be present. Additional interface configuration may be present.
skipping to change at page 80, line 44 skipping to change at page 92, line 20
o Additional "must" statements were added. o Additional "must" statements were added.
o The "route-content" grouping for IPv4 and IPv6 unicast now o The "route-content" grouping for IPv4 and IPv6 unicast now
includes the material from the "ietf-routing" version via "uses includes the material from the "ietf-routing" version via "uses
rt:route-content". rt:route-content".
o Explanation of symbols in the tree representation of data model o Explanation of symbols in the tree representation of data model
hierarchy. hierarchy.
D.10. Changes Between Versions -00 and -01 D.11. Changes Between Versions -00 and -01
o AFN/SAFI-independent stuff was moved to the "ietf-routing" module. o AFN/SAFI-independent stuff was moved to the "ietf-routing" module.
o Typedefs for AFN and SAFI were placed in a separate "iana-afn- o Typedefs for AFN and SAFI were placed in a separate "iana-afn-
safi" module. safi" module.
o Names of some data nodes were changed, in particular "routing- o Names of some data nodes were changed, in particular "routing-
process" is now "router". process" is now "router".
o The restriction of a single AFN/SAFI per router was lifted. o The restriction of a single AFN/SAFI per router was lifted.
 End of changes. 335 change blocks. 
944 lines changed or deleted 1468 lines changed or added

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