2 * SPDX-License-Identifier: BSD-2-Clause
4 * Copyright (c) 2021 Ng Peng Nam Sean
5 * Copyright (c) 2022 Alexander V. Chernikov <melifaro@FreeBSD.org>
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
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.
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
28 #ifndef _NETLINK_NETLINK_VAR_H_
29 #define _NETLINK_NETLINK_VAR_H_
34 #include <sys/epoch.h>
35 #include <sys/sysctl.h>
36 #include <sys/taskqueue.h>
39 #define NLSNDQ 65536 /* Default socket sendspace */
40 #define NLRCVQ 65536 /* Default socket recvspace */
42 #define NLMBUFSIZE 2048 /* External storage size for Netlink mbufs */
47 STAILQ_HEAD(, mbuf) head;
52 #define NLP_MAX_GROUPS 128
55 struct socket *nl_socket;
56 uint64_t nl_groups[NLP_MAX_GROUPS / 64];
59 uint32_t nl_process_id;
64 bool nl_tx_blocked; /* No new requests accepted */
65 bool nl_linux; /* true if running under compat */
66 bool nl_unconstrained_vnet; /* true if running under VNET jail (or without jail) */
67 bool nl_need_thread_setup;
68 struct nl_io_queue rx_queue;
69 struct nl_io_queue tx_queue;
70 struct taskqueue *nl_taskqueue;
72 struct ucred *nl_cred; /* Copy of nl_socket->so_cred */
73 uint64_t nl_dropped_bytes;
74 uint64_t nl_dropped_messages;
75 CK_LIST_ENTRY(nlpcb) nl_next;
76 CK_LIST_ENTRY(nlpcb) nl_port_next;
77 volatile u_int nl_refcount;
79 struct epoch_context nl_epoch_ctx;
81 #define sotonlpcb(so) ((struct nlpcb *)(so)->so_pcb)
83 #define NLP_LOCK_INIT(_nlp) mtx_init(&((_nlp)->nl_lock), "nlp mtx", NULL, MTX_DEF)
84 #define NLP_LOCK_DESTROY(_nlp) mtx_destroy(&((_nlp)->nl_lock))
85 #define NLP_LOCK(_nlp) mtx_lock(&((_nlp)->nl_lock))
86 #define NLP_UNLOCK(_nlp) mtx_unlock(&((_nlp)->nl_lock))
88 #define ALIGNED_NL_SZ(_data) roundup2((((struct nlmsghdr *)(_data))->nlmsg_len), 16)
91 #define NLF_CAP_ACK 0x01 /* Do not send message body with errmsg */
92 #define NLF_EXT_ACK 0x02 /* Allow including extended TLVs in ack */
93 #define NLF_STRICT 0x04 /* Perform strict header checks */
94 #define NLF_MSG_INFO 0x08 /* Send caller info along with the notifications */
96 SYSCTL_DECL(_net_netlink);
97 SYSCTL_DECL(_net_netlink_debug);
100 struct callout callout;
107 CK_LIST_HEAD(nl_pid_head, nlpcb) ctl_port_head;
108 CK_LIST_HEAD(nlpcb_head, nlpcb) ctl_pcb_head;
109 CK_LIST_ENTRY(nl_control) ctl_next;
111 struct rmlock ctl_lock;
113 VNET_DECLARE(struct nl_control *, nl_ctl);
114 #define V_nl_ctl VNET(nl_ctl)
121 /* netlink_module.c */
122 struct nl_control *vnet_nl_ctl_init(void);
124 int nl_verify_proto(int proto);
125 const char *nl_get_proto_name(int proto);
127 extern int netlink_unloading;
129 struct nl_proto_handler {
131 const char *proto_name;
133 extern struct nl_proto_handler *nl_handlers;
135 /* netlink_domain.c */
136 void nl_send_group(struct mbuf *m, int cnt, int proto, int group_id);
137 void nl_osd_register(void);
138 void nl_osd_unregister(void);
139 void nl_set_thread_nlp(struct thread *td, struct nlpcb *nlp);
142 #define NL_IOF_UNTRANSLATED 0x01
143 #define NL_IOF_IGNORE_LIMIT 0x02
144 bool nl_send_one(struct mbuf *m, struct nlpcb *nlp, int cnt, int io_flags);
145 void nlmsg_ack(struct nlpcb *nlp, int error, struct nlmsghdr *nlmsg,
146 struct nl_pstate *npt);
147 void nl_on_transmit(struct nlpcb *nlp);
148 void nl_init_io(struct nlpcb *nlp);
149 void nl_free_io(struct nlpcb *nlp);
151 void nl_taskqueue_handler(void *_arg, int pending);
152 int nl_receive_async(struct mbuf *m, struct socket *so);
153 void nl_process_receive_locked(struct nlpcb *nlp);
154 void nl_set_source_metadata(struct mbuf *m, int num_messages);
155 void nl_add_msg_info(struct mbuf *m);
157 /* netlink_message_writer.c */
158 void nl_init_msg_zone(void);
159 void nl_destroy_msg_zone(void);
161 /* netlink_generic.c */
163 const char *family_name;
164 uint16_t family_hdrsize;
166 uint16_t family_version;
167 uint16_t family_attr_max;
168 uint16_t family_cmd_size;
169 uint16_t family_num_groups;
170 struct genl_cmd *family_cmds;
174 struct genl_family *group_family;
175 const char *group_name;
178 struct genl_family *genl_get_family(uint32_t family_id);
179 struct genl_group *genl_get_group(uint32_t group_id);
181 #define MAX_FAMILIES 20
182 #define MAX_GROUPS 64
184 #define MIN_GROUP_NUM 48
186 #define CTRL_FAMILY_NAME "nlctrl"
189 struct nl_parsed_link;
194 struct nl_function_wrapper {
195 bool (*nlmsg_add)(struct nl_writer *nw, uint32_t portid, uint32_t seq, uint16_t type,
196 uint16_t flags, uint32_t len);
197 bool (*nlmsg_refill_buffer)(struct nl_writer *nw, int required_len);
198 bool (*nlmsg_flush)(struct nl_writer *nw);
199 bool (*nlmsg_end)(struct nl_writer *nw);
200 void (*nlmsg_abort)(struct nl_writer *nw);
201 void (*nlmsg_ignore_limit)(struct nl_writer *nw);
202 bool (*nlmsg_get_unicast_writer)(struct nl_writer *nw, int size, struct nlpcb *nlp);
203 bool (*nlmsg_get_group_writer)(struct nl_writer *nw, int size, int protocol, int group_id);
204 bool (*nlmsg_get_chain_writer)(struct nl_writer *nw, int size, struct mbuf **pm);
205 bool (*nlmsg_end_dump)(struct nl_writer *nw, int error, struct nlmsghdr *hdr);
206 int (*nl_modify_ifp_generic)(struct ifnet *ifp, struct nl_parsed_link *lattrs,
207 const struct nlattr_bmask *bm, struct nl_pstate *npt);
208 void (*nl_store_ifp_cookie)(struct nl_pstate *npt, struct ifnet *ifp);
209 struct nlpcb * (*nl_get_thread_nlp)(struct thread *td);
211 void nl_set_functions(const struct nl_function_wrapper *nl);