draft-ietf-i2rs-rib-data-model-15.txt   rfc8431.txt 
Network Working Group L. Wang Internet Engineering Task Force (IETF) L. Wang
Internet-Draft Individual Request for Comments: 8431 Individual
Intended status: Standards Track M. Chen Category: Standards Track M. Chen
Expires: November 15, 2018 Huawei ISSN: 2070-1721 Huawei
A. Dass A. Dass
Ericsson Ericsson
H. Ananthakrishnan H. Ananthakrishnan
Packet Design Netflix
S. Kini S. Kini
Individual Individual
N. Bahadur N. Bahadur
Bracket Computing Uber
May 14, 2018 September 2018
A YANG Data Model for Routing Information Base (RIB) A YANG Data Model for the Routing Information Base (RIB)
draft-ietf-i2rs-rib-data-model-15
Abstract Abstract
This document defines a YANG data model for the Routing Information This document defines a YANG data model for the Routing Information
Base (RIB) that aligns with the I2RS RIB information model. Base (RIB) that aligns with the Interface to the Routing System
(I2RS) RIB information model.
Requirements Language
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
"SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and
"OPTIONAL" in this document are to be interpreted as described in BCP
14 [RFC2119] [RFC8174] when, and only when, they appear in all
capitals, as shown here.
Status of This Memo Status of This Memo
This Internet-Draft is submitted in full conformance with the This is an Internet Standards Track document.
provisions of BCP 78 and BCP 79.
Internet-Drafts are working documents of the Internet Engineering
Task Force (IETF). Note that other groups may also distribute
working documents as Internet-Drafts. The list of current Internet-
Drafts is at https://datatracker.ietf.org/drafts/current/.
Internet-Drafts are draft documents valid for a maximum of six months This document is a product of the Internet Engineering Task Force
and may be updated, replaced, or obsoleted by other documents at any (IETF). It represents the consensus of the IETF community. It has
time. It is inappropriate to use Internet-Drafts as reference received public review and has been approved for publication by the
material or to cite them other than as "work in progress." Internet Engineering Steering Group (IESG). Further information on
Internet Standards is available in Section 2 of RFC 7841.
This Internet-Draft will expire on November 15, 2018. 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/rfc8431.
Copyright Notice Copyright Notice
Copyright (c) 2018 IETF Trust and the persons identified as the Copyright (c) 2018 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
(https://trustee.ietf.org/license-info) in effect on the date of (https://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
carefully, as they describe your rights and restrictions with respect carefully, as they describe your rights and restrictions with respect
to this document. Code Components extracted from this document must to this document. Code Components extracted from this document must
include Simplified BSD License text as described in Section 4.e of include Simplified BSD License text as described in Section 4.e of
the Trust Legal Provisions and are provided without warranty as the Trust Legal Provisions and are provided without warranty as
described in the Simplified BSD License. described in the Simplified BSD License.
Table of Contents Table of Contents
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 2 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 3
1.1. Definitions and Acronyms . . . . . . . . . . . . . . . . 3 1.1. Requirements Language . . . . . . . . . . . . . . . . . . 3
1.2. Tree Diagrams . . . . . . . . . . . . . . . . . . . . . . 3 1.2. Definitions and Abbreviations . . . . . . . . . . . . . . 3
1.3. Tree Diagrams . . . . . . . . . . . . . . . . . . . . . . 3
2. Model Structure . . . . . . . . . . . . . . . . . . . . . . . 3 2. Model Structure . . . . . . . . . . . . . . . . . . . . . . . 3
2.1. RIB Capability . . . . . . . . . . . . . . . . . . . . . 7 2.1. RIB Capability . . . . . . . . . . . . . . . . . . . . . 8
2.2. Routing Instance and Rib . . . . . . . . . . . . . . . . 7 2.2. Routing Instance and RIB . . . . . . . . . . . . . . . . 8
2.3. Route . . . . . . . . . . . . . . . . . . . . . . . . . . 8 2.3. Route . . . . . . . . . . . . . . . . . . . . . . . . . . 9
2.4. Nexthop . . . . . . . . . . . . . . . . . . . . . . . . . 9 2.4. Nexthop . . . . . . . . . . . . . . . . . . . . . . . . . 11
2.5. RPC Operations . . . . . . . . . . . . . . . . . . . . . 14 2.5. RPC Operations . . . . . . . . . . . . . . . . . . . . . 15
2.6. Notifications . . . . . . . . . . . . . . . . . . . . . . 18 2.6. Notifications . . . . . . . . . . . . . . . . . . . . . . 20
3. YANG Modules . . . . . . . . . . . . . . . . . . . . . . . . 20 3. YANG Module . . . . . . . . . . . . . . . . . . . . . . . . . 22
4. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 64 4. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 67
5. Security Considerations . . . . . . . . . . . . . . . . . . . 65 5. Security Considerations . . . . . . . . . . . . . . . . . . . 67
6. Contributors . . . . . . . . . . . . . . . . . . . . . . . . 66 6. References . . . . . . . . . . . . . . . . . . . . . . . . . 68
7. Acknowledgements . . . . . . . . . . . . . . . . . . . . . . 66 6.1. Normative References . . . . . . . . . . . . . . . . . . 68
8. References . . . . . . . . . . . . . . . . . . . . . . . . . 66 6.2. Informative References . . . . . . . . . . . . . . . . . 69
8.1. Normative References . . . . . . . . . . . . . . . . . . 66 Acknowledgements . . . . . . . . . . . . . . . . . . . . . . . . 70
8.2. Informative References . . . . . . . . . . . . . . . . . 67 Contributors . . . . . . . . . . . . . . . . . . . . . . . . . . 70
Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 68 Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 71
1. Introduction 1. Introduction
The Interface to the Routing System (I2RS) [RFC7921] provides read The Interface to the Routing System (I2RS) [RFC7921] provides read
and write access to the information and state within the routing and write access to the information and state within the routing
process that exists inside the routing elements, this is achieved via process that exists inside the routing elements; this is achieved via
protocol message exchange between I2RS clients and I2RS agents protocol message exchange between I2RS clients and I2RS agents
associated with the routing system. One of the functions of I2RS is associated with the routing system. One of the functions of I2RS is
to read and write data of the Routing Information Base (RIB). to read and write data of the Routing Information Base (RIB).
[I-D.ietf-i2rs-usecase-reqs-summary] introduces a set of RIB use [I2RS-REQS] introduces a set of RIB use cases. The RIB information
cases. The RIB information model is defined in model is defined in [RFC8430].
[I-D.ietf-i2rs-rib-info-model].
This document defines a YANG [RFC7950][RFC6991] data model for the This document defines a YANG data model [RFC7950] [RFC6991] for the
RIB that satisfies the RIB use cases and aligns with the RIB RIB that satisfies the RIB use cases and aligns with the RIB
information model. information model.
1.1. Definitions and Acronyms 1.1. Requirements Language
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
"SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and
"OPTIONAL" in this document are to be interpreted as described in
BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all
capitals, as shown here.
1.2. Definitions and Abbreviations
RIB: Routing Information Base RIB: Routing Information Base
FIB: Forwarding Information Base FIB: Forwarding Information Base
RPC: Remote Procedure Call RPC: Remote Procedure Call
Information Model (IM): An abstract model of a conceptual domain, IM: Information Model. An abstract model of a conceptual domain,
independent of a specific implementation or data representation. which is independent of a specific implementation or data
representation.
1.2. Tree Diagrams 1.3. Tree Diagrams
Tree diagrams used in this document follow the notation defined in Tree diagrams used in this document follow the notation defined in
[RFC8340]. [RFC8340].
2. Model Structure 2. Model Structure
The following figure shows an overview of structure tree of the ietf- The following figure shows an overview of the structure tree of the
i2rs-rib module. To give a whole view of the structure tree, some ietf-i2rs-rib module. To give a whole view of the structure tree,
details of the tree are omitted. The relevant details are introduced some details of the tree are omitted. The relevant details are
in the subsequent sub-sections. introduced in the subsequent subsections.
module: ietf-i2rs-rib module: ietf-i2rs-rib
+--rw routing-instance +--rw routing-instance
+--rw name string +--rw name string
+--rw interface-list* [name] +--rw interface-list* [name]
| +--rw name if:interface-ref | +--rw name if:interface-ref
+--rw router-id? yang:dotted-quad +--rw router-id? yang:dotted-quad
+--rw lookup-limit? uint8 +--rw lookup-limit? uint8
+--rw rib-list* [name] +--rw rib-list* [name]
+--rw name string +--rw name string
skipping to change at page 4, line 17 skipping to change at page 4, line 38
| | +--:(interface-route) | | +--:(interface-route)
| | ... | | ...
| +--rw nexthop | +--rw nexthop
| | +--rw nexthop-id? uint32 | | +--rw nexthop-id? uint32
| | +--rw sharing-flag? boolean | | +--rw sharing-flag? boolean
| | +--rw (nexthop-type)? | | +--rw (nexthop-type)?
| | +--:(nexthop-base) | | +--:(nexthop-base)
| | | ... | | | ...
| | +--:(nexthop-chain) {nexthop-chain}? | | +--:(nexthop-chain) {nexthop-chain}?
| | | ... | | | ...
| | +--:(nexthop-replicates) {nexthop-replicates}? | | +--:(nexthop-replicate) {nexthop-replicate}?
| | | ... | | | ...
| | +--:(nexthop-protection) {nexthop-protection}? | | +--:(nexthop-protection) {nexthop-protection}?
| | | ... | | | ...
| | +--:(nexthop-load-balance) {nexthop-load-balance}? | | +--:(nexthop-load-balance) {nexthop-load-balance}?
| | ... | | ...
| +--rw route-status | +--rw route-status
| | ... | | ...
| +--rw route-attributes | +--rw route-attributes
| | ... | | ...
| +--rw route-vendor-attributes | +--rw route-vendor-attributes
skipping to change at page 4, line 30 skipping to change at page 5, line 4
| | | ... | | | ...
| | +--:(nexthop-load-balance) {nexthop-load-balance}? | | +--:(nexthop-load-balance) {nexthop-load-balance}?
| | ... | | ...
| +--rw route-status | +--rw route-status
| | ... | | ...
| +--rw route-attributes | +--rw route-attributes
| | ... | | ...
| +--rw route-vendor-attributes | +--rw route-vendor-attributes
+--rw nexthop-list* [nexthop-member-id] +--rw nexthop-list* [nexthop-member-id]
+--rw nexthop-member-id uint32 +--rw nexthop-member-id uint32
rpcs: rpcs:
+---x rib-add +---x rib-add
| +---w input | +---w input
| | +---w name string | | +---w name string
| | +---w address-family address-family-definition | | +---w address-family address-family-definition
| | +---w ip-rpf-check? boolean | | +---w ip-rpf-check? boolean
| +--ro output | +--ro output
| +--ro result uint32 | +--ro result boolean
| +--ro reason? string | +--ro reason? string
+---x rib-delete +---x rib-delete
| +---w input | +---w input
| | +---w name string | | +---w name string
| +--ro output | +--ro output
| +--ro result uint32 | +--ro result boolean
| +--ro reason? string | +--ro reason? string
+---x route-add +---x route-add
| +---w input | +---w input
| | +---w return-failure-detail? boolean | | +---w return-failure-detail? boolean
| | +---w rib-name string | | +---w rib-name string
| | +---w routes | | +---w routes
| | +---w route-list* [route-index] | | +---w route-list* [route-index]
| | ... | | ...
| +--ro output | +--ro output
| +--ro success-count uint32 | +--ro success-count uint32
skipping to change at page 6, line 4 skipping to change at page 6, line 28
| +--ro route-index uint32 | +--ro route-index uint32
| +--ro error-code? uint32 | +--ro error-code? uint32
+---x nh-add +---x nh-add
| +---w input | +---w input
| | +---w rib-name string | | +---w rib-name string
| | +---w nexthop-id? uint32 | | +---w nexthop-id? uint32
| | +---w sharing-flag? boolean | | +---w sharing-flag? boolean
| | +---w (nexthop-type)? | | +---w (nexthop-type)?
| | +--:(nexthop-base) | | +--:(nexthop-base)
| | | ... | | | ...
| | +--:(nexthop-chain) {nexthop-chain}? | | +--:(nexthop-chain) {nexthop-chain}?
| | | ... | | | ...
| | +--:(nexthop-replicates) {nexthop-replicates}? | | +--:(nexthop-replicate) {nexthop-replicate}?
| | | ... | | | ...
| | +--:(nexthop-protection) {nexthop-protection}? | | +--:(nexthop-protection) {nexthop-protection}?
| | | ... | | | ...
| | +--:(nexthop-load-balance) {nexthop-load-balance}? | | +--:(nexthop-load-balance) {nexthop-load-balance}?
| | ... | | ...
| +--ro output | +--ro output
| +--ro result uint32 | +--ro result boolean
| +--ro reason? string | +--ro reason? string
| +--ro nexthop-id? uint32 | +--ro nexthop-id? uint32
+---x nh-delete +---x nh-delete
+---w input +---w input
| +---w rib-name string | +---w rib-name string
| +---w nexthop-id? uint32 | +---w nexthop-id? uint32
| +---w sharing-flag? boolean | +---w sharing-flag? boolean
| +---w (nexthop-type)? | +---w (nexthop-type)?
| +--:(nexthop-base) | +--:(nexthop-base)
| | ... | | ...
| +--:(nexthop-chain) {nexthop-chain}? | +--:(nexthop-chain) {nexthop-chain}?
| | ... | | ...
| +--:(nexthop-replicates) {nexthop-replicates}? | +--:(nexthop-replicate) {nexthop-replicate}?
| | ... | | ...
| +--:(nexthop-protection) {nexthop-protection}? | +--:(nexthop-protection) {nexthop-protection}?
| | ... | | ...
| +--:(nexthop-load-balance) {nexthop-load-balance}? | +--:(nexthop-load-balance) {nexthop-load-balance}?
| ... | ...
+--ro output +--ro output
+--ro result uint32 +--ro result boolean
+--ro reason? string +--ro reason? string
notifications: notifications:
+---n nexthop-resolution-status-change +---n nexthop-resolution-status-change
| +--ro nexthop | +--ro nexthop
| | +--ro nexthop-id? uint32 | | +--ro nexthop-id? uint32
| | +--ro sharing-flag? boolean | | +--ro sharing-flag? boolean
| | +--ro (nexthop-type)? | | +--ro (nexthop-type)?
| | +--:(nexthop-base) | | +--:(nexthop-base)
| | | ... | | | ...
| | +--:(nexthop-chain) {nexthop-chain}? | | +--:(nexthop-chain) {nexthop-chain}?
| | | ... | | | ...
| | +--:(nexthop-replicates) {nexthop-replicates}? | | +--:(nexthop-replicate) {nexthop-replicate}?
| | | ... | | | ...
| | +--:(nexthop-protection) {nexthop-protection}? | | +--:(nexthop-protection) {nexthop-protection}?
| | | ... | | | ...
| | +--:(nexthop-load-balance) {nexthop-load-balance}? | | +--:(nexthop-load-balance) {nexthop-load-balance}?
| | ... | | ...
| +--ro nexthop-state nexthop-state-definition | +--ro nexthop-state nexthop-state-definition
+---n route-change +---n route-change
+--ro rib-name string +--ro rib-name string
+--ro address-family address-family-definition +--ro address-family address-family-definition
+--ro route-index uint64 +--ro route-index uint64
skipping to change at page 7, line 22 skipping to change at page 7, line 47
| +--:(ipv6) | +--:(ipv6)
| | ... | | ...
| +--:(mpls-route) | +--:(mpls-route)
| | ... | | ...
| +--:(mac-route) | +--:(mac-route)
| | ... | | ...
| +--:(interface-route) | +--:(interface-route)
| ... | ...
+--ro route-installed-state route-installed-state-definition +--ro route-installed-state route-installed-state-definition
+--ro route-state route-state-definition +--ro route-state route-state-definition
+--ro route-change-reason route-change-reason-definition +--ro route-change-reasons* [route-change-reason]
+--ro route-change-reason route-change-reason-definition
Figure 1: Overview of I2RS RIB Module Structure Figure 1: Overview of I2RS RIB Module Structure
2.1. RIB Capability 2.1. RIB Capability
RIB capability negotiation is very important because not all of the RIB capability negotiation is very important because not all of the
hardware will be able to support all kinds of nexthops and there hardware will be able to support all kinds of nexthops, and there
might be a limitation on how many levels of lookup can be practically might be a limitation on how many levels of lookup can be practically
performed. Therefore, a RIB data model needs to specify a way for an performed. Therefore, a RIB data model needs to specify a way for an
external entity to learn about the functional capabilities of a external entity to learn about the functional capabilities of a
network device. network device.
At the same time, nexthop chains can be used to specify multiple At the same time, nexthop chains can be used to specify multiple
headers over a packet, before that particular packet is forwarded. headers over a packet before that particular packet is forwarded.
Not every network device will be able to support all kinds of nexthop Not every network device will be able to support all kinds of nexthop
chains along with the arbitrary number of headers which are chained chains along with the arbitrary number of headers that are chained
together. The RIB data model needs a way to expose the nexthop together. The RIB data model needs a way to expose the nexthop
chaining capability supported by a given network device. chaining capability supported by a given network device.
This module uses the feature and if-feature statements to achieve This module uses the feature and if-feature statements to achieve
above capability advertisement. above capability advertisement.
2.2. Routing Instance and Rib 2.2. Routing Instance and RIB
A routing instance, in the context of the RIB information model, is a A routing instance, in the context of the RIB information model, is a
collection of RIBs, interfaces, and routing protocol parameters. A collection of RIBs, interfaces, and routing protocol parameters. A
routing instance creates a logical slice of the router and can allow routing instance creates a logical slice of the router and can allow
multiple different logical slices, across a set of routers, to multiple different logical slices, across a set of routers, to
communicate with each other. The routing protocol parameters control communicate with each other. The routing protocol parameters control
the information available in the RIBs. More details about routing the information available in the RIBs. More details about a routing
instance can be found in Section 2.2 of instance can be found in Section 2.2 of [RFC8430].
[I-D.ietf-i2rs-rib-info-model].
For a routing instance, there can be multiple RIBs. Therefore, this For a routing instance, there can be multiple RIBs. Therefore, this
model uses "list" to express the RIBs. The structure tree is shown model uses "list" to express the RIBs. The structure tree is shown
below: below:
+--rw routing-instance +--rw routing-instance
+--rw name string +--rw name string
+--rw interface-list* [name] +--rw interface-list* [name]
| +--rw name if:interface-ref | +--rw name if:interface-ref
+--rw router-id? yang:dotted-quad +--rw router-id? yang:dotted-quad
+--rw lookup-limit? uint8 +--rw lookup-limit? uint8
+--rw rib-list* [name] +--rw rib-list* [name]
+--rw name string +--rw name string
+--rw address-family address-family-definition +--rw address-family address-family-definition
+--rw ip-rpf-check? boolean +--rw ip-rpf-check? boolean
+--rw route-list* [route-index] +--rw route-list* [route-index]
... (refer to Section 2.3) ... // refer to Section 2.3
Figure 2: Routing Instance Structure Figure 2: Routing Instance Structure
2.3. Route 2.3. Route
A route is essentially a match condition and an action following that A route is essentially a match condition and an action following that
match. The match condition specifies the kind of route (e.g., IPv4, match. The match condition specifies the kind of route (e.g., IPv4,
MPLS, MAC, Interface etc.) and the set of fields to match on. MPLS, Media Access Control (MAC), Interface, etc.) and the set of
fields to match on.
According to the definition in [I-D.ietf-i2rs-rib-info-model], a A route MUST contain the ROUTE_PREFERENCE attribute (see Section 2.3
route MUST associate with the following attributes: of [RFC8430]).
o ROUTE_PREFERENCE: See Section 2.3 of In addition, a route MUST associate with the following status
[I-D.ietf-i2rs-rib-info-model]. attributes in responses to a RIB writing/reading operation:
o ACTIVE: Indicates whether a route has at least one fully resolved o Active: Indicates whether a route has at least one fully resolved
nexthop and is therefore eligible for installation in the FIB. nexthop and is therefore eligible for installation in the FIB.
o INSTALLED: Indicates whether the route got installed in the FIB. o Installed: Indicates whether the route got installed in the FIB.
o REASON - Indicates the specific reason that caused the failure, o Reason: Indicates the specific reason that caused the failure,
E.g. Not authorized. e.g., "Not authorized".
In addition, a route can be associated with one or more optional In addition, a route can be associated with one or more optional
route attributes (e.g., route-vendor-attributes). route-attributes (e.g., route-vendor-attributes).
A RIB will have a number of routes, so the routes are expressed as a A RIB will have a number of routes, so the routes are expressed as a
list under a specific RIB. Each RIB has its own route list. list under a specific RIB. Each RIB has its own route list.
+--rw route-list* [route-index] +--rw route-list* [route-index]
+--rw route-index uint64 +--rw route-index uint64
+--rw match +--rw match
| +--rw (route-type)? | +--rw (route-type)?
| +--:(ipv4) | +--:(ipv4)
| | +--rw ipv4 | | +--rw ipv4
skipping to change at page 9, line 36 skipping to change at page 10, line 36
| | ... | | ...
| +--:(mpls-route) | +--:(mpls-route)
| | +--rw mpls-label uint32 | | +--rw mpls-label uint32
| +--:(mac-route) | +--:(mac-route)
| | +--rw mac-address uint32 | | +--rw mac-address uint32
| +--:(interface-route) | +--:(interface-route)
| +--rw interface-identifier if:interface-ref | +--rw interface-identifier if:interface-ref
+--rw nexthop +--rw nexthop
| ...(refer to Section 2.4) | ...(refer to Section 2.4)
Figure 3: Routes Structure Figure 3: Routes Structure
2.4. Nexthop 2.4. Nexthop
A nexthop represents an object resulting from a route lookup. As A nexthop represents an object resulting from a route lookup. As
illustrated in Section 2.4 of [I-D.ietf-i2rs-rib-info-model], to illustrated in Figure 4 of [RFC8430], to support various use cases
support various use cases (e.g., load balancing, protection, (e.g., load-balancing, protection, multicast, or a combination of
multicast or a combination of them), the nexthop is modeled as a them), the nexthop is modeled as a multilevel structure and supports
multi-level structure and supports recursion. The first level of the recursion. The first level of the nexthop includes the following
nexthop includes the following four types: four types:
o Base: The "base" nexthop is the foundation of all other nexthop o Base: The "base" nexthop is the foundation of all other nexthop
types. It includes the follow basic nexthops: types. It includes the following basic nexthops:
* nexthop-id * nexthop-id
* IPv4 address * IPv4 address
* IPv6 address * IPv6 address
* egress-interface * egress-interface
* egress-interface with IPv4 address * egress-interface with IPv4 address
* egress-interface with IPv6 address * egress-interface with IPv6 address
* egress-interface with MAC address * egress-interface with MAC address
skipping to change at page 10, line 22 skipping to change at page 11, line 39
* egress-interface with MAC address * egress-interface with MAC address
* logical-tunnel * logical-tunnel
* tunnel-encapsulation * tunnel-encapsulation
* tunnel-decapsulation * tunnel-decapsulation
* rib-name * rib-name
o Chain: Provide a way to perform multiple operations on a packet by o Chain: The "chain" nexthop provides a way to perform multiple
logically combining them. operations on a packet by logically combining them.
o Load-balance: Designed for load-balance case where it normally o Load-Balance: The "load-balance" nexthop is designed for a load-
will have multiple weighted nexthops. balance case where it normally will have multiple weighted
nexthops.
o Protection: Designed for protection scenario where it normally o Protection: The "protection" nexthop is designed for a protection
will have primary and standby nexthop. scenario where it normally will have primary and standby nexthop.
o Replicate: Designed for multiple destinations forwarding. o Replicate: The "replicate" nexthop is designed for multiple
destinations forwarding.
The structure tree of nexthop is shown in the following figures. The structure tree of nexthop is shown in the following figures.
+--rw nexthop +--rw nexthop
| +--rw nexthop-id? uint32 | +--rw nexthop-id? uint32
| +--rw sharing-flag? boolean | +--rw sharing-flag? boolean
| +--rw (nexthop-type)? | +--rw (nexthop-type)?
| +--:(nexthop-base) | +--:(nexthop-base)
| | ...(refer to Figure 5) | | ...(refer to Figure 5)
| +--:(nexthop-chain) {nexthop-chain}? | +--:(nexthop-chain) {nexthop-chain}?
| | +--rw nexthop-chain | | +--rw nexthop-chain
| | +--rw nexthop-list* [nexthop-member-id] | | +--rw nexthop-list* [nexthop-member-id]
| | +--rw nexthop-member-id uint32 | | +--rw nexthop-member-id uint32
| +--:(nexthop-replicates) {nexthop-replicates}? | +--:(nexthop-replicate) {nexthop-replicate}?
| | +--rw nexthop-replicates | | +--rw nexthop-replicate
| | +--rw nexthop-list* [nexthop-member-id] | | +--rw nexthop-list* [nexthop-member-id]
| | +--rw nexthop-member-id uint32 | | +--rw nexthop-member-id uint32
| +--:(nexthop-protection) {nexthop-protection}? | +--:(nexthop-protection) {nexthop-protection}?
| | +--rw nexthop-protection | | +--rw nexthop-protection
| | +--rw nexthop-list* [nexthop-member-id] | | +--rw nexthop-list* [nexthop-member-id]
| | +--rw nexthop-member-id uint32 | | +--rw nexthop-member-id uint32
| | +--rw nexthop-preference nexthop-preference-definition | | +--rw nexthop-preference nexthop-preference-definition
| +--:(nexthop-load-balance) {nexthop-load-balance}? | +--:(nexthop-load-balance) {nexthop-load-balance}?
| +--rw nexthop-lb | +--rw nexthop-lb
| +--rw nexthop-list* [nexthop-member-id] | +--rw nexthop-list* [nexthop-member-id]
| +--rw nexthop-member-id uint32 | +--rw nexthop-member-id uint32
| +--rw nexthop-lb-weight nexthop-lb-weight-definition | +--rw nexthop-lb-weight nexthop-lb-weight-definition
Figure 4: Nexthop Structure Figure 4: Nexthop Structure
Figure 5 (as shown below) is a sub-tree of nexthop, it's under the Figure 5 (as shown below) is a subtree of nexthop. It's under the
nexthop base node and shows that structure of the "base" nexthop. nexthop base node and shows the structure of the "base" nexthop.
+--:(nexthop-base) +--:(nexthop-base)
| +--rw nexthop-base | +--rw nexthop-base
| +--rw (nexthop-base-type)? | +--rw (nexthop-base-type)?
| +--:(special-nexthop) | +--:(special-nexthop)
| | +--rw special? special-nexthop-definition | | +--rw special? special-nexthop-definition
| +--:(egress-interface-nexthop) | +--:(egress-interface-nexthop)
| | +--rw outgoing-interface if:interface-ref | | +--rw outgoing-interface if:interface-ref
| +--:(ipv4-address-nexthop) | +--:(ipv4-address-nexthop)
| | +--rw ipv4-address inet:ipv4-address | | +--rw ipv4-address inet:ipv4-address
skipping to change at page 12, line 9 skipping to change at page 13, line 12
| | +--rw outgoing-interface if:interface-ref | | +--rw outgoing-interface if:interface-ref
| | +--rw ipv4-address inet:ipv4-address | | +--rw ipv4-address inet:ipv4-address
| +--:(egress-interface-ipv6-nexthop) | +--:(egress-interface-ipv6-nexthop)
| | +--rw egress-interface-ipv6-address | | +--rw egress-interface-ipv6-address
| | +--rw outgoing-interface if:interface-ref | | +--rw outgoing-interface if:interface-ref
| | +--rw ipv6-address inet:ipv6-address | | +--rw ipv6-address inet:ipv6-address
| +--:(egress-interface-mac-nexthop) | +--:(egress-interface-mac-nexthop)
| | +--rw egress-interface-mac-address | | +--rw egress-interface-mac-address
| | +--rw outgoing-interface if:interface-ref | | +--rw outgoing-interface if:interface-ref
| | +--rw ieee-mac-address yang:mac-address | | +--rw ieee-mac-address yang:mac-address
| +--:(tunnel-encap-nexthop) {nexthop-tunnel}? | +--:(tunnel-encapsulation-nexthop) {nexthop-tunnel}?
| | +--rw tunnel-encap | | +--rw tunnel-encapsulation
| | +--rw (tunnel-type)? | | +--rw (tunnel-type)?
| | +--:(ipv4) {ipv4-tunnel}? | | +--:(ipv4) {ipv4-tunnel}?
| | | +--rw ipv4-header | | | +--rw ipv4-header
| | | +--rw src-ipv4-address inet:ipv4-address | | | +--rw src-ipv4-address inet:ipv4-address
| | | +--rw dest-ipv4-address inet:ipv4-address | | | +--rw dest-ipv4-address inet:ipv4-address
| | | +--rw protocol uint8 | | | +--rw protocol uint8
| | | +--rw ttl? uint8 | | | +--rw ttl? uint8
| | | +--rw dscp? uint8 | | | +--rw dscp? uint8
| | +--:(ipv6) {ipv6-tunnel}? | | +--:(ipv6) {ipv6-tunnel}?
| | | +--rw ipv6-header | | | +--rw ipv6-header
| | | +--rw src-ipv6-address inet:ipv6-address | | | +--rw src-ipv6-address inet:ipv6-address
| | | +--rw dest-ipv6-address inet:ipv6-address | | | +--rw dest-ipv6-address inet:ipv6-address
| | | +--rw next-header uint8 | | | +--rw next-header uint8
| | | +--rw traffic-class? uint8 | | | +--rw traffic-class? uint8
| | | +--rw flow-label? inet:ipv6-flow-label | | | +--rw flow-label?
| | | inet:ipv6-flow-label
| | | +--rw hop-limit? uint8 | | | +--rw hop-limit? uint8
| | +--:(mpls) {mpls-tunnel}? | | +--:(mpls) {mpls-tunnel}?
| | | +--rw mpls-header | | | +--rw mpls-header
| | | +--rw label-operations* [label-oper-id] | | | +--rw label-operations* [label-oper-id]
| | | +--rw label-oper-id uint32 | | | +--rw label-oper-id uint32
| | | +--rw (label-actions)? | | | +--rw (label-actions)?
| | | +--:(label-push) | | | +--:(label-push)
| | | | +--rw label-push | | | | +--rw label-push
| | | | +--rw label uint32 | | | | +--rw label uint32
| | | | +--rw s-bit? boolean | | | | +--rw s-bit? boolean
| | | | +--rw tc-value? uint8 | | | | +--rw tc-value? uint8
| | | | +--rw ttl-value? uint8 | | | | +--rw ttl-value? uint8
| | | +--:(label-swap) | | | +--:(label-swap)
| | | +--rw label-swap | | | +--rw label-swap
| | | +--rw out-label uint32 | | | +--rw out-label uint32
| | | +--rw ttl-action? ttl-action- | | | +--rw ttl-action?
definition | | | ttl-action-definition
| | +--:(gre) {gre-tunnel}? | | +--:(gre) {gre-tunnel}?
| | | +--rw gre-header | | | +--rw gre-header
| | | +--rw (dest-address-type)? | | | +--rw (dest-address-type)?
| | | | +--:(ipv4) | | | | +--:(ipv4)
| | | | | +--rw ipv4-dest inet:ipv4-address | | | | | +--rw ipv4-dest inet:ipv4-address
| | | | +--:(ipv6) | | | | +--:(ipv6)
| | | | +--rw ipv6-dest inet:ipv6-address | | | | +--rw ipv6-dest inet:ipv6-address
| | | +--rw protocol-type uint16 | | | +--rw protocol-type uint16
| | | +--rw key? uint64 | | | +--rw key? uint64
| | +--:(nvgre) {nvgre-tunnel}? | | +--:(nvgre) {nvgre-tunnel}?
skipping to change at page 13, line 18 skipping to change at page 14, line 24
| | | | | +--rw src-ipv4-address inet:ipv4-address | | | | | +--rw src-ipv4-address inet:ipv4-address
| | | | | +--rw dest-ipv4-address inet:ipv4-address | | | | | +--rw dest-ipv4-address inet:ipv4-address
| | | | | +--rw protocol uint8 | | | | | +--rw protocol uint8
| | | | | +--rw ttl? uint8 | | | | | +--rw ttl? uint8
| | | | | +--rw dscp? uint8 | | | | | +--rw dscp? uint8
| | | | +--:(ipv6) | | | | +--:(ipv6)
| | | | +--rw src-ipv6-address inet:ipv6-address | | | | +--rw src-ipv6-address inet:ipv6-address
| | | | +--rw dest-ipv6-address inet:ipv6-address | | | | +--rw dest-ipv6-address inet:ipv6-address
| | | | +--rw next-header uint8 | | | | +--rw next-header uint8
| | | | +--rw traffic-class? uint8 | | | | +--rw traffic-class? uint8
| | | | +--rw flow-label? inet:ipv6-flow-label | | | | +--rw flow-label?
| | | | inet:ipv6-flow-label
| | | | +--rw hop-limit? uint8 | | | | +--rw hop-limit? uint8
| | | +--rw virtual-subnet-id uint32 | | | +--rw virtual-subnet-id uint32
| | | +--rw flow-id? uint8 | | | +--rw flow-id? uint8
| | +--:(vxlan) {vxlan-tunnel}? | | +--:(vxlan) {vxlan-tunnel}?
| | +--rw vxlan-header | | +--rw vxlan-header
| | +--rw (vxlan-type)? | | +--rw (vxlan-type)?
| | | +--:(ipv4) | | | +--:(ipv4)
| | | | +--rw src-ipv4-address inet:ipv4-address | | | | +--rw src-ipv4-address inet:ipv4-address
| | | | +--rw dest-ipv4-address inet:ipv4-address | | | | +--rw dest-ipv4-address inet:ipv4-address
| | | | +--rw protocol uint8 | | | | +--rw protocol uint8
skipping to change at page 13, line 44 skipping to change at page 15, line 6
| | | +--rw next-header uint8 | | | +--rw next-header uint8
| | | +--rw traffic-class? uint8 | | | +--rw traffic-class? uint8
| | | +--rw flow-label? inet:ipv6-flow-label | | | +--rw flow-label? inet:ipv6-flow-label
| | | +--rw hop-limit? uint8 | | | +--rw hop-limit? uint8
| | +--rw vxlan-identifier uint32 | | +--rw vxlan-identifier uint32
| +--:(tunnel-decapsulation-nexthop) {nexthop-tunnel}? | +--:(tunnel-decapsulation-nexthop) {nexthop-tunnel}?
| | +--rw tunnel-decapsulation | | +--rw tunnel-decapsulation
| | +--rw (tunnel-type)? | | +--rw (tunnel-type)?
| | +--:(ipv4) {ipv4-tunnel}? | | +--:(ipv4) {ipv4-tunnel}?
| | | +--rw ipv4-decapsulation | | | +--rw ipv4-decapsulation
| | | +--rw ipv4-decapsulation tunnel-decapsulation- | | | +--rw ipv4-decapsulation
action-definition | | | tunnel-decapsulation-action-definition
| | | +--rw ttl-action? ttl-action-definition | | | +--rw ttl-action? ttl-action-definition
| | +--:(ipv6) {ipv6-tunnel}? | | +--:(ipv6) {ipv6-tunnel}?
| | | +--rw ipv6-decapsulation | | | +--rw ipv6-decapsulation
| | | +--rw ipv6-decapsulation tunnel-decapsulation- | | | +--rw ipv6-decapsulation
action-definition | | | tunnel-decapsulation-action-definition
| | | +--rw hop-limit-action? hop-limit-action- | | | +--rw hop-limit-action?
definition | | | hop-limit-action-definition
| | +--:(mpls) {mpls-tunnel}? | | +--:(mpls) {mpls-tunnel}?
| | +--rw label-pop | | +--rw label-pop
| | +--rw label-pop mpls-label-action-definition | | +--rw label-pop mpls-label-action-definition
| | +--rw ttl-action? ttl-action-definition | | +--rw ttl-action? ttl-action-definition
| +--:(logical-tunnel-nexthop) {nexthop-tunnel}? | +--:(logical-tunnel-nexthop) {nexthop-tunnel}?
| | +--rw logical-tunnel | | +--rw logical-tunnel
| | +--rw tunnel-type tunnel-type-definition | | +--rw tunnel-type tunnel-type-definition
| | +--rw tunnel-name string | | +--rw tunnel-name string
| +--:(rib-name-nexthop) | +--:(rib-name-nexthop)
| | +--rw rib-name? string | | +--rw rib-name? string
| +--:(nexthop-identifier) | +--:(nexthop-identifier)
| +--rw nexthop-ref nexthop-ref | +--rw nexthop-ref nexthop-ref
Figure 5: Nexthop Base Structure Figure 5: Nexthop Base Structure
2.5. RPC Operations 2.5. RPC Operations
This module defines the following RPC operations: This module defines the following RPC operations:
o rib-add: Add a RIB to a routing instance. A name of the RIB, o rib-add: Add a RIB to a routing instance. The following are
address family of the RIB and (optionally) whether the RPF check passed as the input parameters: the name of the RIB, the address
is enabled are passed as the input parameters. The output is the family of the RIB, and (optionally) whether the RPF check is
result of the add operation: enabled. The output is the result of the add operation:
* true - success; * true - success
* false - failed; when failed, the i2rs agent may return the * false - failed (when failed, the I2RS agent may return the
specific reason that caused the failure. specific reason that caused the failure)
o rib-delete: Delete a RIB from a routing instance. When a RIB is o rib-delete: Delete a RIB from a routing instance. When a RIB is
deleted, all routes installed in the RIB will be deleted. A name deleted, all routes installed in the RIB will be deleted. A rib-
of the RIB is passed as the input parameter. The output is the name is passed as the input parameter. The output is the result
result of the delete operation: of the delete operation:
* true - success;
* false - failed; when failed, the i2rs agent may return the * true - success
specific reason that caused the failure.
o route-add: Add a route or a set of routes to a RIB. A RIB name, * false - failed (when failed, the I2RS agent may return the
the route prefix(es), route attributes, route vendor attributes, specific reason that caused the failure)
nexthop and whether return failure details are passed as the input
parameters. Before calling the route-add rpc, it is required to
call the nh-add rpc to create and/or return the nexthop
identifier. However, in situations when the nexthop already
exists and the nexthop-id is known, this action is not expected.
The output is a combination of the route operation states while o route-add: Add a route or a set of routes to a RIB. The following
querying the appropriate node in the data tree that include: are passed as the input parameters: the name of the RIB, the route
prefix(es), the route-attributes, the route-vendor-attributes, the
nexthop, and the "whether to return failure details" indication.
Before calling the route-add rpc, it is required to call the nh-
add rpc to create and/or return the nexthop identifier. However,
in situations when the nexthop already exists and the nexthop-id
is known, this action is not expected. The output is a
combination of the route operation states while querying the
appropriate node in the data tree, which includes:
* success-count: the number of routes that were successfully * success-count: the number of routes that were successfully
added; added;
* failed-count: the number of the routes that failed to be added; * failed-count: the number of the routes that failed to be added;
and,
* failure-detail: shows the specific routes that failed to be * failure-detail: this shows the specific routes that failed to
added. be added.
o route-delete: Delete a route or a set of routes from a RIB. A o route-delete: Delete a route or a set of routes from a RIB. The
name of the RIB, the route prefix(es) and whether to return following are passed as the input parameters: the name of the RIB,
failure details are passed as the input parameters. The output is the route prefix(es), and the "whether to return failure details"
a combination of route operation states that include: indication. The output is a combination of route operation
states, which includes:
* success-count: the number of routes that were successfully * success-count: the number of routes that were successfully
deleted; deleted;
* failed-count: the number of the routes that failed to be * failed-count: the number of the routes that failed to be
deleted; deleted; and,
* failure-detail: shows the specific routes that failed to be * failure-detail: this shows the specific routes that failed to
deleted. be deleted.
o route-update: Update a route or a set of routes. A RIB name, the o route-update: Update a route or a set of routes. The following
route prefix(es), or route attributes, or route vendor attributes, are passed as the input parameters: the name of the RIB, the route
or nexthop are passed as the input parameters. The match prefix(es), the route-attributes, the route-vendor-attributes, or
conditions can be either route prefix(es), or route attributes, or the nexthop. The match conditions can be either route prefix(es),
route vendor attributes, or nexthop. The update actions include: route-attributes, route-vendor-attributes, or nexthops. The
update the nexthop, update the route attributes, update the route update actions include the following: update the nexthops, update
vendor attributes. The output is combination of the route the route-attributes, and update the route-vendor-attributes. The
operation states that include: output is a combination of the route operation states, which
includes:
* success-count: the number of routes that were successfully * success-count: the number of routes that were successfully
updated; updated;
* failed-count: the number of the routes that failed to be * failed-count: the number of the routes that failed to be
updated; updated; and,
* failure-detail: shows the specific routes that failed to be * failure-detail: this shows the specific routes that failed to
updated. be updated.
o nh-add: Add a nexthop to a RIB. A name of the RIB and a nexthop o nh-add: Add a nexthop to a RIB. The following are passed as the
are passed as the input parameters. The network node is required input parameters: the name of the RIB and the nexthop. The
to allocate a nexthop identifier to the nexthop. The outputs network node is required to allocate a nexthop identifier to the
include the result of the nexthop add operation. nexthop. The outputs include the result of the nexthop add
operation.
* true - success; when success, a nexthop identifier will be * true - success (when success, a nexthop identifier will be
returned to the i2rs client. returned to the I2RS client)
* false - failed; when failed, the i2rs agent may return the * false - failed (when failed, the I2RS agent may return the
specific reason that caused the failure. specific reason that caused the failure)
o nh-delete: Delete a nexthop from a RIB. A name of a RIB and a o nh-delete: Delete a nexthop from a RIB. The following are passed
nexthop or nexthop identifier are passed as the input parameters. as the input parameters: the name of the RIB and a nexthop or
The output is the result of the delete operation: nexthop identifier. The output is the result of the delete
operation:
* true - success; * true - success
* false - failed; when failed, the i2rs agent may return the * false - failed (when failed, the I2RS agent may return the
specific reason that caused the failure. specific reason that caused the failure)
The structure tree of rpcs is shown in following figure. The structure tree of rpcs is shown in following figure.
rpcs: rpcs:
+---x rib-add +---x rib-add
| +---w input | +---w input
| | +---w rib-name string | | +---w rib-name string
| | +---w address-family address-family-definition | | +---w address-family address-family-definition
| | +---w ip-rpf-check? boolean | | +---w ip-rpf-check? boolean
| +--ro output | +--ro output
skipping to change at page 18, line 10 skipping to change at page 19, line 46
+---w input +---w input
| +---w rib-name string | +---w rib-name string
| +---w nexthop-id? uint32 | +---w nexthop-id? uint32
| +---w sharing-flag? boolean | +---w sharing-flag? boolean
| +---w (nexthop-type)? | +---w (nexthop-type)?
| ... | ...
+--ro output +--ro output
+--ro result uint32 +--ro result uint32
+--ro reason? string +--ro reason? string
Figure 6: RPCs Structure Figure 6: RPCs Structure
2.6. Notifications 2.6. Notifications
Asynchronous notifications are sent by the RIB manager of a network Asynchronous notifications are sent by the RIB manager of a network
device to an external entity when some event triggers on the network device to an external entity when some event triggers on the network
device. An implementation of this RIB data model MUST support device. An implementation of this RIB data model MUST support
sending two kinds of asynchronous notifications. sending two kinds of asynchronous notifications.
1. Route change notification: 1. Route change notification:
o Installed (Indicates whether the route got installed in the FIB) ; o Installed (indicates whether the route got installed in the FIB)
o Active (Indicates whether a route has at least one fully resolved o Active (indicates whether a route has at least one fully resolved
nexthop and is therefore eligible for installation in the FIB) ; nexthop and is therefore eligible for installation in the FIB)
o Reason - E.g. Not authorized o Reason (e.g., "Not authorized")
2. Nexthop resolution status notification 2. Nexthop resolution status notification
Nexthops can be fully resolved or unresolved. Nexthops can be fully resolved or unresolved.
A resolved nexthop has an adequate level of information to send the A resolved nexthop has an adequate level of information to send the
outgoing packet towards the destination by forwarding it on an outgoing packet towards the destination by forwarding it on an
interface to a directly connected neighbor. interface to a directly connected neighbor.
An unresolved nexthop is something that requires the RIB manager to An unresolved nexthop is something that requires the RIB manager to
determine the final resolved nexthop. In one example, a nexthop determine the final resolved nexthop. In one example, a nexthop
could be an IP address. The RIB manager would resolve how to reach could be an IP address. The RIB manager would resolve how to reach
that IP address, e.g. by checking if that particular IP address is that IP address, e.g., by checking if that particular IP address is
reachable by regular IP forwarding or by a MPLS tunnel or by both. reachable by regular IP forwarding, by an MPLS tunnel, or by both.
If the RIB manager cannot resolve the nexthop, then the nexthop If the RIB manager cannot resolve the nexthop, then the nexthop
remains in an unresolved state and is NOT a suitable candidate for remains in an unresolved state and is NOT a suitable candidate for
installation in the FIB. installation in the FIB.
An implementation of this RIB data model MUST support sending route- An implementation of this RIB data model MUST support sending route-
change notifications whenever a route transitions between the change notifications whenever a route transitions between the
following states: following states:
o from the active state to the inactive state o from the active state to the inactive state
skipping to change at page 19, line 4 skipping to change at page 20, line 45
remains in an unresolved state and is NOT a suitable candidate for remains in an unresolved state and is NOT a suitable candidate for
installation in the FIB. installation in the FIB.
An implementation of this RIB data model MUST support sending route- An implementation of this RIB data model MUST support sending route-
change notifications whenever a route transitions between the change notifications whenever a route transitions between the
following states: following states:
o from the active state to the inactive state o from the active state to the inactive state
o from the inactive state to the active state o from the inactive state to the active state
o from the installed state to the uninstalled state o from the installed state to the uninstalled state
o from the uninstalled state to the installed state o from the uninstalled state to the installed state
A single notification MAY be used when a route transitions from A single notification MAY be used when a route transitions from
inactive/uninstalled to active/installed or in the other direction. inactive/uninstalled to active/installed or in the other direction.
The structure tree of notifications is shown in the following figure. The structure tree of notifications is shown in the following figure.
notifications: notifications:
+---n nexthop-resolution-status-change +---n nexthop-resolution-status-change
| +--ro nexthop | +--ro nexthop
| | +--ro nexthop-id uint32 | | +--ro nexthop-id uint32
| | +--ro sharing-flag boolean | | +--ro sharing-flag boolean
| | +--ro (nexthop-type)? | | +--ro (nexthop-type)?
| | +--:(nexthop-base) | | +--:(nexthop-base)
| | | ... | | | ...
| | +--:(nexthop-chain) {nexthop-chain}? | | +--:(nexthop-chain) {nexthop-chain}?
| | | ... | | | ...
| | +--:(nexthop-replicate) {nexthop-replicate}? | | +--:(nexthop-replicate) {nexthop-replicate}?
skipping to change at page 19, line 50 skipping to change at page 21, line 44
| +--:(mpls-route) | +--:(mpls-route)
| | ... | | ...
| +--:(mac-route) | +--:(mac-route)
| | ... | | ...
| +--:(interface-route) | +--:(interface-route)
| ... | ...
+--ro route-installed-state route-installed-state-definition +--ro route-installed-state route-installed-state-definition
+--ro route-state route-state-definition +--ro route-state route-state-definition
+--ro route-change-reason route-change-reason-definition +--ro route-change-reason route-change-reason-definition
Figure 7: Notifications Structure Figure 7: Notifications Structure
3. YANG Modules
<CODE BEGINS> file "ietf-i2rs-rib@2018-04-23.yang" 3. YANG Module
module ietf-i2rs-rib { This YANG module references [RFC2784], [RFC7348], [RFC7637], and
yang-version 1.1; [RFC8344].
namespace "urn:ietf:params:xml:ns:yang:ietf-i2rs-rib";
prefix "iir";
import ietf-inet-types { <CODE BEGINS> file "ietf-i2rs-rib@2018-09-13.yang"
prefix inet;
reference "RFC 6991";
}
import ietf-interfaces { module ietf-i2rs-rib {
prefix if; yang-version 1.1;
reference "RFC 8344"; namespace "urn:ietf:params:xml:ns:yang:ietf-i2rs-rib";
} prefix iir;
import ietf-yang-types { import ietf-inet-types {
prefix yang; prefix inet;
reference "RFC 6991"; reference "RFC 6991";
} }
import ietf-interfaces {
prefix if;
reference "RFC 8344";
}
import ietf-yang-types {
prefix yang;
reference "RFC 6991";
}
organization organization
"IETF I2RS (Interface to Routing System) Working Group"; "IETF I2RS (Interface to Routing System) Working Group";
contact contact
"WG Web: <http://tools.ietf.org/wg/i2rs/> "WG Web: <https://datatracker.ietf.org/wg/i2rs/>
WG List: <mailto:i2rs@ietf.org> WG List: <mailto:i2rs@ietf.org>
Editor: Lixing Wang Editor: Lixing Wang
<mailto:wang_little_star@sina.com> <mailto:wang_little_star@sina.com>
Editor: Mach(Guoyi) Chen Editor: Mach(Guoyi) Chen
<mailto:mach.chen@huawei.com> <mailto:mach.chen@huawei.com>
Editor: Amit Dass Editor: Amit Dass
<mailto:amit.dass@ericsson.com> <mailto:dass.amit@gmail.com>
Editor: Hariharan Ananthakrishnan Editor: Hariharan Ananthakrishnan
<mailto:hari@packetdesign.com> <mailto:hari@netflix.com>
Editor: Sriganesh Kini Editor: Sriganesh Kini
<mailto:sriganesh.kini@ericsson.com> <mailto:sriganeshkini@gmail.com>
Editor: Nitin Bahadur Editor: Nitin Bahadur
<mailto:nitin_bahadur@yahoo.com>"; <mailto:nitin_bahadur@yahoo.com>";
description
"This module defines a YANG data model for
Routing Information Base (RIB) that aligns
with the I2RS RIB information model.
Copyright (c) <2018> IETF Trust and the persons
identified as authors of the code. All rights reserved.";
revision "2018-04-23" {
description "initial revision";
reference "RFC XXXX: draft-ietf-i2rs-data-model-10";
// RFC Ed.: replace XXXX with actual RFC number and remove
// this note
}
//Features
feature nexthop-tunnel {
description description
"This feature means that a node supports "This module defines a YANG data model for
tunnel nexthop capability."; Routing Information Base (RIB) that aligns
} with the I2RS RIB information model.
feature nexthop-chain { Copyright (c) 2018 IETF Trust and the persons
description identified as authors of the code. All rights reserved.
"This feature means that a node supports
chain nexthop capability.";
}
feature nexthop-protection { Redistribution and use in source and binary forms, with or
description without modification, is permitted pursuant to, and subject
"This feature means that a node supports to the license terms contained in, the Simplified BSD License
protection nexthop capability."; set forth in Section 4.c of the IETF Trust's Legal Provisions
} Relating to IETF Documents
(http://trustee.ietf.org/license-info).
feature nexthop-replicate { This version of this YANG module is part of RFC 8341; see
description the RFC itself for full legal notices.";
"This feature means that a node supports
replicates nexthop capability.";
}
feature nexthop-load-balance { revision 2018-09-13 {
description description
"This feature means that a node supports "initial revision";
load balance nexthop capability."; reference "RFC 8431";
} }
feature ipv4-tunnel { //Features
description
"This feature means that a node supports
IPv4 tunnel encapsulation capability.";
}
feature ipv6-tunnel {
description
"This feature means that a node supports
IPv6 tunnel encapsulation capability.";
}
feature mpls-tunnel { feature nexthop-tunnel {
description description
"This feature means that a node supports "This feature means that a node supports
MPLS tunnel encapsulation capability."; tunnel nexthop capability.";
} }
feature vxlan-tunnel { feature nexthop-chain {
description description
"This feature means that a node supports "This feature means that a node supports
VXLAN tunnel encapsulation capability."; chain nexthop capability.";
reference "RFC7348"; }
}
feature gre-tunnel { feature nexthop-protection {
description description
"This feature means that a node supports "This feature means that a node supports
GRE tunnel encapsulation capability."; protection nexthop capability.";
reference "RFC2784"; }
}
feature nvgre-tunnel { feature nexthop-replicate {
description description
"This feature means that a node supports "This feature means that a node supports
NvGRE tunnel encapsulation capability."; replicate nexthop capability.";
reference "RFC7637";
}
feature route-vendor-attributes { }
description
"This feature means that a node supports
route vendor attributes.";
}
//Identities and Type Definitions feature nexthop-load-balance {
identity mpls-label-action { description
description "This feature means that a node supports
"Base identity from which all MPLS label load-balance nexthop capability.";
operations are derived. }
The MPLS label stack operations include:
push - to add a new label to a label stack,
pop - to pop the top label from a label stack,
swap - to exchange the top label of a label
stack with new label.";
}
identity label-push { feature ipv4-tunnel {
base "mpls-label-action"; description
description "This feature means that a node supports
"MPLS label stack operation: push."; IPv4 tunnel encapsulation capability.";
} }
identity label-pop { feature ipv6-tunnel {
base "mpls-label-action"; description
description "This feature means that a node supports
"MPLS label stack operation: pop."; IPv6 tunnel encapsulation capability.";
} }
identity label-swap { feature mpls-tunnel {
base "mpls-label-action"; description
description "This feature means that a node supports
"MPLS label stack operation: swap."; MPLS tunnel encapsulation capability.";
} }
typedef mpls-label-action-definition { feature vxlan-tunnel {
type identityref { description
base "mpls-label-action"; "This feature means that a node supports
Virtual eXtensible Local Area Network
(VXLAN) tunnel encapsulation capability.";
reference "RFC 7348";
} }
description
"MPLS label action definition.";
}
identity tunnel-decapsulation-action { feature gre-tunnel {
description description
"Base identity from which all tunnel decapsulation "This feature means that a node supports
actions are derived. GRE tunnel encapsulation capability.";
Tunnel decapsulation actions include: reference "RFC 2784";
ipv4-decapsulation - to decapsulate an IPv4 tunnel, }
ipv6-decapsulation - to decapsulate an IPv6 tunnel.";
}
identity ipv4-decapsulation { feature nvgre-tunnel {
base "tunnel-decapsulation-action"; description
description "This feature means that a node supports
"IPv4 tunnel decapsulation."; Network Virtualization Using GRE (NVGRE)
} tunnel encapsulation capability.";
reference "RFC 7637";
}
feature route-vendor-attributes {
description
"This feature means that a node supports
route vendor attributes.";
}
identity ipv6-decapsulation { //Identities and Type Definitions
base "tunnel-decapsulation-action";
description
"IPv6 tunnel decapsulation.";
} identity mpls-label-action {
description
"Base identity from which all MPLS label
operations are derived.
typedef tunnel-decapsulation-action-definition { The MPLS label stack operations include:
type identityref { push - to add a new label to a label stack
base "tunnel-decapsulation-action"; pop - to pop the top label from a label stack
swap - to exchange the top label of a label
stack with a new label";
} }
description
"Tunnel decapsulation definition.";
}
identity ttl-action { identity label-push {
description base mpls-label-action;
"Base identity from which all TTL description
actions are derived."; "MPLS label stack operation: push.";
} }
identity no-action { identity label-pop {
base "ttl-action"; base mpls-label-action;
description description
"Do nothing regarding the TTL."; "MPLS label stack operation: pop.";
} }
identity copy-to-inner { identity label-swap {
base "ttl-action"; base mpls-label-action;
description description
"Copy the TTL of the outer header "MPLS label stack operation: swap.";
to the inner header."; }
}
identity decrease-and-copy-to-inner { typedef mpls-label-action-definition {
base "ttl-action"; type identityref {
description base mpls-label-action;
"Decrease TTL by one and copy the TTL }
to the inner header."; description
} "MPLS label action definition.";
}
identity decrease-and-copy-to-next { identity tunnel-decapsulation-action {
base "ttl-action"; description
description "Base identity from which all tunnel decapsulation
"Decrease TTL by one and copy the TTL actions are derived.
to the next header. For example: when Tunnel decapsulation actions include
MPLS label swapping, decrease the TTL ipv4-decapsulation (to decapsulate an IPv4 tunnel)
of the in_label and copy it to the ipv6-decapsulation (to decapsulate an IPv6 tunnel)";
out_label."; }
}
typedef ttl-action-definition { identity ipv4-decapsulation {
type identityref { base tunnel-decapsulation-action;
base "ttl-action"; description
"IPv4 tunnel decapsulation.";
} }
description
"TTL action definition.";
}
identity hop-limit-action { identity ipv6-decapsulation {
description base tunnel-decapsulation-action;
"Base identity from which all hop limit description
actions are derived."; "IPv6 tunnel decapsulation.";
} }
identity hop-limit-no-action { typedef tunnel-decapsulation-action-definition {
base "hop-limit-action"; type identityref {
description base tunnel-decapsulation-action;
"Do nothing regarding the hop limit."; }
} description
"Tunnel decapsulation definition.";
}
identity hop-limit-copy-to-inner { identity ttl-action {
base "hop-limit-action"; description
description "Base identity from which all TTL
"Copy the hop limit of the outer header actions are derived.";
to the inner header."; }
}
typedef hop-limit-action-definition { identity no-action {
type identityref { base ttl-action;
base "hop-limit-action"; description
"Do nothing regarding the TTL.";
} }
description
"IPv6 hop limit action definition.";
}
identity special-nexthop { identity copy-to-inner {
description base ttl-action;
"Base identity from which all special description
nexthops are derived."; "Copy the TTL of the outer header
} to the inner header.";
}
identity discard { identity decrease-and-copy-to-inner {
base "special-nexthop"; base ttl-action;
description description
"This indicates that the network "Decrease TTL by one and copy the TTL
device should drop the packet and to the inner header.";
increment a drop counter."; }
}
identity discard-with-error { identity decrease-and-copy-to-next {
base "special-nexthop"; base ttl-action;
description description
"This indicates that the network "Decrease TTL by one and copy the TTL
device should drop the packet, to the next header; for example, when
increment a drop counter and send MPLS label swapping, decrease the TTL
back an appropriate error message of the in_label and copy it to the
(like ICMP error)."; out_label.";
} }
identity receive { typedef ttl-action-definition {
base "special-nexthop"; type identityref {
description base ttl-action;
"This indicates that the traffic is }
destined for the network device. For description
example, protocol packets or OAM packets. "TTL action definition.";
All locally destined traffic SHOULD be }
throttled to avoid a denial of service
attack on the router's control plane. An
optional rate-limiter can be specified
to indicate how to throttle traffic
destined for the control plane.";
}
identity cos-value { identity hop-limit-action {
base "special-nexthop"; description
description "Base identity from which all hop limit
"Cos-value special nexthop."; actions are derived.";
} }
typedef special-nexthop-definition { identity hop-limit-no-action {
type identityref { base hop-limit-action;
base "special-nexthop"; description
"Do nothing regarding the hop limit.";
} }
description
"Special nexthop definition.";
}
identity ip-route-match-type { identity hop-limit-copy-to-inner {
description base hop-limit-action;
"Base identity from which all route description
match types are derived. "Copy the hop limit of the outer header
Route match type could be: to the inner header.";
match source, or }
match destination, or
match source and destination.";
}
identity match-ip-src { typedef hop-limit-action-definition {
base "ip-route-match-type"; type identityref {
description base hop-limit-action;
"Source route match type."; }
} description
identity match-ip-dest { "IPv6 hop limit action definition.";
base "ip-route-match-type";
description
"Destination route match type";
}
identity match-ip-src-dest {
base "ip-route-match-type";
description
"Source and Destination route match type";
}
typedef ip-route-match-type-definition {
type identityref {
base "ip-route-match-type";
} }
description
"IP route match type definition.";
}
identity address-family { identity special-nexthop {
description description
"Base identity from which all RIB "Base identity from which all special
address families are derived."; nexthops are derived.";
} }
identity ipv4-address-family { identity discard {
base "address-family"; base special-nexthop;
description description
"IPv4 RIB address family."; "This indicates that the network
} device should drop the packet and
increment a drop counter.";
}
identity ipv6-address-family { identity discard-with-error {
base "address-family"; base special-nexthop;
description description
"IPv6 RIB address family."; "This indicates that the network
} device should drop the packet,
increment a drop counter, and send
back an appropriate error message
(like ICMP error).";
}
identity mpls-address-family { identity receive {
base "address-family"; base special-nexthop;
description description
"MPLS RIB address family."; "This indicates that the traffic is
} destined for the network device, e.g.,
protocol packets or Operations,
Administration, and Maintenance (OAM) packets.
All locally destined traffic SHOULD be
throttled to avoid a denial-of-service
attack on the router's control plane. An
optional rate-limiter can be specified
to indicate how to throttle traffic
destined for the control plane.";
}
identity ieee-mac-address-family { identity cos-value {
base "address-family"; base special-nexthop;
description description
"MAC RIB address family."; "Cos-value special nexthop.";
} }
typedef address-family-definition { typedef special-nexthop-definition {
type identityref { type identityref {
base "address-family"; base special-nexthop;
}
description
"Special nexthop definition.";
} }
description
"RIB address family definition.";
}
identity route-type { identity ip-route-match-type {
description description
"Base identity from which all route types "Base identity from which all route
are derived."; match types are derived.
} The route match type could be:
match source, or
match destination, or
match source and destination.";
}
identity ipv4-route { identity match-ip-src {
base "route-type"; base ip-route-match-type;
description description
"IPv4 route type."; "Source route match type.";
} }
identity ipv6-route { identity match-ip-dest {
base "route-type"; base ip-route-match-type;
description description
"IPv6 route type."; "Destination route match type";
} }
identity mpls-route { identity match-ip-src-dest {
base "route-type"; base ip-route-match-type;
description description
"MPLS route type."; "Source and Destination route match type";
} }
identity ieee-mac { typedef ip-route-match-type-definition {
base "route-type"; type identityref {
description base ip-route-match-type;
"MAC route type."; }
} description
"IP route match type definition.";
}
identity interface { identity address-family {
base "route-type"; description
description "Base identity from which all RIB
"Interface route type."; address families are derived.";
} }
typedef route-type-definition { identity ipv4-address-family {
type identityref { base address-family;
base "route-type"; description
"IPv4 RIB address family.";
} }
description
"Route type definition.";
}
identity tunnel-type { identity ipv6-address-family {
description base address-family;
"Base identity from which all tunnel description
types are derived."; "IPv6 RIB address family.";
} }
identity ipv4-tunnel { identity mpls-address-family {
base "tunnel-type"; base address-family;
description description
"IPv4 tunnel type"; "MPLS RIB address family.";
} }
identity ipv6-tunnel { identity ieee-mac-address-family {
base "tunnel-type"; base address-family;
description description
"IPv6 Tunnel type"; "MAC RIB address family.";
} }
identity mpls-tunnel { typedef address-family-definition {
base "tunnel-type"; type identityref {
description base address-family;
"MPLS tunnel type"; }
} description
"RIB address family definition.";
}
identity gre-tunnel { identity route-type {
base "tunnel-type"; description
description "Base identity from which all route types
"GRE tunnel type"; are derived.";
} }
identity vxlan-tunnel { identity ipv4-route {
base "tunnel-type"; base route-type;
description description
"VXLAN tunnel type"; "IPv4 route type.";
} }
identity nvgre-tunnel { identity ipv6-route {
base "tunnel-type"; base route-type;
description description
"NVGRE tunnel type"; "IPv6 route type.";
} }
typedef tunnel-type-definition { identity mpls-route {
type identityref { base route-type;
base "tunnel-type"; description
"MPLS route type.";
} }
description
"Tunnel type definition.";
}
identity route-state { identity ieee-mac {
description base route-type;
"Base identity from which all route description
states are derived."; "MAC route type.";
} }
identity active { identity interface {
base "route-state"; base route-type;
description description
"Active state."; "Interface route type.";
} }
identity inactive { typedef route-type-definition {
base "route-state"; type identityref {
description base route-type;
"Inactive state."; }
} description
"Route type definition.";
}
typedef route-state-definition { identity tunnel-type {
type identityref { description
base "route-state"; "Base identity from which all tunnel
types are derived.";
} }
description
"Route state definition.";
}
identity nexthop-state { identity ipv4-tunnel {
description base tunnel-type;
"Base identity from which all nexthop description
states are derived."; "IPv4 tunnel type";
} }
identity resolved { identity ipv6-tunnel {
base "nexthop-state"; base tunnel-type;
description description
"Resolved nexthop state."; "IPv6 tunnel type";
} }
identity unresolved {
base "nexthop-state";
description
"Unresolved nexthop state.";
}
typedef nexthop-state-definition { identity mpls-tunnel {
type identityref { base tunnel-type;
base "nexthop-state"; description
"MPLS tunnel type";
} }
description
"Nexthop state definition.";
}
identity route-installed-state { identity gre-tunnel {
description base tunnel-type;
"Base identity from which all route description
installed states are derived."; "GRE tunnel type";
} }
identity uninstalled { identity vxlan-tunnel {
base "route-installed-state"; base tunnel-type;
description description
"Uninstalled state."; "VXLAN tunnel type";
} }
identity installed { identity nvgre-tunnel {
base "route-installed-state"; base tunnel-type;
description description
"Installed state."; "NVGRE tunnel type";
} }
typedef route-installed-state-definition { typedef tunnel-type-definition {
type identityref { type identityref {
base "route-installed-state"; base tunnel-type;
}
description
"Tunnel type definition.";
} }
description
"Route installed state definition.";
}
//Route change reason identities identity route-state {
description
"Base identity from which all route
states are derived.";
}
identity route-change-reason { identity active {
description base route-state;
"Base identity from which all route change description
reasons are derived."; "Active state.";
} }
identity lower-route-preference {
base "route-change-reason";
description
"This route was installed in the FIB because it had
a lower route preference value (and thus was more
preferred) than the route it replaced.";
}
identity higher-route-preference { identity inactive {
base "route-change-reason"; base route-state;
description description
"This route was uninstalled from the FIB because it had "Inactive state.";
a higher route preference value (and thus was less }
preferred) than the route that replaced it."; typedef route-state-definition {
} type identityref {
base route-state;
}
description
"Route state definition.";
}
identity resolved-nexthop { identity nexthop-state {
base "route-change-reason"; description
description "Base identity from which all nexthop
"This route was made active because at least states are derived.";
one of its nexthops was resolved."; }
}
identity unresolved-nexthop { identity resolved {
base "route-change-reason"; base nexthop-state;
description description
"This route was made inactive because all of "Resolved nexthop state.";
its nexthops are unresolved."; }
}
typedef route-change-reason-definition { identity unresolved {
type identityref { base nexthop-state;
base "route-change-reason"; description
"Unresolved nexthop state.";
} }
description
"Route change reason definition.";
}
typedef nexthop-preference-definition { typedef nexthop-state-definition {
type uint8 { type identityref {
range "1..99"; base nexthop-state;
}
description
"Nexthop state definition.";
} }
description
"Nexthop-preference is used for protection schemes.
It is an integer value between 1 and 99. Lower
values are more preferred. To download N
nexthops to the FIB, the N nexthops with the lowest
value are selected. If there are more than N
nexthops that have the same preference, an
implementation of i2rs client should select N
nexthops and download them, as for how to select
the nexthops is left to the implementations.";
}
typedef nexthop-lb-weight-definition { identity route-installed-state {
type uint8 { description
range "1..99"; "Base identity from which all route
installed states are derived.";
} }
description
"Nexthop-lb-weight is used for load-balancing.
Each list member SHOULD be assigned a weight
between 1 and 99. The weight determines the
proportion of traffic to be sent over a nexthop
used for forwarding as a ratio of the weight of
this nexthop divided by the sum of the weights
of all the nexthops of this route that are used
for forwarding. To perform equal load-balancing,
one MAY specify a weight of 0 for all the member
nexthops. The value 0 is reserved for equal
load-balancing and if applied, MUST be applied
to all member nexthops.
Note: The weight of 0 is specially because of
historical reasons. It's typically used in
hardware devices to signify ECMP";
}
typedef nexthop-ref { identity uninstalled {
type leafref { base route-installed-state;
path "/iir:routing-instance" + description
"/iir:rib-list" + "Uninstalled state.";
"/iir:route-list" +
"/iir:nexthop" +
"/iir:nexthop-id";
} }
description
"A nexthop reference that provides
an indirection reference to a nexthop.";
}
//Groupings identity installed {
grouping route-prefix { base route-installed-state;
description
"The common attributes used for all types of route prefix.";
leaf route-index {
type uint64 ;
mandatory true;
description description
"Route index."; "Installed state.";
} }
container match {
typedef route-installed-state-definition {
type identityref {
base route-installed-state;
}
description description
"The match condition specifies the "Route installed state definition.";
kind of route (IPv4, MPLS, etc.) }
and the set of fields to match on.";
choice route-type { //Route Change Reason Identities
identity route-change-reason {
description
"Base identity from which all route change
reasons are derived.";
}
identity lower-route-preference {
base route-change-reason;
description
"This route was installed in the FIB because it had
a lower route preference value (and thus was more
preferred) than the route it replaced.";
}
identity higher-route-preference {
base route-change-reason;
description
"This route was uninstalled from the FIB because it had
a higher route preference value (and thus was less
preferred) than the route that replaced it.";
}
identity resolved-nexthop {
base route-change-reason;
description
"This route was made active because at least
one of its nexthops was resolved.";
}
identity unresolved-nexthop {
base route-change-reason;
description
"This route was made inactive because all of
its nexthops are unresolved.";
}
typedef route-change-reason-definition {
type identityref {
base route-change-reason;
}
description
"Route change reason definition.";
}
typedef nexthop-preference-definition {
type uint8 {
range "1..99";
}
description
"Nexthop-preference is used for protection schemes.
It is an integer value between 1 and 99. Lower
values are preferred. To download N
nexthops to the FIB, the N nexthops with the lowest
value are selected. If there are more than N
nexthops that have the same preference, an
implementation of the I2RS client should select N
nexthops and download them. As for how to select
the nexthops, this is left to the implementations.";
}
typedef nexthop-lb-weight-definition {
type uint8 {
range "1..99";
}
description
"Nexthop-lb-weight is used for load-balancing.
Each list member SHOULD be assigned a weight
between 1 and 99. The weight determines the
proportion of traffic to be sent over a nexthop
used for forwarding as a ratio of the weight of
this nexthop divided by the sum of the weights
of all the nexthops of this route that are used
for forwarding. To perform equal load-balancing,
one MAY specify a weight of 0 for all the member
nexthops. The value 0 is reserved for equal
load-balancing and, if applied, MUST be applied
to all member nexthops.
Note that the weight of 0 is special because of
historical reasons. It's typically used in
hardware devices to signify ECMP.";
}
typedef nexthop-ref {
type leafref {
path "/iir:routing-instance" +
"/iir:rib-list" +
"/iir:route-list" +
"/iir:nexthop" +
"/iir:nexthop-id";
}
description
"A nexthop reference that provides
an indirection reference to a nexthop.";
}
//Groupings
grouping route-prefix {
description
"The common attributes used for all types of route prefixes.";
leaf route-index {
type uint64;
mandatory true;
description description
"Route types: IPv4, IPv6, MPLS, MAC etc."; "Route index.";
case ipv4 { }
container match {
description
"The match condition specifies the
kind of route (IPv4, MPLS, etc.)
and the set of fields to match on.";
choice route-type {
description description
"IPv4 route case."; "Route types: IPv4, IPv6, MPLS, MAC, etc.";
container ipv4 { case ipv4 {
description description
"IPv4 route match."; "IPv4 route case.";
choice ip-route-match-type { container ipv4 {
description description
"IP route match type options: "IPv4 route match.";
match source, or choice ip-route-match-type {
match destination, or description
match source and destination."; "IP route match type options:
case dest-ipv4-address { match source, or
leaf dest-ipv4-prefix { match destination, or
type inet:ipv4-prefix; match source and destination.";
mandatory true; case dest-ipv4-address {
description
"An IPv4 destination address as the match.";
}
}
case src-ipv4-address {
leaf src-ipv4-prefix {
type inet:ipv4-prefix;
mandatory true;
description
"An IPv4 source address as the match.";
}
}
case dest-src-ipv4-address {
container dest-src-ipv4-address {
description
"A combination of an IPv4 source and
an IPv4 destination address as the match.";
leaf dest-ipv4-prefix { leaf dest-ipv4-prefix {
type inet:ipv4-prefix; type inet:ipv4-prefix;
mandatory true; mandatory true;
description description
"The IPv4 destination address of the match."; "An IPv4 destination address as the match.";
} }
}
case src-ipv4-address {
leaf src-ipv4-prefix { leaf src-ipv4-prefix {
type inet:ipv4-prefix; type inet:ipv4-prefix;
mandatory true; mandatory true;
description description
"The IPv4 source address of the match"; "An IPv4 source address as the match.";
}
}
case dest-src-ipv4-address {
container dest-src-ipv4-address {
description
"A combination of an IPv4 source and
an IPv4 destination address as the match.";
leaf dest-ipv4-prefix {
type inet:ipv4-prefix;
mandatory true;
description
"The IPv4 destination address of the match.";
}
leaf src-ipv4-prefix {
type inet:ipv4-prefix;
mandatory true;
description
"The IPv4 source address of the match.";
}
} }
} }
} }
} }
} }
} case ipv6 {
case ipv6 {
description
"IPv6 route case.";
container ipv6 {
description description
"IPv6 route match."; "IPv6 route case.";
choice ip-route-match-type { container ipv6 {
description description
"IP route match type options: "IPv6 route match.";
match source, or choice ip-route-match-type {
match destination, or description
match source and destination."; "IP route match type options:
case dest-ipv6-address { match source,
leaf dest-ipv6-prefix { match destination, or
type inet:ipv6-prefix; match source and destination.";
mandatory true; case dest-ipv6-address {
description
"An IPv6 destination address as the match.";
}
}
case src-ipv6-address {
leaf src-ipv6-prefix {
type inet:ipv6-prefix;
mandatory true;
description
"An IPv6 source address as the match.";
}
}
case dest-src-ipv6-address {
container dest-src-ipv6-address {
description
"A combination of an IPv6 source and
an IPv6 destination address as the match.";
leaf dest-ipv6-prefix { leaf dest-ipv6-prefix {
type inet:ipv6-prefix; type inet:ipv6-prefix;
mandatory true; mandatory true;
description description
"The IPv6 destination address of the match"; "An IPv6 destination address as the match.";
} }
}
case src-ipv6-address {
leaf src-ipv6-prefix { leaf src-ipv6-prefix {
type inet:ipv6-prefix; type inet:ipv6-prefix;
mandatory true; mandatory true;
description description
"The IPv6 source address of the match."; "An IPv6 source address as the match.";
}
}
case dest-src-ipv6-address {
container dest-src-ipv6-address {
description
"A combination of an IPv6 source and
an IPv6 destination address as the match.";
leaf dest-ipv6-prefix {
type inet:ipv6-prefix;
mandatory true;
description
"The IPv6 destination address of the match.";
}
leaf src-ipv6-prefix {
type inet:ipv6-prefix;
mandatory true;
description
"The IPv6 source address of the match.";
}
} }
} }
} }
} }
} }
} case mpls-route {
case mpls-route {
description
"MPLS route case.";
leaf mpls-label {
type uint32 ;
mandatory true;
description description
"The label used for matching."; "MPLS route case.";
leaf mpls-label {
type uint32;
mandatory true;
description
"The label used for matching.";
}
} }
} case mac-route {
case mac-route {
description
"MAC route case.";
leaf mac-address {
type yang:mac-address;
mandatory true;
description description
"The MAC address used for matching."; "MAC route case.";
leaf mac-address {
type yang:mac-address;
mandatory true;
description
"The MAC address used for matching.";
}
} }
} case interface-route {
case interface-route {
description
"Interface route case.";
leaf interface-identifier {
type if:interface-ref;
mandatory true;
description description
"The interface used for matching."; "Interface route case.";
leaf interface-identifier {
type if:interface-ref;
mandatory true;
description
"The interface used for matching.";
}
} }
} }
} }
} }
} grouping route {
grouping route {
description
"The common attributes used for all types of routes.";
uses route-prefix;
container nexthop {
description
"The nexthop of the route.";
uses nexthop;
}
//In the information model, it is called route-statistic
container route-status {
description description
"The status information of the route."; "The common attributes used for all types of routes.";
leaf route-state { uses route-prefix;
type route-state-definition; container nexthop {
config false;
description description
"Indicate a route's state: Active or Inactive."; "The nexthop of the route.";
uses nexthop;
} }
leaf route-installed-state { //In the information model, it is called route-statistic
type route-installed-state-definition; container route-status {
config false;
description description
"Indicate that a route's installed states: "The status information of the route.";
Installed or uninstalled."; leaf route-state {
type route-state-definition;
config false;
description
"Indicate a route's state: active or inactive.";
}
leaf route-installed-state {
type route-installed-state-definition;
config false;
description
"Indicate that a route's installed states:
installed or uninstalled.";
}
leaf route-reason {
type route-change-reason-definition;
config false;
description
"Indicate the reason that caused the route change.";
}
} }
leaf route-reason { container route-attributes {
type route-change-reason-definition;
config false;
description description
"Indicate the reason that caused the route change."; "Route attributes.";
uses route-attributes;
}
container route-vendor-attributes {
description
"Route vendor attributes.";
uses route-vendor-attributes;
} }
} }
container route-attributes {
description
"Route attributes.";
uses route-attributes;
}
container route-vendor-attributes {
description
"Route vendor attributes.";
uses route-vendor-attributes;
}
}
grouping nexthop-list { grouping nexthop-list {
description
"A generic nexthop list.";
list nexthop-list {
key "nexthop-member-id";
description description
"A list of nexthops."; "A generic nexthop list.";
leaf nexthop-member-id { list nexthop-list {
type uint32; key "nexthop-member-id";
mandatory true;
description description
"A nexthop identifier that points "A list of nexthops.";
to a nexthop list member. leaf nexthop-member-id {
A nexthop list member is a nexthop."; type uint32;
mandatory true;
description
"A nexthop identifier that points
to a nexthop list member.
A nexthop list member is a nexthop.";
}
} }
} }
}
grouping nexthop-list-p { grouping nexthop-list-p {
description
"A nexthop list with preference parameter.";
list nexthop-list {
key "nexthop-member-id";
description description
"A list of nexthop."; "A nexthop list with preference parameter.";
leaf nexthop-member-id { list nexthop-list {
type uint32; key "nexthop-member-id";
mandatory true;
description description
"A nexthop identifier that points "A list of nexthop.";
to a nexthop list member. leaf nexthop-member-id {
A nexthop list member is a nexthop."; type uint32;
mandatory true;
description
"A nexthop identifier that points
to a nexthop list member.
A nexthop list member is a nexthop.";
}
leaf nexthop-preference {
type nexthop-preference-definition;
mandatory true;
description
"Nexthop-preference is used for protection schemes.
It is an integer value between 1 and 99. Lower
values are more preferred. To download a
primary/standby/tertiary group to the FIB, the
nexthops that are resolved and are most preferred
are selected.";
}
} }
leaf nexthop-preference { }
type nexthop-preference-definition;
mandatory true; grouping nexthop-list-w {
description
"A nexthop list with a weight parameter.";
list nexthop-list {
key "nexthop-member-id";
description description
"Nexthop-preference is used for protection schemes. "A list of nexthop.";
It is an integer value between 1 and 99. Lower leaf nexthop-member-id {
values are more preferred. To download a type uint32;
primary/standby/tertiary group to the FIB, the mandatory true;
nexthops that are resolved and are most preferred description
are selected."; "A nexthop identifier that points
to a nexthop list member.
A nexthop list member is a nexthop.";
}
leaf nexthop-lb-weight {
type nexthop-lb-weight-definition;
mandatory true;
description
"The weight of a nexthop of
the load-balance nexthops.";
}
} }
} }
}
grouping nexthop-list-w { grouping nexthop {
description
"A nexthop list with weight parameter.";
list nexthop-list {
key "nexthop-member-id";
description description
"A list of nexthop."; "The nexthop structure.";
leaf nexthop-member-id { leaf nexthop-id {
type uint32; type uint32;
mandatory true;
description description
"A nexthop identifier that points "An identifier that refers to a nexthop.";
to a nexthop list member.
A nexthop list member is a nexthop.";
} }
leaf nexthop-lb-weight { leaf sharing-flag {
type nexthop-lb-weight-definition; type boolean;
mandatory true;
description description
"The weight of a nexthop of "To indicate whether a nexthop is sharable
the load balance nexthops."; or non-sharable:
true - sharable (which means the nexthop can be
shared with other routes)
false - non-sharable (which means the nexthop can
not be shared with other routes)";
} }
} choice nexthop-type {
} description
"Nexthop type options.";
grouping nexthop { case nexthop-base {
description container nexthop-base {
"The nexthop structure."; description
leaf nexthop-id { "The base nexthop.";
type uint32; uses nexthop-base;
description }
"An identifier that refers to a nexthop.";
}
leaf sharing-flag {
type boolean;
description
"To indicate whether a nexthop is sharable
or non-sharable.
true - sharable, means the nexthop can be shared
with other routes
false - non-sharable, means the nexthop can not
be shared with other routes.";
}
choice nexthop-type {
description
"Nexthop type options.";
case nexthop-base {
container nexthop-base {
description
"The base nexthop.";
uses nexthop-base;
} }
} case nexthop-chain {
case nexthop-chain { if-feature "nexthop-chain";
if-feature nexthop-chain; container nexthop-chain {
container nexthop-chain { description
description "A chain nexthop.";
"A chain nexthop."; uses nexthop-list;
uses nexthop-list; }
} }
} case nexthop-replicate {
case nexthop-replicate { if-feature "nexthop-replicate";
if-feature nexthop-replicate; container nexthop-replicate {
container nexthop-replicate { description
description "A replicate nexthop.";
"A replicates nexthop."; uses nexthop-list;
uses nexthop-list; }
} }
} case nexthop-protection {
case nexthop-protection { if-feature "nexthop-protection";
if-feature nexthop-protection; container nexthop-protection {
container nexthop-protection { description
description "A protection nexthop.";
"A protection nexthop."; uses nexthop-list-p;
uses nexthop-list-p; }
} }
} case nexthop-load-balance {
case nexthop-load-balance { if-feature "nexthop-load-balance";
if-feature nexthop-load-balance; container nexthop-lb {
container nexthop-lb { description
description "A load-balance nexthop.";
"A load balance nexthop."; uses nexthop-list-w;
uses nexthop-list-w; }
} }
} }
} }
}
grouping nexthop-base { grouping nexthop-base {
description
"The base nexthop.";
choice nexthop-base-type {
description description
"Nexthop base type options."; "The base nexthop.";
case special-nexthop { choice nexthop-base-type {
leaf special { description
type special-nexthop-definition; "Nexthop base type options.";
description case special-nexthop {
"A special nexthop."; leaf special {
} type special-nexthop-definition;
} description
case egress-interface-nexthop { "A special nexthop.";
leaf outgoing-interface { }
type if:interface-ref;
mandatory true;
description
"The nexthop is an outgoing interface.";
}
}
case ipv4-address-nexthop {
leaf ipv4-address {
type inet:ipv4-address;
mandatory true;
description
"The nexthop is an IPv4 address.";
}
}
case ipv6-address-nexthop {
leaf ipv6-address {
type inet:ipv6-address;
mandatory true;
description
"The nexthop is an IPv6 address.";
} }
} case egress-interface-nexthop {
case egress-interface-ipv4-nexthop {
container egress-interface-ipv4-address{
leaf outgoing-interface { leaf outgoing-interface {
type if:interface-ref; type if:interface-ref;
mandatory true; mandatory true;
description description
"Name of the outgoing interface."; "The nexthop is an outgoing interface.";
} }
}
case ipv4-address-nexthop {
leaf ipv4-address { leaf ipv4-address {
type inet:ipv4-address; type inet:ipv4-address;
mandatory true; mandatory true;
description description
"The nexthop points to an interface with "The nexthop is an IPv4 address.";
an IPv4 address.";
} }
description
"The nexthop is an egress-interface and an IP
address. This can be used in cases e.g. where
the IP address is a link-local address.";
} }
} case ipv6-address-nexthop {
case egress-interface-ipv6-nexthop {
container egress-interface-ipv6-address {
leaf outgoing-interface {
type if:interface-ref;
mandatory true;
description
"Name of the outgoing interface.";
}
leaf ipv6-address { leaf ipv6-address {
type inet:ipv6-address; type inet:ipv6-address;
mandatory true; mandatory true;
description description
"The nexthop points to an interface with "The nexthop is an IPv6 address.";
an IPv6 address.";
} }
description
"The nexthop is an egress-interface and an IP
address. This can be used in cases e.g. where
the IP address is a link-local address.";
} }
} case egress-interface-ipv4-nexthop {
case egress-interface-mac-nexthop { container egress-interface-ipv4-address {
container egress-interface-mac-address { leaf outgoing-interface {
leaf outgoing-interface { type if:interface-ref;
type if:interface-ref; mandatory true;
mandatory true; description
"Name of the outgoing interface.";
}
leaf ipv4-address {
type inet:ipv4-address;
mandatory true;
description
"The nexthop points to an interface with
an IPv4 address.";
}
description description
"Name of the outgoing interface."; "The nexthop is an egress-interface and an IP
address. This can be used in cases where, e.g.,
the IP address is a link-local address.";
} }
leaf ieee-mac-address { }
type yang:mac-address; case egress-interface-ipv6-nexthop {
mandatory true; container egress-interface-ipv6-address {
leaf outgoing-interface {
type if:interface-ref;
mandatory true;
description
"Name of the outgoing interface.";
}
leaf ipv6-address {
type inet:ipv6-address;
mandatory true;
description
"The nexthop points to an interface with
an IPv6 address.";
}
description description
"The nexthop points to an interface with "The nexthop is an egress-interface and an IP
a specific mac-address."; address. This can be used in cases where, e.g.,
the IP address is a link-local address.";
} }
description
"The egress interface must be an Ethernet
interface. Address resolution is not required
for this nexthop.";
} }
} case egress-interface-mac-nexthop {
case tunnel-encap-nexthop { container egress-interface-mac-address {
if-feature nexthop-tunnel; leaf outgoing-interface {
container tunnel-encap { type if:interface-ref;
uses tunnel-encap; mandatory true;
description description
"This can be an encapsulation representing an IP "Name of the outgoing interface.";
tunnel or MPLS tunnel or others as defined in info
model. An optional egress interface can be chained }
to the tunnel encapsulation to indicate which leaf ieee-mac-address {
interface to send the packet out on. The egress type yang:mac-address;
interface is useful when the network device mandatory true;
contains Ethernet interfaces and one needs to description
perform address resolution for the IP packet."; "The nexthop points to an interface with
a specific MAC address.";
}
description
"The egress-interface must be an Ethernet
interface. Address resolution is not required
for this nexthop.";
}
} }
} case tunnel-encapsulation-nexthop {
case tunnel-decapsulation-nexthop { if-feature "nexthop-tunnel";
if-feature nexthop-tunnel; container tunnel-encapsulation {
container tunnel-decapsulation { uses tunnel-encapsulation;
uses tunnel-decapsulation; description
description "This can be an encapsulation representing an IP
"This is to specify the decapsulation of a tunnel header."; tunnel, MPLS tunnel, or others as defined in the info
model. An optional egress-interface can be chained
to the tunnel encapsulation to indicate which
interface to send the packet out on. The
egress-interface is useful when the network device
contains Ethernet interfaces and one needs to
perform address resolution for the IP packet.";
}
} }
} case tunnel-decapsulation-nexthop {
case logical-tunnel-nexthop { if-feature "nexthop-tunnel";
if-feature nexthop-tunnel; container tunnel-decapsulation {
container logical-tunnel { uses tunnel-decapsulation;
uses logical-tunnel; description
description "This is to specify the decapsulation of a tunnel
"This can be a MPLS LSP or a GRE tunnel (or others header.";
as defined in this document), that is represented }
by a unique identifier (e.g. name).";
} }
} case logical-tunnel-nexthop {
case rib-name-nexthop { if-feature "nexthop-tunnel";
leaf rib-name { container logical-tunnel {
type string; uses logical-tunnel;
description description
"A nexthop pointing to a RIB indicates that the "This can be an MPLS Label Switched Path (LSP)
route lookup needs to continue in the specified or a GRE tunnel (or others as defined in this
RIB. This is a way to perform chained lookups."; document) that is represented by a unique
identifier (e.g., name).";
}
} }
} case rib-name-nexthop {
case nexthop-identifier { leaf rib-name {
leaf nexthop-ref { type string;
type nexthop-ref; description
mandatory true; "A nexthop pointing to a RIB indicates that the
description route lookup needs to continue in the specified
"A nexthop reference that points to a nexthop."; RIB. This is a way to perform chained lookups.";
}
}
case nexthop-identifier {
leaf nexthop-ref {
type nexthop-ref;
mandatory true;
description
"A nexthop reference that points to a nexthop.";
}
} }
} }
} }
}
grouping route-vendor-attributes {
description
"Route vendor attributes.";
}
grouping logical-tunnel { grouping route-vendor-attributes {
description
"A logical tunnel that is identified
by a type and a tunnel name.";
leaf tunnel-type {
type tunnel-type-definition;
mandatory true;
description
"A tunnel type.";
}
leaf tunnel-name {
type string;
mandatory true;
description description
"A tunnel name that points to a logical tunnel."; "Route vendor attributes.";
} }
}
grouping ipv4-header { grouping logical-tunnel {
description
"The IPv4 header encapsulation information.";
leaf src-ipv4-address {
type inet:ipv4-address;
mandatory true;
description
"The source IP address of the header.";
}
leaf dest-ipv4-address {
type inet:ipv4-address;
mandatory true;
description
"The destination IP address of the header.";
}
leaf protocol {
type uint8;
mandatory true;
description
"The protocol id of the header.";
}
leaf ttl {
type uint8;
description
"The TTL of the header.";
}
leaf dscp {
type uint8;
description description
"The DSCP field of the header."; "A logical tunnel that is identified
by a type and a tunnel name.";
leaf tunnel-type {
type tunnel-type-definition;
mandatory true;
description
"A tunnel type.";
}
leaf tunnel-name {
type string;
mandatory true;
description
"A tunnel name that points to a logical tunnel.";
}
} }
}
grouping ipv6-header { grouping ipv4-header {
description
"The IPv6 header encapsulation information.";
leaf src-ipv6-address {
type inet:ipv6-address;
mandatory true;
description
"The source IP address of the header.";
}
leaf dest-ipv6-address {
type inet:ipv6-address;
mandatory true;
description
"The destination IP address of the header.";
}
leaf next-header {
type uint8;
mandatory true;
description
"The next header of the IPv6 header.";
}
leaf traffic-class {
type uint8;
description
"The traffic class value of the header.";
}
leaf flow-label {
type inet:ipv6-flow-label;
description description
"The flow label of the header."; "The IPv4 header encapsulation information.";
} leaf src-ipv4-address {
leaf hop-limit { type inet:ipv4-address;
type uint8 { mandatory true;
range "1..255"; description
"The source IP address of the header.";
}
leaf dest-ipv4-address {
type inet:ipv4-address;
mandatory true;
description
"The destination IP address of the header.";
}
leaf protocol {
type uint8;
mandatory true;
description
"The protocol id of the header.";
}
leaf ttl {
type uint8;
description
"The TTL of the header.";
}
leaf dscp {
type uint8;
description
"The Differentiated Services Code Point
(DSCP) field of the header.";
} }
description
"The hop limit of the header.";
} }
}
grouping nvgre-header { grouping ipv6-header {
description
"The NvGRE header encapsulation information.";
choice nvgre-type {
description description
"NvGRE can use either IPv4 "The IPv6 header encapsulation information.";
or IPv6 header for encapsulation."; leaf src-ipv6-address {
case ipv4 { type inet:ipv6-address;
uses ipv4-header; mandatory true;
description
"The source IP address of the header.";
} }
case ipv6 { leaf dest-ipv6-address {
uses ipv6-header; type inet:ipv6-address;
mandatory true;
description
"The destination IP address of the header.";
}
leaf next-header {
type uint8;
mandatory true;
description
"The next header of the IPv6 header.";
}
leaf traffic-class {
type uint8;
description
"The traffic class value of the header.";
}
leaf flow-label {
type inet:ipv6-flow-label;
description
"The flow label of the header.";
}
leaf hop-limit {
type uint8 {
range "1..255";
}
description
"The hop limit of the header.";
} }
} }
leaf virtual-subnet-id {
type uint32;
mandatory true;
description
"The subnet identifier of the NvGRE header.";
}
leaf flow-id {
type uint8;
description
"The flow identifier of the NvGRE header.";
}
}
grouping vxlan-header { grouping nvgre-header {
description
"The VXLAN encapsulation header information.";
choice vxlan-type {
description description
"NvGRE can use either IPv4 "The NVGRE header encapsulation information.";
or IPv6 header for encapsulation."; choice nvgre-type {
case ipv4 { description
uses ipv4-header; "NVGRE can use either an IPv4
or an IPv6 header for encapsulation.";
case ipv4 {
uses ipv4-header;
}
case ipv6 {
uses ipv6-header;
}
} }
case ipv6 { leaf virtual-subnet-id {
uses ipv6-header; type uint32;
mandatory true;
description
"The subnet identifier of the NVGRE header.";
}
leaf flow-id {
type uint8;
description
"The flow identifier of the NVGRE header.";
} }
} }
leaf vxlan-identifier { grouping vxlan-header {
type uint32;
mandatory true;
description
"The VXLAN identifier of the VXLAN header.";
}
}
grouping gre-header {
description
"The GRE encapsulation header information.";
choice dest-address-type {
description description
"GRE options: IPv4 and IPv6"; "The VXLAN encapsulation header information.";
case ipv4 { choice vxlan-type {
leaf ipv4-dest { description
type inet:ipv4-address; "NVGRE can use either an IPv4
mandatory true; or an IPv6 header for encapsulation.";
description case ipv4 {
"The destination IP address of the GRE header."; uses ipv4-header;
} }
} case ipv6 {
case ipv6 { uses ipv6-header;
leaf ipv6-dest {
type inet:ipv6-address;
mandatory true;
description
"The destination IP address of the GRE header.";
} }
} }
} leaf vxlan-identifier {
leaf protocol-type {
type uint16;
mandatory true;
description
"The protocol type of the GRE header.";
}
leaf key {
type uint64;
description
"The GRE key of the GRE header.";
}
}
grouping mpls-header {
description
"The MPLS encapsulation header information.";
list label-operations {
key "label-oper-id";
description
"Label operations.";
leaf label-oper-id {
type uint32; type uint32;
mandatory true;
description description
"An optional identifier that points "The VXLAN identifier of the VXLAN header.";
to a label operation.";
} }
choice label-actions { }
grouping gre-header {
description
"The GRE encapsulation header information.";
choice dest-address-type {
description description
"Label action options."; "GRE options: IPv4 and IPv6";
case label-push { case ipv4 {
container label-push { leaf ipv4-dest {
type inet:ipv4-address;
mandatory true;
description description
"Label push operation."; "The destination IP address of the GRE header.";
leaf label {
type uint32;
mandatory true;
description
"The label to be pushed.";
}
leaf s-bit {
type boolean;
description
"The s-bit of the label to be pushed. ";
}
leaf tc-value {
type uint8;
description
"The traffic class value of the label to be pushed.";
}
leaf ttl-value {
type uint8;
description
"The TTL value of the label to be pushed.";
}
} }
} }
case label-swap { case ipv6 {
container label-swap { leaf ipv6-dest {
type inet:ipv6-address;
mandatory true;
description description
"Label swap operation."; "The destination IP address of the GRE header.";
leaf in-label {
type uint32;
mandatory true;
description
"The label to be swapped.";
}
leaf out-label {
type uint32;
mandatory true;
description
"The out MPLS label.";
}
leaf ttl-action {
type ttl-action-definition;
description
"The label ttl actions:
- No-action, or
- Copy to inner label,or
- Decrease (the in-label) by 1 and
copy to the out-label.";
}
} }
} }
} }
leaf protocol-type {
type uint16;
mandatory true;
description
"The protocol type of the GRE header.";
}
leaf key {
type uint64;
description
"The GRE key of the GRE header.";
}
} }
}
grouping tunnel-encap{ grouping mpls-header {
description
"Tunnel encapsulation information.";
choice tunnel-type {
description description
"Tunnel options for next-hops."; "The MPLS encapsulation header information.";
case ipv4 { list label-operations {
if-feature ipv4-tunnel; key "label-oper-id";
container ipv4-header { description
uses ipv4-header; "Label operations.";
description leaf label-oper-id {
"IPv4 header."; type uint32;
}
}
case ipv6 {
if-feature ipv6-tunnel;
container ipv6-header {
uses ipv6-header;
description
"IPv6 header.";
}
}
case mpls {
if-feature mpls-tunnel;
container mpls-header {
uses mpls-header;
description
"MPLS header.";
}
}
case gre {
if-feature gre-tunnel;
container gre-header {
uses gre-header;
description
"GRE header.";
}
}
case nvgre {
if-feature nvgre-tunnel;
container nvgre-header {
uses nvgre-header;
description description
"NvGRE header."; "An optional identifier that points
to a label operation.";
} }
} choice label-actions {
case vxlan {
if-feature vxlan-tunnel;
container vxlan-header {
uses vxlan-header;
description description
"VXLAN header."; "Label action options.";
case label-push {
container label-push {
description
"Label push operation.";
leaf label {
type uint32;
mandatory true;
description
"The label to be pushed.";
}
leaf s-bit {
type boolean;
description
"The s-bit ('Bottom of Stack' bit) of the label to be
pushed.";
}
leaf tc-value {
type uint8;
description
"The traffic class value of the label to be pushed.";
}
leaf ttl-value {
type uint8;
description
"The TTL value of the label to be pushed.";
}
}
}
case label-swap {
container label-swap {
description
"Label swap operation.";
leaf in-label {
type uint32;
mandatory true;
description
"The label to be swapped.";
}
leaf out-label {
type uint32;
mandatory true;
description
"The out MPLS label.";
}
leaf ttl-action {
type ttl-action-definition;
description
"The label TTL actions:
- No-action
- Copy to inner label
- Decrease (the in-label)
by 1 and copy to the out-label";
}
}
}
} }
} }
} }
}
grouping tunnel-decapsulation { grouping tunnel-encapsulation {
description
"Tunnel decapsulation information.";
choice tunnel-type {
description description
"Nexthop tunnel type options."; "Tunnel encapsulation information.";
case ipv4 { choice tunnel-type {
if-feature ipv4-tunnel; description
container ipv4-decapsulation { "Tunnel options for nexthops.";
description case ipv4 {
"IPv4 decapsulation."; if-feature "ipv4-tunnel";
leaf ipv4-decapsulation { container ipv4-header {
type tunnel-decapsulation-action-definition; uses ipv4-header;
mandatory true;
description description
"IPv4 decapsulation operations."; "IPv4 header.";
} }
leaf ttl-action { }
type ttl-action-definition; case ipv6 {
if-feature "ipv6-tunnel";
container ipv6-header {
uses ipv6-header;
description description
"The ttl actions: "IPv6 header.";
no-action or copy to inner header.";
} }
} }
} case mpls {
case ipv6 { if-feature "mpls-tunnel";
if-feature ipv6-tunnel; container mpls-header {
container ipv6-decapsulation { uses mpls-header;
description
"IPv6 decapsulation.";
leaf ipv6-decapsulation {
type tunnel-decapsulation-action-definition;
mandatory true;
description description
"IPv6 decapsulation operations."; "MPLS header.";
} }
leaf hop-limit-action { }
type hop-limit-action-definition; case gre {
if-feature "gre-tunnel";
container gre-header {
uses gre-header;
description description
"The hop limit actions: "GRE header.";
no-action or copy to inner header.";
} }
} }
} case nvgre {
case mpls { if-feature "nvgre-tunnel";
if-feature mpls-tunnel; container nvgre-header {
container label-pop { uses nvgre-header;
description
"MPLS decapsulation.";
leaf label-pop {
type mpls-label-action-definition;
mandatory true;
description description
"Pop a label from the label stack."; "NVGRE header.";
} }
leaf ttl-action { }
type ttl-action-definition; case vxlan {
if-feature "vxlan-tunnel";
container vxlan-header {
uses vxlan-header;
description description
"The label ttl action."; "VXLAN header.";
} }
} }
} }
} }
}
grouping route-attributes { grouping tunnel-decapsulation {
description
"Route attributes.";
leaf route-preference {
type uint32;
mandatory true;
description
"ROUTE_PREFERENCE: This is a numerical value that
allows for comparing routes from different
protocols. Static configuration is also
considered a protocol for the purpose of this
field. It is also known as administrative-distance.
The lower the value, the higher the preference.";
}
leaf local-only {
type boolean ;
mandatory true;
description
"Indicate whether the attributes is local only.";
}
container address-family-route-attributes{
description description
"Address family related route attributes."; "Tunnel decapsulation information.";
choice route-type { choice tunnel-type {
description description
"Address family related route attributes."; "Nexthop tunnel type options.";
case ip-route-attributes { case ipv4 {
if-feature "ipv4-tunnel";
container ipv4-decapsulation {
description
"IPv4 decapsulation.";
leaf ipv4-decapsulation {
type tunnel-decapsulation-action-definition;
mandatory true;
description
"IPv4 decapsulation operations.";
}
leaf ttl-action {
type ttl-action-definition;
description
"The TTL actions:
no-action or copy to inner header.";
}
}
} }
case mpls-route-attributes { case ipv6 {
if-feature "ipv6-tunnel";
container ipv6-decapsulation {
description
"IPv6 decapsulation.";
leaf ipv6-decapsulation {
type tunnel-decapsulation-action-definition;
mandatory true;
description
"IPv6 decapsulation operations.";
}
leaf hop-limit-action {
type hop-limit-action-definition;
description
"The hop limit actions:
no-action or copy to inner header.";
}
}
} }
case ethernet-route-attributes { case mpls {
if-feature "mpls-tunnel";
container label-pop {
description
"MPLS decapsulation.";
leaf label-pop {
type mpls-label-action-definition;
mandatory true;
description
"Pop a label from the label stack.";
}
leaf ttl-action {
type ttl-action-definition;
description
"The label TTL action.";
}
}
} }
} }
} }
}
container routing-instance { grouping route-attributes {
description
"A routing instance, in the context of
the RIB information model, is a collection
of RIBs, interfaces, and routing parameters";
leaf name {
type string;
description
"The name of the routing instance. This MUST
be unique across all routing instances in
a given network device.";
}
list interface-list {
key "name";
description
"This represents the list of interfaces associated
with this routing instance. The interface list helps
constrain the boundaries of packet forwarding.
Packets coming on these interfaces are directly
associated with the given routing instance. The
interface list contains a list of identifiers, with
each identifier uniquely identifying an interface.";
leaf name {
type if:interface-ref;
description
"A reference to the name of a network layer interface.";
}
}
leaf router-id {
type yang:dotted-quad;
description
"Router ID - 32-bit number in the form of a dotted quad.";
}
leaf lookup-limit {
type uint8;
description
"A limit on how many levels of a lookup can be performed.";
}
list rib-list {
key "name";
description description
"A list of RIBs that are associated with the routing "Route attributes.";
instance."; leaf route-preference {
leaf name { type uint32;
type string;
mandatory true;
description
"A reference to the name of each RIB.";
}
leaf address-family {
type address-family-definition;
mandatory true; mandatory true;
description description
"The address family of a RIB."; "ROUTE_PREFERENCE: This is a numerical value that
allows for comparing routes from different
protocols. Static configuration is also
considered a protocol for the purpose of this
field. It is also known as administrative-distance.
The lower the value, the higher the preference.";
} }
leaf ip-rpf-check { leaf local-only {
type boolean; type boolean;
mandatory true;
description description
"Each RIB can be optionally associated with a "Indicate whether the attribute is local only.";
ENABLE_IP_RPF_CHECK attribute that enables Reverse
path forwarding (RPF) checks on all IP routes in that
RIB. Reverse path forwarding (RPF) check is used to
prevent spoofing and limit malicious traffic.";
} }
list route-list { container address-family-route-attributes {
key "route-index";
description description
"A list of routes of a RIB."; "Address-family-related route attributes.";
choice route-type {
uses route; description
"Address-family-related route attributes. Future
documents should specify these attributes by augmenting
the cases in this choice.";
case ip-route-attributes {
}
case mpls-route-attributes {
}
case ethernet-route-attributes {
}
}
} }
// This is a list that maintains the nexthops added to the RIB.
uses nexthop-list;
} }
}
//RPC Operations container routing-instance {
rpc rib-add { description
description "A routing instance, in the context of
"To add a RIB to a instance"; the RIB information model, is a collection
input { of RIBs, interfaces, and routing parameters.";
leaf name { leaf name {
type string; type string;
mandatory true;
description description
"A reference to the name of the RIB "The name of the routing instance. This MUST
that is to be added."; be unique across all routing instances in
a given network device.";
} }
leaf address-family { list interface-list {
type address-family-definition; key "name";
mandatory true;
description description
"The address family of the RIB."; "This represents the list of interfaces associated
with this routing instance. The interface list helps
constrain the boundaries of packet forwarding.
Packets coming on these interfaces are directly
associated with the given routing instance. The
interface list contains a list of identifiers with
each identifier uniquely identifying an interface.";
leaf name {
type if:interface-ref;
description
"A reference to the name of a network-layer interface.";
}
} }
leaf ip-rpf-check { leaf router-id {
type boolean; type yang:dotted-quad;
description description
"Each RIB can be optionally associated with a "Router ID: The 32-bit number in the form of a dotted quad.";
ENABLE_IP_RPF_CHECK attribute that enables Reverse
path forwarding (RPF) checks on all IP routes in that
RIB. Reverse path forwarding (RPF) check is used to
prevent spoofing and limit malicious traffic.";
} }
} leaf lookup-limit {
output { type uint8;
leaf result {
type boolean;
mandatory true;
description description
"Return the result of the rib-add operation. "A limit on how many levels of a lookup can be performed.";
true - success;
false - failed";
} }
leaf reason { list rib-list {
type string; key "name";
description description
"The specific reason that caused the failure."; "A list of RIBs that are associated with the routing
instance.";
leaf name {
type string;
mandatory true;
description
"A reference to the name of each RIB.";
}
leaf address-family {
type address-family-definition;
mandatory true;
description
"The address family of a RIB.";
}
leaf ip-rpf-check {
type boolean;
description
"Each RIB can be optionally associated with a
ENABLE_IP_RPF_CHECK attribute that enables Reverse
Path Forwarding (RPF) checks on all IP routes in that
RIB. An RPF check is used to
prevent spoofing and limit malicious traffic.";
}
list route-list {
key "route-index";
description
"A list of routes of a RIB.";
uses route;
}
// This is a list that maintains the nexthops added to the RIB.
uses nexthop-list;
} }
} }
}
rpc rib-delete { //RPC Operations
description
"To delete a RIB from a routing instance. rpc rib-add {
After deleting the RIB, all routes installed description
in the RIB will be deleted as well."; "To add a RIB to an instance";
input { input {
leaf name { leaf name {
type string; type string;
mandatory true; mandatory true;
description description
"A reference to the name of the RIB "A reference to the name of the RIB
that is to be deleted."; that is to be added.";
} }
} leaf address-family {
output { type address-family-definition;
leaf result { mandatory true;
type boolean; description
mandatory true; "The address family of the RIB.";
description }
"Return the result of the rib-delete operation. leaf ip-rpf-check {
true - success; type boolean;
false - failed"; description
"Each RIB can be optionally associated with an
ENABLE_IP_RPF_CHECK attribute that enables
RPF checks on all IP routes in that
RIB. An RPF check is used to
prevent spoofing and limit malicious traffic.";
}
} }
leaf reason { output {
type string; leaf result {
description type boolean;
"The specific reason that caused failure."; mandatory true;
description
"Return the result of the rib-add operation.
true - success;
false - failed";
}
leaf reason {
type string;
description
"The specific reason that caused the failure.";
}
} }
} }
}
grouping route-operation-state { rpc rib-delete {
description
"Route operation state.";
leaf success-count {
type uint32;
mandatory true;
description
"The numbers of routes that are successfully
added/deleted/updated.";
}
leaf failed-count {
type uint32;
mandatory true;
description
"The numbers of the routes that are failed
to be added/deleted/updated.";
}
container failure-detail {
description description
"The failure detail reflects the reason why a route "To delete a RIB from a routing instance.
operation fails. It is a array that includes the route After deleting the RIB, all routes installed
index and error code of the failed route."; in the RIB will be deleted as well.";
list failed-routes { input {
key "route-index"; leaf name {
description type string;
"The list of failed routes."; mandatory true;
leaf route-index {
type uint32;
description description
"The route index of the failed route."; "A reference to the name of the RIB
that is to be deleted.";
} }
leaf error-code { }
type uint32; output {
leaf result {
type boolean;
mandatory true;
description description
"The error code that reflects the failure reason. "Return the result of the rib-delete operation.
0 - Reserved. true - success;
1 - Trying to add a repeat route; false - failed";
2 - Trying to delete or update a route that is not exist; }
3 - Malformed route attribute; leaf reason {
"; type string;
description
"The specific reason that caused failure.";
} }
} }
} }
}
rpc route-add { grouping route-operation-state {
description description
"To add a route or a list of route to a RIB"; "Route operation state.";
input { leaf success-count {
leaf return-failure-detail { type uint32;
type boolean; mandatory true;
default false;
description description
"Whether return the failure detail. "The numbers of routes that are successfully
true - return the failure detail; added/deleted/updated.";
false - do not return the failure detail;
the default is false.";
} }
leaf rib-name { leaf failed-count {
type string; type uint32;
mandatory true; mandatory true;
description description
"A reference to the name of a RIB."; "The numbers of the routes that fail
to be added/deleted/updated.";
} }
container routes { container failure-detail {
description description
"The routes to be added to the RIB."; "The failure detail reflects the reason why a route
list route-list { operation fails. It is an array that includes the route
index and error code of the failed route.";
list failed-routes {
key "route-index"; key "route-index";
description description
"The list of routes to be added."; "The list of failed routes.";
uses route-prefix; leaf route-index {
container route-attributes { type uint32;
uses route-attributes;
description
"The route attributes.";
}
container route-vendor-attributes {
if-feature route-vendor-attributes;
uses route-vendor-attributes;
description description
"The route vendor attributes."; "The route index of the failed route.";
} }
container nexthop { leaf error-code {
uses nexthop; type uint32;
description description
"The nexthop of the added route."; "The error code that reflects the failure reason.
0 - Reserved
1 - Trying to add a repeat route
2 - Trying to delete or update a route that does not
exist
3 - Malformed route attributes";
} }
} }
} }
} }
output {
uses route-operation-state;
}
}
rpc route-delete { rpc route-add {
description description
"To delete a route or a list of route from a RIB"; "To add a route or a list of routes to a RIB";
input { input {
leaf return-failure-detail { leaf return-failure-detail {
type boolean; type boolean;
default false; default "false";
description
"Whether return the failure detail.
true - return the failure detail;
false - do not return the failure detail;
the default is false.";
}
leaf rib-name {
type string;
mandatory true;
description
"A reference to the name of a RIB.";
}
container routes {
description
"The routes to be added to the RIB.";
list route-list{
key "route-index";
description description
"The list of routes to be deleted."; "Whether to return the failure detail.
uses route-prefix; true - return the failure detail
false - do not return the failure detail
The default is false.";
}
leaf rib-name {
type string;
mandatory true;
description
"A reference to the name of a RIB.";
}
container routes {
description
"The routes to be added to the RIB.";
list route-list {
key "route-index";
description
"The list of routes to be added.";
uses route-prefix;
container route-attributes {
uses route-attributes;
description
"The route attributes.";
}
container route-vendor-attributes {
if-feature "route-vendor-attributes";
uses route-vendor-attributes;
description
"The route vendor attributes.";
}
container nexthop {
uses nexthop;
description
"The nexthop of the added route.";
}
}
} }
} }
output {
uses route-operation-state;
}
} }
output {
uses route-operation-state;
}
}
grouping route-update-options { rpc route-delete {
description
"Update options:
1. update the nexthop
2. update the route attributes
3. update the route-vendor-attributes.";
choice update-options {
description description
"Update options: "To delete a route or a list of routes from a RIB";
1. update the nexthop input {
2. update the route attributes leaf return-failure-detail {
3. update the route-vendor-attributes."; type boolean;
case update-nexthop { default "false";
container updated-nexthop {
uses nexthop;
description description
"The nexthop used for updating."; "Whether to return the failure detail.
true - return the failure detail
false - do not return the failure detail
The default is false.";
} }
} leaf rib-name {
case update-route-attributes { type string;
container updated-route-attr { mandatory true;
uses route-attributes;
description description
"The route attributes used for updating."; "A reference to the name of a RIB.";
} }
} container routes {
case update-route-vendor-attributes {
container updated-route-vendor-attr {
uses route-vendor-attributes;
description description
"The vendor route attributes used for updating."; "The routes to be added to the RIB.";
list route-list {
key "route-index";
description
"The list of routes to be deleted.";
uses route-prefix;
}
} }
} }
output {
uses route-operation-state;
}
} }
} grouping route-update-options {
description
rpc route-update { "Update options:
description
"To update a route or a list of route of a RIB.
The inputs:
1. The match conditions, could be:
a. route prefix, or
b. route attributes, or
c. nexthop;
2. The update parameters to be used:
a. new nexthop;
b. new route attributes;nexthop
Actions:
1. update the nexthop 1. update the nexthop
2. update the route attributes 2. update the route attributes
The outputs: 3. update the route-vendor-attributes";
success-count - the number of routes updated; choice update-options {
failed-count - the number of routes fail to update
failure-detail - the detail failure info.
";
input {
leaf return-failure-detail {
type boolean;
default false;
description
"Whether return the failure detail.
true - return the failure detail;
false - do not return the failure detail;
the default is false.";
}
leaf rib-name {
type string;
mandatory true;
description
"A reference to the name of a RIB.";
}
choice match-options {
description description
"Match options."; "Update options:
1. update the nexthop
case match-route-prefix { 2. update the route attributes
description 3. update the route-vendor-attributes";
"Update the routes that match route case update-nexthop {
prefix(es) condition."; container updated-nexthop {
container input-routes { uses nexthop;
description description
"The matched routes to be updated."; "The nexthop used for updating.";
list route-list {
key "route-index";
description
"The list of routes to be updated.";
uses route-prefix;
uses route-update-options;
}
} }
} }
case match-route-attributes { case update-route-attributes {
description container updated-route-attr {
"Update the routes that match the
route attributes condition.";
container input-route-attributes {
description
"The route attributes are used for matching.";
uses route-attributes; uses route-attributes;
description
"The route attributes used for updating.";
} }
container update-parametors { }
case update-route-vendor-attributes {
container updated-route-vendor-attr {
uses route-vendor-attributes;
description description
"Update options: "The vendor route attributes used for updating.";
1. update the nexthop
2. update the route attributes
3. update the route-vendor-attributes.";
uses route-update-options;
} }
} }
case match-route-vendor-attributes { }
if-feature route-vendor-attributes; }
rpc route-update {
description
"To update a route or a list of routes of a RIB.
The inputs:
1. The match conditions, which could be:
a. route prefix,
b. route attributes, or
c. nexthop.
2. The update parameters to be used:
a. new nexthop,
b. new route attributes, or
c. nexthop.
Actions:
1. update the nexthop
2. update the route attributes
The outputs:
success-count - the number of routes updated
failed-count - the number of routes fail to update
failure-detail - the detail failure info
";
input {
leaf return-failure-detail {
type boolean;
default "false";
description description
"Update the routes that match the "Whether to return the failure detail.
vendor attributes condition"; true - return the failure detail
container input-route-vendor-attributes { false - do not return the failure detail
The default is false.";
}
leaf rib-name {
type string;
mandatory true;
description
"A reference to the name of a RIB.";
}
choice match-options {
description
"Match options.";
case match-route-prefix {
description description
"The vendor route attributes are used for matching."; "Update the routes that match the route
uses route-vendor-attributes; prefix(es) condition.";
container input-routes {
description
"The matched routes to be updated.";
list route-list {
key "route-index";
description
"The list of routes to be updated.";
uses route-prefix;
uses route-update-options;
}
}
} }
container update-parameters-vendor { case match-route-attributes {
description description
"Update options: "Update the routes that match the
1. update the nexthop route attributes condition.";
2. update the route attributes container input-route-attributes {
3. update the route-vendor-attributes."; description
uses route-update-options; "The route attributes are used for matching.";
uses route-attributes;
}
container update-parameters {
description
"Update options:
1. update the nexthop
2. update the route attributes
3. update the route-vendor-attributes";
uses route-update-options;
}
} }
} case match-route-vendor-attributes {
case match-nexthop { if-feature "route-vendor-attributes";
description
"Update the routes that match the nexthop.";
container input-nexthop {
description description
"The nexthop used for matching."; "Update the routes that match the
uses nexthop; vendor attributes condition";
container input-route-vendor-attributes {
description
"The vendor route attributes are used for matching.";
uses route-vendor-attributes;
}
container update-parameters-vendor {
description
"Update options:
1. update the nexthop
2. update the route attributes
3. update the route-vendor-attributes";
uses route-update-options;
}
} }
container update-parameters-nexthop { case match-nexthop {
description description
"Update options: "Update the routes that match the nexthop.";
1. update the nexthop container input-nexthop {
2. update the route attributes description
3. update the route-vendor-attributes."; "The nexthop used for matching.";
uses route-update-options; uses nexthop;
}
container update-parameters-nexthop {
description
"Update options:
1. update the nexthop
2. update the route attributes
3. update the route-vendor-attributes";
uses route-update-options;
}
} }
} }
} }
output {
uses route-operation-state;
}
} }
output { rpc nh-add {
uses route-operation-state; description
} "To add a nexthop to a RIB.
} Inputs parameters:
1. rib-name
rpc nh-add { 2. nexthop
description Actions:
"To add a nexthop to a RIB. Add the nexthop to the RIB
Inputs parameters: Outputs:
1. RIB name 1. Operation result:
2. nexthop; true - success
Actions: false - failed
Add the nexthop to the RIB 2. nexthop identifier";
Outputs: input {
1.Operation result: leaf rib-name {
true - success type string;
false - failed; mandatory true;
2. nexthop identifier."; description
input { "A reference to the name of a RIB.";
leaf rib-name { }
type string; uses nexthop;
mandatory true; }
description output {
"A reference to the name of a RIB."; leaf result {
type boolean;
mandatory true;
description
"Return the result of the rib-add operation:
true - success
false - failed";
}
leaf reason {
type string;
description
"The specific reason that caused the failure.";
}
leaf nexthop-id {
type uint32;
description
"A nexthop identifier that is allocated to the nexthop.";
}
} }
uses nexthop;
} }
output {
leaf result { rpc nh-delete {
type boolean; description
mandatory true; "To delete a nexthop from a RIB";
description input {
"Return the result of the rib-add operation. leaf rib-name {
true - success; type string;
false - failed;"; mandatory true;
description
"A reference to the name of a RIB.";
}
uses nexthop;
} }
leaf reason { output {
type string; leaf result {
type boolean;
mandatory true;
description
"Return the result of the rib-add operation:
true - success;
false - failed";
}
leaf reason {
type string;
description
"The specific reason that caused the failure.";
}
}
}
//Notifications
notification nexthop-resolution-status-change {
description
"Nexthop resolution status (resolved/unresolved)
notification.";
container nexthop {
description description
"The specific reason that caused the failure."; "The nexthop.";
uses nexthop;
} }
leaf nexthop-id { leaf nexthop-state {
type uint32; type nexthop-state-definition;
mandatory true;
description description
"A nexthop identifier that is allocated to the nexthop."; "Nexthop resolution status (resolved/unresolved)
notification.";
} }
} }
}
rpc nh-delete { notification route-change {
description description
"To delete a nexthop from a RIB"; "Route change notification.";
input {
leaf rib-name { leaf rib-name {
type string; type string;
mandatory true; mandatory true;
description description
"A reference to the name of a RIB."; "A reference to the name of a RIB.";
} }
uses nexthop; leaf address-family {
} type address-family-definition;
output {
leaf result {
type boolean;
mandatory true; mandatory true;
description description
"Return the result of the rib-add operation. "The address family of a RIB.";
true - success;
false - failed.";
} }
leaf reason { uses route-prefix;
type string; leaf route-installed-state {
type route-installed-state-definition;
mandatory true;
description description
"The specific reason that caused the failure."; "Indicates whether the route got installed in the FIB.";
} }
} leaf route-state {
} type route-state-definition;
/*Notifications*/
notification nexthop-resolution-status-change {
description
"Nexthop resolution status (resolved/unresolved)
notification.";
container nexthop{
description
"The nexthop.";
uses nexthop;
}
leaf nexthop-state {
type nexthop-state-definition;
mandatory true;
description
"Nexthop resolution status (resolved/unresolved)
notification.";
}
}
notification route-change {
description
"Route change notification.";
leaf rib-name {
type string;
mandatory true;
description
"A reference to the name of a RIB.";
}
leaf address-family {
type address-family-definition;
mandatory true;
description
"The address family of a RIB.";
}
uses route-prefix;
leaf route-installed-state {
type route-installed-state-definition;
mandatory true;
description
"Indicates whether the route got installed in the FIB.";
}
leaf route-state {
type route-state-definition;
mandatory true;
description
"Indicates whether a route is active or inactive.";
}
list route-change-reasons {
key "route-change-reason";
description
"The reasons that cause the route change. A route
change that may result from several reasons. For
example, a nexthop becoming resolved will make a
route A active which is of better preference than
a currently active route B, which results in the
route A being installed";
leaf route-change-reason {
type route-change-reason-definition;
mandatory true; mandatory true;
description description
"The reason that caused the route change."; "Indicates whether a route is active or inactive.";
}
list route-change-reasons {
key "route-change-reason";
description
"The reasons that cause the route change. A route
change may result from several reasons; for
example, a nexthop becoming resolved will make a
route A active, which is of better preference than
a currently active route B, which results in the
route A being installed";
leaf route-change-reason {
type route-change-reason-definition;
mandatory true;
description
"The reason that caused the route change.";
}
} }
} }
} }
}
<CODE ENDS> <CODE ENDS>
4. IANA Considerations 4. IANA Considerations
This document registers a URI in the "ns" registry with the "IETF XML This document registers a URI in the "ns" registry within the "IETF
registry" [RFC3688]: XML Registry" [RFC3688]:
-------------------------------------------------------------------- -------------------------------------------------------------------
URI: urn:ietf:params:xml:ns:yang:ietf-i2rs-rib URI: urn:ietf:params:xml:ns:yang:ietf-i2rs-rib
Registrant Contact: The IESG. Registrant Contact: The IESG.
XML: N/A, the requested URI is an XML namespace. XML: N/A, the requested URI is an XML namespace.
-------------------------------------------------------------------- -------------------------------------------------------------------
This document requests to register a YANG module in the "YANG Module This document registers a YANG module in the "YANG Module Names"
Names registry" [RFC7950]: registry [RFC7950]:
-------------------------------------------------------------------- -------------------------------------------------------------------
name: ietf-i2rs-rib name: ietf-i2rs-rib
namespace: urn:ietf:params:xml:ns:yang:ietf-i2rs-rib namespace: urn:ietf:params:xml:ns:yang:ietf-i2rs-rib
prefix: iir prefix: iir
reference: RFC XXXX reference: RFC 8431
-------------------------------------------------------------------- -------------------------------------------------------------------
5. Security Considerations 5. Security Considerations
The YANG module specified in this document defines a schema for data The YANG module specified in this document defines a schema for data
that is designed to be accessed via network management protocols such that is designed to be accessed via network management protocols such
as NETCONF [RFC6241] or RESTCONF [RFC8040]. The lowest NETCONF layer as NETCONF [RFC6241] or RESTCONF [RFC8040]. The lowest NETCONF layer
is the secure transport layer, and the mandatory-to-implement secure is the secure transport layer, and the mandatory-to-implement secure
transport is Secure Shell (SSH) [RFC6242]. The lowest RESTCONF layer transport is Secure Shell (SSH) [RFC6242]. The lowest RESTCONF layer
is HTTPS, and the mandatory-to-implement secure transport is TLS is HTTPS, and the mandatory-to-implement secure transport is TLS
[RFC5246]. [RFC8446].
The NETCONF access control model [RFC8341] provides the means to The NETCONF access control model [RFC8341] provides the means to
restrict access for particular NETCONF or RESTCONF users to a restrict access for particular NETCONF or RESTCONF users to a
preconfigured subset of all available NETCONF or RESTCONF protocol preconfigured subset of all available NETCONF or RESTCONF protocol
operations and content. operations and content.
The YANG modules define information that can be configurable in The YANG module defines information that can be configurable in
certain instances, for example, a RIB, a route, a nexthop can be certain instances, for example, a RIB, a route, a nexthop can be
created or deleted by client applications, the YANG modules also created or deleted by client applications; the YANG module also
define RPCs that can be used by client applications to add/delete defines RPCs that can be used by client applications to add/delete
RIBs, routes and nexthops. In such cases, a malicious client could RIBs, routes, and nexthops. In such cases, a malicious client could
attempt to remove, add or update a RIB, a route, a nexthop, by attempt to remove, add, or update a RIB, a route, or a nexthop by
creating or deleting corresponding elements in the RIB, route and creating or deleting corresponding elements in the RIB, route, and
nexthop lists, respectively. Removing a RIB or a route could lead to nexthop lists, respectively. Removing a RIB or a route could lead to
disruption or impact in performance of a service, updating a route disruption or impact in performance of a service; updating a route
may lead to suboptimal path and degradation of service levels as well may lead to suboptimal path and degradation of service levels as well
as possibly disruption of service. For those reasons, it is as possibly disruption of service. For those reasons, it is
important that the NETCONF access control model is vigorously applied important that the NETCONF access control model is vigorously applied
to prevent misconfiguration by unauthorized clients. to prevent misconfiguration by unauthorized clients.
There are a number of data nodes defined in this YANG module that are There are a number of data nodes defined in this YANG module that are
writable/creatable/deletable (i.e., config true, which is the writable/creatable/deletable (i.e., config true, 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 (e.g., edit-config) in some network environments. Write operations (e.g., edit-config)
to these data nodes without proper protection can have a negative to these data nodes without proper protection can have a negative
effect on network operations. These are the subtrees and data nodes effect on network operations. These are the subtrees and data nodes
and their sensitivity/vulnerability in the ietf-i2rs-rib module: and their sensitivity/vulnerability:
o RIB: A malicious client could attempt to remove a RIB from a o RIB: A malicious client could attempt to remove a RIB from a
routing instance, for example in order to sabotage the services routing instance, for example, in order to sabotage the services
provided by the RIB, or to add a RIB to a routing instance, hence provided by the RIB or to add a RIB to a routing instance (hence,
to inject unauthorized traffic into the nexthop. to inject unauthorized traffic into the nexthop).
o route:A malicious client could attempt to remove or add a route o route: A malicious client could attempt to remove or add a route
from/to a RIB, for example in order to sabotage the services from/to a RIB, for example, in order to sabotage the services
provided by the RIB. provided by the RIB.
o nexthop: A malicious client could attempt to remove or add a o nexthop: A malicious client could attempt to remove or add a
nexthop from/to RIB, which may lead to suboptimal path and nexthop from/to RIB, which may lead to a suboptimal path, a
degradation of service levels as well as possibly disruption of degradation of service levels, and a possible disruption of
service. service.
6. Contributors 6. References
The following individuals also contribute to this document.
o Zekun He, Tencent Holdings Ltd
o Sujian Lu, Tencent Holdings Ltd
o Jeffery Zhang, Juniper Networks
7. Acknowledgements
The authors would like to thank Chris Bowers, John Scudder, Tom
Petch, Mike McBride and Ebben Aries for his review, suggestion and
comments to this document.
8. References
8.1. Normative References
[I-D.ietf-i2rs-rib-info-model] 6.1. Normative References
Bahadur, N., Kini, S., and J. Medved, "Routing Information
Base Info Model", draft-ietf-i2rs-rib-info-model-17 (work
in progress), May 2018.
[RFC2119] Bradner, S., "Key words for use in RFCs to Indicate [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate
Requirement Levels", BCP 14, RFC 2119, Requirement Levels", BCP 14, RFC 2119,
DOI 10.17487/RFC2119, March 1997, DOI 10.17487/RFC2119, March 1997,
<https://www.rfc-editor.org/info/rfc2119>. <https://www.rfc-editor.org/info/rfc2119>.
[RFC3688] Mealling, M., "The IETF XML Registry", BCP 81, RFC 3688, [RFC3688] Mealling, M., "The IETF XML Registry", BCP 81, RFC 3688,
DOI 10.17487/RFC3688, January 2004, DOI 10.17487/RFC3688, January 2004,
<https://www.rfc-editor.org/info/rfc3688>. <https://www.rfc-editor.org/info/rfc3688>.
[RFC5246] Dierks, T. and E. Rescorla, "The Transport Layer Security
(TLS) Protocol Version 1.2", RFC 5246,
DOI 10.17487/RFC5246, August 2008,
<https://www.rfc-editor.org/info/rfc5246>.
[RFC6241] Enns, R., Ed., Bjorklund, M., Ed., Schoenwaelder, J., Ed., [RFC6241] Enns, R., Ed., Bjorklund, M., Ed., Schoenwaelder, J., Ed.,
and A. Bierman, Ed., "Network Configuration Protocol and A. Bierman, Ed., "Network Configuration Protocol
(NETCONF)", RFC 6241, DOI 10.17487/RFC6241, June 2011, (NETCONF)", RFC 6241, DOI 10.17487/RFC6241, June 2011,
<https://www.rfc-editor.org/info/rfc6241>. <https://www.rfc-editor.org/info/rfc6241>.
[RFC6242] Wasserman, M., "Using the NETCONF Protocol over Secure [RFC6242] Wasserman, M., "Using the NETCONF Protocol over Secure
Shell (SSH)", RFC 6242, DOI 10.17487/RFC6242, June 2011, Shell (SSH)", RFC 6242, DOI 10.17487/RFC6242, June 2011,
<https://www.rfc-editor.org/info/rfc6242>. <https://www.rfc-editor.org/info/rfc6242>.
[RFC6991] Schoenwaelder, J., Ed., "Common YANG Data Types", [RFC6991] Schoenwaelder, J., Ed., "Common YANG Data Types",
skipping to change at page 67, line 34 skipping to change at page 69, line 34
[RFC8341] Bierman, A. and M. Bjorklund, "Network Configuration [RFC8341] Bierman, A. and M. Bjorklund, "Network Configuration
Access Control Model", STD 91, RFC 8341, Access Control Model", STD 91, RFC 8341,
DOI 10.17487/RFC8341, March 2018, DOI 10.17487/RFC8341, March 2018,
<https://www.rfc-editor.org/info/rfc8341>. <https://www.rfc-editor.org/info/rfc8341>.
[RFC8344] Bjorklund, M., "A YANG Data Model for IP Management", [RFC8344] Bjorklund, M., "A YANG Data Model for IP Management",
RFC 8344, DOI 10.17487/RFC8344, March 2018, RFC 8344, DOI 10.17487/RFC8344, March 2018,
<https://www.rfc-editor.org/info/rfc8344>. <https://www.rfc-editor.org/info/rfc8344>.
8.2. Informative References [RFC8430] Bahadur, N., Ed., Kini, S., Ed., and J. Medved, "RIB
Information Model", RFC 8430, DOI 10.17487/RFC8430,
September 2018, <http://www.rfc-editor.org/info/rfc8430>.
[I-D.ietf-i2rs-usecase-reqs-summary] [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>.
6.2. Informative References
[I2RS-REQS]
Hares, S. and M. Chen, "Summary of I2RS Use Case Hares, S. and M. Chen, "Summary of I2RS Use Case
Requirements", draft-ietf-i2rs-usecase-reqs-summary-03 Requirements", Work in Progress, draft-ietf-i2rs-usecase-
(work in progress), November 2016. reqs-summary-03, November 2016.
[RFC2784] Farinacci, D., Li, T., Hanks, S., Meyer, D., and P. [RFC2784] Farinacci, D., Li, T., Hanks, S., Meyer, D., and P.
Traina, "Generic Routing Encapsulation (GRE)", RFC 2784, Traina, "Generic Routing Encapsulation (GRE)", RFC 2784,
DOI 10.17487/RFC2784, March 2000, DOI 10.17487/RFC2784, March 2000,
<https://www.rfc-editor.org/info/rfc2784>. <https://www.rfc-editor.org/info/rfc2784>.
[RFC7348] Mahalingam, M., Dutt, D., Duda, K., Agarwal, P., Kreeger, [RFC7348] Mahalingam, M., Dutt, D., Duda, K., Agarwal, P., Kreeger,
L., Sridhar, T., Bursell, M., and C. Wright, "Virtual L., Sridhar, T., Bursell, M., and C. Wright, "Virtual
eXtensible Local Area Network (VXLAN): A Framework for eXtensible Local Area Network (VXLAN): A Framework for
Overlaying Virtualized Layer 2 Networks over Layer 3 Overlaying Virtualized Layer 2 Networks over Layer 3
skipping to change at page 68, line 19 skipping to change at page 70, line 26
[RFC7921] Atlas, A., Halpern, J., Hares, S., Ward, D., and T. [RFC7921] Atlas, A., Halpern, J., Hares, S., Ward, D., and T.
Nadeau, "An Architecture for the Interface to the Routing Nadeau, "An Architecture for the Interface to the Routing
System", RFC 7921, DOI 10.17487/RFC7921, June 2016, System", RFC 7921, DOI 10.17487/RFC7921, June 2016,
<https://www.rfc-editor.org/info/rfc7921>. <https://www.rfc-editor.org/info/rfc7921>.
[RFC8340] Bjorklund, M. and L. Berger, Ed., "YANG Tree Diagrams", [RFC8340] Bjorklund, M. and L. Berger, Ed., "YANG Tree Diagrams",
BCP 215, RFC 8340, DOI 10.17487/RFC8340, March 2018, BCP 215, RFC 8340, DOI 10.17487/RFC8340, March 2018,
<https://www.rfc-editor.org/info/rfc8340>. <https://www.rfc-editor.org/info/rfc8340>.
Acknowledgements
The authors would like to thank Chris Bowers, John Scudder, Tom
Petch, Mike McBride, and Ebben Aries for their review, suggestions,
and comments to this document.
Contributors
The following individuals also contributed to this document.
o Zekun He, Tencent Holdings Ltd.
o Sujian Lu, Tencent Holdings Ltd.
o Jeffery Zhang, Juniper Networks
Authors' Addresses Authors' Addresses
Lixing Wang Lixing Wang
Individual Individual
Email: wang_little_star@sina.com Email: wang_little_star@sina.com
Mach(Guoyi) Chen Mach(Guoyi) Chen
Huawei Huawei
Email: mach.chen@huawei.com Email: mach.chen@huawei.com
Amit Dass Amit Dass
Ericsson Ericsson
Email: amit.dass@ericsson.com Email: dass.amit@gmail.com
Hariharan Ananthakrishnan Hariharan Ananthakrishnan
Packet Design Netflix
Email: hari@packetdesign.com Email: hari@netflix.com
Sriganesh Kini Sriganesh Kini
Individual Individual
Email: sriganeshkini@gmail.com Email: sriganeshkini@gmail.com
Nitin Bahadur Nitin Bahadur
Bracket Computing Uber
Email: nitin_bahadur@yahoo.com Email: nitin_bahadur@yahoo.com
 End of changes. 448 change blocks. 
1979 lines changed or deleted 2021 lines changed or added

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