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