blob: 45b7857e4f7e2bd3d0c13972607f46f34cc778cc [file] [log] [blame]
/******************************************************************************
*(C) Copyright 2014 Marvell International Ltd.
* All Rights Reserved
******************************************************************************/
/* -------------------------------------------------------------------------------------------------------------------
*
* Filename: mbim_ril_ind.c
*
* Authors: Boaz Sommer
*
* Description: MBIM RIL indications interface
*
* HISTORY:
*
* Nov 23, 2014 - Initial Version
*
* Notes:
*
******************************************************************************/
#define LOG_TAG "MBIM"
/******************************************************************************
* Include files
******************************************************************************/
#include "mbim_types.h"
#include "mbim_protocol.h"
#include "mbim_basic.h"
#include "mbim_sms.h"
#include "mbim_util.h"
#include "mbim_ussd.h"
#include "mbim_ril.h"
#include "mbim_ril_ind.h"
#include "mbim_ubus.h"
#include "rilutil.h"
#include "ril_ext.h"
extern P_MBIM_MESSAGE_CONTEXT g_setupdatacallcontext;
#define DEFAULT_CONTEXT_ALLOC_SIZE (4000)
#define CREATE_INDICATION_CONTEXT(pContext, mBuf, mCid, uuidIdx) \
MBIM_LOGD("MBIM INDICATION Cid = %d, uuidIndex = %d", mCid, uuidIdx ); \
pContext = (P_MBIM_MESSAGE_CONTEXT)MBIM_MALLOC(sizeof(MBIM_MESSAGE_CONTEXT)); \
if (pContext != NULL) { \
pContext->hdr.cid = mCid; \
pContext->hdr.transId = 0; \
pContext->hdr.uuidIndex = uuidIdx; \
pContext->hdr.indication= MBIM_NOTIFICATION; \
pContext->body = mBuf; \
pContext->cmd = NULL; \
} \
else { \
if (mBuf != NULL) \
MBIM_FREE(mBuf); \
MBIM_LOGE("BASIC UUID: %d OUT OF MEMORY CID %d", uuidIdx, mCid); \
return; \
}
#define ALLOCATE_RESPONSE_BUFFER(mBuf_p, mSize) \
mBuf_p = (char *)MBIM_MALLOC(mSize); \
if (mBuf_p == NULL) { \
MBIM_LOGE("INDICATIONS: OUT OF MEMORY"); \
return; \
} \
else { \
memset(mBuf_p, 0, mSize); \
}
UINT32 MbimRilGetAvailableDataClass (RIL_RadioTechnology rilRadioTech)
{
UINT32 ret;
switch (rilRadioTech)
{
case RADIO_TECH_UNKNOWN:
ret = MBIMDataClassNone;
break;
case RADIO_TECH_GPRS:
ret = MBIMDataClassGPRS;
break;
case RADIO_TECH_EDGE:
ret = MBIMDataClassEDGE;
break;
case RADIO_TECH_UMTS:
ret = MBIMDataClassUMTS;
break;
case RADIO_TECH_HSDPA:
ret = MBIMDataClassHSDPA;
break;
case RADIO_TECH_HSUPA:
ret = MBIMDataClassHSUPA;
break;
case RADIO_TECH_LTE:
case RADIO_TECH_LTEP:
ret = MBIMDataClassLTE;
break;
case RADIO_TECH_EVDO_0:
ret = MBIMDataClass1XEVDO;
break;
case RADIO_TECH_EVDO_A:
ret = MBIMDataClass1XEVDORevA;
break;
case RADIO_TECH_EVDO_B:
ret = MBIMDataClass1XEVDORevB;
break;
case RADIO_TECH_EUTRAN_TO_5GCN:
case RADIO_TECH_NR_TO_5GCN:
ret = MBIMDataSubClass5GNR;
break;
case RADIO_TECH_GSM:
default:
ret = MBIMDataClassCustom;
break;
}
return ret;
}
static void MbimRilHandleSimStatusChangedInd (void)
{
char *buf = NULL;
P_MBIM_MESSAGE_CONTEXT mContext = NULL;
////////////////////////////////////////////////////////////
// Send UUID_SUBSCRIBER_READY_STATUS indication
////////////////////////////////////////////////////////////
ALLOCATE_RESPONSE_BUFFER(buf, DEFAULT_CONTEXT_ALLOC_SIZE);
CREATE_INDICATION_CONTEXT(mContext, buf, UUID_SUBSCRIBER_READY_STATUS, UUID_BASIC_CONNECT_INDEX);
MbimRilRequestSimStatus((void *)mContext);
}
static void MbimRilHandleRadioStateChangedInd (void *data, int len)
{
UNUSEDPARAM(len);
char *buf = NULL;
P_MBIM_MESSAGE_CONTEXT pContext = NULL;
P_MBIM_RADIO_STATE_INFO pRadioStateInfo = NULL;
RIL_RadioState *rilRadioState;
rilRadioState = (RIL_RadioState *)data;
if (rilRadioState)
{
mbimDb.RadioState = (*rilRadioState == RADIO_STATE_OFF)?MBIMRadioOff:MBIMRadioOn;
MBIM_LOGD("%s: rilRadioState = %d", __FUNCTION__, (int)(*rilRadioState));
////////////////////////////////////////////////////////////
// Send UUID_SUBSCRIBER_READY_STATUS indication
////////////////////////////////////////////////////////////
ALLOCATE_RESPONSE_BUFFER(buf, DEFAULT_CONTEXT_ALLOC_SIZE);
CREATE_INDICATION_CONTEXT(pContext, buf, UUID_RADIO_STATE, UUID_BASIC_CONNECT_INDEX);
pRadioStateInfo = (P_MBIM_RADIO_STATE_INFO)pContext->body;
pRadioStateInfo->HwRadioState = MBIMRadioOn;
pRadioStateInfo->SwRadioState = mbimDb.RadioState;
MbimSendIndicateStatusMsg( pContext->hdr.uuidIndex, pContext->hdr.cid,
sizeof(MBIM_RADIO_STATE_INFO), pContext->body );
MBIM_FREE_CONTEXT(pContext);
}
}
static void MbimRilHandleVoiceNetworkChangedInd (void)
{
char *buf = NULL;
P_MBIM_MESSAGE_CONTEXT mContext = NULL;
////////////////////////////////////////////////////////////
// Send UUID_SUBSCRIBER_READY_STATUS indication
////////////////////////////////////////////////////////////
ALLOCATE_RESPONSE_BUFFER(buf, DEFAULT_CONTEXT_ALLOC_SIZE);
CREATE_INDICATION_CONTEXT(mContext, buf, UUID_REGISTER_STATE, UUID_BASIC_CONNECT_INDEX);
MbimTelRequestRegistrationStatus(mContext);
}
static void MbimRilHandleVoiceRadioTechChangedInd (void *data, int len)
{
UNUSEDPARAM(len);
RIL_RadioTechnology *rilRadioTech = (RIL_RadioTechnology *)data;
if (rilRadioTech)
{
mbimDb.mbimRegisterTech = MbimRilGetAvailableDataClass(*rilRadioTech);
}
}
static void MbimRilHandleSignalStrengthInd (void *data, int len)
{
UNUSEDPARAM(len);
char *buf = NULL;
P_MBIM_MESSAGE_CONTEXT pContext = NULL;
P_MBIM_SIGNAL_STATE_INFO signalStateInfo;
RIL_SignalStrength_v6 *rilSignalStrength;
////////////////////////////////////////////////////////////
// Send UUID_SUBSCRIBER_READY_STATUS indication
////////////////////////////////////////////////////////////
ALLOCATE_RESPONSE_BUFFER(buf, DEFAULT_CONTEXT_ALLOC_SIZE);
CREATE_INDICATION_CONTEXT(pContext, buf, UUID_SIGNAL_STATE, UUID_BASIC_CONNECT_INDEX);
signalStateInfo = (P_MBIM_SIGNAL_STATE_INFO)buf;
if (data == NULL)
{
//In case of receiveg this command we always send reponse (for Query and for Set)
signalStateInfo->signalStrengthInterval = (mbimDb.signalState.signalStrengthInterval?mbimDb.signalState.signalStrengthInterval:1);
signalStateInfo->RssiThreshold = 0;//mbimDb.signalState.rssiThreshold;
signalStateInfo->errorRateThreshold = CID_SIGNAL_STRENGTH_ERROR_RATE_THR_DONT_CARE;
signalStateInfo->rssi = mbimDb.signalState.rssiDb;
signalStateInfo->errorRate = CID_SIGNAL_STRENGTH_ERROR_RATE_UNKOWN;//CodeBer2MbimCodedValue(mbimDb.signalState.errorRate);
}
else
{
rilSignalStrength = (RIL_SignalStrength_v6 *)data;
MBIM_LOGE("Signal strength notification, stregth = (%d, %d)",
rilSignalStrength->GW_SignalStrength.signalStrength,
rilSignalStrength->LTE_SignalStrength.signalStrength);
signalStateInfo->signalStrengthInterval = (mbimDb.signalState.signalStrengthInterval?mbimDb.signalState.signalStrengthInterval:1);
signalStateInfo->RssiThreshold = 0;//mbimDb.signalState.rssiThreshold;
signalStateInfo->errorRateThreshold = CID_SIGNAL_STRENGTH_ERROR_RATE_THR_DONT_CARE;
signalStateInfo->rssi = rilSignalStrength->LTE_SignalStrength.rsrq;//rilSignalStrength->GW_SignalStrength.signalStrength;
signalStateInfo->errorRate = rilSignalStrength->GW_SignalStrength.bitErrorRate;
}
MbimSendIndicateStatusMsg( pContext->hdr.uuidIndex, pContext->hdr.cid,
sizeof(MBIM_SIGNAL_STATE_INFO), pContext->body );
}
#if defined DEPRICATED_REQUEST_DATA_LIST
static void MbimRilSendIpConfigurationInd(int sessionId)
{
char *buf;
P_MBIM_IP_CONFIGURATION_INFO pIpConfigInfoRsp = NULL;
P_MBIM_IPV4_ELEMENT pIpv4Element = NULL;
P_MBIM_IPV4_ADDRESS pIpv4Address = NULL;
int dataLen = 0;
ALLOCATE_RESPONSE_BUFFER(buf, DEFAULT_CONTEXT_ALLOC_SIZE);
pIpConfigInfoRsp = (P_MBIM_IP_CONFIGURATION_INFO)buf;
///////////////////////////////////////
//No error, process the command
///////////////////////////////////////
memset((char *)pIpConfigInfoRsp, 0, sizeof(MBIM_IP_CONFIGURATION_INFO));
pIpConfigInfoRsp->sessionId = sessionId;
if (1/*mbimDb.loopbackEnabled == FALSE*/)
{
//This is provisory
/////////////////////////////
//Set available (For Hostless mode) --> Need to add if
/////////////////////////////
pIpConfigInfoRsp->ipPv4ConfigurationAvailable.intRepresentation = 0xffffffff;
pIpConfigInfoRsp->iPv4AddressCount = 1;
pIpConfigInfoRsp->iPv4AddressOffset = offsetof(MBIM_IP_CONFIGURATION_INFO, dataBuffer[0]);
pIpv4Element = (P_MBIM_IPV4_ELEMENT)((char *)pIpConfigInfoRsp + pIpConfigInfoRsp->iPv4AddressOffset);
pIpv4Element->onLinkPrefixLength = IP_CONFIG_MASK_LEN;
*((UINT32 *)(&pIpv4Element->ipv4Address)) = IP_CONFIG_IPV4_ADDRESS_BASE + (mbimDb.session[sessionId].cid << 24);
pIpConfigInfoRsp->iPv4GatewayOffset = pIpConfigInfoRsp->iPv4AddressOffset + sizeof(MBIM_IPV4_ELEMENT)*pIpConfigInfoRsp->iPv4AddressCount;
pIpv4Address = (P_MBIM_IPV4_ADDRESS)((char *)pIpConfigInfoRsp + pIpConfigInfoRsp->iPv4GatewayOffset);
*((UINT32 *)pIpv4Address) = IP_CONFIG_GATEWAY;
pIpConfigInfoRsp->iPv4DnsServerCount = 1;
pIpConfigInfoRsp->iPv4DnsServerOffset = pIpConfigInfoRsp->iPv4GatewayOffset + sizeof(MBIM_IPV4_ADDRESS);
pIpv4Address = (P_MBIM_IPV4_ADDRESS)((char *)pIpConfigInfoRsp + pIpConfigInfoRsp->iPv4DnsServerOffset);
*((UINT32 *)pIpv4Address) = 0x08080808;
pIpConfigInfoRsp->iPv4Mtu = 1400;
dataLen = pIpConfigInfoRsp->iPv4DnsServerOffset + pIpConfigInfoRsp->iPv4DnsServerCount*sizeof(MBIM_IPV4_ADDRESS);
}
else
{
MBIM_LOGD("Loopback, Setting no IP as requested in SPEC");
pIpConfigInfoRsp->ipPv4ConfigurationAvailable.intRepresentation = 0;
pIpConfigInfoRsp->iPv4AddressCount = 0;
}
//Send Indication to host
MbimSendIndicateStatusMsg( UUID_BASIC_CONNECT_INDEX,
UUID_IP_CONFIGURATION,
dataLen,
(char *)pIpConfigInfoRsp);
#if 0
//Set routing tables
if (mbimDb.loopbackEnabled == FALSE)
setRoutingTable(mbimDb.session[pIpConfigInfoRsp->sessionId].cid);
#endif
//Free the allocated buffer
MBIM_FREE(buf);
}
#endif //DEPRICATED_REQUEST_DATA_LIST
static void MbimRilHandleDataCallListChangedInd (void *data, int len)
{
UNUSEDPARAM(data);
UNUSEDPARAM(len);
char *buf;
P_MBIM_MESSAGE_CONTEXT pContext = NULL;
ALLOCATE_RESPONSE_BUFFER(buf, DEFAULT_CONTEXT_ALLOC_SIZE);
CREATE_INDICATION_CONTEXT(pContext, buf, UUID_CONNECT, UUID_BASIC_CONNECT_INDEX);
MBIM_LOGD("%s: calling RIL_REQUEST_DATA_CALL_LIST", __FUNCTION__);
MbimRilRequestDataCallList(pContext);
}
#if defined DEPRICATED_REQUEST_DATA_LIST
static void MbimRilHandleDataCallListChangedInd (void *data, int len)
{
MBIM_CONNECT_INFO connectInfoRsp;
RIL_Data_Call_Response_v6 **rilDataCallList = (RIL_Data_Call_Response_v6 **)data;
int numDataCalls = len/sizeof(RIL_Data_Call_Response_v6);
int i;
int sessionId = MAX_NUM_OF_SESSIONS;
if (rilDataCallList)
{
MBIM_LOGD("%s: numDataCalls = %d", __FUNCTION__, numDataCalls);
for (i = 0 ; i < numDataCalls; i++)
{
MBIM_LOGD("%s: rilDataCallList[%d] = %08X", __FUNCTION__, i, rilDataCallList[i]);
if (rilDataCallList[i])
{
sessionId = getSessionIdFromCid(rilDataCallList[i]->cid);
MBIM_LOGD("%s: cid = %d, sessionId = %d", __FUNCTION__, rilDataCallList[i]->cid, sessionId);
if (sessionId < MAX_NUM_OF_SESSIONS)
{
connectInfoRsp.sessionId = sessionId;
connectInfoRsp.activationState = (rilDataCallList[i]->active == 0)?MBIMActivationStateDeactivated:MBIMActivationStateActivated;
connectInfoRsp.voiceCallState = MBIMVoiceCallStateNone;
connectInfoRsp.ipType = MBIMContextIPTypeIPv4;
memcpy((char *)&connectInfoRsp.contextType,MBIMContextTypeInternet, sizeof(MBIM_UUID));
connectInfoRsp.nwError = 0;
//Update the database
mbimDb.session[sessionId].ipType = connectInfoRsp.ipType;
memcpy(mbimDb.session[sessionId].contextType.uuid, MBIMContextTypeInternet, sizeof(MBIM_UUID));
MBIM_LOGD("%s: Sending Ind: SessionId = %d, IpType = %d", __FUNCTION__, sessionId, mbimDb.session[sessionId].ipType);
//Send Indication to MBIM host taht we are connected
MbimSendIndicateStatusMsg( UUID_BASIC_CONNECT_INDEX,
UUID_CONNECT,
sizeof(MBIM_CONNECT_INFO),
(char *)&connectInfoRsp);
break;
}
else if (rilDataCallList[i]->active) // activate new PDP
{
mbimDb.cidActivated = rilDataCallList[i]->cid;
}
}
}
}
if (sessionId < MAX_NUM_OF_SESSIONS)
MbimRilSendIpConfigurationInd(sessionId);
}
#endif //DEPRICATED
static void MbimRilHandlePsAttachStateChangeInd (void *data, int len)
{
UNUSEDPARAM(len);
P_MBIM_PACKET_SERVICE_INFO pPacketServiceInfo;
char *packetStatus = (char *)data;
char *buf;
P_MBIM_MESSAGE_CONTEXT pContext = NULL;
ALLOCATE_RESPONSE_BUFFER(buf, DEFAULT_CONTEXT_ALLOC_SIZE);
CREATE_INDICATION_CONTEXT(pContext, buf, UUID_PACKET_SERVICE, UUID_BASIC_CONNECT_INDEX);
pPacketServiceInfo = (P_MBIM_PACKET_SERVICE_INFO)buf;
if (packetStatus)
{
if (*packetStatus == 0)
pPacketServiceInfo->packetServiceState = MBIMPacketServiceStateDetached;
else
pPacketServiceInfo->packetServiceState = MBIMPacketServiceStateAttached;
}
MbimRilRequestPacketServiceStatus(pContext);
}
#define CHECK_HDR2(context, mcid, uuid, notification) \
( (context->hdr.cid == mcid) && \
(context->hdr.uuidIndex == uuid) && \
(context->hdr.indication == notification ) )
static void MbimRilHandlePdpActivedChangeInd (void *data, int len)
{
P_MBIM_MESSAGE_CONTEXT pContext = g_setupdatacallcontext;;
P_MBIM_SET_CONNECT pSetConnect = NULL;
P_MBIM_CONNECT_INFO pConnectInfoRsp = NULL;
MBIM_STATUS_CODE_ENUM mbimStatus = MBIM_STATUS_SUCCESS;
char apn[128];
UNUSEDPARAM(len);
int state = *(int *)data;
int cid = *((int *)data+1);
MBIM_LOGD("%s: actived = %d, cid = %d.", __FUNCTION__, state, cid);
/* Just matched CID Indication is parsed. */
if(mbimDb.cidActivated != cid)
{
return;
}
if(pContext == NULL)
{
return;
}
///////////////////////////////////////////////////////////////
//Check if the answer is "Basic Connect" && "UUID_CONNECT"
///////////////////////////////////////////////////////////////
if (CHECK_HDR2(pContext, UUID_CONNECT, UUID_BASIC_CONNECT_INDEX, MBIM_REQUEST))
{
pSetConnect = (P_MBIM_SET_CONNECT)pContext->cmd;
pConnectInfoRsp = (P_MBIM_CONNECT_INFO)pContext->body;
pConnectInfoRsp->sessionId = pSetConnect->sessionId;
pConnectInfoRsp->ipType = pSetConnect->ipType;
if (0 == state) {
pConnectInfoRsp->activationState = MBIMActivationStateDeactivated;
mbimDb.cidstatus[cid-1] = 0;
}
else {
pConnectInfoRsp->activationState = MBIMActivationStateActivated;
mbimDb.cidstatus[cid-1] = 1;
}
pConnectInfoRsp->nwError = 0;
pConnectInfoRsp->voiceCallState = MBIMVoiceCallStateNone;
memcpy((char *)&pConnectInfoRsp->contextType,(char *)&pSetConnect->contextType, sizeof(MBIM_UUID));
if(1){
copyUtf16ToStr(apn, ((char *)pSetConnect) + pSetConnect->accessStringOffset, MIN((int)pSetConnect->accessStringSize,128));
initSessionDb(pSetConnect->sessionId, apn, pSetConnect->ipType, &pSetConnect->contextType, cid);
}
if (mbimDb.sim.simReadyState == MBIMSubscriberReadyStateSimNotInserted)
mbimStatus = MBIM_STATUS_SIM_NOT_INSERTED;
else if (mbimDb.sim.simReadyState == MBIMSubscriberReadyStateBadSim)
mbimStatus = MBIM_STATUS_BAD_SIM;
MbimSendCommandDone( pContext->hdr.transId,
pContext->hdr.uuidIndex,
pContext->hdr.cid,
mbimStatus,
sizeof(MBIM_CONNECT_INFO),
pContext->body );
MBIM_FREE_CONTEXT(pContext);
g_setupdatacallcontext = NULL;
}
else if (CHECK_HDR2(pContext, UUID_CONNECT, UUID_BASIC_CONNECT_INDEX, MBIM_NOTIFICATION))
{
pConnectInfoRsp = (P_MBIM_CONNECT_INFO)pContext->body;
int sid = pConnectInfoRsp->sessionId;
pConnectInfoRsp->activationState = mbimDb.session[sid].sessionState;
pConnectInfoRsp->voiceCallState = MBIMVoiceCallStateNone;
pConnectInfoRsp->nwError = 0;
pConnectInfoRsp->ipType = mbimDb.session[sid].ipType;
memcpy((char *)&pConnectInfoRsp->contextType,(char *)&mbimDb.session[sid].contextType, sizeof(MBIM_UUID));
MbimSendIndicateStatusMsg(pContext->hdr.uuidIndex, pContext->hdr.cid,
sizeof(MBIM_CONNECT_INFO),
pContext->body);
MBIM_FREE_CONTEXT(pContext);
g_setupdatacallcontext = NULL;
}
}
static void MbimRilHandleSmsMemStatusInd (void *data, int len)
{
if(len != 2)
return;
int sms_ready = *(int *)data;
int sms_full = *((int *)data+1);
MBIM_LOGD("%s: smsR = %d, smsF = %d.", __FUNCTION__, sms_ready, sms_ready);
if (sms_ready == 0 || sms_ready == 2 || sms_ready == 3)
mbimDb.smsready = 1;
else
mbimDb.smsready = 0;
mbimDb.smsfull = sms_full;
return;
}
void MbimRilHandleCmConnectionNotification (struct cm_connection_info *connection_info)
{
RIL_Data_Call_Response_v6 *data_call_info[2];
char iptype_str [3][10] = {"IPV4V6", "IPV4", "IPV6"};
MBIM_LOGD("%s: active = %d, cid = %d, type = %d (%s)", __FUNCTION__,
connection_info->status, connection_info->cid, connection_info->iptype,
(connection_info->iptype < (int)((sizeof(iptype_str)/sizeof(*iptype_str))))?iptype_str[connection_info->iptype]:"");
data_call_info[0] = calloc(1, sizeof(RIL_Data_Call_Response_v6));
if (data_call_info[0] == NULL)
{
MBIM_LOGE("%s: allocation of data_call_info[0] failed", __FUNCTION__);
return;
}
data_call_info[0]->active = (connection_info->status == 0)?0:1;
data_call_info[0]->cid = connection_info->cid-1;
if (connection_info->iptype < (int)((sizeof(iptype_str)/sizeof(*iptype_str))))
data_call_info[0]->type = strdup (iptype_str[connection_info->iptype]);
else
{
data_call_info[0]->type = strdup ("");
MBIM_LOGE("%s: wrong iptype = %d", __FUNCTION__, connection_info->iptype);
}
MbimRilHandleDataCallListChangedInd(&data_call_info, sizeof(RIL_Data_Call_Response_v6));
free(data_call_info[0]->type);
free(data_call_info[0]);
}
void MbimRilHandleUnsolicitedNotification (unsigned int requestid, void *data, int datalen)
{
switch(requestid)
{
case RIL_UNSOL_RESPONSE_SIM_STATUS_CHANGED:
MbimRilHandleSimStatusChangedInd();
break;
case RIL_UNSOL_RESPONSE_RADIO_STATE_CHANGED:
MbimRilHandleRadioStateChangedInd(data, datalen);
break;
case RIL_UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED:
MbimRilHandleVoiceNetworkChangedInd();
break;
case RIL_UNSOL_VOICE_RADIO_TECH_CHANGED:
MbimRilHandleVoiceRadioTechChangedInd(data, datalen);
break;
case RIL_UNSOL_SIGNAL_STRENGTH:
MbimRilHandleSignalStrengthInd(data, datalen);
break;
case RIL_UNSOL_DATA_CALL_LIST_CHANGED:
MbimRilHandleDataCallListChangedInd(data, datalen);
break;
case RIL_UNSOL_PS_ATTACH_STATUS:
MbimRilHandlePsAttachStateChangeInd(data, datalen);
break;
case RIL_UNSOL_CON_STAT:
MbimRilHandlePdpActivedChangeInd(data, datalen);
break;
case RIL_UNSOL_SMS_MEM_STATUS:
MbimRilHandleSmsMemStatusInd(data, datalen);
break;
default:
MBIM_LOGD("%s: id of %d is not supported\n", __FUNCTION__,requestid);
}
}