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 40eddfbb76SRobert Watson #ifdef _KERNEL 41eddfbb76SRobert Watson #ifdef VIMAGE 428b615593SMarko Zec 43eddfbb76SRobert Watson #if defined(__arm__) 44eddfbb76SRobert Watson __asm__(".section set_vnet, \"aw\", %progbits"); 45eddfbb76SRobert Watson #else 46eddfbb76SRobert Watson __asm__(".section set_vnet, \"aw\", @progbits"); 47385195c0SMarko Zec #endif 48eddfbb76SRobert Watson __asm__(".previous"); 49eddfbb76SRobert Watson 50eddfbb76SRobert Watson #define VNET_NAME(n) vnet_entry_##n 51eddfbb76SRobert Watson #define VNET_DECLARE(t, n) extern t VNET_NAME(n) 52eddfbb76SRobert Watson #define VNET_DEFINE(t, n) t VNET_NAME(n) __section("set_vnet") __used 53eddfbb76SRobert Watson #define _VNET_PTR(b, n) (__typeof(VNET_NAME(n))*) \ 54eddfbb76SRobert Watson ((b) + (uintptr_t)&VNET_NAME(n)) 55eddfbb76SRobert Watson 56eddfbb76SRobert Watson #define _VNET_GET(b, n) (*_VNET_PTR(b, n)) 57eddfbb76SRobert Watson #define _VNET_SET(b, n, v) (*_VNET_PTR(b, n) = v) 58385195c0SMarko Zec 598b615593SMarko Zec /* 60eddfbb76SRobert Watson * Virtualized global variable accessor macros. 618b615593SMarko Zec */ 62eddfbb76SRobert Watson #define VNET_VNET_PTR(vnet, n) _VNET_PTR((vnet)->vnet_data_base, n) 63eddfbb76SRobert Watson #define VNET_VNET_GET(vnet, n) (*VNET_VNET_PTR((vnet), n)) 64eddfbb76SRobert Watson #define VNET_VNET_SET(vnet, n, v) ((*VNET_VNET_PTR((vnet), n)) = v) 658b615593SMarko Zec 66eddfbb76SRobert Watson #define VNET_PTR(n) VNET_VNET_PTR(curvnet, n) 67eddfbb76SRobert Watson #define VNET_GET(n) VNET_VNET_GET(curvnet, n) 68eddfbb76SRobert Watson #define VNET_SET(n, v) VNET_VNET_SET(curvnet, n, v) 698b615593SMarko Zec 70eddfbb76SRobert Watson /* 71eddfbb76SRobert Watson * Sysctl variants for vnet-virtualized global variables. Include 72eddfbb76SRobert Watson * <sys/sysctl.h> to expose these definitions. 73eddfbb76SRobert Watson * 74eddfbb76SRobert Watson * Note: SYSCTL_PROC() handler functions will need to resolve pointer 75eddfbb76SRobert Watson * arguments themselves, if required. 76eddfbb76SRobert Watson */ 77eddfbb76SRobert Watson #ifdef SYSCTL_OID 78eddfbb76SRobert Watson int vnet_sysctl_handle_int(SYSCTL_HANDLER_ARGS); 79eddfbb76SRobert Watson int vnet_sysctl_handle_opaque(SYSCTL_HANDLER_ARGS); 80eddfbb76SRobert Watson int vnet_sysctl_handle_string(SYSCTL_HANDLER_ARGS); 81eddfbb76SRobert Watson int vnet_sysctl_handle_uint(SYSCTL_HANDLER_ARGS); 82eddfbb76SRobert Watson 83eddfbb76SRobert Watson #define SYSCTL_VNET_INT(parent, nbr, name, access, ptr, val, descr) \ 84eddfbb76SRobert Watson SYSCTL_OID(parent, nbr, name, CTLTYPE_INT|CTLFLAG_MPSAFE|(access), \ 85eddfbb76SRobert Watson ptr, val, vnet_sysctl_handle_int, "I", descr) 86eddfbb76SRobert Watson #define SYSCTL_VNET_PROC(parent, nbr, name, access, ptr, arg, handler, \ 87eddfbb76SRobert Watson fmt, descr) \ 88eddfbb76SRobert Watson SYSCTL_OID(parent, nbr, name, access, ptr, arg, handler, fmt, \ 89eddfbb76SRobert Watson descr) 90eddfbb76SRobert Watson #define SYSCTL_VNET_STRING(parent, nbr, name, access, arg, len, descr) \ 91eddfbb76SRobert Watson SYSCTL_OID(parent, nbr, name, CTLTYPE_STRING|(access), arg, \ 92eddfbb76SRobert Watson len, vnet_sysctl_handle_string, "A", descr) 93eddfbb76SRobert Watson #define SYSCTL_VNET_STRUCT(parent, nbr, name, access, ptr, type, descr) \ 94eddfbb76SRobert Watson SYSCTL_OID(parent, nbr, name, CTLTYPE_OPAQUE|(access), ptr, \ 95eddfbb76SRobert Watson sizeof(struct type), vnet_sysctl_handle_opaque, "S," #type, \ 96eddfbb76SRobert Watson descr) 97eddfbb76SRobert Watson #define SYSCTL_VNET_UINT(parent, nbr, name, access, ptr, val, descr) \ 98eddfbb76SRobert Watson SYSCTL_OID(parent, nbr, name, CTLTYPE_UINT|CTLFLAG_MPSAFE|(access), \ 99eddfbb76SRobert Watson ptr, val, vnet_sysctl_handle_uint, "IU", descr) 100eddfbb76SRobert Watson #endif /* SYSCTL_OID */ 101eddfbb76SRobert Watson 102eddfbb76SRobert Watson /* 103eddfbb76SRobert Watson * Interfaces from the kernel linker. 104eddfbb76SRobert Watson */ 105eddfbb76SRobert Watson void *vnet_data_alloc(int size); 106eddfbb76SRobert Watson void vnet_data_copy(void *start, int size); 107eddfbb76SRobert Watson void vnet_data_free(void *start_arg, int size); 108eddfbb76SRobert Watson 109eddfbb76SRobert Watson /* 110eddfbb76SRobert Watson * Interfaces for vnet setup/teardown. 111eddfbb76SRobert Watson */ 112eddfbb76SRobert Watson struct vnet; 113eddfbb76SRobert Watson void vnet_data_init(struct vnet *vnet); 114eddfbb76SRobert Watson void vnet_data_destroy(struct vnet *vnet); 115eddfbb76SRobert Watson 116eddfbb76SRobert Watson #else /* !VIMAGE */ 117eddfbb76SRobert Watson 118eddfbb76SRobert Watson /* 119eddfbb76SRobert Watson * Versions of the VNET macros that compile to normal global variables and 120eddfbb76SRobert Watson * standard sysctl definitions. 121eddfbb76SRobert Watson */ 122eddfbb76SRobert Watson #define VNET_NAME(n) n 123eddfbb76SRobert Watson #define VNET_DECLARE(t, n) extern t n 124eddfbb76SRobert Watson #define VNET_DEFINE(t, n) t n 125eddfbb76SRobert Watson #define _VNET_PTR(b, n) &VNET_NAME(n) 126eddfbb76SRobert Watson 127eddfbb76SRobert Watson #ifdef SYSCTL_OID 128eddfbb76SRobert Watson #define SYSCTL_VNET_INT(parent, nbr, name, access, ptr, val, descr) \ 129eddfbb76SRobert Watson SYSCTL_INT(parent, nbr, name, access, ptr, val, descr) 130eddfbb76SRobert Watson #define SYSCTL_VNET_PROC(parent, nbr, name, access, ptr, arg, handler, \ 131eddfbb76SRobert Watson fmt, descr) \ 132eddfbb76SRobert Watson SYSCTL_PROC(parent, nbr, name, access, ptr, arg, handler, fmt, \ 133eddfbb76SRobert Watson descr) 134eddfbb76SRobert Watson #define SYSCTL_VNET_STRING(parent, nbr, name, access, arg, len, descr) \ 135eddfbb76SRobert Watson SYSCTL_STRING(parent, nbr, name, access, arg, len, descr) 136eddfbb76SRobert Watson #define SYSCTL_VNET_STRUCT(parent, nbr, name, access, ptr, type, descr) \ 137eddfbb76SRobert Watson SYSCTL_STRUCT(parent, nbr, name, access, ptr, type, descr) 138eddfbb76SRobert Watson #define SYSCTL_VNET_UINT(parent, nbr, name, access, ptr, val, descr) \ 139eddfbb76SRobert Watson SYSCTL_UINT(parent, nbr, name, access, ptr, val, descr) 140eddfbb76SRobert Watson #endif /* SYSCTL_OID */ 141eddfbb76SRobert Watson 142eddfbb76SRobert Watson /* 143eddfbb76SRobert Watson * Virtualized global variable accessor macros. 144eddfbb76SRobert Watson */ 145eddfbb76SRobert Watson #define VNET_VNET_PTR(vnet, n) (&(n)) 146eddfbb76SRobert Watson #define VNET_VNET_GET(vnet, n) (n) 147eddfbb76SRobert Watson #define VNET_VNET_SET(vnet, n, v) ((n) = (v)) 148eddfbb76SRobert Watson 149eddfbb76SRobert Watson #define VNET_PTR(n) (&(n)) 150eddfbb76SRobert Watson #define VNET_GET(n) (n) 151eddfbb76SRobert Watson #define VNET_SET(n, v) ((n) = (v)) 152eddfbb76SRobert Watson 153eddfbb76SRobert Watson #endif /* VIMAGE */ 154eddfbb76SRobert Watson 155eddfbb76SRobert Watson #endif /* _KERNEL */ 1568b615593SMarko Zec 1578b615593SMarko Zec #endif /* !_NET_VNET_H_ */ 158