<?xml version="1.0" encoding="US-ASCII"?>
<!-- This template is for creating an Internet Draft using xml2rfc,
     which is available here: http://xml.resource.org. -->
<!DOCTYPE rfc SYSTEM "rfc2629.dtd" [
<!-- One method to get references from the online citation libraries.
     There has to be one entity for each item to be referenced. 
     An alternate method (rfc include) is described in the references. -->
<!ENTITY RFC2119 SYSTEM "http://xml.resource.org/public/rfc/bibxml/reference.RFC.2119.xml">
<!--<!ENTITY RFC2629 SYSTEM "http://xml.resource.org/public/rfc/bibxml/reference.RFC.2629.xml">-->
<!--<!ENTITY RFC3552 SYSTEM "http://xml.resource.org/public/rfc/bibxml/reference.RFC.3552.xml">-->
<!ENTITY RFC6241 SYSTEM "http://xml.resource.org/public/rfc/bibxml/reference.RFC.6241.xml">
<!ENTITY RFC6242 SYSTEM "http://xml.resource.org/public/rfc/bibxml/reference.RFC.6242.xml">
<!ENTITY RFC6536 SYSTEM "http://xml.resource.org/public/rfc/bibxml/reference.RFC.6536.xml">
<!ENTITY RFC6020 SYSTEM "http://xml.resource.org/public/rfc/bibxml/reference.RFC.6020.xml">
<!ENTITY RFC7223 SYSTEM "http://xml.resource.org/public/rfc/bibxml/reference.RFC.7223.xml">
<!ENTITY RFC7224 SYSTEM "http://xml.resource.org/public/rfc/bibxml/reference.RFC.7224.xml">
]>
<?xml-stylesheet type='text/xsl' href='rfc2629.xslt' ?>
<!-- used by XSLT processors -->
<!-- For a complete list and description of processing instructions (PIs), 
     please see http://xml.resource.org/authoring/README.html. -->
<!-- Below are generally applicable Processing Instructions (PIs) that most I-Ds might want to use.
     (Here they are set differently than their defaults in xml2rfc v1.32) -->
<?rfc strict="yes" ?>
<!-- give errors regarding ID-nits and DTD validation -->
<!-- control the table of contents (ToC) -->
<?rfc toc="yes"?>
<!-- generate a ToC -->
<?rfc tocdepth="4"?>
<!-- the number of levels of subsections in ToC. default: 3 -->
<!-- control references -->
<?rfc symrefs="yes"?>
<!-- use symbolic references tags, i.e, [RFC2119] instead of [1] -->
<?rfc sortrefs="yes" ?>
<!-- sort the reference entries alphabetically -->
<!-- control vertical white space 
     (using these PIs as follows is recommended by the RFC Editor) -->
<?rfc compact="yes" ?>
<!-- do not start each main section on a new page -->
<?rfc subcompact="no" ?>
<!-- keep one blank line between list items -->
<!-- end of list of popular I-D processing instructions -->
<rfc category="std" docName="draft-wilton-netmod-intf-vlan-yang-03" ipr="trust200902">
    <!-- category values: std, bcp, info, exp, and historic
     ipr values: full3667, noModification3667, noDerivatives3667
     you can add the attributes updates="NNNN" and obsoletes="NNNN" 
     they will automatically be output with "(if approved)" -->
    <!-- ***** FRONT MATTER ***** -->
    <front>
        <!-- The abbreviated title is used in the page header - it is only necessary if the 
         full title is longer than 39 characters -->
        <title abbrev="Sub-interface VLAN YANG">Sub-interface VLAN YANG Data Models</title>
        <!-- add 'role="editor"' below for the editors if appropriate -->
        <!-- Another author who claims to be an editor -->
        <author fullname="Robert Wilton" initials="R.G." role="editor" surname="Wilton">
            <organization>Cisco Systems</organization>
            <address>
                <email>rwilton@cisco.com</email>
                <!-- uri and facsimile elements may also be added -->
            </address>
        </author>
        <author fullname="David Ball" initials="D" surname="Ball">
            <organization>Cisco Systems</organization>
            <address>
                <email>daviball@cisco.com</email>
            </address>
        </author>
        <author fullname="Tapraj Singh" initials="T" surname="Singh">
            <organization>Cisco Systems</organization>
            <address>
                <email>tapsingh@cisco.com</email>
                <!-- uri and facsimile elements may also be added -->
            </address>
        </author>
        <author fullname="Selvakumar Sivaraj" initials="S" surname="Sivaraj">
            <organization>Juniper Networks</organization>
            <address>
                <email>ssivaraj@juniper.net</email>
                <!-- uri and facsimile elements may also be added -->
            </address>
        </author>
        <!-- uri and facsimile elements may also be added -->
        <date month="July" year="2016"/>
        <!-- If the month and year are both specified and are the current ones, xml2rfc will fill 
         in the current day for you. If only the current year is specified, xml2rfc will fill 
	 in the current day and month for you. If the year is not the current one, it is 
	 necessary to specify at least a month (xml2rfc assumes day="1" if not specified for the 
	 purpose of calculating the expiry date).  With drafts it is normally sufficient to 
	 specify just the year. -->
        <!-- Meta-data Declarations -->
        <area>General</area>
        <workgroup>Internet Engineering Task Force</workgroup>
        <!-- WG name at the upperleft corner of the doc,
         IETF is fine for individual submissions.  
	 If this element is not present, the default is "Network Working Group",
         which is used by the RFC Editor as a nod to the history of the IETF. -->
        <keyword>template</keyword>
        <!-- Keywords will be incorporated into HTML output
         files in a meta tag but they have no effect on text or nroff
         output. If you submit your draft to the RFC Editor, the
         keywords will be used for the search engine. -->
        <abstract>
            <t>This document defines YANG modules to add support for classifying traffic received on interfaces as Ethernet/VLAN framed packets to sub-interfaces based on the fields available in the Ethernet/VLAN frame headers. These modules allow IETF forwarding protocols (such as IPv6 and VPLS) to interoperate with VLAN tagged traffic orginated from an IEEE 802.1Q compliant bridge.  Primarily the classification is based on VLAN identifiers in the 802.1Q VLAN tags, but the model also has support for matching on some other layer 2 frame header fields and is designed to be extensible to match on other arbitrary header fields.</t>
            <t>The model differs from an IEEE 802.1Q bridge model in that the configuration is interface/sub-interface based as opposed to being based on membership of an 802.1Q VLAN bridge.</t>
        </abstract>
    </front>
    <middle>
        <section title="Introduction">
            <t>This document defines two YANG <xref target="RFC6020"/> modules that augment the encapsulation choice YANG element defined in <xref target="I-D.wilton-netmod-intf-ext-yang">Interface Extensions YANG</xref> and the generic interfaces data model defined in <xref target="RFC7223"/>.  The two modules provide configuration nodes to support classification of Ethernet/VLAN traffic to sub-interfaces, that can have interface based feature and service configuration applied to them.</t>
            <t>The purpose of these models is to allow IETF defined forwarding protocols, such as IPv6 <xref target="RFC2460"/>, Ethernet Pseudo Wires <xref target="RFC4448"/> and VPLS <xref target="RFC4761"/> <xref target="RFC4762"/> to be configurable via YANG when interoperating with VLAN tagged traffic received from an IEEE 802.1Q compliant bridge.</t>
            <t>In the case of layer 2 Ethernet services, the flexible encapsulation module also supports flexible rewriting of the VLAN tags contained the in frame header.</t>
            <t>For reference, a comparison between the sub-interface based YANG model documented in this draft and an IEEE 802.1Q bridge model is described in <xref target="comparison"/>.</t>
            <t>In summary, the YANG modules defined in this internet draft are:
                <list>
                    <t>if-l3-vlan.yang - Defines the model for basic classification of VLAN tagged traffic to L3 transport services</t>
                    <t>flexible-encapsulation.yang - Defines the model for flexible classification of Ethernet/VLAN traffic to L2 transport services</t>
                </list>
            </t>
            <t> In addition, the yang module dot1q-tag-types.yang, that provides definitions for common ways of identifying frames using fields from the 802.1Q VLAN tag, is included in this draft as a temporary reference. The expectation is that the types in this module will be stardardized through the IEEE 802.1 YANG efforts, and that it would be subsequently refrenced from this draft rather than included in it.</t>
            <!--      <section title="Requirements Language">

      </section>-->
            <section title="Terminology">
                <t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
        "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
        document are to be interpreted as described in <xref target="RFC2119">RFC 2119</xref>.</t>
        <t>Sub-interface: A sub-interface is a small augmentation of a regular interface in the standard YANG module for Interface Management that represents a subset of the traffic handled by its parent interface. As such, it supports both configuration and operational data using any other YANG models that augment or reference interfaces in the normal way.  It is defined in <xref target="I-D.wilton-netmod-intf-ext-yang">Interface Extensions YANG</xref>.</t>
            </section>
            <section title="Tree Diagrams">
                <t>A simplified graphical representation of the data model is used in
   this document.  The meaning of the symbols in these diagrams is as
   follows:
                    <list style="symbols">
                        <t>Brackets "[" and "]" enclose list keys.</t><t>Abbreviations before data node names: "rw" means configuration (read-write), and "ro" means state data (read-only).</t><t>Symbols after data node names: "?" means an optional node, "!" means a presence container, and "*" denotes a list or leaf-list.</t><t>Parentheses enclose choice and case nodes, and case nodes are also marked with a colon (":").</t><t>Ellipsis ("...") stands for contents of subtrees that are not shown.</t>
                    </list>
                </t>
            </section>
        </section>
        <section title="Objectives">
            <t>The primary aim of the YANG modules contained in this draft is to provide the core model that is required to implement VLAN transport services on router based devices that is fully compatible with IEEE 802.1Q complaint bridges.</t>
            <t>A secondary aim is for the modules to be structured in such a way that they can be cleanly extended in future.</t>
            <section title="Interoperability with IEEE 802.1Q compliant bridges">
               <t>The modules defined in this document are designed to fully interoperate with IEEE 802.1Q compliant bridges.  In particular, the models are restricted to only matching, adding, or rewriting the 802.1Q VLAN tags in frames in ways that are compatible with IEEE 802.1Q compliant bridges.</t>
            </section>
            <section title="Extensibility">
               <t>The modules are structured in such a way that they can be sensibly extended.  In particular:
                   <list>
                   <t>The tag stack is represented as a list to allow a tag stack of more than two tags to be supported if necessary in future.</t>
                   <t>The tag stack list elements allow other models, or vendors, to include additional forms of tag matching and rewriting.  The intention, however, is that it should not be necessary to have any vendor specific extensions to any of the YANG models defined in this document to implement standard Ethernet and VLAN services.</t>
                   </list>
               </t>
            </section>
        </section>
        <section title="L3 Interface VLAN Model">
            <t>
      The L3 Interface VLAN model provides appropriate leaves for termination of an 802.1Q VLAN tagged segment to a sub-interface based L3 service.  It allows
      for termination of traffic with up to two 802.1Q VLAN tags.
            </t>
            <figure>
                <preamble>The "if-l3-vlan" YANG module has the following structure:</preamble>
                <artwork>
                    <![CDATA[
augment /if:interfaces/if:interface/if-cmn:encapsulation/
  if-cmn:encaps-type:
   +--:(vlan)
      +--rw vlan
         +--rw tags
            +--rw tag* [index]
               +--rw index        uint8
               +--rw dot1q-tag
                  +--rw tag-type    dot1q-tag-type
                  +--rw vlan-id     dot1q-vlan-id
            ]]>
                </artwork>
            </figure>
        </section>
        <section title="Flexible Encapsulation Model">
            <t>The Flexible Encapsulation model is designed to allow for the flexible provisioning of layer 2 services. It provides the capability to classify Ethernet/VLAN
               frames received on an Ethernet trunk interface to sub-interfaces based on the fields available in the layer 2 headers. Once classified to sub-interfaces, it provides the capability to selectively modify fields within the layer 2 headers before the frame is handed off to the appropriate forwarding code for further handling.</t>
            <t>The model supports a common core set of layer 2 header matches based on the 802.1Q tag type and VLAN Ids contained within the header up to a tag stack depth of two tags.</t>
            <t>The model supports flexible rewrites of the layer 2 frame header for data frames as they are processed on the interface. It defines a set of standard tag manipulations that allow for the insertion, removal, or rewrite of one or two 802.1Q VLAN tags. The expectation is that manipulations are generally implemented in a symmetrical fashion, i.e. if a manipulation is performed on ingress traffic on an interface then the reverse manipulation is always performed on egress traffic out of the same interface. However, the model also allows for asymmetrical rewrites, which may be required to implement some forwarding models (such as E-Tree).</t>
            <t>The structure of the model is currently limited to matching or rewriting a maximum of two 802.1Q tags in the frame header but has been designed to be easily extensible to matching/rewriting three or more VLAN tags in future, if required.</t>
            <t>The final aim for the model design is for it to be cleanly extensible to add in additional match and rewrite criteria of the layer 2 header, such as matching on the source or destination MAC address, PCP or DEI fields in the 802.1Q tags, or the EtherType of the frame payload.  Rewrites can also be extended to allow for modification of other fields within the layer 2 frame header.</t>
            <figure>
                <preamble>The "flexible-encapsulation" YANG module has the following structure:</preamble>
                <artwork>
                    <![CDATA[
augment /if:interfaces/if:interface/if-cmn:encapsulation/
  if-cmn:encaps-type:
   +--:(flexible) {flexible-encapsulation-rewrites}?
      +--rw flexible
         +--rw match
         |  +--rw (match-type)
         |     +--:(default)
         |     |  +--rw default?           empty
         |     +--:(untagged)
         |     |  +--rw untagged?          empty
         |     +--:(priority-tagged)
         |     |  +--rw priority-tagged
         |     |     +--rw tag-type?    dot1q:dot1q-tag-type
         |     +--:(vlan-tagged)
         |        +--rw vlan-tagged
         |           +--rw tag* [index]
         |           |  +--rw index        uint8
         |           |  +--rw dot1q-tag
         |           |     +--rw tag-type    dot1q-tag-type
         |           |     +--rw vlan-id     union
         |           +--rw match-exact-tags?   empty
         +--rw rewrite {flexible-rewrites}?
            +--rw (direction)?
               +--:(symmetrical)
               |  +--rw symmetrical
               |     +--rw tag-rewrite {tag-rewrites}?
               |        +--rw pop-tags?    uint8
               |        +--rw push-tags* [index]
               |           +--rw index        uint8
               |           +--rw dot1q-tag
               |              +--rw tag-type    dot1q-tag-type
               |              +--rw vlan-id     dot1q-vlan-id
               +--:(asymmetrical) {asymmetric-rewrites}?
                  +--rw ingress
                  |  +--rw tag-rewrite {tag-rewrites}?
                  |     +--rw pop-tags?    uint8
                  |     +--rw push-tags* [index]
                  |        +--rw index        uint8
                  |        +--rw dot1q-tag
                  |           +--rw tag-type    dot1q-tag-type
                  |           +--rw vlan-id     dot1q-vlan-id
                  +--rw egress
                     +--rw tag-rewrite {tag-rewrites}?
                        +--rw pop-tags?    uint8
                        +--rw push-tags* [index]
                           +--rw index        uint8
                           +--rw dot1q-tag
                              +--rw tag-type    dot1q-tag-type
                              +--rw vlan-id     dot1q-vlan-id
augment /if:interfaces/if:interface:
   +--rw flexible-encapsulation
      +--rw local-traffic-default-encaps
         +--rw tag* [index]
            +--rw index        uint8
            +--rw dot1q-tag
               +--rw tag-type    dot1q-tag-type
               +--rw vlan-id     dot1q-vlan-id
            ]]>
                </artwork>
            </figure>
        </section>
        <section title="L3 Interface VLAN YANG Module">
            <t>
      This YANG module augments the encapsultion container defined in <xref target="I-D.wilton-netmod-intf-ext-yang">Interface Extensions YANG</xref>.
            </t>
            <figure>
                <artwork>
                    <![CDATA[
<CODE BEGINS> file "ietf-if-l3-vlan@2016-07-08.yang"
module ietf-if-l3-vlan {
  namespace "urn:ietf:params:xml:ns:yang:ietf-if-l3-vlan";
  prefix if-l3-vlan;

  import ietf-interfaces {
    prefix if;
  }
  
  import iana-if-type {
    prefix ianaift;
  }
  
  import dot1q-tag-types {
    prefix dot1q-tag;
  }
  
  import ietf-interfaces-common {
    prefix if-cmn;
  }

  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 models L3 VLAN sub-interfaces
    ";

  revision 2016-07-08 {
    description "Latest draft revision";
    
    reference "Internet-Draft draft-wilton-netmod-intf-vlan-yang-02";
  }

  feature l3-vlan-sub-interfaces {
    description
      "This feature indicates that the device supports L3 VLAN
       sub-interfaces";
  }

  /*
   * Add support for the 802.1Q VLAN encapsulation syntax on layer 3
   * terminated VLAN sub-interfaces.
   */
  augment "/if:interfaces/if:interface/if-cmn:encapsulation/" +
          "if-cmn:encaps-type" {  
    when "../../if:type = 'ianaift:l2vlan' and
          ../../if-cmn:transport-layer = 'layer-3'" {
      description "Applies only to VLAN sub-interfaces that are
                   operating at layer 3";
    }
    if-feature l3-vlan-sub-interfaces;
    description "Augment the generic interface encapsulation with an
                 encapsulation for layer 3 VLAN sub-interfaces";

    /*
     * Matches a VLAN, or pair of VLAN Ids to classify traffic
     * into an L3 service.
     */ 
    case vlan {
      container vlan {
        description
        "Match VLAN tagged frames with specific VLAN Ids";
        container tags {
          description "Matches frames tagged with specific VLAN Ids";
          list tag {
            must 'index != 0 or ' +
                 'count(../tag/index) != 2 or ' +
                 'dot1q-tag:dot1q-tag/tag-type = "s-vlan"' {
              error-message
                "When matching two tags, the outer tag must be of
                 S-VLAN tag type";
              description
                "For IEEE 802.1Q interoperability, when matching two
                 tags, it is required that the outer tag is an
                 S-VLAN, and the inner tag is a C-VLAN";
            }

            must 'index != 1 or ' +
                 'count(../tag/index) != 2 or ' +
                 'dot1q-tag:dot1q-tag/tag-type = "c-vlan"' {
              error-message
                "When matching two tags, the inner tag must be of
                 C-VLAN tag type";
              description
                "For IEEE 802.1Q interoperability, when matching two
                 tags, it is required that the outer tag is an
                 S-VLAN, and the inner tag is a C-VLAN";
            }          

            key "index";
            min-elements 1;
            max-elements 2;

            description "The tags to match, with the outermost tag to
                         match with index 0";
            leaf index {
              type uint8 {
                range "0..1";
              }
              
              /*
               * Only allow matching on an inner tag (at index 1), if
               * also matching on the outer tag at the same time.
               */
              must "index = 0 or
                    count(../../tag[index = 0]/index) > 0" {
                error-message
                  "An inner tag can only be matched on when also
                   matching on an outer tag";
                description
                  "Only allow matching on an inner tag, if also
                   matching on the outer tag at the same time";
              }

              description
                "The index into the tag stack, outermost tag first";
            }

            uses dot1q-tag:dot1q-tag;
          }
        }
      }
    }
  }
}
<CODE ENDS>
            ]]>
                </artwork>
            </figure>
        </section>
        <section title="Flexible Encapsulation YANG Module">
            <t>
      This YANG module augments the encapsultion container defined in <xref target="I-D.wilton-netmod-intf-ext-yang">Interface Extensions YANG</xref>.
            </t><t>
      This YANG module also augments the interface container defined in <xref target="RFC7223"/>.
            </t>
            <figure>
                <artwork>
                    <![CDATA[
<CODE BEGINS> file "ietf-flexible-encapsulation@2016-07-08.yang"
module ietf-flexible-encapsulation {
  namespace
    "urn:ietf:params:xml:ns:yang:ietf-flexible-encapsulation";

  prefix flex;

  import ietf-interfaces {
    prefix if;
  }
  
  import ietf-interfaces-common {
    prefix if-cmn;
  }

  import dot1q-tag-types {
    prefix dot1q-tag;
  }

  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 2016-07-08 {
    description "Latest draft revision";
    
    reference
      "Internet-Draft draft-wilton-netmod-intf-vlan-yang-03";
  }

  feature flexible-encapsulation-rewrites {
    description
      "This feature indicates whether the network element supports
       flexible Ethernet encapsulation that allows for matching VLAN
       ranges and performing independent tag manipulations";
  }
  
  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 tag-rewrites {
    description
      "This feature indicates whether the network element supports
       the flexible rewrite functionality specifying flexible 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 priority-tagged {
        description "Match priority tagged Ethernet frames only";
        
        container priority-tagged {
          description "Priority tag match";
          leaf tag-type {
            type dot1q-tag:dot1q-tag-type;
            description "The 802.1Q tag type of matched priority
                         tagged packets";
          }
        }
      }

      case vlan-tagged {
        container vlan-tagged {
          description "Matches VLAN tagged frames";
          list tag {
            must 'index != 0 or ' +
                 'count(../tag/index) != 2 or ' +
                 'dot1q-tag:dot1q-tag/tag-type = "s-vlan"' {
              error-message
                "When matching two tags, the outer tag must be of
                 S-VLAN tag type";
              description
                "For IEEE 802.1Q interoperability, when matching two
                 tags, it is required that the outer tag is an
                 S-VLAN, and the inner tag is a C-VLAN";
            }

            must 'index != 1 or ' +
                 'count(../tag/index) != 2 or ' +
                 'dot1q-tag:dot1q-tag/tag-type = "c-vlan"' {
              error-message
                "When matching two tags, the inner tag must be of
                 C-VLAN tag type";
              description
                "For IEEE 802.1Q interoperability, when matching two
                 tags, it is required that the outer tag is an
                 S-VLAN, and the inner tag is a C-VLAN";
            }          

            key "index";
            min-elements 1;
            max-elements 2;
            description "The tags to match, with the outermost tag to
                         match assigned index 0";
            leaf index {
              type uint8 {
                range "0..1";
              }
                
              must "index = 0 or
                    count(../../tag[index = 0]/index) > 0" {
                error-message "An inner tag can only be matched on
                               when also matching on an outer tag";
                description "Only allow matching on an inner tag, if
                             also matching on the outer tags at the
                             same time";
              }
              description
                "The index into the tag stack, outermost tag first";
            }
            
            uses dot1q-tag:dot1q-tag-ranges-or-any;
          }
          
          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 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)";
    }
    
    list push-tags {
      must 'index != 0 or ' +
           'count(../tag/index) != 2 or ' +
           'dot1q-tag:dot1q-tag/tag-type = "s-vlan"' {
        error-message
          "When pushing two tags, the outer tag must be of
           S-VLAN tag type";
        description
          "For IEEE 802.1Q interoperability, when pushing two
           tags, it is required that the outer tag is an
           S-VLAN, and the inner tag is a C-VLAN";
      }

      must 'index != 1 or ' +
           'count(../tag/index) != 2 or ' +
           'dot1q-tag:dot1q-tag/tag-type = "c-vlan"' {
        error-message
          "When pushing two tags, the inner tag must be of
           C-VLAN tag type";
        description
          "For IEEE 802.1Q interoperability, when pushing two
           tags, it is required that the outer tag is an
           S-VLAN, and the inner tag is a C-VLAN";
      }          

      key "index";
      max-elements 2;
      description "The number of tags to push (or translate if used
                   in conjunction with pop-tags)";
      /*
       * Server should order by increasing index.
       */
      leaf index {
        type uint8 {
          range 0..1;
        }
      
        /*
         * Only allow a push of an inner tag if an outer tag is also
         * being pushed.
         */
        must "index != 0 or
              count(../../push-tags[index = 0]/index) > 0" {
          error-message "An inner tag can only be pushed if an outer
                         tag is also specified";
          description "Only allow a push of an inner tag if an outer
                       tag is also being pushed";
        }
                
        description "The index into the tag stack";
      }
      
      uses dot1q-tag:dot1q-tag;
    }
  }
  
  /*
   * 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 tag-rewrite {
      if-feature tag-rewrites;
      description "Tag rewrite.  Translate operations are expressed
                   as a combination of tag push and pop operations.";
      uses tag-rewrite;
    }
  }
  
  augment "/if:interfaces/if:interface/if-cmn:encapsulation/" +
          "if-cmn:encaps-type" {  
    when "../../if:if-cmn = 'if-cmn:ethSubInterface' and
          ../../if-cmn:transport-layer = 'layer-2'" {
      description "Applies only to Ethernet sub-interfaces that are
                   operating at transport layer 2";
    }
    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 {
      if-feature flexible-encapsulation-rewrites;
      description "Flexible encapsulation and rewrite";
      container flexible {
        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";
              }
            }
          }
        }
      }
    }
  }  
    
  augment "/if:interfaces/if:interface" {
    when "if:type = 'if-cmn:ethSubInterface' and
          if-cmn:transport-layer = 'layer-2'" {
      description "Any L2 Ethernet sub-interfaces";
    }
    description "Add flexible encapsulation configuration for VLAN
                 sub-interfaces";

    /*
     * All flexible encapsulation specific interface configuration
     * (except for the actual encapsulation and rewrite) is contained
     * by a flexible-encapsulation container on the interface.
     */
    container flexible-encapsulation {
      description
        "All per interface flexible encapsulation related fields";
      
      /*
       * For encapsulations that match a range of VLANs (or Any),
       * allow configuration to specify the default VLAN tag values
       * to use for any traffic that is locally sourced from an
       * interface on the device.
       */
      container local-traffic-default-encaps {
        description "The VLAN tags to use by default for locally
                     sourced traffic";
        list tag {
          key "index";
          max-elements 2;
          
          description
            "The VLAN tags to use by locally sourced traffic";
          
          leaf index {
            type uint8 {
              range "0..1";
            }
            
            /*
             * Only allow an inner tag to be specified if an outer
             * tag has also been specified.
             */
            must "index = 0 or
                  count(../../tag[index = 0]/index) > 0" {
              error-message "An inner tag can only be specified if an
                             outer tag has also been specified";
              description "Ensure that an inner tag cannot be
                           specified without an outer tag'";
            }
            
            description "The index into the tag stack, outermost tag
                         assigned index 0";
          }
          
          uses dot1q-tag:dot1q-tag;
        }
      }
    }
  }
}
<CODE ENDS>
            ]]>
                </artwork>
            </figure>
        </section>
        <section title="802.1Q Types YANG Module">
            <t>
      This YANG module has no external imports.
            </t><t>
      The expectation is that the raw 802.1Q VLAN tag fields types will eventually be standardized in IEEE rather than IETF.  They are included here to
      make the model complete.
            </t><t>
      The groupings that can be used to generally identify frames based on the fields in the 802.1Q tag may be defined here or in IEEE depending on where is deemed appropriate after discussion with IEEE 802.1.
            </t>
            <figure>
                <artwork>
                    <![CDATA[
<CODE BEGINS> file "dot1q-tag-types@2016-07-08.yang"
module dot1q-tag-types {
  namespace "urn:ieee:params:xml:ns:yang:dot1q-tag-types";
  prefix dot1q;
  
  import ieee-types {
    prefix ieee-types;
  }
  
  import ieee-dot1q-types {
    prefix dot1q-types;
  }
  
  organization
    "Cisco Systems, Inc.
     Customer Service

     Postal: 170 W Tasman Drive
     San Jose, CA 95134

     Tel: +1 1800 553-NETS
     
     E-mail: cs-yang@cisco.com";

  contact
    "Robert Wilton - rwilton@cisco.com";

  description
    "This module contains a collection of generally useful YANG types
     that are specific to 802.1Q VLANs that can be usefully shared
     between multiple models.
     
     Terms and Acronyms
     
     802.1Q: IEEE 802.1Q VLANs
     
     VLAN (vlan): Virtual Local Area Network
     ";
  
  revision 2016-07-08 {
    description "Latest revision, references IEEE types";
    
    reference "Currently defined in:
               Internet-Draft draft-wilton-netmod-intf-vlan-yang-02,
               but anticipated to be standardized in IEEE 802.1";
  }
  
  typedef PCP {
    type uint8 {
      range "0..7";
    }
    description 
      "Priority Code Point. PCP is a 3-bit field that refers to the
       class of service applied to an 802.1Q VLAN tagged frame.  The
       field specifies a priority value between 0 and 7, these values
       can be used by quality of service (QoS) to prioritize
       different classes of traffic.";
    reference "IEEE 802.1Q (2014)";
  }
  
  /*
   * Defines the supported IEEE 802.1Q types that can be used for
   * VLAN tag matching.
   */
  identity dot1q-tag-vlan-type {
    description "Base identity from which all 802.1Q VLAN tag types
                 are derived from";
  }
  
  identity c-vlan {
    base dot1q-tag-vlan-type;
    description
      "An 802.1Q Customer-VLAN tag, normally using the 0x8100
       Ethertype";
  }
  
  identity s-vlan {
    base dot1q-tag-vlan-type;
    description
      "An 802.1Q Service-VLAN tag, using the 0x88a8 Ethertype
       originally introduced in 802.1ad, and incorporated into
       802.1Q (2011)";
  }
   
  typedef dot1q-tag-type {
    type identityref {
      base "dot1q-tag-vlan-type";
    }
    description "Identifies a specific 802.1Q tag type";
    reference "IEEE 802.1Q (2014)";
  }
  
  
  /*
   * A grouping which represents an 802.1Q VLAN tag, matching both
   * the tag Ethertype and a single VLAN Id.  The PCP and DEI fields
   * in the 802.1Q tag are ignored for tag matching purposes.
   */
  grouping dot1q-tag {
    description "Grouping to allow configuration to identify a single
                 802.1Q VLAN tag";
    container dot1q-tag {
      description "Identifies an 802.1Q VLAN tag with an explicit
                   tag-type and a single VLAN Id";
      leaf tag-type {
        type dot1q-tag-type;
        mandatory true;
        description "VLAN tag type";
      }
      leaf vlan-id {
        type ieee-types:vlanid;
        mandatory true;
        description "VLAN Id";
      }
    }
  }
  
  /*
   * A grouping which represents an 802.1Q VLAN tag, matching both
   * the tag Ethertype and a single VLAN Id or "any" to match on any
   * VLAN Id.  The PCP and DEI fields in the 802.1Q tag are ignored
   * for tag matching purposes.
   */
  grouping dot1q-tag-or-any {
    description "Grouping to allow configuration to identify a single
                 802.1Q VLAN tag or the 'any' value to match any VLAN
                 Id not matched by a more specific VLAN Id match";
    container dot1q-tag {
      description "Identifies an 802.1Q VLAN tag with an explicit
                   tag-type and a single VLAN Id, or 'any' VLAN Id";
      leaf tag-type {
        type dot1q-tag-type;
        mandatory true;
        description "VLAN tag type";
      }
      leaf vlan-id {
        type union {
          type ieee-types:vlanid;
          type enumeration {
            enum "any" {
              value 4096;
              description
                "Matches 'any' VLAN tag in the range 1 to 4094 that
                 is not matched by a more specific VLAN Id match";
            }
          }
        }
        mandatory true;
        description "VLAN Id or any";
      }
    }
  }

  /*
   * A grouping which represents an 802.1Q tag that matches a range
   * of VLAN Ids.  The PCP and DEI fields in the 802.1Q tag are
   * ignored for tag matching purposes.
   */
  grouping dot1q-tag-ranges {
    description "Grouping to allow configuration to identify an
                 802.1Q VLAN tag that matches any VLAN Id within a
                 set of non overlapping VLAN Id ranges";
    container dot1q-tag {
      description "Identifies an 802.1Q VLAN tag with an explicit
                   tag-type and and a range of VLAN Ids";
      leaf tag-type {
        type dot1q-tag-type;
        mandatory true;
        description "VLAN tag type";
      }
      leaf vlan-ids {
        type dot1q-types:vid-range;
        mandatory true;
        description "VLAN Ids";
      }
    }
  }
  
  /*
   * A grouping which represents an 802.1Q VLAN tag, matching both
   * the tag Ethertype and a single VLAN Id, ordered list of ranges,
   * or "any" to match on any VLAN Id.  The PCP and DEI fields in the
   * 802.1Q tag are ignored for tag matching purposes.
   */
  grouping dot1q-tag-ranges-or-any {
    description "Grouping to allow configuration to identify an
                 802.1Q VLAN tag that matches any specific VLAN Id
                 within a set of non overlapping VLAN Id ranges, or
                 the 'any' value to match any VLAN Id";
    container dot1q-tag {
      description "Identifies an 802.1Q VLAN tag with an explicit
                   tag-type, an ordered list of VLAN Id ranges, or
                   'any' VLAN Id";
      leaf tag-type {
        type dot1q-tag-type;
        mandatory true;
        description "VLAN tag type";
      }
      leaf vlan-id {
        type union {
          type dot1q-types:vid-range;
          type enumeration {
            enum "any" {
              description "Matches 'any' VLAN tag in the range 1 to
                           4094";
            }
          }
        }
        mandatory true;
        description "VLAN Ids or any";
      }
    }
  }
}
<CODE ENDS>
            ]]>
                </artwork>
            </figure>
        </section>
        <!-- This PI places the pagebreak correctly (before the section title) in the text output. -->
        <?rfc needLines="8" ?>
        <section anchor="Acknowledgements" title="Acknowledgements">
            <t>The authors would particularly like to thank Glenn Parsons and Dan Romascanu for their help trying to progress this draft.</t>
            <t>The authors would also like to thank Eric Gray, Marc Holness, Neil Ketley, William Lupton, John Messenger, Glenn Parsons, Ludwig Pauwels, and members of the IEEE 802.1 WG for their helpful feedback on this draft.</t>
        </section>
        <section title="ChangeLog">
              <section title="Version -03">
                <t>
                  <list style="symbols">
                    <t>Incorporates feedback received from presenting to the IEEE 802.1 WG.</t>
                    <t>Updates the modules for double tag matches/rewrites to restrict the outer tag type to S-VLAN and inner tag type to C-VLAN.</t>
                    <t>Updates the introduction to indicate primary use case is for IETF forwarding protocols.</t>
                    <t>Updates the objectives to make IEEE 802.1Q bridge interoperability a key objective.</t>
                  </list>
                </t>                
              </section>
        </section>
        <!-- Possibly a 'Contributors' section ... -->
        <section anchor="IANA" title="IANA Considerations">
            <t>This document defines several new YANG module and the authors politely request that IANA assigns
         unique names to the YANG module files contained within this draft, and also appropriate
         URIs in the "IETF XML Registry".</t>
            <!--      <t>All drafts are required to have an IANA considerations section (see
      <xref target="I-D.narten-iana-considerations-rfc2434bis">the update of
      RFC 2434</xref> for a guide). If the draft does not require IANA to do
      anything, the section contains an explicit statement that this is the
      case (as above). If there are no requirements for IANA, the section will
      be removed during conversion into an RFC by the RFC Editor.</t>-->
        </section>
        <section anchor="Security" title="Security Considerations">
            <t>The YANG module defined in this memo is designed to be accessed via
         the NETCONF protocol <xref target="RFC6241">RFC 6241</xref>. The
         lowest NETCONF layer is the secure transport layer and the mandatory
         to implement secure transport is SSH <xref target="RFC6242">RFC 6242</xref>.
         The NETCONF access control model <xref target="RFC6536">RFC 6536</xref>
         provides the means to restrict access for particular NETCONF users
         to a pre-configured subset of all available NETCONF protocol
         operations and content.</t><t>There are a number of data nodes defined in this YANG module which
         are writable/creatable/deletable (i.e. config true, which is the
         default).  These data nodes may be considered sensitive or vulnerable
         in some network environments.  Write operations (e.g. edit-config)
         to these data nodes without proper protection can have a negative
         effect on network operations.  These are the subtrees and data nodes
         and their sensitivity/vulnerability:</t>
            <section title="if-l3-vlan.yang">
                <t>The nodes in the if-l3-vlan YANG module are concerned with matching particular frames received on the network
         device to connect them to a layer 3 forwarding instance, and as such adding/modifying/deleting these nodes has a high
         risk of causing traffic to be lost because it is not being classified
         correctly, or is being classified to a separate sub-interface. The
         nodes, all under the subtree /interfaces/interface/encapsulation/vlan, that
         are sensitive to this are:
                    <list style="symbols">
                        <t>tags</t><t>tags/index</t><t>tags/index/tag-type</t><t>tags/index/vlan-id</t>
                    </list>
                </t>
            </section>
            <section title="flexible-encapsulation.yang">
                <t>There are many nodes in the flexible-encapsulation YANG module that
         are concerned with matching particular frames received on the network
         device, and as such adding/modifying/deleting these nodes has a high
         risk of causing traffic to be lost because it is not being classified
         correctly, or is being classified to a separate sub-interface. The
         nodes, all under the subtree /interfaces/interface/encapsulation/flexible/match, that
         are sensitive to this are:
                    <list style="symbols">
                        <t>default</t><t>untagged</t><t>priority-tagged</t><t>priority-tagged/tag-type</t><t>vlan-tagged</t><t>vlan-tagged/index</t><t>vlan-tagged/index/dot1q-tag/vlan-type</t><t>vlan-tagged/index/dot1q-tag/vlan-id</t><t>vlan-tagged/match-exact-tags</t>
                    </list>
                </t><t>There are also many modes in the flexible-encapsulation YANG module that
         are concerned with rewriting the fields in the L2 header for particular frames received on the network
         device, and as such adding/modifying/deleting these nodes has a high
         risk of causing traffic to be dropped or incorrectly processed on peer network devices, or it could
         cause layer 2 tunnels to go down due to a mismatch in negotiated MTU. The
         nodes, all under the subtree /interfaces/interface/encapsulation/flexible/rewrite, that
         are sensitive to this are:
                    <list style="symbols">
                        <t>symmetrical/tag-rewrite/pop-tags</t><t>symmetrical/tag-rewrite/push-tags</t><t>symmetrical/tag-rewrite/push-tags/index</t><t>symmetrical/tag-rewrite/push-tags/dot1q-tag/tag-type</t><t>symmetrical/tag-rewrite/push-tags/dot1q-tag/vlan-id</t><t>asymmetrical/ingress/tag-rewrite/pop-tags</t><t>asymmetrical/ingress/tag-rewrite/push-tags</t><t>asymmetrical/ingress/tag-rewrite/push-tags/index</t><t>asymmetrical/ingress/tag-rewrite/push-tags/dot1q-tag/tag-type</t><t>asymmetrical/ingress/tag-rewrite/push-tags/dot1q-tag/vlan-id</t><t>asymmetrical/egress/tag-rewrite/pop-tags</t><t>asymmetrical/egress/tag-rewrite/push-tags</t><t>asymmetrical/egress/tag-rewrite/push-tags/index</t><t>asymmetrical/egress/tag-rewrite/push-tags/dot1q-tag/tag-type</t><t>asymmetrical/egress/tag-rewrite/push-tags/dot1q-tag/vlan-id</t>
                    </list>
                </t><t>Nodes in the flexible-encapsulation YANG module that are concerned with the VLAN tags
         to use for traffic sourced from the network element could cause protocol sessions (such as CFM)
         to fail if they are added, modified or deleted. The
         nodes, all under the subtree /interfaces/interface/flexible-encapsulation/local-traffic-default-encaps that are sensitive to this are:
                    <list style="symbols">
                        <t>tag</t><t>tag/index</t><t>tag/dot1q-tag/tag-type</t><t>tag/dot1q-tag/vlan-id</t>
                    </list>
                </t>
            </section>
        </section>
    </middle>
    <!--  *****BACK MATTER ***** -->
    <back>
        <!-- References split into informative and normative -->
        <!-- There are 2 ways to insert reference entries from the citation libraries:
     1. define an ENTITY at the top, and use "ampersand character"RFC2629; here (as shown)
     2. simply use a PI "less than character"?rfc include="reference.RFC.2119.xml"?> here
        (for I-Ds: include="reference.I-D.narten-iana-considerations-rfc2434bis.xml")

     Both are cited textually in the same manner: by using xref elements.
     If you use the PI option, xml2rfc will, by default, try to find included files in the same
     directory as the including file. You can also define the XML_LIBRARY environment variable
     with a value containing a set of directories to search.  These can be either in the local
     filing system or remote ones accessed by http (http://domain/dir/... ).-->
        <references title="Normative References">
            <!--?rfc include="http://xml.resource.org/public/rfc/bibxml/reference.RFC.2119.xml"?-->

      &RFC6020;
      &RFC2119;
      &RFC7223;
      &RFC7224;
            <?rfc include="reference.I-D.wilton-netmod-intf-ext-yang.xml"?>

            <!--      <reference anchor="min_ref">
        <!- - the following is the minimum to make xml2rfc happy - ->

        <front>
          <title>Minimal Reference</title>

          <author initials="authInitials" surname="authSurName">
            <organization></organization>
          </author>

          <date year="2006" />
        </front>
      </reference>-->
        </references>
        <references title="Informative References">
            <!-- Here we use entities that we defined at the beginning. -->
            <!-- &RFC2629;
      &RFC3552; -->
      &RFC6241;
      &RFC6242;
      &RFC6536;
      <?rfc include="reference.RFC.2460.xml"?>
      <?rfc include="reference.RFC.4448.xml"?>
      <?rfc include="reference.RFC.4761.xml"?>
      <?rfc include="reference.RFC.4762.xml"?>

            <!--&I-D.narten-iana-considerations-rfc2434bis;-->

            <!-- A reference written by by an organization not a person. -->

            <!--      <reference anchor="DOMINATION"
                 target="http://www.example.com/dominator.html">
        <front>
          <title>Ultimate Plan for Taking Over the World</title>

          <author>
            <organization>Mad Dominators, Inc.</organization>
          </author>

          <date year="1984" />
        </front>
      </reference>-->
        </references>
        <section title="Comparison with the IEEE 802.1Q Configuration Model" anchor="comparison">
            <t>In addition to the sub-interface based YANG model proposed here, the IEEE 802.1Q working group is also developing a YANG model for the configuration of 802.1Q VLANs.  This raises the valid question as to whether the models overlap and whether it is necessary or beneficial to have two different models for superficially similar constructs.  This section aims to answer that question by summarizing and comparing the two models.</t>
            <section title="Sub-interface based configuration model overview">
                <t>The key features of the sub-interface based configuration model can be summarized as:
                    <list style="symbols">
                        <t>The model is primarily designed to enable layer 2 and layer 3 services on Ethernet interfaces that can be defined in a very flexible way to meet the varied requirements of service providers.</t><t>Traffic is classified from an Ethernet-like interface to sub-interfaces based on fields in the layer 2 header. This is often based on VLAN Ids contained in the frame, but the model is extensible to other arbitrary fields in the frame header.</t><t>Sub-interfaces are just a type of if:interface and hence support any feature configuration YANG models that can be applied generally to interfaces. For example, QoS or ACL models that reference if:interface can be applied to the sub-interfaces, or the sub-interface can be used as an Access Circuit in L2VPN or L3VPN models that reference if:interface.</t><t>In the sub-interface based configuration model, the classification of traffic arriving on an interface to a given sub-interface, based on fields in the layer 2 header, is completely independent of how the traffic is forwarded. The sub-interface can be referenced (via references to if:interface) by other models that specify how traffic is forwarded; thus sub-interfaces can support multiple different forwarding paradigms, including but not limited to: layer 3 (IPv4/IPv6), layer 2 pseudowires (over MPLS or IP), VPLS instances, EVPN instance.</t><t>The model is flexible in the scope of the VLAN Identifier space.  I.e. by default VLAN Ids can be scoped locally to a single Ethernet-like trunk interface, but the scope is determined by the forwarding paradigm that is used.</t>
                    </list>
                </t>
            </section>
            <section title="IEEE 802.1Q Bridge Configuration Model Overview">
                <t>The key features of the IEEE 802.1Q bridge configuration model can be summarized as:
                    <list style="symbols">
                        <t>Each VLAN bridge component has a set of Ethernet interfaces that are members of that bridge. Sub-interfaces are not used, nor required in the 802.1Q bridge model.</t><t>Within a VLAN bridge component, the VLAN tag in the packet is used, along with the destination MAC address, to determine how to forward the packet. Other forwarding paradigms are not supported by the 802.1Q model.</t><t>Classification of traffic to a VLAN bridge component is based only on the Ethernet interface that it arrived on.</t><t>VLAN Identifiers are scoped to a VLAN bridge component. Often devices only support a single bridge component and hence VLANs are scoped globally within the device.</t><t>Feature configuration is specified in the context of the bridge, or particular VLANs on a bridge.</t>
                    </list>
                </t>
            </section>
            <section title="Possible Overlap Between the Two Models">
                <t>Both models can be used for configuring similar basic layer 2 forwarding topologies. The 802.1Q bridge configuration model is optimised for configuring Virtual LANs that span across enterprises and data centers.</t><t>The sub-interface model can also be used for configuring equivalent Virtual LAN networks that span across enterprises and data centers, but often requires more configuration to be able to configure the equivalent constructs to the 802.1Q bridge model.</t><t>The sub-interface model really excels when implementing flexible L2 and L3 services, where those services may be handled on the same physical interface, and where the VLAN Identifier is being solely used to identify the customer or service that is being provided rather than a Virtual LAN.  The sub-interface model provides more flexibility as to how traffic can be classified, how features can be applied to traffic streams, and how the traffic is to be forwarded.</t><t>Conversely, the 802.1Q bridge model can also be use to implement L2 services in some scenarios, but only if the forwarding paradigm being used to implement the service is the native Ethernet forwarding specified in 802.1Q - other forwarding paradigms such as pseudowires or VPLS are not supported. The 802.1Q bridge model does not implement L3 services at all, although this can be partly mitigated by using a virtual L3 interface construct that is a separate logical Ethernet-like interface which is a member of the bridge.</t><t>In conclusion, it is valid for both of these models to exist since they have different deployment scenarios for which they are optimized.  Devices may choose which of the models (or both) to implement depending on what functionality the device is being designed for.</t>
            </section>
        </section>
        <!--    <section anchor="app-additional" title="Additional Stuff">
      <t>This becomes an Appendix.</t>
    </section>-->
        <!-- Change Log

v00 2015-03-02  RGW   Initial version
                      -->
    </back>
</rfc>
