abisptl.cpp
来自「ABis无线接口全套资料」· C++ 代码 · 共 1,460 行 · 第 1/3 页
CPP
1,460 行
/* ======================================================================== *\
|
|
| JOYIT Communication Technology
| Copyright (C) 2003~2006, All Right Reserved.
|
| System: Programmable Signaling Gateway
| Sub-system:
| Filename: isup.cpp
| Environment: Red Hat Linux 7.2 & GNU C/C++ Compiler 2.96
| Function description: ISUP Protocol class
|
\* ======================================================================== */
#ifndef _ABISPTL_HPP
#include "abisptl.hpp"
#endif
#ifndef _ABISFMT_HPP
#include "abisfmt.hpp"
#endif
#ifndef _JOYITIEFMT_HPP
#include "joyitiefmt.hpp"
#endif
#include "layer3infoPtl.hpp"
extern char msubuf[1024];
extern void parser_layer3_info(unsigned char *msuBuf, short msu_len, CPduBase &pdu);
extern void parser_layer3_info_system(unsigned char *msuBuf, short msu_len, CPduBase &pdu, unsigned char system_type);
CAbisPdu::CAbisPdu():CPduBase()
{
Init();
}
CAbisPdu::CAbisPdu(CAbisPdu& s):CPduBase(s)
{
}
CAbisPdu::~CAbisPdu()
{
}
#define ABIS_DC_SUCCESS 0
#define ABIS_DC_ERROR_SHORT -1 //消息太短
#define ABIS_DC_ERROR_INVLID -2 //不合法消息
#define ABIS_DC_ERROR_DECODE -3 //解析错误
void CAbisPdu::Show()
{
if (! NoIe( ))
{
return;
}
for (int i=0; i<NoIe( ); i++)
{
if (0 == IE[i].id)
{
continue;
}
printf("ID=0x%02X, LEN=%03u, ", IE[i].id, IE[i].len);
unsigned char *pDat;
if(IE[i].len <= sizeof(UINT32))
pDat = (unsigned char*)&(IE[i].data);
else
pDat = (unsigned char*)IE[i].ptr;
for (int j=0; j<IE[i].len; j++)
{
printf("0x%02X ", (unsigned char)pDat[j]);
if ( !((j+1)%16))
{
printf("\n");
printf(" ");
}
}
printf("\n");
}
}
void CAbisPdu::Init()
{
for(int i=0; i<MAX_IE; ++i)
{
CPduBase::IE[i].id = IE_NOT_EXIST;
}
return;
}
int CAbisPdu::Unpacked(char* ptr, UINT16 len)
{
return 0;
}
char* CAbisPdu::Output(UINT16& len)
{
return NULL;
}
int CAbisPdu::DecomposeJoyitApi(char* ptr, UINT16 len)
{
return 0;
}
char* CAbisPdu::ComposeJoyitApi(UINT16& len)
{
return NULL;
}
char* CAbisPdu::Encode(UINT16& len)
{
return NULL;
}
int CAbisPdu::Decode(char* ptr, UINT16 len)
{
//printf("Decode len = %d\n", len);
int ret = ABIS_DC_SUCCESS;
// --------------------------------------------
// 解析链路层的信息
char* pos = ptr;
UINT8 addrlen = sizeof(SAddressField);
//printf("SAddressField size = %d\n", addrlen);
UINT8 ctrllen;
short linknumber = 0;
unsigned char *pLink = NULL;
if(len < 3)//链路头部
return ABIS_DC_ERROR_SHORT;
pLink = (unsigned char *)pos;
linknumber = (*pLink) | ((*(pLink+1))<<8);
PutIE(ABIS_LK_IE_LINKNUMBER, sizeof(short), (char *)&linknumber);
pos += sizeof(short);
PutIE(ABIS_LK_IE_ADDRESS, addrlen, pos);
pos += addrlen;
SControlSign& ctrl = *((SControlSign*)pos);
if((ctrl.SIGN == 0)||(ctrl.SIGN == 2)) // I Frame
{
if(len < 4)
return ABIS_DC_ERROR_SHORT;
ctrllen = sizeof(SIFrame);
PutIE(ABIS_LK_IE_CONTROL_I, ctrllen, pos);
}
else if(ctrl.SIGN == 1) // S Frame
{
if(len < 4)
return ABIS_DC_ERROR_SHORT;
ctrllen = sizeof(SSFrame);
PutIE(ABIS_LK_IE_CONTROL_S, ctrllen, pos);
}
else //if(ctrl.SIGN = 3) U Frame
{
ctrllen = sizeof(SUFrame);
PutIE(ABIS_LK_IE_CONTROL_U, ctrllen, pos);
}
pos += ctrllen;
//--------------------------------------------
//--------------------------------------------
// 解析网络层的信息
//头部信息的解析
SMessageDiscriminator& dscrm = *((SMessageDiscriminator*) pos);
pos += sizeof(SMessageDiscriminator);
if(len < (pos-ptr))
return ABIS_DC_ERROR_SHORT;
// G7 G6 G5 G4 G3 G2 G1 Message Group
// 0 0 0 0 0 0 0 reserved
// 0 0 0 0 0 0 1 RadioLinkLayerManagementmessages
// 0 0 0 0 1 0 0 DedicatedChannelManagementmessages
// 0 0 0 0 1 1 0 CommonChannelManagementmessages
// 0 0 0 1 0 0 0 TRXManagementmessages
// 0 0 1 0 0 0 0 LocationServicesmessages
#define RESERVED 0
#define RLLMM 1
#define DCMM 4
#define CCMM 6
#define TRXMM 8
#define LSM 16
switch(dscrm.G)
{
default:
{
//int ret = ABIS_DC_SUCCESS;
//char* pos = ptr;
//SMessageType& msgtype = *((SMessageType*) pos);
//PutIE(ABIS_LK_IE_MSG_TYPE, 1, (char*)&msgtype);
ret = ABIS_DC_ERROR_INVLID;
}
break;
case RLLMM:
ret = RLLMMDecoder(pos, len-(pos-ptr));
break;
case DCMM:
ret = DCMMDecoder(pos, len-(pos-ptr));
break;
case CCMM:
ret = CCMMDecoder(pos, len-(pos-ptr));
break;
case TRXMM:
ret = TRXMMDecoder(pos, len-(pos-ptr));
break;
case LSM:
ret = LSMDecoder(pos, len-(pos-ptr));
break;
}
//--------------------------------------------
return ret;
}
int CAbisPdu::RLLMMDecoder(char* ptr, UINT16 len)
{
//printf("DCMMDecoder len = %d\n", len);
int ret = ABIS_DC_SUCCESS;
char* pos = ptr;
SMessageType& msgtype = *((SMessageType*) pos);
PutIE(ABIS_LK_IE_MSG_TYPE, 1, (char*)&msgtype);
pos += sizeof(SMessageType);
// 8 7 6 5 4 3 2 1 Message Reference
// 0 0 0 0 - - - - Radio Link Layer Managementmessages:
// 0 0 0 1 - DATAREQuest 8.3.1
// 0 0 1 0 - DATAINDication 8.3.2
// 0 0 1 1 - ERROR INDication 8.3.3
// 0 1 0 0 - ESTablish REQuest 8.3.4
// 0 1 0 1 - ESTablish CONFirm 8.3.5
// 0 1 1 0 - ESTablish INDication 8.3.6
// 0 1 1 1 - RELease REQuest 8.3.7
// 1 0 0 0 - RELease CONFirm 8.3.8
// 1 0 0 1 - RELease INDication 8.3.9
// 1 0 1 0 - UNIT DATAREQuest 8.3.10
// 1 0 1 1 - UNIT DATAINDication 8.3.11
#define DATA_REQUEST 1
#define DATA_INDICATION 2
#define ERROR_INDICATION 3
#define ESTABLISH_REQUEST 4
#define ESTABLISH_CONFIRM 5
#define ESTABLISH_INDICATION 6
#define RELEASE_REQUEST 7
#define RELEASE_CONFIRM 8
#define RELEASE_INDICATION 9
#define UNIT_DATA_REQUEST 10
#define UNIT_DATA_INDICATION 11
switch(msgtype.TYPE)
{
default:
ret = ABIS_DC_ERROR_INVLID;
break;
case DATA_REQUEST :
ret = DataReqDecoder(pos, len-(pos-ptr));
break;
case DATA_INDICATION :
ret = DataIndDecoder(pos, len-(pos-ptr));
break;
case ERROR_INDICATION:
ret = ErrorIndDecoder(pos, len-(pos-ptr));
break;
case ESTABLISH_REQUEST:
ret = EstablishReqDecoder(pos, len-(pos-ptr));
break;
case ESTABLISH_CONFIRM:
ret = EstablishCnfrmDecoder(pos, len-(pos-ptr));
break;
case ESTABLISH_INDICATION:
ret = EstablishIndDecoder(pos, len-(pos-ptr));
break;
case RELEASE_REQUEST:
ret = ReleaseReqDecoder(pos, len-(pos-ptr));
break;
case RELEASE_CONFIRM:
ret = ReleaseCnfrmDecoder(pos, len-(pos-ptr));
break;
case RELEASE_INDICATION:
ret = ReleaseIndDecoder(pos, len-(pos-ptr));
break;
case UNIT_DATA_REQUEST:
ret = UnitDataReqDecoder(pos, len-(pos-ptr));
break;
case UNIT_DATA_INDICATION:
ret = UnitDataIndDecoder(pos, len-(pos-ptr));
break;
}
return ret;
}
/*
001----- DedicatedChannelManagementmessages:
00001 -CHANnelACTIVation 8.4.1
00010 -CHANnelACTIVationACKnowledge 8.4.2
00011 -CHANnelACTIVationNegativeACK 8.4.3
00100 -CONNection FAILure 8.4.4
00101 -DEACTIVATESACCH 8.4.5
00110 -ENCRyptionCoMmanD 8.4.6
00111 -HANDOver DETection 8.4.7
01000 -MEASurementRESult 8.4.8
01001 -MODEMODIFYREQuest 8.4.9
01010 -MODEMODIFYACKnowledge 8.4.10
01011 -MODEMODIFYNegativeACKnowledge 8.4.11
01100 -PHYsicalCONTEXTREQuest 8.4.12
01101 -PHYsicalCONTEXTCONFirm 8.4.13
01110 -RFCHANnelRELease 8.4.14
01111 -MSPOWERCONTROL 8.4.15
10000 -BSPOWERCONTROL 8.4.16
10001 -PREPROCessCONFIGure 8.4.17
10010 -PREPROCessedMEASurementRESult 8.4.18
10011 -RFCHANnelRELeaseACKnowledge 8.4.19
10100 -SACCHINFOMODIFY 8.4.20
10101 -TALKERDETection 8.4.21
10110 -LISTENERDETection 8.4.22
10111 -REMOTECODECCONFigurationREPort 8.4.23
11000 -RoundTripDelayREPort 8.4.24
11001 -PRE-HANDOver NOTIFication 8.4.25
11010 -MultiRate CODEC MODification REQest 8.4.26
11011 -MultiRate CODEC MOD ACKnowledge 8.4.27
11100 -MultiRate CODEC MOD Negative ACKnowledge 8.4.28
11101 -MultiRate CODEC MOD PERformed 8.4.29
11110 -TFOREPort 8.4.30
11111 -TFOMODificationREQuest 8.4.31
*/
#define CHANNEL_ACTIVATION 33
#define CHANNEL_ACTIVATION_ACKNOWLEDGE 34
#define CHANNEL_ACTIVATION_NEGATIVE_ACKNOWLEDGE 35
#define CONNECTION_FAILURE_INDICATION 36
#define DEACTIVATE_SACCH 37
#define ENCRYPTION_COMMOND 38
#define HANDOVER_DETECTION 39
#define MEASUREMENT_RESULT 40
#define MODE_MODIFY 41
#define MODE_MODIFY_ACKNOWLEDGE 42
#define MODE_MODIFY_NEGATIVE_ACKNOWLEDGE 43
#define PHYSICAL_CONTEXT_REQUEST 44
#define PHYSICAL_CONTEXT_CONFIRM 45
#define RF_CHANNEL_RELEASE 46
#define MS_POWER_CONTROL 47
#define BS_POWER_CONTROL 48
#define PREPROCESS_CONFIGURE 49
#define PREPROCESSED_MEASUREMENT_RESULT 50
#define RF_CHANNEL_RELEASE_ACKNOWLEDGE 51
#define SACCH_INFO_MODIFY 52
#define TALKER_DETECTION 53
#define LISTENER_DETECTION 54
#define REMOTE_CODEC_CONFIGURATION_REPORT 55
#define ROUND_TRIP_DELAY_REPORT 56
#define PRE_HANDOVER_NOTIFICATION 57
#define MULTIRATE_CODEC_MODIFICATION_REQUEST 58
#define MULTIRATE_CODEC_MODIFICATION_ACKNOLEWDGE 59
#define MULTIRATE_CODEC_MODIFICATION_NEGATIVE_ACKNOWLEDGE 60
#define MULTIRATE_CODEC_MODIFICATION_PERFORMED 61
#define TFO_REPORT 62
#define TFO_MODIFICATION_REQUEST 63
int CAbisPdu::DCMMDecoder(char* ptr, UINT16 len)
{
//printf("DCMMDecoder len = %d\n", len);
int ret = ABIS_DC_SUCCESS;
char* pos = ptr;
SMessageType& msgtype = *((SMessageType*) pos);
UINT8 msgtypelen = sizeof(SMessageType);
PutIE(ABIS_LK_IE_MSG_TYPE, 1, (char*)&msgtype);
pos += msgtypelen;
if(len < (pos-ptr))
return ABIS_DC_ERROR_SHORT;
switch(msgtype.TYPE)
{
default:
ret = ABIS_DC_ERROR_INVLID;
break;
case CHANNEL_ACTIVATION:
ret = ChannelActvDecoder(pos, len-(pos-ptr));
break;
case CHANNEL_ACTIVATION_ACKNOWLEDGE:
break;
case CHANNEL_ACTIVATION_NEGATIVE_ACKNOWLEDGE:
break;
case CONNECTION_FAILURE_INDICATION:
break;
case DEACTIVATE_SACCH:
break;
case ENCRYPTION_COMMOND:
break;
case HANDOVER_DETECTION:
break;
case MEASUREMENT_RESULT:
ret = MeasurementRetDecoder(pos, len-(pos-ptr));
break;
case MODE_MODIFY:
break;
case MODE_MODIFY_ACKNOWLEDGE:
break;
case MODE_MODIFY_NEGATIVE_ACKNOWLEDGE:
break;
case PHYSICAL_CONTEXT_REQUEST:
break;
case PHYSICAL_CONTEXT_CONFIRM:
break;
case RF_CHANNEL_RELEASE:
break;
case MS_POWER_CONTROL:
break;
case BS_POWER_CONTROL:
break;
case PREPROCESS_CONFIGURE:
break;
case PREPROCESSED_MEASUREMENT_RESULT:
ret = PreprocessedMeasurementRetDeocder(pos, len-(pos-ptr));
break;
case RF_CHANNEL_RELEASE_ACKNOWLEDGE:
break;
case SACCH_INFO_MODIFY:
ret = SacchInfoModifyDecoder(pos, len-(pos-ptr));
break;
case TALKER_DETECTION:
break;
case LISTENER_DETECTION:
break;
case REMOTE_CODEC_CONFIGURATION_REPORT:
break;
case ROUND_TRIP_DELAY_REPORT:
break;
case PRE_HANDOVER_NOTIFICATION:
break;
case MULTIRATE_CODEC_MODIFICATION_REQUEST:
break;
case MULTIRATE_CODEC_MODIFICATION_ACKNOLEWDGE:
break;
case MULTIRATE_CODEC_MODIFICATION_NEGATIVE_ACKNOWLEDGE:
break;
case MULTIRATE_CODEC_MODIFICATION_PERFORMED:
break;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?