xref: /freebsd/sys/net/vnet.h (revision eddfbb763ded6b5f6777335142be9a0edab628bb)
18b615593SMarko Zec /*-
2eddfbb76SRobert Watson  * Copyright (c) 2009 Jeffrey Roberson <jeff@freebsd.org>
3eddfbb76SRobert Watson  * Copyright (c) 2009 Robert N. M. Watson
48b615593SMarko Zec  *
58b615593SMarko Zec  * Redistribution and use in source and binary forms, with or without
68b615593SMarko Zec  * modification, are permitted provided that the following conditions
78b615593SMarko Zec  * are met:
88b615593SMarko Zec  * 1. Redistributions of source code must retain the above copyright
98b615593SMarko Zec  *    notice, this list of conditions and the following disclaimer.
108b615593SMarko Zec  * 2. Redistributions in binary form must reproduce the above copyright
118b615593SMarko Zec  *    notice, this list of conditions and the following disclaimer in the
128b615593SMarko Zec  *    documentation and/or other materials provided with the distribution.
138b615593SMarko Zec  *
148b615593SMarko Zec  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
158b615593SMarko Zec  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
168b615593SMarko Zec  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
178b615593SMarko Zec  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
188b615593SMarko Zec  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
198b615593SMarko Zec  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
208b615593SMarko Zec  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
218b615593SMarko Zec  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
228b615593SMarko Zec  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
238b615593SMarko Zec  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
248b615593SMarko Zec  * SUCH DAMAGE.
258b615593SMarko Zec  *
268b615593SMarko Zec  * $FreeBSD$
278b615593SMarko Zec  */
288b615593SMarko Zec 
29eddfbb76SRobert Watson /*
30eddfbb76SRobert Watson  * This is the virtual network stack memory allocator, which provides support
31eddfbb76SRobert Watson  * for virtualized global variables via a special linker set, set_vnet.  When
32eddfbb76SRobert Watson  * "options VIMAGE" isn't defined, virtualized global variables are compiled
33eddfbb76SRobert Watson  * as normal globals.
34eddfbb76SRobert Watson  */
35eddfbb76SRobert Watson 
368b615593SMarko Zec #ifndef _NET_VNET_H_
378b615593SMarko Zec #define	_NET_VNET_H_
388b615593SMarko Zec 
39eddfbb76SRobert Watson #ifdef _KERNEL
40eddfbb76SRobert Watson #ifdef VIMAGE
418b615593SMarko Zec 
42eddfbb76SRobert Watson #if defined(__arm__)
43eddfbb76SRobert Watson __asm__(".section set_vnet, \"aw\", %progbits");
44eddfbb76SRobert Watson #else
45eddfbb76SRobert Watson __asm__(".section set_vnet, \"aw\", @progbits");
46385195c0SMarko Zec #endif
47eddfbb76SRobert Watson __asm__(".previous");
48eddfbb76SRobert Watson 
49eddfbb76SRobert Watson #define	VNET_NAME(n)		vnet_entry_##n
50eddfbb76SRobert Watson #define	VNET_DECLARE(t, n)	extern t VNET_NAME(n)
51eddfbb76SRobert Watson #define	VNET_DEFINE(t, n)	t VNET_NAME(n) __section("set_vnet") __used
52eddfbb76SRobert Watson #define	_VNET_PTR(b, n)		(__typeof(VNET_NAME(n))*)		\
53eddfbb76SRobert Watson 				    ((b) + (uintptr_t)&VNET_NAME(n))
54eddfbb76SRobert Watson 
55eddfbb76SRobert Watson #define	_VNET_GET(b, n)		(*_VNET_PTR(b, n))
56eddfbb76SRobert Watson #define	_VNET_SET(b, n, v)	(*_VNET_PTR(b, n) = v)
57385195c0SMarko Zec 
588b615593SMarko Zec /*
59eddfbb76SRobert Watson  * Virtualized global variable accessor macros.
608b615593SMarko Zec  */
61eddfbb76SRobert Watson #define	VNET_VNET_PTR(vnet, n)		_VNET_PTR((vnet)->vnet_data_base, n)
62eddfbb76SRobert Watson #define	VNET_VNET_GET(vnet, n)		(*VNET_VNET_PTR((vnet), n))
63eddfbb76SRobert Watson #define	VNET_VNET_SET(vnet, n, v)	((*VNET_VNET_PTR((vnet), n)) = v)
648b615593SMarko Zec 
65eddfbb76SRobert Watson #define	VNET_PTR(n)		VNET_VNET_PTR(curvnet, n)
66eddfbb76SRobert Watson #define	VNET_GET(n)		VNET_VNET_GET(curvnet, n)
67eddfbb76SRobert Watson #define	VNET_SET(n, v)		VNET_VNET_SET(curvnet, n, v)
688b615593SMarko Zec 
69eddfbb76SRobert Watson /*
70eddfbb76SRobert Watson  * Sysctl variants for vnet-virtualized global variables.  Include
71eddfbb76SRobert Watson  * <sys/sysctl.h> to expose these definitions.
72eddfbb76SRobert Watson  *
73eddfbb76SRobert Watson  * Note: SYSCTL_PROC() handler functions will need to resolve pointer
74eddfbb76SRobert Watson  * arguments themselves, if required.
75eddfbb76SRobert Watson  */
76eddfbb76SRobert Watson #ifdef SYSCTL_OID
77eddfbb76SRobert Watson int	vnet_sysctl_handle_int(SYSCTL_HANDLER_ARGS);
78eddfbb76SRobert Watson int	vnet_sysctl_handle_opaque(SYSCTL_HANDLER_ARGS);
79eddfbb76SRobert Watson int	vnet_sysctl_handle_string(SYSCTL_HANDLER_ARGS);
80eddfbb76SRobert Watson int	vnet_sysctl_handle_uint(SYSCTL_HANDLER_ARGS);
81eddfbb76SRobert Watson 
82eddfbb76SRobert Watson #define	SYSCTL_VNET_INT(parent, nbr, name, access, ptr, val, descr)	\
83eddfbb76SRobert Watson 	SYSCTL_OID(parent, nbr, name, CTLTYPE_INT|CTLFLAG_MPSAFE|(access), \
84eddfbb76SRobert Watson 	    ptr, val, vnet_sysctl_handle_int, "I", descr)
85eddfbb76SRobert Watson #define	SYSCTL_VNET_PROC(parent, nbr, name, access, ptr, arg, handler,	\
86eddfbb76SRobert Watson 	    fmt, descr)							\
87eddfbb76SRobert Watson 	SYSCTL_OID(parent, nbr, name, access, ptr, arg, handler, fmt,	\
88eddfbb76SRobert Watson 	    descr)
89eddfbb76SRobert Watson #define	SYSCTL_VNET_STRING(parent, nbr, name, access, arg, len, descr)	\
90eddfbb76SRobert Watson 	SYSCTL_OID(parent, nbr, name, CTLTYPE_STRING|(access), arg,	\
91eddfbb76SRobert Watson 	    len, vnet_sysctl_handle_string, "A", descr)
92eddfbb76SRobert Watson #define	SYSCTL_VNET_STRUCT(parent, nbr, name, access, ptr, type, descr)	\
93eddfbb76SRobert Watson 	SYSCTL_OID(parent, nbr, name, CTLTYPE_OPAQUE|(access), ptr,	\
94eddfbb76SRobert Watson 	    sizeof(struct type), vnet_sysctl_handle_opaque, "S," #type,	\
95eddfbb76SRobert Watson 	    descr)
96eddfbb76SRobert Watson #define	SYSCTL_VNET_UINT(parent, nbr, name, access, ptr, val, descr)	\
97eddfbb76SRobert Watson 	SYSCTL_OID(parent, nbr, name, CTLTYPE_UINT|CTLFLAG_MPSAFE|(access), \
98eddfbb76SRobert Watson 	    ptr, val, vnet_sysctl_handle_uint, "IU", descr)
99eddfbb76SRobert Watson #endif /* SYSCTL_OID */
100eddfbb76SRobert Watson 
101eddfbb76SRobert Watson /*
102eddfbb76SRobert Watson  * Interfaces from the kernel linker.
103eddfbb76SRobert Watson  */
104eddfbb76SRobert Watson void	*vnet_data_alloc(int size);
105eddfbb76SRobert Watson void	 vnet_data_copy(void *start, int size);
106eddfbb76SRobert Watson void	 vnet_data_free(void *start_arg, int size);
107eddfbb76SRobert Watson 
108eddfbb76SRobert Watson /*
109eddfbb76SRobert Watson  * Interfaces for vnet setup/teardown.
110eddfbb76SRobert Watson  */
111eddfbb76SRobert Watson struct vnet;
112eddfbb76SRobert Watson void	 vnet_data_init(struct vnet *vnet);
113eddfbb76SRobert Watson void	 vnet_data_destroy(struct vnet *vnet);
114eddfbb76SRobert Watson 
115eddfbb76SRobert Watson #else /* !VIMAGE */
116eddfbb76SRobert Watson 
117eddfbb76SRobert Watson /*
118eddfbb76SRobert Watson  * Versions of the VNET macros that compile to normal global variables and
119eddfbb76SRobert Watson  * standard sysctl definitions.
120eddfbb76SRobert Watson  */
121eddfbb76SRobert Watson #define	VNET_NAME(n)		n
122eddfbb76SRobert Watson #define	VNET_DECLARE(t, n)	extern t n
123eddfbb76SRobert Watson #define	VNET_DEFINE(t, n)	t n
124eddfbb76SRobert Watson #define	_VNET_PTR(b, n)		&VNET_NAME(n)
125eddfbb76SRobert Watson 
126eddfbb76SRobert Watson #ifdef SYSCTL_OID
127eddfbb76SRobert Watson #define	SYSCTL_VNET_INT(parent, nbr, name, access, ptr, val, descr)	\
128eddfbb76SRobert Watson 	SYSCTL_INT(parent, nbr, name, access, ptr, val, descr)
129eddfbb76SRobert Watson #define	SYSCTL_VNET_PROC(parent, nbr, name, access, ptr, arg, handler,	\
130eddfbb76SRobert Watson 	    fmt, descr)							\
131eddfbb76SRobert Watson 	SYSCTL_PROC(parent, nbr, name, access, ptr, arg, handler, fmt,	\
132eddfbb76SRobert Watson 	    descr)
133eddfbb76SRobert Watson #define	SYSCTL_VNET_STRING(parent, nbr, name, access, arg, len, descr)	\
134eddfbb76SRobert Watson 	SYSCTL_STRING(parent, nbr, name, access, arg, len, descr)
135eddfbb76SRobert Watson #define	SYSCTL_VNET_STRUCT(parent, nbr, name, access, ptr, type, descr)	\
136eddfbb76SRobert Watson 	SYSCTL_STRUCT(parent, nbr, name, access, ptr, type, descr)
137eddfbb76SRobert Watson #define	SYSCTL_VNET_UINT(parent, nbr, name, access, ptr, val, descr)	\
138eddfbb76SRobert Watson 	SYSCTL_UINT(parent, nbr, name, access, ptr, val, descr)
139eddfbb76SRobert Watson #endif /* SYSCTL_OID */
140eddfbb76SRobert Watson 
141eddfbb76SRobert Watson /*
142eddfbb76SRobert Watson  * Virtualized global variable accessor macros.
143eddfbb76SRobert Watson  */
144eddfbb76SRobert Watson #define	VNET_VNET_PTR(vnet, n)		(&(n))
145eddfbb76SRobert Watson #define	VNET_VNET_GET(vnet, n)		(n)
146eddfbb76SRobert Watson #define	VNET_VNET_SET(vnet, n, v)	((n) = (v))
147eddfbb76SRobert Watson 
148eddfbb76SRobert Watson #define	VNET_PTR(n)		(&(n))
149eddfbb76SRobert Watson #define	VNET_GET(n)		(n)
150eddfbb76SRobert Watson #define	VNET_SET(n, v)		((n) = (v))
151eddfbb76SRobert Watson 
152eddfbb76SRobert Watson #endif /* VIMAGE */
153eddfbb76SRobert Watson 
154eddfbb76SRobert Watson #endif /* _KERNEL */
1558b615593SMarko Zec 
1568b615593SMarko Zec #endif /* !_NET_VNET_H_ */
157