#ifndef _OBJ_API_H
#define _OBJ_API_H
#ifdef __KERNEL__
#include <asm/atomic.h>
#include <linux/semaphore.h>
#include <linux/types.h>

#include "../../common/common.h"
#include "../../common/uthash.h"

#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_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 {
    __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 {
    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;                     ///< Hash链表头
} CMHI_OBJECT, *PCMHI_OBJECT;

void obj_upgrade_dev_buffer(unsigned char* buf, unsigned int size);
const char *obj_version(void);
void object_init(void);
void free_object(PCMHI_OBJECT pObj);
PCMHI_OBJECT new_object(void);

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);
int server_proc_uninit(void);
#endif
#endif