blob: 276a59fc728645df253af850ae791c13d3d70f34 [file] [log] [blame]
module ietf-bgp-l3vpn {
namespace "urn:ietf:params:xml:ns:yang:ietf-bgp-l3vpn";
// replace with IANA namespace when assigned
prefix l3vpn ;
import ietf-network-instance {
prefix ni;
revision-date 2016-06-23;
}
import ietf-interfaces {
prefix if;
}
// TODO: TBD for bgp-info
// import ietf-bgp {
// prefix bgp;
// revision-date 2016-06-21;
// }
organization
"IETF BGP Enabled Services WG";
contact
"BESS working group - bess@ietf.org";
description
"This YANG module defines a YANG data model to configure and
manage BGP Layer3 VPNs. It augments the IETF bgp yang model
and IETF network instance model to add L3VPN specific
configuration and operational knobs.
Terms and Acronyms
AF : Address Family
AS : Autonomous System
ASBR : Autonomous Systems Border Router
BGP (bgp) : Border Gateway Protocol
CE : Customer Edge
IP (ip) : Internet Protocol
IPv4 (ipv4):Internet Protocol Version 4
IPv6 (ipv6): Internet Protocol Version 6
L3VPN: Layer 3 VPN
PE : Provider Edge
RT : Route Target
RD : Route Distinguisher
VPN : Virtual Private Network
VRF : Virtual Routing and Forwarding
";
revision 2016-09-09 {
description
"Initial revision.";
reference
"RFC XXXX: A YANG Data Model for BGP L3VPN config management";
}
//RD
grouping route-distinguisher-params {
description "BGP route distinguisher";
container route-distinguisher {
description "Route distinguisher value as per RFC4364";
container config {
description
"Configuration parameters for route distinguisher";
leaf rd {
type string;
description "Route distinguisher value as per RFC4364";
}
}
container state {
config "false" ;
description
"State information for route distinguisher";
leaf rd {
type string;
description "Route distinguisher value";
}
}
}
}
//Label mode
typedef bgp-label-mode {
type enumeration {
enum per-ce {
description "Allocate labels per CE";
}
enum per-route {
description "Allocate labels per prefix";
}
enum per-vpn {
description "Allocate labels per VRF";
}
}
description "BGP label allocation mode";
}
//Fwding mode
typedef fwd-mode-type {
type enumeration {
enum mpls {
description "Forwarding mode mpls";
}
}
description
"Enable forwarding mode under ASBR facing interface";
}
grouping forwarding-mode {
description "Forwarding mode of interface for ASBR scenario";
container forwarding-mode {
description "Forwarding mode of interface for ASBR scenario";
container config {
description "Configuration of Forwarding mode";
leaf forwarding-mode {
type fwd-mode-type;
description "Forwarding mode for this interface";
}
}
container state {
config "false";
description "State information of Forwarding mode";
leaf forwarding-mode {
type fwd-mode-type;
description "Forwarding mode for this interface";
}
}
}
}
grouping label-security {
description "Mpls label security for ASBR option B scenario";
container mpls-label-security {
description "MPLS label secruity";
container config {
description "Configuration parameters";
leaf rpf {
type boolean;
description "Enable MPLS label security rpf on interface";
}
}
container state {
config "false";
description "State information";
leaf rpf {
type boolean;
description "MPLS label security rpf on interface";
}
}
}
}
//per VPN instance table limit under BGP
grouping prefix-limit {
description
"The prefix limit command sets a limit on the maximum
number of prefixes supported in the existing VPN
instance, preventing the PE from importing excessive
VPN route prefixes.
";
leaf prefix-limit-number {
type uint32 {
range "1..4294967295";
}
description
"Specifies the maximum number of prefixes supported in the
VPN instance IPv4 or IPv6 address family.";
}
choice prefix-limit-action {
description ".";
case enable-alert-percent {
leaf alert-percent-value {
type uint8 {
range "1..100";
}
description
"Specifies the proportion of the alarm threshold to the
maximum number of prefixes.";
}
leaf route-unchanged {
type boolean;
default "false";
description
"Indicates that the routing table remains unchanged.
By default, route-unchanged is not configured. When
the number of prefixes in the routing table is
greater than the value of the parameter number,
routes are processed as follows:
(1)If route-unchanged is configured, routes in the
routing table remain unchanged.
(2)If route-unchanged is not configured, all routes
in the routing table are deleted and then
re-added.";
}
}
case enable-simple-alert {
leaf simple-alert {
type boolean;
default "false";
description
"Indicates that when the number of VPN route prefixes
exceeds number, prefixes can still join the VPN
routing table and alarms are displayed.";
}
}
}
}
grouping vpn-pfx-limit {
description "Per VPN instance table limit under BGP";
container vpn-prefix-limit {
description "Prefix limit for this table";
container config {
description "Config parameters";
uses prefix-limit;
}
container state {
config "false";
description "State parameters";
uses prefix-limit;
}
}
}
grouping route-target-set {
description
"Extended community route-target set ";
list rts {
key "rt" ;
description
"List of route-targets" ;
leaf rt {
type string {
pattern '([0-9]+:[0-9]+)';
}
description "Route target extended community as per RFC4360";
}
leaf rt-type {
type enumeration {
enum import {
description "Route target is for import routes";
}
enum export {
description "Route target is for export routes";
}
enum both {
description
"Route target is for both import and export routes";
}
}
description "Route target type";
}
}
leaf route-policy {
type string;
description
"Reference to the policy containing set of routes.
TBD: leafref to policy entry in IETF policy model";
}
}
grouping import-from-gbl {
description "Import from global routing table";
leaf enable {
type boolean;
description "Enable";
}
leaf advertise-as-vpn {
type boolean;
description
"Advertise routes imported from global table as VPN routes";
}
leaf route-policy {
type string;
description "Route policy as filter for importing routes";
}
leaf bgp-valid-route {
type boolean;
description
"Enable all valid routes (including non-best paths) to be
candidate for import";
}
leaf protocol {
type enumeration {
enum ALL {
value "0";
description "ALL:";
}
enum Direct {
value "1";
description "Direct:";
}
enum OSPF {
value "2";
description "OSPF:";
}
enum ISIS {
value "3";
description "ISIS:";
}
enum Static {
value "4";
description "Static:";
}
enum RIP {
value "5";
description "RIP:";
}
enum BGP {
value "6";
description "BGP:";
}
enum OSPFV3 {
value "7";
description "OSPFV3:";
}
enum RIPNG {
value "8";
description "RIPNG:";
}
}
description
"Specifies the protocol from which routes are imported.
At present, In the IPv4 unicast address family view,
the protocol can be IS-IS,static, direct and BGP.";
}
leaf instance {
type string;
description
"Specifies the instance id of the protocol";
}
}
grouping global-imports {
description "Grouping for imports from global routing table";
container import-from-global {
description "Import from global routing table";
container config {
description "Configuration";
uses import-from-gbl;
}
container state {
config "false";
description "State";
uses import-from-gbl;
}
}
}
grouping export-to-gbl {
description "Export routes to default VRF";
leaf enable {
type boolean;
description "Enable";
}
}
grouping global-exports {
description "Grouping for exports routes to global table";
container export-to-global {
description "Export to global routing table";
container config {
description "Configuration";
uses export-to-gbl;
}
container state {
config "false";
description "State";
uses export-to-gbl;
}
}
}
grouping route-target-params {
description "Grouping to specify rules for route import and export";
container route-targets {
description
"Set of route-targets to match for import and export routes
to/from VRF";
container config {
description
"Configuration of route targets";
uses route-target-set ;
}
container state {
config "false" ;
description
"State information for route targets";
uses route-target-set ;
}
}
}
grouping route-tbl-limit-params {
description "Grouping for VPN table prefix limit config";
leaf routing-table-limit-number {
type uint32 {
range "1..4294967295";
}
description
"Specifies the maximum number of routes supported by a
VPN instance. ";
}
choice routing-table-limit-action {
description ".";
case enable-alert-percent {
leaf alert-percent-value {
type uint8 {
range "1..100";
}
description
"Specifies the percentage of the maximum number of
routes. When the maximum number of routes that join
the VPN instance is up to the value
(number*alert-percent)/100, the system prompts
alarms. The VPN routes can be still added to the
routing table, but after the number of routes
reaches number, the subsequent routes are
dropped.";
}
}
case enable-simple-alert {
leaf simple-alert {
type boolean;
description
"Indicates that when VPN routes exceed number, routes
can still be added into the routing table, but the
system prompts alarms.
However, after the total number of VPN routes and
network public routes reaches the unicast route limit
specified in the License, the subsequent VPN routes
are dropped.";
}
}
}
}
grouping routing-tbl-limit {
description ".";
container routing-table-limit {
description
"The routing-table limit command sets a limit on the maximum
number of routes that the IPv4 or IPv6 address family of a
VPN instance can support.
By default, there is no limit on the maximum number of
routes that the IPv4 or IPv6 address family of a VPN
instance can support, but the total number of private
network and public network routes on a device cannot
exceed the allowed maximum number of unicast routes.";
container config {
description "Config parameters";
uses route-tbl-limit-params;
}
container state {
config "false";
description "State parameters";
uses route-tbl-limit-params;
}
}
}
// Tunnel policy parameters
grouping tunnel-params {
description "Tunnel parameters";
container tunnel-params {
description "Tunnel config parameters";
container config {
description "configuration parameters";
leaf tunnel-policy {
type string;
description
"Tunnel policy name.";
}
}
container state {
config "false";
description "state parameters";
leaf tunnel-policy {
type string;
description
"Tunnel policy name.";
}
}
}
}
// Grouping for the L3vpn specific parameters under VRF
// (network-instance)
grouping l3vpn-vrf-params {
description "Specify route filtering rules for import/export";
container ipv4 {
description
"Specify route filtering rules for import/export";
container unicast {
description
"Specify route filtering rules for import/export";
uses route-target-params;
uses global-imports;
uses global-exports;
uses routing-tbl-limit;
uses tunnel-params;
}
}
container ipv6 {
description
"Ipv6 address family specific rules for import/export";
container unicast {
description "Ipv6 unicast address family";
uses route-target-params;
uses global-imports;
uses global-exports;
uses routing-tbl-limit;
uses tunnel-params;
}
}
}
grouping bgp-label-mode {
description "MPLS/VPN label allocation mode";
container config {
description
"Configuration parameters for label allocation mode";
leaf label-mode {
type bgp-label-mode;
description "Label allocation mode";
}
}
container state {
config "false" ;
description "State information for label allocation mode";
leaf label-mode {
type bgp-label-mode;
description "Label allocation mode";
}
}
}
grouping retain-route-targets {
description "Grouping for route target accept";
container retain-route-targets {
description "Control route target acceptance behavior for ASBRs";
container config {
description
"Configuration parameters for retaining route targets";
leaf all {
type empty;
description "Disable filtering of all route-targets";
}
leaf route-policy {
type string;
description "Filter routes as per filter policy name
TBD: leafref to IETF routing policy model";
}
}
container state {
config "false" ;
description "State information for retaining route targets";
leaf all {
type empty;
description "Disable filtering of all route-targets";
}
leaf route-policy {
type string;
description "Filter routes as per filter policy name";
}
}
}
}
grouping nexthop-opts {
description "Next hop control options for inter-as route exchange";
leaf next-hop-self {
type boolean;
description
"Set nexthop of the route to self when advertising routes";
}
leaf next-hop-unchanged {
type boolean;
description "Enforce no nexthop change when advertising routes";
}
}
grouping asbr-nexthop-options {
description "Nexthop parameters for inter-as VPN options ";
container nexthop-options {
description "Nexthop related options for inter-as options";
container config {
description "Configuration parameters for nexthop options";
uses nexthop-opts;
}
container state {
config "false";
description "State information for nexthop options" ;
uses nexthop-opts;
}
}
}
//
// VRF specific parameters.
// RD and RTs and route import-export rules are added under
// network instance container in network instance model, hence
// per VRF scoped
augment "/ni:devices/ni:device/ni:network-instances/ni:network-instance" {
description
"Augment network instance for per VRF L3vpn parameters";
container l3vpn {
//Enable this check once network instance model has
//identify defined for VRF type
//when "../type='rt:vrf-network-instance'" {
// description
// "This container is only valid for vrf routing instance.";
//}
description "Configuration of L3VPN specific parameters";
uses route-distinguisher-params;
uses l3vpn-vrf-params ;
}
}
// bgp mpls forwarding enable required for inter-as option AB.
augment "/if:devices/if:device/if:interfaces/if:interface" {
description
"BGP mpls forwarding mode configuration on interface for
ASBR scenario";
uses forwarding-mode ;
uses label-security;
}
//
// BGP Specific Paramters
//
//
// Retain route-target for inter-as option ASBR knob.
// vpn prefix limits
// vpnv4/vpnv6 address-family only.
//augment "/bgp:bgp/bgp:global/bgp:afi-safis/" +
// "bgp:afi-safi/bgp:l3vpn-ipv4-unicast" {
// description "Retain route targets for ASBR scenario";
// uses retain-route-targets;
// uses vpn-pfx-limit;
// }
// augment "/bgp:bgp/bgp:global/bgp:afi-safis/" +
// "bgp:afi-safi/bgp:l3vpn-ipv6-unicast" {
// description "Retain route targets for ASBR scenario";
// uses retain-route-targets;
// uses vpn-pfx-limit;
// }
// Label allocation mode configuration. Certain AFs only.
// augment "/bgp:bgp/bgp:global/bgp:afi-safis/" +
// "bgp:afi-safi/bgp:ipv4-unicast" {
// description
// "Augment BGP global AF mode for label allocation mode
// configuration";
// uses bgp-label-mode ;
// uses routing-tbl-limit;
// }
// augment "/bgp:bgp/bgp:global/bgp:afi-safis/" +
// "bgp:afi-safi/bgp:ipv6-unicast" {
// description
// "Augment BGP global AF mode for label allocation mode
// configuration";
// uses bgp-label-mode ;
// uses routing-tbl-limit;
// }
// Nexthop options for the inter-as ASBR peering.
// augment "/bgp:bgp/bgp:neighbors/bgp:neighbor" {
// description
// "Augment BGP NBR mode with nexthop options for inter-as ASBRs";
// uses asbr-nexthop-options;
// }
// augment "/bgp:bgp/bgp:peer-groups/bgp:peer-group" {
// description
// "Augment BGP peer-group mode with nexthop options for inter-as
// ASBRs";
// uses asbr-nexthop-options;
// }
// augment "/bgp:bgp/bgp:neighbors/bgp:neighbor/" +
// "bgp:afi-safis/bgp:afi-safi" {
// description
// "Augment BGP NBR AF mode with nexthop options for inter-as
// ASBRs";
// uses asbr-nexthop-options;
// }
// augment "/bgp:bgp/bgp:peer-groups/bgp:peer-group/" +
// "bgp:afi-safis/bgp:afi-safi" {
// description
// "Augment BGP peer-group AF mode with nexthop options for inter-as
// ASBRs";
// uses asbr-nexthop-options;
// }
}