?? cbse_killmessage.c
字號:
#include "..\sys\Include.h"
/* 返回確認消息給CBC_proxy */
int Process_Kill_Message_Return(PID_t s_Pid,unsigned char cNumberOfReturnMessage);
/* KillMessage 初始化 */
int Process_Kill_Message_init(KILLMESSAGE_t *s_KillMessage);
/* 發(fā)送消息給BSC
發(fā)送失敗小區(qū)列表給CBC_Proxy */
int Process_Send_KillMessage_To_BSC(PID_t s_Pid, DIVIDE_CELLLIST_BUF_t *s_DivideCellListBuf);
//刪除預約消息
int process_Delete_Schedual_Message(PID_t s_OriginalPid,PID_t s_NewPid);
int Process_CBSE_KILL_MESSAGE(unsigned char *MessageBuf,PID_t s_Pid)
{
int iReturnValue;
KILLMESSAGE_t *LPm_KillMessage;
PID_t s_OriginalPid;
int iRelativeTime;
long lCurrentTime;
//拆分小區(qū)緩沖區(qū)
DIVIDE_CELLLIST_BUF_t s_DivideCellListBuf;
CELLID_t s_CellId;
KILL_PROCESS_DATA_STRUCT *LPs_KillProcessDataStruct;
CELLLIST_i s_FailureList;
// WRITEREPLACE_PROCESS_DATA_STRUCT *LPs_WriteReplaceProcessDataStruct;
int i,j;
memset(&s_DivideCellListBuf,0,sizeof(DIVIDE_CELLLIST_BUF_t));
memset(&s_FailureList,0,sizeof(CELLLIST_i));
memset(&ProcessData[s_Pid.iProcessId][0],0,LPCB_DATA_SIZE);
/* 填寫返回類型 */
LPs_KillProcessDataStruct=(KILL_PROCESS_DATA_STRUCT *)&ProcessData[s_Pid.iProcessId][0];
LPs_KillProcessDataStruct->cResponseType=CBCPROXY_REPORT_KILL;
/* 數(shù)據(jù)拷貝到進程數(shù)據(jù)區(qū) */
memcpy(&LPs_KillProcessDataStruct->s_CBCMessage,MessageBuf,sizeof(CBEMESSAGE_t));
/* 去掉MessageHead */
LPm_KillMessage=(KILLMESSAGE_t *)&LPs_KillProcessDataStruct->s_CBCMessage.cMessage[0];
#ifdef DEBUG_PRINT
Print_Kill(s_Pid,LPm_KillMessage,LPs_KillProcessDataStruct->s_CBCMessage.s_MessageHead.s_ReceiverPid);
#endif
/* 判斷參數(shù) */
iReturnValue=Process_Kill_Message_init(LPm_KillMessage);
if (iReturnValue<0)
{
return iReturnValue;
}
/* 構造響應結果 */
iReturnValue=Process_Divide_CellList_AccordingToResponse(&LPm_KillMessage->p_CellList,
0,&s_FailureList,&s_CellId);
if (iReturnValue<0)
{
return iReturnValue;
}
memcpy(&LPs_KillProcessDataStruct->s_FailureList ,
&s_FailureList,sizeof(CELLLIST_i));
/* 從響應列表得到拆分列表 */
Process_Get_DividedCellList_from_ResponseCellList(&s_FailureList,&s_DivideCellListBuf);
/* 標志是否等待響應 */
IfNeedResponse(&LPs_KillProcessDataStruct->s_FailureList,&s_DivideCellListBuf);
/* 此時用s_DivideCellListBuf.s_CellListOfBSC,
不用s_ResponseCellList.cNumberOfBSC
前者可能小于后者 */
LPs_KillProcessDataStruct->cNoOfResponseReq=s_DivideCellListBuf.cNumberOfCellList;
/* 小區(qū)全失敗 */
if (LPs_KillProcessDataStruct->cNoOfResponseReq==0)
{
return ALL_CELLS_NOT_AVAILABLE;
}
/* 兩個記錄定時器的ID都置為-1 */
LPs_KillProcessDataStruct->iTimerId=-1;
LPs_KillProcessDataStruct->iLifeTimerId=-1;
//是否刪除預約發(fā)送
if (LPm_KillMessage->p_BeginTime.bFlag==EXIST)
{
time(&lCurrentTime);
lCurrentTime=lCurrentTime-TimeZone;
iRelativeTime=LPm_KillMessage->p_BeginTime.lTime-lCurrentTime;
if (iRelativeTime<0)
{
/* 已發(fā)送,直接發(fā)消息到BSC */
/* 返回確認給CBC_Proxy */
Process_Kill_Message_Return(s_Pid,s_DivideCellListBuf.cNumberOfCellList);
/* 發(fā)送消息給BSC */
Process_Send_KillMessage_To_BSC(s_Pid, &s_DivideCellListBuf);
/* 創(chuàng)建回復定時器 */
iReturnValue=create_timer(KILL_RETURN_DELAY_TIME,
KILL_RETURN_TO_CBC_PROXY,(char *)&s_Pid,NULL);
/* 創(chuàng)建定時器失敗 */
//sys
if (iReturnValue<0)
{
printf("Create timer Error!\n");
return iReturnValue;
}
else
{
LPs_KillProcessDataStruct->iTimerId=iReturnValue;
return CONTINUANCE;
}
}
else
{
/* 未發(fā)送,在進程區(qū) */
memcpy(&s_OriginalPid,&LPs_KillProcessDataStruct->s_CBCMessage.s_MessageHead.s_ReceiverPid,sizeof(PID_t));
iReturnValue=process_Delete_Schedual_Message(s_OriginalPid,s_Pid);
if (iReturnValue<0)
return iReturnValue;
/* 完成列表全置0 */
/*
LPs_WriteReplaceProcessDataStruct=(WRITEREPLACE_PROCESS_DATA_STRUCT *)&ProcessData[s_OriginalPid.iProcessId][0];
LPs_KillProcessDataStruct->s_NoofBroadcastComlList.bFlag=1;
for (i=0;i<LPs_WriteReplaceProcessDataStruct->s_ResponseCellList.cNumberOfBSC;i++)
{
LPs_KillProcessDataStruct->s_NoofBroadcastComlList.s_BSC_NoOfBroadCastcoml[LPs_KillProcessDataStruct->s_NoofBroadcastComlList.cNumberOfBSC].ilength=
LPs_WriteReplaceProcessDataStruct->s_ResponseCellList.s_BSCCellList[i].ilength;
memcpy(&LPs_KillProcessDataStruct->s_NoofBroadcastComlList.s_BSC_NoOfBroadCastcoml[LPs_KillProcessDataStruct->s_NoofBroadcastComlList.cNumberOfBSC].BSCIdentifier[0],
&LPs_WriteReplaceProcessDataStruct->s_ResponseCellList.s_BSCCellList[i].BSCIdentifier[0],BSC_INDENTIFIER_LEN);
for(j=0;j<LPs_WriteReplaceProcessDataStruct->s_ResponseCellList.s_BSCCellList[i].ilength;j++)
{
memcpy(&LPs_KillProcessDataStruct->s_NoofBroadcastComlList.s_BSC_NoOfBroadCastcoml[LPs_KillProcessDataStruct->s_NoofBroadcastComlList.cNumberOfBSC].s_NoOfBroadcastComl[j].s_Cellid.cCellId[0],
&LPs_WriteReplaceProcessDataStruct->s_ResponseCellList.s_BSCCellList[i].s_CellReport[j].s_CellId.cCellId[0],4);
}
LPs_KillProcessDataStruct->s_NoofBroadcastComlList.cNumberOfBSC++;
}
*/
/* 完成列表全置0 */
/* 完成列表為該刪除消息的小區(qū) */
LPs_KillProcessDataStruct->s_NoofBroadcastComlList.bFlag=1;
for (i=0;i<LPs_KillProcessDataStruct->s_FailureList.cNumberOfBSC;i++)
{
LPs_KillProcessDataStruct->s_NoofBroadcastComlList.s_BSC_NoOfBroadCastcoml[LPs_KillProcessDataStruct->s_NoofBroadcastComlList.cNumberOfBSC].ilength=
LPs_KillProcessDataStruct->s_FailureList.s_BSCCellList[i].ilength;
memcpy(&LPs_KillProcessDataStruct->s_NoofBroadcastComlList.s_BSC_NoOfBroadCastcoml[LPs_KillProcessDataStruct->s_NoofBroadcastComlList.cNumberOfBSC].BSCIdentifier[0],
&LPs_KillProcessDataStruct->s_FailureList.s_BSCCellList[i].BSCIdentifier[0],BSC_INDENTIFIER_LEN);
for(j=0;j<LPs_KillProcessDataStruct->s_FailureList.s_BSCCellList[i].ilength;j++)
{
memcpy(&LPs_KillProcessDataStruct->s_NoofBroadcastComlList.s_BSC_NoOfBroadCastcoml[LPs_KillProcessDataStruct->s_NoofBroadcastComlList.cNumberOfBSC].s_NoOfBroadcastComl[j].s_Cellid.cCellId[0],
&LPs_KillProcessDataStruct->s_FailureList.s_BSCCellList[i].s_CellReport[j].s_CellId.cCellId[0],4);
}
LPs_KillProcessDataStruct->s_NoofBroadcastComlList.cNumberOfBSC++;
}
/* 進程區(qū)消息無失敗列表 */
memset(&LPs_KillProcessDataStruct->s_FailureList,0,sizeof(CELLLIST_i));
/*
成功后確認0
返回確認給CBC_Proxy
*/
Process_Kill_Message_Return(s_Pid,0);
/* 返回全部響應 */
Process_KillMessage_Return_To_CBCProxy(s_Pid);
return END;
}
}
else
{
//正常刪除消息
//返回確認給CBC_Proxy
Process_Kill_Message_Return(s_Pid,s_DivideCellListBuf.cNumberOfCellList);
/* 發(fā)送消息給BSC */
Process_Send_KillMessage_To_BSC(s_Pid, &s_DivideCellListBuf);
/* 創(chuàng)建回復定時器 */
iReturnValue=create_timer(KILL_RETURN_DELAY_TIME,
KILL_RETURN_TO_CBC_PROXY,(char *)&s_Pid,NULL);
//創(chuàng)建定時器失敗
//sys
if (iReturnValue<0)
{
printf("Create timer Error!\n");
return iReturnValue;
}
else
{
LPs_KillProcessDataStruct->iTimerId=iReturnValue;
return CONTINUANCE;
}
}
}
//KillMessage 初始化
int Process_Kill_Message_init(KILLMESSAGE_t *s_KillMessage)
{
//檢查必備參數(shù)
if (s_KillMessage->p_MessageIdentifier.bFlag!=EXIST)
{
return NO_MESSAGE_IDENTIFIER;
}
if (s_KillMessage->p_OldSerialnumber.bFlag!=EXIST)
{
return NO_OLD_SERIAL_NUMBER;
}
if (s_KillMessage->p_CellList.bFlag!=EXIST)
{
return NO_CELLLIST;
}
//檢查參數(shù)內容
//檢查小區(qū)識別器CellIdDisc
if ((s_KillMessage->p_CellList.cCellIdDisc!=1)&&
(s_KillMessage->p_CellList.cCellIdDisc!=2)&&
(s_KillMessage->p_CellList.cCellIdDisc!=5)&&
(s_KillMessage->p_CellList.cCellIdDisc!=6))
{
return CELLIDDISC_OUTOFRANG;
}
//對于必備參數(shù)不用判斷其存在
//檢查小區(qū)數(shù)目
if ((s_KillMessage->p_CellList.iLength<=0)||(s_KillMessage->p_CellList.iLength>MAXCELLCOUNT))
{
return NUMBEROFCELL_ERROR;
}
//檢查信道指示
if (s_KillMessage->p_ChannelIndicator.bFlag==EXIST)
{
if(s_KillMessage->p_ChannelIndicator.cChannelIndicator>1)
{
return NUMBEROFCELL_ERROR;
}
}
return SUCCESS;
}
//返回確認消息給CBC_proxy
int Process_Kill_Message_Return(PID_t s_Pid,unsigned char cNumberOfReturnMessage)
{
CBEMESSAGE_t s_CBEMessage;
// CBEMESSAGE_t *LPCBEMessage;
KILLMESSAGE_t *LP_mKillMessage;
SENDING_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)];
LP_mKillMessage=(KILLMESSAGE_t *)&ProcessData[s_Pid.iProcessId][(sizeof(MESSAGE_HEAD_t)+sizeof(short))];
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)+sizeof(MESSAGEIDENTIFIER_t)+sizeof(SERIALNUMBER_t);
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_MessageConfirm.p_MessageIdentifier,&LP_mKillMessage->p_MessageIdentifier,sizeof(MESSAGEIDENTIFIER_t));
memcpy(&s_MessageConfirm.p_Serialnumber,&LP_mKillMessage->p_OldSerialnumber,sizeof(SERIALNUMBER_t));
memcpy(&s_CBEMessage.cMessage[0],&s_MessageConfirm.NumberOfReturnMessage,s_MessageConfirm.s_MessageHead.iMessageLength);
#ifdef DEBUG_PRINT
printf("Return Kill confirm to CBCProxy.ConfirmValue=%d\n",cNumberOfReturnMessage);
printf("Return Kill confirm to CBCProxy.SerialNumber=%d\n",LP_mKillMessage->p_OldSerialnumber.iSerialNumber);
#endif
AppendCBESendMessage(&s_CBEMessage);
return SUCCESS;
}
/*
//處理定時KillMessage
int Process_Scheduled_KillMessage(PID_t s_Pid)
{
int iReturnValue;
//
KILLMESSAGE_t *LPKillMessage;
//拆分小區(qū)緩沖區(qū)
DIVIDE_CELLLIST_BUF_t s_DivideCellListBuf;
memset(&s_DivideCellListBuf,0,sizeof(DIVIDE_CELLLIST_BUF_t));
//去掉MessageHead
LPKillMessage=(KILLMESSAGE_t *)&ProcessData[s_Pid.iProcessId][(sizeof(MESSAGE_HEAD_t)+sizeof(short))];
//分配小區(qū)路由
//
Process_Divide_CellList_EX(&LPKillMessage->p_CellList,&s_DivideCellListBuf);
//發(fā)送消息給BSC
//發(fā)送失敗小區(qū)列表給CBC_Proxy
Process_Send_KillMessage_To_BSC(s_Pid, &s_DivideCellListBuf);
//釋放進程
iReturnValue=free_pid((char *)&s_Pid);
if (iReturnValue<0)
{
//sys error
printf("Warning! Free Pid Error.pid=%d\n",s_Pid.iProcessId);
return iReturnValue;
}
return SUCCESS;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -