abisptl.cpp

来自「ABis无线接口全套资料」· C++ 代码 · 共 1,460 行 · 第 1/3 页

CPP
1,460
字号

        case TFO_REPORT:
        break;

        case TFO_MODIFICATION_REQUEST:
        break;
    }
    return ret;
}


/*
0 0 0 1 - - - - Common ChannelManagement/TRXManagementmessages:
0 0 0 1 - BCCH INFOrmation 8.5.1
0 0 1 0 - CCCH LOAD INDication 8.5.2
0 0 1 1 - CHANnel ReQuireD 8.5.3
0 1 0 0 - DELETE INDication 8.5.4
0 1 0 1 - PAGING CoMmanD 8.5.5
0 1 1 0 - IMMEDIATE ASSIGN COMMAND 8.5.6
0 1 1 1 - SMS BroadCast REQuest 8.5.7
1 0 0 1 - RF RESource INDication 8.6.1
1 0 1 0 - SACCH FILLing 8.6.2
1 0 1 1 - OVERLOAD 8.6.3
1 1 0 0 - ERROR REPORT 8.6.4
1 1 0 1 - SMS BroadCast CoMmanD 8.5.8
1 1 1 0 - CBCH LOAD INDication 8.5.9
1 1 1 1 - NOTification CoMmanD 8.5.10
*/
#define BCCH_INFORMATION            17
#define CCCH_LOAD_INDICATION        18
#define CHANNEL_REQUIRED            19
#define DELETE_INDICATION           20
#define PAGING_COMMAND              21
#define IMMEDIATE_ASSIGN_COMMAND    22
#define SMS_BROADCAST_REQUEST       23

#define RF_RESOURCE_INDICATION      25
#define SACCH_FILLING               26
#define OVERLOAD                    27
#define ERROR_REPORT                28
#define SMS_BROADCAST_COMMAND       29
#define CBCH_LOAD_INDICATION        30
#define NOTIFICATION_COMMAND        31

int CAbisPdu::CCMMDecoder(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 BCCH_INFORMATION:
        ret = BcchInfoDecoder(pos, len-(pos-ptr));
        break;

        case CCCH_LOAD_INDICATION:
        ret = CcchLoadIndDeoder(pos, len-(pos-ptr));
        break;

        case CHANNEL_REQUIRED:
        break;

        case DELETE_INDICATION:
        break;

        case PAGING_COMMAND:
        break;

        case IMMEDIATE_ASSIGN_COMMAND:
        break;

        case SMS_BROADCAST_REQUEST:
        break;

        case SMS_BROADCAST_COMMAND:
        break;

        case CBCH_LOAD_INDICATION:
        break;

        case NOTIFICATION_COMMAND:
        break;
    }
    return ret;
}

int CAbisPdu::TRXMMDecoder(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 RF_RESOURCE_INDICATION:
        break;

        case SACCH_FILLING:
        SacchFillingDecoder(pos, len-(pos-ptr));
        break;

        case OVERLOAD:
        break;

        case ERROR_REPORT:
        break;
    }
    return ret;
}

int CAbisPdu::LSMDecoder(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);

    return ret;
}



// Radio link layer management messages decoder
//------------------------------------------------------------------------------------------
int CAbisPdu::DataReqDecoder(char* ptr, UINT16 len)
{
    int ret = ABIS_DC_SUCCESS;
    char* pos = ptr;
    UINT8 channumlen = sizeof(SChannelNumber);
    UINT8 linkidlen = sizeof(SLinkIndetifier);

    pos += 1;
    ret = PutIE(ABIS_NT_IE_CHANNEL_NUMBER, (UINT8)channumlen, pos);
    pos += channumlen;

    pos += 1;
    ret = PutIE(ABIS_NT_IE_LINK_IDENTIFIER, (UINT8)linkidlen, pos);
    pos += linkidlen;

    //call l3 Information Decoder(pos, (len - (pos - ptr)));
    return ret;
}

int CAbisPdu::DataIndDecoder(char* ptr, UINT16 len)
{
    int ret = ABIS_DC_SUCCESS;
    char* pos = ptr;
    UINT8 channumlen = sizeof(SChannelNumber);
    UINT8 linkidlen = sizeof(SLinkIndetifier);

    pos += 1;
    ret = PutIE(ABIS_NT_IE_CHANNEL_NUMBER, (UINT8)channumlen, pos);
    pos += channumlen;

    pos += 1;
    ret = PutIE(ABIS_NT_IE_LINK_IDENTIFIER, (UINT8)linkidlen, pos);
    pos += linkidlen;

    //call l3 Information Decoder(pos, (len - (pos - ptr)));
    return ret;
}

int CAbisPdu::ErrorIndDecoder(char* ptr, UINT16 len)
{
    int ret = ABIS_DC_SUCCESS;
    char* pos = ptr;
    UINT8 channumlen = sizeof(SChannelNumber);
    UINT8 linkidlen = sizeof(SLinkIndetifier);

    pos += 1;
    ret = PutIE(ABIS_NT_IE_CHANNEL_NUMBER, (UINT8)channumlen, pos);
    pos += channumlen;

    pos += 1;
    ret = PutIE(ABIS_NT_IE_LINK_IDENTIFIER, (UINT8)linkidlen, pos);
    pos += linkidlen;

    SRLMCause& rlm = *((SRLMCause*) pos);
    UINT8 rlmlen;
    if(rlm.E == 1)
        rlmlen = 4;
    else
        rlmlen = 3;
    pos += 1;
    ret = PutIE(ABIS_NT_IE_RLM_CAUSE, rlmlen, pos);

    return ret;
}

int CAbisPdu::EstablishReqDecoder(char* ptr, UINT16 len)
{
    int ret = ABIS_DC_SUCCESS;
    char* pos = ptr;
    UINT8 channumlen = sizeof(SChannelNumber);
    UINT8 linkidlen = sizeof(SLinkIndetifier);

    pos += 1;
    ret = PutIE(ABIS_NT_IE_CHANNEL_NUMBER, (UINT8)channumlen, pos);
    pos += channumlen;

    pos += 1;
    ret = PutIE(ABIS_NT_IE_LINK_IDENTIFIER, (UINT8)linkidlen, pos);

    return ret;

}

int CAbisPdu::EstablishCnfrmDecoder(char* ptr, UINT16 len)
{
    int ret = ABIS_DC_SUCCESS;
    char* pos = ptr;
    UINT8 channumlen = sizeof(SChannelNumber);
    UINT8 linkidlen = sizeof(SLinkIndetifier);

    pos += 1;
    ret = PutIE(ABIS_NT_IE_CHANNEL_NUMBER, (UINT8)channumlen, pos);
    pos += channumlen;

    pos += 1;
    ret = PutIE(ABIS_NT_IE_LINK_IDENTIFIER, (UINT8)linkidlen, pos);

    return ret;

}

int CAbisPdu::EstablishIndDecoder(char* ptr, UINT16 len)
{
    int ret = ABIS_DC_SUCCESS;
    char* pos = ptr;
    UINT8 channumlen = sizeof(SChannelNumber);
    UINT8 linkidlen = sizeof(SLinkIndetifier);

    pos += 1;
    ret = PutIE(ABIS_NT_IE_CHANNEL_NUMBER, (UINT8)channumlen, pos);
    pos += channumlen;

    pos += 1;
    ret = PutIE(ABIS_NT_IE_LINK_IDENTIFIER, (UINT8)linkidlen, pos);

    // call layer3 ()
    return ret;
}

int CAbisPdu::ReleaseReqDecoder(char* ptr, UINT16 len)
{
    int ret = ABIS_DC_SUCCESS;
    char* pos = ptr;
    UINT8 channumlen = sizeof(SChannelNumber);
    UINT8 linkidlen = sizeof(SLinkIndetifier);

    pos += 1;
    ret = PutIE(ABIS_NT_IE_CHANNEL_NUMBER, (UINT8)channumlen, pos);
    pos += channumlen;

    pos += 1;
    ret = PutIE(ABIS_NT_IE_LINK_IDENTIFIER, (UINT8)linkidlen, pos);

    return ret;
}

int CAbisPdu::ReleaseCnfrmDecoder(char* ptr, UINT16 len)
{
    int ret = ABIS_DC_SUCCESS;
    char* pos = ptr;
    UINT8 channumlen = sizeof(SChannelNumber);
    UINT8 linkidlen = sizeof(SLinkIndetifier);

    pos += 1;
    ret = PutIE(ABIS_NT_IE_CHANNEL_NUMBER, (UINT8)channumlen, pos);
    pos += channumlen;

    pos += 1;
    ret = PutIE(ABIS_NT_IE_LINK_IDENTIFIER, (UINT8)linkidlen, pos);

    return ret;
}

int CAbisPdu::ReleaseIndDecoder(char* ptr, UINT16 len)
{
    int ret = ABIS_DC_SUCCESS;
    char* pos = ptr;
    UINT8 channumlen = sizeof(SChannelNumber);
    UINT8 linkidlen = sizeof(SLinkIndetifier);

    pos += 1;
    ret = PutIE(ABIS_NT_IE_CHANNEL_NUMBER, (UINT8)channumlen, pos);
    pos += channumlen;

    pos += 1;
    ret = PutIE(ABIS_NT_IE_LINK_IDENTIFIER, (UINT8)linkidlen, pos);

    return ret;
}

int CAbisPdu::UnitDataReqDecoder(char* ptr, UINT16 len)
{
    int ret = ABIS_DC_SUCCESS;
    char* pos = ptr;
    UINT8 channumlen = sizeof(SChannelNumber);
    UINT8 linkidlen = sizeof(SLinkIndetifier);

    pos += 1;
    ret = PutIE(ABIS_NT_IE_CHANNEL_NUMBER, (UINT8)channumlen, pos);
    pos += channumlen;

    pos += 1;
    ret = PutIE(ABIS_NT_IE_LINK_IDENTIFIER, (UINT8)linkidlen, pos);
    pos += linkidlen;

    // call l3 info handle()
    return ret;
}

int CAbisPdu::UnitDataIndDecoder(char* ptr, UINT16 len)
{
    int ret = ABIS_DC_SUCCESS;
    char* pos = ptr;
    UINT8 channumlen = sizeof(SChannelNumber);
    UINT8 linkidlen = sizeof(SLinkIndetifier);

    pos += 1;
    ret = PutIE(ABIS_NT_IE_CHANNEL_NUMBER, (UINT8)channumlen, pos);
    pos += channumlen;

    pos += 1;
    ret = PutIE(ABIS_NT_IE_LINK_IDENTIFIER, (UINT8)linkidlen, pos);
    pos += linkidlen;

    // call l3 info handle()
    return ret;
}
//------------------------------------------------------------------------------------------




// Dedicated cahnnel management messages decoder
//------------------------------------------------------------------------------------------
int CAbisPdu::ChannelActvDecoder(char* ptr, UINT16 len)
{
    int ret = ABIS_DC_SUCCESS;
    char* pos = ptr;
    UINT8 channumlen = sizeof(SChannelNumber);
    pos += 1;
    if(len < (pos-ptr)+channumlen)
        return ABIS_DC_ERROR_SHORT;
    ret = PutIE(ABIS_NT_IE_CHANNEL_NUMBER, (UINT8)channumlen, pos);
    pos += channumlen;

    UINT8 actvlen = sizeof(SActivationType);
    pos += 1;
    if(len < (pos-ptr)+actvlen)
        return ABIS_DC_ERROR_SHORT;
    ret = PutIE(ABIS_NT_IE_ACTIVATION_TYPE, (UINT8)actvlen, pos);
    pos += actvlen;

    UINT8 channelmodelen = *(pos+1);
    pos += 2;
    if(len < (pos-ptr)+channelmodelen)
        return ABIS_DC_ERROR_SHORT;
    ret = PutIE(ABIS_NT_IE_CHANNEL_MODE, (UINT8)channelmodelen, pos);
    pos += channelmodelen;


/// option
optional :
    if((pos-ptr) == len)
        return ret;
    if((pos-ptr) > len)
        return ABIS_DC_ERROR_INVLID;

    UINT8 eleID = *pos;

    switch(eleID)
    {
        default:
            return ABIS_DC_ERROR_INVLID;
            break;

        case ABIS_NT_IE_CHANNEL_IDENTIFICATION:
        {
            UINT8 length;
            length = *(pos+1);
            pos += 2;
            if(len < (pos-ptr)+length)
                return ABIS_DC_ERROR_SHORT;
            ret = PutIE(ABIS_NT_IE_CHANNEL_IDENTIFICATION, (UINT8)length, pos);
            pos += length;
        }
        break;

        case ABIS_NT_IE_ENCRYPTION_INFORMATION:
        {
            UINT8 length;
            length = *(pos+1);
            pos += 2;
            if(len < (pos-ptr)+length)
                return ABIS_DC_ERROR_SHORT;
            ret = PutIE(ABIS_NT_IE_ENCRYPTION_INFORMATION, (UINT8)length, pos);
            pos += length;
        }
        break;

        case ABIS_NT_IE_HANDOVER_REFERENCE:
        {
            UINT8 length = 1;
            pos += 1;
            if(len < (pos-ptr)+length)
                return ABIS_DC_ERROR_SHORT;
            ret = PutIE(ABIS_NT_IE_HANDOVER_REFERENCE, (UINT8)length, pos);
            pos += length;
        }
        break;

        case ABIS_NT_IE_BS_POWER:
        {
            UINT8 length = 1;
            pos += 1;
            if(len < (pos-ptr)+length)
                return ABIS_DC_ERROR_SHORT;
            ret = PutIE(ABIS_NT_IE_BS_POWER, (UINT8)length, pos);
            pos += length;
        }
        break;

        case ABIS_NT_IE_MS_POWER:
        {
            UINT8 length = 1;
            pos += 1;
            if(len < (pos-ptr)+length)
                return ABIS_DC_ERROR_SHORT;
            ret = PutIE(ABIS_NT_IE_MS_POWER, (UINT8)length, pos);
            pos += length;
        }
        break;

        case ABIS_NT_IE_TIMING_ADVANCE:
        {
            UINT8 length = 1;
            if(len < (pos-ptr)+length)
                return ABIS_DC_ERROR_SHORT;
            ret = PutIE(ABIS_NT_IE_TIMING_ADVANCE, (UINT8)length, pos);
            pos += length;
            pos += 1;
        }
        break;

        case ABIS_NT_IE_BS_POWER_PARAMETERS:
        {
            UINT8 length = *(pos+1);
            pos += 2;
            if(len < (pos-ptr)+length)
                return ABIS_DC_ERROR_SHORT;
            ret = PutIE(ABIS_NT_IE_BS_POWER_PARAMETERS, (UINT8)length, pos);
            pos += length;
        }
        break;

        case ABIS_NT_IE_MS_POWER_PARAMETERS:
        {
            UINT8 length = *(pos+1);
            pos += 2;
            if(len < (pos-ptr)+length)

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?