xref: /freebsd/sys/netlink/netlink_var.h (revision 06cf36516512015867ceb56bde7913b1dc51ef3c)
1 /*-
2  * SPDX-License-Identifier: BSD-2-Clause
3  *
4  * Copyright (c) 2021 Ng Peng Nam Sean
5  * Copyright (c) 2022 Alexander V. Chernikov <melifaro@FreeBSD.org>
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  * 1. Redistributions of source code must retain the above copyright
11  *    notice, this list of conditions and the following disclaimer.
12  * 2. Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in the
14  *    documentation and/or other materials provided with the distribution.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19  * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26  * SUCH DAMAGE.
27  */
28 #ifndef _NETLINK_NETLINK_VAR_H_
29 #define _NETLINK_NETLINK_VAR_H_
30 
31 #ifdef _KERNEL
32 
33 #include <sys/ck.h>
34 #include <sys/epoch.h>
35 #include <sys/sysctl.h>
36 #include <sys/taskqueue.h>
37 #include <net/vnet.h>
38 
39 #define	NLSNDQ  	65536 /* Default socket sendspace */
40 #define	NLRCVQ		65536 /* Default socket recvspace */
41 
42 #define	NLMBUFSIZE	2048	/* External storage size for Netlink mbufs */
43 
44 struct ucred;
45 
46 struct nl_buf {
47 	TAILQ_ENTRY(nl_buf)	tailq;
48 	u_int			buflen;
49 	u_int			datalen;
50 	u_int			offset;
51 	char			data[];
52 };
53 
54 #define	NLP_MAX_GROUPS		128
55 
56 BITSET_DEFINE(nl_groups, NLP_MAX_GROUPS);
57 struct nlpcb {
58         struct socket           *nl_socket;
59 	struct nl_groups	nl_groups;
60 	uint32_t                nl_port;
61 	uint32_t	        nl_flags;
62 	uint32_t	        nl_process_id;
63         int                     nl_proto;
64 	bool			nl_bound;
65         bool			nl_task_pending;
66 	bool			nl_tx_blocked; /* No new requests accepted */
67 	bool			nl_linux; /* true if running under compat */
68 	bool			nl_unconstrained_vnet; /* true if running under VNET jail (or without jail) */
69 	bool			nl_need_thread_setup;
70 	struct taskqueue	*nl_taskqueue;
71 	struct task		nl_task;
72 	uint64_t		nl_dropped_bytes;
73 	uint64_t		nl_dropped_messages;
74         CK_LIST_ENTRY(nlpcb)    nl_next;
75         CK_LIST_ENTRY(nlpcb)    nl_port_next;
76 	volatile u_int		nl_refcount;
77 	struct mtx		nl_lock;
78 	struct epoch_context	nl_epoch_ctx;
79 };
80 #define sotonlpcb(so)       ((struct nlpcb *)(so)->so_pcb)
81 
82 #define	NLP_LOCK_INIT(_nlp)	mtx_init(&((_nlp)->nl_lock), "nlp mtx", NULL, MTX_DEF)
83 #define	NLP_LOCK_DESTROY(_nlp)	mtx_destroy(&((_nlp)->nl_lock))
84 #define	NLP_LOCK(_nlp)		mtx_lock(&((_nlp)->nl_lock))
85 #define	NLP_UNLOCK(_nlp)	mtx_unlock(&((_nlp)->nl_lock))
86 
87 #define	ALIGNED_NL_SZ(_data)	roundup2((((struct nlmsghdr *)(_data))->nlmsg_len), 16)
88 
89 /* nl_flags */
90 #define NLF_CAP_ACK             0x01 /* Do not send message body with errmsg */
91 #define NLF_EXT_ACK             0x02 /* Allow including extended TLVs in ack */
92 #define	NLF_STRICT		0x04 /* Perform strict header checks */
93 #define	NLF_MSG_INFO		0x08 /* Send caller info along with the notifications */
94 
95 SYSCTL_DECL(_net_netlink);
96 SYSCTL_DECL(_net_netlink_debug);
97 
98 struct nl_control {
99 	CK_LIST_HEAD(nl_pid_head, nlpcb)	ctl_port_head;
100 	CK_LIST_HEAD(nlpcb_head, nlpcb)		ctl_pcb_head;
101 	CK_LIST_ENTRY(nl_control)		ctl_next;
102 	struct rmlock				ctl_lock;
103 };
104 VNET_DECLARE(struct nl_control, nl_ctl);
105 #define	V_nl_ctl	VNET(nl_ctl)
106 
107 struct sockaddr_nl;
108 struct sockaddr;
109 struct nlmsghdr;
110 
111 int nl_verify_proto(int proto);
112 const char *nl_get_proto_name(int proto);
113 
114 extern int netlink_unloading;
115 
116 struct nl_proto_handler {
117 	nl_handler_f	cb;
118 	const char	*proto_name;
119 };
120 extern struct nl_proto_handler *nl_handlers;
121 
122 /* netlink_domain.c */
123 bool nl_send_group(struct nl_writer *);
124 void nl_clear_group(u_int);
125 void nl_osd_register(void);
126 void nl_osd_unregister(void);
127 void nl_set_thread_nlp(struct thread *td, struct nlpcb *nlp);
128 
129 /* netlink_io.c */
130 bool nl_send(struct nl_writer *, struct nlpcb *);
131 void nlmsg_ack(struct nlpcb *nlp, int error, struct nlmsghdr *nlmsg,
132     struct nl_pstate *npt);
133 void nl_on_transmit(struct nlpcb *nlp);
134 
135 void nl_taskqueue_handler(void *_arg, int pending);
136 void nl_schedule_taskqueue(struct nlpcb *nlp);
137 void nl_process_receive_locked(struct nlpcb *nlp);
138 void nl_set_source_metadata(struct mbuf *m, int num_messages);
139 struct nl_buf *nl_buf_alloc(size_t len, int mflag);
140 void nl_buf_free(struct nl_buf *nb);
141 
142 #define	MAX_FAMILIES	20
143 #define	MAX_GROUPS	64
144 
145 #define	MIN_GROUP_NUM	48
146 
147 #define	CTRL_FAMILY_ID		0
148 #define	CTRL_FAMILY_NAME	"nlctrl"
149 #define	CTRL_GROUP_ID		0
150 #define	CTRL_GROUP_NAME		"notify"
151 
152 struct ifnet;
153 struct nl_parsed_link;
154 struct nlattr_bmask;
155 struct nl_pstate;
156 
157 /* Function map */
158 struct nl_function_wrapper {
159 	bool (*nlmsg_add)(struct nl_writer *nw, uint32_t portid, uint32_t seq, uint16_t type,
160 	    uint16_t flags, uint32_t len);
161 	bool (*nlmsg_refill_buffer)(struct nl_writer *nw, size_t required_len);
162 	bool (*nlmsg_flush)(struct nl_writer *nw);
163 	bool (*nlmsg_end)(struct nl_writer *nw);
164 	void (*nlmsg_abort)(struct nl_writer *nw);
165 	void (*nlmsg_ignore_limit)(struct nl_writer *nw);
166 	bool (*nl_writer_unicast)(struct nl_writer *nw, size_t size,
167 	    struct nlpcb *nlp, bool waitok);
168 	bool (*nl_writer_group)(struct nl_writer *nw, size_t size,
169 	    uint16_t protocol, uint16_t group_id, int priv, bool waitok);
170 	bool (*nlmsg_end_dump)(struct nl_writer *nw, int error, struct nlmsghdr *hdr);
171 	int (*nl_modify_ifp_generic)(struct ifnet *ifp, struct nl_parsed_link *lattrs,
172 	    const struct nlattr_bmask *bm, struct nl_pstate *npt);
173 	void (*nl_store_ifp_cookie)(struct nl_pstate *npt, struct ifnet *ifp);
174 	struct nlpcb * (*nl_get_thread_nlp)(struct  thread *td);
175 };
176 void nl_set_functions(const struct nl_function_wrapper *nl);
177 
178 
179 
180 #endif
181 #endif
182