Trying out bgp-api with apidoc explorer
[unimgr.git] / bgp-api / src / main / yang / ietf-flexible-encapsulation@2017-10-30.yang
diff --git a/bgp-api/src/main/yang/ietf-flexible-encapsulation@2017-10-30.yang b/bgp-api/src/main/yang/ietf-flexible-encapsulation@2017-10-30.yang
new file mode 100644 (file)
index 0000000..ce5804b
--- /dev/null
@@ -0,0 +1,410 @@
+module ietf-flexible-encapsulation {
+  yang-version 1.1;
+  namespace
+    "urn:ietf:params:xml:ns:yang:ietf-flexible-encapsulation";
+
+  prefix flex;
+
+  import ietf-interfaces {
+    prefix if;
+  }
+
+  import iana-if-type {
+    prefix ianaift;
+  }
+
+  import ietf-interfaces-common {
+    prefix if-cmn;
+  }
+
+  import ieee802-dot1q-types {
+    prefix dot1q-types;
+  }
+
+  organization
+    "IETF NETMOD (NETCONF Data Modeling Language) Working Group";
+
+  contact
+    "WG Web:   <http://tools.ietf.org/wg/netmod/>
+     WG List:  <mailto:netmod@ietf.org>
+
+     WG Chair: Lou Berger
+               <mailto:lberger@labn.net>
+
+     WG Chair: Kent Watsen
+               <mailto:kwatsen@juniper.net>
+
+     Editor:   Robert Wilton
+               <mailto:rwilton@cisco.com>";
+
+  description
+    "This YANG module describes interface configuration for flexible
+     VLAN matches and rewrites.";
+
+  revision 2017-10-30 {
+    description "Latest draft revision";
+
+    reference
+
+      "Internet-Draft draft-ietf-netmod-sub-intf-vlan-model-03";
+  }
+
+  feature flexible-rewrites {
+    description
+      "This feature indicates whether the network element supports
+        specifying flexible rewrite operations";
+  }
+
+  feature asymmetric-rewrites {
+    description
+      "This feature indicates whether the network element supports
+       specifying different rewrite operations for the ingress
+       rewrite operation and egress rewrite operation.";
+  }
+
+  feature dot1q-tag-rewrites {
+    description
+      "This feature indicates whether the network element supports
+       the flexible rewrite functionality specifying flexible 802.1Q
+       tag rewrites";
+  }
+
+  /*
+   * flexible-match grouping.
+   *
+   * This grouping represents a flexible match.
+   *
+   * The rules for a flexible match are:
+   *     1. default, untagged, priority tag, or a stack of tags.
+   *   - Each tag in the stack of tags matches:
+   *      1. tag type (802.1Q or 802.1ad) +
+   *      2. tag value:
+   *        i. single tag
+   *        ii. set of tag ranges/values.
+   *        iii. "any" keyword
+   */
+  grouping flexible-match {
+    description "Flexible match";
+    choice match-type {
+      mandatory true;
+      description "Provides a choice of how the frames may be
+                   matched";
+
+      case default {
+        description "Default match";
+        leaf default {
+          type empty;
+
+          description
+            "Default match.  Matches all traffic not matched to any
+             other peer sub-interface by a more specific
+             encapsulation.";
+        } // leaf default
+      } // case default
+
+      case untagged {
+        description "Match untagged Ethernet frames only";
+        leaf untagged {
+          type empty;
+          description
+            "Untagged match.  Matches all untagged traffic.";
+        } // leaf untagged
+      } // case untagged
+
+      case dot1q-priority-tagged {
+        description
+          "Match 802.1Q priority tagged Ethernet frames only";
+
+        container dot1q-priority-tagged {
+          description "802.1Q priority tag match";
+          leaf tag-type {
+            type dot1q-types:dot1q-tag-type;
+            description "The 802.1Q tag type of matched priority
+                         tagged packets";
+          }
+        }
+      }
+
+      case dot1q-vlan-tagged {
+        container dot1q-vlan-tagged {
+          description "Matches VLAN tagged frames";
+
+          container outer-tag {
+            presence "The outermost VLAN tag exists";
+
+            description
+              "Classifies traffic using the outermost VLAN tag on the
+               frame.";
+
+            uses
+              'dot1q-types:'+
+              'dot1q-tag-ranges-or-any-classifier-grouping';
+          }
+
+          container second-tag {
+            must
+
+              '../outer-tag/tag-type = "dot1q-types:s-vlan" and ' +
+              'tag-type = "dot1q-types:c-vlan"' {
+
+              error-message
+                "When matching two tags, the outermost tag must be
+                 specified and of S-VLAN type and the second
+                 outermost tag must be of C-VLAN tag type";
+
+              description
+                "For IEEE 802.1Q interoperability, when matching two
+                 tags, it is required that the outermost tag exists
+                 and is an S-VLAN, and the second outermost tag is a
+                 C-VLAN";
+            }
+
+            presence "The second outermost VLAN tag exists";
+
+            description
+              "Classifies traffic using the second outermost VLAN tag
+               on the frame.";
+
+            uses
+              'dot1q-types:'+
+              'dot1q-tag-ranges-or-any-classifier-grouping';
+          }
+
+          leaf match-exact-tags {
+            type empty;
+            description
+              "If set, indicates that all 802.1Q VLAN tags in the
+               Ethernet frame header must be explicitly matched, i.e.
+               the EtherType following the matched tags must not be a
+               802.1Q tag EtherType.  If unset then extra 802.1Q VLAN
+               tags are allowed.";
+          }
+        }
+      }
+    } // encaps-type
+  }
+
+  /*
+   * Grouping for tag-rewrite that can be expressed either
+   * symmetrically, or in the ingress and/or egress directions
+   * independently.
+   */
+  grouping dot1q-tag-rewrite {
+    description "Flexible rewrite";
+    leaf pop-tags {
+
+      type uint8 {
+        range 1..2;
+      }
+      description "The number of tags to pop (or translate if used in
+                   conjunction with push-tags)";
+    }
+
+    container push-tags {
+      description "The 802.1Q tags to push (or translate if used in
+                   conjunction with pop-tags)";
+
+      container outer-tag {
+        presence
+          "Indicates existence of the outermost VLAN tag to
+           push/rewrite";
+
+        description
+          "The outermost VLAN tag to push onto the frame.";
+
+        uses dot1q-types:dot1q-tag-classifier-grouping;
+      }
+
+      container second-tag {
+        must
+          '../outer-tag/tag-type = "dot1q-types:s-vlan" and ' +
+          'tag-type = "dot1q-types:c-vlan"' {
+
+          error-message
+          "When pushing/rewriting two tags, the outermost tag must be
+           specified and of S-VLAN type and the second outermost tag
+           must be of C-VLAN tag type";
+
+          description
+          "For IEEE 802.1Q interoperability, when pushing two tags,
+           it is required that the outermost tag exists and is an
+           S-VLAN, and the second outermost tag is a C-VLAN";
+        }
+
+        presence
+          "Indicates existence of a second outermost VLAN tag to
+           push/rewrite.";
+
+        description
+          "The second outermost VLAN tag to push onto the frame.";
+
+        uses dot1q-types:dot1q-tag-classifier-grouping;
+      }
+    }
+
+  }
+
+  /*
+   * Grouping for all flexible rewrites of fields in the L2 header.
+   *
+   * This currently only includes flexible tag rewrites, but is
+   * designed to be extensible to cover rewrites of other fields in
+   * the L2 header if required.
+   */
+  grouping flexible-rewrite {
+    description "Flexible rewrite";
+
+    /*
+     * Tag rewrite.
+     *
+     * All tag rewrites are formed using a combination of pop-tags
+     * and push-tags operations.
+     */
+    container dot1q-tag-rewrite {
+      if-feature dot1q-tag-rewrites;
+      description "Tag rewrite.  Translate operations are expressed
+                   as a combination of tag push and pop operations.";
+      uses dot1q-tag-rewrite;
+    }
+  }
+  augment "/if:interfaces/if:interface/if-cmn:encapsulation/" +
+          "if-cmn:encaps-type" {
+    when
+        "derived-from-or-self(../if:type,
+                              'ianaift:ethernetCsmacd') or
+         derived-from-or-self(../if:type,
+                              'ianaift:ieee8023adLag') or
+         derived-from-or-self(../if:type,
+                              'if-cmn:ethSubInterface')" {
+      description
+        "Applies only to Ethernet-like interfaces and
+         sub-interfaces";
+    }
+    description
+      "Add flexible match and rewrite for VLAN sub-interfaces";
+
+    /*
+     * A flexible encapsulation allows for the matching of ranges and
+     * sets of VLAN Ids.  The structure is also designed to be
+     * extended to allow for matching/rewriting other fields within
+     * the L2 frame header if required.
+     */
+    case flexible {
+
+      description "Flexible encapsulation and rewrite";
+      container flexible {
+          must
+            'count(../../if-cmn:forwarding-mode) = 0 or ' +
+            'derived-from-or-self(../../if-cmn:forwarding-mode,' +
+                                 '"if-cmn:layer-2-forwarding")' {
+            error-message
+              "If the interface forwarding-mode leaf is set then it
+               must be set to an identity that derives from
+               layer-2-forwarding";
+
+            description
+              "The forwarding-mode leaf on an interface can
+               optionally be used to enforce consistency of
+               configuration";
+          }
+
+        description "Flexible encapsulation and rewrite";
+
+        container match {
+          description
+            "The match used to classify frames to this interface";
+          uses flexible-match;
+        }
+
+        container rewrite {
+          if-feature flexible-rewrites;
+          description "L2 frame rewrite operations";
+          choice direction {
+            description
+              "Whether the rewrite policy is symmetrical or
+               asymmetrical";
+            case symmetrical {
+              container symmetrical {
+                uses flexible-rewrite;
+                description
+                  "Symmetrical rewrite.  Expressed in the ingress
+                   direction, but the reverse operation is applied to
+                   egress traffic";
+              }
+            }
+
+            /*
+             * Allow asymmetrical rewrites to be specified.
+             */
+            case asymmetrical {
+              if-feature asymmetric-rewrites;
+              description "Asymmetrical rewrite";
+
+              container ingress {
+                uses flexible-rewrite;
+                description "Ingress rewrite";
+              }
+              container egress {
+                uses flexible-rewrite;
+                description "Egress rewrite";
+              }
+            }
+          }
+        }
+
+        /*
+         * For encapsulations that match a range of VLANs (or Any),
+         * allow configuration to specify the default 802.1Q VLAN tag
+         * values to use for any traffic that is locally sourced from
+         * an interface on the device.
+         */
+        container local-traffic-default-encaps {
+          presence
+            "A local traffic default encapsulation has been
+             specified";
+          description
+            "The 802.1Q VLAN tags to use by default for locally
+             sourced traffic";
+
+          container outer-tag {
+            presence
+              "Indicates existence of the outermost VLAN tag";
+
+            description
+              "The outermost VLAN tag for locally sourced traffic";
+
+            uses dot1q-types:dot1q-tag-classifier-grouping;
+          }
+
+          container second-tag {
+            must
+              '../outer-tag/tag-type = "dot1q-types:s-vlan" and ' +
+               'tag-type = "dot1q-types:c-vlan"' {
+
+            error-message
+              "When specifying two tags, the outermost tag must be
+               specified and of S-VLAN type and the second outermost
+               tag must be of C-VLAN tag type";
+
+            description
+              "For IEEE 802.1Q interoperability, when specifying two
+
+               tags, it is required that the outermost tag exists and
+               is an S-VLAN, and the second outermost tag is a
+               C-VLAN";
+            }
+
+            presence
+              "Indicates existence of a second outermost VLAN tag.";
+
+            description
+              "The second outermost VLAN tag for locally sourced
+               traffic";
+
+            uses dot1q-types:dot1q-tag-classifier-grouping;
+          }
+        }
+      }
+    }
+  }
+}