vnet.h revision 195778
156067Smarkm/*- 256067Smarkm * Copyright (c) 2009 Jeffrey Roberson <jeff@freebsd.org> 372450Sassar * Copyright (c) 2009 Robert N. M. Watson 456067Smarkm * All rights reserved. 556067Smarkm * 6101834Sru * Redistribution and use in source and binary forms, with or without 7101834Sru * modification, are permitted provided that the following conditions 872450Sassar * are met: 972450Sassar * 1. Redistributions of source code must retain the above copyright 1072450Sassar * notice, this list of conditions and the following disclaimer. 1156067Smarkm * 2. Redistributions in binary form must reproduce the above copyright 1290931Snectar * notice, this list of conditions and the following disclaimer in the 1390931Snectar * documentation and/or other materials provided with the distribution. 1490931Snectar * 1590931Snectar * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 1656067Smarkm * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 1772450Sassar * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 1872450Sassar * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 1972450Sassar * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 2072450Sassar * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 2172450Sassar * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 2272450Sassar * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 2372450Sassar * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 2472450Sassar * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 2556067Smarkm * SUCH DAMAGE. 2672450Sassar * 2772450Sassar * $FreeBSD: head/sys/net/vnet.h 195778 2009-07-20 07:50:50Z rwatson $ 2872450Sassar */ 2956067Smarkm 3056067Smarkm/* 3156067Smarkm * This is the virtual network stack memory allocator, which provides support 3272450Sassar * for virtualized global variables via a special linker set, set_vnet. When 3372450Sassar * "options VIMAGE" isn't defined, virtualized global variables are compiled 3456067Smarkm * as normal globals. 3572450Sassar */ 3672450Sassar 3756067Smarkm#ifndef _NET_VNET_H_ 3872450Sassar#define _NET_VNET_H_ 3972450Sassar 4056067Smarkm#if defined(_KERNEL) || defined(_WANT_VNET) 4172450Sassar 4272450Sassar#define VNET_SETNAME "set_vnet" 4356067Smarkm#define VNET_SYMPREFIX "vnet_entry_" 4472450Sassar 4572450Sassar#endif 4656067Smarkm 4772450Sassar#ifdef _KERNEL 4872450Sassar#ifdef VIMAGE 4956067Smarkm 5072450Sassar#if defined(__arm__) 5172450Sassar__asm__(".section " VNET_SETNAME ", \"aw\", %progbits"); 5256067Smarkm#else 5372450Sassar__asm__(".section " VNET_SETNAME ", \"aw\", @progbits"); 5472450Sassar#endif 5556067Smarkm__asm__(".previous"); 5672450Sassar 5772450Sassar#define VNET_NAME(n) vnet_entry_##n 5872450Sassar#define VNET_DECLARE(t, n) extern t VNET_NAME(n) 5956067Smarkm#define VNET_DEFINE(t, n) t VNET_NAME(n) __section(VNET_SETNAME) __used 6072450Sassar#define _VNET_PTR(b, n) (__typeof(VNET_NAME(n))*) \ 6172450Sassar ((b) + (uintptr_t)&VNET_NAME(n)) 6272450Sassar 6356067Smarkm#define _VNET(b, n) (*_VNET_PTR(b, n)) 6472450Sassar 6572450Sassar/* 6672450Sassar * Virtualized global variable accessor macros. 6756067Smarkm */ 6872450Sassar#define VNET_VNET_PTR(vnet, n) _VNET_PTR((vnet)->vnet_data_base, n) 6972450Sassar#define VNET_VNET(vnet, n) (*VNET_VNET_PTR((vnet), n)) 7072450Sassar 7156067Smarkm#define VNET_PTR(n) VNET_VNET_PTR(curvnet, n) 7272450Sassar#define VNET(n) VNET_VNET(curvnet, n) 7372450Sassar 7456067Smarkm/* 7572450Sassar * Sysctl variants for vnet-virtualized global variables. Include 7672450Sassar * <sys/sysctl.h> to expose these definitions. 7772450Sassar * 7872450Sassar * Note: SYSCTL_PROC() handler functions will need to resolve pointer 7972450Sassar * arguments themselves, if required. 8072450Sassar */ 8172450Sassar#ifdef SYSCTL_OID 8272450Sassarint vnet_sysctl_handle_int(SYSCTL_HANDLER_ARGS); 8372450Sassarint vnet_sysctl_handle_opaque(SYSCTL_HANDLER_ARGS); 8472450Sassarint vnet_sysctl_handle_string(SYSCTL_HANDLER_ARGS); 8556067Smarkmint vnet_sysctl_handle_uint(SYSCTL_HANDLER_ARGS); 8656067Smarkm 8772450Sassar#define SYSCTL_VNET_INT(parent, nbr, name, access, ptr, val, descr) \ 8856067Smarkm SYSCTL_OID(parent, nbr, name, CTLTYPE_INT|CTLFLAG_MPSAFE|(access), \ 8956067Smarkm ptr, val, vnet_sysctl_handle_int, "I", descr) 9072450Sassar#define SYSCTL_VNET_PROC(parent, nbr, name, access, ptr, arg, handler, \ 9172450Sassar fmt, descr) \ 9272450Sassar SYSCTL_OID(parent, nbr, name, access, ptr, arg, handler, fmt, \ 9372450Sassar descr) 9472450Sassar#define SYSCTL_VNET_STRING(parent, nbr, name, access, arg, len, descr) \ 9572450Sassar SYSCTL_OID(parent, nbr, name, CTLTYPE_STRING|(access), arg, \ 9678550Sassar len, vnet_sysctl_handle_string, "A", descr) 9778550Sassar#define SYSCTL_VNET_STRUCT(parent, nbr, name, access, ptr, type, descr) \ 9878550Sassar SYSCTL_OID(parent, nbr, name, CTLTYPE_OPAQUE|(access), ptr, \ 9978550Sassar sizeof(struct type), vnet_sysctl_handle_opaque, "S," #type, \ 10078550Sassar descr) 10178550Sassar#define SYSCTL_VNET_UINT(parent, nbr, name, access, ptr, val, descr) \ 10272450Sassar SYSCTL_OID(parent, nbr, name, CTLTYPE_UINT|CTLFLAG_MPSAFE|(access), \ 10372450Sassar ptr, val, vnet_sysctl_handle_uint, "IU", descr) 10472450Sassar#endif /* SYSCTL_OID */ 10572450Sassar 10678550Sassar/* 10756067Smarkm * Interfaces from the kernel linker. 10872450Sassar */ 10956067Smarkmvoid *vnet_data_alloc(int size); 11056067Smarkmvoid vnet_data_copy(void *start, int size); 11172450Sassarvoid vnet_data_free(void *start_arg, int size); 11256067Smarkm 11356067Smarkm/* 11472450Sassar * Interfaces for vnet setup/teardown. 11572450Sassar */ 11672450Sassarstruct vnet; 11772450Sassarvoid vnet_data_init(struct vnet *vnet); 11856067Smarkmvoid vnet_data_destroy(struct vnet *vnet); 11956067Smarkm 12072450Sassar#else /* !VIMAGE */ 12156067Smarkm 12256067Smarkm/* 12372450Sassar * Versions of the VNET macros that compile to normal global variables and 12472450Sassar * standard sysctl definitions. 12572450Sassar */ 12672450Sassar#define VNET_NAME(n) n 12772450Sassar#define VNET_DECLARE(t, n) extern t n 12872450Sassar#define VNET_DEFINE(t, n) t n 12972450Sassar#define _VNET_PTR(b, n) &VNET_NAME(n) 13056067Smarkm 13156067Smarkm#ifdef SYSCTL_OID 13290931Snectar#define SYSCTL_VNET_INT(parent, nbr, name, access, ptr, val, descr) \ 13390931Snectar SYSCTL_INT(parent, nbr, name, access, ptr, val, descr) 13490931Snectar#define SYSCTL_VNET_PROC(parent, nbr, name, access, ptr, arg, handler, \ 13590931Snectar fmt, descr) \ 13690931Snectar SYSCTL_PROC(parent, nbr, name, access, ptr, arg, handler, fmt, \ 13790931Snectar descr) 13872450Sassar#define SYSCTL_VNET_STRING(parent, nbr, name, access, arg, len, descr) \ 13956067Smarkm SYSCTL_STRING(parent, nbr, name, access, arg, len, descr) 14056067Smarkm#define SYSCTL_VNET_STRUCT(parent, nbr, name, access, ptr, type, descr) \ 14172450Sassar SYSCTL_STRUCT(parent, nbr, name, access, ptr, type, descr) 14272450Sassar#define SYSCTL_VNET_UINT(parent, nbr, name, access, ptr, val, descr) \ 14356067Smarkm SYSCTL_UINT(parent, nbr, name, access, ptr, val, descr) 14472450Sassar#endif /* SYSCTL_OID */ 14590931Snectar 14672450Sassar/* 14772450Sassar * Virtualized global variable accessor macros. 14872450Sassar */ 14972450Sassar#define VNET_VNET_PTR(vnet, n) (&(n)) 15072450Sassar#define VNET_VNET(vnet, n) (n) 15172450Sassar 15272450Sassar#define VNET_PTR(n) (&(n)) 15372450Sassar#define VNET(n) (n) 15472450Sassar 15572450Sassar#endif /* VIMAGE */ 15690931Snectar 15790931Snectar#endif /* _KERNEL */ 15872450Sassar 15972450Sassar#endif /* !_NET_VNET_H_ */ 16072450Sassar