Changeset View
Changeset View
Standalone View
Standalone View
sys/sys/sysctl.h
Show First 20 Lines • Show All 182 Lines • ▼ Show 20 Lines | struct sysctl_oid { | ||||
void *oid_arg1; | void *oid_arg1; | ||||
intmax_t oid_arg2; | intmax_t oid_arg2; | ||||
const char *oid_name; | const char *oid_name; | ||||
int (*oid_handler)(SYSCTL_HANDLER_ARGS); | int (*oid_handler)(SYSCTL_HANDLER_ARGS); | ||||
const char *oid_fmt; | const char *oid_fmt; | ||||
int oid_refcnt; | int oid_refcnt; | ||||
u_int oid_running; | u_int oid_running; | ||||
const char *oid_descr; | const char *oid_descr; | ||||
const char *oid_label; | |||||
}; | }; | ||||
#define SYSCTL_IN(r, p, l) (r->newfunc)(r, p, l) | #define SYSCTL_IN(r, p, l) (r->newfunc)(r, p, l) | ||||
#define SYSCTL_OUT(r, p, l) (r->oldfunc)(r, p, l) | #define SYSCTL_OUT(r, p, l) (r->oldfunc)(r, p, l) | ||||
#define SYSCTL_OUT_STR(r, p) (r->oldfunc)(r, p, strlen(p) + 1) | #define SYSCTL_OUT_STR(r, p) (r->oldfunc)(r, p, strlen(p) + 1) | ||||
int sysctl_handle_bool(SYSCTL_HANDLER_ARGS); | int sysctl_handle_bool(SYSCTL_HANDLER_ARGS); | ||||
int sysctl_handle_8(SYSCTL_HANDLER_ARGS); | int sysctl_handle_8(SYSCTL_HANDLER_ARGS); | ||||
▲ Show 20 Lines • Show All 48 Lines • ▼ Show 20 Lines | |||||
#ifndef NO_SYSCTL_DESCR | #ifndef NO_SYSCTL_DESCR | ||||
#define __DESCR(d) d | #define __DESCR(d) d | ||||
#else | #else | ||||
#define __DESCR(d) "" | #define __DESCR(d) "" | ||||
#endif | #endif | ||||
/* This macro is only for internal use */ | /* This macro is only for internal use */ | ||||
#define SYSCTL_OID_RAW(id, parent_child_head, nbr, name, kind, a1, a2, handler, fmt, descr) \ | #define SYSCTL_OID_RAW(id, parent_child_head, nbr, name, kind, a1, a2, handler, fmt, descr, label) \ | ||||
struct sysctl_oid id = { \ | struct sysctl_oid id = { \ | ||||
.oid_parent = (parent_child_head), \ | .oid_parent = (parent_child_head), \ | ||||
.oid_children = SLIST_HEAD_INITIALIZER(&id.oid_children), \ | .oid_children = SLIST_HEAD_INITIALIZER(&id.oid_children), \ | ||||
.oid_number = (nbr), \ | .oid_number = (nbr), \ | ||||
.oid_kind = (kind), \ | .oid_kind = (kind), \ | ||||
.oid_arg1 = (a1), \ | .oid_arg1 = (a1), \ | ||||
.oid_arg2 = (a2), \ | .oid_arg2 = (a2), \ | ||||
.oid_name = (name), \ | .oid_name = (name), \ | ||||
.oid_handler = (handler), \ | .oid_handler = (handler), \ | ||||
.oid_fmt = (fmt), \ | .oid_fmt = (fmt), \ | ||||
.oid_descr = __DESCR(descr) \ | .oid_descr = __DESCR(descr), \ | ||||
.oid_label = (label), \ | |||||
}; \ | }; \ | ||||
DATA_SET(sysctl_set, id) | DATA_SET(sysctl_set, id) | ||||
/* This constructs a static "raw" MIB oid. */ | /* This constructs a static "raw" MIB oid. */ | ||||
#define SYSCTL_OID(parent, nbr, name, kind, a1, a2, handler, fmt, descr) \ | #define SYSCTL_OID(parent, nbr, name, kind, a1, a2, handler, fmt, descr) \ | ||||
SYSCTL_OID_WITH_LABEL(parent, nbr, name, kind, a1, a2, \ | |||||
handler, fmt, descr, NULL) | |||||
#define SYSCTL_OID_WITH_LABEL(parent, nbr, name, kind, a1, a2, handler, fmt, descr, label) \ | |||||
rpokala: Doesn't the #define for SYSCTL_OID_WITH_LABEL need to come before its use in the #define for… | |||||
Not Done Inline ActionsWell, that's intersting about macros: it's jut flat substitution. This means that ordering is irrelevant. The entire expansion is determined at invocation. This means that the existing ordering is all right. It's actually intentional, as I'd rather place the _WITH_LABEL() versions below the more commonly used ones. Your thoughts? ed: Well, that's intersting about macros: it's jut flat substitution. This means that ordering is… | |||||
static SYSCTL_OID_RAW(sysctl__##parent##_##name, \ | static SYSCTL_OID_RAW(sysctl__##parent##_##name, \ | ||||
SYSCTL_CHILDREN(&sysctl__##parent), \ | SYSCTL_CHILDREN(&sysctl__##parent), \ | ||||
nbr, #name, kind, a1, a2, handler, fmt, descr) | nbr, #name, kind, a1, a2, handler, fmt, descr, label) | ||||
/* This constructs a global "raw" MIB oid. */ | /* This constructs a global "raw" MIB oid. */ | ||||
#define SYSCTL_OID_GLOBAL(parent, nbr, name, kind, a1, a2, handler, fmt, descr) \ | #define SYSCTL_OID_GLOBAL(parent, nbr, name, kind, a1, a2, handler, fmt, descr, label) \ | ||||
SYSCTL_OID_RAW(sysctl__##parent##_##name, \ | SYSCTL_OID_RAW(sysctl__##parent##_##name, \ | ||||
SYSCTL_CHILDREN(&sysctl__##parent), \ | SYSCTL_CHILDREN(&sysctl__##parent), \ | ||||
nbr, #name, kind, a1, a2, handler, fmt, descr) | nbr, #name, kind, a1, a2, handler, fmt, descr, label) | ||||
#define SYSCTL_ADD_OID(ctx, parent, nbr, name, kind, a1, a2, handler, fmt, descr) \ | #define SYSCTL_ADD_OID(ctx, parent, nbr, name, kind, a1, a2, handler, fmt, descr) \ | ||||
sysctl_add_oid(ctx, parent, nbr, name, kind, a1, a2, handler, fmt, __DESCR(descr)) | sysctl_add_oid(ctx, parent, nbr, name, kind, a1, a2, handler, fmt, __DESCR(descr), NULL) | ||||
/* This constructs a root node from which other nodes can hang. */ | /* This constructs a root node from which other nodes can hang. */ | ||||
#define SYSCTL_ROOT_NODE(nbr, name, access, handler, descr) \ | #define SYSCTL_ROOT_NODE(nbr, name, access, handler, descr) \ | ||||
SYSCTL_OID_RAW(sysctl___##name, &sysctl__children, \ | SYSCTL_OID_RAW(sysctl___##name, &sysctl__children, \ | ||||
nbr, #name, CTLTYPE_NODE|(access), NULL, 0, \ | nbr, #name, CTLTYPE_NODE|(access), NULL, 0, \ | ||||
handler, "N", descr); \ | handler, "N", descr, NULL); \ | ||||
CTASSERT(((access) & CTLTYPE) == 0 || \ | CTASSERT(((access) & CTLTYPE) == 0 || \ | ||||
((access) & SYSCTL_CT_ASSERT_MASK) == CTLTYPE_NODE) | ((access) & SYSCTL_CT_ASSERT_MASK) == CTLTYPE_NODE) | ||||
/* This constructs a node from which other oids can hang. */ | /* This constructs a node from which other oids can hang. */ | ||||
#define SYSCTL_NODE(parent, nbr, name, access, handler, descr) \ | #define SYSCTL_NODE(parent, nbr, name, access, handler, descr) \ | ||||
SYSCTL_NODE_WITH_LABEL(parent, nbr, name, access, handler, descr, NULL) | |||||
#define SYSCTL_NODE_WITH_LABEL(parent, nbr, name, access, handler, descr, label) \ | |||||
SYSCTL_OID_GLOBAL(parent, nbr, name, CTLTYPE_NODE|(access), \ | SYSCTL_OID_GLOBAL(parent, nbr, name, CTLTYPE_NODE|(access), \ | ||||
Done Inline ActionsSame here - SYSCTL_NODE_WITH_LABEL is used in the definition of SYSCTL_NODE before SYSCTL_NODE_WITH_LABEL is defined. rpokala: Same here - SYSCTL_NODE_WITH_LABEL is used in the definition of SYSCTL_NODE before… | |||||
NULL, 0, handler, "N", descr); \ | NULL, 0, handler, "N", descr, label); \ | ||||
CTASSERT(((access) & CTLTYPE) == 0 || \ | CTASSERT(((access) & CTLTYPE) == 0 || \ | ||||
((access) & SYSCTL_CT_ASSERT_MASK) == CTLTYPE_NODE) | ((access) & SYSCTL_CT_ASSERT_MASK) == CTLTYPE_NODE) | ||||
#define SYSCTL_ADD_NODE(ctx, parent, nbr, name, access, handler, descr) \ | #define SYSCTL_ADD_NODE(ctx, parent, nbr, name, access, handler, descr) \ | ||||
SYSCTL_ADD_NODE_WITH_LABEL(ctx, parent, nbr, name, access, \ | |||||
handler, descr, NULL) | |||||
#define SYSCTL_ADD_NODE_WITH_LABEL(ctx, parent, nbr, name, access, handler, descr, label) \ | |||||
Done Inline ActionsAnd again. rpokala: And again. | |||||
({ \ | ({ \ | ||||
CTASSERT(((access) & CTLTYPE) == 0 || \ | CTASSERT(((access) & CTLTYPE) == 0 || \ | ||||
((access) & SYSCTL_CT_ASSERT_MASK) == CTLTYPE_NODE); \ | ((access) & SYSCTL_CT_ASSERT_MASK) == CTLTYPE_NODE); \ | ||||
sysctl_add_oid(ctx, parent, nbr, name, CTLTYPE_NODE|(access), \ | sysctl_add_oid(ctx, parent, nbr, name, CTLTYPE_NODE|(access), \ | ||||
NULL, 0, handler, "N", __DESCR(descr)); \ | NULL, 0, handler, "N", __DESCR(descr), label); \ | ||||
}) | }) | ||||
#define SYSCTL_ADD_ROOT_NODE(ctx, nbr, name, access, handler, descr) \ | #define SYSCTL_ADD_ROOT_NODE(ctx, nbr, name, access, handler, descr) \ | ||||
({ \ | ({ \ | ||||
CTASSERT(((access) & CTLTYPE) == 0 || \ | CTASSERT(((access) & CTLTYPE) == 0 || \ | ||||
((access) & SYSCTL_CT_ASSERT_MASK) == CTLTYPE_NODE); \ | ((access) & SYSCTL_CT_ASSERT_MASK) == CTLTYPE_NODE); \ | ||||
sysctl_add_oid(ctx, &sysctl__children, nbr, name, \ | sysctl_add_oid(ctx, &sysctl__children, nbr, name, \ | ||||
CTLTYPE_NODE|(access), \ | CTLTYPE_NODE|(access), \ | ||||
NULL, 0, handler, "N", __DESCR(descr)); \ | NULL, 0, handler, "N", __DESCR(descr), NULL); \ | ||||
}) | }) | ||||
/* Oid for a string. len can be 0 to indicate '\0' termination. */ | /* Oid for a string. len can be 0 to indicate '\0' termination. */ | ||||
#define SYSCTL_STRING(parent, nbr, name, access, arg, len, descr) \ | #define SYSCTL_STRING(parent, nbr, name, access, arg, len, descr) \ | ||||
SYSCTL_OID(parent, nbr, name, CTLTYPE_STRING|(access), \ | SYSCTL_OID(parent, nbr, name, CTLTYPE_STRING|(access), \ | ||||
arg, len, sysctl_handle_string, "A", descr); \ | arg, len, sysctl_handle_string, "A", descr); \ | ||||
CTASSERT(((access) & CTLTYPE) == 0 || \ | CTASSERT(((access) & CTLTYPE) == 0 || \ | ||||
((access) & SYSCTL_CT_ASSERT_MASK) == CTLTYPE_STRING) | ((access) & SYSCTL_CT_ASSERT_MASK) == CTLTYPE_STRING) | ||||
#define SYSCTL_ADD_STRING(ctx, parent, nbr, name, access, arg, len, descr) \ | #define SYSCTL_ADD_STRING(ctx, parent, nbr, name, access, arg, len, descr) \ | ||||
({ \ | ({ \ | ||||
char *__arg = (arg); \ | char *__arg = (arg); \ | ||||
CTASSERT(((access) & CTLTYPE) == 0 || \ | CTASSERT(((access) & CTLTYPE) == 0 || \ | ||||
((access) & SYSCTL_CT_ASSERT_MASK) == CTLTYPE_STRING); \ | ((access) & SYSCTL_CT_ASSERT_MASK) == CTLTYPE_STRING); \ | ||||
sysctl_add_oid(ctx, parent, nbr, name, CTLTYPE_STRING|(access), \ | sysctl_add_oid(ctx, parent, nbr, name, CTLTYPE_STRING|(access), \ | ||||
__arg, len, sysctl_handle_string, "A", __DESCR(descr)); \ | __arg, len, sysctl_handle_string, "A", __DESCR(descr), \ | ||||
NULL); \ | |||||
}) | }) | ||||
/* Oid for a bool. If ptr is NULL, val is returned. */ | /* Oid for a bool. If ptr is NULL, val is returned. */ | ||||
#define SYSCTL_NULL_BOOL_PTR ((bool *)NULL) | #define SYSCTL_NULL_BOOL_PTR ((bool *)NULL) | ||||
#define SYSCTL_BOOL(parent, nbr, name, access, ptr, val, descr) \ | #define SYSCTL_BOOL(parent, nbr, name, access, ptr, val, descr) \ | ||||
SYSCTL_OID(parent, nbr, name, \ | SYSCTL_OID(parent, nbr, name, \ | ||||
CTLTYPE_U8 | CTLFLAG_MPSAFE | (access), \ | CTLTYPE_U8 | CTLFLAG_MPSAFE | (access), \ | ||||
ptr, val, sysctl_handle_bool, "CU", descr); \ | ptr, val, sysctl_handle_bool, "CU", descr); \ | ||||
CTASSERT(((access) & CTLTYPE) == 0 && \ | CTASSERT(((access) & CTLTYPE) == 0 && \ | ||||
sizeof(bool) == sizeof(*(ptr))) | sizeof(bool) == sizeof(*(ptr))) | ||||
#define SYSCTL_ADD_BOOL(ctx, parent, nbr, name, access, ptr, val, descr) \ | #define SYSCTL_ADD_BOOL(ctx, parent, nbr, name, access, ptr, val, descr) \ | ||||
({ \ | ({ \ | ||||
bool *__ptr = (ptr); \ | bool *__ptr = (ptr); \ | ||||
CTASSERT(((access) & CTLTYPE) == 0); \ | CTASSERT(((access) & CTLTYPE) == 0); \ | ||||
sysctl_add_oid(ctx, parent, nbr, name, \ | sysctl_add_oid(ctx, parent, nbr, name, \ | ||||
CTLTYPE_U8 | CTLFLAG_MPSAFE | (access), \ | CTLTYPE_U8 | CTLFLAG_MPSAFE | (access), \ | ||||
__ptr, val, sysctl_handle_bool, "CU", __DESCR(descr)); \ | __ptr, val, sysctl_handle_bool, "CU", __DESCR(descr), \ | ||||
NULL); \ | |||||
}) | }) | ||||
/* Oid for a signed 8-bit int. If ptr is NULL, val is returned. */ | /* Oid for a signed 8-bit int. If ptr is NULL, val is returned. */ | ||||
#define SYSCTL_NULL_S8_PTR ((int8_t *)NULL) | #define SYSCTL_NULL_S8_PTR ((int8_t *)NULL) | ||||
#define SYSCTL_S8(parent, nbr, name, access, ptr, val, descr) \ | #define SYSCTL_S8(parent, nbr, name, access, ptr, val, descr) \ | ||||
SYSCTL_OID(parent, nbr, name, \ | SYSCTL_OID(parent, nbr, name, \ | ||||
CTLTYPE_S8 | CTLFLAG_MPSAFE | (access), \ | CTLTYPE_S8 | CTLFLAG_MPSAFE | (access), \ | ||||
ptr, val, sysctl_handle_8, "C", descr); \ | ptr, val, sysctl_handle_8, "C", descr); \ | ||||
CTASSERT((((access) & CTLTYPE) == 0 || \ | CTASSERT((((access) & CTLTYPE) == 0 || \ | ||||
((access) & SYSCTL_CT_ASSERT_MASK) == CTLTYPE_S8) && \ | ((access) & SYSCTL_CT_ASSERT_MASK) == CTLTYPE_S8) && \ | ||||
sizeof(int8_t) == sizeof(*(ptr))) | sizeof(int8_t) == sizeof(*(ptr))) | ||||
#define SYSCTL_ADD_S8(ctx, parent, nbr, name, access, ptr, val, descr) \ | #define SYSCTL_ADD_S8(ctx, parent, nbr, name, access, ptr, val, descr) \ | ||||
({ \ | ({ \ | ||||
int8_t *__ptr = (ptr); \ | int8_t *__ptr = (ptr); \ | ||||
CTASSERT(((access) & CTLTYPE) == 0 || \ | CTASSERT(((access) & CTLTYPE) == 0 || \ | ||||
((access) & SYSCTL_CT_ASSERT_MASK) == CTLTYPE_S8); \ | ((access) & SYSCTL_CT_ASSERT_MASK) == CTLTYPE_S8); \ | ||||
sysctl_add_oid(ctx, parent, nbr, name, \ | sysctl_add_oid(ctx, parent, nbr, name, \ | ||||
CTLTYPE_S8 | CTLFLAG_MPSAFE | (access), \ | CTLTYPE_S8 | CTLFLAG_MPSAFE | (access), \ | ||||
__ptr, val, sysctl_handle_8, "C", __DESCR(descr)); \ | __ptr, val, sysctl_handle_8, "C", __DESCR(descr), NULL); \ | ||||
}) | }) | ||||
/* Oid for an unsigned 8-bit int. If ptr is NULL, val is returned. */ | /* Oid for an unsigned 8-bit int. If ptr is NULL, val is returned. */ | ||||
#define SYSCTL_NULL_U8_PTR ((uint8_t *)NULL) | #define SYSCTL_NULL_U8_PTR ((uint8_t *)NULL) | ||||
#define SYSCTL_U8(parent, nbr, name, access, ptr, val, descr) \ | #define SYSCTL_U8(parent, nbr, name, access, ptr, val, descr) \ | ||||
SYSCTL_OID(parent, nbr, name, \ | SYSCTL_OID(parent, nbr, name, \ | ||||
CTLTYPE_U8 | CTLFLAG_MPSAFE | (access), \ | CTLTYPE_U8 | CTLFLAG_MPSAFE | (access), \ | ||||
ptr, val, sysctl_handle_8, "CU", descr); \ | ptr, val, sysctl_handle_8, "CU", descr); \ | ||||
CTASSERT((((access) & CTLTYPE) == 0 || \ | CTASSERT((((access) & CTLTYPE) == 0 || \ | ||||
((access) & SYSCTL_CT_ASSERT_MASK) == CTLTYPE_U8) && \ | ((access) & SYSCTL_CT_ASSERT_MASK) == CTLTYPE_U8) && \ | ||||
sizeof(uint8_t) == sizeof(*(ptr))) | sizeof(uint8_t) == sizeof(*(ptr))) | ||||
#define SYSCTL_ADD_U8(ctx, parent, nbr, name, access, ptr, val, descr) \ | #define SYSCTL_ADD_U8(ctx, parent, nbr, name, access, ptr, val, descr) \ | ||||
({ \ | ({ \ | ||||
uint8_t *__ptr = (ptr); \ | uint8_t *__ptr = (ptr); \ | ||||
CTASSERT(((access) & CTLTYPE) == 0 || \ | CTASSERT(((access) & CTLTYPE) == 0 || \ | ||||
((access) & SYSCTL_CT_ASSERT_MASK) == CTLTYPE_U8); \ | ((access) & SYSCTL_CT_ASSERT_MASK) == CTLTYPE_U8); \ | ||||
sysctl_add_oid(ctx, parent, nbr, name, \ | sysctl_add_oid(ctx, parent, nbr, name, \ | ||||
CTLTYPE_U8 | CTLFLAG_MPSAFE | (access), \ | CTLTYPE_U8 | CTLFLAG_MPSAFE | (access), \ | ||||
__ptr, val, sysctl_handle_8, "CU", __DESCR(descr)); \ | __ptr, val, sysctl_handle_8, "CU", __DESCR(descr), NULL); \ | ||||
}) | }) | ||||
/* Oid for a signed 16-bit int. If ptr is NULL, val is returned. */ | /* Oid for a signed 16-bit int. If ptr is NULL, val is returned. */ | ||||
#define SYSCTL_NULL_S16_PTR ((int16_t *)NULL) | #define SYSCTL_NULL_S16_PTR ((int16_t *)NULL) | ||||
#define SYSCTL_S16(parent, nbr, name, access, ptr, val, descr) \ | #define SYSCTL_S16(parent, nbr, name, access, ptr, val, descr) \ | ||||
SYSCTL_OID(parent, nbr, name, \ | SYSCTL_OID(parent, nbr, name, \ | ||||
CTLTYPE_S16 | CTLFLAG_MPSAFE | (access), \ | CTLTYPE_S16 | CTLFLAG_MPSAFE | (access), \ | ||||
ptr, val, sysctl_handle_16, "S", descr); \ | ptr, val, sysctl_handle_16, "S", descr); \ | ||||
CTASSERT((((access) & CTLTYPE) == 0 || \ | CTASSERT((((access) & CTLTYPE) == 0 || \ | ||||
((access) & SYSCTL_CT_ASSERT_MASK) == CTLTYPE_S16) && \ | ((access) & SYSCTL_CT_ASSERT_MASK) == CTLTYPE_S16) && \ | ||||
sizeof(int16_t) == sizeof(*(ptr))) | sizeof(int16_t) == sizeof(*(ptr))) | ||||
#define SYSCTL_ADD_S16(ctx, parent, nbr, name, access, ptr, val, descr) \ | #define SYSCTL_ADD_S16(ctx, parent, nbr, name, access, ptr, val, descr) \ | ||||
({ \ | ({ \ | ||||
int16_t *__ptr = (ptr); \ | int16_t *__ptr = (ptr); \ | ||||
CTASSERT(((access) & CTLTYPE) == 0 || \ | CTASSERT(((access) & CTLTYPE) == 0 || \ | ||||
((access) & SYSCTL_CT_ASSERT_MASK) == CTLTYPE_S16); \ | ((access) & SYSCTL_CT_ASSERT_MASK) == CTLTYPE_S16); \ | ||||
sysctl_add_oid(ctx, parent, nbr, name, \ | sysctl_add_oid(ctx, parent, nbr, name, \ | ||||
CTLTYPE_S16 | CTLFLAG_MPSAFE | (access), \ | CTLTYPE_S16 | CTLFLAG_MPSAFE | (access), \ | ||||
__ptr, val, sysctl_handle_16, "S", __DESCR(descr)); \ | __ptr, val, sysctl_handle_16, "S", __DESCR(descr), NULL); \ | ||||
}) | }) | ||||
/* Oid for an unsigned 16-bit int. If ptr is NULL, val is returned. */ | /* Oid for an unsigned 16-bit int. If ptr is NULL, val is returned. */ | ||||
#define SYSCTL_NULL_U16_PTR ((uint16_t *)NULL) | #define SYSCTL_NULL_U16_PTR ((uint16_t *)NULL) | ||||
#define SYSCTL_U16(parent, nbr, name, access, ptr, val, descr) \ | #define SYSCTL_U16(parent, nbr, name, access, ptr, val, descr) \ | ||||
SYSCTL_OID(parent, nbr, name, \ | SYSCTL_OID(parent, nbr, name, \ | ||||
CTLTYPE_U16 | CTLFLAG_MPSAFE | (access), \ | CTLTYPE_U16 | CTLFLAG_MPSAFE | (access), \ | ||||
ptr, val, sysctl_handle_16, "SU", descr); \ | ptr, val, sysctl_handle_16, "SU", descr); \ | ||||
CTASSERT((((access) & CTLTYPE) == 0 || \ | CTASSERT((((access) & CTLTYPE) == 0 || \ | ||||
((access) & SYSCTL_CT_ASSERT_MASK) == CTLTYPE_U16) && \ | ((access) & SYSCTL_CT_ASSERT_MASK) == CTLTYPE_U16) && \ | ||||
sizeof(uint16_t) == sizeof(*(ptr))) | sizeof(uint16_t) == sizeof(*(ptr))) | ||||
#define SYSCTL_ADD_U16(ctx, parent, nbr, name, access, ptr, val, descr) \ | #define SYSCTL_ADD_U16(ctx, parent, nbr, name, access, ptr, val, descr) \ | ||||
({ \ | ({ \ | ||||
uint16_t *__ptr = (ptr); \ | uint16_t *__ptr = (ptr); \ | ||||
CTASSERT(((access) & CTLTYPE) == 0 || \ | CTASSERT(((access) & CTLTYPE) == 0 || \ | ||||
((access) & SYSCTL_CT_ASSERT_MASK) == CTLTYPE_U16); \ | ((access) & SYSCTL_CT_ASSERT_MASK) == CTLTYPE_U16); \ | ||||
sysctl_add_oid(ctx, parent, nbr, name, \ | sysctl_add_oid(ctx, parent, nbr, name, \ | ||||
CTLTYPE_U16 | CTLFLAG_MPSAFE | (access), \ | CTLTYPE_U16 | CTLFLAG_MPSAFE | (access), \ | ||||
__ptr, val, sysctl_handle_16, "SU", __DESCR(descr)); \ | __ptr, val, sysctl_handle_16, "SU", __DESCR(descr), NULL); \ | ||||
}) | }) | ||||
/* Oid for a signed 32-bit int. If ptr is NULL, val is returned. */ | /* Oid for a signed 32-bit int. If ptr is NULL, val is returned. */ | ||||
#define SYSCTL_NULL_S32_PTR ((int32_t *)NULL) | #define SYSCTL_NULL_S32_PTR ((int32_t *)NULL) | ||||
#define SYSCTL_S32(parent, nbr, name, access, ptr, val, descr) \ | #define SYSCTL_S32(parent, nbr, name, access, ptr, val, descr) \ | ||||
SYSCTL_OID(parent, nbr, name, \ | SYSCTL_OID(parent, nbr, name, \ | ||||
CTLTYPE_S32 | CTLFLAG_MPSAFE | (access), \ | CTLTYPE_S32 | CTLFLAG_MPSAFE | (access), \ | ||||
ptr, val, sysctl_handle_32, "I", descr); \ | ptr, val, sysctl_handle_32, "I", descr); \ | ||||
CTASSERT((((access) & CTLTYPE) == 0 || \ | CTASSERT((((access) & CTLTYPE) == 0 || \ | ||||
((access) & SYSCTL_CT_ASSERT_MASK) == CTLTYPE_S32) && \ | ((access) & SYSCTL_CT_ASSERT_MASK) == CTLTYPE_S32) && \ | ||||
sizeof(int32_t) == sizeof(*(ptr))) | sizeof(int32_t) == sizeof(*(ptr))) | ||||
#define SYSCTL_ADD_S32(ctx, parent, nbr, name, access, ptr, val, descr) \ | #define SYSCTL_ADD_S32(ctx, parent, nbr, name, access, ptr, val, descr) \ | ||||
({ \ | ({ \ | ||||
int32_t *__ptr = (ptr); \ | int32_t *__ptr = (ptr); \ | ||||
CTASSERT(((access) & CTLTYPE) == 0 || \ | CTASSERT(((access) & CTLTYPE) == 0 || \ | ||||
((access) & SYSCTL_CT_ASSERT_MASK) == CTLTYPE_S32); \ | ((access) & SYSCTL_CT_ASSERT_MASK) == CTLTYPE_S32); \ | ||||
sysctl_add_oid(ctx, parent, nbr, name, \ | sysctl_add_oid(ctx, parent, nbr, name, \ | ||||
CTLTYPE_S32 | CTLFLAG_MPSAFE | (access), \ | CTLTYPE_S32 | CTLFLAG_MPSAFE | (access), \ | ||||
__ptr, val, sysctl_handle_32, "I", __DESCR(descr)); \ | __ptr, val, sysctl_handle_32, "I", __DESCR(descr), NULL); \ | ||||
}) | }) | ||||
/* Oid for an unsigned 32-bit int. If ptr is NULL, val is returned. */ | /* Oid for an unsigned 32-bit int. If ptr is NULL, val is returned. */ | ||||
#define SYSCTL_NULL_U32_PTR ((uint32_t *)NULL) | #define SYSCTL_NULL_U32_PTR ((uint32_t *)NULL) | ||||
#define SYSCTL_U32(parent, nbr, name, access, ptr, val, descr) \ | #define SYSCTL_U32(parent, nbr, name, access, ptr, val, descr) \ | ||||
SYSCTL_OID(parent, nbr, name, \ | SYSCTL_OID(parent, nbr, name, \ | ||||
CTLTYPE_U32 | CTLFLAG_MPSAFE | (access), \ | CTLTYPE_U32 | CTLFLAG_MPSAFE | (access), \ | ||||
ptr, val, sysctl_handle_32, "IU", descr); \ | ptr, val, sysctl_handle_32, "IU", descr); \ | ||||
CTASSERT((((access) & CTLTYPE) == 0 || \ | CTASSERT((((access) & CTLTYPE) == 0 || \ | ||||
((access) & SYSCTL_CT_ASSERT_MASK) == CTLTYPE_U32) && \ | ((access) & SYSCTL_CT_ASSERT_MASK) == CTLTYPE_U32) && \ | ||||
sizeof(uint32_t) == sizeof(*(ptr))) | sizeof(uint32_t) == sizeof(*(ptr))) | ||||
#define SYSCTL_ADD_U32(ctx, parent, nbr, name, access, ptr, val, descr) \ | #define SYSCTL_ADD_U32(ctx, parent, nbr, name, access, ptr, val, descr) \ | ||||
({ \ | ({ \ | ||||
uint32_t *__ptr = (ptr); \ | uint32_t *__ptr = (ptr); \ | ||||
CTASSERT(((access) & CTLTYPE) == 0 || \ | CTASSERT(((access) & CTLTYPE) == 0 || \ | ||||
((access) & SYSCTL_CT_ASSERT_MASK) == CTLTYPE_U32); \ | ((access) & SYSCTL_CT_ASSERT_MASK) == CTLTYPE_U32); \ | ||||
sysctl_add_oid(ctx, parent, nbr, name, \ | sysctl_add_oid(ctx, parent, nbr, name, \ | ||||
CTLTYPE_U32 | CTLFLAG_MPSAFE | (access), \ | CTLTYPE_U32 | CTLFLAG_MPSAFE | (access), \ | ||||
__ptr, val, sysctl_handle_32, "IU", __DESCR(descr)); \ | __ptr, val, sysctl_handle_32, "IU", __DESCR(descr), NULL); \ | ||||
}) | }) | ||||
/* Oid for a signed 64-bit int. If ptr is NULL, val is returned. */ | /* Oid for a signed 64-bit int. If ptr is NULL, val is returned. */ | ||||
#define SYSCTL_NULL_S64_PTR ((int64_t *)NULL) | #define SYSCTL_NULL_S64_PTR ((int64_t *)NULL) | ||||
#define SYSCTL_S64(parent, nbr, name, access, ptr, val, descr) \ | #define SYSCTL_S64(parent, nbr, name, access, ptr, val, descr) \ | ||||
SYSCTL_OID(parent, nbr, name, \ | SYSCTL_OID(parent, nbr, name, \ | ||||
CTLTYPE_S64 | CTLFLAG_MPSAFE | (access), \ | CTLTYPE_S64 | CTLFLAG_MPSAFE | (access), \ | ||||
ptr, val, sysctl_handle_64, "Q", descr); \ | ptr, val, sysctl_handle_64, "Q", descr); \ | ||||
CTASSERT((((access) & CTLTYPE) == 0 || \ | CTASSERT((((access) & CTLTYPE) == 0 || \ | ||||
((access) & SYSCTL_CT_ASSERT_MASK) == CTLTYPE_S64) && \ | ((access) & SYSCTL_CT_ASSERT_MASK) == CTLTYPE_S64) && \ | ||||
sizeof(int64_t) == sizeof(*(ptr))) | sizeof(int64_t) == sizeof(*(ptr))) | ||||
#define SYSCTL_ADD_S64(ctx, parent, nbr, name, access, ptr, val, descr) \ | #define SYSCTL_ADD_S64(ctx, parent, nbr, name, access, ptr, val, descr) \ | ||||
({ \ | ({ \ | ||||
int64_t *__ptr = (ptr); \ | int64_t *__ptr = (ptr); \ | ||||
CTASSERT(((access) & CTLTYPE) == 0 || \ | CTASSERT(((access) & CTLTYPE) == 0 || \ | ||||
((access) & SYSCTL_CT_ASSERT_MASK) == CTLTYPE_S64); \ | ((access) & SYSCTL_CT_ASSERT_MASK) == CTLTYPE_S64); \ | ||||
sysctl_add_oid(ctx, parent, nbr, name, \ | sysctl_add_oid(ctx, parent, nbr, name, \ | ||||
CTLTYPE_S64 | CTLFLAG_MPSAFE | (access), \ | CTLTYPE_S64 | CTLFLAG_MPSAFE | (access), \ | ||||
__ptr, val, sysctl_handle_64, "Q", __DESCR(descr)); \ | __ptr, val, sysctl_handle_64, "Q", __DESCR(descr), NULL); \ | ||||
}) | }) | ||||
/* Oid for an unsigned 64-bit int. If ptr is NULL, val is returned. */ | /* Oid for an unsigned 64-bit int. If ptr is NULL, val is returned. */ | ||||
#define SYSCTL_NULL_U64_PTR ((uint64_t *)NULL) | #define SYSCTL_NULL_U64_PTR ((uint64_t *)NULL) | ||||
#define SYSCTL_U64(parent, nbr, name, access, ptr, val, descr) \ | #define SYSCTL_U64(parent, nbr, name, access, ptr, val, descr) \ | ||||
SYSCTL_OID(parent, nbr, name, \ | SYSCTL_OID(parent, nbr, name, \ | ||||
CTLTYPE_U64 | CTLFLAG_MPSAFE | (access), \ | CTLTYPE_U64 | CTLFLAG_MPSAFE | (access), \ | ||||
ptr, val, sysctl_handle_64, "QU", descr); \ | ptr, val, sysctl_handle_64, "QU", descr); \ | ||||
CTASSERT((((access) & CTLTYPE) == 0 || \ | CTASSERT((((access) & CTLTYPE) == 0 || \ | ||||
((access) & SYSCTL_CT_ASSERT_MASK) == CTLTYPE_U64) && \ | ((access) & SYSCTL_CT_ASSERT_MASK) == CTLTYPE_U64) && \ | ||||
sizeof(uint64_t) == sizeof(*(ptr))) | sizeof(uint64_t) == sizeof(*(ptr))) | ||||
#define SYSCTL_ADD_U64(ctx, parent, nbr, name, access, ptr, val, descr) \ | #define SYSCTL_ADD_U64(ctx, parent, nbr, name, access, ptr, val, descr) \ | ||||
({ \ | ({ \ | ||||
uint64_t *__ptr = (ptr); \ | uint64_t *__ptr = (ptr); \ | ||||
CTASSERT(((access) & CTLTYPE) == 0 || \ | CTASSERT(((access) & CTLTYPE) == 0 || \ | ||||
((access) & SYSCTL_CT_ASSERT_MASK) == CTLTYPE_U64); \ | ((access) & SYSCTL_CT_ASSERT_MASK) == CTLTYPE_U64); \ | ||||
sysctl_add_oid(ctx, parent, nbr, name, \ | sysctl_add_oid(ctx, parent, nbr, name, \ | ||||
CTLTYPE_U64 | CTLFLAG_MPSAFE | (access), \ | CTLTYPE_U64 | CTLFLAG_MPSAFE | (access), \ | ||||
__ptr, val, sysctl_handle_64, "QU", __DESCR(descr)); \ | __ptr, val, sysctl_handle_64, "QU", __DESCR(descr), NULL); \ | ||||
}) | }) | ||||
/* Oid for an int. If ptr is SYSCTL_NULL_INT_PTR, val is returned. */ | /* Oid for an int. If ptr is SYSCTL_NULL_INT_PTR, val is returned. */ | ||||
#define SYSCTL_NULL_INT_PTR ((int *)NULL) | #define SYSCTL_NULL_INT_PTR ((int *)NULL) | ||||
#define SYSCTL_INT(parent, nbr, name, access, ptr, val, descr) \ | #define SYSCTL_INT(parent, nbr, name, access, ptr, val, descr) \ | ||||
SYSCTL_OID(parent, nbr, name, \ | SYSCTL_INT_WITH_LABEL(parent, nbr, name, access, ptr, val, descr, NULL) | ||||
#define SYSCTL_INT_WITH_LABEL(parent, nbr, name, access, ptr, val, descr, label) \ | |||||
SYSCTL_OID_WITH_LABEL(parent, nbr, name, \ | |||||
CTLTYPE_INT | CTLFLAG_MPSAFE | (access), \ | CTLTYPE_INT | CTLFLAG_MPSAFE | (access), \ | ||||
ptr, val, sysctl_handle_int, "I", descr); \ | ptr, val, sysctl_handle_int, "I", descr, label); \ | ||||
CTASSERT((((access) & CTLTYPE) == 0 || \ | CTASSERT((((access) & CTLTYPE) == 0 || \ | ||||
((access) & SYSCTL_CT_ASSERT_MASK) == CTLTYPE_INT) && \ | ((access) & SYSCTL_CT_ASSERT_MASK) == CTLTYPE_INT) && \ | ||||
sizeof(int) == sizeof(*(ptr))) | sizeof(int) == sizeof(*(ptr))) | ||||
#define SYSCTL_ADD_INT(ctx, parent, nbr, name, access, ptr, val, descr) \ | #define SYSCTL_ADD_INT(ctx, parent, nbr, name, access, ptr, val, descr) \ | ||||
({ \ | ({ \ | ||||
int *__ptr = (ptr); \ | int *__ptr = (ptr); \ | ||||
CTASSERT(((access) & CTLTYPE) == 0 || \ | CTASSERT(((access) & CTLTYPE) == 0 || \ | ||||
((access) & SYSCTL_CT_ASSERT_MASK) == CTLTYPE_INT); \ | ((access) & SYSCTL_CT_ASSERT_MASK) == CTLTYPE_INT); \ | ||||
sysctl_add_oid(ctx, parent, nbr, name, \ | sysctl_add_oid(ctx, parent, nbr, name, \ | ||||
CTLTYPE_INT | CTLFLAG_MPSAFE | (access), \ | CTLTYPE_INT | CTLFLAG_MPSAFE | (access), \ | ||||
__ptr, val, sysctl_handle_int, "I", __DESCR(descr)); \ | __ptr, val, sysctl_handle_int, "I", __DESCR(descr), NULL); \ | ||||
}) | }) | ||||
/* Oid for an unsigned int. If ptr is NULL, val is returned. */ | /* Oid for an unsigned int. If ptr is NULL, val is returned. */ | ||||
#define SYSCTL_NULL_UINT_PTR ((unsigned *)NULL) | #define SYSCTL_NULL_UINT_PTR ((unsigned *)NULL) | ||||
#define SYSCTL_UINT(parent, nbr, name, access, ptr, val, descr) \ | #define SYSCTL_UINT(parent, nbr, name, access, ptr, val, descr) \ | ||||
SYSCTL_OID(parent, nbr, name, \ | SYSCTL_OID(parent, nbr, name, \ | ||||
CTLTYPE_UINT | CTLFLAG_MPSAFE | (access), \ | CTLTYPE_UINT | CTLFLAG_MPSAFE | (access), \ | ||||
ptr, val, sysctl_handle_int, "IU", descr); \ | ptr, val, sysctl_handle_int, "IU", descr); \ | ||||
CTASSERT((((access) & CTLTYPE) == 0 || \ | CTASSERT((((access) & CTLTYPE) == 0 || \ | ||||
((access) & SYSCTL_CT_ASSERT_MASK) == CTLTYPE_UINT) && \ | ((access) & SYSCTL_CT_ASSERT_MASK) == CTLTYPE_UINT) && \ | ||||
sizeof(unsigned) == sizeof(*(ptr))) | sizeof(unsigned) == sizeof(*(ptr))) | ||||
#define SYSCTL_ADD_UINT(ctx, parent, nbr, name, access, ptr, val, descr) \ | #define SYSCTL_ADD_UINT(ctx, parent, nbr, name, access, ptr, val, descr) \ | ||||
({ \ | ({ \ | ||||
unsigned *__ptr = (ptr); \ | unsigned *__ptr = (ptr); \ | ||||
CTASSERT(((access) & CTLTYPE) == 0 || \ | CTASSERT(((access) & CTLTYPE) == 0 || \ | ||||
((access) & SYSCTL_CT_ASSERT_MASK) == CTLTYPE_UINT); \ | ((access) & SYSCTL_CT_ASSERT_MASK) == CTLTYPE_UINT); \ | ||||
sysctl_add_oid(ctx, parent, nbr, name, \ | sysctl_add_oid(ctx, parent, nbr, name, \ | ||||
CTLTYPE_UINT | CTLFLAG_MPSAFE | (access), \ | CTLTYPE_UINT | CTLFLAG_MPSAFE | (access), \ | ||||
__ptr, val, sysctl_handle_int, "IU", __DESCR(descr)); \ | __ptr, val, sysctl_handle_int, "IU", __DESCR(descr), NULL); \ | ||||
}) | }) | ||||
/* Oid for a long. The pointer must be non NULL. */ | /* Oid for a long. The pointer must be non NULL. */ | ||||
#define SYSCTL_NULL_LONG_PTR ((long *)NULL) | #define SYSCTL_NULL_LONG_PTR ((long *)NULL) | ||||
#define SYSCTL_LONG(parent, nbr, name, access, ptr, val, descr) \ | #define SYSCTL_LONG(parent, nbr, name, access, ptr, val, descr) \ | ||||
SYSCTL_OID(parent, nbr, name, \ | SYSCTL_OID(parent, nbr, name, \ | ||||
CTLTYPE_LONG | CTLFLAG_MPSAFE | (access), \ | CTLTYPE_LONG | CTLFLAG_MPSAFE | (access), \ | ||||
ptr, val, sysctl_handle_long, "L", descr); \ | ptr, val, sysctl_handle_long, "L", descr); \ | ||||
CTASSERT((((access) & CTLTYPE) == 0 || \ | CTASSERT((((access) & CTLTYPE) == 0 || \ | ||||
((access) & SYSCTL_CT_ASSERT_MASK) == CTLTYPE_LONG) && \ | ((access) & SYSCTL_CT_ASSERT_MASK) == CTLTYPE_LONG) && \ | ||||
sizeof(long) == sizeof(*(ptr))) | sizeof(long) == sizeof(*(ptr))) | ||||
#define SYSCTL_ADD_LONG(ctx, parent, nbr, name, access, ptr, descr) \ | #define SYSCTL_ADD_LONG(ctx, parent, nbr, name, access, ptr, descr) \ | ||||
({ \ | ({ \ | ||||
long *__ptr = (ptr); \ | long *__ptr = (ptr); \ | ||||
CTASSERT(((access) & CTLTYPE) == 0 || \ | CTASSERT(((access) & CTLTYPE) == 0 || \ | ||||
((access) & SYSCTL_CT_ASSERT_MASK) == CTLTYPE_LONG); \ | ((access) & SYSCTL_CT_ASSERT_MASK) == CTLTYPE_LONG); \ | ||||
sysctl_add_oid(ctx, parent, nbr, name, \ | sysctl_add_oid(ctx, parent, nbr, name, \ | ||||
CTLTYPE_LONG | CTLFLAG_MPSAFE | (access), \ | CTLTYPE_LONG | CTLFLAG_MPSAFE | (access), \ | ||||
__ptr, 0, sysctl_handle_long, "L", __DESCR(descr)); \ | __ptr, 0, sysctl_handle_long, "L", __DESCR(descr), NULL); \ | ||||
}) | }) | ||||
/* Oid for an unsigned long. The pointer must be non NULL. */ | /* Oid for an unsigned long. The pointer must be non NULL. */ | ||||
#define SYSCTL_NULL_ULONG_PTR ((unsigned long *)NULL) | #define SYSCTL_NULL_ULONG_PTR ((unsigned long *)NULL) | ||||
#define SYSCTL_ULONG(parent, nbr, name, access, ptr, val, descr) \ | #define SYSCTL_ULONG(parent, nbr, name, access, ptr, val, descr) \ | ||||
SYSCTL_OID(parent, nbr, name, \ | SYSCTL_OID(parent, nbr, name, \ | ||||
CTLTYPE_ULONG | CTLFLAG_MPSAFE | (access), \ | CTLTYPE_ULONG | CTLFLAG_MPSAFE | (access), \ | ||||
ptr, val, sysctl_handle_long, "LU", descr); \ | ptr, val, sysctl_handle_long, "LU", descr); \ | ||||
CTASSERT((((access) & CTLTYPE) == 0 || \ | CTASSERT((((access) & CTLTYPE) == 0 || \ | ||||
((access) & SYSCTL_CT_ASSERT_MASK) == CTLTYPE_ULONG) && \ | ((access) & SYSCTL_CT_ASSERT_MASK) == CTLTYPE_ULONG) && \ | ||||
sizeof(unsigned long) == sizeof(*(ptr))) | sizeof(unsigned long) == sizeof(*(ptr))) | ||||
#define SYSCTL_ADD_ULONG(ctx, parent, nbr, name, access, ptr, descr) \ | #define SYSCTL_ADD_ULONG(ctx, parent, nbr, name, access, ptr, descr) \ | ||||
({ \ | ({ \ | ||||
unsigned long *__ptr = (ptr); \ | unsigned long *__ptr = (ptr); \ | ||||
CTASSERT(((access) & CTLTYPE) == 0 || \ | CTASSERT(((access) & CTLTYPE) == 0 || \ | ||||
((access) & SYSCTL_CT_ASSERT_MASK) == CTLTYPE_ULONG); \ | ((access) & SYSCTL_CT_ASSERT_MASK) == CTLTYPE_ULONG); \ | ||||
sysctl_add_oid(ctx, parent, nbr, name, \ | sysctl_add_oid(ctx, parent, nbr, name, \ | ||||
CTLTYPE_ULONG | CTLFLAG_MPSAFE | (access), \ | CTLTYPE_ULONG | CTLFLAG_MPSAFE | (access), \ | ||||
__ptr, 0, sysctl_handle_long, "LU", __DESCR(descr)); \ | __ptr, 0, sysctl_handle_long, "LU", __DESCR(descr), NULL); \ | ||||
}) | }) | ||||
/* Oid for a quad. The pointer must be non NULL. */ | /* Oid for a quad. The pointer must be non NULL. */ | ||||
#define SYSCTL_NULL_QUAD_PTR ((int64_t *)NULL) | #define SYSCTL_NULL_QUAD_PTR ((int64_t *)NULL) | ||||
#define SYSCTL_QUAD(parent, nbr, name, access, ptr, val, descr) \ | #define SYSCTL_QUAD(parent, nbr, name, access, ptr, val, descr) \ | ||||
SYSCTL_OID(parent, nbr, name, \ | SYSCTL_OID(parent, nbr, name, \ | ||||
CTLTYPE_S64 | CTLFLAG_MPSAFE | (access), \ | CTLTYPE_S64 | CTLFLAG_MPSAFE | (access), \ | ||||
ptr, val, sysctl_handle_64, "Q", descr); \ | ptr, val, sysctl_handle_64, "Q", descr); \ | ||||
CTASSERT((((access) & CTLTYPE) == 0 || \ | CTASSERT((((access) & CTLTYPE) == 0 || \ | ||||
((access) & SYSCTL_CT_ASSERT_MASK) == CTLTYPE_S64) && \ | ((access) & SYSCTL_CT_ASSERT_MASK) == CTLTYPE_S64) && \ | ||||
sizeof(int64_t) == sizeof(*(ptr))) | sizeof(int64_t) == sizeof(*(ptr))) | ||||
#define SYSCTL_ADD_QUAD(ctx, parent, nbr, name, access, ptr, descr) \ | #define SYSCTL_ADD_QUAD(ctx, parent, nbr, name, access, ptr, descr) \ | ||||
({ \ | ({ \ | ||||
int64_t *__ptr = (ptr); \ | int64_t *__ptr = (ptr); \ | ||||
CTASSERT(((access) & CTLTYPE) == 0 || \ | CTASSERT(((access) & CTLTYPE) == 0 || \ | ||||
((access) & SYSCTL_CT_ASSERT_MASK) == CTLTYPE_S64); \ | ((access) & SYSCTL_CT_ASSERT_MASK) == CTLTYPE_S64); \ | ||||
sysctl_add_oid(ctx, parent, nbr, name, \ | sysctl_add_oid(ctx, parent, nbr, name, \ | ||||
CTLTYPE_S64 | CTLFLAG_MPSAFE | (access), \ | CTLTYPE_S64 | CTLFLAG_MPSAFE | (access), \ | ||||
__ptr, 0, sysctl_handle_64, "Q", __DESCR(descr)); \ | __ptr, 0, sysctl_handle_64, "Q", __DESCR(descr), NULL); \ | ||||
}) | }) | ||||
#define SYSCTL_NULL_UQUAD_PTR ((uint64_t *)NULL) | #define SYSCTL_NULL_UQUAD_PTR ((uint64_t *)NULL) | ||||
#define SYSCTL_UQUAD(parent, nbr, name, access, ptr, val, descr) \ | #define SYSCTL_UQUAD(parent, nbr, name, access, ptr, val, descr) \ | ||||
SYSCTL_OID(parent, nbr, name, \ | SYSCTL_OID(parent, nbr, name, \ | ||||
CTLTYPE_U64 | CTLFLAG_MPSAFE | (access), \ | CTLTYPE_U64 | CTLFLAG_MPSAFE | (access), \ | ||||
ptr, val, sysctl_handle_64, "QU", descr); \ | ptr, val, sysctl_handle_64, "QU", descr); \ | ||||
CTASSERT((((access) & CTLTYPE) == 0 || \ | CTASSERT((((access) & CTLTYPE) == 0 || \ | ||||
((access) & SYSCTL_CT_ASSERT_MASK) == CTLTYPE_U64) && \ | ((access) & SYSCTL_CT_ASSERT_MASK) == CTLTYPE_U64) && \ | ||||
sizeof(uint64_t) == sizeof(*(ptr))) | sizeof(uint64_t) == sizeof(*(ptr))) | ||||
#define SYSCTL_ADD_UQUAD(ctx, parent, nbr, name, access, ptr, descr) \ | #define SYSCTL_ADD_UQUAD(ctx, parent, nbr, name, access, ptr, descr) \ | ||||
({ \ | ({ \ | ||||
uint64_t *__ptr = (ptr); \ | uint64_t *__ptr = (ptr); \ | ||||
CTASSERT(((access) & CTLTYPE) == 0 || \ | CTASSERT(((access) & CTLTYPE) == 0 || \ | ||||
((access) & SYSCTL_CT_ASSERT_MASK) == CTLTYPE_U64); \ | ((access) & SYSCTL_CT_ASSERT_MASK) == CTLTYPE_U64); \ | ||||
sysctl_add_oid(ctx, parent, nbr, name, \ | sysctl_add_oid(ctx, parent, nbr, name, \ | ||||
CTLTYPE_U64 | CTLFLAG_MPSAFE | (access), \ | CTLTYPE_U64 | CTLFLAG_MPSAFE | (access), \ | ||||
__ptr, 0, sysctl_handle_64, "QU", __DESCR(descr)); \ | __ptr, 0, sysctl_handle_64, "QU", __DESCR(descr), NULL); \ | ||||
}) | }) | ||||
/* Oid for a CPU dependent variable */ | /* Oid for a CPU dependent variable */ | ||||
#define SYSCTL_ADD_UAUTO(ctx, parent, nbr, name, access, ptr, descr) \ | #define SYSCTL_ADD_UAUTO(ctx, parent, nbr, name, access, ptr, descr) \ | ||||
({ \ | ({ \ | ||||
struct sysctl_oid *__ret; \ | struct sysctl_oid *__ret; \ | ||||
CTASSERT((sizeof(uint64_t) == sizeof(*(ptr)) || \ | CTASSERT((sizeof(uint64_t) == sizeof(*(ptr)) || \ | ||||
sizeof(unsigned) == sizeof(*(ptr))) && \ | sizeof(unsigned) == sizeof(*(ptr))) && \ | ||||
((access) & CTLTYPE) == 0); \ | ((access) & CTLTYPE) == 0); \ | ||||
if (sizeof(uint64_t) == sizeof(*(ptr))) { \ | if (sizeof(uint64_t) == sizeof(*(ptr))) { \ | ||||
__ret = sysctl_add_oid(ctx, parent, nbr, name, \ | __ret = sysctl_add_oid(ctx, parent, nbr, name, \ | ||||
CTLTYPE_U64 | CTLFLAG_MPSAFE | (access), \ | CTLTYPE_U64 | CTLFLAG_MPSAFE | (access), \ | ||||
(ptr), 0, sysctl_handle_64, "QU", \ | (ptr), 0, sysctl_handle_64, "QU", \ | ||||
__DESCR(descr)); \ | __DESCR(descr), NULL); \ | ||||
} else { \ | } else { \ | ||||
__ret = sysctl_add_oid(ctx, parent, nbr, name, \ | __ret = sysctl_add_oid(ctx, parent, nbr, name, \ | ||||
CTLTYPE_UINT | CTLFLAG_MPSAFE | (access), \ | CTLTYPE_UINT | CTLFLAG_MPSAFE | (access), \ | ||||
(ptr), 0, sysctl_handle_int, "IU", \ | (ptr), 0, sysctl_handle_int, "IU", \ | ||||
__DESCR(descr)); \ | __DESCR(descr), NULL); \ | ||||
} \ | } \ | ||||
__ret; \ | __ret; \ | ||||
}) | }) | ||||
/* Oid for a 64-bit unsigned counter(9). The pointer must be non NULL. */ | /* Oid for a 64-bit unsigned counter(9). The pointer must be non NULL. */ | ||||
#define SYSCTL_COUNTER_U64(parent, nbr, name, access, ptr, descr) \ | #define SYSCTL_COUNTER_U64(parent, nbr, name, access, ptr, descr) \ | ||||
SYSCTL_OID(parent, nbr, name, \ | SYSCTL_OID(parent, nbr, name, \ | ||||
CTLTYPE_U64 | CTLFLAG_MPSAFE | (access), \ | CTLTYPE_U64 | CTLFLAG_MPSAFE | (access), \ | ||||
(ptr), 0, sysctl_handle_counter_u64, "QU", descr); \ | (ptr), 0, sysctl_handle_counter_u64, "QU", descr); \ | ||||
CTASSERT((((access) & CTLTYPE) == 0 || \ | CTASSERT((((access) & CTLTYPE) == 0 || \ | ||||
((access) & SYSCTL_CT_ASSERT_MASK) == CTLTYPE_U64) && \ | ((access) & SYSCTL_CT_ASSERT_MASK) == CTLTYPE_U64) && \ | ||||
sizeof(counter_u64_t) == sizeof(*(ptr)) && \ | sizeof(counter_u64_t) == sizeof(*(ptr)) && \ | ||||
sizeof(uint64_t) == sizeof(**(ptr))) | sizeof(uint64_t) == sizeof(**(ptr))) | ||||
#define SYSCTL_ADD_COUNTER_U64(ctx, parent, nbr, name, access, ptr, descr) \ | #define SYSCTL_ADD_COUNTER_U64(ctx, parent, nbr, name, access, ptr, descr) \ | ||||
({ \ | ({ \ | ||||
counter_u64_t *__ptr = (ptr); \ | counter_u64_t *__ptr = (ptr); \ | ||||
CTASSERT(((access) & CTLTYPE) == 0 || \ | CTASSERT(((access) & CTLTYPE) == 0 || \ | ||||
((access) & SYSCTL_CT_ASSERT_MASK) == CTLTYPE_U64); \ | ((access) & SYSCTL_CT_ASSERT_MASK) == CTLTYPE_U64); \ | ||||
sysctl_add_oid(ctx, parent, nbr, name, \ | sysctl_add_oid(ctx, parent, nbr, name, \ | ||||
CTLTYPE_U64 | CTLFLAG_MPSAFE | (access), \ | CTLTYPE_U64 | CTLFLAG_MPSAFE | (access), \ | ||||
__ptr, 0, sysctl_handle_counter_u64, "QU", __DESCR(descr)); \ | __ptr, 0, sysctl_handle_counter_u64, "QU", __DESCR(descr), \ | ||||
NULL); \ | |||||
}) | }) | ||||
/* Oid for an array of counter(9)s. The pointer and length must be non zero. */ | /* Oid for an array of counter(9)s. The pointer and length must be non zero. */ | ||||
#define SYSCTL_COUNTER_U64_ARRAY(parent, nbr, name, access, ptr, len, descr) \ | #define SYSCTL_COUNTER_U64_ARRAY(parent, nbr, name, access, ptr, len, descr) \ | ||||
SYSCTL_OID(parent, nbr, name, \ | SYSCTL_OID(parent, nbr, name, \ | ||||
CTLTYPE_OPAQUE | CTLFLAG_MPSAFE | (access), \ | CTLTYPE_OPAQUE | CTLFLAG_MPSAFE | (access), \ | ||||
(ptr), (len), sysctl_handle_counter_u64_array, "S", descr); \ | (ptr), (len), sysctl_handle_counter_u64_array, "S", descr); \ | ||||
CTASSERT((((access) & CTLTYPE) == 0 || \ | CTASSERT((((access) & CTLTYPE) == 0 || \ | ||||
((access) & SYSCTL_CT_ASSERT_MASK) == CTLTYPE_OPAQUE) && \ | ((access) & SYSCTL_CT_ASSERT_MASK) == CTLTYPE_OPAQUE) && \ | ||||
sizeof(counter_u64_t) == sizeof(*(ptr)) && \ | sizeof(counter_u64_t) == sizeof(*(ptr)) && \ | ||||
sizeof(uint64_t) == sizeof(**(ptr))) | sizeof(uint64_t) == sizeof(**(ptr))) | ||||
#define SYSCTL_ADD_COUNTER_U64_ARRAY(ctx, parent, nbr, name, access, \ | #define SYSCTL_ADD_COUNTER_U64_ARRAY(ctx, parent, nbr, name, access, \ | ||||
ptr, len, descr) \ | ptr, len, descr) \ | ||||
({ \ | ({ \ | ||||
counter_u64_t *__ptr = (ptr); \ | counter_u64_t *__ptr = (ptr); \ | ||||
CTASSERT(((access) & CTLTYPE) == 0 || \ | CTASSERT(((access) & CTLTYPE) == 0 || \ | ||||
((access) & SYSCTL_CT_ASSERT_MASK) == CTLTYPE_OPAQUE); \ | ((access) & SYSCTL_CT_ASSERT_MASK) == CTLTYPE_OPAQUE); \ | ||||
sysctl_add_oid(ctx, parent, nbr, name, \ | sysctl_add_oid(ctx, parent, nbr, name, \ | ||||
CTLTYPE_OPAQUE | CTLFLAG_MPSAFE | (access), \ | CTLTYPE_OPAQUE | CTLFLAG_MPSAFE | (access), \ | ||||
__ptr, len, sysctl_handle_counter_u64_array, "S", \ | __ptr, len, sysctl_handle_counter_u64_array, "S", \ | ||||
__DESCR(descr)); \ | __DESCR(descr), NULL); \ | ||||
}) | }) | ||||
/* Oid for an opaque object. Specified by a pointer and a length. */ | /* Oid for an opaque object. Specified by a pointer and a length. */ | ||||
#define SYSCTL_OPAQUE(parent, nbr, name, access, ptr, len, fmt, descr) \ | #define SYSCTL_OPAQUE(parent, nbr, name, access, ptr, len, fmt, descr) \ | ||||
SYSCTL_OID(parent, nbr, name, CTLTYPE_OPAQUE|(access), \ | SYSCTL_OID(parent, nbr, name, CTLTYPE_OPAQUE|(access), \ | ||||
ptr, len, sysctl_handle_opaque, fmt, descr); \ | ptr, len, sysctl_handle_opaque, fmt, descr); \ | ||||
CTASSERT(((access) & CTLTYPE) == 0 || \ | CTASSERT(((access) & CTLTYPE) == 0 || \ | ||||
((access) & SYSCTL_CT_ASSERT_MASK) == CTLTYPE_OPAQUE) | ((access) & SYSCTL_CT_ASSERT_MASK) == CTLTYPE_OPAQUE) | ||||
#define SYSCTL_ADD_OPAQUE(ctx, parent, nbr, name, access, ptr, len, fmt, descr) \ | #define SYSCTL_ADD_OPAQUE(ctx, parent, nbr, name, access, ptr, len, fmt, descr) \ | ||||
({ \ | ({ \ | ||||
CTASSERT(((access) & CTLTYPE) == 0 || \ | CTASSERT(((access) & CTLTYPE) == 0 || \ | ||||
((access) & SYSCTL_CT_ASSERT_MASK) == CTLTYPE_OPAQUE); \ | ((access) & SYSCTL_CT_ASSERT_MASK) == CTLTYPE_OPAQUE); \ | ||||
sysctl_add_oid(ctx, parent, nbr, name, CTLTYPE_OPAQUE|(access), \ | sysctl_add_oid(ctx, parent, nbr, name, CTLTYPE_OPAQUE|(access), \ | ||||
ptr, len, sysctl_handle_opaque, fmt, __DESCR(descr)); \ | ptr, len, sysctl_handle_opaque, fmt, __DESCR(descr), NULL); \ | ||||
}) | }) | ||||
/* Oid for a struct. Specified by a pointer and a type. */ | /* Oid for a struct. Specified by a pointer and a type. */ | ||||
#define SYSCTL_STRUCT(parent, nbr, name, access, ptr, type, descr) \ | #define SYSCTL_STRUCT(parent, nbr, name, access, ptr, type, descr) \ | ||||
SYSCTL_OID(parent, nbr, name, CTLTYPE_OPAQUE|(access), \ | SYSCTL_OID(parent, nbr, name, CTLTYPE_OPAQUE|(access), \ | ||||
ptr, sizeof(struct type), sysctl_handle_opaque, \ | ptr, sizeof(struct type), sysctl_handle_opaque, \ | ||||
"S," #type, descr); \ | "S," #type, descr); \ | ||||
CTASSERT(((access) & CTLTYPE) == 0 || \ | CTASSERT(((access) & CTLTYPE) == 0 || \ | ||||
((access) & SYSCTL_CT_ASSERT_MASK) == CTLTYPE_OPAQUE) | ((access) & SYSCTL_CT_ASSERT_MASK) == CTLTYPE_OPAQUE) | ||||
#define SYSCTL_ADD_STRUCT(ctx, parent, nbr, name, access, ptr, type, descr) \ | #define SYSCTL_ADD_STRUCT(ctx, parent, nbr, name, access, ptr, type, descr) \ | ||||
({ \ | ({ \ | ||||
CTASSERT(((access) & CTLTYPE) == 0 || \ | CTASSERT(((access) & CTLTYPE) == 0 || \ | ||||
((access) & SYSCTL_CT_ASSERT_MASK) == CTLTYPE_OPAQUE); \ | ((access) & SYSCTL_CT_ASSERT_MASK) == CTLTYPE_OPAQUE); \ | ||||
sysctl_add_oid(ctx, parent, nbr, name, CTLTYPE_OPAQUE|(access), \ | sysctl_add_oid(ctx, parent, nbr, name, CTLTYPE_OPAQUE|(access), \ | ||||
(ptr), sizeof(struct type), \ | (ptr), sizeof(struct type), \ | ||||
sysctl_handle_opaque, "S," #type, __DESCR(descr)); \ | sysctl_handle_opaque, "S," #type, __DESCR(descr), NULL); \ | ||||
}) | }) | ||||
/* Oid for a procedure. Specified by a pointer and an arg. */ | /* Oid for a procedure. Specified by a pointer and an arg. */ | ||||
#define SYSCTL_PROC(parent, nbr, name, access, ptr, arg, handler, fmt, descr) \ | #define SYSCTL_PROC(parent, nbr, name, access, ptr, arg, handler, fmt, descr) \ | ||||
SYSCTL_OID(parent, nbr, name, (access), \ | SYSCTL_OID(parent, nbr, name, (access), \ | ||||
ptr, arg, handler, fmt, descr); \ | ptr, arg, handler, fmt, descr); \ | ||||
CTASSERT(((access) & CTLTYPE) != 0) | CTASSERT(((access) & CTLTYPE) != 0) | ||||
#define SYSCTL_ADD_PROC(ctx, parent, nbr, name, access, ptr, arg, handler, fmt, descr) \ | #define SYSCTL_ADD_PROC(ctx, parent, nbr, name, access, ptr, arg, handler, fmt, descr) \ | ||||
({ \ | ({ \ | ||||
CTASSERT(((access) & CTLTYPE) != 0); \ | CTASSERT(((access) & CTLTYPE) != 0); \ | ||||
sysctl_add_oid(ctx, parent, nbr, name, (access), \ | sysctl_add_oid(ctx, parent, nbr, name, (access), \ | ||||
(ptr), (arg), (handler), (fmt), __DESCR(descr)); \ | (ptr), (arg), (handler), (fmt), __DESCR(descr), NULL); \ | ||||
}) | }) | ||||
/* Oid to handle limits on uma(9) zone specified by pointer. */ | /* Oid to handle limits on uma(9) zone specified by pointer. */ | ||||
#define SYSCTL_UMA_MAX(parent, nbr, name, access, ptr, descr) \ | #define SYSCTL_UMA_MAX(parent, nbr, name, access, ptr, descr) \ | ||||
SYSCTL_OID(parent, nbr, name, \ | SYSCTL_OID(parent, nbr, name, \ | ||||
CTLTYPE_INT | CTLFLAG_MPSAFE | (access), \ | CTLTYPE_INT | CTLFLAG_MPSAFE | (access), \ | ||||
(ptr), 0, sysctl_handle_uma_zone_max, "I", descr); \ | (ptr), 0, sysctl_handle_uma_zone_max, "I", descr); \ | ||||
CTASSERT(((access) & CTLTYPE) == 0 || \ | CTASSERT(((access) & CTLTYPE) == 0 || \ | ||||
((access) & SYSCTL_CT_ASSERT_MASK) == CTLTYPE_INT) | ((access) & SYSCTL_CT_ASSERT_MASK) == CTLTYPE_INT) | ||||
#define SYSCTL_ADD_UMA_MAX(ctx, parent, nbr, name, access, ptr, descr) \ | #define SYSCTL_ADD_UMA_MAX(ctx, parent, nbr, name, access, ptr, descr) \ | ||||
({ \ | ({ \ | ||||
uma_zone_t __ptr = (ptr); \ | uma_zone_t __ptr = (ptr); \ | ||||
CTASSERT(((access) & CTLTYPE) == 0 || \ | CTASSERT(((access) & CTLTYPE) == 0 || \ | ||||
((access) & SYSCTL_CT_ASSERT_MASK) == CTLTYPE_INT); \ | ((access) & SYSCTL_CT_ASSERT_MASK) == CTLTYPE_INT); \ | ||||
sysctl_add_oid(ctx, parent, nbr, name, \ | sysctl_add_oid(ctx, parent, nbr, name, \ | ||||
CTLTYPE_INT | CTLFLAG_MPSAFE | (access), \ | CTLTYPE_INT | CTLFLAG_MPSAFE | (access), \ | ||||
__ptr, 0, sysctl_handle_uma_zone_max, "I", __DESCR(descr)); \ | __ptr, 0, sysctl_handle_uma_zone_max, "I", __DESCR(descr), \ | ||||
NULL); \ | |||||
}) | }) | ||||
/* Oid to obtain current use of uma(9) zone specified by pointer. */ | /* Oid to obtain current use of uma(9) zone specified by pointer. */ | ||||
#define SYSCTL_UMA_CUR(parent, nbr, name, access, ptr, descr) \ | #define SYSCTL_UMA_CUR(parent, nbr, name, access, ptr, descr) \ | ||||
SYSCTL_OID(parent, nbr, name, \ | SYSCTL_OID(parent, nbr, name, \ | ||||
CTLTYPE_INT | CTLFLAG_MPSAFE | CTLFLAG_RD | (access), \ | CTLTYPE_INT | CTLFLAG_MPSAFE | CTLFLAG_RD | (access), \ | ||||
(ptr), 0, sysctl_handle_uma_zone_cur, "I", descr); \ | (ptr), 0, sysctl_handle_uma_zone_cur, "I", descr); \ | ||||
CTASSERT(((access) & CTLTYPE) == 0 || \ | CTASSERT(((access) & CTLTYPE) == 0 || \ | ||||
((access) & SYSCTL_CT_ASSERT_MASK) == CTLTYPE_INT) | ((access) & SYSCTL_CT_ASSERT_MASK) == CTLTYPE_INT) | ||||
#define SYSCTL_ADD_UMA_CUR(ctx, parent, nbr, name, access, ptr, descr) \ | #define SYSCTL_ADD_UMA_CUR(ctx, parent, nbr, name, access, ptr, descr) \ | ||||
({ \ | ({ \ | ||||
uma_zone_t __ptr = (ptr); \ | uma_zone_t __ptr = (ptr); \ | ||||
CTASSERT(((access) & CTLTYPE) == 0 || \ | CTASSERT(((access) & CTLTYPE) == 0 || \ | ||||
((access) & SYSCTL_CT_ASSERT_MASK) == CTLTYPE_INT); \ | ((access) & SYSCTL_CT_ASSERT_MASK) == CTLTYPE_INT); \ | ||||
sysctl_add_oid(ctx, parent, nbr, name, \ | sysctl_add_oid(ctx, parent, nbr, name, \ | ||||
CTLTYPE_INT | CTLFLAG_MPSAFE | CTLFLAG_RD | (access), \ | CTLTYPE_INT | CTLFLAG_MPSAFE | CTLFLAG_RD | (access), \ | ||||
__ptr, 0, sysctl_handle_uma_zone_cur, "I", __DESCR(descr)); \ | __ptr, 0, sysctl_handle_uma_zone_cur, "I", __DESCR(descr), \ | ||||
NULL); \ | |||||
}) | }) | ||||
/* | /* | ||||
* A macro to generate a read-only sysctl to indicate the presence of optional | * A macro to generate a read-only sysctl to indicate the presence of optional | ||||
* kernel features. | * kernel features. | ||||
*/ | */ | ||||
#define FEATURE(name, desc) \ | #define FEATURE(name, desc) \ | ||||
SYSCTL_INT(_kern_features, OID_AUTO, name, CTLFLAG_RD | CTLFLAG_CAPRD, \ | SYSCTL_INT_WITH_LABEL(_kern_features, OID_AUTO, name, \ | ||||
SYSCTL_NULL_INT_PTR, 1, desc) | CTLFLAG_RD | CTLFLAG_CAPRD, SYSCTL_NULL_INT_PTR, 1, desc, "feature") | ||||
#endif /* _KERNEL */ | #endif /* _KERNEL */ | ||||
/* | /* | ||||
* Top-level identifiers | * Top-level identifiers | ||||
*/ | */ | ||||
#define CTL_UNSPEC 0 /* unused */ | #define CTL_UNSPEC 0 /* unused */ | ||||
#define CTL_KERN 1 /* "high kernel": proc, limits */ | #define CTL_KERN 1 /* "high kernel": proc, limits */ | ||||
▲ Show 20 Lines • Show All 199 Lines • ▼ Show 20 Lines | |||||
extern char osrelease[]; | extern char osrelease[]; | ||||
extern char ostype[]; | extern char ostype[]; | ||||
extern char kern_ident[]; | extern char kern_ident[]; | ||||
/* Dynamic oid handling */ | /* Dynamic oid handling */ | ||||
struct sysctl_oid *sysctl_add_oid(struct sysctl_ctx_list *clist, | struct sysctl_oid *sysctl_add_oid(struct sysctl_ctx_list *clist, | ||||
struct sysctl_oid_list *parent, int nbr, const char *name, int kind, | struct sysctl_oid_list *parent, int nbr, const char *name, int kind, | ||||
void *arg1, intmax_t arg2, int (*handler)(SYSCTL_HANDLER_ARGS), | void *arg1, intmax_t arg2, int (*handler)(SYSCTL_HANDLER_ARGS), | ||||
const char *fmt, const char *descr); | const char *fmt, const char *descr, const char *label); | ||||
int sysctl_remove_name(struct sysctl_oid *parent, const char *name, int del, | int sysctl_remove_name(struct sysctl_oid *parent, const char *name, int del, | ||||
int recurse); | int recurse); | ||||
void sysctl_rename_oid(struct sysctl_oid *oidp, const char *name); | void sysctl_rename_oid(struct sysctl_oid *oidp, const char *name); | ||||
int sysctl_move_oid(struct sysctl_oid *oidp, | int sysctl_move_oid(struct sysctl_oid *oidp, | ||||
struct sysctl_oid_list *parent); | struct sysctl_oid_list *parent); | ||||
int sysctl_remove_oid(struct sysctl_oid *oidp, int del, int recurse); | int sysctl_remove_oid(struct sysctl_oid *oidp, int del, int recurse); | ||||
int sysctl_ctx_init(struct sysctl_ctx_list *clist); | int sysctl_ctx_init(struct sysctl_ctx_list *clist); | ||||
int sysctl_ctx_free(struct sysctl_ctx_list *clist); | int sysctl_ctx_free(struct sysctl_ctx_list *clist); | ||||
Show All 36 Lines |
Doesn't the #define for SYSCTL_OID_WITH_LABEL need to come before its use in the #define for SYSCTL_OID?