From 1813bf59fa53e8eb913d34b212d45b227dead799 Mon Sep 17 00:00:00 2001 From: Jan Srnicek Date: Thu, 10 Nov 2016 09:48:40 +0100 Subject: HONEYCOMB-58 - Routing Api Change-Id: Id887c12bea1983c0d185689c633902b691cf52f6 Signed-off-by: Jan Srnicek --- .../routing-api/src/main/yang/ietf-routing.yang | 1030 ++++++++++++++++++++ 1 file changed, 1030 insertions(+) create mode 100644 routing/routing-api/src/main/yang/ietf-routing.yang (limited to 'routing/routing-api/src/main/yang/ietf-routing.yang') diff --git a/routing/routing-api/src/main/yang/ietf-routing.yang b/routing/routing-api/src/main/yang/ietf-routing.yang new file mode 100644 index 000000000..6902cd0bf --- /dev/null +++ b/routing/routing-api/src/main/yang/ietf-routing.yang @@ -0,0 +1,1030 @@ +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."; + } + } + } +} \ No newline at end of file -- cgit 1.2.3-korg