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/ |