VOS_VOID CDS_FreeIpfDlSrcMem(VOS_VOID) { LUP_QUEUE_STRU *pstDlFreeQue ; BSP_U32 ulIdleCD; VOS_UINT32 ulIdleBD; VOS_UINT32 ulBusyBD; VOS_UINT32 ulCanFree; VOS_UINT32 ulQueCnt; VOS_UINT32 ulCnt; TTF_MEM_ST *pstSrcTtf; pstDlFreeQue = CDS_IPF_DL_SRCMEM_FREE_QUE(); CDS_ASSERT(VOS_NULL_PTR != pstDlFreeQue); ulQueCnt = LUP_QueCnt(pstDlFreeQue); if (0 == ulQueCnt) { return; } /*get busy bd num*/ ulIdleBD = BSP_IPF_GetDlBDNum(&ulIdleCD); ulBusyBD = IPF_DLBD_DESC_SIZE - ulIdleBD; if (ulQueCnt >= ulBusyBD) { ulCanFree = ulQueCnt - ulBusyBD; } else { CDS_ERROR_LOG3(UEPS_PID_CDS, "CDS_FreeIpfDlSrcMem:Buff Num Less IPF Busy BD Num.quecnt,busybd,idlebd",ulQueCnt,ulBusyBD,ulIdleBD); vos_printf("CDS_FreeIpfDlSrcMem : src free que less than busy bd. quecnt=%d,busybd=%d,idlebd=%d.\n",ulQueCnt,ulBusyBD,ulIdleBD); CDS_DBG_DL_IPF_FREE_SRCMEM_ERROR(1); return; } /*free src mem*/ for (ulCnt = 0; ulCnt < ulCanFree; ulCnt ++) { if (PS_SUCC != LUP_DeQue(pstDlFreeQue,&pstSrcTtf)) { return; } TTF_MemFree(UEPS_PID_CDS,pstSrcTtf); CDS_DBG_DL_IPF_FREE_SRCMEM_NUM(1); } return; }
VOS_BOOL QosFc_IsDiscard(VOS_UINT8 ucRabId, MODEM_ID_ENUM_UINT16 enModemId) { static VOS_UINT32 ulPktCntVal = 0; /* 包计数 */ VOS_UINT32 ulRandValue = 0; if(VOS_TRUE != g_stQosFcCtrl.bQosFcEnable) { /* 流控没打开,不进流控状态 */ return VOS_FALSE; } ulPktCntVal++; if(ulPktCntVal >= g_stQosFcCtrl.ulPktCntLimit) { ulPktCntVal = 0; QosFc_FlowCtrl(); } if(QosFc_IsInValidRabId(ucRabId)) { CDS_ERROR_LOG1(UEPS_PID_CDS,"QosFc_IsDiscard : Error RabId: ", ucRabId); /* 非法承载,丢包 */ return VOS_TRUE; } switch( g_enRabState[enModemId][ucRabId - 5] ) { case QOS_FC_RAB_STATE_NORMAL: case QOS_FC_RAB_STATE_NOT_DISCARD: /* 正常数传状态,不丢包 */ return VOS_FALSE; case QOS_FC_RAB_STATE_RANDOM_DISCARD: FC_DBG_RCV_PKT_ONRD_STAT(enModemId, ucRabId, 1); /* 随机丢包 */ ulRandValue = PS_RAND(101); if(ulRandValue > g_stQosFcCtrl.ulRandomDiscardRate) { return VOS_FALSE; } FC_DBG_DISCARD_PKT_ONRD_STAT(enModemId, ucRabId, 1); return VOS_TRUE; case QOS_FC_RAB_STATE_DISCARD: FC_DBG_RCV_PKT_OND_STAT(enModemId, ucRabId, 1); /* 丢包 */ ulRandValue = PS_RAND(101); if(ulRandValue > g_stQosFcCtrl.ulDiscardRate) { return VOS_FALSE; } FC_DBG_DISCARD_PKT_OND_STAT(enModemId, ucRabId, 1); return VOS_TRUE; default: /* 非法状态 */ CDS_ERROR_LOG3(UEPS_PID_CDS, "QosFc_IsDiscard : Rab invalid state::",enModemId, ucRabId, g_enRabState[enModemId][ucRabId - 5]); break; } /* 尽量不丢包 */ return VOS_FALSE; }
VOS_VOID QosFc_RabCreate(CONST MsgBlock *pstMsg) { QOS_FC_RAB_CREATE_IND_STRU *pstRabCreate = (QOS_FC_RAB_CREATE_IND_STRU *)(VOS_VOID*)pstMsg; QOS_FC_RAB_ENTITY_STRU *pstQosFcRabEntity = VOS_NULL_PTR; QCI_TYPE_ENUM_UINT8 enQci; VOS_UINT8 ucOldLinkRabId = FC_INVALID_RABID; MODEM_ID_ENUM_UINT16 enModemId; FC_DBG_CREATE_MSG_STAT(1); /*入参判断*/ if (VOS_NULL_PTR == pstRabCreate) { CDS_ERROR_LOG(UEPS_PID_CDS, "QosFc_RabCreate : NULL pointer"); return; } /*lint -e960*/ if(QosFc_IsInValidRabId(pstRabCreate->ucRabId) || QosFc_IsInValidRabId(pstRabCreate->ucLinkRabId) || (pstRabCreate->enQci < QCI_TYPE_QCI1_GBR) || (pstRabCreate->enQci > QCI_TYPE_QCI9_NONGBR)) { CDS_ERROR_LOG3(UEPS_PID_CDS, "QosFc_RabCreate : Invalid MSG RabId: LinkRabId: Qci:", pstRabCreate->ucRabId, pstRabCreate->ucLinkRabId, pstRabCreate->enQci); return; } /*lint +e960*/ /* 流控都按拼接处理 */ enModemId = VOS_GetModemIDFromPid(TTF_GET_MSG_SENDER_PID(pstRabCreate)); if (MODEM_ID_BUTT <= enModemId) { CDS_ERROR_LOG1(UEPS_PID_CDS, "QosFc_RabCreate : ModemId Error",enModemId); return; } /*lint -e734*/ pstRabCreate->ucRabId |= (enModemId << FC_MODEMID_SHIFT); pstRabCreate->ucLinkRabId |= (enModemId << FC_MODEMID_SHIFT); /*lint +e734*/ pstQosFcRabEntity = QosFc_CreateRabEntity(pstRabCreate, &ucOldLinkRabId); if(VOS_NULL_PTR != pstQosFcRabEntity) { /* 获得PDN上最高的QCI */ enQci = QosFc_GetPdnQci(pstRabCreate->ucLinkRabId); QosFc_UpdateChannelQos(pstRabCreate->ucLinkRabId, enQci); /* 新建承载处于非流控状态,打开数传通道 */ QosFc_ChannelRestore(pstRabCreate->ucLinkRabId); if((FC_INVALID_RABID != ucOldLinkRabId) && (ucOldLinkRabId != pstRabCreate->ucLinkRabId)) { /* 获得PDN上最高的QCI */ enQci = QosFc_GetPdnQci(ucOldLinkRabId); QosFc_UpdateChannelQos(ucOldLinkRabId, enQci); /* PDN是否需要流控 */ /*lint -e960*/ if((QCI_TYPE_BUTT != enQci) && (FC_INVALID_RABID == QosFc_OtherAvailRabOfPdn(ucOldLinkRabId))) /*lint +e960*/ { QosFc_ChannelControl(ucOldLinkRabId); } } } return; }