xref: /linux/include/net/dropreason-qdisc.h (revision 91a4855d6c03e770e42f17c798a36a3c46e63de2)
1ff2998f2SJesper Dangaard Brouer /* SPDX-License-Identifier: GPL-2.0-or-later */
2ff2998f2SJesper Dangaard Brouer 
3ff2998f2SJesper Dangaard Brouer #ifndef _LINUX_DROPREASON_QDISC_H
4ff2998f2SJesper Dangaard Brouer #define _LINUX_DROPREASON_QDISC_H
5ff2998f2SJesper Dangaard Brouer #include <net/dropreason.h>
6ff2998f2SJesper Dangaard Brouer 
7ff2998f2SJesper Dangaard Brouer #define DEFINE_QDISC_DROP_REASON(FN, FNe)	\
8ff2998f2SJesper Dangaard Brouer 	FN(UNSPEC)			\
9ff2998f2SJesper Dangaard Brouer 	FN(GENERIC)			\
10ff2998f2SJesper Dangaard Brouer 	FN(OVERLIMIT)			\
11ff2998f2SJesper Dangaard Brouer 	FN(CONGESTED)			\
123e28f8adSJesper Dangaard Brouer 	FN(MAXFLOWS)			\
139d3e7f97SJesper Dangaard Brouer 	FN(FLOOD_PROTECTION)		\
14f30d9073SJesper Dangaard Brouer 	FN(BAND_LIMIT)		\
15f30d9073SJesper Dangaard Brouer 	FN(HORIZON_LIMIT)		\
163e28f8adSJesper Dangaard Brouer 	FN(FLOW_LIMIT)			\
17*67713dffSJesper Dangaard Brouer 	FN(L4S_STEP_NON_ECN)		\
18ff2998f2SJesper Dangaard Brouer 	FNe(MAX)
19ff2998f2SJesper Dangaard Brouer 
20ff2998f2SJesper Dangaard Brouer #undef FN
21ff2998f2SJesper Dangaard Brouer #undef FNe
22ff2998f2SJesper Dangaard Brouer #define FN(reason)	QDISC_DROP_##reason,
23ff2998f2SJesper Dangaard Brouer #define FNe(reason)	QDISC_DROP_##reason
24ff2998f2SJesper Dangaard Brouer 
25ff2998f2SJesper Dangaard Brouer /**
26ff2998f2SJesper Dangaard Brouer  * enum qdisc_drop_reason - reason why a qdisc dropped a packet
27ff2998f2SJesper Dangaard Brouer  *
28ff2998f2SJesper Dangaard Brouer  * Qdisc-specific drop reasons for packet drops that occur within the
29ff2998f2SJesper Dangaard Brouer  * traffic control (TC) queueing discipline layer. These reasons provide
30ff2998f2SJesper Dangaard Brouer  * detailed diagnostics about why packets were dropped by various qdisc
31ff2998f2SJesper Dangaard Brouer  * algorithms, enabling fine-grained monitoring and troubleshooting of
32ff2998f2SJesper Dangaard Brouer  * queue behavior.
33ff2998f2SJesper Dangaard Brouer  */
34ff2998f2SJesper Dangaard Brouer enum qdisc_drop_reason {
35ff2998f2SJesper Dangaard Brouer 	/**
36ff2998f2SJesper Dangaard Brouer 	 * @QDISC_DROP_UNSPEC: unspecified/invalid qdisc drop reason.
37ff2998f2SJesper Dangaard Brouer 	 * Value 0 serves as analogous to SKB_NOT_DROPPED_YET for enum skb_drop_reason.
38ff2998f2SJesper Dangaard Brouer 	 * Used for catching zero-initialized drop_reason fields.
39ff2998f2SJesper Dangaard Brouer 	 */
40ff2998f2SJesper Dangaard Brouer 	QDISC_DROP_UNSPEC = 0,
41ff2998f2SJesper Dangaard Brouer 	/**
42ff2998f2SJesper Dangaard Brouer 	 * @__QDISC_DROP_REASON: subsystem base value for qdisc drop reasons
43ff2998f2SJesper Dangaard Brouer 	 */
44ff2998f2SJesper Dangaard Brouer 	__QDISC_DROP_REASON = SKB_DROP_REASON_SUBSYS_QDISC <<
45ff2998f2SJesper Dangaard Brouer 				SKB_DROP_REASON_SUBSYS_SHIFT,
46ff2998f2SJesper Dangaard Brouer 	/**
47ff2998f2SJesper Dangaard Brouer 	 * @QDISC_DROP_GENERIC: generic/default qdisc drop, used when no
48ff2998f2SJesper Dangaard Brouer 	 * more specific reason applies
49ff2998f2SJesper Dangaard Brouer 	 */
50ff2998f2SJesper Dangaard Brouer 	QDISC_DROP_GENERIC,
51ff2998f2SJesper Dangaard Brouer 	/**
52ff2998f2SJesper Dangaard Brouer 	 * @QDISC_DROP_OVERLIMIT: packet dropped because the qdisc queue
53ff2998f2SJesper Dangaard Brouer 	 * length exceeded its configured limit (sch->limit). This typically
54ff2998f2SJesper Dangaard Brouer 	 * indicates the queue is full and cannot accept more packets.
55ff2998f2SJesper Dangaard Brouer 	 */
56ff2998f2SJesper Dangaard Brouer 	QDISC_DROP_OVERLIMIT,
57ff2998f2SJesper Dangaard Brouer 	/**
58ff2998f2SJesper Dangaard Brouer 	 * @QDISC_DROP_CONGESTED: packet dropped due to active congestion
59ff2998f2SJesper Dangaard Brouer 	 * control algorithms (e.g., CoDel, PIE, RED) detecting network
60ff2998f2SJesper Dangaard Brouer 	 * congestion. The qdisc proactively dropped the packet to signal
61ff2998f2SJesper Dangaard Brouer 	 * congestion to the sender and prevent bufferbloat.
62ff2998f2SJesper Dangaard Brouer 	 */
63ff2998f2SJesper Dangaard Brouer 	QDISC_DROP_CONGESTED,
64ff2998f2SJesper Dangaard Brouer 	/**
653e28f8adSJesper Dangaard Brouer 	 * @QDISC_DROP_MAXFLOWS: packet dropped because the qdisc's flow
663e28f8adSJesper Dangaard Brouer 	 * tracking table is full and no free slots are available to allocate
673e28f8adSJesper Dangaard Brouer 	 * for a new flow. This indicates flow table exhaustion in flow-based
683e28f8adSJesper Dangaard Brouer 	 * qdiscs that maintain per-flow state (e.g., SFQ).
693e28f8adSJesper Dangaard Brouer 	 */
703e28f8adSJesper Dangaard Brouer 	QDISC_DROP_MAXFLOWS,
713e28f8adSJesper Dangaard Brouer 	/**
729d3e7f97SJesper Dangaard Brouer 	 * @QDISC_DROP_FLOOD_PROTECTION: packet dropped by flood protection
739d3e7f97SJesper Dangaard Brouer 	 * mechanism detecting unresponsive flows (potential DoS/flood).
749d3e7f97SJesper Dangaard Brouer 	 * Used by qdiscs implementing probabilistic drop algorithms like
759d3e7f97SJesper Dangaard Brouer 	 * BLUE (e.g., CAKE's Cobalt AQM).
76ff2998f2SJesper Dangaard Brouer 	 */
779d3e7f97SJesper Dangaard Brouer 	QDISC_DROP_FLOOD_PROTECTION,
78ff2998f2SJesper Dangaard Brouer 	/**
79f30d9073SJesper Dangaard Brouer 	 * @QDISC_DROP_BAND_LIMIT: packet dropped because the priority band's
80f30d9073SJesper Dangaard Brouer 	 * limit was reached. Used by qdiscs with priority bands that have
81f30d9073SJesper Dangaard Brouer 	 * per-band packet limits (e.g., FQ).
82ff2998f2SJesper Dangaard Brouer 	 */
83f30d9073SJesper Dangaard Brouer 	QDISC_DROP_BAND_LIMIT,
84ff2998f2SJesper Dangaard Brouer 	/**
85f30d9073SJesper Dangaard Brouer 	 * @QDISC_DROP_HORIZON_LIMIT: packet dropped because its timestamp
86f30d9073SJesper Dangaard Brouer 	 * is too far in the future (beyond the configured horizon).
87f30d9073SJesper Dangaard Brouer 	 * Used by qdiscs with time-based scheduling (e.g., FQ).
88ff2998f2SJesper Dangaard Brouer 	 */
89f30d9073SJesper Dangaard Brouer 	QDISC_DROP_HORIZON_LIMIT,
90ff2998f2SJesper Dangaard Brouer 	/**
913e28f8adSJesper Dangaard Brouer 	 * @QDISC_DROP_FLOW_LIMIT: packet dropped because an individual flow
923e28f8adSJesper Dangaard Brouer 	 * exceeded its per-flow packet/depth limit. Used by FQ and SFQ qdiscs
933e28f8adSJesper Dangaard Brouer 	 * to enforce per-flow fairness and prevent a single flow from
943e28f8adSJesper Dangaard Brouer 	 * monopolizing queue resources.
95ff2998f2SJesper Dangaard Brouer 	 */
963e28f8adSJesper Dangaard Brouer 	QDISC_DROP_FLOW_LIMIT,
97ff2998f2SJesper Dangaard Brouer 	/**
98*67713dffSJesper Dangaard Brouer 	 * @QDISC_DROP_L4S_STEP_NON_ECN: DualPI2 qdisc dropped a non-ECN-capable
99*67713dffSJesper Dangaard Brouer 	 * packet because the L4S queue delay exceeded the step threshold.
100*67713dffSJesper Dangaard Brouer 	 * Since the packet cannot be ECN-marked, it must be dropped to signal
101*67713dffSJesper Dangaard Brouer 	 * congestion. See RFC 9332 for the DualQ Coupled AQM step mechanism.
102*67713dffSJesper Dangaard Brouer 	 */
103*67713dffSJesper Dangaard Brouer 	QDISC_DROP_L4S_STEP_NON_ECN,
104*67713dffSJesper Dangaard Brouer 	/**
105ff2998f2SJesper Dangaard Brouer 	 * @QDISC_DROP_MAX: the maximum of qdisc drop reasons, which
106ff2998f2SJesper Dangaard Brouer 	 * shouldn't be used as a real 'reason' - only for tracing code gen
107ff2998f2SJesper Dangaard Brouer 	 */
108ff2998f2SJesper Dangaard Brouer 	QDISC_DROP_MAX,
109ff2998f2SJesper Dangaard Brouer };
110ff2998f2SJesper Dangaard Brouer 
111ff2998f2SJesper Dangaard Brouer #undef FN
112ff2998f2SJesper Dangaard Brouer #undef FNe
113ff2998f2SJesper Dangaard Brouer 
114ff2998f2SJesper Dangaard Brouer #endif
115