<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<!-- This template is for creating an Internet Draft using xml2rfc,
     which is available here: http://xml.resource.org. -->
<?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 xmlns:xi="http://www.w3.org/2001/XInclude" category="std" consensus="true" docName="draft-ietf-netmod-sub-intf-vlan-model-17" ipr="trust200902" obsoletes="" updates="" submissionType="IETF" xml:lang="en" tocInclude="true" tocDepth="4" symRefs="true" sortRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.15.0 -->
  <!-- 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>
    <seriesInfo name="Internet-Draft" value="draft-ietf-netmod-sub-intf-vlan-model-17"/>
    <!-- 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>
      </address>
    </author>
    <author fullname="Scott Mansfield" initials="S" role="editor" surname="Mansfield">
      <organization>Ericsson</organization>
      <address>
        <email>scott.mansfield@ericsson.com</email>
      </address>
    </author>
    <!-- uri and facsimile elements may also be added -->
      <date year="2025"/>
    <!-- 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 configuration of Layer 3 and Layer 2
        sub-interfaces (e.g. L2VPN attachment circuits) that can interoperate
        with IETF based forwarding protocols; such as IP and L3VPN services; or
        L2VPN services like VPWS, VPLS, and EVPN.  The sub-interfaces also
        interoperate with VLAN tagged traffic originating from an IEEE 802.1Q
        compliant bridge.</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>
      <t>The YANG data models in this document conforms to the Network
	Management Datastore Architecture (NMDA) defined in RFC 8342.</t>
    </abstract>
  </front>
  <middle>
    <section numbered="true" toc="default">
      <name>Introduction</name>
      <t>This document defines two YANG 1.1 modules <xref target="RFC7950" format="default"></xref> that
        augment the encapsulation choice YANG element defined in <xref target="I-D.ietf-netmod-intf-ext-yang" format="default">Interface Extensions YANG</xref>
        and the generic interfaces data model defined in <xref target="RFC8343" format="default"/>.  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, for example, IPv6 <xref target="RFC8200" format="default"/>, Ethernet Pseudo Wires
        <xref target="RFC4448" format="default"/> and VPLS <xref target="RFC4761" format="default"/> <xref target="RFC4762" format="default"/>, when configured via appropriate YANG data models <xref target="RFC8344" format="default"/>, to
        interoperate 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 in the 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" format="default"/>.</t>
      <t>In summary, the YANG modules defined in this internet draft are:
      </t>
      <ul empty="true" spacing="normal">
        <li>ietf-if-vlan-encapsulation.yang - Defines the model for
            basic classification of VLAN tagged traffic, normally to
            L3 packet forwarding services</li>
        <li>ietf-if-flexible-encapsulation.yang - Defines the model
            for flexible classification of Ethernet/VLAN traffic,
            normally to L2 frame forwarding services</li>
      </ul>
      <!--      <section title="Requirements Language">

      </section>-->
        <section numbered="true" toc="default">
        <name>Terminology</name>
        <t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
          "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and
	  "OPTIONAL" in this document are to be interpreted as described in BCP 14
          <xref target="RFC2119" format="default"/> <xref target="RFC8174" format="default"/>
          when, and only when, they appear in all capitals, as shown here.</t>
        <t>The term 'sub-interface' is defined in section 2.6 of <xref target="I-D.ietf-netmod-intf-ext-yang" format="default">Interface Extensions
          YANG</xref>.</t>
        <section numbered="true" toc="default">
        <name>Note to RFC Editor</name>
        <t> This document uses two placeholder values throughout the document.  Please replace them as follows and remove this note before publication.</t>
        <t> RFC AAAA, where AAAA is the number assigned to I-D.ietf-netmod-intf-ext-yang at the time of its publication.</t>
        <t> RFC BBBB, where BBBB is the number assigned to this document at the time of publication. </t>
        </section>
      </section>
      <section numbered="true" toc="default">
        <name>Tree Diagrams</name>
        <t>Tree diagrams used in this document follow the notation defined in
	   <xref target="RFC8340" format="default"/>.</t>
      </section>
      <section anchor="prefixes-in-data-node-names">
        <name>Prefixes in Data Node Names</name>
        <t>In this document, names of data nodes and other data model objects are prefixed using the standard prefix associated with the corresponding YANG imported modules, as shown in <xref target="tab-prefix"/>.</t>
            <table anchor="tab-prefix">
	      <name>Prefixes for imported YANG modules</name>
	      <thead>
	        <tr>
	          <th align="left">Prefix</th>
		  <th align="left">YANG Module</th>
		  <th align="left">Reference</th>
		</tr>
	      </thead>
	      <tbody>
	        <tr>
	          <td align="left">if-vlan</td>
		  <td align="left">ietf-if-vlan-encapsulation</td>
		  <td align="left">This document</td>
	        </tr>
	        <tr>
	          <td align="left">if-flex</td>
		  <td align="left">ietf-if-flexible-encapsulation</td>
		  <td align="left">This document</td>
	        </tr>
	        <tr>
	          <td align="left">if-ext</td>
		  <td align="left">ietf-if-extensions</td>
		  <td align="left"><xref target="I-D.ietf-netmod-intf-ext-yang"/></td>
	        </tr>
	        <tr>
	          <td align="left">if</td>
		  <td align="left">ietf-interfaces</td>
		  <td align="left"><xref target="RFC8343"/></td>
	        </tr>
	        <tr>
	          <td align="left">ianaift</td>
		  <td align="left">iana-if-type</td>
		  <td align="left"><xref target="RFC7224"/></td>
	        </tr>
	        <tr>
	          <td align="left">dot1q-types</td>
		  <td align="left">ieee802-dot1q-types</td>
		  <td align="left"><xref target="IEEE_802.1Q_2022"/></td>
	        </tr>
	      </tbody>
	    </table>
	</section>
    </section>
    <section numbered="true" toc="default">
      <name>Objectives</name>
      <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 compliant bridges.</t>
      <t>A secondary aim is for the modules to be structured in such a way that
       they can be cleanly extended in the future.</t>
      <section numbered="true" toc="default">
        <name>Interoperability with IEEE 802.1Q compliant bridges</name>
        <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>
    <section numbered="true" toc="default">
      <name>Interface VLAN Encapsulation Model</name>
      <t>The Interface VLAN encapsulation model provides appropriate leaves for
       termination of an 802.1Q VLAN tagged segment to a sub-interface (or
       interface) based L3 service, such as IP.  It allows for termination of
       traffic with one or two 802.1Q VLAN tags.</t>
      <t>The L3 service must be configured via a separate YANG data model,
       e.g., <xref target="RFC8344" format="default"/>.  A short example of configuring
       802.1Q VLAN sub-interfaces with IP using YANG is provided in <xref target="example1" format="default"/>.</t>
      <t keepWithNext="true">The "ietf-if-vlan-encapsulation" YANG module has the following structure:</t>
      <artwork name="" type="" align="left" alt=""><![CDATA[
module: ietf-if-vlan-encapsulation

  augment /if:interfaces/if:interface/if-ext:encapsulation
            /if-ext:encaps-type:
    +--:(dot1q-vlan)
       +--rw dot1q-vlan
          +--rw outer-tag
          |  +--rw tag-type    dot1q-tag-type
          |  +--rw vlan-id     vlanid
          +--rw second-tag!
             +--rw tag-type    dot1q-tag-type
             +--rw vlan-id     vlanid
          ]]></artwork>
    </section>
    <section numbered="true" toc="default">
      <name>Interface Flexible Encapsulation Model</name>
      <t>The Interface Flexible Encapsulation model is designed to allow for
        the flexible provisioning of layer 2 services. It provides the
        capability to classify and demultiplex 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
        frame header before the frame is handed off to the appropriate
        forwarding code for further handling.  The forwarding instance, e.g.,
        L2VPN, VPLS, etc., is configured using a separate YANG configuration
        model defined elsewhere.</t>
      <artwork name="" type="" align="left" alt=""><![CDATA[
+-----------+------------+-----------+------------+---------+
|Destination|Source MAC  |S-Tag      |C-Tag       |EtherType|
|MAC (6B)   |Address (6B)|- Outer Tag|- Second Tag|or Length|
+-----------+------------+-----------+------------+---------+
|Payload (46-1500B)                                         |
+-----------------------------------------------------------+
          ]]></artwork>
      <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.  When there are two tags, there is an outer tag
        and a second-tag (inner). </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 model also allows a flexible encapsulation and rewrite to be
        configured directly on an Ethernet or LAG interface without configuring
        separate child sub-interfaces.  Ingress frames that do not match the
        encapsulation are dropped and counted against the "in-discard-unknown-encaps"
        counter specified in <xref target="I-D.ietf-netmod-intf-ext-yang" format="default"/>.
        Egress frames MUST conform to the encapsulation. </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>
      <t>In summary, the model provides a binding that defines how services are
         bound to an interface or sub-interface providing a mechanism to pass
         traffic to/from interface/sub-interface to a service. </t>
      <t>A short example of configuring 802.1Q VLAN sub-interfaces with L2VPN
        using YANG is provided in <xref target="example2" format="default"/>.</t>
      <t keepWithNext="true">The "ietf-if-flexible-encapsulation" YANG module
         has the following structure:</t>
      <artwork name="" type="" align="left" alt=""><![CDATA[
module: ietf-if-flexible-encapsulation

  augment /if:interfaces/if:interface/if-ext:encapsulation
            /if-ext:encaps-type:
    +--:(flexible)
       +--rw flexible
          +--rw match
          |  +--rw (match-type)
          |     +--:(default)
          |     |  +--rw default?                 empty
          |     +--:(untagged)
          |     |  +--rw untagged?                empty
          |     +--:(dot1q-priority-tagged)
          |     |  +--rw dot1q-priority-tagged
          |     |     +--rw tag-type    dot1q-types:dot1q-tag-type
          |     +--:(dot1q-vlan-tagged)
          |        +--rw dot1q-vlan-tagged
          |           +--rw outer-tag
          |           |  +--rw tag-type    dot1q-tag-type
          |           |  +--rw vlan-id     union
          |           +--rw second-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 dot1q-tag-rewrite {dot1q-tag-rewrites}?
          |     |        +--rw pop-tags?    uint8
          |     |        +--rw push-tags!
          |     |           +--rw outer-tag
          |     |           |  +--rw tag-type    dot1q-tag-type
          |     |           |  +--rw vlan-id     vlanid
          |     |           +--rw second-tag!
          |     |              +--rw tag-type    dot1q-tag-type
          |     |              +--rw vlan-id     vlanid
          |     +--:(asymmetrical) {asymmetric-rewrites}?
          |        +--rw ingress
          |        |  +--rw dot1q-tag-rewrite {dot1q-tag-rewrites}?
          |        |     +--rw pop-tags?    uint8
          |        |     +--rw push-tags!
          |        |        +--rw outer-tag
          |        |        |  +--rw tag-type    dot1q-tag-type
          |        |        |  +--rw vlan-id     vlanid
          |        |        +--rw second-tag!
          |        |           +--rw tag-type    dot1q-tag-type
          |        |           +--rw vlan-id     vlanid
          |        +--rw egress
          |           +--rw dot1q-tag-rewrite {dot1q-tag-rewrites}?
          |              +--rw pop-tags?    uint8
          |              +--rw push-tags!
          |                 +--rw outer-tag
          |                 |  +--rw tag-type    dot1q-tag-type
          |                 |  +--rw vlan-id     vlanid
          |                 +--rw second-tag!
          |                    +--rw tag-type    dot1q-tag-type
          |                    +--rw vlan-id     vlanid
          +--rw local-traffic-default-encaps!
             +--rw outer-tag
             |  +--rw tag-type    dot1q-tag-type
             |  +--rw vlan-id     vlanid
             +--rw second-tag!
                +--rw tag-type    dot1q-tag-type
                +--rw vlan-id     vlanid
          ]]></artwork>
    </section>
    <section numbered="true" toc="default">
      <name>VLAN Encapsulation YANG Module</name>
      <t>This YANG module augments the 'encapsulation' container
       defined in <xref target="I-D.ietf-netmod-intf-ext-yang" format="default">ietf-if-extensions.yang</xref>.
       It also contains references to <xref target="RFC8343" format="default"/>,
       <xref target="RFC7224" format="default"/>, and <xref target="IEEE_802.1Q_2022" format="default"/>.</t>
      <sourcecode name="ietf-if-vlan-encapsulation@2025-09-03.yang" type="yang" markers="true"><![CDATA[
module ietf-if-vlan-encapsulation {
  yang-version 1.1;
  namespace "urn:ietf:params:xml:ns:yang:ietf-if-vlan-encapsulation";
  prefix if-vlan;

  import ietf-interfaces {
    prefix if;
    reference
      "RFC 8343: A YANG Data Model For Interface Management";
  }
  import iana-if-type {
    prefix ianaift;
    reference
      "RFC 7224: IANA Interface Type YANG Module";
  }
  import ieee802-dot1q-types {
    prefix dot1q-types;
    reference
      "IEEE Std 802.1Q Bridges and Bridged Networks:
       IEEE Std 802.1Q-2022, IEEE Std 802.1Qcz-2023,
       IEEE Std 802.1Qcw-2023, IEEE Std 802.1Qcj-2023";
  }
  import ietf-if-extensions {
    prefix if-ext;
    reference
      "RFC AAAA: Common Interface Extension YANG Data Models";
  }

  organization
    "IETF NETMOD (NETCONF Data Modeling Language) Working Group";
  contact
    "WG Web:   <http://datatracker.ietf.org/wg/netmod/>
     WG List:  <mailto:netmod@ietf.org>

     Editors:
      Robert Wilton <mailto:rwilton@cisco.com>
      Scott Mansfield <mailto:scott.mansfield@ericsson.com>";
  description
    "This YANG module models configuration to classify IEEE 802.1Q
     VLAN tagged Ethernet traffic by exactly matching the tag type
     and VLAN identifier of one or two 802.1Q VLAN tags in the frame.

     Copyright (c) 2025 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 Revised BSD License set
     forth in Section 4.c of the IETF Trust's Legal Provisions
     Relating to IETF Documents
     (https://trustee.ietf.org/license-info).

     This version of this YANG module is part of RFC BBBB
     (https://www.rfc-editor.org/info/rfcBBBB); see the RFC itself
     for full legal notices.

     The key words 'MUST', 'MUST NOT', 'REQUIRED', 'SHALL', 'SHALL
     NOT', 'SHOULD', 'SHOULD NOT', 'RECOMMENDED', 'NOT RECOMMENDED',
     'MAY', and 'OPTIONAL' in this document are to be interpreted as
     described in BCP 14 (RFC 2119) (RFC 8174) when, and only when,
     they appear in all capitals, as shown here.";

  revision 2025-09-03 {
    description
      "Initial version of the module";
    reference
      "RFC BBBB: Sub-interface VLAN YANG Data Models";
  }

  augment "/if:interfaces/if:interface/if-ext:encapsulation/"
        + "if-ext: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, 'ianaift:l2vlan')" {
      description
        "Applies only to Ethernet-like interfaces and
         sub-interfaces.";
    }
    description
      "Augment the generic interface encapsulation with basic 802.1Q
       VLAN tag classifications";
    case dot1q-vlan {
      container dot1q-vlan {
        description
          "Classifies 802.1Q VLAN tagged Ethernet frames to a
           sub-interface (or interface) by exactly matching the
           number of tags, tag type(s) and VLAN identifier(s).

           Only frames matching the classification configured on a
           sub-interface/interface are processed on that
           sub-interface/interface.

           Frames that do not match any sub-interface are processed
           directly on the parent interface, if it is associated with
           a forwarding instance, otherwise they are dropped.";
        container outer-tag {
          must 'tag-type = "dot1q-types:s-vlan" or '
             + 'tag-type = "dot1q-types:c-vlan"' {
            error-message
              "Only C-VLAN and S-VLAN tags can be matched.";
            description
              "For IEEE 802.1Q interoperability, only C-VLAN and
               S-VLAN tags are matched.";
          }
          description
            "Specifies the VLAN tag values to match against the
             outermost (first) 802.1Q VLAN tag in 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 matching two 802.1Q VLAN tags, the outermost
               (first) tag in the frame MUST be specified and be of
               S-VLAN type and the second tag in the frame must be of
               C-VLAN tag type.";
            description
              "For IEEE 802.1Q interoperability, when matching two
               802.1Q VLAN tags, it is REQUIRED that the outermost
               tag exists and is an S-VLAN, and the second tag is a
               C-VLAN.";
          }
          presence "Classify frames that have two 802.1Q VLAN tags.";
          description
            "Specifies the VLAN tag values to match against the
             second outermost 802.1Q VLAN tag in the frame.";
          uses dot1q-types:dot1q-tag-classifier-grouping;
        }
      }
    }
  }
}
]]></sourcecode>
    </section>
    <section numbered="true" toc="default">
      <name>Flexible Encapsulation YANG Module</name>
      <t>This YANG module augments the 'encapsulation' container
       defined in <xref target="I-D.ietf-netmod-intf-ext-yang" format="default">ietf-if-extensions.yang</xref>.
       This YANG module also augments the 'interface' list entry
       defined in <xref target="RFC8343" format="default"/>.  It also contains
       references to <xref target="RFC7224" format="default"/>, and <xref target="IEEE_802.1Q_2022" format="default"/>.</t>
      <sourcecode name="ietf-if-flexible-encapsulation@2025-09-03.yang" type="yang" markers="true"><![CDATA[
module ietf-if-flexible-encapsulation {
  yang-version 1.1;
  namespace
    "urn:ietf:params:xml:ns:yang:ietf-if-flexible-encapsulation";
  prefix if-flex;

  import ietf-interfaces {
    prefix if;
    reference
      "RFC 8343: A YANG Data Model For Interface Management";
  }
  import iana-if-type {
    prefix ianaift;
    reference
      "RFC 7224: IANA Interface Type YANG Module";
  }
  import ieee802-dot1q-types {
    prefix dot1q-types;
    reference
      "IEEE Std 802.1Q Bridges and Bridged Networks:
       IEEE Std 802.1Q-2022, IEEE Std 802.1Qcz-2023,
       IEEE Std 802.1Qcw-2023, IEEE Std 802.1Qcj-2023";
  }
  import ietf-if-extensions {
    prefix if-ext;
    reference
      "RFC AAAA: Common Interface Extension YANG Data Models";
  }

  organization
    "IETF NETMOD (NETCONF Data Modeling Language) Working Group";
  contact
    "WG Web:   <http://datatracker.ietf.org/wg/netmod/>
     WG List:  <mailto:netmod@ietf.org>

     Editors:
      Robert Wilton <mailto:rwilton@cisco.com>
      Scott Mansfield <mailto:scott.mansfield@ericsson.com>";
  description
    "This YANG module describes interface configuration for flexible
     classification and rewrites of IEEE 802.1Q VLAN tagged Ethernet
     traffic.

     Copyright (c) 2025 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 Revised BSD License set
     forth in Section 4.c of the IETF Trust's Legal Provisions
     Relating to IETF Documents
     (https://trustee.ietf.org/license-info).

     This version of this YANG module is part of RFC BBBB
     (https://www.rfc-editor.org/info/rfcBBBB); see the RFC itself
     for full legal notices.

     The key words 'MUST', 'MUST NOT', 'REQUIRED', 'SHALL', 'SHALL
     NOT', 'SHOULD', 'SHOULD NOT', 'RECOMMENDED', 'NOT RECOMMENDED',
     'MAY', and 'OPTIONAL' in this document are to be interpreted as
     described in BCP 14 (RFC 2119) (RFC 8174) when, and only when,
     they appear in all capitals, as shown here.";

  revision 2025-09-03 {
    description
      "Initial version of the module";
    reference
      "RFC BBBB: Sub-interface VLAN YANG Data Models";
  }

  feature flexible-rewrites {
    description
      "This feature indicates that the network element supports
       specifying flexible rewrite operations.";
  }

  feature asymmetric-rewrites {
    description
      "This feature indicates that 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 that the network element supports the
       flexible rewrite functionality specifying 802.1Q tag
       rewrites.";
  }

  grouping flexible-match {
    description
      "Represents a flexible frame classification:

       The rules for a flexible match are:
         1. Match-type: default, untagged, priority tag, or tag
            stack.
         2. Each tag in the stack of tags matches:
          a. tag type (802.1Q or 802.1ad) +
          b. tag value:
            i.   single tag
            ii.  set of tag ranges/values.
            iii. 'any' keyword";
    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.";
        }
      }
      case untagged {
        description
          "Match untagged Ethernet frames only";
        leaf untagged {
          type empty;
          description
            "Untagged match.  Matches all untagged traffic.";
        }
      }
      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;
            mandatory true;
            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 {
            must 'tag-type = "dot1q-types:s-vlan" or '
               + 'tag-type = "dot1q-types:c-vlan"' {
              error-message
                "Only C-VLAN and S-VLAN tags can be matched.";
              description
                "For IEEE 802.1Q interoperability, only C-VLAN and
                 S-VLAN tags can be matched.";
            }
            description
              "Classifies traffic using the outermost (first) 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 (first) 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 (first) tag
                 exists and is an S-VLAN, and the second outermost
                 tag is a C-VLAN.";
            }
            presence "Also classify on the second VLAN tag.";
            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.";
          }
        }
      }
    }
  }

  grouping dot1q-tag-rewrite {
    description
      "Flexible rewrite grouping.  Can be either be expressed
       symmetrically, or independently in the ingress and/or egress
       directions.";
    leaf pop-tags {
      type uint8 {
        range "1..2";
      }
      description
        "The number of 802.1Q VLAN tags to pop, or translate if used
         in conjunction with push-tags.

         Popped tags are the outermost tags on the frame.";
    }
    container push-tags {
      presence "802.1Q tags are pushed or translated";
      description
        "The 802.1Q tags to push on the front of the frame, or
         translate if configured in conjunction with pop-tags.";
      container outer-tag {
        must 'tag-type = "dot1q-types:s-vlan" or '
           + 'tag-type = "dot1q-types:c-vlan"' {
          error-message "Only C-VLAN and S-VLAN tags can be pushed.";
          description
            "For IEEE 802.1Q interoperability, only C-VLAN and S-VLAN
             tags can be pushed.";
        }
        description
          "The outermost (first) 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
          "In addition to the first tag, also push/rewrite a second
           VLAN tag.";
        description
          "The second outermost VLAN tag to push onto the frame.";
        uses dot1q-types:dot1q-tag-classifier-grouping;
      }
    }
  }

  grouping flexible-rewrite {
    description
      "Grouping for flexible rewrites of fields in the L2 header.

       Restricted to flexible 802.1Q VLAN tag rewrites, but could be
       extended to cover rewrites of other fields in the L2 header in
       future.";
    container dot1q-tag-rewrite {
      if-feature "dot1q-tag-rewrites";
      description
        "802.1Q VLAN tag rewrite.
         Translate operations are expressed as a combination of tag
         push and pop operations.  E.g., translating the outer tag is
         expressed as popping a single tag, and pushing a single tag.
         802.1Q tags that are translated SHOULD preserve the PCP and
         DEI fields unless if a different QoS behavior has been
         specified.";
      uses dot1q-tag-rewrite;
    }
  }

  augment "/if:interfaces/if:interface/if-ext:encapsulation/"
        + "if-ext: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, 'ianaift:l2vlan')" {
      description
        "Applies only to Ethernet-like interfaces and
         sub-interfaces.";
    }
    description
      "Augment the generic interface encapsulation with flexible
       match and rewrite for VLAN sub-interfaces.";
    case flexible {
      description
        "Flexible encapsulation and rewrite";
      container flexible {
        description
          "Flexible encapsulation allows for the matching of ranges
           and sets of 802.1Q VLAN Tags and performing rewrite
           operations on the VLAN tags.

           The structure is also designed to be extended to allow for
           matching/rewriting other fields within the L2 frame header
           if required.";
        container match {
          description
            "Flexibly classifies Ethernet frames to a sub-interface
             (or interface) based on the L2 header fields.

             Only frames matching the classification configured on a
             sub-interface/interface are processed on that
             sub-interface/interface.

             Frames that do not match any sub-interface are processed
             directly on the parent interface, if it is associated
             with a forwarding instance, otherwise they are dropped.

             If a frame could be classified to multiple
             sub-interfaces then they get classified to the
             sub-interface with the most specific match.  E.g.,
             matching two VLAN tags in the frame is more specific
             than matching the outermost VLAN tag, which is more
             specific than the catch-all 'default' match.";
          uses flexible-match;
        }
        container rewrite {
          if-feature "flexible-rewrites";
          description
            "L2 frame rewrite operations.

             Rewrites allows for modifications to the L2 frame header
             as it transits the interface/sub-interface.  Examples
             include adding a VLAN tag, removing a VLAN tag, or
             rewriting the VLAN Id carried in a VLAN tag.";
          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.

                   E.g., if a tag is pushed on ingress traffic, then
                   the reverse operation is a 'pop 1', that is
                   performed on traffic egressing the interface, so
                   a peer device sees a consistent L2 encapsulation
                   for both ingress and egress traffic.";
              }
            }
            case asymmetrical {
              if-feature "asymmetric-rewrites";
              description
                "Asymmetrical rewrite.

                 Rewrite operations may be specified in only a single
                 direction, or different rewrite operations may be
                 specified in each direction.";
              container ingress {
                uses flexible-rewrite;
                description
                  "A rewrite operation that only applies to ingress
                   traffic.

                   Ingress rewrite operations are performed before
                   the frame is subsequently processed by the
                   forwarding operation.";
              }
              container egress {
                uses flexible-rewrite;
                description
                  "A rewrite operation that only applies to egress
                   traffic.";
              }
            }
          }
        }
        container local-traffic-default-encaps {
          presence "A local traffic default encapsulation has been
                    specified.";
          description
            "Specifies the 802.1Q VLAN tags to use by default for
             locally sourced traffic from the interface.

             Used for encapsulations that match a range of VLANs (or
             'any'), where the source VLAN Ids are otherwise
             ambiguous.";
          container outer-tag {
            must 'tag-type = "dot1q-types:s-vlan" or '
               + 'tag-type = "dot1q-types:c-vlan"' {
              error-message
                "Only C-VLAN and S-VLAN tags can be matched.";
              description
                "For IEEE 802.1Q interoperability, only C-VLAN and
                 S-VLAN tags can be matched.";
            }
            description
              "The outermost (first) 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 (first) 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 (first)
                 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;
          }
        }
      }
    }
  }
}
]]></sourcecode>
    </section>
    <section anchor="Examples" numbered="true" toc="default">
      <name>Examples</name>
      <t>The following sections give examples of configuring a sub-interface
        supporting L3 forwarding, and a sub-interface being used in
        conjunction with an L2VPN.</t>
      <section anchor="example1" numbered="true" toc="default">
        <name>Layer 3 sub-interfaces with IPv6</name>
        <t>This example illustrates two layer sub-interfaces, 'eth0.1' and
          'eth0.2', both are child interfaces of the Ethernet interface
          'eth0'.</t>
        <t>'eth0.1' is configured to match traffic with two VLAN tags: an
          outer S-VLAN of 10 and an inner C-VLAN of 20.</t>
        <t>'eth0.2' is configured to match traffic with a single S-VLAN tag,
          with VLAN Id 11.</t>
        <artwork name="" type="" align="left" alt=""><![CDATA[
{
  "ietf-interfaces:interfaces": {
    "interface": [
      {
        "name": "eth0",
        "type": "iana-if-type:ethernetCsmacd"
      },
      {
        "name": "eth0.1",
        "type": "iana-if-type:l2vlan",
        "ietf-if-extensions:encapsulation": {
          "ietf-if-vlan-encapsulation:dot1q-vlan": {
            "outer-tag": {
              "tag-type": "ieee802-dot1q-types:s-vlan",
              "vlan-id": 10
            },
            "second-tag": {
              "tag-type": "ieee802-dot1q-types:c-vlan",
              "vlan-id": 20
            }
          }
        },
        "ietf-if-extensions:parent-interface": "eth0",
        "ietf-ip:ipv6": {
          "enabled": true,
          "forwarding": true,
          "address": [
            {
              "ip": "2001:db8:11::1",
              "prefix-length": 48
            }
          ]
        }
      },
      {
        "name": "eth0.2",
        "type": "iana-if-type:l2vlan",
        "ietf-if-extensions:encapsulation": {
          "ietf-if-vlan-encapsulation:dot1q-vlan": {
            "outer-tag": {
              "tag-type": "ieee802-dot1q-types:s-vlan",
              "vlan-id": 11
            }
          }
        },
        "ietf-if-extensions:parent-interface": "eth0",
        "ietf-ip:ipv6": {
          "enabled": true,
          "forwarding": true,
          "address": [
            {
              "ip": "2001:db8:11::1",
              "prefix-length": 48
            }
          ]
        }
      }
    ]
  }
}
              ]]></artwork>
      </section>
      <section anchor="example2" numbered="true" toc="default">
        <name>Layer 2 sub-interfaces with L2VPN</name>
        <t>This example illustrates a layer 2 sub-interface 'eth0.3'
            configured to match traffic with an S-VLAN tag of 10, and a C-VLAN tag
            of 21; and remove the outer tag (S-VLAN 10) before the traffic is
            passed off to the L2VPN service.</t>
        <t>It also illustrates another sub-interface 'eth1.0' under a
            separate physical interface configured to match traffic with a
            C-VLAN of 50, with the tag removed before traffic is given to any
            service.  Sub-interface 'eth1.0' is not currently bound to any
            service and hence traffic classified to that sub-interface is
            dropped.</t>
        <artwork name="" type="" align="left" alt=""><![CDATA[
{
  "ietf-interfaces:interfaces": {
    "interface": [
      {
        "name": "eth0",
        "type": "iana-if-type:ethernetCsmacd"
      },
      {
        "name": "eth0.3",
        "type": "iana-if-type:l2vlan",
        "ietf-if-extensions:parent-interface": "eth0",
        "ietf-if-extensions:encapsulation": {
          "ietf-if-flexible-encapsulation:flexible": {
            "match": {
              "dot1q-vlan-tagged": {
                "outer-tag": {
                  "tag-type": "ieee802-dot1q-types:s-vlan",
                  "vlan-id": "10"
                },
                "second-tag": {
                  "tag-type": "ieee802-dot1q-types:c-vlan",
                  "vlan-id": "21"
                }
              }
            },
	    "rewrite":{
	      "symmetrical": {
	        "dot1q-tag-rewrite": {
   		  "pop-tags": 1
	        }
	      }
	    }
          }
        }
      },
      {
        "name": "eth1.0",
        "type": "iana-if-type:l2vlan",
        "ietf-if-extensions:parent-interface": "eth0",
        "ietf-if-extensions:encapsulation": {
          "ietf-if-flexible-encapsulation:flexible": {
            "match": {
              "dot1q-vlan-tagged": {
                "outer-tag": {
                  "tag-type": "ieee802-dot1q-types:c-vlan",
                  "vlan-id": "50"
                }
              }
            },
	    "rewrite":{
	      "symmetrical": {
	        "dot1q-tag-rewrite": {
   		  "pop-tags": 1
	        }
	      }
	    }
          }
        }
      }
    ]
  }
}
            ]]></artwork>
      </section>
    </section>
    <section anchor="Acknowledgements" numbered="true" toc="default">
      <name>Acknowledgements</name>
      <t>The authors would particularly like to thank Benoit Claise, John
        Messenger, Glenn Parsons, and Dan Romascanu for their help progressing
        this draft.</t>
      <t>The authors would also like to thank Martin Bjorklund, Alex Campbell,
        Don Fedyk, Eric Gray, Giles Heron, Marc Holness, Iftekhar Hussain, Neil
        Ketley, William Lupton, John Messenger, Glenn Parsons, Ludwig Pauwels,
	Joseph White, Vladimir Vassilev, David Ball and members of the
	IEEE 802.1 WG for their helpful reviews and feedback on this draft.</t>
    </section>
    <section anchor="IANA" numbered="true" toc="default">
      <name>IANA Considerations</name>
      <section anchor="yang-module-registrations" numbered="true" toc="default">
        <name>YANG Module Registrations</name>
        <t>The following YANG modules are requested to be registered in the IANA
          "YANG Module Names" <xref target="RFC6020" format="default"/> registry:</t>
        <t>The ietf-if-vlan-encapsulation module:</t>
        <ul empty="true" spacing="normal">
          <li>Name: ietf-if-vlan-encapsulation</li>
          <li>XML Namespace: urn:ietf:params:xml:ns:yang:ietf-if-vlan-encapsulation</li>
          <li>Prefix: if-vlan</li>
          <li>Reference: RFCXXXX</li>
        </ul>
        <t>The ietf-if-flexible-encapsulation module:</t>
        <ul empty="true" spacing="normal">
          <li>Name: ietf-if-flexible-encapsulation</li>
          <li>XML Namespace: urn:ietf:params:xml:ns:yang:ietf-if-flexible-encapsulation</li>
          <li>Prefix: if-flex</li>
          <li>Reference: RFCXXXX</li>
        </ul>
        <t>This document registers two URIs in the "IETF XML Registry" <xref target="RFC3688" format="default"/>.  Following the format in RFC 3688, the following
        registrations have been made.

        </t>
        <ul empty="true" spacing="normal">
          <li>URI: urn:ietf:params:xml:ns:yang:ietf-if-vlan-encapsulation</li>
          <li>Registrant Contact: The IESG.</li>
          <li>XML: N/A, the requested URI is an XML namespace.</li>
        </ul>
        <ul empty="true" spacing="normal">
          <li>URI: urn:ietf:params:xml:ns:yang:ietf-if-flexible-encapsulation</li>
          <li>Registrant Contact: The IESG.</li>
          <li>XML: N/A, the requested URI is an XML namespace.</li>
        </ul>
      </section>
    </section>
    <section anchor="Security" numbered="true" toc="default">
      <name>Security Considerations</name>
      <t>The "ietf-if-flexible-encapsulation" and "ietf-if-vlan-encapsulation" YANG modules define data models that are designed to be accessed via YANG-based management protocols, such as NETCONF <xref target="RFC6241" format="default"/> and RESTCONF <xref target="RFC8040" format="default"/>. These protocols have to use a secure transport layer (e.g., SSH <xref target="RFC4252" format="default"/>, TLS <xref target="RFC8446" format="default"/>, and QUIC <xref target="RFC9000" format="default"/>) and have to use mutual authentication.</t>
      <t>The Network Configuration Access Control Model (NACM) <xref target="RFC8341" format="default"/> provides the means to restrict access for particular NETCONF or RESTCONF users to a pre-configured subset of all available
        NETCONF or RESTCONF protocol operations and content.</t>
      <t>There are a number of data nodes defined in these YANG modules that are
        writable/creatable/deletable (i.e. config true, which is the default).
        All writable data nodes are likely to be reasonably sensitive or vulnerable in some network environments.  
        Write operations (e.g. edit-config) and delete operations to these data
        nodes without proper protection or authentication can have a negative effect on network operations.
        The following subtrees and data nodes have particular sensitivities/vulnerabilities:  
        There are no particularly sensitive writable data nodes.</t>
       <t> Some of the readable data nodes in this YANG module may be considered sensitive or vulnerable in some
           network environments. It is thus important to control read access (e.g., via get, get-config, 
           or notification) to these data nodes. Specifically, the following subtrees and data nodes have
           particular sensitivities/vulnerabilities:
           There are no particularly sensitive readable data nodes.</t>
    </section>
  </middle>
  <!--  *****BACK MATTER ***** -->
    <back>
    <references>
      <name>References</name>
      <references>
        <name>Normative References</name>
	<xi:include href="https://www.rfc-editor.org/refs/bibxml/reference.RFC.2119.xml"/>
	<xi:include href="https://www.rfc-editor.org/refs/bibxml/reference.RFC.3688.xml"/>
	<xi:include href="https://www.rfc-editor.org/refs/bibxml/reference.RFC.6020.xml"/>
	<xi:include href="https://www.rfc-editor.org/refs/bibxml/reference.RFC.7224.xml"/>
	<xi:include href="https://www.rfc-editor.org/refs/bibxml/reference.RFC.7950.xml"/>
	<xi:include href="https://www.rfc-editor.org/refs/bibxml/reference.RFC.8174.xml"/>
	<xi:include href="https://www.rfc-editor.org/refs/bibxml/reference.RFC.8341.xml"/>
	<xi:include href="https://www.rfc-editor.org/refs/bibxml/reference.RFC.8343.xml"/>
	<xi:include href="https://www.rfc-editor.org/refs/bibxml/reference.RFC.8344.xml"/>
	<xi:include href="https://bib.ietf.org/public/rfc/bibxml6/reference.R.IEEE.802.1Q-2022.xml"/>
	<xi:include href="https://bib.ietf.org/public/rfc/bibxml3/reference.I-D.draft-ietf-netmod-intf-ext-yang-17.xml"/>
      </references>
      <references>
        <name>Informative References</name>
	<xi:include href="https://www.rfc-editor.org/refs/bibxml/reference.RFC.4252.xml"/>
	<xi:include href="https://www.rfc-editor.org/refs/bibxml/reference.RFC.4448.xml"/>
	<xi:include href="https://www.rfc-editor.org/refs/bibxml/reference.RFC.4761.xml"/>
	<xi:include href="https://www.rfc-editor.org/refs/bibxml/reference.RFC.4762.xml"/>
	<xi:include href="https://www.rfc-editor.org/refs/bibxml/reference.RFC.6241.xml"/>
	<xi:include href="https://www.rfc-editor.org/refs/bibxml/reference.RFC.8040.xml"/>
	<xi:include href="https://www.rfc-editor.org/refs/bibxml/reference.RFC.8200.xml"/>
	<xi:include href="https://www.rfc-editor.org/refs/bibxml/reference.RFC.8340.xml"/>
	<xi:include href="https://www.rfc-editor.org/refs/bibxml/reference.RFC.8446.xml"/>
	<xi:include href="https://www.rfc-editor.org/refs/bibxml/reference.RFC.9000.xml"/>
      </references>
    </references>
    <section anchor="comparison" numbered="true" toc="default">
      <name>Comparison with the IEEE 802.1Q Configuration Model</name>
      <t>In addition to the sub-interface based YANG model proposed here,
          the IEEE 802.1Q working group has developed 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 numbered="true" toc="default">
        <name>Sub-interface based configuration model overview</name>
        <t>The key features of the sub-interface based configuration model
            can be summarized as:
        </t>
        <ul spacing="normal">
          <li>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.</li>
          <li>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.</li>
          <li>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.</li>
          <li>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.</li>
          <li>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.</li>
        </ul>
      </section>
      <section numbered="true" toc="default">
        <name>IEEE 802.1Q Bridge Configuration Model Overview</name>
        <t>The key features of the IEEE 802.1Q bridge configuration model
            can be summarized as:
        </t>
        <ul spacing="normal">
          <li>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.</li>
          <li>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.</li>
          <li>Classification of traffic to a VLAN bridge component is based
	      only on the Ethernet interface that it arrived on.</li>
          <li>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.</li>
          <li>Feature configuration is specified in the context of the
	      bridge, or particular VLANs on a bridge.</li>
        </ul>
      </section>
      <section numbered="true" toc="default">
        <name>Possible Overlap Between the Two Models</name>
        <t>Both models can be used for configuring similar basic layer 2
            forwarding topologies. The 802.1Q bridge configuration model is
            optimized 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 used 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>
    </back>
</rfc>
