blob: 154df0670ef81363fcd5e74fd659645307a1b767 [file] [log] [blame]
// Copyright (c) 2012 GCT Semiconductor, Inc. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#if !defined(CM_H_20081007)
#define CM_H_20081007
#include <netinet/in.h>
#include "../sdk/gctapi.h"
#include "cm_timer.h"
#include "cm_msg.h"
#define MAX_DEV 8
#define MAX_PROFILE_LIST 8
#define MAX_NETWORK_LIST 16
#define GCT_WM_PREFIX "wm"
#define DEFAULT_DEVICE (int)(1)
#define HCI_MAX_PACKET 2048
#define HCI_HEADER_SIZE 4
#define WIMAX_DISCONN_IND 0x8115
#define WIMAX_IP_RENEW_IND 0x811a
#define WIMAX_DM_CMD 0x030a
#define WIMAX_DM_RSP 0x830b
#define WIMAX_CLI_CMD 0x030c
#define WIMAX_CLI_RSP 0x830d
#define END_OF_BLOCK (-1)
#define END_OF_IMAGE (-2)
#define SEQUENCE_READ (-1)
#define DL_DATA_CHUCK 1024
#define ENC_HEAD_SIZE 4
#define WIMAX_DL_IMAGE 0x0310
#define WIMAX_DL_IMAGE_STATUS 0x8311
#define WIMAX_UL_IMAGE 0x0312
#define WIMAX_UL_IMAGE_RESULT 0x8313
#define WIMAX_UL_IMAGE_STATUS 0x0314
#define WIMAX_IMAGE_CMD 0x0316
#define ICMD_INVALIDATE 0
#define ICMD_GET_SIZE 1
#define ICMD_GET_CRC32 2
#define WIMAX_IMAGE_CMD_STATUS 0x8317
#define WIMAX_UICC_STATUS_IND 0x8318
#define WIMAX_UICC_EAP_IND 0x8319
#define WIMAX_UICC_CMD 0x031A
#define UICC_CMD_PIN_ENABLE 0x00
#define UICC_CMD_PIN_DISABLE 0x01
#define UICC_CMD_PIN_CHANGE 0x02
#define UICC_CMD_PIN_VERIFY 0x03
#define UICC_CMD_PUK_INPUT 0x04
#define UICC_CMD_UICC_STATUS 0x05
#define UICC_CMD_SUBSCRIBERID 0x06
#define UICC_CMD_ICCID 0x07
#define UICC_CMD_POWER_DOWN 0x08
#define UICC_CMD_POWER_UP 0x09
#define WIMAX_UICC_CMD_RESULT 0x831B
#define UICC_CMD_RESULT_SUCCESS 0x00
#define UICC_CMD_RESULT_FAIL 0x01
#define EOF_OFFSET -1
#define WIMAX_READ_FILE 0x0350
#define WIMAX_WRITE_FILE 0x0351
#define WIMAX_DELETE_FILE 0x0352
#define WIMAX_FILE_RESULT 0x8354
#define WIMAX_MANAGER_MSG 0x8333
#define WIMAX_EAP_STR_LEN 256
#define MAX_EAP_BUF_SIZE 2048
/* Download image type */
#define DLIMG_KERNEL 0
#define DLIMG_FS 1
#define DLIMG_CFG 2
#define DLIMG_EAP_PARM 6
#define DLIMG_BL_EEPROM 7
#define DLIMG_BL_FLASH 8
#define DLIMG_OMA_XML 0x100
#define DLIMG_DEV_CERT 0x101
#define DLIMG_CERT1_U 0x102
#define DLIMG_CERT1_L 0x103
#define DLIMG_CERT2_U 0x104
#define DLIMG_EAP_PARAM 0x105
#define DLIMG_CERT_BIG 0x106
#define WIMAX_PRINT_PAD 8
typedef struct hci {
unsigned short cmd_evt;
unsigned short length;
unsigned char data[0];
} __attribute__((packed)) hci_t;
typedef struct hci_image_payload {
unsigned short type;
unsigned int offset;
char data[0];
} __attribute__((packed)) hci_image_payload_t;
typedef struct hci_image_response {
unsigned short type;
unsigned int offset;
int result;
} __attribute__((packed)) hci_image_response_t;
typedef struct hci_image_cmd {
unsigned short cmd;
unsigned short type;
} __attribute__((packed)) hci_image_cmd_t;
typedef struct hci_image_cmd_result {
unsigned short cmd;
unsigned short type;
unsigned status;
unsigned char data[0];
} __attribute__((packed)) hci_image_cmd_result_t;
typedef struct hci_file_write {
unsigned int offset;
unsigned short path_len; /*Include null char*/
char path[0];
char data[0];
} __attribute__((packed)) hci_file_write_t;
#define hci_file_data(p) (p->path+p->path_len)
typedef struct hci_file_delete {
char path[0];
char data[0];
} __attribute__((packed)) hci_file_delete_t;
typedef struct hci_file_read {
unsigned int offset;
char path[0];
char data[0];
} __attribute__((packed)) hci_file_read_t;
typedef struct hci_file_response {
int result;
unsigned short path_len;
char path[0];
char data[0];
} __attribute__((packed)) hci_file_response_t;
#define file_response_data(r) \
(((hci_file_response_t*)(r))->path+_B2H(((hci_file_response_t*)(r))->path_len))
#define _B2H(x) ntohs(x)
#define _H2B(x) htons(x)
#define _DB2H(x) ntohl(x)
#define _DH2B(x) htonl(x)
#define _U82U16(b) ((((u16)((u8*)b)[0])<<8)|((u16)((u8*)b)[1]))
#define _U82U24(b) ((((u32)((u8*)b)[0])<<16)|(((u32)((u8*)b)[1])<<8)|((u32)((u8*)b)[2]))
#define _U82U32(b) (((u32)_U82U16(b)<<16)|(u32)_U82U16((u8*)(b)+2))
#define _U162U8(b,v) ((((u8*)b)[0])=((u16)(v)>>8),(((u8*)b)[1])=(u8)((u16)(v)))
#define _U242U8(b,v) ((((u8*)b)[0])=(u8)((u32)(v)>>16),(((u8*)b)[1])=(u8)((u32)(v)>>8),\
(((u8*)b)[2])=(u8)((u32)(v)))
#define _U322U8(b,v) (_U162U8((u8*)(b)+2, v), _U162U8(b, (u32)v>>16))
#define _set_msb(x32, x8) (x32 = ((u32)x32 & 0x00ffffff) | ((u32)x8<<24))
#define _get_msb(x32) ((u8)((u32)x32>>24))
#ifndef offsetof
#define offsetof(type, field) ((int)(&((type*)0)->field))
#endif
#define _numof_array(arr) (sizeof(arr)/sizeof(arr[0]))
#define FW_UPDATE_REPORT_TRY_CNT 5
#define DRMD_REPORT_TRY_CNT FW_UPDATE_REPORT_TRY_CNT
/*Auto connection*/
#define NETWORK_LIST_TIMEOUT_SEC (0x7fffffff)
typedef struct dev_conf_s {
char mac_str[32];
char type_str[256];
CAPABILITY_BIT cap;
GCT_API_EAP_PARAM eapp;
GCT_API_ODM_PARAM odmp;
WIMAX_API_DEVICE_STATUS wimax_status;
u16 nsp_name16_before[MAX_SIZE_OF_NSP_NAME];
u16 nsp_name16_current[MAX_SIZE_OF_NSP_NAME];
pid_t dhclient_pid;
cm_timer_obj_t ip_acq_timer;
int ip_acq_timed;
unsigned auto_conn_retry_cnt;
unsigned fw_app_version;
unsigned fw_mac_version;
} dev_conf_t;
typedef struct cm_common_conf_s {
char log_path[256];
int log_level;
int eap_log_enable;
int embedded_eap_enable;
int oma_dm_enable;
char nonvolatile_dir[128];
char run_script_file[128];
int auto_connect_enable;
unsigned auto_connect_retry_count;
int auto_select_profile_index;
int unknown_net_auto_connect_enable;
int ip_allocation_timeout_sec;
int disconnct_on_ip_failure;
pthread_t auto_conn_thr;
cm_msg_cb_t auto_conn_msg;
pthread_t dhclient_thr;
cm_msg_cb_t dhclient_msg;
GCT_WIMAX_API_OPEN_MODE api_mode;
#if defined(CONFIG_DM_INTERFACE)
int dm_interface_enable;
int dm_interface_cfd; /*socket fd*/
#endif
} cm_common_conf_t;
#define CM_USE_EEAP (cm_common_conf.embedded_eap_enable)
#define CM_USE_ODM (cm_common_conf.oma_dm_enable)
#define CAP_ENC_XML_ENABLED(dev_idx) (cm_dev_conf[dev_idx].cap & CAPABILITY_ENC_XML)
#define CAP_EEAP_TLS_ENABLED(dev_idx) (cm_dev_conf[dev_idx].cap & CAPABILITY_E_EAP_TLS)
#define CAP_ODM_ENABLED(dev_idx) (cm_dev_conf[dev_idx].cap & CAPABILITY_ODM)
#define CAP_EEAP_AKA_ENABLED(dev_idx) (cm_dev_conf[dev_idx].cap & CAPABILITY_E_EAP_AKA)
#define CAP_CAPLINFO_ENABLED(dev_idx) (cm_dev_conf[dev_idx].cap & CAPABILITY_CAPL_INFO)
#define CAP_EEAP_ENABLED(dev_idx) (CAP_EEAP_TLS_ENABLED(dev_idx) || CAP_EEAP_AKA_ENABLED(dev_idx))
extern dev_conf_t cm_dev_conf[];
extern cm_common_conf_t cm_common_conf;
extern APIHAND cm_api_handle;
#define CONF_FILE "./cm.conf"
#define CM_LOG_FLAG (LOG_FLAG_NO_STDOUT_IN_LOGFILE)
#if 1
#define cm_print_log(api, flag, fmt, args ...) do {\
if (api)\
GAPI_PrintLog(api, flag, "CM", fmt, ## args);\
else {\
printf(fmt, ## args);\
fflush(stdout);\
}\
} while (0)
#else
#define cm_print_log(api, fmt, args ...) do {printf(fmt, ## args);fflush(stdout);} while (0)
#endif
#define cm_dprintf(fmt, args ...) do {\
if (cm_common_conf.log_level > 1)\
cm_print_log(cm_api_handle, 0, "DBG " fmt, ## args);\
} while (0)
#define cm_printf(fmt, args ...) cm_print_log(cm_api_handle, 0, fmt, ## args)
#define cm_flag_printf(fmt, args ...) cm_print_log(cm_api_handle, \
CM_LOG_FLAG, fmt, ## args)
#define cm_eprintf(fmt, args ...) cm_print_log(cm_api_handle, 0, \
"ERR(%s) " fmt, __FUNCTION__, ## args)
#if defined(CONFIG_DM_INTERFACE)
int dmif_init(void);
int dmif_deinit(void);
#endif
char *cm_get_dev_idx2name(int dev_idx);
int cm_get_dhcp_ip(int dev_idx, char *ip);
int cm_get_filesize(const char *file);
int cm_read_file(const char *file, char *buf, int buf_size);
int cm_write_file(const char *file, char *buf, int buf_size, int flags);
#define cm_creat_file(file, buf, buf_size) \
cm_write_file(file, buf, buf_size, O_CREAT|O_WRONLY|O_TRUNC)
#define cm_append_file(file, buf, buf_size) \
cm_write_file(file, buf, buf_size, O_APPEND)
int cm_cmp_file(const char *file1, const char *file2);
int cm_get_dir_entry(const char *dir, int index, char *filepath, int size);
int cm_load_file_lines(const char *file, int lines, ...);
int cm_store_file_lines(const char *file, int lines, ...);
int cm_profiling_rf_up(int dev_idx);
int cm_auto_connect(int dev_idx);
int cm_disconnect_net(int dev_idx);
void cm_enable_auto_connet(int enable, int dev_idx);
void cm_request_auto_connection(int dev_idx);
void cm_retry_auto_connection(int dev_idx);
#endif