xref: /minix3/minix/servers/mib/mib.h (revision 6f3e0bcd3d3c17c74429db9d63eb808350d9a344)
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