#ifndef __DS_C_MODULE_DEF_H__
#define __DS_C_MODULE_DEF_H__
/* for C model */
typedef struct _DS_OPT_ARRAY_EXT
{
U16 array_size; /* 数组中的最大数据个数,等同TABLE_DESC.size */
U16 active_size; /* 数组中的有效数据个数 */
U16 unit_type; /* 数组中的数据类型,同OPTION_DESC.type */
U16 unit_size; /* 数组中的数据类型的大小,同OPTION_DESC.size */
} DS_OPT_ARRAY_EXT;
typedef struct _DS_OPT_DESC
{
char *name;
U16 type;
U16 flags; /* option级别控制的标记位 */
U32 offset;
U32 size; /* 字符串类型的option,size不包含末尾的'\0'。
* 而二进制结构体中的成员定义大小为(size + 1),已包含末尾预留的'\0' */
union
{
struct
{
U32 enum_size;
char *enum_array[0];
} enum_desc;
DS_OPT_ARRAY_EXT array;
} *extend;
} DS_OPT_DESC;
/* SEGMENT的描述 */
typedef struct _DS_SEG_DESC
{
char *name;
U16 major_ver;
U16 minor_ver;
U16 rw;
U16 flags; /* segment级别控制的标记位 */
U32 size;
DS_OPT_DESC *option;
U32 option_num;
} DS_SEG_DESC;
/* SECTION的描述 */
typedef struct _DS_SECT_DESC
{
char *name;
U32 segment_num;
DS_SEG_DESC *segment;
} DS_SECT_DESC;
/* table的描述 */
typedef struct _DS_TBL_DESC
{
char *name; /* table名,通过SLP接口指定type关键字,可以返回整个table下的所有section,不分是否表格型数据 */
U16 attribute;
U16 flags; /* table级别控制的标记位 */
U32 size; /* 表格型数据使用,最大的section个数。非表格型数据置为0 */
U32 sect_seg_num;
union
{
DS_SECT_DESC *section;
DS_SEG_DESC *segment;
} sect_seg;
} DS_TBL_DESC;
/* 数据块监控的描述 */
typedef struct _DS_DAT_MON_DESC
{
char *path;
U32 attr;
} DS_DAT_MON_DESC;
/* module的描述 */
typedef struct _DS_MOD_DESC
{
char *name;
S32 (*init)(); /* 初始化 */
S32 (*check)(BIN_AREA *bin_area); /* 数据合法性检查 */
S32 (*reload)(DS_MSG *msg); /* 重新加载配置数据 */
S32 (*start)(); /* 启动 */
S32 (*stop)(); /* 停止 */
U32 table_num;
DS_TBL_DESC *table;
U32 data_monitor_num;
DS_DAT_MON_DESC *data_monitor;
} DS_MOD_DESC;
/* low-level(LL),低层级宏定义 */
/*
* 仅简化初始化写法,所有参数与结构体一一对应。
* 使用低层级宏定义时,你【必须】完全了解每个参数的意义和作用是什么。否则,请使用高层级宏定义。
*/
/* (LL)定义module描述 */
#define DSLL_MOD(module_name, module_init, module_check, module_reload, module_start, module_stop, module_tablen_num, module_table, module_data_monitor_num, module_data_monitor) \
{ \
.name = module_name, \
.init = module_init, \
.check = module_check, \
.reload = module_reload, \
.start = module_start, \
.stop = module_stop, \
.table_num = module_tablen_num, \
.table = module_table, \
.data_monitor_num = module_data_monitor_num, \
.data_monitor = module_data_monitor \
}
/* (LL)定义数据块监控描述 */
#define DSLL_DAT_MON(data_monitor_path, data_monitor_attr) \
{ \
.path = data_monitor_path, \
.attr = data_monitor_attr \
}
/* (LL)定义table描述 */
#define DSLL_TBL(table_name, table_attribute, table_flags, table_size, table_sect_seg, table_section, table_section_num) \
{ \
.name = table_name, \
.attribute = table_attribute, \
.flags = table_flags, \
.size = table_size, \
.sect_seg_num = table_section_num, \
.sect_seg.table_sect_seg = table_section \
}
/* (LL)定义section描述 */
#define DSLL_SECT(section_name, section_segment, section_segnum) \
{ \
.name = section_name, \
.segment_num = section_segnum, \
.segment = section_segment \
}
/* (LL)定义segment描述 */
#define DSLL_SEG(segment_name, segment_major_ver, segment_minor_ver, segment_rw, segment_flags, segment_size, segment_option, segment_optnum) \
{ \
.name = segment_name, \
.major_ver = segment_major_ver, \
.minor_ver = segment_minor_ver, \
.rw = segment_rw, \
.flags = segment_flags, \
.size = segment_size, \
.option = segment_option, \
.option_num = segment_optnum \
}
/* (LL)定义option描述 */
/* todo: option_size为0时,表示由系统根据option_type确定,字符串和字节流不适用(需求待确定) */
#define DSLL_OPT(option_name, option_type, option_flags, option_offset, option_size, option_extend) \
{ \
.name = option_name, \
.type = option_type, \
.flags = option_flags, \
.offset = option_offset, \
.size = option_size, \
.extend = (void *)(option_extend) \
}
/* (LL)定义enum option扩展部分的描述 */
#define DSLL_OPT_ENUM_EXT(enum_desc_name, num, ...) \
struct \
{ \
U32 enum_size; \
char *enum_array[num]; \
} enum_desc_name = \
{ \
.enum_size = num, \
.enum_array = {__VA_ARGS__} \
}
/* (LL)定义array option扩展部分的描述 */
#define DSLL_OPT_ARR_EXT(struct_name, arr_array_size, arr_unit_type, arr_unit_size) \
DS_OPT_ARRAY_EXT struct_name = \
{ \
.array_size = arr_array_size, \
.active_size = 0, \
.unit_type = arr_unit_type, \
.unit_size = arr_unit_size, \
}
/* high-level */
/* 二次封装的表格描述,根据需要将特定参数进行封装/自动填入,更加方便使用。对于要使用flag和回调接口的,需要用一次封装接口 */
/* 定义module描述 */
#define DS_STRUCT_MOD(module_name, module_init, module_check, module_reload, module_start, module_stop, module_table, module_data_monitor) \
DSLL_MOD(module_name, module_init, module_check, module_reload, module_start, module_stop, \
NULL == module_table ? 0 : NELEMENTS(module_table), module_table, \
NULL == module_data_monitor ? 0 : NELEMENTS(module_data_monitor), module_data_monitor)
/* 定义数据块监控描述 */
#define DS_DAT_MON DSLL_DAT_MON
/* 定义table描述 */
/* 普通数据 */
#define DS_TBL(table_name, table_attribute, section_desc, section_num) DSLL_TBL(table_name, table_attribute, 0, 0, section, section_desc, section_num)
#define DS_STRUCT_TBL(table_name, table_attribute, section_desc) DSLL_TBL(table_name, table_attribute, 0, 0, section, section_desc, NELEMENTS(section_desc))
/* 表格型数据 */
#define DS_STRUCT_LSTTBL(table_name, table_attribute, table_size, segment_desc) \
DSLL_TBL(table_name, table_attribute, 0, table_size, segment, segment_desc, NELEMENTS(segment_desc))
/* 定义section描述 */
#define DS_STRUCT_SECT(section_name, segment_desc) DSLL_SECT(section_name, segment_desc, NULL == segment_desc ? 0 : NELEMENTS(segment_desc))
/* 定义segment描述 */
#define DS_STRUCT_SEG(segment_name, segment_rw, segment_flags, structure, option_desc) \
DSLL_SEG(segment_name, 1, 0, segment_rw, segment_flags, sizeof(structure), option_desc, NELEMENTS(option_desc))
/* 用户组权限,依次继承。依据用户组对应的MASK来确定值。 */
#define SEG_GROUP_GUEST 0x1
#define SEG_GROUP_ADMIN 0x2
#define SEG_GROUP_ROOT 0x4
#define SEG_GROUP_GOD 0x10 /* 系统内部使用的终极用户 */
#define SEG_GROUP_MASK (SEG_GROUP_GOD | SEG_GROUP_ROOT | SEG_GROUP_ADMIN | SEG_GROUP_GUEST) /* 提取用户组的掩码 */
#define SEG_NO_IMPEXP 0x80 /* segment级别禁止导入导出 */
/* 定义option描述 */
/* option basic 基础部分 */
/* 使用这组宏定义的限制:
* 作为简化参数的代价,结构体的成员名必须要与SLP接口的option名相同
*/
#define DS_STRUCT_OPT(option_name, option_type, option_flags, structure, member, option_size, extend_desc) \
DSLL_OPT(option_name, option_type, option_flags, offsetof(structure, member), option_size, extend_desc)
#define DS_SWITCH_OPT(structure, member, option_flags) DS_STRUCT_OPT(#member, OPT_TYPE_SWITCH, option_flags, structure, member, MEMBER_SIZE(structure, member), NULL)
#define DS_ENUM_OPT(structure, member, option_flags, enum_desc) DS_STRUCT_OPT(#member, OPT_TYPE_ENUM, option_flags, structure, member, MEMBER_SIZE(structure, member), enum_desc)
#define DS_IP_OPT(structure, member, option_flags) DS_STRUCT_OPT(#member, OPT_TYPE_IP, option_flags, structure, member, MEMBER_SIZE(structure, member), NULL)
#define DS_MAC_OPT(structure, member, option_flags) DS_STRUCT_OPT(#member, OPT_TYPE_MAC, option_flags, structure, member, MEMBER_SIZE(structure, member), NULL)
#define DS_U8_OPT(structure, member, option_flags) DS_STRUCT_OPT(#member, OPT_TYPE_U8, option_flags, structure, member, MEMBER_SIZE(structure, member), NULL)
#define DS_S8_OPT(structure, member, option_flags) DS_STRUCT_OPT(#member, OPT_TYPE_S8, option_flags, structure, member, MEMBER_SIZE(structure, member), NULL)
#define DS_U16_OPT(structure, member, option_flags) DS_STRUCT_OPT(#member, OPT_TYPE_U16, option_flags, structure, member, MEMBER_SIZE(structure, member), NULL)
#define DS_S16_OPT(structure, member, option_flags) DS_STRUCT_OPT(#member, OPT_TYPE_S16, option_flags, structure, member, MEMBER_SIZE(structure, member), NULL)
#define DS_U32_OPT(structure, member, option_flags) DS_STRUCT_OPT(#member, OPT_TYPE_U32, option_flags, structure, member, MEMBER_SIZE(structure, member), NULL)
#define DS_S32_OPT(structure, member, option_flags) DS_STRUCT_OPT(#member, OPT_TYPE_S32, option_flags, structure, member, MEMBER_SIZE(structure, member), NULL)
#define DS_STR_OPT(structure, member, option_flags) DS_STRUCT_OPT(#member, OPT_TYPE_STRING, option_flags, structure, member, MEMBER_SIZE(structure, member) - 1, NULL)
#define DS_PSW_OPT(structure, member, option_flags) DS_STRUCT_OPT(#member, OPT_TYPE_PASSWORD, option_flags, structure, member, MEMBER_SIZE(structure, member) - 1, NULL)
#define DS_DBL_OPT(structure, member, option_flags) DS_STRUCT_OPT(#member, OPT_TYPE_DOUBLE, option_flags, structure, member, MEMBER_SIZE(structure, member), NULL)
#define DS_ARR_OPT(structure, member, option_flags, array_desc) DS_STRUCT_OPT(#member, OPT_TYPE_ARRAY, option_flags, structure, member, MEMBER_SIZE(structure, member), array_desc)
#define DS_HEXSTRM_OPT(structure, member, option_flags) DS_STRUCT_OPT(#member, OPT_TYPE_HEXSTREAM, option_flags, structure, member, MEMBER_SIZE(structure, member), NULL)
#define OPT_FLAG_NORM 0 /* 正常情况,没有特殊标记 */
#define OPT_FLAG_NO_IMPEXP 0x1 /* 禁止导入导出 */
#define IS_STR_OPT(option_type) ((OPT_TYPE_STRING == option_type) || (OPT_TYPE_PASSWORD == option_type))
/* option extend 扩展部分 */
/* 计算 __VA_ARGS__ 参数个数,最大支持64个参数 */
#define DS_ARG_COUNT(...) DS_INTERNAL_ARG_COUNT_PRIVATE(0, ##__VA_ARGS__, \
64, 63, 62, 61, 60, \
59, 58, 57, 56, 55, 54, 53, 52, 51, 50, \
49, 48, 47, 46, 45, 44, 43, 42, 41, 40, \
39, 38, 37, 36, 35, 34, 33, 32, 31, 30, \
29, 28, 27, 26, 25, 24, 23, 22, 21, 20, \
19, 18, 17, 16, 15, 14, 13, 12, 11, 10, \
9, 8, 7, 6, 5, 4, 3, 2, 1, 0)
#define DS_INTERNAL_ARG_COUNT_PRIVATE( \
_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, \
_10, _11, _12, _13, _14, _15, _16, _17, _18, _19, \
_20, _21, _22, _23, _24, _25, _26, _27, _28, _29, \
_30, _31, _32, _33, _34, _35, _36, _37, _38, _39, \
_40, _41, _42, _43, _44, _45, _46, _47, _48, _49, \
_50, _51, _52, _53, _54, _55, _56, _57, _58, _59, \
_60, _61, _62, _63, _64, N, ...) N
/* 定义enum option扩展部分的描述 */
#define DS_ENUM_DESC(enum_desc_name, ...) DSLL_OPT_ENUM_EXT(enum_desc_name, DS_ARG_COUNT(__VA_ARGS__), __VA_ARGS__)
/*
NELEMENTS(((DS_STRUCT_DESC *)0)->option_member)
= sizeof(DS_STRUCT_DESC.option_member)/sizeof((DS_STRUCT_DESC.option_member[0]))
MEMBER_SIZE(DS_STRUCT_DESC, option_member[0])
= sizeof(DS_STRUCT_DESC.option_member[0])
*/
/* 定义array option扩展部分的描述 */
#define DS_ARR_DESC(array_desc_name, array_unit_type, structure, member) \
DSLL_OPT_ARR_EXT(array_desc_name, NELEMENTS(((structure *)0)->member), array_unit_type, \
IS_STR_OPT(array_unit_type) ? MEMBER_SIZE(structure, member[0]) - 1 : MEMBER_SIZE(structure, member[0]))
void ds_module_notify_ready(char *module_name);
#define DS_MODULE_READY(module_name) ds_module_notify_ready((module_name))
#endif
——详解下这个data_model