Internet-Draft | Exp. Implementing Packet Discard Class. | August 2023 |
Evans & Pylypenko | Expires 16 February 2024 | [Page] |
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.¶
This Internet-Draft is submitted in full conformance with the provisions of BCP 78 and BCP 79.¶
Internet-Drafts are working documents of the Internet Engineering Task Force (IETF). Note that other groups may also distribute working documents as Internet-Drafts. The list of current Internet-Drafts is at https://datatracker.ietf.org/drafts/current/.¶
Internet-Drafts are draft documents valid for a maximum of six months and may be updated, replaced, or obsoleted by other documents at any time. It is inappropriate to use Internet-Drafts as reference material or to cite them other than as "work in progress."¶
This Internet-Draft will expire on 16 February 2024.¶
Copyright (c) 2023 IETF Trust and the persons identified as the document authors. All rights reserved.¶
This document is subject to BCP 78 and the IETF Trust's Legal Provisions Relating to IETF Documents (https://trustee.ietf.org/license-info) in effect on the date of publication of this document. Please review these documents carefully, as they describe your rights and restrictions with respect to this document. Code Components extracted from this document must include Revised BSD License text as described in Section 4.e of the Trust Legal Provisions and are provided without warranty as described in the Revised BSD License.¶
The job of a network is to transport packets. Understanding both where and why packet loss occurs is essential for effective network operation. 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 customer impacting packet loss. Precise classification of packet loss signals is important to ensure the right action is taken as taking the wrong action can make problems worse.¶
The existing metrics for packet loss as defined in [RFC1213] - namely ifInDiscards, ifOutDiscards, ifInErrors, ifOutErrors - do not provide sufficient precision to be able to automatically identify the cause of the loss and 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 (e.g. packets dropped in error). Further, these definitions are ambiguous, in that vendors can and have implemented them differently. 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 a clearly defined classification scheme and semantics for packet loss reporting.¶
This document describes our experience from implementing a packet loss classification scheme across multiple hardware platforms, which aims 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.¶
The terms 'packet drop' and 'discard' are considered equivalent and are used interchangeably.¶
Working backwards from the goal of auto-mitigation of unintended packet loss, there are only a relative small number of potential auto-mitigation actions, e.g.:¶
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 by moving the traffic to other already congested links and/or devices.¶
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:¶
Features 2, 3 and 4 are already addressed with passive monitoring statistics, e.g. obtained with SNMP [RFC1157] or NETCONF [RFC6241]. Feature 1, however, is dependent on the classification scheme used for packet loss reporting. In the next section we define a new classification scheme to address this problem.¶
We define the classification scheme as a tree which follows the structure <component><direction><type><layer><sub-type><sub-sub-type><metric>, where:
a. component can be interface|device
b. direction can be ingress|egress
c. type can be traffic|discards, where traffic accounts for packets successfully received or transmitted, and discards account for packet drops
d. layer can be l2|l3¶
. |-- interface/ | |-- ingress/ | | |-- traffic/ | | | |-- l2/ | | | | |-- frames | | | | `-- bytes | | | |-- l3/ | | | | |-- v4/ | | | | | |-- packets | | | | | |-- bytes | | | | | |-- unicast/ | | | | | | |-- packets | | | | | | `-- bytes | | | | | `-- multicast/ | | | | | |-- packets | | | | | `-- bytes | | | | `-- v6/ | | | | |-- packets | | | | |-- bytes | | | | |-- unicast/ | | | | | |-- packets | | | | | `-- bytes | | | | `-- multicast/ | | | | |-- packets | | | | `-- bytes | | | `-- qos/ | | | |-- class_0/ | | | | |-- packets | | | | `-- bytes | | | |-- ... | | | `-- class_n/ | | | |-- packets | | | `-- bytes | | `-- discards/ | | |-- l2/ | | | |-- frames | | | `-- bytes | | |-- l3/ | | | |-- v4/ | | | | |-- packets | | | | |-- bytes | | | | |-- unicast/ | | | | | |-- packets | | | | | `-- bytes | | | | `-- multicast/ | | | | |-- packets | | | | `-- bytes | | | `-- v6/ | | | |-- packets | | | |-- bytes | | | |-- unicast/ | | | | |-- packets | | | | `-- bytes | | | `-- multicast/ | | | |-- packets | | | `-- bytes | | |-- errors/ | | | |-- l2/ | | | | `-- rx/ | | | | |-- frames | | | | |-- crc_error/ | | | | | `-- frames | | | | |-- invalid_mac/ | | | | | `-- frames | | | | |-- invalid_vlan/ | | | | | `-- frames | | | | `-- invalid_frame/ | | | | `-- frames | | | |-- l3/ | | | | |-- rx/ | | | | | |-- packets | | | | | |-- checksum_error/ | | | | | | `-- packets | | | | | |-- mtu_exceeded/ | | | | | | `-- packets | | | | | |-- invalid_packet/ | | | | | | `-- packets | | | | | `-- ttl_expired/ | | | | | `-- packets | | | | `-- no_route/ | | | | `-- packets | | | `-- local/ | | | |-- packets | | | `-- hw/ | | | |-- packets | | | `-- parity_error/ | | | `-- packets | | |-- policy/ | | | `-- l3/ | | | |-- packets | | | |-- acl/ | | | | `-- packets | | | |-- policer/ | | | | |-- packets | | | | `-- bytes | | | |-- null_route/ | | | | `-- packets | | | `-- urpf/ | | | `-- packets | | `-- no_buffer/ | | |-- class_0/ | | | |-- packets | | | `-- bytes | | |-- ... | | `-- class_n/ | | |-- packets | | `-- bytes | `-- egress/ | |-- traffic/ | | |-- l2/ | | | |-- frames | | | `-- bytes | | |-- l3/ | | | |-- v4/ | | | | |-- packets | | | | |-- bytes | | | | |-- unicast/ | | | | | |-- packets | | | | | `-- bytes | | | | `-- multicast/ | | | | |-- packets | | | | `-- bytes | | | `-- v6/ | | | |-- packets | | | |-- bytes | | | |-- unicast/ | | | | |-- packets | | | | `-- bytes | | | `-- multicast/ | | | |-- packets | | | `-- bytes | | `-- qos/ | | |-- class_0/ | | | |-- packets | | | `-- bytes | | |-- ... | | `-- class_n/ | | |-- packets | | `-- bytes | `-- discards/ | |-- l2/ | | |-- frames | | `-- bytes | |-- l3/ | | |-- v4/ | | | |-- packets | | | |-- bytes | | | |-- unicast/ | | | | |-- packets | | | | `-- bytes | | | `-- multicast/ | | | |-- packets | | | `-- bytes | | `-- v6/ | | |-- packets | | |-- bytes | | |-- unicast/ | | | |-- packets | | | `-- bytes | | `-- multicast/ | | |-- packets | | `-- bytes | |-- errors/ | | |-- l2/ | | | `-- tx/ | | | `-- frames | | `-- l3/ | | `-- tx/ | | `-- packets | |-- policy/ | | `-- l3/ | | |-- acl/ | | | `-- packets | | `-- policer/ | | |-- packets | | `-- bytes | `-- no_buffer/ | |-- class_0/ | | |-- packets | | `-- bytes | |-- ... | `-- class_n/ | |-- packets | `-- bytes `-- control_plane/ |-- packets |-- bytes `-- policy/ |-- acl/ | `-- packets `-- policer/ `-- packets¶
For additional context, Appendix A provides an example of where packets may be dropped in a device.¶
discards/error/l2/rx/
Frames dropped due to errors in the received L2 frame, e.g. due to failing CRC, invalid header, invalid MAC address, invalid VLAN.¶
discards/error/l3/rx/
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, e.g. header checksum errors, incorrect version, incorrect header length, bad options.¶
discards/error/l3/ttl_expired
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¶
discards/error/l3/no_route/
Discards due to a packet not matching any route.¶
discards/error/local/
A device may drop packets within its switching pipeline due to internal errors, e.g. parity errors. Any discards not explicitly assigned to the above classes are accounted here.¶
discards/policy/
These are intended discards, i.e. packets dropped due to a configured policy. There are multiple sub-classes.¶
discards/policy/l3/acl/
Discards due to packet matching an access control list (ACL).¶
discards/policy/l3/policer/
Discards due to packet matching a configured policer.¶
discards/policy/l3/null_route/
Discards due to a packet matching a route with discard action.¶
discards/policy/l3/urpf/
Discards due to a packet failing unicast reverse path forwarding (RPF) check.¶
discards/no_buffer/
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 [RED93], CODEL [RFC8289].¶
Requirements 1-10 apply to the packets forwarded by the device, i.e. rather than packets destined to/from the device:¶
Assuming all the requirements are met, a good unicast IPv4 packet received would increment:
- interface/ingress/traffic/l3/v4/unicast/packets
- interface/ingress/traffic/l3/v4/unicast/bytes
- interface/ingress/traffic/qos/class_0/packets
- interface/ingress/traffic/qos/class_0/bytes¶
A received unicast IPv6 packet dropped due to TTL expiry would increment:
- interface/ingress/discards/l3/v6/unicast/packets
- interface/ingress/discards/l3/v6/unicast/bytes
- interface/ingress/discards/l3/rx/ttl_expired/packets¶
An IPv4 packet dropped on egress due to no buffers would increment:
- interface/egress/discards/l3/v4/unicast/packets
- interface/egress/discards/l3/v4/unicast/bytes
- interface/egress/discards/no_buffer/class_0/packets
- interface/egress/discards/no_buffer/class_0/bytes¶
Example discard signal-to-cause-to-mitigation mappings are shown in the table below:¶
+-------------------------------------------+---------------------+------------+----------+-------------+-----------------------+ | Discard class | Cause | Discard | Discard | Unintended? | Possible actions | | | | rate | duration | | | +-------------------------------------------+---------------------+------------+----------+-------------+-----------------------+ | ingress/discards/errors/l2/rx | Upstream device | >Baseline | O(1min) | Y | Take upstream link or | | | or link errror | | | | device out-of-service | | ingress/discards/errors/l3/rx/ttl_expired | Tracert | <=Baseline | | N | no action | | ingress/discards/errors/l3/rx/ttl_expired | Convergence | >Baseline | O(1s) | Y | no action | | ingress/discards/errors/l3/rx/ttl_expired | Routing loop | >Baseline | O(1min) | Y | Roll-back change | | .*/policy/.* | Policy | | | N | no action | | ingress/discards/errors/l3/no_route | Convergence | >Baseline | O(1s) | Y | no action | | ingress/discards/errors/l3/no_route | Config error | >Baseline | O(1min) | Y | Roll-back change | | ingress/discards/errors/l3/no_route | Invalid destination | >Baseline | O(10min) | N | Escalate to operator | | ingress/discards/errors/local | Device errors | >Baseline | O(1min) | Y | Take device | | | | | | | out-of-service | | egress/discards/no_buffer | Congestion | <=Baseline | | N | no action | | egress/discards/no_buffer | Congestion | >Baseline | O(1min) | Y | Bring capacity back | | | | | | | into service or move | | | | | | | traffic | +-------------------------------------------+---------------------+------------+----------+-------------+-----------------------+¶
The 'Baseline' in the 'Discard Rate' column is network dependent.¶
There are no new security considerations introduced by this document.¶
There are no new IANA considerations introduced by this document.¶
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 [RFC2119] [RFC8174] when, and only when, they appear in all capitals, as shown here.¶
The content of this draft has benefitted from feedback from JR Rivers, Ronan Waide, Chris DeBruin, Marcoz Sanz, Avinash Kadosh and Nadav Chachmon.¶
The diagram below is an example of where and why packets may be dropped in a typical single ASIC, shared buffered type device, where packets ingress on the left and egress on the right.¶
+----------+ | | | CPU | | | +--+---^---+ from_cpu | | to_cpu | | +------------------------------v---+-------------------------------+ | | +----------+ +----------+ +----------+ +----------+ +----------+ +----------+ +----------+ | | | | | | | | | | | | | | Packet rx -> Phy +--> Mac +--> Ingress +--> Buffers +--> Egresss +--> Mac +--> Phy |> Packet tx | | | | | Pipeline| | | | Pipeline| | | | | +----------+ +----------+ +----------+ +----------+ +----------+ +----------+ +----------+ Intended policy/acl policy/acl Discards: policy/policer policy/policer policy/urpf null_route Unintended error/rx/l2 error/rx/l3 no_buffer error/tx/l3 Discards: error/local no_route ttl¶