submodule frr-bgp-common { yang-version 1.1; belongs-to frr-bgp { prefix "bgp"; } import ietf-bgp-types { prefix bt; } import ietf-inet-types { prefix inet; } import frr-bgp-types { prefix frr-bt; } import frr-route-map { prefix frr-route-map; } import frr-route-types { prefix frr-rt-type; } import frr-vrf { prefix frr-vrf; } import ietf-routing-types { prefix rt-types; } import frr-interface { prefix frr-interface; } organization "FRRouting"; contact "FRR Users List: FRR Development List: "; description "This submodule contains general data definitions for use in BGP. Copyright 2020 FRRouting Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."; revision 2019-12-03 { description "Initial revision."; } grouping rmap-policy-import { leaf rmap-import { type frr-route-map:route-map-ref; } } grouping rmap-policy-export { leaf rmap-export { type frr-route-map:route-map-ref; } } grouping unsuppress-map-policy-import { leaf unsuppress-map-import { type frr-route-map:route-map-ref; } } grouping unsuppress-map-policy-export { leaf unsuppress-map-export { type frr-route-map:route-map-ref; } } grouping plist-policy-import { leaf plist-import { type frr-bt:plist-ref; } } grouping plist-policy-export { leaf plist-export { type frr-bt:plist-ref; } } grouping access-list-policy-import { leaf access-list-import { type frr-bt:access-list-ref; } } grouping access-list-policy-export { leaf access-list-export { type frr-bt:access-list-ref; } } grouping as-path-filter-list-policy-import { leaf as-path-filter-list-import { type frr-bt:as-path-filter-ref; } } grouping as-path-filter-list-policy-export { leaf as-path-filter-list-export { type frr-bt:as-path-filter-ref; } } grouping route-selection-options { description "Configuration relating to route selection options."; container route-selection-options { description "Parameters relating to options for route selection."; leaf always-compare-med { type boolean; default "false"; description "Compare multi-exit discriminator (MED) value from different ASes when selecting the best route. The default behaviour is to only compare MEDs for paths received from the same AS."; } leaf deterministic-med { type boolean; default "false"; description "Compare multi-exit discriminator (MED) value from Same ASes when selecting the best route."; } leaf confed-med { type boolean; default "false"; description "Compare multi-exit discriminator (MED) value from different Sub ASes when selecting the best route."; } leaf missing-as-worst-med { type boolean; default "false"; description "Missing multi-exit discriminator (MED) value is considered as value of infinity, making the path least desirable when selecting the best route."; } leaf aspath-confed { type boolean; default "false"; description "Compare path lengths including confederation sets and sequences in selecting a route."; } leaf ignore-as-path-length { type boolean; default "false"; description "Ignore the AS path length when selecting the best path. The default is to use the AS path length and prefer paths with shorter length."; } leaf external-compare-router-id { type boolean; default "false"; description "When comparing similar routes received from external BGP peers, use the router-id as a criterion to select the active path."; } leaf allow-multiple-as { type boolean; default "false"; description "Allow multi-path to use paths from different neighbouring ASes. The default is to only consider multiple paths from the same neighbouring AS."; } leaf multi-path-as-set { when "../allow-multiple-as = 'true'"; type boolean; default "false"; description "Multi-path with AS-SET, When set to 'true' it adds AS set information for aggregate routes, When set to 'false' it prevents AS set generation."; } } } grouping med-config { description "Configuration relating to MED."; container med-config { leaf enable-med-admin { type boolean; default "false"; description "Flag to enable receiving of MED metric attribute in routing updates."; } leaf max-med-admin { type uint32 { range "0..4294967295"; } default "4294967294"; description "Tells the router to announce routes with this MED value This MED value is applicable for indefinite time."; } leaf max-med-onstart-up-time { type uint32 { range "5..86400"; } units "seconds"; description "Tells the router to announce routes with MED value, This MED value is applicable for this duration during start-up."; } leaf max-med-onstart-up-value { type uint32 { range "0..4294967295"; } default "4294967294"; description "Tells the router to announce routes with this MED value This MED value is applicable for start-up time."; } } } grouping route-reflector-config { description "Grouping used to include route reflector configuration for BGP global."; container route-reflector { description "Route reflector parameters for the BGP global."; leaf route-reflector-cluster-id { type bt:rr-cluster-id-type; description "Route Reflector cluster ID to use when local router is configured as a route reflector. Commonly set at the group level, but allows a different cluster ID to be set for each neighbor."; reference "RFC 4456: BGP Route Reflection: An Alternative to Full Mesh."; } leaf no-client-reflect { type boolean; default "false"; description "When set to 'true', this disables route redistribution by the Route Reflector. It is set 'true' when the client is fully meshed to prevent sending of redundant route advertisements."; reference "TODO: Add reference when IETF writes a draft describing this."; } leaf allow-outbound-policy { type boolean; default "false"; description "When set to 'true', this allow RR to modify the attributes of the reflected IBGP routes as per the out route-map. It is set 'false' RR will not modify the attributes of the reflected IBGP routes as per the out route-map rules."; } } } grouping global-bgp-config { leaf instance-type-view { type boolean; default "false"; description "When set to 'true' BGP instance type is view. When set to 'false' BGP instance type is regular."; } leaf ebgp-multihop-connected-route-check { type boolean; default "false"; description "When set to 'true' it will disable checking if nexthop is connected on EBGP sessions. When set to 'false' it will enable checking if nexthop is connected on EBGP sessions."; } leaf fast-external-failover { type boolean; default "true"; description "It's an interface tracking mechanism. When set to 'true' don't immediately reset session if a link to a directly connected external peer goes down. When set to 'false' it will immediately reset session if a link to a directly connected external peer goes down."; } leaf local-pref { type uint32; default "100"; description "BGP local preference attribute sent to internal peers to indicate the degree of preference for externally learned routes. The route with the highest local preference value is preferred."; reference "RFC 4271."; } leaf default-shutdown { type boolean; default "false"; description "Apply administrative shutdown to newly configured peers."; } leaf suppress-duplicates { type boolean; default "true"; description "Suppress duplicate updates if the route actually not changed."; } leaf ebgp-requires-policy { type boolean; default "true"; description "When set to 'true' BGP speaker requires in and out policy for EBGP peers (RFC8212)."; } leaf show-hostname { type boolean; default "false"; description "When set to 'true' BGP show hostname in certain command outputs."; } leaf show-nexthop-hostname { type boolean; default "false"; description "When set to 'true' BGP show hostname for nexthop in certain command outputs."; } } grouping global-neighbor-config { container global-neighbor-config { leaf dynamic-neighbors-limit { type uint32 { range "1..65535"; } description "Maximum number of BGP Dynamic Neighbors that can be created."; } leaf log-neighbor-changes { type boolean; default "false"; description "When set to 'true' BGP will start logging neighbor up/down and reset reason. When set to 'false' BGP will stop logging neighbor up/down and reset reason."; } container packet-quanta-config { leaf wpkt-quanta { type uint32 { range "1..64"; } default "64"; description "How many packets to write to peer socket per run."; } leaf rpkt-quanta { type uint32 { range "1..10"; } default "10"; description "How many packets to read from peer socket per I/O cycle."; } } } } grouping global-update-group-config { container global-update-group-config { leaf subgroup-pkt-queue-size { type uint32 { range "20..100"; } default "40"; description "Subgroup packet queue size."; } leaf coalesce-time { type uint32 { range "0..4294967295"; } units "milliseconds"; default "1000"; description "Configures the Subgroup coalesce timer."; } } } grouping global-network-config { leaf import-check { type boolean; default "true"; description "When set to 'true' bgp creates entries for network statements if a matching prefix exists in the rib. When set to 'false' bgp creates entries for networks that the router cannot reach. In FRR versions < 7.4 this used to default to 'false' this is an incompatible backward change"; } } grouping neighbor-timers { leaf hold-time { type uint16 { range "0 | 3..65535"; } units "seconds"; default "180"; description "Time interval (in seconds) for the HoldTimer established with the peer. When read as operational data (ro), the value of this object is calculated by this BGP speaker, using the smaller of the values in hold-time that was configured (rw) in the running datastore and the Hold Time received in the OPEN message. This value must be at least three seconds if it is not zero (0). If the Hold Timer has not been established with the peer this object MUST have a value of zero (0). If the configured value of hold-time object was a value of (0), then when read this object MUST have a value of (0) also."; reference "RFC 4271"; } leaf keepalive { type uint16 { range "0..65535"; } units "seconds"; default "60"; description "When used as a configuration (rw) value, this Time interval (in seconds) for the KeepAlive timer configured for this BGP speaker with this peer. The value of this object will only determine the KEEPALIVE messages' frequency relative to the value specified in configured value for hold-time. If the value of this object is zero (0), no periodical KEEPALIVE messages are sent to the peer after the BGP connection has been established. The suggested value for this timer is 30 seconds.; The actual time interval for the KEEPALIVE messages is indicated by operational value of keepalive. That value of this object is calculated by this BGP speaker such that, when compared with hold-time, it has the same proportion that keepalive has, compared with hold-time. A reasonable maximum value for this timer would be one third of that of hold-time."; reference "RFC 4271"; } } grouping global-config-timers { container global-config-timers { leaf rmap-delay-time { type uint16 { range "0..600"; } units "seconds"; default "5"; description "Time to wait before processing route-map changes."; } leaf update-delay-time { type uint16 { range "0..3600"; } units "seconds"; description "Time to force initial delay for best-path and updates."; } leaf establish-wait-time { type uint16 { range "1..3600"; } units "seconds"; description "Time to force initial delay for updates."; } leaf connect-retry-interval { type uint16 { range "1..max"; } units "seconds"; default "120"; description "Time interval (in seconds) for the ConnectRetryTimer. The suggested value for this timer is 120 seconds."; reference "RFC 4271, This is the value used to initialize the 'ConnectRetryTimer'."; } uses neighbor-timers; } } grouping graceful-restart-config { description "Configuration parameters relating to BGP graceful restart."; choice mode { case graceful-restart-mode { leaf enabled { type boolean; default "false"; description "Enable or disable the graceful-restart capability. When set to 'true' it will enable graceful restart and helper both globally. When set to 'false' it will enable the default behaviour global helper mode."; } } case graceful-restart-disable-mode { leaf graceful-restart-disable { type boolean; default "false"; description "When set to 'true' it will disable graceful restart and helper both globally. when set to 'false' it will enable the default behaviour global helper mode."; } } } leaf preserve-fw-entry { type boolean; default "false"; description "Sets F-bit indication that fib is preserved while doing Graceful Restart. When set to 'true' Zebra would preserve the FIB entry on the restarting node."; } leaf restart-time { type uint16 { range "1..3600"; } units "seconds"; default "120"; description "Estimated time (in seconds) for the local BGP speaker to restart a session. This value is advertise in the graceful restart BGP capability. This is a 12-bit value, referred to as Restart Time in RFC4724. Per RFC4724, the suggested default value is <= the hold-time value. This timer is applicable for helper node."; reference "RFC 4724: Graceful Restart Mechanism for BGP."; } leaf stale-routes-time { type uint16 { range "1..3600"; } units "seconds"; default "360"; description "An upper-bound on the time that stale routes will be retained by a router after a session is restarted. If an End-of-RIB (EOR) marker is received prior to this timer expiring stale-routes will be flushed upon its receipt - if no EOR is received, then when this timer expires stale paths will be purged. This timer is applicable for restarting node."; reference "RFC 4724: Graceful Restart Mechanism for BGP."; } leaf selection-deferral-time { type uint16 { range "0..3600"; } units "seconds"; default "360"; description "An upper-bound on the time that restarting router defers the route selection process after restart."; reference "RFC 4724: Graceful Restart Mechanism for BGP."; } leaf rib-stale-time { type uint16 { range "1..3600"; } units "seconds"; default "500"; description "An upper-bound on the time that helper router holds the stale routes in Zebra, When this timer gets expired Zebra removes the stale routes."; } } grouping global-group-use-multiple-paths { description "Common grouping used for both global and groups which provides configuration parameters relating to use of multiple paths."; container use-multiple-paths { description "Parameters related to the use of multiple paths for the same NLRI."; container ebgp { description "Multi-Path parameters for EBGP."; leaf maximum-paths { type uint16; default "64"; description "Maximum number of parallel paths to consider when using BGP multi-path. The default is use a single path."; } } container ibgp { description "Multi-Path parameters for IBGP."; leaf maximum-paths { type uint16; default "64"; description "Maximum number of parallel paths to consider when using IBGP multi-path. The default is to use a single path."; } leaf cluster-length-list { when "../maximum-paths != 0"; type boolean; default "false"; description "When set to 'true' route with the shortest cluster-list length is used. The cluster-list reflects the IBGP reflection path the route has taken. It's the part of route selection algo."; } } } } grouping global-redistribute { description "List of route redistribution per AFI."; list redistribution-list { key "route-type route-instance"; leaf route-type { type frr-rt-type:frr-route-types; description "Protocol route type."; } leaf route-instance { type uint16 { range "0..65535"; } description "Protocol Instance."; } leaf metric { type uint32 { range "0..4294967295"; } description "Metric for redistributed routes."; } leaf rmap-policy-import { type frr-route-map:route-map-ref; description "Route-map to be applied for redistributed routes into the bgp."; } } } grouping mp-afi-safi-network-config { leaf label-index { type rt-types:mpls-label; description "Label index to associate with the prefix."; } leaf rmap-policy-export { type frr-route-map:route-map-ref; description "Route-map to modify the attributes for Routes going out via BGP updates."; } } grouping mp-afi-safi-agg-route-config { leaf as-set { type boolean; default "false"; description "When set to 'true' AS set path information is generated for aggregate address. When set to 'false' AS set path information is not generated."; } leaf summary-only { type boolean; default "false"; description "When set to 'true' it advertise only the aggregate route and suppress the advertisement of all the component routes. When set to 'false' all more-specific routes summarized by the aggregate route are advertised."; } leaf rmap-policy-export { type frr-route-map:route-map-ref; description "Apply route map to aggregate network."; } leaf origin { type enumeration { enum "igp" { value 0; description "Local IGP."; } enum "egp" { value 1; description "Remote EGP."; } enum "incomplete" { value 2; description "Unknown heritage."; } enum "unspecified" { value 255; description "Unspecified."; } } default "unspecified"; description "BGP origin type."; } leaf match-med { type boolean; default "false"; description "When set to 'true' aggregate-route matches only med."; } leaf suppress-map { type string; description "Suppress more specific routes specified in route-map."; } } grouping admin-distance { container admin-distance { description "Administrative distance (or preference) assigned to routes received from different sources (external, internal, and local)."; leaf external { type uint8 { range "1..255"; } default "20"; description "Administrative distance for routes learned from external BGP (EBGP)."; } leaf internal { type uint8 { range "1..255"; } default "200"; description "Administrative distance for routes learned from internal BGP (IBGP)."; } leaf local { type uint8 { range "1..255"; } default "200"; description "Administrative distance for routes learned from local."; } } } grouping distance-per-route-config { leaf distance { type uint8 { range "1..255"; } mandatory true; description "Administrative distance for route."; } leaf access-list-policy-export { type frr-bt:access-list-ref; description "Access-list policy applied on routes going from BGP to Zebra."; } } grouping route-flap-dampening { container route-flap-dampening { description "Dampening feature"; leaf enable { type boolean; default "false"; description "Enable route flap dampening."; } leaf reach-decay { when "../enable = 'true'"; type uint8 { range "1..45"; } units "seconds"; default "15"; description "This value specifies the time desired for the instability metric value to reach one-half of its current value when the route is reachable. This half-life value determines the rate at which the metric value is decayed. A smaller half-life value makes a suppressed route reusable sooner than a larger value. The accumulated penalty will be reduced to half after this duration."; } leaf reuse-above { when "../enable = 'true'"; type uint16 { range "1..20000"; } default "750"; description "This is the value of the instability metric at which a suppressed route becomes unsuppressed if it is reachable but currently suppressed. The value assigned to reuse-below must be less than suppress-above."; } leaf suppress-above { when "../enable = 'true'"; type uint16 { range "1..20000"; } default "2000"; description "This is the value of the instability metric at which route suppression takes place. A route is not installed in the forwarding information base (FIB), or announced even if it is reachable during the period that it is suppressed."; } leaf unreach-decay { when "../enable = 'true'"; type uint8 { range "1..255"; } units "seconds"; default "60"; description "This value acts the same as reach-decay except that it specifies the rate at which the instability metric is decayed when a route is unreachable. It should have a value greater than or equal to reach-decay."; } } } grouping flow-spec-config { container flow-spec-config { description "Flow spec feature."; leaf interface { type frr-interface:interface-ref { require-instance false; } description "The local interface."; } } } grouping global-graceful-shutdown { description "Structural grouping used to include graceful-shutdown configuration for both BGP neighbors and peer groups."; container graceful-shutdown { description "BGP Graceful shutdown feature."; leaf enable { type boolean; default "false"; description "Enable graceful-shutdown feature."; } } } grouping global-filter-config { description "Structural grouping used to include filter configuration for BGP RIB table."; container filter-config { description "BGP table to RIB route download filter."; uses rmap-policy-export; } } grouping route-distinguisher-params { description "Route distinguisher value as per RFC4364."; leaf rd { type rt-types:route-distinguisher; description "Route distinguisher value as per RFC4364."; } } grouping vpn-label-params { description "Label value for VRF."; choice label-allocation-mode { case manual { leaf label { type rt-types:mpls-label; description "Label index to associate with the prefix."; } } case auto { leaf label-auto { type boolean; default "false"; description "Automatically assign a label."; } } } } grouping vpn-nexthop-params { description "Specify next hop to use for VRF advertised prefixes."; leaf nexthop { type inet:ip-address; description "Nexthop IP address."; } } grouping rt-list { description "Route Target list"; leaf-list import-rt-list { type rt-types:route-target; description "For routes leaked from vpn to current address-family: match any."; } leaf-list export-rt-list { type rt-types:route-target; description "For routes leaked from current address-family to vpn: set."; } } grouping vpn-route-target-params { description "Route Target value."; leaf redirect-rt { type rt-types:route-target; description "Flow-spec redirect type route target."; } choice rt-direction { case import-export { uses rt-list; } case both { leaf-list rt-list { type rt-types:route-target; description "Both import: match any and export: set."; } } } } grouping vpn-import-params { description "VPN route leaking parameters."; leaf import-vpn { type boolean; default "false"; description "Import routes from default instance VPN RIB."; } leaf export-vpn { type boolean; default "false"; description "Export routes to default instance VPN RIB."; } list import-vrf-list { key "vrf"; description "List of VRFs to import routes from."; leaf vrf { type frr-vrf:vrf-ref { require-instance false; } description "Routing instance."; } } uses rmap-policy-import; uses rmap-policy-export; } grouping global-afi-safi-vpn-config { container vpn-config { leaf rd { type string; description "Route distinguisher value as per RFC4364."; } uses vpn-label-params; uses vpn-nexthop-params; uses vpn-import-params; uses vpn-route-target-params; } } grouping global-afi-safi-vpn-network-config { list network-config { key "rd"; description "A list of rd."; uses route-distinguisher-params; list prefix-list { key "prefix"; description "A list of prefix."; leaf prefix { type inet:ip-prefix; description "IP destination prefix."; } leaf label-index { type uint32; mandatory true; description "Label index to associate with the prefix."; } leaf rmap-policy-export { type frr-route-map:route-map-ref; description "Route-map to modify the attributes for Routes going out via BGP updates."; } } } } }