📄 gbptl.cpp
字号:
return CGBPdu_SUCCESS;
switch(*ptr)
{
case LLCOPTS://19 Old P-TMSI signature
PutIE(IE_LAYER3_OLD_PTMSI_SIGNATURE,3,++ptr);
ptr+=3;
break;
case LLCRRT://0x17 Requested READY timer
PutIE(IE_LAYER3_REQUESTED_READY_TIMER_VALUE,1,++ptr);
ptr++;
break;
case DRXPARAMETER://27 DRX parameter
PutIE(IE_LAYER3_DRX_PARAMETER,2,++ptr);
ptr+=2;
break;
case MSNETWORKCAPABILITY://MS network capability
ptr=SaveIE(ptr,IE_LAYER3_MS_NETWORK_CAPABILITY,len-(ptr-p));
if(!ptr)
return CGBPdu_SUCCESS;
default:
if((*ptr&0xf0)==0x70)//9- P-TMSI
{
PutIE(IE_LAYER3_TMSI_STATUS,1,ptr++);
break;
}
i=0xfe;
break;
}
}
return CGBPdu_SUCCESS;
}
char CGBPdu::RoutingareaUpdateAccept(UINT8 *ptr, UINT16 len)
{
UINT8*p=ptr;
PutIE(IE_LAYER3_FORCE_TO_STANDBY_OR_SPARE_HALF_OCTET,1,ptr++);
PutIE(IE_LAYER3_PERIODIC_RA_UPDATE_TIME,1,ptr++);
PutIE(IE_LAYER3_ROUTING_AREA_IDENTIFCATION,6,ptr);
ptr+=6;
for(int i=0;i<6;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 LLCAPT://18 Allocated P-TMSI
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 LISTOFRECEIVEN_PDUNUMBERS://26 List of Receive N-PDU Numbers
ptr=SaveIE(ptr,IE_LAYER3_LIST_OF_RECEIVE_N_PDU_NUMBERS,len-(ptr-p));
if(!ptr)
return CGBPdu_SUCCESS;
break;
case LLCRRT://17 Negotiated READY timer value
PutIE(IE_LAYER3_GPRS_TIME,1,++ptr);
ptr++;
break;
case LLCGMMCAUSE://25 GMM cause
PutIE(IE_LAYER3_GMM_CAUSE,1,++ptr);
ptr++;
default:
i=0xfe;
break;
}
}
return CGBPdu_SUCCESS;
}
char CGBPdu::RoutingAreaUpdateReject(UINT8 *ptr, UINT16 len)
{
PutIE(IE_LAYER3_GMM_CAUSE,1,ptr++);
PutIE(IE_LAYER3_FORCE_TO_STANDBY_OR_SPARE_HALF_OCTET,1,ptr++);
return CGBPdu_SUCCESS;
}
char CGBPdu::RoutingAreaUpdateComplete(UINT8 *ptr, UINT16 len)
{
UINT8*p=ptr;
if(LISTOFRECEIVEN_PDUNUMBERS==*ptr)
ptr=SaveIE(ptr,IE_LAYER3_LIST_OF_RECEIVE_N_PDU_NUMBERS,len-(ptr-p));
return CGBPdu_SUCCESS;
}
char CGBPdu::AuthenticationAndCipheringreSp(UINT8 *ptr, UINT16 len)
{
UINT8*p=ptr;
PutIE(IE_LAYER3_FORCE_TO_STANDBY_OR_SPARE_HALF_OCTET,1,ptr++);
for(int i=0;i<3;i++)
{
if(LENGTH)
return CGBPdu_SUCCESS;
switch(*ptr)
{
case AUTHENTICATIONPARAMETERSRES://22 Authentication parameter Response
PutIE(IE_LAYER3_AUTHENTION_PARAMETER_SRES,4,++ptr);
ptr+=4;
break;
case LLCMSIDENTITY://23 IMEISV Mobile identity
ptr=SaveIE(ptr,IE_LAYER3_MS_IDENTITY,len-(ptr-p));
default:
i=0xfe;
}
}
return CGBPdu_SUCCESS;
}
char CGBPdu::AuthenticationAndCipheringRej(UINT8 *ptr, UINT16 len)
{
return CGBPdu_SUCCESS;
}
char CGBPdu::ActivatePDPContextRequest(UINT8 *ptr, UINT16 len)
{
UINT8*p=ptr;
switch(*pBSSGPMessage)
{
case UL_UNITDATA://MS----->NETWORK
{
PutIE(IE_LAYER3_REQUESTED_NSAPI,1,ptr++);
PutIE(IE_LAYER3_REQUSTED_LLC_SAPI,1,ptr++);
ptr=SaveLVIE(IE_LAYER3_REQUSTED_QOS_OR_NEW_QOS,ptr,len-(ptr-p));
ptr=SaveLVIE(IE_LAYER3_GPRS_TIME,ptr,len-(ptr-p));
for(int i=0;i<2;i++)
{
if(LENGTH)
return CGBPdu_SUCCESS;
switch(*ptr)
{
case LLCAPN:
ptr=SaveIE(ptr,IE_LAYER3_ACCESS_POINT_NAME,len-(ptr-p));
if(!ptr)
return CGBPdu_SUCCESS;
break;
case LLCPCO:
ptr=SaveIE(ptr,IE_LAYER3_PROTOCOL_CONFIGURATION_OPTIONS,len-(ptr-p));
default:
i=0xfe;
}
}
}
break;
case DL_UNITDATA://NETWORK----->MS
{
ptr=SaveLVIE(IE_LAYER3_REQUESTED_PDP_ADDRESS_AND_PDP_ADDRESS,ptr,len);
if(LLCAPN==*ptr)
ptr=SaveIE(ptr,IE_LAYER3_ACCESS_POINT_NAME,len-(ptr-p));
}
break;
}
return CGBPdu_SUCCESS;
}
char CGBPdu::ActivatePDPContextAccept(UINT8 *ptr, UINT16 len)
{
UINT8*p=ptr;
switch(*pBSSGPMessage)
{
case DL_UNITDATA:
{
PutIE(IE_LAYER3_NEGOTIATED_LLC_SAPI,1,ptr++);
ptr=SaveLVIE(IE_LAYER3_NEGOTIATED_QOS,ptr,len-1);
PutIE(IE_LAYER3_RADIO_PRIORITY_FOR_SMS,1,ptr++);
for(int i=0;i<2;i++)
{
if(LENGTH)
return CGBPdu_SUCCESS;
switch(*ptr)
{
case PDPADDRESS:
ptr=SaveIE(ptr,IE_LAYER3_REQUSTED_PDP_ADDRESS_AND_PDP_ADDRESS_OFFERED_PDP_ADDRESS,len-(ptr-p));
if(!ptr)
return CGBPdu_SUCCESS;
break;
case LLCPCO:
ptr=SaveIE(ptr,IE_LAYER3_PROTOCOL_CONFIGURATION_OPTIONS,len-(ptr-p));
if(!ptr)
return CGBPdu_SUCCESS;
break;
default:
i=0xfe;
}
}
}
break;
}
return CGBPdu_SUCCESS;
}
char CGBPdu::ActivatePDPContextReject(UINT8 *ptr, UINT16 len)
{
UINT8*p=ptr;
switch(*pBSSGPMessage)
{
case UL_UNITDATA://MS--->NETWORK
PutIE(IE_LAYER3_SM_CAUSE,1,ptr++);
if(LLCPCO==*ptr)
ptr=SaveIE(ptr,IE_LAYER3_PROTOCOL_CONFIGURATION_OPTIONS,len-(ptr-p));
if(!ptr)
return CGBPdu_SUCCESS;
break;
case DL_UNITDATA://NETWORK-->MS
PutIE(IE_LAYER3_SM_CAUSE,1,ptr++);
}
return CGBPdu_SUCCESS;
}
char CGBPdu::ModifyPDPcontextrequest(UINT8 *ptr, UINT16 len)
{
UINT8*p=ptr;
switch(*pBSSGPMessage)
{
case DL_UNITDATA://NETWORK-->MS
{
PutIE(IE_LAYER3_RADIO_PRIORITY_FOR_SMS,1,ptr++);
PutIE(IE_LAYER3_REQUESTED_LLC_SAPI,1,ptr++);
ptr=SaveLVIE(IE_LAYER3_REQUSTED_QOS_OR_NEW_QOS,ptr,len-(ptr-ptr));
}
break;
case UL_UNITDATA://MS--->NETWORK
{
}
break;
}
return CGBPdu_SUCCESS;
}
char CGBPdu::ModifyPDPcontextaccept(UINT8 *ptr, UINT16 len)
{
switch(*pBSSGPMessage)
{
case DL_UNITDATA://NETWORK-->MS
{
}
break;
case UL_UNITDATA://MS--->NETWORK
break;
}
return CGBPdu_SUCCESS;
}
char CGBPdu::DeactivatePDPcontextrequest(UINT8 *ptr, UINT16 len)
{
switch(*pBSSGPMessage)
{
case DL_UNITDATA://NETWORK-->MS
case UL_UNITDATA://MS--->NETWORK
PutIE(IE_LAYER3_SM_CAUSE,1,ptr++);
break;
}
return CGBPdu_SUCCESS;
}
char CGBPdu::DeactivatePDPcontextaccept(UINT8 *ptr, UINT16 len)
{
switch(*pBSSGPMessage)
{
case DL_UNITDATA://NETWORK-->MS
case UL_UNITDATA://MS--->NETWORK
break;
}
return CGBPdu_SUCCESS;
}
char CGBPdu::ActivateAAPDPcontextrequest(UINT8 *ptr, UINT16 len)
{
UINT8*p=ptr;
switch(*pBSSGPMessage)
{
case DL_UNITDATA://NETWORK-->MS
{
}
break;
case UL_UNITDATA://MS--->NETWORK
{
PutIE(IE_LAYER3_REQUESTED_NSAPI,1,ptr++);
PutIE(IE_LAYER3_REQUESTED_LLC_SAPI,1,ptr++);
ptr=SaveLVIE(IE_LAYER3_REQUSTED_QOS_OR_NEW_QOS,ptr,len-(ptr-p));
ptr=SaveLVIE(IE_LAYER3_PACKET_DATA_PROTOCOL,ptr,len-(ptr-p));
for(int i=0;i<3;i++)
{
if(LENGTH)
return CGBPdu_SUCCESS;
switch(*ptr)
{
case LLCAPN:
ptr=SaveIE(ptr,IE_LAYER3_ACCESS_POINT_NAME,len-(ptr-p));
if(!ptr)
return CGBPdu_SUCCESS;
break;
case LLCPCO:
ptr=SaveIE(ptr,IE_LAYER3_PROTOCOL_CONFIGURATION_OPTIONS,len-(ptr-p));
if(!ptr)
return CGBPdu_SUCCESS;
break;
case GPRSTIME:
PutIE(IE_LAYER3_GPRS_TIME,1,ptr++);
default:
i=0xfe;
}
}
}
break;
}
return CGBPdu_SUCCESS;
}
char CGBPdu::ActivateAAPDPcontextaccept(UINT8 *ptr, UINT16 len)
{
UINT8*p=ptr;
switch(*pBSSGPMessage)
{
case DL_UNITDATA://NETWORK-->MS
{
PutIE(IE_LAYER3_REQUESTED_NSAPI,1,ptr++);
ptr=SaveLVIE(IE_LAYER3_NEGOTIATED_QOS,ptr,len-(ptr-p));
ptr=SaveLVIE(IE_LAYER3_ALLOCATED_PTMSI,ptr,len-(ptr-p));
ptr=SaveLVIE(IE_LAYER3_PACKET_DATA_PROTOCOL,ptr,len-(ptr-p));
PutIE(IE_LAYER3_RADIO_PRIORITY_FOR_SMS,1,ptr++);
for(int i=0;i<2;i++)
{
if(LENGTH)
return CGBPdu_SUCCESS;
switch(*ptr)
{
case LLCPCO:
ptr=SaveIE(ptr,IE_LAYER3_PROTOCOL_CONFIGURATION_OPTIONS,len-(ptr-p));
if(!ptr)
return CGBPdu_SUCCESS;
break;
case GPRSTIME:
PutIE(IE_LAYER3_GPRS_TIME,1,++ptr);
ptr+=1;
default:
i=0xfe;
}
}
}
break;
case UL_UNITDATA://MS--->NETWORK
break;
}
return CGBPdu_SUCCESS;
}
char CGBPdu::ActivateAAPDPContextreject(UINT8 *ptr, UINT16 len)
{
UINT8*p=ptr;
switch(*pBSSGPMessage)
{
case DL_UNITDATA://NETWORK-->MS
PutIE(IE_LAYER3_SM_CAUSE,1,ptr++);
if(LLCPCO==*ptr)
ptr=SaveIE(ptr,IE_LAYER3_PROTOCOL_CONFIGURATION_OPTIONS,len-(ptr-p));
if(!ptr)
return CGBPdu_SUCCESS;
break;
case UL_UNITDATA://MS--->NETWORK
break;
}
return CGBPdu_SUCCESS;
}
char CGBPdu::RequestPdpContextActivationRej(UINT8 *ptr, UINT16 len)
{
PutIE(IE_LAYER3_SM_CAUSE,1,ptr);
return CGBPdu_SUCCESS;
}
char CGBPdu::GMMStatus(UINT8 *ptr, UINT16 len)
{
PutIE(LLCGMMCAUSE,1,ptr);
return CGBPdu_SUCCESS;
}
//////////////////////////////////////////////////////////////////////
// Association Class
//////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
int ArrtCmp(char *a,char *b,unsigned long len)
{
while(len--)
{
if(*a!=*b)
return 0;
a++;
b++;
}
return 1;
}
Association::Association()
{
TempInfo=pInfo=(LPINFO)malloc(sizeof(INFO));
memset(TempInfo,0,sizeof(INFO));
pInfo->pCGBPdu=new CGBPdu;
}
Association::~Association()
{
LPINFO ptr=pInfo;
LPINFO lp;
while(ptr)
{
lp=ptr->Next;
if(ptr->pCGBPdu)
delete ptr->pCGBPdu;
delete ptr;
ptr=lp;
}
}
int Association::operator-=(CGBPdu* pCGBPdu)
{
LPINFO ptr=pInfo->Next;
CIeBase *pCGBPduTlli=pCGBPdu->GetIE(IE_BSSGP_CUR_TLLI);
CIeBase *pCGBPduOldTlli=pCGBPdu->GetIE(IE_BSSGP_OLD_TLLI);
pCGBPduOldTlli=pCGBPduOldTlli?pCGBPduOldTlli:pCGBPduTlli;
CIeBase *pCGBPduBvci=pCGBPdu->GetIE(IE_NS_BVCI);
if(!pCGBPduTlli||!pCGBPduBvci)
return 0;
while(ptr)
{
CIeBase *ptrTlli=ptr->pCGBPdu->GetIE(IE_BSSGP_CUR_TLLI);
CIeBase *ptrBvci=ptr->pCGBPdu->GetIE(IE_NS_BVCI);
if(ptrTlli&&ptrBvci)
{
if(COMPARE(ptrTlli->data,pCGBPduTlli->data)||COMPARE(pCGBPduOldTlli->data,ptrTlli->data)&&ptrBvci->data==pCGBPduBvci->data)
{
LPINFO p1=pInfo;
while(p1->Next!=ptr)
p1=p1->Next;
p1->Next=ptr->Next;
delete ptr->pCGBPdu;
free(ptr);
TempInfo=ASeekToEnd();
return 1;
}
}
ptr=ptr->Next;
}
return 0;
}
int Association::operator+=(CGBPdu* pCGBPdu)
{
CIeBase *pCGBPduTlli=pCGBPdu->GetIE(IE_BSSGP_CUR_TLLI);
CIeBase *pCGBPduOldTlli=pCGBPdu->GetIE(IE_BSSGP_OLD_TLLI);
pCGBPduOldTlli=pCGBPduOldTlli?pCGBPduOldTlli:pCGBPduTlli;
CIeBase *pCGBPduBvci=pCGBPdu->GetIE(IE_NS_BVCI);
if(!pCGBPduTlli||!pCGBPduBvci)
return 0;
TimeMaintenance();
LPINFO ptr=pInfo->Next;
while(ptr)
{
CIeBase *ptrTlli=ptr->pCGBPdu->GetIE(IE_BSSGP_CUR_TLLI);
CIeBase *ptrBvci=ptr->pCGBPdu->GetIE(IE_NS_BVCI);
if(ptrTlli&&ptrBvci)
{
if(COMPARE(ptrTlli->data,pCGBPduTlli->data)||COMPARE(pCGBPduOldTlli->data,ptrTlli->data)&&ptrBvci->data==pCGBPduBvci->data)
{
time(&ptr->BegTimer);
return 0;
}
}
ptr=ptr->Next;
}
TempInfo->Next=(LPINFO)malloc(sizeof(INFO));
if(!TempInfo->Next)
return 0;
memset(TempInfo->Next,0,sizeof(INFO));
TempInfo->Next->pCGBPdu=new CGBPdu;
if(!TempInfo->Next->pCGBPdu)
{
free(TempInfo->Next);
return 0;
}
TempInfo=TempInfo->Next;
for(int i=0;i<256;i++)
{
CIeBase *pCGBPduBase=pCGBPdu->GetIE(i);
if(!pCGBPduBase)
continue;
if(pCGBPduBase->len>4)
TempInfo->pCGBPdu->PutIE(i,pCGBPduBase->len,(UINT8*)pCGBPduBase->ptr);
else
TempInfo->pCGBPdu->PutIE(i,pCGBPduBase->len,(UINT8*)&pCGBPduBase->data);
}
time(&TempInfo->BegTimer);
TempInfo->Next=0;
return 0;
}
CGBPdu* Association::operator[](CGBPdu* pCGBPdu)
{
LPINFO ptr=pInfo->Next;
CIeBase *pCGBPduTlli=pCGBPdu->GetIE(IE_BSSGP_CUR_TLLI);
CIeBase *pCGBPduOldTlli=pCGBPdu->GetIE(IE_BSSGP_OLD_TLLI);
pCGBPduOldTlli=pCGBPduOldTlli?pCGBPduOldTlli:pCGBPduTlli;
CIeBase *pCGBPduBvci=pCGBPdu->GetIE(IE_NS_BVCI);
if(!pCGBPduTlli||!pCGBPduBvci)
return 0;
while(ptr)
{
CIeBase *ptrTlli=ptr->pCGBPdu->GetIE(IE_BSSGP_CUR_TLLI);
CIeBase *ptrBvci=ptr->pCGBPdu->GetIE(IE_NS_BVCI);
if(ptrTlli&&ptrBvci)
{
if(COMPARE(ptrTlli->data,pCGBPduTlli->data)||COMPARE(pCGBPduOldTlli->data,ptrTlli->data)&&ptrBvci->data==pCGBPduBvci->data)
{
time(&ptr->BegTimer);
return ptr->pCGBPdu;
}
}
ptr=ptr->Next;
}
return 0;
}
LPINFO Association::GetHead()
{
return pInfo;
}
CGBPdu* Association::operator=(CGBPdu* pCGBPdu)
{
LPINFO ptr=pInfo->Next;
CIeBase *pCGBPduTlli=pCGBPdu->GetIE(IE_BSSGP_CUR_TLLI);
CIeBase *pCGBPduOldTlli=pCGBPdu->GetIE(IE_BSSGP_OLD_TLLI);
pCGBPduOldTlli=pCGBPduOldTlli?pCGBPduOldTlli:pCGBPduTlli;
CIeBase *pCGBPduBvci=pCGBPdu->GetIE(IE_NS_BVCI);
if(!pCGBPduTlli||!pCGBPduBvci)
return 0;
while(ptr)
{
CIeBase *ptrTlli=ptr->pCGBPdu->GetIE(IE_BSSGP_CUR_TLLI);
CIeBase *ptrBvci=ptr->pCGBPdu->GetIE(IE_NS_BVCI);
if(ptrTlli&&ptrBvci)
{
if(COMPARE(ptrTlli->data,pCGBPduTlli->data)||COMPARE(pCGBPduOldTlli->data,ptrTlli->data)&&ptrBvci->data==pCGBPduBvci->data)
{
for(int i=0;i<MAX_IE;i++)
{
CIeBase *pCGBPduBase=pCGBPdu->GetIE(i);
if(!pCGBPduBase)
continue;
if(pCGBPduBase->len>4)
ptr->pCGBPdu->PutIE(i,pCGBPduBase->len,(UINT8*)pCGBPduBase->ptr);
else
ptr->pCGBPdu->PutIE(i,pCGBPduBase->len,(UINT8*)&pCGBPduBase->data);
}
time(&ptr->BegTimer);
return ptr->pCGBPdu;
}
}
ptr=ptr->Next;
}
return 0;
}
void Association::TimeMaintenance()
{
LPINFO ptr=pInfo->Next;
time_t Time;
time(&Time);
LPINFO temp=ptr;
while(ptr)
{
temp=ptr->Next;
if(Time-ptr->BegTimer>MAXTIME)
(*this)-=ptr->pCGBPdu;
ptr=temp;
}
}
LPINFO Association::ASeekToEnd()
{
LPINFO lp=pInfo;
while(lp->Next)
lp=lp->Next;
return lp;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -