1183550Szec/*- 2196019Srwatson * Copyright (c) 2006-2009 University of Zagreb 3196019Srwatson * Copyright (c) 2006-2009 FreeBSD Foundation 4196019Srwatson * All rights reserved. 5196019Srwatson * 6196019Srwatson * This software was developed by the University of Zagreb and the 7196019Srwatson * FreeBSD Foundation under sponsorship by the Stichting NLnet and the 8196019Srwatson * FreeBSD Foundation. 9196019Srwatson * 10195699Srwatson * Copyright (c) 2009 Jeffrey Roberson <jeff@freebsd.org> 11195699Srwatson * Copyright (c) 2009 Robert N. M. Watson 12195705Srwatson * All rights reserved. 13183550Szec * 14183550Szec * Redistribution and use in source and binary forms, with or without 15183550Szec * modification, are permitted provided that the following conditions 16183550Szec * are met: 17183550Szec * 1. Redistributions of source code must retain the above copyright 18183550Szec * notice, this list of conditions and the following disclaimer. 19183550Szec * 2. Redistributions in binary form must reproduce the above copyright 20183550Szec * notice, this list of conditions and the following disclaimer in the 21183550Szec * documentation and/or other materials provided with the distribution. 22195705Srwatson * 23183550Szec * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 24183550Szec * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 25183550Szec * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 26183550Szec * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 27183550Szec * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 28183550Szec * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 29183550Szec * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 30183550Szec * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 31183550Szec * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 32183550Szec * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 33183550Szec * SUCH DAMAGE. 34183550Szec * 35183550Szec * $FreeBSD$ 36183550Szec */ 37183550Szec 38195972Srwatson/*- 39195972Srwatson * This header file defines several sets of interfaces supporting virtualized 40195972Srwatson * network stacks: 41195972Srwatson * 42196019Srwatson * - Definition of 'struct vnet' and functions and macros to allocate/free/ 43196019Srwatson * manipulate it. 44196019Srwatson * 45195972Srwatson * - A virtual network stack memory allocator, which provides support for 46195972Srwatson * virtualized global variables via a special linker set, set_vnet. 47195972Srwatson * 48195972Srwatson * - Virtualized sysinits/sysuninits, which allow constructors and 49195972Srwatson * destructors to be run for each network stack subsystem as virtual 50195972Srwatson * instances are created and destroyed. 51195972Srwatson * 52195972Srwatson * If VIMAGE isn't compiled into the kernel, virtualized global variables 53195972Srwatson * compile to normal global variables, and virtualized sysinits to regular 54195972Srwatson * sysinits. 55195699Srwatson */ 56195699Srwatson 57183550Szec#ifndef _NET_VNET_H_ 58192669Szec#define _NET_VNET_H_ 59183550Szec 60195972Srwatson/* 61196019Srwatson * struct vnet describes a virtualized network stack, and is primarily a 62196019Srwatson * pointer to storage for virtualized global variables. Expose to userspace 63196019Srwatson * as required for libkvm. 64195972Srwatson */ 65195778Srwatson#if defined(_KERNEL) || defined(_WANT_VNET) 66196019Srwatson#include <sys/queue.h> 67196019Srwatson 68196019Srwatsonstruct vnet { 69196019Srwatson LIST_ENTRY(vnet) vnet_le; /* all vnets list */ 70196019Srwatson u_int vnet_magic_n; 71196019Srwatson u_int vnet_ifcnt; 72196019Srwatson u_int vnet_sockcnt; 73196019Srwatson void *vnet_data_mem; 74196019Srwatson uintptr_t vnet_data_base; 75196019Srwatson}; 76196019Srwatson#define VNET_MAGIC_N 0x3e0d8f29 77196019Srwatson 78196019Srwatson/* 79196019Srwatson * These two virtual network stack allocator definitions are also required 80196019Srwatson * for libkvm so that it can evaluate virtualized global variables. 81196019Srwatson */ 82195778Srwatson#define VNET_SETNAME "set_vnet" 83195778Srwatson#define VNET_SYMPREFIX "vnet_entry_" 84195778Srwatson#endif 85195778Srwatson 86195699Srwatson#ifdef _KERNEL 87196019Srwatson 88195699Srwatson#ifdef VIMAGE 89196019Srwatson#include <sys/lock.h> 90196019Srwatson#include <sys/proc.h> /* for struct thread */ 91196019Srwatson#include <sys/rwlock.h> 92196019Srwatson#include <sys/sx.h> 93183550Szec 94196019Srwatson/* 95206639Sjulian * Location of the kernel's 'set_vnet' linker set. 96206639Sjulian */ 97206639Sjulianextern uintptr_t *__start_set_vnet; 98215701Sdim__GLOBL(__start_set_vnet); 99206639Sjulianextern uintptr_t *__stop_set_vnet; 100215701Sdim__GLOBL(__stop_set_vnet); 101206639Sjulian 102206639Sjulian#define VNET_START (uintptr_t)&__start_set_vnet 103206639Sjulian#define VNET_STOP (uintptr_t)&__stop_set_vnet 104206639Sjulian 105206639Sjulian/* 106196019Srwatson * Functions to allocate and destroy virtual network stacks. 107196019Srwatson */ 108196019Srwatsonstruct vnet *vnet_alloc(void); 109196019Srwatsonvoid vnet_destroy(struct vnet *vnet); 110196019Srwatson 111196019Srwatson/* 112196019Srwatson * The current virtual network stack -- we may wish to move this to struct 113196019Srwatson * pcpu in the future. 114196019Srwatson */ 115196019Srwatson#define curvnet curthread->td_vnet 116196019Srwatson 117196019Srwatson/* 118196019Srwatson * Various macros -- get and set the current network stack, but also 119196019Srwatson * assertions. 120196019Srwatson */ 121218559Sbz#if defined(INVARIANTS) || defined(VNET_DEBUG) 122218559Sbz#define VNET_ASSERT(exp, msg) do { \ 123218559Sbz if (!(exp)) \ 124218559Sbz panic msg; \ 125218559Sbz} while (0) 126218559Sbz#else 127218559Sbz#define VNET_ASSERT(exp, msg) do { \ 128218559Sbz} while (0) 129218559Sbz#endif 130218559Sbz 131196019Srwatson#ifdef VNET_DEBUG 132203483Szecvoid vnet_log_recursion(struct vnet *, const char *, int); 133203483Szec 134196019Srwatson#define CURVNET_SET_QUIET(arg) \ 135218559Sbz VNET_ASSERT((arg) != NULL && (arg)->vnet_magic_n == VNET_MAGIC_N, \ 136218559Sbz ("CURVNET_SET at %s:%d %s() curvnet=%p vnet=%p", \ 137218559Sbz __FILE__, __LINE__, __func__, curvnet, (arg))); \ 138196019Srwatson struct vnet *saved_vnet = curvnet; \ 139196019Srwatson const char *saved_vnet_lpush = curthread->td_vnet_lpush; \ 140196019Srwatson curvnet = arg; \ 141218555Sbz curthread->td_vnet_lpush = __func__; 142196019Srwatson 143196019Srwatson#define CURVNET_SET_VERBOSE(arg) \ 144196019Srwatson CURVNET_SET_QUIET(arg) \ 145196019Srwatson if (saved_vnet) \ 146203483Szec vnet_log_recursion(saved_vnet, saved_vnet_lpush, __LINE__); 147196019Srwatson 148196019Srwatson#define CURVNET_SET(arg) CURVNET_SET_VERBOSE(arg) 149196019Srwatson 150196019Srwatson#define CURVNET_RESTORE() \ 151218559Sbz VNET_ASSERT(curvnet != NULL && (saved_vnet == NULL || \ 152218559Sbz saved_vnet->vnet_magic_n == VNET_MAGIC_N), \ 153218559Sbz ("CURVNET_RESTORE at %s:%d %s() curvnet=%p saved_vnet=%p", \ 154218559Sbz __FILE__, __LINE__, __func__, curvnet, saved_vnet)); \ 155196019Srwatson curvnet = saved_vnet; \ 156196019Srwatson curthread->td_vnet_lpush = saved_vnet_lpush; 157196019Srwatson#else /* !VNET_DEBUG */ 158196019Srwatson 159218567Sbz#define CURVNET_SET_QUIET(arg) \ 160218567Sbz VNET_ASSERT((arg) != NULL && (arg)->vnet_magic_n == VNET_MAGIC_N, \ 161218567Sbz ("CURVNET_SET at %s:%d %s() curvnet=%p vnet=%p", \ 162218567Sbz __FILE__, __LINE__, __func__, curvnet, (arg))); \ 163196019Srwatson struct vnet *saved_vnet = curvnet; \ 164196019Srwatson curvnet = arg; 165196019Srwatson 166218567Sbz#define CURVNET_SET_VERBOSE(arg) \ 167218567Sbz CURVNET_SET_QUIET(arg) 168218567Sbz 169218567Sbz#define CURVNET_SET(arg) CURVNET_SET_VERBOSE(arg) 170196019Srwatson 171196019Srwatson#define CURVNET_RESTORE() \ 172218567Sbz VNET_ASSERT(curvnet != NULL && (saved_vnet == NULL || \ 173218567Sbz saved_vnet->vnet_magic_n == VNET_MAGIC_N), \ 174218567Sbz ("CURVNET_RESTORE at %s:%d %s() curvnet=%p saved_vnet=%p", \ 175218567Sbz __FILE__, __LINE__, __func__, curvnet, saved_vnet)); \ 176196019Srwatson curvnet = saved_vnet; 177196019Srwatson#endif /* VNET_DEBUG */ 178196019Srwatson 179196019Srwatsonextern struct vnet *vnet0; 180196019Srwatson#define IS_DEFAULT_VNET(arg) ((arg) == vnet0) 181196019Srwatson 182196019Srwatson#define CRED_TO_VNET(cr) (cr)->cr_prison->pr_vnet 183196019Srwatson#define TD_TO_VNET(td) CRED_TO_VNET((td)->td_ucred) 184196019Srwatson#define P_TO_VNET(p) CRED_TO_VNET((p)->p_ucred) 185196019Srwatson 186196019Srwatson/* 187196019Srwatson * Global linked list of all virtual network stacks, along with read locks to 188196019Srwatson * access it. If a caller may sleep while accessing the list, it must use 189196019Srwatson * the sleepable lock macros. 190196019Srwatson */ 191196019SrwatsonLIST_HEAD(vnet_list_head, vnet); 192196019Srwatsonextern struct vnet_list_head vnet_head; 193196019Srwatsonextern struct rwlock vnet_rwlock; 194196019Srwatsonextern struct sx vnet_sxlock; 195196019Srwatson 196196019Srwatson#define VNET_LIST_RLOCK() sx_slock(&vnet_sxlock) 197196019Srwatson#define VNET_LIST_RLOCK_NOSLEEP() rw_rlock(&vnet_rwlock) 198196019Srwatson#define VNET_LIST_RUNLOCK() sx_sunlock(&vnet_sxlock) 199196019Srwatson#define VNET_LIST_RUNLOCK_NOSLEEP() rw_runlock(&vnet_rwlock) 200196019Srwatson 201196019Srwatson/* 202196019Srwatson * Iteration macros to walk the global list of virtual network stacks. 203196019Srwatson */ 204196019Srwatson#define VNET_ITERATOR_DECL(arg) struct vnet *arg 205196019Srwatson#define VNET_FOREACH(arg) LIST_FOREACH((arg), &vnet_head, vnet_le) 206196019Srwatson 207196019Srwatson/* 208196019Srwatson * Virtual network stack memory allocator, which allows global variables to 209196019Srwatson * be automatically instantiated for each network stack instance. 210196019Srwatson */ 211195699Srwatson#define VNET_NAME(n) vnet_entry_##n 212195699Srwatson#define VNET_DECLARE(t, n) extern t VNET_NAME(n) 213215701Sdim#define VNET_DEFINE(t, n) t VNET_NAME(n) __section(VNET_SETNAME) __used 214215701Sdim#define _VNET_PTR(b, n) (__typeof(VNET_NAME(n))*) \ 215215701Sdim ((b) + (uintptr_t)&VNET_NAME(n)) 216183550Szec 217195727Srwatson#define _VNET(b, n) (*_VNET_PTR(b, n)) 218183550Szec 219195699Srwatson/* 220195699Srwatson * Virtualized global variable accessor macros. 221195699Srwatson */ 222195699Srwatson#define VNET_VNET_PTR(vnet, n) _VNET_PTR((vnet)->vnet_data_base, n) 223195727Srwatson#define VNET_VNET(vnet, n) (*VNET_VNET_PTR((vnet), n)) 224183550Szec 225195699Srwatson#define VNET_PTR(n) VNET_VNET_PTR(curvnet, n) 226195727Srwatson#define VNET(n) VNET_VNET(curvnet, n) 227183550Szec 228195699Srwatson/* 229195972Srwatson * Virtual network stack allocator interfaces from the kernel linker. 230195972Srwatson */ 231195972Srwatsonvoid *vnet_data_alloc(int size); 232195972Srwatsonvoid vnet_data_copy(void *start, int size); 233195972Srwatsonvoid vnet_data_free(void *start_arg, int size); 234195972Srwatson 235195972Srwatson/* 236195699Srwatson * Sysctl variants for vnet-virtualized global variables. Include 237195699Srwatson * <sys/sysctl.h> to expose these definitions. 238195699Srwatson * 239195699Srwatson * Note: SYSCTL_PROC() handler functions will need to resolve pointer 240195699Srwatson * arguments themselves, if required. 241195699Srwatson */ 242195699Srwatson#ifdef SYSCTL_OID 243195699Srwatsonint vnet_sysctl_handle_int(SYSCTL_HANDLER_ARGS); 244195699Srwatsonint vnet_sysctl_handle_opaque(SYSCTL_HANDLER_ARGS); 245195699Srwatsonint vnet_sysctl_handle_string(SYSCTL_HANDLER_ARGS); 246195699Srwatsonint vnet_sysctl_handle_uint(SYSCTL_HANDLER_ARGS); 247192669Szec 248195699Srwatson#define SYSCTL_VNET_INT(parent, nbr, name, access, ptr, val, descr) \ 249196176Sbz SYSCTL_OID(parent, nbr, name, \ 250196176Sbz CTLTYPE_INT|CTLFLAG_MPSAFE|CTLFLAG_VNET|(access), \ 251195699Srwatson ptr, val, vnet_sysctl_handle_int, "I", descr) 252195699Srwatson#define SYSCTL_VNET_PROC(parent, nbr, name, access, ptr, arg, handler, \ 253195699Srwatson fmt, descr) \ 254217586Smdf CTASSERT(((access) & CTLTYPE) != 0); \ 255196176Sbz SYSCTL_OID(parent, nbr, name, CTLFLAG_VNET|(access), ptr, arg, \ 256196176Sbz handler, fmt, descr) 257208743Szec#define SYSCTL_VNET_OPAQUE(parent, nbr, name, access, ptr, len, fmt, \ 258208743Szec descr) \ 259208743Szec SYSCTL_OID(parent, nbr, name, \ 260208743Szec CTLTYPE_OPAQUE|CTLFLAG_VNET|(access), ptr, len, \ 261208743Szec vnet_sysctl_handle_opaque, fmt, descr) 262195699Srwatson#define SYSCTL_VNET_STRING(parent, nbr, name, access, arg, len, descr) \ 263196176Sbz SYSCTL_OID(parent, nbr, name, \ 264196176Sbz CTLTYPE_STRING|CTLFLAG_VNET|(access), \ 265196176Sbz arg, len, vnet_sysctl_handle_string, "A", descr) 266195699Srwatson#define SYSCTL_VNET_STRUCT(parent, nbr, name, access, ptr, type, descr) \ 267196176Sbz SYSCTL_OID(parent, nbr, name, \ 268196176Sbz CTLTYPE_OPAQUE|CTLFLAG_VNET|(access), ptr, \ 269195699Srwatson sizeof(struct type), vnet_sysctl_handle_opaque, "S," #type, \ 270195699Srwatson descr) 271195699Srwatson#define SYSCTL_VNET_UINT(parent, nbr, name, access, ptr, val, descr) \ 272196176Sbz SYSCTL_OID(parent, nbr, name, \ 273196176Sbz CTLTYPE_UINT|CTLFLAG_MPSAFE|CTLFLAG_VNET|(access), \ 274195699Srwatson ptr, val, vnet_sysctl_handle_uint, "IU", descr) 275195814Sbz#define VNET_SYSCTL_ARG(req, arg1) do { \ 276195814Sbz if (arg1 != NULL) \ 277195814Sbz arg1 = (void *)(TD_TO_VNET((req)->td)->vnet_data_base + \ 278195814Sbz (uintptr_t)(arg1)); \ 279195814Sbz} while (0) 280195699Srwatson#endif /* SYSCTL_OID */ 281183550Szec 282195699Srwatson/* 283195972Srwatson * Virtual sysinit mechanism, allowing network stack components to declare 284195972Srwatson * startup and shutdown methods to be run when virtual network stack 285195972Srwatson * instances are created and destroyed. 286195699Srwatson */ 287195972Srwatson#include <sys/kernel.h> 288189225Sbz 289195699Srwatson/* 290195972Srwatson * SYSINIT/SYSUNINIT variants that provide per-vnet constructors and 291195972Srwatson * destructors. 292195699Srwatson */ 293195972Srwatsonstruct vnet_sysinit { 294195972Srwatson enum sysinit_sub_id subsystem; 295195972Srwatson enum sysinit_elem_order order; 296195972Srwatson sysinit_cfunc_t func; 297195972Srwatson const void *arg; 298195972Srwatson TAILQ_ENTRY(vnet_sysinit) link; 299195972Srwatson}; 300195972Srwatson 301195972Srwatson#define VNET_SYSINIT(ident, subsystem, order, func, arg) \ 302195972Srwatson static struct vnet_sysinit ident ## _vnet_init = { \ 303195972Srwatson subsystem, \ 304195972Srwatson order, \ 305195972Srwatson (sysinit_cfunc_t)(sysinit_nfunc_t)func, \ 306195972Srwatson (arg) \ 307195972Srwatson }; \ 308195972Srwatson SYSINIT(vnet_init_ ## ident, subsystem, order, \ 309195972Srwatson vnet_register_sysinit, &ident ## _vnet_init); \ 310195972Srwatson SYSUNINIT(vnet_init_ ## ident, subsystem, order, \ 311195972Srwatson vnet_deregister_sysinit, &ident ## _vnet_init) 312195972Srwatson 313195972Srwatson#define VNET_SYSUNINIT(ident, subsystem, order, func, arg) \ 314195972Srwatson static struct vnet_sysinit ident ## _vnet_uninit = { \ 315195972Srwatson subsystem, \ 316195972Srwatson order, \ 317195972Srwatson (sysinit_cfunc_t)(sysinit_nfunc_t)func, \ 318195972Srwatson (arg) \ 319195972Srwatson }; \ 320195972Srwatson SYSINIT(vnet_uninit_ ## ident, subsystem, order, \ 321195972Srwatson vnet_register_sysuninit, &ident ## _vnet_uninit); \ 322195972Srwatson SYSUNINIT(vnet_uninit_ ## ident, subsystem, order, \ 323195972Srwatson vnet_deregister_sysuninit, &ident ## _vnet_uninit) 324195972Srwatson 325195972Srwatson/* 326195972Srwatson * Run per-vnet sysinits or sysuninits during vnet creation/destruction. 327195972Srwatson */ 328195837Srwatsonvoid vnet_sysinit(void); 329195837Srwatsonvoid vnet_sysuninit(void); 330185895Szec 331195837Srwatson/* 332195837Srwatson * Interfaces for managing per-vnet constructors and destructors. 333195837Srwatson */ 334195837Srwatsonvoid vnet_register_sysinit(void *arg); 335195837Srwatsonvoid vnet_register_sysuninit(void *arg); 336195837Srwatsonvoid vnet_deregister_sysinit(void *arg); 337195837Srwatsonvoid vnet_deregister_sysuninit(void *arg); 338195837Srwatson 339205345Sbz/* 340205345Sbz * EVENTHANDLER(9) extensions. 341205345Sbz */ 342205345Sbz#include <sys/eventhandler.h> 343205345Sbz 344205345Sbzvoid vnet_global_eventhandler_iterator_func(void *, ...); 345205345Sbz#define VNET_GLOBAL_EVENTHANDLER_REGISTER_TAG(tag, name, func, arg, priority) \ 346205345Sbzdo { \ 347205345Sbz if (IS_DEFAULT_VNET(curvnet)) { \ 348205345Sbz (tag) = vimage_eventhandler_register(NULL, #name, func, \ 349205345Sbz arg, priority, \ 350205345Sbz vnet_global_eventhandler_iterator_func); \ 351205345Sbz } \ 352205345Sbz} while(0) 353205345Sbz#define VNET_GLOBAL_EVENTHANDLER_REGISTER(name, func, arg, priority) \ 354205345Sbzdo { \ 355205345Sbz if (IS_DEFAULT_VNET(curvnet)) { \ 356205345Sbz vimage_eventhandler_register(NULL, #name, func, \ 357205345Sbz arg, priority, \ 358205345Sbz vnet_global_eventhandler_iterator_func); \ 359205345Sbz } \ 360205345Sbz} while(0) 361205345Sbz 362195699Srwatson#else /* !VIMAGE */ 363195699Srwatson 364183550Szec/* 365196019Srwatson * Various virtual network stack macros compile to no-ops without VIMAGE. 366196019Srwatson */ 367196019Srwatson#define curvnet NULL 368196019Srwatson 369218559Sbz#define VNET_ASSERT(exp, msg) 370196019Srwatson#define CURVNET_SET(arg) 371196019Srwatson#define CURVNET_SET_QUIET(arg) 372196019Srwatson#define CURVNET_RESTORE() 373196019Srwatson 374196019Srwatson#define VNET_LIST_RLOCK() 375196019Srwatson#define VNET_LIST_RLOCK_NOSLEEP() 376196019Srwatson#define VNET_LIST_RUNLOCK() 377196019Srwatson#define VNET_LIST_RUNLOCK_NOSLEEP() 378196019Srwatson#define VNET_ITERATOR_DECL(arg) 379196019Srwatson#define VNET_FOREACH(arg) 380196019Srwatson 381196019Srwatson#define IS_DEFAULT_VNET(arg) 1 382196019Srwatson#define CRED_TO_VNET(cr) NULL 383196019Srwatson#define TD_TO_VNET(td) NULL 384196019Srwatson#define P_TO_VNET(p) NULL 385196019Srwatson 386196019Srwatson/* 387195699Srwatson * Versions of the VNET macros that compile to normal global variables and 388195699Srwatson * standard sysctl definitions. 389183550Szec */ 390215701Sdim#define VNET_NAME(n) n 391215701Sdim#define VNET_DECLARE(t, n) extern t n 392215701Sdim#define VNET_DEFINE(t, n) t n 393215701Sdim#define _VNET_PTR(b, n) &VNET_NAME(n) 394183550Szec 395195972Srwatson/* 396195972Srwatson * Virtualized global variable accessor macros. 397195972Srwatson */ 398195972Srwatson#define VNET_VNET_PTR(vnet, n) (&(n)) 399195972Srwatson#define VNET_VNET(vnet, n) (n) 400195972Srwatson 401195972Srwatson#define VNET_PTR(n) (&(n)) 402195972Srwatson#define VNET(n) (n) 403195972Srwatson 404195972Srwatson/* 405195972Srwatson * When VIMAGE isn't compiled into the kernel, virtaulized SYSCTLs simply 406195972Srwatson * become normal SYSCTLs. 407195972Srwatson */ 408195699Srwatson#ifdef SYSCTL_OID 409195699Srwatson#define SYSCTL_VNET_INT(parent, nbr, name, access, ptr, val, descr) \ 410195699Srwatson SYSCTL_INT(parent, nbr, name, access, ptr, val, descr) 411195699Srwatson#define SYSCTL_VNET_PROC(parent, nbr, name, access, ptr, arg, handler, \ 412195699Srwatson fmt, descr) \ 413195699Srwatson SYSCTL_PROC(parent, nbr, name, access, ptr, arg, handler, fmt, \ 414195699Srwatson descr) 415208743Szec#define SYSCTL_VNET_OPAQUE(parent, nbr, name, access, ptr, len, fmt, \ 416208743Szec descr) \ 417208743Szec SYSCTL_OPAQUE(parent, nbr, name, access, ptr, len, fmt, descr) 418195699Srwatson#define SYSCTL_VNET_STRING(parent, nbr, name, access, arg, len, descr) \ 419195699Srwatson SYSCTL_STRING(parent, nbr, name, access, arg, len, descr) 420195699Srwatson#define SYSCTL_VNET_STRUCT(parent, nbr, name, access, ptr, type, descr) \ 421195699Srwatson SYSCTL_STRUCT(parent, nbr, name, access, ptr, type, descr) 422195699Srwatson#define SYSCTL_VNET_UINT(parent, nbr, name, access, ptr, val, descr) \ 423195699Srwatson SYSCTL_UINT(parent, nbr, name, access, ptr, val, descr) 424195814Sbz#define VNET_SYSCTL_ARG(req, arg1) 425195699Srwatson#endif /* SYSCTL_OID */ 426183550Szec 427195699Srwatson/* 428195972Srwatson * When VIMAGE isn't compiled into the kernel, VNET_SYSINIT/VNET_SYSUNINIT 429195972Srwatson * map into normal sysinits, which have the same ordering properties. 430195699Srwatson */ 431195972Srwatson#define VNET_SYSINIT(ident, subsystem, order, func, arg) \ 432195972Srwatson SYSINIT(ident, subsystem, order, func, arg) 433195972Srwatson#define VNET_SYSUNINIT(ident, subsystem, order, func, arg) \ 434195972Srwatson SYSUNINIT(ident, subsystem, order, func, arg) 435183550Szec 436205345Sbz/* 437205345Sbz * Without VIMAGE revert to the default implementation. 438205345Sbz */ 439205345Sbz#define VNET_GLOBAL_EVENTHANDLER_REGISTER_TAG(tag, name, func, arg, priority) \ 440205345Sbz (tag) = eventhandler_register(NULL, #name, func, arg, priority) 441205345Sbz#define VNET_GLOBAL_EVENTHANDLER_REGISTER(name, func, arg, priority) \ 442205345Sbz eventhandler_register(NULL, #name, func, arg, priority) 443195699Srwatson#endif /* VIMAGE */ 444195699Srwatson#endif /* _KERNEL */ 445195699Srwatson 446183550Szec#endif /* !_NET_VNET_H_ */ 447