172339Sabial/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
272339Sabial#ifndef _UAPI__LINUX_NETLINK_H
372339Sabial#define _UAPI__LINUX_NETLINK_H
472339Sabial
572339Sabial#include <linux/const.h>
672339Sabial#include <linux/socket.h> /* for __kernel_sa_family_t */
772339Sabial#include <linux/types.h>
872339Sabial
972339Sabial#define NETLINK_ROUTE		0	/* Routing/device hook				*/
1072339Sabial#define NETLINK_UNUSED		1	/* Unused number				*/
1172339Sabial#define NETLINK_USERSOCK	2	/* Reserved for user mode socket protocols 	*/
1272339Sabial#define NETLINK_FIREWALL	3	/* Unused number, formerly ip_queue		*/
1372339Sabial#define NETLINK_SOCK_DIAG	4	/* socket monitoring				*/
1472339Sabial#define NETLINK_NFLOG		5	/* netfilter/iptables ULOG */
1572339Sabial#define NETLINK_XFRM		6	/* ipsec */
1672339Sabial#define NETLINK_SELINUX		7	/* SELinux event notifications */
1772339Sabial#define NETLINK_ISCSI		8	/* Open-iSCSI */
1872339Sabial#define NETLINK_AUDIT		9	/* auditing */
1972339Sabial#define NETLINK_FIB_LOOKUP	10
2072339Sabial#define NETLINK_CONNECTOR	11
2172339Sabial#define NETLINK_NETFILTER	12	/* netfilter subsystem */
2272339Sabial#define NETLINK_IP6_FW		13
2372339Sabial#define NETLINK_DNRTMSG		14	/* DECnet routing messages (obsolete) */
2472339Sabial#define NETLINK_KOBJECT_UEVENT	15	/* Kernel messages to userspace */
2572339Sabial#define NETLINK_GENERIC		16
2672339Sabial/* leave room for NETLINK_DM (DM Events) */
2772339Sabial#define NETLINK_SCSITRANSPORT	18	/* SCSI Transports */
2872339Sabial#define NETLINK_ECRYPTFS	19
2972339Sabial#define NETLINK_RDMA		20
3072339Sabial#define NETLINK_CRYPTO		21	/* Crypto layer */
3172339Sabial#define NETLINK_SMC		22	/* SMC monitoring */
3272339Sabial
3372339Sabial#define NETLINK_INET_DIAG	NETLINK_SOCK_DIAG
3472339Sabial
3572339Sabial#define MAX_LINKS 32
3672339Sabial
3772339Sabialstruct sockaddr_nl {
3872339Sabial	__kernel_sa_family_t	nl_family;	/* AF_NETLINK	*/
3972339Sabial	unsigned short	nl_pad;		/* zero		*/
4072339Sabial	__u32		nl_pid;		/* port ID	*/
4172339Sabial       	__u32		nl_groups;	/* multicast groups mask */
4272339Sabial};
4372339Sabial
4472339Sabial/**
4572339Sabial * struct nlmsghdr - fixed format metadata header of Netlink messages
4672339Sabial * @nlmsg_len:   Length of message including header
4772339Sabial * @nlmsg_type:  Message content type
4872339Sabial * @nlmsg_flags: Additional flags
4972339Sabial * @nlmsg_seq:   Sequence number
5072339Sabial * @nlmsg_pid:   Sending process port ID
5172339Sabial */
5272339Sabialstruct nlmsghdr {
5372339Sabial	__u32		nlmsg_len;
5472339Sabial	__u16		nlmsg_type;
5572339Sabial	__u16		nlmsg_flags;
5672339Sabial	__u32		nlmsg_seq;
5772339Sabial	__u32		nlmsg_pid;
5872339Sabial};
5972339Sabial
6072339Sabial/* Flags values */
6172339Sabial
6272339Sabial#define NLM_F_REQUEST		0x01	/* It is request message. 	*/
6372339Sabial#define NLM_F_MULTI		0x02	/* Multipart message, terminated by NLMSG_DONE */
6472339Sabial#define NLM_F_ACK		0x04	/* Reply with ack, with zero or error code */
6572339Sabial#define NLM_F_ECHO		0x08	/* Receive resulting notifications */
6672339Sabial#define NLM_F_DUMP_INTR		0x10	/* Dump was inconsistent due to sequence change */
6772339Sabial#define NLM_F_DUMP_FILTERED	0x20	/* Dump was filtered as requested */
6872339Sabial
6972339Sabial/* Modifiers to GET request */
7072339Sabial#define NLM_F_ROOT	0x100	/* specify tree	root	*/
7172339Sabial#define NLM_F_MATCH	0x200	/* return all matching	*/
7272339Sabial#define NLM_F_ATOMIC	0x400	/* atomic GET		*/
7372339Sabial#define NLM_F_DUMP	(NLM_F_ROOT|NLM_F_MATCH)
7472339Sabial
7572339Sabial/* Modifiers to NEW request */
7672339Sabial#define NLM_F_REPLACE	0x100	/* Override existing		*/
7772339Sabial#define NLM_F_EXCL	0x200	/* Do not touch, if it exists	*/
7872339Sabial#define NLM_F_CREATE	0x400	/* Create, if it does not exist	*/
7972339Sabial#define NLM_F_APPEND	0x800	/* Add to end of list		*/
8072339Sabial
8172339Sabial/* Modifiers to DELETE request */
8272339Sabial#define NLM_F_NONREC	0x100	/* Do not delete recursively	*/
8372339Sabial#define NLM_F_BULK	0x200	/* Delete multiple objects	*/
8472339Sabial
8572339Sabial/* Flags for ACK message */
8672339Sabial#define NLM_F_CAPPED	0x100	/* request was capped */
8772339Sabial#define NLM_F_ACK_TLVS	0x200	/* extended ACK TVLs were included */
8872339Sabial
8972339Sabial/*
9072339Sabial   4.4BSD ADD		NLM_F_CREATE|NLM_F_EXCL
9172339Sabial   4.4BSD CHANGE	NLM_F_REPLACE
9272339Sabial
9372339Sabial   True CHANGE		NLM_F_CREATE|NLM_F_REPLACE
9472339Sabial   Append		NLM_F_CREATE
9572339Sabial   Check		NLM_F_EXCL
9672339Sabial */
9772339Sabial
9872339Sabial#define NLMSG_ALIGNTO	4U
9972339Sabial#define NLMSG_ALIGN(len) ( ((len)+NLMSG_ALIGNTO-1) & ~(NLMSG_ALIGNTO-1) )
10072339Sabial#define NLMSG_HDRLEN	 ((int) NLMSG_ALIGN(sizeof(struct nlmsghdr)))
10172339Sabial#define NLMSG_LENGTH(len) ((len) + NLMSG_HDRLEN)
10272339Sabial#define NLMSG_SPACE(len) NLMSG_ALIGN(NLMSG_LENGTH(len))
10372339Sabial#define NLMSG_DATA(nlh)  ((void *)(((char *)nlh) + NLMSG_HDRLEN))
10472339Sabial#define NLMSG_NEXT(nlh,len)	 ((len) -= NLMSG_ALIGN((nlh)->nlmsg_len), \
10572339Sabial				  (struct nlmsghdr *)(((char *)(nlh)) + \
10672339Sabial				  NLMSG_ALIGN((nlh)->nlmsg_len)))
10772339Sabial#define NLMSG_OK(nlh,len) ((len) >= (int)sizeof(struct nlmsghdr) && \
10872339Sabial			   (nlh)->nlmsg_len >= sizeof(struct nlmsghdr) && \
10972339Sabial			   (nlh)->nlmsg_len <= (len))
11072339Sabial#define NLMSG_PAYLOAD(nlh,len) ((nlh)->nlmsg_len - NLMSG_SPACE((len)))
11172339Sabial
11272339Sabial#define NLMSG_NOOP		0x1	/* Nothing.		*/
11372339Sabial#define NLMSG_ERROR		0x2	/* Error		*/
11472339Sabial#define NLMSG_DONE		0x3	/* End of a dump	*/
11572339Sabial#define NLMSG_OVERRUN		0x4	/* Data lost		*/
11672339Sabial
11772339Sabial#define NLMSG_MIN_TYPE		0x10	/* < 0x10: reserved control messages */
11872339Sabial
11972339Sabialstruct nlmsgerr {
12072339Sabial	int		error;
12172339Sabial	struct nlmsghdr msg;
12272339Sabial	/*
12372339Sabial	 * followed by the message contents unless NETLINK_CAP_ACK was set
12472339Sabial	 * or the ACK indicates success (error == 0)
12572339Sabial	 * message length is aligned with NLMSG_ALIGN()
12672339Sabial	 */
12772339Sabial	/*
12872339Sabial	 * followed by TLVs defined in enum nlmsgerr_attrs
12972339Sabial	 * if NETLINK_EXT_ACK was set
13072339Sabial	 */
13172339Sabial};
13272339Sabial
13372339Sabial/**
13472339Sabial * enum nlmsgerr_attrs - nlmsgerr attributes
13572339Sabial * @NLMSGERR_ATTR_UNUSED: unused
13672339Sabial * @NLMSGERR_ATTR_MSG: error message string (string)
13772339Sabial * @NLMSGERR_ATTR_OFFS: offset of the invalid attribute in the original
13872339Sabial *	 message, counting from the beginning of the header (u32)
13972339Sabial * @NLMSGERR_ATTR_COOKIE: arbitrary subsystem specific cookie to
14072339Sabial *	be used - in the success case - to identify a created
14172339Sabial *	object or operation or similar (binary)
14272339Sabial * @NLMSGERR_ATTR_POLICY: policy for a rejected attribute
14372339Sabial * @NLMSGERR_ATTR_MISS_TYPE: type of a missing required attribute,
14472339Sabial *	%NLMSGERR_ATTR_MISS_NEST will not be present if the attribute was
14572339Sabial *	missing at the message level
14672339Sabial * @NLMSGERR_ATTR_MISS_NEST: offset of the nest where attribute was missing
14772339Sabial * @__NLMSGERR_ATTR_MAX: number of attributes
14872339Sabial * @NLMSGERR_ATTR_MAX: highest attribute number
14972339Sabial */
15072339Sabialenum nlmsgerr_attrs {
15172339Sabial	NLMSGERR_ATTR_UNUSED,
15272339Sabial	NLMSGERR_ATTR_MSG,
15372339Sabial	NLMSGERR_ATTR_OFFS,
15472339Sabial	NLMSGERR_ATTR_COOKIE,
15572339Sabial	NLMSGERR_ATTR_POLICY,
15672339Sabial	NLMSGERR_ATTR_MISS_TYPE,
15772339Sabial	NLMSGERR_ATTR_MISS_NEST,
15872339Sabial
15972339Sabial	__NLMSGERR_ATTR_MAX,
16072339Sabial	NLMSGERR_ATTR_MAX = __NLMSGERR_ATTR_MAX - 1
16172339Sabial};
16272339Sabial
16372339Sabial#define NETLINK_ADD_MEMBERSHIP		1
16472339Sabial#define NETLINK_DROP_MEMBERSHIP		2
16572339Sabial#define NETLINK_PKTINFO			3
16672339Sabial#define NETLINK_BROADCAST_ERROR		4
16772339Sabial#define NETLINK_NO_ENOBUFS		5
16872339Sabial#ifndef __KERNEL__
16972339Sabial#define NETLINK_RX_RING			6
17072339Sabial#define NETLINK_TX_RING			7
17172339Sabial#endif
17272339Sabial#define NETLINK_LISTEN_ALL_NSID		8
17372339Sabial#define NETLINK_LIST_MEMBERSHIPS	9
17472339Sabial#define NETLINK_CAP_ACK			10
17572339Sabial#define NETLINK_EXT_ACK			11
17672339Sabial#define NETLINK_GET_STRICT_CHK		12
17772339Sabial
17872339Sabialstruct nl_pktinfo {
17972339Sabial	__u32	group;
18072339Sabial};
18172339Sabial
18272339Sabialstruct nl_mmap_req {
18372339Sabial	unsigned int	nm_block_size;
18472339Sabial	unsigned int	nm_block_nr;
18572339Sabial	unsigned int	nm_frame_size;
18672339Sabial	unsigned int	nm_frame_nr;
18772339Sabial};
18872339Sabial
18972339Sabialstruct nl_mmap_hdr {
19072339Sabial	unsigned int	nm_status;
19172339Sabial	unsigned int	nm_len;
19272339Sabial	__u32		nm_group;
19372339Sabial	/* credentials */
19472339Sabial	__u32		nm_pid;
19572339Sabial	__u32		nm_uid;
19672339Sabial	__u32		nm_gid;
19772339Sabial};
19872339Sabial
19972339Sabial#ifndef __KERNEL__
20072339Sabialenum nl_mmap_status {
20172339Sabial	NL_MMAP_STATUS_UNUSED,
20272339Sabial	NL_MMAP_STATUS_RESERVED,
20372339Sabial	NL_MMAP_STATUS_VALID,
20472339Sabial	NL_MMAP_STATUS_COPY,
20572339Sabial	NL_MMAP_STATUS_SKIP,
20672339Sabial};
20772339Sabial
20872339Sabial#define NL_MMAP_MSG_ALIGNMENT		NLMSG_ALIGNTO
20972339Sabial#define NL_MMAP_MSG_ALIGN(sz)		__ALIGN_KERNEL(sz, NL_MMAP_MSG_ALIGNMENT)
21072339Sabial#define NL_MMAP_HDRLEN			NL_MMAP_MSG_ALIGN(sizeof(struct nl_mmap_hdr))
21172339Sabial#endif
21272339Sabial
21372339Sabial#define NET_MAJOR 36		/* Major 36 is reserved for networking 						*/
21472339Sabial
21572339Sabialenum {
21672339Sabial	NETLINK_UNCONNECTED = 0,
21772339Sabial	NETLINK_CONNECTED,
21872339Sabial};
21972339Sabial
22072339Sabial/*
22172339Sabial *  <------- NLA_HDRLEN ------> <-- NLA_ALIGN(payload)-->
22272339Sabial * +---------------------+- - -+- - - - - - - - - -+- - -+
22372339Sabial * |        Header       | Pad |     Payload       | Pad |
22472339Sabial * |   (struct nlattr)   | ing |                   | ing |
22572339Sabial * +---------------------+- - -+- - - - - - - - - -+- - -+
22672339Sabial *  <-------------- nlattr->nla_len -------------->
22772339Sabial */
22872339Sabial
22972339Sabialstruct nlattr {
23072339Sabial	__u16           nla_len;
23172339Sabial	__u16           nla_type;
23272339Sabial};
23372339Sabial
23472339Sabial/*
23572339Sabial * nla_type (16 bits)
23672339Sabial * +---+---+-------------------------------+
23772339Sabial * | N | O | Attribute Type                |
23872339Sabial * +---+---+-------------------------------+
23972339Sabial * N := Carries nested attributes
24072339Sabial * O := Payload stored in network byte order
24172339Sabial *
24272339Sabial * Note: The N and O flag are mutually exclusive.
24372339Sabial */
24472339Sabial#define NLA_F_NESTED		(1 << 15)
24572339Sabial#define NLA_F_NET_BYTEORDER	(1 << 14)
24672339Sabial#define NLA_TYPE_MASK		~(NLA_F_NESTED | NLA_F_NET_BYTEORDER)
24772339Sabial
24872339Sabial#define NLA_ALIGNTO		4
24972339Sabial#define NLA_ALIGN(len)		(((len) + NLA_ALIGNTO - 1) & ~(NLA_ALIGNTO - 1))
25072339Sabial#define NLA_HDRLEN		((int) NLA_ALIGN(sizeof(struct nlattr)))
25172339Sabial
25272339Sabial/* Generic 32 bitflags attribute content sent to the kernel.
25372339Sabial *
25472339Sabial * The value is a bitmap that defines the values being set
25572339Sabial * The selector is a bitmask that defines which value is legit
25672339Sabial *
25772339Sabial * Examples:
25872339Sabial *  value = 0x0, and selector = 0x1
25972339Sabial *  implies we are selecting bit 1 and we want to set its value to 0.
26072339Sabial *
26172339Sabial *  value = 0x2, and selector = 0x2
26272339Sabial *  implies we are selecting bit 2 and we want to set its value to 1.
26372339Sabial *
26472339Sabial */
26572339Sabialstruct nla_bitfield32 {
26672339Sabial	__u32 value;
26772339Sabial	__u32 selector;
26872339Sabial};
26972339Sabial
27072339Sabial/*
27172339Sabial * policy descriptions - it's specific to each family how this is used
27272339Sabial * Normally, it should be retrieved via a dump inside another attribute
27372339Sabial * specifying where it applies.
27472339Sabial */
27572339Sabial
27672339Sabial/**
27772339Sabial * enum netlink_attribute_type - type of an attribute
27872339Sabial * @NL_ATTR_TYPE_INVALID: unused
27972339Sabial * @NL_ATTR_TYPE_FLAG: flag attribute (present/not present)
28072339Sabial * @NL_ATTR_TYPE_U8: 8-bit unsigned attribute
28172339Sabial * @NL_ATTR_TYPE_U16: 16-bit unsigned attribute
28272339Sabial * @NL_ATTR_TYPE_U32: 32-bit unsigned attribute
28372339Sabial * @NL_ATTR_TYPE_U64: 64-bit unsigned attribute
28472339Sabial * @NL_ATTR_TYPE_S8: 8-bit signed attribute
28572339Sabial * @NL_ATTR_TYPE_S16: 16-bit signed attribute
28672339Sabial * @NL_ATTR_TYPE_S32: 32-bit signed attribute
28772339Sabial * @NL_ATTR_TYPE_S64: 64-bit signed attribute
28872339Sabial * @NL_ATTR_TYPE_BINARY: binary data, min/max length may be specified
28972339Sabial * @NL_ATTR_TYPE_STRING: string, min/max length may be specified
29072339Sabial * @NL_ATTR_TYPE_NUL_STRING: NUL-terminated string,
29172339Sabial *	min/max length may be specified
29272339Sabial * @NL_ATTR_TYPE_NESTED: nested, i.e. the content of this attribute
29372339Sabial *	consists of sub-attributes. The nested policy and maxtype
29472339Sabial *	inside may be specified.
29572339Sabial * @NL_ATTR_TYPE_NESTED_ARRAY: nested array, i.e. the content of this
29672339Sabial *	attribute contains sub-attributes whose type is irrelevant
29772339Sabial *	(just used to separate the array entries) and each such array
29872339Sabial *	entry has attributes again, the policy for those inner ones
29972339Sabial *	and the corresponding maxtype may be specified.
30072339Sabial * @NL_ATTR_TYPE_BITFIELD32: &struct nla_bitfield32 attribute
30172339Sabial * @NL_ATTR_TYPE_SINT: 32-bit or 64-bit signed attribute, aligned to 4B
30272339Sabial * @NL_ATTR_TYPE_UINT: 32-bit or 64-bit unsigned attribute, aligned to 4B
30372339Sabial */
30472339Sabialenum netlink_attribute_type {
30572339Sabial	NL_ATTR_TYPE_INVALID,
30672339Sabial
30772339Sabial	NL_ATTR_TYPE_FLAG,
30872339Sabial
30972339Sabial	NL_ATTR_TYPE_U8,
31072339Sabial	NL_ATTR_TYPE_U16,
31172339Sabial	NL_ATTR_TYPE_U32,
31272339Sabial	NL_ATTR_TYPE_U64,
31372339Sabial
31472339Sabial	NL_ATTR_TYPE_S8,
31572339Sabial	NL_ATTR_TYPE_S16,
31672339Sabial	NL_ATTR_TYPE_S32,
31772339Sabial	NL_ATTR_TYPE_S64,
31872339Sabial
31972339Sabial	NL_ATTR_TYPE_BINARY,
32072339Sabial	NL_ATTR_TYPE_STRING,
32172339Sabial	NL_ATTR_TYPE_NUL_STRING,
32272339Sabial
32372339Sabial	NL_ATTR_TYPE_NESTED,
32472339Sabial	NL_ATTR_TYPE_NESTED_ARRAY,
32572339Sabial
32672339Sabial	NL_ATTR_TYPE_BITFIELD32,
32772339Sabial
32872339Sabial	NL_ATTR_TYPE_SINT,
32972339Sabial	NL_ATTR_TYPE_UINT,
33072339Sabial};
33172339Sabial
33272339Sabial/**
33372339Sabial * enum netlink_policy_type_attr - policy type attributes
33472339Sabial * @NL_POLICY_TYPE_ATTR_UNSPEC: unused
33572339Sabial * @NL_POLICY_TYPE_ATTR_TYPE: type of the attribute,
33672339Sabial *	&enum netlink_attribute_type (U32)
33772339Sabial * @NL_POLICY_TYPE_ATTR_MIN_VALUE_S: minimum value for signed
33872339Sabial *	integers (S64)
33972339Sabial * @NL_POLICY_TYPE_ATTR_MAX_VALUE_S: maximum value for signed
34072339Sabial *	integers (S64)
34172339Sabial * @NL_POLICY_TYPE_ATTR_MIN_VALUE_U: minimum value for unsigned
34272339Sabial *	integers (U64)
34372339Sabial * @NL_POLICY_TYPE_ATTR_MAX_VALUE_U: maximum value for unsigned
34472339Sabial *	integers (U64)
34572339Sabial * @NL_POLICY_TYPE_ATTR_MIN_LENGTH: minimum length for binary
34672339Sabial *	attributes, no minimum if not given (U32)
34772339Sabial * @NL_POLICY_TYPE_ATTR_MAX_LENGTH: maximum length for binary
34872339Sabial *	attributes, no maximum if not given (U32)
34972339Sabial * @NL_POLICY_TYPE_ATTR_POLICY_IDX: sub policy for nested and
35072339Sabial *	nested array types (U32)
35172339Sabial * @NL_POLICY_TYPE_ATTR_POLICY_MAXTYPE: maximum sub policy
35272339Sabial *	attribute for nested and nested array types, this can
35372339Sabial *	in theory be < the size of the policy pointed to by
35472339Sabial *	the index, if limited inside the nesting (U32)
35572339Sabial * @NL_POLICY_TYPE_ATTR_BITFIELD32_MASK: valid mask for the
35672339Sabial *	bitfield32 type (U32)
35772339Sabial * @NL_POLICY_TYPE_ATTR_MASK: mask of valid bits for unsigned integers (U64)
35872339Sabial * @NL_POLICY_TYPE_ATTR_PAD: pad attribute for 64-bit alignment
35972339Sabial *
36072339Sabial * @__NL_POLICY_TYPE_ATTR_MAX: number of attributes
36172339Sabial * @NL_POLICY_TYPE_ATTR_MAX: highest attribute number
36272339Sabial */
36372339Sabialenum netlink_policy_type_attr {
36472339Sabial	NL_POLICY_TYPE_ATTR_UNSPEC,
36572339Sabial	NL_POLICY_TYPE_ATTR_TYPE,
36672339Sabial	NL_POLICY_TYPE_ATTR_MIN_VALUE_S,
36772339Sabial	NL_POLICY_TYPE_ATTR_MAX_VALUE_S,
36872339Sabial	NL_POLICY_TYPE_ATTR_MIN_VALUE_U,
36972339Sabial	NL_POLICY_TYPE_ATTR_MAX_VALUE_U,
37072339Sabial	NL_POLICY_TYPE_ATTR_MIN_LENGTH,
37172339Sabial	NL_POLICY_TYPE_ATTR_MAX_LENGTH,
37272339Sabial	NL_POLICY_TYPE_ATTR_POLICY_IDX,
37372339Sabial	NL_POLICY_TYPE_ATTR_POLICY_MAXTYPE,
37472339Sabial	NL_POLICY_TYPE_ATTR_BITFIELD32_MASK,
37572339Sabial	NL_POLICY_TYPE_ATTR_PAD,
37672339Sabial	NL_POLICY_TYPE_ATTR_MASK,
37772339Sabial
37872339Sabial	/* keep last */
37972339Sabial	__NL_POLICY_TYPE_ATTR_MAX,
38072339Sabial	NL_POLICY_TYPE_ATTR_MAX = __NL_POLICY_TYPE_ATTR_MAX - 1
38172339Sabial};
38272339Sabial
38372339Sabial#endif /* _UAPI__LINUX_NETLINK_H */
38472339Sabial