diff options
author | Thomas Voss <mail@thomasvoss.com> | 2024-11-27 20:54:24 +0100 |
---|---|---|
committer | Thomas Voss <mail@thomasvoss.com> | 2024-11-27 20:54:24 +0100 |
commit | 4bfd864f10b68b71482b35c818559068ef8d5797 (patch) | |
tree | e3989f47a7994642eb325063d46e8f08ffa681dc /doc/rfc/rfc9403.txt | |
parent | ea76e11061bda059ae9f9ad130a9895cc85607db (diff) |
doc: Add RFC documents
Diffstat (limited to 'doc/rfc/rfc9403.txt')
-rw-r--r-- | doc/rfc/rfc9403.txt | 1210 |
1 files changed, 1210 insertions, 0 deletions
diff --git a/doc/rfc/rfc9403.txt b/doc/rfc/rfc9403.txt new file mode 100644 index 0000000..e6455d7 --- /dev/null +++ b/doc/rfc/rfc9403.txt @@ -0,0 +1,1210 @@ + + + + +Internet Engineering Task Force (IETF) A. Lindem +Request for Comments: 9403 LabN Consulting, L.L.C. +Category: Standards Track Y. Qu +ISSN: 2070-1721 Futurewei Technologies + November 2023 + + + A YANG Data Model for RIB Extensions + +Abstract + + A Routing Information Base (RIB) is a list of routes and their + corresponding administrative data and operational state. + + RFC 8349 defines the basic building blocks for the RIB data model, + and this model augments it to support multiple next hops (aka paths) + for each route as well as additional attributes. + +Status of This Memo + + This is an Internet Standards Track document. + + This document is a product of the Internet Engineering Task Force + (IETF). It represents the consensus of the IETF community. It has + received public review and has been approved for publication by the + Internet Engineering Steering Group (IESG). Further information on + Internet Standards is available in Section 2 of RFC 7841. + + Information about the current status of this document, any errata, + and how to provide feedback on it may be obtained at + https://www.rfc-editor.org/info/rfc9403. + +Copyright Notice + + Copyright (c) 2023 IETF Trust and the persons identified as the + document authors. All rights reserved. + + This document is subject to BCP 78 and the IETF Trust's Legal + Provisions Relating to IETF Documents + (https://trustee.ietf.org/license-info) in effect on the date of + publication of this document. Please review these documents + carefully, as they describe your rights and restrictions with respect + to this document. Code Components extracted from this document must + include Revised BSD License text as described in Section 4.e of the + Trust Legal Provisions and are provided without warranty as described + in the Revised BSD License. + +Table of Contents + + 1. Introduction + 2. Terminology and Notation + 2.1. Tree Diagrams + 2.2. Prefixes in Data Node Names + 3. Design of the Model + 3.1. Tags and Preferences + 3.2. Repair Path + 4. RIB Model Tree + 5. RIB Extension YANG Module + 6. Security Considerations + 7. IANA Considerations + 8. References + 8.1. Normative References + 8.2. Informative References + Appendix A. Combined Tree Diagram + Appendix B. ietf-rib-extension.yang example + Acknowledgments + Authors' Addresses + +1. Introduction + + This document defines a YANG data model [RFC7950] that extends the + RIB data model defined in the ietf-routing YANG module [RFC8349] with + more route attributes. + + A RIB is a collection of routes with attributes controlled and + manipulated by control plane protocols. Each RIB contains only + routes of one address family [RFC8349]. Within a protocol, routes + are selected based on the metrics in use by that protocol, and the + protocol installs the routes to the RIB. The RIB selects the + preferred or active route by comparing the route preference (aka + administrative distance) of the candidate routes installed by + different protocols. + + The module defined in this document extends the RIB to support more + route attributes, such as multiple next hops, route metrics, and + administrative tags. + + The YANG modules defined and discussed in this document conform to + the Network Management Datastore Architecture (NMDA) [RFC8342]. + +2. Terminology and Notation + + The following terms are defined in [RFC8342]: + + * configuration + + * system state + + * operational state + + The following terms are defined in [RFC7950]: + + * action + + * augment + + * container + + * container with presence + + * data model + + * data node + + * leaf + + * list + + * mandatory node + + * module + + * schema tree + + The following term is defined in [RFC8349], Section 5.2: + + * RIB + +2.1. Tree Diagrams + + Tree diagrams used in this document follow the notation defined in + [RFC8340]. + +2.2. Prefixes in Data Node Names + + In this document, names of data nodes, actions, and other data model + objects are often used without a prefix, as long as it is clear from + the context in which YANG module each name is defined. Otherwise, + names are prefixed using the standard prefix associated with the + corresponding YANG module, as shown in Table 1. + + +========+===========================+===========+ + | Prefix | YANG Module | Reference | + +========+===========================+===========+ + | if | ietf-interfaces | [RFC8343] | + +--------+---------------------------+-----------+ + | rt | ietf-routing | [RFC8349] | + +--------+---------------------------+-----------+ + | v4ur | ietf-ipv4-unicast-routing | [RFC8349] | + +--------+---------------------------+-----------+ + | v6ur | ietf-ipv6-unicast-routing | [RFC8349] | + +--------+---------------------------+-----------+ + | inet | ietf-inet-types | [RFC6991] | + +--------+---------------------------+-----------+ + | ospf | ietf-ospf | [RFC9129] | + +--------+---------------------------+-----------+ + | isis | ietf-isis | [RFC9130] | + +--------+---------------------------+-----------+ + + Table 1: Prefixes and Corresponding YANG Modules + +3. Design of the Model + + The YANG module defined in this document augments the ietf-routing, + ietf-ipv4-unicast-routing, and ietf-ipv6-unicast-routing YANG modules + defined in [RFC8349], which provide a basis for routing system data + model development. Together with the ietf-routing YANG module and + other YANG modules defined in [RFC8349], a generic RIB YANG data + model is defined herein to implement and monitor a RIB. + + The modules in [RFC8349] also define the basic configuration and + operational state for both IPv4 and IPv6 static routes. This + document provides augmentations for static routes to support multiple + next hops and more next-hop attributes. + +3.1. Tags and Preferences + + Individual route tags are supported at both the route and next-hop + level. A preference per next hop is also supported for selection of + the most preferred reachable static route. + + The following tree snapshot shows tag and preference entries that + augment static IPv4 unicast route and IPv6 unicast route next hops. + + augment /rt:routing/rt:control-plane-protocols + /rt:control-plane-protocol/rt:static-routes/v4ur:ipv4 + /v4ur:route/v4ur:next-hop/v4ur:next-hop-options + /v4ur:simple-next-hop: + +--rw preference? uint32 + +--rw tag? uint32 + augment /rt:routing/rt:control-plane-protocols + /rt:control-plane-protocol/rt:static-routes/v4ur:ipv4 + /v4ur:route/v4ur:next-hop/v4ur:next-hop-options + /v4ur:next-hop-list/v4ur:next-hop-list/v4ur:next-hop: + +--rw preference? uint32 + +--rw tag? uint32 + augment /rt:routing/rt:control-plane-protocols + /rt:control-plane-protocol/rt:static-routes/v6ur:ipv6 + /v6ur:route/v6ur:next-hop/v6ur:next-hop-options + /v6ur:simple-next-hop: + +--rw preference? uint32 + +--rw tag? uint32 + augment /rt:routing/rt:control-plane-protocols + /rt:control-plane-protocol/rt:static-routes/v6ur:ipv6 + /v6ur:route/v6ur:next-hop/v6ur:next-hop-options + /v6ur:next-hop-list/v6ur:next-hop-list/v6ur:next-hop: + +--rw preference? uint32 + +--rw tag? uint32 + augment /rt:routing/rt:ribs/rt:rib/rt:routes/rt:route: + +--ro metric? uint32 + +--ro tag* uint32 + +--ro application-tag? uint32 + +3.2. Repair Path + + The IP Fast Reroute (IPFRR) calculation by routing protocol + precomputes repair paths [RFC5714], and the repair paths are + installed in the RIB. + + Each route next hop in the RIB is augmented with a repair path and is + shown in the following tree snapshot. + + augment /rt:routing/rt:ribs/rt:rib/rt:routes/rt:route + /rt:next-hop/rt:next-hop-options/rt:simple-next-hop: + +--ro repair-path + +--ro outgoing-interface? if:interface-state-ref + +--ro next-hop-address? inet:ip-address-no-zone + +--ro metric? uint32 + augment /rt:routing/rt:ribs/rt:rib/rt:routes/rt:route + /rt:next-hop/rt:next-hop-options/rt:next-hop-list + /rt:next-hop-list/rt:next-hop: + +--ro repair-path + +--ro outgoing-interface? if:interface-state-ref + +--ro next-hop-address? inet:ip-address-no-zone + +--ro metric? uint32 + +4. RIB Model Tree + + The ietf-routing.yang tree with the augmentations herein is included + in Appendix A. The meanings of the symbols can be found in + [RFC8340]. + +5. RIB Extension YANG Module + + This YANG module references [RFC6991], [RFC8343], [RFC8349], + [RFC9129], [RFC9130], and [RFC5714]. + + <CODE BEGINS> file "ietf-rib-extension@2023-11-20.yang" + module ietf-rib-extension { + yang-version 1.1; + namespace "urn:ietf:params:xml:ns:yang:ietf-rib-extension"; + prefix rib-ext; + + import ietf-inet-types { + prefix inet; + reference + "RFC 6991: Common YANG Data Types"; + } + import ietf-interfaces { + prefix if; + reference + "RFC 8343: A YANG Data Model for Interface + Management"; + } + import ietf-routing { + prefix rt; + reference + "RFC 8349: A YANG Data Model for Routing + Management (NMDA Version)"; + } + import ietf-ipv4-unicast-routing { + prefix v4ur; + reference + "RFC 8349: A YANG Data Model for Routing + Management (NMDA Version)"; + } + import ietf-ipv6-unicast-routing { + prefix v6ur; + reference + "RFC 8349: A YANG Data Model for Routing + Management (NMDA Version)"; + } + + import ietf-ospf { + prefix ospf; + reference "RFC 9129: YANG Data Model for the OSPF Protocol"; + } + + import ietf-isis { + prefix isis; + reference "RFC 9130: YANG Data Model for the IS-IS Protocol"; + } + + organization + "IETF RTGWG (Routing Area Working Group)"; + contact + "WG Web: <https://datatracker.ietf.org/wg/rtgwg/> + WG List: <mailto:rtgwg@ietf.org> + + Author: Acee Lindem + <mailto:acee.ietf@gmail.com> + Author: Yingzhen Qu + <mailto:yingzhen.qu@futurewei.com>"; + description + "This YANG module extends the RIB defined in the ietf-routing + YANG module with additional route attributes. + + This YANG module conforms to the Network Management + Datastore Architecture (NMDA) as described in RFC 8342. + + Copyright (c) 2023 IETF Trust and the persons identified as + authors of the code. All rights reserved. + + Redistribution and use in source and binary forms, with or + without modification, is permitted pursuant to, and subject to + the license terms contained in, the Revised BSD License set + forth in Section 4.c of the IETF Trust's Legal Provisions + Relating to IETF Documents + (https://trustee.ietf.org/license-info). + + This version of this YANG module is part of RFC 9403; see the + RFC itself for full legal notices."; + + revision 2023-11-20 { + description + "Initial version."; + reference + "RFC 9403: A YANG Data Model for RIB Extensions"; + } + + /* Groupings */ + + grouping rib-statistics { + description + "Statistics grouping used for RIB augmentation."; + container statistics { + config false; + description + "Container for RIB statistics."; + leaf total-routes { + type uint32; + description + "Total number of routes in the RIB."; + } + leaf total-active-routes { + type uint32; + description + "Total number of active routes in the RIB. An active + route is the route that is preferred over other routes + to the same destination prefix."; + } + leaf total-route-memory { + type uint64; + units "bytes"; + description + "Total memory for all routes in the RIB."; + } + list protocol-statistics { + description + "RIB statistics for routing protocols installing + routes in the RIB."; + leaf protocol { + type identityref { + base rt:routing-protocol; + } + description + "Routing protocol installing routes in the RIB."; + } + leaf routes { + type uint32; + description + "Total number of routes in the RIB for the routing + protocol identified by the 'protocol' entry."; + } + leaf active-routes { + type uint32; + description + "Total number of active routes in the RIB for the + routing protocol identified by the 'protocol' entry. + An active route is preferred over other routes to the + same destination prefix."; + } + leaf route-memory { + type uint64; + units "bytes"; + description + "Total memory for all routes in the RIB for the + routing protocol identified by the 'protocol' + entry."; + } + } + } + } + + grouping repair-path { + description + "Grouping for the IP Fast Reroute (IPFRR) repair path."; + container repair-path { + description + "IPFRR next-hop repair path."; + leaf outgoing-interface { + type if:interface-state-ref; + description + "Name of the outgoing interface."; + } + leaf next-hop-address { + type inet:ip-address-no-zone; + description + "IP address of the next hop."; + } + leaf metric { + type uint32; + description + "The metric for the repair path. While the reroute + repair is local and the metric is not advertised + externally, the metric for the repair path is useful + for troubleshooting purposes."; + } + reference + "RFC 5714: IP Fast Reroute Framework"; + } + } + + augment "/rt:routing/rt:control-plane-protocols/" + + "rt:control-plane-protocol/rt:static-routes/v4ur:ipv4/" + + "v4ur:route/v4ur:next-hop/v4ur:next-hop-options/" + + "v4ur:simple-next-hop" { + description + "Augment 'simple-next-hop' case in IPv4 unicast route."; + leaf preference { + type uint32; + default "1"; + description + "The preference is used to select among multiple static + routes. Routes with a lower next-hop preference value + are preferred, and equal-preference routes result in + Equal-Cost Multipath (ECMP) static routes."; + } + leaf tag { + type uint32; + default "0"; + description + "The tag is a 32-bit opaque value associated with the + route that can be used for policy decisions such as + advertisement and filtering of the route."; + } + } + + augment "/rt:routing/rt:control-plane-protocols/" + + "rt:control-plane-protocol/rt:static-routes/v4ur:ipv4/" + + "v4ur:route/v4ur:next-hop/v4ur:next-hop-options/" + + "v4ur:next-hop-list/v4ur:next-hop-list/v4ur:next-hop" { + description + "Augment static route configuration 'next-hop-list'."; + leaf preference { + type uint32; + default "1"; + description + "The preference is used to select among multiple static + routes. Routes with a lower next-hop preference value + are preferred, and equal-preference routes result in + ECMP static routes."; + } + leaf tag { + type uint32; + default "0"; + description + "The tag is a 32-bit opaque value associated with the + route that can be used for policy decisions such as + advertisement and filtering of the route."; + } + } + + augment "/rt:routing/rt:control-plane-protocols/" + + "rt:control-plane-protocol/rt:static-routes/v6ur:ipv6/" + + "v6ur:route/v6ur:next-hop/v6ur:next-hop-options/" + + "v6ur:simple-next-hop" { + description + "Augment 'simple-next-hop' case in IPv6 unicast route."; + leaf preference { + type uint32; + default "1"; + description + "The preference is used to select among multiple static + routes. Routes with a lower next-hop preference value + are preferred, and equal-preference routes result in + ECMP static routes."; + } + leaf tag { + type uint32; + default "0"; + description + "The tag is a 32-bit opaque value associated with the + route that can be used for policy decisions such as + advertisement and filtering of the route."; + } + } + + augment "/rt:routing/rt:control-plane-protocols/" + + "rt:control-plane-protocol/rt:static-routes/v6ur:ipv6/" + + "v6ur:route/v6ur:next-hop/v6ur:next-hop-options/" + + "v6ur:next-hop-list/v6ur:next-hop-list/v6ur:next-hop" { + description + "Augment static route configuration 'next-hop-list'."; + leaf preference { + type uint32; + default "1"; + description + "The preference is used to select among multiple static + routes. Routes with a lower next-hop preference value + are preferred, and equal-preference routes result in + ECMP static routes."; + } + leaf tag { + type uint32; + default "0"; + description + "The tag is a 32-bit opaque value associated with the + route that can be used for policy decisions such as + advertisement and filtering of the route."; + } + } + + augment "/rt:routing/rt:ribs/rt:rib" { + description + "Augment a RIB with statistics."; + uses rib-statistics; + } + + augment "/rt:routing/rt:ribs/rt:rib/" + + "rt:routes/rt:route" { + description + "Augment a route in the RIB with common attributes."; + leaf metric { + when "not(derived-from(" + + "../rt:source-protocol, 'ospf:ospf')) " + + "and not(derived-from( " + + "../rt:source-protocol, 'isis:isis'))" { + description + "This augmentation is only valid for routes that don't + have OSPF or IS-IS as the source protocol. The YANG + data models for OSPF and IS-IS already include a + 'metric' augmentation for routes."; + } + type uint32; + description + "The metric is a numeric value indicating the cost + of the route from the perspective of the routing + protocol installing the route. In general, routes with + a lower metric installed by the same routing protocol + are lower cost to reach and are preferable to routes + with a higher metric. However, metrics from different + routing protocols are not comparable."; + } + leaf-list tag { + when "not(derived-from(" + + "../rt:source-protocol, 'ospf:ospf')) " + + "and not(derived-from( " + + "../rt:source-protocol, 'isis:isis'))" { + description + "This augmentation is only valid for routes that don't + have OSPF or IS-IS as the source protocol. The YANG + data models for OSPF and IS-IS already include a 'tag' + augmentation for routes."; + } + type uint32; + description + "A tag is a 32-bit opaque value associated with the + route that can be used for policy decisions such as + advertisement and filtering of the route."; + } + leaf application-tag { + type uint32; + description + "The application-specific tag is an additional tag that + can be used by applications that require semantics and/or + policy different from that of the tag. For example, + the tag is usually automatically advertised in OSPF + AS-External Link State Advertisements (LSAs) while this + application-specific tag is not advertised implicitly."; + } + } + + augment "/rt:routing/rt:ribs/rt:rib/" + + "rt:routes/rt:route/rt:next-hop/rt:next-hop-options/" + + "rt:simple-next-hop" { + description + "Augment 'simple-next-hop' with 'repair-path'."; + uses repair-path; + } + + augment "/rt:routing/rt:ribs/rt:rib/" + + "rt:routes/rt:route/rt:next-hop/rt:next-hop-options/" + + "rt:next-hop-list/rt:next-hop-list/rt:next-hop" { + description + "Augment the next hop with a repair path."; + uses repair-path; + } + } + <CODE ENDS> + +6. Security Considerations + + The YANG module specified in this document defines a schema for data + that is designed to be accessed via network management protocols such + as NETCONF [RFC6241] or RESTCONF [RFC8040]. The lowest NETCONF layer + is the secure transport layer, and the mandatory-to-implement secure + transport is Secure Shell (SSH) [RFC6242]. The lowest RESTCONF layer + is HTTPS, and the mandatory-to-implement secure transport is TLS + [RFC8446]. + + The Network Configuration Access Control Model (NACM) [RFC8341] + provides the means to restrict access for particular NETCONF or + RESTCONF users to a preconfigured subset of all available NETCONF or + RESTCONF protocol operations and content. + + There are a number of data nodes defined in the ietf-rib- + extension.yang module that are writable/creatable/deletable (i.e., + config true, which is the default). These data nodes may be + considered sensitive or vulnerable in some network environments. + Write operations (e.g., edit-config) to these data nodes without + proper protection can have a negative effect on network operations. + These are the subtrees and data nodes and their sensitivity/ + vulnerability: + + * /v4ur:next-hop-options/v4ur:simple-next-hop/rib-ext:preference + + * /v4ur:next-hop-options/v4ur:simple-next-hop/rib-ext:tag + + * /v4ur:next-hop-options/v4ur:next-hop-list/v4ur:next-hop-list + /v4ur:next-hop/rib-ext:preference + + * /v4ur:next-hop-options/v4ur:next-hop-list/v4ur:next-hop-list + /v4ur:next-hop/rib-ext:tag + + * /v6ur:next-hop-options/v6ur:simple-next-hop/rib-ext:preference + + * /v6ur:next-hop-options/v6ur:simple-next-hop/rib-ext:tag + + * /v6ur:next-hop-options/v6ur:next-hop-list/v6ur:next-hop-list + /v6ur:next-hop/rib-ext:preference + + * /v6ur:next-hop-options/v6ur:next-hop-list/v6ur:next-hop-list + /v6ur:next-hop/rib-ext:tag + + For these augmentations to ietf-routing.yang, the ability to + delete, add, and modify IPv4 and IPv6 static route preferences and + tags would allow traffic to be misrouted. + + Some of the readable data nodes in the ietf-rib-extension.yang module + may be considered sensitive or vulnerable in some network + environments. It is thus important to control read access (e.g., via + get, get-config, or notification) to these data nodes. These are the + subtrees and data nodes and their sensitivity/vulnerability: + + * /rt:routing/rt:ribs/rt:rib/rib-ext:statistics + + * /rt:routing/rt:ribs/rt:rib/rt:routes/rt:route/rib-ext:metric + + * /rt:routing/rt:ribs/rt:rib/rt:routes/rt:route/rib-ext:tag + + * /rt:routing/rt:ribs/rt:rib/rt:routes/rt:route/rib-ext:application- + tag + + * /rt:route/rt:next-hop/rt:next-hop-options/rt:simple-next-hop/rib- + ext:repair-path + + * /rt:routes/rt:route/rt:next-hop/rt:next-hop-options/rt:next-hop- + list/rt:next-hop-list/rt:next-hop/rib-ext:repair-path + + Exposing the RIB will expose the routing topology of the network. + This may be undesirable due to the fact that such exposure may + facilitate other attacks. Additionally, network operators may + consider their topologies to be sensitive confidential data. + + All the security considerations for writable and readable data nodes + defined in [RFC8349] apply to the augmentations described herein. + +7. IANA Considerations + + This document registers the following URI in the "IETF XML Registry" + [RFC3688]. + + URI: urn:ietf:params:xml:ns:yang:ietf-rib-extension + Registrant Contact: The IESG. + XML: N/A; the requested URI is an XML namespace. + + IANA has registered the following YANG module in the "YANG Module + Names" registry [RFC6020]. + + Name: ietf-rib-extension + Namespace: urn:ietf:params:xml:ns:yang:ietf-rib-extension + Prefix: rib-ext + Reference: RFC 9403 + +8. References + +8.1. Normative References + + [RFC3688] Mealling, M., "The IETF XML Registry", BCP 81, RFC 3688, + DOI 10.17487/RFC3688, January 2004, + <https://www.rfc-editor.org/info/rfc3688>. + + [RFC6020] Bjorklund, M., Ed., "YANG - A Data Modeling Language for + the Network Configuration Protocol (NETCONF)", RFC 6020, + DOI 10.17487/RFC6020, October 2010, + <https://www.rfc-editor.org/info/rfc6020>. + + [RFC6241] Enns, R., Ed., Bjorklund, M., Ed., Schoenwaelder, J., Ed., + and A. Bierman, Ed., "Network Configuration Protocol + (NETCONF)", RFC 6241, DOI 10.17487/RFC6241, June 2011, + <https://www.rfc-editor.org/info/rfc6241>. + + [RFC6242] Wasserman, M., "Using the NETCONF Protocol over Secure + Shell (SSH)", RFC 6242, DOI 10.17487/RFC6242, June 2011, + <https://www.rfc-editor.org/info/rfc6242>. + + [RFC6991] Schoenwaelder, J., Ed., "Common YANG Data Types", + RFC 6991, DOI 10.17487/RFC6991, July 2013, + <https://www.rfc-editor.org/info/rfc6991>. + + [RFC7950] Bjorklund, M., Ed., "The YANG 1.1 Data Modeling Language", + RFC 7950, DOI 10.17487/RFC7950, August 2016, + <https://www.rfc-editor.org/info/rfc7950>. + + [RFC8040] Bierman, A., Bjorklund, M., and K. Watsen, "RESTCONF + Protocol", RFC 8040, DOI 10.17487/RFC8040, January 2017, + <https://www.rfc-editor.org/info/rfc8040>. + + [RFC8341] Bierman, A. and M. Bjorklund, "Network Configuration + Access Control Model", STD 91, RFC 8341, + DOI 10.17487/RFC8341, March 2018, + <https://www.rfc-editor.org/info/rfc8341>. + + [RFC8342] Bjorklund, M., Schoenwaelder, J., Shafer, P., Watsen, K., + and R. Wilton, "Network Management Datastore Architecture + (NMDA)", RFC 8342, DOI 10.17487/RFC8342, March 2018, + <https://www.rfc-editor.org/info/rfc8342>. + + [RFC8343] Bjorklund, M., "A YANG Data Model for Interface + Management", RFC 8343, DOI 10.17487/RFC8343, March 2018, + <https://www.rfc-editor.org/info/rfc8343>. + + [RFC8349] Lhotka, L., Lindem, A., and Y. Qu, "A YANG Data Model for + Routing Management (NMDA Version)", RFC 8349, + DOI 10.17487/RFC8349, March 2018, + <https://www.rfc-editor.org/info/rfc8349>. + + [RFC8446] Rescorla, E., "The Transport Layer Security (TLS) Protocol + Version 1.3", RFC 8446, DOI 10.17487/RFC8446, August 2018, + <https://www.rfc-editor.org/info/rfc8446>. + + [RFC9129] Yeung, D., Qu, Y., Zhang, Z., Chen, I., and A. Lindem, + "YANG Data Model for the OSPF Protocol", RFC 9129, + DOI 10.17487/RFC9129, October 2022, + <https://www.rfc-editor.org/info/rfc9129>. + + [RFC9130] Litkowski, S., Ed., Yeung, D., Lindem, A., Zhang, J., and + L. Lhotka, "YANG Data Model for the IS-IS Protocol", + RFC 9130, DOI 10.17487/RFC9130, October 2022, + <https://www.rfc-editor.org/info/rfc9130>. + + [W3C.REC-xml-20081126] + Bray, T., Paoli, J., Sperberg-McQueen, M., Maler, E., and + F. Yergeau, "Extensible Markup Language (XML) 1.0 (Fifth + Edition)", World Wide Web Consortium Recommendation REC- + xml-20081126, November 2008, + <https://www.w3.org/TR/2008/REC-xml-20081126>. + +8.2. Informative References + + [RFC5714] Shand, M. and S. Bryant, "IP Fast Reroute Framework", + RFC 5714, DOI 10.17487/RFC5714, January 2010, + <https://www.rfc-editor.org/info/rfc5714>. + + [RFC7951] Lhotka, L., "JSON Encoding of Data Modeled with YANG", + RFC 7951, DOI 10.17487/RFC7951, August 2016, + <https://www.rfc-editor.org/info/rfc7951>. + + [RFC8340] Bjorklund, M. and L. Berger, Ed., "YANG Tree Diagrams", + BCP 215, RFC 8340, DOI 10.17487/RFC8340, March 2018, + <https://www.rfc-editor.org/info/rfc8340>. + + [RFC8792] Watsen, K., Auerswald, E., Farrel, A., and Q. Wu, + "Handling Long Lines in Content of Internet-Drafts and + RFCs", RFC 8792, DOI 10.17487/RFC8792, June 2020, + <https://www.rfc-editor.org/info/rfc8792>. + +Appendix A. Combined Tree Diagram + + This appendix provides the combined ietf-routing.yang, ietf-ipv4- + unicast-routing.yang, ietf-ipv6-unicast-routing.yang, and ietf-rib- + extension.yang tree diagram. + + module: ietf-routing + +--rw routing + +--rw router-id? yang:dotted-quad {router-id}? + +--ro interfaces + | +--ro interface* if:interface-ref + +--rw control-plane-protocols + | +--rw control-plane-protocol* [type name] + | +--rw type identityref + | +--rw name string + | +--rw description? string + | +--rw static-routes + | +--rw v4ur:ipv4 + | | +--rw v4ur:route* [destination-prefix] + | | +--rw v4ur:destination-prefix inet:ipv4-prefix + | | +--rw v4ur:description? string + | | +--rw v4ur:next-hop + | | +--rw (v4ur:next-hop-options) + | | +--:(v4ur:simple-next-hop) + | | | +--rw v4ur:outgoing-interface? + | | | | if:interface-ref + | | | +--rw v4ur:next-hop-address? + | | | | inet:ipv4-address + | | | +--rw rib-ext:preference? uint32 + | | | +--rw rib-ext:tag? uint32 + | | +--:(v4ur:special-next-hop) + | | | +--rw v4ur:special-next-hop? enumeration + | | +--:(v4ur:next-hop-list) + | | +--rw v4ur:next-hop-list + | | +--rw v4ur:next-hop* [index] + | | +--rw v4ur:index string + | | +--rw v4ur:outgoing-interface? + | | | if:interface-ref + | | +--rw v4ur:next-hop-address? + | | | inet:ipv4-address + | | +--rw rib-ext:preference? uint32 + | | +--rw rib-ext:tag? uint32 + | +--rw v6ur:ipv6 + | +--rw v6ur:route* [destination-prefix] + | +--rw v6ur:destination-prefix inet:ipv6-prefix + | +--rw v6ur:description? string + | +--rw v6ur:next-hop + | +--rw (v6ur:next-hop-options) + | +--:(v6ur:simple-next-hop) + | | +--rw v6ur:outgoing-interface? + | | | if:interface-ref + | | +--rw v6ur:next-hop-address? + | | | inet:ipv6-address + | | +--rw rib-ext:preference? uint32 + | | +--rw rib-ext:tag? uint32 + | +--:(v6ur:special-next-hop) + | | +--rw v6ur:special-next-hop? enumeration + | +--:(v6ur:next-hop-list) + | +--rw v6ur:next-hop-list + | +--rw v6ur:next-hop* [index] + | +--rw v6ur:index string + | +--rw v6ur:outgoing-interface? + | | if:interface-ref + | +--rw v6ur:next-hop-address? + | | inet:ipv6-address + | +--rw rib-ext:preference? uint32 + | +--rw rib-ext:tag? uint32 + +--rw ribs + +--rw rib* [name] + +--rw name string + +--rw address-family identityref + +--ro default-rib? boolean {multiple-ribs}? + +--ro routes + | +--ro route* [] + | +--ro route-preference? route-preference + | +--ro next-hop + | | +--ro (next-hop-options) + | | +--:(simple-next-hop) + | | | +--ro outgoing-interface? + | | | | if:interface-ref + | | | +--ro v4ur:next-hop-address? + | | | | inet:ipv4-address + | | | +--ro v6ur:next-hop-address? + | | | | inet:ipv6-address + | | | +--ro rib-ext:repair-path + | | | +--ro rib-ext:outgoing-interface? + | | | | if:interface-state-ref + | | | +--ro rib-ext:next-hop-address? + | | | | inet:ip-address-no-zone + | | | +--ro rib-ext:metric? uint32 + | | +--:(special-next-hop) + | | | +--ro special-next-hop? enumeration + | | +--:(next-hop-list) + | | +--ro next-hop-list + | | +--ro next-hop* [] + | | +--ro outgoing-interface? + | | | if:interface-ref + | | +--ro v4ur:address? + | | | inet:ipv4-address + | | +--ro v6ur:address? + | | | inet:ipv6-address + | | +--ro rib-ext:repair-path + | | +--ro rib-ext:outgoing-interface? + | | | if:interface-state-ref + | | +--ro rib-ext:next-hop-address? + | | | inet:ip-address-no-zone + | | +--ro rib-ext:metric? uint32 + | +--ro source-protocol identityref + | +--ro active? empty + | +--ro last-updated? yang:date-and-time + | +--ro v4ur:destination-prefix? inet:ipv4-prefix + | +--ro v6ur:destination-prefix? inet:ipv6-prefix + | +--ro rib-ext:metric? uint32 + | +--ro rib-ext:tag* uint32 + | +--ro rib-ext:application-tag? uint32 + +---x active-route + | +---w input + | | +---w v4ur:destination-address? inet:ipv4-address + | | +---w v6ur:destination-address? inet:ipv6-address + | +--ro output + | +--ro route + | +--ro next-hop + | | +--ro (next-hop-options) + | | +--:(simple-next-hop) + | | | +--ro outgoing-interface? + | | | | if:interface-ref + | | | +--ro v4ur:next-hop-address? + | | | | inet:ipv4-address + | | | +--ro v6ur:next-hop-address? + | | | | inet:ipv6-address + | | +--:(special-next-hop) + | | | +--ro special-next-hop? enumeration + | | +--:(next-hop-list) + | | +--ro next-hop-list + | | +--ro next-hop* [] + | | +--ro outgoing-interface? + | | | if:interface-ref + | | +--ro v4ur:next-hop-address? + | | | inet:ipv4-address + | | +--ro v6ur:next-hop-address? + | | | inet:ipv6-address + | +--ro source-protocol identityref + | +--ro active? empty + | +--ro last-updated? yang:date-and-time + | +--ro v4ur:destination-prefix? inet:ipv4-prefix + | +--ro v6ur:destination-prefix? inet:ipv6-prefix + +--rw description? string + +--ro rib-ext:statistics + +--ro rib-ext:total-routes? uint32 + +--ro rib-ext:total-active-routes? uint32 + +--ro rib-ext:total-route-memory? uint64 + +--ro rib-ext:protocol-statistics* [] + +--ro rib-ext:protocol? identityref + +--ro rib-ext:routes? uint32 + +--ro rib-ext:active-routes? uint32 + +--ro rib-ext:route-memory? uint64 + +Appendix B. ietf-rib-extension.yang example + + The following is an XML example [W3C.REC-xml-20081126] using the RIB + extension module and RFC 8349. + + | Note: '\' line wrapping per [RFC8792]. + + <routing xmlns="urn:ietf:params:xml:ns:yang:ietf-routing"> + <control-plane-protocols> + <control-plane-protocol> + <type>static</type> + <name>static-routing-protocol</name> + <static-routes> + <ipv4 xmlns="urn:ietf:params:xml:ns:yang:\ + ietf-ipv4-unicast-routing"> + <route> + <destination-prefix>0.0.0.0/0</destination-prefix> + <next-hop> + <next-hop-address>192.0.2.2</next-hop-address> + <preference xmlns="urn:ietf:params:xml:ns:yang:\ + ietf-rib-extension">30</preference> + <tag xmlns="urn:ietf:params:xml:ns:yang:\ + ietf-rib-extension">99</tag> + </next-hop> + </route> + </ipv4> + <ipv6 xmlns="urn:ietf:params:xml:ns:yang:\ + ietf-ipv6-unicast-routing"> + <route> + <destination-prefix>::/0</destination-prefix> + <next-hop> + <next-hop-address>2001:db8:aaaa::1111</next-hop-address> + <preference xmlns="urn:ietf:params:xml:ns:yang:\ + ietf-rib-extension">30</preference> + <tag xmlns="urn:ietf:params:xml:ns:yang:\ + ietf-rib-extension">66</tag> + </next-hop> + </route> + </ipv6> + </static-routes> + </control-plane-protocol> + </control-plane-protocols> + <ribs> + <rib> + <name>ipv4-primary</name> + <address-family xmlns:v4ur="urn:ietf:params:xml:ns:yang:\ + ietf-ipv4-unicast-routing">v4ur:ipv4-unicast</address-family> + <default-rib>true</default-rib> + <routes> + <route> + <destination-prefix xmlns="urn:ietf:params:xml:ns:yang:\ + ietf-ipv4-unicast-routing">0.0.0.0/0</destination-prefix> + <next-hop> + <next-hop-address xmlns="urn:ietf:params:xml:ns:yang:\ + ietf-ipv4-unicast-routing">192.0.2.2</next-hop-address> + </next-hop> + <route-preference>5</route-preference> + <source-protocol>static</source-protocol> + <last-updated>2015-10-24T18:02:45+02:00</last-updated> + </route> + <route> + <destination-prefix xmlns="urn:ietf:params:xml:ns:yang:\ + ietf-ipv4-unicast-routing">198.51.100.0/24\ + </destination-prefix> + <next-hop> + <next-hop-address xmlns="urn:ietf:params:xml:ns:yang:\ + ietf-ipv4-unicast-routing">192.0.2.2</next-hop-address> + <repair-path xmlns="urn:ietf:params:xml:ns:yang:\ + ietf-rib-extension"> + <next-hop-address>203.0.113.1</next-hop-address> + <metric>200</metric> + </repair-path> + </next-hop> + <route-preference>120</route-preference> + <source-protocol xmlns:rip="urn:ietf:params:xml:ns:yang:\ + ietf-rip">rip:rip</source-protocol> + <last-updated>2015-10-24T18:02:45+02:00</last-updated> + </route> + </routes> + </rib> + <rib> + <name>ipv6-primary</name> + <address-family xmlns:v6ur="urn:ietf:params:xml:ns:yang:\ + ietf-ipv6-unicast-routing">v6ur:ipv6-unicast</address-family> + <default-rib>true</default-rib> + <routes> + <route> + <destination-prefix xmlns="urn:ietf:params:xml:ns:yang:\ + ietf-ipv6-unicast-routing">0::/0</destination-prefix> + <next-hop> + <next-hop-address xmlns="urn:ietf:params:xml:ns:yang:\ + ietf-ipv6-unicast-routing">2001:db8:aaaa::1111\ + </next-hop-address> + </next-hop> + <route-preference>5</route-preference> + <source-protocol>static</source-protocol> + <last-updated>2015-10-24T18:02:45+02:00</last-updated> + </route> + <route> + <destination-prefix xmlns="urn:ietf:params:xml:ns:yang:\ + ietf-ipv6-unicast-routing">2001:db8:bbbb::/64\ + </destination-prefix> + <next-hop> + <next-hop-address xmlns="urn:ietf:params:xml:ns:yang:\ + ietf-ipv6-unicast-routing">2001:db8:aaaa::1111\ + </next-hop-address> + <repair-path xmlns="urn:ietf:params:xml:ns:yang:\ + ietf-rib-extension"> + <next-hop-address>2001:db8:cccc::2222</next-hop-address> + <metric>200</metric> + </repair-path> + </next-hop> + <route-preference>120</route-preference> + <source-protocol xmlns:rip="urn:ietf:params:xml:ns:yang:\ + ietf-rip">rip:rip</source-protocol> + <last-updated>2015-10-24T18:02:45+02:00</last-updated> + </route> + </routes> + </rib> + </ribs> + </routing> + + The following is the same example using JSON format [RFC7951]. + + { + "ietf-routing:routing": { + "control-plane-protocols": { + "control-plane-protocol": [ + { + "type": "static", + "name": "static-routing-protocol", + "static-routes": { + "ietf-ipv4-unicast-routing:ipv4": { + "route": [ + { + "destination-prefix": "0.0.0.0/0", + "next-hop": { + "next-hop-address": "192.0.2.2", + "ietf-rib-extension:preference": 30, + "ietf-rib-extension:tag": 99 + } + } + ] + }, + "ietf-ipv6-unicast-routing:ipv6": { + "route": [ + { + "destination-prefix": "::/0", + "next-hop": { + "next-hop-address": "2001:db8:aaaa::1111", + "ietf-rib-extension:preference": 30, + "ietf-rib-extension:tag": 66 + } + } + ] + } + } + } + ] + }, + "ribs": { + "rib": [ + { + "name": "ipv4-primary", + "address-family": "ietf-ipv4-unicast-routing:ipv4-unicast", + "default-rib": true, + "routes": { + "route": [ + { + "next-hop": { + "ietf-ipv4-unicast-routing:next-hop-address": \ + "192.0.2.2" + }, + "route-preference": 5, + "source-protocol": "static", + "last-updated": "2015-10-24T18:02:45+02:00", + "ietf-ipv4-unicast-routing:destination-prefix": \ + "0.0.0.0/0" + }, + { + "next-hop": { + "ietf-rib-extension:repair-path": { + "next-hop-address": "203.0.113.1", + "metric": 200 + }, + "ietf-ipv4-unicast-routing:next-hop-address": \ + "192.0.2.2" + }, + "route-preference": 120, + "source-protocol": "ietf-rip:rip", + "last-updated": "2015-10-24T18:02:45+02:00", + "ietf-ipv4-unicast-routing:destination-prefix": \ + "198.51.100.0/24" + } + ] + } + }, + { + "name": "ipv6-primary", + "address-family": "ietf-ipv6-unicast-routing:ipv6-unicast", + "default-rib": true, + "routes": { + "route": [ + { + "next-hop": { + "ietf-ipv6-unicast-routing:next-hop-address": \ + "2001:db8:aaaa::1111" + }, + "route-preference": 5, + "source-protocol": "static", + "last-updated": "2015-10-24T18:02:45+02:00", + "ietf-ipv6-unicast-routing:destination-prefix": "::/0" + }, + { + "next-hop": { + "ietf-rib-extension:repair-path": { + "next-hop-address": "2001:db8:cccc::2222", + "metric": 200 + }, + "ietf-ipv6-unicast-routing:next-hop-address": \ + "2001:db8:aaaa::1111" + }, + "route-preference": 120, + "source-protocol": "ietf-rip:rip", + "last-updated": "2015-10-24T18:02:45+02:00", + "ietf-ipv6-unicast-routing:destination-prefix": \ + "2001:db8:bbbb::/64" + } + ] + } + } + ] + } + } + } + +Acknowledgments + + The authors wish to thank Les Ginsberg, Krishna Deevi, and Suyoung + Yoon for their helpful comments and suggestions. + + The authors wish to thank Tom Petch, Rob Wilton, Chris Hopps, Martin + Björklund, Jeffrey Zhang, Éric Vyncke, Lars Eggert, and Bo Wu for + their reviews and comments. + +Authors' Addresses + + Acee Lindem + LabN Consulting, L.L.C. + 301 Midenhall Way + Cary, NC 27513 + United States of America + Email: acee.ietf@gmail.com + + + Yingzhen Qu + Futurewei Technologies + 2330 Central Expressway + Santa Clara, CA 95050 + United States of America + Email: yingzhen.qu@futurewei.com |