From a3f25e153843ca9f6842a8362c92f2aa64ca8195 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E6=98=95?= Date: Tue, 13 Aug 2019 10:32:07 +0800 Subject: [PATCH] =?UTF-8?q?Mod=20=20aaa-12=20=E5=A2=9E=E5=8A=A0=E5=AF=B9?= =?UTF-8?q?=E8=B1=A1=E7=AE=A1=E7=90=86=E6=8E=A5=E5=8F=A3=20RCA=EF=BC=9A=20?= =?UTF-8?q?SOL=EF=BC=9A=20=E4=BF=AE=E6=94=B9=E4=BA=BA=EF=BC=9Ahuangxin=20?= =?UTF-8?q?=E6=A3=80=E8=A7=86=E4=BA=BA=EF=BC=9Ahuangxin?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Product/modules/object_manager/obj_api.c | 274 +++++++++++++++++++- Product/modules/object_manager/obj_api.h | 88 +++++-- Product/modules/object_manager/server_obj.c | 73 +++++- Product/modules/proc_api/proc_api.c | 66 +++-- Product/modules/proc_api/proc_api.h | 24 +- 5 files changed, 460 insertions(+), 65 deletions(-) diff --git a/Product/modules/object_manager/obj_api.c b/Product/modules/object_manager/obj_api.c index 326bb1678..b6ce8a9d4 100644 --- a/Product/modules/object_manager/obj_api.c +++ b/Product/modules/object_manager/obj_api.c @@ -15,22 +15,68 @@ #include "../../common/cJSON/cJSON.h" #include "obj_api.h" -#define OBJ_DEV_NAME ("isg_objs") -#define VERSION ("obj0.0.0.2") -#define SHM_MEM_SIZE (1024 * 1024) +/** + * @def OBJ_DEV_NAME + * @brief + */ +#define OBJ_DEV_NAME ("isg_objs") ///< 设备节点名称 +/** + * @def VERSION + * @brief + */ +#define VERSION ("obj0.0.0.2") + +/** + * @def SHM_MEM_SIZE + * @brief + */ +#define SHM_MEM_SIZE (1024 * 1024) ///< 1M字节共享内存 + +/** + * @var typedef {anonOBJECT_DRV} OBJECT_DRV + * @brief + */ +/** + * @var typedef {anonOBJECT_DRV} POBJECT_DRV + * @brief + */ +/** + * @struct {anonOBJECT_DRV} + * @brief + */ typedef struct { - struct class *dev_class; - int dev_major; - atomic_t ref_count; - unsigned int mem_size; - unsigned char *mem_buf; + struct class *dev_class; ///< 设备类,用于自动在 /dev 下创建文件节点 + int dev_major; ///< 设备主版本号 + atomic_t ref_count; ///< 驱动程序打开计数 + unsigned int mem_size; ///< 共享内存大小 + unsigned char *mem_buf; ///< 共享内存指针 } OBJECT_DRV, *POBJECT_DRV; +/** + * @var g_obj_device + * @brief + * @see POBJECT_DRV + */ static POBJECT_DRV g_obj_device = NULL; DEFINE_RWLOCK(g_obj_lock); + +/** + * @var g_obj_data + * @brief + * @see PCMHI_OBJECT + */ PCMHI_OBJECT g_obj_data = NULL; +/** + * @brief + * + * @param buf + * @param size + * + * @return + * @date 2019/08/07 + */ void obj_upgrade_dev_buffer(unsigned char *buf, unsigned int size) { if(buf && size < g_obj_device->mem_size - 1) { @@ -41,21 +87,155 @@ void obj_upgrade_dev_buffer(unsigned char *buf, unsigned int size) } } +/** + * @brief 根据对象名称获取对象 + * + * @param name: 对象名称 + * @param type: 对象类型 + * + * @return: 对象指针 或 NULL 空指针 + * @date 2019/08/07 + */ +PCMHI_OBJECT get_object(const char *name, int type) +{ + PCMHI_OBJECT obj, tmp; + PSERVER_OBJ_CONTENT req = NULL; + + HASH_FIND_STR(g_obj_data, name, obj); + + if(!obj) { + return NULL; + } + + if(type >= OBJ_TYPE_ADDR && type < OBJ_TYPE_MAX) { + if(obj->type != type) { + return NULL; + } + } + + return obj; +} + +/** + * @brief 判断当前服务是否在对象中 + * + * @param obj: 对象指针 + * @param port: 协议端口 + * @param proType: 协议类型 + * + * @return: 存在:0, 不存在:1 + * @date 2019/08/07 + */ +int item_belong_server_obj(PCMHI_OBJECT obj, __be16 port, int proType) +{ + PSERVER_OBJ_CONTENT req = NULL; + + if(!obj) { + return 0; + } + + list_for_each_entry(req, &obj->data->content, list) { + if(proType == req->pro_type && port >= req->min_port && port <= req->max_port) { + return 1; + } + } + + return 0; +} + +/** + * @brief 判断当前时间是否在对象中 + * + * @param obj: 对象指针 + * @param tm: 时间戳 + * + * @return: 存在:0, 不存在:1 + * @date 2019/08/07 + */ +int item_belong_dt_obj(PCMHI_OBJECT obj, unsigned long tm) +{ + PDT_OBJ_CONTENT req = NULL; + + if(!obj) { + return 0; + } + + list_for_each_entry(req, &obj->data->content, list) { + if(MODE_NONE == req->rep_mode && tm >= req->min_time && tm <= req->max_time) { + return 1; + } + } + + return 0; +} + +/** + * @brief 判断IPv4地址是否在对象中 + * + * @param obj: 对象指针 + * @param addr: IPv4地址 + * + * @return: 存在:0, 不存在:1 + * @date 2019/08/07 + */ +int ipv4_belong_addr_obj(PCMHI_OBJECT obj, __be32 addr) +{ + +} + +/** + * @brief 判断IPv6地址是否在对象中 + * + * @param obj: 对象指针 + * @param addr: IPv6地址 + * + * @return: 存在:0, 不存在:1 + * @date 2019/08/07 + */ +int ipv6_belong_addr_obj(PCMHI_OBJECT obj, unsigned char addr[16]) +{ + +} + +/** + * @brief + * + * @return + * @date 2019/08/07 + */ static int obj_proc_init(void) { return server_proc_init(); } +/** + * @brief + * + * @return + * @date 2019/08/07 + */ static int obj_proc_uninit(void) { return server_proc_uninit(); } +/** + * @brief + * + * @return + * @date 2019/08/07 + */ const char *obj_version(void) { return VERSION; } +/** + * @brief + * + * @return + * @date 2019/08/07 + */ PCMHI_OBJECT new_object(void) { PCMHI_OBJECT obj = (PCMHI_OBJECT)kmalloc(sizeof(CMHI_OBJECT), GFP_KERNEL); @@ -71,6 +251,14 @@ PCMHI_OBJECT new_object(void) return obj; } +/** + * @brief + * + * @param pObj + * + * @return + * @date 2019/08/07 + */ void free_object(PCMHI_OBJECT pObj) { if(pObj) { @@ -78,9 +266,15 @@ void free_object(PCMHI_OBJECT pObj) } } +/** + * @brief + * + * @return + * @date 2019/08/07 + */ void object_init(void) { - PCMHI_OBJECT pObj = create_server_object("list1", OBJ_TYPE_SERVER); + PCMHI_OBJECT pObj = create_server_object("list1"); if(!pObj) { printk(KERN_ERR "%s(%d): Create Object Error\n", __FUNCTION__, __LINE__); @@ -105,6 +299,12 @@ void object_init(void) } } +/** + * @brief + * + * @return + * @date 2019/08/07 + */ void object_uninit(void) { PCMHI_OBJECT obj, tmp; @@ -115,20 +315,50 @@ void object_uninit(void) } } +/** + * @brief + * + * @param inode + * @param filp + * + * @return + * @date 2019/08/07 + */ static int obj_open(struct inode *inode, struct file *filp) { + // 增加引用计数 atomic_inc(&g_obj_device->ref_count); return 0; } +/** + * @brief + * + * @param inode + * @param filp + * + * @return + * @date 2019/08/07 + */ static int obj_release(struct inode *inode, struct file *filp) { + // 减少引用计数 atomic_dec(&g_obj_device->ref_count); return 0; } +/** + * @brief + * + * @param fd + * @param vma + * + * @return + * @date 2019/08/07 + */ int obj_mmap(struct file *fd, struct vm_area_struct *vma) { + // 重新映射内存页表 int ret = remap_pfn_range(vma, vma->vm_start, virt_to_phys(g_obj_device->mem_buf) >> PAGE_SHIFT, g_obj_device->mem_size, @@ -136,12 +366,22 @@ int obj_mmap(struct file *fd, struct vm_area_struct *vma) return ret; } +/** + * @var obj_fops + * @brief + */ static struct file_operations obj_fops = { .open = obj_open, .release = obj_release, .mmap = obj_mmap, }; +/** + * @brief + * + * @return + * @date 2019/08/07 + */ static int object_module_init(void) { struct page *p = NULL; @@ -149,11 +389,13 @@ static int object_module_init(void) printk(KERN_INFO "Hello ISG objects manager version: %s\n", VERSION); + // 自动分配设备版本号 if(alloc_chrdev_region(&dev, 0, 1, OBJ_DEV_NAME) != 0) { printk(KERN_ERR "Alloc driver dev id error\n"); return -ENODEV; } + // 分配驱动程序结构内存 g_obj_device = (POBJECT_DRV)kmalloc(sizeof(OBJECT_DRV), GFP_KERNEL); if(g_obj_device == NULL) { @@ -162,8 +404,10 @@ static int object_module_init(void) } memset(g_obj_device, 0, sizeof(OBJECT_DRV)); - g_obj_device->dev_major = MAJOR(dev); + g_obj_device->dev_major = MAJOR(dev); // 保存驱动版本号 atomic_set(&g_obj_device->ref_count, 0); + + // 初始化共享内存 g_obj_device->mem_size = PAGE_ALIGN(SHM_MEM_SIZE); g_obj_device->mem_buf = (unsigned char *)__get_free_pages(GFP_KERNEL, get_order(g_obj_device->mem_size)); @@ -180,11 +424,15 @@ static int object_module_init(void) } memset(g_obj_device->mem_buf, 0, g_obj_device->mem_size); + // 注册字符设备 register_chrdev(g_obj_device->dev_major, OBJ_DEV_NAME, &obj_fops); + // 创建字符设备类 g_obj_device->dev_class = class_create(THIS_MODULE, "obj"); + // 创建字符设备节点 device_create(g_obj_device->dev_class, NULL, MKDEV(g_obj_device->dev_major, 0), NULL, "isg_objs/dev%d", 0); + // 初始化 proc 接口 obj_proc_init(); object_init(); @@ -192,6 +440,12 @@ static int object_module_init(void) } module_init(object_module_init); +/** + * @brief + * + * @return + * @date 2019/08/07 + */ static void __exit object_module_exit(void) { struct page *p = NULL; diff --git a/Product/modules/object_manager/obj_api.h b/Product/modules/object_manager/obj_api.h index 872ade4fe..5dd2c8b16 100644 --- a/Product/modules/object_manager/obj_api.h +++ b/Product/modules/object_manager/obj_api.h @@ -11,34 +11,90 @@ #define OBJ_DBG_DIR ("obj") typedef int (*belong_server_objs)(__be32, int); +typedef int (*belong_dt_objs)(unsigned long, int); typedef enum { - OBJ_TYPE_ADDR = 0, - OBJ_TYPE_SERVER, - OBJ_TYPE_DATETIME, + OBJ_TYPE_ADDR = 0, ///< 地址对象 + OBJ_TYPE_SERVER, ///< 服务对象 + OBJ_TYPE_DATETIME, ///< 日期时间对象 OBJ_TYPE_MAX } OBJ_TYPES; +typedef enum { + MODE_NONE = 1, ///< 不重复 + MODE_EVERY_DAY = 2, ///< 每天重复 + MODE_WORKDAY = 3, ///< 工作日重复 + MODE_WEEKEND = 4, ///< 周末重复 + MODE_WEEKDAY = 5, ///< 非周末重复 + MODE_EVERY_MONTH_DAY = 6, ///< 每月重复 + MODE_EVERY_YEAR_DAY = 7, ///< 每年重复 + MODE_MONTH_LAST_DAY = 8, ///< 每月最后一天重复 + MODE_HOLIDAY = 9, ///< 节假日重复 + MODE_MAX +} REPEAT_MODE; + +typedef enum { + IP_V4 = 0, ///< IPv4 协议 + IP_V6, ///< IPv6 协议 + IP_VER_MAX +} IP_VERSION; + typedef struct { - __be16 min_port; - __be16 max_port; - int pro_type; + __be32 ip4_add; ///< IPv4 地址 + unsigned char net_mask; ///< IPv4 子网掩码 FF.FF.FF.FF 格式 +} IP4_ADDR, *PIP4_ADDR; + +typedef struct { + union { + unsigned char addr8[16]; ///< IPv6 地址, 字节表示形式 + __be16 addr16[8]; ///< IPv6 地址, 双字节表示形式 + __be32 addr32[4]; ///< IPv6 地址, 4字节表示形式 + } addr; + unsigned char net_mask; ///< IPv6 子网掩码, :/24 格式 +} IP6_ADDR, *PIP6_ADDR; + +typedef struct { + union { + IP4_ADDR addr_v4; ///< IPv4 地址 + IP6_ADDR addr_v6; ///< IPv6 地址 + } min_addr; ///< 最小 IP 地址 + union { + IP4_ADDR addr_v4; ///< IPv4 地址 + IP6_ADDR addr_v6; ///< IPv6 地址 + } max_addr; ///< 最大 IP 地址 + IP_VERSION ip_version; ///< IP地址类型 + struct list_head list; +} ADDR_OBJ_CONTENT, *PADDR_OBJ_CONTENT; + +typedef struct { + __be16 min_port; ///< 最小端口 + __be16 max_port; ///< 最大端口 + int pro_type; ///< 协议类型 struct list_head list; } SERVER_OBJ_CONTENT, *PSERVER_OBJ_CONTENT; typedef struct { - struct list_head content; - belong_server_objs callback; + unsigned long min_time; ///< 起始时间 + unsigned long max_time; ///< 终止时间 + REPEAT_MODE rep_mode; ///< 重复模式 + struct list_head list; +} DT_OBJ_CONTENT, *PDT_OBJ_CONTENT; + +typedef struct { + struct list_head content; ///< 数据链表头 + union { + belong_server_objs callback; + }; } OBJECT_DATA, *POBJECT_DATA; typedef struct { - char name[MAX_NAME_LEN]; - char desc[MAX_PATH]; - OBJ_TYPES type; - POBJECT_DATA data; - atomic_t ref_count; - rwlock_t lock; - UT_hash_handle hh; + char name[MAX_NAME_LEN]; ///< 对象名称 + char desc[MAX_PATH]; ///< 对象说明 + OBJ_TYPES type; ///< 对象类型 + POBJECT_DATA data; ///< 对象数据 + atomic_t ref_count; ///< 对象引用计数 + rwlock_t lock; ///< 对象锁 + UT_hash_handle hh; ///< Hash链表头 } CMHI_OBJECT, *PCMHI_OBJECT; void obj_upgrade_dev_buffer(unsigned char* buf, unsigned int size); @@ -47,7 +103,7 @@ void object_init(void); void free_object(PCMHI_OBJECT pObj); PCMHI_OBJECT new_object(void); -PCMHI_OBJECT create_server_object(const char *name, OBJ_TYPES type); +PCMHI_OBJECT create_server_object(const char *name); void cleanup_server_object(PCMHI_OBJECT pObj); int add_server_obj_data(PCMHI_OBJECT pObj, __be16 minPort, __be32 maxPort, int proType); int server_proc_init(void); diff --git a/Product/modules/object_manager/server_obj.c b/Product/modules/object_manager/server_obj.c index 024405000..e7d765279 100644 --- a/Product/modules/object_manager/server_obj.c +++ b/Product/modules/object_manager/server_obj.c @@ -5,11 +5,30 @@ #include "obj_api.h" +/** + * @brief + * + * @param port + * @param proType + * + * @return + * @date 2019/08/05 + */ static int server_objs_cmp(__be32 port, int proType) { return 0; } +/** + * @brief + * + * @param minPort + * @param maxPort + * @param proType + * + * @return + * @date 2019/08/05 + */ static PSERVER_OBJ_CONTENT new_server_content(__be16 minPort, __be16 maxPort, int proType) { PSERVER_OBJ_CONTENT dt = (PSERVER_OBJ_CONTENT)kmalloc(sizeof(SERVER_OBJ_CONTENT), GFP_KERNEL); @@ -19,28 +38,51 @@ static PSERVER_OBJ_CONTENT new_server_content(__be16 minPort, __be16 maxPort, in } else { memset(dt, 0, sizeof(SERVER_OBJ_CONTENT)); dt->min_port = minPort; - dt->max_port = maxPort; + + if(maxPort < minPort) { + dt->max_port = minPort; + } else { + dt->max_port = maxPort; + } + dt->pro_type = proType; } return dt; } +/** + * @brief + * + * @return + * @date 2019/08/05 + */ static POBJECT_DATA new_server_object(void) { - POBJECT_DATA obj = (POBJECT_DATA)kmalloc(sizeof(POBJECT_DATA), GFP_KERNEL); + POBJECT_DATA obj = (POBJECT_DATA)kmalloc(sizeof(OBJECT_DATA), GFP_KERNEL); if(obj == NULL) { printk(KERN_ERR "Malloc CMHI_OBJECT Error\n"); return NULL; } - memset(obj, 0, sizeof(CMHI_OBJECT)); + memset(obj, 0, sizeof(OBJECT_DATA)); obj->callback = server_objs_cmp; return obj; } +/** + * @brief 添加服务到服务对象中 + * + * @param pObj: 对象指针 + * @param minPort: 最小端口 + * @param proType: 协议类型 + * @param maxPort: 最大端口 + * + * @return: 0: 添加成功; -EINVAL: 参数错误; -ENOMEM: 分配内存错误 + * @date 2019/08/05 + */ int add_server_obj_data(PCMHI_OBJECT pObj, __be16 minPort, __be32 maxPort, int proType) { PSERVER_OBJ_CONTENT dt; @@ -57,14 +99,20 @@ int add_server_obj_data(PCMHI_OBJECT pObj, __be16 minPort, __be32 maxPort, int p return -ENOMEM; } - //write_lock(&pObj->lock); list_add_tail(&dt->list, &pObj->data->content); - //write_unlock(&pObj->lock); return 0; } -PCMHI_OBJECT create_server_object(const char *name, OBJ_TYPES type) +/** + * @brief 创建服务对象 + * + * @param name: 对象名称 + * + * @return: 失败: NULL; 成功: 返回新建对象指针 + * @date 2019/08/05 + */ +PCMHI_OBJECT create_server_object(const char *name) { POBJECT_DATA pObjData = NULL; PCMHI_OBJECT pObj = new_object(); @@ -83,13 +131,21 @@ PCMHI_OBJECT create_server_object(const char *name, OBJ_TYPES type) } strncpy(pObj->name, name, MAX_NAME_LEN - 1); - pObj->type = type; + pObj->type = OBJ_TYPE_SERVER; pObj->data = pObjData; INIT_LIST_HEAD(&pObj->data->content); return pObj; } +/** + * @brief 清理对象资源 + * + * @param pObj: 对象指针 + * + * @return + * @date 2019/08/05 + */ void cleanup_server_object(PCMHI_OBJECT pObj) { PSERVER_OBJ_CONTENT req = NULL, temp_req = NULL; @@ -98,12 +154,11 @@ void cleanup_server_object(PCMHI_OBJECT pObj) return; } - //write_lock(&pObj->lock); list_for_each_entry_safe(req, temp_req, &pObj->data->content, list) { list_del(&req->list); kfree(req); } - //write_unlock(&pObj->lock); + kfree(pObj->data); kfree(pObj); } diff --git a/Product/modules/proc_api/proc_api.c b/Product/modules/proc_api/proc_api.c index 62beff988..c281dfaa2 100644 --- a/Product/modules/proc_api/proc_api.c +++ b/Product/modules/proc_api/proc_api.c @@ -27,11 +27,11 @@ #define PROC_API_DBG_DIR ("api") typedef struct { - char key[MAX_PATH]; - char dir_name[MAX_NAME_LEN]; - PDBGFS_PRIV data; - struct proc_dir_entry* entry; - UT_hash_handle hh; + char key[MAX_PATH]; ///< ڵ + char dir_name[MAX_NAME_LEN]; ///< Ŀ¼ + PDBGFS_PRIV data; ///< ڵ + struct proc_dir_entry* entry; ///< proc Ŀ¼ݽṹ + UT_hash_handle hh; ///< Hashڵ } PROC_INFO, *PPROC_INFO; static const struct file_operations g_DbgSeq_fops; @@ -116,13 +116,19 @@ static void proc_api_uninit(const char* proc_dir_name) remove_proc_entry(proc_dir_name, NULL); } +/** + * @brief עprocģ + * + * @param pv: ģprocϢ + * @return int: 0 ɹ -EINVAL + */ int proc_api_register(PPROC_API pv) { struct proc_dir_entry* pdir; int i = 0; if(pv == NULL || pv->data == NULL || pv->num_data <= 0) { - return ERR_PARA_OUTOFRANGE; + return -EINVAL; } if(pv->dir_name && strlen(pv->dir_name) > 0) { @@ -162,9 +168,15 @@ int proc_api_register(PPROC_API pv) write_unlock(&g_proc_lock); } - return ERR_DBGFS_NO_ERROR; + return 0; } +/** + * @brief procģע + * + * @param pv: ģprocϢ + * @return int: 0 ɹ -EINVAL + */ int proc_api_unregister(PPROC_API pv) { PPROC_INFO pInfo = NULL; @@ -172,7 +184,7 @@ int proc_api_unregister(PPROC_API pv) int i; if(pv == NULL || pv->data == NULL || pv->num_data <= 0) { - return ERR_PARA_OUTOFRANGE; + return -EINVAL; } for(i = 0; i < pv->num_data; i++) { @@ -199,7 +211,7 @@ int proc_api_unregister(PPROC_API pv) remove_proc_subtree(pv->dir_name, g_DebugProcFS); } - return ERR_DBGFS_NO_ERROR; + return 0; } static int proc_seq_open(struct inode* inode, struct file* file) @@ -243,6 +255,15 @@ static int get_value_base(unsigned char* pBuf) return 10; } +/** + * @brief ȡеֵַ + * + * @param pBuf: ַ + * @param index: ָλ + * @param pValue: ȡֵַ + * @param maxBytes: + * @return int: 0 ɹ -EINVAL -ENOENT ûжӦֵ + */ int get_string_value(unsigned char* pBuf, int index, unsigned char* pValue, unsigned int maxBytes) { char tmpBuf[128]; @@ -251,7 +272,7 @@ int get_string_value(unsigned char* pBuf, int index, unsigned char* pValue, unsi int paramIndex = 0; if(pBuf == NULL || index < 0 || pValue == NULL) { - return ERR_PARA_OUTOFRANGE; + return -EINVAL; } memset(pValue, 0, maxBytes); @@ -269,14 +290,22 @@ int get_string_value(unsigned char* pBuf, int index, unsigned char* pValue, unsi strcpy(pValue, token); - return ERR_DBGFS_NO_ERROR; + return 0; } } - return ERR_DBGFS_WRITEOPTS; + return -ENOENT; } -int get_int_value(unsigned char* pBuf, int index) +/** + * @brief Ӳָλȡֵ + * + * @param pBuf: ַ + * @param index: ָλ + * @param pValue: ػȡֵ + * @return int: 0 ɹ -EINVAL -ENOENT ûжӦֵ-EFAULT ַת + */ +int get_int_value(unsigned char* pBuf, int index, int* pValue) { char tmpBuf[128]; char* token; @@ -284,8 +313,8 @@ int get_int_value(unsigned char* pBuf, int index) int paramIndex = 0; int paramValue = -1; - if(pBuf == NULL || index < 0) { - return -1; + if(pBuf == NULL || index < 0 || pValue == NULL) { + return -EINVAL; } strcpy(tmpBuf, pBuf); @@ -301,14 +330,15 @@ int get_int_value(unsigned char* pBuf, int index) if(kstrtol(token, get_value_base(token), (long*)¶mValue) != 0) { printk(KERN_ERR "strict_strtol [%s] Error\n", token); - return -1; + return -EFAULT; } else { - return paramValue; + *pValue = paramValue; + return 0; } } } - return -1; + return -ENOENT; } static int process_input_content(struct seq_file* seq, unsigned char* pBuf, PDBGFS_PRIV pv) diff --git a/Product/modules/proc_api/proc_api.h b/Product/modules/proc_api/proc_api.h index dba9059d3..7447272c0 100644 --- a/Product/modules/proc_api/proc_api.h +++ b/Product/modules/proc_api/proc_api.h @@ -19,25 +19,25 @@ typedef enum { } PROC_ERRCODE; typedef struct { - const char* name; - unsigned int params; - unsigned long mask; - char* cmd; - char* cmd_data; - int (* show)(struct seq_file*, void*); - int (* ioctl)(struct seq_file*, void*); - int (* help)(struct seq_file*, void*); + const char* name; ///< 节点名称 + unsigned int params; ///< 参数 + unsigned long mask; ///< 命令掩码 + char* cmd; ///< 命令 + char* cmd_data; ///< 命令参数 + int (* show)(struct seq_file*, void*); ///< 输出接口 + int (* ioctl)(struct seq_file*, void*); ///< 输入接口 + int (* help)(struct seq_file*, void*); ///< 帮助接口 } DBGFS_PRIV, *PDBGFS_PRIV; typedef struct { - const char* dir_name; - PDBGFS_PRIV data; - int num_data; + const char* dir_name; ///< 目录名称 + PDBGFS_PRIV data; ///< 节点数组 + int num_data; ///< 节点个数 } PROC_API, *PPROC_API; int proc_api_register(PPROC_API pv); int proc_api_unregister(PPROC_API pv); -int get_int_value(unsigned char* pBuf, int index); +int get_int_value(unsigned char* pBuf, int index, int* pValue); int get_string_value(unsigned char* pBuf, int index, unsigned char* pValue, unsigned int maxBytes); #endif #endif