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: David Kessens
WG Chair: Juergen Schoenwaelder
Editor: Ladislav Lhotka
";
description
"This YANG module defines essential components for the management
of a routing subsystem.
Copyright (c) 2013 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 2013-10-18 {
description
"Initial revision.";
reference
"RFC XXXX: A YANG Data Model for Routing Management";
}
/* Features */
feature advanced-router {
description
"This feature indicates that the device supports advanced
routing functions, namely:
- user-defined RIBs,
- multi-path routes.
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.
";
}
/* 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:id";
}
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:id";
}
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 {
description
"This grouping provides a leaf identifying an address
family.";
leaf address-family {
type identityref {
base address-family;
}
mandatory "true";
description
"Address family.";
}
}
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.";
}
}
grouping outgoing-interface {
description
"This grouping defines the outgoing interface for use in
nexthops.";
leaf outgoing-interface {
type leafref {
path "/routing-state/routing-instance/interfaces/interface/"
+ "name";
}
description
"Name of the outgoing interface.";
}
}
grouping special-nexthop {
description
"This grouping provides the leaf for specifying special nexthop
options.";
leaf special-nexthop {
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 nexthop options.";
}
}
grouping nexthop-classifiers {
description
"This grouping provides two nexthop classifiers.";
leaf priority {
type enumeration {
enum primary {
value "1";
description
"Primary nexthop.";
}
enum backup {
value "2";
description
"Backup nexthop.";
}
}
default "primary";
description
"Simple priority for distinguishing between primary and
backup nexthops.
Backup nexthops are used if and only if no primary nexthops
are reachable.
";
}
leaf weight {
type uint8;
must ". = 0 or not(../../nexthop/weight = 0)" {
error-message "Illegal combination of zero and non-zero "
+ "nexthop weights.";
description
"Nexthop weights must be either all zero (equal
load-balancing) or all non-zero.";
}
default "0";
description
"This parameter specifies the weight of the nexthop for load
balancing. The number specifies the relative fraction of the
traffic that will use the corresponding nexthop.
The default value of 0 represents equal load-balancing.
If both primary and backup nexthops are present, then the
weights for each priority level are used separately.
";
}
}
grouping nexthop-content {
description
"Generic parameters of nexthops in routes.";
choice nexthop-options {
mandatory "true";
description
"Options for expressing the nexthop in routes.";
case special-nexthop {
uses special-nexthop;
}
case simple-nexthop {
uses outgoing-interface;
}
case nexthop-list {
if-feature advanced-router;
list nexthop {
key "id";
description
"An entry of a nexthop list.";
leaf id {
type uint64;
description
"A numeric identifier of the entry, assigned by the
server.";
}
uses outgoing-interface;
uses nexthop-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 "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 id {
type uint64;
description
"Unique numeric identifier of the routing instance.";
}
leaf name {
type leafref {
path "/routing/routing-instance/name";
}
description
"The name of the routing instance assigned in the
corresponding configuration entry (if any).
";
}
leaf type {
type identityref {
base routing-instance-type;
}
default "rt:standard-routing-instance";
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 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;
leaf rib-id {
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.
";
leaf name {
type string;
description
"The name of the routing protocol instance.";
}
leaf type {
type identityref {
base routing-protocol;
}
mandatory "true";
description
"Type of the routing protocol.";
}
container connected-ribs {
if-feature advanced-router;
description
"Container for connected RIBs.
";
list connected-rib {
key "rib-id";
description
"List of RIBs to which the routing protocol instance
is connected (at most one RIB per address family).
";
leaf rib-id {
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 '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 '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.
";
}
}
}
}
}
}
container ribs {
description
"Container for RIBs.";
list rib {
key "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 create the default RIB for each address
family, and MAY create other RIBs. Additional RIBs MAY be
created in the configuration.
";
leaf id {
type uint64;
description
"Unique numeric identifier of the RIB instance.";
}
leaf name {
type leafref {
path "/routing/ribs/rib/name";
}
description
"The name of the RIB assigned in the corresponding
configuration entry (if any).";
}
uses address-family;
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.";
leaf id {
type uint64 {
range "1..max";
}
description
"Unique numeric identifier of the route.";
}
uses nexthop-content;
uses route-metadata;
}
}
container recipient-ribs {
if-feature advanced-router;
description
"Container for recipient RIBs.";
list recipient-rib {
key "rib-id";
description
"List of RIBs that receive routes from this RIB.";
leaf rib-id {
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";
unique "routing-instance-id";
description
"Configuration of a routing instance.
";
leaf name {
type string;
description
"The name of the configured routing instance.";
}
leaf routing-instance-id {
type uint64;
description
"Reference to a system-assigned numeric identifier of the
routing instance.
This leaf is essential for creating new configuration
entries that refer to existing system-controlled routing
instances.
";
}
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 advanced-router;
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()/"
+ "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;
leaf 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 {
if-feature advanced-router;
description
"Configuration of connected RIBs.
";
list connected-rib {
must "not(/routing/ribs/rib[name=current()/"
+ "preceding-sibling::connected-rib/"
+ "name and address-family=/routing/ribs/"
+ "rib[name=current()/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/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";
unique "id";
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.";
}
leaf id {
type uint64;
description
"System-assigned numeric identifier of the RIB instance.
This leaf is essential for creating new configuration
entries that refer to existing system-controlled RIBs.
";
}
uses address-family;
leaf description {
type string;
description
"Textual description of the RIB.";
}
container recipient-ribs {
if-feature advanced-router;
description
"Configuration of recipient RIBs.";
list recipient-rib {
must "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()/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-id {
type routing-instance-state-ref;
mandatory "true";
description
"Identifier of the routing instance whose forwarding
information base is being queried.
If the routing instance with 'id' equal to
'routing-instance-id' 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;
}
}
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;
uses nexthop-content;
uses route-metadata;
}
}
}
rpc route-count {
description
"Return the current number of routes in a RIB.
If the RIB with 'id' equal to 'rib-id' doesn't exist, then
this operation SHALL fail with error-tag 'data-missing' and
error-app-tag 'rib-not-found'.
";
input {
leaf rib-id {
type rib-state-ref;
mandatory "true";
description
"Identifier of the RIB.";
}
}
output {
leaf number-of-routes {
type uint64;
mandatory "true";
description
"Number of routes in the RIB.";
}
}
}
}