xref: /freebsd/sys/netlink/netlink_generic.h (revision 4d846d260e2b9a3d4d0a701462568268cbfe7a5b)
17e5bf684SAlexander V. Chernikov /*-
2*4d846d26SWarner Losh  * SPDX-License-Identifier: BSD-2-Clause
37e5bf684SAlexander V. Chernikov  *
47e5bf684SAlexander V. Chernikov  * Copyright (c) 2022 Alexander V. Chernikov <melifaro@FreeBSD.org>
57e5bf684SAlexander V. Chernikov  *
67e5bf684SAlexander V. Chernikov  * Redistribution and use in source and binary forms, with or without
77e5bf684SAlexander V. Chernikov  * modification, are permitted provided that the following conditions
87e5bf684SAlexander V. Chernikov  * are met:
97e5bf684SAlexander V. Chernikov  * 1. Redistributions of source code must retain the above copyright
107e5bf684SAlexander V. Chernikov  *    notice, this list of conditions and the following disclaimer.
117e5bf684SAlexander V. Chernikov  * 2. Redistributions in binary form must reproduce the above copyright
127e5bf684SAlexander V. Chernikov  *    notice, this list of conditions and the following disclaimer in the
137e5bf684SAlexander V. Chernikov  *    documentation and/or other materials provided with the distribution.
147e5bf684SAlexander V. Chernikov  *
157e5bf684SAlexander V. Chernikov  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
167e5bf684SAlexander V. Chernikov  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
177e5bf684SAlexander V. Chernikov  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
187e5bf684SAlexander V. Chernikov  * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
197e5bf684SAlexander V. Chernikov  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
207e5bf684SAlexander V. Chernikov  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
217e5bf684SAlexander V. Chernikov  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
227e5bf684SAlexander V. Chernikov  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
237e5bf684SAlexander V. Chernikov  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
247e5bf684SAlexander V. Chernikov  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
257e5bf684SAlexander V. Chernikov  * SUCH DAMAGE.
267e5bf684SAlexander V. Chernikov  */
277e5bf684SAlexander V. Chernikov 
287e5bf684SAlexander V. Chernikov /*
297e5bf684SAlexander V. Chernikov  * Generic netlink message header and attributes
307e5bf684SAlexander V. Chernikov  */
317e5bf684SAlexander V. Chernikov #ifndef _NETLINK_NETLINK_GENERIC_H_
327e5bf684SAlexander V. Chernikov #define	_NETLINK_NETLINK_GENERIC_H_
337e5bf684SAlexander V. Chernikov 
34dddafa8dSAlexander V. Chernikov #include <netlink/netlink.h>
35dddafa8dSAlexander V. Chernikov 
367e5bf684SAlexander V. Chernikov /* Base header for all of the relevant messages */
377e5bf684SAlexander V. Chernikov struct genlmsghdr {
387e5bf684SAlexander V. Chernikov 	uint8_t		cmd;		/* CTRL_CMD_ */
397e5bf684SAlexander V. Chernikov 	uint8_t		version;	/* ABI version for the cmd */
407e5bf684SAlexander V. Chernikov 	uint16_t	reserved;	/* reserved: set to 0 */
417e5bf684SAlexander V. Chernikov };
427e5bf684SAlexander V. Chernikov #define GENL_HDRLEN	NL_ITEM_ALIGN(sizeof(struct genlmsghdr))
437e5bf684SAlexander V. Chernikov 
447e5bf684SAlexander V. Chernikov /* Dynamic family number range, inclusive */
457e5bf684SAlexander V. Chernikov #define	GENL_MIN_ID	NLMSG_MIN_TYPE
467e5bf684SAlexander V. Chernikov #define	GENL_MAX_ID	1023
477e5bf684SAlexander V. Chernikov 
487e5bf684SAlexander V. Chernikov /* Pre-defined family numbers */
497e5bf684SAlexander V. Chernikov #define	GENL_ID_CTRL	GENL_MIN_ID
507e5bf684SAlexander V. Chernikov 
517e5bf684SAlexander V. Chernikov /* Available commands */
527e5bf684SAlexander V. Chernikov enum {
537e5bf684SAlexander V. Chernikov 	CTRL_CMD_UNSPEC		= 0,
547e5bf684SAlexander V. Chernikov 	CTRL_CMD_NEWFAMILY	= 1,
557e5bf684SAlexander V. Chernikov 	CTRL_CMD_DELFAMILY	= 2,
567e5bf684SAlexander V. Chernikov 	CTRL_CMD_GETFAMILY	= 3, /* lists all (or matching) genetlink families */
577e5bf684SAlexander V. Chernikov 	CTRL_CMD_NEWOPS		= 4,
587e5bf684SAlexander V. Chernikov 	CTRL_CMD_DELOPS		= 5,
597e5bf684SAlexander V. Chernikov 	CTRL_CMD_GETOPS		= 6,
607e5bf684SAlexander V. Chernikov 	CTRL_CMD_NEWMCAST_GRP	= 7,
617e5bf684SAlexander V. Chernikov 	CTRL_CMD_DELMCAST_GRP	= 8,
627e5bf684SAlexander V. Chernikov 	CTRL_CMD_GETMCAST_GRP	= 9,
637e5bf684SAlexander V. Chernikov 	CTRL_CMD_GETPOLICY	= 10,
647e5bf684SAlexander V. Chernikov 	__CTRL_CMD_MAX,
657e5bf684SAlexander V. Chernikov };
667e5bf684SAlexander V. Chernikov #define	CTRL_CMD_MAX	(__CTRL_CMD_MAX - 1)
677e5bf684SAlexander V. Chernikov 
687e5bf684SAlexander V. Chernikov /* Generic attributes */
697e5bf684SAlexander V. Chernikov enum {
707e5bf684SAlexander V. Chernikov 	CTRL_ATTR_UNSPEC,
717e5bf684SAlexander V. Chernikov 	CTRL_ATTR_FAMILY_ID	= 1, /* u16, dynamically-assigned ID */
727e5bf684SAlexander V. Chernikov 	CTRL_ATTR_FAMILY_NAME	= 2, /* string, family name */
737e5bf684SAlexander V. Chernikov 	CTRL_ATTR_VERSION	= 3, /* u32, command version */
747e5bf684SAlexander V. Chernikov 	CTRL_ATTR_HDRSIZE	= 4, /* u32, family header size */
757e5bf684SAlexander V. Chernikov 	CTRL_ATTR_MAXATTR	= 5, /* u32, maximum family attr # */
767e5bf684SAlexander V. Chernikov 	CTRL_ATTR_OPS		= 6, /* nested, available operations */
777e5bf684SAlexander V. Chernikov 	CTRL_ATTR_MCAST_GROUPS	= 7,
787e5bf684SAlexander V. Chernikov 	CTRL_ATTR_POLICY	= 8,
797e5bf684SAlexander V. Chernikov 	CTRL_ATTR_OP_POLICY	= 9,
807e5bf684SAlexander V. Chernikov 	CTRL_ATTR_OP		= 10,
817e5bf684SAlexander V. Chernikov 	__CTRL_ATTR_MAX,
827e5bf684SAlexander V. Chernikov };
837e5bf684SAlexander V. Chernikov #define	CTRL_ATTR_MAX	(__CTRL_ATTR_MAX - 1)
847e5bf684SAlexander V. Chernikov 
857e5bf684SAlexander V. Chernikov #define	GENL_NAMSIZ	16 /* max family name length including \0 */
867e5bf684SAlexander V. Chernikov 
877e5bf684SAlexander V. Chernikov /* CTRL_ATTR_OPS attributes */
887e5bf684SAlexander V. Chernikov enum {
897e5bf684SAlexander V. Chernikov 	CTRL_ATTR_OP_UNSPEC,
907e5bf684SAlexander V. Chernikov 	CTRL_ATTR_OP_ID		= 1, /* u32, operation # */
917e5bf684SAlexander V. Chernikov 	CTRL_ATTR_OP_FLAGS	= 2, /* u32, flags-based op description */
927e5bf684SAlexander V. Chernikov 	__CTRL_ATTR_OP_MAX,
937e5bf684SAlexander V. Chernikov };
947e5bf684SAlexander V. Chernikov #define	CTRL_ATTR_OP_MAX	(__CTRL_ATTR_OP_MAX - 1)
957e5bf684SAlexander V. Chernikov 
967e5bf684SAlexander V. Chernikov /* CTRL_ATTR_OP_FLAGS values */
977e5bf684SAlexander V. Chernikov #define GENL_ADMIN_PERM		0x0001 /* Requires elevated permissions */
987e5bf684SAlexander V. Chernikov #define GENL_CMD_CAP_DO		0x0002 /* Operation is a modification request */
997e5bf684SAlexander V. Chernikov #define GENL_CMD_CAP_DUMP	0x0004 /* Operation is a get/dump request */
1007e5bf684SAlexander V. Chernikov #define GENL_CMD_CAP_HASPOL	0x0008 /* Operation has a validation policy */
1017e5bf684SAlexander V. Chernikov #define GENL_UNS_ADMIN_PERM	0x0010
1027e5bf684SAlexander V. Chernikov 
1037e5bf684SAlexander V. Chernikov /* CTRL_ATTR_MCAST_GROUPS attributes */
1047e5bf684SAlexander V. Chernikov enum {
1057e5bf684SAlexander V. Chernikov 	CTRL_ATTR_MCAST_GRP_UNSPEC,
1067e5bf684SAlexander V. Chernikov 	CTRL_ATTR_MCAST_GRP_NAME,	/* string, group name */
1077e5bf684SAlexander V. Chernikov 	CTRL_ATTR_MCAST_GRP_ID,		/* u32, dynamically-assigned group id */
1087e5bf684SAlexander V. Chernikov 	__CTRL_ATTR_MCAST_GRP_MAX,
1097e5bf684SAlexander V. Chernikov };
110830352ccSAlexander V. Chernikov #define	CTRL_ATTR_MCAST_GRP_MAX	(__CTRL_ATTR_MCAST_GRP_MAX - 1)
1117e5bf684SAlexander V. Chernikov 
1127e5bf684SAlexander V. Chernikov 
1137e5bf684SAlexander V. Chernikov #endif
1147e5bf684SAlexander V. Chernikov 
115