📄 gbptl.cpp
字号:
{
case BVCIIE:
ptr=SaveIE(ptr,IE_NS_BVCI,len-(ptr-p));
if(!ptr)
goto END;
break;
case PDUINERROR:
ptr=SaveIE(ptr,IE_BSSGP_PDU_IN_ERROR,len-(ptr-p));
default:
goto END;
}
}
END:
AssembleLeng=ptr-Frame;
return CGBPdu_SUCCESS;
}
char CGBPdu::SGSNINVOKETRACEDecode(UINT8 *ptr, UINT16 len)
{
UINT8*p=ptr;
if(TRACETYPE!=*ptr)
return CGBPdu_ERROR_INVLID;
ptr=SaveIE(ptr,IE_BSSGP_TRACE_TYPE,len-(ptr-p));
if(!ptr)
return CGBPdu_ERROR_SHORT;
if(TRACEREFERENCE!=*ptr)
return CGBPdu_ERROR_INVLID;
ptr=SaveIE(ptr,IE_BSSGP_TRACE_REFERENCE,len-(ptr-p));
if(!ptr)
return CGBPdu_ERROR_SHORT;
UINT8 i=4;
while(i--)
{
if(LENGTH)
goto END;
switch(*ptr)
{
case TRIGGERID:
ptr=SaveIE(ptr,IE_BSSGP_TRIGGER_ID,len-(ptr-p));
if(!ptr)
goto END;
break;
case MOBILEID:
ptr=SaveIE(ptr,IE_BSSGP_MOBILE_ID,len-(ptr-p));
if(!ptr)
goto END;
break;
case OMCID:
ptr=SaveIE(ptr,IE_BSSGP_OMC_ID,len-(ptr-p));
if(!ptr)
goto END;
break;
case TRANSACTIONID:
ptr=SaveIE(ptr,IE_BSSGP_TRANSACTIONID,len-(ptr-p));
default:
goto END;
}
}
END:
AssembleLeng=ptr-Frame;
return CGBPdu_SUCCESS;
}
char CGBPdu::DOWNLOADBSSPFCDecode(UINT8 *ptr, UINT16 len)
{
UINT8*p=ptr;
if(TLLI!=*ptr)
return CGBPdu_ERROR_INVLID;
ptr=SaveIE(ptr,IE_BSSGP_CUR_TLLI,len-(ptr-p));
if(!ptr)
return CGBPdu_ERROR_SHORT;
if(PFI!=*ptr)
return CGBPdu_ERROR_INVLID;
ptr=SaveIE(ptr,IE_BSSGP_PFI,len-(ptr-p));
if(!ptr)
return CGBPdu_ERROR_SHORT;
AssembleLeng=ptr-Frame;
return CGBPdu_SUCCESS;
}
char CGBPdu::CREATEBSSPFCDecode(UINT8 *ptr, UINT16 len)
{
UINT8*p=ptr;
if(TLLI!=*ptr)
return CGBPdu_ERROR_INVLID;
ptr=SaveIE(ptr,IE_BSSGP_CUR_TLLI,len-(ptr-p));
if(!ptr)
return CGBPdu_ERROR_SHORT;
if(IMSI==*ptr)
ptr=SaveIE(ptr,IE_BSSGP_IMSI,len-(ptr-p));
if(!ptr)
return CGBPdu_ERROR_SHORT;
if(PFI!=*ptr)
return CGBPdu_ERROR_INVLID;
ptr=SaveIE(ptr,IE_BSSGP_PFI,len-(ptr-p));
if(!ptr)
return CGBPdu_ERROR_SHORT;
if(PFT!=*ptr)
return CGBPdu_ERROR_INVLID;
ptr=SaveIE(ptr,IE_BSSGP_PFT,len-(ptr-p));
if(!ptr)
return CGBPdu_ERROR_SHORT;
if(ABQP!=*ptr)
return CGBPdu_ERROR_INVLID;
ptr=SaveIE(ptr,IE_BSSGP_AGGREGATE_BSS_QOS_PROFILE,len-(ptr-p));
if(!ptr)
return CGBPdu_ERROR_SHORT;
if(SERVICEUTRANCCO==*ptr)
ptr=SaveIE(ptr,IE_BSSGP_CELL_CHANGE_ORDER,len-(ptr-p));
AssembleLeng=ptr-Frame;
return CGBPdu_SUCCESS;
}
char CGBPdu::CREATEBSSPFCACKDecode(UINT8 *ptr, UINT16 len)
{
UINT8*p=ptr;
if(TLLI!=*ptr)
return CGBPdu_ERROR_INVLID;
ptr=SaveIE(ptr,IE_BSSGP_CUR_TLLI,len-(ptr-p));
if(!ptr)
return CGBPdu_ERROR_SHORT;
if(PFI!=*ptr)
ptr=SaveIE(ptr,IE_BSSGP_PFI,len-(ptr-p));
if(!ptr)
return CGBPdu_ERROR_SHORT;
if(ABQP!=*ptr)
return CGBPdu_ERROR_INVLID;
ptr=SaveIE(ptr,IE_BSSGP_AGGREGATE_BSS_QOS_PROFILE,len-(ptr-p));
if(!ptr)
return CGBPdu_ERROR_SHORT;
AssembleLeng=ptr-Frame;
return CGBPdu_SUCCESS;
}
char CGBPdu::CREATEBSSPFCNACKDecode(UINT8 *ptr, UINT16 len)
{
UINT8*p=ptr;
if(TLLI!=*ptr)
return CGBPdu_ERROR_INVLID;
ptr=SaveIE(ptr,IE_BSSGP_CUR_TLLI,len-(ptr-p));
if(!ptr)
return CGBPdu_ERROR_SHORT;
if(PFI!=*ptr)
ptr=SaveIE(ptr,IE_BSSGP_PFI,len-(ptr-p));
if(!ptr)
return CGBPdu_ERROR_SHORT;
if(NS_CAUSE!=*ptr)
return CGBPdu_ERROR_INVLID;
ptr=SaveIE(ptr,IE_BSSGP_CAUSE,len-(ptr-p));
if(!ptr)
return CGBPdu_ERROR_SHORT;
AssembleLeng=ptr-Frame;
return CGBPdu_SUCCESS;
}
char CGBPdu::MODIFYBSSPFCDecode(UINT8 *ptr, UINT16 len)
{
UINT8*p=ptr;
if(TLLI!=*ptr)
return CGBPdu_ERROR_INVLID;
ptr=SaveIE(ptr,IE_BSSGP_CUR_TLLI,len-(ptr-p));
if(!ptr)
return CGBPdu_ERROR_SHORT;
if(PFI!=*ptr)
return CGBPdu_ERROR_INVLID;
ptr=SaveIE(ptr,IE_BSSGP_PFI,len-(ptr-p));
if(!ptr)
return CGBPdu_ERROR_SHORT;
if(ABQP!=*ptr)
return CGBPdu_ERROR_INVLID;
ptr=SaveIE(ptr,IE_BSSGP_AGGREGATE_BSS_QOS_PROFILE,len-(ptr-p));
if(!ptr)
return CGBPdu_ERROR_SHORT;
AssembleLeng=ptr-Frame;
return CGBPdu_SUCCESS;
}
char CGBPdu::MODIFYBSSPFCACKDecode(UINT8 *ptr, UINT16 len)
{
UINT8*p=ptr;
if(TLLI!=*ptr)
return CGBPdu_ERROR_INVLID;
ptr=SaveIE(ptr,IE_BSSGP_CUR_TLLI,len-(ptr-p));
if(!ptr)
return CGBPdu_ERROR_SHORT;
if(PFI!=*ptr)
return CGBPdu_ERROR_INVLID;
ptr=SaveIE(ptr,IE_BSSGP_PFI,len-(ptr-p));
if(!ptr)
return CGBPdu_ERROR_SHORT;
if(PFT!=*ptr)
return CGBPdu_ERROR_INVLID;
ptr=SaveIE(ptr,IE_BSSGP_PFT,len-(ptr-p));
if(!ptr)
return CGBPdu_ERROR_SHORT;
if(ABQP!=*ptr)
return CGBPdu_ERROR_INVLID;
ptr=SaveIE(ptr,IE_BSSGP_AGGREGATE_BSS_QOS_PROFILE,len-(ptr-p));
if(!ptr)
return CGBPdu_ERROR_SHORT;
AssembleLeng=ptr-Frame;
return CGBPdu_SUCCESS;
}
char CGBPdu::DELETEBSSPFCDecode(UINT8 *ptr, UINT16 len)
{
UINT8*p=ptr;
if(TLLI!=*ptr)
return CGBPdu_ERROR_INVLID;
ptr=SaveIE(ptr,IE_BSSGP_CUR_TLLI,len-(ptr-p));
if(!ptr)
return CGBPdu_ERROR_SHORT;
if(PFI!=*ptr)
return CGBPdu_ERROR_INVLID;
ptr=SaveIE(ptr,IE_BSSGP_PFI,len-(ptr-p));
if(!ptr)
return CGBPdu_ERROR_SHORT;
AssembleLeng=ptr-Frame;
return CGBPdu_SUCCESS;
}
char CGBPdu::DELETEBSSPFCACKDecode(UINT8 *ptr, UINT16 len)
{
UINT8*p=ptr;
if(TLLI!=*ptr)
return CGBPdu_ERROR_INVLID;
ptr=SaveIE(ptr,IE_BSSGP_CUR_TLLI,len-(ptr-p));
if(!ptr)
return CGBPdu_ERROR_SHORT;
if(PFI!=*ptr)
return CGBPdu_ERROR_INVLID;
ptr=SaveIE(ptr,IE_BSSGP_PFI,len-(ptr-p));
if(!ptr)
return CGBPdu_ERROR_SHORT;
AssembleLeng=ptr-Frame;
return CGBPdu_SUCCESS;
}
char CGBPdu::LLCDecode(UINT8 *ptr, UINT16 len)
{
if(len<2)
return CGBPdu_ERROR_SHORT;
UINT8 temp=(*ptr)&15;
PutIE(IE_LLC_SAP,1,&temp);
lpllc=(LPSLLC)ptr;
if(lpllc->PD) //The PD bit indicates whether a frame is an LLC
return CGBPdu_PROTOCOL_ERROR; // frame or belongs to a different protocol. LLC frames
char r=CGBPdu_ERROR_INVLID; //shall have the PD bit set to 0. If a frame with the PD bit set to 1 is
switch(lpllc->Gprs) //received, then it shall be treated as an invalid frame,
{ //see subclause 5.8.
case LLGMM:
switch(lpllc->UiFormatH)
{
case UIFORMAT:
r=GMMDecode(ptr+sizeof(SLLC),len-sizeof(SLLC));
break;
case UFORMAT:
r=CGBPdu_LLGMM_UFRMAT;
break;
}
break;
case LLSMS://短信业务
case LL11:
case LL3:
case LL5:
case LL9://这里就是用户数据SNDC PDU
case TOM8:
case TOM2:
PutIE(IE_LAYER3_USER_DATE,FrameLen,Frame);
r=CGBPdu_SUCCESS;
break;
}
return r;
}
/*
lpGmm->PD
4 3 2 1
0 0 1 1 Call Control; call related SS messages
0 1 0 1 MobilityManagement messages for non-GPRS services
0 1 1 0 Radio Resource management messages
1 0 0 0 MobilityManagement messages for GPRS services
1 0 1 0 Session Management messages
*/
char CGBPdu::GMMDecode(UINT8 *ptr, UINT16 len)
{
char r=CGBPdu_ERROR_NULL;
lpGmm=(LPGMMSM)ptr;
if(len<4)
return CGBPdu_LLGMM;
switch(lpGmm->PD)
{
case 0x05://MobilityManagement messages for non-GPRS services
case 0x08://MobilityManagement messages for GPRS services
case 0x0a://Session Management messages
r=MobilityManagement(ptr,len);
break;
}
return r;
}
char CGBPdu::MobilityManagement(UINT8 *ptr, UINT16 len)
{
char r=CGBPdu_ERROR_NULL;
lpGmm=(LPGMMSM)ptr;
PutIE(IE_LLC_GMML_TYPE,1,&lpGmm->Type);
switch(lpGmm->Type)
{
case ATTACHREQUEST://附着请求
r=AttachRequest(ptr+2,len-2);
break;
case ATTACHACCEPT://附着接受
r=AttachAccept(ptr+2,len-2);
break;
case ATTACHCOMPLETE://附 着完成
r=AttachComplete(ptr+2,len-2);
break;
case ATTACHREJECT://附着拒绝
r=AttachReject(ptr+2,len-2);
break;
case DETACHREQUEST://分离请求
r=DetachRequest(ptr+2,len-2);
break;
case DETACHACCEPT://分离接受
r=DetachAccept(ptr+2,len-2);
break;
case ROUTINGAREAUPDATEREQUEST://路由更新
r=RoutingAreaUpdateRequest(ptr+2,len-2);
break;
case ROUTINGAREAUPDATEACCEPT://路由更新接受
r=RoutingareaUpdateAccept(ptr+2,len-2);
break;
case ROUTINGAREAUPDATEREJECT://路由更新拒绝
r=RoutingAreaUpdateReject(ptr+2,len-2);
break;
case ROUTINGAREAUPDATECOMPLETE://路由更新完成
r=RoutingAreaUpdateComplete(ptr+2,len-2);
break;
case AUTHENTICATIONANDCIPHERINGREQ://鉴权请求
r=AuthentiCationandCipheringreq(ptr+2,len-2);
break;
case AUTHENTICATIONANDCIPHERINGRESP://鉴权响应
r=AuthenticationAndCipheringreSp(ptr+2,len-2);
break;
case AUTHENTICATIONANDCIPHERINGREJ://鉴权拒绝
r=AuthenticationAndCipheringRej(ptr+2,len-2);
break;
case ACTIVATEPDPCONTEXTREQUEST://激活PDP上下文
r=ActivatePDPContextRequest(ptr+2,len-2);
break;
case ACTIVATEPDPCONTEXTACCEPT://激活PDP上下文接受
r=ActivatePDPContextAccept(ptr+2,len-2);
break;
case ACTIVATEPDPCONTEXTREJECT://激活PDP上下文拒绝
r=ActivatePDPContextReject(ptr+2,len-2);
break;
case MODIFYPDPCONTEXTREQUEST://Modify PDP context request
r=ModifyPDPcontextrequest(ptr+2,len-2);
break;
case MODIFYPDPCONTEXTACCEPT://Modify PDP context accept
r=ModifyPDPcontextaccept(ptr+2,len-2);
break;
case DEACTIVATEPDPCONTEXTREQUEST://Deactivate PDP context request
r=DeactivatePDPcontextrequest(ptr+2,len-2);
break;
case DEACTIVATEPDPCONTEXTACCEPT://Deactivate PDP context accept
r=DeactivatePDPcontextaccept(ptr+2,len-2);
break;
case ACTIVATEAAPDPCONTEXTREQUEST://Activate AA PDP context request
r=ActivateAAPDPcontextrequest(ptr+2,len-2);
break;
case ACTIVATEAAPDPCONTEXTACCEPT://Activate AA PDP context accept
r=ActivateAAPDPcontextaccept(ptr+2,len-2);
break;
case ACTIVATEAAPDPCONTEXTREJECT://Activate AA PDP context reject
r=ActivateAAPDPContextreject(ptr+2,len-2);
break;
case P_TMSIREALLOCATIONCOMMAND:
r=P_TMSIRealloCationCommand(ptr+2,len-2);
break;
case P_TMSIREALLOCATIONCOMPLETE:
r=P_TMSIReallocationComplete(ptr+2,len-2);
break;
case REQUEST_PDP_CONTEXT_ACTIVATION_REJ:
r=RequestPdpContextActivationRej(ptr+2,len-2);
break;
case GMM_STATUS:
r=GMMStatus(ptr+2,len-2);
break;
case IDENTITYRESPONSE:
case IDENTITYREQUEST:
case GMMINFORMATION:
case SMSTATUS:
r=CGBPdu_SUCCESS;
break;
}
return r;
}
char CGBPdu::AttachRequest(UINT8 *ptr, UINT16 len)
{
UINT8*p=ptr;
char r=CGBPdu_SUCCESS;
ptr=SaveLVIE(IE_LAYER3_MS_NETWORK_CAPABILITY,ptr,len);
PutIE(IE_LAYER3_TYPE,1,ptr++);
PutIE(IE_LAYER3_DRX_PARAMETER,2,ptr);
ptr=SaveLVIE(IE_LAYER3_PTMSI_IMSI,ptr+2,len-(ptr-p));
PutIE(IE_LAYER3_OLD_ROUTING_AERA_IDENTIFICATION,6,ptr);
ptr=SaveLVIE(IE_LAYER3_MS_RADIO_ACCESS_CAPABILITY,ptr+6,len-(ptr-p));
for(int i=0;i<3;i++)
{
if(LENGTH)
return CGBPdu_SUCCESS;
switch(*ptr)
{
case LLCOPTS://19 Old P-TMSI signature P-TMSI signature
PutIE(IE_LAYER3_OLD_PTMSI_SIGNATURE,3,++ptr);
ptr+=3;
break;
case LLCRRT://17 Requested READY timer value GPRS Timer
PutIE(IE_LAYER3_REQUESTED_READY_TIMER_VALUE,1,++ptr);
ptr++;
default:
if((*ptr&0xf0)==0x70)
{
PutIE(IE_LAYER3_TMSI_STATUS,1,ptr++);
break;
}
i=0xfe;
break;
}
}
return r;
}
/*
10.5.2.19 L2 Pseudo Length
The L2 Pseudo Length information element indicates the number of octets following it in the message which are to be
interpreted in the scope of the phase 1 protocol, i.e. the total number of octets (excluding the Rest Octets) for which T,
V, TV, LV, or TLV formatting is used (reference Table 11.1/GSM 04.07).
The L2 Pseudo Length information element is the first part of e.g. SYSTEM INFORMATION messages which are
mentioned as exceptions in section 10.1. It occupies the first octet of such messages.
For any of the SYSTEM INFORMATION messages sent on the BCCH, a mobile station should ignore the contents of
the L2 Pseudo Length value contained in the L2 Pseudo Length information element. For some specific messages,
further requirements are specified in section 9.
The L2 Pseudo Length Information element is an element with 2 octets length:
*/
UINT8 *CGBPdu::SaveLVIE(UINT8 ID,UINT8 *ptr,UINT16 len)
{
// if(!(*ptr&0x80))
// {
unsigned char len1=((unsigned char)(*ptr))&0x7f;
PutIE(ID,len1,++ptr);
ptr+=len1;
// }
// else
// {
// short len1=(*ptr<<8)+(*ptr+1);
// PutIE(ID,len1,ptr+2);
// ptr+=len1+2;
// }
return ptr;
}
char CGBPdu::AttachAccept(UINT8 *ptr, UINT16 len)
{
UINT8*p=ptr;
PutIE(IE_LAYER3_ATTACH_RESULT,1,ptr++);
PutIE(IE_LAYER3_PERIODIC_RA_UPDATE_TIMER,1,ptr++);
PutIE(IE_LAYER3_RADIO_PRIORITY_FOR_SMS,1,ptr++);
PutIE(IE_LAYER3_OLD_ROUTING_AERA_IDENTIFICATION,6,ptr);
ptr+=6;
for(int i=0;i<5;i++)
{
if(LENGTH)
return CGBPdu_SUCCESS;
switch(*ptr)
{
case LLCOPTS://19 P-TMSI signature
PutIE(IE_LAYER3_OLD_PTMSI_SIGNATURE,3,++ptr);
ptr+=3;
break;
case LLCRRT://17 Negotiated READY timer GPRS Timer
PutIE(IE_LAYER3_REQUESTED_READY_TIMER_VALUE,1,++ptr);
ptr++;
break;
case LLCAPT://18 Allocated P-TMSI Mobile identity
ptr=SaveIE(ptr,IE_LAYER3_ALLOCATED_PTMSI,len-(ptr-p));
if(!ptr)
return CGBPdu_SUCCESS;
break;
case LLCMSIDENTITY: //23 MS identity
ptr=SaveIE(ptr,IE_LAYER3_MS_IDENTITY,len-(ptr-p));
if(!ptr)
return CGBPdu_SUCCESS;
break;
case 0x2a://GPRS time
ptr=SaveIE(ptr,IE_LAYER3_GPRS_TIME,len-(ptr-p));
if(!ptr)
return CGBPdu_SUCCESS;
break;
case 0x4a://plmn list
ptr=SaveIE(ptr,IE_LAYER3_PLMN_LIST,len-(ptr-p));
if(!ptr)
return CGBPdu_SUCCESS;
break;
case LLCGMMCAUSE://25 GMM cause
PutIE(IE_LAYER3_GMM_CAUSE,2,++ptr);
default:
i=0xfe;
break;
}
}
return CGBPdu_SUCCESS;
}
char CGBPdu::AttachComplete(UINT8 *ptr, UINT16 len)
{
return CGBPdu_SUCCESS;
}
char CGBPdu::AttachReject(UINT8 *ptr, UINT16 len)
{
PutIE(IE_LAYER3_GMM_CAUSE,1,ptr);
return CGBPdu_SUCCESS;
}
char CGBPdu::DetachRequest(UINT8 *ptr, UINT16 len)
{
PutIE(IE_LAYER3_DETACH_TYPE,1,ptr);
return CGBPdu_SUCCESS;
}
char CGBPdu::DetachAccept(UINT8 *ptr, UINT16 len)
{
switch(*pBSSGPMessage)
{
case DL_UNITDATA:
return CGBPdu_SUCCESS;
case UL_UNITDATA:
PutIE(IE_LAYER3_FORCE_TO_STANDBY_OR_SPARE_HALF_OCTET,1,ptr);
break;
}
return CGBPdu_SUCCESS;
}
char CGBPdu::P_TMSIRealloCationCommand(UINT8 *ptr, UINT16 len)
{
ptr=SaveLVIE(IE_LAYER3_ALLOCATED_PTMSI,ptr,len);
PutIE(IE_LAYER3_ROUTING_AREA_IDENTIFCATION,6,ptr);
PutIE(IE_LAYER3_FORCE_TO_STANDBY_OR_SPARE_HALF_OCTET,1,ptr+=6);
if(LLCOPTS==*ptr)
PutIE(IE_LAYER3_OLD_P_TMSI_SIGNATURE,3,++ptr);
return CGBPdu_SUCCESS;
}
char CGBPdu::P_TMSIReallocationComplete(UINT8 *ptr, UINT16 len)
{
return CGBPdu_SUCCESS;
}
char CGBPdu::AuthentiCationandCipheringreq(UINT8 *ptr, UINT16 len)
{
UINT8*p=ptr;
PutIE(IE_LAYER3_CIPHERING_ALGORITHM_OR_IMSEISV_REQUEST,1,ptr++);
PutIE(IE_LAYER3_FORCE_TO_STANDBY_OR_SPARE_HALF_OCTET,1,ptr++);
for(int i=0;i<2;i++)
{
if(LENGTH)
return CGBPdu_SUCCESS;
switch(*ptr)
{
case AUTHENTICATIONPARAMETERRAND://21 Authentication parameter RAND
PutIE(IE_LAYER3_AUTHENTICATIO_PARAMETER_RAND,16,++ptr);
ptr+=16;
break;
default:
{
CipheringKey *p=(CipheringKey*)ptr;//8 GPRS ciphering key sequence number
if(0x08==p->CipheringKeyIE)
PutIE(IE_LAYER3_CIPHERING_KEY_SEQUENCE_NUMBER,1,ptr++);
}
return CGBPdu_SUCCESS;
}
}
return CGBPdu_SUCCESS;
}
char CGBPdu::RoutingAreaUpdateRequest(UINT8 *ptr, UINT16 len)
{
UINT8*p=ptr;
PutIE(IE_LAYER3_TYPE,1,ptr++);
PutIE(IE_LAYER3_OLD_ROUTING_AERA_IDENTIFICATION,6,ptr);
ptr=SaveLVIE(IE_LAYER3_MS_RADIO_ACCESS_CAPABILITY,ptr+6,len-(ptr-p));
for(int i=0;i<5;i++)
{
if(LENGTH)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -