1e4e21ee1SDavid van Moolenbroek #ifndef _MINIX_MIB_MIB_H 2e4e21ee1SDavid van Moolenbroek #define _MINIX_MIB_MIB_H 3e4e21ee1SDavid van Moolenbroek 4e4e21ee1SDavid van Moolenbroek #include <minix/drivers.h> 5e4e21ee1SDavid van Moolenbroek #include <minix/sysctl.h> 6e4e21ee1SDavid van Moolenbroek #include <machine/vmparam.h> 7e4e21ee1SDavid van Moolenbroek #include <assert.h> 8e4e21ee1SDavid van Moolenbroek 925d39513SDavid van Moolenbroek #if defined(__i386__) 1025d39513SDavid van Moolenbroek #include "kernel/arch/i386/include/archconst.h" 1125d39513SDavid van Moolenbroek #endif 1225d39513SDavid van Moolenbroek 1325d39513SDavid van Moolenbroek #ifndef CONFIG_MAX_CPUS 1425d39513SDavid van Moolenbroek #define CONFIG_MAX_CPUS 1 1525d39513SDavid van Moolenbroek #endif 1625d39513SDavid van Moolenbroek 17e4e21ee1SDavid van Moolenbroek /* 18e4e21ee1SDavid van Moolenbroek * The following setting toggles the existence of the minix.test subtree. For 19e4e21ee1SDavid van Moolenbroek * production environments, it should probably be disabled, although it should 20e4e21ee1SDavid van Moolenbroek * do no harm either. For development platforms, it should be enabled, or 21e4e21ee1SDavid van Moolenbroek * test87 will fail. 22e4e21ee1SDavid van Moolenbroek */ 23e4e21ee1SDavid van Moolenbroek #define MINIX_TEST_SUBTREE 1 /* include the minix.test subtree? */ 24e4e21ee1SDavid van Moolenbroek 25*6f3e0bcdSDavid van Moolenbroek /* 26*6f3e0bcdSDavid van Moolenbroek * By default, mount request failures will be silently discarded, because the 27*6f3e0bcdSDavid van Moolenbroek * requests themselves are one-way. For service authors, a bit more output may 28*6f3e0bcdSDavid van Moolenbroek * be helpful. Set the following defininition to "printf s" in order to 29*6f3e0bcdSDavid van Moolenbroek * include more information about mount requests and failures. 30*6f3e0bcdSDavid van Moolenbroek */ 31*6f3e0bcdSDavid van Moolenbroek #define MIB_DEBUG_MOUNT(s) /* printf s */ 32*6f3e0bcdSDavid van Moolenbroek 33e4e21ee1SDavid van Moolenbroek struct mib_oldp; 34e4e21ee1SDavid van Moolenbroek struct mib_newp; 35e4e21ee1SDavid van Moolenbroek 36e4e21ee1SDavid van Moolenbroek /* 37e4e21ee1SDavid van Moolenbroek * This structure contains a number of less heavily used parameters for handler 38e4e21ee1SDavid van Moolenbroek * functions, mainly to provide extensibility while limiting argument clutter. 39e4e21ee1SDavid van Moolenbroek */ 40e4e21ee1SDavid van Moolenbroek struct mib_call { 41e4e21ee1SDavid van Moolenbroek endpoint_t call_endpt; /* endpoint of the user process */ 42e4e21ee1SDavid van Moolenbroek const int *call_name; /* remaining part of the name */ 43e4e21ee1SDavid van Moolenbroek unsigned int call_namelen; /* length of the remaining name part */ 44e4e21ee1SDavid van Moolenbroek unsigned int call_flags; /* internal call processing flags */ 45e4e21ee1SDavid van Moolenbroek size_t call_reslen; /* resulting oldlen value on error */ 46e4e21ee1SDavid van Moolenbroek }; 47e4e21ee1SDavid van Moolenbroek 48e4e21ee1SDavid van Moolenbroek /* Call flags. */ 49e4e21ee1SDavid van Moolenbroek #define MIB_FLAG_AUTH 0x01 /* user verified to be superuser */ 50e4e21ee1SDavid van Moolenbroek #define MIB_FLAG_NOAUTH 0x02 /* user verified to be regular user */ 51e4e21ee1SDavid van Moolenbroek 52e4e21ee1SDavid van Moolenbroek /* 53*6f3e0bcdSDavid van Moolenbroek * We reassign new meaning to three NetBSD node flags, because we do not use 54*6f3e0bcdSDavid van Moolenbroek * the flags in the way NetBSD does: 55e4e21ee1SDavid van Moolenbroek * 56e4e21ee1SDavid van Moolenbroek * - On NetBSD, CTLFLAG_ROOT is used to mark the root of the sysctl tree. The 57e4e21ee1SDavid van Moolenbroek * entire root node is not exposed to userland, and thus, neither is this 58e4e21ee1SDavid van Moolenbroek * flag. We do not need the flag as we do not have parent pointers. 59e4e21ee1SDavid van Moolenbroek * - On NetBSD, CTLFLAG_ALIAS is used to mark one node as an alias of another 60e4e21ee1SDavid van Moolenbroek * node, presumably to avoid having to duplicate entire subtrees. We can 61e4e21ee1SDavid van Moolenbroek * simply have two nodes point to the same subtree instead, and thus, we do 62e4e21ee1SDavid van Moolenbroek * not need to support this functionality at all. 63*6f3e0bcdSDavid van Moolenbroek * - On NetBSD, CTLFLAG_MMAP is defined for future support for memory-mapping 64*6f3e0bcdSDavid van Moolenbroek * node data with CTL_MMAP. It is not yet clear where or why this feature 65*6f3e0bcdSDavid van Moolenbroek * would be used in practice. For as long as NetBSD does not actually use 66*6f3e0bcdSDavid van Moolenbroek * this flag *for node-type nodes*, we can reuse it for our own purposes. 67e4e21ee1SDavid van Moolenbroek * 68e4e21ee1SDavid van Moolenbroek * The meaning of our replacement flags is explained further below. We ensure 69*6f3e0bcdSDavid van Moolenbroek * that none of these flags are ever exposed to userland. As such, our own 70e4e21ee1SDavid van Moolenbroek * definitions can be changed as necessary without breaking anything. 71e4e21ee1SDavid van Moolenbroek */ 72e4e21ee1SDavid van Moolenbroek #define CTLFLAG_PARENT CTLFLAG_ROOT /* node is a real parent node */ 73e4e21ee1SDavid van Moolenbroek #define CTLFLAG_VERIFY CTLFLAG_ALIAS /* node has verification function */ 74*6f3e0bcdSDavid van Moolenbroek #define CTLFLAG_REMOTE CTLFLAG_MMAP /* node is root of remote subtree */ 75e4e21ee1SDavid van Moolenbroek 76e4e21ee1SDavid van Moolenbroek /* 77e4e21ee1SDavid van Moolenbroek * The following node structure definition aims to meet several goals at once: 78e4e21ee1SDavid van Moolenbroek * 79e4e21ee1SDavid van Moolenbroek * 1) it can be used for static and dynamic nodes; 80e4e21ee1SDavid van Moolenbroek * 2) it can be used to point to both static and dynamic child arrays at once; 81e4e21ee1SDavid van Moolenbroek * 3) it allows for embedded, pointed-to, and function-generated data; 82*6f3e0bcdSDavid van Moolenbroek * 4) it allows both temporary and obscuring mount points for remote subtrees; 83*6f3e0bcdSDavid van Moolenbroek * 5) its unions are compatible with magic instrumentation; 84*6f3e0bcdSDavid van Moolenbroek * 6) it is optimized for size, assuming many static and few dynamic nodes. 85e4e21ee1SDavid van Moolenbroek * 86*6f3e0bcdSDavid van Moolenbroek * All nodes have flags, a size, a version, a parent (except the root node), a 87*6f3e0bcdSDavid van Moolenbroek * name, and optionally a description. The use of the rest of the fields 88*6f3e0bcdSDavid van Moolenbroek * depends on the type of the node, which is defined as part of the node's 89*6f3e0bcdSDavid van Moolenbroek * flags field. 90e4e21ee1SDavid van Moolenbroek * 91e4e21ee1SDavid van Moolenbroek * Data nodes, that is, nodes of type CTLTYPE_{BOOL,INT,QUAD,STRING,STRUCT}, 92e4e21ee1SDavid van Moolenbroek * have associated data. For types CTLTYPE_{BOOL,INT,QUAD}, the node may have 93e4e21ee1SDavid van Moolenbroek * immediate data (CTLFLAG_IMMEDIATE), in which case the value of the node is 94e4e21ee1SDavid van Moolenbroek * stored in the node structure itself (node_bool, node_int, node_quad). These 95e4e21ee1SDavid van Moolenbroek * node types may instead also have a pointer to data. This is always the case 96e4e21ee1SDavid van Moolenbroek * for types CTLTYPE_STRING and CTLTYPE_STRUCT. In that case, node_data is a 97e4e21ee1SDavid van Moolenbroek * valid pointer, and CTLFLAG_IMMEDIATE is not set. Either way, node_size is 98e4e21ee1SDavid van Moolenbroek * the size of the data, which for strings is the maximum string size; for 99e4e21ee1SDavid van Moolenbroek * other types, it defines the exact field size. In addition, data nodes may 100e4e21ee1SDavid van Moolenbroek * have the CTLFLAG_VERIFY flag set, which indicates that node_valid points 101e4e21ee1SDavid van Moolenbroek * to a callback function that verifies whether a newly written value is valid 102e4e21ee1SDavid van Moolenbroek * for the node. If this flag is not set, data nodes may have an associated 103e4e21ee1SDavid van Moolenbroek * function, in which case node_func is not NULL, which will be called to read 104e4e21ee1SDavid van Moolenbroek * and write data instead. The function may optionally use the node's regular 105e4e21ee1SDavid van Moolenbroek * (size, immediate and/or pointer) data fields as it sees fit. 106e4e21ee1SDavid van Moolenbroek * 107e4e21ee1SDavid van Moolenbroek * Node-type nodes, of type CTLTYPE_NODE, behave differently. Such nodes may 108*6f3e0bcdSDavid van Moolenbroek * have static and dynamic child nodes, or have an associated function, or be 109*6f3e0bcdSDavid van Moolenbroek * a mount point for a subtree handled by a remote process. The exact case is 110*6f3e0bcdSDavid van Moolenbroek * defined by the combination of the CTLFLAG_PARENT and CTLFLAG_REMOTE flags, 111*6f3e0bcdSDavid van Moolenbroek * yielding four possible cases: 112*6f3e0bcdSDavid van Moolenbroek * 113*6f3e0bcdSDavid van Moolenbroek * CTLFLAG_PARENT CTLFLAG_REMOTE Meaning 114*6f3e0bcdSDavid van Moolenbroek * not set not set The node has an associated function which 115*6f3e0bcdSDavid van Moolenbroek * handles all access to the entire subtree. 116*6f3e0bcdSDavid van Moolenbroek * set not set The node is the root of a real, local 117*6f3e0bcdSDavid van Moolenbroek * subtree with static and/or dynamic children. 118*6f3e0bcdSDavid van Moolenbroek * not set set The node is a temporarily created mount 119*6f3e0bcdSDavid van Moolenbroek * point for a remote tree. A remote service 120*6f3e0bcdSDavid van Moolenbroek * handles all access to the entire subtree. 121*6f3e0bcdSDavid van Moolenbroek * Unmounting the node also destroys the node. 122*6f3e0bcdSDavid van Moolenbroek * set set The node is a mount point that obscures a 123*6f3e0bcdSDavid van Moolenbroek * real, local subtree. A remote service 124*6f3e0bcdSDavid van Moolenbroek * handles all access to the entire subtree. 125*6f3e0bcdSDavid van Moolenbroek * Unmounting makes the original node visible. 126*6f3e0bcdSDavid van Moolenbroek * 127*6f3e0bcdSDavid van Moolenbroek * If the CTLFLAG_PARENT flag is set, the node is the root of a real sutree. 128*6f3e0bcdSDavid van Moolenbroek * For such nodes, node_size is the number (not size!) of the array of static 129*6f3e0bcdSDavid van Moolenbroek * child nodes, which is pointed to by node_scptr and indexed by child 130*6f3e0bcdSDavid van Moolenbroek * identifier. Within the static array, child nodes with zeroed flags fields 131*6f3e0bcdSDavid van Moolenbroek * are not in use. The node_dcptr field points to a linked list of dynamic 132*6f3e0bcdSDavid van Moolenbroek * child nodes. The node_csize field is set to the size of the static array 133*6f3e0bcdSDavid van Moolenbroek * plus the number of dynamic nodes; node_clen is set to the number of valid 134*6f3e0bcdSDavid van Moolenbroek * entries in the static array plus the number of dynamic nodes. 135*6f3e0bcdSDavid van Moolenbroek * 136*6f3e0bcdSDavid van Moolenbroek * If a function is set, and thus neither CTLFLAG_PARENT and CTLFLAG_REMOTE are 137*6f3e0bcdSDavid van Moolenbroek * set, none of the aforementioned fields are used, and the node_size field is 138*6f3e0bcdSDavid van Moolenbroek * typically (but not necessarily) set to zero. 139*6f3e0bcdSDavid van Moolenbroek * 140*6f3e0bcdSDavid van Moolenbroek * A remote service can mount its own subtree into the central MIB tree. The 141*6f3e0bcdSDavid van Moolenbroek * MIB service will then relay any requests for that subtree to the remote 142*6f3e0bcdSDavid van Moolenbroek * service. Both the mountpoint and the root of the remote subtree must be of 143*6f3e0bcdSDavid van Moolenbroek * type CTLTYPE_NODE; thus, no individual leaf nodes may be mounted. The mount 144*6f3e0bcdSDavid van Moolenbroek * point may either be created temporarily for the purpose of mounting (e.g., 145*6f3e0bcdSDavid van Moolenbroek * net.inet), or it may override a preexisting node (e.g., kern.ipc). In the 146*6f3e0bcdSDavid van Moolenbroek * first case, the parent node must exist and be a node type (net). In the 147*6f3e0bcdSDavid van Moolenbroek * second case, the preexisting target node (the MIB service's kern.ipc) may 148*6f3e0bcdSDavid van Moolenbroek * not have an associated function and may only have static children. While 149*6f3e0bcdSDavid van Moolenbroek * being used as a mountpoint (i.e., have CTLFLAG_REMOTE set), the local node's 150*6f3e0bcdSDavid van Moolenbroek * node_csize and node_clen fields must not be used. Instead, the same space 151*6f3e0bcdSDavid van Moolenbroek * in the node structure is used to store information about the remote node: 152*6f3e0bcdSDavid van Moolenbroek * node_rid, node_tid, and the smaller node_rcsize and node_rclen which contain 153*6f3e0bcdSDavid van Moolenbroek * information about the root of the remote subtree. Remote nodes are also 154*6f3e0bcdSDavid van Moolenbroek * part of a linked list for administration purposes, using the node_next 155*6f3e0bcdSDavid van Moolenbroek * field. When a preexisting (CTLFLAG_PARENT) node is unmounted, its original 156*6f3e0bcdSDavid van Moolenbroek * node_csize and node_clen fields are recomputed. 157e4e21ee1SDavid van Moolenbroek * 158e4e21ee1SDavid van Moolenbroek * The structure uses unions for either only pointers or only non-pointers, to 159e4e21ee1SDavid van Moolenbroek * simplify live update support. However, this does not mean the structure is 160*6f3e0bcdSDavid van Moolenbroek * not fully used: real node-type nodes use node_{flags,size,ver,parent,csize, 161*6f3e0bcdSDavid van Moolenbroek * clen,scptr,dcptr,name,desc}, which together add up to the full structure 162*6f3e0bcdSDavid van Moolenbroek * size. 163e4e21ee1SDavid van Moolenbroek */ 164e4e21ee1SDavid van Moolenbroek struct mib_node; 165e4e21ee1SDavid van Moolenbroek struct mib_dynode; 166e4e21ee1SDavid van Moolenbroek 167e4e21ee1SDavid van Moolenbroek typedef ssize_t (*mib_func_ptr)(struct mib_call *, struct mib_node *, 168e4e21ee1SDavid van Moolenbroek struct mib_oldp *, struct mib_newp *); 169e4e21ee1SDavid van Moolenbroek typedef int (*mib_verify_ptr)(struct mib_call *, struct mib_node *, void *, 170e4e21ee1SDavid van Moolenbroek size_t); 171e4e21ee1SDavid van Moolenbroek 172*6f3e0bcdSDavid van Moolenbroek /* 173*6f3e0bcdSDavid van Moolenbroek * To save space for the maintenance of remote nodes, we split up one uint32_t 174*6f3e0bcdSDavid van Moolenbroek * field into three subfields: 175*6f3e0bcdSDavid van Moolenbroek * - node_eid ("endpoint ID"), which is an index into the table of endpoints; 176*6f3e0bcdSDavid van Moolenbroek * - node_rcsize ("child size"), the number of child slots of the remote root; 177*6f3e0bcdSDavid van Moolenbroek * - node_rclen ("child length"), the number of children of the remote root. 178*6f3e0bcdSDavid van Moolenbroek * These fields impose limits on the number of endpoints known in the MIB 179*6f3e0bcdSDavid van Moolenbroek * service, and the maximum size of the remote subtree root. 180*6f3e0bcdSDavid van Moolenbroek */ 181*6f3e0bcdSDavid van Moolenbroek #define MIB_EID_BITS 5 /* up to 32 services can set remote subtrees */ 182*6f3e0bcdSDavid van Moolenbroek #define MIB_RC_BITS 12 /* remote root may have up to 4096 children */ 183*6f3e0bcdSDavid van Moolenbroek 184*6f3e0bcdSDavid van Moolenbroek #if MIB_EID_BITS + 2 * MIB_RC_BITS > 32 185*6f3e0bcdSDavid van Moolenbroek #error "Sum of remote ID and remote children bit fields exceeds uint32_t size" 186*6f3e0bcdSDavid van Moolenbroek #endif 187*6f3e0bcdSDavid van Moolenbroek 188e4e21ee1SDavid van Moolenbroek struct mib_node { 189*6f3e0bcdSDavid van Moolenbroek uint32_t node_flags; /* CTLTYPE_ type and CTLFLAG_ flags */ 190e4e21ee1SDavid van Moolenbroek size_t node_size; /* size of associated data (bytes) */ 191e4e21ee1SDavid van Moolenbroek uint32_t node_ver; /* node version */ 192*6f3e0bcdSDavid van Moolenbroek struct mib_node *node_parent; /* pointer to parent node */ 193e4e21ee1SDavid van Moolenbroek union ixfer_node_val_u { 194e4e21ee1SDavid van Moolenbroek struct { 195e4e21ee1SDavid van Moolenbroek uint32_t nvuc_csize; /* number of child slots */ 196e4e21ee1SDavid van Moolenbroek uint32_t nvuc_clen; /* number of actual children */ 197e4e21ee1SDavid van Moolenbroek } nvu_child; 198*6f3e0bcdSDavid van Moolenbroek struct { 199*6f3e0bcdSDavid van Moolenbroek uint32_t nvur_eid:MIB_EID_BITS; /* endpoint index */ 200*6f3e0bcdSDavid van Moolenbroek uint32_t nvur_csize:MIB_RC_BITS;/* remote ch. slots */ 201*6f3e0bcdSDavid van Moolenbroek uint32_t nvur_clen:MIB_RC_BITS; /* remote children */ 202*6f3e0bcdSDavid van Moolenbroek uint32_t nvur_rid; /* opaque ID of remote root */ 203*6f3e0bcdSDavid van Moolenbroek } nvu_remote; 204e4e21ee1SDavid van Moolenbroek bool nvu_bool; /* immediate boolean */ 205*6f3e0bcdSDavid van Moolenbroek int nvu_int; /* immediate integer */ 206e4e21ee1SDavid van Moolenbroek u_quad_t nvu_quad; /* immediate quad */ 207e4e21ee1SDavid van Moolenbroek } node_val_u; 208e4e21ee1SDavid van Moolenbroek union pxfer_node_ptr_u { 209e4e21ee1SDavid van Moolenbroek void *npu_data; /* struct or string data pointer */ 210e4e21ee1SDavid van Moolenbroek struct mib_node *npu_scptr; /* static child node array */ 211e4e21ee1SDavid van Moolenbroek } node_ptr_u; 212e4e21ee1SDavid van Moolenbroek union pxfer_node_aux_u { 213e4e21ee1SDavid van Moolenbroek struct mib_dynode *nau_dcptr; /* dynamic child node list */ 214e4e21ee1SDavid van Moolenbroek mib_func_ptr nau_func; /* handler function */ 215e4e21ee1SDavid van Moolenbroek mib_verify_ptr nau_verify; /* verification function */ 216*6f3e0bcdSDavid van Moolenbroek struct mib_node *nau_next; /* next remote node in list */ 217e4e21ee1SDavid van Moolenbroek } node_aux_u; 218e4e21ee1SDavid van Moolenbroek const char *node_name; /* node name string */ 219e4e21ee1SDavid van Moolenbroek const char *node_desc; /* node description (may be NULL) */ 220e4e21ee1SDavid van Moolenbroek }; 221e4e21ee1SDavid van Moolenbroek #define node_csize node_val_u.nvu_child.nvuc_csize 222e4e21ee1SDavid van Moolenbroek #define node_clen node_val_u.nvu_child.nvuc_clen 223*6f3e0bcdSDavid van Moolenbroek #define node_eid node_val_u.nvu_remote.nvur_eid 224*6f3e0bcdSDavid van Moolenbroek #define node_rcsize node_val_u.nvu_remote.nvur_csize 225*6f3e0bcdSDavid van Moolenbroek #define node_rclen node_val_u.nvu_remote.nvur_clen 226*6f3e0bcdSDavid van Moolenbroek #define node_rid node_val_u.nvu_remote.nvur_rid 227e4e21ee1SDavid van Moolenbroek #define node_bool node_val_u.nvu_bool 228*6f3e0bcdSDavid van Moolenbroek #define node_int node_val_u.nvu_int 229e4e21ee1SDavid van Moolenbroek #define node_quad node_val_u.nvu_quad 230e4e21ee1SDavid van Moolenbroek #define node_data node_ptr_u.npu_data 231e4e21ee1SDavid van Moolenbroek #define node_scptr node_ptr_u.npu_scptr 232e4e21ee1SDavid van Moolenbroek #define node_dcptr node_aux_u.nau_dcptr 233e4e21ee1SDavid van Moolenbroek #define node_func node_aux_u.nau_func 234e4e21ee1SDavid van Moolenbroek #define node_verify node_aux_u.nau_verify 235*6f3e0bcdSDavid van Moolenbroek #define node_next node_aux_u.nau_next 236e4e21ee1SDavid van Moolenbroek 237e4e21ee1SDavid van Moolenbroek /* 238e4e21ee1SDavid van Moolenbroek * This structure is used for dynamically allocated nodes, that is, nodes 239e4e21ee1SDavid van Moolenbroek * created by userland at run time. It contains not only the fields below, but 240e4e21ee1SDavid van Moolenbroek * also the full name and, for leaf nodes with non-immediate data, the actual 241*6f3e0bcdSDavid van Moolenbroek * data area, or, for temporary mount points for remote subtrees, the node's 242*6f3e0bcdSDavid van Moolenbroek * description. 243e4e21ee1SDavid van Moolenbroek */ 244e4e21ee1SDavid van Moolenbroek struct mib_dynode { 245e4e21ee1SDavid van Moolenbroek struct mib_dynode *dynode_next; /* next in linked dynamic node list */ 246e4e21ee1SDavid van Moolenbroek int dynode_id; /* identifier of this node */ 247e4e21ee1SDavid van Moolenbroek struct mib_node dynode_node; /* actual node */ 248e4e21ee1SDavid van Moolenbroek char dynode_name[1]; /* node name data (variable size) */ 249e4e21ee1SDavid van Moolenbroek }; 250e4e21ee1SDavid van Moolenbroek 251e4e21ee1SDavid van Moolenbroek /* Static node initialization macros. */ 252e4e21ee1SDavid van Moolenbroek #define MIB_NODE(f,t,n,d) { \ 253e4e21ee1SDavid van Moolenbroek .node_flags = CTLTYPE_NODE | CTLFLAG_PARENT | f, \ 254e4e21ee1SDavid van Moolenbroek .node_size = __arraycount(t), \ 255e4e21ee1SDavid van Moolenbroek .node_scptr = t, \ 256e4e21ee1SDavid van Moolenbroek .node_name = n, \ 257e4e21ee1SDavid van Moolenbroek .node_desc = d \ 258e4e21ee1SDavid van Moolenbroek } 259e4e21ee1SDavid van Moolenbroek #define MIB_ENODE(f,n,d) { /* "E"mpty or "E"xternal */ \ 260e4e21ee1SDavid van Moolenbroek .node_flags = CTLTYPE_NODE | CTLFLAG_PARENT | f, \ 261e4e21ee1SDavid van Moolenbroek .node_name = n, \ 262e4e21ee1SDavid van Moolenbroek .node_desc = d \ 263e4e21ee1SDavid van Moolenbroek } 264e4e21ee1SDavid van Moolenbroek #define MIB_BOOL(f,b,n,d) { \ 265e4e21ee1SDavid van Moolenbroek .node_flags = CTLTYPE_BOOL | CTLFLAG_IMMEDIATE | f, \ 266e4e21ee1SDavid van Moolenbroek .node_size = sizeof(bool), \ 267e4e21ee1SDavid van Moolenbroek .node_bool = b, \ 268e4e21ee1SDavid van Moolenbroek .node_name = n, \ 269e4e21ee1SDavid van Moolenbroek .node_desc = d \ 270e4e21ee1SDavid van Moolenbroek } 271*6f3e0bcdSDavid van Moolenbroek #define MIB_INT(f,i,n,d) { \ 272*6f3e0bcdSDavid van Moolenbroek .node_flags = CTLTYPE_INT | CTLFLAG_IMMEDIATE | f, \ 273*6f3e0bcdSDavid van Moolenbroek .node_size = sizeof(int), \ 274*6f3e0bcdSDavid van Moolenbroek .node_int = i, \ 275*6f3e0bcdSDavid van Moolenbroek .node_name = n, \ 276*6f3e0bcdSDavid van Moolenbroek .node_desc = d \ 277*6f3e0bcdSDavid van Moolenbroek } 278e4e21ee1SDavid van Moolenbroek #define MIB_QUAD(f,q,n,d) { \ 279e4e21ee1SDavid van Moolenbroek .node_flags = CTLTYPE_QUAD | CTLFLAG_IMMEDIATE | f, \ 280e4e21ee1SDavid van Moolenbroek .node_size = sizeof(u_quad_t), \ 281e4e21ee1SDavid van Moolenbroek .node_quad = q, \ 282e4e21ee1SDavid van Moolenbroek .node_name = n, \ 283e4e21ee1SDavid van Moolenbroek .node_desc = d \ 284e4e21ee1SDavid van Moolenbroek } 285*6f3e0bcdSDavid van Moolenbroek #define _MIB_DATA(f,s,p,n,d) { \ 286e4e21ee1SDavid van Moolenbroek .node_flags = f, \ 287*6f3e0bcdSDavid van Moolenbroek .node_size = s, \ 288*6f3e0bcdSDavid van Moolenbroek .node_data = __UNCONST(p), \ 289e4e21ee1SDavid van Moolenbroek .node_name = n, \ 290e4e21ee1SDavid van Moolenbroek .node_desc = d \ 291e4e21ee1SDavid van Moolenbroek } 292*6f3e0bcdSDavid van Moolenbroek #define MIB_BOOLPTR(f,p,n,d) _MIB_DATA(CTLTYPE_BOOL | f, sizeof(*p), p, n, d) 293*6f3e0bcdSDavid van Moolenbroek #define MIB_INTPTR(f,p,n,d) _MIB_DATA(CTLTYPE_INT | f, sizeof(*p), p, n, d) 294*6f3e0bcdSDavid van Moolenbroek #define MIB_QUADTR(f,p,n,d) _MIB_DATA(CTLTYPE_QUAD | f, sizeof(*p), p, n, d) 295*6f3e0bcdSDavid van Moolenbroek #define MIB_STRING(f,p,n,d) _MIB_DATA(CTLTYPE_STRING | f, sizeof(p), p, n, d) 296*6f3e0bcdSDavid van Moolenbroek #define MIB_STRUCT(f,s,p,n,d) _MIB_DATA(CTLTYPE_STRUCT | f, s, p, n, d) 297e4e21ee1SDavid van Moolenbroek #define MIB_FUNC(f,s,fp,n,d) { \ 298e4e21ee1SDavid van Moolenbroek .node_flags = f, \ 299e4e21ee1SDavid van Moolenbroek .node_size = s, \ 300e4e21ee1SDavid van Moolenbroek .node_func = fp, \ 301e4e21ee1SDavid van Moolenbroek .node_name = n, \ 302e4e21ee1SDavid van Moolenbroek .node_desc = d \ 303e4e21ee1SDavid van Moolenbroek } 304e4e21ee1SDavid van Moolenbroek #define MIB_INTV(f,i,vp,n,d) { \ 305e4e21ee1SDavid van Moolenbroek .node_flags = CTLTYPE_INT | CTLFLAG_IMMEDIATE | \ 306e4e21ee1SDavid van Moolenbroek CTLFLAG_VERIFY | f, \ 307e4e21ee1SDavid van Moolenbroek .node_size = sizeof(int), \ 308e4e21ee1SDavid van Moolenbroek .node_int = i, \ 309e4e21ee1SDavid van Moolenbroek .node_verify = vp, \ 310e4e21ee1SDavid van Moolenbroek .node_name = n, \ 311e4e21ee1SDavid van Moolenbroek .node_desc = d \ 312e4e21ee1SDavid van Moolenbroek } 313e4e21ee1SDavid van Moolenbroek 314e4e21ee1SDavid van Moolenbroek /* Finalize a node initialized with MIB_ENODE. */ 315e4e21ee1SDavid van Moolenbroek #define MIB_INIT_ENODE(n,t) \ 316e4e21ee1SDavid van Moolenbroek do { \ 317e4e21ee1SDavid van Moolenbroek (n)->node_size = __arraycount(t); \ 318e4e21ee1SDavid van Moolenbroek (n)->node_scptr = t; \ 319e4e21ee1SDavid van Moolenbroek } while (0) 320e4e21ee1SDavid van Moolenbroek 321e4e21ee1SDavid van Moolenbroek /* Some convenient shortcuts for highly common flags. */ 322e4e21ee1SDavid van Moolenbroek #define _RO CTLFLAG_READONLY 323e4e21ee1SDavid van Moolenbroek #define _RW CTLFLAG_READWRITE 324e4e21ee1SDavid van Moolenbroek #define _P CTLFLAG_PERMANENT 325e4e21ee1SDavid van Moolenbroek 326e4e21ee1SDavid van Moolenbroek /* 327e4e21ee1SDavid van Moolenbroek * If this check fails, all uses of "struct sysctlnode" and "struct sysctldesc" 328e4e21ee1SDavid van Moolenbroek * need to be revised, and translation between different versions of those 329e4e21ee1SDavid van Moolenbroek * structures may have to be added for backward compatibility. 330e4e21ee1SDavid van Moolenbroek */ 331e4e21ee1SDavid van Moolenbroek #if SYSCTL_VERSION != SYSCTL_VERS_1 332e4e21ee1SDavid van Moolenbroek #error "NetBSD sysctl headers are ahead of our implementation" 333e4e21ee1SDavid van Moolenbroek #endif 334e4e21ee1SDavid van Moolenbroek 335e4e21ee1SDavid van Moolenbroek /* main.c */ 336e4e21ee1SDavid van Moolenbroek int mib_inrange(struct mib_oldp *, size_t); 337e4e21ee1SDavid van Moolenbroek size_t mib_getoldlen(struct mib_oldp *); 338e4e21ee1SDavid van Moolenbroek ssize_t mib_copyout(struct mib_oldp *, size_t, const void * __restrict, 339e4e21ee1SDavid van Moolenbroek size_t); 340e4e21ee1SDavid van Moolenbroek void mib_setoldlen(struct mib_call *, size_t); 341e4e21ee1SDavid van Moolenbroek size_t mib_getnewlen(struct mib_newp *); 342e4e21ee1SDavid van Moolenbroek int mib_copyin(struct mib_newp * __restrict, void * __restrict, size_t); 343e4e21ee1SDavid van Moolenbroek int mib_copyin_aux(struct mib_newp * __restrict, vir_bytes, 344e4e21ee1SDavid van Moolenbroek void * __restrict, size_t); 345*6f3e0bcdSDavid van Moolenbroek int mib_relay_oldp(endpoint_t, struct mib_oldp * __restrict, cp_grant_id_t *, 346*6f3e0bcdSDavid van Moolenbroek size_t * __restrict); 347*6f3e0bcdSDavid van Moolenbroek int mib_relay_newp(endpoint_t, struct mib_newp * __restrict, cp_grant_id_t *, 348*6f3e0bcdSDavid van Moolenbroek size_t * __restrict); 349e4e21ee1SDavid van Moolenbroek int mib_authed(struct mib_call *); 350*6f3e0bcdSDavid van Moolenbroek extern struct mib_node mib_root; 351e4e21ee1SDavid van Moolenbroek 352e4e21ee1SDavid van Moolenbroek /* tree.c */ 353e4e21ee1SDavid van Moolenbroek ssize_t mib_readwrite(struct mib_call *, struct mib_node *, struct mib_oldp *, 354e4e21ee1SDavid van Moolenbroek struct mib_newp *, mib_verify_ptr); 355*6f3e0bcdSDavid van Moolenbroek ssize_t mib_dispatch(struct mib_call *, struct mib_oldp *, struct mib_newp *); 356*6f3e0bcdSDavid van Moolenbroek void mib_tree_init(void); 357*6f3e0bcdSDavid van Moolenbroek int mib_mount(const int *, unsigned int, unsigned int, uint32_t, uint32_t, 358*6f3e0bcdSDavid van Moolenbroek unsigned int, unsigned int, struct mib_node **); 359*6f3e0bcdSDavid van Moolenbroek void mib_unmount(struct mib_node *); 360*6f3e0bcdSDavid van Moolenbroek extern unsigned int mib_nodes; 361*6f3e0bcdSDavid van Moolenbroek extern unsigned int mib_objects; 362*6f3e0bcdSDavid van Moolenbroek extern unsigned int mib_remotes; 363*6f3e0bcdSDavid van Moolenbroek 364*6f3e0bcdSDavid van Moolenbroek /* remote.c */ 365*6f3e0bcdSDavid van Moolenbroek void mib_remote_init(void); 366*6f3e0bcdSDavid van Moolenbroek int mib_register(const message *, int); 367*6f3e0bcdSDavid van Moolenbroek int mib_deregister(const message *, int); 368*6f3e0bcdSDavid van Moolenbroek int mib_remote_info(unsigned int, uint32_t, char *, size_t, char *, size_t); 369*6f3e0bcdSDavid van Moolenbroek ssize_t mib_remote_call(struct mib_call *, struct mib_node *, 370*6f3e0bcdSDavid van Moolenbroek struct mib_oldp *, struct mib_newp *); 371e4e21ee1SDavid van Moolenbroek 37225d39513SDavid van Moolenbroek /* proc.c */ 37325d39513SDavid van Moolenbroek ssize_t mib_kern_lwp(struct mib_call *, struct mib_node *, struct mib_oldp *, 37425d39513SDavid van Moolenbroek struct mib_newp *); 37525d39513SDavid van Moolenbroek ssize_t mib_kern_proc2(struct mib_call *, struct mib_node *, struct mib_oldp *, 37625d39513SDavid van Moolenbroek struct mib_newp *); 37725d39513SDavid van Moolenbroek ssize_t mib_kern_proc_args(struct mib_call *, struct mib_node *, 37825d39513SDavid van Moolenbroek struct mib_oldp *, struct mib_newp *); 379305e366fSDavid van Moolenbroek ssize_t mib_minix_proc_list(struct mib_call *, struct mib_node *, 380305e366fSDavid van Moolenbroek struct mib_oldp *, struct mib_newp *); 381305e366fSDavid van Moolenbroek ssize_t mib_minix_proc_data(struct mib_call *, struct mib_node *, 382305e366fSDavid van Moolenbroek struct mib_oldp *, struct mib_newp *); 38325d39513SDavid van Moolenbroek 384e4e21ee1SDavid van Moolenbroek /* subtree modules */ 385e4e21ee1SDavid van Moolenbroek void mib_kern_init(struct mib_node *); 38625d39513SDavid van Moolenbroek void mib_vm_init(struct mib_node *); 38725d39513SDavid van Moolenbroek void mib_hw_init(struct mib_node *); 388e4e21ee1SDavid van Moolenbroek void mib_minix_init(struct mib_node *); 389e4e21ee1SDavid van Moolenbroek 390e4e21ee1SDavid van Moolenbroek #endif /* !_MINIX_MIB_MIB_H */ 391