diff --git a/yang/frr-ospfd.yang b/yang/frr-ospfd.yang new file mode 100644 index 000000000000..324b66dd9889 --- /dev/null +++ b/yang/frr-ospfd.yang @@ -0,0 +1,995 @@ +module frr-ospfd { + yang-version 1.1; + namespace "http://frrouting.org/yang/ospfd"; + prefix frr-ospfd; + + import frr-routing { + prefix frr-rt; + } + + import ietf-inet-types { + prefix inet; + } + + import frr-interface { + prefix frr-interface; + } + + import frr-route-types { + prefix frr-route-types; + } + + organization + "FRRouting"; + contact + "FRR Users List: + FRR Development List: "; + description + "This module defines a model for managing FRR OSPFd information. + This YANG module augments the basic routing with additional + OSPF information"; + + revision 2020-07-21 { + description + "Initial revision."; + } + + identity ospf { + base frr-rt:routing-protocol; + description + "'OSPF' routing ospf-protocol."; + } + + /* Policy types to be removed later, once policy Yang finalized */ + typedef rmap-ref { + type string; + } + + typedef plist-ref { + type string; + } + + typedef access-list-ref { + type string; + } + + typedef ospf-area-id { + type union { + type inet:ipv4-address; + type uint32; + } + description "OSPF Area ID."; + } + + grouping nssa-grouping { + container nssa { + presence "Present if the nssa is enabled"; + leaf no-summary { + type boolean; + default "false"; + description + "Do not inject inter-area routes into nssa"; + } + + leaf translate-always { + type boolean; + default "false"; + description + "NSSA-ABR to always translate"; + } + + leaf translate-candidate { + type boolean; + default "false"; + description + "NSSA-ABR for translate election"; + } + + leaf translate-never { + type boolean; + default "false"; + description + "NSSA-ABR to never translate"; + } + } + } + + grouping range-grouping { + container ranges { + list range { + key "prefix"; + description + "A list of range objects"; + leaf prefix { + type inet:ipv4-prefix; + description + "Area range prefix"; + } + + leaf advertise { + type boolean; + description + "Advertise this range"; + } + + leaf not-advertise { + type boolean; + default "false"; + description + "Do not advertise this range"; + } + + leaf cost { + type uint32 { + range "0..16777215"; + } + description + "Metric for this range"; + } + + leaf substitute { + type inet:ipv4-prefix; + description + "Network prefix to be announced instead of range"; + } + } + } + } + + grouping stub-grouping { + container stub { + presence "Present when area is stub"; + leaf no-summary { + type boolean; + default "false"; + description + "Do not inject inter-area routes into stub"; + } + } + } + + grouping shortcut-grouping { + container shortcut { + leaf default { + type boolean; + default "false"; + description + "Default shortcutting behavior"; + } + + leaf disable { + type boolean; + description + "Disable shortcutting through the area"; + } + + leaf enable { + type boolean; + description + "Enable shortcutting through the area"; + } + } + } + + grouping authentication-group { + container authentication { + presence "Enable authentication."; + description + "Enable authentication on this virtual link."; + leaf message-digest { + type boolean; + description + "Use message-digest authentication."; + } + + leaf null { + type boolean; + description + "Use null authentication."; + } + } + + list message-digest-key { + key "key-id"; + leaf key-id { + type uint8; + description + "Key id"; + } + + leaf mds-key { + type string; + description + "The OSPF password."; + } + } + + leaf authentication-key { + type string; + description + "The OSPF password."; + } + } + + grouping virtual-link-group { + list virtual-link { + key "neighbor area-id"; + description + "Virtual link parameters."; + leaf neighbor { + type inet:ipv4-address; + description + "Router ID of the remote ABR."; + } + + leaf area-id { + mandatory true; + type ospf-area-id; + } + + uses authentication-group; + + container timers { + leaf dead-interval { + type uint16; + units "seconds"; + description + "Interval time after which a neighbor is declared down."; + } + + leaf hello-interval { + type uint16 { + range "1..65535"; + } + units "seconds"; + description + "Time between HELLO packets."; + } + + leaf retransmit-interval { + type uint16 { + range "1..65535"; + } + units "seconds"; + description + "Time between retransmitting lost link state advertisements."; + } + + leaf transmit-delay { + type uint16 { + range "1..65535"; + } + units "seconds"; + description + "Link state transmit delay."; + } + } + } + } + + grouping area-groupings { + container areas { + list area { + key "area-id"; + description + "A list of area objects"; + leaf area-id { + type ospf-area-id; + } + + container authentication { + presence "Enable authentication"; + leaf message-digest { + type boolean; + description + "Use message-digest authentication"; + } + } + + leaf default-cost { + type uint32 { + range "0..16777215"; + } + description + "Advertised default summary cost"; + } + + leaf export-list { + type access-list-ref; + description + "Filter for networks announced to other areas."; + } + + leaf import-list { + type access-list-ref; + description + "Filter for networks from other areas announced to the specified one."; + } + + container filter-list { + leaf prefix { + type plist-ref; + description + "Filter networks between OSPF areas."; + } + + leaf in { + type boolean; + } + + leaf out { + type boolean; + } + } + + uses nssa-grouping; + + uses range-grouping; + + uses stub-grouping; + + uses shortcut-grouping; + + uses virtual-link-group; + } + } + } + + /* router ospf attributes */ + grouping route-ospf-leaf-attributes { + leaf auto-cost-reference-bandwidth { + type uint32 { + range "1..4294967"; + } + units "Mbits"; + description + "The reference bandwidth in terms of Mbits per second."; + } + + leaf capability-opaque { + type boolean; + default "false"; + description + "Opaque LSA."; + } + + leaf compatible-rfc1583 { + type boolean; + description + "Compatible with RFC 1583."; + } + + leaf default-metric { + type uint32 { + range "0..16777214"; + } + description + "Metric of redistributed routes."; + } + + leaf write-multiplier { + type uint8 { + range "1..100"; + } + description + "Maximum number of interfaces serviced per write."; + } + + container router-info { + choice router-info { + case as { + leaf as { + type boolean; + description + "Enable the Router Information functionality with AS flooding scope."; + } + } + case area { + leaf area { + type ospf-area-id; + description + "Enable the Router Information functionality with Area flooding scope."; + } + } + } + } + } + + grouping metric-common-group { + leaf metric { + type uint32 { + range "0..16777214"; + } + description + "OSPF default metric."; + } + + leaf metric-type { + type enumeration { + enum "type-1" { + value 1; + } + enum "type-2" { + value 2; + } + } + description + "Metric type (1/2)."; + } + + leaf route-map { + type rmap-ref; + description + "Route map reference."; + } + } + + grouping default-info-group { + container default-information { + leaf originate { + type boolean; + description + "Advertise a default route"; + } + + leaf always { + type boolean; + description + "Always advertise default route."; + } + + uses metric-common-group; + } + } + + grouping redistribute-group { + list redistribute { + key "protocol"; + leaf protocol { + type frr-route-types:frr-route-types-v4; + description + "Protocol."; + } + + uses metric-common-group; + } + } + + grouping distance-group { + container distance { + leaf admin-value { + type uint8 { + range "1..255"; + } + description + "Admin value."; + } + + container ospf { + leaf external { + type uint8 { + range "1..255"; + } + description + "Distance for external routes."; + } + + leaf inter-area { + type uint8 { + range "1..255"; + } + description + "Distance for inter-area routes."; + } + + leaf intra-area { + type uint8 { + range "1..255"; + } + description + "Distance for intra-area routes."; + } + } + } + } + + grouping distribute-list-group { + container distribute-list { + list dlist { + key "name protocol"; + leaf name { + type string; + description + "Filter networks in routing updates."; + } + + leaf protocol { + type frr-route-types:frr-route-types-v4; + description + "Out protocol."; + } + } + } + } + + grouping max-metric-group { + container max-metric { + container router-lsa { + description + "Advertise own Router-LSA with infinite distance (stub router)."; + leaf administrative { + type boolean; + description + "Administratively applied, for an indefinite period."; + } + + leaf on-shutdown { + type uint8 { + range "5..100"; + } + description + "Advertise stub-router prior to full shutdown of OSPF."; + } + + leaf on-startup { + type uint32 { + range "5..86400"; + } + description + "Automatically advertise stub Router-LSA on startup of OSPF."; + } + } + } + } + + grouping mpls-te-group { + container mpls-te { + leaf on { + type boolean; + description + "Enable the MPLS-TE functionality."; + } + + leaf router-address { + type inet:ipv4-address; + description + "Stable IP address of the advertising router."; + } + + container inter-as { + leaf as { + type boolean; + description + "AS native mode self originate INTER-AS LSA with Type 11 (as flooding scope)."; + } + + leaf area { + type ospf-area-id; + description + "AREA native mode self originate INTER-AS LSA with Type 10 (area flooding scope)."; + } + } + } + } + + grouping ospf-group { + container ospf { + leaf abr-type { + type enumeration { + enum "cisco" { + value 1; + description + "Alternative ABR, Cisco implementation."; + } + enum "ibm" { + value 2; + description + "Alternative ABR, IBM implementation."; + } + enum "shortcut" { + value 3; + description + "Shortcut ABR."; + } + enum "standard" { + value 4; + description + "Standard behavior (RFC2328)."; + } + } + } + + leaf opaque-lsa { + type boolean; + description + "Enable the Opaque-LSA capability (RFC2370)"; + } + + leaf rfc1583compatibility { + type boolean; + description + "Enable the RFC 1583 compatibility flag."; + } + + leaf router-id { + type inet:ipv4-address; + description + "Router-id for the OSPF process."; + } + + leaf write-multiplier { + type uint8 { + range "1..100"; + } + description + "Write multiplier."; + } + } + } + + grouping timer-group { + container timers { + leaf refresh-interval { + type uint16 { + range "10..1800"; + } + units "seconds"; + description + "The maximum time between distinct originations of any particular + LSA, value in units seconds."; + } + + leaf lsa-min-arrival { + type uint32 { + range "0..600000"; + } + units "milliseconds"; + description + "Minimum delay in receiving new version of an LSA."; + } + + container throttle { + leaf lsa-all { + type uint16 { + range "0..5000"; + } + units "milliseconds"; + description + "LSA delay between transmissions."; + } + + leaf spf { + type uint32 { + range "0..600000"; + } + units "milliseconds"; + description + "Delay from first change received till SPF calculation."; + } + } + } + } + + grouping segment-routing-group { + container segment-routing { + container global-block { + description + "Segment Routing Global Block label range."; + must "./upper-bound > ./lower-bound"; + leaf lower-bound { + type uint32 { + range "0..1048575"; + } + default "16000"; + } + + leaf upper-bound { + type uint32 { + range "0..1048575"; + } + default "23999"; + } + } + + container srlb { + description + "Local blocks to be advertised."; + must "./upper-bound > ./lower-bound"; + leaf lower-bound { + type uint32; + default "15000"; + description + "Lower value in the label range."; + } + leaf upper-bound { + type uint32; + default "15999"; + description + "Upper value in the label range."; + } + } + + leaf node-msd { + type uint8 { + range "1..16"; + } + description + "Maximum Stack Depth for this router."; + } + + leaf on { + type boolean; + description + "Enable Segment Routing."; + } + + list prefix-sid { + key "index"; + leaf index { + type uint16; + description + "SID index for this prefix."; + } + + leaf prefix { + type inet:ipv4-prefix; + description + "Prefix SID."; + } + + leaf last-hop-behavior { + type enumeration { + enum "explicit-null" { + value 0; + description + "Use explicit-null for the SID."; + } + enum "no-php" { + value 1; + description + "Do not use Penultimate Hop Popping (PHP) + for the SID."; + } + enum "php" { + value 2; + description + "Use PHP for the SID."; + } + } + default "php"; + description + "Configure last hop behavior."; + } + } + } + } + + grouping ospf-list-group { + list neighbor { + key "ip"; + description + "Neighbor list."; + leaf ip { + type inet:ipv4-address; + description + "Neighbor IP address."; + } + + leaf priority { + type uint8; + description + "Neighbor Priority."; + } + + leaf poll-interval { + type uint16 { + range "1..65535"; + } + units "seconds"; + description + "Dead Neighbor Polling interval."; + } + } + + list network { + key "prefix"; + description + "Enable routing on list of IP network."; + leaf prefix { + type inet:ipv4-prefix; + description + "Prefix on which routing needs to be enabled."; + } + + leaf area { + type ospf-area-id; + description + "Area ID for this network."; + } + } + + list passive-interface { + key "interface"; + description + "Suppress routing updates on list interface."; + leaf interface { + type frr-interface:interface-ref; + description + "Suppress routing updates on an interface."; + } + + leaf address { + type inet:ipv4-address; + description + "Interface address."; + } + } + } + + grouping interface-ospf-attribute-group { + leaf area { + type ospf-area-id; + description + "OSPF area ID."; + } + + uses authentication-group; + + leaf cost { + type uint16 { + range "1..65535"; + } + description + "Interface cost"; + } + + container dead-interval { + leaf interval { + type uint16 { + range "1..65535"; + } + units "seconds"; + } + + container minimal { + leaf hello-multiplier { + type uint8 { + range "1..10"; + } + } + } + } + + leaf hello-interval { + type uint16 { + range "1..65535"; + } + units "seconds"; + description + "Time between HELLO packets."; + } + + leaf retransmit-interval { + type uint16 { + range "1..65535"; + } + units "seconds"; + description + "Time between retransmitting lost link state advertisements."; + } + + leaf transmit-delay { + type uint16 { + range "1..65535"; + } + units "seconds"; + description + "Link state transmit delay."; + } + + leaf mtu-ignore { + type boolean; + description + "Disable MTU mismatch detection on this interface."; + } + + leaf priority { + type uint8; + description + "Router priority."; + } + } + + grouping interface-ospf-group { + list instance { + key "id"; + leaf id { + type uint16; + description + "OSPF instance ID."; + } + + leaf bfd { + type boolean; + default "false"; + description + "BFD support."; + } + + leaf network { + type enumeration { + enum "broadcast" { + value 1; + } + enum "non-broadcast" { + value 2; + } + enum "point-to-multipoint" { + value 3; + } + enum "point-to-point" { + value 4; + } + } + } + + uses interface-ospf-attribute-group; + + list interface-address { + key "address"; + leaf address { + type inet:ipv4-address; + description + "Address of interface"; + } + + uses interface-ospf-attribute-group; + } + } + } + + augment "/frr-rt:routing/frr-rt:control-plane-protocols/frr-rt:control-plane-protocol" { + container ospf { + when "../frr-rt:type = 'frr-ospfd:ospf'" { + description + "This container is only valid for the 'OSPF' routing + protocol."; + } + + uses route-ospf-leaf-attributes; + + uses default-info-group; + + uses redistribute-group; + + uses distance-group; + + uses distribute-list-group; + + uses max-metric-group; + + uses mpls-te-group; + + uses ospf-group; + + uses timer-group; + + uses segment-routing-group; + + uses ospf-list-group; + + uses area-groupings; + } + } + + /* + * Per-interface configuration data + */ + augment "/frr-interface:lib/frr-interface:interface" { + container ospf { + description + "OSPF interface parameters."; + uses interface-ospf-group; + } + } +}