module ietf-routing{ namespace "urn:ietf:params:xml:ns:yang:ietf-routing"; prefix "rt"; import ietf-yang-types { prefix "yang"; } import ietf-interfaces { prefix "if"; } organization "IETF NETMOD (NETCONF Data Modeling Language) Working Group"; contact "WG Web: WG List: WG Chair: Thomas Nadeau WG Chair: Juergen Schoenwaelder Editor: Ladislav Lhotka "; description "This YANG module defines essential components for the management of a routing subsystem. Copyright (c) 2014 IETF Trust and the persons identified as authors of the code. All rights reserved. Redistribution and use in source and binary forms, with or without modification, is permitted pursuant to, and subject to the license terms contained in, the Simplified BSD License set forth in Section 4.c of the IETF Trust's Legal Provisions Relating to IETF Documents (http://trustee.ietf.org/license-info). This version of this YANG module is part of RFC XXXX; see the RFC itself for full legal notices."; revision 2014-05-24 { description "Initial revision."; reference "RFC XXXX: A YANG Data Model for Routing Management"; } /* Features */ feature multiple-ribs { description "This feature indicates that the device supports multiple RIBS per address family, and the framework for passing routes between RIBs. Devices that do not support this feature MUST provide exactly one system-controlled RIB per supported address family. These RIBs then appear as entries of the list /routing-state/ribs/rib."; } feature multipath-routes { description "This feature indicates that the device supports multipath routes that have a list of next-hops."; } /* Identities */ identity address-family { description "Base identity from which identities describing address families are derived."; } identity ipv4 { base address-family; description "This identity represents IPv4 address family."; } identity ipv6 { base address-family; description "This identity represents IPv6 address family."; } identity routing-instance-type { description "Base identity from which identities describing routing instance types are derived. It is primarily intended for discriminating among different types of logical routers or router virtualization."; } identity standard-routing-instance { base routing-instance-type; description "This identity represents a default routing instance."; } identity routing-protocol { description "Base identity from which routing protocol identities are derived."; } identity direct { base routing-protocol; description "Routing pseudo-protocol which provides routes to directly connected networks."; } identity static { base routing-protocol; description "Static routing pseudo-protocol."; } identity route-filter { description "Base identity from which all route filters are derived."; } identity deny-all-route-filter { base route-filter; description "Route filter that blocks all routes."; } identity allow-all-route-filter { base route-filter; description "Route filter that permits all routes."; } /* Type Definitions */ typedef routing-instance-ref { type leafref { path "/rt:routing/rt:routing-instance/rt:name"; } description "This type is used for leafs that reference a routing instance configuration."; } typedef routing-instance-state-ref { type leafref { path "/rt:routing-state/rt:routing-instance/rt:name"; } description "This type is used for leafs that reference state data of a routing instance."; } typedef rib-ref { type leafref { path "/rt:routing/rt:ribs/rt:rib/rt:name"; } description "This type is used for leafs that reference a RIB configuration."; } typedef rib-state-ref { type leafref { path "/rt:routing-state/rt:ribs/rt:rib/rt:name"; } description "This type is used for leafs that reference a RIB in state data."; } typedef route-filter-ref { type leafref { path "/rt:routing/rt:route-filters/rt:route-filter/rt:name"; } description "This type is used for leafs that reference a route filter configuration."; } typedef route-filter-state-ref { type leafref { path "/rt:routing-state/rt:route-filters/rt:route-filter/" + "rt:name"; } description "This type is used for leafs that reference a route filter in state data."; } /* Groupings */ grouping address-family-grouping { description "This grouping provides a leaf identifying an address family."; leaf address-family { type identityref { base address-family; } mandatory "true"; description "Address family."; } } grouping state-entry-id { description "This grouping defines a unique identifier for entries in several operational state lists."; leaf id { type uint64; description "Unique numerical identifier of a list entry in operational state. It may be used by protocols or tools that inspect and/or manipulate operational state data and prefer fixed-size integers as list entry handles. These identifiers are always ephemeral, i.e., they may change after a reboot."; } } grouping router-id { description "This grouping provides the definition of router ID."; leaf router-id { type yang:dotted-quad; description "Router ID - 32-bit number in the form of a dotted quad. Some protocols use this parameter for identifying a router to its neighbors."; } } grouping outgoing-interface { description "This grouping defines the outgoing interface for use in next-hops."; leaf outgoing-interface { type leafref { path "/rt:routing-state/rt:routing-instance/rt:interfaces/" + "rt:interface/rt:name"; } description "Name of the outgoing interface."; } } // WARNING - renamed due to yang sources generation problem(having same name for grouping and it's leaf ends up in error against Java Language Specification) grouping special-next-hop-grouping { description "This grouping provides the leaf for specifying special next-hop options."; leaf special-next-hop { type enumeration { enum blackhole { description "Silently discard the packet."; } enum unreachable { description "Discard the packet and notify the sender with an error message indicating that the destination host is unreachable."; } enum prohibit { description "Discard the packet and notify the sender with an error message indicating that the communication is administratively prohibited."; } enum receive { description "The packet will be received by the local network device."; } } description "Special next-hop options."; } } grouping next-hop-classifiers { description "This grouping provides two next-hop classifiers."; leaf priority { type enumeration { enum primary { value "1"; description "Primary next-hop."; } enum backup { value "2"; description "Backup next-hop."; } } description "Simple priority for distinguishing between primary and backup next-hops. Backup next-hops are used if and only if no primary next-hops are reachable."; } leaf weight { type uint8; must ". = 0 or not(../../next-hop/weight = 0)" { error-message "Illegal combination of zero and non-zero " + "next-hop weights."; description "Next-hop weights must be either all zero (equal load-balancing) or all non-zero."; } description "This parameter specifies the weight of the next-hop for load balancing. The number specifies the relative fraction of the traffic that will use the corresponding next-hop. A value of 0 represents equal load-balancing. If both primary and backup next-hops are present, then the weights for each priority level are used separately."; } } grouping next-hop-content { description "Generic parameters of next-hops in routes."; choice next-hop-options { mandatory "true"; description "Options for expressing the next-hop in routes."; case special-next-hop { uses special-next-hop-grouping; } case simple-next-hop { uses outgoing-interface; } case next-hop-list { if-feature multipath-routes; container next-hop-list { description "Container for multiple next-hops."; list next-hop { key "id"; description "An entry of a next-hop list."; uses state-entry-id; uses outgoing-interface; uses next-hop-classifiers; } } } } } grouping route-metadata { description "Route metadata."; leaf source-protocol { type identityref { base routing-protocol; } mandatory "true"; description "Type of the routing protocol from which the route originated."; } leaf last-updated { type yang:date-and-time; description "Time stamp of the last modification of the route. If the route was never modified, it is the time when the route was inserted into the RIB."; } } /* Operational state data */ container routing-state { config "false"; description "Operational state of the routing subsystem."; list routing-instance { key "name"; unique "id"; description "Each list entry is a container for operational state data of a routing instance. An implementation MAY create one or more system-controlled instances, other user-controlled instances MAY be created by configuration."; leaf name { type string; description "The name of the routing instance. For system-controlled instances the name is persistent, i.e., it SHOULD NOT change across reboots."; } uses state-entry-id { refine "id" { mandatory "true"; } } leaf type { type identityref { base routing-instance-type; } description "The routing instance type, primarily intended for discriminating among different types of logical routers, route virtualization, master-slave arrangements etc., while keeping all routing instances in the same flat list."; } uses router-id { description "Global router ID. An implementation may choose a value if none is configured. Routing protocols that use router ID MAY override this global parameter."; } container default-ribs { description "Default RIBs used by the routing instance."; list default-rib { key "address-family"; description "Each list entry specifies the default RIB for one address family. The default RIB is operationally connected to all routing protocols for which a connected RIB has not been explicitly configured. The 'direct' pseudo-protocol is always connected to the default RIBs."; uses address-family-grouping; leaf rib-name { type rib-state-ref; mandatory "true"; description "Name of an existing RIB to be used as the default RIB for the given routing instance and address family."; } } } container interfaces { description "Network layer interfaces belonging to the routing instance."; list interface { key "name"; description "List of network layer interfaces assigned to the routing instance."; leaf name { type if:interface-state-ref; description "A reference to the name of a configured network layer interface."; } } } container routing-protocols { description "Container for the list of routing protocol instances."; list routing-protocol { key "name"; description "Operational state of a routing protocol instance. An implementation MUST provide exactly one system-controlled instance of the type 'direct'. Other instances MAY be created by configuration."; leaf name { type string; description "The name of the routing protocol instance. For system-controlled instances this name is persistent, i.e., it SHOULD NOT change across reboots."; } leaf type { type identityref { base routing-protocol; } mandatory "true"; description "Type of the routing protocol."; } container connected-ribs { description "Container for connected RIBs."; list connected-rib { key "rib-name"; description "List of RIBs to which the routing protocol instance is connected (at most one RIB per address family)."; leaf rib-name { type rib-state-ref; description "Name of an existing RIB."; } leaf import-filter { type route-filter-state-ref; description "Reference to a route filter that is used for filtering routes passed from this routing protocol instance to the RIB specified by the 'rib-name' sibling node. If this leaf is not present, the behavior is protocol-specific, but typically it means that all routes are accepted."; } leaf export-filter { type route-filter-state-ref; description "Reference to a route filter that is used for filtering routes passed from the RIB specified by the 'rib-name' sibling node to this routing protocol instance. If this leaf is not present, the behavior is protocol-specific - typically it means that all routes are accepted. The 'direct' and 'static' pseudo-protocols accept no routes from any RIB."; } } } //NOTE -added to allow operational state for static-routes container static-routes { when "../type='rt:static'" { description "This container is only valid for the 'static' routing protocol."; } description "Configuration of the 'static' pseudo-protocol. Address family specific modules augment this node with their lists of routes."; } } } } container ribs { description "Container for RIBs."; list rib { key "name"; unique "id"; description "Each entry represents a RIB identified by the 'name' key. All routes in a RIB MUST belong to the same address family. The server MUST provide a system-controlled default RIB for each address family, and MAY provide other system-controlled RIBs. Additional RIBs MAY be created in the configuration."; leaf name { type string; description "The name of the RIB."; } uses state-entry-id { refine "id" { mandatory "true"; } } uses address-family-grouping; container routes { description "Current contents of the RIB."; list route { key "id"; description "A RIB route entry. This data node MUST be augmented with information specific for routes of each address family."; uses state-entry-id; uses next-hop-content; uses route-metadata; } } container recipient-ribs { if-feature multiple-ribs; description "Container for recipient RIBs."; list recipient-rib { key "rib-name"; description "List of RIBs that receive routes from this RIB."; leaf rib-name { type rib-state-ref; description "The name of the recipient RIB."; } leaf filter { type route-filter-state-ref; description "A route filter which is applied to the routes passed to the recipient RIB."; } } } } } container route-filters { description "Container for route filters."; list route-filter { key "name"; description "Route filters are used for filtering and/or manipulating routes that are passed between a routing protocol and a RIB and vice versa, or between two RIBs. It is expected that other modules augment this list with contents specific for a particular route filter type."; leaf name { type string; description "The name of the route filter."; } leaf type { type identityref { base route-filter; } mandatory "true"; description "Type of the route-filter - an identity derived from the 'route-filter' base identity."; } } } } /* Configuration Data */ container routing { description "Configuration parameters for the routing subsystem."; list routing-instance { key "name"; description "Configuration of a routing instance."; leaf name { type string; description "The name of the routing instance. For system-controlled entries, the value of this leaf must be the same as the name of the corresponding entry in state data. For user-controlled entries, an arbitrary name can be used."; } leaf type { type identityref { base routing-instance-type; } default "rt:standard-routing-instance"; description "The type of the routing instance."; } leaf enabled { type boolean; default "true"; description "Enable/disable the routing instance. If this parameter is false, the parent routing instance is disabled and does not appear in operational state data, despite any other configuration that might be present."; } uses router-id { description "Configuration of the global router ID."; } leaf description { type string; description "Textual description of the routing instance."; } container default-ribs { if-feature multiple-ribs; description "Configuration of the default RIBs used by the routing instance. The default RIB for an addressed family if by default connected to all routing protocol instances supporting that address family, and always receives direct routes."; list default-rib { must "address-family=/routing/ribs/rib[name=current()/" + "rib-name]/address-family" { error-message "Address family mismatch."; description "The entry's address family MUST match that of the referenced RIB."; } key "address-family"; description "Each list entry configures the default RIB for one address family."; uses address-family-grouping; leaf rib-name { type string; mandatory "true"; description "Name of an existing RIB to be used as the default RIB for the given routing instance and address family."; } } } container interfaces { description "Configuration of the routing instance's interfaces."; list interface { key "name"; description "List of network layer interfaces assigned to the routing instance."; leaf name { type if:interface-ref; description "A reference to the name of a configured network layer interface."; } } } container routing-protocols { description "Configuration of routing protocol instances."; list routing-protocol { key "name"; description "Each entry contains configuration of a routing protocol instance."; leaf name { type string; description "An arbitrary name of the routing protocol instance."; } leaf description { type string; description "Textual description of the routing protocol instance."; } leaf enabled { type boolean; default "true"; description "Enable/disable the routing protocol instance. If this parameter is false, the parent routing protocol instance is disabled and does not appear in operational state data, despite any other configuration that might be present."; } leaf type { type identityref { base routing-protocol; } mandatory "true"; description "Type of the routing protocol - an identity derived from the 'routing-protocol' base identity."; } container connected-ribs { description "Configuration of connected RIBs."; list connected-rib { must "not(/routing/ribs/rib[name=current()/" + "preceding-sibling::connected-rib/" + "rib-name and address-family=/routing/ribs/" + "rib[name=current()/rib-name]/address-family])" { error-message "Duplicate address family for connected RIBs."; description "For each address family, there MUST NOT be more than one connected RIB."; } key "rib-name"; description "List of RIBs to which the routing protocol instance is connected (at most one RIB per address family). If no connected RIB is configured for an address family, the routing protocol is connected to the default RIB for that address family."; leaf rib-name { type rib-ref; must "../../../type != 'rt:direct' or " + "../../../../../default-ribs/ " + "default-rib/rib-name=." { error-message "The 'direct' protocol can be " + "connected only to a default RIB."; description "For the 'direct' pseudo-protocol, the connected RIB must always be a default RIB."; } description "Name of an existing RIB."; } leaf import-filter { type route-filter-ref; description "Configuration of import filter."; } leaf export-filter { type route-filter-ref; description "Configuration of export filter."; } } } container static-routes { when "../type='rt:static'" { description "This container is only valid for the 'static' routing protocol."; } description "Configuration of the 'static' pseudo-protocol. Address family specific modules augment this node with their lists of routes."; } } } } container ribs { description "Configured RIBs."; list rib { key "name"; description "Each entry represents a configured RIB identified by the 'name' key. Entries having the same key as a system-controlled entry of the list /routing-state/ribs/rib are used for configuring parameters of that entry. Other entries define additional user-controlled RIBs."; leaf name { type string; description "The name of the RIB. For system-controlled entries, the value of this leaf must be the same as the name of the corresponding entry in state data. For user-controlled entries, an arbitrary name can be used."; } uses address-family-grouping; leaf description { type string; description "Textual description of the RIB."; } container recipient-ribs { if-feature multiple-ribs; description "Configuration of recipient RIBs."; list recipient-rib { must "rib-name != ../../name" { error-message "Source and recipient RIBs are identical."; description "A RIB MUST NOT appear among its recipient RIBs."; } must "/routing/ribs/rib[name=current()/rib-name]/" + "address-family=../../address-family" { error-message "Address family mismatch."; description "Address family of the recipient RIB MUST match that of the source RIB."; } key "rib-name"; description "Each entry configures a recipient RIB."; leaf rib-name { type rib-ref; description "The name of the recipient RIB."; } leaf filter { type route-filter-ref; description "A route filter which is applied to the routes passed to the recipient RIB."; } } } } } container route-filters { description "Configuration of route filters."; list route-filter { key "name"; description "Each entry configures a named route filter."; leaf name { type string; description "The name of the route filter."; } leaf description { type string; description "Textual description of the route filter."; } leaf type { type identityref { base route-filter; } mandatory "true"; description "Type of the route filter.."; } } } } /* RPC methods */ rpc active-route { description "Return the active route that a routing-instance uses for sending packets to a destination address."; input { leaf routing-instance-name { type routing-instance-state-ref; mandatory "true"; description "Name of the routing instance whose forwarding information base is being queried. If the routing instance with name equal to the value of this parameter doesn't exist, then this operation SHALL fail with error-tag 'data-missing' and error-app-tag 'routing-instance-not-found'."; } container destination-address { description "Network layer destination address. Address family specific modules MUST augment this container with a leaf named 'address'."; uses address-family-grouping; } } output { container route { description "The active route for the specified destination. If the routing instance has no active route for the destination address, no output is returned - the server SHALL send an containing a single element . Address family specific modules MUST augment this list with appropriate route contents."; uses address-family-grouping; uses next-hop-content; uses route-metadata; } } } rpc route-count { description "Return the current number of routes in a RIB."; input { leaf rib-name { type rib-state-ref; mandatory "true"; description "Name of the RIB. If the RIB with name equal to the value of this parameter doesn't exist, then this operation SHALL fail with error-tag 'data-missing' and error-app-tag 'rib-not-found'."; } } output { leaf number-of-routes { type uint64; mandatory "true"; description "Number of routes in the RIB."; } } } }