parent
4f3211a74e
commit
a3f25e1538
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue