/*
 * @file common.h
 * @brief softsim handler header file
 * Copyright (c) 2015, Samsung Electronics Corporation. All rights reserved.
 */
#ifndef __tl_common_h__
#define	 __tl_common_h__
#include <stdint.h>
/**
 *
 */
#define SOFTSIM_TA_ID          0x000A0000
#define TA_ID_MASK             0xFFFF0000

/**
*
*/
#define SOFTSIM_INPUT_LEN   4088
#define SOFTSIM_OUTPUT_LEN  4088
#define SOFTSIM_LOG_BUF_LEN 8188

/**
 * command id mask
 */
#define CMD_ID_MASK            0x0000FFFF

#define MAKE_CMD_ID(x)         (SOFTSIM_TA_ID + x)

#define SOFTSIM_SUCCESS 0
#define SOFTSIM_ERR_GENERAL -1

/**
 * command id used to identify events
 */
typedef enum{
    SOFTSIM_CMD_ID_TRACK1 = MAKE_CMD_ID(0),
    SOFTSIM_CMD_ID_TRACK2 = MAKE_CMD_ID(1),

    SOFTSIM_CMD_INIT = MAKE_CMD_ID(5),

    SOFTSIM_CMD_CREATE_FILE = MAKE_CMD_ID(10),

    SOFTSIM_CMD_GET_DEVICE_CERT = MAKE_CMD_ID(17),
    SOFTSIM_CMD_GET_SERVICE_CERT = MAKE_CMD_ID(18),
    SOFTSIM_CMD_GET_PRIVATE_KEY = MAKE_CMD_ID(19),
    SOFTSIM_CMD_DRK_REQUEST = MAKE_CMD_ID(20),
    SOFTSIM_CMD_GET_CACHED_CERTS = MAKE_CMD_ID(21),

    SOFTSIM_CMD_SOFTSIM_LOGIC_SELECT = MAKE_CMD_ID(23),
    SOFTSIM_CMD_SOFTSIM_LOGIC_SET_NETMODE = MAKE_CMD_ID(24),
    SOFTSIM_CMD_SOFTSIM_LOGIC_START = MAKE_CMD_ID(25),
    SOFTSIM_CMD_SOFTSIM_LOGIC_STOP = MAKE_CMD_ID(26),
    SOFTSIM_CMD_SOFTSIM_LOGIC_INSERT = MAKE_CMD_ID(27),
    SOFTSIM_CMD_SOFTSIM_LOGIC_REMOVE = MAKE_CMD_ID(28),
    SOFTSIM_CMD_SOFTSIM_LOGIC_RESET = MAKE_CMD_ID(29),
    SOFTSIM_CMD_SOFTSIM_LOGIC_COMMAND = MAKE_CMD_ID(30),
    SOFTSIM_CMD_SOFTSIM_LOGIC_WRITE_USIM = MAKE_CMD_ID(31),
    SOFTSIM_CMD_SOFTSIM_LOGIC_ENACTIVE_IMSI = MAKE_CMD_ID(32),
    SOFTSIM_CMD_SOFTSIM_LOGIC_DEACTIVE_IMSI = MAKE_CMD_ID(33),

    SOFTSIM_CMD_ADD_USIM = MAKE_CMD_ID(40),
    SOFTSIM_CMD_ADD_USIM_JSON = MAKE_CMD_ID(41),
    SOFTSIM_CMD_RETRIEVE_USIM = MAKE_CMD_ID(42),
    SOFTSIM_CMD_RETRIEVE_MASKED_USIM = MAKE_CMD_ID(43),
    SOFTSIM_CMD_RETRIEVE_ALL_USIM = MAKE_CMD_ID(44),
    SOFTSIM_CMD_RETRIEVE_ALL_MASKED_USIM = MAKE_CMD_ID(45),
    SOFTSIM_CMD_REMOVE_USIM = MAKE_CMD_ID(46),
    SOFTSIM_CMD_REMOVE_ALL_USIM = MAKE_CMD_ID(47),
    SOFTSIM_CMD_GET_APNINFO_FROM_TA = MAKE_CMD_ID(48),
    SOFTSIM_CMD_GET_ACTIVATED_IMSI_INFO = MAKE_CMD_ID(49),
    SOFTSIM_CMD_GET_SAVED_IMSI_NUM = MAKE_CMD_ID(50),
    SOFTSIM_CMD_GET_ALL_SAVED_IMSI = MAKE_CMD_ID(51),
    SOFTSIM_CMD_FORCE_REMOVE_ACTIVATED_IMSI = MAKE_CMD_ID(52),
    SOFTSIM_CMD_FORCE_REMOVE_CACHED_SFS_FILES = MAKE_CMD_ID(53),

    SOFTSIM_CMD_AES_ENCRYPT = MAKE_CMD_ID(60),
    SOFTSIM_CMD_AES_DECRYPT = MAKE_CMD_ID(61),
    SOFTSIM_CMD_SAVE_RSA_ENCRYPTED_SYMMETRIC_KEY = MAKE_CMD_ID(62),
    SOFTSIM_CMD_RESTORE_SYMMETRIC_KEY = MAKE_CMD_ID(63),
    SOFTSIM_CMD_SAVE_AES_ENCRYPTED_IMSI_RESOURCE = MAKE_CMD_ID(64),

    SOFTSIM_CMD_RSA_ENCRYPT = MAKE_CMD_ID(70),
    SOFTSIM_CMD_RSA_DECRYPT = MAKE_CMD_ID(71),

    SOFTSIM_CMD_GET_FILE_SIZE = MAKE_CMD_ID(80),
    SOFTSIM_CMD_READ_FILE = MAKE_CMD_ID(81),
    SOFTSIM_CMD_WRITE_FILE = MAKE_CMD_ID(82),
    SOFTSIM_CMD_FILE_DATA = MAKE_CMD_ID(83),
    SOFTSIM_CMD_REMOVE_FILE = MAKE_CMD_ID(84),
} softsim_cmd_type;


#define	UNDEFINE_CMD_ID		(-100)			// Failure return code

typedef struct cmd_req_s {
    union{
        uint32_t cmd_id;
    };
    uint32_t in_len;
    union{
        uint8_t input[SOFTSIM_INPUT_LEN];
        uint8_t data[SOFTSIM_INPUT_LEN];
    };
 } __attribute__ ((packed)) cmd_req_t;

typedef struct cmd_rsp_s {
    union{
        int32_t status;
        int32_t ret;
    };
    uint32_t out_len;
    union{
        uint8_t errmsg[SOFTSIM_OUTPUT_LEN];
        uint8_t output[SOFTSIM_OUTPUT_LEN];
    };
    uint32_t log_len;
    uint8_t logbuf[SOFTSIM_LOG_BUF_LEN];
 } __attribute__ ((packed)) cmd_rsp_t;

typedef struct str_block_s{
    uint32_t total;
    uint32_t size;
    uint8_t payload[0];
} __attribute__((packed)) str_block_t;

#endif /* __tl_common_h__*/
