draft-ietf-i2rs-rib-data-model-02.txt   draft-ietf-i2rs-rib-data-model-03.txt 
Network Working Group L. Wang Network Working Group L. Wang
Internet-Draft Individual Internet-Draft Individual
Intended status: Standards Track H. Ananthakrishnan Intended status: Standards Track H. Ananthakrishnan
Expires: April 20, 2016 Packet Design Expires: May 4, 2016 Packet Design
M. Chen M. Chen
Huawei Huawei
A. Dass A. Dass
S. Kini S. Kini
Ericsson Ericsson
N. Bahadur N. Bahadur
Bracket Computing Bracket Computing
October 18, 2015 November 1, 2015
A YANG Data Model for Routing Information Base (RIB) A YANG Data Model for Routing Information Base (RIB)
draft-ietf-i2rs-rib-data-model-02 draft-ietf-i2rs-rib-data-model-03
Abstract Abstract
This document defines a YANG data model for Routing Information Base This document defines a YANG data model for Routing Information Base
(RIB) that aligns with the I2RS RIB information model. (RIB) that aligns with the I2RS RIB information model.
Requirements Language Requirements Language
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
"SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
skipping to change at page 1, line 45 skipping to change at page 1, line 45
Internet-Drafts are working documents of the Internet Engineering Internet-Drafts are working documents of the Internet Engineering
Task Force (IETF). Note that other groups may also distribute Task Force (IETF). Note that other groups may also distribute
working documents as Internet-Drafts. The list of current Internet- working documents as Internet-Drafts. The list of current Internet-
Drafts is at http://datatracker.ietf.org/drafts/current/. Drafts is at http://datatracker.ietf.org/drafts/current/.
Internet-Drafts are draft documents valid for a maximum of six months Internet-Drafts are draft documents valid for a maximum of six months
and may be updated, replaced, or obsoleted by other documents at any and may be updated, replaced, or obsoleted by other documents at any
time. It is inappropriate to use Internet-Drafts as reference time. It is inappropriate to use Internet-Drafts as reference
material or to cite them other than as "work in progress." material or to cite them other than as "work in progress."
This Internet-Draft will expire on April 20, 2016. This Internet-Draft will expire on May 4, 2016.
Copyright Notice Copyright Notice
Copyright (c) 2015 IETF Trust and the persons identified as the Copyright (c) 2015 IETF Trust and the persons identified as the
document authors. All rights reserved. document authors. All rights reserved.
This document is subject to BCP 78 and the IETF Trust's Legal This document is subject to BCP 78 and the IETF Trust's Legal
Provisions Relating to IETF Documents Provisions Relating to IETF Documents
(http://trustee.ietf.org/license-info) in effect on the date of (http://trustee.ietf.org/license-info) in effect on the date of
publication of this document. Please review these documents publication of this document. Please review these documents
skipping to change at page 2, line 30 skipping to change at page 2, line 30
Table of Contents Table of Contents
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 2 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 2
1.1. Definitions and Acronyms . . . . . . . . . . . . . . . . 3 1.1. Definitions and Acronyms . . . . . . . . . . . . . . . . 3
1.2. Tree Diagrams . . . . . . . . . . . . . . . . . . . . . . 3 1.2. Tree Diagrams . . . . . . . . . . . . . . . . . . . . . . 3
2. Model Structure . . . . . . . . . . . . . . . . . . . . . . . 3 2. Model Structure . . . . . . . . . . . . . . . . . . . . . . . 3
2.1. RIB Capability . . . . . . . . . . . . . . . . . . . . . 7 2.1. RIB Capability . . . . . . . . . . . . . . . . . . . . . 7
2.2. Routing Instance and Rib . . . . . . . . . . . . . . . . 7 2.2. Routing Instance and Rib . . . . . . . . . . . . . . . . 7
2.3. Route . . . . . . . . . . . . . . . . . . . . . . . . . . 8 2.3. Route . . . . . . . . . . . . . . . . . . . . . . . . . . 8
2.4. Nexthop . . . . . . . . . . . . . . . . . . . . . . . . . 9 2.4. Nexthop . . . . . . . . . . . . . . . . . . . . . . . . . 9
2.5. RPC Operations . . . . . . . . . . . . . . . . . . . . . 14 2.5. RPC Operations . . . . . . . . . . . . . . . . . . . . . 13
2.6. Notifications . . . . . . . . . . . . . . . . . . . . . . 16 2.6. Notifications . . . . . . . . . . . . . . . . . . . . . . 16
3. YANG Modules . . . . . . . . . . . . . . . . . . . . . . . . 18 3. YANG Modules . . . . . . . . . . . . . . . . . . . . . . . . 17
4. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 58 4. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 59
5. Security Considerations . . . . . . . . . . . . . . . . . . . 58 5. Security Considerations . . . . . . . . . . . . . . . . . . . 59
6. Contributors . . . . . . . . . . . . . . . . . . . . . . . . 58 6. Contributors . . . . . . . . . . . . . . . . . . . . . . . . 59
7. References . . . . . . . . . . . . . . . . . . . . . . . . . 59 7. References . . . . . . . . . . . . . . . . . . . . . . . . . 60
7.1. Normative References . . . . . . . . . . . . . . . . . . 59 7.1. Normative References . . . . . . . . . . . . . . . . . . 60
7.2. Informative References . . . . . . . . . . . . . . . . . 59 7.2. Informative References . . . . . . . . . . . . . . . . . 60
Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 59 Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 60
1. Introduction 1. Introduction
The Interface to the Routing System (I2RS) The Interface to the Routing System (I2RS)
[I-D.ietf-i2rs-architecture] provides read and write access to the [I-D.ietf-i2rs-architecture] provides read and write access to the
information and state within the routing process that exists inside information and state within the routing process that exists inside
the routing elements, this is achieved via the protocol message the routing elements, this is achieved via the protocol message
exchange between I2RS clients and I2RS agents associated with the exchange between I2RS clients and I2RS agents associated with the
routing system. One of the functions of I2RS is to read and write routing system. One of the functions of I2RS is to read and write
data of Routing Information Base (RIB). data of Routing Information Base (RIB).
skipping to change at page 3, line 43 skipping to change at page 3, line 43
o Ellipsis ("...") stands for contents of subtrees that are not o Ellipsis ("...") stands for contents of subtrees that are not
shown. shown.
2. Model Structure 2. Model Structure
The following figure shows an overview of structure tree of the i2rs- The following figure shows an overview of structure tree of the i2rs-
rib module. To give a whole view of the structure tree, some details rib module. To give a whole view of the structure tree, some details
of the tree are omitted. The detail are introduced in the following of the tree are omitted. The detail are introduced in the following
sub-sections. sub-sections.
module: 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
+--rw rib-family rib-family-def +--rw rib-family rib-family-def
+--rw enable-ip-rpf-check? boolean +--rw ip-rpf-check? boolean
+--rw route-list* [route-index] +--rw route-list* [route-index]
+--rw route-index uint64 +--rw route-index uint64
+--rw route-type route-type-def +--rw match
+--rw match | +--rw (route-type)?
| +--rw (rib-route-type)? | +--:(ipv4)
| +--:(ipv4) | | ...
| | ... | +--:(ipv6)
| +--:(ipv6) | | ...
| | ... | +--:(mpls-route)
| +--:(mpls-route) | | ...
| | ... | +--:(mac-route)
| +--:(mac-route) | | ...
| | ... | +--:(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-protection) {nexthop-protection}? | | ...
| | ... | +--:(nexthop-protection) {nexthop-protection}?
| +--:(nexthop-load-balance) {nexthop-load-balance}? | | ...
| | ... | +--:(nexthop-load-balance) {nexthop-load-balance}?
| +--:(nexthop-replicates) {nexthop-replicates}? | ...
| ... +--rw route-statistic
+--rw route-statistic | ...
| ... +--rw route-attributes
+--rw route-attributes | ...
| ... +--rw route-vendor-attributes
+--rw route-vendor-attributes rpcs:
rpcs: +---x rib-add
+---x rib-add | +--ro input
| +--ro input | | +--ro rib-name string
| | +--ro rib-name string | | +--ro rib-family rib-family-def
| | +--ro rib-family rib-family-def | | +--ro ip-rpf-check? boolean
| | +--ro enable-ip-rpf-check? boolean | +--ro output
| +--ro output | +--ro result boolean
| +--ro result boolean +---x rib-delete
+---x rib-delete | +--ro input
| +--ro input | | +--ro rib-name string
| | +--ro rib-name string | +--ro output
| +--ro output | +--ro result boolean
| +--ro result boolean +---x route-add
+---x route-add | +--ro input
| +--ro input | | +--ro rib-name string
| | +--ro rib-name string | | +--ro routes
| | +--ro routes | | +--ro route-list* [route-index]
| | +--ro route-list* [route-index] | | ...
| | ... | +--ro output
| +--ro output | +--ro result boolean
| +--ro result boolean +---x route-delete
+---x route-delete | +--ro input
| +--ro input | | +--ro rib-name string
| | +--ro rib-name string | | +--ro routes
| | +--ro routes | | +--ro route-list* [route-index]
| | +--ro route-list* [route-index] | | ...
| | ... | +--ro output
| +--ro output | +--ro result boolean
| +--ro result boolean +---x route-update
+---x route-update | +--ro input
| +--ro input | | +--ro rib-name string
| | +--ro rib-name string | | +--ro (match-conditions)?
| | +--ro (match-conditions)? | | +--:(match-route-prefix)
| | +--:(match-route-prefix) | | | ...
| | | ... | | +--:(match-route-attributes)
| | +--:(match-route-attributes) | | | ...
| | | ... | | +--:(match-route-vendor-attributes) {...vendor-attributes}?
| | +--:(match-nexthop) | | | ...
| | ... | | +--:(match-nexthop)
| +--ro output | | ...
| +--ro result boolean | +--ro output
+---x nh-add | +--ro result boolean
| +--ro input +---x nh-add
| | +--ro rib-name string | +--ro input
| | +--ro nexthop-id uint32 | | +--ro rib-name string
| | +--ro sharing-flag boolean | | +--ro nexthop-id uint32
| | +--ro (nexthop-type)? | | +--ro sharing-flag boolean
| | +--:(nexthop-base) | | +--ro (nexthop-type)?
| | | ... | | +--:(nexthop-base)
| | +--:(nexthop-chain) {nexthop-chain}? | | | ...
| | | ... | | +--:(nexthop-chain) {nexthop-chain}?
| | +--:(nexthop-protection) {nexthop-protection}? | | | ...
| | | ... | | +--:(nexthop-replicates) {nexthop-replicates}?
| | +--:(nexthop-load-balance) {nexthop-load-balance}? | | | ...
| | | ... | | +--:(nexthop-protection) {nexthop-protection}?
| | +--:(nexthop-replicates) {nexthop-replicates}? | | | ...
| | ... | | +--:(nexthop-load-balance) {nexthop-load-balance}?
| +--ro output | | ...
| +--ro result boolean | +--ro output
| +--ro nexthop-id uint32 | +--ro result boolean
+---x nh-delete | +--ro nexthop-id uint32
+--ro input +---x nh-delete
| +--ro rib-name string +--ro input
| +--ro (nexthop-context-or-id)? | +--ro rib-name string
| +--:(nexthop-context) | +--ro nexthop-id uint32
| | ... | +--ro sharing-flag boolean
| +--:(nexthop-identifier) | +--ro (nexthop-type)?
| +--ro nexthop-identifer uint32 | +--:(nexthop-base)
+--ro output | | ...
+--ro result boolean | +--:(nexthop-chain) {nexthop-chain}?
notifications: | | ...
+---n nexthop-resolution-status-change | +--:(nexthop-replicates) {nexthop-replicates}?
| +--ro nexthop | | ...
| | +--ro nexthop-id uint32 | +--:(nexthop-protection) {nexthop-protection}?
| | +--ro sharing-flag boolean | | ...
| | +--ro (nexthop-type)? | +--:(nexthop-load-balance) {nexthop-load-balance}?
| | +--:(nexthop-base) | ...
| | | ... +--ro output
| | +--:(nexthop-chain) {nexthop-chain}? +--ro result boolean
| | | ... notifications:
| | +--:(nexthop-protection) {nexthop-protection}? +---n nexthop-resolution-status-change
| | | ... | +--ro nexthop
| | +--:(nexthop-load-balance) {nexthop-load-balance}? | | +--ro nexthop-id uint32
| | | ... | | +--ro sharing-flag boolean
| | +--:(nexthop-replicates) {nexthop-replicates}? | | +--ro (nexthop-type)?
| | ... | | +--:(nexthop-base)
| +--ro nexthop-state nexthop-state-def | | | ...
+---n route-change | | +--:(nexthop-chain) {nexthop-chain}?
+--ro rib-name string | | | ...
+--ro rib-family rib-family-def | | +--:(nexthop-replicates) {nexthop-replicates}?
+--ro route-index uint64 | | | ...
+--ro route-type route-type-def | | +--:(nexthop-protection) {nexthop-protection}?
+--ro match | | | ...
| +--ro (rib-route-type)? | | +--:(nexthop-load-balance) {nexthop-load-balance}?
| +--:(ipv4) | | ...
| | ... | +--ro nexthop-state nexthop-state-def
| +--:(ipv6) +---n route-change
| | ... +--ro rib-name string
| +--:(mpls-route) +--ro rib-family rib-family-def
| | ... +--ro route-index uint64
| +--:(mac-route) +--ro match
| | ... | +--ro (route-type)?
| +--:(interface-route) | +--:(ipv4)
| ... | | ...
+--ro route-installed-state route-installed-state-def | +--:(ipv6)
+--ro route-state route-state-def | | ...
+--ro route-reason route-reason-def | +--:(mpls-route)
| | ...
| +--:(mac-route)
| | ...
| +--:(interface-route)
| ...
+--ro route-installed-state route-installed-state-def
+--ro route-state route-state-def
+--ro route-change-reason route-reason-def
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
should be a limitation on how many levels of lookup can be should be a limitation on how many levels of lookup can be
practically performed. Therefore, a RIB data model MUST specify a practically performed. Therefore, a RIB data model MUST specify a
way for an external entity to learn about the functional capabilities way for an external entity to learn about the functional capabilities
of a network device. of a network device.
skipping to change at page 8, line 5 skipping to change at page 8, line 5
control the information available in the RIBs. More detail about control the information available in the RIBs. More detail about
routing instance can be found in Section 2.2 of routing instance can be found in Section 2.2 of
[I-D.ietf-i2rs-rib-info-model]. [I-D.ietf-i2rs-rib-info-model].
As described in [I-D.ietf-i2rs-rib-info-model], there will be As described in [I-D.ietf-i2rs-rib-info-model], there will be
multiple routing instances for a router. At the same time, for a multiple routing instances for a router. At the same time, for a
routing instance, there would be multiple RIBs as well. Therefore, routing instance, there would be multiple RIBs as well. Therefore,
this model uses "list" to express the RIBs. The structure tree is this model uses "list" to express the RIBs. The structure tree is
shown as following figure. shown as following figure.
+--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 rib-family rib-family-def +--rw rib-family rib-family-def
+--rw enable-ip-rpf-check? boolean +--rw ip-rpf-check? boolean
+--rw route-list* [route-index] +--rw route-list* [route-index]
... (refer to Sec.2.3) ... (refer to Section 2.3)
Figure 2: Routing Instance Stuture Figure 2: Routing Instance Stuture
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, MAC, Interface etc.) and the set of fields to match on.
According to the definition in [I-D.ietf-i2rs-rib-info-model], a According to the definition in [I-D.ietf-i2rs-rib-info-model], a
skipping to change at page 9, line 7 skipping to change at page 9, line 7
o INSTALLED: Indicates whether the route got installed in the FIB. o INSTALLED: Indicates whether the route got installed in the FIB.
In addition, a route can associate with one or more optional route In addition, a route can associate with one or more optional route
attributes(e.g., route-vendor-attributes). attributes(e.g., route-vendor-attributes).
For a RIB, there will have a number of routes, so the routes are For a RIB, there will have a number of routes, so the routes are
expressed as a list under the rib list. expressed as a list under the rib list.
+--rw route-list* [route-index] +--rw route-list* [route-index]
+--rw route-index uint64 +--rw route-index uint64
+--rw route-type route-type-def
+--rw match +--rw match
| +--rw (rib-route-type)? | +--rw (route-type)?
| +--:(ipv4) | +--:(ipv4)
| | +--rw ipv4 | | +--rw ipv4
| | +--rw ipv4-route-type match-ip-route-type-def | | +--rw (ip-route-match-type)?
| | +--rw (match-ip-route-type)?
| | +--:(dest-ipv4-address) | | +--:(dest-ipv4-address)
| | | ... | | | ...
| | +--:(src-ipv4-address) | | +--:(src-ipv4-address)
| | | ... | | | ...
| | +--:(dest-src-ipv4-address) | | +--:(dest-src-ipv4-address)
| | ... | | ...
| +--:(ipv6) | +--:(ipv6)
| | +--rw ipv6 | | +--rw ipv6
| | +--rw ipv6-route-type match-ip-route-type-def | | +--rw (ip-route-match-type)?
| | +--rw (match-ip-route-type)?
| | +--:(dest-ipv6-address) | | +--:(dest-ipv6-address)
| | | ... | | | ...
| | +--:(src-ipv6-address) | | +--:(src-ipv6-address)
| | | ... | | | ...
| | +--:(dest-src-ipv6-address) | | +--:(dest-src-ipv6-address)
| | ... | | ...
| +--:(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 Sec.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 Section 2.4 of [I-D.ietf-i2rs-rib-info-model], to
support various of use cases (e.g., load balance, protection, support various of use cases (e.g., load balance, protection,
multicast or the combination of them), the nexthop is modelled as a multicast or the combination of them), the nexthop is modelled as a
multi-level structure and supports recursion. The first level of the multi-level structure and supports recursion. The first level of the
nexthop includes the following four types: nexthop includes the following four types:
skipping to change at page 11, line 5 skipping to change at page 10, line 26
o Load-balance: Designed for load-balance case where it normally o Load-balance: Designed for load-balance case where it normally
will have multiple weighted nexthops. will have multiple weighted nexthops.
o Protection: Designed for protection scenario where it normally o Protection: Designed for protection scenario where it normally
will have primary and standby nexthop. will have primary and standby nexthop.
o Replicate: Designed for multiple destinations forwarding. o Replicate: 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-chain* [nexthop-chain-member-id] | | +--rw nexthop-list* [nexthop-member-id]
| | +--rw nexthop-chain-member-id uint32 | | +--rw nexthop-member-id uint32
| +--:(nexthop-protection) {nexthop-protection}? | +--:(nexthop-replicates) {nexthop-replicates}?
| | +--rw nexthop-protection | | +--rw nexthop-replicates
| | +--rw nexthop-protection-list* [...-member-id] | | +--rw nexthop-list* [nexthop-member-id]
| | +--rw nexthop-protection-member-id uint32 | | +--rw nexthop-member-id uint32
| | +--rw nexthop-preference nexthop-preference-def | +--:(nexthop-protection) {nexthop-protection}?
| +--:(nexthop-load-balance) {nexthop-load-balance}? | | +--rw nexthop-protection
| | +--rw nexthop-lb | | +--rw nexthop-list* [nexthop-member-id]
| | +--rw nexthop-lbs* [nexthop-lbs-member-id] | | +--rw nexthop-member-id uint32
| | +--rw nexthop-lbs-member-id uint32 | | +--rw nexthop-preference nexthop-preference-def
| | +--rw nhop-lb-weight nhop-lb-weight-def | +--:(nexthop-load-balance) {nexthop-load-balance}?
| +--:(nexthop-replicates) {nexthop-replicates}? | +--rw nexthop-lbs
| +--rw nexthop-replicates | +--rw nexthop-list* [nexthop-member-id]
| +--rw nexthop-replicates* [nexthop-replicates-member-id] | +--rw nexthop-member-id uint32
| +--rw nexthop-replicates-member-id uint32 | +--rw nexthop-lb-weight nexthop-lb-weight-def
Figure 4: Nexhop Structure Figure 4: Nexhop Structure
Figure 6 (as shown blow) is a sub-tree of nexthop, it's under the Figure 5 (as shown blow) is a sub-tree of nexthop, it's under the
nexthop base node. nexthop base node.
+--:(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-def | | +--rw special? special-nexthop-def
| +--:(egress-interface-nexthop) | +--:(egress-interface-nexthop)
| | +--rw outgoing-interface if:interface-ref | | +--rw outgoing-interface if:interface-ref
| +--:(ipv4-address-nexthop) | +--:(ipv4-address-nexthop)
skipping to change at page 12, line 13 skipping to change at page 11, line 35
| | +--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 uint32 | | +--rw ieee-mac-address uint32
| +--:(tunnel-encap-nexthop) {nexthop-tunnel}? | +--:(tunnel-encap-nexthop) {nexthop-tunnel}?
| | +--rw tunnel-encap | | +--rw tunnel-encap
| | +--rw (tunnel-type)? | | +--rw (tunnel-type)?
| | +--:(ipv4) {ipv4-tunnel}? | | +--:(ipv4) {ipv4-tunnel}?
| | | +--rw source-ipv4-address inet:ipv4-address | | | +--rw src-ipv4-address inet:ipv4-address
| | | +--rw destination-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 source-ipv6-address inet:ipv6-address | | | +--rw src-ipv6-address inet:ipv6-address
| | | +--rw destination-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? uint16 | | | +--rw flow-label? uint16
| | | +--rw hop-limit? uint8 | | | +--rw hop-limit? uint8
| | +--:(mpls) {mpls-tunnel}? | | +--:(mpls) {mpls-tunnel}?
| | | +--rw (mpls-action-type)? | | | +--rw label-operations* [label-oper-id]
| | | +--:(mpls-push) | | | +--rw label-oper-id uint32
| | | | +--rw mpls-push boolean | | | +--rw (label-actions)?
| | | | +--rw mpls-label uint32 | | | +--:(label-push)
| | | | +--rw s-bit? boolean | | | | +--rw label-push
| | | | +--rw tc-value? uint8 | | | | +--rw label uint32
| | | | +--rw ttl-value? uint8 | | | | +--rw s-bit? boolean
| | | +--:(mpls-swap) | | | | +--rw tc-value? uint8
| | | +--rw mpls-swap boolean | | | | +--rw ttl-value? uint8
| | | +--rw mpls-in-label uint32 | | | +--:(label-swap)
| | | +--rw mpls-out-label uint32 | | | +--rw label-swap
| | | +--rw ttl-action? ttl-action-def | | | +--rw in-label uint32
| | | +--rw out-label uint32
| | | +--rw ttl-action? ttl-action-def
| | +--:(gre) {gre-tunnel}? | | +--:(gre) {gre-tunnel}?
| | | +--rw gre-ip-destination inet:ipv4-address | | | +--rw (dest-address-type)?
| | | +--rw gre-protocol-type inet:ipv4-address | | | | +--:(ipv4)
| | | +--rw gre-key? uint64 | | | | | +--rw ipv4-dest inet:ipv4-address
| | | | +--:(ipv6)
| | | | +--rw ipv6-dest inet:ipv6-address
| | | +--rw protocol-type uint16
| | | +--rw key? uint64
| | +--:(nvgre) {nvgre-tunnel}? | | +--:(nvgre) {nvgre-tunnel}?
| | | +--rw (nvgre-type)? | | | +--rw (nvgre-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
| | | | | +--rw ttl? uint8 | | | | | +--rw ttl? uint8
| | | | | +--rw dscp? uint8 | | | | | +--rw dscp? uint8
| | | | +--:(ipv6) | | | | +--:(ipv6)
| | | | +--rw source-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? uint16 | | | | +--rw flow-label? uint16
| | | | +--rw hop-limit? uint8 | | | | +--rw hop-limit? uint8
| | | +--rw virtual-subnet-id uint32 | | | +--rw virtual-subnet-id uint32
| | | +--rw flow-id? uint16 | | | +--rw flow-id? uint16
| | +--:(vxlan) {vxlan-tunnel}? | | +--:(vxlan) {vxlan-tunnel}?
| | +--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
| | | | +--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? uint16 | | | +--rw flow-label? uint16
| | | +--rw hop-limit? uint8 | | | +--rw hop-limit? uint8
| | +--rw vxlan-identifier? uint32 | | +--rw vxlan-identifier uint32
| +--:(tunnel-decap-nexthp) {nexthop-tunnel}? | +--:(tunnel-decap-nexthp) {nexthop-tunnel}?
| | +--rw tunnel-decap | | +--rw tunnel-decap
| | +--rw (tunnel-type)? | | +--rw (tunnel-type)?
| | +--:(ipv4) {ipv4-tunnel}? | | +--:(ipv4) {ipv4-tunnel}?
| | | +--rw ipv4-decap | | | +--rw ipv4-decap
| | | +--rw ipv4-decap boolean | | | +--rw ipv4-decap tunnel-decap-action-def
| | | +--rw ttl-action? ttl-action-def | | | +--rw ttl-action? ttl-action-def
| | +--:(ipv6) {ipv6-tunnel}? | | +--:(ipv6) {ipv6-tunnel}?
| | | +--rw ipv6-decap | | | +--rw ipv6-decap
| | | +--rw ipv6-decap boolean | | | +--rw ipv6-decap tunnel-decap-action-def
| | | +--rw hop-limit-action? hop-limit-action-def | | | +--rw hop-limit-action? hop-limit-action-def
| | +--:(mpls) {mpls-tunnel}? | | +--:(mpls) {mpls-tunnel}?
| | +--rw mpls-pop | | +--rw label-pop
| | +--rw mpls-pop boolean | | +--rw label-pop mpls-label-action-def
| | +--rw ttl-action? ttl-action-def | | +--rw ttl-action? ttl-action-def
| +--:(logical-tunnel-nexthop) {nexthop-tunnel}? | +--:(logical-tunnel-nexthop) {nexthop-tunnel}?
| | +--rw logical-tunnel | | +--rw logical-tunnel
| | +--rw tunnel-type tunnel-type-def | | +--rw tunnel-type tunnel-type-def
| | +--rw tunnel-name string | | +--rw tunnel-name string
| +--:(rib-name-nexthop) | +--:(rib-name-nexthop)
| +--rw rib-name? string | +--rw rib-name? string
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: It is defined to add a rib to a routing instance. A name o rib-add: It is defined to add a rib to a routing instance. A name
of the rib, address family of the rib and whether the RPF check is of the rib, address family of the rib and whether the RPF check is
enabled are passed as the input parameters. The output is the enabled are passed as the input parameters. The output is the
result of the add operation: 1 means success, and 0 means failed. result of the add operation: 1 means success, and 0 means failed.
skipping to change at page 15, line 7 skipping to change at page 14, line 33
success, and 0 means failed ) and the nexthop identifier that is success, and 0 means failed ) and the nexthop identifier that is
allocated to the nexthop. allocated to the nexthop.
o nh-delete: It is defined to delete a nexthop from a rib. A name o nh-delete: It is defined to delete a nexthop from a rib. A name
of a rib and a nexthop or nexthop identifier are passed as the of a rib and a nexthop or nexthop identifier are passed as the
input parameters. The output is the result of the delete input parameters. The output is the result of the delete
operation: 1 means success, 0 means failed. operation: 1 means success, 0 means failed.
The structure tree of rpcs is showing in following figure. The structure tree of rpcs is showing in following figure.
rpcs: rpcs:
+---x rib-add +---x rib-add
| +--ro input | +--ro input
| | +--ro rib-name string | | +--ro rib-name string
| | +--ro rib-family rib-family-def | | +--ro rib-family rib-family-def
| | +--ro enable-ip-rpf-check? boolean | | +--ro ip-rpf-check? boolean
| +--ro output | +--ro output
| +--ro result boolean | +--ro result boolean
+---x rib-delete +---x rib-delete
| +--ro input | +--ro input
| | +--ro rib-name string | | +--ro rib-name string
| +--ro output | +--ro output
| +--ro result boolean | +--ro result boolean
+---x route-add +---x route-add
| +--ro input | +--ro input
| | +--ro rib-name string | | +--ro rib-name string
| | +--ro routes | | +--ro routes
| | ... | | +--ro route-list* [route-index]
| +--ro output | | ...
| +--ro result boolean | +--ro output
+---x route-delete | +--ro result boolean
| +--ro input +---x route-delete
| | +--ro rib-name string | +--ro input
| | +--ro routes | | +--ro rib-name string
| | ... | | +--ro routes
| +--ro output | | +--ro route-list* [route-index]
| +--ro result boolean | | ...
+---x route-update | +--ro output
| +--ro input | +--ro result boolean
| | +--ro rib-name string +---x route-update
| | +--ro (match-conditions)? | +--ro input
| | +--:(match-route-prefix) | | +--ro rib-name string
| | | ... | | +--ro (match-conditions)?
| | +--:(match-route-attributes) | | +--:(match-route-prefix)
| | | ... | | | ...
| | +--:(match-vendor-route-attributes) | | +--:(match-route-attributes)
| | | ... | | | ...
| | +--:(match-nexthop) | | +--:(match-route-vendor-attributes) {..vendor-attributes}?
| | ... | | | ...
| +--ro output | | +--:(match-nexthop)
| +--ro result boolean | | ...
+---x nh-add | +--ro output
| +--ro input | +--ro result boolean
| | +--ro rib-name string +---x nh-add
| | +--ro nexthop-id uint32 | +--ro input
| | +--ro sharing-flag boolean | | +--ro rib-name string
| | +--ro (nexthop-type)? | | +--ro nexthop-id uint32
| | ... | | +--ro sharing-flag boolean
| +--ro output | | +--ro (nexthop-type)?
| +--ro result boolean | | ...
| +--ro nexthop-id uint32 | +--ro output
+---x nh-delete | +--ro result boolean
+--ro input | +--ro nexthop-id uint32
| +--ro rib-name string +---x nh-delete
| +--ro (nexthop-context-or-id)? +--ro input
| +--:(nexthop-context) | +--ro rib-name string
| | ... | +--ro nexthop-id uint32
| +--:(nexthop-identifier) | +--ro sharing-flag boolean
| ... | +--ro (nexthop-type)?
+--ro output | ...
+--ro result boolean +--ro output
+--ro result boolean
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. A RIB data-model MUST support sending 2 kind of asynchronous device. A RIB data-model MUST support sending 2 kind of asynchronous
notifications. notifications.
1. Route change notification: 1. Route change notification:
skipping to change at page 17, line 10 skipping to change at page 17, line 6
nexthop could be an IP address. The RIB manager would resolve how to nexthop could be an IP address. The RIB manager would resolve how to
reach that IP address, e.g. by checking if that particular IP is reach that IP address, e.g. by checking if that particular IP is
address reachable by regular IP forwarding or by a MPLS tunnel or by address reachable by regular IP forwarding or by a MPLS tunnel or by
both. If the RIB manager cannot resolve the nexthop, then the both. If the RIB manager cannot resolve the nexthop, then the
nexthop remains in an unresolved state and is NOT a suitable nexthop remains in an unresolved state and is NOT a suitable
candidate for installation in the FIB. candidate for installation in the FIB.
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-protection) {nexthop-protection}? | | +--:(nexthop-replicates) {nexthop-replicates}?
| | | ... | | | ...
| | +--:(nexthop-load-balance) {nexthop-load-balance}? | | +--:(nexthop-protection) {nexthop-protection}?
| | | ... | | | ...
| | +--:(nexthop-replicates) {nexthop-replicates}? | | +--:(nexthop-load-balance) {nexthop-load-balance}?
| | ... | | ...
| +--ro nexthop-state nexthop-state-def | +--ro nexthop-state nexthop-state-def
+---n route-change +---n route-change
+--ro rib-name string +--ro rib-name string
+--ro rib-family rib-family-def +--ro rib-family rib-family-def
+--ro route-index uint64 +--ro route-index uint64
+--ro route-type route-type-def +--ro match
+--ro match | +--ro (route-type)?
| +--ro (rib-route-type)? | +--:(ipv4)
| +--:(ipv4) | | ...
| | ... | +--:(ipv6)
| +--:(ipv6) | | ...
| | ... | +--:(mpls-route)
| +--:(mpls-route) | | ...
| | ... | +--:(mac-route)
| +--:(mac-route) | | ...
| | ... | +--:(interface-route)
| +--:(interface-route) | ...
| ... +--ro route-installed-state route-installed-state-def
+--ro route-installed-state route-installed-state-def +--ro route-state route-state-def
+--ro route-state route-state-def +--ro route-change-reason route-reason-def
+--ro route-reason route-reason-def
Figure 7: Notifications Structure Figure 7: Notifications Structure
3. YANG Modules 3. YANG Modules
//<CODE BEGINS> file "i2rs rib@2015-10-17.yang" //<CODE BEGINS> file "ietf i2rs rib@2015-10-28.yang"
module i2rs-rib {
namespace "urn:ietf:params:xml:ns:yang:i2rs-rib";
// replace with iana namespace when assigned
prefix "i2rs-rib";
module ietf-i2rs-rib {
namespace "urn:ietf:params:xml:ns:yang:ietf-i2rs-rib";
// replace with iana namespace when assigned
prefix "iir";
import ietf-inet-types { import ietf-inet-types {
prefix inet; prefix inet;
//rfc6991 //rfc6991
} }
import ietf-interfaces { import ietf-interfaces {
prefix "if"; prefix "if";
} }
import ietf-yang-types { import ietf-yang-types {
prefix yang; prefix yang;
} }
organization organization
"IETF I2RS WG"; "IETF I2RS (Interface to Routing System) Working Group";
contact contact
"email: wang_little_star@sina.com "WG Web: <http://tools.ietf.org/wg/i2rs/>
email: hari@packetdesign.com WG List: <mailto:i2rs@ietf.org>
email: mach.chen@huawei.com
email: amit.dass@ericsson.com WG Chair: Susan Hares
email: sriganesh.kini@ericsson.com <mailto:shares@ndzh.com>
email: nitin_bahadur@yahoo.com";
WG Chair: Jeffrey Haas
<mailto:jhaas@pfrc.org>
Editor: Lixing Wang
<mailto:wang_little_star@sina.com>
Editor: Hariharan Ananthakrishnan
<mailto:hari@packetdesign.com>
Editor: Mach(Guoyi) Chen
<mailto:mach.chen@huawei.com>
Editor: Amit Dass
<mailto:amit.dass@ericsson.com>
Editor: Sriganesh Kini
<mailto:sriganesh.kini@ericsson.com>
Editor: Nitin Bahadur
<mailto:nitin_bahadur@yahoo.com>";
description description
"This module defines a YANG data model for "This module defines a YANG data model for
Routing Information Base (RIB) that aligns Routing Information Base (RIB) that aligns
with the I2RS RIB information model."; with the I2RS RIB information model.";
revision "2015-10-28" {
revision "2015-10-17" {
description "initial revision"; description "initial revision";
reference "draft-ietf-i2rs-rib-info-model-07"; reference "draft-ietf-i2rs-rib-info-model-08";
} }
//Nexthhop related features //Features
feature nexthop-tunnel { feature nexthop-tunnel {
description description
"This feature means that a node support "This feature means that a node support
tunnel nexhtop capability. The i2rs client tunnel nexhtop capability.";
can specify a tunnel nexthop to a route.";
} }
feature nexthop-chain { feature nexthop-chain {
description description
"This feature means that a node support "This feature means that a node support
chain nexhtop capability."; chain nexhtop capability.";
} }
feature nexthop-protection { feature nexthop-protection {
description description
skipping to change at page 19, line 31 skipping to change at page 19, line 38
"This feature means that a node support "This feature means that a node support
relicates nexhtop capability."; relicates nexhtop capability.";
} }
feature nexthop-load-balance { feature nexthop-load-balance {
description description
"This feature means that a node support "This feature means that a node support
load balance nexhtop capability."; load balance nexhtop capability.";
} }
//Tunnel encap related features
feature ipv4-tunnel { feature ipv4-tunnel {
description description
"This feature means that a node support "This feature means that a node support
IPv4 tunnel encapsulation capability."; IPv4 tunnel encapsulation capability.";
} }
feature ipv6-tunnel { feature ipv6-tunnel {
description description
"This feature means that a node support "This feature means that a node support
IPv6 tunnel encapsulation capability."; IPv6 tunnel encapsulation capability.";
} }
feature mpls-tunnel { feature mpls-tunnel {
description description
"This feature means that a node support "This feature means that a node support
MPLS tunnel encapsulation capability."; MPLS tunnel encapsulation capability.";
} }
feature vxlan-tunnel { feature vxlan-tunnel {
description description
"This feature means that a node support "This feature means that a node support
VxLAN tunnel encapsulation capability."; VxLAN tunnel encapsulation capability.";
} }
feature gre-tunnel { feature gre-tunnel {
description description
"This feature means that a node support "This feature means that a node support
GRE tunnel encapsulation capability."; GRE tunnel encapsulation capability.";
} }
feature nvgre-tunnel { feature nvgre-tunnel {
description description
"This feature means that a node support "This feature means that a node support
NvGRE tunnel encapsulation capability."; NvGRE tunnel encapsulation capability.";
} }
feature route-vendor-attributes {
description
"This feature means that a node support
route vendor attributes.";
}
//Identities and Type Definitions //Identities and Type Definitions
identity mpls-action { identity mpls-label-action {
description description
"Base identify from which all mpls label "Base identify from which all mpls label
operations are derived. operations are derived.
The MPLS label stack operations include: The MPLS label stack operations include:
push - to add a new label to a label stack, push - to add a new label to a label stack,
pop - to pop the top label from a label stack, pop - to pop the top label from a label stack,
swap - to change the top label of a label swap - to change the top label of a label
stack with new label."; stack with new label.";
} }
identity label-push { identity label-push {
base "mpls-action"; base "mpls-label-action";
description description
"MPLS label stack operation: push."; "MPLS label stack operation: push.";
} }
identity label-pop { identity label-pop {
base "mpls-action"; base "mpls-label-action";
description description
"MPLS label stack operation: pop."; "MPLS label stack operation: pop.";
} }
identity label-swap { identity label-swap {
base "mpls-action"; base "mpls-label-action";
description description
"MPLS label stack operation: swap."; "MPLS label stack operation: swap.";
} }
typedef mpls-action-def { typedef mpls-label-action-def {
type identityref { type identityref {
base "mpls-action"; base "mpls-label-action";
} }
description description
"MPLS action def."; "MPLS label action def.";
}
identity tunnel-decap-action {
description
"Base identify from which all tunnel decap
actions are derived.
Tunnel decap actions include:
ipv4-decap - to decap an IPv4 tunnel,
ipv6-decap - to decap an IPv6 tunnel.";
}
identity ipv4-decap {
base "tunnel-decap-action";
description
"IPv4 tunnel decap.";
} }
identity ipv6-decap {
base "tunnel-decap-action";
description
"IPv4 tunnel decap.";
}
typedef tunnel-decap-action-def {
type identityref {
base "tunnel-decap-action";
}
description
"Tunnel decap def.";
}
identity ttl-action { identity ttl-action {
description description
"Base identify from which all TTL "Base identify from which all TTL
actions are derived. actions are derived.
The tll actions include: The tll actions include:
- ttl-no-action: do nothing regarding the TTL, or - ttl-no-action: do nothing regarding the TTL, or
- ttl-copy-to-inner: copy the TTL of the outer - ttl-copy-to-inner: copy the TTL of the outer
header to inner header, or header to inner header, or
- ttl-decrease-and-copy-to-inner: Decrease the TTL - ttl-decrease-and-copy-to-inner: Decrease the TTL
by one and copy it to inner header. by one and copy it to inner header.";
";
} }
identity ttl-no-action { identity no-action {
base "ttl-action"; base "ttl-action";
description description
"Do nothing regarding the TTL."; "Do nothing regarding the TTL.";
} }
identity ttl-copy-to-inner { identity copy-to-inner {
base "ttl-action"; base "ttl-action";
description description
"Copy the TTL of the outer header "Copy the TTL of the outer header
to inner header."; to inner header.";
} }
identity ttl-decrease-and-copy-to-inner { identity decrease-and-copy-to-inner {
base "ttl-action"; base "ttl-action";
description description
"Decrease TTL by one and copy the TTL "Decrease TTL by one and copy the TTL
to inner header."; to inner header.";
} }
identity decrease-and-copy-to-next {
base "ttl-action";
description
"Decrease TTL by one and copy the TTL
to the next header.For example: when
MPLS label swapping, decrease the TTL
of the in label and copy it to the out
label.";
}
typedef ttl-action-def { typedef ttl-action-def {
type identityref { type identityref {
base "ttl-action"; base "ttl-action";
} }
description description
"TTL action def."; "TTL action def.";
} }
identity hop-limit-action { identity hop-limit-action {
description description
"Base identify from which all hop limit "Base identify from which all hop limit
actions are derived."; actions are derived.";
} }
identity hop-limit-no-action { identity hop-limit-no-action {
base "hop-limit-action"; base "hop-limit-action";
description description
"Do nothing regarding the hop limit."; "Do nothing regarding the hop limit.";
} }
skipping to change at page 23, line 8 skipping to change at page 24, line 15
} }
identity receive { identity receive {
base "special-nexthop"; base "special-nexthop";
description description
"This indicates that that the traffic is "This indicates that that the traffic is
destined for the network device. For destined for the network device. For
example, protocol packets or OAM packets. example, protocol packets or OAM packets.
All locally destined traffic SHOULD be All locally destined traffic SHOULD be
throttled to avoid a denial of service throttled to avoid a denial of service
attack on the router's control plane. An attack on the router's control plane. An
optional rate-limiter can be specified optional rate-limiter can be specified
to indicate how to throttle traffic to indicate how to throttle traffic
destined for the control plane."; destined for the control plane.";
} }
identity cos-value { identity cos-value {
base "special-nexthop"; base "special-nexthop";
description description
"Cos-value special nexthop."; "Cos-value special nexthop.";
} }
typedef special-nexthop-def { typedef special-nexthop-def {
type identityref { type identityref {
base "special-nexthop"; base "special-nexthop";
} }
description description
"Special nexthop def."; "Special nexthop def.";
} }
identity match-ip-route-type { identity ip-route-match-type {
description description
"Base identify from which all route "Base identify from which all route
match types are derived. match types are derived.
Route match type could be: Route match type could be:
match source, or match source, or
match destination, or match destination, or
match source and destination."; match source and destination.";
} }
identity match-ip-src { identity match-ip-src {
base "match-ip-route-type"; base "ip-route-match-type";
description description
"Source route match type."; "Source route match type.";
} }
identity match-ip-dest { identity match-ip-dest {
base "match-ip-route-type"; base "ip-route-match-type";
description description
"Destination route match type"; "Destination route match type";
} }
identity match-ip-src-dest { identity match-ip-src-dest {
base "match-ip-route-type"; base "ip-route-match-type";
description description
"Src and Dest route match type"; "Src and Dest route match type";
} }
typedef match-ip-route-type-def { typedef ip-route-match-type-def {
type identityref { type identityref {
base "match-ip-route-type"; base "ip-route-match-type";
} }
description description
"Route match type def."; "IP route match type def.";
} }
identity rib-family { identity rib-family {
description description
"Base identify from which all rib "Base identify from which all rib
address families are derived."; address families are derived.";
} }
identity ipv4-rib-family { identity ipv4-rib-family {
base "rib-family"; base "rib-family";
skipping to change at page 29, line 28 skipping to change at page 30, line 34
range "1..99"; range "1..99";
} }
description description
"Nexthop-preference is used for protection schemes. "Nexthop-preference is used for protection schemes.
It is an integer value between 1 and 99. A lower It is an integer value between 1 and 99. A lower
value indicates higher preference. To download a value indicates higher preference. To download a
primary/standby/tertiary group to the FIB, the primary/standby/tertiary group to the FIB, the
nexthops that are resolved and have two highest nexthops that are resolved and have two highest
preferences are selected."; preferences are selected.";
} }
typedef nhop-lb-weight-def { typedef nexthop-lb-weight-def {
type uint8 { type uint8 {
range "1..99"; range "1..99";
} }
description description
"Nhop-lb-weight is a number between 1 and 99."; "Nhop-lb-weight is a number between 1 and 99.";
} }
//Groupings //Groupings
grouping route-prefix { grouping route-prefix {
description description
"The common attributes used for all types of route prefix."; "The common attributes used for all types of route prefix.";
leaf route-index { leaf route-index {
type uint64 ; type uint64 ;
mandatory true; mandatory true;
description description
"Route index."; "Route index.";
} }
leaf route-type {
type route-type-def;
mandatory true;
description
"Route types, e.g., IPv4, IPv6, MPLS, MAC etc. route types.";
}
container match { container match {
description description
"The match condition specifies the "The match condition specifies the
kind of route (IPv4, MPLS, etc.) kind of route (IPv4, MPLS, etc.)
and the set of fields to match on."; and the set of fields to match on.";
choice rib-route-type { choice route-type {
description description
"To match a route according to rib route type."; "Route types: IPv4, IPv6, MPLS, MAC etc.";
case ipv4 { case ipv4 {
description description
"IPv4 rib case."; "IPv4 route case.";
container ipv4 { container ipv4 {
description description
"IPv4 route match type."; "IPv4 route match.";
leaf ipv4-route-type { choice ip-route-match-type {
type match-ip-route-type-def;
mandatory true;
description description
"Route match type, it could be: "IP route match type options:
match source, or match source, or
match destination, or match destination, or
match source and destination. match source and destination.";
";
}
choice match-ip-route-type {
description
"To match a route according to match type.";
case dest-ipv4-address { case dest-ipv4-address {
leaf dest-ipv4-prefix { leaf dest-ipv4-prefix {
type inet:ipv4-prefix; type inet:ipv4-prefix;
mandatory true; mandatory true;
description description
"To match an IPv4 destination address."; "An IPv4 destination address as the match.";
} }
} }
case src-ipv4-address { 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
"To match an IPv4 source address."; "An IPv4 source address as the match.";
} }
} }
case dest-src-ipv4-address { case dest-src-ipv4-address {
container dest-src-ipv4-address { container dest-src-ipv4-address {
description description
"To match IPv4 source and destination addreses."; "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 IPv4 destination address of the match.";
the match condition.";
} }
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 IPv4 source address of the match";
the match condition.";
} }
} }
} }
} }
} }
} }
case ipv6 { case ipv6 {
description description
"IPv6 rib case."; "IPv6 route case.";
container ipv6 { container ipv6 {
description description
"IPv6 route match type."; "IPv6 route match.";
leaf ipv6-route-type { choice ip-route-match-type {
type match-ip-route-type-def;
mandatory true;
description description
"Route match type, it could be: "IP route match type options:
match source, or match source, or
match destination, or match destination, or
match source and destination. match source and destination.";
";
}
choice match-ip-route-type {
description
"To match a route according to match type.";
case dest-ipv6-address { case dest-ipv6-address {
leaf dest-ipv6-prefix { leaf dest-ipv6-prefix {
type inet:ipv6-prefix; type inet:ipv6-prefix;
mandatory true; mandatory true;
description description
"To match an IPv6 destination address."; "An IPv6 destination address as the match.";
} }
} }
case src-ipv6-address { 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
"To match an IPv6 source address."; "An IPv6 source address as the match.";
} }
} }
case dest-src-ipv6-address { case dest-src-ipv6-address {
container dest-src-ipv6-address { container dest-src-ipv6-address {
description description
"To match the source and destination addreses."; "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 IPv6 destination address of the match";
the match condition.";
} }
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 IPv6 source address of the match.";
the match condition.";
} }
} }
} }
} }
} }
} }
case mpls-route { case mpls-route {
description description
"MPLS rib case."; "MPLS route case.";
leaf mpls-label { leaf mpls-label {
type uint32 ; type uint32 ;
mandatory true; mandatory true;
description description
"The label used for matching."; "The label used for matching.";
} }
} }
case mac-route { case mac-route {
description description
"MAC rib case."; "MAC rib case.";
skipping to change at page 33, line 4 skipping to change at page 33, line 36
} }
case mac-route { case mac-route {
description description
"MAC rib case."; "MAC rib case.";
leaf mac-address { leaf mac-address {
type uint32 ; type uint32 ;
mandatory true; mandatory true;
description description
"The MAC address used for matching."; "The MAC address used for matching.";
} }
} }
case interface-route { case interface-route {
description description
"Interface rib case."; "Interface route case.";
leaf interface-identifier { leaf interface-identifier {
type if:interface-ref; type if:interface-ref;
mandatory true; mandatory true;
description description
"The interface used for matching."; "The interface used for matching.";
} }
} }
} }
} }
} }
skipping to change at page 34, line 15 skipping to change at page 34, line 46
"Route attributes."; "Route attributes.";
uses route-attributes; uses route-attributes;
} }
container route-vendor-attributes { container route-vendor-attributes {
description description
"Route vendor attributes."; "Route vendor attributes.";
uses route-vendor-attributes; uses route-vendor-attributes;
} }
} }
grouping nexthop-list {
description
"A generic nexthop list.";
list nexthop-list {
key "nexthop-member-id";
description
"A list of nexthop.";
leaf nexthop-member-id {
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 {
description
"A nexthop list with preference parameter.";
list nexthop-list {
key "nexthop-member-id";
description
"A list of nexthop.";
leaf nexthop-member-id {
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-def;
mandatory true;
description
"Nexthop-preference is used for protection schemes.
It is an integer value between 1 and 99. A lower
value indicates higher preference. To download a
primary/standby/tertiary group to the FIB, the
nexthops that are resolved and have two highest
preferences are selected.";
}
}
}
grouping nexthop-list-w {
description
"A nexthop list with weight parameter.";
list nexthop-list {
key "nexthop-member-id";
description
"A list of nexthop.";
leaf nexthop-member-id {
type uint32;
mandatory true;
description
"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-def;
mandatory true;
description
"The weight of a nexthop of
the load balance nexthops.";
}
}
}
grouping nexthop { grouping nexthop {
description description
"The nexthop structure."; "The nexthop structure.";
leaf nexthop-id { leaf nexthop-id {
type uint32; type uint32;
mandatory true; mandatory true;
description description
"The nexthop identifier of a nexthop."; "The nexthop identifier of a nexthop.";
} }
leaf sharing-flag { leaf sharing-flag {
type boolean; type boolean;
mandatory true; mandatory true;
description description
"To indicate whether a nexthop is sharable "To indicate whether a nexthop is sharable
or non-sharable. or non-sharable.
1 - means sharable true - sharable, means the nexthop can be shared
0 - means non-sharable."; with other routes
false - non-sharable, means the nexthop can not
be shared with other routes.";
} }
choice nexthop-type { choice nexthop-type {
description description
"Based on nexthop type to derive the nexthop."; "Nexthop type options.";
case nexthop-base { case nexthop-base {
container nexthop-base { container nexthop-base {
description description
"A nexthop base container."; "The base nexthop.";
uses nexthop-base; 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 nexthop chain container."; "A chain nexthop.";
list nexthop-chain { uses nexthop-list;
key "nexthop-chain-member-id"; }
description }
"A list of nexthop members of case nexthop-replicates {
a load nexthop chain."; if-feature nexthop-replicates;
leaf nexthop-chain-member-id { container nexthop-replicates {
type uint32; description
mandatory true; "A replicates nexthop.";
description uses nexthop-list;
"A nexthop identifier that points
to a nexthop chain member.
A nexthop chain member is a nexthop.";
}
}
} }
} }
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 container."; "A protection nexthop.";
list nexthop-protection-list { uses nexthop-list-p;
key "nexthop-protection-member-id";
description
"A list of nexthop protection
members of a load balance nexthop.";
leaf nexthop-protection-member-id {
type uint32;
mandatory true;
description
"A nexthop identifier that points
to a protection nexthop member.
A protection nexthop member is
a nexthop.";
}
leaf nexthop-preference {
type nexthop-preference-def;
mandatory true;
description
"Nexthop-preference is used for protection schemes.
It is an integer value between 1 and 99. A lower
value indicates higher preference. To download a
primary/standby/tertiary group to the FIB, the
nexthops that are resolved and have two highest
preferences are selected.";
}
}
} }
} }
case nexthop-load-balance { case nexthop-load-balance {
if-feature nexthop-load-balance; if-feature nexthop-load-balance;
container nexthop-lb { container nexthop-lbs {
description
"A load balance nexthop container.";
list nexthop-lbs {
key "nexthop-lbs-member-id";
description
"A list of nexthop load balance
members of a load balance nexthop.";
leaf nexthop-lbs-member-id {
type uint32;
mandatory true;
description
"A nexthop identifier that points
to a load balance nexthop member.
A load balance nexthop member is
a nexthop.";
}
leaf nhop-lb-weight {
type nhop-lb-weight-def;
mandatory true;
description
"The weight of a nexthop of
the load balance nexthops.";
}
}
}
}
case nexthop-replicates {
if-feature nexthop-replicates;
container nexthop-replicates {
description description
"A nexthop replicates container."; "A load balance nexthop.";
list nexthop-replicates { uses nexthop-list-w;
key "nexthop-replicates-member-id";
description
"A list of replicate nexthop members
that belong to the nexthop-replicates.";
leaf nexthop-replicates-member-id {
type uint32;
description
"A nexthop identifier that points
to a replicates nexthop member.
A replicates nexthop member is a nexthop.";
}
}
} }
} }
} }
} }
grouping nexthop-base { grouping nexthop-base {
description description
"The base nexthop content for a route."; "The base nexthop.";
choice nexthop-base-type { choice nexthop-base-type {
description description
"Based on nexthop chain type to select "Nexthop base type options.";
relevant nexthop chain member.";
case special-nexthop { case special-nexthop {
leaf special { leaf special {
type special-nexthop-def; type special-nexthop-def;
description description
"A special nexthop."; "A special nexthop.";
} }
} }
case egress-interface-nexthop { case egress-interface-nexthop {
leaf outgoing-interface { leaf outgoing-interface {
type if:interface-ref; type if:interface-ref;
skipping to change at page 38, line 10 skipping to change at page 38, line 44
"Name of the outgoing interface."; "Name of the outgoing interface.";
} }
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 points to an interface with
an IPv4 address."; an IPv4 address.";
} }
description description
"Egress-interface and ip address: This can be usesd "The nexthop is an Egress-interface and an ip
in cases e.g.where the ip address is a link-local address.This can be usesd in cases e.g.where
address."; the ip address is a link-local address.";
} }
} }
case egress-interface-ipv6-nexthop { case egress-interface-ipv6-nexthop {
container egress-interface-ipv6-address { container egress-interface-ipv6-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."; "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 points to an interface with
an IPv6 address."; an IPv6 address.";
} }
description description
"Egress-interface and ip address: This can be usesd "The nexthop is an Egress-interface and an ip
in cases e.g.where the ip address is a link-local address.This can be usesd in cases e.g.where
address."; the ip address is a link-local address.";
} }
} }
case egress-interface-mac-nexthop { case egress-interface-mac-nexthop {
container egress-interface-mac-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 description
"Name of the outgoing interface."; "Name of the outgoing interface.";
} }
skipping to change at page 39, line 48 skipping to change at page 40, line 34
as defined in This document), that is represented as defined in This document), that is represented
by a unique identifier (e.g. name)."; by a unique identifier (e.g. name).";
} }
} }
case rib-name-nexthop { case rib-name-nexthop {
leaf rib-name { leaf rib-name {
type string; type string;
description description
"A nexthop pointing to a rib indicates that the "A nexthop pointing to a rib indicates that the
route lookup needs to continue in The specified route lookup needs to continue in The specified
rib. This is a way to perform chained lookups."; rib. This is a way to perform chained lookups.";
} }
} }
} }
} }
grouping route-vendor-attributes { grouping route-vendor-attributes {
description description
"Route vendor attributes."; "Route vendor attributes.";
} }
grouping logical-tunnel { grouping logical-tunnel {
description description
"A logical tunnel that is identified "A logical tunnel that is identified
skipping to change at page 40, line 33 skipping to change at page 41, line 18
type string; type string;
mandatory true; mandatory true;
description description
"A tunnel name that points to a logical tunnel."; "A tunnel name that points to a logical tunnel.";
} }
} }
grouping ipv4-header { grouping ipv4-header {
description description
"The IPv4 header encapsulation information."; "The IPv4 header encapsulation information.";
leaf source-ipv4-address { leaf src-ipv4-address {
type inet:ipv4-address; type inet:ipv4-address;
mandatory true; mandatory true;
description description
"The source ip address of the header."; "The source ip address of the header.";
} }
leaf destination-ipv4-address { leaf dest-ipv4-address {
type inet:ipv4-address; type inet:ipv4-address;
mandatory true; mandatory true;
description description
"The destination ip address of the header."; "The destination ip address of the header.";
} }
leaf protocol { leaf protocol {
type uint8; type uint8;
mandatory true; mandatory true;
description description
"The protocol id of the header."; "The protocol id of the header.";
skipping to change at page 41, line 17 skipping to change at page 41, line 51
leaf dscp { leaf dscp {
type uint8; type uint8;
description description
"The DSCP field of the header."; "The DSCP field of the header.";
} }
} }
grouping ipv6-header { grouping ipv6-header {
description description
"The IPv6 header encapsulation information."; "The IPv6 header encapsulation information.";
leaf source-ipv6-address { leaf src-ipv6-address {
type inet:ipv6-address; type inet:ipv6-address;
mandatory true; mandatory true;
description description
"The source ip address of the header."; "The source ip address of the header.";
} }
leaf destination-ipv6-address { leaf dest-ipv6-address {
type inet:ipv6-address; type inet:ipv6-address;
mandatory true; mandatory true;
description description
"The destination ip address of the header."; "The destination ip address of the header.";
} }
leaf next-header { leaf next-header {
type uint8; type uint8;
mandatory true; mandatory true;
description description
"The next header of the IPv6 header."; "The next header of the IPv6 header.";
skipping to change at page 42, line 47 skipping to change at page 43, line 33
or IPv6 header for encapsulation."; or IPv6 header for encapsulation.";
case ipv4 { case ipv4 {
uses ipv4-header; uses ipv4-header;
} }
case ipv6 { case ipv6 {
uses ipv6-header; uses ipv6-header;
} }
} }
leaf vxlan-identifier { leaf vxlan-identifier {
type uint32; type uint32;
mandatory true;
description description
"The VxLAN identifier of the VxLAN header."; "The VxLAN identifier of the VxLAN header.";
} }
} }
grouping gre-header { grouping gre-header {
description description
"The GRE encapsulation header information."; "The GRE encapsulation header information.";
leaf gre-ip-destination { choice dest-address-type {
type inet:ipv4-address;
mandatory true;
description description
"The destination ip address of the GRE header."; "GRE options: IPv4 and IPv6";
case ipv4 {
leaf ipv4-dest {
type inet:ipv4-address;
mandatory true;
description
"The destination ip address of the GRE header.";
}
}
case ipv6 {
leaf ipv6-dest {
type inet:ipv6-address;
mandatory true;
description
"The destination ip address of the GRE header.";
}
}
} }
leaf gre-protocol-type { leaf protocol-type {
type inet:ipv4-address; type uint16;
mandatory true; mandatory true;
description description
"The protocol type of the GRE header."; "The protocol type of the GRE header.";
} }
leaf gre-key { leaf key {
type uint64; type uint64;
description description
"The GRE key of the GRE header."; "The GRE key of the GRE header.";
} }
} }
grouping mpls-header { grouping mpls-header {
description description
"The MPLS encapsulation header information."; "The MPLS encapsulation header information.";
choice mpls-action-type { list label-operations {
key "label-oper-id";
description description
"Based on action type to perform different operation."; "Label operations.";
case mpls-push { leaf label-oper-id {
leaf mpls-push { type uint32;
type boolean; description
mandatory true; "An optional identifier that points
description to a label operation.";
"Push a MPLS label to the label stack.";
}
leaf mpls-label {
type uint32;
mandatory true;
description
"The MPLS 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 to be pushed.";
}
} }
case mpls-swap { choice label-actions {
leaf mpls-swap { description
type boolean; "Label action options.";
mandatory true; case label-push {
description container label-push {
"Swap a MPLS label with another label."; description
} "Label push operation.";
leaf mpls-in-label { leaf label {
type uint32; type uint32;
mandatory true; mandatory true;
description description
"The in MPLS label."; "The label to be pushed.";
}
leaf mpls-out-label { }
type uint32; leaf s-bit {
mandatory true; type boolean;
description description
"The out MPLS label."; "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 to be pushed.";
}
}
} }
leaf ttl-action { case label-swap {
type ttl-action-def; container label-swap {
description description
"The label ttl actions: "Label swap operation.";
- No-action, or leaf in-label {
- Copy to inner label,or type uint32;
- Decrease (the in label) by 1 and mandatory true;
copy to the out label."; description
"The label to be swapped.";
}
leaf out-label {
type uint32;
mandatory true;
description
"The out MPLS label.";
}
leaf ttl-action {
type ttl-action-def;
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.";
}
}
} }
} }
} }
} }
grouping tunnel-encap{ grouping tunnel-encap{
description description
"Tunnel encapsulation inforamtion."; "Tunnel encapsulation inforamtion.";
choice tunnel-type { choice tunnel-type {
description description
"Tunnel options for next-hops."; "Tunnel options for next-hops.";
case ipv4 { case ipv4 {
if-feature ipv4-tunnel; if-feature ipv4-tunnel;
uses ipv4-header; uses ipv4-header;
} }
skipping to change at page 45, line 35 skipping to change at page 46, line 42
uses vxlan-header; uses vxlan-header;
} }
} }
} }
grouping tunnel-decap { grouping tunnel-decap {
description description
"Tunnel decapsulation inforamtion."; "Tunnel decapsulation inforamtion.";
choice tunnel-type { choice tunnel-type {
description description
"Tunnel options for next-hops."; "Nexthop tunnel type options.";
case ipv4 { case ipv4 {
if-feature ipv4-tunnel; if-feature ipv4-tunnel;
container ipv4-decap { container ipv4-decap {
description
"IPv4 decap.";
leaf ipv4-decap { leaf ipv4-decap {
type boolean; type tunnel-decap-action-def;
mandatory true; mandatory true;
description description
"IPv4 decap operations."; "IPv4 decap operations.";
} }
leaf ttl-action { leaf ttl-action {
type ttl-action-def; type ttl-action-def;
description description
"The ttl actions: "The ttl actions:
no-action or copy to inner header."; no-action or copy to inner header.";
} }
description
"IPv4 decap.";
} }
} }
case ipv6 { case ipv6 {
if-feature ipv6-tunnel; if-feature ipv6-tunnel;
container ipv6-decap { container ipv6-decap {
description
"IPv6 decap.";
leaf ipv6-decap { leaf ipv6-decap {
type boolean; type tunnel-decap-action-def;
mandatory true; mandatory true;
description description
"IPv6 decap operations."; "IPv6 decap operations.";
} }
leaf hop-limit-action { leaf hop-limit-action {
type hop-limit-action-def; type hop-limit-action-def;
description description
"The hop limit actions: "The hop limit actions:
no-action or copy to inner header."; no-action or copy to inner header.";
} }
description
"IPv6 decap.";
} }
} }
case mpls { case mpls {
if-feature mpls-tunnel; if-feature mpls-tunnel;
container mpls-pop { container label-pop {
leaf mpls-pop { description
type boolean; "MPLS decap.";
leaf label-pop {
type mpls-label-action-def;
mandatory true; mandatory true;
description description
"Pop a MPLS label from the label stack."; "Pop a label from the label stack.";
} }
leaf ttl-action { leaf ttl-action {
type ttl-action-def; type ttl-action-def;
description description
"The label ttl actions: "The label ttl actions:
no-action or copy to inner label"; no-action or copy to inner label";
} }
description
"MPLS decap.";
} }
} }
} }
} }
grouping route-attributes { grouping route-attributes {
description description
"Route attributes."; "Route attributes.";
leaf route-preference { leaf route-preference {
type uint32 ; type uint32;
mandatory true; mandatory true;
description description
"ROUTE_PREFERENCE: This is a numerical value that "ROUTE_PREFERENCE: This is a numerical value that
allows for comparing routes from different allows for comparing routes from different
protocols. Static configuration is also protocols. Static configuration is also
considered a protocol for the purpose of this considered a protocol for the purpose of this
field. It iss also known as administrative-distance. field. It iss also known as administrative-distance.
The lower the value, the higher the preference."; The lower the value, the higher the preference.";
} }
leaf local-only { leaf local-only {
skipping to change at page 47, line 38 skipping to change at page 48, line 46
case mpls-route-attributes { case mpls-route-attributes {
} }
case ethernet-route-attributes { case ethernet-route-attributes {
} }
} }
} }
} }
container routing-instance { container routing-instance {
description description
"Configuration of an 'i2rs' pseudo-protocol "A routing instance, in the context of
instance consists of a list of ribs."; the RIB information model, is a collection
of RIBs, interfaces, and routing parameters";
leaf name { leaf name {
type string; type string;
mandatory true; mandatory true;
description description
"A routing instance is identified by its name, "The name of the routing instance.This MUST
INSTANCE_name. This MUST be unique across all be unique across all routing instances in
routing instances in a given network device."; a given network device.";
} }
list interface-list { list interface-list {
key "name"; key "name";
description description
"This represents the list of interfaces associated "This represents the list of interfaces associated
with this routing instance. The interface list helps with this routing instance. The interface list helps
constrain the boundaries of packet forwarding. constrain the boundaries of packet forwarding.
Packets coming on these interfaces are directly Packets coming on these interfaces are directly
associated with the given routing instance. The associated with the given routing instance. The
interface list contains a list of identifiers, with interface list contains a list of identifiers, with
each identifier uniquely identifying an interface."; each identifier uniquely identifying an interface.";
leaf name { leaf name {
type if:interface-ref; type if:interface-ref;
description description
"A reference to the name of a configured "A reference to the name of a network layer interface.";
network layer interface.";
} }
} }
leaf router-id { leaf router-id {
type yang:dotted-quad; type yang:dotted-quad;
description description
"Router ID - 32-bit number in the form of a dotted quad."; "Router ID - 32-bit number in the form of a dotted quad.";
} }
leaf lookup-limit { leaf lookup-limit {
type uint8; type uint8;
description description
"A limit on how many levels of a lookup can be performed."; "A limit on how many levels of a lookup can be performed.";
} }
list rib-list { list rib-list {
key "name"; key "name";
description description
"This is the list of RIBs associated with this routing "A list of RIBs that are associated with the routing
instance. Each routing instance can have multiple RIBs instance.";
to represent routes of different types.";
leaf name { leaf 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 each rib.";
} }
leaf rib-family { leaf rib-family {
type rib-family-def; type rib-family-def;
mandatory true; mandatory true;
description description
"The address family of the rib."; "The address family of a rib.";
} }
leaf enable-ip-rpf-check { leaf ip-rpf-check {
type boolean; type boolean;
description description
"Each RIB can be optionally associated with a "Each RIB can be optionally associated with a
ENABLE_IP_RPF_CHECK attribute that enables Reverse ENABLE_IP_RPF_CHECK attribute that enables Reverse
path forwarding (RPF) checks on all IP routes in that path forwarding (RPF) checks on all IP routes in that
RIB. Reverse path forwarding (RPF) check is used to RIB. Reverse path forwarding (RPF) check is used to
prevent spoofing and limit malicious traffic."; prevent spoofing and limit malicious traffic.";
} }
list route-list { list route-list {
key "route-index"; key "route-index";
description description
"A routes of a rib."; "A list of routes of a rib.";
uses route; uses route;
} }
} }
} }
/*RPC Operations*/ /*RPC Operations*/
rpc rib-add { rpc rib-add {
description description
"To add a rib to a instance"; "To add a rib to a instance";
input { input {
leaf rib-name { leaf rib-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 added."; that is to be added.";
skipping to change at page 49, line 34 skipping to change at page 50, line 39
description description
"A reference to the name of the rib "A reference to the name of the rib
that is to be added."; that is to be added.";
} }
leaf rib-family { leaf rib-family {
type rib-family-def; type rib-family-def;
mandatory true; mandatory true;
description description
"The address family of the rib."; "The address family of the rib.";
} }
leaf enable-ip-rpf-check { leaf ip-rpf-check {
type boolean; type boolean;
description description
"Each RIB can be optionally associated with a "Each RIB can be optionally associated with a
ENABLE_IP_RPF_CHECK attribute that enables Reverse ENABLE_IP_RPF_CHECK attribute that enables Reverse
path forwarding (RPF) checks on all IP routes in that path forwarding (RPF) checks on all IP routes in that
RIB. Reverse path forwarding (RPF) check is used to RIB. Reverse path forwarding (RPF) check is used to
prevent spoofing and limit malicious traffic."; prevent spoofing and limit malicious traffic.";
} }
} }
output { output {
leaf result { leaf result {
type boolean ; type boolean;
mandatory true; mandatory true;
description description
"Return the result of the rib-add operation. "Return the result of the rib-add operation.
1 - means success; true - success;
0 - means falied."; false - failed.";
} }
} }
} }
rpc rib-delete { rpc rib-delete {
description description
"To delete a rib from a routing instance, "To delete a rib from a routing instance.
by deleting the rib, all routes installed After deleting the rib, all routes installed
in the rib will be deleted as well."; in the rib will be deleted as well.";
input { input {
leaf rib-name { leaf rib-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 deleted.";
} }
} }
output { output {
leaf result { leaf result {
type boolean ; type boolean;
mandatory true; mandatory true;
description description
"Return the result of the rib-delete operation. "Return the result of the rib-delete operation.
1 - means success; true - success;
0 - means falied."; false - failed.";
} }
} }
} }
rpc route-add { rpc route-add {
description description
"To add a route or a list of route to a rib"; "To add a route or a list of route to a rib";
input { input {
leaf rib-name { leaf rib-name {
type string; type string;
skipping to change at page 50, line 48 skipping to change at page 52, line 4
input { 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.";
} }
container routes { container routes {
description description
"The routes to be added to the rib."; "The routes to be added to the rib.";
list route-list { list route-list {
key "route-index"; key "route-index";
description description
"Use a list to include all routes to be added."; "The list of routes to be added.";
uses route-prefix; uses route-prefix;
uses route-attributes; container route-attributes {
uses route-vendor-attributes; uses route-attributes;
uses nexthop; description
"Route attributes.";
}
container route-vendor-attributes {
if-feature route-vendor-attributes;
uses route-vendor-attributes;
description
"Route vendor attributes.";
}
container nexthop {
uses nexthop;
description
"Nexthop.";
}
} }
} }
} }
output { output {
leaf result { leaf result {
type boolean ; type boolean;
mandatory true; mandatory true;
description description
"Return the result of the route-add operation. "Return the result of the route-add operation.
1 - means success; true - success;
0 - means falied."; false - failed.";
} }
} }
} }
rpc route-delete { rpc route-delete {
description description
"To delete a route or a list of route from a rib"; "To delete a route or a list of route from a rib";
input { input {
leaf rib-name { leaf rib-name {
type string; type string;
skipping to change at page 51, line 46 skipping to change at page 53, line 13
description description
"The routes to be added to the rib."; "The routes to be added to the rib.";
list route-list{ list route-list{
key "route-index"; key "route-index";
description description
"The list of routes to be deleted."; "The list of routes to be deleted.";
uses route-prefix; uses route-prefix;
} }
} }
} }
output { output {
leaf result { leaf result {
type boolean ; type boolean ;
mandatory true; mandatory true;
description description
"Return the result of the route-delete operation. "Return the result of the route-delete operation.
true - success;
1 - means success; false - failed.";
0 - means falied.";
} }
} }
} }
rpc route-update { rpc route-update {
description description
"To update a route or a list of route of a rib. "To update a route or a list of route of a rib.
The inputs: The inputs:
1. The match conditions, could be: 1. The match conditions, could be:
a. route prefix, or a. route prefix, or
b. route attribtes, or b. route attribtes, or
c. nexthop; c. nexthop;
2. The update parameters to be used: 2. The update parameters to be used:
a. new nexhop; a. new nexhop;
b. new route attributes; b. new route attributes;
Actions: Actions:
1. update the nexthop 1. update the nexthop
2. update the route attributes 2. update the route attributes
The outputs: The outputs:
1 - success; true - success;
0 - failed. false - failed.
"; ";
input { 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.";
} }
choice match-conditions { choice match-conditions {
description description
"When conditions matched, update the routes."; "Match options.";
//Update routes that have the matched route prefixes
case match-route-prefix { case match-route-prefix {
description
"Update the routes that match route
prefix(es) condition.";
container input-routes { container input-routes {
description description
"The matched routes to be updated."; "The matched routes to be updated.";
list route-list { list route-list {
key "route-index"; key "route-index";
description description
"The list of routes to be updated."; "The list of routes to be updated.";
uses route-prefix; uses route-prefix;
choice update-actions-prefix { choice update-actions-prefix {
description description
"Update actions include: "Update actions:
1. update the nexthop
1. update nexthop 2. update the route attributes
2. update route attributes 3. update the route-vendor-attributes.
3. update route-vendor-attributes.
"; ";
case update-nexthop { case update-nexthop {
uses nexthop; uses nexthop;
} }
case update-route-attributes { case update-route-attributes {
uses route-attributes; uses route-attributes;
} }
case update-route-vendor-attributes { case update-route-vendor-attributes {
if-feature route-vendor-attributes;
uses route-vendor-attributes; uses route-vendor-attributes;
} }
} }
} }
} }
} }
//Update the routes that have the matched attributes
case match-route-attributes { case match-route-attributes {
description
"Update the routes that match the
route attributes condition.";
container input-route-attributes { container input-route-attributes {
description description
"The route attributes are used for matching."; "The route attributes are used for matching.";
uses route-attributes; uses route-attributes;
} }
choice update-actions-attributes { choice update-actions-attributes {
description description
"Update actions include: "Update actions:
1. update nexthop 1. update the nexthop
2. update route attributes 2. update the route attributes
3. update route-vendor-attributes. 3. update the route-vendor-attributes.";
";
case update-nexthop { case update-nexthop {
uses nexthop; uses nexthop;
} }
case update-route-attributes { case update-route-attributes {
uses route-attributes; uses route-attributes;
} }
case update-route-vendor-attributes { case update-route-vendor-attributes {
if-feature route-vendor-attributes;
uses route-vendor-attributes; uses route-vendor-attributes;
} }
} }
} }
//Update the routes that have the matched vendor attributes case match-route-vendor-attributes {
case match-vendor-route-attributes { if-feature route-vendor-attributes;
container input-vendor-route-attributes { description
"Update the routes that match the
vendor attributes condition";
container input-route-vendor-attributes {
description description
"The vendor route attributes are used for matching."; "The vendor route attributes are used for matching.";
uses route-vendor-attributes; uses route-vendor-attributes;
} }
choice update-actions-vendor-attributes { choice update-actions-vendor-attributes {
description description
"Update actions include: "Update actions:
1. update nexthop 1. update the nexthop
2. update route attributes 2. update the route attributes
3. update route-vendor-attributes. 3. update the route-vendor-attributes.";
";
case update-nexthop { case update-nexthop {
uses nexthop; uses nexthop;
} }
case update-route-attributes { case update-route-attributes {
uses route-attributes; uses route-attributes;
} }
case update-route-vendor-attributes { case update-route-vendor-attributes {
uses route-vendor-attributes; uses route-vendor-attributes;
} }
} }
} }
//Update the routes that have the matched nexthop
case match-nexthop { case match-nexthop {
description
"Update the routes that match the nexthop.";
container input-nexthop { container input-nexthop {
description description
"The nexthop used for matching."; "The nexthop used for matching.";
uses nexthop; uses nexthop;
} }
choice update-actions-nexthop { choice update-actions-nexthop {
description description
"Update actions include: "Update actions:
1. update nexthop 1. update nexthop
2. update route attributes 2. update route attributes
3. update route-vendor-attributes. 3. update route-vendor-attributes.";
";
case update-nexthop { case update-nexthop {
uses nexthop; uses nexthop;
} }
case update-route-attributes { case update-route-attributes {
uses route-attributes; uses route-attributes;
} }
case update-route-vendor-attributes { case update-route-vendor-attributes {
uses route-vendor-attributes; if-feature route-vendor-attributes;
uses route-vendor-attributes;
} }
} }
} }
} }
} }
output { output {
leaf result { leaf result {
type boolean ; type boolean ;
mandatory true; mandatory true;
description description
"Return the result of the route-update operation. "Return the result of the route-update operation.
1 - means success; true - success;
0 - means falied."; false - failed.";
} }
} }
} }
rpc nh-add { rpc nh-add {
description description
"To add a nexthop to a rib. "To add a nexthop to a rib.
Inputs parameters: Inputs parameters:
1. rib name 1. rib name
2. nexthop; 2. nexthop;
Actions: Actions:
Add the nexthop to the rib Add the nexthop to the rib
Outputs: Outputs:
1.Operation result: 1.Operation result:
1 - means success true - success
0 - means faled; false - failed;
2. nexthop identifier."; 2. nexthop identifier.";
input { 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; uses nexthop;
} }
skipping to change at page 55, line 38 skipping to change at page 57, line 12
2. nexthop identifier."; 2. nexthop identifier.";
input { 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; uses nexthop;
} }
output { output {
leaf result { leaf result {
type boolean ; type boolean ;
mandatory true; mandatory true;
description description
"Return the result of the nh-add operation. "Return the result of the nh-add operation.
1 - means success; true - success;
0 - means falied."; false - failed.";
} }
leaf nexthop-id { leaf nexthop-id {
type uint32; type uint32;
mandatory true; mandatory true;
description description
"A nexthop identifer that is allocated to the nexthop."; "A nexthop identifer that is allocated to the nexthop.";
} }
} }
} }
rpc nh-delete { rpc nh-delete {
description description
"To delete a nexthop from a rib"; "To delete a nexthop from a rib";
input { 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.";
} }
choice nexthop-context-or-id { uses nexthop;
description
"Delete a nexthop by inputing
the nexthop itself or its nexthop id.";
case nexthop-context {
uses nexthop;
}
case nexthop-identifier {
leaf nexthop-identifer {
type uint32;
mandatory true;
description
"A reference to the nexthop to be deleted.";
}
}
}
} }
output { output {
leaf result { leaf result {
type boolean ; type boolean ;
mandatory true; mandatory true;
description description
"Return the result of the nh-delete operation. "Return the result of the nh-delete operation.
1 - means success; true - success;
0 - means falied."; false - failed.";
} }
} }
} }
/*Notifications*/ /*Notifications*/
notification nexthop-resolution-status-change { notification nexthop-resolution-status-change {
description description
"Nexthop resolution status (resolved/unresolved) "Nexthop resolution status (resolved/unresolved)
notification."; notification.";
container nexthop{ container nexthop{
description description
"The nexthop."; "The nexthop.";
skipping to change at page 59, line 37 skipping to change at page 60, line 38
7.2. Informative References 7.2. Informative References
[I-D.ietf-i2rs-architecture] [I-D.ietf-i2rs-architecture]
Atlas, A., Halpern, J., Hares, S., Ward, D., and T. 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", draft-ietf-i2rs-architecture-09 (work in System", draft-ietf-i2rs-architecture-09 (work in
progress), March 2015. progress), March 2015.
[I-D.ietf-i2rs-rib-info-model] [I-D.ietf-i2rs-rib-info-model]
Bahadur, N., Kini, S., and J. Medved, "Routing Information Bahadur, N., Kini, S., and J. Medved, "Routing Information
Base Info Model", draft-ietf-i2rs-rib-info-model-07 (work Base Info Model", draft-ietf-i2rs-rib-info-model-08 (work
in progress), September 2015. in progress), October 2015.
[I-D.ietf-i2rs-usecase-reqs-summary] [I-D.ietf-i2rs-usecase-reqs-summary]
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-01 Requirements", draft-ietf-i2rs-usecase-reqs-summary-01
(work in progress), May 2015. (work in progress), May 2015.
Authors' Addresses Authors' Addresses
Lixing Wang Lixing Wang
Individual Individual
 End of changes. 200 change blocks. 
743 lines changed or deleted 816 lines changed or added

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