xref: /freebsd/sys/net/vnet.h (revision d0728d71742e6b2304a3b370f4f4bec9e7d1dc5e)
18b615593SMarko Zec /*-
2eddfbb76SRobert Watson  * Copyright (c) 2009 Jeffrey Roberson <jeff@freebsd.org>
3eddfbb76SRobert Watson  * Copyright (c) 2009 Robert N. M. Watson
4c1e200ffSRobert Watson  * All rights reserved.
58b615593SMarko Zec  *
68b615593SMarko Zec  * Redistribution and use in source and binary forms, with or without
78b615593SMarko Zec  * modification, are permitted provided that the following conditions
88b615593SMarko Zec  * are met:
98b615593SMarko Zec  * 1. Redistributions of source code must retain the above copyright
108b615593SMarko Zec  *    notice, this list of conditions and the following disclaimer.
118b615593SMarko Zec  * 2. Redistributions in binary form must reproduce the above copyright
128b615593SMarko Zec  *    notice, this list of conditions and the following disclaimer in the
138b615593SMarko Zec  *    documentation and/or other materials provided with the distribution.
148b615593SMarko Zec  *
158b615593SMarko Zec  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
168b615593SMarko Zec  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
178b615593SMarko Zec  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
188b615593SMarko Zec  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
198b615593SMarko Zec  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
208b615593SMarko Zec  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
218b615593SMarko Zec  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
228b615593SMarko Zec  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
238b615593SMarko Zec  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
248b615593SMarko Zec  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
258b615593SMarko Zec  * SUCH DAMAGE.
268b615593SMarko Zec  *
278b615593SMarko Zec  * $FreeBSD$
288b615593SMarko Zec  */
298b615593SMarko Zec 
30eddfbb76SRobert Watson /*
31eddfbb76SRobert Watson  * This is the virtual network stack memory allocator, which provides support
32eddfbb76SRobert Watson  * for virtualized global variables via a special linker set, set_vnet.  When
33eddfbb76SRobert Watson  * "options VIMAGE" isn't defined, virtualized global variables are compiled
34eddfbb76SRobert Watson  * as normal globals.
35eddfbb76SRobert Watson  */
36eddfbb76SRobert Watson 
378b615593SMarko Zec #ifndef _NET_VNET_H_
388b615593SMarko Zec #define	_NET_VNET_H_
398b615593SMarko Zec 
4017ef1febSRobert Watson #if defined(_KERNEL) || defined(_WANT_VNET)
4117ef1febSRobert Watson 
4217ef1febSRobert Watson #define	VNET_SETNAME		"set_vnet"
4317ef1febSRobert Watson #define	VNET_SYMPREFIX		"vnet_entry_"
4417ef1febSRobert Watson 
4517ef1febSRobert Watson #endif
4617ef1febSRobert Watson 
47eddfbb76SRobert Watson #ifdef _KERNEL
48eddfbb76SRobert Watson #ifdef VIMAGE
49d0728d71SRobert Watson #include <sys/kernel.h>
50d0728d71SRobert Watson 
51d0728d71SRobert Watson /*
52d0728d71SRobert Watson  * SYSINIT/SYSUNINIT variants that provide per-vnet constructors and
53d0728d71SRobert Watson  * destructors.
54d0728d71SRobert Watson  */
55d0728d71SRobert Watson struct vnet_sysinit {
56d0728d71SRobert Watson 	enum sysinit_sub_id	subsystem;
57d0728d71SRobert Watson 	enum sysinit_elem_order	order;
58d0728d71SRobert Watson 	sysinit_cfunc_t		func;
59d0728d71SRobert Watson 	const void		*arg;
60d0728d71SRobert Watson 	TAILQ_ENTRY(vnet_sysinit) link;
61d0728d71SRobert Watson };
62d0728d71SRobert Watson 
63d0728d71SRobert Watson #define	VNET_SYSINIT(ident, subsystem, order, func, arg)		\
64d0728d71SRobert Watson 	static struct vnet_sysinit ident ## _vnet_init = {		\
65d0728d71SRobert Watson 		subsystem,						\
66d0728d71SRobert Watson 		order,							\
67d0728d71SRobert Watson 		(sysinit_cfunc_t)(sysinit_nfunc_t)func,			\
68d0728d71SRobert Watson 		(arg)							\
69d0728d71SRobert Watson 	};								\
70d0728d71SRobert Watson 	SYSINIT(vnet_init_ ## ident, subsystem, order,			\
71d0728d71SRobert Watson 	    vnet_register_sysinit, &ident ## _vnet_init);		\
72d0728d71SRobert Watson 	SYSUNINIT(vnet_init_ ## ident, subsystem, order,		\
73d0728d71SRobert Watson 	    vnet_deregister_sysinit, &ident ## _vnet_init)
74d0728d71SRobert Watson 
75d0728d71SRobert Watson #define	VNET_SYSUNINIT(ident, subsystem, order, func, arg)		\
76d0728d71SRobert Watson 	static struct vnet_sysinit ident ## _vnet_uninit = {		\
77d0728d71SRobert Watson 		subsystem,						\
78d0728d71SRobert Watson 		order,							\
79d0728d71SRobert Watson 		(sysinit_cfunc_t)(sysinit_nfunc_t)func,			\
80d0728d71SRobert Watson 		(arg)							\
81d0728d71SRobert Watson 	};								\
82d0728d71SRobert Watson 	SYSINIT(vnet_uninit_ ## ident, subsystem, order,		\
83d0728d71SRobert Watson 	    vnet_register_sysuninit, &ident ## _vnet_uninit);		\
84d0728d71SRobert Watson 	SYSUNINIT(vnet_uninit_ ## ident, subsystem, order,		\
85d0728d71SRobert Watson 	    vnet_deregister_sysuninit, &ident ## _vnet_uninit)
868b615593SMarko Zec 
87eddfbb76SRobert Watson #if defined(__arm__)
8817ef1febSRobert Watson __asm__(".section " VNET_SETNAME ", \"aw\", %progbits");
89eddfbb76SRobert Watson #else
9017ef1febSRobert Watson __asm__(".section " VNET_SETNAME ", \"aw\", @progbits");
91385195c0SMarko Zec #endif
92eddfbb76SRobert Watson __asm__(".previous");
93eddfbb76SRobert Watson 
94eddfbb76SRobert Watson #define	VNET_NAME(n)		vnet_entry_##n
95eddfbb76SRobert Watson #define	VNET_DECLARE(t, n)	extern t VNET_NAME(n)
9617ef1febSRobert Watson #define	VNET_DEFINE(t, n)	t VNET_NAME(n) __section(VNET_SETNAME) __used
97eddfbb76SRobert Watson #define	_VNET_PTR(b, n)		(__typeof(VNET_NAME(n))*)		\
98eddfbb76SRobert Watson 				    ((b) + (uintptr_t)&VNET_NAME(n))
99eddfbb76SRobert Watson 
1001e77c105SRobert Watson #define	_VNET(b, n)		(*_VNET_PTR(b, n))
101385195c0SMarko Zec 
1028b615593SMarko Zec /*
103eddfbb76SRobert Watson  * Virtualized global variable accessor macros.
1048b615593SMarko Zec  */
105eddfbb76SRobert Watson #define	VNET_VNET_PTR(vnet, n)		_VNET_PTR((vnet)->vnet_data_base, n)
1061e77c105SRobert Watson #define	VNET_VNET(vnet, n)		(*VNET_VNET_PTR((vnet), n))
1078b615593SMarko Zec 
108eddfbb76SRobert Watson #define	VNET_PTR(n)		VNET_VNET_PTR(curvnet, n)
1091e77c105SRobert Watson #define	VNET(n)			VNET_VNET(curvnet, n)
1108b615593SMarko Zec 
111eddfbb76SRobert Watson /*
112eddfbb76SRobert Watson  * Sysctl variants for vnet-virtualized global variables.  Include
113eddfbb76SRobert Watson  * <sys/sysctl.h> to expose these definitions.
114eddfbb76SRobert Watson  *
115eddfbb76SRobert Watson  * Note: SYSCTL_PROC() handler functions will need to resolve pointer
116eddfbb76SRobert Watson  * arguments themselves, if required.
117eddfbb76SRobert Watson  */
118eddfbb76SRobert Watson #ifdef SYSCTL_OID
119eddfbb76SRobert Watson int	vnet_sysctl_handle_int(SYSCTL_HANDLER_ARGS);
120eddfbb76SRobert Watson int	vnet_sysctl_handle_opaque(SYSCTL_HANDLER_ARGS);
121eddfbb76SRobert Watson int	vnet_sysctl_handle_string(SYSCTL_HANDLER_ARGS);
122eddfbb76SRobert Watson int	vnet_sysctl_handle_uint(SYSCTL_HANDLER_ARGS);
123eddfbb76SRobert Watson 
124eddfbb76SRobert Watson #define	SYSCTL_VNET_INT(parent, nbr, name, access, ptr, val, descr)	\
125eddfbb76SRobert Watson 	SYSCTL_OID(parent, nbr, name, CTLTYPE_INT|CTLFLAG_MPSAFE|(access), \
126eddfbb76SRobert Watson 	    ptr, val, vnet_sysctl_handle_int, "I", descr)
127eddfbb76SRobert Watson #define	SYSCTL_VNET_PROC(parent, nbr, name, access, ptr, arg, handler,	\
128eddfbb76SRobert Watson 	    fmt, descr)							\
129eddfbb76SRobert Watson 	SYSCTL_OID(parent, nbr, name, access, ptr, arg, handler, fmt,	\
130eddfbb76SRobert Watson 	    descr)
131eddfbb76SRobert Watson #define	SYSCTL_VNET_STRING(parent, nbr, name, access, arg, len, descr)	\
132eddfbb76SRobert Watson 	SYSCTL_OID(parent, nbr, name, CTLTYPE_STRING|(access), arg,	\
133eddfbb76SRobert Watson 	    len, vnet_sysctl_handle_string, "A", descr)
134eddfbb76SRobert Watson #define	SYSCTL_VNET_STRUCT(parent, nbr, name, access, ptr, type, descr)	\
135eddfbb76SRobert Watson 	SYSCTL_OID(parent, nbr, name, CTLTYPE_OPAQUE|(access), ptr,	\
136eddfbb76SRobert Watson 	    sizeof(struct type), vnet_sysctl_handle_opaque, "S," #type,	\
137eddfbb76SRobert Watson 	    descr)
138eddfbb76SRobert Watson #define	SYSCTL_VNET_UINT(parent, nbr, name, access, ptr, val, descr)	\
139eddfbb76SRobert Watson 	SYSCTL_OID(parent, nbr, name, CTLTYPE_UINT|CTLFLAG_MPSAFE|(access), \
140eddfbb76SRobert Watson 	    ptr, val, vnet_sysctl_handle_uint, "IU", descr)
141a08362ceSBjoern A. Zeeb #define	VNET_SYSCTL_ARG(req, arg1) do {					\
142a08362ceSBjoern A. Zeeb 	if (arg1 != NULL)						\
143a08362ceSBjoern A. Zeeb 		arg1 = (void *)(TD_TO_VNET((req)->td)->vnet_data_base +	\
144a08362ceSBjoern A. Zeeb 		    (uintptr_t)(arg1));					\
145a08362ceSBjoern A. Zeeb } while (0)
146eddfbb76SRobert Watson #endif /* SYSCTL_OID */
147eddfbb76SRobert Watson 
148eddfbb76SRobert Watson /*
149eddfbb76SRobert Watson  * Interfaces from the kernel linker.
150eddfbb76SRobert Watson  */
151eddfbb76SRobert Watson void	*vnet_data_alloc(int size);
152eddfbb76SRobert Watson void	 vnet_data_copy(void *start, int size);
153eddfbb76SRobert Watson void	 vnet_data_free(void *start_arg, int size);
154eddfbb76SRobert Watson 
155eddfbb76SRobert Watson /*
156eddfbb76SRobert Watson  * Interfaces for vnet setup/teardown.
157eddfbb76SRobert Watson  */
158eddfbb76SRobert Watson struct vnet;
159eddfbb76SRobert Watson void	 vnet_data_init(struct vnet *vnet);
160eddfbb76SRobert Watson void	 vnet_data_destroy(struct vnet *vnet);
161d0728d71SRobert Watson void	 vnet_sysinit(void);
162d0728d71SRobert Watson void	 vnet_sysuninit(void);
163d0728d71SRobert Watson 
164d0728d71SRobert Watson /*
165d0728d71SRobert Watson  * Interfaces for managing per-vnet constructors and destructors.
166d0728d71SRobert Watson  */
167d0728d71SRobert Watson void	vnet_register_sysinit(void *arg);
168d0728d71SRobert Watson void	vnet_register_sysuninit(void *arg);
169d0728d71SRobert Watson void	vnet_deregister_sysinit(void *arg);
170d0728d71SRobert Watson void	vnet_deregister_sysuninit(void *arg);
171eddfbb76SRobert Watson 
172eddfbb76SRobert Watson #else /* !VIMAGE */
173eddfbb76SRobert Watson 
174eddfbb76SRobert Watson /*
175eddfbb76SRobert Watson  * Versions of the VNET macros that compile to normal global variables and
176eddfbb76SRobert Watson  * standard sysctl definitions.
177eddfbb76SRobert Watson  */
178eddfbb76SRobert Watson #define	VNET_NAME(n)		n
179eddfbb76SRobert Watson #define	VNET_DECLARE(t, n)	extern t n
180eddfbb76SRobert Watson #define	VNET_DEFINE(t, n)	t n
181eddfbb76SRobert Watson #define	_VNET_PTR(b, n)		&VNET_NAME(n)
182d0728d71SRobert Watson #define	VNET_SYSINIT(ident, subsystem, order, func, arg)		\
183d0728d71SRobert Watson 	SYSINIT(ident, subsystem, order, func, arg)
184d0728d71SRobert Watson #define	VNET_SYSUNINIT(ident, subsystem, order, func, arg)		\
185d0728d71SRobert Watson 	SYSUNINIT(ident, subsystem, order, func, arg)
186eddfbb76SRobert Watson 
187eddfbb76SRobert Watson #ifdef SYSCTL_OID
188eddfbb76SRobert Watson #define	SYSCTL_VNET_INT(parent, nbr, name, access, ptr, val, descr)	\
189eddfbb76SRobert Watson 	SYSCTL_INT(parent, nbr, name, access, ptr, val, descr)
190eddfbb76SRobert Watson #define	SYSCTL_VNET_PROC(parent, nbr, name, access, ptr, arg, handler,	\
191eddfbb76SRobert Watson 	    fmt, descr)							\
192eddfbb76SRobert Watson 	SYSCTL_PROC(parent, nbr, name, access, ptr, arg, handler, fmt,	\
193eddfbb76SRobert Watson 	    descr)
194eddfbb76SRobert Watson #define	SYSCTL_VNET_STRING(parent, nbr, name, access, arg, len, descr)	\
195eddfbb76SRobert Watson 	SYSCTL_STRING(parent, nbr, name, access, arg, len, descr)
196eddfbb76SRobert Watson #define	SYSCTL_VNET_STRUCT(parent, nbr, name, access, ptr, type, descr)	\
197eddfbb76SRobert Watson 	SYSCTL_STRUCT(parent, nbr, name, access, ptr, type, descr)
198eddfbb76SRobert Watson #define	SYSCTL_VNET_UINT(parent, nbr, name, access, ptr, val, descr)	\
199eddfbb76SRobert Watson 	SYSCTL_UINT(parent, nbr, name, access, ptr, val, descr)
200a08362ceSBjoern A. Zeeb #define	VNET_SYSCTL_ARG(req, arg1)
201eddfbb76SRobert Watson #endif /* SYSCTL_OID */
202eddfbb76SRobert Watson 
203eddfbb76SRobert Watson /*
204eddfbb76SRobert Watson  * Virtualized global variable accessor macros.
205eddfbb76SRobert Watson  */
206eddfbb76SRobert Watson #define	VNET_VNET_PTR(vnet, n)		(&(n))
2071e77c105SRobert Watson #define	VNET_VNET(vnet, n)		(n)
208eddfbb76SRobert Watson 
209eddfbb76SRobert Watson #define	VNET_PTR(n)		(&(n))
2101e77c105SRobert Watson #define	VNET(n)			(n)
211eddfbb76SRobert Watson 
212eddfbb76SRobert Watson #endif /* VIMAGE */
213eddfbb76SRobert Watson 
214eddfbb76SRobert Watson #endif /* _KERNEL */
2158b615593SMarko Zec 
2168b615593SMarko Zec #endif /* !_NET_VNET_H_ */
217