summaryrefslogtreecommitdiff
path: root/include/net/dropreason.h
blob: 013ff0f2543ea09f5ad47ea03644584eb65e4120 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
/* SPDX-License-Identifier: GPL-2.0-or-later */

#ifndef _LINUX_DROPREASON_H
#define _LINUX_DROPREASON_H

/* The reason of skb drop, which is used in kfree_skb_reason().
 * en...maybe they should be splited by group?
 *
 * Each item here should also be in 'TRACE_SKB_DROP_REASON', which is
 * used to translate the reason to string.
 */
enum skb_drop_reason {
	SKB_NOT_DROPPED_YET = 0,
	SKB_DROP_REASON_NOT_SPECIFIED,	/* drop reason is not specified */
	SKB_DROP_REASON_NO_SOCKET,	/* socket not found */
	SKB_DROP_REASON_PKT_TOO_SMALL,	/* packet size is too small */
	SKB_DROP_REASON_TCP_CSUM,	/* TCP checksum error */
	SKB_DROP_REASON_SOCKET_FILTER,	/* dropped by socket filter */
	SKB_DROP_REASON_UDP_CSUM,	/* UDP checksum error */
	SKB_DROP_REASON_NETFILTER_DROP,	/* dropped by netfilter */
	SKB_DROP_REASON_OTHERHOST,	/* packet don't belong to current
					 * host (interface is in promisc
					 * mode)
					 */
	SKB_DROP_REASON_IP_CSUM,	/* IP checksum error */
	SKB_DROP_REASON_IP_INHDR,	/* there is something wrong with
					 * IP header (see
					 * IPSTATS_MIB_INHDRERRORS)
					 */
	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_UNICAST_IN_L2_MULTICAST, /* destination address of L2
						  * is multicast, but L3 is
						  * unicast.
						  */
	SKB_DROP_REASON_XFRM_POLICY,	/* xfrm policy check failed */
	SKB_DROP_REASON_IP_NOPROTO,	/* no support for IP protocol */
	SKB_DROP_REASON_SOCKET_RCVBUFF,	/* socket receive buff is full */
	SKB_DROP_REASON_PROTO_MEM,	/* proto memory limition, such as
					 * udp packet drop out of
					 * udp_memory_allocated.
					 */
	SKB_DROP_REASON_TCP_MD5NOTFOUND,	/* no MD5 hash and one
						 * expected, corresponding
						 * to LINUX_MIB_TCPMD5NOTFOUND
						 */
	SKB_DROP_REASON_TCP_MD5UNEXPECTED,	/* MD5 hash and we're not
						 * expecting one, corresponding
						 * to LINUX_MIB_TCPMD5UNEXPECTED
						 */
	SKB_DROP_REASON_TCP_MD5FAILURE,	/* MD5 hash and its wrong,
					 * corresponding to
					 * LINUX_MIB_TCPMD5FAILURE
					 */
	SKB_DROP_REASON_SOCKET_BACKLOG,	/* failed to add skb to socket
					 * backlog (see
					 * LINUX_MIB_TCPBACKLOGDROP)
					 */
	SKB_DROP_REASON_TCP_FLAGS,	/* TCP flags invalid */
	SKB_DROP_REASON_TCP_ZEROWINDOW,	/* TCP receive window size is zero,
					 * see LINUX_MIB_TCPZEROWINDOWDROP
					 */
	SKB_DROP_REASON_TCP_OLD_DATA,	/* the TCP data reveived is already
					 * received before (spurious retrans
					 * may happened), see
					 * LINUX_MIB_DELAYEDACKLOST
					 */
	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_OFOMERGE,	/* the data of skb is already in
					 * the ofo queue, corresponding to
					 * LINUX_MIB_TCPOFOMERGE
					 */
	SKB_DROP_REASON_TCP_RFC7323_PAWS, /* PAWS check, corresponding to
					   * LINUX_MIB_PAWSESTABREJECTED
					   */
	SKB_DROP_REASON_TCP_INVALID_SEQUENCE, /* Not acceptable SEQ field */
	SKB_DROP_REASON_TCP_RESET,	/* Invalid RST packet */
	SKB_DROP_REASON_TCP_INVALID_SYN, /* Incoming packet has unexpected SYN flag */
	SKB_DROP_REASON_TCP_CLOSE,	/* TCP socket in CLOSE state */
	SKB_DROP_REASON_TCP_FASTOPEN,	/* dropped by FASTOPEN request socket */
	SKB_DROP_REASON_TCP_OLD_ACK,	/* TCP ACK is old, but in window */
	SKB_DROP_REASON_TCP_TOO_OLD_ACK, /* TCP ACK is too old */
	SKB_DROP_REASON_TCP_ACK_UNSENT_DATA, /* TCP ACK for data we haven't sent yet */
	SKB_DROP_REASON_TCP_OFO_QUEUE_PRUNE, /* pruned from TCP OFO queue */
	SKB_DROP_REASON_TCP_OFO_DROP,	/* data already in receive queue */
	SKB_DROP_REASON_IP_OUTNOROUTES,	/* route lookup failed */
	SKB_DROP_REASON_BPF_CGROUP_EGRESS,	/* dropped by
						 * BPF_PROG_TYPE_CGROUP_SKB
						 * eBPF program
						 */
	SKB_DROP_REASON_IPV6DISABLED,	/* IPv6 is disabled on the device */
	SKB_DROP_REASON_NEIGH_CREATEFAIL,	/* failed to create neigh
						 * entry
						 */
	SKB_DROP_REASON_NEIGH_FAILED,	/* neigh entry in failed state */
	SKB_DROP_REASON_NEIGH_QUEUEFULL,	/* arp_queue for neigh
						 * entry is full
						 */
	SKB_DROP_REASON_NEIGH_DEAD,	/* neigh entry is dead */
	SKB_DROP_REASON_TC_EGRESS,	/* dropped in TC egress HOOK */
	SKB_DROP_REASON_QDISC_DROP,	/* dropped by qdisc when packet
					 * outputting (failed to enqueue to
					 * current qdisc)
					 */
	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_XDP,		/* dropped by XDP in input path */
	SKB_DROP_REASON_TC_INGRESS,	/* dropped in TC ingress HOOK */
	SKB_DROP_REASON_UNHANDLED_PROTO,	/* protocol not implemented
						 * or not supported
						 */
	SKB_DROP_REASON_SKB_CSUM,	/* sk_buff checksum computation
					 * error
					 */
	SKB_DROP_REASON_SKB_GSO_SEG,	/* gso segmentation error */
	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_DEV_HDR,	/* device driver specific
					 * header/metadata is invalid
					 */
	/* 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_NOMEM,		/* error due to OOM */
	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_TAP_FILTER,     /* dropped by (ebpf) filter directly
					 * attached to tun/tap, e.g., via
					 * TUNSETFILTEREBPF
					 */
	SKB_DROP_REASON_TAP_TXFILTER,	/* dropped by tx filter implemented
					 * at tun/tap, e.g., check_filter()
					 */
	SKB_DROP_REASON_ICMP_CSUM,	/* ICMP checksum error */
	SKB_DROP_REASON_INVALID_PROTO,	/* the packet doesn't follow RFC
					 * 2211, such as a broadcasts
					 * ICMP_TIMESTAMP
					 */
	SKB_DROP_REASON_IP_INADDRERRORS,	/* host unreachable, corresponding
						 * to IPSTATS_MIB_INADDRERRORS
						 */
	SKB_DROP_REASON_IP_INNOROUTES,	/* network unreachable, corresponding
					 * to IPSTATS_MIB_INADDRERRORS
					 */
	SKB_DROP_REASON_PKT_TOO_BIG,	/* packet size is too big (maybe exceed
					 * the MTU)
					 */
	SKB_DROP_REASON_MAX,
};

#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)

extern const char * const drop_reasons[];

#endif