Пример #1
0
VOS_UINT32 TAF_SPM_BuildEventType(
    struct MsgCB                       *pstMsg
)
{
    VOS_UINT32                          ulEventType;
    MSG_HEADER_STRU                    *pstMsgHeader   = VOS_NULL_PTR;
    REL_TIMER_MSG                      *pstRcvTimerMsg = VOS_NULL_PTR;

    pstMsgHeader = (MSG_HEADER_STRU *)pstMsg;

    /* 动作表里的时间消息不能靠消息头名称进行区分,依靠其结构体的ulName域进行区分
        所以此处进行分别处理 */
    if (VOS_PID_TIMER == pstMsgHeader->ulSenderPid)
    {
        pstRcvTimerMsg = (REL_TIMER_MSG *)pstMsg;
        ulEventType    = TAF_BuildEventType(pstMsgHeader->ulSenderPid, (VOS_UINT16)pstRcvTimerMsg->ulName);


    }
    else
    {
        /*lint -e701*/
        ulEventType  = TAF_BuildEventType((VOS_UINT16)pstMsgHeader->ulSenderPid, (VOS_UINT16)pstMsgHeader->ulMsgName);
        /*lint +e701*/
    }


    return ulEventType;
}
VOS_UINT32 TAF_MMA_BuildEventType(
    struct MsgCB                       *pstMsg
)
{
    VOS_UINT32                          ulEventType;
    MSG_HEADER_STRU                    *pstMsgHeader   = VOS_NULL_PTR;
    REL_TIMER_MSG                      *pstRcvTimerMsg = VOS_NULL_PTR;

    pstMsgHeader = (MSG_HEADER_STRU *)pstMsg;

    /* 动作表里的时间消息不能靠消息头名称进行区分,依靠其结构体的ulName域进行区分
        所以此处进行分别处理 */
    if (VOS_PID_TIMER == pstMsgHeader->ulSenderPid)
    {
        pstRcvTimerMsg = (REL_TIMER_MSG *)pstMsg;
        ulEventType    = TAF_BuildEventType(pstMsgHeader->ulSenderPid, (VOS_UINT16)pstRcvTimerMsg->ulName);

        /* 停开关机相关定时器,原来的定时器在后续优化后停止 */
        if (MN_TIMER_CLASS_MMA == (pstRcvTimerMsg->ulName & MN_TIMER_CLASS_MASK))
        {
            TAF_MMA_StopTimer((VOS_UINT16)pstRcvTimerMsg->ulName);
        }
    }
    else
    {
        /*lint -e701*/
        ulEventType  = TAF_BuildEventType((VOS_UINT16)pstMsgHeader->ulSenderPid, (VOS_UINT16)pstMsgHeader->ulMsgName);
        /*lint +e701*/
    }

    return ulEventType;
}
Пример #3
0
VOS_UINT32  TAF_MMA_IsNeedCacheMsg(
    VOS_UINT32                          ulEventType,
    VOS_VOID                           *pstMsg
)
{
    VOS_UINT32                          ulIndex;
    
    switch (ulEventType)
    {
        /* 当前卡状态指示消息的缓存只需要缓存一条 */
        case TAF_BuildEventType(WUEPS_PID_MMA, MMA_MMA_INTER_USIM_STATUS_CHANGE_IND):
        
            if (VOS_TRUE == TAF_MMA_IsExistCacheMsg(TAF_BuildEventType(WUEPS_PID_MMA, MMA_MMA_INTER_USIM_STATUS_CHANGE_IND), &ulIndex))
            {
                return VOS_FALSE;
            }
            
            break;

        default:
            break;
    }

    /* 默认返回保存该消息 */
    return VOS_TRUE;
}
VOS_UINT32 TAF_APS_BuildEventType(
    struct MsgCB                       *pstMsg
)
{
    MSG_HEADER_STRU                    *pstMsgHeader;
    REL_TIMER_MSG                      *pstRcvTimerMsg;
    VOS_UINT32                          ulEventType = 0;
    APS_SNDCP_COMMON_MSG               *pstSnCommonMsg;

    /*
       动作表里的时间消息不能靠消息头名称进行区分,依靠其结构体的ulName域进行区分
       所以此处进行分别处理
    */
    pstMsgHeader = (MSG_HEADER_STRU*)pstMsg;
    if ( VOS_PID_TIMER == pstMsgHeader->ulSenderPid )
    {
        pstRcvTimerMsg = (REL_TIMER_MSG *)pstMsg;

        ulEventType  = TAF_BuildEventType(pstMsgHeader->ulSenderPid, pstRcvTimerMsg->ulName);

    }
    else if (WUEPS_PID_SM == pstMsgHeader->ulSenderPid)
    {
        ulEventType = TAF_BuildEventType((VOS_UINT16)pstMsgHeader->ulSenderPid, (VOS_UINT16)pstMsgHeader->ulMsgName);
    }
    else if (UEPS_PID_SN == pstMsgHeader->ulSenderPid)
    {
        /* SNDCP的格式,也需要特殊处理一下,msgname的长度不同 */
        pstSnCommonMsg = (APS_SNDCP_COMMON_MSG*)pstMsg;
        ulEventType = TAF_BuildEventType((VOS_UINT16)pstMsgHeader->ulSenderPid, (VOS_UINT16)pstSnCommonMsg->usMsgType);
    }
    else
    {
        ulEventType  = TAF_BuildEventType((VOS_UINT16)pstMsgHeader->ulSenderPid, (VOS_UINT16)pstMsgHeader->ulMsgName);

    }


    return ulEventType;
}
VOS_UINT32 TAF_SPM_IsUssdServiceType(
    VOS_UINT32                          ulEventType
)
{
    VOS_UINT32                          ulResult;

    ulResult  = VOS_FALSE;

    switch (ulEventType)
    {
        case TAF_BuildEventType(WUEPS_PID_AT, TAF_MSG_PROCESS_USS_MSG):
        case TAF_BuildEventType(MAPS_STK_PID, STK_SS_USSD_REQ):

            ulResult = VOS_TRUE;
            break;

        default:

            break;
    }

    return ulResult;
}
VOS_UINT32 TAF_SPM_SendPbCallFdnCheckReq(
    VOS_UINT16                          usClientId,
    struct MsgCB                       *pstMsg
)
{
#if (FEATURE_ON == FEATURE_IMS)
    VOS_UINT32                          ulEventType;
#endif
    PS_PB_FDN_NUM_STRU                  stFdnInfo;
    MN_CALL_CALLED_NUM_STRU             stDialNumber;
    MN_CALL_TYPE_ENUM_U8                enCallType;
    MN_CALL_MODE_ENUM_U8                enCallMode;
    MN_CALL_CS_DATA_CFG_STRU            stDataCfg;
    VOS_UINT32                          ulRet;

    PS_MEM_SET(&stFdnInfo, 0x00, sizeof(stFdnInfo));
    PS_MEM_SET(&stDataCfg, 0x00, sizeof(stDataCfg));
    PS_MEM_SET(&stDialNumber, 0x00, sizeof(stDialNumber));

#if (FEATURE_ON == FEATURE_IMS)
    ulEventType         = TAF_SPM_GetEventTypeFromCurrEntityFsmEntryMsg();
#endif

    /* 由于增强型多方通话已经解析过了,这里不再需要解析  */
#if (FEATURE_ON == FEATURE_IMS)
    if (ulEventType == TAF_BuildEventType(WUEPS_PID_AT, TAF_CALL_APP_ECONF_DIAL_REQ))
    {
        return TAF_SPM_SendUsimEconfFdnReq(usClientId, pstMsg);
    }
#endif

    /* 获取呼叫发起请求主动的stDialNumber */
    TAF_SPM_GetCallInfoFromFsmEntryMsg(&stDialNumber, &enCallType, &enCallMode, &stDataCfg);


    stFdnInfo.ulNum1Len = stDialNumber.ucNumLen <= MN_CALL_MAX_BCD_NUM_LEN ?
                          stDialNumber.ucNumLen : MN_CALL_MAX_BCD_NUM_LEN;

    PS_MEM_CPY(stFdnInfo.aucNum1, stDialNumber.aucBcdNum, MN_CALL_MAX_BCD_NUM_LEN);

    ulRet = NAS_PBAPI_FdnNumCheck(WUEPS_PID_TAF, 0, usClientId, &stFdnInfo);

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

    return VOS_TRUE;
}
Пример #7
0
TAF_MMA_MSG_CACHE_PRIO_ENUM_UINT8   TAF_MMA_GetCachedMsgPrio(
    TAF_MMA_ENTRY_MSG_STRU             *pstEntryMsg
)
{
    TAF_MMA_MSG_CACHE_PRIO_ENUM_UINT8   enPrio;

    switch (pstEntryMsg->ulEventType)
    {
        case TAF_BuildEventType(WUEPS_PID_OM, OAM_MMA_PHONE_MODE_SET_REQ):

        case TAF_BuildEventType(WUEPS_PID_TAF, ID_TAF_MMA_PHONE_MODE_SET_REQ):

            enPrio = TAF_MMA_MSG_CACHE_PRIO_HIGH;
            break;

        case TAF_BuildEventType(WUEPS_PID_MMA, MMA_MMA_INTER_USIM_STATUS_CHANGE_IND):

            enPrio = TAF_MMA_MSG_CACHE_PRIO_MIDDLE;
            break;


        /* 查询预处理先返回了  */
        case TAF_BuildEventType(WUEPS_PID_TAF, ID_TAF_MMA_SYS_CFG_SET_REQ):

        case TAF_BuildEventType(WUEPS_PID_AT, TAF_MSG_MMA_PLMN_USER_SEL):
        case TAF_BuildEventType(WUEPS_PID_AT, TAF_MSG_MMA_PLMN_LIST):
        case TAF_BuildEventType(WUEPS_PID_AT, TAF_MSG_MMA_ATTACH):

        case TAF_BuildEventType(WUEPS_PID_TAF, ID_TAF_MMA_DETACH_REQ):
        case TAF_BuildEventType(WUEPS_PID_AT, TAF_MSG_MMA_PLMN_RESEL):
        default:

            enPrio = TAF_MMA_MSG_CACHE_PRIO_LOW;
            break;
    }

    return enPrio;
}
VOS_VOID TAF_XPDS_ProcessIntMsg(VOS_VOID)
{
    MSG_HEADER_STRU                    *pstIntMsg = VOS_NULL_PTR;
    VOS_UINT32                          ulEventType;

    pstIntMsg = (MSG_HEADER_STRU *)TAF_XPDS_GetNextIntMsg();

    while (VOS_NULL_PTR != pstIntMsg)
    {
        /* 消息勾包 */
        TAF_XPDS_MNTN_TraceIntMsg(pstIntMsg->ulSenderPid,
                                  pstIntMsg->ulLength + VOS_MSG_HEAD_LENGTH,
                                  (VOS_VOID *)pstIntMsg);

        ulEventType = TAF_BuildEventType(pstIntMsg->ulSenderPid, (VOS_UINT16)pstIntMsg->ulMsgName);

        /* 如果已经处理完成则取下条消息继续处理 */
        if (VOS_TRUE == TAF_XPDS_PreProcessMsg(ulEventType, (struct MsgCB*)pstIntMsg))
        {
            /* 释放内部消息 */
            PS_MEM_FREE(pstIntMsg->ulSenderPid, pstIntMsg);

            /* 继续下一条消息处理 */
            pstIntMsg = (MSG_HEADER_STRU *)TAF_XPDS_GetNextIntMsg();

            continue;
        }

        /* 消息进状态机处理 */
        TAF_XPDS_ProcessMsgInFsm(ulEventType, (struct MsgCB *)pstIntMsg);

        /* 释放内部消息 */
        PS_MEM_FREE(pstIntMsg->ulSenderPid, pstIntMsg);

        /* 继续下一条消息处理 */
        pstIntMsg = (MSG_HEADER_STRU *)TAF_XPDS_GetNextIntMsg();
    }

    return;
}
VOS_UINT32  TAF_SPM_SendUsimCallEnvelopeReq_Call(
    VOS_UINT16                          usClientId,
    struct MsgCB                       *pstMsg
)
{
    MN_CALL_CS_DATA_CFG_INFO_STRU       stDataCfgInfo;
    MN_CALL_CALLED_NUM_STRU             stCalledNumber;
#if (FEATURE_ON == FEATURE_IMS)
    VOS_UINT32                          ulEventType;
#endif
    MN_CALL_TYPE_ENUM_U8                enCallType;
    MN_CALL_MODE_ENUM_U8                enCallMode;

    PS_MEM_SET(&stCalledNumber, 0x0, sizeof(stCalledNumber));
    PS_MEM_SET(&stDataCfgInfo, 0x0, sizeof(MN_CALL_CS_DATA_CFG_INFO_STRU));
#if (FEATURE_ON == FEATURE_IMS)
    ulEventType         = TAF_SPM_GetEventTypeFromCurrEntityFsmEntryMsg();
#endif

    /* 由于增强型多方通话已经解析过了,这里不再需要解析  */
#if (FEATURE_ON == FEATURE_IMS)
    if (ulEventType == TAF_BuildEventType(WUEPS_PID_AT, TAF_CALL_APP_ECONF_DIAL_REQ))
    {
        return TAF_SPM_SendUsimEconfEnvelopeReq(usClientId, pstMsg);
    }
    else
#endif
    {
        /* 从消息中获取电话号码相关信息 */
        TAF_SPM_GetCallInfoFromFsmEntryMsg(&stCalledNumber, &enCallType, &enCallMode, (MN_CALL_CS_DATA_CFG_STRU *)&stDataCfgInfo);

        /* 发起检查 */
        return TAF_SPM_SendUsimCallEnvelopeReq(&stCalledNumber,
                                               &stDataCfgInfo,
                                               usClientId,
                                               enCallType,
                                               enCallMode);
    }
}
#ifdef __cplusplus
#if __cplusplus
extern "C" {
#endif
#endif

#define THIS_FILE_ID PS_FILE_ID_TAF_APS_GET_PDPID_LIST_C

/*****************************************************************************
  2 全局变量定义
*****************************************************************************/

TAF_APS_GET_FSM_PDPID_LIST_STRU gastApsGetPdpIdList[] =
{
    {TAF_BuildEventType(WUEPS_PID_TAF, ID_MSG_TAF_PS_SET_PDP_CONTEXT_STATE_REQ), TAF_APS_GetPdpIdListWithAtSetPdpContextStateReq},
    {TAF_BuildEventType(WUEPS_PID_TAF, ID_MSG_TAF_PS_CALL_MODIFY_REQ),           TAF_APS_GetPdpIdListWithAtCallModifyReq},
    {TAF_BuildEventType(WUEPS_PID_TAF, ID_MSG_TAF_PS_CALL_ORIG_REQ),             TAF_APS_GetPdpIdListWithAtCallOrigReq},
    {TAF_BuildEventType(WUEPS_PID_TAF, ID_MSG_TAF_PS_PPP_DIAL_ORIG_REQ),         TAF_APS_GetPdpIdListWithAtPppDialOrigReq},
    {TAF_BuildEventType(WUEPS_PID_TAF, ID_MSG_TAF_PS_CALL_END_REQ),              TAF_APS_GetPdpIdListWithAtCallEndReq},
    {TAF_BuildEventType(WUEPS_PID_TAF, ID_MSG_TAF_PS_CALL_ANSWER_REQ),           TAF_APS_GetPdpIdListWithAtCallAnswerReq},
    {TAF_BuildEventType(WUEPS_PID_TAF, ID_MSG_TAF_PS_CALL_HANGUP_REQ),           TAF_APS_GetPdpIdListWithAtCallHangupReq},
    {TAF_BuildEventType(WUEPS_PID_SM, ID_SMREG_PDP_ACTIVATE_CNF),               TAF_APS_GetPdpIdListWithSmPdpActCnf},
    {TAF_BuildEventType(WUEPS_PID_SM, ID_SMREG_PDP_ACTIVATE_REJ),               TAF_APS_GetPdpIdListWithSmPdpActRej},
    {TAF_BuildEventType(WUEPS_PID_SM, ID_SMREG_PDP_ACTIVATE_IND),               TAF_APS_GetPdpIdListWithSmPdpActInd},
    {TAF_BuildEventType(WUEPS_PID_SM, ID_SMREG_PDP_MODIFY_CNF),                 TAF_APS_GetPdpIdListWithSmPdpModifyCnf},
    {TAF_BuildEventType(WUEPS_PID_SM, ID_SMREG_PDP_MODIFY_IND),                 TAF_APS_GetPdpIdListWithSmPdpModifyInd},
    {TAF_BuildEventType(WUEPS_PID_SM, ID_SMREG_PDP_MODIFY_REJ),                 TAF_APS_GetPdpIdListWithSmPdpModifyRej},
    {TAF_BuildEventType(WUEPS_PID_SM, ID_SMREG_PDP_DEACTIVATE_IND),             TAF_APS_GetPdpIdListWithSmPdpDeactivInd},
    {TAF_BuildEventType(WUEPS_PID_SM, ID_SMREG_PDP_DEACTIVATE_CNF),             TAF_APS_GetPdpIdListWithSmPdpDeactivCnf},
    {TAF_BuildEventType(WUEPS_PID_SM, ID_SMREG_PDP_ACTIVATE_SEC_CNF),           TAF_APS_GetPdpIdListWithSmPdpActSecCnf},
Пример #11
0
#endif
#endif

/*****************************************************************************
    协议栈打印打点方式下的.C文件宏定义
*****************************************************************************/
#define    THIS_FILE_ID        PS_FILE_ID_TAF_MMA_MSG_PRIO_COMPARE_C

/*****************************************************************************
  2 全局变量定义
*****************************************************************************/

TAF_MMA_MSG_COMPARE_STRU g_astMmaMsgPrioCompareWithPhoneModeTbl[] =
{
    /* phone mode过程中收到OM的模式设置请求的消息优先级比较 */
    TAF_MMA_COMPARE_TBL_ITEM(TAF_BuildEventType(WUEPS_PID_OM, OAM_MMA_PHONE_MODE_SET_REQ),
                             TAF_MMA_ComparePhoneModeSetReqPrioWithPhoneMode),

    /* 模式查询不需要比较 */



    /* phone mode过程中收到模式设置请求的消息优先级比较 */
    TAF_MMA_COMPARE_TBL_ITEM(TAF_BuildEventType(WUEPS_PID_TAF, ID_TAF_MMA_PHONE_MODE_SET_REQ),
                             TAF_MMA_ComparePhoneModeSetReqPrioWithPhoneMode),

    /* phone mode过程中收到MMA的内部卡状态指示的消息优先级比较 */
    TAF_MMA_COMPARE_TBL_ITEM(TAF_BuildEventType(WUEPS_PID_MMA, MMA_MMA_INTER_USIM_STATUS_CHANGE_IND),
                             TAF_MMA_CompareMmaInterUsimStatusChangeIndPrioWithPhoneMode),

VOS_VOID TAF_XPDS_MsgProc (struct MsgCB* pstMsg)
{
    MSG_HEADER_STRU                    *pstMsgHeader = VOS_NULL_PTR;
    REL_TIMER_MSG                      *pRcvTimerMsg = VOS_NULL_PTR;
    VOS_UINT32                          ulEventType;
    VOS_UINT32                          usOldStackDepth;
    VOS_UINT32                          usNewStackDepth;

    /* 空指针检查 */
    if (VOS_NULL_PTR == pstMsg)
    {
        /* 打印错误信息 */
        return;
    }

    pstMsgHeader = (MSG_HEADER_STRU *)pstMsg;

    /* 生成事件类型 */
    if (VOS_PID_TIMER == pstMsgHeader->ulSenderPid)
    {
        pRcvTimerMsg = (REL_TIMER_MSG *)pstMsg;

        ulEventType  = TAF_BuildEventType(pstMsgHeader->ulSenderPid, pRcvTimerMsg->ulName);

        /* 停止对应的定时器 */
        TAF_XPDS_StopTimer(pRcvTimerMsg->ulName);
    }
    else
    {
        ulEventType  = TAF_BuildEventType(pstMsgHeader->ulSenderPid, (VOS_UINT16)pstMsgHeader->ulMsgName);
    }

    /* 如果已经处理完成则直接返回 */
    if (VOS_TRUE == TAF_XPDS_PreProcessMsg(ulEventType, pstMsg))
    {
        /* 处理内部消息队列 */
        TAF_XPDS_ProcessIntMsg();

        return;
    }

    /* 获取当前XREG的栈深度 */
    usOldStackDepth = TAF_XPDS_GetFsmStackDepth();

    /* 进入状态机处理 */
    TAF_XPDS_ProcessMsgInFsm(ulEventType, pstMsg);

    /* 在状态机退出后,获取新的栈深度 */
    usNewStackDepth = TAF_XPDS_GetFsmStackDepth();

    /* 处理内部消息队列 */
    TAF_XPDS_ProcessIntMsg();

    /* 如果栈的深度减少,说明肯定进行了退栈操作,需要优先处理该状态机的结果消息,直接返回 */
    if (usNewStackDepth < usOldStackDepth)
    {
        /* To do: 记录退栈操作,只要发生了退栈后续就可以处理缓存 */
        return;
    }

    return;
}
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;
}