18b615593SMarko Zec /*- 2eddfbb76SRobert Watson * Copyright (c) 2009 Jeffrey Roberson <jeff@freebsd.org> 3eddfbb76SRobert Watson * Copyright (c) 2009 Robert N. M. Watson 4c1e200ffSRobert Watson * All rights reserved. 58b615593SMarko Zec * 68b615593SMarko Zec * Redistribution and use in source and binary forms, with or without 78b615593SMarko Zec * modification, are permitted provided that the following conditions 88b615593SMarko Zec * are met: 98b615593SMarko Zec * 1. Redistributions of source code must retain the above copyright 108b615593SMarko Zec * notice, this list of conditions and the following disclaimer. 118b615593SMarko Zec * 2. Redistributions in binary form must reproduce the above copyright 128b615593SMarko Zec * notice, this list of conditions and the following disclaimer in the 138b615593SMarko Zec * documentation and/or other materials provided with the distribution. 148b615593SMarko Zec * 158b615593SMarko Zec * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 168b615593SMarko Zec * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 178b615593SMarko Zec * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 188b615593SMarko Zec * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 198b615593SMarko Zec * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 208b615593SMarko Zec * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 218b615593SMarko Zec * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 228b615593SMarko Zec * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 238b615593SMarko Zec * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 248b615593SMarko Zec * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 258b615593SMarko Zec * SUCH DAMAGE. 268b615593SMarko Zec * 278b615593SMarko Zec * $FreeBSD$ 288b615593SMarko Zec */ 298b615593SMarko Zec 30eddfbb76SRobert Watson /* 31eddfbb76SRobert Watson * This is the virtual network stack memory allocator, which provides support 32eddfbb76SRobert Watson * for virtualized global variables via a special linker set, set_vnet. When 33eddfbb76SRobert Watson * "options VIMAGE" isn't defined, virtualized global variables are compiled 34eddfbb76SRobert Watson * as normal globals. 35eddfbb76SRobert Watson */ 36eddfbb76SRobert Watson 378b615593SMarko Zec #ifndef _NET_VNET_H_ 388b615593SMarko Zec #define _NET_VNET_H_ 398b615593SMarko Zec 4017ef1febSRobert Watson #if defined(_KERNEL) || defined(_WANT_VNET) 4117ef1febSRobert Watson 4217ef1febSRobert Watson #define VNET_SETNAME "set_vnet" 4317ef1febSRobert Watson #define VNET_SYMPREFIX "vnet_entry_" 4417ef1febSRobert Watson 4517ef1febSRobert Watson #endif 4617ef1febSRobert Watson 47eddfbb76SRobert Watson #ifdef _KERNEL 48eddfbb76SRobert Watson #ifdef VIMAGE 498b615593SMarko Zec 50eddfbb76SRobert Watson #if defined(__arm__) 5117ef1febSRobert Watson __asm__(".section " VNET_SETNAME ", \"aw\", %progbits"); 52eddfbb76SRobert Watson #else 5317ef1febSRobert Watson __asm__(".section " VNET_SETNAME ", \"aw\", @progbits"); 54385195c0SMarko Zec #endif 55eddfbb76SRobert Watson __asm__(".previous"); 56eddfbb76SRobert Watson 57eddfbb76SRobert Watson #define VNET_NAME(n) vnet_entry_##n 58eddfbb76SRobert Watson #define VNET_DECLARE(t, n) extern t VNET_NAME(n) 5917ef1febSRobert Watson #define VNET_DEFINE(t, n) t VNET_NAME(n) __section(VNET_SETNAME) __used 60eddfbb76SRobert Watson #define _VNET_PTR(b, n) (__typeof(VNET_NAME(n))*) \ 61eddfbb76SRobert Watson ((b) + (uintptr_t)&VNET_NAME(n)) 62eddfbb76SRobert Watson 631e77c105SRobert Watson #define _VNET(b, n) (*_VNET_PTR(b, n)) 64385195c0SMarko Zec 658b615593SMarko Zec /* 66eddfbb76SRobert Watson * Virtualized global variable accessor macros. 678b615593SMarko Zec */ 68eddfbb76SRobert Watson #define VNET_VNET_PTR(vnet, n) _VNET_PTR((vnet)->vnet_data_base, n) 691e77c105SRobert Watson #define VNET_VNET(vnet, n) (*VNET_VNET_PTR((vnet), n)) 708b615593SMarko Zec 71eddfbb76SRobert Watson #define VNET_PTR(n) VNET_VNET_PTR(curvnet, n) 721e77c105SRobert Watson #define VNET(n) VNET_VNET(curvnet, n) 738b615593SMarko Zec 74eddfbb76SRobert Watson /* 75eddfbb76SRobert Watson * Sysctl variants for vnet-virtualized global variables. Include 76eddfbb76SRobert Watson * <sys/sysctl.h> to expose these definitions. 77eddfbb76SRobert Watson * 78eddfbb76SRobert Watson * Note: SYSCTL_PROC() handler functions will need to resolve pointer 79eddfbb76SRobert Watson * arguments themselves, if required. 80eddfbb76SRobert Watson */ 81eddfbb76SRobert Watson #ifdef SYSCTL_OID 82eddfbb76SRobert Watson int vnet_sysctl_handle_int(SYSCTL_HANDLER_ARGS); 83eddfbb76SRobert Watson int vnet_sysctl_handle_opaque(SYSCTL_HANDLER_ARGS); 84eddfbb76SRobert Watson int vnet_sysctl_handle_string(SYSCTL_HANDLER_ARGS); 85eddfbb76SRobert Watson int vnet_sysctl_handle_uint(SYSCTL_HANDLER_ARGS); 86eddfbb76SRobert Watson 87eddfbb76SRobert Watson #define SYSCTL_VNET_INT(parent, nbr, name, access, ptr, val, descr) \ 88eddfbb76SRobert Watson SYSCTL_OID(parent, nbr, name, CTLTYPE_INT|CTLFLAG_MPSAFE|(access), \ 89eddfbb76SRobert Watson ptr, val, vnet_sysctl_handle_int, "I", descr) 90eddfbb76SRobert Watson #define SYSCTL_VNET_PROC(parent, nbr, name, access, ptr, arg, handler, \ 91eddfbb76SRobert Watson fmt, descr) \ 92eddfbb76SRobert Watson SYSCTL_OID(parent, nbr, name, access, ptr, arg, handler, fmt, \ 93eddfbb76SRobert Watson descr) 94eddfbb76SRobert Watson #define SYSCTL_VNET_STRING(parent, nbr, name, access, arg, len, descr) \ 95eddfbb76SRobert Watson SYSCTL_OID(parent, nbr, name, CTLTYPE_STRING|(access), arg, \ 96eddfbb76SRobert Watson len, vnet_sysctl_handle_string, "A", descr) 97eddfbb76SRobert Watson #define SYSCTL_VNET_STRUCT(parent, nbr, name, access, ptr, type, descr) \ 98eddfbb76SRobert Watson SYSCTL_OID(parent, nbr, name, CTLTYPE_OPAQUE|(access), ptr, \ 99eddfbb76SRobert Watson sizeof(struct type), vnet_sysctl_handle_opaque, "S," #type, \ 100eddfbb76SRobert Watson descr) 101eddfbb76SRobert Watson #define SYSCTL_VNET_UINT(parent, nbr, name, access, ptr, val, descr) \ 102eddfbb76SRobert Watson SYSCTL_OID(parent, nbr, name, CTLTYPE_UINT|CTLFLAG_MPSAFE|(access), \ 103eddfbb76SRobert Watson ptr, val, vnet_sysctl_handle_uint, "IU", descr) 104eddfbb76SRobert Watson #endif /* SYSCTL_OID */ 105eddfbb76SRobert Watson 106eddfbb76SRobert Watson /* 107eddfbb76SRobert Watson * Interfaces from the kernel linker. 108eddfbb76SRobert Watson */ 109eddfbb76SRobert Watson void *vnet_data_alloc(int size); 110eddfbb76SRobert Watson void vnet_data_copy(void *start, int size); 111eddfbb76SRobert Watson void vnet_data_free(void *start_arg, int size); 112eddfbb76SRobert Watson 113eddfbb76SRobert Watson /* 114eddfbb76SRobert Watson * Interfaces for vnet setup/teardown. 115eddfbb76SRobert Watson */ 116eddfbb76SRobert Watson struct vnet; 117eddfbb76SRobert Watson void vnet_data_init(struct vnet *vnet); 118eddfbb76SRobert Watson void vnet_data_destroy(struct vnet *vnet); 119eddfbb76SRobert Watson 120eddfbb76SRobert Watson #else /* !VIMAGE */ 121eddfbb76SRobert Watson 122eddfbb76SRobert Watson /* 123eddfbb76SRobert Watson * Versions of the VNET macros that compile to normal global variables and 124eddfbb76SRobert Watson * standard sysctl definitions. 125eddfbb76SRobert Watson */ 126eddfbb76SRobert Watson #define VNET_NAME(n) n 127eddfbb76SRobert Watson #define VNET_DECLARE(t, n) extern t n 128eddfbb76SRobert Watson #define VNET_DEFINE(t, n) t n 129eddfbb76SRobert Watson #define _VNET_PTR(b, n) &VNET_NAME(n) 130eddfbb76SRobert Watson 131eddfbb76SRobert Watson #ifdef SYSCTL_OID 132eddfbb76SRobert Watson #define SYSCTL_VNET_INT(parent, nbr, name, access, ptr, val, descr) \ 133eddfbb76SRobert Watson SYSCTL_INT(parent, nbr, name, access, ptr, val, descr) 134eddfbb76SRobert Watson #define SYSCTL_VNET_PROC(parent, nbr, name, access, ptr, arg, handler, \ 135eddfbb76SRobert Watson fmt, descr) \ 136eddfbb76SRobert Watson SYSCTL_PROC(parent, nbr, name, access, ptr, arg, handler, fmt, \ 137eddfbb76SRobert Watson descr) 138eddfbb76SRobert Watson #define SYSCTL_VNET_STRING(parent, nbr, name, access, arg, len, descr) \ 139eddfbb76SRobert Watson SYSCTL_STRING(parent, nbr, name, access, arg, len, descr) 140eddfbb76SRobert Watson #define SYSCTL_VNET_STRUCT(parent, nbr, name, access, ptr, type, descr) \ 141eddfbb76SRobert Watson SYSCTL_STRUCT(parent, nbr, name, access, ptr, type, descr) 142eddfbb76SRobert Watson #define SYSCTL_VNET_UINT(parent, nbr, name, access, ptr, val, descr) \ 143eddfbb76SRobert Watson SYSCTL_UINT(parent, nbr, name, access, ptr, val, descr) 144eddfbb76SRobert Watson #endif /* SYSCTL_OID */ 145eddfbb76SRobert Watson 146eddfbb76SRobert Watson /* 147eddfbb76SRobert Watson * Virtualized global variable accessor macros. 148eddfbb76SRobert Watson */ 149eddfbb76SRobert Watson #define VNET_VNET_PTR(vnet, n) (&(n)) 1501e77c105SRobert Watson #define VNET_VNET(vnet, n) (n) 151eddfbb76SRobert Watson 152eddfbb76SRobert Watson #define VNET_PTR(n) (&(n)) 1531e77c105SRobert Watson #define VNET(n) (n) 154eddfbb76SRobert Watson 155eddfbb76SRobert Watson #endif /* VIMAGE */ 156eddfbb76SRobert Watson 157eddfbb76SRobert Watson #endif /* _KERNEL */ 1588b615593SMarko Zec 1598b615593SMarko Zec #endif /* !_NET_VNET_H_ */ 160