220 lines
6.4 KiB
C
220 lines
6.4 KiB
C
|
/*
|
||
|
* Copyright (C) 2008-2015 Apple Inc. All rights reserved.
|
||
|
*
|
||
|
* This document is the property of Apple Inc.
|
||
|
* It is considered confidential and proprietary.
|
||
|
*
|
||
|
* This document may not be reproduced or transmitted in any form,
|
||
|
* in whole or in part, without the express written permission of
|
||
|
* Apple Inc.
|
||
|
*/
|
||
|
|
||
|
#ifndef _MIB_H
|
||
|
#define _MIB_H
|
||
|
|
||
|
#include <stdbool.h>
|
||
|
#include <lib/mib/mib_nodes.h>
|
||
|
#include <sys/linker_set.h>
|
||
|
#include <sys/types.h>
|
||
|
|
||
|
/*
|
||
|
* Standard MIB application/product definitions.
|
||
|
*/
|
||
|
#define MIB_APP_PROD_UNKNOWN (0)
|
||
|
#define MIB_APP_PROD_SECUREROM (1)
|
||
|
#define MIB_APP_PROD_IBSS (2)
|
||
|
#define MIB_APP_PROD_IBEC (3)
|
||
|
#define MIB_APP_PROD_IBOOT (4)
|
||
|
#define MIB_APP_PROD_LLB (5)
|
||
|
#define MIB_APP_PROD_EMBEDDEDIOP (8)
|
||
|
|
||
|
__BEGIN_DECLS
|
||
|
|
||
|
#define OID_SUBSYSTEM(_o) ((_o)>>24)
|
||
|
#define OID_NODE(_o) (((_o)>>16)&0xff)
|
||
|
|
||
|
#define OID_SUBSYSTEM_MASK (0xff<<24)
|
||
|
#define OID_NODE_MASK (0xff<<16)
|
||
|
|
||
|
typedef void (* mib_func_t)(uint32_t oid, void *arg, void *value);
|
||
|
|
||
|
struct mib_func_spec {
|
||
|
mib_func_t func;
|
||
|
void *arg;
|
||
|
};
|
||
|
|
||
|
union mib_value {
|
||
|
uint32_t v32;
|
||
|
uint64_t v64;
|
||
|
bool v_bool;
|
||
|
void *v_ptr;
|
||
|
struct mib_func_spec v_func;
|
||
|
};
|
||
|
|
||
|
struct mib_node {
|
||
|
uint32_t node_oid;
|
||
|
uint32_t node_type;
|
||
|
union mib_value node_data;
|
||
|
};
|
||
|
|
||
|
/* node data types */
|
||
|
#define kOIDTypeUInt32 (0x00<<16) /* node data is uint32_t */
|
||
|
#define kOIDTypeInt32 (0x01<<16) /* node data is int32_t */
|
||
|
#define kOIDTypeUInt64 (0x02<<16) /* node data is uint64_t */
|
||
|
#define kOIDTypeInt64 (0x03<<16) /* node data is int64_t */
|
||
|
#if defined(__LP64__)
|
||
|
#define kOIDTypeAddr kOIDTypeUInt64 /* node data is uint64_t */
|
||
|
#define kOIDTypeSize kOIDTypeUInt64 /* node data is uint64_t */
|
||
|
#else
|
||
|
#define kOIDTypeAddr kOIDTypeUInt32 /* node data is uint32_t */
|
||
|
#define kOIDTypeSize kOIDTypeUInt32 /* node data is uint32_t */
|
||
|
#endif
|
||
|
#define kOIDTypeBoolean (0x04<<16) /* node data is bool */
|
||
|
#define kOIDTypeString (0x05<<16) /* node data is const char * */
|
||
|
#define kOIDTypeStruct (0x06<<16) /* node data is void * */
|
||
|
#define kOIDTypeOIDIndirect (0x07<<16) /* node data is oid (reference to another node) */
|
||
|
|
||
|
#define kOIDTypeMask (0xff<<16)
|
||
|
#define kOIDStructSizeMask (0xffff)
|
||
|
|
||
|
/* node data qualifiers */
|
||
|
#define kOIDDataIndirect (1<<24) /* data is indirected through v_ptr */
|
||
|
#define kOIDFunction (2<<24) /* data is obtained by calling v_func */
|
||
|
#define kOIDWeak (4<<24) /* node only valid if no other node present */
|
||
|
|
||
|
# define MIB_CONSTANT(_oid, _type, _value) \
|
||
|
static const struct mib_node __attribute__((used)) \
|
||
|
__mib_node_ ## _oid = { \
|
||
|
.node_oid = _oid, \
|
||
|
.node_type = _type, \
|
||
|
.node_data.v64 = (uint64_t)(_value) \
|
||
|
}; \
|
||
|
LINKER_SET_ENTRY(mib, __mib_node_ ## _oid)
|
||
|
|
||
|
# define MIB_CONSTANT_WEAK(_oid, _type, _value) \
|
||
|
static const struct mib_node __attribute__((used)) \
|
||
|
__mib_node_weak_ ## _oid = { \
|
||
|
.node_oid = _oid, \
|
||
|
.node_type = _type | kOIDWeak, \
|
||
|
.node_data.v64 = (uint64_t)(_value) \
|
||
|
}; \
|
||
|
LINKER_SET_ENTRY(mib, __mib_node_weak_ ## _oid)
|
||
|
|
||
|
# define MIB_CONSTANT_PTR(_oid, _type, _value) \
|
||
|
static const struct mib_node __attribute__((used)) \
|
||
|
__mib_node_ ## _oid = { \
|
||
|
.node_oid = _oid, \
|
||
|
.node_type = _type, \
|
||
|
.node_data.v_ptr = (_value) \
|
||
|
}; \
|
||
|
LINKER_SET_ENTRY(mib, __mib_node_ ## _oid)
|
||
|
|
||
|
# define MIB_CONSTANT_PTR_WEAK(_oid, _type, _value) \
|
||
|
static const struct mib_node __attribute__((used)) \
|
||
|
__mib_node_weak_ ## _oid = { \
|
||
|
.node_oid = _oid, \
|
||
|
.node_type = _type | kOIDWeak, \
|
||
|
.node_data.v_ptr = (_value) \
|
||
|
}; \
|
||
|
LINKER_SET_ENTRY(mib, __mib_node_weak_ ## _oid)
|
||
|
|
||
|
# define MIB_VARIABLE(_oid, _type, _var) \
|
||
|
static const struct mib_node __attribute__((used)) \
|
||
|
__mib_node_##_oid = { \
|
||
|
.node_oid = _oid, \
|
||
|
.node_type = _type | kOIDDataIndirect, \
|
||
|
.node_data.v_ptr = (void *)(&_var) \
|
||
|
}; \
|
||
|
LINKER_SET_ENTRY(mib, __mib_node_ ## _oid)
|
||
|
|
||
|
# define MIB_VARIABLE_WEAK(_oid, _type, _var) \
|
||
|
static const struct mib_node __attribute__((used)) \
|
||
|
__mib_node_weak_ ## _oid = { \
|
||
|
.node_oid = _oid, \
|
||
|
.node_type = _type | kOIDDataIndirect | kOIDWeak, \
|
||
|
.node_data.v_ptr = (void *)(&_var) \
|
||
|
}; \
|
||
|
LINKER_SET_ENTRY(mib, __mib_node_weak_ ## _oid)
|
||
|
|
||
|
# define MIB_FUNCTION(_oid, _type, _func, _arg) \
|
||
|
static const struct mib_node __attribute__((used)) \
|
||
|
__mib_node_##_oid = { \
|
||
|
.node_oid = _oid, \
|
||
|
.node_type = _type | kOIDFunction, \
|
||
|
.node_data.v_func = {_func, _arg} \
|
||
|
}; \
|
||
|
LINKER_SET_ENTRY(mib, __mib_node_ ## _oid)
|
||
|
|
||
|
# define MIB_FUNCTION_WEAK(_oid, _type, _func, _arg) \
|
||
|
static const struct mib_node __attribute__((used)) \
|
||
|
__mib_node_weak_ ## _oid = { \
|
||
|
.node_oid = _oid, \
|
||
|
.node_type = _type | kOIDFunction | kOIDWeak, \
|
||
|
.node_data.v_func = {_func, _arg} \
|
||
|
}; \
|
||
|
LINKER_SET_ENTRY(mib, __mib_node_weak_ ## _oid)
|
||
|
|
||
|
|
||
|
/*
|
||
|
* Find a node in the MIB.
|
||
|
*/
|
||
|
union mib_value *mib_find_oid(uint32_t oid);
|
||
|
|
||
|
/*
|
||
|
* Find a node of an expected type in the MIB and return its value.
|
||
|
* Returns false if the OID is not present.
|
||
|
*
|
||
|
* This interface should only be used for optional nodes; if a node
|
||
|
* is expected to exist, use the mib_get_* interfaces to avoid duplicating
|
||
|
* error checking.
|
||
|
*/
|
||
|
bool _mib_find(uint32_t oid, uint32_t node_type, void *value);
|
||
|
bool mib_exists(uint32_t oid, void *value);
|
||
|
/*
|
||
|
* Return the value of an OID expected to be in the MIB; the
|
||
|
* MIB will panic on behalf of the caller if the node is not
|
||
|
* found.
|
||
|
*/
|
||
|
void _mib_get(uint32_t oid, uint32_t node_type, void *value);
|
||
|
|
||
|
#define MIB_GET_TEMPLATE(stype, type, oid_type) \
|
||
|
static inline type \
|
||
|
mib_get_##stype(uint32_t oid) { \
|
||
|
type ret; \
|
||
|
_mib_get(oid, oid_type, &ret); \
|
||
|
return ret; \
|
||
|
} \
|
||
|
\
|
||
|
static inline type \
|
||
|
mib_get_##stype##_opt(uint32_t oid, type def) { \
|
||
|
type ret = def; \
|
||
|
_mib_find(oid, oid_type, &ret); \
|
||
|
return ret; \
|
||
|
}
|
||
|
|
||
|
MIB_GET_TEMPLATE(u32, uint32_t, kOIDTypeUInt32)
|
||
|
MIB_GET_TEMPLATE(s32, int32_t, kOIDTypeInt32)
|
||
|
MIB_GET_TEMPLATE(u64, uint64_t, kOIDTypeUInt32)
|
||
|
MIB_GET_TEMPLATE(s64, int64_t, kOIDTypeInt64)
|
||
|
MIB_GET_TEMPLATE(addr, uintptr_t, kOIDTypeAddr)
|
||
|
MIB_GET_TEMPLATE(size, size_t, kOIDTypeSize)
|
||
|
MIB_GET_TEMPLATE(bool, bool, kOIDTypeBoolean)
|
||
|
MIB_GET_TEMPLATE(str, const char *, kOIDTypeString)
|
||
|
MIB_GET_TEMPLATE(ptr, const void *, kOIDTypeStruct)
|
||
|
|
||
|
#undef MIB_GET_TEMPLATE
|
||
|
|
||
|
/*
|
||
|
* MIB node descriptions are automatically generated at build time.
|
||
|
*/
|
||
|
struct mib_description {
|
||
|
uint32_t oid;
|
||
|
const char *desc;
|
||
|
};
|
||
|
|
||
|
extern struct mib_description mib_desc[];
|
||
|
|
||
|
__END_DECLS
|
||
|
|
||
|
#endif /* _MIB_H */
|