📄 cbcfunction.c
字号:
// 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 + -