📄 cbse_writereplace.c
字号:
for(i=0;i<LPs_WriteReplaceProcessDataStruct->s_ResponseCellList.cNumberOfBSC;i++)
{
if(LPs_WriteReplaceProcessDataStruct->s_ResponseCellList.s_BSCCellList[i].cResendTimes>0)
{
/* 存在重发
bResendExist=1;
break;
}
}
*/
iPosi=sizeof(REPORT_MESSAGE_i)+sizeof(short);
switch (LPs_WriteReplaceProcessDataStruct->cResponseType)
{
case CBCPROXY_REPORT_WRITE: /* 写入消息报告 */
{
/* 完成列表 */
LPs_Report->bComlListFlag=0;
LPs_Report->cComlListNumberOfBSC=0;
/* 状态报告列表 */
LPs_Report->bReportListFlag=1;
LPs_Report->cReportListNumberOfBSC=LPs_WriteReplaceProcessDataStruct->s_ResponseCellList.cNumberOfBSC;
/* 压缩ResponseCellList参数 */
for(i=0;i<LPs_WriteReplaceProcessDataStruct->s_ResponseCellList.cNumberOfBSC;i++)
{
memcpy(&ResponseBuf[iPosi],&LPs_WriteReplaceProcessDataStruct->s_ResponseCellList.s_BSCCellList[i],
(LPs_WriteReplaceProcessDataStruct->s_ResponseCellList.s_BSCCellList[i].ilength*sizeof(CELLREPORT_i)+BSC_INDENTIFIER_LEN+sizeof(short)));
iPosi=iPosi+LPs_WriteReplaceProcessDataStruct->s_ResponseCellList.s_BSCCellList[i].ilength*sizeof(CELLREPORT_i)+BSC_INDENTIFIER_LEN+sizeof(short);
}
iLen=iPosi-sizeof(short);
LPs_Report->s_MessageHead.iMessageType=CBCPROXY_REPORT_WRITE;
LPs_Report->s_MessageHead.iMessageLength=iLen-sizeof(MESSAGE_HEAD_t);
memcpy(&ResponseBuf[0],&iLen,sizeof(short));
#ifdef DEBUG_PRINT
printf("Send Write All Response to CBCProxy.\n");
printf("Serialnumber=%d.\n\n", LPs_Report->p_Serialnumber.iSerialNumber);
Printf_file_ResponseList(s_Pid,LPs_WriteReplaceProcessDataStruct->cResponseType,&LPs_WriteReplaceProcessDataStruct->s_ResponseCellList);
#endif
AppendCBESendMessage((CBEMESSAGE_t *)&ResponseBuf[0]);
}
break;
case CBCPROXY_REPORT_REPLACE: /* 替换操作的报告 */
{
/* 完成列表 */
LPs_Report->bComlListFlag=LPs_WriteReplaceProcessDataStruct->s_NoofBroadcastComlList.bFlag;
LPs_Report->cComlListNumberOfBSC=LPs_WriteReplaceProcessDataStruct->s_NoofBroadcastComlList.cNumberOfBSC;
/* 状态报告列表 */
LPs_Report->bReportListFlag=1;
LPs_Report->cReportListNumberOfBSC=LPs_WriteReplaceProcessDataStruct->s_ResponseCellList.cNumberOfBSC;
/* 压缩ComlList参数 */
for(i=0;i<LPs_WriteReplaceProcessDataStruct->s_NoofBroadcastComlList.cNumberOfBSC;i++)
{
memcpy(&ResponseBuf[iPosi],&LPs_WriteReplaceProcessDataStruct->s_NoofBroadcastComlList.s_BSC_NoOfBroadCastcoml[i],
LPs_WriteReplaceProcessDataStruct->s_NoofBroadcastComlList.s_BSC_NoOfBroadCastcoml[i].ilength*sizeof(NOOFBROADCASTSCOML_i)+sizeof(short)+BSC_INDENTIFIER_LEN);
iPosi=iPosi+LPs_WriteReplaceProcessDataStruct->s_NoofBroadcastComlList.s_BSC_NoOfBroadCastcoml[i].ilength*sizeof(NOOFBROADCASTSCOML_i)
+sizeof(short)+BSC_INDENTIFIER_LEN;
}
/* 压缩ResponseCellList参数 */
for(i=0;i<LPs_WriteReplaceProcessDataStruct->s_ResponseCellList.cNumberOfBSC;i++)
{
memcpy(&ResponseBuf[iPosi],&LPs_WriteReplaceProcessDataStruct->s_ResponseCellList.s_BSCCellList[i],
(LPs_WriteReplaceProcessDataStruct->s_ResponseCellList.s_BSCCellList[i].ilength*sizeof(CELLREPORT_i)+BSC_INDENTIFIER_LEN+sizeof(short)));
iPosi=iPosi+LPs_WriteReplaceProcessDataStruct->s_ResponseCellList.s_BSCCellList[i].ilength*sizeof(CELLREPORT_i)+BSC_INDENTIFIER_LEN+sizeof(short);
}
iLen=iPosi-sizeof(short);
LPs_Report->s_MessageHead.iMessageType=CBCPROXY_REPORT_REPLACE;
LPs_Report->s_MessageHead.iMessageLength=iLen-sizeof(MESSAGE_HEAD_t);
memcpy(&ResponseBuf[0],&iLen,sizeof(short));
#ifdef DEBUG_PRINT
printf("Send Replace All Response to CBCProxy.\n");
Printf_file_ResponseList(s_Pid,LPs_WriteReplaceProcessDataStruct->cResponseType,&LPs_WriteReplaceProcessDataStruct->s_ResponseCellList);
Printf_file_ComlList(s_Pid,LPs_WriteReplaceProcessDataStruct->cResponseType,&LPs_WriteReplaceProcessDataStruct->s_NoofBroadcastComlList);
#endif
AppendCBESendMessage((CBEMESSAGE_t *)&ResponseBuf[0]);
}
break;
}
}
/*
写操作报告单条响应
s_Pid:进程ID
BSCPosi:单个BSC在报告列表中的偏移量
*/
void Process_WriteReturnSingleResponseToCBCProxy(PID_t *s_Pid,int BSCPosi)
{
unsigned short Len;
int Posi;
char ResponseBuf[3096];
REPORT_MESSAGE_i s_Report;
WRITEREPLACE_REQUEST_t *LPm_WriteReplace_Request;
WRITEREPLACE_PROCESS_DATA_STRUCT *LPs_WriteReplaceProcessDataStruct;
int i;
memset(&ResponseBuf[0],0,3096);
memset(&s_Report,0,sizeof(REPORT_MESSAGE_i));
LPs_WriteReplaceProcessDataStruct=(WRITEREPLACE_PROCESS_DATA_STRUCT *)&ProcessData[s_Pid->iProcessId][0];
LPm_WriteReplace_Request=(WRITEREPLACE_REQUEST_t *)&LPs_WriteReplaceProcessDataStruct->s_CBCMessage.cMessage[0];
s_Report.s_MessageHead.iMessageAreaId=A;
/* 写操作的响应 */
s_Report.s_MessageHead.iMessageType=CBCPROXY_REPORT_WRITE;
memcpy(&s_Report.s_MessageHead.s_SenderPid,s_Pid,sizeof(PID_t));
memcpy(&s_Report.s_MessageHead.s_ReceiverPid,
&LPs_WriteReplaceProcessDataStruct->s_CBCMessage.s_MessageHead.s_SenderPid,sizeof(PID_t));
s_Report.bComlListFlag=0;
s_Report.cComlListNumberOfBSC=0;
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_ChannelIndicator,&LPm_WriteReplace_Request->p_ChannelIndicator,sizeof(CHANNELINDICATOR_t));
s_Report.bReportListFlag=1;
s_Report.cReportListNumberOfBSC=1;
memcpy(&ResponseBuf[sizeof(short)],&s_Report,sizeof(REPORT_MESSAGE_i));
Posi=sizeof(REPORT_MESSAGE_i)+sizeof(short);
/* 状态未知改为成功 */
for(i=0;i<LPs_WriteReplaceProcessDataStruct->s_ResponseCellList.s_BSCCellList[BSCPosi].ilength;i++)
{
if (LPs_WriteReplaceProcessDataStruct->s_ResponseCellList.s_BSCCellList[BSCPosi].s_CellReport[i].cCellStatus==UNKNOW_STATUS)
{
LPs_WriteReplaceProcessDataStruct->s_ResponseCellList.s_BSCCellList[BSCPosi].s_CellReport[i].cCellStatus=CELL_SUCCESS;
}
}
memcpy(&ResponseBuf[Posi],&LPs_WriteReplaceProcessDataStruct->s_ResponseCellList.s_BSCCellList[BSCPosi],
(LPs_WriteReplaceProcessDataStruct->s_ResponseCellList.s_BSCCellList[BSCPosi].ilength*sizeof(CELLREPORT_i)+BSC_INDENTIFIER_LEN+sizeof(short)));
Posi=Posi+LPs_WriteReplaceProcessDataStruct->s_ResponseCellList.s_BSCCellList[BSCPosi].ilength*sizeof(CELLREPORT_i)+BSC_INDENTIFIER_LEN+sizeof(short);
Len=Posi-sizeof(short);
memcpy(&ResponseBuf[0],&Len,sizeof(short));
s_Report.s_MessageHead.iMessageLength=Len-sizeof(MESSAGE_HEAD_t);
AppendCBESendMessage((CBEMESSAGE_t *)&ResponseBuf[0]);
}
/*
替换操作报告单条响应
s_Pid:进程ID
BSCPosi:单个BSC在报告列表中的偏移量
*/
void Process_ReplaceReturnSingleResponseToCBCProxy(PID_t *s_Pid,int BSCPosi)
{
unsigned short Len;
int Posi;
char ResponseBuf[3096];
REPORT_MESSAGE_i s_Report;
WRITEREPLACE_REQUEST_t *LPm_WriteReplace_Request;
WRITEREPLACE_PROCESS_DATA_STRUCT *LPs_WriteReplaceProcessDataStruct;
int i;
int ComlListBscPosi;
memset(&ResponseBuf[0],0,3096);
memset(&s_Report,0,sizeof(REPORT_MESSAGE_i));
LPs_WriteReplaceProcessDataStruct=(WRITEREPLACE_PROCESS_DATA_STRUCT *)&ProcessData[s_Pid->iProcessId][0];
LPm_WriteReplace_Request=(WRITEREPLACE_REQUEST_t *)&LPs_WriteReplaceProcessDataStruct->s_CBCMessage.cMessage[0];
s_Report.s_MessageHead.iMessageAreaId=A;
/* 替换操作的响应 */
s_Report.s_MessageHead.iMessageType=CBCPROXY_REPORT_REPLACE;
memcpy(&s_Report.s_MessageHead.s_SenderPid,s_Pid,sizeof(PID_t));
memcpy(&s_Report.s_MessageHead.s_ReceiverPid,
&LPs_WriteReplaceProcessDataStruct->s_CBCMessage.s_MessageHead.s_SenderPid,sizeof(PID_t));
ComlListBscPosi=-1;
for (i=0;LPs_WriteReplaceProcessDataStruct->s_NoofBroadcastComlList.cNumberOfBSC;i++)
{
if(memcmp(&LPs_WriteReplaceProcessDataStruct->s_NoofBroadcastComlList.s_BSC_NoOfBroadCastcoml[i].BSCIdentifier[0],
&LPs_WriteReplaceProcessDataStruct->s_ResponseCellList.s_BSCCellList[BSCPosi].BSCIdentifier[0],BSC_INDENTIFIER_LEN)==0)
{
ComlListBscPosi=i;
break;
}
}
if(ComlListBscPosi>=0)
{
s_Report.bComlListFlag=1;
s_Report.cComlListNumberOfBSC=1;
}
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_ChannelIndicator,&LPm_WriteReplace_Request->p_ChannelIndicator,sizeof(CHANNELINDICATOR_t));
s_Report.bReportListFlag=1;
s_Report.cReportListNumberOfBSC=1;
memcpy(&ResponseBuf[sizeof(short)],&s_Report,sizeof(REPORT_MESSAGE_i));
Posi=sizeof(REPORT_MESSAGE_i)+sizeof(short);
/* 状态未知改为成功 */
for(i=0;i<LPs_WriteReplaceProcessDataStruct->s_ResponseCellList.s_BSCCellList[BSCPosi].ilength;i++)
{
if (LPs_WriteReplaceProcessDataStruct->s_ResponseCellList.s_BSCCellList[BSCPosi].s_CellReport[i].cCellStatus==UNKNOW_STATUS)
{
LPs_WriteReplaceProcessDataStruct->s_ResponseCellList.s_BSCCellList[BSCPosi].s_CellReport[i].cCellStatus=CELL_SUCCESS;
}
}
memcpy(&ResponseBuf[Posi],&LPs_WriteReplaceProcessDataStruct->s_NoofBroadcastComlList.s_BSC_NoOfBroadCastcoml[ComlListBscPosi],
(LPs_WriteReplaceProcessDataStruct->s_NoofBroadcastComlList.s_BSC_NoOfBroadCastcoml[ComlListBscPosi].ilength*sizeof(NOOFBROADCASTSCOML_i)+BSC_INDENTIFIER_LEN+sizeof(short)));
Posi=Posi+LPs_WriteReplaceProcessDataStruct->s_NoofBroadcastComlList.s_BSC_NoOfBroadCastcoml[ComlListBscPosi].ilength*sizeof(NOOFBROADCASTSCOML_i)+BSC_INDENTIFIER_LEN+sizeof(short);
memcpy(&ResponseBuf[Posi],&LPs_WriteReplaceProcessDataStruct->s_ResponseCellList.s_BSCCellList[BSCPosi],
(LPs_WriteReplaceProcessDataStruct->s_ResponseCellList.s_BSCCellList[BSCPosi].ilength*sizeof(CELLREPORT_i)+BSC_INDENTIFIER_LEN+sizeof(short)));
Posi=Posi+LPs_WriteReplaceProcessDataStruct->s_ResponseCellList.s_BSCCellList[BSCPosi].ilength*sizeof(CELLREPORT_i)+BSC_INDENTIFIER_LEN+sizeof(short);
Len=Posi-sizeof(short);
memcpy(&ResponseBuf[0],&Len,sizeof(short));
s_Report.s_MessageHead.iMessageLength=Len-sizeof(MESSAGE_HEAD_t);
AppendCBESendMessage((CBEMESSAGE_t *)&ResponseBuf[0]);
}
/*
删除操作报告单条响应
s_Pid:进程ID
BSCPosi:单个BSC在报告列表中的偏移量
*/
void Process_KillReturnSingleResponseToCBCProxy(PID_t *s_Pid,int BSCPosi)
{
unsigned short Len;
int Posi;
char ResponseBuf[3096];
REPORT_MESSAGE_i s_Report;
KILL_PROCESS_DATA_STRUCT *LPs_KillProcessDataStruct;
KILLMESSAGE_t *LPm_KillMessage;
int i;
int ComlListBscPosi;
CELLLIST_i s_FailureList;
memset(&s_FailureList,0,sizeof(CELLLIST_i));
memset(&ResponseBuf[0],0,3096);
memset(&s_Report,0,sizeof(REPORT_MESSAGE_i));
LPs_KillProcessDataStruct=(KILL_PROCESS_DATA_STRUCT *)&ProcessData[s_Pid->iProcessId][0];
LPm_KillMessage=(KILLMESSAGE_t *)&LPs_KillProcessDataStruct->s_CBCMessage.cMessage[0];
s_Report.s_MessageHead.iMessageAreaId=A;
/* 删除操作的响应 */
s_Report.s_MessageHead.iMessageType=CBCPROXY_REPORT_KILL;
memcpy(&s_Report.s_MessageHead.s_SenderPid,s_Pid,sizeof(PID_t));
memcpy(&s_Report.s_MessageHead.s_ReceiverPid,
&LPs_KillProcessDataStruct->s_CBCMessage.s_MessageHead.s_SenderPid,sizeof(PID_t));
ComlListBscPosi=-1;
for (i=0;LPs_KillProcessDataStruct->s_NoofBroadcastComlList.cNumberOfBSC;i++)
{
if(memcmp(&LPs_KillProcessDataStruct->s_NoofBroadcastComlList.s_BSC_NoOfBroadCastcoml[i].BSCIdentifier[0],
&LPs_KillProcessDataStruct->s_FailureList.s_BSCCellList[BSCPosi].BSCIdentifier[0],BSC_INDENTIFIER_LEN)==0)
{
ComlListBscPosi=i;
break;
}
}
if(ComlListBscPosi>=0)
{
s_Report.bComlListFlag=1;
s_Report.cComlListNumberOfBSC=1;
}
memcpy(&s_Report.p_MessageIdentifier,&LPm_KillMessage->p_MessageIdentifier,sizeof(MESSAGEIDENTIFIER_t));
memcpy(&s_Report.p_Serialnumber,&LPm_KillMessage->p_OldSerialnumber,sizeof(SERIALNUMBER_t));
memcpy(&s_Report.p_ChannelIndicator,&LPm_KillMessage->p_ChannelIndicator,sizeof(CHANNELINDICATOR_t));
s_Report.bReportListFlag=1;
s_Report.cReportListNumberOfBSC=1;
memcpy(&ResponseBuf[sizeof(short)],&s_Report,sizeof(REPORT_MESSAGE_i));
Posi=sizeof(REPORT_MESSAGE_i)+sizeof(short);
memcpy(&ResponseBuf[Posi],&LPs_KillProcessDataStruct->s_NoofBroadcastComlList.s_BSC_NoOfBroadCastcoml[ComlListBscPosi],
(LPs_KillProcessDataStruct->s_NoofBroadcastComlList.s_BSC_NoOfBroadCastcoml[ComlListBscPosi].ilength*sizeof(NOOFBROADCASTSCOML_i)+BSC_INDENTIFIER_LEN+sizeof(short)));
Posi=Posi+LPs_KillProcessDataStruct->s_NoofBroadcastComlList.s_BSC_NoOfBroadCastcoml[ComlListBscPosi].ilength*sizeof(NOOFBROADCASTSCOML_i)+BSC_INDENTIFIER_LEN+sizeof(short);
Abstract_Failure_Cell(&LPs_KillProcessDataStruct->s_FailureList,&s_FailureList);
memcpy(&ResponseBuf[Posi],&s_FailureList.s_BSCCellList[BSCPosi],
(s_FailureList.s_BSCCellList[BSCPosi].ilength*sizeof(CELLREPORT_i)+BSC_INDENTIFIER_LEN+sizeof(short)));
Posi=Posi+s_FailureList.s_BSCCellList[BSCPosi].ilength*sizeof(CELLREPORT_i)+BSC_INDENTIFIER_LEN+sizeof(short);
Len=Posi-sizeof(short);
memcpy(&ResponseBuf[0],&Len,sizeof(short));
s_Report.s_MessageHead.iMessageLength=Len-sizeof(MESSAGE_HEAD_t);
AppendCBESendMessage((CBEMESSAGE_t *)&ResponseBuf[0]);
}
/* 生命定时器到时,释放进程 */
int Process_lifeEnd(PID_t *LPs_Pid)
{
/* 进程存在 */
if(is_busy_pid((char *)LPs_Pid)==0 )
{
return END;
}
return SUCCESS;
}
/* 处理WRITE回复定时器到时 */
int Process_Write_Response_timer_Expired(PID_t s_Pid)
{
int i;
unsigned char ResendExist;
WRITEREPLACE_PROCESS_DATA_STRUCT *LPs_WriteReplaceProcessDataStruct;
int iReturnValue;
LPs_WriteReplaceProcessDataStruct=(WRITEREPLACE_PROCESS_DATA_STRUCT *)&ProcessData[s_Pid.iProcessId][0];
ResendExist=0;
/* 返回全部响应 */
Process_WriteReplace_Return_To_CBCProxy(s_Pid);
/* 回复定时器置-1 */
LPs_WriteReplaceProcessDataStruct->iTimerId=-1;
/* 是否有重发 */
for(i=0;i<LPs_WriteReplaceProcessDataStruct->s_ResponseCellList.cNumberOfBSC;i++)
{
if(LPs_WriteReplaceProcessDataStruct->s_ResponseCellList.s_BSCCellList[i].bResendFlag==1)
{
ResendExist=1;
break;
}
}
if(ResendExist==1)
{/* 有重发 */
return CONTINUANCE;
}
else
{/* 无重发 */
/* 没有全响应 */
/* 创建生命定时器 */
iReturnValue=create_timer(WAIT_RESPONSE_TIME,LIFE_PERIOD,(char *)&s_Pid,NULL);
if (iReturnValue<0)
{
printf("Create Resend timer Error!\n");
return END;
}
LPs_WriteReplaceProcessDataStruct->iLifeTimerId=iReturnValue;
return CONTINUANCE;
}
}
/* 处理REPLACE回复定时器到时 */
int Process_Replace_Response_timer_Expired(PID_t s_Pid)
{
WRITEREPLACE_PROCESS_DATA_STRUCT *LPs_WriteReplaceProcessDataStruct;
int iReturnValue;
LPs_WriteReplaceProcessDataStruct=(WRITEREPLACE_PROCESS_DATA_STRUCT *)&ProcessData[s_Pid.iProcessId][0];
/* 返回全部响应 */
Process_WriteReplace_Return_To_CBCProxy(s_Pid);
/* 回复定时器置-1 */
LPs_WriteReplaceProcessDataStruct->iTimerId=-1;
/* 没有全响应 */
/* 创建生命定时器 */
iReturnValue=create_timer((WAIT_RESPONSE_TIME),LIFE_PERIOD,(char *)&s_Pid,NULL);
if (iReturnValue<0)
{
printf("Create Resend timer Error!\n");
return END;
}
LPs_WriteReplaceProcessDataStruct->iLifeTimerId=iReturnValue;
return CONTINUANCE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -