📄 cbcbscunpack.c
字号:
#include "..\Sys\Include.h"
#include "CbcBscPack.h"
#include "pack.h"
#define CHECKLEN
#define CELLID_DISC_LEN 1
#define CELLID_LEN 4
#define INTEGERTYPE_LEN 3
#define CAUSE_LEN 1
#define DIAGNOSTIC_LEN 20
#define CHANNEL_INDICATOR_LEN 1
#define OPERTOR_LEN 20
#define BILATERAL_AGREEM_LEN 20
#define Xl2lADDRESS_LEN 20
#define PASSWORD_LEN 20
int Unpackcbse_REPORT_SUCCESS(int handle);
int UnPackPara_MESSAGEIDENTIFER(int handle);
int UnPackPara_SERIALNUMBER(int handle);
int UnPack_NOOFBROADCASTSCOML(int handle,NOOFBROADCASTSCOML_t *s_NOOFBROADCASTSCOML);
int UnpackPara_CHANNELINDICATOR(int handle);
int UnPackPara_NOOFBROADCASTSCOMPLLIST(int handle);
int UnPackPara_FAILURELIST(int handle);
int UnPack_FAILUREREPORT(int handle,FAILUREREPORT_t *s_FAILUREREPORT);
int Unpackcbse_STATUS_CBCH_QUERY_RESP(handle);
int UnPack_CBCHLoading(int handle,CBCLOADINGSTATUS_t *s_CBCLOADINGSTATUS);
int UnPackPara_CBCHLoadingList(int handle);
int ConvertASN1INTEGERToint(unsigned char *ptr,int len);
int UnPackcbse_BSC_RESTART(int handle);
int Unpack_CellList(int handle);
int Unpack_UplinkCellList(int handle);
int Unpack_RecoveryIndication(int handle);
int UnPackcbse_RESET(int handle);
int UnPackcbse_FAILURE_IND(int handle);
int UnPackcbse_SET_DRX_REPORT(int handle);
int Unpack_NAME(int handle);
int UnpackPara_Operator(int handle);
int UnpackPara_BilateralAgreem(int handle);
int UnpackPara_DataNetworkAddress(int handle);
int Unpackcbse_REJECT_RESPONSE(int handle);
//补充
int Unpackcbse_WRITE_REPLACE(int handle);
//标签全为1字节
int CbcBscUnpackAMessage(MESSAGE_t *s_MessageRecord,int Len)
{
int para_id;
int flag;
int handle;
int ReturnValue;
#ifdef OPEN_WARNING
unsigned char cWarningDescription[WARNING_DESC_LEN];
#endif
handle=SolidUnPackBegin();
if (handle<0) return FAILURE;
flag=SolidUnPackAttach(handle,s_MessageRecord->cMessage,Len);
ReturnValue=SUCCESS;
if (flag==0)
{
para_id=SolidUnPackGetID(handle);
if (para_id>=0)
{
switch (para_id)
{
case 3://CBSE_REPORT_SUCCESS:
{
ReturnValue=Unpackcbse_REPORT_SUCCESS(handle);
#ifdef OPEN_WARNING
if (ReturnValue==FAILURE)
{
/* 发送告警给OMP */
memset(cWarningDescription,0,WARNING_DESC_LEN);
sprintf(cWarningDescription,"响应包无法解释");
SendWarningToOmp(PACK_UNPACK,UNRECOGNIZED_PACK,cWarningDescription);
}
#endif
}
break;
case 2: /* 0x82 0x00 解除绑定原因 */
{
ReturnValue=SUCCESS;
/* handle BIND-failure */
}
break;
case 5://CBSE_STATUS_CBCH_QUERY_RESP:
{
ReturnValue=Unpackcbse_STATUS_CBCH_QUERY_RESP(handle);
#ifdef OPEN_WARNING
if (ReturnValue==FAILURE)
{
/* 发送告警给OMP */
memset(cWarningDescription,0,WARNING_DESC_LEN);
sprintf(cWarningDescription,"信道查询响应包无法解释");
SendWarningToOmp(PACK_UNPACK,UNRECOGNIZED_PACK,cWarningDescription);
}
#endif
}
break;
case 7://CBSE_STATUS_MESS_QUERY_RESP:
{
ReturnValue=Unpackcbse_REPORT_SUCCESS(handle);//考虑Old MessageIdentifier
#ifdef OPEN_WARNING
if (ReturnValue==FAILURE)
{
/* 发送告警给OMP */
memset(cWarningDescription,0,WARNING_DESC_LEN);
sprintf(cWarningDescription,"消息查询响应包无法解释");
SendWarningToOmp(PACK_UNPACK,UNRECOGNIZED_PACK,cWarningDescription);
}
#endif
}
break;
case 8://CBSE_REJECT_RESPONSE:
{
#ifdef DEBUG_PRINT
printf("Receive REPORT-FAILURE \n");
#endif
ReturnValue=Unpackcbse_REJECT_RESPONSE(handle);
#ifdef OPEN_WARNING
if (ReturnValue==FAILURE)
{
/* 发送告警给OMP */
memset(cWarningDescription,0,WARNING_DESC_LEN);
sprintf(cWarningDescription,"消息查询响应包无法解释");
SendWarningToOmp(PACK_UNPACK,UNRECOGNIZED_PACK,cWarningDescription);
}
#endif
}
break;
case 9://CBSE_BSC_RESTART:
{
ReturnValue=UnPackcbse_BSC_RESTART(handle);
#ifdef OPEN_WARNING
if (ReturnValue==FAILURE)
{
/* 发送告警给OMP */
memset(cWarningDescription,0,WARNING_DESC_LEN);
sprintf(cWarningDescription,"重启指示包无法解释");
SendWarningToOmp(PACK_UNPACK,UNRECOGNIZED_PACK,cWarningDescription);
}
#endif
}
break;
case 11://CBSE_FAILURE_IND:
{
ReturnValue=UnPackcbse_FAILURE_IND(handle);
#ifdef OPEN_WARNING
if (ReturnValue==FAILURE)
{
/* 发送告警给OMP */
memset(cWarningDescription,0,WARNING_DESC_LEN);
sprintf(cWarningDescription,"失败指示包无法解释");
SendWarningToOmp(PACK_UNPACK,UNRECOGNIZED_PACK,cWarningDescription);
}
#endif
}
break;
// case 13://CBSE_SET_DRX_REPORT:
// ReturnValue=UnPackcbse_SET_DRX_REPORT(handle);
// break;
default:
{
#ifdef OPEN_WARNING
/* 发送告警给OMP */
memset(cWarningDescription,0,WARNING_DESC_LEN);
sprintf(cWarningDescription,"不识别的包类型");
SendWarningToOmp(PACK_UNPACK,UNRECOGNIZED_PACK,cWarningDescription);
#endif
ReturnValue=FAILURE;
}
break;
}
}
else//标签码失败
{
ReturnValue=FAILURE;
}
}
else
{
ReturnValue=FAILURE;
}
SolidUnPackRelease(handle);
return ReturnValue;
}
int Unpackcbse_REPORT_SUCCESS(int handle)
{
int ParaMeterTag;
int len;
// if (SolidUnPackFORWARD(handle)==0)
// return FAILURE;
if (SolidUnPackFORWARD(handle)==0)
return FAILURE;
/* MessageIdentifier */
UnPackPara_MESSAGEIDENTIFER(handle);
/* serialnumber */
if (SolidUnPackSkipBODY(handle)==0)
return FAILURE;
UnPackPara_SERIALNUMBER(handle);
/* ComlList */
if (SolidUnPackSkipBODY(handle)==0)
return FAILURE;
ParaMeterTag=SolidUnPackGetID(handle);
if (ParaMeterTag<0)
return FAILURE;
len=SolidUnPackGetLEN(handle);
if(len>0)
{
if (UnPackPara_NOOFBROADCASTSCOMPLLIST(handle)==FAILURE)
{
return FAILURE;
}
}
/* FailureList (O)*/
if (SolidUnPackSkipBODY(handle)==0)
return SUCCESS; /* 没有失败列表 */
ParaMeterTag=SolidUnPackGetID(handle);
if (ParaMeterTag<0)
return FAILURE;
len=SolidUnPackGetLEN(handle);
if(len>0)
{
if(UnPackPara_FAILURELIST(handle)==FAILURE)
{
return FAILURE;
}
}
/* 更高版本
for(;;)
{
ParaMeterTag=SolidUnPackGetID(handle);
if (ParaMeterTag<0)
return FAILURE;
switch (ParaMeterTag)
{
case 0://NOOFBROADCASTSCOMPLLIST:
UnPackPara_NOOFBROADCASTSCOMPLLIST(handle);
break;
case 1://FAILURELIST:
UnPackPara_FAILURELIST(handle);
break;
case 4://CHANNELINDICATOR:
UnpackPara_CHANNELINDICATOR(handle);
break;
}
if (SolidUnPackSkipBODY(handle)==0)
break;
}
*/
return SUCCESS;
}
int UnPackPara_MESSAGEIDENTIFER(int handle)
{
char* para_body;
int len;
para_body=SolidUnPackGetBODY(handle);
if (para_body==NULL)
{
return FAILURE;
}
len=SolidUnPackGetLEN(handle);
CBCBSC_Unpack.p_MessageIdentifier.iMessageIdentifier=
ConvertASN1INTEGERToint(para_body,len);
CBCBSC_Unpack.p_MessageIdentifier.bFlag=1;
return SUCCESS;
}
int UnPackPara_SERIALNUMBER(int handle)
{
char* para_body;
int len;
para_body=SolidUnPackGetBODY(handle);
if (para_body==NULL) return FAILURE;
len=SolidUnPackGetLEN(handle);
CBCBSC_Unpack.p_Serialnumber.iSerialNumber=
ConvertASN1INTEGERToint(para_body,len);
CBCBSC_Unpack.p_Serialnumber.bFlag=1;
return SUCCESS;
}
/* 解一个NOOFBROADCASTSCOML */
int UnPack_NOOFBROADCASTSCOML(int handle,NOOFBROADCASTSCOML_t *s_NOOFBROADCASTSCOML)
{
char* para_body;
int len;
if (SolidUnPackFORWARD(handle)==0)
return FAILURE;
/* 深入到Cell节点 */
if (SolidUnPackFORWARD(handle)==0)
return FAILURE;
/* CellIdDisc */
para_body=SolidUnPackGetBODY(handle);
len=SolidUnPackGetLEN(handle);
#ifdef CHECKLEN
if (len!=CELLID_DISC_LEN)
return FAILURE;
#endif
memcpy(&s_NOOFBROADCASTSCOML->s_Cellid.cCellIdDisc,para_body,len);
/* CellId */
SolidUnPackSkipBODY(handle);
para_body=SolidUnPackGetBODY(handle);
len=SolidUnPackGetLEN(handle);
#ifdef CHECKLEN
if (len>CELLID_LEN)
return FAILURE;
#endif
memcpy(&s_NOOFBROADCASTSCOML->s_Cellid.cCellId[0],para_body,len);
/* 得到完成次数 */
SolidUnPackBACKWARD(handle);
SolidUnPackSkipBODY(handle);
para_body=SolidUnPackGetBODY(handle);
len=SolidUnPackGetLEN(handle);
#ifdef CHECKLEN
if (len>INTEGERTYPE_LEN)
return FAILURE;
#endif
s_NOOFBROADCASTSCOML->iNoOfBroadcastsCompl=ConvertASN1INTEGERToint(para_body,len);
/*
if (SolidUnPackSkipBODY(handle)==0)
{
//不存在该参数
s_NOOFBROADCASTSCOML->cNoOfBroadcastsComplType=2;
}else
{
para_body=SolidUnPackGetBODY(handle);
s_NOOFBROADCASTSCOML->cNoOfBroadcastsComplType=*para_body;
}
*/
/* 退回 */
SolidUnPackBACKWARD(handle);
return SUCCESS;
}
/* 参数NOOFBROADCASTSCOMPLLIST */
int UnPackPara_NOOFBROADCASTSCOMPLLIST(int handle)
{
int i=0;
if (SolidUnPackFORWARD(handle)==0)
return FAILURE;
for(;;)
{
if(UnPack_NOOFBROADCASTSCOML(handle,&CBCBSC_Unpack.p_NoofBroadcastComlList.s_NoOfBroadcastComl[i])==FAILURE)
{
SolidUnPackBACKWARD(handle);
return FAILURE;
}
i++;
if (SolidUnPackSkipBODY(handle)==0)
break;
}
if (i>0)
{
CBCBSC_Unpack.p_NoofBroadcastComlList.bFlag=1;
CBCBSC_Unpack.p_NoofBroadcastComlList.ilength=i;
}
SolidUnPackBACKWARD(handle);
return SUCCESS;
}
//解一个FAILUREREPORT
int UnPack_FAILUREREPORT(int handle,FAILUREREPORT_t *s_FAILUREREPORT)
{
char* para_body;
int len;
if (SolidUnPackFORWARD(handle)==0)
return FAILURE;
//深入到Cell节点
if (SolidUnPackFORWARD(handle)==0)
return FAILURE;
/* CellIddisc */
para_body=SolidUnPackGetBODY(handle);
len=SolidUnPackGetLEN(handle);
#ifdef CHECKLEN
if (len>CELLID_DISC_LEN)
return FAILURE;
#endif
memcpy(&s_FAILUREREPORT->s_Cellid.cCellIdDisc,para_body,len);
/* CellId */
SolidUnPackSkipBODY(handle);
para_body=SolidUnPackGetBODY(handle);
len=SolidUnPackGetLEN(handle);
#ifdef CHECKLEN
if (len>CELLID_LEN)
return FAILURE;
#endif
memcpy(&s_FAILUREREPORT->s_Cellid.cCellId,para_body,len);
/* 得到Cause */
SolidUnPackBACKWARD(handle);
SolidUnPackSkipBODY(handle);
para_body=SolidUnPackGetBODY(handle);
len=SolidUnPackGetLEN(handle);
#ifdef CHECKLEN
if (len>CAUSE_LEN)
return FAILURE;
#endif
memcpy(&s_FAILUREREPORT->cCause,para_body,len);
/* 更高版本
//得到Diagnost optional
if (SolidUnPackSkipBODY(handle)!=0)
{
para_body=SolidUnPackGetBODY(handle);
len=SolidUnPackGetLEN(handle);
#ifdef CHECKLEN
if (len>DIAGNOSTIC_LEN)
return FAILURE;
#endif
memcpy(&s_FAILUREREPORT->cDiagnostic,para_body,len);
}
*/
/* 退回 */
SolidUnPackBACKWARD(handle);
return SUCCESS;
}
/* 参数FAILURELIST */
int UnPackPara_FAILURELIST(int handle)
{
int i=0;
int iPacklen;
iPacklen=SolidUnPackGetLEN(handle);
if(iPacklen==0)
{
return SUCCESS;
}
// if (SolidUnPackFORWARD(handle)==0)
// return FAILURE;
if (SolidUnPackFORWARD(handle)==0)
return FAILURE;
for(;;)
{
if(UnPack_FAILUREREPORT(handle,&CBCBSC_Unpack.p_FailureReportList.s_FailureReason[i])==FAILURE)
{
// SolidUnPackBACKWARD(handle);
SolidUnPackBACKWARD(handle);
return FAILURE;
}
i++;
if (SolidUnPackSkipBODY(handle)==0)
break;
}
if (i>0)
{
CBCBSC_Unpack.p_FailureReportList.bFlag=1;
CBCBSC_Unpack.p_FailureReportList.iLength=i;
}
SolidUnPackBACKWARD(handle);
// SolidUnPackBACKWARD(handle);
return SUCCESS;
}
//参数CHANNELINDICATOR
int UnpackPara_CHANNELINDICATOR(int handle)
{
char* para_body;
int len;
para_body=SolidUnPackGetBODY(handle);
len=*(unsigned char *)(para_body+1);
#ifdef CHECKLEN
if (len>CHANNEL_INDICATOR_LEN)
return FAILURE;
#endif
memcpy(&CBCBSC_Unpack.p_ChannelIndicator.cChannelIndicator,(para_body+2),len);
CBCBSC_Unpack.p_ChannelIndicator.bFlag=1;
return SUCCESS;
}
/* 对cbse_STATUS_CBCH_QUERY_RESP操作元素解包 */
int Unpackcbse_STATUS_CBCH_QUERY_RESP(int handle)
{
int ParaMeterTag;
int len;
// if (SolidUnPackFORWARD(handle)==0)
// return FAILURE;
if (SolidUnPackFORWARD(handle)==0)
return FAILURE;
/* CBCHLoadingList */
ParaMeterTag=SolidUnPackGetID(handle);
if (ParaMeterTag<0)
return FAILURE;
len=SolidUnPackGetLEN(handle);
if (len>0)
{
if(UnPackPara_CBCHLoadingList(handle)==FAILURE)
{
return FAILURE;
}
}
/* FailureList */
if (SolidUnPackSkipBODY(handle)==0)
return FAILURE;
len=SolidUnPackGetLEN(handle);
if (len>0)
{
if(UnPackPara_FAILURELIST(handle)==FAILURE)
{
return FAILURE;
}
}
/* 更高版本
for(;;)
{
ParaMeterTag=SolidUnPackGetID(handle);
if (ParaMeterTag<0)
return FAILURE;
switch (ParaMeterTag)
{
case 0://CBCH-Loading-List
UnPackPara_CBCHLoadingList(handle);
break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -