draft-ietf-bess-evpn-yang-01.txt   draft-ietf-bess-evpn-yang-02.txt 
BESS Working Group P. Brissette BESS Working Group P. Brissette
A.Sajassi A.Sajassi
Internet Draft Cisco System Internet Draft Cisco System
Intended Status: Proposed Standard H. Shah Intended Status: Proposed Standard H. Shah
Expires: January 9, 2017 Ciena Corporation Expires: September 14, 2017 Ciena Corporation
Z. Li Z. Li
Huawei Technologies Huawei Technologies
I. Chen I. Chen
Ericsson Jabil
K. Tiruveedhula K. Tiruveedhula
Juniper Networks Juniper Networks
I. Hussain I. Hussain
Infinera Corporation Infinera Corporation
J. Rabadan J. Rabadan
Nokia Nokia
July 8, 2016 March 13, 2017
Yang Data Model for EVPN Yang Data Model for EVPN
draft-ietf-bess-evpn-yang-01 draft-ietf-bess-evpn-yang-02
Abstract Abstract
This document describes a YANG data model for Ethernet VPN services. This document describes a YANG data model for Ethernet VPN services.
The model is agnostic of the underlay. It apply to MPLS as well as to The model is agnostic of the underlay. It apply to MPLS as well as to
VxLAN encapsulation. The model is also agnostic of the services VxLAN encapsulation. The model is also agnostic of the services
including E-LAN, E-LINE and E-TREE services. Any "add-on" features including E-LAN, E-LINE and E-TREE services. Any "add-on" features
such as EVPN IRB, EVPN overlay, etc. are for future investigation. such as EVPN IRB, EVPN overlay, etc. are for future investigation.
This document mainly focuses on EVPN and Ethernet-Segment instance This document mainly focuses on EVPN and Ethernet-Segment instance
framework. framework.
skipping to change at page 2, line 12 skipping to change at page 2, line 12
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."
The list of current Internet-Drafts can be accessed at The list of current Internet-Drafts can be accessed at
http://www.ietf.org/1id-abstracts.html http://www.ietf.org/1id-abstracts.html
The list of Internet-Draft Shadow Directories can be accessed at The list of Internet-Draft Shadow Directories can be accessed at
http://www.ietf.org/shadow.html http://www.ietf.org/shadow.html
Copyright and License Notice Copyright and License Notice
Copyright (c) 2016 IETF Trust and the persons identified as the Copyright (c) 2017 IETF Trust and the persons identified as the
document authors. All rights reserved. document authors. All rights reserved.
This document is subject to BCP 78 and the IETF Trust's Legal This document is subject to BCP 78 and the IETF Trust's Legal
Provisions Relating to IETF Documents Provisions Relating to IETF Documents
(http://trustee.ietf.org/license-info) in effect on the date of (http://trustee.ietf.org/license-info) in effect on the date of
publication of this document. Please review these documents publication of this document. Please review these documents
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 3, line 16 skipping to change at page 3, line 16
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 introduces a YANG data model for Ethernet VPN services This document introduces a YANG data model for Ethernet VPN services
(EVPN) [RFC7432], Provider Backbone Bridging Combined with Ethernet (EVPN) [RFC7432], Provider Backbone Bridging Combined with Ethernet
VPN (PBB-EVPN) [RFC7623] as well as other WG draft such as EVPN-VPWS, VPN (PBB-EVPN) [RFC7623] as well as other WG draft such as EVPN-VPWS,
etc... The EVPN services runs over MPLS and VxLAN underlay. etc. The EVPN services runs over MPLS and VxLAN underlay.
The Yang data model in this document defines Ethernet VPN based The Yang data model in this document defines Ethernet VPN based
services. The model will leverage the definitions used in other IETF services. The model will leverage the definitions used in other IETF
Yang draft such as L2VPN Yang. Yang draft such as L2VPN Yang.
The goal is to propose a data object model consisting of building The goal is to propose a data object model consisting of building
blocks that can be assembled in different order to realize different blocks that can be assembled in different order to realize different
EVPN-based services. The definition work is undertaken initially by a EVPN-based services. The definition work is undertaken initially by a
smaller working group with members representing various vendors and smaller working group with members representing various vendors and
service providers. The EVPN basic framework consist of two modules: service providers. The EVPN basic framework consist of two modules:
skipping to change at page 3, line 51 skipping to change at page 3, line 51
The document is organized to first define the data model for the The document is organized to first define the data model for the
configuration, operational state, actions and notifications of EVPN configuration, operational state, actions and notifications of EVPN
and Ethernet-Segment. and Ethernet-Segment.
The EVPN data object model defined in this document uses the instance The EVPN data object model defined in this document uses the instance
centric approach whereby EVPN service attributes are specified for a centric approach whereby EVPN service attributes are specified for a
given EVPN instance. given EVPN instance.
The Ethernet-Segment data object model defined in this document refer The Ethernet-Segment data object model defined in this document refer
to a specific interface. That interface can be a physical interface, to a specific interface. That interface can be a physical interface,
a bundle interface or virtual interface. The latter includes a bundle interface or virtual interface. The latter includes
pseudowires. The purpose of creating a separate module is due to the pseudowires. The purpose of creating a separate module is due to the
fact that it can be used without having the need to have EVPN fact that it can be used without having the need to have EVPN
configured as layer 2 service. For example, an access node can be configured as layer 2 service. For example, an access node can be
dual-homed to two service nodes servicing a VPLS core. The access dual-homed to two service nodes servicing a VPLS core. The access
connectivity can be represented by an Ethernet-Segment where EVPN BGP connectivity can be represented by an Ethernet-Segment where EVPN BGP
DF election is performed over both service nodes. The core remains DF election is performed over both service nodes. The core remains
VPLS where no EVPN instance is required. VPLS where no EVPN instance is required.
2. Specification of Requirements 2. Specification of Requirements
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL
NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL"
in this document are to be interpreted as described in [RFC2119]. in this document are to be interpreted as described in [RFC2119].
3. EVPN YANG Model 3. EVPN YANG Model
3.1. Overview 3.1. Overview
Two top level module, Ethernet-Segment and EVPN, are defined. The Two top level module, Ethernet-Segment and EVPN, are defined. The
Ethernet-Segment contains a list of interface to which any Ethernet- Ethernet-Segment contains a list of interface to which any Ethernet-
Segment attributes are configured/applied. Segment attributes are configured/applied.
The EVPN module has 2 main containers: common and instance. The The EVPN module has 2 main containers: common and instance. The
skipping to change at page 5, line 23 skipping to change at page 5, line 23
o Integrated Routing and Bridging in EVPN: o Integrated Routing and Bridging in EVPN:
draft-ietf-bess-evpn-inter-subnet-forwarding draft-ietf-bess-evpn-inter-subnet-forwarding
3.2 Ethernet-Segment Model 3.2 Ethernet-Segment Model
The Ethernet-Segment data model has a list of ES where each refer to The Ethernet-Segment data model has a list of ES where each refer to
an interface. All attributes are optional due to auto-sensing default an interface. All attributes are optional due to auto-sensing default
mode where all values are auto-derive from the network connectivity. mode where all values are auto-derive from the network connectivity.
module: ietf-ethernet-segment module: ietf-ethernet-segment
+--rw ethernet-segments +--rw ethernet-segments
| +--rw ethernet-segment* [name] | +--rw ethernet-segment* [name]
| +--rw name string | +--rw name string
| +--rw (ac-or-pw)? | +--rw (ac-or-pw)?
| | +--:(ac) | | +--:(ac)
| | | +--rw ac? string | | | +--rw ac? string
| | +--:(pw) | | +--:(pw)
| | +--rw pw? string | | +--rw pw? string
| +--rw ethernet-segment-identifier? uint32 | +--rw ethernet-segment-identifier? uint32
| +--rw (active-mode) | +--rw (active-mode)
| | +--:(single-active) | | +--:(single-active)
| | | +--rw single-active-mode? empty | | | +--rw single-active-mode? empty
| | +--:(all-active) | | +--:(all-active)
| | +--rw all-active-mode? empty | | +--rw all-active-mode? empty
| +--rw pbb-parameters {ethernet-segment-pbb-params}? | +--rw pbb-parameters {ethernet-segment-pbb-params}?
| | +--rw backbone-src-mac? yang:mac-address | | +--rw backbone-src-mac? yang:mac-address
| +--rw bgp-parameters | +--rw bgp-parameters
| | +--rw common | | +--rw common
| | +--rw rd-rt* [route-distinguisher] | | +--rw rd-rt* [route-distinguisher]
| | +--rw route-distinguisher string | | {ethernet-segment-bgp-params}?
| | +--rw vpn-target* [rt-value] | | +--rw route-distinguisher
| | +--rw rt-value string | | rt-types:route-distinguisher
| | +--rw rt-type bgp-rt-type | | +--rw vpn-target* [route-target]
| +--rw df-election | | +--rw route-target
| | +--rw (df-election-method)? | | rt-types:route-target
| | | +--:(highest-random-weight) | | +--rw route-target-type
| | | +--rw hrw? boolean | | rt-types:route-target-type
| | +--rw election-wait-time? uint32 | +--rw df-election
| +--rw ead-evi-route? boolean | | +--rw (df-election-method)?
+--ro ethernet-segments-state | | | +--:(highest-random-weight)
+--ro ethernet-segment-state* [name] | | | +--rw hrw? boolean
+--ro name string | | +--rw election-wait-time? uint32
+--ro service-type? string | +--rw ead-evi-route? boolean
+--ro status? status-type +--ro ethernet-segments-state
+--ro (ac-or-pw)? +--ro ethernet-segment-state* [name]
| +--:(ac) +--ro name string
| | +--ro ac? string +--ro service-type? string
| +--:(pw) +--ro status? status-type
| +--ro pw? string +--ro (ac-or-pw)?
+--ro interface-status? status-type | +--:(ac)
+--ro ethernet-segment-identifier? uint32 | | +--ro ac? string
+--ro active-mode? string | +--:(pw)
+--ro pbb-parameters {ethernet-segment-pbb-params}? | +--ro pw? string
| +--ro backbone-src-mac? yang:mac-address +--ro interface-status? status-type
+--ro bgp-parameters +--ro ethernet-segment-identifier? uint32
| +--ro common +--ro active-mode? string
| +--ro rd-rt* [route-distinguisher] +--ro pbb-parameters {ethernet-segment-pbb-params}?
| +--ro route-distinguisher string | +--ro backbone-src-mac? yang:mac-address
| +--ro vpn-target* [rt-value] +--ro bgp-parameters
| +--ro rt-value string | +--ro common
| +--ro rt-type bgp-rt-type | +--ro rd-rt* [route-distinguisher]
+--ro df-election | {ethernet-segment-bgp-params}?
| +--ro hrw-enabled? boolean | +--ro route-distinguisher
| +--ro election-wait-time? uint32 | rt-types:route-distinguisher
+--ro ead-evi-route-enabled? boolean | +--ro vpn-target* [route-target]
+--ro esi-label? string | +--ro route-target
+--ro member* | rt-types:route-target
| +--ro ip-address? inet:ip-address | +--ro route-target-type
+--ro df* | rt-types:route-target-type
+--ro service-identifier? uint32 +--ro df-election
+--ro vlan? uint32 | +--ro hrw-enabled? boolean
+--ro ip-address? inet:ip-address | +--ro election-wait-time? uint32
+--ro ead-evi-route-enabled? boolean
+--ro esi-label? string
+--ro member*
| +--ro ip-address? inet:ip-address
+--ro df*
+--ro service-identifier? uint32
+--ro vlan? uint32
+--ro ip-address? inet:ip-address
3.3 EVPN Model 3.3 EVPN Model
The evpn-instances container contains a list of evpn-instance. The evpn-instances container contains a list of evpn-instance.
Each entry of the evpn-instance represents a different Ethernet VPN Each entry of the evpn-instance represents a different Ethernet VPN
and it is represented by a EVI. Again, mainly all attributes are and it is represented by a EVI. Again, mainly all attributes are
optional for the same reason as for the Ethernet-Segment module. optional for the same reason as for the Ethernet-Segment module.
module: ietf-evpn module: ietf-evpn
+--rw evpn +--rw evpn
+--rw common | +--rw common
| +--rw (replication-type)? | | +--rw (replication-type)?
| +--:(ingress-replication) | | +--:(ingress-replication)
| | +--rw ingress-replication? boolean | | | +--rw ingress-replication? boolean
| +--:(p2mp-replication) | | +--:(p2mp-replication)
| +--rw p2mp-replication? boolean | | +--rw p2mp-replication? boolean
+--rw evpn-instances | +--rw evpn-instances
| +--rw evpn-instance* [name] | +--rw evpn-instance* [name]
| +--rw name string | +--rw name string
| +--rw evi? uint32 | +--rw evi? uint32
| +--rw pbb-parameters {evpn-pbb-params}? | +--rw pbb-parameters {evpn-pbb-params}?
| | +--rw source-bmac? yang:hex-string | | +--rw source-bmac? yang:hex-string
| +--rw bgp-parameters | +--rw bgp-parameters
| | +--rw common | | +--rw common
| | +--rw rd-rt* [route-distinguisher] | | +--rw rd-rt* [route-distinguisher]
| | +--rw route-distinguisher string | | {evpn-bgp-params}?
| | +--rw vpn-target* [rt-value] | | +--rw route-distinguisher
| | +--rw rt-value string | | rt-types:route-distinguisher
| | +--rw rt-type bgp-rt-type | | +--rw vpn-target* [route-target]
| +--rw arp-proxy? boolean | | +--rw route-target
| +--rw arp-suppression? boolean | | rt-types:route-target
| +--rw nd-proxy? boolean | | +--rw route-target-type
| +--rw nd-suppression? boolean | | rt-types:route-target-type
| +--rw underlay-multicast? boolean | +--rw arp-proxy? boolean
| +--rw flood-unknown-unicast-supression? boolean | +--rw arp-suppression? boolean
+--ro evpn-instances-state | +--rw nd-proxy? boolean
+--ro evpn-instance-state* | +--rw nd-suppression? boolean
+--ro name? string | +--rw underlay-multicast? boolean
+--ro evi? uint32 | +--rw flood-unknown-unicast-supression? boolean
+--ro pbb-parameters +--rw evpn-state
| +--ro source-bmac? yang:hex-string +--ro evpn-instances-state
+--ro bgp-parameters +--ro evpn-instance*
| +--ro common +--ro name? string
| +--ro rd-rt* [route-distinguisher] +--ro evi? uint32
| +--ro route-distinguisher string +--ro pbb-parameters {evpn-pbb-params}?
| +--ro vpn-target* [rt-value] | +--ro source-bmac? yang:hex-string
| +--ro rt-value string +--ro bgp-parameters
| +--ro rt-type bgp-rt-type | +--ro common
+--ro advertise-mac-suppression-enabled? boolean | +--ro rd-rt* [route-distinguisher]
+--ro arp-proxy-enabled? boolean | {evpn-bgp-params}?
+--ro arp-suppression-enabled? boolean | +--ro route-distinguisher
+--ro nd-proxy-enabled? boolean | rt-types:route-distinguisher
+--ro nd-suppression-enabled? boolean | +--ro vpn-target* [route-target]
+--ro underlay-multicast-enabled? boolean | +--ro route-target rt-types:route-target
+--ro flood-unknown-unicast-suppression-enabled? boolean | +--ro route-target-type
+--ro routes | rt-types:route-target-type
| +--ro ethernet-auto-discovery-route* +--ro advertise-mac-suppression-enabled? boolean
| | +--ro rd-rt* [route-distinguisher] +--ro arp-proxy-enabled? boolean
| | | +--ro route-distinguisher string +--ro arp-suppression-enabled? boolean
| | | +--ro vpn-target* [rt-value] +--ro nd-proxy-enabled? boolean
| | | +--ro rt-value string +--ro nd-suppression-enabled? boolean
| | +--ro ethernet-segment-identifier? uint32 +--ro underlay-multicast-enabled? boolean
| | +--ro ethernet-tag? uint32 +--ro flood-unknown-unicast-suppression-enabled? boolean
| | +--ro path* +--ro routes
| | +--ro next-hop? inet:ip-address | +--ro ethernet-auto-discovery-route*
| | +--ro label? mpls:mpls-label | | +--ro rd-rt* [route-distinguisher]
| | +--ro detail | | | +--ro route-distinguisher
| | +--ro attributes | | | rt-types:route-distinguisher
| | | +--ro extended-community* string | | | +--ro vpn-target* [route-target]
| | +--ro bestpath? empty | | | +--ro route-target rt-types:route-target
| +--ro mac-ip-advertisement-route* | | +--ro ethernet-segment-identifier? uint32
| | +--ro rd-rt* [route-distinguisher] | | +--ro ethernet-tag? uint32
| | | +--ro route-distinguisher string | | +--ro path*
| | | +--ro vpn-target* [rt-value] | | +--ro next-hop? inet:ip-address
| | | +--ro rt-value string | | +--ro label? rt-types:mpls-label
| | +--ro ethernet-segment-identifier? uint32 | | +--ro detail
| | +--ro ethernet-tag? uint32 | | +--ro attributes
| | +--ro mac-address? yang:hex-string | | | +--ro extended-community* string
| | +--ro mac-address-length? uint8 | | +--ro bestpath? empty
| | +--ro ip-prefix? inet:ip-prefix | +--ro mac-ip-advertisement-route*
| | +--ro path* | | +--ro rd-rt* [route-distinguisher]
| | +--ro next-hop? inet:ip-address | | | +--ro route-distinguisher
| | +--ro label? mpls:mpls-label | | | rt-types:route-distinguisher
| | +--ro label2? mpls:mpls-label | | | +--ro vpn-target* [route-target]
| | +--ro detail | | | +--ro route-target rt-types:route-target
| | +--ro attributes | | +--ro ethernet-segment-identifier? uint32
| | | +--ro extended-community* string | | +--ro ethernet-tag? uint32
| | +--ro bestpath? empty | | +--ro mac-address? yang:hex-string
| +--ro inclusive-multicast-ethernet-tag-route* | | +--ro mac-address-length? uint8
| | +--ro rd-rt* [route-distinguisher] | | +--ro ip-prefix? inet:ip-prefix
| | | +--ro route-distinguisher string | | +--ro path*
| | | +--ro vpn-target* [rt-value] | | +--ro next-hop? inet:ip-address
| | | +--ro rt-value string | | +--ro label? rt-types:mpls-label
| | +--ro ethernet-segment-identifier? uint32 | | +--ro label2? rt-types:mpls-label
| | +--ro originator-ip-prefix? inet:ip-prefix | | +--ro detail
| | +--ro path* | | +--ro attributes
| | +--ro next-hop? inet:ip-address | | | +--ro extended-community* string
| | +--ro label? mpls:mpls-label | | +--ro bestpath? empty
| | +--ro detail | +--ro inclusive-multicast-ethernet-tag-route*
| | +--ro attributes | | +--ro rd-rt* [route-distinguisher]
| | | +--ro extended-community* string | | | +--ro route-distinguisher
| | +--ro bestpath? empty | | | rt-types:route-distinguisher
| +--ro ethernet-segment-route* | | | +--ro vpn-target* [route-target]
| | +--ro rd-rt* [route-distinguisher] | | | +--ro route-target rt-types:route-target
| | | +--ro route-distinguisher string | | +--ro ethernet-segment-identifier? uint32
| | | +--ro vpn-target* [rt-value] | | +--ro originator-ip-prefix? inet:ip-prefix
| | | +--ro rt-value string | | +--ro path*
| | +--ro ethernet-segment-identifier? uint32 | | +--ro next-hop? inet:ip-address
| | +--ro originator-ip-prefix? inet:ip-prefix | | +--ro label? rt-types:mpls-label
| | +--ro path* | | +--ro detail
| | +--ro next-hop? inet:ip-address | | +--ro attributes
| | +--ro detail | | | +--ro extended-community* string
| | +--ro attributes | | +--ro bestpath? empty
| | | +--ro extended-community* string | +--ro ethernet-segment-route*
| | +--ro bestpath? empty | | +--ro rd-rt* [route-distinguisher]
| +--ro ip-prefix-route* | | | +--ro route-distinguisher
| +--ro rd-rt* [route-distinguisher] | | | rt-types:route-distinguisher
| | +--ro route-distinguisher string | | | +--ro vpn-target* [route-target]
| | +--ro vpn-target* [rt-value] | | | +--ro route-target rt-types:route-target
| | +--ro rt-value string | | +--ro ethernet-segment-identifier? uint32
| +--ro ethernet-segment-identifier? uint32 | | +--ro originator-ip-prefix? inet:ip-prefix
| +--ro ip-prefix? inet:ip-prefix | | +--ro path*
| +--ro path* | | +--ro next-hop? inet:ip-address
| +--ro next-hop? inet:ip-address | | +--ro detail
| +--ro label? mpls:mpls-label | | +--ro attributes
| +--ro detail | | | +--ro extended-community* string
| +--ro attributes | | +--ro bestpath? empty
| | +--ro extended-community* string | +--ro ip-prefix-route*
| +--ro bestpath? empty | +--ro rd-rt* [route-distinguisher]
+--ro statistics | | +--ro route-distinguisher
+--ro tx-count? uint32 | | rt-types:route-distinguisher
+--ro rx-count? uint32 | | +--ro vpn-target* [route-target]
+--ro detail | | +--ro route-target rt-types:route-target
+--ro broadcast-tx-count? uint32 | +--ro ethernet-segment-identifier? uint32
+--ro broadcast-rx-count? uint32 | +--ro ip-prefix? inet:ip-prefix
+--ro multicast-tx-count? uint32 | +--ro path*
+--ro multicast-rx-count? uint32 | +--ro next-hop? inet:ip-address
+--ro unicast-tx-count? uint32 | +--ro label? rt-types:mpls-label
+--ro unicast-rx-count? uint32 | +--ro detail
| +--ro attributes
| | +--ro extended-community* string
| +--ro bestpath? empty
+--ro statistics
+--ro tx-count? uint32
+--ro rx-count? uint32
+--ro detail
+--ro broadcast-tx-count? uint32
+--ro broadcast-rx-count? uint32
+--ro multicast-tx-count? uint32
+--ro multicast-rx-count? uint32
+--ro unicast-tx-count? uint32
+--ro unicast-rx-count? uint32
augment /l2vpn:l2vpn/l2vpn:l2vpn-instances/l2vpn:l2vpn-instance:
+--rw evpn-instance? evpn-instance-ref
augment /l2vpn:l2vpn-state/
l2vpn:l2vpn-instances-state/l2vpn:l2vpn-instance:
+--ro evpn-instance? string
4. YANG Module 4. YANG Module
The EVPN configuration container is logically divided into The EVPN configuration container is logically divided into
following high level config areas: following high level config areas:
4.1 Ethernet Segment Yang Module 4.1 Ethernet Segment Yang Module
<CODE BEGINS> file "ietf-ethernet-segment@2016-07-08.yang" <CODE BEGINS> file "ietf-ethernet-segment@2017-03-13.yang"
module ietf-ethernet-segment { module ietf-ethernet-segment {
namespace "urn:ietf:params:xml:ns:yang:ietf-ethernet-segment"; namespace "urn:ietf:params:xml:ns:yang:ietf-ethernet-segment";
prefix "es"; prefix "es";
import ietf-yang-types { import ietf-yang-types {
prefix "yang"; prefix "yang";
} }
import ietf-evpn {
prefix "evpn";
}
import ietf-inet-types { import ietf-inet-types {
prefix "inet"; prefix "inet";
} }
import ietf-routing-types {
prefix "rt-types";
}
organization "ietf"; organization "ietf";
contact "ietf"; contact "ietf";
description "ethernet segment"; description "ethernet segment";
revision "2017-03-13" {
description " - Updated to use BGP parameters from " +
" ietf-routing-types.yang instead of from " +
" ietf-evpn.yang " +
"";
reference "";
}
revision "2016-07-08" { revision "2016-07-08" {
description " - Added the configuration option to enable or " + description " - Added the configuration option to enable or " +
" disable per-EVI/EAD route " + " disable per-EVI/EAD route " +
" - Added PBB parameter backbone-src-mac " + " - Added PBB parameter backbone-src-mac " +
" - Added operational state branch, initially " + " - Added operational state branch, initially " +
" to match the configuration branch" + " to match the configuration branch" +
""; "";
reference ""; reference "";
} }
skipping to change at page 12, line 21 skipping to change at page 12, line 51
} }
} }
container pbb-parameters { container pbb-parameters {
if-feature ethernet-segment-pbb-params; if-feature ethernet-segment-pbb-params;
description "PBB configuration"; description "PBB configuration";
leaf backbone-src-mac { leaf backbone-src-mac {
type yang:mac-address; type yang:mac-address;
description "backbone-src-mac, only if this is a PBB"; description "backbone-src-mac, only if this is a PBB";
} }
} }
uses evpn:bgp-parameters-grp { container bgp-parameters {
if-feature ethernet-segment-bgp-params; description "BGP parameters";
container common {
description "BGP parameters common to all pseudowires";
list rd-rt {
if-feature ethernet-segment-bgp-params;
key "route-distinguisher";
leaf route-distinguisher {
type rt-types:route-distinguisher;
description "Route distinguisher";
}
uses rt-types:vpn-route-targets;
description "A list of route distinguishers and " +
"corresponding VPN route targets";
}
}
} }
container df-election { container df-election {
description "df-election"; description "df-election";
choice df-election-method { choice df-election-method {
description "Choice of df election method"; description "Choice of df election method";
case highest-random-weight { case highest-random-weight {
leaf hrw { leaf hrw {
type boolean; type boolean;
description "Enable (TRUE) or disable (FALSE) " + description "Enable (TRUE) or disable (FALSE) " +
"highest random weight"; "highest random weight";
skipping to change at page 14, line 4 skipping to change at page 14, line 48
type string; type string;
description "Single-active-mode/all-active-mode"; description "Single-active-mode/all-active-mode";
} }
container pbb-parameters { container pbb-parameters {
if-feature "ethernet-segment-pbb-params"; if-feature "ethernet-segment-pbb-params";
description "PBB configuration"; description "PBB configuration";
leaf backbone-src-mac { leaf backbone-src-mac {
type yang:mac-address; type yang:mac-address;
description "backbone-src-mac, only if this is a PBB"; description "backbone-src-mac, only if this is a PBB";
} }
} }
uses evpn:bgp-parameters-grp { container bgp-parameters {
if-feature ethernet-segment-bgp-params; description "BGP parameters";
container common {
description "BGP parameters common to all pseudowires";
list rd-rt {
if-feature ethernet-segment-bgp-params;
key "route-distinguisher";
leaf route-distinguisher {
type rt-types:route-distinguisher;
description "Route distinguisher";
}
uses rt-types:vpn-route-targets;
description "A list of route distinghishers and " +
"corresponding route targets";
}
}
} }
container df-election { container df-election {
description "df-election"; description "df-election";
leaf hrw-enabled { leaf hrw-enabled {
type boolean; type boolean;
description "hrw-enabled is enabled (TRUE) " + description "hrw-enabled is enabled (TRUE) " +
"or disabled (FALSE)"; "or disabled (FALSE)";
} }
leaf election-wait-time { leaf election-wait-time {
type uint32; type uint32;
skipping to change at page 15, line 4 skipping to change at page 16, line 14
type uint32; type uint32;
description "vlan"; description "vlan";
} }
leaf ip-address { leaf ip-address {
type inet:ip-address; type inet:ip-address;
description "ip-address"; description "ip-address";
} }
description "df of an evpn instance's vlan"; description "df of an evpn instance's vlan";
} }
description "An ethernet segment"; description "An ethernet segment";
} }
} }
} }
<CODE ENDS> <CODE ENDS>
4.2 EVPN Yang Module 4.2 EVPN Yang Module
<CODE BEGINS> file "ietf-evpn@2016-07-08.yang" <CODE BEGINS> file "ietf-evpn@2017-03-13.yang"
module ietf-evpn { module ietf-evpn {
namespace "urn:ietf:params:xml:ns:yang:ietf-evpn"; namespace "urn:ietf:params:xml:ns:yang:ietf-evpn";
prefix "evpn"; prefix "evpn";
import ietf-inet-types { import ietf-inet-types {
prefix "inet"; prefix "inet";
} }
import ietf-mpls {
prefix "mpls";
}
import ietf-yang-types { import ietf-yang-types {
prefix "yang"; prefix "yang";
} }
import ietf-l2vpn {
prefix "l2vpn";
}
import ietf-routing-types {
prefix "rt-types";
}
organization "ietf"; organization "ietf";
contact "ietf"; contact "ietf";
description "evpn"; description "evpn";
revision "2017-03-13" {
description " - Added an augment to base L2VPN model to " +
" reference an EVPN instance " +
" - Reused ietf-routing-types.yang " +
" vpn-route-targets grouping instead of " +
" defining it in this module " +
"";
reference "";
}
revision "2016-07-08" { revision "2016-07-08" {
description " - Added operational state" + description " - Added operational state" +
" - Added a configuration knob to enable/disable " + " - Added a configuration knob to enable/disable " +
" underlay-multicast " + " underlay-multicast " +
" - Added a configuration knob to enable/disable " + " - Added a configuration knob to enable/disable " +
" flooding of unknonw unicast " + " flooding of unknonw unicast " +
" - Added several configuration knobs " + " - Added several configuration knobs " +
" to manage ARP and ND" + " to manage ARP and ND" +
""; "";
reference ""; reference "";
skipping to change at page 16, line 18 skipping to change at page 17, line 42
feature evpn-bgp-params { feature evpn-bgp-params {
description "EVPN's BGP parameters"; description "EVPN's BGP parameters";
} }
feature evpn-pbb-params { feature evpn-pbb-params {
description "EVPN's PBB parameters"; description "EVPN's PBB parameters";
} }
/* Typedefs */ /* Typedefs */
typedef bgp-rt-type { typedef evpn-instance-ref {
type enumeration { type leafref {
enum import { path "/evpn/evpn-instances/evpn-instance/name";
description "For import";
}
enum export {
description "For export";
}
enum both {
description "For both import and export";
}
} }
description "BGP route-target type. Import from BGP YANG"; description "A leafref type to an EVPN instance";
} }
/* Groupings */ /* Groupings */
grouping bgp-rd-grp { grouping route-rd-rt-grp {
description "BGP RD grouping"; description "A grouping for a route's route distinguishers " +
leaf route-distinguisher { "and route targets";
type string;
description "BGP RD";
}
}
grouping bgp-rd-rt-grp {
description "BGP RD-RT grouping";
list rd-rt { list rd-rt {
key "route-distinguisher"; key "route-distinguisher";
leaf route-distinguisher { leaf route-distinguisher {
type string; type rt-types:route-distinguisher;
description "BGP RD"; description "Route distinguisher";
} }
list vpn-target { list vpn-target {
key "rt-value"; key "route-target";
leaf rt-value { leaf route-target {
type string; type rt-types:route-target;
description "BGP route target"; description "BGP route target";
} }
description "List of route targets"; description "A list of route targets";
}
description "List of RD";
}
}
grouping bgp-parameters-grp {
description "BGP parameters grouping";
container bgp-parameters {
description "BGP parameters";
container common {
description "Common BGP parameters";
uses bgp-rd-rt-grp {
refine "rd-rt" {
max-elements 1;
}
augment "rd-rt/vpn-target" {
description "Add type of RT";
leaf rt-type {
type bgp-rt-type;
mandatory true;
description "Type of RT";
}
}
}
} }
} description "A list of route distinguishers and " +
} "corresponding VPN route targets";
grouping common-route-parameters-grp {
description "common-route-parameters-grp";
uses bgp-rd-rt-grp;
leaf ethernet-segment-identifier {
type uint32;
description "Ethernet segment identifier (esi)";
} }
} }
grouping next-hop-label-grp { grouping next-hop-label-grp {
description "next-hop-label-grp"; description "next-hop-label-grp";
leaf next-hop { leaf next-hop {
type inet:ip-address; type inet:ip-address;
description "next-hop"; description "next-hop";
} }
leaf label { leaf label {
type mpls:mpls-label; type rt-types:mpls-label;
description "label"; description "label";
} }
} }
grouping next-hop-label2-grp { grouping next-hop-label2-grp {
description "next-hop-label2-grp"; description "next-hop-label2-grp";
leaf label2 { leaf label2 {
type mpls:mpls-label; type rt-types:mpls-label;
description "label2"; description "label2";
} }
} }
grouping path-detail-grp { grouping path-detail-grp {
description "path-detail-grp"; description "path-detail-grp";
container detail { container detail {
config false; config false;
description "path details"; description "path details";
container attributes { container attributes {
skipping to change at page 19, line 35 skipping to change at page 20, line 11
description "evi"; description "evi";
} }
container pbb-parameters { container pbb-parameters {
if-feature "evpn-pbb-params"; if-feature "evpn-pbb-params";
description "PBB parameters"; description "PBB parameters";
leaf source-bmac { leaf source-bmac {
type yang:hex-string; type yang:hex-string;
description "source-bmac"; description "source-bmac";
} }
} }
uses bgp-parameters-grp { container bgp-parameters {
if-feature "evpn-bgp-params"; description "BGP parameters";
container common {
description "BGP parameters common to all pseudowires";
list rd-rt {
if-feature evpn-bgp-params;
key "route-distinguisher";
leaf route-distinguisher {
type rt-types:route-distinguisher;
description "Route distinguisher";
}
uses rt-types:vpn-route-targets;
description "A list of route distinguishers and " +
"corresponding VPN route targets";
}
}
} }
leaf arp-proxy { leaf arp-proxy {
type boolean; type boolean;
default false; default false;
description "Enable (TRUE) or disable (FALSE) ARP proxy"; description "Enable (TRUE) or disable (FALSE) ARP proxy";
} }
leaf arp-suppression { leaf arp-suppression {
type boolean; type boolean;
default false; default false;
description "Enable (TRUE) or disable (FALSE) " + description "Enable (TRUE) or disable (FALSE) " +
skipping to change at page 20, line 26 skipping to change at page 21, line 16
"underlay multicast"; "underlay multicast";
} }
leaf flood-unknown-unicast-supression { leaf flood-unknown-unicast-supression {
type boolean; type boolean;
default false; default false;
description "Enable (TRUE) or disable (FALSE) " + description "Enable (TRUE) or disable (FALSE) " +
"flood unknown unicast suppression"; "flood unknown unicast suppression";
} }
} }
} }
}
container evpn-state {
description "EVPN operational state";
container evpn-instances-state { container evpn-instances-state {
config false; config false;
description "evpn-instances-state"; description "evpn-instances-state";
list evpn-instance-state { list evpn-instance {
description "The state of an EVPN instance"; description "The state of an EVPN instance";
leaf name { leaf name {
type string; type string;
description "Name of EVPN instance"; description "Name of EVPN instance";
} }
leaf evi { leaf evi {
type uint32; type uint32;
description "evi"; description "evi";
} }
container pbb-parameters { container pbb-parameters {
if-feature "evpn-pbb-params"; if-feature "evpn-pbb-params";
description "PBB parameters"; description "PBB parameters";
leaf source-bmac { leaf source-bmac {
type yang:hex-string; type yang:hex-string;
description "source-bmac"; description "source-bmac";
} }
} }
uses bgp-parameters-grp { container bgp-parameters {
if-feature "evpn-bgp-params"; description "BGP parameters";
container common {
description "BGP parameters common to all pseudowires";
list rd-rt {
if-feature evpn-bgp-params;
key "route-distinguisher";
leaf route-distinguisher {
type rt-types:route-distinguisher;
description "Route distinguisher";
}
uses rt-types:vpn-route-targets;
description "A list of route distinguishers and " +
"corresponding VPN route targets";
}
}
} }
leaf advertise-mac-suppression-enabled { leaf advertise-mac-suppression-enabled {
type boolean; type boolean;
description "advertise-mac-suppression " + description "advertise-mac-suppression " +
"is enabled (TRUE) " + "is enabled (TRUE) " +
"or disabled (FALSE)"; "or disabled (FALSE)";
} }
leaf arp-proxy-enabled { leaf arp-proxy-enabled {
type boolean; type boolean;
description "arp-proxy is enabled (TRUE) " + description "arp-proxy is enabled (TRUE) " +
skipping to change at page 21, line 40 skipping to change at page 22, line 49
"or disabled (FALSE)"; "or disabled (FALSE)";
} }
leaf flood-unknown-unicast-suppression-enabled { leaf flood-unknown-unicast-suppression-enabled {
type boolean; type boolean;
description "flood-unknown-unicast-suppression is " + description "flood-unknown-unicast-suppression is " +
"enabled (TRUE) or disabled (FALSE)"; "enabled (TRUE) or disabled (FALSE)";
} }
container routes { container routes {
description "routes"; description "routes";
list ethernet-auto-discovery-route { list ethernet-auto-discovery-route {
uses common-route-parameters-grp; uses route-rd-rt-grp;
leaf ethernet-segment-identifier {
type uint32;
description "Ethernet segment identifier (esi)";
}
leaf ethernet-tag { leaf ethernet-tag {
type uint32; type uint32;
description "An ethernet tag (etag) indentifying a " + description "An ethernet tag (etag) indentifying a " +
"broadcast domain"; "broadcast domain";
} }
list path { list path {
uses next-hop-label-grp; uses next-hop-label-grp;
uses path-detail-grp; uses path-detail-grp;
description "path"; description "path";
} }
skipping to change at page 22, line 4 skipping to change at page 23, line 17
type uint32; type uint32;
description "An ethernet tag (etag) indentifying a " + description "An ethernet tag (etag) indentifying a " +
"broadcast domain"; "broadcast domain";
} }
list path { list path {
uses next-hop-label-grp; uses next-hop-label-grp;
uses path-detail-grp; uses path-detail-grp;
description "path"; description "path";
} }
description "ethernet-auto-discovery-route"; description "ethernet-auto-discovery-route";
} }
list mac-ip-advertisement-route { list mac-ip-advertisement-route {
uses common-route-parameters-grp; uses route-rd-rt-grp;
leaf ethernet-segment-identifier {
type uint32;
description "Ethernet segment identifier (esi)";
}
leaf ethernet-tag { leaf ethernet-tag {
type uint32; type uint32;
description "An ethernet tag (etag) indentifying a " + description "An ethernet tag (etag) indentifying a " +
"broadcast domain"; "broadcast domain";
} }
leaf mac-address { leaf mac-address {
type yang:hex-string; type yang:hex-string;
description "Route mac address"; description "Route mac address";
} }
leaf mac-address-length { leaf mac-address-length {
skipping to change at page 22, line 36 skipping to change at page 24, line 4
} }
list path { list path {
uses next-hop-label-grp; uses next-hop-label-grp;
uses next-hop-label2-grp; uses next-hop-label2-grp;
uses path-detail-grp; uses path-detail-grp;
description "path"; description "path";
} }
description "mac-ip-advertisement-route"; description "mac-ip-advertisement-route";
} }
list inclusive-multicast-ethernet-tag-route { list inclusive-multicast-ethernet-tag-route {
uses common-route-parameters-grp; uses route-rd-rt-grp;
leaf ethernet-segment-identifier {
type uint32;
description "Ethernet segment identifier (esi)";
}
leaf originator-ip-prefix { leaf originator-ip-prefix {
type inet:ip-prefix; type inet:ip-prefix;
description "originator-ip-prefix"; description "originator-ip-prefix";
} }
list path { list path {
uses next-hop-label-grp; uses next-hop-label-grp;
uses path-detail-grp; uses path-detail-grp;
description "path"; description "path";
} }
description "inclusive-multicast-ethernet-tag-route"; description "inclusive-multicast-ethernet-tag-route";
} }
list ethernet-segment-route { list ethernet-segment-route {
uses common-route-parameters-grp; uses route-rd-rt-grp;
leaf ethernet-segment-identifier {
type uint32;
description "Ethernet segment identifier (esi)";
}
leaf originator-ip-prefix { leaf originator-ip-prefix {
type inet:ip-prefix; type inet:ip-prefix;
description "originator ip-prefix"; description "originator ip-prefix";
} }
list path { list path {
leaf next-hop { leaf next-hop {
type inet:ip-address; type inet:ip-address;
description "next-hop"; description "next-hop";
} }
uses path-detail-grp; uses path-detail-grp;
description "path"; description "path";
} }
description "ethernet-segment-route"; description "ethernet-segment-route";
skipping to change at page 23, line 17 skipping to change at page 24, line 41
leaf next-hop { leaf next-hop {
type inet:ip-address; type inet:ip-address;
description "next-hop"; description "next-hop";
} }
uses path-detail-grp; uses path-detail-grp;
description "path"; description "path";
} }
description "ethernet-segment-route"; description "ethernet-segment-route";
} }
list ip-prefix-route { list ip-prefix-route {
uses common-route-parameters-grp; uses route-rd-rt-grp;
leaf ethernet-segment-identifier {
type uint32;
description "Ethernet segment identifier (esi)";
}
leaf ip-prefix { leaf ip-prefix {
type inet:ip-prefix; type inet:ip-prefix;
description "ip-prefix"; description "ip-prefix";
} }
list path { list path {
uses next-hop-label-grp; uses next-hop-label-grp;
uses path-detail-grp; uses path-detail-grp;
description "path"; description "path";
} }
description "ip-prefix route"; description "ip-prefix route";
skipping to change at page 24, line 20 skipping to change at page 25, line 48
leaf unicast-tx-count { leaf unicast-tx-count {
type uint32; type uint32;
description "unicast transmission count"; description "unicast transmission count";
} }
leaf unicast-rx-count { leaf unicast-rx-count {
type uint32; type uint32;
description "unicast receive count"; description "unicast receive count";
} }
} }
} }
} }
} }
} }
/* augments */
augment "/l2vpn:l2vpn/l2vpn:l2vpn-instances" +
"/l2vpn:l2vpn-instance" {
description "Augment for an L2VPN instance and EVPN association";
leaf evpn-instance {
type evpn-instance-ref;
description "Reference to an EVPN instance";
}
}
augment "/l2vpn:l2vpn-state" {
description "Augment for an L2VPN instance's operational " +
"state of L2VPN and EVPN association";
leaf evpn-instance {
type string;
description "Name of the associated EVPN instance";
}
}
} }
<CODE ENDS> <CODE ENDS>
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]. The and the mandatory-to-implement secure transport is SSH [RFC6242]. The
NETCONF access control model [RFC6536] provides means to restrict 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
skipping to change at page 26, line 8 skipping to change at page 28, line 8
Himanshu Shah Himanshu Shah
Ciena Corporation Ciena Corporation
EMail: hshah@ciena.com EMail: hshah@ciena.com
Zhenbin Li Zhenbin Li
Huawei Technologies Huawei Technologies
EMail: lizhenbin@huawei.com EMail: lizhenbin@huawei.com
Helen Chen Helen Chen
Ericsson Jabil
EMail: ichen@kuatrotech.com EMail: Ing-Wher_Chen@jabil.com
Kishore Tiruveedhula Kishore Tiruveedhula
Juniper Networks Juniper Networks
EMail: kishoret@juniper.net EMail: kishoret@juniper.net
Iftekar Hussain Iftekar Hussain
Infinera Corporation Infinera Corporation
EMail: ihussain@infinera.com EMail: ihussain@infinera.com
Jorge Rabadan Jorge Rabadan
 End of changes. 47 change blocks. 
296 lines changed or deleted 391 lines changed or added

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