| /* SPDX-License-Identifier: GPL-2.0-or-later */ | |
| #ifndef _LINUX_DROPREASON_QDISC_H | |
| #define _LINUX_DROPREASON_QDISC_H | |
| #include <net/dropreason.h> | |
| #define DEFINE_QDISC_DROP_REASON(FN, FNe) \ | |
| FN(UNSPEC) \ | |
| FN(GENERIC) \ | |
| FN(OVERLIMIT) \ | |
| FN(CONGESTED) \ | |
| FN(MAXFLOWS) \ | |
| FN(FLOOD_PROTECTION) \ | |
| FN(BAND_LIMIT) \ | |
| FN(HORIZON_LIMIT) \ | |
| FN(FLOW_LIMIT) \ | |
| FN(L4S_STEP_NON_ECN) \ | |
| FNe(MAX) | |
| #undef FN | |
| #undef FNe | |
| #define FN(reason) QDISC_DROP_##reason, | |
| #define FNe(reason) QDISC_DROP_##reason | |
| /** | |
| * enum qdisc_drop_reason - reason why a qdisc dropped a packet | |
| * | |
| * Qdisc-specific drop reasons for packet drops that occur within the | |
| * traffic control (TC) queueing discipline layer. These reasons provide | |
| * detailed diagnostics about why packets were dropped by various qdisc | |
| * algorithms, enabling fine-grained monitoring and troubleshooting of | |
| * queue behavior. | |
| */ | |
| enum qdisc_drop_reason { | |
| /** | |
| * @QDISC_DROP_UNSPEC: unspecified/invalid qdisc drop reason. | |
| * Value 0 serves as analogous to SKB_NOT_DROPPED_YET for enum skb_drop_reason. | |
| * Used for catching zero-initialized drop_reason fields. | |
| */ | |
| QDISC_DROP_UNSPEC = 0, | |
| /** | |
| * @__QDISC_DROP_REASON: subsystem base value for qdisc drop reasons | |
| */ | |
| __QDISC_DROP_REASON = SKB_DROP_REASON_SUBSYS_QDISC << | |
| SKB_DROP_REASON_SUBSYS_SHIFT, | |
| /** | |
| * @QDISC_DROP_GENERIC: generic/default qdisc drop, used when no | |
| * more specific reason applies | |
| */ | |
| QDISC_DROP_GENERIC, | |
| /** | |
| * @QDISC_DROP_OVERLIMIT: packet dropped because the qdisc queue | |
| * length exceeded its configured limit (sch->limit). This typically | |
| * indicates the queue is full and cannot accept more packets. | |
| */ | |
| QDISC_DROP_OVERLIMIT, | |
| /** | |
| * @QDISC_DROP_CONGESTED: packet dropped due to active congestion | |
| * control algorithms (e.g., CoDel, PIE, RED) detecting network | |
| * congestion. The qdisc proactively dropped the packet to signal | |
| * congestion to the sender and prevent bufferbloat. | |
| */ | |
| QDISC_DROP_CONGESTED, | |
| /** | |
| * @QDISC_DROP_MAXFLOWS: packet dropped because the qdisc's flow | |
| * tracking table is full and no free slots are available to allocate | |
| * for a new flow. This indicates flow table exhaustion in flow-based | |
| * qdiscs that maintain per-flow state (e.g., SFQ). | |
| */ | |
| QDISC_DROP_MAXFLOWS, | |
| /** | |
| * @QDISC_DROP_FLOOD_PROTECTION: packet dropped by flood protection | |
| * mechanism detecting unresponsive flows (potential DoS/flood). | |
| * Used by qdiscs implementing probabilistic drop algorithms like | |
| * BLUE (e.g., CAKE's Cobalt AQM). | |
| */ | |
| QDISC_DROP_FLOOD_PROTECTION, | |
| /** | |
| * @QDISC_DROP_BAND_LIMIT: packet dropped because the priority band's | |
| * limit was reached. Used by qdiscs with priority bands that have | |
| * per-band packet limits (e.g., FQ). | |
| */ | |
| QDISC_DROP_BAND_LIMIT, | |
| /** | |
| * @QDISC_DROP_HORIZON_LIMIT: packet dropped because its timestamp | |
| * is too far in the future (beyond the configured horizon). | |
| * Used by qdiscs with time-based scheduling (e.g., FQ). | |
| */ | |
| QDISC_DROP_HORIZON_LIMIT, | |
| /** | |
| * @QDISC_DROP_FLOW_LIMIT: packet dropped because an individual flow | |
| * exceeded its per-flow packet/depth limit. Used by FQ and SFQ qdiscs | |
| * to enforce per-flow fairness and prevent a single flow from | |
| * monopolizing queue resources. | |
| */ | |
| QDISC_DROP_FLOW_LIMIT, | |
| /** | |
| * @QDISC_DROP_L4S_STEP_NON_ECN: DualPI2 qdisc dropped a non-ECN-capable | |
| * packet because the L4S queue delay exceeded the step threshold. | |
| * Since the packet cannot be ECN-marked, it must be dropped to signal | |
| * congestion. See RFC 9332 for the DualQ Coupled AQM step mechanism. | |
| */ | |
| QDISC_DROP_L4S_STEP_NON_ECN, | |
| /** | |
| * @QDISC_DROP_MAX: the maximum of qdisc drop reasons, which | |
| * shouldn't be used as a real 'reason' - only for tracing code gen | |
| */ | |
| QDISC_DROP_MAX, | |
| }; | |
| #undef FN | |
| #undef FNe | |
| #endif |