VOS_UINT32 TAF_APS_RcvEsmSmEpsBearerInfoInd_Active(
    VOS_UINT32                          ulEventType,
    struct MsgCB                       *pstMsg
)
{
    VOS_UINT8                           ucPdpId;
    APS_PDP_CONTEXT_ENTITY_ST          *pstPdpEntity;
    TAF_APS_EPS_BEARER_INFO_IND_STRU   *pstBearerInfo;

    pstBearerInfo = (TAF_APS_EPS_BEARER_INFO_IND_STRU*)pstMsg;
    ucPdpId       = TAF_APS_GetCurrFsmEntityPdpId();

    /* 获取该PDPID的PDP实体内容地址 */
    pstPdpEntity = TAF_APS_GetPdpEntInfoAddr(ucPdpId);


    /* 根据EPS承载的操作类型(Activate, Deactivate, Modify),
       调用相应的处理函数 */
    if (SM_ESM_PDP_OPT_MODIFY == pstBearerInfo->enPdpOption)
    {
        MN_APS_ProcEsmBearerInfoIndOptModify(pstPdpEntity, pstBearerInfo);
    }
    else if (SM_ESM_PDP_OPT_DEACTIVATE == pstBearerInfo->enPdpOption)
    {
        MN_APS_ProcEsmBearerInfoIndOptDeactivate(pstPdpEntity, pstBearerInfo);
    }
    else
    {
        TAF_WARNING_LOG(WUEPS_PID_TAF,"TAF_APS_RcvEsmSmEpsBearerInfoInd_Inactive: Wrong option.");
    }

    return VOS_TRUE;
}
VOS_VOID TAF_CBA_ParseSpecUsimFileData (
    VOS_UINT16                          usFileId,
    VOS_UINT8                           ucFileExistFlg,
    VOS_UINT8                          *pucEf,
    VOS_UINT16                          ulEfLen
)
{
    switch (usFileId)
    {
        case TAF_CBA_EF_CBMI_ID:
             TAF_CBA_ParseUsimFileEfCbmiData(ucFileExistFlg, pucEf, ulEfLen);
             break;

        case TAF_CBA_EF_CBMIR_ID:
             TAF_CBA_ParseUsimFileEfCbmirData(ucFileExistFlg, pucEf, ulEfLen);
             break;

        case TAF_CBA_EF_CBMID_ID:
             TAF_CBA_ParseUsimFileEfCbmidData(ucFileExistFlg, pucEf, ulEfLen);
             break;
             
        default:
            TAF_WARNING_LOG(WUEPS_PID_TAF, "TAF_CBA_ParseSpecUsimFileData: The input is invalid.");
            break;
    }
}
Esempio n. 3
0
VOS_VOID TAF_APS_SaveCurrSubFsmEntryMsg(
    VOS_UINT32                          ulEventType,
    struct MsgCB                       *pstMsg
)
{
    TAF_APS_ENTRY_MSG_STRU             *pstEntryMsg  = VOS_NULL_PTR;
    MSG_HEADER_STRU                    *pstMsgHeader = VOS_NULL_PTR;
    VOS_UINT32                          ulLen;

    /* 获得当前处理入口消息的缓冲区地址 */
    /* 获得当前处理APS入口消息的缓冲区地址 */
    pstEntryMsg                 =   TAF_APS_GetCurrSubFsmMsgAddr();
    pstMsgHeader                =   (MSG_HEADER_STRU*)pstMsg;

    /* 如果是空消息 */
    if ( VOS_NULL_PTR == pstMsg )
    {
        pstEntryMsg->ulEventType    =   ulEventType;
        TAF_WARNING_LOG( WUEPS_PID_TAF, "TAF_APS_SaveCurrSubFsmEntryMsg Entry Message Pointer is NULL!" );
        return;
    }

    ulLen  = pstMsgHeader->ulLength + VOS_MSG_HEAD_LENGTH;

    /* 将当前处理的入口消息拷贝到Context对应的缓冲区 */
    PS_MEM_CPY( pstEntryMsg->aucEntryMsgBuffer, pstMsg, ulLen );

    /* 填写Context中的参数 */
    pstEntryMsg->ulEventType    =   ulEventType;

    return;

}
VOS_UINT32 TAF_APS_RcvAtSetPdpContextStateReq_Inactive(
    VOS_UINT32                          ulEventType,
    struct MsgCB                       *pstMsg
)
{
    TAF_PS_MSG_STRU                    *pstAppMsg;
    TAF_PS_SET_PDP_STATE_REQ_STRU      *pstSetPdpCtxStateReq;

    /* 初始化, 获取消息内容 */
    pstAppMsg            = (TAF_PS_MSG_STRU*)pstMsg;
    pstSetPdpCtxStateReq = (TAF_PS_SET_PDP_STATE_REQ_STRU*)(pstAppMsg->aucContent);

    /* PDP激活操作处理 */
    if (TAF_CGACT_ACT == pstSetPdpCtxStateReq->stCidListStateInfo.ucState)
    {
        /*-------------------------------------------------------
           加载TAF_APS_STA_MS_ACTIVATING状态机
           加载后子状态切换为TAF_APS_MS_ACTIVATING_SUBSTA_INIT

           在TAF_APS_MS_ACTIVATING_SUBSTA_INIT子状态中处理
           ID_MSG_TAF_PS_SET_PDP_CONTEXT_STATE_REQ消息
        -------------------------------------------------------*/
        TAF_APS_InitSubFsm(TAF_APS_FSM_MS_ACTIVATING,
                           TAF_APS_GetMsActivatingFsmDescAddr(),
                           TAF_APS_MS_ACTIVATING_SUBSTA_INIT);
    }
    else
    {
        /* 指定去激活的CID处于未激活状态, 在预处理中已经处理, 这里不再处理 */
        TAF_WARNING_LOG(WUEPS_PID_TAF,
            "TAF_APS_RcvAtSetPdpContextStateReq_Inactive: Wrong operation");
    }

    return VOS_TRUE;
}
VOS_UINT32 TAF_APS_RcvMmcServiceStatusInd_Inactive(
    VOS_UINT32                          ulEventType,
    struct MsgCB                       *pstMsg
)
{
    MMC_APS_SERVICE_STATUS_IND_STRU    *pstMmcServiceStatusInd;

    /* 初始化, 获取消息内容 */
    pstMmcServiceStatusInd = (MMC_APS_SERVICE_STATUS_IND_STRU*)pstMsg;

    /* 更新接入技术 */
    TAF_APS_SetCurrPdpEntityRatType(pstMmcServiceStatusInd->enRatType);

    /* 更新PS域SIM卡状态 */
    TAF_APS_SetCurrPdpEntitySimRegStatus(pstMmcServiceStatusInd->ulPsSimRegStatus);

    /* 正常状态下只处理挂起指示 */
    if (MMC_APS_RAT_TYPE_NULL != pstMmcServiceStatusInd->enRatType)
    {
        TAF_WARNING_LOG(WUEPS_PID_TAF,
            "TAF_APS_RcvMmcServiceStatusInd_InactiveSuspend: Wrong RAT type!");
    }

    return VOS_TRUE;
}
VOS_UINT32 TAF_APS_RcvL4aPdpActivateInd_Inactive(
    VOS_UINT32                          ulEventType,
    struct MsgCB                       *pstMsg
)
{
    MMC_APS_RAT_TYPE_ENUM_UINT32        enCurrRatType;

    /* 获取当前网络模式*/
    enCurrRatType                       = TAF_APS_GetCurrPdpEntityRatType();

    /* 检查当前模是否为LTE, 如果不是, 丢弃该消息 */
    if (MMC_APS_RAT_TYPE_LTE != enCurrRatType)
    {
        TAF_WARNING_LOG(WUEPS_PID_TAF,
            "TAF_APS_RcvL4aPdpActivateInd_Inactive: Current RAT is not LTE!");
        return VOS_TRUE;
    }

    /* 迁移到子状态TAF_APS_NW_ACTIVATING_SUBSTA_INIT,在子状态
       TAF_APS_NW_ACTIVATING_SUBSTA_INIT中处理 ID_L4A_APS_PDP_ACTIVATE_IND
       消息
    */
    TAF_APS_InitSubFsm(TAF_APS_FSM_NW_ACTIVATING,
                       TAF_APS_GetNwActivatingFsmDescAddr(),
                       TAF_APS_NW_ACTIVATING_SUBSTA_INIT);

    return VOS_TRUE;
}
VOS_VOID MN_CALL_LineInfo(
    MNPH_USIM_STATUS_ENUM_U32           enUsimStatus
)
{
    MN_CALL_ALS_LINE_INFO_STRU          stAlsInfo;
    VOS_UINT8                           aucMmaImsi[9];
    VOS_BOOL                            bWriteNvim;
    VOS_UINT32                          ulLength;

    ulLength = 0;
    stAlsInfo.enAlsLine = MN_CALL_ALS_LINE_NO_BUTT;
    PS_MEM_SET(stAlsInfo.aucMmaImsi, 0x00, sizeof(stAlsInfo.aucMmaImsi));

    if ( MNPH_USIM_STATUS_AVILABLE == enUsimStatus )
    {
        bWriteNvim = VOS_FALSE;

        if ( NV_OK != NV_Read(en_NV_Item_ALS_LINE_Config,&stAlsInfo,sizeof(stAlsInfo)))
        {
            return;
        }
        if ( USIMM_API_SUCCESS != NAS_USIMMAPI_GetCardIMSI(aucMmaImsi) )
        {
            return ;
        }

        /*线路号值不在取值范围内*/
        if  ( ( MN_CALL_ALS_LINE_NO_1 != stAlsInfo.enAlsLine )
           && ( MN_CALL_ALS_LINE_NO_2 != stAlsInfo.enAlsLine ) )
        {
            stAlsInfo.enAlsLine = MN_CALL_ALS_LINE_NO_1;
            bWriteNvim = VOS_TRUE;
        }

        /*判断NV中当前使用线路号对应的IMSI和SIM卡中IMSI是否相同,若不同则清NV
          项,并填入默认线路号1*/
        if ( 0 != VOS_StrCmp( (VOS_CHAR *)aucMmaImsi,
                               (VOS_CHAR *)stAlsInfo.aucMmaImsi) )
        {
            stAlsInfo.enAlsLine = MN_CALL_ALS_LINE_NO_1;
            PS_MEM_CPY(stAlsInfo.aucMmaImsi,aucMmaImsi,9);
            bWriteNvim = VOS_TRUE;
        }

        /*需要更新NVIM*/
        if ( VOS_TRUE == bWriteNvim )
        {
            NV_GetLength(en_NV_Item_ALS_LINE_Config, &ulLength);
            if (NV_OK != NV_Write(en_NV_Item_ALS_LINE_Config,
                     &stAlsInfo,
                     ulLength) )
            {
                TAF_WARNING_LOG(WUEPS_PID_TAF, "MN_CALL_LineInfo: en_NV_Item_ALS_LINE_Config NV Write Fail!");
            }
        }

        MN_CALL_UpdateAlsLineInfo(stAlsInfo.enAlsLine,VOS_FALSE);
    }
}
VOS_UINT32  TAF_SPM_BuildUssdFdnInfo(
    struct MsgCB                       *pstMsg,
    PS_PB_FDN_NUM_STRU                 *pstFdnInfo
)
{
    VOS_UINT32                          ulAsciiStrLen;
    VOS_UINT8                          *pucAsciiStr = VOS_NULL_PTR;
    MN_APP_REQ_MSG_STRU                *pstAppMsg   = VOS_NULL_PTR;
    VOS_UINT32                          ulRet;

    /* 调用转换函数获取ASCII格式的字符串 */
    pucAsciiStr = PS_MEM_ALLOC(WUEPS_PID_TAF, TAF_SS_MAX_USSDSTRING_LEN);
    if (VOS_NULL_PTR == pucAsciiStr)
    {
        TAF_WARNING_LOG(WUEPS_PID_TAF, "TAF_SPM_BuildUssdFdnInfo: Fail to alloc memory.");
        return VOS_FALSE;
    }

    pstAppMsg       = (MN_APP_REQ_MSG_STRU *)pstMsg;

    ulAsciiStrLen  = 0;
    PS_MEM_SET(pucAsciiStr,  0, TAF_SS_MAX_USSDSTRING_LEN);

    ulRet = TAF_SPM_TransUssdMsgToAsciiStr((TAF_SS_PROCESS_USS_REQ_STRU*)pstAppMsg->aucContent,
                                            pucAsciiStr,
                                            &ulAsciiStrLen);
    if (VOS_FALSE == ulRet)
    {
        PS_MEM_FREE(WUEPS_PID_TAF, pucAsciiStr);
        TAF_WARNING_LOG(WUEPS_PID_TAF, "TAF_SPM_BuildUssdFdnInfo: Fail to TAF_SDC_TransUssdMsgToAsciiStr.");
        return VOS_FALSE;
    }

    /* FDN中的num1只能保存40个ascii码 */
    PS_MEM_SET(pucAsciiStr + TAF_SPM_FDN_CHECK_STR_MAX_LEN, 0, TAF_SPM_FDN_CHECK_7BIT_MAX_LEN - TAF_SPM_FDN_CHECK_STR_MAX_LEN);

    ulRet = TAF_STD_ConvertAsciiNumberToBcd((VOS_CHAR *)pucAsciiStr, pstFdnInfo->aucNum1, (VOS_UINT8 *)&pstFdnInfo->ulNum1Len);
    PS_MEM_FREE(WUEPS_PID_TAF, pucAsciiStr);
    if (MN_ERR_NO_ERROR != ulRet)
    {
        return VOS_FALSE;
    }

    return VOS_TRUE;
}
Esempio n. 9
0
VOS_UINT32  TAF_MMA_SndInternalMsg(
    VOS_VOID                           *pSndMsg
)
{
    VOS_UINT8                           ucMsgPnt;
    TAF_MMA_INTERNAL_MSG_BUF_STRU      *pstMmaMsg           = VOS_NULL_PTR;
    TAF_MMA_INTERNAL_MSG_QUEUE_STRU    *pstInternalMsgQueue = VOS_NULL_PTR;
    TAF_MMA_INTERNAL_MSG_BUF_STRU      *pstSndMsg           = VOS_NULL_PTR;

    pstInternalMsgQueue                 = &(TAF_MMA_GetMmaCtxAddr()->stInternalMsgQueue);
    pstSndMsg                           = (TAF_MMA_INTERNAL_MSG_BUF_STRU*)pSndMsg;

    /* 1. 判断内部消息缓冲区是否已满 */
    ucMsgPnt = pstInternalMsgQueue->ucTail;
    if ( ((ucMsgPnt + 1) % TAF_MMA_MAX_MSG_QUEUE_SIZE) == pstInternalMsgQueue->ucHeader )
    {
        TAF_WARNING_LOG(WUEPS_PID_MMA, "TAF_MMA_SndInternalMsg:Warning: The Queue is full.");
        TAF_MMA_SndOmInternalMsgQueueInfo(VOS_TRUE, VOS_FALSE);
        return VOS_FALSE;
    }

    /* 2. 取得一个消息缓冲单元 */
    pstMmaMsg = (TAF_MMA_INTERNAL_MSG_BUF_STRU *)&(pstInternalMsgQueue->astMmaMsgQueue[ucMsgPnt]);

    /* 3. 判断消息长度是否非法 */
    if ( pstSndMsg->ulLength > TAF_MMA_MAX_MSG_BUFFER_LEN)
    {
        TAF_WARNING_LOG(WUEPS_PID_MMC, "TAF_MMA_SndInternalMsg:Warning: ulBufLen is too long.");
        return VOS_FALSE;
    }

    TAF_NORMAL_LOG1(WUEPS_PID_MMA, "TAF_MMA_SndInternalMsg: usMsgID is ", pstMmaMsg->usMsgID);

    /* 4. 将内部消息发送到内部消息队列中 */
    PS_MEM_CPY(pstMmaMsg, pstSndMsg, sizeof(TAF_MMA_INTERNAL_MSG_BUF_STRU));

    /* 更新内部消息缓冲区 */
    pstInternalMsgQueue->ucTail++;
    pstInternalMsgQueue->ucTail         %= TAF_MMA_MAX_MSG_QUEUE_SIZE;

    return VOS_TRUE;
}
VOS_UINT32  TAF_SPM_BuildSsFdnInfo(
    struct MsgCB                       *pstMsg,
    PS_PB_FDN_NUM_STRU                 *pstFdnInfo
)
{
    VOS_UINT32                          ulRet;
    VOS_CHAR                           *pcMmiStr       = VOS_NULL_PTR;

    /* 根据消息转换出SSC STRING */
    pcMmiStr   = (VOS_CHAR *)PS_MEM_ALLOC(WUEPS_PID_TAF, TAF_SPM_SSC_MAX_LEN);

    if (VOS_NULL_PTR == pcMmiStr)
    {
        TAF_WARNING_LOG(WUEPS_PID_TAF, "TAF_SPM_BuildSsFdnInfo: Fail to alloc memory for encode SSC.");
        return VOS_FALSE;
    }

    PS_MEM_SET(pcMmiStr, 0, TAF_SPM_SSC_MAX_LEN);
    ulRet          = TAF_MmiEncodeMmiString(pstMsg, pcMmiStr);

    if (VOS_TRUE != ulRet)
    {
        TAF_WARNING_LOG(WUEPS_PID_TAF, "TAF_SPM_BuildSsFdnInfo: Fail to Encode SSC string.");
        PS_MEM_FREE(WUEPS_PID_TAF, pcMmiStr);

        return VOS_FALSE;
    }

    ulRet = TAF_STD_ConvertAsciiNumberToBcd(pcMmiStr, pstFdnInfo->aucNum1, (VOS_UINT8 *)&(pstFdnInfo->ulNum1Len));
    PS_MEM_FREE(WUEPS_PID_TAF, pcMmiStr);

    if (MN_ERR_NO_ERROR != ulRet)
    {
        return VOS_FALSE;
    }

    return VOS_TRUE;
}
VOS_UINT32 TAF_APS_SndL4aPppDialReq(
    TAF_PS_PPP_DIAL_ORIG_REQ_STRU      *pstPppDialOrigReq,
    TAF_APS_AUTH_INFO_STRU             *pstAuthInfo,
    TAF_APS_IPCP_INFO_STRU             *pstIpcpInfo
)
{
    APS_L4A_PPP_DIAL_REQ_STRU          *pstPppDialReq;

    /* 构造消息 */
    pstPppDialReq = (APS_L4A_PPP_DIAL_REQ_STRU*)PS_ALLOC_MSG_WITH_HEADER_LEN(
                            WUEPS_PID_TAF,
                            sizeof(APS_L4A_PPP_DIAL_REQ_STRU));
    if (VOS_NULL_PTR == pstPppDialReq)
    {
        TAF_ERROR_LOG(WUEPS_PID_TAF, "TAF_APS_SndL4aPppDialReq: Memory alloc failed.");
        return VOS_ERR;
    }

    /* 初始化消息 */
    PS_MEM_SET((VOS_CHAR*)pstPppDialReq + VOS_MSG_HEAD_LENGTH,
                0x00,
                (sizeof(APS_L4A_PPP_DIAL_REQ_STRU) - VOS_MSG_HEAD_LENGTH));

    /* 填写消息头 */
    pstPppDialReq->ulReceiverCpuId         = VOS_LOCAL_CPUID;
    pstPppDialReq->ulReceiverPid           = MSP_L4_L4A_PID;
    pstPppDialReq->enMsgId                 = ID_APS_L4A_PPP_DIAL_REQ;

    /* 填写消息内容 */
    pstPppDialReq->stAppCtrl.ulPid         = WUEPS_PID_TAF;
    pstPppDialReq->stAppCtrl.ulClientId    = pstPppDialOrigReq->stCtrl.usClientId;
    pstPppDialReq->stAppCtrl.ulOpId        = pstPppDialOrigReq->stCtrl.ucOpId;
    pstPppDialReq->ulCid                   = pstPppDialOrigReq->stPppDialParaInfo.ucCid;

    PS_MEM_CPY((VOS_UINT8*)(&pstPppDialReq->stPppInfo.stAuthInfo),
               (VOS_UINT8*)(pstAuthInfo),
               sizeof(TAF_APS_AUTH_INFO_STRU));

    PS_MEM_CPY((VOS_UINT8*)(&pstPppDialReq->stPppInfo.stIpcpInfo),
               (VOS_UINT8*)(pstIpcpInfo),
               sizeof(TAF_APS_IPCP_INFO_STRU));

    /* 发送消息 */
    if (VOS_OK != PS_SEND_MSG(WUEPS_PID_TAF, pstPppDialReq))
    {
        TAF_WARNING_LOG(WUEPS_PID_TAF, "TAF_APS_SndL4aPppDialReq():WARNING:SEND MSG FIAL");
    }
    return VOS_OK;

}
VOS_UINT32 TAF_CBA_AddCbMiRangeListToActiveList(
    TAF_CBA_CBMI_RANGE_LIST_STRU       *pstOrgCbMirList
)
{
    VOS_UINT16                          usIndex;
    VOS_UINT32                          ulRet;
    TAF_CBA_CBMI_RANGE_LIST_STRU       *pstDstCbMirList;
    VOS_UINT32                          ulSaveIdx;
    VOS_UINT32                          ulCbmidIdx;

    pstDstCbMirList = TAF_CBA_GetCbMiRangeList();

    for ( usIndex = 0 ; usIndex < pstOrgCbMirList->usCbmirNum ; usIndex++ )
    {
        ulRet = TAF_CBA_IsCbmirExist(&(pstOrgCbMirList->astCbmiRangeInfo[usIndex]),
                                     pstDstCbMirList,
                                     &ulCbmidIdx);

        /* 原本在列表中存在,不需要加入 */
        if (VOS_TRUE == ulRet)
        {
            continue;
        }

        ulSaveIdx = TAF_CBA_GetCbmiRangNum();

        /* 列表满 */
        if ( ulSaveIdx >= TAF_CBA_MAX_CBMID_RANGE_NUM )
        {
            TAF_WARNING_LOG(WUEPS_PID_TAF, "TAF_CBA_AddCbmirListToActiveList:No available Index");
            return VOS_ERR;
        }

        pstDstCbMirList->astCbmiRangeInfo[ulSaveIdx].enRcvMode = TAF_CBA_CBMI_RANGE_RCV_MODE_ACCEPT;

        pstDstCbMirList->astCbmiRangeInfo[ulSaveIdx].usMsgIdFrom
            = pstOrgCbMirList->astCbmiRangeInfo[usIndex].usMsgIdFrom;

        pstDstCbMirList->astCbmiRangeInfo[ulSaveIdx].usMsgIdTo
            = pstOrgCbMirList->astCbmiRangeInfo[usIndex].usMsgIdTo;

        pstDstCbMirList->usCbmirNum++;

    }

    return VOS_OK;
}
VOS_UINT32 TAF_SPM_RcvAppReqMsg_Main(
    VOS_UINT32                          ulEventType,
    struct MsgCB                       *pstMsg
)
{
    VOS_UINT16                          usClientId;
    VOS_UINT8                           ucOpId;
    VOS_UINT8                           ucIdleFsmIndex;

    TAF_SPM_GetClientIdWithAppMsg(pstMsg, &usClientId);
    TAF_SPM_GetOpIdWithAppMsg(pstMsg, &ucOpId);

    /* 判断是否有存在空闲状态机 */
    ucIdleFsmIndex = TAF_SPM_GetIdleEntityFsmIndex();

    if (TAF_SPM_INVALID_CLIENT_ID_ENTITY_FSM_INDEX == ucIdleFsmIndex)
    {
        TAF_WARNING_LOG(WUEPS_PID_TAF, "TAF_SPM_RcvAppReqMsg_Main():WARNING: No Idle Entiy Fsm Exist!");

        /* 临时响应改为正式响应 */
        TAF_SPM_SendServiceRequetFail_Main(ulEventType, pstMsg, MN_ERR_CLASS_SPM_BEYOND_CONCURRENCY_CAPABILITY);

#if (FEATURE_ON == FEATURE_IMS)
        TAF_SPM_SetEconfPreRslt(TAF_CS_CAUSE_UNKNOWN);

        TAF_SPM_ReportEconfCheckRslt();
#endif
    }
    else
    {
        /* 设置当前状态机的索引 */
        TAF_SPM_SetCurrEntityFsmAddr(ucIdleFsmIndex);

        /* 设置当前client ID实体状态机的client ID */
        TAF_SPM_SetCurrEntityFsmClientId(usClientId);

        /* 启动service ctrl状态机,进行fdn&CALL control检查 */
        TAF_SPM_FSM_InitEntityFsm(TAF_SPM_FSM_SERVICE_CTRL,
                                  TAF_SPM_GetServiceCtrlFsmDescAddr(),
                                  TAF_SPM_SERVICE_CTRL_STA_INIT);
    }

    return VOS_TRUE;
}
VOS_UINT32 TAF_APS_RcvSndcpActivateRsp_Active(
    VOS_UINT32                          ulEventType,
    struct MsgCB                       *pstMsg
)
{
    VOS_UINT32                          ulResult;
    VOS_UINT8                           ucPdpId;
    APS_PDP_CONTEXT_ENTITY_ST          *pstPdpEntity;
    APS_SNDCP_ACTIVATE_RSP_ST          *pstSnActivateRsp;

    /* 初始化, 获取消息内容 */
    ulResult         = VOS_OK;
    pstSnActivateRsp = &((APS_SNDCP_ACTIVATE_RSP_MSG*)pstMsg)->ApsSnActRsp;
    ucPdpId          = TAF_APS_GetCurrFsmEntityPdpId();
    pstPdpEntity     = TAF_APS_GetPdpEntInfoAddr(ucPdpId);

    /* 检查消息参数 */
    ulResult = Aps_SnMsgModSnActRspParaCheck(pstSnActivateRsp);
    if (APS_PARA_VALID != ulResult)
    {
        TAF_WARNING_LOG(WUEPS_PID_TAF,
            "TAF_APS_RcvSndcpActivateRsp_Active: Check para failed!");

        /* 上报ID_EVT_TAF_PS_CALL_PDP_DEACTIVATE_IND事件 */
        TAF_APS_SndPdpDeActivateInd(ucPdpId, TAF_PS_CAUSE_SM_NW_PROTOCOL_ERR_UNSPECIFIED);

        /* 发送内部消息, 触发PDP去激活流程 */
        TAF_APS_SndInterPdpDeactivateReq(ucPdpId, SM_TAF_CAUSE_SM_NW_PROTOCOL_ERR_UNSPECIFIED);

        return VOS_TRUE;
    }

    /* 收到SN_ACT_RSP后修改APS实体参数, 包括XID参数, TRANSMODE */
    Aps_SnActRspChngEntity(pstSnActivateRsp, ucPdpId);

    /* 设置RABM的传输模式 */
    TAF_APS_SndRabmSetTransModeMsg(pstSnActivateRsp->ucNsapi,
                                   pstPdpEntity->GprsPara.TransMode);

    return VOS_TRUE;
}
Esempio n. 15
0
VOS_VOID TAF_SPM_ReadSimCallCtrlNvim(VOS_VOID)
{
    TAF_SPM_SERVICE_CTRL_CFG_INFO_STRU                     *pstServiceCtrlCfgInfo = VOS_NULL_PTR;
    MN_CALL_NVIM_SIM_CALL_CONTROL_FLG_STRU                  stSimCallCtrlFlg;

    pstServiceCtrlCfgInfo                           = TAF_SPM_GetServiceCtrlCfgInfoAddr();

    if (NV_OK != NV_Read(en_NV_Item_NVIM_SIM_CALL_CONTROL_SUPPORT_FLG,
                        &stSimCallCtrlFlg,
                        sizeof(MN_CALL_NVIM_SIM_CALL_CONTROL_FLG_STRU)))
    {
        TAF_WARNING_LOG(WUEPS_PID_TAF, "TAF_SPM_ReadNvimInfo():WARNING: en_NV_Item_NVIM_SIM_CALL_CONTROL_SUPPORT_FLG Error");
        pstServiceCtrlCfgInfo->ucSimCallCtrlSupportFlg  = VOS_FALSE;

        return;
    }

    pstServiceCtrlCfgInfo->ucSimCallCtrlSupportFlg = stSimCallCtrlFlg.ucSimCallCtrlSupportFlg;

    return;
}
Esempio n. 16
0
VOS_VOID TAF_SPM_ReadFdnInfoNvim(VOS_VOID)
{
    TAF_SPM_SERVICE_CTRL_CFG_INFO_STRU *pstServiceCtrlCfgInfo = VOS_NULL_PTR;
    TAF_FDN_NVIM_CONFIG_STRU            stFdnConfig;

    pstServiceCtrlCfgInfo               = TAF_SPM_GetServiceCtrlCfgInfoAddr();

    if (NV_OK != NV_Read(en_NV_Item_FDN_Info,
                         &stFdnConfig,
                         sizeof(TAF_FDN_NVIM_CONFIG_STRU)))
    {
        TAF_WARNING_LOG(WUEPS_PID_TAF, "TAF_SPM_ReadNvimInfo():WARNING: en_NV_Item_FDN_Info Error");
        pstServiceCtrlCfgInfo->ulMeStatus = TAF_FDN_CHECK_FEATURE_OFF;

        return;
    }

    pstServiceCtrlCfgInfo->ulMeStatus   = stFdnConfig.ulMeStatus;

    return;
}
Esempio n. 17
0
VOS_VOID TAF_CBA_ProcMmcMsg(
    struct MsgCB                       *pstMsg
)
{
    TAFMMC_CBS_CURR_NET_MODE_IND_STRU  *pstMsgInd;

    switch (((MSG_HEADER_STRU *)pstMsg)->ulMsgName)
    {
        case TAFMMC_CBS_NO_NETWORK_IND:
            TAF_CBA_SetNetRatType(TAF_CBA_NET_RAT_TYPE_BUTT);
            break;

        case TAFMMC_CBS_CURR_NET_MODE_IND:
            pstMsgInd = (TAFMMC_CBS_CURR_NET_MODE_IND_STRU *)pstMsg;
            TAF_CBA_RcvMmcNetModeInd(pstMsgInd->ucCurNetWork);
            break;

        default:
            TAF_WARNING_LOG(WUEPS_PID_TAF, "TAF_CBA_ProcMmcMsg:Rcv Invalid Msg Type");
            break;
    }
}
Esempio n. 18
0
VOS_VOID TAF_SPM_ReadVideoCallNvim(VOS_VOID)
{
    TAF_SPM_SERVICE_CTRL_CFG_INFO_STRU                     *pstServiceCtrlCfgInfo = VOS_NULL_PTR;
    MN_CALL_NV_ITEM_VIDEO_CALL_STRU                         stVideoCall;

    pstServiceCtrlCfgInfo                           = TAF_SPM_GetServiceCtrlCfgInfoAddr();

    if (NV_OK != NV_Read(en_NV_Item_VIDEO_CALL,
                        &stVideoCall,
                        sizeof(MN_CALL_NV_ITEM_VIDEO_CALL_STRU)))
    {
        TAF_WARNING_LOG(WUEPS_PID_TAF, "TAF_SPM_ReadVideoCallNvim():WARNING: en_NV_Item_VIDEO_CALL Error");

        return;
    }

    if (VOS_TRUE == stVideoCall.ucStatus)
    {
        pstServiceCtrlCfgInfo->enVpCfgState = stVideoCall.ucVpCfgState;        
    }

    return;
}
VOS_UINT32 TAF_APS_RcvSmPdpModifyInd_Active(
    VOS_UINT32                          ulEventType,
    struct MsgCB                       *pstMsg
)
{
    VOS_UINT32                          ulResult;
    VOS_UINT8                           ucPdpId;
    MMC_APS_RAT_TYPE_ENUM_UINT32        enCurrRatType;
    APS_MDFIND_PARA_ST                  stParam;
    SMREG_PDP_MODIFY_IND_STRU          *pstSmPdpModifyInd;
#if (FEATURE_ON == FEATURE_LTE)
    APS_PDP_CONTEXT_ENTITY_ST          *pstPdpEntity;
#endif

    /* 获取消息内容 */
    pstSmPdpModifyInd = (SMREG_PDP_MODIFY_IND_STRU *)pstMsg;
    ucPdpId           = TAF_APS_GetCurrFsmEntityPdpId();
    enCurrRatType     = TAF_APS_GetCurrPdpEntityRatType();
#if (FEATURE_ON == FEATURE_LTE)
    pstPdpEntity      = TAF_APS_GetPdpEntInfoAddr(ucPdpId);
#endif

    ulResult = Aps_PdpMdfIndParaCheck(pstSmPdpModifyInd, &stParam);
    if (APS_PARA_INVALID  == ulResult)
    {
        TAF_WARNING_LOG(WUEPS_PID_TAF,
            "TAF_APS_RcvSmPdpModifyInd_Active: Check para failed! ");

        /* 上报ID_EVT_TAF_PS_CALL_PDP_DEACTIVATE_IND事件 */
        TAF_APS_SndPdpDeActivateInd(ucPdpId, TAF_PS_CAUSE_SM_NW_PROTOCOL_ERR_UNSPECIFIED);

        /* 发送内部消息, 触发PDP去激活流程 */
        TAF_APS_SndInterPdpDeactivateReq(ucPdpId, SM_TAF_CAUSE_SM_NW_PROTOCOL_ERR_UNSPECIFIED);

        return VOS_TRUE;
    }

    /* 检查QOS是否满足MIN */
    if (APS_PARA_VALID == Aps_CheckQosSatisify(ucPdpId, &stParam.NewQos))
    {
        /* 满足MINQOS */
        Aps_PdpMdfIndQosSatisfy(ucPdpId, &stParam, pstSmPdpModifyInd);

#if (FEATURE_ON == FEATURE_LTE)
        /* 同步PDP信息至ESM */
        MN_APS_SndEsmPdpInfoInd(pstPdpEntity, SM_ESM_PDP_OPT_MODIFY);
#endif

        /* 如果当前模为GSM, 迁移状态 */
        if (MMC_APS_RAT_TYPE_GSM == enCurrRatType)
        {
            /*------------------------------------------------------------------
               加载TAF_APS_STA_MS_MODIFYING状态机
               加载后子状态切换为TAF_APS_MS_MODIFYING_SUBSTA_INIT

               在TAF_APS_MS_MODIFYING_SUBSTA_INIT子状态中
               处理D_PMC_SMREG_PDP_MODIFY_IND消息
            ------------------------------------------------------------------*/
            TAF_APS_InitSubFsm(TAF_APS_FSM_MS_MODIFYING,
                               TAF_APS_GetMsModifyingFsmDescAddr(),
                               TAF_APS_MS_MODIFYING_SUBSTA_INIT);
        }
    }
    else
    {
        /* 上报ID_EVT_TAF_PS_CALL_PDP_DEACTIVATE_IND事件 */
        TAF_APS_SndPdpDeActivateInd(ucPdpId, TAF_PS_CAUSE_SM_NW_QOS_NOT_ACCEPTED);

        /* 发送内部消息, 触发PDP去激活流程 */
        TAF_APS_SndInterPdpDeactivateReq(ucPdpId, SM_TAF_CAUSE_SM_NW_QOS_NOT_ACCEPTED);
    }

    return VOS_TRUE;
}
Esempio n. 20
0
VOS_VOID  TAF_MMA_StartTimer(
    TAF_MMA_TIMER_ID_ENUM_UINT32        enTimerId,
    VOS_UINT32                          ulLen
)
{
    TAF_MMA_TIMER_CTX_STRU             *pstMmaTimerCtx = VOS_NULL_PTR;
    VOS_UINT32                          i;
    VOS_UINT32                          ulRet;

    if (0 == ulLen)
    {
        TAF_WARNING_LOG1(WUEPS_PID_MMA,"TAF_MMA_StartTimer:timer len is zero!", (VOS_INT32)enTimerId);
        return;
    }

    if (ulLen >= VOS_TIMER_MAX_LENGTH)
    {
       ulLen = VOS_TIMER_MAX_LENGTH - 1;
    }

    pstMmaTimerCtx   =  TAF_MMA_GetTimerCtxAddr();

    /* 如果缓存队列中该定时器已经启动则直接返回 */
    for (i = 0 ; i < TAF_MMA_MAX_TIMER_NUM ; i++)
    {
        if ((TAF_MMA_TIMER_STATUS_RUNING == pstMmaTimerCtx[i].enTimerStatus)
         && (enTimerId                   == pstMmaTimerCtx[i].enTimerId))
        {
            TAF_WARNING_LOG1(WUEPS_PID_MMA,"TAF_MMA_StartTimer:timer is running!", (VOS_INT32)enTimerId);
            return;
        }
    }

    for (i = 0 ; i < TAF_MMA_MAX_TIMER_NUM ; i++)
    {
        if (TAF_MMA_TIMER_STATUS_STOP == pstMmaTimerCtx[i].enTimerStatus )
        {
            break;
        }
    }

    if (i >= TAF_MMA_MAX_TIMER_NUM)
    {
       TAF_WARNING_LOG1(WUEPS_PID_MMA, "TAF_MMA_StartTimer:too many timer", (VOS_INT32)enTimerId);

       return;
    }

    /* 启动定时器 */
    ulRet = VOS_StartRelTimer(&(pstMmaTimerCtx[i].hTimer),
                              WUEPS_PID_MMA,
                              ulLen,
                              enTimerId,
                              0,
                              VOS_RELTIMER_NOLOOP,                              
                              VOS_TIMER_PRECISION_5);                              
    
    if (VOS_OK != ulRet)
    {
        TAF_WARNING_LOG(WUEPS_PID_MMA,"TAF_MMA_StartTimer:VOS_StartRelTimer failed");
        return;
    }

    pstMmaTimerCtx[i].enTimerId             = enTimerId;
    pstMmaTimerCtx[i].enTimerStatus         = TAF_MMA_TIMER_STATUS_RUNING;

    TAF_MMA_SndOmTimerStatus(TAF_MMA_TIMER_STATUS_RUNING, enTimerId, ulLen);

    return;
}
VOS_UINT32 TAF_SPM_BuildUssdStringInfo(
    TAF_SS_DATA_CODING_SCHEME           ucDatacodingScheme,
    TAF_SS_USSD_STRING_STRU            *pstSrcUssd,
    TAF_SS_USSD_STRING_STRU            *pstDstUssd
)
{
    VOS_UINT32                          ulRslt;
    MN_MSG_CBDCS_CODE_STRU              stDcsInfo;

    PS_MEM_SET(&stDcsInfo, 0, sizeof(stDcsInfo));

    /* USSD与CBS的DCS的协议相同,调用CBS的DCS解析函数解码,详细情况参考23038 */
    ulRslt = MN_MSG_DecodeCbsDcs(ucDatacodingScheme,
                                 pstSrcUssd->aucUssdStr,
                                 pstSrcUssd->usCnt,
                                 &stDcsInfo);
    if (MN_ERR_NO_ERROR != ulRslt)
    {
        TAF_WARNING_LOG(WUEPS_PID_TAF, "TAF_SPM_BuildUssdStringInfo:WARNING: Decode Failure");
        return VOS_FALSE;
    }

    if (MN_MSG_MSG_CODING_7_BIT == stDcsInfo.enMsgCoding)
    {
        PS_MEM_CPY(pstDstUssd, pstSrcUssd, sizeof(TAF_SS_USSD_STRING_STRU));

        /* 非透传模式,编码方式为7bit时,上层是没有按7Bit压缩的,
           仍然是ASCII,此处需要保证DCS指示的编码方式与实际内容的编码方式一致 */
        if (TAF_SDC_USSD_NON_TRAN_MODE == TAF_SDC_GetUssdTransMode())
        {
            ulRslt = TAF_MmiEncodeUssdMessage(pstDstUssd);
            if (VOS_FALSE == ulRslt)
            {
                TAF_NORMAL_LOG(WUEPS_PID_TAF, "TAF_SPM_BuildUssdStringInfo: SSA_EncodeUssdMessage encode failure");
                return VOS_FALSE;
            }
        }
        /* 透传模式,编码方式为7bit时,上层是按7Bit压缩的,但用户输入每一个USSD数字,
           经过7Bit压缩后, 每个字节的高4bit和低4bit在此处是分别由一个Byte表示的,此处需要将两个byte还原为一个字节
           例如用户要输入*199#,7bit压缩后为aa 58 2e 37 02,拆分后为61 61 35 38 32 65 33 37 30 32
            */
        else
        {
            if (pstDstUssd->usCnt > TAF_SS_MAX_USSD_CHAR_HEX_FORMAT)
            {
                TAF_WARNING_LOG(WUEPS_PID_TAF, "TAF_SPM_BuildUssdStringInfo: String too Long failure");
                return VOS_FALSE;
            }

            ulRslt = TAF_STD_AsciiNum2HexString(pstDstUssd->aucUssdStr, &pstDstUssd->usCnt);

            if (VOS_FALSE == ulRslt)
            {
                TAF_NORMAL_LOG(WUEPS_PID_TAF, "TAF_SPM_BuildUssdStringInfo: TAF_AsciiNum2HexString encode failure");
                return VOS_FALSE;
            }
        }
    }
    else
    {
        if (pstSrcUssd->usCnt > TAF_SS_MAX_USS_CHAR)
        {
            TAF_WARNING_LOG(WUEPS_PID_TAF, "TAF_SPM_BuildUssdStringInfo: String too Long failure");
            return VOS_FALSE;
        }

        PS_MEM_CPY(pstDstUssd, pstSrcUssd, sizeof(TAF_SS_USSD_STRING_STRU));
    }

    return VOS_TRUE;
}
VOS_UINT32  TAF_SPM_SendUsimUssdEnvelopeReq(
    VOS_UINT16                          usClientId,
    struct MsgCB                       *pstMsg
)
{
    VOS_UINT8                           aucLI[MN_MO_CTRL_LAI_LEN];
    SI_STK_ENVELOPE_STRU                stEnvelopeMsg;
    VOS_UINT32                          ulRet;
    MN_APP_REQ_MSG_STRU                *pstAppMsg       = VOS_NULL_PTR;
    TAF_SS_PROCESS_USS_REQ_STRU        *pstUssdMsg      = VOS_NULL_PTR;
    TAF_SS_USSD_STRING_STRU            *pstUssdInfo     = VOS_NULL_PTR;
    VOS_UINT8                           aucCallCtrlUssdString[TAF_SPM_CALL_CTRL_USSD_STRING_LEN];

    PS_MEM_SET(aucCallCtrlUssdString, 0, sizeof(aucCallCtrlUssdString));

    pstUssdInfo = PS_MEM_ALLOC(WUEPS_PID_TAF, sizeof(TAF_SS_USSD_STRING_STRU));

    if (VOS_NULL_PTR == pstUssdInfo)
    {
        TAF_WARNING_LOG(WUEPS_PID_TAF, "TAF_SPM_SendUsimUssdEnvelopeReq: Fail to alloc memory for USSD string.");
        return VOS_FALSE;
    }

    PS_MEM_SET(pstUssdInfo, 0, sizeof(TAF_SS_USSD_STRING_STRU));

    pstAppMsg                = (MN_APP_REQ_MSG_STRU *)pstMsg;
    pstUssdMsg               = (TAF_SS_PROCESS_USS_REQ_STRU *)pstAppMsg->aucContent;
    aucCallCtrlUssdString[0] = pstUssdMsg->DatacodingScheme;

    /* 转换用户请求中的USSD字符串为空口消息的USSD码流  */
    ulRet = TAF_SPM_BuildUssdStringInfo(pstUssdMsg->DatacodingScheme,
                                        &pstUssdMsg->UssdStr,
                                        pstUssdInfo);
    if (VOS_FALSE == ulRet)
    {
        PS_MEM_FREE(WUEPS_PID_TAF, pstUssdInfo);
        TAF_WARNING_LOG(WUEPS_PID_TAF, "TAF_SPM_SendUsimUssdEnvelopeReq: Fail to TAF_SPM_BuildUssdStringInfo.");
        return VOS_FALSE;
    }

    PS_MEM_CPY(&aucCallCtrlUssdString[TAF_SPM_SSC_OFFSET], pstUssdInfo->aucUssdStr, pstUssdInfo->usCnt);

    /*
    3GPP 1114:
    9.1.6   Structure of ENVELOPE (CALL CONTROL)
    Description                         Section M/O Min Length
    Call control tag                    13.1    M   Y   1
    Length (A+B+C+D+E+F)                -       M   Y   1 or 2
    Device identities                   12.7    M   Y   A
    Address or SS string or USSD string 12.1,   M   Y   B
                                        12.14
                                        or 12.17
    Location information                12.19   M   N   E
    其中,
    Location information 通过TAF_SDC_GetCurrentLai获取
    Call control tag对应stEnvelopeMsg.EnvelopeType
    Device identities对应stEnvelopeMsg.DeviceId
    Address or SS string or USSD string这里是USSD string,参考协议1114 12.17
    */
    PS_MEM_SET(&stEnvelopeMsg, 0, sizeof(SI_STK_ENVELOPE_STRU));

    stEnvelopeMsg.EnvelopeType    = SI_STK_ENVELOPE_CALLCRTL;
    stEnvelopeMsg.DeviceId.ucSDId = SI_STK_DEV_TERMINAL;
    stEnvelopeMsg.DeviceId.ucDDId = SI_STK_DEV_UICC;

    /*
        3GPP 1114:
        12.17    USSD string
        for USSD:
            Byte(s)                 Description         Length
            1                       USSD string tag         1
            2 to (Y-1)+2            Length (X)              Y
            (Y-1)+3                 Data coding scheme      1
            (Y-1)+4 to (Y-1)+X+2    USSD string           X-1
        其中,
        USSD string tag对应stEnvelopeMsg.uEnvelope.CallCtrl.SpecialData.ucTag
        Length对应stEnvelopeMsg.uEnvelope.CallCtrl.SpecialData.ucLen
        Data coding scheme和USSD string对应stEnvelopeMsg.uEnvelope.CallCtrl.SpecialData.pValue
    */
    stEnvelopeMsg.uEnvelope.CallCtrl.OP_SepcialData          = VOS_TRUE;
    stEnvelopeMsg.uEnvelope.CallCtrl.SpecialData.ucTag       = SI_CC_USSD_TAG;

    stEnvelopeMsg.uEnvelope.CallCtrl.SpecialData.ucLen       = (VOS_UINT8)(sizeof(pstUssdMsg->DatacodingScheme)
                                                             + pstUssdInfo->usCnt);
    stEnvelopeMsg.uEnvelope.CallCtrl.SpecialData.pValue      = (SI_UINT8 *)aucCallCtrlUssdString;

    /* 获取ENVELOPE消息参数: 服务小区信息 */
    stEnvelopeMsg.uEnvelope.CallCtrl.OP_LocInfo              = VOS_TRUE;
    stEnvelopeMsg.uEnvelope.CallCtrl.LocInfo.pucATSLI        = aucLI;
    TAF_SDC_GetCurrentLai(aucLI, &stEnvelopeMsg.uEnvelope.CallCtrl.LocInfo.ulLen);

    PS_MEM_FREE(WUEPS_PID_TAF, pstUssdInfo);

    ulRet = NAS_STKAPI_EnvelopeDownload(WUEPS_PID_TAF, usClientId, &stEnvelopeMsg);

    if (VOS_OK != ulRet)
    {
        TAF_WARNING_LOG(WUEPS_PID_TAF, "TAF_SPM_SendUsimUssdEnvelopeReq: Usim Returns Error.");
        return VOS_FALSE;
    }

    return VOS_TRUE;
}
VOS_VOID TAF_CBA_ParseUsimFileEfCbmirData(
    VOS_UINT8                           ucEfCbmirExistFlg,
    VOS_UINT8                          *pucEf,
    VOS_UINT16                          usEfLen
)
{
    TAF_CBA_USIM_EFCBMIR_FILE_INFO_STRU                    *pstEfCbmirFileInfo;
    VOS_UINT32                                              ulLoop;
    TAF_CBA_CBMI_RANGE_LIST_STRU                           *pstCbmirList;
    VOS_UINT8                                               ucMsgIdHigh;
    VOS_UINT8                                               ucMsgIdLow;
    VOS_UINT16                                              usMsgId;
    VOS_UINT8                                              *pucCbmirOct;

    pstEfCbmirFileInfo = TAF_CBA_GetEfCbmiRangeInfo();

    pstEfCbmirFileInfo->ucEfCbmirExistFlg = ucEfCbmirExistFlg;

    if (VOS_FALSE == ucEfCbmirExistFlg)
    {
        return;
    }

    pstEfCbmirFileInfo->usEfCbmirFileLen  = usEfLen;

    /* 将USIM中CBMIR文件记录的ID集合填写临时内存中 */
    pstCbmirList = (TAF_CBA_CBMI_RANGE_LIST_STRU *)PS_MEM_ALLOC(WUEPS_PID_TAF, sizeof(TAF_CBA_CBMI_RANGE_LIST_STRU));
    if (VOS_NULL_PTR == pstCbmirList)
    {
        TAF_WARNING_LOG(WUEPS_PID_TAF, "TAF_CBA_ParseUsimFileEfCbmirData: Fail to Alloc memory.");
        return;
    }

    /* 计算USIM EFCBMIR中CBMIR的个数 */
    pstCbmirList->usCbmirNum = TAF_CBA_CountCbmirNum((VOS_UINT16 *)pucEf, usEfLen);

    pucCbmirOct = pucEf;

    /* 数据个数检查 */
    if ( pstCbmirList->usCbmirNum >= TAF_CBA_MAX_CBMID_RANGE_NUM )
    {
        pstCbmirList->usCbmirNum = TAF_CBA_MAX_CBMID_RANGE_NUM;
    }

    for (ulLoop = 0; ulLoop < pstCbmirList->usCbmirNum; ulLoop++)
    {
        ucMsgIdHigh = *(pucCbmirOct);
        pucCbmirOct++;

        ucMsgIdLow  = *(pucCbmirOct);
        pucCbmirOct++;

        usMsgId     = (VOS_UINT16)( (ucMsgIdHigh << 8) | (ucMsgIdLow));
        pstCbmirList->astCbmiRangeInfo[ulLoop].usMsgIdFrom = usMsgId;

        ucMsgIdHigh = *(pucCbmirOct);
        pucCbmirOct++;

        ucMsgIdLow  = *(pucCbmirOct);
        pucCbmirOct++;

        usMsgId     = (VOS_UINT16)( (ucMsgIdHigh << 8) | (ucMsgIdLow));
        pstCbmirList->astCbmiRangeInfo[ulLoop].usMsgIdTo = usMsgId;

        pstCbmirList->astCbmiRangeInfo[ulLoop].enRcvMode = TAF_CBA_CBMI_RANGE_RCV_MODE_ACCEPT;
    }

    /* 先对range list排序 */
    TAF_CBA_SortCbmiRangeList(pstCbmirList);

    /* 更新内存中CBMIR的范围 */
    TAF_CBA_AddCbMiRangeListToActiveList(pstCbmirList);

    PS_MEM_FREE(WUEPS_PID_TAF, pstCbmirList);
}
VOS_VOID MN_CALL_LineInfo(
    MNPH_USIM_STATUS_ENUM_U32           enUsimStatus
)
{
    MN_CALL_ALS_LINE_INFO_STRU          stAlsInfo;
    VOS_UINT8                           aucMmaImsi[9];
    VOS_BOOL                            bWriteNvim;
    VOS_UINT32                          ulLength;
    VOS_UINT32                          ulGetCardImsiRslt;

    ulGetCardImsiRslt   = USIMM_API_RESULT_BUTT;

    ulLength = 0;
    stAlsInfo.enAlsLine = MN_CALL_ALS_LINE_NO_BUTT;
    PS_MEM_SET(stAlsInfo.aucMmaImsi, 0x00, sizeof(stAlsInfo.aucMmaImsi));

    if ( MNPH_USIM_STATUS_AVILABLE == enUsimStatus )
    {
        bWriteNvim = VOS_FALSE;

        if ( NV_OK != NV_Read(en_NV_Item_ALS_LINE_Config,&stAlsInfo,sizeof(stAlsInfo)))
        {
            return;
        }

        ulGetCardImsiRslt   = NAS_USIMMAPI_GetCardIMSI(aucMmaImsi);
        if ( USIMM_API_SUCCESS !=  ulGetCardImsiRslt)
        {
            if (VOS_TRUE == TAF_SDC_IsImsiAvailableInCurrSimStatus(TAF_SDC_GetSimStatus()))
            {

#if (FEATURE_ON == FEATURE_PTM)
                /* 记录获取卡IMSI异常log */
                TAF_SDC_GetCardImsiFailRecord(ulGetCardImsiRslt, aucMmaImsi);
#endif
            }

            return ;
        }

        /*线路号值不在取值范围内*/
        if  ( ( MN_CALL_ALS_LINE_NO_1 != stAlsInfo.enAlsLine )
           && ( MN_CALL_ALS_LINE_NO_2 != stAlsInfo.enAlsLine ) )
        {
            stAlsInfo.enAlsLine = MN_CALL_ALS_LINE_NO_1;
            bWriteNvim = VOS_TRUE;
        }

        /*判断NV中当前使用线路号对应的IMSI和SIM卡中IMSI是否相同,若不同则清NV
          项,并填入默认线路号1*/
        if ( 0 != VOS_StrCmp( (VOS_CHAR *)aucMmaImsi,
                               (VOS_CHAR *)stAlsInfo.aucMmaImsi) )
        {
            stAlsInfo.enAlsLine = MN_CALL_ALS_LINE_NO_1;
            PS_MEM_CPY(stAlsInfo.aucMmaImsi,aucMmaImsi,9);
            bWriteNvim = VOS_TRUE;
        }

        /*需要更新NVIM*/
        if ( VOS_TRUE == bWriteNvim )
        {
            (VOS_VOID)NV_GetLength(en_NV_Item_ALS_LINE_Config, &ulLength);
            if (NV_OK != NV_Write(en_NV_Item_ALS_LINE_Config,
                     &stAlsInfo,
                     ulLength) )
            {
                TAF_WARNING_LOG(WUEPS_PID_TAF, "MN_CALL_LineInfo: en_NV_Item_ALS_LINE_Config NV Write Fail!");
            }
        }

        (VOS_VOID)MN_CALL_UpdateAlsLineInfo(stAlsInfo.enAlsLine,VOS_FALSE);
    }
}
VOS_UINT32 TAF_SPM_TransUssdMsgToAsciiStr(
    TAF_SS_PROCESS_USS_REQ_STRU        *pstUssdMsg,
    VOS_UINT8                          *pucAsciiStr,
    VOS_UINT32                         *pulAsciiStrLength
)
{
    VOS_UINT8                          *pucUssdStr          = VOS_NULL_PTR;
    VOS_UINT8                          *pucUssdTransTbl     = VOS_NULL_PTR;
    VOS_UINT8                           aucUnpackUssdStr[TAF_SS_MAX_USSDSTRING_LEN];
    VOS_UINT32                          ulUssdStrLength;
    VOS_UINT32                          ulUnpackUssdStrLength;
    VOS_UINT32                          i;
    VOS_UINT32                          ulRet;
    MN_MSG_CBDCS_CODE_STRU              stDcsInfo;

    PS_MEM_SET(&stDcsInfo, 0, sizeof(stDcsInfo));

    ulRet = MN_MSG_DecodeCbsDcs(pstUssdMsg->DatacodingScheme,
                                pstUssdMsg->UssdStr.aucUssdStr,
                                pstUssdMsg->UssdStr.usCnt,
                                &stDcsInfo);
    if (MN_ERR_NO_ERROR != ulRet)
    {
        TAF_WARNING_LOG(WUEPS_PID_TAF, "TAF_SPM_TransUssdMsgToAsciiStr:WARNING: Decode Failure");
        return VOS_FALSE;
    }

    /*
       非透传模式或非7BIT编码,TAF接收到的用户USSD字符串编码格式为ASCII码或UCS2码流,
       不需要转换,直接拷贝到输出参数
    */
    if ((TAF_SDC_USSD_TRAN_MODE != TAF_SDC_GetUssdTransMode())
     || (MN_MSG_MSG_CODING_7_BIT != stDcsInfo.enMsgCoding))
    {
        if (pstUssdMsg->UssdStr.usCnt > TAF_SS_MAX_USSDSTRING_LEN)
        {
            TAF_WARNING_LOG(WUEPS_PID_TAF, "TAF_SPM_TransUssdMsgToAsciiStr: USSD length overflow in none transparent mode.");
            return VOS_FALSE;
        }

        *pulAsciiStrLength  = pstUssdMsg->UssdStr.usCnt;

         PS_MEM_CPY(pucAsciiStr, pstUssdMsg->UssdStr.aucUssdStr, *pulAsciiStrLength);

        return VOS_TRUE;
    }

    /*
       这段代码完成从7BIT压缩编码的数字字符串到ASCII码流的转换
       透传模式并且DCS为7bit编码格式,用户输入每一个USSD数字,经过7Bit压缩后,
       每个字节的高4bit和低4bit在此处是分别由一个Byte表示的
       TAF接收到的用户USSD字符串就是2个字符表示一个数字,最大长度为320字符,
       USSD空口码流容量为160BYTE,160BYTE 传输7BIT编码的字符,可以传输182个字符,

       示例:
       用户输入*199#的情况,应用接收到ASCII码流2A 31 39 39 23,进行7BIT编码后为
       aa 58 2e 37 02,转换为数字字符串为61 61 35 38 32 65 33 37 30 32,通过AT命令
       AT+CUSD=1,"61613538326533373032",15 AT透传"61613538326533373032"到TAF,所以
       本函数输入: 61 61 35 38 32 65 33 37 30 32
       本函数输出: ASCII码流为2A 31 39 39 23,长度为5
       实现步骤:
       1) TAF_AsciiNum2HexStr: 61 61 35 38 32 65 33 37 30 32 => aa 58 2e 37 02
       2) MN_UnPack7Bit:          aa 58 2e 37 02                => 2A 31 39 39 23
       因为此处的ASCII码属于标准ASCII码,所以USSD的字符转换表对输出字符串无影响

       16进制表示的USSD码流字符串转换为16进制表示的USSD码流
       举例说明:
       16进制表示的7BIT字符表压缩编码的USSD码流字符串 0x61 0x61 0x35 0x38 0x32 0x65 0x33 0x37 0x30 0x32
       转换成
               16进制表示的7BIT字符表压缩编码的码流 0xaa 0x58 0x2e 0x37 0x02
       其中,0x61表示ASCII码的a 0x65表示ASCII码的e
    */
    if (pstUssdMsg->UssdStr.usCnt > TAF_SS_MAX_USSD_CHAR_HEX_FORMAT)
    {
        TAF_WARNING_LOG(WUEPS_PID_TAF, "TAF_SPM_TransUssdMsgToAsciiStr: USSD length overflow in transparent mode.");
        return VOS_FALSE;
    }

    pucUssdStr = (VOS_UINT8 *)PS_MEM_ALLOC(WUEPS_PID_TAF, TAF_SS_MAX_USSD_CHAR_HEX_FORMAT);
    if (VOS_NULL_PTR == pucUssdStr)
    {
        TAF_WARNING_LOG(WUEPS_PID_TAF, "TAF_SPM_TransUssdMsgToAsciiStr: Fail to alloc memory.");
        return VOS_FALSE;
    }

    PS_MEM_SET(pucUssdStr, 0, TAF_SS_MAX_USSD_CHAR_HEX_FORMAT);

    ulUssdStrLength = pstUssdMsg->UssdStr.usCnt;
    PS_MEM_CPY(pucUssdStr, pstUssdMsg->UssdStr.aucUssdStr, pstUssdMsg->UssdStr.usCnt);
    ulRet = TAF_STD_AsciiNum2HexString(pucUssdStr, (VOS_UINT16 *)&ulUssdStrLength);
    if (VOS_FALSE == ulRet)
    {
        TAF_WARNING_LOG(WUEPS_PID_TAF, "TAF_SPM_TransUssdMsgToAsciiStr: Fail to TAF_AsciiNum2HexString.");
        PS_MEM_FREE(WUEPS_PID_TAF, pucUssdStr);
        return VOS_FALSE;
    }

    /*
    16进制表示的7BIT字符表压缩编码USSD码流转换成7BIT字符表非压缩编码USSD码流
    举例说明:
          16进制表示的7BIT字符表压缩编码USSD码流 0xaa 0x58 0x2e 0x37 0x02
    转换成
          7BIT字符表非压缩编码USSD码流           0x2A 0x31 0x39 0x39 0x23
    */
    ulUnpackUssdStrLength = TAF_SPM_GetUssdStringSeptetLength(ulUssdStrLength,
                                            *(pucUssdStr + ulUssdStrLength - 1));

    PS_MEM_SET(aucUnpackUssdStr, 0, sizeof(aucUnpackUssdStr));

    if (ulUssdStrLength > TAF_SS_MAX_USSDSTRING_LEN)
    {
        ulUssdStrLength = TAF_SS_MAX_USSDSTRING_LEN;
    }
    
    ulRet = TAF_STD_UnPack7Bit(pucUssdStr, ulUssdStrLength, 0, aucUnpackUssdStr);

    if (VOS_OK != ulRet)
    {
        TAF_WARNING_LOG(WUEPS_PID_TAF, "TAF_SPM_TransUssdMsgToAsciiStr:TAF_STD_UnPack7Bit Err.");
    }
    PS_MEM_FREE(WUEPS_PID_TAF, pucUssdStr);

    /*
    7BIT字符表非压缩编码USSD码流转换成ASCII码字符表编码的码流
    示例中不涉及7BIT字符表和ASCII码字符表存在差异的字符,所以无变化
    */
    pucUssdTransTbl = TAF_SDC_GetCurr7BitToAsciiTableAddr();
    for (i = 0; i < ulUnpackUssdStrLength; i++)
    {
        pucAsciiStr[i]  = pucUssdTransTbl[aucUnpackUssdStr[i]];
    }

    return VOS_TRUE;
}
VOS_UINT32 TAF_APS_RcvEsmSmEpsBearerInfoInd_Inactive(
    VOS_UINT32                          ulEventType,
    struct MsgCB                       *pstMsg
)
{
    TAF_APS_EPS_BEARER_INFO_IND_STRU   *pstBearerInfo;
    APS_PDP_CONTEXT_ENTITY_ST          *pstPdpEntity;
#if (FEATURE_ON == FEATURE_IPV6)
    MMC_APS_RAT_TYPE_ENUM_UINT32        enCurrRatType;
#endif
    VOS_UINT8                           ucPdpId;

    pstBearerInfo = (TAF_APS_EPS_BEARER_INFO_IND_STRU*)pstMsg;

#if (FEATURE_ON == FEATURE_IPV6)
    /* 获取当前网络模式*/
    enCurrRatType = TAF_APS_GetCurrPdpEntityRatType();
#endif
    ucPdpId       = TAF_APS_GetCurrFsmEntityPdpId();

    /* 获取该PDPID的PDP实体内容地址 */
    pstPdpEntity = TAF_APS_GetPdpEntInfoAddr(ucPdpId);

    /* 根据EPS承载的操作类型(Activate, Deactivate, Modify),
       调用相应的处理函数 */
    if (SM_ESM_PDP_OPT_ACTIVATE == pstBearerInfo->enPdpOption)
    {
        MN_APS_ProcEsmBearerInfoIndOptActivate(pstPdpEntity, pstBearerInfo);

        if (TAF_APS_DEFAULT_CID == TAF_APS_GetCidFromLteBitCid(pstBearerInfo->ulBitCid))
        {
            TAF_APS_SndInterAttachBearerActivateInd();
        }

#if (FEATURE_ON == FEATURE_IMS)
        /* 处理IMS专有承载 */
        TAF_APS_ProcImsBearerInfoIndOptActivate(pstPdpEntity, pstBearerInfo);
#endif

#if (FEATURE_ON == FEATURE_IPV6)
        /* 如果地址类型是IPv6, 需要同步给ND Client */
        if ( (MMC_APS_RAT_TYPE_NULL != enCurrRatType)
          && (TAF_APS_CheckPrimaryPdp(ucPdpId))
          && (TAF_APS_CheckPdpAddrTypeIpv6(ucPdpId)) )
        {
            TAF_APS_SndNdPdpActInd(pstPdpEntity->ucNsapi,
                                   pstPdpEntity->PdpAddr.aucIpV6Addr);

            pstPdpEntity->ulNdClientActiveFlg = VOS_TRUE;
        }
#endif
    }
    else
    {
        TAF_WARNING_LOG(WUEPS_PID_TAF,"TAF_APS_RcvEsmSmEpsBearerInfoInd_Inactive: Wrong option.");
    }

    /* 主状态迁移至TAF_APS_STA_ACTIVE */
    TAF_APS_SetCurrPdpEntityMainFsmState(TAF_APS_STA_ACTIVE);

    return VOS_TRUE;
}
VOS_UINT32  TAF_SPM_SendUsimCallEnvelopeReq(
    MN_CALL_CALLED_NUM_STRU            *pstCalledNumber,
    MN_CALL_CS_DATA_CFG_INFO_STRU      *pstDataCfgInfo,
    VOS_UINT32                          ulSendPara,
    MN_CALL_TYPE_ENUM_U8                enCallType,
    MN_CALL_MODE_ENUM_U8                enCallMode
)
{
    VOS_UINT8                           aucLI[MN_MO_CTRL_LAI_LEN];
    VOS_UINT8                           aucStkBcdNum[MN_CALL_MAX_CALLED_BCD_NUM_LEN + 1];
    SI_STK_ENVELOPE_STRU                stEnvelopeMsg;
    NAS_CC_IE_BC_STRU                   stBc1;
    NAS_CC_IE_BC_STRU                   stBc2;
    MN_CALL_REP_IND_ENUM_U8             enBcRepeatInd;
    VOS_UINT32                          ulNumOfBc;


    PS_MEM_SET(&stEnvelopeMsg, 0, sizeof(SI_STK_ENVELOPE_STRU));

    stEnvelopeMsg.EnvelopeType    = SI_STK_ENVELOPE_CALLCRTL;
    stEnvelopeMsg.DeviceId.ucSDId = SI_STK_DEV_TERMINAL;
    stEnvelopeMsg.DeviceId.ucDDId = SI_STK_DEV_UICC;
    enBcRepeatInd                 = MN_CALL_REP_IND_NULL;

    /* 根据呼叫类型, 呼叫模式和数据呼叫配置生成BC和Repeat Ind参数 */
    PS_MEM_SET(&stBc1, 0, sizeof(NAS_CC_IE_BC_STRU));
    PS_MEM_SET(&stBc2, 0, sizeof(NAS_CC_IE_BC_STRU));

    ulNumOfBc = MN_CALL_BuildBcOfSetup(enCallType,
                                       enCallMode,
                                       pstDataCfgInfo,
                                       &stBc1,
                                       &stBc2);

    if (0 == ulNumOfBc)
    {
        return VOS_FALSE;
    }

    if (TAF_CALL_MAX_BC_NUM == ulNumOfBc)
    {
        /* 有两个BC的情况下,repeat indicator设为alternate */
        enBcRepeatInd = MN_CALL_REP_IND_ALTER;
    }
    else
    {
        /* 此处需要参考24.008 10.5.4.22 中的定义确认 */
        enBcRepeatInd = MN_CALL_REP_IND_NULL;
    }

    stEnvelopeMsg.uEnvelope.CallCtrl.OP_Capability1          = VOS_TRUE;
    stEnvelopeMsg.uEnvelope.CallCtrl.Capability1.ulLen       = stBc1.LastOctOffset;
    stEnvelopeMsg.uEnvelope.CallCtrl.Capability1.pucCCP      = (VOS_UINT8 *)&stBc1.Octet3;

    if ((MN_CALL_REP_IND_NULL != enBcRepeatInd)
     && (0                    != stBc2.IsExist))
    {
        stEnvelopeMsg.uEnvelope.CallCtrl.OP_Capability2      = VOS_TRUE;
        stEnvelopeMsg.uEnvelope.CallCtrl.OP_BCRepInd         = VOS_TRUE;
        stEnvelopeMsg.uEnvelope.CallCtrl.Capability2.ulLen   = stBc2.LastOctOffset;
        stEnvelopeMsg.uEnvelope.CallCtrl.Capability2.pucCCP  = (VOS_UINT8 *)&stBc2.Octet3;
    }

    stEnvelopeMsg.uEnvelope.CallCtrl.OP_SepcialData          = VOS_TRUE;
    stEnvelopeMsg.uEnvelope.CallCtrl.SpecialData.ucTag       = SI_CC_ADDRESS_TAG;
    stEnvelopeMsg.uEnvelope.CallCtrl.SpecialData.ucLen       = pstCalledNumber->ucNumLen
                                                             + sizeof(MN_CALL_NUM_TYPE_ENUM_U8);
    PS_MEM_SET(aucStkBcdNum, 0, sizeof(aucStkBcdNum));
    aucStkBcdNum[0]                                          = pstCalledNumber->enNumType;
    PS_MEM_CPY(&aucStkBcdNum[sizeof(pstCalledNumber->enNumType)],
               pstCalledNumber->aucBcdNum,
               pstCalledNumber->ucNumLen);

    stEnvelopeMsg.uEnvelope.CallCtrl.SpecialData.pValue      = aucStkBcdNum;

    stEnvelopeMsg.uEnvelope.CallCtrl.OP_LocInfo              = VOS_TRUE;
    stEnvelopeMsg.uEnvelope.CallCtrl.LocInfo.pucATSLI        = aucLI;
    TAF_SDC_GetCurrentLai(aucLI, &stEnvelopeMsg.uEnvelope.CallCtrl.LocInfo.ulLen);

    if (VOS_OK != NAS_STKAPI_EnvelopeDownload(WUEPS_PID_TAF, ulSendPara, &stEnvelopeMsg))
    {
        TAF_WARNING_LOG(WUEPS_PID_TAF, "TAF_SPM_SendUsimCallEnvelopeReq: Usim Returns Error.");
        return VOS_FALSE;
    }

    return VOS_TRUE;
}
VOS_UINT32  TAF_SPM_SendUsimSsEnvelopeReq(
    VOS_UINT16                          usClientId,
    struct MsgCB                       *pstMsg
)
{
    VOS_UINT8                           aucLI[MN_MO_CTRL_LAI_LEN];
    VOS_UINT8                           aucSsString[TAF_SPM_CALL_CTRL_SS_STRING_LEN];
    VOS_UINT8                           ucSscStringBcdLen;
    SI_STK_ENVELOPE_STRU                stEnvelopeMsg;
    VOS_UINT32                          ulRet;
    VOS_CHAR                           *pcSscString     = VOS_NULL_PTR;
    MN_APP_REQ_MSG_STRU                *pstAppReq       = VOS_NULL_PTR;
    MN_APP_SS_REGISTER_REQ_STRU        *pstRegister     = VOS_NULL_PTR;
    VOS_UINT32                          ulEventType;
    MN_MMI_OPERATION_TYPE_ENUM_U8       enSsOpType;

    pcSscString = (VOS_CHAR *)PS_MEM_ALLOC(WUEPS_PID_TAF, TAF_SPM_SSC_MAX_LEN);

    if (VOS_NULL_PTR == pcSscString)
    {
        TAF_WARNING_LOG(WUEPS_PID_TAF, "TAF_SPM_SendUsimSsEnvelopeReq: Fail to alloc memory for SS info.");
        return VOS_FALSE;
    }

    PS_MEM_SET(pcSscString, 0, TAF_SPM_SSC_MAX_LEN);
    /* 根据消息转换出SSC STRING */
    ulRet        = TAF_MmiEncodeMmiString(pstMsg, pcSscString);
    if (VOS_TRUE != ulRet)
    {
        TAF_WARNING_LOG(WUEPS_PID_TAF, "TAF_SPM_SendUsimSsEnvelopeReq: Fail to Encode SSC string.");
        PS_MEM_FREE(WUEPS_PID_TAF, pcSscString);
        return VOS_FALSE;
    }

    /*
    SS STRING的第一个字节是TON and NPI,从第二字节开始为SSC 的BCD编码
    参考协议 11.11: 10.5.1  EFADN (Abbreviated dialling numbers)
    TON and NPI
    Contents:
        Type of number (TON) and numbering plan identification (NPI).
    Coding:
        according to TS 04.08 [15]. If the Dialling Number/SSC String does not contain a dialling number,
        e.g. a control string deactivating a service, the TON/NPI byte shall be set to 'FF' by the ME (see note 2).
    NOTE 2: If a dialling number is absent, no TON/NPI byte is transmitted over the radio interface (see TS 04.08 [15]).
        Accordingly, the ME should not interpret the value 'FF' and not send it over the radio interface.
    */
    PS_MEM_SET(aucSsString, 0, TAF_SPM_CALL_CTRL_SS_STRING_LEN);
    aucSsString[0] = TAF_SPM_NUM_TYPE_INVALID;
    pstAppReq = (MN_APP_REQ_MSG_STRU *)pstMsg;
    ulEventType = TAF_BuildEventType(pstAppReq->ulSenderPid, pstAppReq->usMsgName);
    ulRet = TAF_MmiGetOperationType(ulEventType, &enSsOpType);
    if ((VOS_TRUE == ulRet)
     && (TAF_MMI_REGISTER_SS == enSsOpType))
    {
        pstRegister    = (MN_APP_SS_REGISTER_REQ_STRU *)pstMsg;
        /* 仅呼叫转移有注册操作,呼叫转移注册操作必须有号码类型 */
        aucSsString[0] = pstRegister->stTafSsRegisterSsReq.NumType;
    }

    ulRet = TAF_STD_ConvertAsciiNumberToBcd(pcSscString,
                                &aucSsString[TAF_SPM_SSC_OFFSET],
                                &ucSscStringBcdLen);
    PS_MEM_FREE(WUEPS_PID_TAF, pcSscString);
    if (MN_ERR_NO_ERROR != ulRet)
    {
        return VOS_FALSE;
    }

    PS_MEM_SET(&stEnvelopeMsg, 0, sizeof(SI_STK_ENVELOPE_STRU));
    PS_MEM_SET(aucLI, 0, MN_MO_CTRL_LAI_LEN);

    /*
    3GPP 1114:
    9.1.6   Structure of ENVELOPE (CALL CONTROL)
    Description                         Section M/O Min Length
    Call control tag                    13.1    M   Y   1
    Length (A+B+C+D+E+F)                -       M   Y   1 or 2
    Device identities                   12.7    M   Y   A
    Address or SS string or USSD string 12.1,   M   Y   B
                                        12.14
                                        or 12.17
    Location information                12.19   M   N   E
    其中,
    Location information 通过TAF_SDC_GetCurrentLai获取
    Call control tag对应stEnvelopeMsg.EnvelopeType
    Device identities对应stEnvelopeMsg.DeviceId
    Address or SS string or USSD string这里是SS string,参考协议1114 12.14
    */
    stEnvelopeMsg.EnvelopeType    = SI_STK_ENVELOPE_CALLCRTL;
    stEnvelopeMsg.DeviceId.ucSDId = SI_STK_DEV_TERMINAL;
    stEnvelopeMsg.DeviceId.ucDDId = SI_STK_DEV_UICC;

    /*
        12.14    SS string
        SS or USSD string:
        for SS:
            Byte(s)                 Description         Length
            1                       SS string tag           1
            2 to (Y 1)+2            Length (X)              Y
            (Y 1)+3                 TON and NPI             1
            (Y 1)+4 to (Y 1)+X+2    SS or USSD string   X - 1
        其中,
        SS string tag对应stEnvelopeMsg.uEnvelope.CallCtrl.SpecialData.ucTag
        Length对应stEnvelopeMsg.uEnvelope.CallCtrl.SpecialData.ucLen
        TON and NPI和SS string对应stEnvelopeMsg.uEnvelope.CallCtrl.SpecialData.pValue
    */
    stEnvelopeMsg.uEnvelope.CallCtrl.OP_SepcialData          = VOS_TRUE;
    stEnvelopeMsg.uEnvelope.CallCtrl.SpecialData.ucTag       = SI_CC_SS_TAG;
    stEnvelopeMsg.uEnvelope.CallCtrl.SpecialData.ucLen       = (VOS_UINT8)(ucSscStringBcdLen + TAF_SPM_SSC_OFFSET);
    stEnvelopeMsg.uEnvelope.CallCtrl.SpecialData.pValue      = aucSsString;

    /* 获取ENVELOPE消息参数: 服务小区信息 */
    stEnvelopeMsg.uEnvelope.CallCtrl.OP_LocInfo              = VOS_TRUE;
    stEnvelopeMsg.uEnvelope.CallCtrl.LocInfo.pucATSLI        = aucLI;
    TAF_SDC_GetCurrentLai(aucLI, &stEnvelopeMsg.uEnvelope.CallCtrl.LocInfo.ulLen);

    ulRet = NAS_STKAPI_EnvelopeDownload(WUEPS_PID_TAF, usClientId, &stEnvelopeMsg);

    if (VOS_OK != ulRet)
    {
        TAF_WARNING_LOG(WUEPS_PID_TAF, "TAF_SPM_SendUsimSsEnvelopeReq: Usim Returns Error.");
        return VOS_FALSE;
    }

    return VOS_TRUE;
}