#ifndef _INTERFACE_H_ #define _INTERFACE_H_ #include "commdef.h" // the error code the INTERFACE returned, // if no error occurred, return the bytes sent or read // #define IF_OK (0) #define IF_MORE_DATA (-1) #define IF_FAIL_READ (-2) #define IF_FAIL_WRITE (-3) #define IF_NEED_RETRY (-4) #define IF_OVER_MTU_SIZE (-5) #define IF_FAIL_PARAMETER (-6) #define IF_READ_TIMEOUT (-7) #define IF_WRITE_TIMEOUT (-8) #define IF_CTLR_FAILED (-9) // rwflag #define IF_WRITE_ONLY 0x01 // just do the operation of send #define IF_READ_ONLY 0x02 // just do the operation of read #define IF_RAW_READ 0x04 #define IF_RAW_WRITE 0x08 #define IF_SAS 0x10 // THE BELOW BLOCK IS ONLY FOR INTERNAL USE /************************************************************************************/ enum { GUI_SET_SERIAL = 0x10, GUI_SET_VENDOR, GUI_SET_MODEL, GUI_IDENTIFY, GUI_CHECK_PASSWORD, GUI_LOGOUT, GUI_HTTP, GUI_SET_ETHERNET_ADDR, GUI_SET_LOGO, GUI_POLL_EVENT, GUI_GET_EVENT, GUI_GET_HW_MONITOR, GUI_SMART_TEST, GUI_SET_TIME, GUI_SNMP, GUI_MISC, // 0x1F GUI_GET_INFO_R = 0x20, GUI_GET_INFO_V, GUI_GET_INFO_P, GUI_GET_INFO_S, GUI_CLEAR_EVENT, GUI_MUTE_BEEPER = 0x30, GUI_BEEPER_SETTING, GUI_SET_PASSWORD, GUI_HOST_INTERFACE_MODE, GUI_REBUILD_PRIORITY, GUI_MAX_ATA_MODE, GUI_RESET_CONTROLLER, GUI_COM_PORT_SETTING, GUI_NO_OPERATION, GUI_DHCP_IP, GUI_CREATE_PASS_THROUGH = 0x40, GUI_MODIFY_PASS_THROUGH, GUI_DELETE_PASS_THROUGH, GUI_IDENTIFY_DEVICE, GUI_CREATE_RAIDSET = 0x50, GUI_DELETE_RAIDSET, GUI_EXPAND_RAIDSET, GUI_ACTIVATE_RAIDSET, GUI_CREATE_HOT_SPARE, GUI_DELETE_HOT_SPARE, GUI_CREATE_VOLUME = 0x60, GUI_MODIFY_VOLUME, GUI_DELETE_VOLUME, GUI_START_CHECK_VOLUME, GUI_STOP_CHECK_VOLUME }; // Application specific enum { GUI_RAW_READ_WRITE = 0xEC, GUI_RAW_READ = 0xED, GUI_RAW_WRITE = 0xEE, GUI_SET_ENCLOSURE_UNIT_SERIAL, GUI_GET_TCPPORT, GUI_GET_COMATTR, // status code GUI_WOULDBLOCK, GUI_TIMEOUT }; /****************************************************************************************/ // // Library returned status // #define ARC_STATUS int #define ARC_SUCCESS 0x00 // Operation succeeded #define ARC_FAILURE 0x01 // Operation failed #define ARC_RETURN_FRAME_ERROR 0x02 // The library does not recognize the returned data // (including invalid data header, length or checksum, etc...) #define ARC_INVALID_COM_HANDLE 0x03 // Invalid RS-232 handle #define ARC_DATA_TRANSMIT_ERROR 0x04 // Failed to write to media #define ARC_DATA_RECEIVE_ERROR 0x05 // Failed to read from media( no response from raid subsystem) #define ARC_PARAMETER_ERROR 0x06 // The wrong parameter(s) #define ARC_OPENFILE_ERROR 0x07 // Failed to open file #define ARC_PASSWORD_REQUIRED 0x08 // Password required #define ARC_INVALID_PASSWORD 0x09 // Wrong password #define ARC_INSUFFICIENT_MEM 0x0A // Memory too small #define ARC_CANT_ALLOC_MEM 0x0B // Failed to allocate necessary memory #define ARC_BUFFER_TOO_SMALL 0x0C // The buffer is too small to put the returned data #define ARC_SOCKET_ERROR 0x0D // Socket error #define ARC_INVALID_SOCKET 0x0E // Invalid socket #define ARC_INIT_COM_ERROR 0x0F // Failed to open COM port #define ARC_SOCKET_STARTUP_ERROR 0x10 // Failed to init socket #define ARC_INVALID_INTERFACE 0x11 // Invalid interface #define ARC_NO_SUCH_DEVICE 0x12 // Device not found( including raidset, volumeset, physical drive ) #define ARC_DATA_TRANSMIT_TIMEOUT 0x13 // Failed to write to media in a given time #define ARC_DATA_RECEIVE_TIMEOUT 0x14 // Failed to read from media in a given time #define ARC_CTLR_FAILURE 0x15 // Controller failure or inactive #define ARC_UNKNOWN_ERROR 0x3F // Unknown error // RAID controller returned status #define GUI_OK 0x41 // Operation successed #define GUI_RAIDSET_NOT_NORMAL 0x42 #define GUI_VOLUMESET_NOT_NORMAL 0x43 #define GUI_NO_RAIDSET 0x44 #define GUI_NO_VOLUMESET 0x45 #define GUI_NO_PHYSICAL_DRIVE 0x46 #define GUI_PARAMETER_ERROR 0x47 #define GUI_UNSUPPORTED_COMMAND 0x48 #define GUI_DISK_CONFIG_CHANGED 0x49 #define GUI_INVALID_PASSWORD 0x4a #define GUI_NO_DISK_SPACE 0x4b #define GUI_CHECKSUM_ERROR 0x4c #define GUI_PASSWORD_REQUIRED 0x4d #define GUI_NO_MORE_DATA 0x4e // Internal use only #define GUI_INTERNAL_ERROR 0x4f #define GUI_FIRMWARE_CRC_ERROR 0x50 #define GUI_FIRMWARE_INVALID 0x51 #define GUI_FIRMWARE_UPDATE_FAILED 0x52 #define GUI_FIRMWARE_NO_HDD 0x53 #define GUI_END_OF_DATA 0x54 typedef int (*fn_decode_frame)(unsigned char *buf, int len); typedef unsigned char (*fn_decode_cs)(unsigned char *buf, int len); //////////////////////////////////////////////////////////// // for internal use only // typedef struct _IF_CMD_BLOCK { unsigned long timeout; // [in]in milliseconds unsigned long rwflag; // [in]the flag which control the behavior of read/write const char *outBuf; // [in] the output data buffer to be sent unsigned long outLen; // [in] the output data buffer size char *inBuf; // [out] the input data buffer to put the firmware returned data unsigned long inLen; // [out] the input data buffer size unsigned long io_status;// [out] the status of i/o fn_decode_frame df; // [in] fn_decode_cs dc; // [in] }sIF_CMD_BLOCK, *pIF_CMD_BLOCK; //////////////////////////////////////////////////////////// #ifdef _WIN32 class ARCLIB_API ArcInterface #else class ArcInterface #endif { public: virtual ~ArcInterface() { } virtual int send(sIF_CMD_BLOCK *ifData) = 0; virtual int recv(sIF_CMD_BLOCK *ifData) = 0; virtual int syncSend(sIF_CMD_BLOCK *ifData) = 0; // // MTU: Maximum transmission unit // the size (in bytes) of the largest packet that this layer can carry out. // virtual int getMTU() = 0; virtual void *getDeviceHandle() = 0; // These two member functions will be called by the syncSend() member function // to ensure the synchronization of send() and recv() to the single controller. // The requirelock() will be called before the send(), // and releaselock() will be called after the recv(). virtual void requirelock(){} virtual void releaselock(){} virtual int getFirmSpec() { return 1; } // set the timeout for interface read operation void setTimeOut(int nSec) { if(nSec > 0) { nTimeOut = nSec; } } int getTimeOut() { return nTimeOut; } private: int nTimeOut; }; typedef void (*CMD_CALLBACK)(void *data); typedef enum _SRC_SOURCE { SRC_UNKNOWN = -1, SRC_COMM = 0, SRC_DRIVER, SRC_INBAND, SRC_ETHERNET, SRC_DRIVER_ODIN, SRC_TOTAL }; #ifdef _WIN32 class ARCLIB_API CArclibObj #else class CArclibObj #endif { public: CArclibObj() { m_Source = SRC_UNKNOWN; } virtual ~CArclibObj() {} public: unsigned long m_Source; }; #ifdef _WIN32 class ARCLIB_API CArclibBase : public CArclibObj #else class CArclibBase : public CArclibObj #endif { public: CArclibBase() { m_Interface = NULL; m_CallBackFunc = NULL; } virtual ~CArclibBase() { if(m_Interface) { delete m_Interface; m_Interface = NULL; } } virtual void ArcSetCallBack(CMD_CALLBACK pFunc) { m_CallBackFunc = pFunc; } /************************************************************************************ Function Name: ArcInitSession Function: Startup areca library by assigning an interface to it Input: 1. ArcInterface Output: None. Return Values: 1. ARC_STATUS Note: This function should be called before any member functions be called ************************************************************************************/ virtual ARC_STATUS ArcInitSession(ArcInterface *Interface) { m_Interface = Interface; return ARC_SUCCESS; } protected: ArcInterface *m_Interface; // The communication path to the raid-subsystem CMD_CALLBACK m_CallBackFunc; }; #endif