--- a/dev/null 2020-04-10 18:48:03.582667900 +0300
|
|
+++ b/yang/frr-route-map.yang 2020-05-02 11:43:04.182956847 +0300
|
|
@@ -0,0 +1,387 @@
|
|
+module frr-route-map {
|
|
+ yang-version 1.1;
|
|
+ namespace "http://frrouting.org/yang/route-map";
|
|
+ prefix frr-route-map;
|
|
+
|
|
+ import ietf-inet-types {
|
|
+ prefix inet;
|
|
+ }
|
|
+ import frr-filter {
|
|
+ prefix filter;
|
|
+ }
|
|
+ import frr-interface {
|
|
+ prefix frr-interface;
|
|
+ }
|
|
+
|
|
+ organization "FRRouting";
|
|
+ contact
|
|
+ "FRR Users List: <mailto:frog@lists.frrouting.org>
|
|
+ FRR Development List: <mailto:dev@lists.frrouting.org>";
|
|
+ description "This module defines route map settings";
|
|
+
|
|
+ revision 2019-07-01 {
|
|
+ description "Initial revision";
|
|
+ }
|
|
+
|
|
+ /*
|
|
+ * Types.
|
|
+ */
|
|
+ typedef route-map-sequence {
|
|
+ description "Route map valid sequence numbers";
|
|
+ type uint16 {
|
|
+ range "1..65535";
|
|
+ }
|
|
+ }
|
|
+
|
|
+ typedef route-map-name {
|
|
+ description "Route map name format";
|
|
+ type string;
|
|
+ }
|
|
+
|
|
+ /*
|
|
+ * Operational data.
|
|
+ */
|
|
+ container lib {
|
|
+ list route-map {
|
|
+ description "Route map instance";
|
|
+
|
|
+ key "name";
|
|
+
|
|
+ leaf name {
|
|
+ description "Route map instance name";
|
|
+ type route-map-name;
|
|
+ }
|
|
+
|
|
+ list entry {
|
|
+ description "Route map entry";
|
|
+
|
|
+ key "sequence";
|
|
+
|
|
+ leaf sequence {
|
|
+ description
|
|
+ "Route map instance priority (low number means higher priority)";
|
|
+ type route-map-sequence;
|
|
+ }
|
|
+
|
|
+ leaf description {
|
|
+ description "Route map description";
|
|
+ type string;
|
|
+ }
|
|
+
|
|
+ leaf action {
|
|
+ description
|
|
+ "Route map actions: permit (executes action), deny (quits evaluation)";
|
|
+ mandatory true;
|
|
+ type enumeration {
|
|
+ enum permit {
|
|
+ description
|
|
+ "Executes configured action and permits the prefix/route
|
|
+ if the conditions matched. An alternative exit action can
|
|
+ be configured to continue processing the route map list
|
|
+ or jump to process another route map.";
|
|
+ value 0;
|
|
+ }
|
|
+ enum deny {
|
|
+ description
|
|
+ "If all conditions are met the prefix/route is denied and
|
|
+ route map processing stops.";
|
|
+ value 1;
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+
|
|
+ leaf call {
|
|
+ description
|
|
+ "Call another route map before calling `exit-policy`. If the
|
|
+ called route map returns deny then this route map will also
|
|
+ return deny";
|
|
+ type route-map-name;
|
|
+ }
|
|
+
|
|
+ leaf exit-policy {
|
|
+ description "What do to after route map successful match, set and call";
|
|
+ type enumeration {
|
|
+ enum permit-or-deny {
|
|
+ description "End route map evaluation and return";
|
|
+ value 0;
|
|
+ }
|
|
+ enum next {
|
|
+ description
|
|
+ "Proceed evaluating next route map entry per sequence";
|
|
+ value 1;
|
|
+ }
|
|
+ enum goto {
|
|
+ description
|
|
+ "Go to route map entry with the provided sequence number";
|
|
+ value 2;
|
|
+ }
|
|
+ }
|
|
+ default "permit-or-deny";
|
|
+ }
|
|
+
|
|
+ leaf goto-value {
|
|
+ when "../exit-policy = 'goto'";
|
|
+ description
|
|
+ "Sequence number to jump (when using `goto` exit policy)";
|
|
+ mandatory true;
|
|
+ type route-map-sequence;
|
|
+ }
|
|
+
|
|
+ list match-condition {
|
|
+ description "Route map match conditions";
|
|
+
|
|
+ key "condition";
|
|
+
|
|
+ leaf condition {
|
|
+ description "Match condition";
|
|
+ type enumeration {
|
|
+ enum interface {
|
|
+ description "Match interface";
|
|
+ value 0;
|
|
+ }
|
|
+ enum ipv4-address-list {
|
|
+ description "Match an IPv4 access-list";
|
|
+ value 1;
|
|
+ }
|
|
+ enum ipv4-prefix-list {
|
|
+ description "Match an IPv4 prefix-list";
|
|
+ value 2;
|
|
+ }
|
|
+ enum ipv4-next-hop-list {
|
|
+ description "Match an IPv4 next-hop";
|
|
+ value 3;
|
|
+ }
|
|
+ enum ipv4-next-hop-prefix-list {
|
|
+ description "Match an IPv4 next-hop prefix list";
|
|
+ value 4;
|
|
+ }
|
|
+ enum ipv4-next-hop-type {
|
|
+ description "Match an IPv4 next-hop type";
|
|
+ value 5;
|
|
+ }
|
|
+ enum ipv6-address-list {
|
|
+ description "Match an IPv6 access-list";
|
|
+ value 6;
|
|
+ }
|
|
+ enum ipv6-prefix-list {
|
|
+ description "Match an IPv6 prefix-list";
|
|
+ value 7;
|
|
+ }
|
|
+ enum ipv6-next-hop-type {
|
|
+ description "Match an IPv6 next-hop type";
|
|
+ value 8;
|
|
+ }
|
|
+ enum metric {
|
|
+ description "Match a route metric";
|
|
+ value 9;
|
|
+ }
|
|
+ enum tag {
|
|
+ description "Match a route tag";
|
|
+ value 10;
|
|
+ }
|
|
+ /* zebra specific conditions. */
|
|
+ enum ipv4-prefix-length {
|
|
+ description "Match IPv4 prefix length";
|
|
+ value 100;
|
|
+ }
|
|
+ enum ipv6-prefix-length {
|
|
+ description "Match IPv6 prefix length";
|
|
+ value 101;
|
|
+ }
|
|
+ enum ipv4-next-hop-prefix-length {
|
|
+ description "Match next-hop prefix length";
|
|
+ value 102;
|
|
+ }
|
|
+ enum source-protocol {
|
|
+ description "Match source protocol";
|
|
+ value 103;
|
|
+ }
|
|
+ enum source-instance {
|
|
+ description "Match source protocol instance";
|
|
+ value 104;
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+
|
|
+ choice condition-value {
|
|
+ description
|
|
+ "Value to match (interpretation depends on condition type)";
|
|
+ mandatory true;
|
|
+ case interface {
|
|
+ when "./condition = 'interface'";
|
|
+ leaf interface {
|
|
+ type string;
|
|
+ }
|
|
+ }
|
|
+ case access-list-num {
|
|
+ when "./condition = 'ipv4-address-list' or
|
|
+ ./condition = 'ipv4-next-hop-list'";
|
|
+ leaf access-list-num {
|
|
+ type filter:access-list-standard;
|
|
+ }
|
|
+ }
|
|
+ case access-list-num-extended {
|
|
+ when "./condition = 'ipv4-address-list' or
|
|
+ ./condition = 'ipv4-next-hop-list'";
|
|
+ leaf access-list-num-extended {
|
|
+ type filter:access-list-extended;
|
|
+ }
|
|
+ }
|
|
+ case list-name {
|
|
+ when "./condition = 'ipv4-address-list' or
|
|
+ ./condition = 'ipv4-prefix-list' or
|
|
+ ./condition = 'ipv4-next-hop-list' or
|
|
+ ./condition = 'ipv4-next-hop-prefix-list' or
|
|
+ ./condition = 'ipv6-address-list' or
|
|
+ ./condition = 'ipv6-prefix-list'";
|
|
+ leaf list-name {
|
|
+ type filter:access-list-name;
|
|
+ }
|
|
+ }
|
|
+ case ipv4-next-hop-type {
|
|
+ when "./condition = 'ipv4-next-hop-type'";
|
|
+ leaf ipv4-next-hop-type {
|
|
+ type enumeration {
|
|
+ enum blackhole {
|
|
+ value 0;
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+ case ipv6-next-hop-type {
|
|
+ when "./condition = 'ipv6-next-hop-type'";
|
|
+ leaf ipv6-next-hop-type {
|
|
+ type enumeration {
|
|
+ enum blackhole {
|
|
+ value 0;
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+ case metric {
|
|
+ when "./condition = 'metric'";
|
|
+ leaf metric {
|
|
+ type uint32 {
|
|
+ range "1..4294967295";
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+ case tag {
|
|
+ when "./condition = 'tag'";
|
|
+ leaf tag {
|
|
+ type uint32 {
|
|
+ range "1..4294967295";
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+
|
|
+ list set-action {
|
|
+ description "Route map set actions";
|
|
+
|
|
+ key "action";
|
|
+
|
|
+ leaf action {
|
|
+ description "Action to do when the route map matches";
|
|
+ type enumeration {
|
|
+ enum ipv4-next-hop {
|
|
+ description "Set IPv4 address of the next hop";
|
|
+ value 0;
|
|
+ }
|
|
+ enum ipv6-next-hop {
|
|
+ description "Set IPv6 address of the next hop";
|
|
+ value 1;
|
|
+ }
|
|
+ enum metric {
|
|
+ description "Set prefix/route metric";
|
|
+ value 2;
|
|
+ }
|
|
+ enum tag {
|
|
+ description "Set tag";
|
|
+ value 3;
|
|
+ }
|
|
+ /* zebra specific conditions. */
|
|
+ enum source {
|
|
+ description "Set source address for route";
|
|
+ value 100;
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+
|
|
+ choice action-value {
|
|
+ description
|
|
+ "Value to set (interpretation depends on action-type)";
|
|
+ case ipv4-address {
|
|
+ when "./action = 'ipv4-next-hop'";
|
|
+ leaf ipv4-address {
|
|
+ description "IPv4 address";
|
|
+ type inet:ipv4-address;
|
|
+ }
|
|
+ }
|
|
+ case ipv6-address {
|
|
+ when "./action = 'ipv6-next-hop'";
|
|
+ leaf ipv6-address {
|
|
+ description "IPv6 address";
|
|
+ type inet:ipv6-address;
|
|
+ }
|
|
+ }
|
|
+ case metric {
|
|
+ when "./action = 'metric'";
|
|
+ choice metric-value {
|
|
+ description "Metric to set or use";
|
|
+ case value {
|
|
+ leaf value {
|
|
+ description "Use the following metric value";
|
|
+ type uint32 {
|
|
+ range "0..4294967295";
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+ case add-metric {
|
|
+ leaf add-metric {
|
|
+ description "Add unit to metric";
|
|
+ type boolean;
|
|
+ }
|
|
+ }
|
|
+ case subtract-metric {
|
|
+ leaf subtract-metric {
|
|
+ description "Subtract unit from metric";
|
|
+ type boolean;
|
|
+ }
|
|
+ }
|
|
+ case use-round-trip-time {
|
|
+ leaf use-round-trip-time {
|
|
+ description "Use the round trip time as metric";
|
|
+ type boolean;
|
|
+ }
|
|
+ }
|
|
+ case add-round-trip-time {
|
|
+ leaf add-round-trip-time {
|
|
+ description "Add round trip time to metric";
|
|
+ type boolean;
|
|
+ }
|
|
+ }
|
|
+ case subtract-round-trip-time {
|
|
+ leaf subtract-round-trip-time {
|
|
+ description "Subtract round trip time to metric";
|
|
+ type boolean;
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+ case tag {
|
|
+ when "./action = 'tag'";
|
|
+ leaf tag {
|
|
+ description "Tag value";
|
|
+ type uint32 {
|
|
+ range "0..4294967295";
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+}
|