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