dropreason.h 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323
  1. /* SPDX-License-Identifier: GPL-2.0-or-later */
  2. #ifndef _LINUX_DROPREASON_H
  3. #define _LINUX_DROPREASON_H
  4. #define DEFINE_DROP_REASON(FN, FNe) \
  5. FN(NOT_SPECIFIED) \
  6. FN(NO_SOCKET) \
  7. FN(PKT_TOO_SMALL) \
  8. FN(TCP_CSUM) \
  9. FN(SOCKET_FILTER) \
  10. FN(UDP_CSUM) \
  11. FN(NETFILTER_DROP) \
  12. FN(OTHERHOST) \
  13. FN(IP_CSUM) \
  14. FN(IP_INHDR) \
  15. FN(IP_RPFILTER) \
  16. FN(UNICAST_IN_L2_MULTICAST) \
  17. FN(XFRM_POLICY) \
  18. FN(IP_NOPROTO) \
  19. FN(SOCKET_RCVBUFF) \
  20. FN(PROTO_MEM) \
  21. FN(TCP_MD5NOTFOUND) \
  22. FN(TCP_MD5UNEXPECTED) \
  23. FN(TCP_MD5FAILURE) \
  24. FN(SOCKET_BACKLOG) \
  25. FN(TCP_FLAGS) \
  26. FN(TCP_ZEROWINDOW) \
  27. FN(TCP_OLD_DATA) \
  28. FN(TCP_OVERWINDOW) \
  29. FN(TCP_OFOMERGE) \
  30. FN(TCP_RFC7323_PAWS) \
  31. FN(TCP_INVALID_SEQUENCE) \
  32. FN(TCP_RESET) \
  33. FN(TCP_INVALID_SYN) \
  34. FN(TCP_CLOSE) \
  35. FN(TCP_FASTOPEN) \
  36. FN(TCP_OLD_ACK) \
  37. FN(TCP_TOO_OLD_ACK) \
  38. FN(TCP_ACK_UNSENT_DATA) \
  39. FN(TCP_OFO_QUEUE_PRUNE) \
  40. FN(TCP_OFO_DROP) \
  41. FN(IP_OUTNOROUTES) \
  42. FN(BPF_CGROUP_EGRESS) \
  43. FN(IPV6DISABLED) \
  44. FN(NEIGH_CREATEFAIL) \
  45. FN(NEIGH_FAILED) \
  46. FN(NEIGH_QUEUEFULL) \
  47. FN(NEIGH_DEAD) \
  48. FN(TC_EGRESS) \
  49. FN(QDISC_DROP) \
  50. FN(CPU_BACKLOG) \
  51. FN(XDP) \
  52. FN(TC_INGRESS) \
  53. FN(UNHANDLED_PROTO) \
  54. FN(SKB_CSUM) \
  55. FN(SKB_GSO_SEG) \
  56. FN(SKB_UCOPY_FAULT) \
  57. FN(DEV_HDR) \
  58. FN(DEV_READY) \
  59. FN(FULL_RING) \
  60. FN(NOMEM) \
  61. FN(HDR_TRUNC) \
  62. FN(TAP_FILTER) \
  63. FN(TAP_TXFILTER) \
  64. FN(ICMP_CSUM) \
  65. FN(INVALID_PROTO) \
  66. FN(IP_INADDRERRORS) \
  67. FN(IP_INNOROUTES) \
  68. FN(PKT_TOO_BIG) \
  69. FNe(MAX)
  70. /**
  71. * enum skb_drop_reason - the reasons of skb drops
  72. *
  73. * The reason of skb drop, which is used in kfree_skb_reason().
  74. */
  75. enum skb_drop_reason {
  76. /**
  77. * @SKB_NOT_DROPPED_YET: skb is not dropped yet (used for no-drop case)
  78. */
  79. SKB_NOT_DROPPED_YET = 0,
  80. /** @SKB_DROP_REASON_NOT_SPECIFIED: drop reason is not specified */
  81. SKB_DROP_REASON_NOT_SPECIFIED,
  82. /** @SKB_DROP_REASON_NO_SOCKET: socket not found */
  83. SKB_DROP_REASON_NO_SOCKET,
  84. /** @SKB_DROP_REASON_PKT_TOO_SMALL: packet size is too small */
  85. SKB_DROP_REASON_PKT_TOO_SMALL,
  86. /** @SKB_DROP_REASON_TCP_CSUM: TCP checksum error */
  87. SKB_DROP_REASON_TCP_CSUM,
  88. /** @SKB_DROP_REASON_SOCKET_FILTER: dropped by socket filter */
  89. SKB_DROP_REASON_SOCKET_FILTER,
  90. /** @SKB_DROP_REASON_UDP_CSUM: UDP checksum error */
  91. SKB_DROP_REASON_UDP_CSUM,
  92. /** @SKB_DROP_REASON_NETFILTER_DROP: dropped by netfilter */
  93. SKB_DROP_REASON_NETFILTER_DROP,
  94. /**
  95. * @SKB_DROP_REASON_OTHERHOST: packet don't belong to current host
  96. * (interface is in promisc mode)
  97. */
  98. SKB_DROP_REASON_OTHERHOST,
  99. /** @SKB_DROP_REASON_IP_CSUM: IP checksum error */
  100. SKB_DROP_REASON_IP_CSUM,
  101. /**
  102. * @SKB_DROP_REASON_IP_INHDR: there is something wrong with IP header (see
  103. * IPSTATS_MIB_INHDRERRORS)
  104. */
  105. SKB_DROP_REASON_IP_INHDR,
  106. /**
  107. * @SKB_DROP_REASON_IP_RPFILTER: IP rpfilter validate failed. see the
  108. * document for rp_filter in ip-sysctl.rst for more information
  109. */
  110. SKB_DROP_REASON_IP_RPFILTER,
  111. /**
  112. * @SKB_DROP_REASON_UNICAST_IN_L2_MULTICAST: destination address of L2 is
  113. * multicast, but L3 is unicast.
  114. */
  115. SKB_DROP_REASON_UNICAST_IN_L2_MULTICAST,
  116. /** @SKB_DROP_REASON_XFRM_POLICY: xfrm policy check failed */
  117. SKB_DROP_REASON_XFRM_POLICY,
  118. /** @SKB_DROP_REASON_IP_NOPROTO: no support for IP protocol */
  119. SKB_DROP_REASON_IP_NOPROTO,
  120. /** @SKB_DROP_REASON_SOCKET_RCVBUFF: socket receive buff is full */
  121. SKB_DROP_REASON_SOCKET_RCVBUFF,
  122. /**
  123. * @SKB_DROP_REASON_PROTO_MEM: proto memory limition, such as udp packet
  124. * drop out of udp_memory_allocated.
  125. */
  126. SKB_DROP_REASON_PROTO_MEM,
  127. /**
  128. * @SKB_DROP_REASON_TCP_MD5NOTFOUND: no MD5 hash and one expected,
  129. * corresponding to LINUX_MIB_TCPMD5NOTFOUND
  130. */
  131. SKB_DROP_REASON_TCP_MD5NOTFOUND,
  132. /**
  133. * @SKB_DROP_REASON_TCP_MD5UNEXPECTED: MD5 hash and we're not expecting
  134. * one, corresponding to LINUX_MIB_TCPMD5UNEXPECTED
  135. */
  136. SKB_DROP_REASON_TCP_MD5UNEXPECTED,
  137. /**
  138. * @SKB_DROP_REASON_TCP_MD5FAILURE: MD5 hash and its wrong, corresponding
  139. * to LINUX_MIB_TCPMD5FAILURE
  140. */
  141. SKB_DROP_REASON_TCP_MD5FAILURE,
  142. /**
  143. * @SKB_DROP_REASON_SOCKET_BACKLOG: failed to add skb to socket backlog (
  144. * see LINUX_MIB_TCPBACKLOGDROP)
  145. */
  146. SKB_DROP_REASON_SOCKET_BACKLOG,
  147. /** @SKB_DROP_REASON_TCP_FLAGS: TCP flags invalid */
  148. SKB_DROP_REASON_TCP_FLAGS,
  149. /**
  150. * @SKB_DROP_REASON_TCP_ZEROWINDOW: TCP receive window size is zero,
  151. * see LINUX_MIB_TCPZEROWINDOWDROP
  152. */
  153. SKB_DROP_REASON_TCP_ZEROWINDOW,
  154. /**
  155. * @SKB_DROP_REASON_TCP_OLD_DATA: the TCP data reveived is already
  156. * received before (spurious retrans may happened), see
  157. * LINUX_MIB_DELAYEDACKLOST
  158. */
  159. SKB_DROP_REASON_TCP_OLD_DATA,
  160. /**
  161. * @SKB_DROP_REASON_TCP_OVERWINDOW: the TCP data is out of window,
  162. * the seq of the first byte exceed the right edges of receive
  163. * window
  164. */
  165. SKB_DROP_REASON_TCP_OVERWINDOW,
  166. /**
  167. * @SKB_DROP_REASON_TCP_OFOMERGE: the data of skb is already in the ofo
  168. * queue, corresponding to LINUX_MIB_TCPOFOMERGE
  169. */
  170. SKB_DROP_REASON_TCP_OFOMERGE,
  171. /**
  172. * @SKB_DROP_REASON_TCP_RFC7323_PAWS: PAWS check, corresponding to
  173. * LINUX_MIB_PAWSESTABREJECTED
  174. */
  175. SKB_DROP_REASON_TCP_RFC7323_PAWS,
  176. /** @SKB_DROP_REASON_TCP_INVALID_SEQUENCE: Not acceptable SEQ field */
  177. SKB_DROP_REASON_TCP_INVALID_SEQUENCE,
  178. /** @SKB_DROP_REASON_TCP_RESET: Invalid RST packet */
  179. SKB_DROP_REASON_TCP_RESET,
  180. /**
  181. * @SKB_DROP_REASON_TCP_INVALID_SYN: Incoming packet has unexpected
  182. * SYN flag
  183. */
  184. SKB_DROP_REASON_TCP_INVALID_SYN,
  185. /** @SKB_DROP_REASON_TCP_CLOSE: TCP socket in CLOSE state */
  186. SKB_DROP_REASON_TCP_CLOSE,
  187. /** @SKB_DROP_REASON_TCP_FASTOPEN: dropped by FASTOPEN request socket */
  188. SKB_DROP_REASON_TCP_FASTOPEN,
  189. /** @SKB_DROP_REASON_TCP_OLD_ACK: TCP ACK is old, but in window */
  190. SKB_DROP_REASON_TCP_OLD_ACK,
  191. /** @SKB_DROP_REASON_TCP_TOO_OLD_ACK: TCP ACK is too old */
  192. SKB_DROP_REASON_TCP_TOO_OLD_ACK,
  193. /**
  194. * @SKB_DROP_REASON_TCP_ACK_UNSENT_DATA: TCP ACK for data we haven't
  195. * sent yet
  196. */
  197. SKB_DROP_REASON_TCP_ACK_UNSENT_DATA,
  198. /** @SKB_DROP_REASON_TCP_OFO_QUEUE_PRUNE: pruned from TCP OFO queue */
  199. SKB_DROP_REASON_TCP_OFO_QUEUE_PRUNE,
  200. /** @SKB_DROP_REASON_TCP_OFO_DROP: data already in receive queue */
  201. SKB_DROP_REASON_TCP_OFO_DROP,
  202. /** @SKB_DROP_REASON_IP_OUTNOROUTES: route lookup failed */
  203. SKB_DROP_REASON_IP_OUTNOROUTES,
  204. /**
  205. * @SKB_DROP_REASON_BPF_CGROUP_EGRESS: dropped by BPF_PROG_TYPE_CGROUP_SKB
  206. * eBPF program
  207. */
  208. SKB_DROP_REASON_BPF_CGROUP_EGRESS,
  209. /** @SKB_DROP_REASON_IPV6DISABLED: IPv6 is disabled on the device */
  210. SKB_DROP_REASON_IPV6DISABLED,
  211. /** @SKB_DROP_REASON_NEIGH_CREATEFAIL: failed to create neigh entry */
  212. SKB_DROP_REASON_NEIGH_CREATEFAIL,
  213. /** @SKB_DROP_REASON_NEIGH_FAILED: neigh entry in failed state */
  214. SKB_DROP_REASON_NEIGH_FAILED,
  215. /** @SKB_DROP_REASON_NEIGH_QUEUEFULL: arp_queue for neigh entry is full */
  216. SKB_DROP_REASON_NEIGH_QUEUEFULL,
  217. /** @SKB_DROP_REASON_NEIGH_DEAD: neigh entry is dead */
  218. SKB_DROP_REASON_NEIGH_DEAD,
  219. /** @SKB_DROP_REASON_TC_EGRESS: dropped in TC egress HOOK */
  220. SKB_DROP_REASON_TC_EGRESS,
  221. /**
  222. * @SKB_DROP_REASON_QDISC_DROP: dropped by qdisc when packet outputting (
  223. * failed to enqueue to current qdisc)
  224. */
  225. SKB_DROP_REASON_QDISC_DROP,
  226. /**
  227. * @SKB_DROP_REASON_CPU_BACKLOG: failed to enqueue the skb to the per CPU
  228. * backlog queue. This can be caused by backlog queue full (see
  229. * netdev_max_backlog in net.rst) or RPS flow limit
  230. */
  231. SKB_DROP_REASON_CPU_BACKLOG,
  232. /** @SKB_DROP_REASON_XDP: dropped by XDP in input path */
  233. SKB_DROP_REASON_XDP,
  234. /** @SKB_DROP_REASON_TC_INGRESS: dropped in TC ingress HOOK */
  235. SKB_DROP_REASON_TC_INGRESS,
  236. /** @SKB_DROP_REASON_UNHANDLED_PROTO: protocol not implemented or not supported */
  237. SKB_DROP_REASON_UNHANDLED_PROTO,
  238. /** @SKB_DROP_REASON_SKB_CSUM: sk_buff checksum computation error */
  239. SKB_DROP_REASON_SKB_CSUM,
  240. /** @SKB_DROP_REASON_SKB_GSO_SEG: gso segmentation error */
  241. SKB_DROP_REASON_SKB_GSO_SEG,
  242. /**
  243. * @SKB_DROP_REASON_SKB_UCOPY_FAULT: failed to copy data from user space,
  244. * e.g., via zerocopy_sg_from_iter() or skb_orphan_frags_rx()
  245. */
  246. SKB_DROP_REASON_SKB_UCOPY_FAULT,
  247. /** @SKB_DROP_REASON_DEV_HDR: device driver specific header/metadata is invalid */
  248. SKB_DROP_REASON_DEV_HDR,
  249. /**
  250. * @SKB_DROP_REASON_DEV_READY: the device is not ready to xmit/recv due to
  251. * any of its data structure that is not up/ready/initialized,
  252. * e.g., the IFF_UP is not set, or driver specific tun->tfiles[txq]
  253. * is not initialized
  254. */
  255. SKB_DROP_REASON_DEV_READY,
  256. /** @SKB_DROP_REASON_FULL_RING: ring buffer is full */
  257. SKB_DROP_REASON_FULL_RING,
  258. /** @SKB_DROP_REASON_NOMEM: error due to OOM */
  259. SKB_DROP_REASON_NOMEM,
  260. /**
  261. * @SKB_DROP_REASON_HDR_TRUNC: failed to trunc/extract the header from
  262. * networking data, e.g., failed to pull the protocol header from
  263. * frags via pskb_may_pull()
  264. */
  265. SKB_DROP_REASON_HDR_TRUNC,
  266. /**
  267. * @SKB_DROP_REASON_TAP_FILTER: dropped by (ebpf) filter directly attached
  268. * to tun/tap, e.g., via TUNSETFILTEREBPF
  269. */
  270. SKB_DROP_REASON_TAP_FILTER,
  271. /**
  272. * @SKB_DROP_REASON_TAP_TXFILTER: dropped by tx filter implemented at
  273. * tun/tap, e.g., check_filter()
  274. */
  275. SKB_DROP_REASON_TAP_TXFILTER,
  276. /** @SKB_DROP_REASON_ICMP_CSUM: ICMP checksum error */
  277. SKB_DROP_REASON_ICMP_CSUM,
  278. /**
  279. * @SKB_DROP_REASON_INVALID_PROTO: the packet doesn't follow RFC 2211,
  280. * such as a broadcasts ICMP_TIMESTAMP
  281. */
  282. SKB_DROP_REASON_INVALID_PROTO,
  283. /**
  284. * @SKB_DROP_REASON_IP_INADDRERRORS: host unreachable, corresponding to
  285. * IPSTATS_MIB_INADDRERRORS
  286. */
  287. SKB_DROP_REASON_IP_INADDRERRORS,
  288. /**
  289. * @SKB_DROP_REASON_IP_INNOROUTES: network unreachable, corresponding to
  290. * IPSTATS_MIB_INADDRERRORS
  291. */
  292. SKB_DROP_REASON_IP_INNOROUTES,
  293. /**
  294. * @SKB_DROP_REASON_PKT_TOO_BIG: packet size is too big (maybe exceed the
  295. * MTU)
  296. */
  297. SKB_DROP_REASON_PKT_TOO_BIG,
  298. /**
  299. * @SKB_DROP_REASON_MAX: the maximum of drop reason, which shouldn't be
  300. * used as a real 'reason'
  301. */
  302. SKB_DROP_REASON_MAX,
  303. };
  304. #define SKB_DR_INIT(name, reason) \
  305. enum skb_drop_reason name = SKB_DROP_REASON_##reason
  306. #define SKB_DR(name) \
  307. SKB_DR_INIT(name, NOT_SPECIFIED)
  308. #define SKB_DR_SET(name, reason) \
  309. (name = SKB_DROP_REASON_##reason)
  310. #define SKB_DR_OR(name, reason) \
  311. do { \
  312. if (name == SKB_DROP_REASON_NOT_SPECIFIED || \
  313. name == SKB_NOT_DROPPED_YET) \
  314. SKB_DR_SET(name, reason); \
  315. } while (0)
  316. extern const char * const drop_reasons[];
  317. #endif