vnet.h revision 195778
156067Smarkm/*-
256067Smarkm * Copyright (c) 2009 Jeffrey Roberson <jeff@freebsd.org>
372450Sassar * Copyright (c) 2009 Robert N. M. Watson
456067Smarkm * All rights reserved.
556067Smarkm *
6101834Sru * Redistribution and use in source and binary forms, with or without
7101834Sru * modification, are permitted provided that the following conditions
872450Sassar * are met:
972450Sassar * 1. Redistributions of source code must retain the above copyright
1072450Sassar *    notice, this list of conditions and the following disclaimer.
1156067Smarkm * 2. Redistributions in binary form must reproduce the above copyright
1290931Snectar *    notice, this list of conditions and the following disclaimer in the
1390931Snectar *    documentation and/or other materials provided with the distribution.
1490931Snectar *
1590931Snectar * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
1656067Smarkm * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1772450Sassar * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
1872450Sassar * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
1972450Sassar * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2072450Sassar * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2172450Sassar * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2272450Sassar * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2372450Sassar * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
2472450Sassar * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
2556067Smarkm * SUCH DAMAGE.
2672450Sassar *
2772450Sassar * $FreeBSD: head/sys/net/vnet.h 195778 2009-07-20 07:50:50Z rwatson $
2872450Sassar */
2956067Smarkm
3056067Smarkm/*
3156067Smarkm * This is the virtual network stack memory allocator, which provides support
3272450Sassar * for virtualized global variables via a special linker set, set_vnet.  When
3372450Sassar * "options VIMAGE" isn't defined, virtualized global variables are compiled
3456067Smarkm * as normal globals.
3572450Sassar */
3672450Sassar
3756067Smarkm#ifndef _NET_VNET_H_
3872450Sassar#define	_NET_VNET_H_
3972450Sassar
4056067Smarkm#if defined(_KERNEL) || defined(_WANT_VNET)
4172450Sassar
4272450Sassar#define	VNET_SETNAME		"set_vnet"
4356067Smarkm#define	VNET_SYMPREFIX		"vnet_entry_"
4472450Sassar
4572450Sassar#endif
4656067Smarkm
4772450Sassar#ifdef _KERNEL
4872450Sassar#ifdef VIMAGE
4956067Smarkm
5072450Sassar#if defined(__arm__)
5172450Sassar__asm__(".section " VNET_SETNAME ", \"aw\", %progbits");
5256067Smarkm#else
5372450Sassar__asm__(".section " VNET_SETNAME ", \"aw\", @progbits");
5472450Sassar#endif
5556067Smarkm__asm__(".previous");
5672450Sassar
5772450Sassar#define	VNET_NAME(n)		vnet_entry_##n
5872450Sassar#define	VNET_DECLARE(t, n)	extern t VNET_NAME(n)
5956067Smarkm#define	VNET_DEFINE(t, n)	t VNET_NAME(n) __section(VNET_SETNAME) __used
6072450Sassar#define	_VNET_PTR(b, n)		(__typeof(VNET_NAME(n))*)		\
6172450Sassar				    ((b) + (uintptr_t)&VNET_NAME(n))
6272450Sassar
6356067Smarkm#define	_VNET(b, n)		(*_VNET_PTR(b, n))
6472450Sassar
6572450Sassar/*
6672450Sassar * Virtualized global variable accessor macros.
6756067Smarkm */
6872450Sassar#define	VNET_VNET_PTR(vnet, n)		_VNET_PTR((vnet)->vnet_data_base, n)
6972450Sassar#define	VNET_VNET(vnet, n)		(*VNET_VNET_PTR((vnet), n))
7072450Sassar
7156067Smarkm#define	VNET_PTR(n)		VNET_VNET_PTR(curvnet, n)
7272450Sassar#define	VNET(n)			VNET_VNET(curvnet, n)
7372450Sassar
7456067Smarkm/*
7572450Sassar * Sysctl variants for vnet-virtualized global variables.  Include
7672450Sassar * <sys/sysctl.h> to expose these definitions.
7772450Sassar *
7872450Sassar * Note: SYSCTL_PROC() handler functions will need to resolve pointer
7972450Sassar * arguments themselves, if required.
8072450Sassar */
8172450Sassar#ifdef SYSCTL_OID
8272450Sassarint	vnet_sysctl_handle_int(SYSCTL_HANDLER_ARGS);
8372450Sassarint	vnet_sysctl_handle_opaque(SYSCTL_HANDLER_ARGS);
8472450Sassarint	vnet_sysctl_handle_string(SYSCTL_HANDLER_ARGS);
8556067Smarkmint	vnet_sysctl_handle_uint(SYSCTL_HANDLER_ARGS);
8656067Smarkm
8772450Sassar#define	SYSCTL_VNET_INT(parent, nbr, name, access, ptr, val, descr)	\
8856067Smarkm	SYSCTL_OID(parent, nbr, name, CTLTYPE_INT|CTLFLAG_MPSAFE|(access), \
8956067Smarkm	    ptr, val, vnet_sysctl_handle_int, "I", descr)
9072450Sassar#define	SYSCTL_VNET_PROC(parent, nbr, name, access, ptr, arg, handler,	\
9172450Sassar	    fmt, descr)							\
9272450Sassar	SYSCTL_OID(parent, nbr, name, access, ptr, arg, handler, fmt,	\
9372450Sassar	    descr)
9472450Sassar#define	SYSCTL_VNET_STRING(parent, nbr, name, access, arg, len, descr)	\
9572450Sassar	SYSCTL_OID(parent, nbr, name, CTLTYPE_STRING|(access), arg,	\
9678550Sassar	    len, vnet_sysctl_handle_string, "A", descr)
9778550Sassar#define	SYSCTL_VNET_STRUCT(parent, nbr, name, access, ptr, type, descr)	\
9878550Sassar	SYSCTL_OID(parent, nbr, name, CTLTYPE_OPAQUE|(access), ptr,	\
9978550Sassar	    sizeof(struct type), vnet_sysctl_handle_opaque, "S," #type,	\
10078550Sassar	    descr)
10178550Sassar#define	SYSCTL_VNET_UINT(parent, nbr, name, access, ptr, val, descr)	\
10272450Sassar	SYSCTL_OID(parent, nbr, name, CTLTYPE_UINT|CTLFLAG_MPSAFE|(access), \
10372450Sassar	    ptr, val, vnet_sysctl_handle_uint, "IU", descr)
10472450Sassar#endif /* SYSCTL_OID */
10572450Sassar
10678550Sassar/*
10756067Smarkm * Interfaces from the kernel linker.
10872450Sassar */
10956067Smarkmvoid	*vnet_data_alloc(int size);
11056067Smarkmvoid	 vnet_data_copy(void *start, int size);
11172450Sassarvoid	 vnet_data_free(void *start_arg, int size);
11256067Smarkm
11356067Smarkm/*
11472450Sassar * Interfaces for vnet setup/teardown.
11572450Sassar */
11672450Sassarstruct vnet;
11772450Sassarvoid	 vnet_data_init(struct vnet *vnet);
11856067Smarkmvoid	 vnet_data_destroy(struct vnet *vnet);
11956067Smarkm
12072450Sassar#else /* !VIMAGE */
12156067Smarkm
12256067Smarkm/*
12372450Sassar * Versions of the VNET macros that compile to normal global variables and
12472450Sassar * standard sysctl definitions.
12572450Sassar */
12672450Sassar#define	VNET_NAME(n)		n
12772450Sassar#define	VNET_DECLARE(t, n)	extern t n
12872450Sassar#define	VNET_DEFINE(t, n)	t n
12972450Sassar#define	_VNET_PTR(b, n)		&VNET_NAME(n)
13056067Smarkm
13156067Smarkm#ifdef SYSCTL_OID
13290931Snectar#define	SYSCTL_VNET_INT(parent, nbr, name, access, ptr, val, descr)	\
13390931Snectar	SYSCTL_INT(parent, nbr, name, access, ptr, val, descr)
13490931Snectar#define	SYSCTL_VNET_PROC(parent, nbr, name, access, ptr, arg, handler,	\
13590931Snectar	    fmt, descr)							\
13690931Snectar	SYSCTL_PROC(parent, nbr, name, access, ptr, arg, handler, fmt,	\
13790931Snectar	    descr)
13872450Sassar#define	SYSCTL_VNET_STRING(parent, nbr, name, access, arg, len, descr)	\
13956067Smarkm	SYSCTL_STRING(parent, nbr, name, access, arg, len, descr)
14056067Smarkm#define	SYSCTL_VNET_STRUCT(parent, nbr, name, access, ptr, type, descr)	\
14172450Sassar	SYSCTL_STRUCT(parent, nbr, name, access, ptr, type, descr)
14272450Sassar#define	SYSCTL_VNET_UINT(parent, nbr, name, access, ptr, val, descr)	\
14356067Smarkm	SYSCTL_UINT(parent, nbr, name, access, ptr, val, descr)
14472450Sassar#endif /* SYSCTL_OID */
14590931Snectar
14672450Sassar/*
14772450Sassar * Virtualized global variable accessor macros.
14872450Sassar */
14972450Sassar#define	VNET_VNET_PTR(vnet, n)		(&(n))
15072450Sassar#define	VNET_VNET(vnet, n)		(n)
15172450Sassar
15272450Sassar#define	VNET_PTR(n)		(&(n))
15372450Sassar#define	VNET(n)			(n)
15472450Sassar
15572450Sassar#endif /* VIMAGE */
15690931Snectar
15790931Snectar#endif /* _KERNEL */
15872450Sassar
15972450Sassar#endif /* !_NET_VNET_H_ */
16072450Sassar