Changeset View
Changeset View
Standalone View
Standalone View
head/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) \ | |||||
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), \ | ||||
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) \ | |||||
({ \ | ({ \ | ||||
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(_kern_features, OID_AUTO, name, CTLFLAG_RD | CTLFLAG_CAPRD, \ | ||||
▲ Show 20 Lines • Show All 208 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 |