draft-ietf-bess-evpn-yang-02.txt   draft-ietf-bess-evpn-yang-03.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: September 14, 2017 Ciena Corporation Expires: April 24, 2018 Ciena Corporation
Z. Li Z. Li
Huawei Technologies Huawei Technologies
I. Chen I. Chen
Jabil Jabil
K. Tiruveedhula K. Tiruveedhula
Juniper Networks Juniper Networks
I. Hussain I. Hussain
Infinera Corporation Infinera Corporation
J. Rabadan J. Rabadan
Nokia Nokia
March 13, 2017 October 21, 2017
Yang Data Model for EVPN Yang Data Model for EVPN
draft-ietf-bess-evpn-yang-02 draft-ietf-bess-evpn-yang-03
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. This document mainly
such as EVPN IRB, EVPN overlay, etc. are for future investigation. focuses on EVPN and Ethernet-Segment instance framework.
This document mainly focuses on EVPN and Ethernet-Segment instance
framework.
Status of this Memo Status of this Memo
This Internet-Draft is submitted to IETF in full conformance with the This Internet-Draft is submitted to IETF in full conformance with the
provisions of BCP 78 and BCP 79. provisions of BCP 78 and BCP 79.
Internet-Drafts are working documents of the Internet Engineering Internet-Drafts are working documents of the Internet Engineering
Task Force (IETF), its areas, and its working groups. Note that Task Force (IETF), its areas, and its working groups. Note that
other groups may also distribute working documents as other groups may also distribute working documents as
Internet-Drafts. Internet-Drafts.
skipping to change at page 3, line 19 skipping to change at page 3, line 19
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 leverages 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:
EVPN and Ethernet-Segment. These models are completely orthogonal. EVPN and Ethernet-Segment. These models are completely orthogonal.
They usually work in pair but user can definitely use one or the They usually work in pair but user can definitely use one or the
other for its own need. other for its own need.
The data model is defined for following constructs that are used for The data model is defined for following constructs that are used for
managing the services: managing the services:
o Configuration o Configuration
o Operational State o Operational State
o Executables (Actions)
o Notifications o Notifications
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 and notifications of EVPN and
and Ethernet-Segment. 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 attachment-circuit and pseudowire. The purpose of creating a separate
fact that it can be used without having the need to have EVPN module is due to the fact that it can be used without having the need
configured as layer 2 service. For example, an access node can be to have EVPN configured as layer 2 service. For example, an access
dual-homed to two service nodes servicing a VPLS core. The access node can be dual-homed to two service nodes servicing a VPLS core.
connectivity can be represented by an Ethernet-Segment where EVPN BGP The access connectivity can be represented by an Ethernet-Segment
DF election is performed over both service nodes. The core remains where EVPN BGP DF election is performed over both service nodes. The
VPLS where no EVPN instance is required. core remains 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
skipping to change at page 4, line 35 skipping to change at page 4, line 33
The EVPN module has 2 main containers: common and instance. The The EVPN module has 2 main containers: common and instance. The
first one has common attributes to all VPNs where as the latter has first one has common attributes to all VPNs where as the latter has
attributes specific to an EVI. This document state the scope of the attributes specific to an EVI. This document state the scope of the
EVPN object models definition. The following documents are within the EVPN object models definition. The following documents are within the
scope. This is not an exhaustive list but a representation of scope. This is not an exhaustive list but a representation of
documents that are covered for this work: documents that are covered for this work:
o Requirements for EVPN: RFC 7209 o Requirements for EVPN: RFC 7209
o EVPN: RFC 7432 o EVPN: RFC 7432
o PBB-EVPN: RFC 7623 o PBB-EVPN: RFC 7623
o EVPN-VPWS: RFC 8214
The integration with L2VPN instance Yang model is being done as part The integration with L2VPN instance Yang model is being done as part
of the L2VPN Yang model. of the L2VPN Yang model.
Following documents will be covered at that time: Following documents will be covered at that time:
o VPWS support in EVPN:
draft-ietf-bess-evpn-vpws
o E-TREE Support in EVPN & PBB-EVPN: o E-TREE Support in EVPN & PBB-EVPN:
draft-ietf-bess-evpn-etree draft-ietf-bess-evpn-etree
o (PBB-)EVPN Seamless Integration with (PBB-)VPLS: o (PBB-)EVPN Seamless Integration with (PBB-)VPLS:
draft-ietf-bess-evpn-vpls-seamless-integ draft-ietf-bess-evpn-vpls-seamless-integ
o EVPN Virtual Ethernet Segment: o EVPN Virtual Ethernet Segment:
draft-sajassi-bess-evpn-virtual-eth-segment draft-sajassi-bess-evpn-virtual-eth-segment
The VxLAN aspect and the work related to Layer 3 is also for future
definition. Following documents will be covered at that time:
o IP Prefix Advertisement in EVPN: o IP Prefix Advertisement in EVPN:
draft-ietf-bess-evpn-prefix-advertisement draft-ietf-bess-evpn-prefix-advertisement
o VXLAN DCI Using EVPN: o VXLAN DCI Using EVPN:
draft-boutros-l2vpn-vxlan-evpn draft-boutros-l2vpn-vxlan-evpn
o A Network Virtualization Overlay Solution using EVPN: o A Network Virtualization Overlay Solution using EVPN:
draft-ietf-bess-evpn-overlay- draft-ietf-bess-evpn-overlay
o Interconnect Solution for EVPN Overlay networks: o Interconnect Solution for EVPN Overlay networks:
draft-ietf-bess-dci-evpn-overlay
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)?
| | +--:(ac)
| | | +--rw ac? string
| | +--:(pw)
| | +--rw pw? string
| +--rw ethernet-segment-identifier? uint32
| +--rw (active-mode)
| | +--:(single-active)
| | | +--rw single-active-mode? empty
| | +--:(all-active)
| | +--rw all-active-mode? empty
| +--rw pbb-parameters {ethernet-segment-pbb-params}?
| | +--rw backbone-src-mac? yang:mac-address
| +--rw bgp-parameters
| | +--rw common
| | +--rw rd-rt* [route-distinguisher]
| | {ethernet-segment-bgp-params}?
| | +--rw route-distinguisher
| | rt-types:route-distinguisher
| | +--rw vpn-target* [route-target]
| | +--rw route-target
| | rt-types:route-target
| | +--rw route-target-type
| | rt-types:route-target-type
| +--rw df-election
| | +--rw (df-election-method)?
| | | +--:(highest-random-weight)
| | | +--rw hrw? boolean
| | +--rw election-wait-time? uint32
| +--rw ead-evi-route? boolean
+--ro ethernet-segments-state
+--ro ethernet-segment-state* [name]
+--ro name string
+--ro service-type? string +--ro service-type? string
+--ro status? status-type +--ro status? status-type
+--ro (ac-or-pw)? +--rw (ac-or-pw)?
| +--:(ac) | +--:(ac)
| | +--ro ac? string | | +--rw ac* string
| +--:(pw) | +--:(pw)
| +--ro pw? string | +--rw pw* pw:pseudowire-ref
+--ro interface-status? status-type +--ro interface-status? status-type
+--ro ethernet-segment-identifier? uint32 +--rw ethernet-segment-identifier? uint32
+--ro active-mode? string +--rw (active-mode)
+--ro pbb-parameters {ethernet-segment-pbb-params}? | +--:(single-active)
| +--ro backbone-src-mac? yang:mac-address | | +--rw single-active-mode? empty
+--ro bgp-parameters | +--:(all-active)
| +--ro common | +--rw all-active-mode? empty
| +--ro rd-rt* [route-distinguisher] +--rw pbb-parameters {ethernet-segment-pbb-params}?
| {ethernet-segment-bgp-params}? | +--rw backbone-src-mac? yang:mac-address
| +--ro route-distinguisher +--rw bgp-parameters
| rt-types:route-distinguisher | +--rw common
| +--ro vpn-target* [route-target] | +--rw rd-rt* [route-distinguisher]
| +--ro route-target {ethernet-segment-bgp-params}?
| rt-types:route-target | +--rw route-distinguisher
| +--ro route-target-type rt-types:route-distinguisher
| rt-types:route-target-type | +--rw vpn-target* [route-target]
+--ro df-election | +--rw route-target rt-types:route-target
| +--ro hrw-enabled? boolean | +--rw route-target-type
| +--ro election-wait-time? uint32 rt-types:route-target-type
+--ro ead-evi-route-enabled? boolean +--rw df-election
| +--rw df-election-method? df-election-method-type
| +--rw preference? uint16
| +--rw revertive? boolean
| +--rw election-wait-time? uint32
+--rw ead-evi-route? boolean
+--ro esi-label? string +--ro esi-label? string
+--ro member* +--ro member*
| +--ro ip-address? inet:ip-address | +--ro ip-address? inet:ip-address
+--ro df* +--ro df*
+--ro service-identifier? uint32 +--ro service-identifier? uint32
+--ro vlan? uint32 +--ro vlan? uint32
+--ro ip-address? inet:ip-address +--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
Each entry of the evpn-instance represents a different Ethernet VPN entry of the evpn-instance represents a different Ethernet VPN and it
and it is represented by a EVI. Again, mainly all attributes are is represented by a EVI. Again, mainly all attributes are optional
optional for the same reason as for the Ethernet-Segment module. 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]
| | {evpn-bgp-params}? {evpn-bgp-params}?
| | +--rw route-distinguisher | +--rw route-distinguisher
| | rt-types:route-distinguisher rt-types:route-distinguisher
| | +--rw vpn-target* [route-target] | +--rw vpn-target* [route-target]
| | +--rw route-target | +--rw route-target rt-types:route-target
| | rt-types:route-target | +--rw route-target-type
| | +--rw route-target-type rt-types:route-target-type
| | rt-types:route-target-type +--rw arp-proxy? boolean
| +--rw arp-proxy? boolean +--rw arp-suppression? boolean
| +--rw arp-suppression? boolean +--rw nd-proxy? boolean
| +--rw nd-proxy? boolean +--rw nd-suppression? boolean
| +--rw nd-suppression? boolean +--rw underlay-multicast? boolean
| +--rw underlay-multicast? boolean +--rw flood-unknown-unicast-supression? boolean
| +--rw flood-unknown-unicast-supression? boolean +--rw vpws-vlan-aware? boolean
+--rw evpn-state
+--ro evpn-instances-state
+--ro evpn-instance*
+--ro name? string
+--ro evi? uint32
+--ro pbb-parameters {evpn-pbb-params}?
| +--ro source-bmac? yang:hex-string
+--ro bgp-parameters
| +--ro common
| +--ro rd-rt* [route-distinguisher]
| {evpn-bgp-params}?
| +--ro route-distinguisher
| rt-types:route-distinguisher
| +--ro vpn-target* [route-target]
| +--ro route-target rt-types:route-target
| +--ro route-target-type
| rt-types:route-target-type
+--ro advertise-mac-suppression-enabled? boolean
+--ro arp-proxy-enabled? boolean
+--ro arp-suppression-enabled? boolean
+--ro nd-proxy-enabled? boolean
+--ro nd-suppression-enabled? boolean
+--ro underlay-multicast-enabled? boolean
+--ro flood-unknown-unicast-suppression-enabled? boolean
+--ro routes +--ro routes
| +--ro ethernet-auto-discovery-route* | +--ro ethernet-auto-discovery-route*
| | +--ro rd-rt* [route-distinguisher] | | +--ro rd-rt* [route-distinguisher]
| | | +--ro route-distinguisher | | | +--ro route-distinguisher
| | | rt-types:route-distinguisher rt-types:route-distinguisher
| | | +--ro vpn-target* [route-target] | | | +--ro vpn-target* [route-target]
| | | +--ro route-target rt-types:route-target | | | +--ro route-target rt-types:route-target
| | +--ro ethernet-segment-identifier? uint32 | | +--ro ethernet-segment-identifier? uint32
| | +--ro ethernet-tag? uint32 | | +--ro ethernet-tag? uint32
| | +--ro path* | | +--ro path*
| | +--ro next-hop? inet:ip-address | | +--ro next-hop? inet:ip-address
| | +--ro label? rt-types:mpls-label | | +--ro label? rt-types:mpls-label
| | +--ro detail | | +--ro detail
| | +--ro attributes | | +--ro attributes
| | | +--ro extended-community* string | | | +--ro extended-community* string
| | +--ro bestpath? empty | | +--ro bestpath? empty
| +--ro mac-ip-advertisement-route* | +--ro mac-ip-advertisement-route*
| | +--ro rd-rt* [route-distinguisher] | | +--ro rd-rt* [route-distinguisher]
| | | +--ro route-distinguisher | | | +--ro route-distinguisher
| | | rt-types:route-distinguisher rt-types:route-distinguisher
| | | +--ro vpn-target* [route-target] | | | +--ro vpn-target* [route-target]
| | | +--ro route-target rt-types:route-target | | | +--ro route-target rt-types:route-target
| | +--ro ethernet-segment-identifier? uint32 | | +--ro ethernet-segment-identifier? uint32
| | +--ro ethernet-tag? uint32 | | +--ro ethernet-tag? uint32
| | +--ro mac-address? yang:hex-string | | +--ro mac-address? yang:hex-string
| | +--ro mac-address-length? uint8 | | +--ro mac-address-length? uint8
| | +--ro 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 label? rt-types:mpls-label | | +--ro label? rt-types:mpls-label
| | +--ro label2? rt-types:mpls-label | | +--ro label2? rt-types:mpls-label
| | +--ro detail | | +--ro detail
| | +--ro attributes | | +--ro attributes
| | | +--ro extended-community* string | | | +--ro extended-community* string
| | +--ro bestpath? empty | | +--ro bestpath? empty
| +--ro inclusive-multicast-ethernet-tag-route* | +--ro inclusive-multicast-ethernet-tag-route*
| | +--ro rd-rt* [route-distinguisher] | | +--ro rd-rt* [route-distinguisher]
| | | +--ro route-distinguisher | | | +--ro route-distinguisher
| | | rt-types:route-distinguisher rt-types:route-distinguisher
| | | +--ro vpn-target* [route-target] | | | +--ro vpn-target* [route-target]
| | | +--ro route-target rt-types:route-target | | | +--ro route-target rt-types:route-target
| | +--ro ethernet-segment-identifier? uint32 | | +--ro ethernet-segment-identifier? uint32
| | +--ro originator-ip-prefix? inet:ip-prefix | | +--ro originator-ip-prefix? inet:ip-prefix
| | +--ro path* | | +--ro path*
| | +--ro next-hop? inet:ip-address | | +--ro next-hop? inet:ip-address
| | +--ro label? rt-types:mpls-label | | +--ro label? rt-types:mpls-label
| | +--ro detail | | +--ro detail
| | +--ro attributes | | +--ro attributes
| | | +--ro extended-community* string | | | +--ro extended-community* string
| | +--ro bestpath? empty | | +--ro bestpath? empty
| +--ro ethernet-segment-route* | +--ro ethernet-segment-route*
| | +--ro rd-rt* [route-distinguisher] | | +--ro rd-rt* [route-distinguisher]
| | | +--ro route-distinguisher | | | +--ro route-distinguisher
| | | rt-types:route-distinguisher rt-types:route-distinguisher
| | | +--ro vpn-target* [route-target] | | | +--ro vpn-target* [route-target]
| | | +--ro route-target rt-types:route-target | | | +--ro route-target rt-types:route-target
| | +--ro ethernet-segment-identifier? uint32 | | +--ro ethernet-segment-identifier? uint32
| | +--ro originator-ip-prefix? inet:ip-prefix | | +--ro originator-ip-prefix? inet:ip-prefix
| | +--ro path* | | +--ro path*
| | +--ro next-hop? inet:ip-address | | +--ro next-hop? inet:ip-address
| | +--ro detail | | +--ro detail
| | +--ro attributes | | +--ro attributes
| | | +--ro extended-community* string | | | +--ro extended-community* string
| | +--ro bestpath? empty | | +--ro bestpath? empty
| +--ro ip-prefix-route* | +--ro ip-prefix-route*
| +--ro rd-rt* [route-distinguisher] | +--ro rd-rt* [route-distinguisher]
| | +--ro route-distinguisher | | +--ro route-distinguisher
| | rt-types:route-distinguisher rt-types:route-distinguisher
| | +--ro vpn-target* [route-target] | | +--ro vpn-target* [route-target]
| | +--ro route-target rt-types:route-target | | +--ro route-target rt-types:route-target
| +--ro ethernet-segment-identifier? uint32 | +--ro ethernet-segment-identifier? uint32
| +--ro 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 label? rt-types:mpls-label | +--ro label? rt-types:mpls-label
| +--ro detail | +--ro detail
| +--ro attributes | +--ro attributes
| | +--ro extended-community* string | | +--ro extended-community* string
| +--ro bestpath? empty | +--ro bestpath? empty
+--ro statistics +--ro statistics
+--ro tx-count? uint32 +--ro tx-count? uint32
+--ro rx-count? uint32 +--ro rx-count? uint32
+--ro detail +--ro detail
+--ro broadcast-tx-count? uint32 +--ro broadcast-tx-count? uint32
+--ro broadcast-rx-count? uint32 +--ro broadcast-rx-count? uint32
+--ro multicast-tx-count? uint32 +--ro multicast-tx-count? uint32
+--ro multicast-rx-count? uint32 +--ro multicast-rx-count? uint32
+--ro unicast-tx-count? uint32 +--ro unknown-unicast-tx-count? uint32
+--ro unicast-rx-count? uint32 +--ro unknown-unicast-rx-count? uint32
augment /pw:pseudowires/pw:pseudowire/pw:pw-type:
augment /l2vpn:l2vpn/l2vpn:l2vpn-instances/l2vpn:l2vpn-instance: +--:(evpn-pw)
+--rw evpn-pw
+--rw remote-id? uint32
+--rw local-id? uint32
augment /l2vpn:l2vpn/l2vpn:instances/l2vpn:instance:
+--rw evpn-instance? evpn-instance-ref +--rw evpn-instance? evpn-instance-ref
augment /l2vpn:l2vpn-state/ augment /l2vpn:l2vpn/l2vpn:instances/l2vpn:instance:
l2vpn:l2vpn-instances-state/l2vpn:l2vpn-instance: +--rw vpls-contstraints
+--ro evpn-instance? string
notifications:
+---n evpn-state-change-notification
+--ro evpn-instance? evpn-instance-ref
+--ro state? identityref
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@2017-03-13.yang" <CODE BEGINS> file "ietf-ethernet-segment@2017-10-21.yang"
module ietf-ethernet-segment {
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-inet-types { import ietf-inet-types {
prefix "inet"; prefix "inet";
} }
import ietf-routing-types { import ietf-routing-types {
prefix "rt-types"; prefix "rt-types";
} }
import ietf-pseudowires {
prefix "pw";
}
organization "ietf"; organization "ietf";
contact "ietf"; contact "ietf";
description "ethernet segment"; description "ethernet segment";
revision "2017-03-13" { revision "2017-10-21" {
description " - Updated ethernet segment's AC/PW members to " +
" accommodate more than one AC or more than one " +
" PW " +
" - Added the new preference based DF election " +
" method " +
" - Referenced pseudowires in the new " +
" ietf-pseudowires.yang model " +
" - Moved model to NMDA style specified in " +
" draft-dsdt-nmda-guidelines-01.txt " +
"";
reference "";
}
revision "2017-03-08" {
description " - Updated to use BGP parameters from " + description " - Updated to use BGP parameters from " +
" ietf-routing-types.yang instead of from " + " ietf-routing-types.yang instead of from " +
" ietf-evpn.yang " + " ietf-evpn.yang " +
" - Updated ethernet segment's AC/PW members to " +
" accommodate more than one AC or more than one " +
" PW " +
" - Added the new preference based DF election " +
" method " +
""; "";
reference ""; 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" +
skipping to change at page 11, line 42 skipping to change at page 11, line 16
enum up { enum up {
description "Status is up"; description "Status is up";
} }
enum down { enum down {
description "Status is down"; description "Status is down";
} }
} }
description "status type"; description "status type";
} }
typedef df-election-method-type {
type enumeration {
enum default {
value 0;
description "The default DF election method";
}
enum highest-random-weight {
value 1;
description "The highest random weight (HRW) method";
reference "draft-mohanty-bess-evpn-df-election";
}
enum preference {
value 2;
description "The preference based method";
reference "draft-rabadan-bess-evpn-pref-df";
}
}
description "The DF election method type";
}
/* EVPN Ethernet Segment YANG Model */ /* EVPN Ethernet Segment YANG Model */
container ethernet-segments { container ethernet-segments {
description "ethernet-segment"; description "ethernet-segment";
list ethernet-segment { list ethernet-segment {
key "name"; key "name";
leaf name { leaf name {
type string; type string;
description "Name of the ethernet segment"; description "Name of the ethernet segment";
}
leaf service-type {
type string;
config false;
description "service-type";
}
leaf status {
type status-type;
config false;
description "Ethernet segment status";
} }
choice ac-or-pw { choice ac-or-pw {
description "ac-or-pw"; description "ac-or-pw";
case ac { case ac {
leaf ac { leaf-list ac {
type string; type string;
description "Eventual reference to standard " + description "Eventual reference to standard " +
"attachment circuit definition"; "attachment circuit definition";
} }
} }
case pw { case pw {
leaf pw { leaf-list pw {
type string; type pw:pseudowire-ref;
description "Eventual reference to standard " + description "Reference to a pseudowire";
"pseudowire definition";
} }
} }
} }
leaf interface-status {
type status-type;
config false;
description "interface status";
}
leaf ethernet-segment-identifier { leaf ethernet-segment-identifier {
type uint32; type uint32;
description "Ethernet segment identifier (esi)"; description "Ethernet segment identifier (esi)";
} }
choice active-mode { choice active-mode {
mandatory true; mandatory true;
description "Choice of active mode"; description "Choice of active mode";
case single-active { case single-active {
leaf single-active-mode { leaf single-active-mode {
type empty; type empty;
skipping to change at page 13, line 21 skipping to change at page 13, line 28
description "Route distinguisher"; description "Route distinguisher";
} }
uses rt-types:vpn-route-targets; uses rt-types:vpn-route-targets;
description "A list of route distinguishers and " + description "A list of route distinguishers and " +
"corresponding VPN route targets"; "corresponding VPN route targets";
} }
} }
} }
container df-election { container df-election {
description "df-election"; description "df-election";
choice df-election-method { leaf df-election-method {
description "Choice of df election method"; type df-election-method-type;
case highest-random-weight { description "The DF election method";
leaf hrw {
type boolean;
description "Enable (TRUE) or disable (FALSE) " +
"highest random weight";
}
}
}
leaf election-wait-time {
type uint32;
description "election-wait-time";
}
}
leaf ead-evi-route {
type boolean;
default false;
description "Enable (true) or disable (false) ead-evi-route";
}
description "An ethernet segment";
}
}
container ethernet-segments-state {
config false;
description "Ethernet segmet operational state";
list ethernet-segment-state {
key "name";
leaf name {
type string;
description "Name of the ethernet segment";
}
leaf service-type {
type string;
description "service-type";
}
leaf status {
type status-type;
description "Ethernet segment status";
}
choice ac-or-pw {
description "ac-or-pw";
case ac {
leaf ac {
type string;
description "Name of attachment circuit";
}
} }
case pw { leaf preference {
leaf pw { when "../df-election-method = 'preference'" {
type string; description "The preference value is only applicable " +
description "Name of pseudowire"; "to the preference based method";
} }
type uint16;
description "The DF preference";
} }
} leaf revertive {
leaf interface-status { when "../df-election-method = 'preference'" {
type status-type; description "The revertive value is only applicable " +
description "interface status"; "to the preference method";
}
leaf ethernet-segment-identifier {
type uint32;
description "Ethernet segment identifier (esi)";
}
leaf active-mode {
type string;
description "Single-active-mode/all-active-mode";
}
container pbb-parameters {
if-feature "ethernet-segment-pbb-params";
description "PBB configuration";
leaf backbone-src-mac {
type yang:mac-address;
description "backbone-src-mac, only if this is a PBB";
}
}
container bgp-parameters {
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 {
description "df-election";
leaf hrw-enabled {
type boolean; type boolean;
description "hrw-enabled is enabled (TRUE) " + default true;
"or disabled (FALSE)"; description "The 'preempt' or 'revertive' behavior";
} }
leaf election-wait-time { leaf election-wait-time {
type uint32; type uint32;
description "election-wait-time"; description "election-wait-time";
} }
} }
leaf ead-evi-route-enabled { leaf ead-evi-route {
type boolean; type boolean;
description "ead-evi-route is enabled (TRUE) " + default false;
"or disabled (FALSE)"; description "Enable (true) or disable (false) ead-evi-route";
} }
leaf esi-label { leaf esi-label {
type string; type string;
config false;
description "esi-label"; description "esi-label";
} }
list member { list member {
config false;
leaf ip-address { leaf ip-address {
type inet:ip-address; type inet:ip-address;
description "ip-address"; description "ip-address";
} }
description "member of the ethernet segment"; description "member of the ethernet segment";
} }
list df { list df {
config false;
leaf service-identifier { leaf service-identifier {
type uint32; type uint32;
description "service-identifier"; description "service-identifier";
} }
leaf vlan { leaf vlan {
type uint32; type uint32;
description "vlan"; description "vlan";
} }
leaf ip-address { leaf ip-address {
type inet:ip-address; type inet:ip-address;
skipping to change at page 16, line 17 skipping to change at page 14, line 45
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@2017-03-13.yang" <CODE BEGINS> file "ietf-evpn@2017-10-21.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-yang-types { import ietf-yang-types {
prefix "yang"; prefix "yang";
} }
import ietf-l2vpn { import ietf-l2vpn {
prefix "l2vpn"; prefix "l2vpn";
} }
import ietf-routing-types { import ietf-routing-types {
prefix "rt-types"; prefix "rt-types";
} }
import ietf-pseudowires {
prefix "pw";
}
organization "ietf"; organization "ietf";
contact "ietf"; contact "ietf";
description "evpn"; description "evpn";
revision "2017-10-21" {
description " - Modified the operational state augment " +
" - Renamed evpn-instances-state to evpn-instances" +
" - Added vpws-vlan-aware to an EVPN instance " +
" - Added a new augment to L2VPN to add EPVN " +
" - pseudowire for the case of EVPN VPWS " +
" - Added state change notification " +
"";
reference "";
}
revision "2017-03-13" { revision "2017-03-13" {
description " - Added an augment to base L2VPN model to " + description " - Added an augment to base L2VPN model to " +
" reference an EVPN instance " + " reference an EVPN instance " +
" - Reused ietf-routing-types.yang " + " - Reused ietf-routing-types.yang " +
" vpn-route-targets grouping instead of " + " vpn-route-targets grouping instead of " +
" defining it in this module " + " defining it in this module " +
""; "";
reference ""; reference "";
} }
skipping to change at page 17, line 40 skipping to change at page 16, line 33
} }
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";
} }
/* Identities */
identity evpn-notification-state {
description "The base identity on which EVPN notification " +
"states are based";
}
identity MAC-duplication-detected {
base "evpn-notification-state";
description "MAC duplication is detected";
}
identity mass-withdraw-received {
base "evpn-notification-state";
description "Mass withdraw received";
}
identity static-MAC-move-detected {
base "evpn-notification-state";
description "Static MAC move is detected";
}
/* Typedefs */ /* Typedefs */
typedef evpn-instance-ref { typedef evpn-instance-ref {
type leafref { type leafref {
path "/evpn/evpn-instances/evpn-instance/name"; path "/evpn/evpn-instances/evpn-instance/name";
} }
description "A leafref type to an EVPN instance"; description "A leafref type to an EVPN instance";
} }
/* Groupings */ /* Groupings */
skipping to change at page 21, line 14 skipping to change at page 20, line 29
default false; default false;
description "Enable (TRUE) or disable (FALSE) " + description "Enable (TRUE) or disable (FALSE) " +
"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";
} }
} leaf vpws-vlan-aware {
}
}
container evpn-state {
description "EVPN operational state";
container evpn-instances-state {
config false;
description "evpn-instances-state";
list evpn-instance {
description "The state of an EVPN instance";
leaf name {
type string;
description "Name of EVPN instance";
}
leaf evi {
type uint32;
description "evi";
}
container pbb-parameters {
if-feature "evpn-pbb-params";
description "PBB parameters";
leaf source-bmac {
type yang:hex-string;
description "source-bmac";
}
}
container bgp-parameters {
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 {
type boolean;
description "advertise-mac-suppression " +
"is enabled (TRUE) " +
"or disabled (FALSE)";
}
leaf arp-proxy-enabled {
type boolean;
description "arp-proxy is enabled (TRUE) " +
"or disabled (FALSE)";
}
leaf arp-suppression-enabled {
type boolean;
description "arp-suppression is enabled (TRUE) " +
"or disabled (FALSE)";
}
leaf nd-proxy-enabled {
type boolean;
description "nd-proxy is enabled (TRUE) " +
"or disabled (FALSE)";
}
leaf nd-suppression-enabled {
type boolean;
description "nd-suppression is enabled (TRUE) " +
"or disabled (FALSE)";
}
leaf underlay-multicast-enabled {
type boolean;
description "underlay-multicast is enabled (TRUE) " +
"or disabled (FALSE)";
}
leaf flood-unknown-unicast-suppression-enabled {
type boolean; type boolean;
description "flood-unknown-unicast-suppression is " + default false;
"enabled (TRUE) or disabled (FALSE)"; description "Enable (TRUE) or disable (FALSE) " +
"VPWS VLAN aware";
} }
container routes { container routes {
config false;
description "routes"; description "routes";
list ethernet-auto-discovery-route { list ethernet-auto-discovery-route {
uses route-rd-rt-grp; uses route-rd-rt-grp;
leaf ethernet-segment-identifier { leaf ethernet-segment-identifier {
type uint32; type uint32;
description "Ethernet segment identifier (esi)"; 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 " +
skipping to change at page 25, line 11 skipping to change at page 22, line 49
} }
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";
} }
} }
container statistics { container statistics {
config false;
description "Statistics"; description "Statistics";
leaf tx-count { leaf tx-count {
type uint32; type uint32;
description "transmission count"; description "transmission count";
} }
leaf rx-count { leaf rx-count {
type uint32; type uint32;
description "receive count"; description "receive count";
} }
container detail { container detail {
skipping to change at page 25, line 38 skipping to change at page 23, line 29
description "broadcast receive count"; description "broadcast receive count";
} }
leaf multicast-tx-count { leaf multicast-tx-count {
type uint32; type uint32;
description "multicast transmission count"; description "multicast transmission count";
} }
leaf multicast-rx-count { leaf multicast-rx-count {
type uint32; type uint32;
description "multicast receive count"; description "multicast receive count";
} }
leaf unicast-tx-count { leaf unknown-unicast-tx-count {
type uint32; type uint32;
description "unicast transmission count"; description "unknown unicast transmission count";
} }
leaf unicast-rx-count { leaf unknown-unicast-rx-count {
type uint32; type uint32;
description "unicast receive count"; description "unknown-unicast receive count";
} }
} }
} }
} }
} }
} }
/* augments */ /* augments */
augment "/l2vpn:l2vpn/l2vpn:l2vpn-instances" +
"/l2vpn:l2vpn-instance" { augment "/pw:pseudowires/pw:pseudowire/pw:pw-type" {
description "Augment for an L2VPN instance to add EVPN VPWS " +
"pseudowire";
case evpn-pw {
container evpn-pw {
description "EVPN pseudowire";
leaf remote-id {
type uint32;
description "Remote pseudowire ID";
}
leaf local-id {
type uint32;
description "Local pseudowire ID";
}
}
}
}
augment "/l2vpn:l2vpn/l2vpn:instances/l2vpn:instance" {
description "Augment for an L2VPN instance and EVPN association"; description "Augment for an L2VPN instance and EVPN association";
leaf evpn-instance { leaf evpn-instance {
type evpn-instance-ref; type evpn-instance-ref;
description "Reference to an EVPN instance"; description "Reference to an EVPN instance";
} }
} }
augment "/l2vpn:l2vpn-state" { augment "/l2vpn:l2vpn/l2vpn:instances/l2vpn:instance" {
description "Augment for an L2VPN instance's operational " + when "l2vpn:type = 'l2vpn:vpls-instance-type'" {
"state of L2VPN and EVPN association"; description "Constraints only for VPLS pseudowires";
}
description "Augment for VPLS instance";
container vpls-contstraints {
must "not(boolean(/pw:pseudowires/pw:pseudowire" +
" [pw:name = current()/../l2vpn:endpoint" +
" /l2vpn:pw/l2vpn:name]" +
" /evpn-pw/remote-id)) and " +
"not(boolean(/pw:pseudowires/pw:pseudowire" +
" [pw:name = current()/../l2vpn:endpoint" +
" /l2vpn:pw/l2vpn:name]" +
" /evpn-pw/local-id)) and " +
"not(boolean(/pw:pseudowires/pw:pseudowire" +
" [pw:name = current()/../l2vpn:endpoint" +
" /l2vpn:primary-pw/l2vpn:name]" +
" /evpn-pw/remote-id)) and " +
"not(boolean(/pw:pseudowires/pw:pseudowire" +
" [pw:name = current()/../l2vpn:endpoint" +
" /l2vpn:primary-pw/l2vpn:name]" +
" /evpn-pw/local-id)) and " +
"not(boolean(/pw:pseudowires/pw:pseudowire" +
" [pw:name = current()/../l2vpn:endpoint" +
" /l2vpn:backup-pw/l2vpn:name]" +
" /evpn-pw/remote-id)) and " +
"not(boolean(/pw:pseudowires/pw:pseudowire" +
" [pw:name = current()/../l2vpn:endpoint" +
" /l2vpn:backup-pw/l2vpn:name]" +
" /evpn-pw/local-id))" {
description "A VPLS pseudowire must not be EVPN PW";
}
description "VPLS constraints";
}
}
/* Notifications */
notification evpn-state-change-notification {
description "EVPN state change notification";
leaf evpn-instance { leaf evpn-instance {
type string; type evpn-instance-ref;
description "Name of the associated EVPN instance"; description "Related EVPN instance";
}
leaf state {
type identityref {
base evpn-notification-state;
}
description "State change notification";
} }
} }
} }
<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 45 skipping to change at page 25, line 48
The security concerns listed above are, however, no different than The security concerns listed above are, however, no different than
faced by other routing protocols. Hence, this draft does not change faced by other routing protocols. Hence, this draft does not change
any underlying security issues inherent in [I-D.ietf-netmod-routing- any underlying security issues inherent in [I-D.ietf-netmod-routing-
cfg] cfg]
6. IANA Considerations 6. IANA Considerations
None. None.
7. Acknowledgments 7. References
The authors would like to acknowledge TBD for their useful
comments.
8. References 7.1. Normative References
8.1. Normative References
[RFC2119] Bradner, S., "Key words for use in RFCs to Indicate [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate
Requirement Levels", BCP 14, RFC 2119, March 1997. Requirement Levels", BCP 14, RFC 2119, March 1997.
8.2. Informative References 7.2. Informative References
[RFC6241] R.Enns et al., "Network Configuration [RFC6241] R.Enns et al., "Network Configuration
Protocol (NETCONF)", Protocol (NETCONF)",
RFC 6241, June 2011 RFC 6241, June 2011
[RFC6020] M. Bjorklund, "YANG - A Data Modeling Language for [RFC6020] M. Bjorklund, "YANG - A Data Modeling Language for
the Network Configuration Protocol (NETCONF)", the Network Configuration Protocol (NETCONF)",
RFC 6020, October 2010. RFC 6020, October 2010.
[RFC6242] M. Wasserman, "Using the NETCONF Protocol over [RFC6242] M. Wasserman, "Using the NETCONF Protocol over
Secure Shell (SSH)", Secure Shell (SSH)",
 End of changes. 76 change blocks. 
368 lines changed or deleted 318 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/