draft-ietf-bess-l2vpn-yang-07.txt   draft-ietf-bess-l2vpn-yang-08.txt 
BESS Working Group H. Shah, Ed. BESS Working Group H. Shah, Ed.
Internet-Draft Ciena Corporation Internet-Draft Ciena Corporation
Intended status: Standards Track P. Brissette, Ed. Intended status: Standards Track P. Brissette, Ed.
Expires: April 3, 2018 Cisco Systems, Inc. Expires: August 21, 2018 Cisco Systems, Inc.
I. Chen, Ed. I. Chen, Ed.
Jabil Jabil
I. Hussain, Ed. I. Hussain, Ed.
Infinera Corporation Infinera Corporation
B. Wen, Ed. B. Wen, Ed.
Comcast Comcast
K. Tiruveedhula, Ed. K. Tiruveedhula, Ed.
Juniper Networks Juniper Networks
September 30, 2017 February 17, 2018
YANG Data Model for MPLS-based L2VPN YANG Data Model for MPLS-based L2VPN
draft-ietf-bess-l2vpn-yang-07.txt draft-ietf-bess-l2vpn-yang-08.txt
Abstract Abstract
This document describes a YANG data model for Layer 2 VPN (L2VPN) This document describes a YANG data model for Layer 2 VPN (L2VPN)
services over MPLS networks. These services include point-to-point services over MPLS networks. These services include point-to-point
Virtual Private Wire Service (VPWS) and multipoint Virtual Private Virtual Private Wire Service (VPWS) and multipoint Virtual Private
LAN service (VPLS) that uses LDP and BGP signaled Pseudowires. It is LAN service (VPLS) that uses LDP and BGP signaled Pseudowires. It is
expected that this model will be used by the management tools run by expected that this model will be used by the management tools run by
the network operators in order to manage and monitor the network the network operators in order to manage and monitor the network
resources that they use to deliver L2VPN services. resources that they use to deliver L2VPN services.
skipping to change at page 1, line 49 skipping to change at page 1, line 49
Internet-Drafts are working documents of the Internet Engineering Internet-Drafts are working documents of the Internet Engineering
Task Force (IETF). Note that other groups may also distribute Task Force (IETF). Note that other groups may also distribute
working documents as Internet-Drafts. The list of current Internet- working documents as Internet-Drafts. The list of current Internet-
Drafts is at https://datatracker.ietf.org/drafts/current/. Drafts is at https://datatracker.ietf.org/drafts/current/.
Internet-Drafts are draft documents valid for a maximum of six months Internet-Drafts are draft documents valid for a maximum of six months
and may be updated, replaced, or obsoleted by other documents at any and may be updated, replaced, or obsoleted by other documents at any
time. It is inappropriate to use Internet-Drafts as reference time. It is inappropriate to use Internet-Drafts as reference
material or to cite them other than as "work in progress." material or to cite them other than as "work in progress."
This Internet-Draft will expire on April 3, 2018. This Internet-Draft will expire on August 21, 2018.
Copyright Notice Copyright Notice
Copyright (c) 2017 IETF Trust and the persons identified as the Copyright (c) 2018 IETF Trust and the persons identified as the
document authors. All rights reserved. document authors. All rights reserved.
This document is subject to BCP 78 and the IETF Trust's Legal This document is subject to BCP 78 and the IETF Trust's Legal
Provisions Relating to IETF Documents Provisions Relating to IETF Documents
(https://trustee.ietf.org/license-info) in effect on the date of (https://trustee.ietf.org/license-info) in effect on the date of
publication of this document. Please review these documents publication of this document. Please review these documents
carefully, as they describe your rights and restrictions with respect carefully, as they describe your rights and restrictions with respect
to this document. Code Components extracted from this document must to this document. Code Components extracted from this document must
include Simplified BSD License text as described in Section 4.e of include Simplified BSD License text as described in Section 4.e of
the Trust Legal Provisions and are provided without warranty as the Trust Legal Provisions and are provided without warranty as
skipping to change at page 2, line 40 skipping to change at page 2, line 40
3.4. L2VPN Common . . . . . . . . . . . . . . . . . . . . . . 8 3.4. L2VPN Common . . . . . . . . . . . . . . . . . . . . . . 8
3.4.1. redundancy-group-templates . . . . . . . . . . . . . 8 3.4.1. redundancy-group-templates . . . . . . . . . . . . . 8
3.5. L2VPN instance . . . . . . . . . . . . . . . . . . . . . 8 3.5. L2VPN instance . . . . . . . . . . . . . . . . . . . . . 8
3.5.1. common attributes . . . . . . . . . . . . . . . . . . 8 3.5.1. common attributes . . . . . . . . . . . . . . . . . . 8
3.5.2. PW list . . . . . . . . . . . . . . . . . . . . . . . 8 3.5.2. PW list . . . . . . . . . . . . . . . . . . . . . . . 8
3.5.3. List of endpoints . . . . . . . . . . . . . . . . . . 9 3.5.3. List of endpoints . . . . . . . . . . . . . . . . . . 9
3.5.4. point-to-point or multipoint service . . . . . . . . 10 3.5.4. point-to-point or multipoint service . . . . . . . . 10
3.6. Operational State . . . . . . . . . . . . . . . . . . . . 10 3.6. Operational State . . . . . . . . . . . . . . . . . . . . 10
3.7. Yang tree . . . . . . . . . . . . . . . . . . . . . . . . 10 3.7. Yang tree . . . . . . . . . . . . . . . . . . . . . . . . 10
4. YANG Module . . . . . . . . . . . . . . . . . . . . . . . . . 13 4. YANG Module . . . . . . . . . . . . . . . . . . . . . . . . . 13
5. Security Considerations . . . . . . . . . . . . . . . . . . . 42 5. Security Considerations . . . . . . . . . . . . . . . . . . . 41
6. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 42 6. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 42
7. Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . 42 7. Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . 42
8. References . . . . . . . . . . . . . . . . . . . . . . . . . 42 8. References . . . . . . . . . . . . . . . . . . . . . . . . . 42
8.1. Normative References . . . . . . . . . . . . . . . . . . 42 8.1. Normative References . . . . . . . . . . . . . . . . . . 42
8.2. Informative References . . . . . . . . . . . . . . . . . 42 8.2. Informative References . . . . . . . . . . . . . . . . . 42
Appendix A. Example Configuration . . . . . . . . . . . . . . . 45 Appendix A. Example Configuration . . . . . . . . . . . . . . . 45
Appendix B. Contributors . . . . . . . . . . . . . . . . . . . . 45 Appendix B. Contributors . . . . . . . . . . . . . . . . . . . . 45
Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 47 Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 46
1. Introduction 1. Introduction
The Network Configuration Protocol (NETCONF) [RFC6241] is a network The Network Configuration Protocol (NETCONF) [RFC6241] is a network
management protocol that defines mechanisms to manage network management protocol that defines mechanisms to manage network
devices. YANG [RFC6020] is a modular language that represents data devices. YANG [RFC6020] is a modular language that represents data
structures in an XML or JSON tree format, and is used as a data structures in an XML or JSON tree format, and is used as a data
modeling language for the NETCONF. modeling language for the NETCONF.
This document defines a YANG data model for MPLS based Layer 2 VPN This document defines a YANG data model for MPLS based Layer 2 VPN
services (L2VPN) [RFC4664] and includes switching between the local services (L2VPN) [RFC4664] and includes switching between the local
attachment circuits. The L2VPN model covers point-to-point VPWS and attachment circuits. The L2VPN model covers point-to-point VPWS and
Multipoint VPLS services. These services use signaling of Multipoint VPLS services. These services use signaling of
Pseudowires across MPLS networks using LDP [RFC4447][RFC4762] or Pseudowires across MPLS networks using LDP [RFC8077][RFC4762] or
BGP[RFC4761]. BGP[RFC4761].
Initially, the data model covers Ethernet based Layer 2 services. Initially, the data model covers Ethernet based Layer 2 services.
The Ethernet Attachment Circuits are not defined. Instead, they are The Ethernet Attachment Circuits are not defined. Instead, they are
leveraged from other standards organizations such as IEEE802.1 and leveraged from other standards organizations such as IEEE802.1 and
Metro Ethernet Forum (MEF). Metro Ethernet Forum (MEF).
Other Layer 2 services, such as ATM, Frame Relay, TDM, etc are Other Layer 2 services, such as ATM, Frame Relay, TDM, etc are
included in the scope but will be covered as the future work items. included in the scope but will be covered as the future work items.
skipping to change at page 3, line 45 skipping to change at page 3, line 45
o Operational State o Operational State
o Executables (Actions) o Executables (Actions)
o Notifications o Notifications
The current document focuses on definition of configuration, state The current document focuses on definition of configuration, state
and notification objects. and notification objects.
The L2VPN data object model uses the instance centric approach. The L2VPN data object model uses the instance centric approach. The
Within an L2VPN instance; a set of common parameters, a list of PWs L2VPN instance is recognized by network instance model. The network-
and a list of endpoints are defined. A special constraint is added instance container is defined in network instance model [I-D.ietf-
for the VPWS configuration such that only two endpoints are allowed netmod-ni-model].
in the list of endpoints.
Within this network instance, L2VPN container contains a set of common
parameters, a list of PWs and a list of endpoints are defined. A
special constraint is added for the VPWS configuration such that only
two endpoints are allowed in the list of endpoints.
The Pseudowire data object model is defined independent of the L2VPN The Pseudowire data object model is defined independent of the L2VPN
data object model to allow its inclusion in the Ethernet Segment and data object model to allow its inclusion in the Ethernet Segment and
EVPN data objects. EVPN data objects.
The L2VPN data object model augments Psuedowire data object for its The L2VPN data object model augments Psuedowire data object for its
definition. definition.
The document also includes Notifications used by the L2VPN object The document also includes Notifications used by the L2VPN object
model model
skipping to change at page 5, line 18 skipping to change at page 5, line 18
o Requirements for Pseudo-wire Emulation Edge-to-Edge (PWE3) o Requirements for Pseudo-wire Emulation Edge-to-Edge (PWE3)
[RFC3916] [RFC3916]
o Pseudo-wire Emulation Edge-to-Edge (PWE3) Architecture [RFC3985] o Pseudo-wire Emulation Edge-to-Edge (PWE3) Architecture [RFC3985]
o IANA Allocations for Pseudowire Edge to Edge Emulation (PWE3) o IANA Allocations for Pseudowire Edge to Edge Emulation (PWE3)
[RFC4446] [RFC4446]
o Pseudowire Setup and Maintenance Using the Label Distribution o Pseudowire Setup and Maintenance Using the Label Distribution
Protocol (LDP) [RFC4447] Protocol (LDP) [RFC8077]
o Encapsulation Methods for Transport of Ethernet over MPLS Networks o Encapsulation Methods for Transport of Ethernet over MPLS Networks
[RFC4448] [RFC4448]
o Pseudowire Emulation Edge-to-Edge (PWE3) Control Word for Use over o Pseudowire Emulation Edge-to-Edge (PWE3) Control Word for Use over
an MPLS PSN [RFC4385] an MPLS PSN [RFC4385]
o Requirements for Multi-Segment Pseudowire Emulation Edge-to-Edge o Requirements for Multi-Segment Pseudowire Emulation Edge-to-Edge
(PWE3) [RFC5254] (PWE3) [RFC5254]
skipping to change at page 7, line 14 skipping to change at page 7, line 14
PW // Container PW // Container
PW specific attributes PW specific attributes
PW template definition PW template definition
template-ref Redundancy-Group // redundancy-group template-ref Redundancy-Group // redundancy-group
template template
attributes attributes
l2vpn-instances // containter Network Instance // containter
l2vpn //container
common attributes common attributes
BGP-parameters // container BGP-parameters // container
common attributes common attributes
auto-discovery attributes auto-discovery attributes
signaling attributes signaling attributes
// list of PWs being used // list of PWs being used
PW // container PW // container
template-ref PW template-ref PW
skipping to change at page 7, line 39 skipping to change at page 7, line 39
pbb specific attributes pbb specific attributes
VPWS-constraints // rule to limit number of endpoints to two VPWS-constraints // rule to limit number of endpoints to two
// List of endpoints, where each member endpoint container is - // List of endpoints, where each member endpoint container is -
PW // reference PW // reference
redundancy-grp // container redundancy-grp // container
AC // eventual reference to standard AC AC // eventual reference to standard AC
PW // reference PW // reference
Figure 1
3.2. Open issues and next steps 3.2. Open issues and next steps
Most of the open issues have been resolved in this document. There Most of the open issues have been resolved in this document. There
are some items for considerations, such as PW headend, VPLS IRB. are some items for considerations, such as PW headend, VPLS IRB.
These may or may not be convered in this document. If the working These may or may not be convered in this document. If the working
group intends these topics be addressed in a separate document, group intends these topics be addressed in a separate document,
authors will proceed to finalize this document with comments received authors will proceed to finalize this document with comments received
on the definitions included in the current document. on the definitions included in the current document.
3.3. Pseudowire Common 3.3. Pseudowire Common
skipping to change at page 8, line 29 skipping to change at page 8, line 29
3.4. L2VPN Common 3.4. L2VPN Common
3.4.1. redundancy-group-templates 3.4.1. redundancy-group-templates
The redundancy-group-template contains a list of templates. Each The redundancy-group-template contains a list of templates. Each
template defines common attributes related to redundancy such as template defines common attributes related to redundancy such as
protection mode, reversion parameters, etc. protection mode, reversion parameters, etc.
3.5. L2VPN instance 3.5. L2VPN instance
A list of L2VPN instance is defined where each entry represent a The network instance container defined in the network instance model
point to point or multipoint service. Within a service instance, a [I-D.ietf-rtgwg-ni-model] identifies the L2VPN instance. One of the
set of common attributes are defined, followed by a list of PWs and a value defined by the ni-type used in the instance model refers to VSI
list of endpoints. (Virtual Switch Instance) to denote the L2VPN instance. The name
attribute is used as the key to refer to specific network instance.
Network Instance of type VSI anchors L2VPN container with a list
of endpoints which when limited to two entries represents point to
point service (i.e. VPWS) while more than two endpoints represent
multipoint service (i.e. VPLS). Within a service instance, a set of
common attributes are defined, followed by a list of PWs and a list
of endpoints.
3.5.1. common attributes 3.5.1. common attributes
The common attributes apply to entire L2VPN instance. These The common attributes apply to entire L2VPN instance. These
attributes typically include attributes such as mac-aging-timer, BGP attributes typically include attributes such as mac-aging-timer, BGP
related parameters (if using BGP signaling), discovery-type, etc. related parameters (if using BGP signaling), discovery-type, etc.
3.5.2. PW list 3.5.2. PW list
The PW list is the number of PWs that are being used for a given The PW list is the number of PWs that are being used for a given
skipping to change at page 11, line 8 skipping to change at page 11, line 10
+--rw pw-templates +--rw pw-templates
+--rw pw-template* [name] +--rw pw-template* [name]
+--rw name string +--rw name string
+--rw mtu? uint16 +--rw mtu? uint16
+--rw cw-negotiation? cw-negotiation-type +--rw cw-negotiation? cw-negotiation-type
+--rw tunnel-policy? string +--rw tunnel-policy? string
module: ietf-l2vpn module: ietf-l2vpn
+--rw l2vpn +--rw l2vpn
+--rw redundancy-group-templates +--rw redundancy-group-templates
| +--rw redundancy-group-template* [name] +--rw redundancy-group-template* [name]
| +--rw name string +--rw name string
| +--rw protection-mode? enumeration +--rw protection-mode? enumeration
| +--rw reroute-mode? enumeration +--rw reroute-mode? enumeration
| +--rw dual-receive? boolean +--rw dual-receive? boolean
| +--rw revert? boolean +--rw revert? boolean
| +--rw reroute-delay? uint16 +--rw reroute-delay? uint16
| +--rw revert-delay? uint16 +--rw revert-delay? uint16
+--rw instances augment /ni:network-instances/ni:network-instance/ni:ni-type:
+--rw instance* [name type] +--:(l2vpn)
+--rw name string +--rw type? identityref
+--rw type identityref +--rw mtu? uint16
+--rw mtu? uint16 +--rw mac-aging-timer? uint32
+--rw mac-aging-timer? uint32 +--rw service-type? l2vpn-service-type
+--rw service-type? l2vpn-service-type +--rw discovery-type? l2vpn-discovery-type
+--rw discovery-type? l2vpn-discovery-type +--rw signaling-type l2vpn-signaling-type
+--rw signaling-type l2vpn-signaling-type +--rw bgp-auto-discovery
+--rw bgp-auto-discovery | +--rw route-distinguisher? rt-types:route-distinguisher
| +--rw route-distinguisher? rt-types:route-distinguisher | +--rw vpn-id? string
| +--rw vpn-id? string | +--rw vpn-target* [route-target]
| +--rw vpn-target* [route-target] | +--rw route-target rt-types:route-target
| +--rw route-target rt-types:route-target | +--rw route-target-type rt-types:route-target-type
| +--rw route-target-type rt-types:route-target-type +--rw bgp-signaling
+--rw bgp-signaling | +--rw site-id? uint16
| +--rw site-id? uint16 | +--rw site-range? uint16
| +--rw site-range? uint16 +--rw endpoint* [name]
+--rw endpoint* [name] | +--rw name string
| +--rw name string | +--rw (ac-or-pw-or-redundancy-grp)?
| +--rw (ac-or-pw-or-redundancy-grp)? | | +--:(ac)
| | +--:(ac) | | | +--rw ac* [name]
| | | +--rw ac* [name] | | | +--rw name if:interface-ref
| | | +--rw name string | | | +--ro state? operational-state-type
| | | +--ro state? operational-state-type | | +--:(pw)
| | +--:(pw) | | | +--rw pw* [name]
| | | +--rw pw* [name] | | | +--rw name pw:pseudowire-ref
| | | +--rw name pw:pseudowire-ref | | | +--ro state? -> /pw:pseudowires/pseudowire[pw:name=current()/../name]/state
| | | +--ro state? -> /pw:pseudowires/pseudowire[pw:name=current()/../name]/state | | +--:(redundancy-grp)
| | +--:(redundancy-grp) | | +--rw (primary)
| | +--rw (primary) | | | +--:(primary-ac)
| | | +--:(primary-ac) | | | | +--rw primary-ac
| | | | +--rw primary-ac | | | | +--rw name? if:interface-ref
| | | | +--rw name? string | | | | +--ro state? operational-state-type
| | | | +--ro state? operational-state-type | | | +--:(primary-pw)
| | | +--:(primary-pw) | | | +--rw primary-pw* [name]
| | | +--rw primary-pw* [name] | | | +--rw name pw:pseudowire-ref
| | | +--rw name pw:pseudowire-ref | | | +--ro state? -> /pw:pseudowires/pseudowire[pw:name=current()/../name]/state
| | | +--ro state? -> /pw:pseudowires/pseudowire[pw:name=current()/../name]/state | | +--rw (backup)?
| | +--rw (backup)? | | | +--:(backup-ac)
| | | +--:(backup-ac) | | | | +--rw backup-ac
| | | | +--rw backup-ac | | | | +--rw name? if:interface-ref
| | | | +--rw name? string | | | | +--ro state? operational-state-type
| | | | +--ro state? operational-state-type | | | +--:(backup-pw)
| | | +--:(backup-pw) | | | +--rw backup-pw* [name]
| | | +--rw backup-pw* [name] | | | +--rw name pw:pseudowire-ref
| | | +--rw name pw:pseudowire-ref | | | +--ro state? -> /pw:pseudowires/pseudowire[pw:name=current()/../name]/state
| | | +--ro state? -> /pw:pseudowires/pseudowire[pw:name=current()/../name]/state | | | +--rw precedence? uint32
| | | +--rw precedence? uint32 | | +--rw template? redundancy-group-template-ref
| | +--rw template? -> /l2vpn/redundancy-group-templates/redundancy-group-template/name | | +--rw protection-mode? enumeration
| | +--rw protection-mode? enumeration | | +--rw reroute-mode? enumeration
| | +--rw reroute-mode? enumeration | | +--rw dual-receive? boolean
| | +--rw dual-receive? boolean | | +--rw revert? boolean
| | +--rw revert? boolean | | +--rw reroute-delay? uint16
| | +--rw reroute-delay? uint16 | | +--rw revert-delay? uint16
| | +--rw revert-delay? uint16 | +--rw split-horizon-group? string
| +--rw split-horizon-group? string +--rw vpws-constraints
+--rw vpws-constraints +--rw pbb-parameters
+--rw pbb-parameters +--rw (component-type)?
+--rw (component-type)? +--:(i-component)
+--:(i-component) | +--rw i-sid? i-sid-type
| +--rw i-sid? i-sid-type | +--rw backbone-src-mac? yang:mac-address
| +--rw backbone-src-mac? yang:mac-address +--:(b-component)
+--:(b-component) +--rw bind-b-component-name? l2vpn-instance-name-ref
+--rw bind-b-component-name? l2vpn-instance-name-ref +--ro bind-b-component-type? identityref
+--ro bind-b-component-type? identityref
augment /pw:pseudowires/pw:pseudowire: augment /pw:pseudowires/pw:pseudowire:
+--rw vccv-ability? boolean +--rw vccv-ability? boolean
+--rw request-vlanid? uint16 +--rw request-vlanid? uint16
+--rw vlan-tpid? string +--rw vlan-tpid? string
+--rw ttl? uint8 +--rw ttl? uint8
augment /pw:pseudowires/pw:pseudowire/pw:pw-type: augment /pw:pseudowires/pw:pseudowire/pw:pw-type:
+--:(bgp-pw) +--:(bgp-pw)
| +--rw bgp-pw | +--rw bgp-pw
| +--rw remote-pe-id? inet:ip-address | +--rw remote-pe-id? inet:ip-address
+--:(bgp-ad-pw) +--:(bgp-ad-pw)
+--rw bgp-ad-pw +--rw bgp-ad-pw
+--rw remote-ve-id? uint16 +--rw remote-ve-id? uint16
notifications: notifications:
+---n l2vpn-state-change-notification +---n l2vpn-state-change-notification
+--ro l2vpn-instance-name? l2vpn-instance-name-ref +--ro l2vpn-instance-name? l2vpn-instance-name-ref
+--ro l2vpn-instance-type? -> /l2vpn/instances/instance[l2vpn:name=current()/../l2vpn-instance-name]/type +--ro l2vpn-instance-type? -> /ni:network-instances/network-instance[ni:name=current()/../l2vpn-instance-name]/l2vpn:type
+--ro endpoint? -> /l2vpn/instances/instance[l2vpn:name=current()/../l2vpn-instance-name][l2vpn:type=current()/../l2vpn-instance-type]/l2vpn:endpoint/name +--ro endpoint? -> /ni:network-instances/network-instance[ni:name=current()/../l2vpn-instance-name]/l2vpn:endpoint/name
+--ro (ac-or-pw-or-redundancy-grp)? +--ro (ac-or-pw-or-redundancy-grp)?
| +--:(ac) | +--:(ac)
| | +--ro ac? -> /l2vpn/instances/instance[name=current()/../l2vpn-instance-name][type=current()/../l2vpn-instance-type]/endpoint[name=current()/../endpoint]/ac/name | | +--ro ac? -> /ni:network-instances/network-instance[ni:name=current()/../l2vpn-instance-name]/l2vpn:endpoint[l2vpn:name=current()/../endpoint]/ac/name
| +--:(pw) | +--:(pw)
| | +--ro pw? -> /l2vpn/instances/instance[name=current()/../l2vpn-instance-name][type=current()/../l2vpn-instance-type]/endpoint[name=current()/../endpoint]/pw/name | | +--ro pw? -> /ni:network-instances/network-instance[ni:name=current()/../l2vpn-instance-name]/l2vpn:endpoint[l2vpn:name=current()/../endpoint]/pw/name
| +--:(redundancy-grp) | +--:(redundancy-grp)
| +--ro (primary) | +--ro (primary)
| | +--:(primary-ac) | | +--:(primary-ac)
| | | +--ro primary-ac? -> /l2vpn/instances/instance[name=current()/../l2vpn-instance-name][type=current()/../l2vpn-instance-type]/endpoint[name=current()/../endpoint]/primary-ac/name | | | +--ro primary-ac? -> /ni:network-instances/network-instance[ni:name=current()/../l2vpn-instance-name]/l2vpn:endpoint[l2vpn:name=current()/../endpoint]/primary-ac/name
| | +--:(primary-pw) | | +--:(primary-pw)
| | +--ro primary-pw? -> /l2vpn/instances/instance[name=current()/../l2vpn-instance-name][type=current()/../l2vpn-instance-type]/endpoint[name=current()/../endpoint]/primary-pw/name | | +--ro primary-pw? -> /ni:network-instances/network-instance[ni:name=current()/../l2vpn-instance-name]/l2vpn:endpoint[l2vpn:name=current()/../endpoint]/primary-pw/name
| +--ro (backup)? | +--ro (backup)?
| +--:(backup-ac) | +--:(backup-ac)
| | +--ro backup-ac? -> /l2vpn/instances/instance[name=current()/../l2vpn-instance-name][type=current()/../l2vpn-instance-type]/endpoint[name=current()/../endpoint]/backup-ac/name | | +--ro backup-ac? -> /ni:network-instances/network-instance[ni:name=current()/../l2vpn-instance-name]/l2vpn:endpoint[l2vpn:name=current()/../endpoint]/backup-ac/name
| +--:(backup-pw) | +--:(backup-pw)
| +--ro backup-pw? -> /l2vpn/instances/instance[name=current()/../l2vpn-instance-name][type=current()/../l2vpn-instance-type]/endpoint[name=current()/../endpoint]/backup-pw/name | +--ro backup-pw? -> /ni:network-instances/network-instance[ni:name=current()/../l2vpn-instance-name]/l2vpn:endpoint[l2vpn:name=current()/../endpoint]/backup-pw/name
+--ro state? identityref +--ro state? identityref
Figure 2
4. YANG Module 4. YANG Module
The L2VPN configuration container is logically divided into following The L2VPN configuration container is logically divided into following
high level config areas: high level config areas:
<CODE BEGINS> file "ietf-pseudowires@2017-06-26.yang" <CODE BEGINS> file "ietf-pseudowires@2017-06-26.yang"
module ietf-pseudowires { module ietf-pseudowires {
namespace "urn:ietf:params:xml:ns:yang:ietf-pseudowires"; namespace "urn:ietf:params:xml:ns:yang:ietf-pseudowires";
prefix "pw"; prefix "pw";
skipping to change at page 18, line 27 skipping to change at page 18, line 30
} }
leaf tunnel-policy { leaf tunnel-policy {
type string; type string;
description "tunnel policy name"; description "tunnel policy name";
} }
} }
} }
} }
} }
<CODE ENDS> <CODE ENDS>
<CODE BEGINS> file "ietf-l2vpn@2018-02-06.yang"
<CODE BEGINS> file "ietf-l2vpn@2017-09-21.yang"
module ietf-l2vpn { module ietf-l2vpn {
namespace "urn:ietf:params:xml:ns:yang:ietf-l2vpn"; namespace "urn:ietf:params:xml:ns:yang:ietf-l2vpn";
prefix "l2vpn"; prefix "l2vpn";
import ietf-inet-types { import ietf-inet-types {
prefix "inet"; prefix "inet";
} }
import ietf-yang-types { import ietf-yang-types {
prefix "yang"; prefix "yang";
} }
import ietf-routing-types { import ietf-routing-types {
prefix "rt-types"; prefix "rt-types";
} }
import ietf-interfaces {
prefix "if";
}
import ietf-network-instance {
prefix "ni";
}
import ietf-pseudowires { import ietf-pseudowires {
prefix "pw"; prefix "pw";
} }
organization "ietf"; organization "ietf";
contact "ietf"; contact "ietf";
description "l2vpn"; description "l2vpn";
revision "2018-02-06" {
description "Eighth revision " +
" - Incorporated ietf-network-instance model " +
" - change the type of attachment circuit to " +
" if:interface-ref " +
"";
reference "";
}
revision "2017-09-21" { revision "2017-09-21" {
description "Seventh revision " + description "Seventh revision " +
" - Fixed yangdump errors " + " - Fixed yangdump errors " +
""; "";
reference ""; reference "";
} }
revision "2017-06-26" { revision "2017-06-26" {
description "Sixth revision " + description "Sixth revision " +
" - Removed unused module mpls " + " - Removed unused module mpls " +
skipping to change at page 26, line 6 skipping to change at page 26, line 24
typedef redundancy-group-template-ref { typedef redundancy-group-template-ref {
type leafref { type leafref {
path "/l2vpn:l2vpn/l2vpn:redundancy-group-templates" + path "/l2vpn:l2vpn/l2vpn:redundancy-group-templates" +
"/l2vpn:redundancy-group-template/l2vpn:name"; "/l2vpn:redundancy-group-template/l2vpn:name";
} }
description "redundancy-group-template-ref"; description "redundancy-group-template-ref";
} }
typedef l2vpn-instance-name-ref { typedef l2vpn-instance-name-ref {
type leafref { type leafref {
path "/l2vpn:l2vpn/l2vpn:instances" + path "/ni:network-instances/ni:network-instance" +
"/l2vpn:instance/l2vpn:name"; "/ni:name";
} }
description "l2vpn-instance-name-ref"; description "l2vpn-instance-name-ref";
} }
typedef l2vpn-instance-type-ref { typedef l2vpn-instance-type-ref {
type leafref { type leafref {
path "/l2vpn:l2vpn/l2vpn:instances" + path "/ni:network-instances/ni:network-instance" +
"/l2vpn:instance/l2vpn:type"; "/l2vpn:type";
} }
description "l2vpn-instance-type-ref"; description "l2vpn-instance-type-ref";
} }
typedef operational-state-type { typedef operational-state-type {
type enumeration { type enumeration {
enum 'up' { enum 'up' {
description "Operational state is up"; description "Operational state is up";
} }
enum 'down' { enum 'down' {
skipping to change at page 26, line 43 skipping to change at page 27, line 13
type uint32 { type uint32 {
range "0..16777216"; range "0..16777216";
} }
description "I-SID type that is 24-bits. " + description "I-SID type that is 24-bits. " +
"This should be moved to ieee-types.yang at " + "This should be moved to ieee-types.yang at " +
"http://www.ieee802.org/1/files/public/docs2015" + "http://www.ieee802.org/1/files/public/docs2015" +
"/new-mholness-ieee-types-yang-v01.yang"; "/new-mholness-ieee-types-yang-v01.yang";
} }
/* groupings */ /* groupings */
/*
grouping one-l2vpn-endpoint-grp {
description "A grouping that identifies a single endpoint " +
"within a single L2VPN instance";
leaf l2vpn-instance-name {
type l2vpn-instance-name-ref;
description "The L2VPN instance name";
}
leaf l2vpn-instance-type {
type leafref {
path "/l2vpn:l2vpn/l2vpn:instances" +
"/l2vpn:instance" +
"[l2vpn:name=current()/../l2vpn-instance-name]" +
"/l2vpn:type";
}
description "The L2VPN instance type";
}
leaf endpoint {
type leafref {
path "/l2vpn:l2vpn/l2vpn:instances" +
"/l2vpn:instance" +
"[l2vpn:name=current()/../l2vpn-instance-name]" +
"[l2vpn:type=current()/../l2vpn-instance-type]" +
"/l2vpn:endpoint/l2vpn:name";
}
}
}
*/
grouping pbb-parameters-grp { grouping pbb-parameters-grp {
description "PBB parameters grouping"; description "PBB parameters grouping";
container pbb-parameters { container pbb-parameters {
description "pbb-parameters"; description "pbb-parameters";
choice component-type { choice component-type {
description "PBB component type"; description "PBB component type";
case i-component { case i-component {
leaf i-sid { leaf i-sid {
type i-sid-type; type i-sid-type;
description "I-SID"; description "I-SID";
} }
leaf backbone-src-mac { leaf backbone-src-mac {
type yang:mac-address; type yang:mac-address;
description "backbone-src-mac"; description "backbone-src-mac";
} }
} }
case b-component { case b-component {
leaf bind-b-component-name { leaf bind-b-component-name {
type l2vpn-instance-name-ref; type l2vpn-instance-name-ref;
must "/l2vpn:l2vpn" + must "/ni:network-instances" +
"/l2vpn:instances" + "/ni:network-instance[ni:name=current()]" +
"/l2vpn:instance[l2vpn:name=current()]" + "/l2vpn:type = 'l2vpn:vpls-instance-type'" {
"/type = 'vpls-instance-type'" {
description "A b-component must be an L2VPN instance " + description "A b-component must be an L2VPN instance " +
"of type vpls-instance-type"; "of type vpls-instance-type";
} }
description "Reference to the associated b-component"; description "Reference to the associated b-component";
} }
leaf bind-b-component-type { leaf bind-b-component-type {
type identityref { type identityref {
base l2vpn-instance-type; base l2vpn-instance-type;
} }
must ". = 'l2vpn:vpls-instance-type'" { must ". = 'l2vpn:vpls-instance-type'" {
skipping to change at page 29, line 4 skipping to change at page 28, line 43
base l2vpn-instance-type; base l2vpn-instance-type;
} }
must ". = 'l2vpn:vpls-instance-type'" { must ". = 'l2vpn:vpls-instance-type'" {
description "The associated b-component must have " + description "The associated b-component must have " +
"type vpls-instance-type"; "type vpls-instance-type";
} }
description "Type of the associated b-component"; description "Type of the associated b-component";
} }
} }
} }
} }
} }
grouping l2vpn-common-parameters-grp { grouping l2vpn-common-parameters-grp {
description "L2VPN common parameters"; description "L2VPN common parameters";
leaf name {
type string;
description "Name of L2VPN service instance";
}
leaf type { leaf type {
type identityref { type identityref {
base l2vpn-instance-type; base l2vpn-instance-type;
} }
description "Type of L2VPN service instance"; description "Type of L2VPN service instance";
} }
leaf mtu { leaf mtu {
type uint16; type uint16;
description "MTU of L2VPN service"; description "MTU of L2VPN service";
} }
leaf mac-aging-timer { leaf mac-aging-timer {
type uint32; type uint32;
description "mac-aging-timer, the duration after which" + description "mac-aging-timer, the duration after which" +
"a MAC entry is considered aged out"; "a MAC entry is considered aged out";
} }
skipping to change at page 32, line 17 skipping to change at page 32, line 4
} }
case backup-pw { case backup-pw {
description "backup-pw"; description "backup-pw";
} }
} }
} }
} }
} }
/* L2VPN YANG Model */ /* L2VPN YANG Model */
container l2vpn { container l2vpn {
description "l2vpn"; description "L2VPN specific data";
container redundancy-group-templates { container redundancy-group-templates {
description "redundancy group templates"; description "redundancy group templates";
list redundancy-group-template { list redundancy-group-template {
key "name"; key "name";
description "redundancy-group-template"; description "redundancy-group-template";
leaf name { leaf name {
type string; type string;
description "name"; description "name";
} }
uses redundancy-group-properties-grp; uses redundancy-group-properties-grp;
} }
} }
container instances { }
description "A list of L2VPN instances";
list instance { /* augments */
key "name type";
description "An L2VPN service instance"; augment "/ni:network-instances/ni:network-instance/ni:ni-type" {
uses l2vpn-common-parameters-grp; description
container bgp-auto-discovery { "Augmentation for L2VPN instance";
description "BGP auto-discovery parameters"; case l2vpn {
leaf route-distinguisher { description "An L2VPN service instance";
type rt-types:route-distinguisher; uses l2vpn-common-parameters-grp;
description "BGP route distinguisher"; container bgp-auto-discovery {
} description "BGP auto-discovery parameters";
leaf vpn-id { leaf route-distinguisher {
type string; type rt-types:route-distinguisher;
description "VPN ID"; description "BGP route distinguisher";
}
uses rt-types:vpn-route-targets;
} }
container bgp-signaling { leaf vpn-id {
when "../signaling-type = 'bgp-signaling'" { type string;
description "Check signaling type: " + description "VPN ID";
"Can only configure BGP signaling if " +
"signaling type is BGP";
}
description "BGP signaling parameters";
uses bgp-signaling-parameters-grp;
} }
list endpoint { uses rt-types:vpn-route-targets;
key "name"; }
description "An endpoint"; container bgp-signaling {
leaf name { when "../signaling-type = 'bgp-signaling'" {
type string; description "Check signaling type: " +
description "endpoint name"; "Can only configure BGP signaling if " +
} "signaling type is BGP";
uses endpoint-grp { }
augment "ac-or-pw-or-redundancy-grp/ac" { description "BGP signaling parameters";
description "Augment for attachment circuit(s) " + uses bgp-signaling-parameters-grp;
"as an endpoint"; }
list ac { list endpoint {
key "name"; key "name";
leaf name { description "An endpoint";
type string; leaf name {
description "Name of attachment circuit. " + type string;
"This field is intended to " + description "endpoint name";
"reference standardized " + }
"layer-2 definitions."; uses endpoint-grp {
} augment "ac-or-pw-or-redundancy-grp/ac" {
leaf state { description "Augment for attachment circuit(s) " +
type operational-state-type; "as an endpoint";
config false; list ac {
description "attachment circuit up/down state"; key "name";
} leaf name {
description "An L2VPN instance's " + type if:interface-ref;
"attachment circuit list"; description "Name of attachment circuit";
} }
leaf state {
type operational-state-type;
config false;
description "attachment circuit up/down state";
}
description "An L2VPN instance's " +
"attachment circuit list";
} }
augment "ac-or-pw-or-redundancy-grp/pw" { }
description "Augment for pseudowire(s) as an endpoint"; augment "ac-or-pw-or-redundancy-grp/pw" {
list pw { description "Augment for pseudowire(s) as an endpoint";
key "name"; list pw {
leaf name { key "name";
type pw:pseudowire-ref; leaf name {
must "(../../../type = " + type pw:pseudowire-ref;
" 'l2vpn:vpws-instance-type') or " + must "(../../../type = " +
"(not(boolean(/pw:pseudowires" + " 'l2vpn:vpws-instance-type') or " +
" /pw:pseudowire[pw:name = current()]" + "(not(boolean(/pw:pseudowires" +
" /vccv-ability)) and " + " /pw:pseudowire[pw:name = current()]" +
" not(boolean(/pw:pseudowires" + " /vccv-ability)) and " +
" /pw:pseudowire[pw:name = current()]" + " not(boolean(/pw:pseudowires" +
" /request-vlanid)) and " + " /pw:pseudowire[pw:name = current()]" +
" not(boolean(/pw:pseudowires" + " /request-vlanid)) and " +
" /pw:pseudowire[pw:name = current()]" + " not(boolean(/pw:pseudowires" +
" /vlan-tpid)) and " + " /pw:pseudowire[pw:name = current()]" +
" not(boolean(/pw:pseudowires" + " /vlan-tpid)) and " +
" /pw:pseudowire[pw:name = current()]" + " not(boolean(/pw:pseudowires" +
" /ttl)))" { " /pw:pseudowire[pw:name = current()]" +
description "Only a VPWS PW has parameters " + " /ttl)))" {
"vccv-ability, request-vlanid, " + description "Only a VPWS PW has parameters " +
"vlan-tpid, and ttl"; "vccv-ability, request-vlanid, " +
} "vlan-tpid, and ttl";
description "Pseudowire name";
}
leaf state {
type leafref {
path "/pw:pseudowires" +
"/pw:pseudowire[pw:name=current()/../name]" +
"/pw:state";
} }
config false;
description "Pseudowire state"; description "Pseudowire name";
}
leaf state {
type leafref {
path "/pw:pseudowires" +
"/pw:pseudowire[pw:name=current()/../name]" +
"/pw:state";
} }
description "An L2VPN instance's pseudowire list"; config false;
description "Pseudowire state";
} }
description "An L2VPN instance's pseudowire list";
} }
augment "ac-or-pw-or-redundancy-grp/redundancy-grp/" + }
"primary/primary-ac" { augment "ac-or-pw-or-redundancy-grp/redundancy-grp/" +
description "Augment for primary-ac"; "primary/primary-ac" {
container primary-ac { description "Augment for primary-ac";
description "Primary AC"; container primary-ac {
leaf name { description "Primary AC";
type string; leaf name {
description "Name of attachment circuit. " + type if:interface-ref;
"This field is intended to " + description "Name of attachment circuit";
"reference standardized " + }
"layer-2 definitions."; leaf state {
} type operational-state-type;
leaf state { config false;
type operational-state-type; description "attachment circuit up/down state";
config false;
description "attachment circuit up/down state";
}
} }
} }
augment "ac-or-pw-or-redundancy-grp/redundancy-grp/" + }
"primary/primary-pw" { augment "ac-or-pw-or-redundancy-grp/redundancy-grp/" +
"primary/primary-pw" {
description "Augment for primary-pw"; description "Augment for primary-pw";
list primary-pw { list primary-pw {
key "name"; key "name";
leaf name { leaf name {
type pw:pseudowire-ref; type pw:pseudowire-ref;
must "(../../../type = " + must "(../../../type = " +
" 'l2vpn:vpws-instance-type') or " + " 'l2vpn:vpws-instance-type') or " +
"(not(boolean(/pw:pseudowires" + "(not(boolean(/pw:pseudowires" +
" /pw:pseudowire[pw:name = current()]" + " /pw:pseudowire[pw:name = current()]" +
" /vccv-ability)) and " + " /vccv-ability)) and " +
" not(boolean(/pw:pseudowires" + " not(boolean(/pw:pseudowires" +
" /pw:pseudowire[pw:name = current()]" + " /pw:pseudowire[pw:name = current()]" +
" /request-vlanid)) and " + " /request-vlanid)) and " +
" not(boolean(/pw:pseudowires" + " not(boolean(/pw:pseudowires" +
" /pw:pseudowire[pw:name = current()]" + " /pw:pseudowire[pw:name = current()]" +
" /vlan-tpid)) and " + " /vlan-tpid)) and " +
" not(boolean(/pw:pseudowires" + " not(boolean(/pw:pseudowires" +
" /pw:pseudowire[pw:name = current()]" + " /pw:pseudowire[pw:name = current()]" +
" /ttl)))" { " /ttl)))" {
description "Only a VPWS PW has parameters " + description "Only a VPWS PW has parameters " +
"vccv-ability, request-vlanid, " + "vccv-ability, request-vlanid, " +
"vlan-tpid, and ttl"; "vlan-tpid, and ttl";
}
description "Pseudowire name";
}
leaf state {
type leafref {
path "/pw:pseudowires" +
"/pw:pseudowire[pw:name=current()/../name]" +
"/pw:state";
} }
config false; description "Pseudowire name";
description "Pseudowire state"; }
leaf state {
type leafref {
path "/pw:pseudowires" +
"/pw:pseudowire[pw:name=current()/../name]" +
"/pw:state";
} }
description "An L2VPN instance's pseudowire list"; config false;
description "Pseudowire state";
} }
description "An L2VPN instance's pseudowire list";
} }
augment "ac-or-pw-or-redundancy-grp/redundancy-grp/" + }
"backup/backup-ac" { augment "ac-or-pw-or-redundancy-grp/redundancy-grp/" +
description "Augment for backup-ac"; "backup/backup-ac" {
container backup-ac { description "Augment for backup-ac";
description "Backup AC"; container backup-ac {
leaf name { description "Backup AC";
type string; leaf name {
description "Name of attachment circuit. " + type if:interface-ref;
"This field is intended to " + description "Name of attachment circuit";
"reference standardized " + }
"layer-2 definitions."; leaf state {
type operational-state-type;
} config false;
leaf state { description "attachment circuit up/down state";
type operational-state-type;
config false;
description "attachment circuit up/down state";
}
} }
} }
augment "ac-or-pw-or-redundancy-grp/redundancy-grp/" + }
"backup/backup-pw" { augment "ac-or-pw-or-redundancy-grp/redundancy-grp/" +
description "Augment for backup-pw"; "backup/backup-pw" {
list backup-pw { description "Augment for backup-pw";
key "name"; list backup-pw {
leaf name { key "name";
type pw:pseudowire-ref; leaf name {
must "(../../../type = " + type pw:pseudowire-ref;
" 'l2vpn:vpws-instance-type') or " + must "(../../../type = " +
"(not(boolean(/pw:pseudowires" + " 'l2vpn:vpws-instance-type') or " +
" /pw:pseudowire[pw:name = current()]" + "(not(boolean(/pw:pseudowires" +
" /vccv-ability)) and " + " /pw:pseudowire[pw:name = current()]" +
" not(boolean(/pw:pseudowires" + " /vccv-ability)) and " +
" /pw:pseudowire[pw:name = current()]" + " not(boolean(/pw:pseudowires" +
" /request-vlanid)) and " + " /pw:pseudowire[pw:name = current()]" +
" not(boolean(/pw:pseudowires" + " /request-vlanid)) and " +
" /pw:pseudowire[pw:name = current()]" + " not(boolean(/pw:pseudowires" +
" /vlan-tpid)) and " + " /pw:pseudowire[pw:name = current()]" +
" not(boolean(/pw:pseudowires" + " /vlan-tpid)) and " +
" /pw:pseudowire[pw:name = current()]" + " not(boolean(/pw:pseudowires" +
" /ttl)))" { " /pw:pseudowire[pw:name = current()]" +
description "Only a VPWS PW has parameters " + " /ttl)))" {
"vccv-ability, request-vlanid, " + description "Only a VPWS PW has parameters " +
"vlan-tpid, and ttl"; "vccv-ability, request-vlanid, " +
} "vlan-tpid, and ttl";
description "Pseudowire name";
}
leaf state {
type leafref {
path "/pw:pseudowires" +
"/pw:pseudowire[pw:name=current()/../name]" +
"/pw:state";
} }
config false; description "Pseudowire name";
description "Pseudowire state";
}
description "A list of backup pseudowires";
} }
} leaf state {
augment "ac-or-pw-or-redundancy-grp/redundancy-grp" {
description "Augment for redundancy group properties";
leaf template {
type leafref { type leafref {
path "/l2vpn/redundancy-group-templates" + path "/pw:pseudowires" +
"/redundancy-group-template/name"; "/pw:pseudowire[pw:name=current()/../name]" +
"/pw:state";
} }
description "Reference a redundancy group " + config false;
"properties template"; description "Pseudowire state";
} }
uses redundancy-group-properties-grp; description "A list of backup pseudowires";
} }
} }
augment "ac-or-pw-or-redundancy-grp/redundancy-grp" {
description "Augment for redundancy group properties";
leaf template {
type redundancy-group-template-ref;
description "Reference a redundancy group " +
"properties template";
}
uses redundancy-group-properties-grp;
}
} }
} }
} }
} }
/* augments */
augment "/pw:pseudowires/pw:pseudowire" { augment "/pw:pseudowires/pw:pseudowire" {
description "Augment for peudowire parameters for " + description "Augment for peudowire parameters for " +
"VPWS pseudowires"; "VPWS pseudowires";
leaf vccv-ability { leaf vccv-ability {
type boolean; type boolean;
description "vccvability"; description "vccvability";
} }
leaf request-vlanid { leaf request-vlanid {
type uint16; type uint16;
description "request vlanid"; description "request vlanid";
} }
leaf vlan-tpid { leaf vlan-tpid {
type string; type string;
description "vlan tpid"; description "vlan tpid";
} }
leaf ttl { leaf ttl {
skipping to change at page 38, line 19 skipping to change at page 37, line 42
container bgp-ad-pw { container bgp-ad-pw {
description "BGP auto-discovery pseudowire"; description "BGP auto-discovery pseudowire";
leaf remote-ve-id { leaf remote-ve-id {
type uint16; type uint16;
description "remote ve id"; description "remote ve id";
} }
} }
} }
} }
augment "/l2vpn/instances/instance" { augment "/ni:network-instances/ni:network-instance/ni:ni-type" +
when "type = 'l2vpn:vpws-instance-type'" { "/l2vpn:l2vpn" {
when "l2vpn:type = 'l2vpn:vpws-instance-type'" {
description "Constraints only for VPWS pseudowires"; description "Constraints only for VPWS pseudowires";
} }
description "Augment for VPWS instance"; description "Augment for VPWS instance";
container vpws-constraints { container vpws-constraints {
must "(count(../endpoint) <= 2) and " + must "(count(../endpoint) <= 2) and " +
"(count(../endpoint/pw) <= 1) and " + "(count(../endpoint/pw) <= 1) and " +
"(count(../endpoint/ac) <= 1) and " + "(count(../endpoint/ac) <= 1) and " +
"(count(../endpoint/primary-pw) <= 1) and " + "(count(../endpoint/primary-pw) <= 1) and " +
"(count(../endpoint/backup-pw) <= 1) " { "(count(../endpoint/backup-pw) <= 1) " {
description "A VPWS L2VPN instance has at most 2 endpoints " + description "A VPWS L2VPN instance has at most 2 endpoints " +
"and each endpoint has at most 1 pseudowire or " + "and each endpoint has at most 1 pseudowire or " +
"1 attachment circuit"; "1 attachment circuit";
} }
description "VPWS constraints"; description "VPWS constraints";
} }
} }
augment "/l2vpn/instances/instance" { augment "/ni:network-instances/ni:network-instance/ni:ni-type" +
when "type = 'l2vpn:vpls-instance-type'" { "/l2vpn:l2vpn" {
when "l2vpn:type = 'l2vpn:vpls-instance-type'" {
description "Parameters specifically for a VPLS instance"; description "Parameters specifically for a VPLS instance";
} }
description "Augment for parameters for a VPLS instance"; description "Augment for parameters for a VPLS instance";
uses pbb-parameters-grp; uses pbb-parameters-grp;
} }
augment "/l2vpn/instances/instance/endpoint" { augment "/ni:network-instances/ni:network-instance/ni:ni-type" +
when "../type = 'l2vpn:vpls-instance-type'" { "/l2vpn:l2vpn/l2vpn:endpoint" {
when "../l2vpn:type = 'l2vpn:vpls-instance-type'" {
description "Endpoint parameter specifically for " + description "Endpoint parameter specifically for " +
"a VPLS instance"; "a VPLS instance";
} }
description "Augment for endpoint parameters for a VPLS instance"; description "Augment for endpoint parameters for a VPLS instance";
leaf split-horizon-group { leaf split-horizon-group {
type string; type string;
description "Identify a split horizon group"; description "Identify a split horizon group";
} }
} }
augment "/l2vpn/instances/instance/endpoint" + augment "/ni:network-instances/ni:network-instance/ni:ni-type" +
"/ac-or-pw-or-redundancy-grp/redundancy-grp" + "/l2vpn:l2vpn/l2vpn:endpoint" +
"/backup/backup-pw/backup-pw" { "/l2vpn:ac-or-pw-or-redundancy-grp" +
when "../../type = 'l2vpn:vpls-instance-type'" { "/l2vpn:redundancy-grp/l2vpn:backup" +
"/l2vpn:backup-pw/l2vpn:backup-pw" {
when "../../l2vpn:type = 'l2vpn:vpls-instance-type'" {
description "Backup pseudowire parameter specifically for " + description "Backup pseudowire parameter specifically for " +
"a VPLS instance"; "a VPLS instance";
} }
description "Augment for backup pseudowire paramters for " + description "Augment for backup pseudowire paramters for " +
"a VPLS instance"; "a VPLS instance";
leaf precedence { leaf precedence {
type uint32; type uint32;
description "precedence of the pseudowire"; description "precedence of the pseudowire";
} }
} }
skipping to change at page 39, line 34 skipping to change at page 39, line 14
/* Notifications */ /* Notifications */
notification l2vpn-state-change-notification { notification l2vpn-state-change-notification {
description "L2VPN and constituents state change notification"; description "L2VPN and constituents state change notification";
leaf l2vpn-instance-name { leaf l2vpn-instance-name {
type l2vpn-instance-name-ref; type l2vpn-instance-name-ref;
description "The L2VPN instance name"; description "The L2VPN instance name";
} }
leaf l2vpn-instance-type { leaf l2vpn-instance-type {
type leafref { type leafref {
path "/l2vpn:l2vpn/l2vpn:instances" + path "/ni:network-instances" +
"/l2vpn:instance" + "/ni:network-instance" +
"[l2vpn:name=current()/../l2vpn-instance-name]" + "[ni:name=current()/../l2vpn-instance-name]" +
"/l2vpn:type"; "/l2vpn:type";
} }
description "The L2VPN instance type"; description "The L2VPN instance type";
} }
leaf endpoint { leaf endpoint {
type leafref { type leafref {
path "/l2vpn:l2vpn/l2vpn:instances" + path "/ni:network-instances" +
"/l2vpn:instance" + "/ni:network-instance" +
"[l2vpn:name=current()/../l2vpn-instance-name]" + "[ni:name=current()/../l2vpn-instance-name]" +
"[l2vpn:type=current()/../l2vpn-instance-type]" +
"/l2vpn:endpoint/l2vpn:name"; "/l2vpn:endpoint/l2vpn:name";
} }
description "The endpoint"; description "The endpoint";
} }
uses endpoint-grp { uses endpoint-grp {
augment "ac-or-pw-or-redundancy-grp/ac" { augment "ac-or-pw-or-redundancy-grp/ac" {
description "Augment for attachment circuit(s) " + description "Augment for attachment circuit(s) " +
"as an endpoint"; "as an endpoint";
leaf ac { leaf ac {
type leafref { type leafref {
path "/l2vpn/instances/instance" + path "/ni:network-instances" +
"[name=current()/../l2vpn-instance-name]" + "/ni:network-instance" +
"[type=current()/../l2vpn-instance-type]" + "[ni:name=current()/../l2vpn-instance-name]" +
"/endpoint[name=current()/../endpoint]/ac/name"; "/l2vpn:endpoint" +
"[l2vpn:name=current()/../endpoint]" +
"/l2vpn:ac/l2vpn:name";
} }
description "Related attachment circuit"; description "Related attachment circuit";
} }
} }
augment "ac-or-pw-or-redundancy-grp/pw" { augment "ac-or-pw-or-redundancy-grp/pw" {
description "Augment for pseudowire(s) as an endpoint"; description "Augment for pseudowire(s) as an endpoint";
leaf pw { leaf pw {
type leafref { type leafref {
path "/l2vpn/instances/instance" + path "/ni:network-instances" +
"[name=current()/../l2vpn-instance-name]" + "/ni:network-instance" +
"[type=current()/../l2vpn-instance-type]" + "[ni:name=current()/../l2vpn-instance-name]" +
"/endpoint[name=current()/../endpoint]/pw/name"; "/l2vpn:endpoint[l2vpn:name=current()/../endpoint]" +
"/l2vpn:pw/l2vpn:name";
} }
description "Related pseudowire"; description "Related pseudowire";
} }
} }
augment "ac-or-pw-or-redundancy-grp/redundancy-grp/" + augment "ac-or-pw-or-redundancy-grp/redundancy-grp/" +
"primary/primary-ac" { "primary/primary-ac" {
description "Augment for primary-ac"; description "Augment for primary-ac";
leaf primary-ac { leaf primary-ac {
type leafref { type leafref {
path "/l2vpn/instances/instance" + path "/ni:network-instances" +
"[name=current()/../l2vpn-instance-name]" + "/ni:network-instance" +
"[type=current()/../l2vpn-instance-type]" + "[ni:name=current()/../l2vpn-instance-name]" +
"/endpoint[name=current()/../endpoint]/primary-ac/name"; "/l2vpn:endpoint" +
"[l2vpn:name=current()/../endpoint]" +
"/l2vpn:primary-ac/l2vpn:name";
} }
description "Related primary attachment circuit"; description "Related primary attachment circuit";
} }
} }
augment "ac-or-pw-or-redundancy-grp/redundancy-grp/" + augment "ac-or-pw-or-redundancy-grp/redundancy-grp/" +
"primary/primary-pw" { "primary/primary-pw" {
description "Augment for primary-pw"; description "Augment for primary-pw";
leaf primary-pw { leaf primary-pw {
type leafref { type leafref {
path "/l2vpn/instances/instance" + path "/ni:network-instances" +
"[name=current()/../l2vpn-instance-name]" + "/ni:network-instance" +
"[type=current()/../l2vpn-instance-type]" + "[ni:name=current()/../l2vpn-instance-name]" +
"/endpoint[name=current()/../endpoint]/primary-pw/name"; "/l2vpn:endpoint" +
"[l2vpn:name=current()/../endpoint]" +
"/l2vpn:primary-pw/l2vpn:name";
} }
description "Related primary pseudowire"; description "Related primary pseudowire";
} }
} }
augment "ac-or-pw-or-redundancy-grp/redundancy-grp/" + augment "ac-or-pw-or-redundancy-grp/redundancy-grp/" +
"backup/backup-ac" { "backup/backup-ac" {
description "Augment for backup-ac"; description "Augment for backup-ac";
leaf backup-ac { leaf backup-ac {
type leafref { type leafref {
path "/l2vpn/instances/instance" + path "/ni:network-instances" +
"[name=current()/../l2vpn-instance-name]" + "/ni:network-instance" +
"[type=current()/../l2vpn-instance-type]" + "[ni:name=current()/../l2vpn-instance-name]" +
"/endpoint[name=current()/../endpoint]/backup-ac/name"; "/l2vpn:endpoint" +
"[l2vpn:name=current()/../endpoint]" +
"/l2vpn:backup-ac/l2vpn:name";
} }
description "Related backup attachment circuit"; description "Related backup attachment circuit";
} }
} }
augment "ac-or-pw-or-redundancy-grp/redundancy-grp/" + augment "ac-or-pw-or-redundancy-grp/redundancy-grp/" +
"backup/backup-pw" { "backup/backup-pw" {
description "Augment for backup-pw"; description "Augment for backup-pw";
leaf backup-pw { leaf backup-pw {
type leafref { type leafref {
path "/l2vpn/instances/instance" + path "/ni:network-instances" +
"[name=current()/../l2vpn-instance-name]" + "/ni:network-instance" +
"[type=current()/../l2vpn-instance-type]" + "[ni:name=current()/../l2vpn-instance-name]" +
"/endpoint[name=current()/../endpoint]/backup-pw/name"; "/l2vpn:endpoint" +
"[l2vpn:name=current()/../endpoint]" +
"/l2vpn:backup-pw/l2vpn:name";
} }
description "Related backup pseudowire"; description "Related backup pseudowire";
} }
} }
} }
leaf state { leaf state {
type identityref { type identityref {
base l2vpn-notification-state; base l2vpn-notification-state;
} }
description "State change notification"; description "State change notification";
} }
} }
} }
<CODE ENDS> <CODE ENDS>
Figure 3
5. Security Considerations 5. Security Considerations
The configuration, state, action and notification data defined in The configuration, state, action and notification data defined in
this document are designed to be accessed via the NETCONF protocol this document are designed to be accessed via the NETCONF protocol
[RFC6241]. The lowest NETCONF layer is the secure transport layer [RFC6241]. The lowest NETCONF layer is the secure transport layer
and the mandatory-to-implement secure transport is SSH [RFC6242]. and the mandatory-to-implement secure transport is SSH [RFC6242].
The NETCONF access control model [RFC6536] provides means to restrict The NETCONF access control model [RFC6536] provides means to restrict
access for particular NETCONF users to a pre-configured subset of all access for particular NETCONF users to a pre-configured subset of all
available NETCONF protocol operations and content. available NETCONF protocol operations and content.
skipping to change at page 43, line 15 skipping to change at page 42, line 47
[RFC4385] Bryant, S., Swallow, G., Martini, L., and D. McPherson, [RFC4385] Bryant, S., Swallow, G., Martini, L., and D. McPherson,
"Pseudowire Emulation Edge-to-Edge (PWE3) Control Word for "Pseudowire Emulation Edge-to-Edge (PWE3) Control Word for
Use over an MPLS PSN", RFC 4385, DOI 10.17487/RFC4385, Use over an MPLS PSN", RFC 4385, DOI 10.17487/RFC4385,
February 2006, <https://www.rfc-editor.org/info/rfc4385>. February 2006, <https://www.rfc-editor.org/info/rfc4385>.
[RFC4446] Martini, L., "IANA Allocations for Pseudowire Edge to Edge [RFC4446] Martini, L., "IANA Allocations for Pseudowire Edge to Edge
Emulation (PWE3)", BCP 116, RFC 4446, Emulation (PWE3)", BCP 116, RFC 4446,
DOI 10.17487/RFC4446, April 2006, DOI 10.17487/RFC4446, April 2006,
<https://www.rfc-editor.org/info/rfc4446>. <https://www.rfc-editor.org/info/rfc4446>.
[RFC4447] Martini, L., Ed., Rosen, E., El-Aawar, N., Smith, T., and
G. Heron, "Pseudowire Setup and Maintenance Using the
Label Distribution Protocol (LDP)", RFC 4447,
DOI 10.17487/RFC4447, April 2006,
<https://www.rfc-editor.org/info/rfc4447>.
[RFC4448] Martini, L., Ed., Rosen, E., El-Aawar, N., and G. Heron, [RFC4448] Martini, L., Ed., Rosen, E., El-Aawar, N., and G. Heron,
"Encapsulation Methods for Transport of Ethernet over MPLS "Encapsulation Methods for Transport of Ethernet over MPLS
Networks", RFC 4448, DOI 10.17487/RFC4448, April 2006, Networks", RFC 4448, DOI 10.17487/RFC4448, April 2006,
<https://www.rfc-editor.org/info/rfc4448>. <https://www.rfc-editor.org/info/rfc4448>.
[RFC4664] Andersson, L., Ed. and E. Rosen, Ed., "Framework for Layer [RFC4664] Andersson, L., Ed. and E. Rosen, Ed., "Framework for Layer
2 Virtual Private Networks (L2VPNs)", RFC 4664, 2 Virtual Private Networks (L2VPNs)", RFC 4664,
DOI 10.17487/RFC4664, September 2006, DOI 10.17487/RFC4664, September 2006,
<https://www.rfc-editor.org/info/rfc4664>. <https://www.rfc-editor.org/info/rfc4664>.
skipping to change at page 45, line 32 skipping to change at page 45, line 11
Provider Edge (PE) Model for Provider Backbone Bridging", Provider Edge (PE) Model for Provider Backbone Bridging",
RFC 7041, DOI 10.17487/RFC7041, November 2013, RFC 7041, DOI 10.17487/RFC7041, November 2013,
<https://www.rfc-editor.org/info/rfc7041>. <https://www.rfc-editor.org/info/rfc7041>.
[RFC7361] Dutta, P., Balus, F., Stokes, O., Calvignac, G., and D. [RFC7361] Dutta, P., Balus, F., Stokes, O., Calvignac, G., and D.
Fedyk, "LDP Extensions for Optimized MAC Address Fedyk, "LDP Extensions for Optimized MAC Address
Withdrawal in a Hierarchical Virtual Private LAN Service Withdrawal in a Hierarchical Virtual Private LAN Service
(H-VPLS)", RFC 7361, DOI 10.17487/RFC7361, September 2014, (H-VPLS)", RFC 7361, DOI 10.17487/RFC7361, September 2014,
<https://www.rfc-editor.org/info/rfc7361>. <https://www.rfc-editor.org/info/rfc7361>.
[RFC8077] Martini, L., Ed. and G. Heron, Ed., "Pseudowire Setup and
Maintenance Using the Label Distribution Protocol (LDP)",
STD 84, RFC 8077, DOI 10.17487/RFC8077, February 2017,
<https://www.rfc-editor.org/info/rfc8077>.
[I-D.ietf-rtgwg-ni-model]
Berger, L., Hopps, C., Lindem, A., Bogdanovic, D., and X.
Liu, "YANG Network Instances", draft-ietf-rtgwg-ni-
model-10 (work in progress), February 2018.
Appendix A. Example Configuration Appendix A. Example Configuration
This section shows an example configuration using the YANG data model This section shows an example configuration using the YANG data model
defined in the document. defined in the document.
Appendix B. Contributors Appendix B. Contributors
The editors gratefully acknowledge the following people for their The editors gratefully acknowledge the following people for their
contributions to this document. contributions to this document.
skipping to change at page 47, line 4 skipping to change at page 46, line 35
Verizon Verizon
Email: nick.deregno@verizon.com Email: nick.deregno@verizon.com
Luay Jalil Luay Jalil
Verizon Verizon
Email: luay.jalil@verizon.com Email: luay.jalil@verizon.com
Maria Joecylyn Maria Joecylyn
Verizon Verizon
Email: joecylyn.malit@verizon.com Email: joecylyn.malit@verizon.com
Figure 4
Authors' Addresses Authors' Addresses
Himanshu Shah Himanshu Shah
Ciena Corporation Ciena Corporation
Email: hshah@ciena.com Email: hshah@ciena.com
Patrice Brissette Patrice Brissette
Cisco Systems, Inc. Cisco Systems, Inc.
 End of changes. 73 change blocks. 
405 lines changed or deleted 401 lines changed or added

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