VOS_VOID TAF_APS_ProcImsDedicateBearer(APS_PDP_CONTEXT_ENTITY_ST *pstPdpEntity) { VOS_UINT8 ucPriPdpId; VOS_UINT8 ucPriCid; VOS_UINT8 ucSecPdpId; VOS_UINT8 ucSecCid; /* 判断PDP上下文信息中的linkedEspId与IMS信令承载中的RABID是否一致 */ if (APS_PDP_ACT_SEC == pstPdpEntity->ActType) { if (VOS_TRUE == TAF_APS_CheckImsBearerByRabId(pstPdpEntity->ucLinkedNsapi)) { /* 获取主PDP的实体ID */ ucPriPdpId = TAF_APS_GetPdpIdByNsapi(pstPdpEntity->ucLinkedNsapi); ucPriCid = 0; TAF_APS_GetImsBearerCid(ucPriPdpId, &ucPriCid); /* 获取专有承载的实体ID */ ucSecPdpId = TAF_APS_GetCurrFsmEntityPdpId(); ucSecCid = TAF_APS_GetPdpEntCurrCid(ucSecPdpId); /* 目前IMS的专有承载只向IMSA上报 */ /* 更新专有承载 PDP TAB */ TAF_APS_SetPdpEntClientInfo(ucSecPdpId, ucSecCid, TAF_APS_GetPdpEntModuleId(ucPriPdpId, ucPriCid), TAF_APS_GetPdpEntClientId(ucPriPdpId, ucPriCid), TAF_APS_GetPdpEntOpId(ucPriPdpId, ucPriCid)); /* 上报专有承载 ACT_IND */ TAF_APS_SndPdpActivateInd(ucSecPdpId, ucSecCid); } } }
VOS_UINT32 TAF_APS_RcvRabmLocalPdpDeactivateReq_Active( VOS_UINT32 ulEventType, struct MsgCB *pstMsg ) { VOS_UINT8 ucPdpId; MMC_APS_RAT_TYPE_ENUM_UINT32 enCurrRatType; /* 获取当前状态机的接入技术 */ enCurrRatType = TAF_APS_GetCurrPdpEntityRatType(); /* 获取当前状态机的APS实体索引 */ ucPdpId = TAF_APS_GetCurrFsmEntityPdpId(); /* 在GU模下处理该消息, LTE模直接丢弃 */ if (MMC_APS_RAT_TYPE_WCDMA == enCurrRatType) { /* 上报ID_EVT_TAF_PS_CALL_PDP_DEACTIVATE_IND事件 */ TAF_APS_SndPdpDeActivateInd(ucPdpId, TAF_PS_CAUSE_SM_RAB_SETUP_FAILURE); /* 发送内部消息, 去激活PDP */ TAF_APS_SndInterPdpDeactivateReq(ucPdpId, SM_TAF_CAUSE_SM_NW_REGULAR_DEACTIVATION); } return VOS_TRUE; }
VOS_UINT32 TAF_APS_RcvHsmHandOffCnf_CdataHandOff_WaitHsmHandOffCnf( VOS_UINT32 ulEventType, struct MsgCB *pstMsg ) { HSM_APS_1X_TO_HRPD_HANDOFF_CNF_STRU *pstApsHandOffCnf; VOS_UINT8 ucPdpId; /* 初始化 */ pstApsHandOffCnf = (HSM_APS_1X_TO_HRPD_HANDOFF_CNF_STRU *)pstMsg; ucPdpId = TAF_APS_GetCurrFsmEntityPdpId(); /* 停止模式切换定时器 */ TAF_APS_StopTimer(TI_TAF_APS_1X_TO_HRPD_HANDOFF_TIMER, ucPdpId); /* 数据服务切换成功 */ if (HSM_APS_CAUSE_SUCCESS == pstApsHandOffCnf->ulCause) { /* 更新建立数据服务的接入技术 */ TAF_APS_SetCurrPdpEntityDataServiceMode(TAF_APS_RAT_TYPE_HRPD); /* 通知外部模块当前的PS服务所在的模式 */ TAF_APS_SndExternalModulePsRatTypeNtf(TAF_APS_RAT_TYPE_HRPD); } /* 主状态迁移至TAF_APS_STA_DORMANT */ TAF_APS_SetCurrPdpEntityMainFsmState(TAF_APS_STA_DORMANT); /* 退出子状态状态机 */ TAF_APS_QuitCurrSubFsm(); return VOS_TRUE; }
VOS_UINT32 TAF_APS_RcvXccIncomingCallInd_CdataHandOff_WaitHsmHandOffCnf( VOS_UINT32 ulEventType, struct MsgCB *pstMsg ) { VOS_UINT8 ucPdpId; /* 初始化, 获取PDP ID */ ucPdpId = TAF_APS_GetCurrFsmEntityPdpId(); /* 停止保数据服务切换保护定时器 */ TAF_APS_StopTimer(TI_TAF_APS_1X_TO_HRPD_HANDOFF_TIMER, ucPdpId); /*------------------------------------------------------- 加载TAF_APS_FSM_CDATA_ESTING状态机 加载后子状态切换为TAF_APS_FSM_CDATA_ESTING_SUBSTA_INIT 在TAF_APS_FSM_CDATA_ESTING_SUBSTA_INIT子状态中处理 ID_XCC_APS_INCOMING_CALL_IND消息 -------------------------------------------------------*/ TAF_APS_InitSubFsm(TAF_APS_FSM_CDATA_ESTING, TAF_APS_GetCdataEstingFsmDescAddr(), TAF_APS_CDATA_ESTING_SUBSTA_INIT); return VOS_TRUE; }
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_UINT32 TAF_APS_RcvL4aPdpModifyInd_Active( VOS_UINT32 ulEventType, struct MsgCB *pstMsg ) { VOS_UINT8 ucPdpId; APS_L4A_PDP_MODIFY_IND_STRU *pstPdpModify; APS_PDP_CONTEXT_ENTITY_ST *pstPdpEntity; pstPdpModify = (APS_L4A_PDP_MODIFY_IND_STRU*)pstMsg; /* 初始化, 获取PDP ID */ ucPdpId = TAF_APS_GetCurrFsmEntityPdpId(); pstPdpEntity = TAF_APS_GetPdpEntInfoAddr(ucPdpId); /* 如果不是默认承载,则上报,默认承载不上报 */ if (TAF_APS_DEFAULT_CID != pstPdpModify->ucCid) { if (VOS_TRUE == pstPdpModify->bitOpEpsQos) { pstPdpEntity->bitOpEpsQos = VOS_TRUE; PS_MEM_CPY((VOS_UINT8 *)&pstPdpEntity->stEpsQos, (VOS_UINT8 *)&pstPdpModify->stEpsQosInfo, sizeof(APS_L4A_EPS_QOS_STRU)); } /* 上报ID_EVT_TAF_PS_CALL_PDP_MODIFIED_IND事件 */ TAF_APS_SndPdpModifyInd(ucPdpId); } return VOS_TRUE; }
VOS_UINT32 TAF_APS_RcvPsInter1XToHrpdHandOff_CdataHandOff_Init( VOS_UINT32 ulEventType, struct MsgCB *pstMsg ) { VOS_UINT8 ucPdpId; /* 初始化, 获取PDP ID */ ucPdpId = TAF_APS_GetCurrFsmEntityPdpId(); /* 保存子状态机的入口消息 */ TAF_APS_SaveCurrSubFsmEntryMsg(ulEventType, pstMsg); /* 起保数据服务切换护定时器 */ TAF_APS_StartTimer(TI_TAF_APS_1X_TO_HRPD_HANDOFF_TIMER, TI_TAF_APS_1X_TO_HRPD_HANDOFF_TIMER_LEN, ucPdpId); /* 发送模式切换请求给HSM */ TAF_APS_SndHsm1XToHrpdHandOffReq(ucPdpId); /* 主状态TAF_APS_STA_CDATA_HANDOFF */ TAF_APS_SetCurrPdpEntityMainFsmState(TAF_APS_STA_CDATA_HANDOFF); /* 迁移TAF_APS_CDATA_HANDOFF_SUBSTA_WAIT_HSM_HANDOFF_CNF子状态 */ TAF_APS_SetCurrPdpEntitySubFsmState(TAF_APS_CDATA_HANDOFF_SUBSTA_WAIT_HSM_HANDOFF_CNF); return VOS_TRUE; }
VOS_UINT32 TAF_APS_RcvAtPsCallOrigReq_Active( VOS_UINT32 ulEventType, struct MsgCB *pstMsg ) { VOS_UINT8 ucPdpId; TAF_PS_MSG_STRU *pstAppMsg; TAF_PS_CALL_ORIG_REQ_STRU *pstCallOrigReq; #if (FEATURE_ON == FEATURE_IPV6) APS_PDP_CONTEXT_ENTITY_ST *pstPdpEntity; TAF_PDP_TYPE_ENUM_UINT8 enPdpType; #endif /* 初始化, 获取消息内容 */ pstAppMsg = (TAF_PS_MSG_STRU*)pstMsg; pstCallOrigReq = (TAF_PS_CALL_ORIG_REQ_STRU*)(pstAppMsg->aucContent); ucPdpId = TAF_APS_GetCurrFsmEntityPdpId(); /* 如果CID对应的剩余定时器时长为0, 需要上报响应事件 */ if (0 == TAF_APS_GetCallRemainTmrLen(pstCallOrigReq->stDialParaInfo.ucCid)) { TAF_APS_SndCallOrigCnf(&(pstCallOrigReq->stCtrl), pstCallOrigReq->stDialParaInfo.ucCid, TAF_PS_CAUSE_SUCCESS); } TAF_APS_SetCallRemainTmrLen(pstCallOrigReq->stDialParaInfo.ucCid, 0); /* 上报ID_EVT_TAF_PS_CALL_PDP_ACTIVATE_CNF事件 */ TAF_APS_SndPdpActivateCnf(ucPdpId, pstCallOrigReq->stDialParaInfo.ucCid); #if (FEATURE_ON == FEATURE_IPV6) enPdpType = pstCallOrigReq->stDialParaInfo.enPdpType; pstPdpEntity = TAF_APS_GetPdpEntInfoAddr(ucPdpId); if ( ((TAF_PDP_IPV6 == enPdpType) || (TAF_PDP_IPV4V6 == enPdpType)) && (VOS_TRUE == pstPdpEntity->bitOpIpv6RaInfo) ) { /* 上报ID_EVT_TAF_PS_IPV6_INFO_IND事件 */ TAF_APS_SndIpv6RaInfoNotifyInd(&(pstCallOrigReq->stCtrl), pstCallOrigReq->stDialParaInfo.ucCid, pstPdpEntity->ucNsapi, (TAF_PDP_IPV6_RA_INFO_STRU *)&pstPdpEntity->stIpv6RaInfo); } #endif /* 激活成功,启动流量统计 */ TAF_APS_StartDsFlowStats(TAF_APS_GetPdpEntNsapi(ucPdpId)); return VOS_TRUE; }
VOS_VOID TAF_APS_GetPdpIdListWithL4aSetCgansCnf( struct MsgCB *pstMsg, TAF_APS_PDPID_LIST_STRU *pstPdpIdList ) { APS_L4A_SET_CGANS_CNF_STRU *pstSetCgansCnf; /* 初始化, 获取消息内容 */ pstSetCgansCnf = (APS_L4A_SET_CGANS_CNF_STRU*)pstMsg; pstPdpIdList->aucPdpId[0] = TAF_APS_GetCurrFsmEntityPdpId(); pstPdpIdList->ucPdpNum = 1; }
VOS_UINT32 TAF_APS_RcvSmPdpDeactivateInd_Active( VOS_UINT32 ulEventType, struct MsgCB *pstMsg ) { VOS_UINT8 ucPdpId; SMREG_PDP_DEACTIVATE_IND_STRU *pstSmPdpDeactivateInd; APS_PDP_CONTEXT_ENTITY_ST *pstPdpEntity; /* 初始化, 获取消息内容 */ pstSmPdpDeactivateInd = (SMREG_PDP_DEACTIVATE_IND_STRU*)pstMsg; ucPdpId = TAF_APS_GetCurrFsmEntityPdpId(); pstPdpEntity = TAF_APS_GetPdpEntInfoAddr(ucPdpId); /* 停止流量统计 */ TAF_APS_StopDsFlowStats(pstPdpEntity->ucNsapi); /* 同步PDP状态和信息至ESM */ #if (FEATURE_ON == FEATURE_LTE) MN_APS_SndEsmPdpInfoInd(pstPdpEntity, SM_ESM_PDP_OPT_DEACTIVATE); #endif #if (FEATURE_ON == FEATURE_IPV6) /* 如果是缺省承载且地址类型是IPv6, 需要同步给ND Client */ if ( (TAF_APS_CheckPrimaryPdp(ucPdpId)) && (TAF_APS_CheckPdpAddrTypeIpv6(ucPdpId)) ) { TAF_APS_SndNdPdpDeactInd(TAF_APS_GetPdpEntNsapi(ucPdpId)); } #endif /* 如果SNDCP已经激活, 释放SNDCP资源 */ if (APS_SNDCP_ACT == pstPdpEntity->PdpProcTrack.ucSNDCPActOrNot) { Aps_ReleaseSndcpResource(ucPdpId); } /* 上报ID_EVT_TAF_PS_CALL_PDP_DEACTIVATE_IND事件 */ TAF_APS_SndPdpDeActivateInd(ucPdpId, TAF_APS_MapSmCause(pstSmPdpDeactivateInd->enCause)); /* 释放APS资源 */ Aps_ReleaseApsResource(ucPdpId); /* 配置IP过滤器 */ TAF_APS_IpfConfigUlFilter(ucPdpId); /* 主状态迁移至TAF_APS_STA_INACTIVE */ TAF_APS_SetCurrPdpEntityMainFsmState(TAF_APS_STA_INACTIVE); return VOS_TRUE; }
VOS_UINT32 TAF_APS_RcvPsCallEndReq_CdataHandOff_WaitHsmHandOffCnf( VOS_UINT32 ulEventType, struct MsgCB *pstMsg ) { TAF_PS_MSG_STRU *pstAppMsg; TAF_PS_CALL_END_REQ_STRU *pstCallEndReq; VOS_UINT8 ucPdpId; /* 获取消息内容 */ pstAppMsg = (TAF_PS_MSG_STRU*)pstMsg; pstCallEndReq = (TAF_PS_CALL_END_REQ_STRU*)(pstAppMsg->aucContent); ucPdpId = TAF_APS_GetCurrFsmEntityPdpId(); /* 保存子状态机的入口消息 */ TAF_APS_SaveCurrSubFsmEntryMsg(ulEventType, pstMsg); /* 上报PS呼叫挂断响应事件 */ TAF_APS_SndCallEndCnf(&(pstCallEndReq->stCtrl), pstCallEndReq->ucCid, TAF_PS_CAUSE_SUCCESS); /* 停止保数据服务切换保护定时器 */ TAF_APS_StopTimer(TI_TAF_APS_1X_TO_HRPD_HANDOFF_TIMER, ucPdpId); //To do:暂时按照此流程做,后面参考标杆来做 /* 如果PPP已激活,通知PPP去激活 */ if (TAF_APS_CDATA_PPP_STATE_ACTIVE == TAF_APS_GetPdpEntPppState(ucPdpId)) { TAF_APS_SndPppDeactInd(ucPdpId); } /* 上报去激活的事件 */ TAF_APS_SndPdpDeActivateInd(ucPdpId, TAF_PS_CAUSE_SUCCESS); /* 释放APS资源 */ Aps_ReleaseApsResource(ucPdpId); /* 配置IP过滤 */ TAF_APS_IpfConfigUlFilter(ucPdpId); /* 主状态迁移至TAF_APS_STA_INACTIVE */ TAF_APS_SetCurrPdpEntityMainFsmState(TAF_APS_STA_INACTIVE); /* 退出子状态状态机 */ TAF_APS_QuitCurrSubFsm(); return VOS_TRUE; }
VOS_UINT32 TAF_APS_RcvRabmSysChgToGprs_Active( VOS_UINT32 ulEventType, struct MsgCB *pstMsg ) { VOS_UINT8 ucPdpId; /* 获取当前状态机的APS实体索引 */ ucPdpId = TAF_APS_GetCurrFsmEntityPdpId(); /* 检查SNDCP激活标识, 激活SNDCP */ if (APS_SNDCP_INACT == TAF_APS_GetPdpEntSndcpActFlg(ucPdpId)) { Aps_RabmMsgActSndcp(ucPdpId); } return VOS_TRUE; }
VOS_UINT32 TAF_APS_RcvL4aPdpDeactivateInd_Active( VOS_UINT32 ulEventType, struct MsgCB *pstMsg ) { VOS_UINT8 ucPdpId; APS_PDP_CONTEXT_ENTITY_ST *pstPdpEntity; APS_L4A_PDP_DEACTIVATE_IND_STRU *pstL4aPdpDeactivateInd; /* 获取消息内容 */ pstL4aPdpDeactivateInd = (APS_L4A_PDP_DEACTIVATE_IND_STRU*)pstMsg; /* 获取当前状态机的APS索引 */ ucPdpId = TAF_APS_GetCurrFsmEntityPdpId(); /* 获取该索引的APS实体内容地址 */ pstPdpEntity = TAF_APS_GetPdpEntInfoAddr(ucPdpId); /* 停止流量统计 */ TAF_APS_StopDsFlowStats(pstPdpEntity->ucNsapi); /* 如果不是默认承载,则上报,默认承载不上报 */ if (TAF_APS_DEFAULT_CID != pstPdpEntity->stClientInfo.ucCid) { /* 上报ID_EVT_TAF_PS_CALL_PDP_DEACTIVATE_IND事件上报 */ TAF_APS_SndPdpDeActivateInd(ucPdpId, TAF_APS_MapL4aCause(pstL4aPdpDeactivateInd->ulEsmCause)); } /* 如果SNDCP已经激活, 释放SNDCP资源 */ if (APS_SNDCP_ACT == pstPdpEntity->PdpProcTrack.ucSNDCPActOrNot) { Aps_ReleaseSndcpResource(ucPdpId); } /* 释放APS资源 */ Aps_ReleaseApsResource(ucPdpId); /* 主状态迁移至TAF_APS_STA_INACTIVE */ TAF_APS_SetCurrPdpEntityMainFsmState(TAF_APS_STA_INACTIVE); 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; }
VOS_VOID TAF_APS_ProcImsBearerInfoIndOptActivate( APS_PDP_CONTEXT_ENTITY_ST *pstPdpEntity, SM_ESM_EPS_BEARER_INFO_IND_STRU *pstEpsBearerInfoInd ) { VOS_UINT8 ucPriPdpId; VOS_UINT8 ucPriCid; VOS_UINT8 ucSecPdpId; VOS_UINT8 ucSecCid; /* 判断PDP上下文信息中的linkedEspId与IMS信令承载中的RABID是否一致 */ if (VOS_TRUE == pstEpsBearerInfoInd->bitOpLinkedEpsbId) { if (VOS_TRUE == TAF_APS_CheckImsBearerByRabId(pstEpsBearerInfoInd->ulLinkedEpsbId)) { /* 获取主PDP的实体ID */ ucPriPdpId = TAF_APS_GetPdpIdByNsapi((VOS_UINT8)pstEpsBearerInfoInd->ulLinkedEpsbId); ucPriCid = 0; TAF_APS_GetImsBearerCid(ucPriPdpId, &ucPriCid); /* 获取专有承载的实体ID */ ucSecPdpId = TAF_APS_GetCurrFsmEntityPdpId(); ucSecCid = TAF_APS_GetPdpEntCurrCid(ucSecPdpId); /* 目前IMS的专有承载只向IMSA上报 */ /* 更新专有承载 PDP TAB */ TAF_APS_SetPdpEntClientInfo(ucSecPdpId, ucSecCid, TAF_APS_GetPdpEntModuleId(ucPriPdpId, ucPriCid), TAF_APS_GetPdpEntClientId(ucPriPdpId, ucPriCid), TAF_APS_GetPdpEntOpId(ucPriPdpId, ucPriCid)); /* 上报专有承载 ACT_IND */ TAF_APS_SndPdpActivateInd(ucSecPdpId, ucSecCid); } } }
VOS_UINT32 TAF_APS_RcvSndcpStatusReq_Active( VOS_UINT32 ulEventType, struct MsgCB *pstMsg ) { VOS_UINT32 ulRslt; VOS_UINT8 ucPdpId; APS_SNDCP_STATUS_REQ_ST *pstSnStatusReq; pstSnStatusReq = &((APS_SNDCP_STATUS_REQ_MSG*)pstMsg)->ApsSnStatusReq; ucPdpId = TAF_APS_GetCurrFsmEntityPdpId(); ulRslt = TAF_APS_ValidatePdpForSnStatusReq(ucPdpId, pstSnStatusReq); if (VOS_TRUE == ulRslt) { /* 上报ID_EVT_TAF_PS_CALL_PDP_DEACTIVATE_IND事件 */ TAF_APS_SndPdpDeActivateInd(ucPdpId, TAF_PS_CAUSE_SM_NW_LLC_OR_SNDCP_FAILURE); /* 发送内部消息, 触发PDP去激活流程 */ TAF_APS_SndInterPdpDeactivateReq(ucPdpId, SM_TAF_CAUSE_SM_NW_PROTOCOL_ERR_UNSPECIFIED); } 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_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; }
VOS_UINT32 TAF_APS_RcvAtSetPdpContextStateReq_Active( VOS_UINT32 ulEventType, struct MsgCB *pstMsg ) { TAF_PS_MSG_STRU *pstAppMsg; TAF_PS_SET_PDP_STATE_REQ_STRU *pstSetPdpCtxStateReq; #if (FEATURE_ON == FEATURE_IPV6) APS_PDP_CONTEXT_ENTITY_ST *pstPdpEntity; #endif VOS_UINT32 ulBearerActivateFlg; VOS_UINT8 ucCidValue; VOS_UINT8 ucPdpId; /* 初始化, 获取消息内容 */ pstAppMsg = (TAF_PS_MSG_STRU*)pstMsg; pstSetPdpCtxStateReq = (TAF_PS_SET_PDP_STATE_REQ_STRU*)(pstAppMsg->aucContent); ucPdpId = TAF_APS_GetCurrFsmEntityPdpId(); /* 设置激活标记 */ ulBearerActivateFlg = (TAF_CGACT_ACT == pstSetPdpCtxStateReq->stCidListStateInfo.ucState) ? VOS_TRUE : VOS_FALSE; /* 当前先不支持一次性激活多个PDP的场景,一次激活一个,因此找第一个要激活的 CID */ ucCidValue = TAF_APS_GetCidValue(ulBearerActivateFlg, pstSetPdpCtxStateReq->stCidListStateInfo.aucCid); /* PDP激活操作处理 */ if (TAF_CGACT_ACT == pstSetPdpCtxStateReq->stCidListStateInfo.ucState) { /* 如果CID对应的剩余定时器时长为0, 需要上报响应事件 */ if (0 == TAF_APS_GetCallRemainTmrLen(ucCidValue)) { TAF_APS_SndSetPdpCtxStateCnf(&(pstSetPdpCtxStateReq->stCtrl), TAF_PS_CAUSE_SUCCESS); } TAF_APS_SetCallRemainTmrLen(ucCidValue, 0); /* 上报ID_EVT_TAF_PS_CALL_PDP_ACTIVATE_CNF事件 */ TAF_APS_SndPdpActivateCnf(ucPdpId, ucCidValue); #if (FEATURE_ON == FEATURE_IPV6) pstPdpEntity = TAF_APS_GetPdpEntInfoAddr(ucPdpId); if (VOS_TRUE == pstPdpEntity->bitOpIpv6RaInfo) { /* 上报ID_EVT_TAF_PS_IPV6_INFO_IND事件 */ TAF_APS_SndIpv6RaInfoNotifyInd(&(pstSetPdpCtxStateReq->stCtrl), ucCidValue, pstPdpEntity->ucNsapi, (TAF_PDP_IPV6_RA_INFO_STRU *)&pstPdpEntity->stIpv6RaInfo); } #endif /* 激活成功,启动流量统计 */ TAF_APS_StartDsFlowStats(TAF_APS_GetPdpEntNsapi(ucPdpId)); } else { /*------------------------------------------------------------------ 主状态迁移至TAF_APS_STA_MS_DEACTIVATING 子状态迁移至TAF_APS_MS_DEACTIVATING_SUBSTA_INIT 在TAF_APS_MS_DEACTIVATING_SUBSTA_INIT子状态中 处理ID_MSG_TAF_PS_SET_PDP_CONTEXT_STATE_REQ消息 ------------------------------------------------------------------*/ TAF_APS_InitSubFsm(TAF_APS_FSM_MS_DEACTIVATING, TAF_APS_GetMsDeactivatingFsmDescAddr(), TAF_APS_MS_DEACTIVATING_SUBSTA_INIT); } return VOS_TRUE; }
VOS_UINT32 TAF_APS_RcvMmcServiceStatusInd_Active( VOS_UINT32 ulEventType, struct MsgCB *pstMsg ) { MMC_APS_SERVICE_STATUS_IND_STRU *pstMmcServiceStatusInd; #if (FEATURE_ON == FEATURE_IPV6) APS_PDP_CONTEXT_ENTITY_ST *pstPdpEntity; #endif VOS_UINT8 ucPdpId; /* 获取消息内容 */ pstMmcServiceStatusInd = (MMC_APS_SERVICE_STATUS_IND_STRU*)pstMsg; /* 获取当前状态机的APS实体索引 */ ucPdpId = TAF_APS_GetCurrFsmEntityPdpId(); #if (FEATURE_ON == FEATURE_IPV6) /* 获取该PDPID的PDP实体内容地址 */ pstPdpEntity = TAF_APS_GetPdpEntInfoAddr(ucPdpId); #endif /* 更新接入技术 */ TAF_APS_SetCurrPdpEntityRatType(pstMmcServiceStatusInd->enRatType); /* 更新PS域SIM卡状态 */ TAF_APS_SetCurrPdpEntitySimRegStatus(pstMmcServiceStatusInd->ulPsSimRegStatus); #if (FEATURE_ON == FEATURE_IPV6) /* 如果地址类型是IPv6, 需要同步给ND Client */ if ( (MMC_APS_RAT_TYPE_NULL != pstMmcServiceStatusInd->enRatType) && (TAF_APS_CheckPrimaryPdp(ucPdpId)) && (TAF_APS_CheckPdpAddrTypeIpv6(ucPdpId)) ) { if (VOS_TRUE != pstPdpEntity->ulNdClientActiveFlg) { TAF_APS_SndNdPdpActInd(pstPdpEntity->ucNsapi, pstPdpEntity->PdpAddr.aucIpV6Addr); pstPdpEntity->ulNdClientActiveFlg = VOS_TRUE; } } #endif switch (pstMmcServiceStatusInd->enRatType) { /* 当前模为GSM时, 不依靠该消息激活SNDCP */ case MMC_APS_RAT_TYPE_GSM: break; /* 当前模为WCDMA/LTE时, 需要去激活SNDCP */ case MMC_APS_RAT_TYPE_WCDMA: case MMC_APS_RAT_TYPE_LTE: if (APS_SNDCP_ACT == TAF_APS_GetPdpEntSndcpActFlg(ucPdpId)) { Aps_RabmMsgDeActSndcp(ucPdpId); } break; case MMC_APS_RAT_TYPE_NULL: default: break; } return VOS_TRUE; }