summaryrefslogtreecommitdiff
path: root/doc/rfc/rfc9070.txt
diff options
context:
space:
mode:
authorThomas Voss <mail@thomasvoss.com> 2024-11-27 20:54:24 +0100
committerThomas Voss <mail@thomasvoss.com> 2024-11-27 20:54:24 +0100
commit4bfd864f10b68b71482b35c818559068ef8d5797 (patch)
treee3989f47a7994642eb325063d46e8f08ffa681dc /doc/rfc/rfc9070.txt
parentea76e11061bda059ae9f9ad130a9895cc85607db (diff)
doc: Add RFC documents
Diffstat (limited to 'doc/rfc/rfc9070.txt')
-rw-r--r--doc/rfc/rfc9070.txt4314
1 files changed, 4314 insertions, 0 deletions
diff --git a/doc/rfc/rfc9070.txt b/doc/rfc/rfc9070.txt
new file mode 100644
index 0000000..a5400fc
--- /dev/null
+++ b/doc/rfc/rfc9070.txt
@@ -0,0 +1,4314 @@
+
+
+
+
+Internet Engineering Task Force (IETF) K. Raza, Ed.
+Request for Comments: 9070 R. Asati
+Category: Standards Track Cisco Systems
+ISSN: 2070-1721 X. Liu
+ IBM Corporation
+ S. Easale
+ Juniper Networks
+ X. Chen
+ Huawei Technologies
+ H. Shah
+ Ciena Corporation
+ March 2022
+
+
+ YANG Data Model for MPLS LDP
+
+Abstract
+
+ This document describes a YANG data model for the Multiprotocol Label
+ Switching (MPLS) Label Distribution Protocol (LDP). The model also
+ serves as the base model to define the Multipoint LDP (mLDP) model.
+
+ The YANG modules in this document conform to the Network Management
+ Datastore Architecture (NMDA).
+
+Status of This Memo
+
+ This is an Internet Standards Track document.
+
+ This document is a product of the Internet Engineering Task Force
+ (IETF). It represents the consensus of the IETF community. It has
+ received public review and has been approved for publication by the
+ Internet Engineering Steering Group (IESG). Further information on
+ Internet Standards is available in Section 2 of RFC 7841.
+
+ Information about the current status of this document, any errata,
+ and how to provide feedback on it may be obtained at
+ https://www.rfc-editor.org/info/rfc9070.
+
+Copyright Notice
+
+ Copyright (c) 2022 IETF Trust and the persons identified as the
+ document authors. All rights reserved.
+
+ This document is subject to BCP 78 and the IETF Trust's Legal
+ Provisions Relating to IETF Documents
+ (https://trustee.ietf.org/license-info) in effect on the date of
+ publication of this document. Please review these documents
+ carefully, as they describe your rights and restrictions with respect
+ to this document. Code Components extracted from this document must
+ include Revised BSD License text as described in Section 4.e of the
+ Trust Legal Provisions and are provided without warranty as described
+ in the Revised BSD License.
+
+Table of Contents
+
+ 1. Introduction
+ 1.1. Base and Extended
+ 2. Specification of Requirements
+ 3. Overview
+ 4. The Complete Tree
+ 5. Configuration
+ 5.1. Configuration Hierarchy
+ 5.1.1. Global Parameters
+ 5.1.2. Capabilities Parameters
+ 5.1.3. Per-Address-Family Parameters
+ 5.1.4. Hello Discovery Parameters
+ 5.1.5. Peer Parameters
+ 5.1.6. Forwarding Parameters
+ 6. Operational State
+ 6.1. Adjacency State
+ 6.2. Peer State
+ 6.3. Bindings State
+ 6.4. Capabilities State
+ 7. Notifications
+ 8. Action
+ 9. YANG Specification
+ 9.1. Base
+ 9.2. Extended
+ 10. Security Considerations
+ 10.1. YANG Data Model
+ 10.1.1. Writable Nodes
+ 10.1.2. Readable Nodes
+ 10.1.3. RPC Operations
+ 10.1.4. Notifications
+ 11. IANA Considerations
+ 12. Normative References
+ 13. Informative References
+ Appendix A. Data Tree Example
+ Acknowledgments
+ Contributors
+ Authors' Addresses
+
+1. Introduction
+
+ The Network Configuration Protocol (NETCONF) [RFC6241] is one of the
+ network management protocols that defines mechanisms to manage
+ network devices. YANG [RFC6020] [RFC7950] is a modular language that
+ represents data structures in an XML tree format and is used as a
+ data modeling language for NETCONF.
+
+ This document introduces a YANG data model for the MPLS Label
+ Distribution Protocol (LDP) [RFC5036]. This model also covers LDP
+ IPv6 [RFC7552] and LDP capability [RFC5561] specifications.
+
+ The data model is defined for the following constructs that are used
+ for managing the protocol:
+
+ * Configuration
+
+ * Operational State
+
+ * Executables (Actions)
+
+ * Notifications
+
+ This document is organized to define the data model for each of the
+ above constructs in the sequence as listed above.
+
+1.1. Base and Extended
+
+ The configuration and state items are divided into the following two
+ broad categories:
+
+ * Base
+
+ * Extended
+
+ The "base" category contains the basic and fundamental features that
+ are covered in LDP base specification [RFC5036] and constitute the
+ minimum requirements for a typical base LDP deployment, whereas the
+ "extended" category contains other non-base features. All the items
+ in a base category are mandatory and, hence, no "if-feature" is
+ allowed under the "base" category. The base and extended categories
+ are defined in their own modules as described later.
+
+ The examples of a base feature include the configuration of LDP lsr-
+ id, enabling LDP interfaces, setting passwords for LDP sessions,
+ etc., whereas the examples of an extended feature include inbound/
+ outbound label policies, IGP Sync [RFC5443], downstream on demand,
+ etc. It is worth highlighting that LDP IPv6 [RFC7552] is also
+ categorized as an extended feature.
+
+ While "base" model support will suffice for small deployments, it is
+ expected that large deployments will require both "base" and
+ "extended" model support from the vendors.
+
+2. Specification of Requirements
+
+ In this document, the word "IP" is used to refer to both IPv4 and
+ IPv6 unless otherwise explicitly stated. For example, "IP address
+ family" should be read as "IPv4 and/or IPv6 address family".
+
+3. Overview
+
+ This document defines two new modules for LDP YANG support:
+
+ "ietf-mpls-ldp"
+ A module that specifies the base LDP features and augments
+ /rt:routing/rt:control-plane-protocols/rt:control-plane-protocol
+ defined in [RFC8349]. We define the new identity 'mpls-ldp' for
+ LDP; the model allows only a single instance of 'mpls-ldp'.
+
+ "ietf-mpls-ldp-extended"
+ A module that specifies the extended LDP features and augments the
+ base LDP module.
+
+ It is to be noted that the mLDP YANG data model [MPLS-MLDP-YANG]
+ augments LDP base and extended modules to specify the mLDP-specific
+ base and extended features.
+
+ There are four types of containers in our module(s):
+
+ * Read-write parameters for configuration (Section 5)
+
+ * Read-only parameters for operational state (Section 6)
+
+ * Notifications for events (Section 7)
+
+ * RPCs for executing commands to perform some action (Section 8)
+
+ The modules in this document conform to the Network Management
+ Datastore Architecture (NMDA) defined in [RFC8342]. The operational
+ state data is combined with the associated configuration data in the
+ same hierarchy [RFC8407]. When protocol states are retrieved from
+ the NMDA operational state datastore, the returned states cover all
+ "config true" (rw) and "config false" (ro) nodes defined in the
+ schema.
+
+ The following diagram depicts high-level LDP YANG tree organization
+ and hierarchy:
+
+ +-- rw routing
+ +-- rw control-plane-protocols
+ +-- rw control-plane-protocol
+ +-- rw mpls-ldp
+ +-- rw ...
+ +-- rw ... // base
+ | +-- rw ...
+ | +-- ro ...
+ | +--
+ +-- ro ...
+ | +-- ro ...
+ | +-- ro ...
+ | +--
+ +-- rw ldp-ext: .... // extended
+ | +-- rw ...
+ | +-- ro ...
+ | +--
+ +-- ro ...
+ +-- ro ...
+ +-- ro ...
+
+
+ rpcs:
+ +-- x mpls-ldp-some_action
+ +-- x . . . . .
+
+ notifications:
+ +--- n mpls-ldp-some_event
+ +--- n ...
+
+ Figure 1: LDP YANG Tree Organization
+
+ Before going into data model details, it is important to take note of
+ the following points:
+
+ * This model aims to address only the core LDP parameters as per RFC
+ specification, as well as well-known and widely deployed
+ manageability controls (such as label filtering policies to apply
+ filtering rules on the assignment, advertisement, and acceptance
+ for label bindings). Any vendor-specific feature should be
+ defined in a vendor-specific augmentation of this model.
+
+ * Multi-topology LDP [RFC7307] is beyond the scope of this document.
+
+ * This model does not cover any applications running on top of LDP,
+ nor does it cover any Operations, Administration, and Maintenance
+ (OAM) procedures for LDP.
+
+ * This model is a VRF-centric model. It is important to note that
+ [RFC4364] defines VPN Routing and Forwarding (VRF) tables and
+ default forwarding tables as different; however, from a YANG
+ modeling perspective, this introduces unnecessary complications;
+ hence, we are treating the default forwarding table as just
+ another VRF.
+
+ * A "network-instance", as defined in [RFC8529], refers to a VRF
+ instance (both default and non-default) within the scope of this
+ model.
+
+ * This model supports two address families, namely, "ipv4" and
+ "ipv6".
+
+ * This model assumes platform-wide label space (i.e., label space Id
+ of zero). However, when upstream label assignment [RFC6389] is in
+ use, an upstream assigned label is looked up in a Context-Specific
+ Label Space as defined in [RFC5331].
+
+ * The label and peer policies (including filters) are defined using
+ prefix-set and neighbor-set, respectively, as defined in the
+ routing-policy model [RFC9067].
+
+ * This model uses the terms LDP "neighbor/adjacency", "session", and
+ "peer" with the following semantics:
+
+ Neighbor/Adjacency: An LDP-enabled Label Switching Router (LSR)
+ that is discovered through LDP discovery mechanisms.
+
+ Session: An LDP neighbor with whom a TCP connection has been
+ established.
+
+ Peer: An LDP session that has successfully progressed beyond its
+ initialization phase and is either already exchanging the
+ bindings or is ready to do so.
+
+ It is to be noted that LDP Graceful Restart (GR) mechanisms
+ defined in [RFC3478] allow keeping the exchanged bindings for some
+ time after a session goes down with a peer. We refer to such a
+ state as belonging to a "stale" peer, i.e., keeping peer bindings
+ from a peer with whom currently there is either no connection
+ established or connection is established but the GR session is in
+ recovery state. When used in this document, the above terms will
+ refer strictly to the semantics and definitions defined for them.
+
+ A simplified graphical tree representation of base and extended LDP
+ YANG data models is presented in Figure 2. The meaning of the
+ symbols in these tree diagrams is defined in [RFC8340].
+
+ The actual YANG specification for base and extended modules is
+ captured in Section 9.
+
+ While presenting the YANG tree view and actual specification, this
+ document assumes readers are familiar with the concepts of YANG
+ modeling, its presentation, and its compilation.
+
+4. The Complete Tree
+
+ The following is a complete tree representation of configuration,
+ state, notification, and RPC items under LDP base and extended
+ modules.
+
+ module: ietf-mpls-ldp
+ augment /rt:routing/rt:control-plane-protocols
+ /rt:control-plane-protocol:
+ +--rw mpls-ldp
+ +--rw global
+ | +--rw capability
+ | | +--rw ldp-ext:end-of-lib {capability-end-of-lib}?
+ | | | +--rw ldp-ext:enabled? boolean
+ | | +--rw ldp-ext:typed-wildcard-fec
+ | | | {capability-typed-wildcard-fec}?
+ | | | +--rw ldp-ext:enabled? boolean
+ | | +--rw ldp-ext:upstream-label-assignment
+ | | {capability-upstream-label-assignment}?
+ | | +--rw ldp-ext:enabled? boolean
+ | +--rw graceful-restart
+ | | +--rw enabled? boolean
+ | | +--rw reconnect-time? uint16
+ | | +--rw recovery-time? uint16
+ | | +--rw forwarding-holdtime? uint16
+ | | +--rw ldp-ext:helper-enabled? boolean
+ | | {graceful-restart-helper-mode}?
+ | +--rw lsr-id?
+ | | rt-types:router-id
+ | +--rw address-families
+ | | +--rw ipv4!
+ | | | +--rw enabled? boolean
+ | | | +--ro label-distribution-control-mode? enumeration
+ | | | +--ro bindings
+ | | | | +--ro address* [address]
+ | | | | | +--ro address inet:ipv4-address
+ | | | | | +--ro advertisement-type? advertised-received
+ | | | | | +--ro peer
+ | | | | | +--ro lsr-id? leafref
+ | | | | | +--ro label-space-id? leafref
+ | | | | +--ro fec-label* [fec]
+ | | | | +--ro fec inet:ipv4-prefix
+ | | | | +--ro peer*
+ | | | | [lsr-id label-space-id advertisement-type]
+ | | | | +--ro lsr-id leafref
+ | | | | +--ro label-space-id leafref
+ | | | | +--ro advertisement-type
+ | | | | | advertised-received
+ | | | | +--ro label?
+ | | | | | rt-types:mpls-label
+ | | | | +--ro used-in-forwarding? boolean
+ | | | +--rw ldp-ext:label-policy
+ | | | | +--rw ldp-ext:advertise
+ | | | | | +--rw ldp-ext:egress-explicit-null
+ | | | | | | +--rw ldp-ext:enabled? boolean
+ | | | | | +--rw ldp-ext:prefix-list?
+ | | | | | prefix-list-ref
+ | | | | +--rw ldp-ext:accept
+ | | | | | +--rw ldp-ext:prefix-list? prefix-list-ref
+ | | | | +--rw ldp-ext:assign
+ | | | | {policy-label-assignment-config}?
+ | | | | +--rw ldp-ext:independent-mode
+ | | | | | +--rw ldp-ext:prefix-list? prefix-list-ref
+ | | | | +--rw ldp-ext:ordered-mode
+ | | | | {policy-ordered-label-config}?
+ | | | | +--rw ldp-ext:egress-prefix-list?
+ | | | | prefix-list-ref
+ | | | +--rw ldp-ext:transport-address?
+ | | | inet:ipv4-address
+ | | +--rw ldp-ext:ipv6!
+ | | +--rw ldp-ext:enabled?
+ | | | boolean
+ | | +--rw ldp-ext:label-policy
+ | | | +--rw ldp-ext:advertise
+ | | | | +--rw ldp-ext:egress-explicit-null
+ | | | | | +--rw ldp-ext:enabled? boolean
+ | | | | +--rw ldp-ext:prefix-list?
+ | | | | prefix-list-ref
+ | | | +--rw ldp-ext:accept
+ | | | | +--rw ldp-ext:prefix-list? prefix-list-ref
+ | | | +--rw ldp-ext:assign
+ | | | {policy-label-assignment-config}?
+ | | | +--rw ldp-ext:independent-mode
+ | | | | +--rw ldp-ext:prefix-list? prefix-list-ref
+ | | | +--rw ldp-ext:ordered-mode
+ | | | {policy-ordered-label-config}?
+ | | | +--rw ldp-ext:egress-prefix-list?
+ | | | prefix-list-ref
+ | | +--rw ldp-ext:transport-address
+ | | | inet:ipv6-address
+ | | +--ro ldp-ext:label-distribution-control-mode?
+ | | | enumeration
+ | | +--ro ldp-ext:bindings
+ | | +--ro ldp-ext:address* [address]
+ | | | +--ro ldp-ext:address
+ | | | | inet:ipv6-address
+ | | | +--ro ldp-ext:advertisement-type?
+ | | | | advertised-received
+ | | | +--ro ldp-ext:peer
+ | | | +--ro ldp-ext:lsr-id? leafref
+ | | | +--ro ldp-ext:label-space-id? leafref
+ | | +--ro ldp-ext:fec-label* [fec]
+ | | +--ro ldp-ext:fec inet:ipv6-prefix
+ | | +--ro ldp-ext:peer*
+ | | [lsr-id label-space-id advertisement-type]
+ | | +--ro ldp-ext:lsr-id leafref
+ | | +--ro ldp-ext:label-space-id leafref
+ | | +--ro ldp-ext:advertisement-type
+ | | | advertised-received
+ | | +--ro ldp-ext:label?
+ | | | rt-types:mpls-label
+ | | +--ro ldp-ext:used-in-forwarding? boolean
+ | +--rw ldp-ext:forwarding-nexthop
+ | | {forwarding-nexthop-config}?
+ | | +--rw ldp-ext:interfaces
+ | | +--rw ldp-ext:interface* [name]
+ | | +--rw ldp-ext:name if:interface-ref
+ | | +--rw ldp-ext:address-family* [afi]
+ | | +--rw ldp-ext:afi identityref
+ | | +--rw ldp-ext:ldp-disable? boolean
+ | +--rw ldp-ext:igp-synchronization-delay? uint16
+ +--rw discovery
+ | +--rw interfaces
+ | | +--rw hello-holdtime? uint16
+ | | +--rw hello-interval? uint16
+ | | +--rw interface* [name]
+ | | +--rw name
+ | | | if:interface-ref
+ | | +--ro next-hello? uint16
+ | | +--rw address-families
+ | | | +--rw ipv4!
+ | | | | +--rw enabled? boolean
+ | | | | +--ro hello-adjacencies
+ | | | | | +--ro hello-adjacency* [adjacent-address]
+ | | | | | +--ro adjacent-address
+ | | | | | | inet:ipv4-address
+ | | | | | +--ro flag* identityref
+ | | | | | +--ro hello-holdtime
+ | | | | | | +--ro adjacent? uint16
+ | | | | | | +--ro negotiated? uint16
+ | | | | | | +--ro remaining? uint16
+ | | | | | +--ro next-hello? uint16
+ | | | | | +--ro statistics
+ | | | | | | +--ro discontinuity-time
+ | | | | | | | yang:date-and-time
+ | | | | | | +--ro hello-received?
+ | | | | | | | yang:counter64
+ | | | | | | +--ro hello-dropped?
+ | | | | | | yang:counter64
+ | | | | | +--ro peer
+ | | | | | +--ro lsr-id? leafref
+ | | | | | +--ro label-space-id? leafref
+ | | | | +--rw ldp-ext:transport-address? union
+ | | | +--rw ldp-ext:ipv6!
+ | | | +--rw ldp-ext:enabled? boolean
+ | | | +--ro ldp-ext:hello-adjacencies
+ | | | | +--ro ldp-ext:hello-adjacency*
+ | | | | [adjacent-address]
+ | | | | +--ro ldp-ext:adjacent-address
+ | | | | | inet:ipv6-address
+ | | | | +--ro ldp-ext:flag*
+ | | | | | identityref
+ | | | | +--ro ldp-ext:hello-holdtime
+ | | | | | +--ro ldp-ext:adjacent? uint16
+ | | | | | +--ro ldp-ext:negotiated? uint16
+ | | | | | +--ro ldp-ext:remaining? uint16
+ | | | | +--ro ldp-ext:next-hello? uint16
+ | | | | +--ro ldp-ext:statistics
+ | | | | | +--ro ldp-ext:discontinuity-time
+ | | | | | | yang:date-and-time
+ | | | | | +--ro ldp-ext:hello-received?
+ | | | | | | yang:counter64
+ | | | | | +--ro ldp-ext:hello-dropped?
+ | | | | | yang:counter64
+ | | | | +--ro ldp-ext:peer
+ | | | | +--ro ldp-ext:lsr-id? leafref
+ | | | | +--ro ldp-ext:label-space-id? leafref
+ | | | +--rw ldp-ext:transport-address? union
+ | | +--rw ldp-ext:hello-holdtime? uint16
+ | | | {per-interface-timer-config}?
+ | | +--rw ldp-ext:hello-interval? uint16
+ | | | {per-interface-timer-config}?
+ | | +--rw ldp-ext:igp-synchronization-delay? uint16
+ | | {per-interface-timer-config}?
+ | +--rw targeted
+ | +--rw hello-holdtime? uint16
+ | +--rw hello-interval? uint16
+ | +--rw hello-accept
+ | | +--rw enabled? boolean
+ | | +--rw ldp-ext:neighbor-list? neighbor-list-ref
+ | | {policy-targeted-discovery-config}?
+ | +--rw address-families
+ | +--rw ipv4!
+ | | +--ro hello-adjacencies
+ | | | +--ro hello-adjacency*
+ | | | [local-address adjacent-address]
+ | | | +--ro local-address inet:ipv4-address
+ | | | +--ro adjacent-address inet:ipv4-address
+ | | | +--ro flag* identityref
+ | | | +--ro hello-holdtime
+ | | | | +--ro adjacent? uint16
+ | | | | +--ro negotiated? uint16
+ | | | | +--ro remaining? uint16
+ | | | +--ro next-hello? uint16
+ | | | +--ro statistics
+ | | | | +--ro discontinuity-time
+ | | | | | yang:date-and-time
+ | | | | +--ro hello-received?
+ | | | | | yang:counter64
+ | | | | +--ro hello-dropped?
+ | | | | yang:counter64
+ | | | +--ro peer
+ | | | +--ro lsr-id? leafref
+ | | | +--ro label-space-id? leafref
+ | | +--rw target* [adjacent-address]
+ | | +--rw adjacent-address inet:ipv4-address
+ | | +--rw enabled? boolean
+ | | +--rw local-address? inet:ipv4-address
+ | +--rw ldp-ext:ipv6!
+ | +--ro ldp-ext:hello-adjacencies
+ | | +--ro ldp-ext:hello-adjacency*
+ | | [local-address adjacent-address]
+ | | +--ro ldp-ext:local-address
+ | | | inet:ipv6-address
+ | | +--ro ldp-ext:adjacent-address
+ | | | inet:ipv6-address
+ | | +--ro ldp-ext:flag*
+ | | | identityref
+ | | +--ro ldp-ext:hello-holdtime
+ | | | +--ro ldp-ext:adjacent? uint16
+ | | | +--ro ldp-ext:negotiated? uint16
+ | | | +--ro ldp-ext:remaining? uint16
+ | | +--ro ldp-ext:next-hello? uint16
+ | | +--ro ldp-ext:statistics
+ | | | +--ro ldp-ext:discontinuity-time
+ | | | | yang:date-and-time
+ | | | +--ro ldp-ext:hello-received?
+ | | | | yang:counter64
+ | | | +--ro ldp-ext:hello-dropped?
+ | | | yang:counter64
+ | | +--ro ldp-ext:peer
+ | | +--ro ldp-ext:lsr-id? leafref
+ | | +--ro ldp-ext:label-space-id? leafref
+ | +--rw ldp-ext:target* [adjacent-address]
+ | +--rw ldp-ext:adjacent-address
+ | | inet:ipv6-address
+ | +--rw ldp-ext:enabled? boolean
+ | +--rw ldp-ext:local-address?
+ | inet:ipv6-address
+ +--rw peers
+ +--rw authentication
+ | +--rw (authentication-type)?
+ | +--:(password)
+ | | +--rw key? string
+ | | +--rw crypto-algorithm? identityref
+ | +--:(ldp-ext:key-chain) {key-chain}?
+ | +--rw ldp-ext:key-chain? key-chain:key-chain-ref
+ +--rw session-ka-holdtime? uint16
+ +--rw session-ka-interval? uint16
+ +--rw peer* [lsr-id label-space-id]
+ | +--rw lsr-id rt-types:router-id
+ | +--rw label-space-id uint16
+ | +--rw authentication
+ | | +--rw (authentication-type)?
+ | | +--:(password)
+ | | | +--rw key? string
+ | | | +--rw crypto-algorithm? identityref
+ | | +--:(ldp-ext:key-chain) {key-chain}?
+ | | +--rw ldp-ext:key-chain?
+ | | key-chain:key-chain-ref
+ | +--rw address-families
+ | | +--rw ipv4!
+ | | | +--ro hello-adjacencies
+ | | | | +--ro hello-adjacency*
+ | | | | [local-address adjacent-address]
+ | | | | +--ro local-address inet:ipv4-address
+ | | | | +--ro adjacent-address inet:ipv4-address
+ | | | | +--ro flag* identityref
+ | | | | +--ro hello-holdtime
+ | | | | | +--ro adjacent? uint16
+ | | | | | +--ro negotiated? uint16
+ | | | | | +--ro remaining? uint16
+ | | | | +--ro next-hello? uint16
+ | | | | +--ro statistics
+ | | | | | +--ro discontinuity-time
+ | | | | | | yang:date-and-time
+ | | | | | +--ro hello-received?
+ | | | | | | yang:counter64
+ | | | | | +--ro hello-dropped?
+ | | | | | yang:counter64
+ | | | | +--ro interface? if:interface-ref
+ | | | +--rw ldp-ext:label-policy
+ | | | +--rw ldp-ext:advertise
+ | | | | +--rw ldp-ext:prefix-list? prefix-list-ref
+ | | | +--rw ldp-ext:accept
+ | | | +--rw ldp-ext:prefix-list? prefix-list-ref
+ | | +--rw ldp-ext:ipv6!
+ | | +--ro ldp-ext:hello-adjacencies
+ | | | +--ro ldp-ext:hello-adjacency*
+ | | | [local-address adjacent-address]
+ | | | +--ro ldp-ext:local-address
+ | | | | inet:ipv6-address
+ | | | +--ro ldp-ext:adjacent-address
+ | | | | inet:ipv6-address
+ | | | +--ro ldp-ext:flag*
+ | | | | identityref
+ | | | +--ro ldp-ext:hello-holdtime
+ | | | | +--ro ldp-ext:adjacent? uint16
+ | | | | +--ro ldp-ext:negotiated? uint16
+ | | | | +--ro ldp-ext:remaining? uint16
+ | | | +--ro ldp-ext:next-hello? uint16
+ | | | +--ro ldp-ext:statistics
+ | | | | +--ro ldp-ext:discontinuity-time
+ | | | | | yang:date-and-time
+ | | | | +--ro ldp-ext:hello-received?
+ | | | | | yang:counter64
+ | | | | +--ro ldp-ext:hello-dropped?
+ | | | | yang:counter64
+ | | | +--ro ldp-ext:interface?
+ | | | if:interface-ref
+ | | +--rw ldp-ext:label-policy
+ | | +--rw ldp-ext:advertise
+ | | | +--rw ldp-ext:prefix-list? prefix-list-ref
+ | | +--rw ldp-ext:accept
+ | | +--rw ldp-ext:prefix-list? prefix-list-ref
+ | +--ro label-advertisement-mode
+ | | +--ro local? label-adv-mode
+ | | +--ro peer? label-adv-mode
+ | | +--ro negotiated? label-adv-mode
+ | +--ro next-keep-alive? uint16
+ | +--ro received-peer-state
+ | | +--ro graceful-restart
+ | | | +--ro enabled? boolean
+ | | | +--ro reconnect-time? uint16
+ | | | +--ro recovery-time? uint16
+ | | +--ro capability
+ | | +--ro end-of-lib
+ | | | +--ro enabled? boolean
+ | | +--ro typed-wildcard-fec
+ | | | +--ro enabled? boolean
+ | | +--ro upstream-label-assignment
+ | | +--ro enabled? boolean
+ | +--ro session-holdtime
+ | | +--ro peer? uint16
+ | | +--ro negotiated? uint16
+ | | +--ro remaining? uint16
+ | +--ro session-state? enumeration
+ | +--ro tcp-connection
+ | | +--ro local-address? inet:ip-address
+ | | +--ro local-port? inet:port-number
+ | | +--ro remote-address? inet:ip-address
+ | | +--ro remote-port? inet:port-number
+ | +--ro up-time?
+ | | rt-types:timeticks64
+ | +--ro statistics
+ | | +--ro discontinuity-time yang:date-and-time
+ | | +--ro received
+ | | | +--ro total-octets? yang:counter64
+ | | | +--ro total-messages? yang:counter64
+ | | | +--ro address? yang:counter64
+ | | | +--ro address-withdraw? yang:counter64
+ | | | +--ro initialization? yang:counter64
+ | | | +--ro keepalive? yang:counter64
+ | | | +--ro label-abort-request? yang:counter64
+ | | | +--ro label-mapping? yang:counter64
+ | | | +--ro label-release? yang:counter64
+ | | | +--ro label-request? yang:counter64
+ | | | +--ro label-withdraw? yang:counter64
+ | | | +--ro notification? yang:counter64
+ | | +--ro sent
+ | | | +--ro total-octets? yang:counter64
+ | | | +--ro total-messages? yang:counter64
+ | | | +--ro address? yang:counter64
+ | | | +--ro address-withdraw? yang:counter64
+ | | | +--ro initialization? yang:counter64
+ | | | +--ro keepalive? yang:counter64
+ | | | +--ro label-abort-request? yang:counter64
+ | | | +--ro label-mapping? yang:counter64
+ | | | +--ro label-release? yang:counter64
+ | | | +--ro label-request? yang:counter64
+ | | | +--ro label-withdraw? yang:counter64
+ | | | +--ro notification? yang:counter64
+ | | +--ro total-addresses? uint32
+ | | +--ro total-labels? uint32
+ | | +--ro total-fec-label-bindings? uint32
+ | +--rw ldp-ext:admin-down? boolean
+ | | {per-peer-admin-down}?
+ | +--rw ldp-ext:graceful-restart
+ | | {per-peer-graceful-restart-config}?
+ | | +--rw ldp-ext:enabled? boolean
+ | | +--rw ldp-ext:reconnect-time? uint16
+ | | +--rw ldp-ext:recovery-time? uint16
+ | +--rw ldp-ext:session-ka-holdtime? uint16
+ | | {per-peer-session-attributes-config}?
+ | +--rw ldp-ext:session-ka-interval? uint16
+ | {per-peer-session-attributes-config}?
+ +--rw ldp-ext:session-downstream-on-demand
+ | {session-downstream-on-demand-config}?
+ | +--rw ldp-ext:enabled? boolean
+ | +--rw ldp-ext:peer-list? peer-list-ref
+ +--rw ldp-ext:dual-stack-transport-preference
+ {peers-dual-stack-transport-preference}?
+ +--rw ldp-ext:max-wait? uint16
+ +--rw ldp-ext:prefer-ipv4!
+ +--rw ldp-ext:peer-list? peer-list-ref
+
+ rpcs:
+ +---x mpls-ldp-clear-peer
+ | +---w input
+ | +---w protocol-name? leafref
+ | +---w lsr-id? leafref
+ | +---w label-space-id? leafref
+ +---x mpls-ldp-clear-hello-adjacency
+ | +---w input
+ | +---w hello-adjacency
+ | +---w protocol-name? leafref
+ | +---w (hello-adjacency-type)?
+ | +--:(targeted)
+ | | +---w targeted!
+ | | +---w target-address? inet:ip-address
+ | +--:(link)
+ | +---w link!
+ | +---w next-hop-interface? leafref
+ | +---w next-hop-address? inet:ip-address
+ +---x mpls-ldp-clear-peer-statistics
+ +---w input
+ +---w protocol-name? leafref
+ +---w lsr-id? leafref
+ +---w label-space-id? leafref
+
+ notifications:
+ +---n mpls-ldp-peer-event
+ | +--ro event-type? oper-status-event-type
+ | +--ro peer
+ | +--ro protocol-name? leafref
+ | +--ro lsr-id? leafref
+ | +--ro label-space-id? leafref
+ +---n mpls-ldp-hello-adjacency-event
+ | +--ro event-type? oper-status-event-type
+ | +--ro protocol-name? leafref
+ | +--ro (hello-adjacency-type)?
+ | +--:(targeted)
+ | | +--ro targeted
+ | | +--ro target-address? inet:ip-address
+ | +--:(link)
+ | +--ro link
+ | +--ro next-hop-interface? if:interface-ref
+ | +--ro next-hop-address? inet:ip-address
+ +---n mpls-ldp-fec-event
+ +--ro event-type? oper-status-event-type
+ +--ro protocol-name? leafref
+ +--ro fec? inet:ip-prefix
+
+ Figure 2: Complete Tree
+
+5. Configuration
+
+ This specification defines the configuration parameters for base LDP
+ as specified in [RFC5036] and LDP IPv6 [RFC7552]. Moreover, it
+ incorporates provisions to enable LDP Capabilities [RFC5561] and
+ defines some of the most significant and commonly used capabilities
+ such as Typed Wildcard FEC [RFC5918], End-of-LIB [RFC5919], and LDP
+ Upstream Label Assignment [RFC6389].
+
+ This model augments /rt:routing/rt:control-plane-protocols/
+ rt:control-plane-protocol, which is defined in [RFC8349] and follows
+ NMDA as mentioned earlier.
+
+ The following is the high-level configuration organization for the
+ base LDP module:
+
+ augment /rt:routing/rt:control-plane-protocols:
+ /rt:control-plane-protocol:
+ +-- mpls-ldp
+ +-- global
+ | +-- ...
+ | +-- ...
+ | +-- address-families
+ | | +-- ipv4
+ | | +-- . . .
+ | | +-- . . .
+ | +-- capability
+ | +-- ...
+ | +-- ...
+ +-- discovery
+ | +-- interfaces
+ | | +-- ...
+ | | +-- ...
+ | | +-- interface* [interface]
+ | | +-- ...
+ | | +-- address-families
+ | | +-- ipv4
+ | | +-- ...
+ | | +-- ...
+ | +-- targeted
+ | +-- ...
+ | +-- address-families
+ | +-- ipv4
+ | +-- target* [adjacent-address]
+ | +-- ...
+ | +-- ...
+ +-- peers
+ +-- ...
+ +-- ...
+ +-- peer* [lsr-id label-space-id]
+ +-- ...
+ +-- ...
+
+ Figure 3: Base Configuration Organization
+
+ The following is the high-level configuration organization for the
+ extended LDP module:
+
+ augment /rt:routing/rt:control-plane-protocols
+ /rt:control-plane-protocol
+ +-- mpls-ldp
+ +-- global
+ | +-- ...
+ | +-- ...
+ | +-- address-families
+ | | +-- ipv4
+ | | | +-- . . .
+ | | | +-- . . .
+ | | | +-- label-policy
+ | | | +-- ...
+ | | | +-- ...
+ | | +-- ipv6
+ | | +-- . . .
+ | | +-- . . .
+ | | +-- label-policy
+ | | +-- ...
+ | | +-- ...
+ | +-- capability
+ | | +-- ...
+ | | +-- ...
+ | +-- discovery
+ | +-- interfaces
+ | | +-- ...
+ | | +-- ...
+ | | +-- interface* [interface]
+ | | +-- ...
+ | | +-- address-families
+ | | +-- ipv4
+ | | | +-- ...
+ | | | +-- ...
+ | | +-- ipv6
+ | | +-- ...
+ | | +-- ...
+ | +-- targeted
+ | +-- ...
+ | +-- address-families
+ | +-- ipv6
+ | +- target* [adjacent-address]
+ | +- ...
+ | +- ...
+ +-- forwarding-nexthop
+ | +-- ...
+ | +-- ...
+ +-- peers
+ +-- ...
+ +-- ...
+ +-- peer*
+ +-- ...
+ +-- ...
+ +-- label-policy
+ | +-- ..
+ +-- address-families
+ +-- ipv4
+ | +-- ...
+ +-- ipv6
+ +-- ...
+
+ Figure 4: Extended Configuration Organization
+
+ Given the configuration hierarchy, the model allows inheritance such
+ that an item in a child tree is able to derive value from a similar
+ or related item in one of the parents. For instance, Hello holdtime
+ can be configured per VRF or per VRF interface, thus allowing
+ inheritance as well flexibility to override with a different value at
+ any child level.
+
+5.1. Configuration Hierarchy
+
+ The LDP module resides under a network-instance and the scope of any
+ LDP configuration defined under this tree is per network-instance
+ (per-VRF). This configuration is further divided into sub categories
+ as follows:
+
+ * Global parameters
+
+ * Per-address-family parameters
+
+ * LDP Capabilities parameters
+
+ * Hello Discovery parameters
+
+ - interfaces
+
+ o Global
+
+ o Per-interface: Global
+
+ o Per-interface: Per-address-family
+
+ - targeted
+
+ o Global
+
+ o Per-address-family: Per-target
+
+ * Peer parameters
+
+ - Global
+
+ - Per-peer: Global
+
+ - Per-peer: Per-address-family
+
+ * Forwarding parameters
+
+ The following subsections briefly explain these configuration areas.
+
+5.1.1. Global Parameters
+
+ There are configuration items that are available directly under a VRF
+ instance and do not fall under any other subtree. An example of such
+ a parameter is an LDP LSR Id that is typically configured per VRF.
+ To keep legacy LDP features and applications working in an LDP IPv4
+ network with this model, this document recommends an operator to pick
+ a routable IPv4 unicast address (within a routing domain) as an LSR
+ Id.
+
+5.1.2. Capabilities Parameters
+
+ This container falls under the global tree and holds the LDP
+ capabilities that are to be enabled for certain features. By
+ default, an LDP capability is disabled unless explicitly enabled.
+ These capabilities are typically used to negotiate with LDP peer(s)
+ the support/non-support related to a feature and its parameters. The
+ scope of a capability enabled under this container applies to all LDP
+ peers in the given VRF instance. There is also a peer-level
+ capability container that is provided to override a capability that
+ is enabled/specified at VRF level.
+
+5.1.3. Per-Address-Family Parameters
+
+ Any LDP configuration parameter related to an IP address family (AF)
+ whose scope is VRF wide is configured under this tree. The examples
+ of per-AF parameters include enabling LDP for an address family,
+ prefix-list-based label policies, and LDP transport address.
+
+5.1.4. Hello Discovery Parameters
+
+ This container is used to hold LDP configuration related to the Hello
+ and discovery process for both basic (link) and extended (targeted)
+ discovery.
+
+ The "interfaces" container is used to configure parameters related to
+ VRF interfaces. There are parameters that apply to all interfaces
+ (such as Hello timers) as well as parameters that can be configured
+ per interface. Hence, an interface list is defined under the
+ "interfaces" container. The model defines parameters to configure
+ per-interface non-AF-related items as well as per-interface per-AF
+ items. The example of the former is interface Hello timers, and an
+ example of the latter is enabling hellos for a given AF under an
+ interface.
+
+ The "targeted" container under a VRF instance allows for the
+ configuration of parameters related to LDP targeted discovery.
+ Within this container, the "target" list provides a means to
+ configure multiple target addresses to perform extended discovery to
+ a specific destination target, as well as to fine tune the per-target
+ parameters.
+
+5.1.5. Peer Parameters
+
+ This container is used to hold LDP configuration related to LDP
+ sessions and peers under a VRF instance. This container allows for
+ the configuration of parameters that either apply to all or a subset
+ (peer-list) of peers in a given VRF. The example of such parameters
+ includes authentication passwords, session KeepAlive (KA) timers,
+ etc. Moreover, the model also allows per-peer parameter tuning by
+ specifying a "peer" list under the "peers" container. A peer is
+ uniquely identified by its LSR Id.
+
+ Like per-interface parameters, some per-peer parameters are AF
+ agnostic (i.e., either non-AF related or apply to both IP address
+ families), and some belong to an AF. The example of the former is
+ per-peer session password configuration, whereas the example of the
+ latter is prefix-lis-based label policies (inbound and outbound) that
+ apply to a given peer.
+
+5.1.6. Forwarding Parameters
+
+ This container is used to hold configuration used to control LDP
+ forwarding behavior under a VRF instance. One example of a
+ configuration under this container is when a user wishes to enable
+ LDP neighbor discovery on an interface but wishes to disable use of
+ the same interface for forwarding MPLS packets. This example
+ configuration makes sense only when there are more than one LDP-
+ enabled interfaces towards a neighbor.
+
+6. Operational State
+
+ The operational state of LDP can be queried and obtained from read-
+ only state containers that fall under the same tree (/rt:routing/
+ rt:control-plane-protocols/rt:control-plane-protocol) as the
+ configuration.
+
+ The following are main areas for which LDP operational state is
+ defined:
+
+ * Neighbor Adjacencies
+
+ * Peer
+
+ * Bindings (FEC-Label and address)
+
+ * Capabilities
+
+6.1. Adjacency State
+
+ Neighbor adjacencies are per-address-family Hello adjacencies that
+ are formed with neighbors as a result of LDP basic or extended
+ discovery. In terms of organization, there is a source of discovery
+ (e.g., interface or target address) along with its associated
+ parameters and one or more discovered neighbors along with neighbor-
+ discovery-related parameters. For the basic discovery, there could
+ be more than one discovered neighbor for a given source (interface),
+ whereas there is at most one discovered neighbor for an extended
+ discovery source (local-address and target-address). It is also to
+ be noted that the reason for a targeted neighbor adjacency could be
+ either an active source (locally configured targeted) or passive
+ source (to allow any incoming extended/targeted hellos). A neighbor/
+ adjacency record also contains session state that helps highlight
+ whether a given adjacency has progressed to the subsequent session
+ level or eventual peer level.
+
+ The following captures high-level tree hierarchy for neighbor
+ adjacency state. The tree is shown for ipv4 address-family only; a
+ similar tree exists for ipv6 address-family as well.
+
+ +--rw mpls-ldp!
+ +--rw discovery
+ +--rw interfaces
+ | +--rw interface* [interface]
+ | +--rw address-families
+ | +--rw ipv4
+ | +--ro hello-adjacencies
+ | +--ro hello-adjacencies* [adjacent-address]
+ | +--ro adjacent-address
+ | . . . .
+ | . . . .
+ +--rw targeted
+ +--rw address-families
+ +--rw ipv4
+ +--ro hello-adjacencies
+ +--ro hello-adjacencies*
+ | [local-address adjacent-address]
+ +--ro local-address
+ +--ro adjacent-address
+ . . . .
+ . . . .
+
+ Figure 5: Adjacency State
+
+6.2. Peer State
+
+ Peer-related state is presented under a peers tree. This is one of
+ the core states that provides info on the session-related parameters
+ (mode, authentication, KA timeout, etc.), TCP connection info, Hello
+ adjacencies for the peer, statistics related to messages and
+ bindings, and capabilities exchange info.
+
+ The following captures high-level tree hierarchy for peer state. The
+ peer's Hello adjacencies tree is shown for ipv4 address-family only;
+ a similar tree exists for ipv6 address-family as well.
+
+ +--rw mpls-ldp!
+ +--rw peers
+ +--rw peer* [lsr-id label-space-id]
+ +--rw lsr-id
+ +--rw label-space-id
+ +--ro label-advertisement-mode
+ +--ro session-state
+ +--ro tcp-connection
+ +--ro session-holdtime?
+ +--ro up-time
+ +-- . . . .
+ +--ro address-families
+ | +--ro ipv4
+ | +--ro hello-adjacencies
+ | +--ro hello-adjacencies*
+ | [local-address adjacent-address]
+ | . . . .
+ | . . . .
+ +--ro received-peer-state
+ | +--ro . . . .
+ | +--ro capability
+ | +--ro . . . .
+ +--ro statistics
+ +-- . . . .
+ +-- received
+ | +-- ...
+ +-- sent
+ +-- ...
+
+ Figure 6: Peer State
+
+6.3. Bindings State
+
+ Bindings state provides information on LDP FEC-Label bindings as well
+ as address bindings for both inbound (received) as well as outbound
+ (advertised) direction. FEC-Label bindings are presented in a FEC-
+ centric view, and address bindings are presented in an address-
+ centric view:
+
+ FEC-Label bindings:
+ FEC 203.0.113.1/32:
+ advertised: local-label 16000
+ peer 192.0.2.1:0
+ peer 192.0.2.2:0
+ peer 192.0.2.3:0
+ received:
+ peer 192.0.2.1:0, label 16002, used-in-forwarding=Yes
+ peer 192.0.2.2:0, label 17002, used-in-forwarding=No
+ FEC 203.0.113.2/32:
+ . . . .
+ FEC 198.51.100.0/24:
+ . . . .
+ FEC 2001:db8:0:2::
+ . . . .
+ FEC 2001:db8:0:3::
+ . . . .
+
+ Address bindings:
+ Addr 192.0.2.10:
+ advertised
+ Addr 2001:db8:0:10::
+ advertised
+
+ Addr 192.0.2.1:
+ received, peer 192.0.2.1:0
+ Addr 192.0.2.2:
+ received, peer 192.0.2.2:0
+ Addr 192.0.2.3:
+ received, peer 192.0.2.3:0
+ Addr 2001:db8:0:2::
+ received, peer 192.0.2.2:0
+ Addr 2001:db8:0:3::
+ received, peer 192.0.2.3:0
+
+ Figure 7: Example Bindings
+
+ Note that all local addresses are advertised to all peers; hence,
+ there is no need to provide per-peer information for local address
+ advertisement. Furthermore, note that it is easy to derive a peer-
+ centric view for the bindings from the information already provided
+ in this model.
+
+ The following captures high-level tree hierarchy for bindings state.
+ The tree shown below is for ipv4 address-family only; a similar tree
+ exists for ipv6 address-family as well.
+
+ +--rw mpls-ldp!
+ +--rw global
+ +--rw address-families
+ +--rw ipv4
+ +--ro bindings
+ +--ro address* [address]
+ | +--ro address (ipv4-address or ipv6-address)
+ | +--ro advertisement-type? advertised-received
+ | +--ro peer? leafref
+ +--ro fec-label* [fec]
+ +--ro fec (ipv4-prefix or ipv6-prefix)
+ +--ro peer* [peer advertisement-type]
+ +--ro peer leafref
+ +--ro advertisement-type? advertised-received
+ +--ro label? mpls:mpls-label
+ +--ro used-in-forwarding? boolean
+
+ Figure 8: Bindings State
+
+6.4. Capabilities State
+
+ LDP capabilities state comprises two types of information: global
+ information (such as timer, etc.) and per-peer information.
+
+ The following captures high-level tree hierarchy for LDP capabilities
+ state.
+
+ +--rw mpls-ldp!
+ +--rw peers
+ +--rw peer* [lsr-id label-space-id]
+ +--rw lsr-id yang:dotted-quad
+ +--rw label-space-id
+ +--ro received-peer-state
+ +--ro capability
+ +--ro . . . .
+ +--ro . . . .
+
+ Figure 9: Capabilities State
+
+7. Notifications
+
+ This model defines a list of notifications to inform the client of
+ important events detected during the protocol operation. These
+ events include events related to changes in the operational state of
+ an LDP peer, Hello adjacency, and FEC, etc. It is to be noted that
+ an LDP FEC is treated as operational (up) as long as it has at least
+ one Next Hop Label Forwarding Entry (NHLFE) with an outgoing label.
+
+ A simplified graphical representation of the data model for LDP
+ notifications is shown in Figure 2.
+
+8. Action
+
+ This model defines a list of rpcs that allow performing an action or
+ executing a command on the protocol. For example, it allows for the
+ clearing (resetting) of LDP peers, hello-adjacencies, and statistics.
+ The model makes an effort to provide a different level of control so
+ that a user is able to either clear all, clear all for a given type,
+ or clear a specific entity.
+
+ A simplified graphical representation of the data model for LDP
+ actions is shown in Figure 2.
+
+9. YANG Specification
+
+ The following sections specify the actual YANG (module) specification
+ for LDP constructs defined earlier in the document.
+
+9.1. Base
+
+ This YANG module imports types defined in [RFC6991], [RFC8177],
+ [RFC8294], [RFC8343], [RFC8344], [RFC8349], and [RFC9067].
+
+ <CODE BEGINS> file "ietf-mpls-ldp@2022-03-14.yang"
+ module ietf-mpls-ldp {
+ yang-version 1.1;
+ namespace "urn:ietf:params:xml:ns:yang:ietf-mpls-ldp";
+ prefix ldp;
+
+ import ietf-inet-types {
+ prefix inet;
+ reference
+ "RFC 6991: Common YANG Data Types";
+ }
+ import ietf-yang-types {
+ prefix yang;
+ reference
+ "RFC 6991: Common YANG Data Types";
+ }
+ import ietf-routing {
+ prefix rt;
+ reference
+ "RFC 8349: A YANG Data Model for Routing Management (NMDA
+ version)";
+ }
+ import ietf-routing-types {
+ prefix rt-types;
+ reference
+ "RFC 8294: Common YANG Data Types for the Routing Area";
+ }
+ import ietf-interfaces {
+ prefix if;
+ reference
+ "RFC 8343: A YANG Data Model for Interface Management";
+ }
+ import ietf-ip {
+ prefix ip;
+ reference
+ "RFC 8344: A YANG Data Model for IP Management";
+ }
+ import ietf-key-chain {
+ prefix key-chain;
+ reference
+ "RFC 8177: YANG Data Model for Key Chains";
+ }
+
+ organization
+ "IETF MPLS Working Group";
+ contact
+ "WG Web: <https://datatracker.ietf.org/wg/mpls/>
+ WG List: <mailto:mpls@ietf.org>
+
+ Editor: Kamran Raza
+ <mailto:skraza@cisco.com>
+
+ Author: Rajiv Asati
+ <mailto:rajiva@cisco.com>
+
+ Author: Xufeng Liu
+ <mailto:xufeng.liu.ietf@gmail.com>
+
+ Author: Santosh Easale
+ <mailto:santosh_easale@berkeley.edu>
+
+ Author: Xia Chen
+ <mailto:jescia.chenxia@huawei.com>
+
+ Author: Himanshu Shah
+ <mailto:hshah@ciena.com>";
+ description
+ "This YANG module defines the essential components for the
+ management of Multiprotocol Label Switching (MPLS) Label
+ Distribution Protocol (LDP). It is also the base model to
+ be augmented for Multipoint LDP (mLDP).
+
+ Copyright (c) 2022 IETF Trust and the persons identified as
+ authors of the code. All rights reserved.
+
+ Redistribution and use in source and binary forms, with or
+ without modification, is permitted pursuant to, and subject
+ to the license terms contained in, the Revised BSD License
+ set forth in Section 4.c of the IETF Trust's Legal Provisions
+ Relating to IETF Documents
+ (https://trustee.ietf.org/license-info).
+
+ This version of this YANG module is part of RFC 9070; see the
+ RFC itself for full legal notices.";
+
+ revision 2022-03-14 {
+ description
+ "Initial revision.";
+ reference
+ "RFC 9070: YANG Data Model for MPLS LDP";
+ }
+
+ /*
+ * Typedefs
+ */
+
+ typedef advertised-received {
+ type enumeration {
+ enum advertised {
+ description
+ "Advertised information.";
+ }
+ enum received {
+ description
+ "Received information.";
+ }
+ }
+ description
+ "Received or advertised.";
+ }
+
+ typedef downstream-upstream {
+ type enumeration {
+ enum downstream {
+ description
+ "Downstream information.";
+ }
+ enum upstream {
+ description
+ "Upstream information.";
+ }
+ }
+ description
+ "Downstream or upstream.";
+ }
+
+ typedef label-adv-mode {
+ type enumeration {
+ enum downstream-unsolicited {
+ description
+ "Downstream Unsolicited.";
+ }
+ enum downstream-on-demand {
+ description
+ "Downstream on Demand.";
+ }
+ }
+ description
+ "Label Advertisement Mode.";
+ }
+
+ typedef oper-status-event-type {
+ type enumeration {
+ enum up {
+ value 1;
+ description
+ "Operational status changed to up.";
+ }
+ enum down {
+ value 2;
+ description
+ "Operational status changed to down.";
+ }
+ }
+ description
+ "Operational status event type for notifications.";
+ }
+
+ /*
+ * Identities
+ */
+
+ identity mpls-ldp {
+ base rt:control-plane-protocol;
+ description
+ "LDP protocol.";
+ reference
+ "RFC 5036: LDP Specification";
+ }
+
+ identity adjacency-flag-base {
+ description
+ "Base type for adjacency flags.";
+ }
+
+ identity adjacency-flag-active {
+ base adjacency-flag-base;
+ description
+ "This adjacency is configured and actively created.";
+ }
+
+ identity adjacency-flag-passive {
+ base adjacency-flag-base;
+ description
+ "This adjacency is not configured and passively accepted.";
+ }
+
+ /*
+ * Groupings
+ */
+
+ grouping adjacency-state-attributes {
+ description
+ "The operational state attributes of an LDP Hello adjacency,
+ which can used for basic and extended discoveries, in IPv4 and
+ IPv6 address families.";
+ leaf-list flag {
+ type identityref {
+ base adjacency-flag-base;
+ }
+ description
+ "One or more flags to indicate whether the adjacency is
+ actively created, passively accepted, or both.";
+ }
+ container hello-holdtime {
+ description
+ "Containing Hello holdtime state information.";
+ leaf adjacent {
+ type uint16;
+ units "seconds";
+ description
+ "The holdtime value learned from the adjacent LSR.";
+ }
+ leaf negotiated {
+ type uint16;
+ units "seconds";
+ description
+ "The holdtime negotiated between this LSR and the adjacent
+ LSR.";
+ }
+ leaf remaining {
+ type uint16;
+ units "seconds";
+ description
+ "The time remaining until the holdtime timer expires.";
+ }
+ }
+ leaf next-hello {
+ type uint16;
+ units "seconds";
+ description
+ "The time when the next Hello message will be sent.";
+ }
+ container statistics {
+ description
+ "Statistics objects.";
+ leaf discontinuity-time {
+ type yang:date-and-time;
+ mandatory true;
+ description
+ "The time on the most recent occasion at which any one or
+ more of this interface's counters suffered a
+ discontinuity. If no such discontinuities have occurred
+ since the last re-initialization of the local management
+ subsystem, then this node contains the time the local
+ management subsystem re-initialized itself.";
+ }
+ leaf hello-received {
+ type yang:counter64;
+ description
+ "The number of Hello messages received.";
+ }
+ leaf hello-dropped {
+ type yang:counter64;
+ description
+ "The number of Hello messages dropped.";
+ }
+ } // statistics
+ } // adjacency-state-attributes
+
+ grouping basic-discovery-timers {
+ description
+ "The timer attributes for basic discovery, used in the
+ per-interface setting and in the all-interface setting.";
+ leaf hello-holdtime {
+ type uint16 {
+ range "15..3600";
+ }
+ units "seconds";
+ description
+ "The time interval for which an LDP link Hello adjacency
+ is maintained in the absence of link Hello messages from
+ the LDP neighbor.
+ This leaf may be configured at the per-interface level or
+ the global level, with precedence given to the value at the
+ per-interface level. If the leaf is not configured at
+ either level, the default value at the global level is
+ used.";
+ }
+ leaf hello-interval {
+ type uint16 {
+ range "5..1200";
+ }
+ units "seconds";
+ description
+ "The interval between consecutive LDP link Hello messages
+ used in basic LDP discovery.
+ This leaf may be configured at the per-interface level or
+ the global level, with precedence given to the value at the
+ per-interface level. If the leaf is not configured at
+ either level, the default value at the global level is
+ used.";
+ }
+ } // basic-discovery-timers
+
+ grouping binding-address-state-attributes {
+ description
+ "Operational state attributes of an address binding, used in
+ IPv4 and IPv6 address families.";
+ leaf advertisement-type {
+ type advertised-received;
+ description
+ "Received or advertised.";
+ }
+ container peer {
+ when "../advertisement-type = 'received'" {
+ description
+ "Applicable for received address.";
+ }
+ description
+ "LDP peer from which this address is received.";
+ uses ldp-peer-ref-from-binding;
+ }
+ } // binding-address-state-attributes
+
+ grouping binding-label-state-attributes {
+ description
+ "Operational state attributes for a FEC-Label binding, used in
+ IPv4 and IPv6 address families.";
+ list peer {
+ key "lsr-id label-space-id advertisement-type";
+ description
+ "List of advertised and received peers.";
+ uses ldp-peer-ref-from-binding {
+ description
+ "The LDP peer from which this binding is received, or to
+ which this binding is advertised.
+ The peer is identified by its LDP ID, which consists of
+ the LSR Id and the label space Id.";
+ }
+ leaf advertisement-type {
+ type advertised-received;
+ description
+ "Received or advertised.";
+ }
+ leaf label {
+ type rt-types:mpls-label;
+ description
+ "Advertised (outbound) or received (inbound)
+ label.";
+ }
+ leaf used-in-forwarding {
+ type boolean;
+ description
+ "'true' if the label is used in forwarding.";
+ }
+ } // peer
+ } // binding-label-state-attributes
+
+ grouping graceful-restart-attributes-per-peer {
+ description
+ "Per-peer graceful restart attributes.
+ On the local side, these attributes are configuration and
+ operational state data. On the peer side, these attributes
+ are operational state data received from the peer.";
+ container graceful-restart {
+ description
+ "Attributes for graceful restart.";
+ leaf enabled {
+ type boolean;
+ description
+ "Enable or disable graceful restart.
+ This leaf may be configured at the per-peer level or the
+ global level, with precedence given to the value at the
+ per-peer level. If the leaf is not configured at either
+ level, the default value at the global level is used.";
+ }
+ leaf reconnect-time {
+ type uint16 {
+ range "10..1800";
+ }
+ units "seconds";
+ description
+ "Specifies the time interval that the remote LDP peer
+ must wait for the local LDP peer to reconnect after the
+ remote peer detects the LDP communication failure.
+ This leaf may be configured at the per-peer level or the
+ global level, with precedence given to the value at the
+ per-peer level. If the leaf is not configured at either
+ level, the default value at the global level is used.";
+ }
+ leaf recovery-time {
+ type uint16 {
+ range "30..3600";
+ }
+ units "seconds";
+ description
+ "Specifies the time interval, in seconds, that the remote
+ LDP peer preserves its MPLS forwarding state after
+ receiving the Initialization message from the restarted
+ local LDP peer.
+ This leaf may be configured at the per-peer level or the
+ global level, with precedence given to the value at the
+ per-peer level. If the leaf is not configured at either
+ level, the default value at the global level is used.";
+ }
+ } // graceful-restart
+ } // graceful-restart-attributes-per-peer
+
+ grouping ldp-interface-ref {
+ description
+ "Defining a reference to an LDP interface.";
+ leaf name {
+ type if:interface-ref;
+ must '(/if:interfaces/if:interface[if:name=current()]/ip:ipv4)'
+ + ' or '
+ + '(/if:interfaces/if:interface[if:name=current()]/ip:ipv6)'
+ {
+ description
+ "Interface is IPv4 or IPv6.";
+ }
+ description
+ "The name of an LDP interface.";
+ }
+ }
+
+ grouping ldp-peer-ref-absolute {
+ description
+ "An absolute reference to an LDP peer, by the LDP ID, which
+ consists of the LSR Id and the label space Id.";
+ leaf protocol-name {
+ type leafref {
+ path "/rt:routing/rt:control-plane-protocols/"
+ + "rt:control-plane-protocol/rt:name";
+ }
+ description
+ "The name of the LDP protocol instance.";
+ }
+ leaf lsr-id {
+ type leafref {
+ path "/rt:routing/rt:control-plane-protocols/"
+ + "rt:control-plane-protocol"
+ + "[rt:name=current()/../protocol-name]/"
+ + "ldp:mpls-ldp/ldp:peers/ldp:peer/ldp:lsr-id";
+ }
+ description
+ "The LSR Id of the peer, as a portion of the peer LDP ID.";
+ }
+ leaf label-space-id {
+ type leafref {
+ path "/rt:routing/rt:control-plane-protocols/"
+ + "rt:control-plane-protocol"
+ + "[rt:name=current()/../protocol-name]/"
+ + "ldp:mpls-ldp/ldp:peers/"
+ + "ldp:peer[ldp:lsr-id=current()/../lsr-id]/"
+ + "ldp:label-space-id";
+ }
+ description
+ "The label space Id of the peer, as a portion of the peer
+ LDP ID.";
+ }
+ } // ldp-peer-ref-absolute
+
+ grouping ldp-peer-ref-from-binding {
+ description
+ "A relative reference to an LDP peer, by the LDP ID, which
+ consists of the LSR Id and the label space Id.";
+ leaf lsr-id {
+ type leafref {
+ path "../../../../../../../ldp:peers/ldp:peer/ldp:lsr-id";
+ }
+ description
+ "The LSR Id of the peer, as a portion of the peer LDP ID.";
+ }
+ leaf label-space-id {
+ type leafref {
+ path "../../../../../../../ldp:peers/"
+ + "ldp:peer[ldp:lsr-id=current()/../lsr-id]/"
+ + "ldp:label-space-id";
+ }
+ description
+ "The label space Id of the peer, as a portion of the peer
+ LDP ID.";
+ }
+ } // ldp-peer-ref-from-binding
+
+ grouping ldp-peer-ref-from-interface {
+ description
+ "A relative reference to an LDP peer, by the LDP ID, which
+ consists of the LSR Id and the label space Id.";
+ container peer {
+ description
+ "Reference to an LDP peer, by the LDP ID, which consists of
+ the LSR Id and the label space Id.";
+ leaf lsr-id {
+ type leafref {
+ path "../../../../../../../../../ldp:peers/ldp:peer/"
+ + "ldp:lsr-id";
+ }
+ description
+ "The LSR Id of the peer, as a portion of the peer LDP ID.";
+ }
+ leaf label-space-id {
+ type leafref {
+ path "../../../../../../../../../ldp:peers/"
+ + "ldp:peer[ldp:lsr-id=current()/../lsr-id]/"
+ + "ldp:label-space-id";
+ }
+ description
+ "The label space Id of the peer, as a portion of the peer
+ LDP ID.";
+ }
+ } // peer
+ } // ldp-peer-ref-from-interface
+
+ grouping ldp-peer-ref-from-target {
+ description
+ "A relative reference to an LDP peer, by the LDP ID, which
+ consists of the LSR Id and the label space Id.";
+ container peer {
+ description
+ "Reference to an LDP peer, by the LDP ID, which consists of
+ the LSR Id and the label space Id.";
+ leaf lsr-id {
+ type leafref {
+ path "../../../../../../../../ldp:peers/ldp:peer/"
+ + "ldp:lsr-id";
+ }
+ description
+ "The LSR Id of the peer, as a portion of the peer LDP ID.";
+ }
+ leaf label-space-id {
+ type leafref {
+ path "../../../../../../../../ldp:peers/"
+ + "ldp:peer[ldp:lsr-id=current()/../lsr-id]/"
+ + "ldp:label-space-id";
+ }
+ description
+ "The label space Id of the peer, as a portion of the peer
+ LDP ID.";
+ }
+ } // peer
+ } // ldp-peer-ref-from-target
+
+ grouping peer-attributes {
+ description
+ "Peer configuration attributes, used in the per-peer setting
+ can in the all-peer setting.";
+ leaf session-ka-holdtime {
+ type uint16 {
+ range "45..3600";
+ }
+ units "seconds";
+ description
+ "The time interval after which an inactive LDP session
+ terminates and the corresponding TCP session closes.
+ Inactivity is defined as not receiving LDP packets from the
+ peer.
+ This leaf may be configured at the per-peer level or the
+ global level, with precedence given to the value at the
+ per-peer level. If the leaf is not configured at either
+ level, the default value at the global level is used.";
+ }
+ leaf session-ka-interval {
+ type uint16 {
+ range "15..1200";
+ }
+ units "seconds";
+ description
+ "The interval between successive transmissions of KeepAlive
+ packets. Keepalive packets are only sent in the absence of
+ other LDP packets transmitted over the LDP session.
+ This leaf may be configured at the per-peer level or the
+ global level, with precedence given to the value at the
+ per-peer level. If the leaf is not configured at either
+ level, the default value at the global level is used.";
+ }
+ } // peer-attributes
+
+ grouping peer-authentication {
+ description
+ "Peer authentication container, used in the per-peer setting
+ can in the all-peer setting.";
+ container authentication {
+ description
+ "Containing authentication information.";
+ choice authentication-type {
+ description
+ "Choice of authentication.";
+ case password {
+ leaf key {
+ type string;
+ description
+ "This leaf specifies the authentication key. The
+ length of the key may be dependent on the
+ cryptographic algorithm.";
+ }
+ leaf crypto-algorithm {
+ type identityref {
+ base key-chain:crypto-algorithm;
+ }
+ description
+ "Cryptographic algorithm associated with key.";
+ }
+ }
+ }
+ }
+ } // peer-authentication
+
+ grouping peer-state-derived {
+ description
+ "The peer state information derived from the LDP protocol
+ operations.";
+ container label-advertisement-mode {
+ config false;
+ description
+ "Label advertisement mode state.";
+ leaf local {
+ type label-adv-mode;
+ description
+ "Local Label Advertisement Mode.";
+ }
+ leaf peer {
+ type label-adv-mode;
+ description
+ "Peer Label Advertisement Mode.";
+ }
+ leaf negotiated {
+ type label-adv-mode;
+ description
+ "Negotiated Label Advertisement Mode.";
+ }
+ }
+ leaf next-keep-alive {
+ type uint16;
+ units "seconds";
+ config false;
+ description
+ "Time duration from now until sending the next KeepAlive
+ message.";
+ }
+ container received-peer-state {
+ config false;
+ description
+ "Operational state information learned from the peer.";
+ uses graceful-restart-attributes-per-peer;
+ container capability {
+ description
+ "Peer capability information.";
+ container end-of-lib {
+ description
+ "Peer's end-of-lib capability.";
+ leaf enabled {
+ type boolean;
+ description
+ "'true' if peer's end-of-lib capability is enabled.";
+ }
+ }
+ container typed-wildcard-fec {
+ description
+ "Peer's typed-wildcard-fec capability.";
+ leaf enabled {
+ type boolean;
+ description
+ "'true' if peer's typed-wildcard-fec capability is
+ enabled.";
+ }
+ }
+ container upstream-label-assignment {
+ description
+ "Peer's upstream label assignment capability.";
+ leaf enabled {
+ type boolean;
+ description
+ "'true' if peer's upstream label assignment is
+ enabled.";
+ }
+ }
+ } // capability
+ } // received-peer-state
+ container session-holdtime {
+ config false;
+ description
+ "Session holdtime state.";
+ leaf peer {
+ type uint16;
+ units "seconds";
+ description
+ "Peer holdtime.";
+ }
+ leaf negotiated {
+ type uint16;
+ units "seconds";
+ description
+ "Negotiated holdtime.";
+ }
+ leaf remaining {
+ type uint16;
+ units "seconds";
+ description
+ "Remaining holdtime.";
+ }
+ } // session-holdtime
+ leaf session-state {
+ type enumeration {
+ enum non-existent {
+ description
+ "NON EXISTENT state. Transport disconnected.";
+ }
+ enum initialized {
+ description
+ "INITIALIZED state.";
+ }
+ enum openrec {
+ description
+ "OPENREC state.";
+ }
+ enum opensent {
+ description
+ "OPENSENT state.";
+ }
+ enum operational {
+ description
+ "OPERATIONAL state.";
+ }
+ }
+ config false;
+ description
+ "Representing the operational status of the LDP session.";
+ reference
+ "RFC 5036: LDP Specification, Sec. 2.5.4.";
+ }
+ container tcp-connection {
+ config false;
+ description
+ "TCP connection state.";
+ leaf local-address {
+ type inet:ip-address;
+ description
+ "Local address.";
+ }
+ leaf local-port {
+ type inet:port-number;
+ description
+ "Local port number.";
+ }
+ leaf remote-address {
+ type inet:ip-address;
+ description
+ "Remote address.";
+ }
+ leaf remote-port {
+ type inet:port-number;
+ description
+ "Remote port number.";
+ }
+ } // tcp-connection
+ leaf up-time {
+ type rt-types:timeticks64;
+ config false;
+ description
+ "The number of time ticks (hundredths of a second) since the
+ state of the session with the peer changed to
+ OPERATIONAL.";
+ }
+ container statistics {
+ config false;
+ description
+ "Statistics objects.";
+ leaf discontinuity-time {
+ type yang:date-and-time;
+ mandatory true;
+ description
+ "The time on the most recent occasion at which any one or
+ more of this interface's counters suffered a
+ discontinuity. If no such discontinuities have occurred
+ since the last re-initialization of the local management
+ subsystem, then this node contains the time the local
+ management subsystem re-initialized itself.";
+ }
+ container received {
+ description
+ "Inbound statistics.";
+ uses statistics-peer-received-sent;
+ }
+ container sent {
+ description
+ "Outbound statistics.";
+ uses statistics-peer-received-sent;
+ }
+ leaf total-addresses {
+ type uint32;
+ description
+ "The number of learned addresses.";
+ }
+ leaf total-labels {
+ type uint32;
+ description
+ "The number of learned labels.";
+ }
+ leaf total-fec-label-bindings {
+ type uint32;
+ description
+ "The number of learned label-address bindings.";
+ }
+ } // statistics
+ } // peer-state-derived
+
+ grouping statistics-peer-received-sent {
+ description
+ "Inbound and outbound statistic counters.";
+ leaf total-octets {
+ type yang:counter64;
+ description
+ "The total number of octets sent or received.";
+ }
+ leaf total-messages {
+ type yang:counter64;
+ description
+ "The number of messages sent or received.";
+ }
+ leaf address {
+ type yang:counter64;
+ description
+ "The number of Address messages sent or received.";
+ }
+ leaf address-withdraw {
+ type yang:counter64;
+ description
+ "The number of address-withdraw messages sent or received.";
+ }
+ leaf initialization {
+ type yang:counter64;
+ description
+ "The number of Initialization messages sent or received.";
+ }
+ leaf keepalive {
+ type yang:counter64;
+ description
+ "The number of KeepAlive messages sent or received.";
+ }
+ leaf label-abort-request {
+ type yang:counter64;
+ description
+ "The number of label-abort-request messages sent or
+ received.";
+ }
+ leaf label-mapping {
+ type yang:counter64;
+ description
+ "The number of label-mapping messages sent or received.";
+ }
+ leaf label-release {
+ type yang:counter64;
+ description
+ "The number of label-release messages sent or received.";
+ }
+ leaf label-request {
+ type yang:counter64;
+ description
+ "The number of label-request messages sent or received.";
+ }
+ leaf label-withdraw {
+ type yang:counter64;
+ description
+ "The number of label-withdraw messages sent or received.";
+ }
+ leaf notification {
+ type yang:counter64;
+ description
+ "The number of notification messages sent or received.";
+ }
+ } // statistics-peer-received-sent
+
+ /*
+ * Configuration data and operational state data nodes
+ */
+
+ augment "/rt:routing/rt:control-plane-protocols/"
+ + "rt:control-plane-protocol" {
+ when "derived-from-or-self(rt:type, 'ldp:mpls-ldp')" {
+ description
+ "This augmentation is only valid for a control plane
+ protocol instance of LDP (type 'mpls-ldp').";
+ }
+ description
+ "LDP augmentation to routing control plane protocol
+ configuration and state.";
+ container mpls-ldp {
+ must "not (../../rt:control-plane-protocol"
+ + "[derived-from-or-self(rt:type, 'ldp:mpls-ldp')]"
+ + "[rt:name!=current()/../rt:name])" {
+ description
+ "Only one LDP instance is allowed.";
+ }
+ description
+ "Containing configuration and operational data for the LDP
+ protocol.";
+ container global {
+ description
+ "Global attributes for LDP.";
+ container capability {
+ description
+ "Containing the LDP capability data. The container is
+ used for augmentations.";
+ reference
+ "RFC 5036: LDP Specification, Sec. 1.5.";
+ }
+ container graceful-restart {
+ description
+ "Attributes for graceful restart.";
+ leaf enabled {
+ type boolean;
+ default "false";
+ description
+ "Enable or disable graceful restart.";
+ }
+ leaf reconnect-time {
+ type uint16 {
+ range "10..1800";
+ }
+ units "seconds";
+ default "120";
+ description
+ "Specifies the time interval that the remote LDP peer
+ must wait for the local LDP peer to reconnect after
+ the remote peer detects the LDP communication
+ failure.";
+ }
+ leaf recovery-time {
+ type uint16 {
+ range "30..3600";
+ }
+ units "seconds";
+ default "120";
+ description
+ "Specifies the time interval, in seconds, that the
+ remote LDP peer preserves its MPLS forwarding state
+ after receiving the Initialization message from the
+ restarted local LDP peer.";
+ }
+ leaf forwarding-holdtime {
+ type uint16 {
+ range "30..3600";
+ }
+ units "seconds";
+ default "180";
+ description
+ "Specifies the time interval, in seconds, before the
+ termination of the recovery phase.";
+ }
+ } // graceful-restart
+ leaf lsr-id {
+ type rt-types:router-id;
+ description
+ "Specifies the value to act as the LDP LSR Id.
+ If this attribute is not specified, LDP uses the router
+ ID as determined by the system.";
+ }
+ container address-families {
+ description
+ "Per-address-family configuration and operational state.
+ The address family can be either IPv4 or IPv6.";
+ container ipv4 {
+ presence "Present if IPv4 is enabled, unless the
+ 'enabled' leaf is set to 'false'.";
+ description
+ "Containing data related to the IPv4 address family.";
+ leaf enabled {
+ type boolean;
+ default "true";
+ description
+ "'false' to disable the address family.";
+ }
+ leaf label-distribution-control-mode {
+ type enumeration {
+ enum independent {
+ description
+ "Independent label distribution control.";
+ }
+ enum ordered {
+ description
+ "Ordered label distribution control.";
+ }
+ }
+ config false;
+ description
+ "Label distribution control mode.";
+ reference
+ "RFC 5036: LDP Specification, Sec. 2.6.";
+ }
+ // ipv4 bindings
+ container bindings {
+ config false;
+ description
+ "LDP address and label binding information.";
+ list address {
+ key "address";
+ description
+ "List of address bindings learned by LDP.";
+ leaf address {
+ type inet:ipv4-address;
+ description
+ "The IPv4 address learned from an Address
+ message received from or advertised to a peer.";
+ }
+ uses binding-address-state-attributes;
+ }
+ list fec-label {
+ key "fec";
+ description
+ "List of FEC-label bindings learned by LDP.";
+ leaf fec {
+ type inet:ipv4-prefix;
+ description
+ "The prefix FEC value in the FEC-Label binding,
+ learned in a Label Mapping message received from
+ or advertised to a peer.";
+ }
+ uses binding-label-state-attributes;
+ }
+ } // bindings
+ } // ipv4
+ } // address-families
+ } // global
+ container discovery {
+ description
+ "Neighbor-discovery configuration and operational state.";
+ container interfaces {
+ description
+ "A list of interfaces for LDP Basic Discovery.";
+ reference
+ "RFC 5036: LDP Specification, Sec. 2.4.1.";
+ uses basic-discovery-timers {
+ refine "hello-holdtime" {
+ default "15";
+ }
+ refine "hello-interval" {
+ default "5";
+ }
+ }
+ list interface {
+ key "name";
+ description
+ "List of LDP interfaces used for LDP Basic Discovery.";
+ uses ldp-interface-ref;
+ leaf next-hello {
+ type uint16;
+ units "seconds";
+ config false;
+ description
+ "Time to send the next Hello message.";
+ }
+ container address-families {
+ description
+ "Container for address families.";
+ container ipv4 {
+ presence "Present if IPv4 is enabled, unless the
+ 'enabled' leaf is set to 'false'.";
+ description
+ "IPv4 address family.";
+ leaf enabled {
+ type boolean;
+ default "true";
+ description
+ "Set to false to disable the address family on
+ the interface.";
+ }
+ container hello-adjacencies {
+ config false;
+ description
+ "Containing a list of Hello adjacencies.";
+ list hello-adjacency {
+ key "adjacent-address";
+ config false;
+ description
+ "List of Hello adjacencies.";
+ leaf adjacent-address {
+ type inet:ipv4-address;
+ description
+ "Neighbor address of the Hello adjacency.";
+ }
+ uses adjacency-state-attributes;
+ uses ldp-peer-ref-from-interface;
+ }
+ }
+ } // ipv4
+ } // address-families
+ } // interface
+ } // interfaces
+ container targeted {
+ description
+ "A list of targeted neighbors for extended discovery.";
+ leaf hello-holdtime {
+ type uint16 {
+ range "15..3600";
+ }
+ units "seconds";
+ default "45";
+ description
+ "The time interval for which an LDP targeted Hello
+ adjacency is maintained in the absence of targeted
+ Hello messages from an LDP neighbor.";
+ }
+ leaf hello-interval {
+ type uint16 {
+ range "5..3600";
+ }
+ units "seconds";
+ default "15";
+ description
+ "The interval between consecutive LDP targeted Hello
+ messages used in extended LDP discovery.";
+ }
+ container hello-accept {
+ description
+ "LDP policy to control the acceptance of extended
+ neighbor-discovery Hello messages.";
+ leaf enabled {
+ type boolean;
+ default "false";
+ description
+ "'true' to accept; 'false' to deny.";
+ }
+ }
+ container address-families {
+ description
+ "Container for address families.";
+ container ipv4 {
+ presence "Present if IPv4 is enabled.";
+ description
+ "IPv4 address family.";
+ container hello-adjacencies {
+ config false;
+ description
+ "Containing a list of Hello adjacencies.";
+ list hello-adjacency {
+ key "local-address adjacent-address";
+ description
+ "List of Hello adjacencies.";
+ leaf local-address {
+ type inet:ipv4-address;
+ description
+ "Local address of the Hello adjacency.";
+ }
+ leaf adjacent-address {
+ type inet:ipv4-address;
+ description
+ "Neighbor address of the Hello adjacency.";
+ }
+ uses adjacency-state-attributes;
+ uses ldp-peer-ref-from-target;
+ }
+ }
+ list target {
+ key "adjacent-address";
+ description
+ "Targeted discovery params.";
+ leaf adjacent-address {
+ type inet:ipv4-address;
+ description
+ "Configures a remote LDP neighbor for the
+ extended LDP discovery.";
+ }
+ leaf enabled {
+ type boolean;
+ default "true";
+ description
+ "'true' to enable the target.";
+ }
+ leaf local-address {
+ type inet:ipv4-address;
+ description
+ "The local address used as the source address to
+ send targeted Hello messages.
+ If the value is not specified, the
+ transport address is used as the source
+ address.";
+ }
+ } // target
+ } // ipv4
+ } // address-families
+ } // targeted
+ } // discovery
+ container peers {
+ description
+ "Peers configuration attributes.";
+ uses peer-authentication;
+ uses peer-attributes {
+ refine "session-ka-holdtime" {
+ default "180";
+ }
+ refine "session-ka-interval" {
+ default "60";
+ }
+ }
+ list peer {
+ key "lsr-id label-space-id";
+ description
+ "List of peers.";
+ leaf lsr-id {
+ type rt-types:router-id;
+ description
+ "The LSR Id of the peer, used to identify the globally
+ unique LSR. This is the first four octets of the LDP
+ ID. This leaf is used together with the leaf
+ 'label-space-id' to form the LDP ID.";
+ reference
+ "RFC 5036: LDP Specification, Sec. 2.2.2.";
+ }
+ leaf label-space-id {
+ type uint16;
+ description
+ "The label space Id of the peer, used to identify a
+ specific label space within the LSR. This is the last
+ two octets of the LDP ID. This leaf is used together
+ with the leaf 'lsr-id' to form the LDP ID.";
+ reference
+ "RFC 5036: LDP Specification, Sec. 2.2.2.";
+ }
+ uses peer-authentication;
+ container address-families {
+ description
+ "Per-vrf per-af params.";
+ container ipv4 {
+ presence "Present if IPv4 is enabled.";
+ description
+ "IPv4 address family.";
+ container hello-adjacencies {
+ config false;
+ description
+ "Containing a list of Hello adjacencies.";
+ list hello-adjacency {
+ key "local-address adjacent-address";
+ description
+ "List of Hello adjacencies.";
+ leaf local-address {
+ type inet:ipv4-address;
+ description
+ "Local address of the Hello adjacency.";
+ }
+ leaf adjacent-address {
+ type inet:ipv4-address;
+ description
+ "Neighbor address of the Hello adjacency.";
+ }
+ uses adjacency-state-attributes;
+ leaf interface {
+ type if:interface-ref;
+ description
+ "Interface for this adjacency.";
+ }
+ }
+ }
+ } // ipv4
+ } // address-families
+ uses peer-state-derived;
+ } // list peer
+ } // peers
+ } // container mpls-ldp
+ }
+
+ /*
+ * RPCs
+ */
+
+ rpc mpls-ldp-clear-peer {
+ description
+ "Clears the session to the peer.";
+ input {
+ uses ldp-peer-ref-absolute {
+ description
+ "The LDP peer to be cleared. If this is not provided,
+ then all peers are cleared.
+ The peer is identified by its LDP ID, which consists of
+ the LSR Id and the label space Id.";
+ }
+ }
+ }
+
+ rpc mpls-ldp-clear-hello-adjacency {
+ description
+ "Clears the Hello adjacency.";
+ input {
+ container hello-adjacency {
+ description
+ "Link adjacency or targeted adjacency. If this is not
+ provided, then all Hello adjacencies are cleared.";
+ leaf protocol-name {
+ type leafref {
+ path "/rt:routing/rt:control-plane-protocols/"
+ + "rt:control-plane-protocol/rt:name";
+ }
+ description
+ "The name of the LDP protocol instance.";
+ }
+ choice hello-adjacency-type {
+ description
+ "Adjacency type.";
+ case targeted {
+ container targeted {
+ presence "Present to clear targeted adjacencies.";
+ description
+ "Clear targeted adjacencies.";
+ leaf target-address {
+ type inet:ip-address;
+ description
+ "The target address. If this is not provided, then
+ all targeted adjacencies are cleared.";
+ }
+ }
+ }
+ case link {
+ container link {
+ presence "Present to clear link adjacencies.";
+ description
+ "Clear link adjacencies.";
+ leaf next-hop-interface {
+ type leafref {
+ path "/rt:routing/rt:control-plane-protocols/"
+ + "rt:control-plane-protocol/mpls-ldp/"
+ + "discovery/interfaces/interface/name";
+ }
+ description
+ "Interface connecting to a next hop. If this is
+ not provided, then all link adjacencies are
+ cleared.";
+ }
+ leaf next-hop-address {
+ type inet:ip-address;
+ must '../next-hop-interface' {
+ description
+ "Applicable when an interface is specified.";
+ }
+ description
+ "IP address of a next hop. If this is not
+ provided, then adjacencies to all next hops on the
+ given interface are cleared.";
+ }
+ }
+ }
+ } // hello-adjacency-type
+ } // hello-adjacency
+ } // input
+ } // mpls-ldp-clear-hello-adjacency
+
+ rpc mpls-ldp-clear-peer-statistics {
+ description
+ "Clears protocol statistics (e.g., sent and received
+ counters).";
+ input {
+ uses ldp-peer-ref-absolute {
+ description
+ "The LDP peer whose statistics are to be cleared.
+ If this is not provided, then all peers' statistics are
+ cleared.
+ The peer is identified by its LDP ID, which consists of
+ the LSR Id and the label space Id.";
+ }
+ }
+ }
+
+ /*
+ * Notifications
+ */
+
+ notification mpls-ldp-peer-event {
+ description
+ "Notification event for a change of LDP peer operational
+ status.";
+ leaf event-type {
+ type oper-status-event-type;
+ description
+ "Event type.";
+ }
+ container peer {
+ description
+ "Reference to an LDP peer, by the LDP ID, which consists of
+ the LSR Id and the label space Id.";
+ uses ldp-peer-ref-absolute;
+ }
+ }
+
+ notification mpls-ldp-hello-adjacency-event {
+ description
+ "Notification event for a change of LDP adjacency operational
+ status.";
+ leaf event-type {
+ type oper-status-event-type;
+ description
+ "Event type.";
+ }
+ leaf protocol-name {
+ type leafref {
+ path "/rt:routing/rt:control-plane-protocols/"
+ + "rt:control-plane-protocol/rt:name";
+ }
+ description
+ "The name of the LDP protocol instance.";
+ }
+ choice hello-adjacency-type {
+ description
+ "Interface or targeted adjacency.";
+ case targeted {
+ container targeted {
+ description
+ "Targeted adjacency through LDP extended discovery.";
+ leaf target-address {
+ type inet:ip-address;
+ description
+ "The target adjacent-address learned.";
+ }
+ }
+ }
+ case link {
+ container link {
+ description
+ "Link adjacency through LDP basic discovery.";
+ leaf next-hop-interface {
+ type if:interface-ref;
+ description
+ "The interface connecting to the adjacent next hop.";
+ }
+ leaf next-hop-address {
+ type inet:ip-address;
+ must '../next-hop-interface' {
+ description
+ "Applicable when an interface is specified.";
+ }
+ description
+ "IP address of the next hop. This can be IPv4 or IPv6
+ address.";
+ }
+ }
+ }
+ } // hello-adjacency-type
+ } // mpls-ldp-hello-adjacency-event
+
+ notification mpls-ldp-fec-event {
+ description
+ "Notification event for a change of FEC status.";
+ leaf event-type {
+ type oper-status-event-type;
+ description
+ "Event type.";
+ }
+ leaf protocol-name {
+ type leafref {
+ path "/rt:routing/rt:control-plane-protocols/"
+ + "rt:control-plane-protocol/rt:name";
+ }
+ description
+ "The name of the LDP protocol instance.";
+ }
+ leaf fec {
+ type inet:ip-prefix;
+ description
+ "The address prefix element of the FEC whose status
+ has changed.";
+ }
+ }
+ }
+ <CODE ENDS>
+
+ Figure 10: LDP Base Module
+
+9.2. Extended
+
+ This YANG module imports types defined in [RFC5036], [RFC6991],
+ [RFC8349], [RFC8177], [RFC8343], and [RFC9067].
+
+ <CODE BEGINS> file "ietf-mpls-ldp-extended@2022-03-14.yang"
+ module ietf-mpls-ldp-extended {
+ yang-version 1.1;
+ namespace "urn:ietf:params:xml:ns:yang:ietf-mpls-ldp-extended";
+ prefix ldp-ext;
+
+ import ietf-inet-types {
+ prefix inet;
+ reference
+ "RFC 6991: Common YANG Data Types";
+ }
+ import ietf-routing {
+ prefix rt;
+ reference
+ "RFC 8349: A YANG Data Model for Routing Management (NMDA
+ version)";
+ }
+ import ietf-key-chain {
+ prefix key-chain;
+ reference
+ "RFC 8177: YANG Data Model for Key Chains";
+ }
+ import ietf-mpls-ldp {
+ prefix ldp;
+ reference
+ "RFC 9070: YANG Data Model for MPLS LDP";
+ }
+ import ietf-interfaces {
+ prefix if;
+ reference
+ "RFC 8343: A YANG Data Model for Interface Management";
+ }
+ import ietf-routing-policy {
+ prefix rt-pol;
+ reference
+ "RFC 9067: A YANG Data Model for Routing Policy";
+ }
+
+ organization
+ "IETF MPLS Working Group";
+ contact
+ "WG Web: <https://datatracker.ietf.org/wg/mpls/>
+ WG List: <mailto:mpls@ietf.org>
+
+ Editor: Kamran Raza
+ <mailto:skraza@cisco.com>
+
+ Author: Rajiv Asati
+ <mailto:rajiva@cisco.com>
+
+ Author: Xufeng Liu
+ <mailto:xufeng.liu.ietf@gmail.com>
+
+ Author: Santosh Easale
+ <mailto:santosh_easale@berkeley.edu>
+
+ Author: Xia Chen
+ <mailto:jescia.chenxia@huawei.com>
+
+ Author: Himanshu Shah
+ <mailto:hshah@ciena.com>";
+ description
+ "This YANG module defines the extended components for the
+ management of Multiprotocol Label Switching (MPLS) Label
+ Distribution Protocol (LDP). It is also the model to
+ be augmented for extended Multipoint LDP (mLDP).
+
+ Copyright (c) 2022 IETF Trust and the persons identified as
+ authors of the code. All rights reserved.
+
+ Redistribution and use in source and binary forms, with or
+ without modification, is permitted pursuant to, and subject
+ to the license terms contained in, the Revised BSD License set
+ forth in Section 4.c of the IETF Trust's Legal Provisions
+ Relating to IETF Documents
+ (https://trustee.ietf.org/license-info).
+
+ This version of this YANG module is part of RFC 9070; see the
+ RFC itself for full legal notices.";
+
+ revision 2022-03-14 {
+ description
+ "Initial revision.";
+ reference
+ "RFC 9070: YANG Data Model for MPLS LDP";
+ }
+
+ /*
+ * Features
+ */
+
+ feature capability-end-of-lib {
+ description
+ "This feature indicates that the system allows for the
+ configuration of LDP end-of-lib capability.";
+ }
+
+ feature capability-typed-wildcard-fec {
+ description
+ "This feature indicates that the system allows for the
+ configuration of LDP typed-wildcard-fec capability.";
+ }
+
+ feature capability-upstream-label-assignment {
+ description
+ "This feature indicates that the system allows for the
+ configuration of LDP upstream label assignment capability.";
+ }
+
+ feature forwarding-nexthop-config {
+ description
+ "This feature indicates that the system allows for controlling
+ MPLS forwarding on an LDP interface.";
+ }
+
+ feature graceful-restart-helper-mode {
+ description
+ "This feature indicates that the system supports graceful
+ restart helper mode. We call an LSR to be operating in GR
+ helper mode when it advertises 0 as its FT Reconnect Timeout
+ in the FT Session TLV.
+ Please refer to Section 2 of RFC 3478 for details.";
+ }
+
+ feature key-chain {
+ description
+ "This feature indicates that the system supports key-chain for
+ authentication.";
+ }
+
+ feature peers-dual-stack-transport-preference {
+ description
+ "This feature indicates that the system allows for the
+ configuration of the transport connection preference in a
+ dual-stack setup for peers.";
+ }
+
+ feature per-interface-timer-config {
+ description
+ "This feature indicates that the system allows for the
+ configuration of interface Hello timers at the per-interface
+ level.";
+ }
+
+ feature per-peer-admin-down {
+ description
+ "This feature indicates that the system allows for the
+ administrative disabling of a peer.";
+ }
+
+ feature per-peer-graceful-restart-config {
+ description
+ "This feature indicates that the system allows for the
+ configuration of graceful restart at the per-peer level.";
+ }
+
+ feature per-peer-session-attributes-config {
+ description
+ "This feature indicates that the system allows for the
+ configuration of session attributes at the per-peer level.";
+ }
+
+ feature policy-label-assignment-config {
+ description
+ "This feature indicates that the system allows for the
+ configuration of policies to assign labels according to
+ certain prefixes.";
+ }
+
+ feature policy-ordered-label-config {
+ description
+ "This feature indicates that the system allows for the
+ configuration of ordered label policies.";
+ }
+
+ feature policy-targeted-discovery-config {
+ description
+ "This feature indicates that the system allows for the
+ configuration of policies to control the acceptance of
+ targeted neighbor-discovery Hello messages.";
+ }
+
+ feature session-downstream-on-demand-config {
+ description
+ "This feature indicates that the system allows for the
+ configuration of session downstream on demand.";
+ }
+
+ /*
+ * Typedefs
+ */
+
+ typedef neighbor-list-ref {
+ type leafref {
+ path "/rt-pol:routing-policy/rt-pol:defined-sets/"
+ + "rt-pol:neighbor-sets/rt-pol:neighbor-set/rt-pol:name";
+ }
+ description
+ "A type for a reference to a neighbor address list.
+ The string value is the name identifier for uniquely
+ identifying the referenced address list, which contains a list
+ of addresses that a routing policy can applied.";
+ reference
+ "RFC 9067: A YANG Data Model for Routing Policy";
+ }
+
+ typedef prefix-list-ref {
+ type leafref {
+ path "/rt-pol:routing-policy/rt-pol:defined-sets/"
+ + "rt-pol:prefix-sets/rt-pol:prefix-set/rt-pol:name";
+ }
+ description
+ "A type for a reference to a prefix list.
+ The string value is the name identifier for uniquely
+ identifying the referenced prefix set, which contains a list
+ of prefixes that a routing policy can applied.";
+ reference
+ "RFC 9067: A YANG Data Model for Routing Policy";
+ }
+
+ typedef peer-list-ref {
+ type leafref {
+ path "/rt-pol:routing-policy/rt-pol:defined-sets/"
+ + "rt-pol:neighbor-sets/rt-pol:neighbor-set/rt-pol:name";
+ }
+ description
+ "A type for a reference to a peer address list.
+ The string value is the name identifier for uniquely
+ identifying the referenced address list, which contains a list
+ of addresses that a routing policy can applied.";
+ reference
+ "RFC 9067: A YANG Data Model for Routing Policy";
+ }
+
+ /*
+ * Identities
+ */
+ /*
+ * Groupings
+ */
+
+ grouping address-family-ipv4-augment {
+ description
+ "Augmentation to address family IPv4.";
+ uses policy-container;
+ leaf transport-address {
+ type inet:ipv4-address;
+ description
+ "The transport address advertised in LDP Hello messages.
+ If this value is not specified, the LDP LSR Id is used as
+ the transport address.";
+ reference
+ "RFC 5036: LDP Specification, Sec. 3.5.2.";
+ }
+ }
+
+ grouping authentication-keychain-augment {
+ description
+ "Augmentation to authentication to add key-chain.";
+ leaf key-chain {
+ type key-chain:key-chain-ref;
+ description
+ "key-chain name.
+ If not specified, no key chain is used.";
+ }
+ }
+
+ grouping capability-augment {
+ description
+ "Augmentation to capability.";
+ container end-of-lib {
+ if-feature "capability-end-of-lib";
+ description
+ "Configure end-of-lib capability.";
+ leaf enabled {
+ type boolean;
+ default "false";
+ description
+ "'true' to enable end-of-lib capability.";
+ }
+ }
+ container typed-wildcard-fec {
+ if-feature "capability-typed-wildcard-fec";
+ description
+ "Configure typed-wildcard-fec capability.";
+ leaf enabled {
+ type boolean;
+ default "false";
+ description
+ "'true' to enable typed-wildcard-fec capability.";
+ }
+ }
+ container upstream-label-assignment {
+ if-feature "capability-upstream-label-assignment";
+ description
+ "Configure upstream label assignment capability.";
+ leaf enabled {
+ type boolean;
+ default "false";
+ description
+ "'true' to enable upstream label assignment.";
+ }
+ }
+ } // capability-augment
+
+ grouping global-augment {
+ description
+ "Augmentation to global attributes.";
+ leaf igp-synchronization-delay {
+ type uint16 {
+ range "0 | 3..300";
+ }
+ units "seconds";
+ default "0";
+ description
+ "Sets the interval that the LDP waits before notifying the
+ Interior Gateway Protocol (IGP) that label exchange is
+ completed so that IGP can start advertising the normal
+ metric for the link.
+ If the value is not specified, there is no delay.";
+ }
+ }
+
+ grouping global-forwarding-nexthop-augment {
+ description
+ "Augmentation at the global level for controlling MPLS
+ forwarding on LDP interfaces.";
+ container forwarding-nexthop {
+ if-feature "forwarding-nexthop-config";
+ description
+ "Configuration for controlling MPLS forwarding on LDP
+ interfaces.";
+ container interfaces {
+ description
+ "Containing a list of interfaces on which forwarding can be
+ disabled.";
+ list interface {
+ key "name";
+ description
+ "List of LDP interfaces on which forwarding can be
+ disabled.";
+ uses ldp:ldp-interface-ref;
+ list address-family {
+ key "afi";
+ description
+ "Per-vrf per-af params.";
+ leaf afi {
+ type identityref {
+ base rt:address-family;
+ }
+ description
+ "Address family type value.";
+ }
+ leaf ldp-disable {
+ type boolean;
+ default "false";
+ description
+ "'true' to disable LDP forwarding on the interface.";
+ }
+ }
+ } // interface
+ } // interfaces
+ } // forwarding-nexthop
+ } // global-forwarding-nexthop-augment
+
+ grouping graceful-restart-augment {
+ description
+ "Augmentation to graceful restart.";
+ leaf helper-enabled {
+ if-feature "graceful-restart-helper-mode";
+ type boolean;
+ default "false";
+ description
+ "Enable or disable graceful restart helper mode.";
+ }
+ }
+
+ grouping interface-address-family-ipv4-augment {
+ description
+ "Augmentation to interface address family IPv4.";
+ leaf transport-address {
+ type union {
+ type enumeration {
+ enum use-global-transport-address {
+ description
+ "Use the transport address set at the global level
+ common for all interfaces for this address family.";
+ }
+ enum use-interface-address {
+ description
+ "Use interface address as the transport address.";
+ }
+ }
+ type inet:ipv4-address;
+ }
+ default "use-global-transport-address";
+ description
+ "IP address to be advertised as the LDP transport address.";
+ }
+ }
+
+ grouping interface-address-family-ipv6-augment {
+ description
+ "Augmentation to interface address family IPv6.";
+ leaf transport-address {
+ type union {
+ type enumeration {
+ enum use-global-transport-address {
+ description
+ "Use the transport address set at the global level
+ common for all interfaces for this address family.";
+ }
+ enum use-interface-address {
+ description
+ "Use interface address as the transport address.";
+ }
+ }
+ type inet:ipv6-address;
+ }
+ default "use-global-transport-address";
+ description
+ "IP address to be advertised as the LDP transport address.";
+ }
+ }
+
+ grouping interface-augment {
+ description
+ "Augmentation to interface.";
+ uses ldp:basic-discovery-timers {
+ if-feature "per-interface-timer-config";
+ }
+ leaf igp-synchronization-delay {
+ if-feature "per-interface-timer-config";
+ type uint16 {
+ range "0 | 3..300";
+ }
+ units "seconds";
+ description
+ "Sets the interval that the LDP waits before notifying the
+ Interior Gateway Protocol (IGP) that label exchange is
+ completed so that IGP can start advertising the normal
+ metric for the link.
+ This leaf may be configured at the per-interface level or
+ the global level, with precedence given to the value at the
+ per-interface level. If the leaf is not configured at
+ either level, the default value at the global level is
+ used.";
+ }
+ }
+
+ grouping peer-af-policy-container {
+ description
+ "LDP policy attribute container under peer address family.";
+ container label-policy {
+ description
+ "Label policy attributes.";
+ container advertise {
+ description
+ "Label advertising policies.";
+ leaf prefix-list {
+ type prefix-list-ref;
+ description
+ "Applies the prefix list to filter outgoing label
+ advertisements.
+ If the value is not specified, no prefix filter
+ is applied.";
+ }
+ }
+ container accept {
+ description
+ "Label advertisement acceptance policies.";
+ leaf prefix-list {
+ type prefix-list-ref;
+ description
+ "Applies the prefix list to filer incoming label
+ advertisements.
+ If the value is not specified, no prefix filter
+ is applied.";
+ }
+ }
+ }
+ } // peer-af-policy-container
+
+ grouping peer-augment {
+ description
+ "Augmentation to each peer list entry.";
+ leaf admin-down {
+ if-feature "per-peer-admin-down";
+ type boolean;
+ default "false";
+ description
+ "'true' to disable the peer.";
+ }
+ uses ldp:graceful-restart-attributes-per-peer {
+ if-feature "per-peer-graceful-restart-config";
+ }
+ uses ldp:peer-attributes {
+ if-feature "per-peer-session-attributes-config";
+ }
+ }
+
+ grouping peers-augment {
+ description
+ "Augmentation to peers container.";
+ container session-downstream-on-demand {
+ if-feature "session-downstream-on-demand-config";
+ description
+ "Session downstream-on-demand attributes.";
+ leaf enabled {
+ type boolean;
+ default "false";
+ description
+ "'true' if session downstream on demand is enabled.";
+ }
+ leaf peer-list {
+ type peer-list-ref;
+ description
+ "The name of a peer ACL, to be applied to the
+ downstream-on-demand sessions.
+ If this value is not specified, no filter is applied to
+ any downstream-on-demand sessions.";
+ }
+ }
+ container dual-stack-transport-preference {
+ if-feature "peers-dual-stack-transport-preference";
+ description
+ "The settings of peers to establish TCP connection in a
+ dual-stack setup.";
+ leaf max-wait {
+ type uint16 {
+ range "0..60";
+ }
+ default "30";
+ description
+ "The maximum wait time in seconds for preferred transport
+ connection establishment. 0 indicates no preference.";
+ }
+ container prefer-ipv4 {
+ presence "Present if IPv4 is preferred for transport
+ connection establishment, subject to the
+ 'peer-list' in this container.";
+ description
+ "Uses IPv4 as the preferred address family for transport
+ connection establishment, subject to the 'peer-list' in
+ this container.
+ If this container is not present, as a default, IPv6 is
+ the preferred address family for transport connection
+ establishment.";
+ leaf peer-list {
+ type peer-list-ref;
+ description
+ "The name of a peer ACL, to be applied to the IPv4
+ transport connections.
+ If this value is not specified, no filter is applied,
+ and the IPv4 is preferred for all peers.";
+ }
+ }
+ }
+ } // peers-augment
+
+ grouping policy-container {
+ description
+ "LDP policy attributes.";
+ container label-policy {
+ description
+ "Label policy attributes.";
+ container advertise {
+ description
+ "Label advertising policies.";
+ container egress-explicit-null {
+ description
+ "Enables an egress router to advertise an
+ explicit null label (value 0) in place of an
+ implicit null label (value 3) to the
+ penultimate hop router.";
+ leaf enabled {
+ type boolean;
+ default "false";
+ description
+ "'true' to enable explicit null.";
+ }
+ }
+ leaf prefix-list {
+ type prefix-list-ref;
+ description
+ "Applies the prefix list to filter outgoing label
+ advertisements.
+ If the value is not specified, no prefix filter
+ is applied.";
+ }
+ }
+ container accept {
+ description
+ "Label advertisement acceptance policies.";
+ leaf prefix-list {
+ type prefix-list-ref;
+ description
+ "Applies the prefix list to filter incoming label
+ advertisements.
+ If the value is not specified, no prefix filter
+ is applied.";
+ }
+ }
+ container assign {
+ if-feature "policy-label-assignment-config";
+ description
+ "Label assignment policies.";
+ container independent-mode {
+ description
+ "Independent label policy attributes.";
+ leaf prefix-list {
+ type prefix-list-ref;
+ description
+ "Assign labels according to certain prefixes.
+ If the value is not specified, no prefix filter
+ is applied (labels are assigned to all learned
+ routes).";
+ }
+ }
+ container ordered-mode {
+ if-feature "policy-ordered-label-config";
+ description
+ "Ordered label policy attributes.";
+ leaf egress-prefix-list {
+ type prefix-list-ref;
+ description
+ "Assign labels according to certain prefixes for
+ egress LSR.";
+ }
+ }
+ } // assign
+ } // label-policy
+ } // policy-container
+
+ /*
+ * Configuration and state data nodes
+ */
+ // Forwarding nexthop augmentation to the global tree
+
+ augment "/rt:routing/rt:control-plane-protocols/"
+ + "rt:control-plane-protocol/ldp:mpls-ldp/ldp:global" {
+ description
+ "Forwarding nexthop augmentation.";
+ uses global-forwarding-nexthop-augment;
+ }
+
+ // global/address-families/ipv6
+
+ augment "/rt:routing/rt:control-plane-protocols/"
+ + "rt:control-plane-protocol/ldp:mpls-ldp/ldp:global/"
+ + "ldp:address-families" {
+ description
+ "Global IPv6 augmentation.";
+ container ipv6 {
+ presence "Present if IPv6 is enabled, unless the 'enabled'
+ leaf is set to 'false'.";
+ description
+ "Containing data related to the IPv6 address family.";
+ leaf enabled {
+ type boolean;
+ default "true";
+ description
+ "'false' to disable the address family.";
+ }
+ uses policy-container;
+ leaf transport-address {
+ type inet:ipv6-address;
+ mandatory true;
+ description
+ "The transport address advertised in LDP Hello messages.";
+ }
+ leaf label-distribution-control-mode {
+ type enumeration {
+ enum independent {
+ description
+ "Independent label distribution control.";
+ }
+ enum ordered {
+ description
+ "Ordered label distribution control.";
+ }
+ }
+ config false;
+ description
+ "Label distribution control mode.";
+ reference
+ "RFC 5036: LDP Specification, Sec. 2.6.";
+ }
+ // ipv6 bindings
+ container bindings {
+ config false;
+ description
+ "LDP address and label binding information.";
+ list address {
+ key "address";
+ description
+ "List of address bindings learned by LDP.";
+ leaf address {
+ type inet:ipv6-address;
+ description
+ "The IPv6 address learned from an Address
+ message received from or advertised to a peer.";
+ }
+ uses ldp:binding-address-state-attributes;
+ }
+ list fec-label {
+ key "fec";
+ description
+ "List of FEC-label bindings learned by LDP.";
+ leaf fec {
+ type inet:ipv6-prefix;
+ description
+ "The prefix FEC value in the FEC-Label binding,
+ learned in a Label Mapping message received from
+ or advertised to a peer.";
+ }
+ uses ldp:binding-label-state-attributes;
+ }
+ } // bindings
+ } // ipv6
+ }
+
+ // discovery/interfaces/interface/address-families/ipv6
+
+ augment "/rt:routing/rt:control-plane-protocols/"
+ + "rt:control-plane-protocol/ldp:mpls-ldp/ldp:discovery/"
+ + "ldp:interfaces/ldp:interface/"
+ + "ldp:address-families" {
+ description
+ "Interface IPv6 augmentation.";
+ container ipv6 {
+ presence "Present if IPv6 is enabled, unless the 'enabled'
+ leaf is set to 'false'.";
+ description
+ "IPv6 address family.";
+ leaf enabled {
+ type boolean;
+ default "true";
+ description
+ "'false' to disable the address family on the interface.";
+ }
+ container hello-adjacencies {
+ config false;
+ description
+ "Containing a list of Hello adjacencies.";
+ list hello-adjacency {
+ key "adjacent-address";
+ config false;
+ description
+ "List of Hello adjacencies.";
+ leaf adjacent-address {
+ type inet:ipv6-address;
+ description
+ "Neighbor address of the Hello adjacency.";
+ }
+ uses ldp:adjacency-state-attributes;
+ uses ldp:ldp-peer-ref-from-interface;
+ }
+ }
+ } // ipv6
+ }
+
+ // discovery/targeted/address-families/ipv6
+
+ augment "/rt:routing/rt:control-plane-protocols/"
+ + "rt:control-plane-protocol/ldp:mpls-ldp/ldp:discovery/"
+ + "ldp:targeted/ldp:address-families" {
+ description
+ "Targeted discovery IPv6 augmentation.";
+ container ipv6 {
+ presence "Present if IPv6 is enabled.";
+ description
+ "IPv6 address family.";
+ container hello-adjacencies {
+ config false;
+ description
+ "Containing a list of Hello adjacencies.";
+ list hello-adjacency {
+ key "local-address adjacent-address";
+ config false;
+ description
+ "List of Hello adjacencies.";
+ leaf local-address {
+ type inet:ipv6-address;
+ description
+ "Local address of the Hello adjacency.";
+ }
+ leaf adjacent-address {
+ type inet:ipv6-address;
+ description
+ "Neighbor address of the Hello adjacency.";
+ }
+ uses ldp:adjacency-state-attributes;
+ uses ldp:ldp-peer-ref-from-target;
+ }
+ }
+ list target {
+ key "adjacent-address";
+ description
+ "Targeted discovery params.";
+ leaf adjacent-address {
+ type inet:ipv6-address;
+ description
+ "Configures a remote LDP neighbor for the
+ extended LDP discovery.";
+ }
+ leaf enabled {
+ type boolean;
+ default "true";
+ description
+ "'true' to enable the target.";
+ }
+ leaf local-address {
+ type inet:ipv6-address;
+ description
+ "The local address used as the source address to send
+ targeted Hello messages.
+ If the value is not specified, the transport address
+ is used as the source address.";
+ }
+ } // target
+ } // ipv6
+ }
+
+ // /peers/peer/state/address-families/ipv6
+
+ augment "/rt:routing/rt:control-plane-protocols/"
+ + "rt:control-plane-protocol/ldp:mpls-ldp/ldp:peers/"
+ + "ldp:peer/ldp:address-families" {
+ description
+ "Peer state IPv6 augmentation.";
+ container ipv6 {
+ presence "Present if IPv6 is enabled.";
+ description
+ "IPv6 address family.";
+ container hello-adjacencies {
+ config false;
+ description
+ "Containing a list of Hello adjacencies.";
+ list hello-adjacency {
+ key "local-address adjacent-address";
+ description
+ "List of Hello adjacencies.";
+ leaf local-address {
+ type inet:ipv6-address;
+ description
+ "Local address of the Hello adjacency.";
+ }
+ leaf adjacent-address {
+ type inet:ipv6-address;
+ description
+ "Neighbor address of the Hello adjacency.";
+ }
+ uses ldp:adjacency-state-attributes;
+ leaf interface {
+ type if:interface-ref;
+ description
+ "Interface for this adjacency.";
+ }
+ }
+ }
+ } // ipv6
+ }
+
+ /*
+ * Configuration data and operational state data nodes
+ */
+
+ augment "/rt:routing/rt:control-plane-protocols/"
+ + "rt:control-plane-protocol/ldp:mpls-ldp/ldp:global" {
+ description
+ "Graceful restart augmentation.";
+ uses global-augment;
+ }
+
+ augment "/rt:routing/rt:control-plane-protocols/"
+ + "rt:control-plane-protocol/ldp:mpls-ldp/ldp:global/"
+ + "ldp:capability" {
+ description
+ "Capability augmentation.";
+ uses capability-augment;
+ }
+
+ augment "/rt:routing/rt:control-plane-protocols/"
+ + "rt:control-plane-protocol/ldp:mpls-ldp/ldp:global/"
+ + "ldp:graceful-restart" {
+ description
+ "Graceful restart augmentation.";
+ uses graceful-restart-augment;
+ }
+
+ augment "/rt:routing/rt:control-plane-protocols/"
+ + "rt:control-plane-protocol/ldp:mpls-ldp/ldp:global/"
+ + "ldp:address-families/ldp:ipv4" {
+ description
+ "Address family IPv4 augmentation.";
+ uses address-family-ipv4-augment;
+ }
+
+ augment "/rt:routing/rt:control-plane-protocols/"
+ + "rt:control-plane-protocol/ldp:mpls-ldp/ldp:discovery/"
+ + "ldp:interfaces/ldp:interface" {
+ description
+ "Interface augmentation.";
+ uses interface-augment;
+ }
+
+ augment "/rt:routing/rt:control-plane-protocols/"
+ + "rt:control-plane-protocol/ldp:mpls-ldp/ldp:discovery/"
+ + "ldp:interfaces/ldp:interface/ldp:address-families/"
+ + "ldp:ipv4" {
+ description
+ "Interface address family IPv4 augmentation.";
+ uses interface-address-family-ipv4-augment;
+ }
+
+ augment "/rt:routing/rt:control-plane-protocols/"
+ + "rt:control-plane-protocol/ldp:mpls-ldp/ldp:discovery/"
+ + "ldp:interfaces/ldp:interface/ldp:address-families/"
+ + "ldp-ext:ipv6" {
+ description
+ "Interface address family IPv6 augmentation.";
+ uses interface-address-family-ipv6-augment;
+ }
+
+ augment "/rt:routing/rt:control-plane-protocols/"
+ + "rt:control-plane-protocol/ldp:mpls-ldp/ldp:discovery/"
+ + "ldp:targeted/ldp:hello-accept" {
+ description
+ "Targeted discovery augmentation.";
+ leaf neighbor-list {
+ if-feature "policy-targeted-discovery-config";
+ type neighbor-list-ref;
+ description
+ "The name of a neighbor ACL, used to accept Hello messages
+ from LDP peers as permitted by the neighbor-list policy.
+ If this value is not specified, targeted Hello messages
+ from any source are accepted.";
+ }
+ }
+
+ augment "/rt:routing/rt:control-plane-protocols/"
+ + "rt:control-plane-protocol/ldp:mpls-ldp/ldp:peers" {
+ description
+ "Peers augmentation.";
+ uses peers-augment;
+ }
+
+ augment "/rt:routing/rt:control-plane-protocols/"
+ + "rt:control-plane-protocol/ldp:mpls-ldp/ldp:peers/"
+ + "ldp:authentication/ldp:authentication-type" {
+ if-feature "key-chain";
+ description
+ "Peers authentication augmentation.";
+ case key-chain {
+ uses authentication-keychain-augment;
+ }
+ }
+
+ augment "/rt:routing/rt:control-plane-protocols/"
+ + "rt:control-plane-protocol/ldp:mpls-ldp/ldp:peers/"
+ + "ldp:peer" {
+ description
+ "Peer list entry augmentation.";
+ uses peer-augment;
+ }
+
+ augment "/rt:routing/rt:control-plane-protocols/"
+ + "rt:control-plane-protocol/ldp:mpls-ldp/ldp:peers/"
+ + "ldp:peer/ldp:authentication/ldp:authentication-type" {
+ if-feature "key-chain";
+ description
+ "Peer list entry authentication augmentation.";
+ case key-chain {
+ uses authentication-keychain-augment;
+ }
+ }
+
+ augment "/rt:routing/rt:control-plane-protocols/"
+ + "rt:control-plane-protocol/ldp:mpls-ldp/ldp:peers/"
+ + "ldp:peer/ldp:address-families/ldp:ipv4" {
+ description
+ "Peer list entry IPv4 augmentation.";
+ uses peer-af-policy-container;
+ }
+
+ augment "/rt:routing/rt:control-plane-protocols/"
+ + "rt:control-plane-protocol/ldp:mpls-ldp/ldp:peers/"
+ + "ldp:peer/ldp:address-families/ldp-ext:ipv6" {
+ description
+ "Peer list entry IPv6 augmentation.";
+ uses peer-af-policy-container;
+ }
+ }
+ <CODE ENDS>
+
+ Figure 11: LDP Extended Module
+
+10. Security Considerations
+
+ This specification inherits the security considerations captured in
+ [RFC5920] and the LDP protocol specification documents, namely base
+ LDP [RFC5036], LDP IPv6 [RFC7552], LDP Capabilities [RFC5561], Typed
+ Wildcard FEC [RFC5918], LDP End-of-LIB [RFC5919], and LDP Upstream
+ Label Assignment [RFC6389].
+
+10.1. YANG Data Model
+
+ The YANG modules specified in this document define a schema for data
+ that is designed to be accessed via network management protocols such
+ as NETCONF [RFC6241] or RESTCONF [RFC8040]. The lowest NETCONF layer
+ is the secure transport layer, and the mandatory-to-implement secure
+ transport is Secure Shell (SSH) [RFC6242]. The lowest RESTCONF layer
+ is HTTPS, and the mandatory-to-implement secure transport is TLS
+ [RFC8446].
+
+ The Network Configuration Access Control Model (NACM) [RFC8341]
+ provides the means to restrict access for particular NETCONF or
+ RESTCONF users to a preconfigured subset of all available NETCONF or
+ RESTCONF protocol operations and content.
+
+10.1.1. Writable Nodes
+
+ There are a number of data nodes defined in these YANG modules that
+ are writable/creatable/deletable (i.e., config true, which is the
+ default). These data nodes may be considered sensitive or vulnerable
+ in some network environments. Write operations (e.g., edit-config)
+ to these data nodes without proper protection can have a negative
+ effect on network operations.
+
+ For LDP, the ability to modify MPLS LDP configuration may allow the
+ entire MPLS LDP domain to be compromised including forming LDP
+ adjacencies and/or peer sessions with unauthorized routers to mount a
+ massive Denial-of-Service (DoS) attack. In particular, the following
+ are the subtrees and data nodes that are sensitive and vulnerable:
+
+ /mpls-ldp/discovery/interfaces/interface: Adding LDP on any
+ unprotected interface could allow an LDP Hello adjacency to be
+ formed with an unauthorized and malicious neighbor. Once a Hello
+ adjacency is formed, a peer session could progress with this
+ neighbor.
+
+ /mpls-ldp/discovery/targeted/hello-accept: Allowing acceptance of
+ targeted-hellos could open LDP to DoS attacks related to incoming
+ targeted hellos from malicious sources.
+
+ /mpls-ldp/peers/authentication: Allowing a peer session
+ establishment is typically controlled via LDP authentication where
+ a proper and secure authentication password/key management is
+ warranted.
+
+ /mpls-ldp/peers/peer/authentication: Same as above.
+
+10.1.2. Readable Nodes
+
+ Some of the readable data nodes in these YANG modules may be
+ considered sensitive or vulnerable in some network environments. It
+ is thus important to control read access (e.g., via get, get-config,
+ or notification) to these data nodes. These are the subtrees and
+ data nodes and their sensitivity/vulnerability:
+
+ The exposure of LDP databases (such as Hello adjacencies, peers,
+ address bindings, and FEC-Label bindings) beyond the scope of the LDP
+ admin domain may be undesirable. The relevant subtrees and data
+ nodes are as follows:
+
+ * /mpls-ldp/global/address-families/ipv4/bindings/address
+
+ * /mpls-ldp/global/address-families/ipv6/bindings/address
+
+ * /mpls-ldp/global/address-families/ipv4/bindings/fec-label
+
+ * /mpls-ldp/global/address-families/ipv6/bindings/fec-label
+
+ * /mpls-ldp/discovery/interfaces/interface/address-families/ipv4/
+ hello-adjacencies
+
+ * /mpls-ldp/discovery/interfaces/interface/address-families/ipv6/
+ hello-adjacencies
+
+ * /mpls-ldp/discovery/targeted/address-families/ipv4/hello-
+ adjacencies
+
+ * /mpls-ldp/discovery/targeted/address-families/ipv6/hello-
+ adjacencies
+
+ * /mpls-ldp/peers
+
+ The configuration for LDP peer authentication is supported via the
+ key-chain specification [RFC8177] or via direct specification of a
+ key associated with a crypto algorithm (such as MD5). The relevant
+ subtrees and data nodes are as follows:
+
+ * /mpls-ldp/peers/authentication
+
+ * /mpls-ldp/peers/peer/authentication
+
+ The actual authentication key data (whether locally specified or part
+ of a key-chain) is sensitive and needs to be kept secret from
+ unauthorized parties. For key-chain-based authentication, this model
+ inherits the security considerations of [RFC8040] (that includes the
+ considerations with respect to the local storage and handling of
+ authentication keys). A similar procedure for storage and access to
+ direct keys is warranted.
+
+10.1.3. RPC Operations
+
+ Some of the RPC operations in these YANG modules may be considered
+ sensitive or vulnerable in some network environments. It is thus
+ important to control access to these operations; otherwise, control
+ plane flaps, network outages, and DoS attacks are possible. The RPC
+ operations are:
+
+ * mpls-ldp-clear-peer
+
+ * mpls-ldp-clear-hello-adjacency
+
+10.1.4. Notifications
+
+ The model describes several notifications. The implementations must
+ rate-limit the generation of these notifications to avoid creating
+ significant notification load and possible side effects on the system
+ stability.
+
+11. IANA Considerations
+
+ Per this document, the following URIs have been registered in the
+ IETF "XML Registry" [RFC3688]:
+
+ URI: urn:ietf:params:xml:ns:yang:ietf-mpls-ldp
+ Registrant: The IESG
+ XML: N/A
+
+ URI: urn:ietf:params:xml:ns:yang:ietf-mpls-ldp-extended
+ Registrant: The IESG
+ XML: N/A
+
+ Per this document, the following YANG modules have been registered in
+ the "YANG Module Names" registry [RFC6020]:
+
+ Name: ietf-mpls-ldp
+ Namespace: urn:ietf:params:xml:ns:yang:ietf-mpls-ldp
+ Prefix: ldp
+ Reference: RFC 9070
+
+ Name: ietf-mpls-ldp-extended
+ Namespace: urn:ietf:params:xml:ns:yang:ietf-mpls-ldp-extended
+ Prefix: ldp-ext
+ Reference: RFC 9070
+
+12. Normative References
+
+ [RFC3478] Leelanivas, M., Rekhter, Y., and R. Aggarwal, "Graceful
+ Restart Mechanism for Label Distribution Protocol",
+ RFC 3478, DOI 10.17487/RFC3478, February 2003,
+ <https://www.rfc-editor.org/info/rfc3478>.
+
+ [RFC3688] Mealling, M., "The IETF XML Registry", BCP 81, RFC 3688,
+ DOI 10.17487/RFC3688, January 2004,
+ <https://www.rfc-editor.org/info/rfc3688>.
+
+ [RFC5036] Andersson, L., Ed., Minei, I., Ed., and B. Thomas, Ed.,
+ "LDP Specification", RFC 5036, DOI 10.17487/RFC5036,
+ October 2007, <https://www.rfc-editor.org/info/rfc5036>.
+
+ [RFC5331] Aggarwal, R., Rekhter, Y., and E. Rosen, "MPLS Upstream
+ Label Assignment and Context-Specific Label Space",
+ RFC 5331, DOI 10.17487/RFC5331, August 2008,
+ <https://www.rfc-editor.org/info/rfc5331>.
+
+ [RFC5443] Jork, M., Atlas, A., and L. Fang, "LDP IGP
+ Synchronization", RFC 5443, DOI 10.17487/RFC5443, March
+ 2009, <https://www.rfc-editor.org/info/rfc5443>.
+
+ [RFC5561] Thomas, B., Raza, K., Aggarwal, S., Aggarwal, R., and JL.
+ Le Roux, "LDP Capabilities", RFC 5561,
+ DOI 10.17487/RFC5561, July 2009,
+ <https://www.rfc-editor.org/info/rfc5561>.
+
+ [RFC5918] Asati, R., Minei, I., and B. Thomas, "Label Distribution
+ Protocol (LDP) 'Typed Wildcard' Forward Equivalence Class
+ (FEC)", RFC 5918, DOI 10.17487/RFC5918, August 2010,
+ <https://www.rfc-editor.org/info/rfc5918>.
+
+ [RFC5919] Asati, R., Mohapatra, P., Chen, E., and B. Thomas,
+ "Signaling LDP Label Advertisement Completion", RFC 5919,
+ DOI 10.17487/RFC5919, August 2010,
+ <https://www.rfc-editor.org/info/rfc5919>.
+
+ [RFC5920] Fang, L., Ed., "Security Framework for MPLS and GMPLS
+ Networks", RFC 5920, DOI 10.17487/RFC5920, July 2010,
+ <https://www.rfc-editor.org/info/rfc5920>.
+
+ [RFC6020] Bjorklund, M., Ed., "YANG - A Data Modeling Language for
+ the Network Configuration Protocol (NETCONF)", RFC 6020,
+ DOI 10.17487/RFC6020, October 2010,
+ <https://www.rfc-editor.org/info/rfc6020>.
+
+ [RFC6241] Enns, R., Ed., Bjorklund, M., Ed., Schoenwaelder, J., Ed.,
+ and A. Bierman, Ed., "Network Configuration Protocol
+ (NETCONF)", RFC 6241, DOI 10.17487/RFC6241, June 2011,
+ <https://www.rfc-editor.org/info/rfc6241>.
+
+ [RFC6242] Wasserman, M., "Using the NETCONF Protocol over Secure
+ Shell (SSH)", RFC 6242, DOI 10.17487/RFC6242, June 2011,
+ <https://www.rfc-editor.org/info/rfc6242>.
+
+ [RFC6389] Aggarwal, R. and JL. Le Roux, "MPLS Upstream Label
+ Assignment for LDP", RFC 6389, DOI 10.17487/RFC6389,
+ November 2011, <https://www.rfc-editor.org/info/rfc6389>.
+
+ [RFC6991] Schoenwaelder, J., Ed., "Common YANG Data Types",
+ RFC 6991, DOI 10.17487/RFC6991, July 2013,
+ <https://www.rfc-editor.org/info/rfc6991>.
+
+ [RFC7552] Asati, R., Pignataro, C., Raza, K., Manral, V., and R.
+ Papneja, "Updates to LDP for IPv6", RFC 7552,
+ DOI 10.17487/RFC7552, June 2015,
+ <https://www.rfc-editor.org/info/rfc7552>.
+
+ [RFC7950] Bjorklund, M., Ed., "The YANG 1.1 Data Modeling Language",
+ RFC 7950, DOI 10.17487/RFC7950, August 2016,
+ <https://www.rfc-editor.org/info/rfc7950>.
+
+ [RFC8040] Bierman, A., Bjorklund, M., and K. Watsen, "RESTCONF
+ Protocol", RFC 8040, DOI 10.17487/RFC8040, January 2017,
+ <https://www.rfc-editor.org/info/rfc8040>.
+
+ [RFC8177] Lindem, A., Ed., Qu, Y., Yeung, D., Chen, I., and J.
+ Zhang, "YANG Data Model for Key Chains", RFC 8177,
+ DOI 10.17487/RFC8177, June 2017,
+ <https://www.rfc-editor.org/info/rfc8177>.
+
+ [RFC8294] Liu, X., Qu, Y., Lindem, A., Hopps, C., and L. Berger,
+ "Common YANG Data Types for the Routing Area", RFC 8294,
+ DOI 10.17487/RFC8294, December 2017,
+ <https://www.rfc-editor.org/info/rfc8294>.
+
+ [RFC8341] Bierman, A. and M. Bjorklund, "Network Configuration
+ Access Control Model", STD 91, RFC 8341,
+ DOI 10.17487/RFC8341, March 2018,
+ <https://www.rfc-editor.org/info/rfc8341>.
+
+ [RFC8342] Bjorklund, M., Schoenwaelder, J., Shafer, P., Watsen, K.,
+ and R. Wilton, "Network Management Datastore Architecture
+ (NMDA)", RFC 8342, DOI 10.17487/RFC8342, March 2018,
+ <https://www.rfc-editor.org/info/rfc8342>.
+
+ [RFC8343] Bjorklund, M., "A YANG Data Model for Interface
+ Management", RFC 8343, DOI 10.17487/RFC8343, March 2018,
+ <https://www.rfc-editor.org/info/rfc8343>.
+
+ [RFC8344] Bjorklund, M., "A YANG Data Model for IP Management",
+ RFC 8344, DOI 10.17487/RFC8344, March 2018,
+ <https://www.rfc-editor.org/info/rfc8344>.
+
+ [RFC8349] Lhotka, L., Lindem, A., and Y. Qu, "A YANG Data Model for
+ Routing Management (NMDA Version)", RFC 8349,
+ DOI 10.17487/RFC8349, March 2018,
+ <https://www.rfc-editor.org/info/rfc8349>.
+
+ [RFC8407] Bierman, A., "Guidelines for Authors and Reviewers of
+ Documents Containing YANG Data Models", BCP 216, RFC 8407,
+ DOI 10.17487/RFC8407, October 2018,
+ <https://www.rfc-editor.org/info/rfc8407>.
+
+ [RFC8446] Rescorla, E., "The Transport Layer Security (TLS) Protocol
+ Version 1.3", RFC 8446, DOI 10.17487/RFC8446, August 2018,
+ <https://www.rfc-editor.org/info/rfc8446>.
+
+ [RFC8529] Berger, L., Hopps, C., Lindem, A., Bogdanovic, D., and X.
+ Liu, "YANG Data Model for Network Instances", RFC 8529,
+ DOI 10.17487/RFC8529, March 2019,
+ <https://www.rfc-editor.org/info/rfc8529>.
+
+ [RFC9067] Qu, Y., Tantsura, J., Lindem, A., and X. Liu, "A YANG Data
+ Model for Routing Policy", RFC 9067, DOI 10.17487/RFC9067,
+ October 2021, <https://www.rfc-editor.org/info/rfc9067>.
+
+13. Informative References
+
+ [MPLS-MLDP-YANG]
+ Raza, K., Ed., Liu, X., Esale, S., Andersson, L.,
+ Tantsura, J., and S. Krishnaswamy, "YANG Data Model for
+ MPLS mLDP", Work in Progress, Internet-Draft, draft-ietf-
+ mpls-mldp-yang-10, 11 November 2021,
+ <https://datatracker.ietf.org/doc/html/draft-ietf-mpls-
+ mldp-yang-10>.
+
+ [RFC4364] Rosen, E. and Y. Rekhter, "BGP/MPLS IP Virtual Private
+ Networks (VPNs)", RFC 4364, DOI 10.17487/RFC4364, February
+ 2006, <https://www.rfc-editor.org/info/rfc4364>.
+
+ [RFC7307] Zhao, Q., Raza, K., Zhou, C., Fang, L., Li, L., and D.
+ King, "LDP Extensions for Multi-Topology", RFC 7307,
+ DOI 10.17487/RFC7307, July 2014,
+ <https://www.rfc-editor.org/info/rfc7307>.
+
+ [RFC7951] Lhotka, L., "JSON Encoding of Data Modeled with YANG",
+ RFC 7951, DOI 10.17487/RFC7951, August 2016,
+ <https://www.rfc-editor.org/info/rfc7951>.
+
+ [RFC8340] Bjorklund, M. and L. Berger, Ed., "YANG Tree Diagrams",
+ BCP 215, RFC 8340, DOI 10.17487/RFC8340, March 2018,
+ <https://www.rfc-editor.org/info/rfc8340>.
+
+Appendix A. Data Tree Example
+
+ This section contains an example of an instance data tree in the JSON
+ encoding [RFC7951], containing both configuration and state data.
+
+ +---------------------+
+ | |
+ | Router 203.0.113.1 |
+ | |
+ +----------+----------+
+ |eth1
+ |2001:db8:0:1::1/64
+ |
+ |
+ |2001:db8:0:1::2/64
+ +----------+----------+
+ | | |
+ | Another Router +---------| 2001:db8:0:2::/64
+ | | |
+ +---------------------+
+
+ Figure 12: Example Topology
+
+ The configuration instance data tree for Router 203.0.113.1 in
+ Figure 12 could be as follows:
+
+ {
+ "ietf-interfaces:interfaces": {
+ "interface": [
+ {
+ "name": "eth1",
+ "description": "An interface with LDP enabled.",
+ "type": "iana-if-type:ethernetCsmacd",
+ "ietf-ip:ipv6": {
+ "address": [
+ {
+ "ip": "2001:db8:0:1::1",
+ "prefix-length": 64
+ }
+ ],
+ "forwarding": true
+ }
+ }
+ ]
+ },
+ "ietf-routing:routing": {
+ "router-id": "203.0.113.1",
+ "control-plane-protocols": {
+ "control-plane-protocol": [
+ {
+ "type": "ietf-mpls-ldp:mpls-ldp",
+ "name": "ldp-1",
+ "ietf-mpls-ldp:mpls-ldp": {
+ "global": {
+ "address-families": {
+ "ietf-mpls-ldp-extended:ipv6": {
+ "enabled": true,
+ "transport-address": "2001:db8:0:1::1"
+ }
+ }
+ },
+ "discovery": {
+ "interfaces": {
+ "interface": [
+ {
+ "name": "eth1",
+ "address-families": {
+ "ietf-mpls-ldp-extended:ipv6": {
+ "enabled": true
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+
+ Figure 13: Example Configuration Data in JSON
+
+ The corresponding operational state data for Router 203.0.113.1 could
+ be as follows:
+
+ {
+ "ietf-interfaces:interfaces": {
+ "interface": [
+ {
+ "name": "eth1",
+ "description": "An interface with LDP enabled.",
+ "type": "iana-if-type:ethernetCsmacd",
+ "phys-address": "00:00:5e:00:53:01",
+ "oper-status": "up",
+ "statistics": {
+ "discontinuity-time": "2018-09-10T15:16:27-05:00"
+ },
+ "ietf-ip:ipv6": {
+ "forwarding": true,
+ "mtu": 1500,
+ "address": [
+ {
+ "ip": "2001:db8:0:1::1",
+ "prefix-length": 64,
+ "origin": "static",
+ "status": "preferred"
+ },
+ {
+ "ip": "fe80::200:5eff:fe00:5301",
+ "prefix-length": 64,
+ "origin": "link-layer",
+ "status": "preferred"
+ }
+ ],
+ "neighbor": [
+ {
+ "ip": "2001:db8:0:1::2",
+ "link-layer-address": "00:00:5e:00:53:02",
+ "origin": "dynamic",
+ "is-router": [null],
+ "state": "reachable"
+ },
+ {
+ "ip": "fe80::200:5eff:fe00:5302",
+ "link-layer-address": "00:00:5e:00:53:02",
+ "origin": "dynamic",
+ "is-router": [null],
+ "state": "reachable"
+ }
+ ]
+ }
+ }
+ ]
+ },
+ "ietf-routing:routing": {
+ "router-id": "203.0.113.1",
+ "interfaces": {
+ "interface": [
+ "eth1"
+ ]
+ },
+ "control-plane-protocols": {
+ "control-plane-protocol": [
+ {
+ "type": "ietf-mpls-ldp:mpls-ldp",
+ "name": "ldp-1",
+ "ietf-mpls-ldp:mpls-ldp": {
+ "global": {
+ "address-families": {
+ "ietf-mpls-ldp-extended:ipv6": {
+ "enabled": true,
+ "transport-address": "2001:db8:0:1::1"
+ }
+ }
+ },
+ "discovery": {
+ "interfaces": {
+ "interface": [
+ {
+ "name": "eth1",
+ "address-families": {
+ "ietf-mpls-ldp-extended:ipv6": {
+ "enabled": true,
+ "hello-adjacencies": {
+ "hello-adjacency": [
+ {
+ "adjacent-address":
+ "fe80::200:5eff:fe00:5302",
+ "flag": ["adjacency-flag-active"],
+ "hello-holdtime": {
+ "adjacent": 15,
+ "negotiated": 15,
+ "remaining": 9
+ },
+ "next-hello": 3,
+ "statistics": {
+ "discontinuity-time":
+ "2018-09-10T15:16:27-05:00"
+ },
+ "peer": {
+ "lsr-id": "203.0.113.2",
+ "label-space-id": 0
+ }
+ }
+ ]
+ }
+ }
+ }
+ }
+ ]
+ }
+ },
+ "peers": {
+ "peer": [
+ {
+ "lsr-id": "203.0.113.2",
+ "label-space-id": 0,
+ "label-advertisement-mode": {
+ "local": "downstream-unsolicited",
+ "peer": "downstream-unsolicited",
+ "negotiated": "downstream-unsolicited"
+ },
+ "next-keep-alive": 5,
+ "session-holdtime": {
+ "peer": 180,
+ "negotiated": 180,
+ "remaining": 78
+ },
+ "session-state": "operational",
+ "tcp-connection": {
+ "local-address": "fe80::200:5eff:fe00:5301",
+ "local-port": 646,
+ "remote-address": "fe80::200:5eff:fe00:5302",
+ "remote-port": 646
+ },
+ "up-time": 3438100,
+ "statistics": {
+ "discontinuity-time": "2018-09-10T15:16:27-05:00"
+ }
+ }
+ ]
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+
+ Figure 14: Example Operational Data in JSON
+
+Acknowledgments
+
+ The authors would like to acknowledge Eddie Chami, Nagendra Kumar,
+ Mannan Venkatesan, and Pavan Beeram for their contribution to this
+ document.
+
+ We also acknowledge Ladislav Lhotka, Jan Lindblad, Tom Petch,
+ Yingzhen Qu, and Benjamin Kaduk for their detailed review of the
+ model during WG and IESG processes.
+
+Contributors
+
+ Danial Johari
+ Cisco Systems
+ Email: dajohari@cisco.com
+
+
+ Loa Andersson
+ Huawei Technologies
+ Email: loa@pi.nu
+
+
+ Jeff Tantsura
+ Apstra
+ Email: jefftant.ietf@gmail.com
+
+
+ Matthew Bocci
+ Nokia
+ Email: matthew.bocci@nokia.com
+
+
+ Reshad Rahman
+ Email: reshad@yahoo.com
+
+
+ Stephane Litkowski
+ Cisco Systems
+ Email: slitkows@cisco.com
+
+
+Authors' Addresses
+
+ Kamran Raza (editor)
+ Cisco Systems
+ Canada
+ Email: skraza@cisco.com
+
+
+ Rajiv Asati
+ Cisco Systems
+ United States of America
+ Email: rajiva@cisco.com
+
+
+ Xufeng Liu
+ IBM Corporation
+ United States of America
+ Email: xufeng.liu.ietf@gmail.com
+
+
+ Santosh Easale
+ Juniper Networks
+ United States of America
+ Email: santosh_easale@berkeley.edu
+
+
+ Xia Chen
+ Huawei Technologies
+ China
+ Email: jescia.chenxia@huawei.com
+
+
+ Himanshu Shah
+ Ciena Corporation
+ United States of America
+ Email: hshah@ciena.com