<?xml version="1.0" encoding="UTF-8"?>
  <?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
  <!-- generated by https://github.com/cabo/kramdown-rfc version 1.6.31 (Ruby 2.6.10) -->


<!DOCTYPE rfc  [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">

]>


<rfc ipr="trust200902" docName="draft-evans-discardclass-01" category="info" tocInclude="true" sortRefs="true" symRefs="true">
  <front>
    <title abbrev="Exp. Implementing Packet Discard Class.">Experience from implementing a new packet discard classification scheme</title>

    <author initials="J." surname="Evans" fullname="John Evans">
      <organization>Amazon</organization>
      <address>
        <email>jevanamz@amazon.co.uk</email>
      </address>
    </author>
    <author initials="O." surname="Pylypenko" fullname="Oleksandr Pylypenko">
      <organization>Amazon</organization>
      <address>
        <email>opyl@amazon.com</email>
      </address>
    </author>

    <date year="2023" month="May" day="22"/>

    
    <workgroup>Independent Stream</workgroup>
    <keyword>Internet-Draft</keyword>

    <abstract>


<t>Router reported packet loss is the primary signal of when a network is not doing its job.  Some packet loss is normal or intended in TCP/IP networks, however.  To minimise network packet loss through automated network operations we need clear and accurate signals of all packets which are dropped and why.  This document describes our experience from implementing a packet loss classification scheme to provide these signals and enable automated network mitigation of unintended packet loss.</t>



    </abstract>



  </front>

  <middle>


<section anchor="into"><name>Introduction</name>

<t>The job of a network is to transport packets.  Understanding both where and why packet loss occurs is essential to the effective operation of networks.   Router-reported packet loss is the most direct signal for network operations to identify customer impact from unintended packet loss. Accurate accounting of packet loss is not enough, however, as some level of packet loss is normal in TCP/IP networks.  In automating network operations, there are only a relatively small number of automated actions that can be taken to mitigate impacting packet loss. Precise signal is important to ensure the right action is taken, however, as taking the wrong action can make problems worse.</t>

<t>The existing definitions of ifindiscards, ifoutdiscards, ifinerrors, ifouterrors <xref target="RFC1213"/>, do not provide the precision needed to be able to identify the cause of packet loss sufficient to mitigate the impact. From a network operators' perspective, ifindiscards can represent both intended packet loss (i.e. packets discarded due to policy) and unintended packet loss. Further, these definitions are ambiguous, in that vendors can and have implemented them differently with different outcomes.  In some implementations, ifinerrors accounts only for errored packets which are dropped, whilst in others it accounts for all errored packets whether they are dropped or not.  Many vendors support more discard metrics than these; where they do they are inconsistently implemented due to an absence of clearly defined classification and semantics for packet loss reporting.</t>

<t>This document describes our experience from implementing a packet loss classification scheme across multiple hardware platforms, which aimed to address these issues and enable automated mitigation of unintended packet loss.  Section 2 describes the problem.  Section 3 defines the classification scheme and the accounting requirements with examples.  Section 4 gives examples of discard signal to cause to auto-mitigation action mapping.  Section 5 details our experience from implementing this scheme.</t>

</section>
<section anchor="prob"><name>Problem statement</name>

<t>Working backwards from auto-mitigation of unintended packet loss, there are only a relative small number of potential auto-mitigation actions, e.g.:</t>

<t><list style="numbers">
  <t>Take device, link or set of devices and/or links out of service</t>
  <t>Put device, link or set of devices and/or links back into service</t>
  <t>Move traffic</t>
  <t>Roll-back a change</t>
  <t>Escalate to network operators</t>
</list></t>

<t>Precise signal of impact is important as taking the wrong action can be worse than taking no action.  For example, taking a congested device out of service can make congestion worse.</t>

<t>To be able to detect whether router reported packet loss is a problem and determine what actions should be taken to mitigate the impact and remediate the cause, depends on four primary features of the packet loss signal:</t>

<t><list style="numbers">
  <t>the cause of the loss</t>
  <t>the rate and magnitude of the loss</t>
  <t>the duration of the loss</t>
  <t>the location of the loss</t>
</list></t>

<t>Features 2, 3 and 4 are already addressed with device level passive monitoring statistics, e.g. obtained with SNMP <xref target="RFC1157"/> or NETCONF <xref target="RFC6241"/>.  Feature 1 is dependent on the classification scheme used for packet loss reporting.  We define a new scheme to address this problem in the next section.</t>

</section>
<section anchor="class"><name>Classification Scheme</name>

<t>We define the classification scheme as a tree.  At the top level we differentiate the direction: ingress or egress.  At the second level we differentiate between traffic and discards.  At the third level we differentiate between intended discards and unintended discards by discard class.</t>

<figure><artwork><![CDATA[
.
|-- interface/
|   |-- ingress/
|   |   |-- traffic_rx/
|   |   |   |-- v4/
|   |   |   |   |-- packets
|   |   |   |   `-- bytes
|   |   |   |-- v6/
|   |   |   |   |-- packets
|   |   |   |   `-- bytes
|   |   |   |-- l2/
|   |   |   |   |-- packets
|   |   |   |   `-- bytes
|   |   |   `-- qos/
|   |   |       |-- class_0/
|   |   |       |   |-- packets
|   |   |       |   `-- bytes
|   |   |       |-- ...
|   |   |       `-- class_n/
|   |   |           |-- packets
|   |   |           `-- bytes
|   |   `-- discards/
|   |       |-- v4/
|   |       |   |-- packets
|   |       |   `-- bytes
|   |       |-- v6/
|   |       |   |-- packets
|   |       |   `-- bytes
|   |       |-- l2/
|   |       |   |-- packets
|   |       |   `-- bytes
|   |       |-- policy/
|   |       |   |-- acl/
|   |       |   |   `-- packets
|   |       |   |-- policer/
|   |       |   |   |-- packets
|   |       |   |   `-- bytes
|   |       |   `-- null_route/
|   |       |       `-- packets
|   |       |-- errors/
|   |       |   |-- rx/
|   |       |   |   |-- l2/
|   |       |   |   |   |-- frames
|   |       |   |   |   |-- fec_error/
|   |       |   |   |   |   `-- frames
|   |       |   |   |   `-- invalid_frame/
|   |       |   |   |       `-- frames
|   |       |   |   `-- l3/
|   |       |   |       |-- packets
|   |       |   |       |-- checksum_error/
|   |       |   |       |   `-- packets
|   |       |   |       `-- invalid_packet/
|   |       |   |           `-- packets
|   |       |   |-- local/
|   |       |   |   |-- packets
|   |       |   |   `-- parity_error/
|   |       |   |       `-- packets
|   |       |   `-- no_route/
|   |       |       `-- packets
|   |       |-- ttl_expired/
|   |       |   `-- packets
|   |       `-- no_buffer/
|   |           |-- class_0/
|   |           |   |-- packets
|   |           |   `-- bytes
|   |           |-- ...
|   |           `-- class_n/
|   |               |-- packets
|   |               `-- bytes
|   `-- egress/
|       |-- traffic_tx/
|       |   |-- v4/
|       |   |   |-- packets
|       |   |   `-- bytes
|       |   |-- v6/
|       |   |   |-- packets
|       |   |   `-- bytes
|       |   |-- l2/
|       |   |   |-- packets
|       |   |   `-- bytes
|       |   `-- qos/
|       |       |-- class_0/
|       |       |   |-- packets
|       |       |   `-- bytes
|       |       |-- ...
|       |       `-- class_n/
|       |           |-- packets
|       |           `-- bytes
|       `-- discards/
|           |-- v4/
|           |   |-- packets
|           |   `-- bytes
|           |-- v6/
|           |   |-- packets
|           |   `-- bytes
|           |-- l2/
|           |   |-- packets
|           |   `-- bytes
|           |-- policy/
|           |   |-- acl/
|           |   |   `-- packets
|           |   `-- policer/
|           |       `-- packets
|           |-- errors/
|           |   `-- tx/
|           |       |-- l2/
|           |       |   `-- frames
|           |       `-- l3/
|           |           `-- packets
|           `-- no_buffer/
|               |-- class_0/
|               |   |-- packets
|               |   `-- bytes
|               |-- ...
|               `-- class_n/
|                   |-- packets
|                   `-- bytes
`-- to_cpu/
    |-- packets
    |-- bytes
    `-- policy/
        |-- acl/
        |   `-- packets
        `-- policer/
            `-- packets

]]></artwork></figure>

<t>Notes:</t>

<t><list style="numbers">
  <t>The tree follows the structure &lt;component&gt;&lt;direction&gt;&lt;type&gt;&lt;sub-type&gt;&lt;sub-sub-type&gt;&lt;metric&gt;, where:<br />
a. component can be interface|device|tunnel|to_cpu<br />
b. direction can be ingress|egress<br />
c. type can be traffic|discards</t>
  <t>If Diffserv <xref target="RFC2475"/> quality of service (QOS) is not configured, class0 is considered the default for no_buffer discards</t>
  <t>from_cpu traffic is assumed to be accounted for as transit traffic</t>
</list></t>

<t>See Appendix A for an example of where packets may be dropped in a device.</t>

<section anchor="class_descriptions"><name>Discard Class Descriptions</name>

<t>discards/policy/<br />
     These are intended discards, i.e. packets dropped due to a configured policy. There are multiple sub-classes.</t>

<t>discards/policy/acl/<br />
     Discards due to packet matching an access control list (ACL)</t>

<t>discards/policy/policer/<br />
     Discards due to packet matching a configured policer</t>

<t>discards/policy/null_route/<br />
     Discards due to a packet matching a route with discard action</t>

<t>discards/no_route/<br />
     Discards due to a packet not matching any route</t>

<t>discards/no_buffer/<br />
     Discards due to no available buffer to enqueue the packet. These can be tail-drop discards or due to an active queue management algorithm, e.g. RED <xref target="RED93"/>, CODEL <xref target="RFC8289"/></t>

<t>discards/ttl_expired<br />
     There can also be multiple causes for TTL-exceed drops: i) trace-route; ii) TTL set too low by the end system; iii) routing loops</t>

<t>discards/error/rx/l2/<br />
     Frames dropped because they are invalid at L2, e.g. due to bad CRC or an invalid MAC address</t>

<t>discards/error/rx/l3/<br />
    These are drops due to errors in the received packet, i.e. which indicate an upstream problem, rather than a problem with the device that is dropping the errored packets. There are multiple potential errors that can cause a packet to be dropped on receipt: i) IP checksum errors; ii) malformed frame/packets</t>

<t>discards/error/local/<br />
A device may drop packets within its switching pipeline due to internal errors, e.g. parity errors. Any discards not assigned to the above classes are accounted here.</t>

</section>
<section anchor="accounting_requirements"><name>Discard Accounting Requirements</name>
<t>These requirements apply to the packets forwarded by the device, not the packets destined to the device:</t>

<t><list style="numbers">
  <t>All packet receipt, transmission and drops <bcp14>MUST</bcp14> be reported</t>
  <t>All packet receipt, transmission and drops <bcp14>SHOULD</bcp14> be attributed to the corresponding physical or logical interface where they occur.</t>
  <t>An individual packet <bcp14>MUST NOT</bcp14> account against both the traffic and discard classes on a single direction, i.e. ingress or egress</t>
  <t>The aggregate v4, v6, and L2 traffic and discard classes <bcp14>MUST</bcp14> account for all underlying packets received, transmitted and dropped across all causal classes</t>
  <t>The aggregate QOS traffic and discard (no buffer) classes <bcp14>MUST</bcp14> account for all underlying packets received, transmitted and dropped across v4, v6 and L2</t>
  <t>In addition to these aggregate classes, an individual dropped packet <bcp14>SHOULD</bcp14> only account against a single discard class</t>
  <t>If there may be two drop causes for a packet, an individual dropped packet <bcp14>SHOULD</bcp14> account against the first discard class in order</t>
</list></t>

</section>
<section anchor="examples"><name>Examples</name>

<t>Assuming all the requirements are met, a good IPv4 packet received would increment:<br />
- interface/ingress/traffic/v4/rx/packets<br />
- interface/ingress/traffic/v4/rx/bytes<br />
- interface/ingress/traffic/diffserv/class_0/rx/packets<br />
- interface/ingress/traffic/diffserv/class_0/rx/bytes</t>

<t>A received IPv6 packet dropped due to ttl-expired would increment:<br />
- interface/ingress/discards/v6/packets<br />
- interface/ingress/discards/ttl_expired/packets</t>

<t>An IPv4 packet dropped on egress due to no buffers would increment:<br />
- interface/egress/discards/no_buffer/class_0/packets<br />
- interface/egress/discards/no_buffer/class_0/bytes</t>

</section>
</section>
<section anchor="mapping"><name>Signal to Cause to Mitigation Mapping</name>

<t>Example discard signal to cause to mitigation mappings are shown in the table below:</t>

<figure><artwork><![CDATA[
+------------------+---------+-------------------+-----------+--------+-----------+----------------------+
|Discard class     |Direction|Cause              |Rate       |Duration|Unintended?|Possible actions      |
+------------------+---------+-------------------+-----------+--------+-----------+----------------------+
|ErrorRxL2Discards |Ingress  |Upstream device    |>0(Anomaly)|O(1min) |Y          |Take upstream link or |
|                  |         |or link errror     |           |        |           |device out-of-service |
|TTLDiscards       |Ingress  |Tracert            |<=Baseline |        |           |no action             |
|TTLDiscards       |Ingress  |Convergence        |>Baseline  |O(1s)   |Y          |no action             |
|TTLDiscards       |Ingress  |Routing loop       |>Baseline  |O(1min) |Y          |Roll-back             |
|AclDiscards       |Ingress  |ACL                |           |        |N          |no action             |
|NullRouteDiscards |Ingress  |Null route         |           |        |N          |no action             |
|NoRouteDiscards   |Ingress  |Convergence        |>0(Anomaly)|O(1s)   |Y          |no action             |
|NoRouteDiscards   |Ingress  |Config error       |>0(Anomaly)|O(1min) |Y          |Roll-back             |
|NoRouteDiscards   |Ingress  |Invalid destination|>0(Anomaly)|O(10min)|N          |Escalate              |
|ErrorLocalDiscards|Ingress  |Device errors      |>0(Anomaly)|O(1min) |Y          |Take device           |
|                  |         |                   |           |        |           |out-of-service        |
|NoBufferDiscards  |Egress   |Congestion         |<=Baseline |        |N          |no action             |
|NoBufferDiscards  |Egress   |Congestion         |>Baseline  |O(1min) |Y          |Bring capacity back   |
|                  |         |                   |           |        |           |into service or move  |
|                  |         |                   |           |        |           |traffic               |
+------------------+---------+-------------------+-----------+--------+-----------+----------------------+

]]></artwork></figure>

</section>
<section anchor="experience"><name>Implementation Experience</name>
<t><list style="numbers">
  <t>The number of classes is a compromise between: providing sufficient detail to be able to take the appropriate actions whilst: a) not providing too much detail which can require deeper understanding rather than helping to surface the problem quickly; b) constraining the quantity of data produced where these metrics are produced per interface.</t>
  <t>There are multiple ways that we could have defined the discard classification tree, e.g. we could have used a multi-rooted tree, rooted in each protocol.  We opted instead to define a tree where protocol discards and cause discards are accounted orthogonally, as this reduces the number of classes and we found it sufficient to determine mitigation actions.</t>
  <t>NoBuffer discards can be realised differently with different memory architectures.  Hence, whether a NoBuffer discard is attributed to ingress or egress can differ accordingly.  A packet dropped due to NoBuffer discard should never be accounted for both on ingress and on egress.</t>
  <t>Most platforms account for the number of packets where the TTL has expired, and the CPU has returned an ICMP Time Exceeded message. In practise, however, there is often a policer applied to traffic on the to_CPU path, which limits the number of packets to the CPU.  Implicitly, this limits the rate of TTL discards processed by the CPU and hence it limits the number reported.  One method to account for all TTL discards, even those that are dropped by a policer when being punted to the CPU, is to use accounting of all ingress packets received with TTL=1, i.e. before TTL processing.</t>
  <t>Where a no_route discard is implemented with a default null route, separate accounting is needed for any explicit null routes configured, in order to differentiate between interface/ingress/discards/policy/null_route/packets and interface/ingress/discards/errors/no_route/packets.</t>
  <t>It is useful to account separately for transit packets dropped by transit ACLs/policers, and to_cpu packets dropped by ACLs/policers which limit the number of packets to the CPU</t>
  <t>It is not possible to identify a configuration error - i.e. when intended discards are unintended - with device packet loss metrics alone.  For example, to determine if ACL drops are intended or due to a misconfigured ACL some other method is needed, e.g. with config validation before deployment or in detecting a significant change in ACL drops before/after a change.</t>
</list></t>

</section>
<section anchor="security"><name>Security Considerations</name>
<t>There are no new security considerations introduced by this document.</t>

</section>
<section anchor="iana"><name>IANA Considerations</name>
<t>There are no new IANA considerations introduced by this document.</t>

</section>
<section anchor="terminology"><name>Terminology</name>

<t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>

</section>
<section anchor="acknowledgements"><name>Acknowledgments</name>
<t>The content of this draft has benefitted from discussions with JR Rivers, Ronan Waide and Chris DeBruin.</t>

</section>


  </middle>

  <back>


    <references title='Normative References'>





<reference anchor='RFC2119'>
<front>
<title>Key words for use in RFCs to Indicate Requirement Levels</title>
<author fullname='S. Bradner' initials='S.' surname='Bradner'><organization/></author>
<date month='March' year='1997'/>
<abstract><t>In many standards track documents several words are used to signify the requirements in the specification.  These words are often capitalized. This document defines these words as they should be interpreted in IETF documents.  This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t></abstract>
</front>
<seriesInfo name='BCP' value='14'/>
<seriesInfo name='RFC' value='2119'/>
<seriesInfo name='DOI' value='10.17487/RFC2119'/>
</reference>



<reference anchor='RFC8174'>
<front>
<title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
<author fullname='B. Leiba' initials='B.' surname='Leiba'><organization/></author>
<date month='May' year='2017'/>
<abstract><t>RFC 2119 specifies common key words that may be used in protocol  specifications.  This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the  defined special meanings.</t></abstract>
</front>
<seriesInfo name='BCP' value='14'/>
<seriesInfo name='RFC' value='8174'/>
<seriesInfo name='DOI' value='10.17487/RFC8174'/>
</reference>




    </references>

    <references title='Informative References'>





<reference anchor='RFC1213'>
<front>
<title>Management Information Base for Network Management of TCP/IP-based internets: MIB-II</title>
<author fullname='K. McCloghrie' initials='K.' surname='McCloghrie'><organization/></author>
<author fullname='M. Rose' initials='M.' surname='Rose'><organization/></author>
<date month='March' year='1991'/>
<abstract><t>This memo defines the second version of the Management Information Base (MIB-II) for use with network management protocols in TCP/IP-based internets. [STANDARDS-TRACK]</t></abstract>
</front>
<seriesInfo name='STD' value='17'/>
<seriesInfo name='RFC' value='1213'/>
<seriesInfo name='DOI' value='10.17487/RFC1213'/>
</reference>



<reference anchor='RFC1157'>
<front>
<title>Simple Network Management Protocol (SNMP)</title>
<author fullname='J.D. Case' initials='J.D.' surname='Case'><organization/></author>
<author fullname='M. Fedor' initials='M.' surname='Fedor'><organization/></author>
<author fullname='M.L. Schoffstall' initials='M.L.' surname='Schoffstall'><organization/></author>
<author fullname='J. Davin' initials='J.' surname='Davin'><organization/></author>
<date month='May' year='1990'/>
<abstract><t>This RFC is a re-release of RFC 1098, with a changed &quot;Status of this Memo&quot; section plus a few minor typographical corrections.  This memo defines a simple protocol by which management information for a network element may be inspected or altered by logically remote users. [STANDARDS-TRACK]</t></abstract>
</front>
<seriesInfo name='RFC' value='1157'/>
<seriesInfo name='DOI' value='10.17487/RFC1157'/>
</reference>



<reference anchor='RFC6241'>
<front>
<title>Network Configuration Protocol (NETCONF)</title>
<author fullname='R. Enns' initials='R.' role='editor' surname='Enns'><organization/></author>
<author fullname='M. Bjorklund' initials='M.' role='editor' surname='Bjorklund'><organization/></author>
<author fullname='J. Schoenwaelder' initials='J.' role='editor' surname='Schoenwaelder'><organization/></author>
<author fullname='A. Bierman' initials='A.' role='editor' surname='Bierman'><organization/></author>
<date month='June' year='2011'/>
<abstract><t>The Network Configuration Protocol (NETCONF) defined in this document provides mechanisms to install, manipulate, and delete the configuration of network devices.  It uses an Extensible Markup Language (XML)-based data encoding for the configuration data as well as the protocol messages.  The NETCONF protocol operations are realized as remote procedure calls (RPCs).  This document obsoletes RFC 4741.  [STANDARDS-TRACK]</t></abstract>
</front>
<seriesInfo name='RFC' value='6241'/>
<seriesInfo name='DOI' value='10.17487/RFC6241'/>
</reference>


<reference anchor="RED93" >
  <front>
    <title>Random Early Detection gateways for Congestion Avoidance</title>
    <author initials="V." surname="Jacobson">
      <organization></organization>
    </author>
    <date year="n.d."/>
  </front>
</reference>




<reference anchor='RFC2475'>
<front>
<title>An Architecture for Differentiated Services</title>
<author fullname='S. Blake' initials='S.' surname='Blake'><organization/></author>
<author fullname='D. Black' initials='D.' surname='Black'><organization/></author>
<author fullname='M. Carlson' initials='M.' surname='Carlson'><organization/></author>
<author fullname='E. Davies' initials='E.' surname='Davies'><organization/></author>
<author fullname='Z. Wang' initials='Z.' surname='Wang'><organization/></author>
<author fullname='W. Weiss' initials='W.' surname='Weiss'><organization/></author>
<date month='December' year='1998'/>
<abstract><t>This document defines an architecture for implementing scalable service differentiation in the Internet.  This memo provides information for the Internet community.</t></abstract>
</front>
<seriesInfo name='RFC' value='2475'/>
<seriesInfo name='DOI' value='10.17487/RFC2475'/>
</reference>



<reference anchor='RFC8289'>
<front>
<title>Controlled Delay Active Queue Management</title>
<author fullname='K. Nichols' initials='K.' surname='Nichols'><organization/></author>
<author fullname='V. Jacobson' initials='V.' surname='Jacobson'><organization/></author>
<author fullname='A. McGregor' initials='A.' role='editor' surname='McGregor'><organization/></author>
<author fullname='J. Iyengar' initials='J.' role='editor' surname='Iyengar'><organization/></author>
<date month='January' year='2018'/>
<abstract><t>This document describes CoDel (Controlled Delay) -- a general framework that controls bufferbloat-generated excess delay in modern networking environments.  CoDel consists of an estimator, a setpoint, and a control loop.  It requires no configuration in normal Internet deployments.</t></abstract>
</front>
<seriesInfo name='RFC' value='8289'/>
<seriesInfo name='DOI' value='10.17487/RFC8289'/>
</reference>




    </references>


<section anchor="where-do-packets-get-dropped"><name>Where do packets get dropped?</name>
<t>The diagram below is an example of where and why packets may be dropped in a typical single ASIC, shared buffered type device.</t>

<figure><artwork><![CDATA[
                                           +----------+
                                           |          |
                                           |  CPU     |
                                           |          |
                                           +--+---^---+
                                     from_cpu |   | to_cpu
                                              |   |
               +------------------------------v---+-------------------------------+
               |                                                                  |

 +----------+  +----------+  +----------+  +----------+  +----------+  +----------+  +----------+
 |          |  |          |  |          |  |          |  |          |  |          |  |          |
->  Phy     +-->  Mac     +--> Ingress  +--> Buffers  +--> Egresss  +-->  Mac     +-->  Phy     |>
 |          |  |          |  |  Pipeline|  |          |  |  Pipeline|  |          |  |          |
 +----------+  +----------+  +----------+  +----------+  +----------+  +----------+  +----------+

                error/rx/l2   error/rx/l3   no_buffer     error/tx/l3
                              error/local
                              no_route
                              ttl

                              policy/acl                  policy/acl
                              policy/policer              policy/policer
                              null_route

]]></artwork></figure>

</section>


  </back>

<!-- ##markdown-source:
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

-->

</rfc>

