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

📄 cbse_reset.c

📁 CBS(小区广播)程序实现手稿
💻 C
字号:
#include "..\sys\Include.h"

/* 返回确认给CBC_Proxy */
int Process_Reset_Return(PID_t s_Pid,unsigned char cNumberOfReturnMessage);

/* 检查参数 */
int Process_RESET_init(RESET_t *s_Reset);

/* 发送消息给BSC */
int Process_Send_Reset_To_BSC(PID_t s_Pid,DIVIDE_CELLLIST_BUF_t *s_DivideCellListBuf);

/* 处理重置请求 */
int Process_RESET(unsigned char *MessageBuf,PID_t s_Pid)
{
	int                        iReturnValue;
	RESET_t                    *LPm_Reset;
	RESET_PROCESS_DATA_STRUCT  *LPs_ResetProcessDataStruct;
	/* 拆分小区缓冲区 */
	DIVIDE_CELLLIST_BUF_t      s_DivideCellListBuf;
	CELLID_t                   s_CellId;
	int                        i,j;
	
	memset(&s_DivideCellListBuf,0,sizeof(DIVIDE_CELLLIST_BUF_t));
	memset(&ProcessData[s_Pid.iProcessId][0],0,LPCB_DATA_SIZE);

	LPs_ResetProcessDataStruct=(RESET_PROCESS_DATA_STRUCT  *)&ProcessData[s_Pid.iProcessId][0];
	
	/* 数据拷贝到进程数据区 */
	memcpy(LPs_ResetProcessDataStruct,MessageBuf,sizeof(CBEMESSAGE_t));

	LPm_Reset=(RESET_t *)&LPs_ResetProcessDataStruct->s_CBCMessage.cMessage[0];

#ifdef DEBUG_PRINT
	Print_RESET(s_Pid,LPm_Reset);
#endif

	/* 检查参数 */
	iReturnValue=Process_RESET_init(LPm_Reset);
	if(iReturnValue<0)
	{
		return iReturnValue;
	}
	

	/* 构造响应结果 */
    iReturnValue=Process_Divide_CellList_AccordingToResetResponse(&LPm_Reset->p_CellList,
		0,&LPs_ResetProcessDataStruct->s_ResponseCellList,&s_CellId);
	if (iReturnValue<0)
	{
		return iReturnValue;
	}

	/* 从响应列表得到拆分列表 */
	for(i=0;i<LPs_ResetProcessDataStruct->s_ResponseCellList.cNumberOfBSC;i++)
	{
		for(j=0;j<LPs_ResetProcessDataStruct->s_ResponseCellList.s_BSCCellList[i].ilength;j++)
		{
				Process_Add_CellId_To_DivideCellListBuf(
					&LPs_ResetProcessDataStruct->s_ResponseCellList.s_BSCCellList[i].s_CellReport[j].s_CellId.cCellId[0],
					&LPs_ResetProcessDataStruct->s_ResponseCellList.s_BSCCellList[i].BSCIdentifier[0],
					&s_DivideCellListBuf);
		}
	}

    /* 返回确认给CBC_Proxy */
//	Process_Reset_Return(s_Pid,s_DivideCellListBuf.cNumberOfCellList);

    /* 发送消息给BSC */
    Process_Send_Reset_To_BSC(s_Pid, &s_DivideCellListBuf);    
	/* 创建回复定时器 */
	iReturnValue=create_timer(RESET_RETURN_DELAY_TIME,
	RESET_RETURN,(char *)&s_Pid,NULL);

	/* 创建定时器失败 */
	//sys
	if (iReturnValue<0)
	{
		printf("Create timer Error!\n");
		return iReturnValue;
	}
	else
	{
		LPs_ResetProcessDataStruct->iTimerId=iReturnValue;
		return CONTINUANCE;
	}

}

int Process_RESET_init(RESET_t *s_Reset)
{
	if (s_Reset->p_CellList.bFlag!=EXIST)
	{
		return NO_CELLLIST;
	}

	//检查小区数目
	if ((s_Reset->p_CellList.iLength<=0)||(s_Reset->p_CellList.iLength>MAXCELLCOUNT))
	{
		return NUMBEROFCELL_ERROR;
	}

	return SUCCESS;
}

//返回确认给CBC_Proxy
int Process_Reset_Return(PID_t s_Pid,unsigned char cNumberOfReturnMessage)
{
    CBEMESSAGE_t       s_CBEMessage;
	CBEMESSAGE_t       *LPCBEMessage;
	MESSAGE_CONFIRM_i  s_MessageConfirm;
	MESSAGE_HEAD_t     *LPMessageHead;

	memset(&s_MessageConfirm,0,sizeof(MESSAGE_CONFIRM_i));
	memset(&s_CBEMessage,0,sizeof(CBEMESSAGE_t));

	LPMessageHead=(MESSAGE_HEAD_t *)&ProcessData[s_Pid.iProcessId][sizeof(short)];
	LPCBEMessage=(CBEMESSAGE_t *)&ProcessData[s_Pid.iProcessId][0];

	s_MessageConfirm.s_MessageHead.iMessageAreaId=A;
	s_MessageConfirm.s_MessageHead.iMessageType=LPMessageHead->iMessageType;
	memcpy(&s_MessageConfirm.s_MessageHead.s_ReceiverPid,&LPMessageHead->s_SenderPid,sizeof(PID_t));
    memcpy(&s_MessageConfirm.s_MessageHead.s_SenderPid,&s_Pid,sizeof(PID_t));
	s_MessageConfirm.s_MessageHead.iMessageLength=sizeof(int);
    s_MessageConfirm.NumberOfReturnMessage=cNumberOfReturnMessage;

	s_CBEMessage.iLen=s_MessageConfirm.s_MessageHead.iMessageLength+sizeof(MESSAGE_HEAD_t);

	memcpy(&s_CBEMessage.s_MessageHead,&s_MessageConfirm.s_MessageHead,sizeof(MESSAGE_HEAD_t));

	memcpy(&s_CBEMessage.cMessage[0],&s_MessageConfirm.s_MessageHead,s_MessageConfirm.s_MessageHead.iMessageLength);
	
	AppendCBESendMessage(&s_CBEMessage);

	return SUCCESS;

}

/*
 * 发送消息给BSC
 */
int Process_Send_Reset_To_BSC(PID_t s_Pid,DIVIDE_CELLLIST_BUF_t *s_DivideCellListBuf)
{
    int          len;
	char         *BSCID;
	BSCMESSAGE_t s_BSCMessage;
	RESET_t      s_Reset; 
	int          i;
	int          Tid;

	memset(&s_Reset,0,sizeof(RESET_t));

	for(i=0;i<s_DivideCellListBuf->cNumberOfCellList;i++) 
	{
		memset(&s_BSCMessage,0,sizeof(BSCMESSAGE_t));

		memcpy(&s_Reset.p_CellList,&s_DivideCellListBuf->s_CellListOfBSC[i].s_CellList,sizeof(CELLLIST_t));
		len= Pack_RESET(&s_Reset,&s_BSCMessage.cMessage[0]);
		if (len>0)
		{
			s_BSCMessage.iLen=len;

			BSCID=&s_DivideCellListBuf->s_CellListOfBSC[i].BSCIdentifier[0];
            Tid=GetTid(BSCID);
				if (Tid!=FAILURE)
				{
					memcpy(&s_BSCMessage.s_Pid,&s_Pid,sizeof(PID_t));

#ifdef  OPEN_STATISTIC			
        			s_CBSECount.s_ReqBSCCnt[Tid].iCBCProxyResetCnt++;
#endif
					/* 发送给BSC */
					X25AppendCBESendMessage(&s_BSCMessage, Tid);
				}
		}

	}
	return SUCCESS;

}

/* 将列表转为标准格式,用于Reset
// in:   s_CBEMessage Cbcproxy发送来的原始信息
// out:  s_ProxyMessage
// 返回:
//   1: 成功,
//   -1:失败
*/
int Convert_Reset(CBEMESSAGE_t *s_CBEMessage,CBEMESSAGE_t *s_ProxyMessage)
{
	int             posi;
	unsigned short  iListLen;
	RESET_t         *LPm_Reset;

	LPm_Reset=(RESET_t *)&s_ProxyMessage->cMessage[0];

	memcpy(&s_ProxyMessage->s_MessageHead,&s_CBEMessage->s_MessageHead,sizeof(MESSAGE_HEAD_t));

	posi=0;

	/* 得到CELLLIST的长度 */
	memcpy(&iListLen,&s_CBEMessage->cMessage[posi],sizeof(unsigned short));

	/* 长度溢出,返回错误 */
//	if (iListLen>sizeof(CELLLIST_t))	
    if (iListLen>256)	
	{
		return FAILURE;
	}
	
	/* 没有该参数,返回成功 */
	if (iListLen==0)
	{
		return SUCCESS;
	}

	posi=posi+sizeof(unsigned short);

	LPm_Reset->p_CellList.bFlag=1;
	LPm_Reset->p_CellList.cCellIdDisc=1;
	LPm_Reset->p_CellList.iLength=iListLen;

	/* 复制小区列表 */
    memcpy(&LPm_Reset->p_CellList.s_CellList, &s_CBEMessage->cMessage[posi],iListLen*sizeof(CELLID_t));

	s_ProxyMessage->iLen=sizeof(RESET_t)+sizeof(MESSAGE_HEAD_t);

	return SUCCESS;
}


/* 处理SET_DRX_REPORT回复定时器到时 */
void Process_RESET_timer_Expired(PID_t s_Pid)
{

	int                                iPosi; 
	char                               ResponseBuf[3096];
	RESET_PROCESS_DATA_STRUCT          *LPs_ResetProcessDataStruct; 
	BSC_RESTART_i                      *LPs_Restart; 
	int                                i,j;
	unsigned short                     iLen;
	unsigned short                     iNumberofFailCell;


	memset(&ResponseBuf[0],0,3096);

	LPs_ResetProcessDataStruct=(RESET_PROCESS_DATA_STRUCT *)&ProcessData[s_Pid.iProcessId][0];
	
	LPs_Restart=(BSC_RESTART_i *)&ResponseBuf[sizeof(short)];

	/*   */
	memcpy(&LPs_Restart->s_MessageHead.s_ReceiverPid,
		&LPs_ResetProcessDataStruct->s_CBCMessage.s_MessageHead.s_SenderPid,sizeof(PID_t));
    /*  */
	memcpy(&LPs_Restart->s_MessageHead.s_SenderPid,&s_Pid,sizeof(PID_t));

	LPs_Restart->s_MessageHead.iMessageAreaId=A;

	LPs_Restart->s_MessageHead.iMessageType=CBCPROXY_RESET;

	iPosi=sizeof(BSC_RESTART_i)+sizeof(short);

//	LPs_Restart->bReportListFlag=EXIST;
	LPs_Restart->cReportListNumberOfBSC=LPs_ResetProcessDataStruct->s_ResponseCellList.cNumberOfBSC;
	LPs_Restart->iReturnValue=SUCCESS;

	/* 没响应置为全失败 */
	for(i=0;i<LPs_ResetProcessDataStruct->s_ResponseCellList.cNumberOfBSC;i++)
	{
		/* 如果没响应置为全失败 */
		if(LPs_ResetProcessDataStruct->s_ResponseCellList.s_BSCCellList[i].bReceiveRespons==0)
		{
			for(j=0;j<LPs_ResetProcessDataStruct->s_ResponseCellList.s_BSCCellList[i].ilength;j++)
			{
				LPs_ResetProcessDataStruct->s_ResponseCellList.s_BSCCellList[i].s_CellReport[j].cCellStatus=PERMANENT_FAILURE;
			}
		}
	}

	/* 压缩ReportList参数 */
/*	for(i=0;i<LPs_ResetProcessDataStruct->s_ResponseCellList.cNumberOfBSC;i++)
	{
		memcpy(&ResponseBuf[iPosi],&LPs_ResetProcessDataStruct->s_ResponseCellList.s_BSCCellList[i],
			LPs_ResetProcessDataStruct->s_ResponseCellList.s_BSCCellList[i].ilength*sizeof(CELLREPORT_i )+sizeof(short)+BSC_INDENTIFIER_LEN);

		iPosi=iPosi+LPs_ResetProcessDataStruct->s_ResponseCellList.s_BSCCellList[i].ilength*sizeof(CELLREPORT_i )+sizeof(short)+BSC_INDENTIFIER_LEN;

	}
*/

	/* 留出小区个数空间 */
	iPosi=iPosi+sizeof(short);
	iNumberofFailCell=0;

	/* 抽出失败小区序列返回 */
	for(i=0;i<LPs_ResetProcessDataStruct->s_ResponseCellList.cNumberOfBSC;i++)
	{
		for(j=0;j<LPs_ResetProcessDataStruct->s_ResponseCellList.s_BSCCellList[i].ilength;j++)
		{
		
			if(LPs_ResetProcessDataStruct->s_ResponseCellList.s_BSCCellList[i].s_CellReport[j].cCellStatus==PERMANENT_FAILURE)
			{
	 			memcpy(&ResponseBuf[iPosi],
					&LPs_ResetProcessDataStruct->s_ResponseCellList.s_BSCCellList[i].s_CellReport[j].s_CellId.cCellId[0],
					sizeof(CELLID_t));
				iPosi=iPosi+sizeof(CELLID_t);
				iNumberofFailCell++;
			}
		}
	}

    memcpy(&ResponseBuf[sizeof(BSC_RESTART_i)+sizeof(short)],&iNumberofFailCell,sizeof(short));

	iLen=iPosi-sizeof(short);

	LPs_Restart->s_MessageHead.iMessageLength=iLen-sizeof(MESSAGE_HEAD_t);

	memcpy(&ResponseBuf[0],&iLen,sizeof(short));

#ifdef DEBUG_PRINT
    printf("Reset Return To CBCProxy. Pid=%d\n",s_Pid.iProcessId); 
#endif

	AppendCBESendMessage((CBEMESSAGE_t *)&ResponseBuf[0]);
	

}

/* 当X25链路建立时重启小区 */
void Reset_When_Connect(int Tid)
{
    int          len;
	BSCMESSAGE_t s_BSCMessage;
	RESET_t      s_Reset; 
	int          i,j;

	memset(&s_Reset,0,sizeof(RESET_t));

	memset(&s_BSCMessage,0,sizeof(BSCMESSAGE_t));

	for(i=0;i<s_BSCCellInfo[Tid].cNumberOfBTS;i++)
	{
		for(j=0;j<s_BSCCellInfo[Tid].s_BTSCellInfo[i].cNumberOfCell;j++)
		{
			memcpy(&s_Reset.p_CellList.s_CellList[s_Reset.p_CellList.iLength].cCellId[0],
				&s_BSCCellInfo[Tid].s_BTSCellInfo[i].s_CellId[j].cCellId[0],
				sizeof(CELLID_t));
			s_Reset.p_CellList.iLength++;
		}
	}
	if (s_Reset.p_CellList.iLength>0)
	{
		s_Reset.p_CellList.bFlag=EXIST;
		s_Reset.p_CellList.cCellIdDisc=LAC_AND_CI;
	}
	
	len= Pack_RESET(&s_Reset,&s_BSCMessage.cMessage[0]);
	if (len>0)
	{
		s_BSCMessage.iLen=len;

		memset(&s_BSCMessage.s_Pid,0,sizeof(PID_t));

#ifdef  OPEN_STATISTIC			
       	s_CBSECount.s_ReqBSCCnt[Tid].iCBCProxyResetCnt++;
#endif
		/* 发送给BSC */
		X25AppendCBESendMessage(&s_BSCMessage, Tid);

	}

}

⌨️ 快捷键说明

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