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 88253082Sae#define VNET_PCPUSTAT_DECLARE(type, name) \ 89253082Sae VNET_DECLARE(counter_u64_t, name[sizeof(type) / sizeof(uint64_t)]) 90253082Sae 91253082Sae#define VNET_PCPUSTAT_DEFINE(type, name) \ 92253082Sae VNET_DEFINE(counter_u64_t, name[sizeof(type) / sizeof(uint64_t)]) 93253082Sae 94253082Sae#define VNET_PCPUSTAT_ALLOC(name, wait) \ 95253082Sae COUNTER_ARRAY_ALLOC(VNET(name), \ 96253082Sae sizeof(VNET(name)) / sizeof(counter_u64_t), (wait)) 97253082Sae 98253082Sae#define VNET_PCPUSTAT_FREE(name) \ 99253082Sae COUNTER_ARRAY_FREE(VNET(name), sizeof(VNET(name)) / sizeof(counter_u64_t)) 100253082Sae 101253082Sae#define VNET_PCPUSTAT_ADD(type, name, f, v) \ 102253082Sae counter_u64_add(VNET(name)[offsetof(type, f) / sizeof(uint64_t)], (v)) 103253082Sae 104253082Sae#define VNET_PCPUSTAT_SYSINIT(name) \ 105253082Saestatic void \ 106253082Saevnet_##name##_init(const void *unused) \ 107253082Sae{ \ 108253082Sae VNET_PCPUSTAT_ALLOC(name, M_WAITOK); \ 109253082Sae} \ 110253082SaeVNET_SYSINIT(vnet_ ## name ## _init, SI_SUB_PROTO_IFATTACHDOMAIN, \ 111253082Sae SI_ORDER_ANY, vnet_ ## name ## _init, NULL) 112253082Sae 113253082Sae#define VNET_PCPUSTAT_SYSUNINIT(name) \ 114253082Saestatic void \ 115253082Saevnet_##name##_uninit(const void *unused) \ 116253082Sae{ \ 117253082Sae VNET_PCPUSTAT_FREE(name); \ 118253082Sae} \ 119253082SaeVNET_SYSUNINIT(vnet_ ## name ## _uninit, SI_SUB_PROTO_IFATTACHDOMAIN, \ 120253082Sae SI_ORDER_ANY, vnet_ ## name ## _uninit, NULL) 121253082Sae 122253082Sae#define SYSCTL_VNET_PCPUSTAT(parent, nbr, name, type, array, desc) \ 123253082Saestatic int \ 124253082Saearray##_sysctl(SYSCTL_HANDLER_ARGS) \ 125253082Sae{ \ 126253082Sae type s; \ 127253100Sae CTASSERT((sizeof(type) / sizeof(uint64_t)) == \ 128253100Sae (sizeof(VNET(array)) / sizeof(counter_u64_t))); \ 129253082Sae COUNTER_ARRAY_COPY(VNET(array), &s, sizeof(type) / sizeof(uint64_t));\ 130253082Sae if (req->newptr) \ 131253082Sae COUNTER_ARRAY_ZERO(VNET(array), \ 132253082Sae sizeof(type) / sizeof(uint64_t)); \ 133253082Sae return (SYSCTL_OUT(req, &s, sizeof(type))); \ 134253082Sae} \ 135253082SaeSYSCTL_VNET_PROC(parent, nbr, name, CTLTYPE_OPAQUE | CTLFLAG_RW, NULL, \ 136253082Sae 0, array ## _sysctl, "I", desc) 137253082Sae 138195699Srwatson#ifdef VIMAGE 139196019Srwatson#include <sys/lock.h> 140196019Srwatson#include <sys/proc.h> /* for struct thread */ 141196019Srwatson#include <sys/rwlock.h> 142196019Srwatson#include <sys/sx.h> 143183550Szec 144196019Srwatson/* 145206639Sjulian * Location of the kernel's 'set_vnet' linker set. 146206639Sjulian */ 147206639Sjulianextern uintptr_t *__start_set_vnet; 148215701Sdim__GLOBL(__start_set_vnet); 149206639Sjulianextern uintptr_t *__stop_set_vnet; 150215701Sdim__GLOBL(__stop_set_vnet); 151206639Sjulian 152206639Sjulian#define VNET_START (uintptr_t)&__start_set_vnet 153206639Sjulian#define VNET_STOP (uintptr_t)&__stop_set_vnet 154206639Sjulian 155206639Sjulian/* 156196019Srwatson * Functions to allocate and destroy virtual network stacks. 157196019Srwatson */ 158196019Srwatsonstruct vnet *vnet_alloc(void); 159196019Srwatsonvoid vnet_destroy(struct vnet *vnet); 160196019Srwatson 161196019Srwatson/* 162196019Srwatson * The current virtual network stack -- we may wish to move this to struct 163196019Srwatson * pcpu in the future. 164196019Srwatson */ 165196019Srwatson#define curvnet curthread->td_vnet 166196019Srwatson 167196019Srwatson/* 168196019Srwatson * Various macros -- get and set the current network stack, but also 169196019Srwatson * assertions. 170196019Srwatson */ 171218559Sbz#if defined(INVARIANTS) || defined(VNET_DEBUG) 172218559Sbz#define VNET_ASSERT(exp, msg) do { \ 173218559Sbz if (!(exp)) \ 174218559Sbz panic msg; \ 175218559Sbz} while (0) 176218559Sbz#else 177218559Sbz#define VNET_ASSERT(exp, msg) do { \ 178218559Sbz} while (0) 179218559Sbz#endif 180218559Sbz 181196019Srwatson#ifdef VNET_DEBUG 182203483Szecvoid vnet_log_recursion(struct vnet *, const char *, int); 183203483Szec 184196019Srwatson#define CURVNET_SET_QUIET(arg) \ 185218559Sbz VNET_ASSERT((arg) != NULL && (arg)->vnet_magic_n == VNET_MAGIC_N, \ 186218559Sbz ("CURVNET_SET at %s:%d %s() curvnet=%p vnet=%p", \ 187218559Sbz __FILE__, __LINE__, __func__, curvnet, (arg))); \ 188196019Srwatson struct vnet *saved_vnet = curvnet; \ 189196019Srwatson const char *saved_vnet_lpush = curthread->td_vnet_lpush; \ 190196019Srwatson curvnet = arg; \ 191218555Sbz curthread->td_vnet_lpush = __func__; 192196019Srwatson 193196019Srwatson#define CURVNET_SET_VERBOSE(arg) \ 194196019Srwatson CURVNET_SET_QUIET(arg) \ 195196019Srwatson if (saved_vnet) \ 196203483Szec vnet_log_recursion(saved_vnet, saved_vnet_lpush, __LINE__); 197196019Srwatson 198196019Srwatson#define CURVNET_SET(arg) CURVNET_SET_VERBOSE(arg) 199196019Srwatson 200196019Srwatson#define CURVNET_RESTORE() \ 201218559Sbz VNET_ASSERT(curvnet != NULL && (saved_vnet == NULL || \ 202218559Sbz saved_vnet->vnet_magic_n == VNET_MAGIC_N), \ 203218559Sbz ("CURVNET_RESTORE at %s:%d %s() curvnet=%p saved_vnet=%p", \ 204218559Sbz __FILE__, __LINE__, __func__, curvnet, saved_vnet)); \ 205196019Srwatson curvnet = saved_vnet; \ 206196019Srwatson curthread->td_vnet_lpush = saved_vnet_lpush; 207196019Srwatson#else /* !VNET_DEBUG */ 208196019Srwatson 209218567Sbz#define CURVNET_SET_QUIET(arg) \ 210218567Sbz VNET_ASSERT((arg) != NULL && (arg)->vnet_magic_n == VNET_MAGIC_N, \ 211218567Sbz ("CURVNET_SET at %s:%d %s() curvnet=%p vnet=%p", \ 212218567Sbz __FILE__, __LINE__, __func__, curvnet, (arg))); \ 213196019Srwatson struct vnet *saved_vnet = curvnet; \ 214196019Srwatson curvnet = arg; 215196019Srwatson 216218567Sbz#define CURVNET_SET_VERBOSE(arg) \ 217218567Sbz CURVNET_SET_QUIET(arg) 218218567Sbz 219218567Sbz#define CURVNET_SET(arg) CURVNET_SET_VERBOSE(arg) 220196019Srwatson 221196019Srwatson#define CURVNET_RESTORE() \ 222218567Sbz VNET_ASSERT(curvnet != NULL && (saved_vnet == NULL || \ 223218567Sbz saved_vnet->vnet_magic_n == VNET_MAGIC_N), \ 224218567Sbz ("CURVNET_RESTORE at %s:%d %s() curvnet=%p saved_vnet=%p", \ 225218567Sbz __FILE__, __LINE__, __func__, curvnet, saved_vnet)); \ 226196019Srwatson curvnet = saved_vnet; 227196019Srwatson#endif /* VNET_DEBUG */ 228196019Srwatson 229196019Srwatsonextern struct vnet *vnet0; 230196019Srwatson#define IS_DEFAULT_VNET(arg) ((arg) == vnet0) 231196019Srwatson 232196019Srwatson#define CRED_TO_VNET(cr) (cr)->cr_prison->pr_vnet 233196019Srwatson#define TD_TO_VNET(td) CRED_TO_VNET((td)->td_ucred) 234196019Srwatson#define P_TO_VNET(p) CRED_TO_VNET((p)->p_ucred) 235196019Srwatson 236196019Srwatson/* 237196019Srwatson * Global linked list of all virtual network stacks, along with read locks to 238196019Srwatson * access it. If a caller may sleep while accessing the list, it must use 239196019Srwatson * the sleepable lock macros. 240196019Srwatson */ 241196019SrwatsonLIST_HEAD(vnet_list_head, vnet); 242196019Srwatsonextern struct vnet_list_head vnet_head; 243196019Srwatsonextern struct rwlock vnet_rwlock; 244196019Srwatsonextern struct sx vnet_sxlock; 245196019Srwatson 246196019Srwatson#define VNET_LIST_RLOCK() sx_slock(&vnet_sxlock) 247196019Srwatson#define VNET_LIST_RLOCK_NOSLEEP() rw_rlock(&vnet_rwlock) 248196019Srwatson#define VNET_LIST_RUNLOCK() sx_sunlock(&vnet_sxlock) 249196019Srwatson#define VNET_LIST_RUNLOCK_NOSLEEP() rw_runlock(&vnet_rwlock) 250196019Srwatson 251196019Srwatson/* 252196019Srwatson * Iteration macros to walk the global list of virtual network stacks. 253196019Srwatson */ 254196019Srwatson#define VNET_ITERATOR_DECL(arg) struct vnet *arg 255196019Srwatson#define VNET_FOREACH(arg) LIST_FOREACH((arg), &vnet_head, vnet_le) 256196019Srwatson 257196019Srwatson/* 258196019Srwatson * Virtual network stack memory allocator, which allows global variables to 259196019Srwatson * be automatically instantiated for each network stack instance. 260196019Srwatson */ 261195699Srwatson#define VNET_NAME(n) vnet_entry_##n 262195699Srwatson#define VNET_DECLARE(t, n) extern t VNET_NAME(n) 263215701Sdim#define VNET_DEFINE(t, n) t VNET_NAME(n) __section(VNET_SETNAME) __used 264215701Sdim#define _VNET_PTR(b, n) (__typeof(VNET_NAME(n))*) \ 265215701Sdim ((b) + (uintptr_t)&VNET_NAME(n)) 266183550Szec 267195727Srwatson#define _VNET(b, n) (*_VNET_PTR(b, n)) 268183550Szec 269195699Srwatson/* 270195699Srwatson * Virtualized global variable accessor macros. 271195699Srwatson */ 272195699Srwatson#define VNET_VNET_PTR(vnet, n) _VNET_PTR((vnet)->vnet_data_base, n) 273195727Srwatson#define VNET_VNET(vnet, n) (*VNET_VNET_PTR((vnet), n)) 274183550Szec 275195699Srwatson#define VNET_PTR(n) VNET_VNET_PTR(curvnet, n) 276195727Srwatson#define VNET(n) VNET_VNET(curvnet, n) 277183550Szec 278195699Srwatson/* 279195972Srwatson * Virtual network stack allocator interfaces from the kernel linker. 280195972Srwatson */ 281195972Srwatsonvoid *vnet_data_alloc(int size); 282195972Srwatsonvoid vnet_data_copy(void *start, int size); 283195972Srwatsonvoid vnet_data_free(void *start_arg, int size); 284195972Srwatson 285195972Srwatson/* 286195699Srwatson * Sysctl variants for vnet-virtualized global variables. Include 287195699Srwatson * <sys/sysctl.h> to expose these definitions. 288195699Srwatson * 289195699Srwatson * Note: SYSCTL_PROC() handler functions will need to resolve pointer 290195699Srwatson * arguments themselves, if required. 291195699Srwatson */ 292195699Srwatson#ifdef SYSCTL_OID 293195699Srwatson#define SYSCTL_VNET_INT(parent, nbr, name, access, ptr, val, descr) \ 294196176Sbz SYSCTL_OID(parent, nbr, name, \ 295196176Sbz CTLTYPE_INT|CTLFLAG_MPSAFE|CTLFLAG_VNET|(access), \ 296262734Sglebius ptr, val, sysctl_handle_int, "I", descr) 297195699Srwatson#define SYSCTL_VNET_PROC(parent, nbr, name, access, ptr, arg, handler, \ 298195699Srwatson fmt, descr) \ 299217586Smdf CTASSERT(((access) & CTLTYPE) != 0); \ 300196176Sbz SYSCTL_OID(parent, nbr, name, CTLFLAG_VNET|(access), ptr, arg, \ 301196176Sbz handler, fmt, descr) 302208743Szec#define SYSCTL_VNET_OPAQUE(parent, nbr, name, access, ptr, len, fmt, \ 303208743Szec descr) \ 304208743Szec SYSCTL_OID(parent, nbr, name, \ 305208743Szec CTLTYPE_OPAQUE|CTLFLAG_VNET|(access), ptr, len, \ 306262735Sglebius sysctl_handle_opaque, fmt, descr) 307195699Srwatson#define SYSCTL_VNET_STRING(parent, nbr, name, access, arg, len, descr) \ 308196176Sbz SYSCTL_OID(parent, nbr, name, \ 309196176Sbz CTLTYPE_STRING|CTLFLAG_VNET|(access), \ 310262734Sglebius arg, len, sysctl_handle_string, "A", descr) 311195699Srwatson#define SYSCTL_VNET_STRUCT(parent, nbr, name, access, ptr, type, descr) \ 312196176Sbz SYSCTL_OID(parent, nbr, name, \ 313196176Sbz CTLTYPE_OPAQUE|CTLFLAG_VNET|(access), ptr, \ 314262734Sglebius sizeof(struct type), sysctl_handle_opaque, "S," #type, \ 315195699Srwatson descr) 316195699Srwatson#define SYSCTL_VNET_UINT(parent, nbr, name, access, ptr, val, descr) \ 317196176Sbz SYSCTL_OID(parent, nbr, name, \ 318196176Sbz CTLTYPE_UINT|CTLFLAG_MPSAFE|CTLFLAG_VNET|(access), \ 319262734Sglebius ptr, val, sysctl_handle_int, "IU", descr) 320195814Sbz#define VNET_SYSCTL_ARG(req, arg1) do { \ 321195814Sbz if (arg1 != NULL) \ 322195814Sbz arg1 = (void *)(TD_TO_VNET((req)->td)->vnet_data_base + \ 323195814Sbz (uintptr_t)(arg1)); \ 324195814Sbz} while (0) 325195699Srwatson#endif /* SYSCTL_OID */ 326183550Szec 327195699Srwatson/* 328195972Srwatson * Virtual sysinit mechanism, allowing network stack components to declare 329195972Srwatson * startup and shutdown methods to be run when virtual network stack 330195972Srwatson * instances are created and destroyed. 331195699Srwatson */ 332195972Srwatson#include <sys/kernel.h> 333189225Sbz 334195699Srwatson/* 335195972Srwatson * SYSINIT/SYSUNINIT variants that provide per-vnet constructors and 336195972Srwatson * destructors. 337195699Srwatson */ 338195972Srwatsonstruct vnet_sysinit { 339195972Srwatson enum sysinit_sub_id subsystem; 340195972Srwatson enum sysinit_elem_order order; 341195972Srwatson sysinit_cfunc_t func; 342195972Srwatson const void *arg; 343195972Srwatson TAILQ_ENTRY(vnet_sysinit) link; 344195972Srwatson}; 345195972Srwatson 346195972Srwatson#define VNET_SYSINIT(ident, subsystem, order, func, arg) \ 347195972Srwatson static struct vnet_sysinit ident ## _vnet_init = { \ 348195972Srwatson subsystem, \ 349195972Srwatson order, \ 350195972Srwatson (sysinit_cfunc_t)(sysinit_nfunc_t)func, \ 351195972Srwatson (arg) \ 352195972Srwatson }; \ 353195972Srwatson SYSINIT(vnet_init_ ## ident, subsystem, order, \ 354195972Srwatson vnet_register_sysinit, &ident ## _vnet_init); \ 355195972Srwatson SYSUNINIT(vnet_init_ ## ident, subsystem, order, \ 356195972Srwatson vnet_deregister_sysinit, &ident ## _vnet_init) 357195972Srwatson 358195972Srwatson#define VNET_SYSUNINIT(ident, subsystem, order, func, arg) \ 359195972Srwatson static struct vnet_sysinit ident ## _vnet_uninit = { \ 360195972Srwatson subsystem, \ 361195972Srwatson order, \ 362195972Srwatson (sysinit_cfunc_t)(sysinit_nfunc_t)func, \ 363195972Srwatson (arg) \ 364195972Srwatson }; \ 365195972Srwatson SYSINIT(vnet_uninit_ ## ident, subsystem, order, \ 366195972Srwatson vnet_register_sysuninit, &ident ## _vnet_uninit); \ 367195972Srwatson SYSUNINIT(vnet_uninit_ ## ident, subsystem, order, \ 368195972Srwatson vnet_deregister_sysuninit, &ident ## _vnet_uninit) 369195972Srwatson 370195972Srwatson/* 371195972Srwatson * Run per-vnet sysinits or sysuninits during vnet creation/destruction. 372195972Srwatson */ 373195837Srwatsonvoid vnet_sysinit(void); 374195837Srwatsonvoid vnet_sysuninit(void); 375185895Szec 376195837Srwatson/* 377195837Srwatson * Interfaces for managing per-vnet constructors and destructors. 378195837Srwatson */ 379195837Srwatsonvoid vnet_register_sysinit(void *arg); 380195837Srwatsonvoid vnet_register_sysuninit(void *arg); 381195837Srwatsonvoid vnet_deregister_sysinit(void *arg); 382195837Srwatsonvoid vnet_deregister_sysuninit(void *arg); 383195837Srwatson 384205345Sbz/* 385205345Sbz * EVENTHANDLER(9) extensions. 386205345Sbz */ 387205345Sbz#include <sys/eventhandler.h> 388205345Sbz 389205345Sbzvoid vnet_global_eventhandler_iterator_func(void *, ...); 390205345Sbz#define VNET_GLOBAL_EVENTHANDLER_REGISTER_TAG(tag, name, func, arg, priority) \ 391205345Sbzdo { \ 392205345Sbz if (IS_DEFAULT_VNET(curvnet)) { \ 393205345Sbz (tag) = vimage_eventhandler_register(NULL, #name, func, \ 394205345Sbz arg, priority, \ 395205345Sbz vnet_global_eventhandler_iterator_func); \ 396205345Sbz } \ 397205345Sbz} while(0) 398205345Sbz#define VNET_GLOBAL_EVENTHANDLER_REGISTER(name, func, arg, priority) \ 399205345Sbzdo { \ 400205345Sbz if (IS_DEFAULT_VNET(curvnet)) { \ 401205345Sbz vimage_eventhandler_register(NULL, #name, func, \ 402205345Sbz arg, priority, \ 403205345Sbz vnet_global_eventhandler_iterator_func); \ 404205345Sbz } \ 405205345Sbz} while(0) 406205345Sbz 407195699Srwatson#else /* !VIMAGE */ 408195699Srwatson 409183550Szec/* 410196019Srwatson * Various virtual network stack macros compile to no-ops without VIMAGE. 411196019Srwatson */ 412196019Srwatson#define curvnet NULL 413196019Srwatson 414218559Sbz#define VNET_ASSERT(exp, msg) 415196019Srwatson#define CURVNET_SET(arg) 416196019Srwatson#define CURVNET_SET_QUIET(arg) 417196019Srwatson#define CURVNET_RESTORE() 418196019Srwatson 419196019Srwatson#define VNET_LIST_RLOCK() 420196019Srwatson#define VNET_LIST_RLOCK_NOSLEEP() 421196019Srwatson#define VNET_LIST_RUNLOCK() 422196019Srwatson#define VNET_LIST_RUNLOCK_NOSLEEP() 423196019Srwatson#define VNET_ITERATOR_DECL(arg) 424196019Srwatson#define VNET_FOREACH(arg) 425196019Srwatson 426196019Srwatson#define IS_DEFAULT_VNET(arg) 1 427196019Srwatson#define CRED_TO_VNET(cr) NULL 428196019Srwatson#define TD_TO_VNET(td) NULL 429196019Srwatson#define P_TO_VNET(p) NULL 430196019Srwatson 431196019Srwatson/* 432195699Srwatson * Versions of the VNET macros that compile to normal global variables and 433195699Srwatson * standard sysctl definitions. 434183550Szec */ 435215701Sdim#define VNET_NAME(n) n 436215701Sdim#define VNET_DECLARE(t, n) extern t n 437215701Sdim#define VNET_DEFINE(t, n) t n 438215701Sdim#define _VNET_PTR(b, n) &VNET_NAME(n) 439183550Szec 440195972Srwatson/* 441195972Srwatson * Virtualized global variable accessor macros. 442195972Srwatson */ 443195972Srwatson#define VNET_VNET_PTR(vnet, n) (&(n)) 444195972Srwatson#define VNET_VNET(vnet, n) (n) 445195972Srwatson 446195972Srwatson#define VNET_PTR(n) (&(n)) 447195972Srwatson#define VNET(n) (n) 448195972Srwatson 449195972Srwatson/* 450195972Srwatson * When VIMAGE isn't compiled into the kernel, virtaulized SYSCTLs simply 451195972Srwatson * become normal SYSCTLs. 452195972Srwatson */ 453195699Srwatson#ifdef SYSCTL_OID 454195699Srwatson#define SYSCTL_VNET_INT(parent, nbr, name, access, ptr, val, descr) \ 455195699Srwatson SYSCTL_INT(parent, nbr, name, access, ptr, val, descr) 456195699Srwatson#define SYSCTL_VNET_PROC(parent, nbr, name, access, ptr, arg, handler, \ 457195699Srwatson fmt, descr) \ 458195699Srwatson SYSCTL_PROC(parent, nbr, name, access, ptr, arg, handler, fmt, \ 459195699Srwatson descr) 460208743Szec#define SYSCTL_VNET_OPAQUE(parent, nbr, name, access, ptr, len, fmt, \ 461208743Szec descr) \ 462208743Szec SYSCTL_OPAQUE(parent, nbr, name, access, ptr, len, fmt, descr) 463195699Srwatson#define SYSCTL_VNET_STRING(parent, nbr, name, access, arg, len, descr) \ 464195699Srwatson SYSCTL_STRING(parent, nbr, name, access, arg, len, descr) 465195699Srwatson#define SYSCTL_VNET_STRUCT(parent, nbr, name, access, ptr, type, descr) \ 466195699Srwatson SYSCTL_STRUCT(parent, nbr, name, access, ptr, type, descr) 467195699Srwatson#define SYSCTL_VNET_UINT(parent, nbr, name, access, ptr, val, descr) \ 468195699Srwatson SYSCTL_UINT(parent, nbr, name, access, ptr, val, descr) 469195814Sbz#define VNET_SYSCTL_ARG(req, arg1) 470195699Srwatson#endif /* SYSCTL_OID */ 471183550Szec 472195699Srwatson/* 473195972Srwatson * When VIMAGE isn't compiled into the kernel, VNET_SYSINIT/VNET_SYSUNINIT 474195972Srwatson * map into normal sysinits, which have the same ordering properties. 475195699Srwatson */ 476195972Srwatson#define VNET_SYSINIT(ident, subsystem, order, func, arg) \ 477195972Srwatson SYSINIT(ident, subsystem, order, func, arg) 478195972Srwatson#define VNET_SYSUNINIT(ident, subsystem, order, func, arg) \ 479195972Srwatson SYSUNINIT(ident, subsystem, order, func, arg) 480183550Szec 481205345Sbz/* 482205345Sbz * Without VIMAGE revert to the default implementation. 483205345Sbz */ 484205345Sbz#define VNET_GLOBAL_EVENTHANDLER_REGISTER_TAG(tag, name, func, arg, priority) \ 485205345Sbz (tag) = eventhandler_register(NULL, #name, func, arg, priority) 486205345Sbz#define VNET_GLOBAL_EVENTHANDLER_REGISTER(name, func, arg, priority) \ 487205345Sbz eventhandler_register(NULL, #name, func, arg, priority) 488195699Srwatson#endif /* VIMAGE */ 489195699Srwatson#endif /* _KERNEL */ 490195699Srwatson 491183550Szec#endif /* !_NET_VNET_H_ */ 492