blob: e6f65ee19dc9ebdf35f19bf4d7a71684f6fe7dfc [file] [log] [blame]
/******************************************************************************
*(C) Copyright 2014 Marvell International Ltd.
* All Rights Reserved
******************************************************************************/
/* -------------------------------------------------------------------------------------------------------------------
*
* Filename: mbim_util.h
*
* Authors: Adrian Zelezniak
*
* Description: all utiliy functions and macros needed for the MIBM translator
*
* HISTORY:
* Jan 7, 2014 - Initial Version
*
* Notes:
*
******************************************************************************/
#ifndef MBIM_UTIL_H
#define MBIM_UTIL_H
/******************************************************************************
* Include files
******************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#if defined (__amd64)
#include <stddef.h>
#endif
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#ifdef HOST_BUILD
#include <string.h>
#endif
#include <unistd.h>
#if defined MBIM_MTIL
#include "MtilClientAPI.h"
#include "MtilAPI.h"
#endif
#include "mbim_types.h"
#include "mbim_protocol.h"
#include "mbim_basic.h"
/******************************************************************************
* extern defines
******************************************************************************/
#ifndef MIN
#define MIN(a,b) ((a)>(b)?(b):(a))
#endif
/* Disable compilation/link error - PCAP library currently isn't used */
#define PCAP_CMD_WRITE(b,l)
#define PCAP_RSP_WRITE(b,l)
#define MBIM_MANAGER_AT_PROPERTY "sys.mbim.manager.at"
/******************************************************************************
* Defines
******************************************************************************/
typedef enum _MBIM_ERROR_ENUM
{
MBIM_OK = 0,
MBIM_BIND_ERROR = -1,
MBIM_BIND_READ_ERROR = -2,
MBIM_BIND_WRITE_ERROR = -3,
MBIM_BIND_MEM_ERROR = -4,
MBIM_UUID_UKNOWN_ERROR = -5,
} MBIM_ERROR_ENUM;
#define DEFAULT_ALIGNMENT_BOUNDARY 4
#define ROUND_UP_TO(number, boundary) ((number) += ((number) % (boundary)) ? ((boundary) - ((number) % (boundary))) : 0)
#define ROUND_UP(number) ROUND_UP_TO(number, DEFAULT_ALIGNMENT_BOUNDARY)
#define ALIGN32(x) (((x) + 3) & 0xFFFFFFFC)
#define ALIGNED_OFFSET(OFFSET,SIZE) ALIGN32(OFFSET+SIZE)
#define LOG_BUF_SIZE 1024
/******************************************************************************
* MBIM_TLV_IE
******************************************************************************/
//Type values for MBIM_TLV_IE
typedef enum _MBIM_TLV_IE_TYPE
{
MBIM_TLV_TYPE_INVALID = 0,
MBIM_TLV_TYPE_UE_POLICIES,
MBIM_TLV_TYPE_SINGLE_NSSAI,
MBIM_TLV_TYPE_ALLOWED_NSSAI,
MBIM_TLV_TYPE_CFG_NSSAI,
MBIM_TLV_TYPE_DFLT_CFG_NSSAI,
MBIM_TLV_TYPE_PRECFG_DFLT_CFG_NSSAI,
MBIM_TLV_TYPE_REJ_NSSAI,
MBIM_TLV_TYPE_LADN,
MBIM_TLV_TYPE_TAI,
MBIM_TLV_TYPE_WCHAR_STR,
MBIM_TLV_TYPE_UINT16_TBL,
MBIM_TLV_TYPE_EAP_PACKET,
MBIM_TLV_TYPE_PCO,
MBIM_TLV_TYPE_ROUTE_SELECTION_DESCRIPTORS,
MBIM_TLV_TYPE_TRAFFIC_PARAMETERS,
MBIM_TLV_TYPE_WAKE_COMMAND,
MBIM_TLV_TYPE_WAKE_PACKET = 17,
} MBIM_TLV_IE_TYPE;
typedef struct _MBIM_TLV_IE
{
UINT16 Type;
UINT8 Reserved;
UINT8 PaddingLength;
UINT32 DataLength;
UINT8 Data[];
} MBIM_TLV_IE, *P_MBIM_TLV_IE;
#define MBIM_TLV_HEADER(data) ((P_MBIM_TLV_IE)(data))
#define MBIM_TLV_FIELD_TYPE(data) MBIM_TLV_HEADER (data)->Type
#define MBIM_TLV_FIELD_RESERVED(data) MBIM_TLV_HEADER (data)->Reserved
#define MBIM_TLV_FIELD_PADDING_LENGTH(data) MBIM_TLV_HEADER (data)->PaddingLength
#define MBIM_TLV_FIELD_DATA_LENGTH(data) MBIM_TLV_HEADER (data)->DataLength
#define MBIM_TLV_FIELD_DATA(data) MBIM_TLV_HEADER (data)->Data
#define MBIM_TLV_GET_TLV_TYPE(data) (MBIM_TLV_IE_TYPE) (MBIM_TLV_FIELD_TYPE (data))
#define MBIM_TLV_GET_DATA_LENGTH(data) (MBIM_TLV_FIELD_DATA_LENGTH (data))
#define MBIM_TLV_LEN(data) (8+MBIM_TLV_GET_DATA_LENGTH(data)+MBIM_TLV_FIELD_PADDING_LENGTH(data))
typedef struct _MBIM_SNSSAI
{
UINT8 length;
UINT8 SliceServiceType;
UINT8 sd[3];
UINT8 MappedSst;
UINT8 MappedSd[3];
}MBIM_SNSSAI, *P_MBIM_SNSSAI;
/******************************************************************************
* External variables
******************************************************************************/
/******************************************************************************
* Function prototypes
******************************************************************************/
void logReceivedMbimMsg(UINT32 msgId, UINT32 transId);
void logSentMbimMsg(char *msg);
int UUID2Index (P_MBIM_UUID uuid);
int Index2UUID (P_MBIM_UUID uuid_p, int uuidIndex);
int getNumOfFragments(int mbimMsgSize, int bufLen);
#if defined MBIM_MTIL
int MtilSimStatus2MbimSubscriberReadyState(int ret_code, int pin_code);
int MtilCauseCodeForNwError2Mbim(UINT32 result);
int getMaxDataClassSupported(P_MTIL_CNTI_STATUS_MSG pCnti);
int getMaxDataClassAvailable(P_MTIL_CNTI_STATUS_MSG pCnti, UINT64 *dlSpeed, UINT64 *ulSpeed);
#endif
void initSessionDb(int sessionId, char *apn, UINT32 ipType, P_MBIM_UUID contextType, int cid);
void resetSessionDb(int sessionId);
int getRegisterTech(int dataClass);
int RegisterTech2Mbim(int act);
int transCregAct2Mbim(int act);
int CodeSignalStr2MbimCodedValue(int signalStrength);
int CodeFer2MbimCodedValue(float fer);
int CodeBer2MbimCodedValue(float ber);
int getIpv4MaskLength(UINT32 mask);
int getIpv6MaskLength(UINT32 *mask);
BOOL checkForNumericOnlyChars(const CHAR * password);
void pinListFillPinDescriptor( P_MBIM_PIN_DESC pPinDesc,
MBIM_PIN_MODE_ENUM pinMode,
MBIM_PIN_FORMAT_ENUM pinFormat,
UINT32 pinLengthMax,
UINT32 pinLengthMin);
void setRoutingTable(int cid);
int getSessionIdFromCid(int cid);
int getFreeSessionId(void);
char hexToNum(char ch);
void mbim_disableAutoDial(void);
/*Added By JoshuaWang. @0125/2021 */
UINT32 mbim_htonl(UINT32 n);
UINT32 mbim_getTotalbitOne(UINT32 value);
#define mbim_(TYPE, MEMBER) ((size_t)&((TYPE *)0)->MEMBER)
void __mbim_log_print(int prio, const char *tag, const char *fmt, ...);
///////////////////////////////////////////////////
// Translation functions
//////////////////////////////////////////////////
int translateSimMsg2MbimSimMsg(int simMsg);
int copyStrToUtf16(char *dst, char*src, int sizeOfStr);
int copyUtf16ToStr(char *dst, char*src, int sizeOfUtf16);
int translateCopsRegMode(int regMode);
int translateCgattState(int state);
int translateCopsProvider2MbimProvider(int stat);
int translateMbimFlag2CmglStat(int flag);
int translateCmgrStat2MbimMessageStat(int status);
int translateSmsStatus2MbimSmsStatus(int smsStatus);
int translateMbimFlag2CmgdFlag(UINT8 mbimFlag);
int translateCregRegisterState2Mbim(int registerState);
int ReadCOMCfgFileAndSearchValue(char * token, char *value);
int at_tok_start(char **p_cur);
int at_tok_nextint(char **p_cur, int *p_out);
int at_tok_nextstr(char **p_cur, char **p_out);
int at_tok_hasmore(char **p_cur);
int at_tok_nextbool(char **p_cur, char *p_out);
int at_tok_nexthexint(char **p_cur, int *p_out);
UINT32 mbimipV4ToUINT(char *addr);
UINT32* mbimipV6ToUINT(char *addr);
int mbimisv6addrvalid(unsigned int *v6addr);
int mbimrsrptorssi(int rsrp);
int mbimrsrptocodeval(int rsrp);
short int2bcd(int val);
char mbim_hexToNum(char ch);
int mbim_ConvertHexToNum(char *inData, int inLen, char *outData);
void mbim_ConvertNumToHex(char *inData, int inLen, char *outData);
UINT32 mbim_tlv_new (UINT8 *tlv, int tlv_type, const UINT8 *tlv_data, UINT32 tlv_data_length);
UINT32 mbim_tlv_new_str(UINT8 *tlv, UINT8 *str, int len);
UINT32 mbim_tlv_new_u16(UINT8 *tlv, UINT8 *array, int len);
int mbim_parse_snssai(P_MBIM_SNSSAI info, char *snssai);
UINT32 mbim_tlv_new_precfg_dflt_cfg_nssai(UINT8 *tlv, int tlv_type, int acctype, UINT8 *nssaitlv, int nssaitlv_len);
UINT8 * mbim_tlv_new_cfg_nssai(int tlv_type, P_MBIM_SNSSAI pNssai, int num, int *tlv_len);
#if defined USER_STRINGS_ARRAY_CLASS
/***************************************************
* Strings array functions
**************************************************/
#define STRING_ARRAY_DEFAULT_COUNT 5
#define STRING_ARRAY_DEFAULT_GROW 5
typedef struct _StringArrayClassS
{
char **stringsArray;
int stringsCount;
int allocCount;
}StringArrayClassS;
typedef void * StringArrayHandleT;
StringArrayHandleT StringArrayInit (int count);
int StringArrayAddString(StringArrayHandleT handle, char *string);
char ** StringArrayGetStrings(StringArrayHandleT handle);
int StringArrayGetCount(StringArrayHandleT handle);
void StringArrayFree(StringArrayHandleT handle);
#endif //USE_STRINGS_ARRAY_CLASS
#endif