mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-08-05 16:54:27 +00:00

DualPI2 provides L4S-type low latency & loss to traffic that uses a scalable congestion controller (e.g. TCP-Prague, DCTCP) without degrading the performance of 'classic' traffic (e.g. Reno, Cubic etc.). It is to be the reference implementation of IETF RFC9332 DualQ Coupled AQM (https://datatracker.ietf.org/doc/html/rfc9332). Note that creating two independent queues cannot meet the goal of DualPI2 mentioned in RFC9332: "...to preserve fairness between ECN-capable and non-ECN-capable traffic." Further, it could even lead to starvation of Classic traffic, which is also inconsistent with the requirements in RFC9332: "...although priority MUST be bounded in order not to starve Classic traffic." DualPI2 is designed to maintain approximate per-flow fairness on L-queue and C-queue by forming a single qdisc using the coupling factor and scheduler between two queues. The qdisc provides two queues called low latency and classic. It classifies packets based on the ECN field in the IP headers. By default it directs non-ECN and ECT(0) into the classic queue and ECT(1) and CE into the low latency queue, as per the IETF spec. Each queue runs its own AQM: * The classic AQM is called PI2, which is similar to the PIE AQM but more responsive and simpler. Classic traffic requires a decent target queue (default 15ms for Internet deployment) to fully utilize the link and to avoid high drop rates. * The low latency AQM is, by default, a very shallow ECN marking threshold (1ms) similar to that used for DCTCP. The DualQ isolates the low queuing delay of the Low Latency queue from the larger delay of the 'Classic' queue. However, from a bandwidth perspective, flows in either queue will share out the link capacity as if there was just a single queue. This bandwidth pooling effect is achieved by coupling together the drop and ECN-marking probabilities of the two AQMs. The PI2 AQM has two main parameters in addition to its target delay. The integral gain factor alpha is used to slowly correct any persistent standing queue error from the target delay, while the proportional gain factor beta is used to quickly compensate for queue changes (growth or shrinkage). Either alpha and beta are given as a parameter, or they can be calculated by tc from alternative typical and maximum RTT parameters. Internally, the output of a linear Proportional Integral (PI) controller is used for both queues. This output is squared to calculate the drop or ECN-marking probability of the classic queue. This counterbalances the square-root rate equation of Reno/Cubic, which is the trick that balances flow rates across the queues. For the ECN-marking probability of the low latency queue, the output of the base AQM is multiplied by a coupling factor. This determines the balance between the flow rates in each queue. The default setting makes the flow rates roughly equal, which should be generally applicable. If DUALPI2 AQM has detected overload (due to excessive non-responsive traffic in either queue), it will switch to signaling congestion solely using drop, irrespective of the ECN field. Alternatively, it can be configured to limit the drop probability and let the queue grow and eventually overflow (like tail-drop). GSO splitting in DUALPI2 is configurable from userspace while the default behavior is to split gso. When running DUALPI2 at unshaped 10gigE with 4 download streams test, splitting gso apart results in halving the latency with no loss in throughput: Summary of tcp_4down run 'no_split_gso': avg median # data pts Ping (ms) ICMP : 0.53 0.30 ms 350 TCP download avg : 2326.86 N/A Mbits/s 350 TCP download sum : 9307.42 N/A Mbits/s 350 TCP download::1 : 2672.99 2568.73 Mbits/s 350 TCP download::2 : 2586.96 2570.51 Mbits/s 350 TCP download::3 : 1786.26 1798.82 Mbits/s 350 TCP download::4 : 2261.21 2309.49 Mbits/s 350 Summart of tcp_4down run 'split_gso': avg median # data pts Ping (ms) ICMP : 0.22 0.23 ms 350 TCP download avg : 2335.02 N/A Mbits/s 350 TCP download sum : 9340.09 N/A Mbits/s 350 TCP download::1 : 2335.30 2334.22 Mbits/s 350 TCP download::2 : 2334.72 2334.20 Mbits/s 350 TCP download::3 : 2335.28 2334.58 Mbits/s 350 TCP download::4 : 2334.79 2334.39 Mbits/s 350 A similar result is observed when running DUALPI2 at unshaped 1gigE with 1 download stream test: Summary of tcp_1down run 'no_split_gso': avg median # data pts Ping (ms) ICMP : 1.13 1.25 ms 350 TCP download : 941.41 941.46 Mbits/s 350 Summart of tcp_1down run 'split_gso': avg median # data pts Ping (ms) ICMP : 0.51 0.55 ms 350 TCP download : 941.41 941.45 Mbits/s 350 Additional details can be found in the draft: https://datatracker.ietf.org/doc/html/rfc9332 Signed-off-by: Koen De Schepper <koen.de_schepper@nokia-bell-labs.com> Co-developed-by: Olga Albisser <olga@albisser.org> Signed-off-by: Olga Albisser <olga@albisser.org> Co-developed-by: Olivier Tilmans <olivier.tilmans@nokia.com> Signed-off-by: Olivier Tilmans <olivier.tilmans@nokia.com> Co-developed-by: Henrik Steen <henrist@henrist.net> Signed-off-by: Henrik Steen <henrist@henrist.net> Co-developed-by: Chia-Yu Chang <chia-yu.chang@nokia-bell-labs.com> Signed-off-by: Chia-Yu Chang <chia-yu.chang@nokia-bell-labs.com> Signed-off-by: Bob Briscoe <research@bobbriscoe.net> Signed-off-by: Ilpo Järvinen <ij@kernel.org> Acked-by: Dave Taht <dave.taht@gmail.com> Link: https://patch.msgid.link/20250722095915.24485-4-chia-yu.chang@nokia-bell-labs.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
641 lines
20 KiB
C
641 lines
20 KiB
C
/* SPDX-License-Identifier: GPL-2.0-or-later */
|
|
|
|
#ifndef _LINUX_DROPREASON_CORE_H
|
|
#define _LINUX_DROPREASON_CORE_H
|
|
|
|
#define DEFINE_DROP_REASON(FN, FNe) \
|
|
FN(NOT_SPECIFIED) \
|
|
FN(NO_SOCKET) \
|
|
FN(SOCKET_CLOSE) \
|
|
FN(SOCKET_FILTER) \
|
|
FN(SOCKET_RCVBUFF) \
|
|
FN(UNIX_DISCONNECT) \
|
|
FN(UNIX_SKIP_OOB) \
|
|
FN(PKT_TOO_SMALL) \
|
|
FN(TCP_CSUM) \
|
|
FN(UDP_CSUM) \
|
|
FN(NETFILTER_DROP) \
|
|
FN(OTHERHOST) \
|
|
FN(IP_CSUM) \
|
|
FN(IP_INHDR) \
|
|
FN(IP_RPFILTER) \
|
|
FN(UNICAST_IN_L2_MULTICAST) \
|
|
FN(XFRM_POLICY) \
|
|
FN(IP_NOPROTO) \
|
|
FN(PROTO_MEM) \
|
|
FN(TCP_AUTH_HDR) \
|
|
FN(TCP_MD5NOTFOUND) \
|
|
FN(TCP_MD5UNEXPECTED) \
|
|
FN(TCP_MD5FAILURE) \
|
|
FN(TCP_AONOTFOUND) \
|
|
FN(TCP_AOUNEXPECTED) \
|
|
FN(TCP_AOKEYNOTFOUND) \
|
|
FN(TCP_AOFAILURE) \
|
|
FN(SOCKET_BACKLOG) \
|
|
FN(TCP_FLAGS) \
|
|
FN(TCP_ABORT_ON_DATA) \
|
|
FN(TCP_ZEROWINDOW) \
|
|
FN(TCP_OLD_DATA) \
|
|
FN(TCP_OVERWINDOW) \
|
|
FN(TCP_OFOMERGE) \
|
|
FN(TCP_RFC7323_PAWS) \
|
|
FN(TCP_RFC7323_PAWS_ACK) \
|
|
FN(TCP_RFC7323_TW_PAWS) \
|
|
FN(TCP_RFC7323_TSECR) \
|
|
FN(TCP_LISTEN_OVERFLOW) \
|
|
FN(TCP_OLD_SEQUENCE) \
|
|
FN(TCP_INVALID_SEQUENCE) \
|
|
FN(TCP_INVALID_END_SEQUENCE) \
|
|
FN(TCP_INVALID_ACK_SEQUENCE) \
|
|
FN(TCP_RESET) \
|
|
FN(TCP_INVALID_SYN) \
|
|
FN(TCP_CLOSE) \
|
|
FN(TCP_FASTOPEN) \
|
|
FN(TCP_OLD_ACK) \
|
|
FN(TCP_TOO_OLD_ACK) \
|
|
FN(TCP_ACK_UNSENT_DATA) \
|
|
FN(TCP_OFO_QUEUE_PRUNE) \
|
|
FN(TCP_OFO_DROP) \
|
|
FN(IP_OUTNOROUTES) \
|
|
FN(BPF_CGROUP_EGRESS) \
|
|
FN(IPV6DISABLED) \
|
|
FN(NEIGH_CREATEFAIL) \
|
|
FN(NEIGH_FAILED) \
|
|
FN(NEIGH_QUEUEFULL) \
|
|
FN(NEIGH_DEAD) \
|
|
FN(NEIGH_HH_FILLFAIL) \
|
|
FN(TC_EGRESS) \
|
|
FN(SECURITY_HOOK) \
|
|
FN(QDISC_DROP) \
|
|
FN(QDISC_OVERLIMIT) \
|
|
FN(QDISC_CONGESTED) \
|
|
FN(CAKE_FLOOD) \
|
|
FN(FQ_BAND_LIMIT) \
|
|
FN(FQ_HORIZON_LIMIT) \
|
|
FN(FQ_FLOW_LIMIT) \
|
|
FN(CPU_BACKLOG) \
|
|
FN(XDP) \
|
|
FN(TC_INGRESS) \
|
|
FN(UNHANDLED_PROTO) \
|
|
FN(SKB_CSUM) \
|
|
FN(SKB_GSO_SEG) \
|
|
FN(SKB_UCOPY_FAULT) \
|
|
FN(DEV_HDR) \
|
|
FN(DEV_READY) \
|
|
FN(FULL_RING) \
|
|
FN(NOMEM) \
|
|
FN(HDR_TRUNC) \
|
|
FN(TAP_FILTER) \
|
|
FN(TAP_TXFILTER) \
|
|
FN(ICMP_CSUM) \
|
|
FN(INVALID_PROTO) \
|
|
FN(IP_INADDRERRORS) \
|
|
FN(IP_INNOROUTES) \
|
|
FN(IP_LOCAL_SOURCE) \
|
|
FN(IP_INVALID_SOURCE) \
|
|
FN(IP_LOCALNET) \
|
|
FN(IP_INVALID_DEST) \
|
|
FN(PKT_TOO_BIG) \
|
|
FN(DUP_FRAG) \
|
|
FN(FRAG_REASM_TIMEOUT) \
|
|
FN(FRAG_TOO_FAR) \
|
|
FN(TCP_MINTTL) \
|
|
FN(IPV6_BAD_EXTHDR) \
|
|
FN(IPV6_NDISC_FRAG) \
|
|
FN(IPV6_NDISC_HOP_LIMIT) \
|
|
FN(IPV6_NDISC_BAD_CODE) \
|
|
FN(IPV6_NDISC_BAD_OPTIONS) \
|
|
FN(IPV6_NDISC_NS_OTHERHOST) \
|
|
FN(QUEUE_PURGE) \
|
|
FN(TC_COOKIE_ERROR) \
|
|
FN(PACKET_SOCK_ERROR) \
|
|
FN(TC_CHAIN_NOTFOUND) \
|
|
FN(TC_RECLASSIFY_LOOP) \
|
|
FN(VXLAN_INVALID_HDR) \
|
|
FN(VXLAN_VNI_NOT_FOUND) \
|
|
FN(MAC_INVALID_SOURCE) \
|
|
FN(VXLAN_ENTRY_EXISTS) \
|
|
FN(NO_TX_TARGET) \
|
|
FN(IP_TUNNEL_ECN) \
|
|
FN(TUNNEL_TXINFO) \
|
|
FN(LOCAL_MAC) \
|
|
FN(ARP_PVLAN_DISABLE) \
|
|
FN(MAC_IEEE_MAC_CONTROL) \
|
|
FN(BRIDGE_INGRESS_STP_STATE) \
|
|
FN(CAN_RX_INVALID_FRAME) \
|
|
FN(CANFD_RX_INVALID_FRAME) \
|
|
FN(CANXL_RX_INVALID_FRAME) \
|
|
FN(PFMEMALLOC) \
|
|
FN(DUALPI2_STEP_DROP) \
|
|
FNe(MAX)
|
|
|
|
/**
|
|
* enum skb_drop_reason - the reasons of skb drops
|
|
*
|
|
* The reason of skb drop, which is used in kfree_skb_reason().
|
|
*/
|
|
enum skb_drop_reason {
|
|
/**
|
|
* @SKB_NOT_DROPPED_YET: skb is not dropped yet (used for no-drop case)
|
|
*/
|
|
SKB_NOT_DROPPED_YET = 0,
|
|
/** @SKB_CONSUMED: packet has been consumed */
|
|
SKB_CONSUMED,
|
|
/** @SKB_DROP_REASON_NOT_SPECIFIED: drop reason is not specified */
|
|
SKB_DROP_REASON_NOT_SPECIFIED,
|
|
/**
|
|
* @SKB_DROP_REASON_NO_SOCKET: no valid socket that can be used.
|
|
* Reason could be one of three cases:
|
|
* 1) no established/listening socket found during lookup process
|
|
* 2) no valid request socket during 3WHS process
|
|
* 3) no valid child socket during 3WHS process
|
|
*/
|
|
SKB_DROP_REASON_NO_SOCKET,
|
|
/** @SKB_DROP_REASON_SOCKET_CLOSE: socket is close()d */
|
|
SKB_DROP_REASON_SOCKET_CLOSE,
|
|
/** @SKB_DROP_REASON_SOCKET_FILTER: dropped by socket filter */
|
|
SKB_DROP_REASON_SOCKET_FILTER,
|
|
/** @SKB_DROP_REASON_SOCKET_RCVBUFF: socket receive buff is full */
|
|
SKB_DROP_REASON_SOCKET_RCVBUFF,
|
|
/**
|
|
* @SKB_DROP_REASON_UNIX_DISCONNECT: recv queue is purged when SOCK_DGRAM
|
|
* or SOCK_SEQPACKET socket re-connect()s to another socket or notices
|
|
* during send() that the peer has been close()d.
|
|
*/
|
|
SKB_DROP_REASON_UNIX_DISCONNECT,
|
|
/**
|
|
* @SKB_DROP_REASON_UNIX_SKIP_OOB: Out-Of-Band data is skipped by
|
|
* recv() without MSG_OOB so dropped.
|
|
*/
|
|
SKB_DROP_REASON_UNIX_SKIP_OOB,
|
|
/** @SKB_DROP_REASON_PKT_TOO_SMALL: packet size is too small */
|
|
SKB_DROP_REASON_PKT_TOO_SMALL,
|
|
/** @SKB_DROP_REASON_TCP_CSUM: TCP checksum error */
|
|
SKB_DROP_REASON_TCP_CSUM,
|
|
/** @SKB_DROP_REASON_UDP_CSUM: UDP checksum error */
|
|
SKB_DROP_REASON_UDP_CSUM,
|
|
/** @SKB_DROP_REASON_NETFILTER_DROP: dropped by netfilter */
|
|
SKB_DROP_REASON_NETFILTER_DROP,
|
|
/**
|
|
* @SKB_DROP_REASON_OTHERHOST: packet don't belong to current host
|
|
* (interface is in promisc mode)
|
|
*/
|
|
SKB_DROP_REASON_OTHERHOST,
|
|
/** @SKB_DROP_REASON_IP_CSUM: IP checksum error */
|
|
SKB_DROP_REASON_IP_CSUM,
|
|
/**
|
|
* @SKB_DROP_REASON_IP_INHDR: there is something wrong with IP header (see
|
|
* IPSTATS_MIB_INHDRERRORS)
|
|
*/
|
|
SKB_DROP_REASON_IP_INHDR,
|
|
/**
|
|
* @SKB_DROP_REASON_IP_RPFILTER: IP rpfilter validate failed. see the
|
|
* document for rp_filter in ip-sysctl.rst for more information
|
|
*/
|
|
SKB_DROP_REASON_IP_RPFILTER,
|
|
/**
|
|
* @SKB_DROP_REASON_UNICAST_IN_L2_MULTICAST: destination address of L2 is
|
|
* multicast, but L3 is unicast.
|
|
*/
|
|
SKB_DROP_REASON_UNICAST_IN_L2_MULTICAST,
|
|
/** @SKB_DROP_REASON_XFRM_POLICY: xfrm policy check failed */
|
|
SKB_DROP_REASON_XFRM_POLICY,
|
|
/** @SKB_DROP_REASON_IP_NOPROTO: no support for IP protocol */
|
|
SKB_DROP_REASON_IP_NOPROTO,
|
|
/**
|
|
* @SKB_DROP_REASON_PROTO_MEM: proto memory limitation, such as
|
|
* udp packet drop out of udp_memory_allocated.
|
|
*/
|
|
SKB_DROP_REASON_PROTO_MEM,
|
|
/**
|
|
* @SKB_DROP_REASON_TCP_AUTH_HDR: TCP-MD5 or TCP-AO hashes are met
|
|
* twice or set incorrectly.
|
|
*/
|
|
SKB_DROP_REASON_TCP_AUTH_HDR,
|
|
/**
|
|
* @SKB_DROP_REASON_TCP_MD5NOTFOUND: no MD5 hash and one expected,
|
|
* corresponding to LINUX_MIB_TCPMD5NOTFOUND
|
|
*/
|
|
SKB_DROP_REASON_TCP_MD5NOTFOUND,
|
|
/**
|
|
* @SKB_DROP_REASON_TCP_MD5UNEXPECTED: MD5 hash and we're not expecting
|
|
* one, corresponding to LINUX_MIB_TCPMD5UNEXPECTED
|
|
*/
|
|
SKB_DROP_REASON_TCP_MD5UNEXPECTED,
|
|
/**
|
|
* @SKB_DROP_REASON_TCP_MD5FAILURE: MD5 hash and its wrong, corresponding
|
|
* to LINUX_MIB_TCPMD5FAILURE
|
|
*/
|
|
SKB_DROP_REASON_TCP_MD5FAILURE,
|
|
/**
|
|
* @SKB_DROP_REASON_TCP_AONOTFOUND: no TCP-AO hash and one was expected,
|
|
* corresponding to LINUX_MIB_TCPAOREQUIRED
|
|
*/
|
|
SKB_DROP_REASON_TCP_AONOTFOUND,
|
|
/**
|
|
* @SKB_DROP_REASON_TCP_AOUNEXPECTED: TCP-AO hash is present and it
|
|
* was not expected, corresponding to LINUX_MIB_TCPAOKEYNOTFOUND
|
|
*/
|
|
SKB_DROP_REASON_TCP_AOUNEXPECTED,
|
|
/**
|
|
* @SKB_DROP_REASON_TCP_AOKEYNOTFOUND: TCP-AO key is unknown,
|
|
* corresponding to LINUX_MIB_TCPAOKEYNOTFOUND
|
|
*/
|
|
SKB_DROP_REASON_TCP_AOKEYNOTFOUND,
|
|
/**
|
|
* @SKB_DROP_REASON_TCP_AOFAILURE: TCP-AO hash is wrong,
|
|
* corresponding to LINUX_MIB_TCPAOBAD
|
|
*/
|
|
SKB_DROP_REASON_TCP_AOFAILURE,
|
|
/**
|
|
* @SKB_DROP_REASON_SOCKET_BACKLOG: failed to add skb to socket backlog (
|
|
* see LINUX_MIB_TCPBACKLOGDROP)
|
|
*/
|
|
SKB_DROP_REASON_SOCKET_BACKLOG,
|
|
/** @SKB_DROP_REASON_TCP_FLAGS: TCP flags invalid */
|
|
SKB_DROP_REASON_TCP_FLAGS,
|
|
/**
|
|
* @SKB_DROP_REASON_TCP_ABORT_ON_DATA: abort on data, corresponding to
|
|
* LINUX_MIB_TCPABORTONDATA
|
|
*/
|
|
SKB_DROP_REASON_TCP_ABORT_ON_DATA,
|
|
/**
|
|
* @SKB_DROP_REASON_TCP_ZEROWINDOW: TCP receive window size is zero,
|
|
* see LINUX_MIB_TCPZEROWINDOWDROP
|
|
*/
|
|
SKB_DROP_REASON_TCP_ZEROWINDOW,
|
|
/**
|
|
* @SKB_DROP_REASON_TCP_OLD_DATA: the TCP data received is already
|
|
* received before (spurious retrans may happened), see
|
|
* LINUX_MIB_DELAYEDACKLOST
|
|
*/
|
|
SKB_DROP_REASON_TCP_OLD_DATA,
|
|
/**
|
|
* @SKB_DROP_REASON_TCP_OVERWINDOW: the TCP data is out of window,
|
|
* the seq of the first byte exceed the right edges of receive
|
|
* window
|
|
*/
|
|
SKB_DROP_REASON_TCP_OVERWINDOW,
|
|
/**
|
|
* @SKB_DROP_REASON_TCP_OFOMERGE: the data of skb is already in the ofo
|
|
* queue, corresponding to LINUX_MIB_TCPOFOMERGE
|
|
*/
|
|
SKB_DROP_REASON_TCP_OFOMERGE,
|
|
/**
|
|
* @SKB_DROP_REASON_TCP_RFC7323_PAWS: PAWS check, corresponding to
|
|
* LINUX_MIB_PAWSESTABREJECTED, LINUX_MIB_PAWSACTIVEREJECTED
|
|
*/
|
|
SKB_DROP_REASON_TCP_RFC7323_PAWS,
|
|
/**
|
|
* @SKB_DROP_REASON_TCP_RFC7323_PAWS_ACK: PAWS check, old ACK packet.
|
|
* Corresponds to LINUX_MIB_PAWS_OLD_ACK.
|
|
*/
|
|
SKB_DROP_REASON_TCP_RFC7323_PAWS_ACK,
|
|
/**
|
|
* @SKB_DROP_REASON_TCP_RFC7323_TW_PAWS: PAWS check, socket is in
|
|
* TIME_WAIT state.
|
|
* Corresponds to LINUX_MIB_PAWS_TW_REJECTED.
|
|
*/
|
|
SKB_DROP_REASON_TCP_RFC7323_TW_PAWS,
|
|
/**
|
|
* @SKB_DROP_REASON_TCP_RFC7323_TSECR: PAWS check, invalid TSEcr.
|
|
* Corresponds to LINUX_MIB_TSECRREJECTED.
|
|
*/
|
|
SKB_DROP_REASON_TCP_RFC7323_TSECR,
|
|
/** @SKB_DROP_REASON_TCP_LISTEN_OVERFLOW: listener queue full. */
|
|
SKB_DROP_REASON_TCP_LISTEN_OVERFLOW,
|
|
/** @SKB_DROP_REASON_TCP_OLD_SEQUENCE: Old SEQ field (duplicate packet) */
|
|
SKB_DROP_REASON_TCP_OLD_SEQUENCE,
|
|
/** @SKB_DROP_REASON_TCP_INVALID_SEQUENCE: Not acceptable SEQ field. */
|
|
SKB_DROP_REASON_TCP_INVALID_SEQUENCE,
|
|
/**
|
|
* @SKB_DROP_REASON_TCP_INVALID_END_SEQUENCE:
|
|
* Not acceptable END_SEQ field.
|
|
* Corresponds to LINUX_MIB_BEYOND_WINDOW.
|
|
*/
|
|
SKB_DROP_REASON_TCP_INVALID_END_SEQUENCE,
|
|
/**
|
|
* @SKB_DROP_REASON_TCP_INVALID_ACK_SEQUENCE: Not acceptable ACK SEQ
|
|
* field because ack sequence is not in the window between snd_una
|
|
* and snd_nxt
|
|
*/
|
|
SKB_DROP_REASON_TCP_INVALID_ACK_SEQUENCE,
|
|
/** @SKB_DROP_REASON_TCP_RESET: Invalid RST packet */
|
|
SKB_DROP_REASON_TCP_RESET,
|
|
/**
|
|
* @SKB_DROP_REASON_TCP_INVALID_SYN: Incoming packet has unexpected
|
|
* SYN flag
|
|
*/
|
|
SKB_DROP_REASON_TCP_INVALID_SYN,
|
|
/** @SKB_DROP_REASON_TCP_CLOSE: TCP socket in CLOSE state */
|
|
SKB_DROP_REASON_TCP_CLOSE,
|
|
/** @SKB_DROP_REASON_TCP_FASTOPEN: dropped by FASTOPEN request socket */
|
|
SKB_DROP_REASON_TCP_FASTOPEN,
|
|
/** @SKB_DROP_REASON_TCP_OLD_ACK: TCP ACK is old, but in window */
|
|
SKB_DROP_REASON_TCP_OLD_ACK,
|
|
/** @SKB_DROP_REASON_TCP_TOO_OLD_ACK: TCP ACK is too old */
|
|
SKB_DROP_REASON_TCP_TOO_OLD_ACK,
|
|
/**
|
|
* @SKB_DROP_REASON_TCP_ACK_UNSENT_DATA: TCP ACK for data we haven't
|
|
* sent yet
|
|
*/
|
|
SKB_DROP_REASON_TCP_ACK_UNSENT_DATA,
|
|
/** @SKB_DROP_REASON_TCP_OFO_QUEUE_PRUNE: pruned from TCP OFO queue */
|
|
SKB_DROP_REASON_TCP_OFO_QUEUE_PRUNE,
|
|
/** @SKB_DROP_REASON_TCP_OFO_DROP: data already in receive queue */
|
|
SKB_DROP_REASON_TCP_OFO_DROP,
|
|
/** @SKB_DROP_REASON_IP_OUTNOROUTES: route lookup failed */
|
|
SKB_DROP_REASON_IP_OUTNOROUTES,
|
|
/**
|
|
* @SKB_DROP_REASON_BPF_CGROUP_EGRESS: dropped by BPF_PROG_TYPE_CGROUP_SKB
|
|
* eBPF program
|
|
*/
|
|
SKB_DROP_REASON_BPF_CGROUP_EGRESS,
|
|
/** @SKB_DROP_REASON_IPV6DISABLED: IPv6 is disabled on the device */
|
|
SKB_DROP_REASON_IPV6DISABLED,
|
|
/** @SKB_DROP_REASON_NEIGH_CREATEFAIL: failed to create neigh entry */
|
|
SKB_DROP_REASON_NEIGH_CREATEFAIL,
|
|
/** @SKB_DROP_REASON_NEIGH_FAILED: neigh entry in failed state */
|
|
SKB_DROP_REASON_NEIGH_FAILED,
|
|
/** @SKB_DROP_REASON_NEIGH_QUEUEFULL: arp_queue for neigh entry is full */
|
|
SKB_DROP_REASON_NEIGH_QUEUEFULL,
|
|
/** @SKB_DROP_REASON_NEIGH_DEAD: neigh entry is dead */
|
|
SKB_DROP_REASON_NEIGH_DEAD,
|
|
/** @SKB_DROP_REASON_NEIGH_HH_FILLFAIL: failed to fill the device hard header */
|
|
SKB_DROP_REASON_NEIGH_HH_FILLFAIL,
|
|
/** @SKB_DROP_REASON_TC_EGRESS: dropped in TC egress HOOK */
|
|
SKB_DROP_REASON_TC_EGRESS,
|
|
/** @SKB_DROP_REASON_SECURITY_HOOK: dropped due to security HOOK */
|
|
SKB_DROP_REASON_SECURITY_HOOK,
|
|
/**
|
|
* @SKB_DROP_REASON_QDISC_DROP: dropped by qdisc when packet outputting (
|
|
* failed to enqueue to current qdisc)
|
|
*/
|
|
SKB_DROP_REASON_QDISC_DROP,
|
|
/**
|
|
* @SKB_DROP_REASON_QDISC_OVERLIMIT: dropped by qdisc when a qdisc
|
|
* instance exceeds its total buffer size limit.
|
|
*/
|
|
SKB_DROP_REASON_QDISC_OVERLIMIT,
|
|
/**
|
|
* @SKB_DROP_REASON_QDISC_CONGESTED: dropped by a qdisc AQM algorithm
|
|
* due to congestion.
|
|
*/
|
|
SKB_DROP_REASON_QDISC_CONGESTED,
|
|
/**
|
|
* @SKB_DROP_REASON_CAKE_FLOOD: dropped by the flood protection part of
|
|
* CAKE qdisc AQM algorithm (BLUE).
|
|
*/
|
|
SKB_DROP_REASON_CAKE_FLOOD,
|
|
/**
|
|
* @SKB_DROP_REASON_FQ_BAND_LIMIT: dropped by fq qdisc when per band
|
|
* limit is reached.
|
|
*/
|
|
SKB_DROP_REASON_FQ_BAND_LIMIT,
|
|
/**
|
|
* @SKB_DROP_REASON_FQ_HORIZON_LIMIT: dropped by fq qdisc when packet
|
|
* timestamp is too far in the future.
|
|
*/
|
|
SKB_DROP_REASON_FQ_HORIZON_LIMIT,
|
|
/**
|
|
* @SKB_DROP_REASON_FQ_FLOW_LIMIT: dropped by fq qdisc when a flow
|
|
* exceeds its limits.
|
|
*/
|
|
SKB_DROP_REASON_FQ_FLOW_LIMIT,
|
|
/**
|
|
* @SKB_DROP_REASON_CPU_BACKLOG: failed to enqueue the skb to the per CPU
|
|
* backlog queue. This can be caused by backlog queue full (see
|
|
* netdev_max_backlog in net.rst) or RPS flow limit
|
|
*/
|
|
SKB_DROP_REASON_CPU_BACKLOG,
|
|
/** @SKB_DROP_REASON_XDP: dropped by XDP in input path */
|
|
SKB_DROP_REASON_XDP,
|
|
/** @SKB_DROP_REASON_TC_INGRESS: dropped in TC ingress HOOK */
|
|
SKB_DROP_REASON_TC_INGRESS,
|
|
/** @SKB_DROP_REASON_UNHANDLED_PROTO: protocol not implemented or not supported */
|
|
SKB_DROP_REASON_UNHANDLED_PROTO,
|
|
/** @SKB_DROP_REASON_SKB_CSUM: sk_buff checksum computation error */
|
|
SKB_DROP_REASON_SKB_CSUM,
|
|
/** @SKB_DROP_REASON_SKB_GSO_SEG: gso segmentation error */
|
|
SKB_DROP_REASON_SKB_GSO_SEG,
|
|
/**
|
|
* @SKB_DROP_REASON_SKB_UCOPY_FAULT: failed to copy data from user space,
|
|
* e.g., via zerocopy_sg_from_iter() or skb_orphan_frags_rx()
|
|
*/
|
|
SKB_DROP_REASON_SKB_UCOPY_FAULT,
|
|
/** @SKB_DROP_REASON_DEV_HDR: device driver specific header/metadata is invalid */
|
|
SKB_DROP_REASON_DEV_HDR,
|
|
/**
|
|
* @SKB_DROP_REASON_DEV_READY: the device is not ready to xmit/recv due to
|
|
* any of its data structure that is not up/ready/initialized,
|
|
* e.g., the IFF_UP is not set, or driver specific tun->tfiles[txq]
|
|
* is not initialized
|
|
*/
|
|
SKB_DROP_REASON_DEV_READY,
|
|
/** @SKB_DROP_REASON_FULL_RING: ring buffer is full */
|
|
SKB_DROP_REASON_FULL_RING,
|
|
/** @SKB_DROP_REASON_NOMEM: error due to OOM */
|
|
SKB_DROP_REASON_NOMEM,
|
|
/**
|
|
* @SKB_DROP_REASON_HDR_TRUNC: failed to trunc/extract the header from
|
|
* networking data, e.g., failed to pull the protocol header from
|
|
* frags via pskb_may_pull()
|
|
*/
|
|
SKB_DROP_REASON_HDR_TRUNC,
|
|
/**
|
|
* @SKB_DROP_REASON_TAP_FILTER: dropped by (ebpf) filter directly attached
|
|
* to tun/tap, e.g., via TUNSETFILTEREBPF
|
|
*/
|
|
SKB_DROP_REASON_TAP_FILTER,
|
|
/**
|
|
* @SKB_DROP_REASON_TAP_TXFILTER: dropped by tx filter implemented at
|
|
* tun/tap, e.g., check_filter()
|
|
*/
|
|
SKB_DROP_REASON_TAP_TXFILTER,
|
|
/** @SKB_DROP_REASON_ICMP_CSUM: ICMP checksum error */
|
|
SKB_DROP_REASON_ICMP_CSUM,
|
|
/**
|
|
* @SKB_DROP_REASON_INVALID_PROTO: the packet doesn't follow RFC 2211,
|
|
* such as a broadcasts ICMP_TIMESTAMP
|
|
*/
|
|
SKB_DROP_REASON_INVALID_PROTO,
|
|
/**
|
|
* @SKB_DROP_REASON_IP_INADDRERRORS: host unreachable, corresponding to
|
|
* IPSTATS_MIB_INADDRERRORS
|
|
*/
|
|
SKB_DROP_REASON_IP_INADDRERRORS,
|
|
/**
|
|
* @SKB_DROP_REASON_IP_INNOROUTES: network unreachable, corresponding to
|
|
* IPSTATS_MIB_INADDRERRORS
|
|
*/
|
|
SKB_DROP_REASON_IP_INNOROUTES,
|
|
/** @SKB_DROP_REASON_IP_LOCAL_SOURCE: the source ip is local */
|
|
SKB_DROP_REASON_IP_LOCAL_SOURCE,
|
|
/**
|
|
* @SKB_DROP_REASON_IP_INVALID_SOURCE: the source ip is invalid:
|
|
* 1) source ip is multicast or limited broadcast
|
|
* 2) source ip is zero and not IGMP
|
|
*/
|
|
SKB_DROP_REASON_IP_INVALID_SOURCE,
|
|
/** @SKB_DROP_REASON_IP_LOCALNET: source or dest ip is local net */
|
|
SKB_DROP_REASON_IP_LOCALNET,
|
|
/**
|
|
* @SKB_DROP_REASON_IP_INVALID_DEST: the dest ip is invalid:
|
|
* 1) dest ip is 0
|
|
*/
|
|
SKB_DROP_REASON_IP_INVALID_DEST,
|
|
/**
|
|
* @SKB_DROP_REASON_PKT_TOO_BIG: packet size is too big (maybe exceed the
|
|
* MTU)
|
|
*/
|
|
SKB_DROP_REASON_PKT_TOO_BIG,
|
|
/** @SKB_DROP_REASON_DUP_FRAG: duplicate fragment */
|
|
SKB_DROP_REASON_DUP_FRAG,
|
|
/** @SKB_DROP_REASON_FRAG_REASM_TIMEOUT: fragment reassembly timeout */
|
|
SKB_DROP_REASON_FRAG_REASM_TIMEOUT,
|
|
/**
|
|
* @SKB_DROP_REASON_FRAG_TOO_FAR: ipv4 fragment too far.
|
|
* (/proc/sys/net/ipv4/ipfrag_max_dist)
|
|
*/
|
|
SKB_DROP_REASON_FRAG_TOO_FAR,
|
|
/**
|
|
* @SKB_DROP_REASON_TCP_MINTTL: ipv4 ttl or ipv6 hoplimit below
|
|
* the threshold (IP_MINTTL or IPV6_MINHOPCOUNT).
|
|
*/
|
|
SKB_DROP_REASON_TCP_MINTTL,
|
|
/** @SKB_DROP_REASON_IPV6_BAD_EXTHDR: Bad IPv6 extension header. */
|
|
SKB_DROP_REASON_IPV6_BAD_EXTHDR,
|
|
/** @SKB_DROP_REASON_IPV6_NDISC_FRAG: invalid frag (suppress_frag_ndisc). */
|
|
SKB_DROP_REASON_IPV6_NDISC_FRAG,
|
|
/** @SKB_DROP_REASON_IPV6_NDISC_HOP_LIMIT: invalid hop limit. */
|
|
SKB_DROP_REASON_IPV6_NDISC_HOP_LIMIT,
|
|
/** @SKB_DROP_REASON_IPV6_NDISC_BAD_CODE: invalid NDISC icmp6 code. */
|
|
SKB_DROP_REASON_IPV6_NDISC_BAD_CODE,
|
|
/** @SKB_DROP_REASON_IPV6_NDISC_BAD_OPTIONS: invalid NDISC options. */
|
|
SKB_DROP_REASON_IPV6_NDISC_BAD_OPTIONS,
|
|
/**
|
|
* @SKB_DROP_REASON_IPV6_NDISC_NS_OTHERHOST: NEIGHBOUR SOLICITATION
|
|
* for another host.
|
|
*/
|
|
SKB_DROP_REASON_IPV6_NDISC_NS_OTHERHOST,
|
|
/** @SKB_DROP_REASON_QUEUE_PURGE: bulk free. */
|
|
SKB_DROP_REASON_QUEUE_PURGE,
|
|
/**
|
|
* @SKB_DROP_REASON_TC_COOKIE_ERROR: An error occurred whilst
|
|
* processing a tc ext cookie.
|
|
*/
|
|
SKB_DROP_REASON_TC_COOKIE_ERROR,
|
|
/**
|
|
* @SKB_DROP_REASON_PACKET_SOCK_ERROR: generic packet socket errors
|
|
* after its filter matches an incoming packet.
|
|
*/
|
|
SKB_DROP_REASON_PACKET_SOCK_ERROR,
|
|
/** @SKB_DROP_REASON_TC_CHAIN_NOTFOUND: tc chain lookup failed. */
|
|
SKB_DROP_REASON_TC_CHAIN_NOTFOUND,
|
|
/**
|
|
* @SKB_DROP_REASON_TC_RECLASSIFY_LOOP: tc exceeded max reclassify loop
|
|
* iterations.
|
|
*/
|
|
SKB_DROP_REASON_TC_RECLASSIFY_LOOP,
|
|
/**
|
|
* @SKB_DROP_REASON_VXLAN_INVALID_HDR: VXLAN header is invalid. E.g.:
|
|
* 1) reserved fields are not zero
|
|
* 2) "I" flag is not set
|
|
*/
|
|
SKB_DROP_REASON_VXLAN_INVALID_HDR,
|
|
/** @SKB_DROP_REASON_VXLAN_VNI_NOT_FOUND: no VXLAN device found for VNI */
|
|
SKB_DROP_REASON_VXLAN_VNI_NOT_FOUND,
|
|
/** @SKB_DROP_REASON_MAC_INVALID_SOURCE: source mac is invalid */
|
|
SKB_DROP_REASON_MAC_INVALID_SOURCE,
|
|
/**
|
|
* @SKB_DROP_REASON_VXLAN_ENTRY_EXISTS: trying to migrate a static
|
|
* entry or an entry pointing to a nexthop.
|
|
*/
|
|
SKB_DROP_REASON_VXLAN_ENTRY_EXISTS,
|
|
/** @SKB_DROP_REASON_NO_TX_TARGET: no target found for xmit */
|
|
SKB_DROP_REASON_NO_TX_TARGET,
|
|
/**
|
|
* @SKB_DROP_REASON_IP_TUNNEL_ECN: skb is dropped according to
|
|
* RFC 6040 4.2, see __INET_ECN_decapsulate() for detail.
|
|
*/
|
|
SKB_DROP_REASON_IP_TUNNEL_ECN,
|
|
/**
|
|
* @SKB_DROP_REASON_TUNNEL_TXINFO: packet without necessary metadata
|
|
* reached a device which is in "external" mode.
|
|
*/
|
|
SKB_DROP_REASON_TUNNEL_TXINFO,
|
|
/**
|
|
* @SKB_DROP_REASON_LOCAL_MAC: the source MAC address is equal to
|
|
* the MAC address of the local netdev.
|
|
*/
|
|
SKB_DROP_REASON_LOCAL_MAC,
|
|
/**
|
|
* @SKB_DROP_REASON_ARP_PVLAN_DISABLE: packet which is not IP is
|
|
* forwarded to the in_dev, and the proxy_arp_pvlan is not
|
|
* enabled.
|
|
*/
|
|
SKB_DROP_REASON_ARP_PVLAN_DISABLE,
|
|
/**
|
|
* @SKB_DROP_REASON_MAC_IEEE_MAC_CONTROL: the destination MAC address
|
|
* is an IEEE MAC Control address.
|
|
*/
|
|
SKB_DROP_REASON_MAC_IEEE_MAC_CONTROL,
|
|
/**
|
|
* @SKB_DROP_REASON_BRIDGE_INGRESS_STP_STATE: the STP state of the
|
|
* ingress bridge port does not allow frames to be forwarded.
|
|
*/
|
|
SKB_DROP_REASON_BRIDGE_INGRESS_STP_STATE,
|
|
/**
|
|
* @SKB_DROP_REASON_CAN_RX_INVALID_FRAME: received
|
|
* non conform CAN frame (or device is unable to receive CAN frames)
|
|
*/
|
|
SKB_DROP_REASON_CAN_RX_INVALID_FRAME,
|
|
/**
|
|
* @SKB_DROP_REASON_CANFD_RX_INVALID_FRAME: received
|
|
* non conform CAN-FD frame (or device is unable to receive CAN frames)
|
|
*/
|
|
SKB_DROP_REASON_CANFD_RX_INVALID_FRAME,
|
|
/**
|
|
* @SKB_DROP_REASON_CANXL_RX_INVALID_FRAME: received
|
|
* non conform CAN-XL frame (or device is unable to receive CAN frames)
|
|
*/
|
|
SKB_DROP_REASON_CANXL_RX_INVALID_FRAME,
|
|
/**
|
|
* @SKB_DROP_REASON_PFMEMALLOC: packet allocated from memory reserve
|
|
* reached a path or socket not eligible for use of memory reserves
|
|
*/
|
|
SKB_DROP_REASON_PFMEMALLOC,
|
|
/**
|
|
* @SKB_DROP_REASON_DUALPI2_STEP_DROP: dropped by the step drop
|
|
* threshold of DualPI2 qdisc.
|
|
*/
|
|
SKB_DROP_REASON_DUALPI2_STEP_DROP,
|
|
/**
|
|
* @SKB_DROP_REASON_MAX: the maximum of core drop reasons, which
|
|
* shouldn't be used as a real 'reason' - only for tracing code gen
|
|
*/
|
|
SKB_DROP_REASON_MAX,
|
|
|
|
/**
|
|
* @SKB_DROP_REASON_SUBSYS_MASK: subsystem mask in drop reasons,
|
|
* see &enum skb_drop_reason_subsys
|
|
*/
|
|
SKB_DROP_REASON_SUBSYS_MASK = 0xffff0000,
|
|
};
|
|
|
|
#define SKB_DROP_REASON_SUBSYS_SHIFT 16
|
|
|
|
#define SKB_DR_INIT(name, reason) \
|
|
enum skb_drop_reason name = SKB_DROP_REASON_##reason
|
|
#define SKB_DR(name) \
|
|
SKB_DR_INIT(name, NOT_SPECIFIED)
|
|
#define SKB_DR_SET(name, reason) \
|
|
(name = SKB_DROP_REASON_##reason)
|
|
#define SKB_DR_OR(name, reason) \
|
|
do { \
|
|
if (name == SKB_DROP_REASON_NOT_SPECIFIED || \
|
|
name == SKB_NOT_DROPPED_YET) \
|
|
SKB_DR_SET(name, reason); \
|
|
} while (0)
|
|
|
|
#endif
|