/* SPDX-License-Identifier: GPL-2.0-or-later */ #ifndef _LINUX_DROPREASON_QDISC_H #define _LINUX_DROPREASON_QDISC_H #include #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