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 + -
显示快捷键?