VOS_VOID NAS_EMM_SER_CompCnServiceReq( LRRC_LNAS_MSG_STRU *pNasMsg) { VOS_UINT32 ulIndex = 0; VOS_UINT8 ucKsiSn; VOS_UINT8 ucKsi; VOS_UINT8 ucSequenceNum; /* 打印进入该函数, INFO_LEVEL */ NAS_EMM_SER_LOG_INFO("NAS_EMM_SER_CompCnServiceReq is entered."); /* 清空将填充CN消息的空间 */ /* xiongxianghui00253310 delete memset 2013-11-26 begin */ /* NAS_LMM_MEM_SET(pNasMsg->aucNasMsg, 0, pNasMsg->ulNasMsgSize); */ /* xiongxianghui00253310 delete memset 2013-11-26 end */ /* 填充 Security header type + Protocol discriminator */ pNasMsg->aucNasMsg[ulIndex++] = EMM_CN_SECURITY_HEADER_TYPE_SER_REQ; /* 计算 KsiSn*/ ucKsi = NAS_EMM_SecuGetKSIValue(); ucSequenceNum = (VOS_UINT8)NAS_EMM_SecuGetUlNasCountVAlue(); ucSequenceNum = ucSequenceNum & EMM_TAUSER_LOW5_BITS; ucKsiSn = ((VOS_UINT8)(ucKsi << 5)) | ucSequenceNum; /* 填充 KSI and sequence number */ pNasMsg->aucNasMsg[ulIndex++] = ucKsiSn; /* 填充 Message authentication code */ /*这里只需要初始化为0,在完整性保护时会填充这两个字节*/ pNasMsg->aucNasMsg[ulIndex++] = 0; pNasMsg->aucNasMsg[ulIndex] = 0; return; }
/***************************************************************************** Function Name : NAS_EMM_CompCnExtendedSerReqMoNasMsg Description : 组装EXTENDED SERVICE REQ消息 Input : pulIndex Output : pucCnMsg pulIndex Return : VOS_VOID History : 1.lihong 2012-02-23 Draft Enact *****************************************************************************/ VOS_VOID NAS_EMM_CompCnExtendedSerReqMoNasMsg ( VOS_UINT8 *pucCnMsg, VOS_UINT32 *pulIndex ) { VOS_UINT32 ulIndex = NAS_EMM_NULL; VOS_UINT8 ucKsi = NAS_EMM_NULL; NAS_LMM_PUB_INFO_STRU *pstEmmInfo = VOS_NULL_PTR; VOS_UINT32 ulIeLength = 0; ulIndex = *pulIndex; pstEmmInfo = NAS_LMM_GetEmmInfoAddr(); /* 填充 Protocol Discriminator + Security header type*/ pucCnMsg[ulIndex++] = EMM_CN_MSG_PD_EMM; /* 填充 Detach request message identity */ pucCnMsg[ulIndex++] = NAS_EMM_CN_MT_EXT_SER_REQ; /* 填充service type */ if (NAS_EMM_SER_START_CAUSE_MO_CSFB_REQ == NAS_EMM_SER_GetEmmSERStartCause()) { pucCnMsg[ulIndex] = MMC_LMM_SERVICE_MO_CSFB_1XCSFB; } else if (NAS_EMM_SER_START_CAUSE_MO_EMERGENCY_CSFB_REQ == NAS_EMM_SER_GetEmmSERStartCause()) { pucCnMsg[ulIndex] = MMC_LMM_SERVICR_MO_CSFB_1XCSFB_EMERGENCY; } else { pucCnMsg[ulIndex] = MMC_LMM_SERVICR_MT_CSFB_1XCSFB; } /*填充KSIasme*/ ucKsi = NAS_EMM_SecuGetKSIValue(); pucCnMsg[ulIndex++] |= (ucKsi & 0x0F)<<4; /*填充M-TSMI*/ /* 填写LENGTH为5 */ pucCnMsg[ulIndex++] = 5; /* 填写TYPE OF IDENTITY,和EVEN/ODD标识,根据协议前4BIT为'1111' */ pucCnMsg[ulIndex] = NAS_EMM_TYPE_OF_IDENTITY_TMSI_PTMSI_MTMSI; pucCnMsg[ulIndex++] |= NAS_EMM_HIGH_4_BIT; NAS_LMM_MEM_CPY( &(pucCnMsg[ulIndex]), &pstEmmInfo->stMmUeId.stGuti.stMTmsi, sizeof(NAS_EMM_MTMSI_STRU)); ulIndex += sizeof(NAS_EMM_MTMSI_STRU); /* 只有MT CSFB才填充CSFB RESPONSE */ if (NAS_EMM_SER_START_CAUSE_MT_CSFB_REQ == NAS_EMM_SER_GetEmmSERStartCause()) { pucCnMsg[ulIndex++] = NAS_EMM_EXTENDED_SER_REQ_CSFB_RSP_IEI | NAS_EMM_SER_GetEmmSerCsfbRsp(); } /* 填充EPS bearer context status */ /*leili modify for isr begin*/ NAS_EMM_EncodeEpsBearStatus( &(pucCnMsg[ulIndex]), &ulIeLength); ulIndex += ulIeLength; /*leili modify for isr end*/ #if 0 pucCnMsg[ulIndex++] = NAS_EMM_TAU_REQ_EPS_STATUS_IEI; pucCnMsg[ulIndex++] = NAS_EMM_CN_EPS_CONTEXT_LEN; for(ulLoop = 0; ulLoop < NAS_EMM_GetEpsIdNum(); ulLoop++) { ucEsmEPSNum = (VOS_UINT8)(NAS_EMM_GetEpsId(ulLoop)); if( NAS_EMM_EPS_BEARER_STATUS_NUM_SEVEN < ucEsmEPSNum) { ucEsmEPSNum = ucEsmEPSNum - NAS_EMM_EPS_BEARER_STATUS_NUM_EIGNT; ucEsmEPS2 = ucEsmEPS2 | NAS_EMM_TAU_ESM_BEARER_LEFT_N(ucEsmEPSNum); } else { ucEsmEPS1 = ucEsmEPS1 | NAS_EMM_TAU_ESM_BEARER_LEFT_N(ucEsmEPSNum); } } pucCnMsg[ulIndex++] = ucEsmEPS1; pucCnMsg[ulIndex++] = ucEsmEPS2; #endif *pulIndex = ulIndex; return; }
VOS_VOID NAS_EMM_CompCnDetachReqMoNasMsg( VOS_UINT8 *pucCnMsg, VOS_UINT32 *pulIndex) { VOS_UINT32 ulIndex = 0; VOS_UINT8 ucKsi; MMC_LMM_MO_DETACH_TYPE_ENUM_UINT32 enDetachType = MMC_LMM_MO_DETACH_TYPE_BUTT; VOS_UINT32 ulLen = 0; ulIndex = *pulIndex; /* 填充 Protocol Discriminator + Security header type*/ pucCnMsg[ulIndex++] = EMM_CN_MSG_PD_EMM; /* 填充 Detach request message identity */ pucCnMsg[ulIndex++] = NAS_EMM_CN_MT_DETACH_REQ_MT; /* lihong00150010 swtichoff begin */ /*填充Detach type*/ if (NAS_EMM_DETACH_MODE_SWITCH_OFF == NAS_EMM_GLO_AD_GetDetMode()) { enDetachType = NAS_EMM_GetSwitchOffDetachType(); } else { enDetachType = NAS_EMM_GetDetachType(); } pucCnMsg[ulIndex] = (VOS_UINT8)(NAS_EMM_GLO_AD_GetDetMode() | enDetachType); /* lihong00150010 swtichoff end */ /*填充KSIasme*/ ucKsi = NAS_EMM_SecuGetKSIValue(); pucCnMsg[ulIndex++] |= (ucKsi & 0x0F)<<4; /*填充GUTI或IMSI*/ if (NAS_EMM_AD_BIT_SLCT == NAS_EMM_GLO_AD_OP_GUTI()) { /*填充GUTI*/ /*============ GUTI ============ begin */ pucCnMsg[ulIndex++] = NAS_EMM_GLO_AD_GetLen(); pucCnMsg[ulIndex++] =(NAS_EMM_GLO_AD_GetOeToi()|NAS_EMM_HIGH_HALF_BYTE_F);/* [false alarm]:代码保证了不会越界 */ NAS_LMM_MEM_CPY( &(pucCnMsg[ulIndex]), NAS_EMM_GLO_AD_GetGutiPlmn(), NAS_EMM_AD_LEN_PLMN_ID); ulIndex += NAS_EMM_AD_LEN_PLMN_ID; pucCnMsg[ulIndex++] = NAS_EMM_GLO_AD_GetMmeGroupId();/* [false alarm]:代码保证了不会越界 */ pucCnMsg[ulIndex++] = NAS_EMM_GLO_AD_GetMMeGroupIdCnt();/* [false alarm]:代码保证了不会越界 */ pucCnMsg[ulIndex++] = NAS_EMM_GLO_AD_GetMMeCode();/* [false alarm]:代码保证了不会越界 */ NAS_LMM_MEM_CPY( &(pucCnMsg[ulIndex]), NAS_EMM_GLO_AD_GetMTmsiAddr(), sizeof(NAS_EMM_MTMSI_STRU)); ulIndex += sizeof(NAS_EMM_MTMSI_STRU); /*============ GUTI ============ end */ }/* lihong00150010 emergency tau&service begin */ else if (NAS_EMM_AD_BIT_SLCT == NAS_EMM_GLO_AD_OP_IMSI()) {/* lihong00150010 emergency tau&service end */ /*填充IMSI*/ /*============ IMSI ============ begin */ NAS_LMM_MEM_CPY( &(pucCnMsg[ulIndex]), NAS_EMM_GLO_AD_GetImsi(), NAS_EMM_AD_LEN_CN_MSG_IMSI); ulIndex += NAS_EMM_AD_LEN_CN_MSG_IMSI; /*============ IMSI ============ end */ }/* lihong00150010 emergency tau&service begin */ else { NAS_EMM_CompImei(&(pucCnMsg[ulIndex]),&ulLen); ulIndex += ulLen; } /* lihong00150010 emergency tau&service end */ *pulIndex = ulIndex; return; }