⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cbcfunction.c

📁 CBS(小区广播)程序实现手稿
💻 C
📖 第 1 页 / 共 5 页
字号:
//	Convert_FAILURE_IND(&s_CBEMessage,&s_CBCProxyMessage);
//	AppendCBESendMessage(&s_CBCProxyMessage);

	return SUCCESS;
}


/* 处理从BSC来的重启指示 */
int Process_BSC_Restart_IND(int Tid)
{
	PID_t                       s_Pid;
	int                         i,j;
	RESET_PROCESS_DATA_STRUCT   *LPs_ResetProcessDataStuct;
	int                         iPosi;
	
	memcpy(&s_Pid, &s_BscConnectInfo[Tid].s_Pid, sizeof(PID_t));

	/* 如果功能块号和模块号都为0,不是A区的响应 */
	if((s_Pid.cModuleId==0)&&(s_Pid.cModuleId==0))
	{
		/* 置系统小区状态 */
		for(i=0;i<CBCBSC_Unpack.p_UplinkCellList.iLength;i++)
		{
			Process_Set_CellId_Status(&CBCBSC_Unpack.p_UplinkCellList.s_CellList[i].cCellId[0],CELL_OK);
		}
		return CONTINUANCE;
	}

	/* 由BSC主动发起 */
	if((is_busy_pid((char *)&s_Pid)<0)&&
		(s_BscConnectInfo[Tid].MessageType!=CBSE_RESET))
	{
		/* 该消息由BSC主动发起 */
		/* 置系统小区状态 */
		for(i=0;i<CBCBSC_Unpack.p_UplinkCellList.iLength;i++)
		{
			Process_Set_CellId_Status(&CBCBSC_Unpack.p_UplinkCellList.s_CellList[i].cCellId[0],CELL_OK);
		}
		return CONTINUANCE;
	}




	LPs_ResetProcessDataStuct=(RESET_PROCESS_DATA_STRUCT  *)&ProcessData[s_Pid.iProcessId][0];

	/* 消息类型不匹配 */
	if(LPs_ResetProcessDataStuct->s_CBCMessage.s_MessageHead.iMessageType!=CBCPROXY_RESET)
	{
		/* 该消息由BSC主动发起 */
		/* 置系统小区状态 */
		for(i=0;i<CBCBSC_Unpack.p_UplinkCellList.iLength;i++)
		{
			Process_Set_CellId_Status(&CBCBSC_Unpack.p_UplinkCellList.s_CellList[i].cCellId[0],CELL_OK);
		}
		return CONTINUANCE;
	}

	/* 以下为处理A区消息的响应 */
    /* 找到对应的BSC */
	for(i=0;i<LPs_ResetProcessDataStuct->s_ResponseCellList.cNumberOfBSC;i++)
	{
		if (memcmp(&s_BscConnectInfo[Tid].BscIdentifier[0],
			&LPs_ResetProcessDataStuct->s_ResponseCellList.s_BSCCellList[i].BSCIdentifier[0],
			BSC_INDENTIFIER_LEN)==0)
		{
			break;
		}
	}	
		
	iPosi=i;
	
	/* 置响应Flag */
	LPs_ResetProcessDataStuct->s_ResponseCellList.s_BSCCellList[iPosi].bReceiveRespons=1;

	/* 置响应报告 */
	if (CBCBSC_Unpack.p_UplinkCellList.bFlag==EXIST)
	{
		for(i=0;i<CBCBSC_Unpack.p_UplinkCellList.iLength;i++)
		{
			for(j=0;j<LPs_ResetProcessDataStuct->s_ResponseCellList.s_BSCCellList[iPosi].ilength;j++)
			{
				if(memcmp(&CBCBSC_Unpack.p_UplinkCellList.s_CellList[i].cCellId[2],
					&LPs_ResetProcessDataStuct->s_ResponseCellList.s_BSCCellList[iPosi].s_CellReport[j].s_CellId.cCellId[2],2)==0)
				{
					LPs_ResetProcessDataStuct->s_ResponseCellList.s_BSCCellList[iPosi].s_CellReport[j].cCellStatus=CELL_SUCCESS;
					break;
				}
			}
		}
	}

	/* 置系统小区状态 */
	for(i=0;i<CBCBSC_Unpack.p_UplinkCellList.iLength;i++)
	{
		Process_Set_CellId_Status(&CBCBSC_Unpack.p_UplinkCellList.s_CellList[i].cCellId[0],CELL_OK);
	}


	/* 是否为全响应 */
	if(IfReturnImmediately(&LPs_ResetProcessDataStuct->s_ResponseCellList)<0)
	{
		return CONTINUANCE;
	}
	else
	{
		/* 返回全部响应 */
		Process_RESET_timer_Expired(s_Pid);

		/* 释放回复定时器 */
 		kill_timer(LPs_ResetProcessDataStuct->iTimerId, (char *)&s_Pid);

		return END;
	}



}

/*---------------------------------------
//出错返回给CBC_proxy
//拒绝从CBC_proxy操作请求,返回拒绝原因
// 释放逻辑进程
//用于处理消息初始化错误
//如: 没有必备参数,错误的小区,
//---------------------------------------*/
void Process_CBE_Message_Error(PID_t s_Pid,int ErrorCode)
{
	SENDING_MESSAGE_ERROR_i  s_SendingMessageError;
	MESSAGE_HEAD_t           *s_MessageHead; 
	CBEMESSAGE_t             s_CBEMessage;
	CBEMESSAGE_t             *LpCBEMessage;


	memset(&s_CBEMessage,0,sizeof(CBEMESSAGE_t));
	
	s_MessageHead=(MESSAGE_HEAD_t *)&ProcessData[s_Pid.iProcessId][sizeof(unsigned short)];


//	s_SendingMessageError.s_MessageHead.cHandToHandSingnal

	s_SendingMessageError.s_MessageHead.iMessageAreaId=A;
	s_SendingMessageError.s_MessageHead.iMessageType=s_MessageHead->iMessageType;
	
	//填写接受Pid
	memcpy(&s_SendingMessageError.s_MessageHead.s_ReceiverPid.iProcessId,&s_MessageHead->s_SenderPid.iProcessId,sizeof(PID_t));
	
	//填写发送者Pid
	memcpy(&s_SendingMessageError.s_MessageHead.s_SenderPid.iProcessId,&s_MessageHead->s_ReceiverPid.iProcessId,sizeof(PID_t));
		
	s_SendingMessageError.s_MessageHead.iMessageLength=sizeof(int);

	s_SendingMessageError.iErrorCode=ErrorCode;

	s_SendingMessageError.ilen=sizeof(MESSAGE_HEAD_t)+sizeof(int);

	//传递SocketHandle
	LpCBEMessage=(CBEMESSAGE_t *)&ProcessData[s_Pid.iProcessId][0];
//	s_CBEMessage.SocketHandle=LpCBEMessage->SocketHandle;

	//
	memcpy(&s_CBEMessage.iLen,&s_SendingMessageError.ilen,sizeof(SENDING_MESSAGE_ERROR_i));
	

	//发送给CBCproxy
    AppendCBESendMessage(&s_CBEMessage);
/*
	//释放逻辑进程
	if (free_pid((char *)&s_Pid)<0)
	{
		printf("Free pid Error,Pid=%d\n",s_Pid.iProcessId); 
	}
*/
}




/* 
     处理从BSC来的信道查询响应,
	 如果为C区响应,则不用回复给CBCProxy,即信道负荷控制的响应
	 如果为A区响应,则回复给CBCProxy.
*/
int Process_StatusCBCH_QUERY_RESP(int Tid)
{
	int                        i,j;
	PID_t                      s_Pid;
	STATUSCBCH_RESP_t          s_StatusCBCHResp;
	int                        iBscPosi;  /* BSC在响应列表中的偏移量 */
    SCQ_PROCESS_DATA_STRUCT    *LPs_SCQProcessDataStruct;  

	memcpy(&s_Pid, &s_BscConnectInfo[Tid].s_Pid,sizeof(PID_t));	
	memset(&s_StatusCBCHResp,0,sizeof(STATUSCBCH_RESP_t));

	/* 信道状态列表 */
	if (CBCBSC_Unpack.p_CBCLOADINGSTATUSList.bFlag==EXIST)
	{
		memcpy(&s_StatusCBCHResp.p_CbcLoadingStatus,&CBCBSC_Unpack.p_CBCLOADINGSTATUSList,sizeof(CBCLOADINGSTATUSList_t));
	}

	/* 失败列表 */
	if (CBCBSC_Unpack.p_FailureReportList.bFlag==EXIST)
	{
		memcpy(&s_StatusCBCHResp.p_FailureList,&CBCBSC_Unpack.p_FailureReportList,sizeof(FAILURELIST_t));


		for(i=0;i<s_StatusCBCHResp.p_FailureList.iLength;i++)
		{
    		if ((s_StatusCBCHResp.p_FailureList.s_FailureReason[i].cCause==BSS_CAPACITY_EXCEEDED)||
	    		(s_StatusCBCHResp.p_FailureList.s_FailureReason[i].cCause==CELL_MEMORY_EXCEEDED)||
		    	(s_StatusCBCHResp.p_FailureList.s_FailureReason[i].cCause==BSS_MEMORY_EXCEEDED))
			{
#ifdef  OPEN_STATISTIC	
				/* 失败次数加一 */
				Update_Cell_Statistic_Count(&s_StatusCBCHResp.p_FailureList.s_FailureReason[i].s_Cellid.cCellId[0],Tid
					,CBCH_STATISTIC, 2,s_StatusCBCHResp.p_FailureList.s_FailureReason[i].cCause);
#endif
		
			}
		}

	}


	/*------------------------------*/
	/* 信道负荷控制的响应的处理 */
	if((s_Pid.cFunctionId==0)&&
		(s_Pid.cModuleId==0)&&
		(s_Pid.iProcessId==0))
	{

		if (s_StatusCBCHResp.p_CbcLoadingStatus.bFlag==EXIST)
		{
			for(i=0;i<s_StatusCBCHResp.p_CbcLoadingStatus.iLength;i++)
			{
    			/* 修改系统的负荷记录 */
				Set_SysCell_Load_Record(&s_StatusCBCHResp.p_CbcLoadingStatus.s_CbcLoadingStatus[i],&s_BscConnectInfo[Tid].BscIdentifier[0]);
			}
		}
		return CONTINUANCE;
	}

    /*------------------------------*/

	/* 以下为处理A区消息的响应 */
	if(is_busy_pid((char *)&s_Pid)<0)
	{
		return FAILURE;
	}

	LPs_SCQProcessDataStruct=(SCQ_PROCESS_DATA_STRUCT *)&ProcessData[s_Pid.iProcessId][0];

	/* 是否为CBCPROXY_STATUS_CBCH_QUERY消息 */
	if (LPs_SCQProcessDataStruct->s_CBCMessage.s_MessageHead.iMessageType!=CBCPROXY_STATUS_CBCH_QUERY)
	{
		return FAILURE;
	}
	


	/* 找到对应的BSC */
	for(i=0;i<LPs_SCQProcessDataStruct->s_ResponseCellList.cNumberOfBSC;i++)
	{
		if (memcmp(&s_BscConnectInfo[Tid].BscIdentifier[0],
			&LPs_SCQProcessDataStruct->s_ResponseCellList.s_BSCCellList[i].BSCIdentifier[0],
			BSC_INDENTIFIER_LEN)==0)
		{
			break;
		}
	}	
		
	iBscPosi=i;

	if(iBscPosi==LPs_SCQProcessDataStruct->s_ResponseCellList.cNumberOfBSC)
	{
		return FAILURE;
	}

	LPs_SCQProcessDataStruct->s_ResponseCellList.s_BSCCellList[iBscPosi].bReceiveRespons=1;


	/* 信道指示 */
	if (CBCBSC_Unpack.p_ChannelIndicator.bFlag==EXIST)
	{
		memcpy(&s_StatusCBCHResp.p_ChannelIndicator,&CBCBSC_Unpack.p_ChannelIndicator,sizeof(CHANNELINDICATOR_t));
	}




	/* 置负荷列表 */
	if (s_StatusCBCHResp.p_CbcLoadingStatus.bFlag==EXIST)
	{
		for(i=0;i<s_StatusCBCHResp.p_CbcLoadingStatus.iLength;i++)
		{
			
			/* 置系统中小区的信道负荷 */

			for(j=0;j<LPs_SCQProcessDataStruct->s_ResponseCellList.s_BSCCellList[iBscPosi].ilength;j++)
			{
#ifdef  OPEN_STATISTIC
				/* 小区CBCH成功次数加一 */
				Update_Cell_Statistic_Count(&s_StatusCBCHResp.p_CbcLoadingStatus.s_CbcLoadingStatus[i].s_Cellid.cCellId[0],Tid,CBCH_STATISTIC,1,0);
#endif
				if(memcmp(&s_StatusCBCHResp.p_CbcLoadingStatus.s_CbcLoadingStatus[i].s_Cellid.cCellId[2],
					&LPs_SCQProcessDataStruct->s_ResponseCellList.s_BSCCellList[iBscPosi].s_CellReport[j].s_CellId.cCellId[2],2)==0)
				{
					LPs_SCQProcessDataStruct->s_ResponseCellList.s_BSCCellList[iBscPosi].s_CellReport[j].cCellStatus=CELL_SUCCESS;
					/* 完成次数用作信道负荷 */
					LPs_SCQProcessDataStruct->s_ResponseCellList.s_BSCCellList[iBscPosi].s_CellReport[j].iNoOfBroadcastsCompl=
						s_StatusCBCHResp.p_CbcLoadingStatus.s_CbcLoadingStatus[i].cCbcLoading;
					
					/* 修改系统的负荷记录 */
                    Set_SysCell_Load_Record(&s_StatusCBCHResp.p_CbcLoadingStatus.s_CbcLoadingStatus[i],&s_BscConnectInfo[Tid].BscIdentifier[0]);

					break;
				}
			}
		}
	}

	/* 置失败列表 */
	if (s_StatusCBCHResp.p_FailureList.bFlag==EXIST)
	{
		for(i=0;i<s_StatusCBCHResp.p_FailureList.iLength;i++)
		{
			for(j=0;j<LPs_SCQProcessDataStruct->s_ResponseCellList.s_BSCCellList[iBscPosi].ilength;j++)
			{
				if(memcmp(&s_StatusCBCHResp.p_FailureList.s_FailureReason[i].s_Cellid.cCellId[2],
					&LPs_SCQProcessDataStruct->s_ResponseCellList.s_BSCCellList[iBscPosi].s_CellReport[j].s_CellId.cCellId[2],2)==0)
				{
					LPs_SCQProcessDataStruct->s_ResponseCellList.s_BSCCellList[iBscPosi].s_CellReport[j].cCellStatus=PERMANENT_FAILURE;
					break;
				}
			}
		}
	}

	/* 是否全响应 */
	if(IfReturnImmediately(&LPs_SCQProcessDataStruct->s_ResponseCellList)>0)
	{
		/* 全返回 */
		Process_StatusCBCHQuery_Return_To_CBCProxy(s_Pid);

		/* 释放定时器 */
        kill_timer(LPs_SCQProcessDataStruct->iTimerId, (char *)&s_Pid);

		return END;
	}
	else
	{
		return CONTINUANCE;
	}

}

/* 处理从BSC来的消息查询响应 */
int Process_StatusMessage_QUERY_RESP(int Tid)
{
	int                        i,j;
	PID_t                      s_Pid;
	STATUSMESSAGE_RESP_t       s_StatusMessageResp;
	int                        iBscPosi;  /* BSC在响应列表中的偏移量 */
    SMQ_PROCESS_DATA_STRUCT    *LPs_SMQProcessDataStruct;  
	
	memcpy(&s_Pid, &s_BscConnectInfo[Tid].s_Pid,sizeof(PID_t));
	memset(&s_StatusMessageResp,0,sizeof(STATUSMESSAGE_RESP_t));

	if(is_busy_pid((char *)&s_Pid)<0)
	{
		return FAILURE;
	}

	LPs_SMQProcessDataStruct=(SMQ_PROCESS_DATA_STRUCT *)&ProcessData[s_Pid.iProcessId][0];

	if(LPs_SMQProcessDataStruct->s_CBCMessage.s_MessageHead.iMessageType!=CBCPROXY_STATUS_MESSAGE_QUERY)
	{
		return FAILURE;
	}


	/* 找到对应的BSC */
	for(i=0;i<LPs_SMQProcessDataStruct->s_ResponseCellList.cNumberOfBSC;i++)
	{
		if (memcmp(&s_BscConnectInfo[Tid].BscIdentifier[0],
			&LPs_SMQProcessDataStruct->s_ResponseCellList.s_BSCCellList[i].BSCIdentifier[0],
			BSC_INDENTIFIER_LEN)==0)
		{
			break;
		}
	}	
		
	iBscPosi=i;

	if(iBscPosi==LPs_SMQProcessDataStruct->s_ResponseCellList.cNumberOfBSC)
	{
		return FAILURE;
	}

	/* 收到响应 */
	LPs_SMQProcessDataStruct->s_ResponseCellList.s_BSCCellList[iBscPosi].bReceiveRespons=1;

#ifdef DEBUG_PRINT
	if ((CBCBSC_Unpack.p_MessageIdentifier.bFlag!=EXIST)
		||(CBCBSC_Unpack.p_Serialnumber.bFlag!=EXIST))
	{
		printf("Parameter needed in StatusMessageQueryResp! \n");
		return FAILURE;
	}
#endif

	memcpy(&s_StatusMessageResp.p_MessageIdentifier,&CBCBSC_Unpack.p_MessageIdentifier,sizeof(MESSAGEIDENTIFIER_t));
	memcpy(&s_StatusMessageResp.p_OldSerialnumber,&CBCBSC_Unpack.p_Serialnumber,sizeof(SERIALNUMBER_t));

	/* 广播完成次数 */
	if (CBCBSC_Unpack.p_NoofBroadcastComlList.bFlag==EXIST)
	{
		memcpy(&s_StatusMessageResp.p_NoOfBroadcastComlList,&CBCBSC_Unpack.p_NoofBroadcastComlList,sizeof(NOOFBROADCASTSCOMLLIST_t));
	}

	/* 失败列表 */
	if (CBCBSC_Unpack.p_FailureReportList.bFlag==EXIST)
	{
		memcpy(&s_StatusMessageResp.p_FailureList,&CBCBSC_Unpack.p_FailureReportList,sizeof(FAILURELIST_t));


	}

	/* 信道指示 */
	if (CBCBSC_Unpack.p_ChannelIndicator.bF

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -