#ifndef _RET_ERRNO_H
#define _RET_ERRNO_H

#include "config_manager.h"

/* error no, 32位,前16位为模块ID,后16位为模块错误码 */
typedef uint ret_code;


/*0x00000000 ~ 0x0000ffff 为系统预留错误码,用于一般性系统错误,
例如内存不够,输入错误等*/

/*ret code 0x00000000 ~ 0x0000ffff*/
#define    RET_OK          0
#define    RET_ERR         1
#define    RET_UNKNOWN     2
#define    RET_SYSERR      3
#define    RET_NOTFOUND    4
#define    RET_TIMEOUT     5

#define    RET_NULLP       6
#define    RET_NOMEM       7
#define    RET_CHKERR      8
#define    RET_NOTSUPPORT  9
#define    RET_INPUTERR    10
#define    RET_EXIST       11
#define    RET_FULL        12
#define    RET_SENDERR     13
#define    RET_NOCMID      14
#define    RET_SRCERR      15

/* NETCONFIG_MODULE 0x00010000 ~ 0x0001ffff*/
#define RET_IPINVALID         (uint)((uint)NETCONFIG_MODULE<<16|1)
#define RET_BRNAMEERR         (uint)((uint)NETCONFIG_MODULE<<16|1)

/* VLANCONFIG_MODULE 0x00050000 ~ 0x0005ffff*/
#define RET_VIDNUM_INVALID        (uint)((uint)VLAN_CONFIG_MODULE<<16|1)
#define RET_VID_INVALID        	  (uint)((uint)VLAN_CONFIG_MODULE<<16|1)
#define RET_VID_EXIST         	  (uint)((uint)VLAN_CONFIG_MODULE<<16|1)
#define RET_VID_NOT_EXIST         (uint)((uint)VLAN_CONFIG_MODULE<<16|1)
#define RET_INTERFACE_NOT_EXIST	  (uint)((uint)VLAN_CONFIG_MODULE<<16|1)
#define RET_ATTR_INVALID	  (uint)((uint)VLAN_CONFIG_MODULE<<16|1)
#define RET_OPTYPE_ERR	          (uint)((uint)VLAN_CONFIG_MODULE<<16|1)
#define RET_SYS_VCONFIG_ERR	  (uint)((uint)VLAN_CONFIG_MODULE<<16|1)
#define RET_SYS_IFCONFIG_ERR	  (uint)((uint)VLAN_CONFIG_MODULE<<16|1)
#define RET_SYS_FILEOP_ERR	  (uint)((uint)VLAN_CONFIG_MODULE<<16|1)



#define ERR_STR_LEN   64

/* 错误码描述 */
#define RET_ERROR_DISC \
{ \
    { RET_OK,         "OK" }, \
    { RET_ERR,        "Error" },\
    { RET_UNKNOWN,    "Unkown" },\
    { RET_SYSERR,     "SystemError" },\
    { RET_NOTFOUND,   "NotFound" }, \
    { RET_TIMEOUT,    "Timeout" }, \
    { RET_NULLP,      "NullPointer" } ,\
    { RET_NOMEM,      "NotEnoughMemory"},\
    { RET_CHKERR,     "CheckError"},\
    { RET_NOTSUPPORT, "NotSupport"},\
    { RET_INPUTERR,   "InputError"},\
    { RET_EXIST,      "AlreadyExist"},\
    { RET_FULL,       "Full"},\
    { RET_SENDERR,    "SendErr"},\
    { RET_NOCMID,     "CanNotFindConfig"},\
    { RET_SRCERR,     "ConfigSourceErr"},\
\
    { RET_IPINVALID,  "IpInvalid"},\
    { RET_BRNAMEERR,  "BrNameInvalid"},\
\
    { RET_VIDNUM_INVALID,	"VidNumInvalid"},\
    { RET_VID_INVALID,     	"VidValueInvalid"},\
    { RET_VID_EXIST,  	   	"VidHasExist"},\
    { RET_VID_NOT_EXIST,  	"VidHasNotExist"},\
    { RET_INTERFACE_NOT_EXIST,  "InterfaceHasNotExist"},\
    { RET_ATTR_INVALID,		"AttrInvalid"},\
    { RET_OPTYPE_ERR,		"OperationTypeError"},\
    { RET_SYS_VCONFIG_ERR,	"SystemVconfigError"},\
    { RET_SYS_IFCONFIG_ERR,	"SystemIfconfigError"},\
    { RET_SYS_FILEOP_ERR,	"SystemFileOperationError"}\
}

struct err_disc {
    int code;
    const char *name;
} ;

static inline char* ret_code_format(ret_code code, char* str) {
    struct err_disc ret_err[] = RET_ERROR_DISC;
    int len = sizeof(ret_err) / sizeof(struct err_disc);
    int i;

    for(i = 0; i < len; i++){
        if(code == ret_err[i].code){
            strcpy(str, ret_err[i].name);
            return str;
        }
    }

    return str;
}

#endif