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