Commit ba36c5b7 authored by Paolo Abeni's avatar Paolo Abeni
Browse files

Merge branch 'reorganize-the-code-of-the-enum-skb_drop_reason'

Menglong Dong says:

====================
reorganize the code of the enum skb_drop_reason

The code of skb_drop_reason is a little wild, let's reorganize them.
Three things and three patches:

1) Move the enum 'skb_drop_reason' and related function to the standalone
   header 'dropreason.h', as Jakub Kicinski suggested, as the skb drop
   reasons are getting more and more.

2) use auto-generation to generate the source file that convert enum
   skb_drop_reason to string.

3) make the comment of skb drop reasons kernel-doc style.

Changes since v3:
3/3: remove some useless comment (Jakub Kicinski)

Changes since v2:
2/3: - add new line in the end of .gitignore
     - fix awk warning by make '\;' to ';', as ';' is not need to be
       escaped
     - export 'drop_reasons' in skbuff.c

Changes since v1:
1/3: move dropreason.h from include/linux/ to include/net/ (Jakub Kicinski)
2/3: generate source file instead of header file for drop reasons string
     array (Jakub Kicinski)
3/3: use inline comment (Jakub Kicinski)
====================

Link: https://lore.kernel.org/r/20220606022436.331005-1-imagedong@tencent.com


Signed-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
parents 12de1ebd b160f727
Loading
Loading
Loading
Loading
+1 −178
Original line number Diff line number Diff line
@@ -43,6 +43,7 @@
#include <linux/netfilter/nf_conntrack_common.h>
#endif
#include <net/net_debug.h>
#include <net/dropreason.h>

/**
 * DOC: skb checksums
@@ -337,184 +338,6 @@ struct sk_buff_head {

struct sk_buff;

/* 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)

/* To allow 64K frame to be packed as single skb without frag_list we
 * require 64K/PAGE_SIZE pages plus 1 additional page to allow for
 * buffers which do not start on a page boundary.
+256 −0
Original line number Diff line number Diff line
/* SPDX-License-Identifier: GPL-2.0-or-later */

#ifndef _LINUX_DROPREASON_H
#define _LINUX_DROPREASON_H

/**
 * 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_DROP_REASON_NOT_SPECIFIED: drop reason is not specified */
	SKB_DROP_REASON_NOT_SPECIFIED,
	/** @SKB_DROP_REASON_NO_SOCKET: socket not found */
	SKB_DROP_REASON_NO_SOCKET,
	/** @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_SOCKET_FILTER: dropped by socket filter */
	SKB_DROP_REASON_SOCKET_FILTER,
	/** @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_SOCKET_RCVBUFF: socket receive buff is full */
	SKB_DROP_REASON_SOCKET_RCVBUFF,
	/**
	 * @SKB_DROP_REASON_PROTO_MEM: proto memory limition, such as udp packet
	 * drop out of udp_memory_allocated.
	 */
	SKB_DROP_REASON_PROTO_MEM,
	/**
	 * @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_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_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 reveived 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
	 */
	SKB_DROP_REASON_TCP_RFC7323_PAWS,
	/** @SKB_DROP_REASON_TCP_INVALID_SEQUENCE: Not acceptable SEQ field */
	SKB_DROP_REASON_TCP_INVALID_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_TC_EGRESS: dropped in TC egress HOOK */
	SKB_DROP_REASON_TC_EGRESS,
	/**
	 * @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_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_PKT_TOO_BIG: packet size is too big (maybe exceed the
	 * MTU)
	 */
	SKB_DROP_REASON_PKT_TOO_BIG,
	/**
	 * @SKB_DROP_REASON_MAX: the maximum of drop reason, which shouldn't be
	 * used as a real 'reason'
	 */
	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
+1 −88
Original line number Diff line number Diff line
@@ -9,92 +9,6 @@
#include <linux/netdevice.h>
#include <linux/tracepoint.h>

#define TRACE_SKB_DROP_REASON					\
	EM(SKB_DROP_REASON_NOT_SPECIFIED, NOT_SPECIFIED)	\
	EM(SKB_DROP_REASON_NO_SOCKET, NO_SOCKET)		\
	EM(SKB_DROP_REASON_PKT_TOO_SMALL, PKT_TOO_SMALL)	\
	EM(SKB_DROP_REASON_TCP_CSUM, TCP_CSUM)			\
	EM(SKB_DROP_REASON_SOCKET_FILTER, SOCKET_FILTER)	\
	EM(SKB_DROP_REASON_UDP_CSUM, UDP_CSUM)			\
	EM(SKB_DROP_REASON_NETFILTER_DROP, NETFILTER_DROP)	\
	EM(SKB_DROP_REASON_OTHERHOST, OTHERHOST)		\
	EM(SKB_DROP_REASON_IP_CSUM, IP_CSUM)			\
	EM(SKB_DROP_REASON_IP_INHDR, IP_INHDR)			\
	EM(SKB_DROP_REASON_IP_RPFILTER, IP_RPFILTER)		\
	EM(SKB_DROP_REASON_UNICAST_IN_L2_MULTICAST,		\
	   UNICAST_IN_L2_MULTICAST)				\
	EM(SKB_DROP_REASON_XFRM_POLICY, XFRM_POLICY)		\
	EM(SKB_DROP_REASON_IP_NOPROTO, IP_NOPROTO)		\
	EM(SKB_DROP_REASON_SOCKET_RCVBUFF, SOCKET_RCVBUFF)	\
	EM(SKB_DROP_REASON_PROTO_MEM, PROTO_MEM)		\
	EM(SKB_DROP_REASON_TCP_MD5NOTFOUND, TCP_MD5NOTFOUND)	\
	EM(SKB_DROP_REASON_TCP_MD5UNEXPECTED,			\
	   TCP_MD5UNEXPECTED)					\
	EM(SKB_DROP_REASON_TCP_MD5FAILURE, TCP_MD5FAILURE)	\
	EM(SKB_DROP_REASON_SOCKET_BACKLOG, SOCKET_BACKLOG)	\
	EM(SKB_DROP_REASON_TCP_FLAGS, TCP_FLAGS)		\
	EM(SKB_DROP_REASON_TCP_ZEROWINDOW, TCP_ZEROWINDOW)	\
	EM(SKB_DROP_REASON_TCP_OLD_DATA, TCP_OLD_DATA)		\
	EM(SKB_DROP_REASON_TCP_OVERWINDOW, TCP_OVERWINDOW)	\
	EM(SKB_DROP_REASON_TCP_OFOMERGE, TCP_OFOMERGE)		\
	EM(SKB_DROP_REASON_TCP_OFO_DROP, TCP_OFO_DROP)		\
	EM(SKB_DROP_REASON_TCP_RFC7323_PAWS, TCP_RFC7323_PAWS)	\
	EM(SKB_DROP_REASON_TCP_INVALID_SEQUENCE,		\
	   TCP_INVALID_SEQUENCE)				\
	EM(SKB_DROP_REASON_TCP_RESET, TCP_RESET)		\
	EM(SKB_DROP_REASON_TCP_INVALID_SYN, TCP_INVALID_SYN)	\
	EM(SKB_DROP_REASON_TCP_CLOSE, TCP_CLOSE)		\
	EM(SKB_DROP_REASON_TCP_FASTOPEN, TCP_FASTOPEN)		\
	EM(SKB_DROP_REASON_TCP_OLD_ACK, TCP_OLD_ACK)		\
	EM(SKB_DROP_REASON_TCP_TOO_OLD_ACK, TCP_TOO_OLD_ACK)	\
	EM(SKB_DROP_REASON_TCP_ACK_UNSENT_DATA,			\
	   TCP_ACK_UNSENT_DATA)					\
	EM(SKB_DROP_REASON_TCP_OFO_QUEUE_PRUNE,			\
	  TCP_OFO_QUEUE_PRUNE)					\
	EM(SKB_DROP_REASON_IP_OUTNOROUTES, IP_OUTNOROUTES)	\
	EM(SKB_DROP_REASON_BPF_CGROUP_EGRESS,			\
	   BPF_CGROUP_EGRESS)					\
	EM(SKB_DROP_REASON_IPV6DISABLED, IPV6DISABLED)		\
	EM(SKB_DROP_REASON_NEIGH_CREATEFAIL, NEIGH_CREATEFAIL)	\
	EM(SKB_DROP_REASON_NEIGH_FAILED, NEIGH_FAILED)		\
	EM(SKB_DROP_REASON_NEIGH_QUEUEFULL, NEIGH_QUEUEFULL)	\
	EM(SKB_DROP_REASON_NEIGH_DEAD, NEIGH_DEAD)		\
	EM(SKB_DROP_REASON_TC_EGRESS, TC_EGRESS)		\
	EM(SKB_DROP_REASON_QDISC_DROP, QDISC_DROP)		\
	EM(SKB_DROP_REASON_CPU_BACKLOG, CPU_BACKLOG)		\
	EM(SKB_DROP_REASON_XDP, XDP)				\
	EM(SKB_DROP_REASON_TC_INGRESS, TC_INGRESS)		\
	EM(SKB_DROP_REASON_UNHANDLED_PROTO, UNHANDLED_PROTO)	\
	EM(SKB_DROP_REASON_SKB_CSUM, SKB_CSUM)			\
	EM(SKB_DROP_REASON_SKB_GSO_SEG, SKB_GSO_SEG)		\
	EM(SKB_DROP_REASON_SKB_UCOPY_FAULT, SKB_UCOPY_FAULT)	\
	EM(SKB_DROP_REASON_DEV_HDR, DEV_HDR)			\
	EM(SKB_DROP_REASON_DEV_READY, DEV_READY)		\
	EM(SKB_DROP_REASON_FULL_RING, FULL_RING)		\
	EM(SKB_DROP_REASON_NOMEM, NOMEM)			\
	EM(SKB_DROP_REASON_HDR_TRUNC, HDR_TRUNC)		\
	EM(SKB_DROP_REASON_TAP_FILTER, TAP_FILTER)		\
	EM(SKB_DROP_REASON_TAP_TXFILTER, TAP_TXFILTER)		\
	EM(SKB_DROP_REASON_ICMP_CSUM, ICMP_CSUM)		\
	EM(SKB_DROP_REASON_INVALID_PROTO, INVALID_PROTO)	\
	EM(SKB_DROP_REASON_IP_INADDRERRORS, IP_INADDRERRORS)	\
	EM(SKB_DROP_REASON_IP_INNOROUTES, IP_INNOROUTES)	\
	EM(SKB_DROP_REASON_PKT_TOO_BIG, PKT_TOO_BIG)		\
	EMe(SKB_DROP_REASON_MAX, MAX)

#undef EM
#undef EMe

#define EM(a, b)	TRACE_DEFINE_ENUM(a);
#define EMe(a, b)	TRACE_DEFINE_ENUM(a);

TRACE_SKB_DROP_REASON

#undef EM
#undef EMe
#define EM(a, b)	{ a, #b },
#define EMe(a, b)	{ a, #b }

/*
 * Tracepoint for free an sk_buff:
 */
@@ -121,8 +35,7 @@ TRACE_EVENT(kfree_skb,

	TP_printk("skbaddr=%p protocol=%u location=%p reason: %s",
		  __entry->skbaddr, __entry->protocol, __entry->location,
		  __print_symbolic(__entry->reason,
				   TRACE_SKB_DROP_REASON))
		  drop_reasons[__entry->reason])
);

TRACE_EVENT(consume_skb,

net/core/.gitignore

0 → 100644
+1 −0
Original line number Diff line number Diff line
dropreason_str.c
+22 −1
Original line number Diff line number Diff line
@@ -4,7 +4,8 @@
#

obj-y := sock.o request_sock.o skbuff.o datagram.o stream.o scm.o \
	 gen_stats.o gen_estimator.o net_namespace.o secure_seq.o flow_dissector.o
	 gen_stats.o gen_estimator.o net_namespace.o secure_seq.o \
	 flow_dissector.o dropreason_str.o

obj-$(CONFIG_SYSCTL) += sysctl_net_core.o

@@ -39,3 +40,23 @@ obj-$(CONFIG_NET_SOCK_MSG) += skmsg.o
obj-$(CONFIG_BPF_SYSCALL) += sock_map.o
obj-$(CONFIG_BPF_SYSCALL) += bpf_sk_storage.o
obj-$(CONFIG_OF)	+= of_net.o

clean-files := dropreason_str.c

quiet_cmd_dropreason_str = GEN     $@
cmd_dropreason_str = awk -F ',' 'BEGIN{ print "\#include <net/dropreason.h>\n"; \
	print "const char * const drop_reasons[] = {" }\
	/^enum skb_drop/ { dr=1; }\
	/^\};/ { dr=0; }\
	/^\tSKB_DROP_REASON_/ {\
		if (dr) {\
			sub(/\tSKB_DROP_REASON_/, "", $$1);\
			printf "\t[SKB_DROP_REASON_%s] = \"%s\",\n", $$1, $$1;\
		}\
	}\
	END{ print "};" }' $< > $@

$(obj)/dropreason_str.c: $(srctree)/include/net/dropreason.h
	$(call cmd,dropreason_str)

$(obj)/dropreason_str.o: $(obj)/dropreason_str.c
Loading