aboutsummaryrefslogtreecommitdiff
path: root/share/man/man9/vnet.9
diff options
context:
space:
mode:
Diffstat (limited to 'share/man/man9/vnet.9')
-rw-r--r--share/man/man9/vnet.9515
1 files changed, 0 insertions, 515 deletions
diff --git a/share/man/man9/vnet.9 b/share/man/man9/vnet.9
deleted file mode 100644
index 28e28bfd3242..000000000000
--- a/share/man/man9/vnet.9
+++ /dev/null
@@ -1,515 +0,0 @@
-.\"-
-.\" Copyright (c) 2010 The FreeBSD Foundation
-.\"
-.\" This documentation was written by CK Software GmbH under sponsorship from
-.\" the FreeBSD Foundation.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.Dd December 10, 2020
-.Dt VNET 9
-.Os
-.Sh NAME
-.Nm VNET
-.Nd "network subsystem virtualization infrastructure"
-.Sh SYNOPSIS
-.Cd "options VIMAGE"
-.Cd "options VNET_DEBUG"
-.Pp
-.In net/vnet.h
-.\"------------------------------------------------------------
-.Ss "Constants and Global Variables"
-.\"
-.Dv VNET_SETNAME
-.\" "set_vnet"
-.Dv VNET_SYMPREFIX
-.\" "vnet_entry_"
-.Vt extern struct vnet *vnet0;
-.\"------------------------------------------------------------
-.Ss "Variable Declaration"
-.Fo VNET
-.Fa "name"
-.Fc
-.\"
-.Fo VNET_NAME
-.Fa "name"
-.Fc
-.\"
-.Fo VNET_DECLARE
-.Fa "type" "name"
-.Fc
-.\"
-.Fo VNET_DEFINE
-.Fa "type" "name"
-.Fc
-.\"
-.Fo VNET_DEFINE_STATIC
-.Fa "type" "name"
-.Fc
-.\"
-.Bd -literal
-#define V_name VNET(name)
-.Ed
-.\" ------------------------------------------------------------
-.Ss "Virtual Instance Selection"
-.\"
-.Fo CRED_TO_VNET
-.Fa "struct ucred *"
-.Fc
-.\"
-.Fo TD_TO_VNET
-.Fa "struct thread *"
-.Fc
-.\"
-.Fo P_TO_VNET
-.Fa "struct proc *"
-.Fc
-.\"
-.Fo IS_DEFAULT_VNET
-.Fa "struct vnet *"
-.Fc
-.\"
-.Fo VNET_ASSERT
-.Fa exp msg
-.Fc
-.\"
-.Fo CURVNET_SET
-.Fa "struct vnet *"
-.Fc
-.\"
-.Fo CURVNET_SET_QUIET
-.Fa "struct vnet *"
-.Fc
-.\"
-.Fn CURVNET_RESTORE
-.\"
-.Fo VNET_ITERATOR_DECL
-.Fa "struct vnet *"
-.Fc
-.\"
-.Fo VNET_FOREACH
-.Fa "struct vnet *"
-.Fc
-.\" ------------------------------------------------------------
-.Ss "Locking"
-.\"
-.Fn VNET_LIST_RLOCK
-.Fn VNET_LIST_RUNLOCK
-.Fn VNET_LIST_RLOCK_NOSLEEP
-.Fn VNET_LIST_RUNLOCK_NOSLEEP
-.\" ------------------------------------------------------------
-.Ss "Startup and Teardown Functions"
-.\"
-.Ft "struct vnet *"
-.Fo vnet_alloc
-.Fa void
-.Fc
-.\"
-.Ft void
-.Fo vnet_destroy
-.Fa "struct vnet *"
-.Fc
-.\"
-.Fo VNET_SYSINIT
-.Fa ident
-.Fa "enum sysinit_sub_id subsystem"
-.Fa "enum sysinit_elem_order order"
-.Fa "sysinit_cfunc_t func"
-.Fa "const void *arg"
-.Fc
-.\"
-.Fo VNET_SYSUNINIT
-.Fa ident
-.Fa "enum sysinit_sub_id subsystem"
-.Fa "enum sysinit_elem_order order"
-.Fa "sysinit_cfunc_t func"
-.Fa "const void *arg"
-.Fc
-.\" ------------------------------------------------------------
-.Ss "Eventhandlers"
-.\"
-.Fo VNET_GLOBAL_EVENTHANDLER_REGISTER
-.Fa "const char *name"
-.Fa "void *func"
-.Fa "void *arg"
-.Fa "int priority"
-.Fc
-.\"
-.Fo VNET_GLOBAL_EVENTHANDLER_REGISTER_TAG
-.Fa "eventhandler_tag tag"
-.Fa "const char *name"
-.Fa "void *func"
-.Fa "void *arg"
-.Fa "int priority"
-.Fc
-.\" ------------------------------------------------------------
-.Ss "Sysctl Handling"
-.Fo SYSCTL_VNET_INT
-.Fa parent nbr name access ptr val descr
-.Fc
-.Fo SYSCTL_VNET_PROC
-.Fa parent nbr name access ptr arg handler fmt descr
-.Fc
-.Fo SYSCTL_VNET_STRING
-.Fa parent nbr name access arg len descr
-.Fc
-.Fo SYSCTL_VNET_STRUCT
-.Fa parent nbr name access ptr type descr
-.Fc
-.Fo SYSCTL_VNET_UINT
-.Fa parent nbr name access ptr val descr
-.Fc
-.Fo VNET_SYSCTL_ARG
-.Fa req arg1
-.Fc
-.\" ------------------------------------------------------------
-.Sh DESCRIPTION
-.Nm
-is the name of a technique to virtualize the network stack.
-The basic idea is to change global resources most notably variables into
-per network stack resources and have functions, sysctls, eventhandlers,
-etc. access and handle them in the context of the correct instance.
-Each (virtual) network stack is attached to a
-.Em prison ,
-with
-.Vt vnet0
-being the unrestricted default network stack of the base system.
-.Pp
-The global defines for
-.Dv VNET_SETNAME
-and
-.Dv VNET_SYMPREFIX
-are shared with
-.Xr kvm 3
-to access internals for debugging reasons.
-.\" ------------------------------------------------------------
-.Ss "Variable Declaration"
-.\"
-Variables are virtualized by using the
-.Fn VNET_DEFINE
-macro rather than writing them out as
-.Em type name .
-One can still use static initialization, e.g.,
-.Pp
-.Dl Li VNET_DEFINE(int, foo) = 1;
-.Pp
-Variables declared with the static keyword can use the
-.Fn VNET_DEFINE_STATIC
-macro, e.g.,
-.Pp
-.Dl Li VNET_DEFINE_STATIC(SLIST_HEAD(, bar), bars);
-.Pp
-Static initialization is not possible when the virtualized variable
-would need to be referenced, e.g., with
-.Dq TAILQ_HEAD_INITIALIZER() .
-In that case a
-.Fn VNET_SYSINIT
-based initialization function must be used.
-.Pp
-External variables have to be declared using the
-.Fn VNET_DECLARE
-macro.
-In either case the convention is to define another macro,
-that is then used throughout the implementation to access that variable.
-The variable name is usually prefixed by
-.Em V_
-to express that it is virtualized.
-The
-.Fn VNET
-macro will then translate accesses to that variable to the copy of the
-currently selected instance (see the
-.Sx "Virtual instance selection"
-section):
-.Pp
-.Dl Li #define V_name VNET(name)
-.Pp
-.Em NOTE:
-Do not confuse this with the convention used by
-.Xr VFS 9 .
-.Pp
-The
-.Fn VNET_NAME
-macro returns the offset within the memory region of the virtual network
-stack instance.
-It is usually only used with
-.Fn SYSCTL_VNET_*
-macros.
-.\" ------------------------------------------------------------
-.Ss "Virtual Instance Selection"
-.\"
-There are three different places where the current virtual
-network stack pointer is stored and can be taken from:
-.Bl -enum -offset indent
-.It
-a
-.Em prison :
-.Dl "(struct prison *)->pr_vnet"
-.Pp
-For convenience the following macros are provided:
-.Bd -literal -compact -offset indent
-.Fn CRED_TO_VNET "struct ucred *"
-.Fn TD_TO_VNET "struct thread *"
-.Fn P_TO_VNET "struct proc *"
-.Ed
-.It
-a
-.Em socket :
-.Dl "(struct socket *)->so_vnet"
-.It
-an
-.Em interface :
-.Dl "(struct ifnet *)->if_vnet"
-.El
-.Pp
-.\"
-In addition the currently active instance is cached in
-.Dq "curthread->td_vnet"
-which is usually only accessed through the
-.Dv curvnet
-macro.
-.Pp
-.\"
-To set the correct context of the current virtual network instance, use the
-.Fn CURVNET_SET
-or
-.Fn CURVNET_SET_QUIET
-macros.
-The
-.Fn CURVNET_SET_QUIET
-version will not record vnet recursions in case the kernel was compiled
-with
-.Cd "options VNET_DEBUG"
-and should thus only be used in well known cases, where recursion is
-unavoidable.
-Both macros will save the previous state on the stack and it must be restored
-with the
-.Fn CURVNET_RESTORE
-macro.
-.Pp
-.Em NOTE:
-As the previous state is saved on the stack, you cannot have multiple
-.Fn CURVNET_SET
-calls in the same block.
-.Pp
-.Em NOTE:
-As the previous state is saved on the stack, a
-.Fn CURVNET_RESTORE
-call has to be in the same block as the
-.Fn CURVNET_SET
-call or in a subblock with the same idea of the saved instances as the
-outer block.
-.Pp
-.Em NOTE:
-As each macro is a set of operations and, as previously explained, cannot
-be put into its own block when defined, one cannot conditionally set
-the current vnet context.
-The following will
-.Em not
-work:
-.Bd -literal -offset indent
-if (condition)
- CURVNET_SET(vnet);
-.Ed
-.Pp
-nor would this work:
-.Bd -literal -offset indent
-if (condition) {
- CURVNET_SET(vnet);
-}
-CURVNET_RESTORE();
-.Ed
-.Pp
-.\"
-Sometimes one needs to loop over all virtual instances, for example to update
-virtual from global state, to run a function from a
-.Xr callout 9
-for each instance, etc.
-For those cases the
-.Fn VNET_ITERATOR_DECL
-and
-.Fn VNET_FOREACH
-macros are provided.
-The former macro defines the variable that iterates over the loop,
-and the latter loops over all of the virtual network stack instances.
-See
-.Sx "Locking"
-for how to savely traverse the list of all virtual instances.
-.Pp
-.\"
-The
-.Fn IS_DEFAULT_VNET
-macro provides a safe way to check whether the currently active instance is the
-unrestricted default network stack of the base system
-.Pq Vt vnet0 .
-.Pp
-.\"
-The
-.Fn VNET_ASSERT
-macro provides a way to conditionally add assertions that are only active with
-.Cd "options VIMAGE"
-compiled in and either
-.Cd "options VNET_DEBUG"
-or
-.Cd "options INVARIANTS"
-enabled as well.
-It uses the same semantics as
-.Xr KASSERT 9 .
-.\" ------------------------------------------------------------
-.Ss "Locking"
-.\"
-For public access to the list of virtual network stack instances
-e.g., by the
-.Fn VNET_FOREACH
-macro, read locks are provided.
-Macros are used to abstract from the actual type of the locks.
-If a caller may sleep while traversing the list, it must use the
-.Fn VNET_LIST_RLOCK
-and
-.Fn VNET_LIST_RUNLOCK
-macros.
-Otherwise, the caller can use
-.Fn VNET_LIST_RLOCK_NOSLEEP
-and
-.Fn VNET_LIST_RUNLOCK_NOSLEEP .
-.\" ------------------------------------------------------------
-.Ss "Startup and Teardown Functions"
-.\"
-To start or tear down a virtual network stack instance the internal
-functions
-.Fn vnet_alloc
-and
-.Fn vnet_destroy
-are provided and called from the jail framework.
-They run the publicly provided methods to handle network stack
-startup and teardown.
-.Pp
-For public control, the system startup interface has been enhanced
-to not only handle a system boot but to also handle a virtual
-network stack startup and teardown.
-To the base system the
-.Fn VNET_SYSINIT
-and
-.Fn VNET_SYSUNINIT
-macros look exactly as if there were no virtual network stack.
-In fact, if
-.Cd "options VIMAGE"
-is not compiled in they are compiled to the standard
-.Fn SYSINIT
-macros.
-In addition to that they are run for each virtual network stack
-when starting or, in reverse order, when shutting down.
-.\" ------------------------------------------------------------
-.Ss "Eventhandlers"
-.\"
-Eventhandlers can be handled in two ways:
-.Pp
-.Bl -enum -offset indent -compact
-.It
-save the
-.Em tags
-returned in each virtual instance and properly free the eventhandlers
-on teardown using those, or
-.It
-use one eventhandler that will iterate over all virtual network
-stack instances.
-.El
-.Pp
-For the first case one can just use the normal
-.Xr EVENTHANDLER 9
-functions, while for the second case the
-.Fn VNET_GLOBAL_EVENTHANDLER_REGISTER
-and
-.Fn VNET_GLOBAL_EVENTHANDLER_REGISTER_TAG
-macros are provided.
-These differ in that
-.Fn VNET_GLOBAL_EVENTHANDLER_REGISTER_TAG
-takes an extra first argument that will carry the
-.Fa "tag"
-upon return.
-Eventhandlers registered with either of these will not run
-.Fa func
-directly but
-.Fa func
-will be called from an internal iterator function for each vnet.
-Both macros can only be used for eventhandlers that do not take
-additional arguments, as the variadic arguments from an
-.Xr EVENTHANDLER_INVOKE 9
-call will be ignored.
-.\" ------------------------------------------------------------
-.Ss "Sysctl Handling"
-.\"
-A
-.Xr sysctl 9
-can be virtualized by using one of the
-.Fn SYSCTL_VNET_*
-macros.
-.Pp
-They take the same arguments as the standard
-.Xr sysctl 9
-functions, with the only difference, that the
-.Fa ptr
-argument has to be passed as
-.Ql &VNET_NAME(foo)
-instead of
-.Ql &foo
-so that the variable can be selected from the correct memory
-region of the virtual network stack instance of the caller.
-.Pp
-For the very rare case a sysctl handler function would want to
-handle
-.Fa arg1
-itself the
-.Fn VNET_SYSCTL_ARG req arg1
-is provided that will translate the
-.Fa arg1
-argument to the correct memory address in the virtual network stack
-context of the caller.
-.\" ------------------------------------------------------------
-.Sh SEE ALSO
-.Xr jail 2 ,
-.Xr kvm 3 ,
-.Xr EVENTHANDLER 9 ,
-.\" .Xr pcpu 9 ,
-.Xr KASSERT 9 ,
-.Xr sysctl 9
-.\" .Xr SYSINIT 9
-.Pp
-Marko Zec, Implementing a Clonable Network Stack in the FreeBSD Kernel,
-USENIX ATC'03, June 2003, Boston
-.Sh HISTORY
-The virtual network stack implementation first appeared in
-.Fx 8.0 .
-.Sh AUTHORS
-.An -nosplit
-The
-.Nm
-framework was designed and implemented at the University of Zagreb by
-.An Marko Zec
-under sponsorship of the FreeBSD Foundation and NLnet Foundation,
-and later extended and refined by
-.An Bjoern A. Zeeb
-(also under FreeBSD Foundation sponsorship), and
-.An Robert Watson .
-.Pp
-This manual page was written by
-.An Bjoern A. Zeeb, CK Software GmbH,
-under sponsorship from the FreeBSD Foundation.