#ifndef _SYS_KSTAT_H_
#define _SYS_KSTAT_H_
#include <sys/ioccom.h>
#define KSTAT_STRLEN 32
#define KSTAT_T_RAW 0
#define KSTAT_T_KV 1
#define KSTAT_T_COUNTERS 2
struct kstat_req {
unsigned int ks_rflags;
#define KSTATIOC_F_IGNVER (1 << 0)
unsigned int ks_version;
uint64_t ks_id;
char ks_provider[KSTAT_STRLEN];
unsigned int ks_instance;
char ks_name[KSTAT_STRLEN];
unsigned int ks_unit;
struct timespec ks_created;
struct timespec ks_updated;
struct timespec ks_interval;
unsigned int ks_type;
unsigned int ks_state;
void *ks_data;
size_t ks_datalen;
unsigned int ks_dataver;
};
#define KSTATIOC_VERSION _IOR('k', 1, unsigned int)
#define KSTATIOC_FIND_ID _IOWR('k', 2, struct kstat_req)
#define KSTATIOC_NFIND_ID _IOWR('k', 3, struct kstat_req)
#define KSTATIOC_FIND_PROVIDER _IOWR('k', 4, struct kstat_req)
#define KSTATIOC_NFIND_PROVIDER _IOWR('k', 5, struct kstat_req)
#define KSTATIOC_FIND_NAME _IOWR('k', 6, struct kstat_req)
#define KSTATIOC_NFIND_NAME _IOWR('k', 7, struct kstat_req)
#define KSTAT_KV_NAMELEN 16
#define KSTAT_KV_ALIGN sizeof(uint64_t)
enum kstat_kv_type {
KSTAT_KV_T_NULL,
KSTAT_KV_T_BOOL,
KSTAT_KV_T_COUNTER64,
KSTAT_KV_T_COUNTER32,
KSTAT_KV_T_UINT64,
KSTAT_KV_T_INT64,
KSTAT_KV_T_UINT32,
KSTAT_KV_T_INT32,
KSTAT_KV_T_ISTR,
KSTAT_KV_T_STR,
KSTAT_KV_T_BYTES,
KSTAT_KV_T_TEMP,
KSTAT_KV_T_COUNTER16,
KSTAT_KV_T_UINT16,
KSTAT_KV_T_INT16,
KSTAT_KV_T_FREQ,
KSTAT_KV_T_VOLTS_DC,
KSTAT_KV_T_VOLTS_AC,
KSTAT_KV_T_AMPS,
KSTAT_KV_T_WATTS,
};
enum kstat_kv_unit {
KSTAT_KV_U_NONE = 0,
KSTAT_KV_U_PACKETS,
KSTAT_KV_U_BYTES,
KSTAT_KV_U_CYCLES,
};
struct kstat_kv {
char kv_key[KSTAT_KV_NAMELEN];
union {
char v_istr[16];
unsigned int v_bool;
uint64_t v_u64;
int64_t v_s64;
uint32_t v_u32;
int32_t v_s32;
uint16_t v_u16;
int16_t v_s16;
size_t v_len;
} kv_v;
enum kstat_kv_type kv_type;
enum kstat_kv_unit kv_unit;
} __aligned(KSTAT_KV_ALIGN);
#define kstat_kv_istr(_kv) (_kv)->kv_v.v_istr
#define kstat_kv_bool(_kv) (_kv)->kv_v.v_bool
#define kstat_kv_u64(_kv) (_kv)->kv_v.v_u64
#define kstat_kv_s64(_kv) (_kv)->kv_v.v_s64
#define kstat_kv_u32(_kv) (_kv)->kv_v.v_u32
#define kstat_kv_s32(_kv) (_kv)->kv_v.v_s32
#define kstat_kv_u16(_kv) (_kv)->kv_v.v_u16
#define kstat_kv_s16(_kv) (_kv)->kv_v.v_s16
#define kstat_kv_len(_kv) (_kv)->kv_v.v_len
#define kstat_kv_temp(_kv) (_kv)->kv_v.v_u64
#define kstat_kv_freq(_kv) (_kv)->kv_v.v_u64
#define kstat_kv_volts(_kv) (_kv)->kv_v.v_u64
#define kstat_kv_amps(_kv) (_kv)->kv_v.v_u64
#define kstat_kv_watts(_kv) (_kv)->kv_v.v_u64
#ifdef _KERNEL
#include <sys/tree.h>
struct kstat_lock_ops;
struct rwlock;
struct kstat {
uint64_t ks_id;
const char *ks_provider;
unsigned int ks_instance;
const char *ks_name;
unsigned int ks_unit;
unsigned int ks_type;
unsigned int ks_flags;
#define KSTAT_F_REALLOC (1 << 0)
unsigned int ks_state;
#define KSTAT_S_CREATED 0
#define KSTAT_S_INSTALLED 1
struct timespec ks_created;
RBT_ENTRY(kstat) ks_id_entry;
RBT_ENTRY(kstat) ks_pv_entry;
RBT_ENTRY(kstat) ks_nm_entry;
unsigned int ks_dataver;
void *ks_softc;
void *ks_ptr;
int (*ks_read)(struct kstat *);
int (*ks_copy)(struct kstat *, void *);
const struct kstat_lock_ops *
ks_lock_ops;
void *ks_lock;
void *ks_data;
size_t ks_datalen;
struct timespec ks_updated;
struct timespec ks_interval;
};
struct kstat *kstat_create(const char *, unsigned int,
const char *, unsigned int,
unsigned int, unsigned int);
void kstat_set_rlock(struct kstat *, struct rwlock *);
void kstat_set_wlock(struct kstat *, struct rwlock *);
void kstat_set_mutex(struct kstat *, struct mutex *);
void kstat_set_cpu(struct kstat *, struct cpu_info *);
int kstat_read_nop(struct kstat *);
void kstat_install(struct kstat *);
void kstat_remove(struct kstat *);
void kstat_destroy(struct kstat *);
#define KSTAT_KV_UNIT_INITIALIZER(_key, _type, _unit) { \
.kv_key = (_key), \
.kv_type = (_type), \
.kv_unit = (_unit), \
}
#define KSTAT_KV_INITIALIZER(_key, _type) \
KSTAT_KV_UNIT_INITIALIZER((_key), (_type), KSTAT_KV_U_NONE)
void kstat_kv_init(struct kstat_kv *, const char *, enum kstat_kv_type);
void kstat_kv_unit_init(struct kstat_kv *, const char *,
enum kstat_kv_type, enum kstat_kv_unit);
#endif
#endif