⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gbptl.cpp

📁 GB接口数据解译程序
💻 CPP
📖 第 1 页 / 共 4 页
字号:
			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 + -