📄 x25function.c
字号:
#include "..\sys\Include.h "
int AllocBscConnectInfo();
int ReleaseBscConnectInfo(int Tid);
int Process_BSC_Message(char *MessageBuf,int Len,int Tid);
/* 从X25发送消息缓冲区中取出一条消息信息
WaitTime_len: 等待时长ms
* 返回
<0: 超时
>1: 成功
*/
int X25GetCBESendMsg(BSCMESSAGE_t *s_BSCMessage,int Tid, int WaitTime_len);
//检查绑定参数
int Process_VBind_init(VBIND_t *s_VBind);
/*
//连接到BSC并绑定
int ConnectToBsc(CBEMESSAGE_t *s_CBEMessage)
{
int iReturnValue;
int Tid;
char *BscIdetifier;
VBIND_t *LPVbind;
char PackBindBuf[1024];
char UnpackBind[1024];
int len;
unsigned char sUserInfo[128];
unsigned char nUserInfoLen=1;
memset(PackBindBuf,0,1024);
LPVbind=(VBIND_t *)&s_CBEMessage->cMessage[0];
iReturnValue=Process_VBind_init(LPVbind);
if (iReturnValue<0)
{
return iReturnValue;
}
BscIdetifier=LPVbind->BSCIdentifier;
//BscConnectInfo是否配置
if (Tid=GetTid(BscIdetifier)<0)
{
printf("Unrecognized BSC!\n");
return UNRECOGNIZED_BSC;
}
//是否已经绑定
if (s_BscConnectInfo[Tid].DownlinkStatus==BSC_STEADY)
{
printf("Already bind!\n");
return ALREADY_BIND;
}
if ((s_BscConnectInfo[Tid].X25DownlinkHandle=CallToRemote(s_BscConnectInfo[Tid].BscAddr, g_X25LocalAddr, s_BscConnectInfo[Tid].BscPort, sUserInfo, nUserInfoLen, 1))<0)
{
printf("X25connect error!\n");
return X25_ERROR;
}
else
{
printf("X25 connected!\n");
//进行绑定操作
//结果报告给cbc_proxy
//set cbc status
len=Pack_cbse_VBIND(LPVbind,PackBindBuf);
//发送X25绑定请求数据
X25SendData(s_BscConnectInfo[Tid].X25DownlinkHandle,PackBindBuf,len );
//接受绑定结果参数
len=X25RecvData(s_BscConnectInfo[Tid].X25DownlinkHandle, UnpackBind);
if (len<0)
{
return X25_ERROR;
}
//绑定失败
if (UnpackBind[0]!=CBSE_BIND_CONFIRM)
{
memset(&CBCBSC_Unpack,0,sizeof(CBC_BSC_UNPACK_t));
CbcBscUnpackAMessage((MESSAGE_t *)&UnpackBind[0],len);
return BSC_BIND_FAILURE;
}
//==========
//发送接受线程互斥量
s_BscConnectInfo[Tid].ThreadEvent=CreateEvent(NULL,TRUE,TRUE,NULL);
//创建接受数据线程
s_BscConnectInfo[Tid].X25ReceiveThreadHandle=CreateThread((LPSECURITY_ATTRIBUTES)NULL,0,(LPTHREAD_START_ROUTINE)X25DownLinkRecieveData,&Tid,0,NULL);
/* 创建发送数据线程
s_BscConnectInfo[Tid].X25SendThreadHandle=
CreateThread((LPSECURITY_ATTRIBUTES)NULL,0,(LPTHREAD_START_ROUTINE)X25SendMessage,&Tid,0,NULL);
memset(&s_BscConnectInfo[Tid].s_X25SendMessageBuf,0,sizeof(X25_SEND_MESSAGE_BUF_t));
s_BscConnectInfo[Tid].s_X25SendMessageBuf.MsgFull = CreateSemaphore(NULL,0,X25MSG_QUEUE_SIZE,NULL);
s_BscConnectInfo[Tid].s_X25SendMessageBuf.MsgEmpty = CreateSemaphore(NULL,X25MSG_QUEUE_SIZE,X25MSG_QUEUE_SIZE,NULL);
s_BscConnectInfo[Tid].s_X25SendMessageBuf.MsgMutex = CreateMutex(NULL,FALSE,NULL);
}
/* 延迟一秒,保证创建线程时传递的参数不被释放
Sleep(1000);
return SUCCESS;
}
*/
void initBscConnectInfo()
{
int i;
memset(s_BscConnectInfo,0,sizeof(BSC_CONNECT_INFO_t)*MAX_BSC_CONNECT);
/* 设置连接状态 */
for (i=0;i<MAX_BSC_CONNECT;i++)
{
s_BscConnectInfo[i].DownlinkStatus=BSC_DISCONNECT;
s_BscConnectInfo[i].UplinkStatus=BSC_DISCONNECT;
}
}
/* 根据BscIdentifier返回s_BscConnectInfo的数组下标Tid */
int GetTid(char *Bsc)
{
int i;
for(i=0;i<MAX_BSC_CONNECT; i++)
{
if (memcmp(&s_BscConnectInfo[i].BscIdentifier,Bsc,BSC_INDENTIFIER_LEN)==0)
{
return i;
}
}
return FAILURE;
}
//分配连接信息数组
/*
int AllocBscConnectInfo()
{
int i;
for(i=0;i<MAX_BSC_CONNECT; i++)
{
if (s_BscConnectInfo[i].InUse==0)
return i;
}
return FAILURE;
}
//释放连接信息数组
int ReleaseBscConnectInfo(int Tid)
{
if ((Tid<0)||(Tid>=MAX_BSC_CONNECT))
return FAILURE;
s_BscConnectInfo[Tid].InUse=0;
ReleaseMutex(s_BscConnectInfo[Tid].ThreadMutex);
return SUCCESS;
}
*/
/* 接受X25数据 */
void X25DownLinkRecieveData(int *Tid)
{
int nTid;
int Len;
unsigned char ReceiveBuf[MESSAGE_LEN];
#ifdef OPEN_WARNING
/* 统计告警描述字串 */
unsigned char cWarningDescription[WARNING_DESC_LEN];
#endif
nTid=*Tid;
for(;;)
{
/* 需要退出连接 */
if (s_BscConnectInfo[nTid].ConnectOpen==OFF)
{
if (s_BscConnectInfo[nTid].DownlinkStatus==BSC_STEADY)
{
HangupConnectNOWAIT(s_BscConnectInfo[nTid].X25DownlinkHandle,NULL, NULL ,NULL,0);
// HangupConnect(s_BscConnectInfo[nTid].X25DownlinkHandle,&s_BscConnectInfo[nTid].BscAddr[0], g_X25LocalAddr ,NULL,0);
Del_Port_lsn(nTid,0);
s_BscConnectInfo[nTid].DownlinkStatus=BSC_DISCONNECT;
}
ExitThread(1);
}
if ((Len=X25NoWaitRecvData(s_BscConnectInfo[nTid].X25DownlinkHandle , ReceiveBuf ,XD_NOTO,nTid))<=0)
{
s_BscConnectInfo[nTid].DownlinkStatus=BSC_DISCONNECT;
HangupConnectNOWAIT(s_BscConnectInfo[nTid].X25DownlinkHandle,NULL, NULL ,NULL,0);
// HangupConnect(s_BscConnectInfo[nTid].X25DownlinkHandle,&s_BscConnectInfo[nTid].BscAddr[0], g_X25LocalAddr ,NULL,0);
Del_Port_lsn(nTid,0);
printf("X25 downlinkConnect Exit,RemoteAddr=%s\n",s_BscConnectInfo[nTid].BscAddr);
/* 告警 */
#ifdef OPEN_WARNING
memset(cWarningDescription,0,sizeof(WARNING_DESC_LEN));
sprintf(cWarningDescription,"下行连路断连,BSCID=%d",*((unsigned short *)s_BscConnectInfo[nTid].BscIdentifier));
SendWarningToOmp(LINK_WARNING,BSC_LINK,cWarningDescription);
#endif
ExitThread(1);
break;
}
else
{
Process_BSC_Message(ReceiveBuf,Len,nTid);
}
}
ExitThread(1);
}
/* 处理BSC消息 */
int Process_BSC_Message(char *MessageBuf,int Len,int Tid)
{
unsigned char MessageType;
int iReturnValue;
MessageType=*(unsigned char *)MessageBuf;
memset(&CBCBSC_Unpack,0,sizeof(CBC_BSC_UNPACK_t));
/* 解包BSC操作参数 */
iReturnValue=CbcBscUnpackAMessage((MESSAGE_t *)MessageBuf, Len);
if (iReturnValue<0)
{
printf("Unpack BSC Message Error !\n");
return FAILURE;
}
switch (MessageType)
{
case CBSE_REPORT_SUCCESS: /* Report_Success */
{
#ifdef DEBUG_PRINT
printf("Receive REPORT_SUCCESS Message from BSC, Tid=%d.\n",Tid);
Print_BSC_Response(s_BscConnectInfo[Tid].s_Pid,
s_BscConnectInfo[Tid].MessageType,
Tid,
&CBCBSC_Unpack);
#endif
iReturnValue=Process_Response(Tid);
/* 释放进程 */
if (iReturnValue==END)
{
if (free_pid((char *)&s_BscConnectInfo[Tid].s_Pid)<0)
{
//sys error
printf("Warning! Free Pid Error.pid=%d\n",s_BscConnectInfo[Tid].s_Pid.iProcessId);
}
}
// if (iReturnValue<0)
// break;
/* 事件有信号 */
/*
if ((s_BscConnectInfo[Tid].MessageType!=CBSE_STATUS_CBCH_QUERY)
&&(s_BscConnectInfo[Tid].MessageType!=CBSE_STATUS_MESSAGE_QUERY)
&&(s_BscConnectInfo[Tid].MessageType!=CBSE_SET_DRX)
)
SetEvent(s_BscConnectInfo[Tid].ThreadEvent);
*/
}
break;
case CBSE_STATUS_CBCH_QUERY_RESP:/* Status_CBCH_Resp */
{
#ifdef DEBUG_PRINT
printf("Receive STATUS_CBCH_QUERY_RESP from BSC, Tid=%d.\n",Tid);
Print_Status_CBCH_Query_RESP(s_BscConnectInfo[Tid].s_Pid,
s_BscConnectInfo[Tid].MessageType,
Tid,
&CBCBSC_Unpack);
#endif
iReturnValue=Process_StatusCBCH_QUERY_RESP(Tid);
/* 释放进程 */
if (iReturnValue==END)
{
if (free_pid((char *)&s_BscConnectInfo[Tid].s_Pid)<0)
{
//sys error
printf("Warning! Free Pid Error.pid=%d\n",s_BscConnectInfo[Tid].s_Pid.iProcessId);
}
}
/* 事件有信号 */
/* if (s_BscConnectInfo[Tid].MessageType==CBSE_STATUS_CBCH_QUERY)
SetEvent(s_BscConnectInfo[Tid].ThreadEvent);
*/
}
break;
case CBSE_STATUS_MESS_QUERY_RESP: /* Status_Mess_Resp */
{
#ifdef DEBUG_PRINT
printf("Receive STATUS_MESSAGE_QUERY_RESP from BSC, Tid=%d.\n",Tid);
Print_StatusMessageQuery_Response(s_BscConnectInfo[Tid].s_Pid,
s_BscConnectInfo[Tid].MessageType,
Tid,
&CBCBSC_Unpack);
#endif
iReturnValue=Process_StatusMessage_QUERY_RESP(Tid);
/* 释放进程 */
if (iReturnValue==END)
{
if (free_pid((char *)&s_BscConnectInfo[Tid].s_Pid)<0)
{
//sys error
printf("Warning! Free Pid Error.pid=%d\n",s_BscConnectInfo[Tid].s_Pid.iProcessId);
}
}
/* 事件有信号 */
/* if (s_BscConnectInfo[Tid].MessageType==CBSE_STATUS_MESSAGE_QUERY)
SetEvent(s_BscConnectInfo[Tid].ThreadEvent);
*/
}
break;
case CBSE_REJECT_RESPONSE: /* Report_Failure */
{
/* 事件有信号 */
// SetEvent(s_BscConnectInfo[Tid].ThreadEvent);
}
break;
case CBSE_BSC_RESTART: /* BSC_Restart */
{
#ifdef DEBUG_PRINT
printf("Receive BSC_RESTART from BSC, Tid=%d.\n",Tid);
Print_RestartIndication_Response(s_BscConnectInfo[Tid].s_Pid,
s_BscConnectInfo[Tid].MessageType,
Tid,
&CBCBSC_Unpack);
#endif
iReturnValue=Process_BSC_Restart_IND(Tid);
/* 释放进程 */
if (iReturnValue==END)
{
if (free_pid((char *)&s_BscConnectInfo[Tid].s_Pid)<0)
{
//sys error
printf("Warning! Free Pid Error.pid=%d\n",s_BscConnectInfo[Tid].s_Pid.iProcessId);
}
}
/* 事件有信号 */
/* if (s_BscConnectInfo[Tid].MessageType==CBSE_RESET)
{
SetEvent(s_BscConnectInfo[Tid].ThreadEvent);
}
*/
}
break;
case CBSE_FAILURE_IND:/* Failure_Ind */
{
#ifdef DEBUG_PRINT
printf("Receive CBSE_FAILURE_IND from BSC, Tid=%d.\n",Tid);
Print_FailureIndication_Response(s_BscConnectInfo[Tid].s_Pid,
s_BscConnectInfo[Tid].MessageType,
Tid,
&CBCBSC_Unpack);
#endif
Process_Failure_IND(Tid);
}
break;
case CBSE_SET_DRX_REPORT:
{
#ifdef DEBUG_PRINT
printf("Receive SET_DRX_REPORT BSC, Tid=%d.\n",Tid);
Print_SETDRX_REPORT_Response(s_BscConnectInfo[Tid].s_Pid,
s_BscConnectInfo[Tid].MessageType,
Tid,
&CBCBSC_Unpack);
#endif
iReturnValue=Process_SET_DRX_REPORT(Tid);
/* 释放进程 */
if (iReturnValue==END)
{
if (free_pid((char *)&s_BscConnectInfo[Tid].s_Pid)<0)
{
//sys error
printf("Warning! Free Pid Error.pid=%d\n",s_BscConnectInfo[Tid].s_Pid.iProcessId);
}
}
/* 事件有信号 */
/* if (s_BscConnectInfo[Tid].MessageType==CBSE_SET_DRX)
SetEvent(s_BscConnectInfo[Tid].ThreadEvent);
*/
}
break;
default:
printf("Unrecognized Message sent by BSC!\n");
break;
}
return SUCCESS;
}
/* 发送消息线程函数 */
void X25SendMessage(int *Tid)
{
int nTid;
BSCMESSAGE_t s_BSCMessage;
int len;
unsigned char ReceiveBuf[MESSAGE_LEN];
#ifdef OPEN_WARNING
/* 统计告警描述字串 */
unsigned char cWarningDescription[WARNING_DESC_LEN];
#endif
nTid=*Tid;
for(;;)
{
/* 从消息队列中取一条数据 */
for(;;)
{
if(X25GetCBESendMsg(&s_BSCMessage,nTid,2000)==SUCCESS)
{
break;
}
/* 需要退出连接 */
if (s_BscConnectInfo[nTid].ConnectOpen==OFF)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -