mirror of
https://git.FreeBSD.org/src.git
synced 2024-12-20 11:11:24 +00:00
Reorder and recomment vnet.c and vnet.h on the basis that they are no longer
solely about the virtual network stack memory allocator. Approved by: re (vimage blanket)
This commit is contained in:
parent
b2beb67f92
commit
ed3db012fc
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=195972
@ -43,11 +43,20 @@ __FBSDID("$FreeBSD$");
|
||||
#include <net/vnet.h>
|
||||
|
||||
/*-
|
||||
* This is the virtual network stack allocator, which provides storage for
|
||||
* virtualized global variables. These variables are defined/declared using
|
||||
* the VNET_DEFINE()/VNET_DECLARE() macros, which place them in the
|
||||
* 'set_vnet' linker set. The details of the implementation are somewhat
|
||||
* subtle, but allow the majority of most network subsystems to maintain
|
||||
* This file implements core functions for virtual network stacks:
|
||||
*
|
||||
* - Virtual network stack memory allocator, which virtualized global
|
||||
* variables in the network stack
|
||||
*
|
||||
* - Virtualized SYSINIT's/SYSUNINIT's, which allow network stack subsystems
|
||||
* to register startup/shutdown events to be run for each virtual network
|
||||
* stack instance.
|
||||
*
|
||||
* The virtual network stack allocator provides storage for virtualized
|
||||
* global variables. These variables are defined/declared using the
|
||||
* VNET_DEFINE()/VNET_DECLARE() macros, which place them in the 'set_vnet'
|
||||
* linker set. The details of the implementation are somewhat subtle, but
|
||||
* allow the majority of most network subsystems to maintain
|
||||
* virtualization-agnostic.
|
||||
*
|
||||
* The virtual network stack allocator handles variables in the base kernel
|
||||
|
159
sys/net/vnet.h
159
sys/net/vnet.h
@ -27,66 +27,36 @@
|
||||
* $FreeBSD$
|
||||
*/
|
||||
|
||||
/*
|
||||
* This header file defines two sets of interfaces supporting virtualized
|
||||
* network stacks: a virtual network stack memory allocator, which provides
|
||||
* support for virtualized global variables via a special linker set,
|
||||
* set_vnet, and virtualized sysinits/sysuninits, which allow constructors
|
||||
* and destructors to be run for each network stack subsystem as virtual
|
||||
* instances are created and destroyed. If VIMAGE isn't compiled into the
|
||||
* kernel, virtualized global variables compile to normal global variables,
|
||||
* and virtualized sysinits to regular sysinits.
|
||||
/*-
|
||||
* This header file defines several sets of interfaces supporting virtualized
|
||||
* network stacks:
|
||||
*
|
||||
* - A virtual network stack memory allocator, which provides support for
|
||||
* virtualized global variables via a special linker set, set_vnet.
|
||||
*
|
||||
* - Virtualized sysinits/sysuninits, which allow constructors and
|
||||
* destructors to be run for each network stack subsystem as virtual
|
||||
* instances are created and destroyed.
|
||||
*
|
||||
* If VIMAGE isn't compiled into the kernel, virtualized global variables
|
||||
* compile to normal global variables, and virtualized sysinits to regular
|
||||
* sysinits.
|
||||
*/
|
||||
|
||||
#ifndef _NET_VNET_H_
|
||||
#define _NET_VNET_H_
|
||||
|
||||
/*
|
||||
* Virtual network stack memory allocator, which allows global variables to
|
||||
* be automatically instantiated for each network stack instance.
|
||||
*/
|
||||
#if defined(_KERNEL) || defined(_WANT_VNET)
|
||||
|
||||
#define VNET_SETNAME "set_vnet"
|
||||
#define VNET_SYMPREFIX "vnet_entry_"
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef _KERNEL
|
||||
#ifdef VIMAGE
|
||||
#include <sys/kernel.h>
|
||||
|
||||
/*
|
||||
* SYSINIT/SYSUNINIT variants that provide per-vnet constructors and
|
||||
* destructors.
|
||||
*/
|
||||
struct vnet_sysinit {
|
||||
enum sysinit_sub_id subsystem;
|
||||
enum sysinit_elem_order order;
|
||||
sysinit_cfunc_t func;
|
||||
const void *arg;
|
||||
TAILQ_ENTRY(vnet_sysinit) link;
|
||||
};
|
||||
|
||||
#define VNET_SYSINIT(ident, subsystem, order, func, arg) \
|
||||
static struct vnet_sysinit ident ## _vnet_init = { \
|
||||
subsystem, \
|
||||
order, \
|
||||
(sysinit_cfunc_t)(sysinit_nfunc_t)func, \
|
||||
(arg) \
|
||||
}; \
|
||||
SYSINIT(vnet_init_ ## ident, subsystem, order, \
|
||||
vnet_register_sysinit, &ident ## _vnet_init); \
|
||||
SYSUNINIT(vnet_init_ ## ident, subsystem, order, \
|
||||
vnet_deregister_sysinit, &ident ## _vnet_init)
|
||||
|
||||
#define VNET_SYSUNINIT(ident, subsystem, order, func, arg) \
|
||||
static struct vnet_sysinit ident ## _vnet_uninit = { \
|
||||
subsystem, \
|
||||
order, \
|
||||
(sysinit_cfunc_t)(sysinit_nfunc_t)func, \
|
||||
(arg) \
|
||||
}; \
|
||||
SYSINIT(vnet_uninit_ ## ident, subsystem, order, \
|
||||
vnet_register_sysuninit, &ident ## _vnet_uninit); \
|
||||
SYSUNINIT(vnet_uninit_ ## ident, subsystem, order, \
|
||||
vnet_deregister_sysuninit, &ident ## _vnet_uninit)
|
||||
|
||||
#if defined(__arm__)
|
||||
__asm__(".section " VNET_SETNAME ", \"aw\", %progbits");
|
||||
@ -112,6 +82,20 @@ __asm__(".previous");
|
||||
#define VNET_PTR(n) VNET_VNET_PTR(curvnet, n)
|
||||
#define VNET(n) VNET_VNET(curvnet, n)
|
||||
|
||||
/*
|
||||
* Virtual network stack allocator interfaces from the kernel linker.
|
||||
*/
|
||||
void *vnet_data_alloc(int size);
|
||||
void vnet_data_copy(void *start, int size);
|
||||
void vnet_data_free(void *start_arg, int size);
|
||||
|
||||
/*
|
||||
* Virtual network stack allocator interfaces for vnet setup/teardown.
|
||||
*/
|
||||
struct vnet;
|
||||
void vnet_data_init(struct vnet *vnet);
|
||||
void vnet_data_destroy(struct vnet *vnet);
|
||||
|
||||
/*
|
||||
* Sysctl variants for vnet-virtualized global variables. Include
|
||||
* <sys/sysctl.h> to expose these definitions.
|
||||
@ -150,18 +134,51 @@ int vnet_sysctl_handle_uint(SYSCTL_HANDLER_ARGS);
|
||||
#endif /* SYSCTL_OID */
|
||||
|
||||
/*
|
||||
* Interfaces from the kernel linker.
|
||||
* Virtual sysinit mechanism, allowing network stack components to declare
|
||||
* startup and shutdown methods to be run when virtual network stack
|
||||
* instances are created and destroyed.
|
||||
*/
|
||||
void *vnet_data_alloc(int size);
|
||||
void vnet_data_copy(void *start, int size);
|
||||
void vnet_data_free(void *start_arg, int size);
|
||||
#include <sys/kernel.h>
|
||||
|
||||
/*
|
||||
* Interfaces for vnet setup/teardown.
|
||||
* SYSINIT/SYSUNINIT variants that provide per-vnet constructors and
|
||||
* destructors.
|
||||
*/
|
||||
struct vnet_sysinit {
|
||||
enum sysinit_sub_id subsystem;
|
||||
enum sysinit_elem_order order;
|
||||
sysinit_cfunc_t func;
|
||||
const void *arg;
|
||||
TAILQ_ENTRY(vnet_sysinit) link;
|
||||
};
|
||||
|
||||
#define VNET_SYSINIT(ident, subsystem, order, func, arg) \
|
||||
static struct vnet_sysinit ident ## _vnet_init = { \
|
||||
subsystem, \
|
||||
order, \
|
||||
(sysinit_cfunc_t)(sysinit_nfunc_t)func, \
|
||||
(arg) \
|
||||
}; \
|
||||
SYSINIT(vnet_init_ ## ident, subsystem, order, \
|
||||
vnet_register_sysinit, &ident ## _vnet_init); \
|
||||
SYSUNINIT(vnet_init_ ## ident, subsystem, order, \
|
||||
vnet_deregister_sysinit, &ident ## _vnet_init)
|
||||
|
||||
#define VNET_SYSUNINIT(ident, subsystem, order, func, arg) \
|
||||
static struct vnet_sysinit ident ## _vnet_uninit = { \
|
||||
subsystem, \
|
||||
order, \
|
||||
(sysinit_cfunc_t)(sysinit_nfunc_t)func, \
|
||||
(arg) \
|
||||
}; \
|
||||
SYSINIT(vnet_uninit_ ## ident, subsystem, order, \
|
||||
vnet_register_sysuninit, &ident ## _vnet_uninit); \
|
||||
SYSUNINIT(vnet_uninit_ ## ident, subsystem, order, \
|
||||
vnet_deregister_sysuninit, &ident ## _vnet_uninit)
|
||||
|
||||
/*
|
||||
* Run per-vnet sysinits or sysuninits during vnet creation/destruction.
|
||||
*/
|
||||
struct vnet;
|
||||
void vnet_data_init(struct vnet *vnet);
|
||||
void vnet_data_destroy(struct vnet *vnet);
|
||||
void vnet_sysinit(void);
|
||||
void vnet_sysuninit(void);
|
||||
|
||||
@ -183,11 +200,20 @@ void vnet_deregister_sysuninit(void *arg);
|
||||
#define VNET_DECLARE(t, n) extern t n
|
||||
#define VNET_DEFINE(t, n) t n
|
||||
#define _VNET_PTR(b, n) &VNET_NAME(n)
|
||||
#define VNET_SYSINIT(ident, subsystem, order, func, arg) \
|
||||
SYSINIT(ident, subsystem, order, func, arg)
|
||||
#define VNET_SYSUNINIT(ident, subsystem, order, func, arg) \
|
||||
SYSUNINIT(ident, subsystem, order, func, arg)
|
||||
|
||||
/*
|
||||
* Virtualized global variable accessor macros.
|
||||
*/
|
||||
#define VNET_VNET_PTR(vnet, n) (&(n))
|
||||
#define VNET_VNET(vnet, n) (n)
|
||||
|
||||
#define VNET_PTR(n) (&(n))
|
||||
#define VNET(n) (n)
|
||||
|
||||
/*
|
||||
* When VIMAGE isn't compiled into the kernel, virtaulized SYSCTLs simply
|
||||
* become normal SYSCTLs.
|
||||
*/
|
||||
#ifdef SYSCTL_OID
|
||||
#define SYSCTL_VNET_INT(parent, nbr, name, access, ptr, val, descr) \
|
||||
SYSCTL_INT(parent, nbr, name, access, ptr, val, descr)
|
||||
@ -205,16 +231,15 @@ void vnet_deregister_sysuninit(void *arg);
|
||||
#endif /* SYSCTL_OID */
|
||||
|
||||
/*
|
||||
* Virtualized global variable accessor macros.
|
||||
* When VIMAGE isn't compiled into the kernel, VNET_SYSINIT/VNET_SYSUNINIT
|
||||
* map into normal sysinits, which have the same ordering properties.
|
||||
*/
|
||||
#define VNET_VNET_PTR(vnet, n) (&(n))
|
||||
#define VNET_VNET(vnet, n) (n)
|
||||
|
||||
#define VNET_PTR(n) (&(n))
|
||||
#define VNET(n) (n)
|
||||
#define VNET_SYSINIT(ident, subsystem, order, func, arg) \
|
||||
SYSINIT(ident, subsystem, order, func, arg)
|
||||
#define VNET_SYSUNINIT(ident, subsystem, order, func, arg) \
|
||||
SYSUNINIT(ident, subsystem, order, func, arg)
|
||||
|
||||
#endif /* VIMAGE */
|
||||
|
||||
#endif /* _KERNEL */
|
||||
|
||||
#endif /* !_NET_VNET_H_ */
|
||||
|
Loading…
Reference in New Issue
Block a user