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

📄 cbse_writereplace.c

📁 CBS(小区广播)程序实现手稿
💻 C
📖 第 1 页 / 共 4 页
字号:

		}
		//NewTime不存在
		else{
			if(LPm_WriteReplace_Request->p_OldTime.bFlag==EXIST)
			{//OldTime存在
				return UPDATA_PENDING_SEND_MESSAGE;
			}
			else
			{//OldTime不存在
				return UPDATE_ALREADY_SEND_MESSAGE;
			}
		}
	}
	//老序列号不存在
	else{
		if(LPm_WriteReplace_Request->p_NewTime.bFlag==EXIST)
		{
			//Newtime存在
			if(LPm_WriteReplace_Request->p_OldTime.bFlag==EXIST)
			{//OldTime存在
				return INCOMPATIBLE_PARAMETER;
			}
			else
			{//OldTime不存在
				return  NEW_SCHEDUAL_MESSAGE;				
			}

		}
		//NewTime不存在
		else{
			if(LPm_WriteReplace_Request->p_OldTime.bFlag==EXIST)
			{//OldTime存在
				return INCOMPATIBLE_PARAMETER;
			}
			else
			{//OldTime不存在
				return NEW_WRITE_MESSAGE;
			}
		}
	}

}

/* 发送消息给BSC */
int Process_Send_Write_Replace_To_BSC(PID_t s_Pid, DIVIDE_CELLLIST_BUF_t  *s_DivideCellListBuf)
{
    int                     len;
	char                    *BSCID;
	WRITEREPLACE_REQUEST_t  m_WriteReplace_Request;
	BSCMESSAGE_t            s_BSCMessage;
	int                     i,j;
	int                     Tid;


	memcpy(&m_WriteReplace_Request,&ProcessData[s_Pid.iProcessId][(sizeof(short)+sizeof(MESSAGE_HEAD_t))],sizeof(WRITEREPLACE_REQUEST_t));
	
	for(i=0;i<s_DivideCellListBuf->cNumberOfCellList;i++) 
	{
		memset(&s_BSCMessage,0,sizeof(BSCMESSAGE_t));

		memcpy(&m_WriteReplace_Request.p_CellList,&s_DivideCellListBuf->s_CellListOfBSC[i].s_CellList,sizeof(CELLLIST_t));
		len=Pack_WRITEREPLACE_REQUEST(&m_WriteReplace_Request,&s_BSCMessage.cMessage[0]);
		
		if (len>0)
		{
			s_BSCMessage.iLen=len;
			/* 填写PID */
			memcpy(&s_BSCMessage.s_Pid,&s_Pid,sizeof(PID_t));

		    BSCID=&s_DivideCellListBuf->s_CellListOfBSC[i].BSCIdentifier[0];
            Tid=GetTid(BSCID);
			if (Tid!=FAILURE)
			{
#ifdef  OPEN_STATISTIC			
				if (m_WriteReplace_Request.p_OldSerialnumber.bFlag==EXIST)
				{
					/* 小区REPLACE操作次数加 1 */
					for(j=0;j<m_WriteReplace_Request.p_CellList.iLength;j++)
					{
						Update_Cell_Statistic_Count(&m_WriteReplace_Request.p_CellList.s_CellList[j].cCellId[0],Tid,REPLACE_STATISTIC,0,0);
					}

           			s_CBSECount.s_ReqBSCCnt[Tid].iCBCProxyReplaceReqCnt++;
				}
				else
				{
					/* 小区WRITE操作次数加 1 */
					for(j=0;j<m_WriteReplace_Request.p_CellList.iLength;j++)
					{
						Update_Cell_Statistic_Count(&m_WriteReplace_Request.p_CellList.s_CellList[j].cCellId[0],Tid,WRITE_STATISTIC,0,0);
					}
           			s_CBSECount.s_ReqBSCCnt[Tid].iCBCProxyWriteReqCnt++;
				}
#endif
				memcpy(&s_BSCMessage.s_Pid,&s_Pid,sizeof(PID_t));
				/* 发送给BSC */
				X25AppendCBESendMessage(&s_BSCMessage, Tid);
				
			}
		}

	}
	return SUCCESS;
}


/* 发送Write消息给BSC前发Kill消息,保证序列号可用 */
int Process_Send_Kill_To_BSC_Before_Write(PID_t s_Pid, DIVIDE_CELLLIST_BUF_t  *s_DivideCellListBuf)
{
    int                     len;
	char                    *BSCID;
	WRITEREPLACE_REQUEST_t  m_WriteReplace_Request;
	BSCMESSAGE_t            s_BSCMessage;
	KILLMESSAGE_t           m_KillMessage; 

	int                     i;
	int                     Tid;


	memcpy(&m_WriteReplace_Request,&ProcessData[s_Pid.iProcessId][(sizeof(short)+sizeof(MESSAGE_HEAD_t))],sizeof(WRITEREPLACE_REQUEST_t));

	/* 未分配完,不用删除返回 */
	if(s_RuntimeInfo.ifChannelSerialNumberLoop[m_WriteReplace_Request.p_MessageIdentifier.iMessageIdentifier]==0)
	{
		return SUCCESS;		
	}

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

		/* MessageIdentifier */
		memcpy(&m_KillMessage.p_MessageIdentifier,&m_WriteReplace_Request.p_MessageIdentifier,sizeof(MESSAGEIDENTIFIER_t));
		/* SerialNumber */
		memcpy(&m_KillMessage.p_OldSerialnumber,&m_WriteReplace_Request.p_NewSerialnumber,sizeof(SERIALNUMBER_t));
        /* CellList */
		memcpy(&m_KillMessage.p_CellList,&s_DivideCellListBuf->s_CellListOfBSC->s_CellList,sizeof(CELLLIST_t));

		len=Pack_KILL_MESSAGE(&m_KillMessage,&s_BSCMessage.cMessage[0]);

		if (len>0)
		{
			s_BSCMessage.iLen=len;
			/* 填写PID */
//			memcpy(&s_BSCMessage.s_Pid,&s_Pid,sizeof(PID_t));
			memset(&s_BSCMessage.s_Pid,0,sizeof(PID_t));

		    BSCID=&s_DivideCellListBuf->s_CellListOfBSC->BSCIdentifier[0];
            Tid=GetTid(BSCID);
			if (Tid!=FAILURE)
			{
#ifdef  OPEN_STATISTIC			
#endif
				memcpy(&s_BSCMessage.s_Pid,&s_Pid,sizeof(PID_t));
				/* 发送给BSC */
				X25AppendCBESendMessage(&s_BSCMessage, Tid);
				
			}
		}

	}
	return SUCCESS;
}

/*
	if (s_DivideCellListBuf->s_FailureList.bFlag==EXIST)
	{
		//报告失败列表给Cbc_proxy
		memset(&s_Report,0,sizeof(REPORTSUCCESS_t));
		memset(&s_CBEMessage,0,sizeof(CBEMESSAGE_t));
	
		memcpy(&s_Report.p_MessageIdentifier,&LPm_WriteReplace_Request.p_MessageIdentifier,sizeof(MESSAGEIDENTIFIER_t));
		memcpy(&s_Report.p_Serialnumber,&LPm_WriteReplace_Request.p_NewSerialnumber,sizeof(SERIALNUMBER_t));
		memcpy(&s_Report.p_FailureReportList,&s_DivideCellListBuf->s_FailureList,sizeof(FAILURELIST_t));

		if (LPm_WriteReplace_Request.p_ChannelIndicator.bFlag==EXIST)
		{
			memcpy(&s_Report.p_ChannelIndicator,&LPm_WriteReplace_Request.p_ChannelIndicator,sizeof(CHANNELINDICATOR_t));
		}

		s_CBEMessage.s_MessageHead.iMessageAreaId=A;
		//CBSE_REPORT_SUCCESS
		s_CBEMessage.s_MessageHead.iMessageType=3;

		s_CBEMessage.s_MessageHead.s_SenderPid.iProcessId=s_Pid.iProcessId;
		s_CBEMessage.s_MessageHead.s_SenderPid.cFunctionId=FUNCTIONID;
		s_CBEMessage.s_MessageHead.s_SenderPid.cModuleId=MODULEID;
		s_CBEMessage.s_MessageHead.iMessageLength=sizeof(REPORTSUCCESS_t);
		s_CBEMessage.iLen=sizeof(MESSAGE_HEAD_t)+s_CBEMessage.s_MessageHead.iMessageLength;
		memcpy(&s_CBEMessage.cMessage[0],(char *)&s_Report,s_CBEMessage.s_MessageHead.iMessageLength);
		s_CBEMessage.SocketHandle=LPCBEMessage->SocketHandle;

		memset(&s_CBCProxyMessage,0,sizeof(CBEMESSAGE_t));
		Convert_Response(&s_CBEMessage,&s_CBCProxyMessage);
		AppendCBESendMessage(&s_CBCProxyMessage);
	}
*/



/*/将列表转为标准格式,用于Write_Replace
//in:   s_CBEMessage Cbcproxy发送来的原始信息
//out:  s_ProxyMessage
//返回:
//  1: 成功,
//  -1:失败
*/
int Convert_Write_Replace_Request(CBEMESSAGE_t *s_CBEMessage,CBEMESSAGE_t *s_ProxyMessage)
{
	int                    posi;
	unsigned short         iListLen;
	WRITEREPLACE_REQUEST_t *LPWriterReplaceRequest;
	
	LPWriterReplaceRequest=(WRITEREPLACE_REQUEST_t *)&s_ProxyMessage->cMessage[0];

	memcpy(&s_ProxyMessage->s_MessageHead,&s_CBEMessage->s_MessageHead,sizeof(MESSAGE_HEAD_t));
    
	memcpy(&s_ProxyMessage->cMessage[0],&s_CBEMessage->cMessage[0],
		(sizeof(WRITE_REPLACE_i)-sizeof(MESSAGE_HEAD_t)));

//	s_ProxyMessage->SocketHandle=s_CBEMessage->SocketHandle;	

	posi=sizeof(WRITE_REPLACE_i)-sizeof(MESSAGE_HEAD_t);

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

	iListLen=iListLen*sizeof(CELLID_t)+4; //4=sizeof(bFlag)+sizeof(CellIddisc)+sizeof(iLength)
	

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


	/* 复制小区列表 */
    memcpy(&LPWriterReplaceRequest->p_CellList, &s_CBEMessage->cMessage[posi],iListLen);

	posi=posi+iListLen;

	/* 得到页信息的长度 */
	memcpy(&iListLen,&s_CBEMessage->cMessage[posi+1],sizeof(unsigned char));
	iListLen=iListLen*sizeof(PAGEINF_t)+3;//3=sizeof(bFlag)+sizeof(iLength) 


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

//	posi=posi+sizeof(unsigned char);

	/* 复制页信息 */
    memcpy(&LPWriterReplaceRequest->p_CbsPageInf, &s_CBEMessage->cMessage[posi],iListLen);

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

	return  SUCCESS;

}


/* 内部定时重发 */
void Process_Scheduled_Resend(PID_t s_Pid,char *Lp_BSCID)
{
	int                               len;
	int                               Tid;
	BSCMESSAGE_t                      s_BSCMessage;
	WRITEREPLACE_PROCESS_DATA_STRUCT  *LPs_WriteReplaceProcessDataStruct;
	WRITEREPLACE_REQUEST_t            m_WriteReplaceRequest;
	CELLLIST_t                        s_CellList;
	int                               iBscPosi;
	int                               i,j; 

	
	memset(&s_BSCMessage,0,sizeof(BSCMESSAGE_t));
	memset(&m_WriteReplaceRequest,0,sizeof(WRITEREPLACE_REQUEST_t));
	memset(&s_CellList,0,sizeof(CELLLIST_t));

    LPs_WriteReplaceProcessDataStruct=(WRITEREPLACE_PROCESS_DATA_STRUCT  *)&ProcessData[s_Pid.iProcessId][0];

	memcpy(&m_WriteReplaceRequest,&LPs_WriteReplaceProcessDataStruct->s_CBCMessage.cMessage[0],sizeof(WRITEREPLACE_REQUEST_t));

	for(i=0;i<LPs_WriteReplaceProcessDataStruct->s_ResponseCellList.cNumberOfBSC;i++)
	{
		if(memcmp(&LPs_WriteReplaceProcessDataStruct->s_ResponseCellList.s_BSCCellList[i].BSCIdentifier[0],Lp_BSCID,BSC_INDENTIFIER_LEN)==0)
		{
			iBscPosi=i;
			break;
		}
		
	}

	for(i=0;i<MAX_BSC_CONNECT;i++)
	{
		if(memcmp(&s_BscConnectInfo[i].BscIdentifier[0],Lp_BSCID,BSC_INDENTIFIER_LEN)==0)
		{
			Tid=i;
			break;
		}
		
	}

	/* 得到重发列表 */
	//
	s_CellList.bFlag=1;
	s_CellList.cCellIdDisc=LAC_AND_CI;
	for(i=0;i<LPs_WriteReplaceProcessDataStruct->s_ResponseCellList.s_BSCCellList[iBscPosi].ilength;i++)
	{
		if(LPs_WriteReplaceProcessDataStruct->s_ResponseCellList.s_BSCCellList[iBscPosi].s_CellReport[i].cCellStatus==TEMP_FAILURE)
		{
			memcpy(&s_CellList.s_CellList[s_CellList.iLength].cCellId[0],
				&LPs_WriteReplaceProcessDataStruct->s_ResponseCellList.s_BSCCellList[iBscPosi].s_CellReport[i].s_CellId.cCellId[0],
				sizeof(CELLID_t));
			s_CellList.iLength++;
		}
	}

	memcpy(&m_WriteReplaceRequest.p_CellList,&s_CellList,sizeof(CELLLIST_t));
	
	len=Pack_WRITEREPLACE_REQUEST(&m_WriteReplaceRequest,&s_BSCMessage.cMessage[0]);

	memcpy(&s_BSCMessage.s_Pid,&s_Pid,sizeof(PID_t));
		
	if (len>0)
	{
		s_BSCMessage.iLen=len;

#ifdef  OPEN_STATISTIC			
		if (m_WriteReplaceRequest.p_OldSerialnumber.bFlag==EXIST)
		{
			/* 小区REPLACE操作次数加 1 */
			for(j=0;j<m_WriteReplaceRequest.p_CellList.iLength;j++)
			{
				Update_Cell_Statistic_Count(&m_WriteReplaceRequest.p_CellList.s_CellList[j].cCellId[0],Tid,REPLACE_STATISTIC,0,0);
			}
   			s_CBSECount.s_ReqBSCCnt[Tid].iCBCProxyReplaceReqCnt++;
		}
		else
		{
			/* 小区WRITE操作次数加 1 */
			for(j=0;j<m_WriteReplaceRequest.p_CellList.iLength;j++)
			{
				Update_Cell_Statistic_Count(&m_WriteReplaceRequest.p_CellList.s_CellList[j].cCellId[0],Tid,WRITE_STATISTIC,0,0);
			}

   			s_CBSECount.s_ReqBSCCnt[Tid].iCBCProxyWriteReqCnt++;

		}
#endif

		X25AppendCBESendMessage(&s_BSCMessage, Tid);
		LPs_WriteReplaceProcessDataStruct->s_ResponseCellList.s_BSCCellList[iBscPosi].cResendTimes++;
	}

}

/* 
  返回响应给CBCProxy 
  只报告响应
*/
void Process_WriteReplace_Return_To_CBCProxy(PID_t s_Pid)
{
	int                                iPosi; 
	char                               ResponseBuf[3096];
	WRITEREPLACE_REQUEST_t             *LPm_WriteReplace_Request;
	WRITEREPLACE_PROCESS_DATA_STRUCT   *LPs_WriteReplaceProcessDataStruct;
	REPORT_MESSAGE_i                   *LPs_Report;  
	int                                i,j;
	unsigned short                     iLen;

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

	LPs_WriteReplaceProcessDataStruct=(WRITEREPLACE_PROCESS_DATA_STRUCT *)&ProcessData[s_Pid.iProcessId][0];
	
	LPm_WriteReplace_Request=(WRITEREPLACE_REQUEST_t *)&LPs_WriteReplaceProcessDataStruct->s_CBCMessage.cMessage[0];

	LPs_Report=(REPORT_MESSAGE_i *)&ResponseBuf[sizeof(short)];

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

	LPs_Report->s_MessageHead.iMessageAreaId=A;

	memcpy(&LPs_Report->p_MessageIdentifier,&LPm_WriteReplace_Request->p_MessageIdentifier,sizeof(MESSAGEIDENTIFIER_t));
	memcpy(&LPs_Report->p_Serialnumber,&LPm_WriteReplace_Request->p_NewSerialnumber,sizeof(SERIALNUMBER_t));
	memcpy(&LPs_Report->p_ChannelIndicator,&LPm_WriteReplace_Request->p_ChannelIndicator,sizeof(CHANNELINDICATOR_t));

	for(i=0;i<LPs_WriteReplaceProcessDataStruct->s_ResponseCellList.cNumberOfBSC;i++) 
	{
		if(LPs_WriteReplaceProcessDataStruct->s_ResponseCellList.s_BSCCellList[i].bReceiveRespons==1)
		{
			/* 如果有响应,未知状态改为成功 */
			for(j=0;j<LPs_WriteReplaceProcessDataStruct->s_ResponseCellList.s_BSCCellList[i].ilength;j++)
			{
				if(LPs_WriteReplaceProcessDataStruct->s_ResponseCellList.s_BSCCellList[i].s_CellReport[j].cCellStatus==UNKNOW_STATUS)
				{
					LPs_WriteReplaceProcessDataStruct->s_ResponseCellList.s_BSCCellList[i].s_CellReport[j].cCellStatus=CELL_SUCCESS;
				}
			}
		}

	}


/*    
	/* 初始为收全 
	bIfAllResponse=1;
	for(i=0;i<LPs_WriteReplaceProcessDataStruct->s_ResponseCellList.cNumberOfBSC;i++)
	{ 
		if(LPs_WriteReplaceProcessDataStruct->s_ResponseCellList.s_BSCCellList[i].bReceiveRespons==0)
		{
			/* 未收全 
			bIfAllResponse=0;
			break;
		}
	}

	/* 初始为不存在重发 
	bResendExist=0;

⌨️ 快捷键说明

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