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

📄 layer3infodecode.cpp

📁 ABis无线接口全套资料
💻 CPP
📖 第 1 页 / 共 5 页
字号:
	request_reference.t1 = msuBuf[offset++]&0xf8 >> 3;
	request_reference.t2 = msuBuf[offset]&0x1f;
	request_reference.t3_l = msuBuf[offset]&0xE0>>5;
	pdu.PutIE(LAYER3IINFO_IE_REQUEST_REFERENCE2, sizeof(SRequestReference), (char *)&request_reference);
	offset += sizeof(SRequestReference);

	wait_indication.t3122_timeout = msuBuf[offset];
	offset += sizeof(SWaitIndication);
	pdu.PutIE(LAYER3INFO_IE_WAIT_INDICATION2, sizeof(SWaitIndication), (char *)&wait_indication);

	memset(&request_reference, 0, sizeof(SRequestReference));
	request_reference.ra = msuBuf[offset++];
	request_reference.t3_h = msuBuf[offset] & 0x07;
	request_reference.t1 = msuBuf[offset++]&0xf8 >> 3;
	request_reference.t2 = msuBuf[offset]&0x1f;
	request_reference.t3_l = msuBuf[offset]&0xE0>>5;
	pdu.PutIE(LAYER3IINFO_IE_REQUEST_REFERENCE3, sizeof(SRequestReference), (char *)&request_reference);
	offset += sizeof(SRequestReference);

	wait_indication.t3122_timeout = msuBuf[offset];
	offset += sizeof(SWaitIndication);
	pdu.PutIE(LAYER3INFO_IE_WAIT_INDICATION3, sizeof(SWaitIndication), (char *)&wait_indication);

	memset(&request_reference, 0, sizeof(SRequestReference));
	request_reference.ra = msuBuf[offset++];
	request_reference.t3_h = msuBuf[offset] & 0x07;
	request_reference.t1 = msuBuf[offset++]&0xf8 >> 3;
	request_reference.t2 = msuBuf[offset]&0x1f;
	request_reference.t3_l = msuBuf[offset]&0xE0>>5;
	pdu.PutIE(LAYER3IINFO_IE_REQUEST_REFERENCE4, sizeof(SRequestReference), (char *)&request_reference);
	offset += sizeof(SRequestReference);

	wait_indication.t3122_timeout = msuBuf[offset];
	offset += sizeof(SWaitIndication);
	pdu.PutIE(LAYER3INFO_IE_WAIT_INDICATION4, sizeof(SWaitIndication), (char *)&wait_indication);

	//skip IAR Rest Octets

}



void layer3_immediate_measurement_report(unsigned char *msuBuf, short msu_len, CPduBase &pdu)
{
	unsigned char *pPdu = msuBuf;
	struct SMeasurementResult	measure_result;

	if((msuBuf == NULL) || (msu_len <= 0)){
		//Print("layer3_immediate_measurement_report:input parameter error!");
		return;
	}

	memset(&measure_result, 0, sizeof(SMeasurementResult));
	memcpy(&measure_result, pPdu, sizeof(SMeasurementResult));
	pdu.PutIE(LAYER3INFO_IE_MEASUREMENT_RESULT, sizeof(SMeasurementResult), (char *)&measure_result);

	{
		//Add for test code
		short linknumber = -1;
		int pcm = -1;
		int cell_id = -1;
		CIeBase  * pIe = NULL;
		unsigned char tei = 0;

		 pIe = pdu.GetIE(ABIS_LK_IE_LINKNUMBER);
	        if(pIe != NULL)
	        {

	            UINT32 data = pIe->GetIeData();

	            memcpy(&linknumber, (char *)&data, sizeof(short));
		     pcm = linknumber / 64;
	        }

		  pIe = pdu.GetIE(ABIS_LK_IE_ADDRESS);
		   if(pIe != NULL)
		   {
		        UINT32 data = pIe->GetIeData();
		        SAddressField addr = *((SAddressField*)&data);
		        tei = addr.TEI;
			cell_id = BtsTrx2Cell(pcm, tei-1);
			//printf("+++++ linknumber = %d,TEi = %d,SAPI = %d +++++\n",linknumber,tei,addr.SAPI);
		   }
		   msg_array[pcm][cell_id].mr++;
	}
}



void layer3_paging_request_type1(unsigned char *msuBuf, short msu_len, CPduBase &pdu)
{
	short offset = 0;
	unsigned char elmId = 0;
	unsigned char elmLen = 0;
	unsigned char msiInd = 0;
	unsigned char imsi[15];
	unsigned char imsi_len = 0;
	unsigned char tmsi_len = 0;
	unsigned char tmsi[4];
	unsigned char imei_len = 0;
	unsigned char imei[4];

	if((msuBuf == NULL) || (msu_len <= 0)){
		//Print("layer3_paging_request_type1:input parameter error!");
		return;
	}

	offset++; //skip page mode and channels needed for mobiles 1 and 2

	//Mobile Identity 1
	elmLen = msuBuf[offset++];
	msiInd = msuBuf[offset];
	if ((msiInd & 0x7) == 0x1) {
		// [:7] IMSI
		imsi_len = GetIMSITMSI(&msuBuf[offset], elmLen, imsi);
		pdu.PutIE(LAYER3INFO_IE_IMSI, imsi_len, (char *)imsi);
	}
	else if ((msiInd & 0x7) == 0x4)
	{
		// [:4] TMSI
		offset++;
		tmsi_len = elmLen -1;
		memcpy(tmsi, &msuBuf[offset], tmsi_len);
		pdu.PutIE(LAYER3INFO_IE_TMSI, tmsi_len, (char *)tmsi);
	}
	else if((msiInd & 0x7) == 0x2)
	{
		//IMEI
		imei_len = GetIMSITMSI(&msuBuf[offset], elmLen, imei);
		pdu.PutIE(LAYER3INFO_IE_IMEI, imei_len, (char *)imei);
	}
	offset += elmLen;

	elmId = msuBuf[offset];
	if(elmId == MOBILE_IDENTITY)
	{
		//存在可选参数
		//Mobile Identity 2
		elmLen = msuBuf[offset++];
		msiInd = msuBuf[offset];
		if ((msiInd & 0x7) == 0x1) {
			// [:7] IMSI
			imsi_len = GetIMSITMSI(&msuBuf[offset], elmLen, imsi);
			pdu.PutIE(LAYER3INFO_IE_IMSI2, imsi_len, (char *)imsi);
		}
		else if ((msiInd & 0x7) == 0x4)
		{
			// [:4] TMSI
			offset++;
			tmsi_len = elmLen -1;
			memcpy(tmsi, &msuBuf[offset], tmsi_len);
			pdu.PutIE(LAYER3INFO_IE_TMSI2, tmsi_len, (char *)tmsi);
		}
		else if((msiInd & 0x7) == 0x2)
		{
			//IMEI
			imei_len = GetIMSITMSI(&msuBuf[offset], elmLen, imei);
			pdu.PutIE(LAYER3INFO_IE_IMEI2, imei_len, (char *)imei);
		}
		offset += elmLen;
	}
}



void layer3_paging_request_type2(unsigned char *msuBuf, short msu_len, CPduBase &pdu)
{
	short offset = 0;
	unsigned char elmId = 0;
	unsigned char elmLen = 0;
	unsigned char msiInd = 0;
	unsigned char imsi[15];
	unsigned char imsi_len = 0;
	unsigned char tmsi_len = 0;
	unsigned char tmsi[4];
	unsigned char imei_len = 0;
	unsigned char imei[4];

	if((msuBuf == NULL) || (msu_len <= 0)){
		//Print("layer3_paging_request_type2:input parameter error!");
		return;
	}

	offset++; //skip page mode and channels needed for mobiles 1 and 2

	//Mobile Identity 1, TMSI
	tmsi_len = 4;
	memcpy(tmsi, &msuBuf[offset], tmsi_len);
	pdu.PutIE(LAYER3INFO_IE_TMSI, tmsi_len, (char *)tmsi);
	offset += tmsi_len;

	//Mobile Identity 2, TMSI
	tmsi_len = 4;
	memcpy(tmsi, &msuBuf[offset], tmsi_len);
	pdu.PutIE(LAYER3INFO_IE_TMSI2, tmsi_len, (char *)tmsi);
	offset += tmsi_len;


	elmId = msuBuf[offset];
	if(elmId == MOBILE_IDENTITY)
	{
		//存在可选参数
		//Mobile Identity 3
		elmLen = msuBuf[offset++];
		msiInd = msuBuf[offset];
		if ((msiInd & 0x7) == 0x1) {
			// [:7] IMSI
			imsi_len = GetIMSITMSI(&msuBuf[offset], elmLen, imsi);
			pdu.PutIE(LAYER3INFO_IE_IMSI3, imsi_len, (char *)imsi);
		}
		else if ((msiInd & 0x7) == 0x4)
		{
			// [:4] TMSI
			offset++;
			tmsi_len = elmLen -1;
			memcpy(tmsi, &msuBuf[offset], tmsi_len);
			pdu.PutIE(LAYER3INFO_IE_TMSI3, tmsi_len, (char *)tmsi);
		}
		else if((msiInd & 0x7) == 0x2)
		{
			//IMEI
			imei_len = GetIMSITMSI(&msuBuf[offset], elmLen, imei);
			pdu.PutIE(LAYER3INFO_IE_IMEI3, imei_len,(char *) imei);
		}
		offset += elmLen;
	}
}



void layer3_paging_request_type3(unsigned char *msuBuf, short msu_len, CPduBase &pdu)
{
	short offset = 0;
	unsigned char tmsi_len = 0;
	unsigned char tmsi[4];


	if((msuBuf == NULL) || (msu_len <= 0)){
		//Print("layer3_paging_request_type3:input parameter error!");
		return;
	}

	offset++; //skip page mode and channels needed for mobiles 1 and 2

	//Mobile Identity 1, TMSI
	tmsi_len = 4;
	memcpy(tmsi, &msuBuf[offset], tmsi_len);
	pdu.PutIE(LAYER3INFO_IE_TMSI, tmsi_len, (char *)tmsi);
	offset += tmsi_len;

	//Mobile Identity 2, TMSI
	tmsi_len = 4;
	memcpy(tmsi, &msuBuf[offset], tmsi_len);
	pdu.PutIE(LAYER3INFO_IE_TMSI2, tmsi_len, (char *)tmsi);
	offset += tmsi_len;

	//Mobile Identity 3, TMSI
	tmsi_len = 4;
	memcpy(tmsi, &msuBuf[offset], tmsi_len);
	pdu.PutIE(LAYER3INFO_IE_TMSI3, tmsi_len, (char *)tmsi);
	offset += tmsi_len;

	//Mobile Identity 4, TMSI
	tmsi_len = 4;
	memcpy(tmsi, &msuBuf[offset], tmsi_len);
	pdu.PutIE(LAYER3INFO_IE_TMSI4, tmsi_len, (char *)tmsi);
	offset += tmsi_len;
}



void layer3_paging_response(unsigned char *msuBuf, short msu_len, CPduBase &pdu)
{
	short offset = 0;
	unsigned char elmLen = 0;
	unsigned char msiInd = 0;
	unsigned char imsi[15];
	unsigned char imsi_len = 0;
	unsigned char tmsi_len = 0;
	unsigned char tmsi[4];
	unsigned char imei_len = 0;
	unsigned char imei[4];
	struct SMobileStationClassmark2 station_classmark2;

	if((msuBuf == NULL) || (msu_len <= 0)){
		//Print("layer3_paging_response:input parameter error!");
		return;
	}

	offset++; //skip ciphering key sequence number and spare half octet

	elmLen = msuBuf[offset++];
	memset(&station_classmark2, 0, sizeof(station_classmark2));
	station_classmark2.rf_power_capability = msuBuf[offset] & 0x07;
	station_classmark2.a5_1 =  msuBuf[offset] & 0x08 >> 3;
	station_classmark2.es_ind = msuBuf[offset] & 0x10 >> 4;
	station_classmark2.revision_level = msuBuf[offset++] & 0x60 >> 5;
	station_classmark2.fc =  msuBuf[offset]& 0x01;
	station_classmark2.vgcs = msuBuf[offset] & 0x02 >> 1;
	station_classmark2.vbs = msuBuf[offset] & 0x04 >> 2;
	station_classmark2.sm_capabi = msuBuf[offset]&0x08 >> 3;
	station_classmark2.ss_screen_indicator = msuBuf[offset]&0x30 >> 4;
	station_classmark2.ps_capa = msuBuf[offset++]&0x40 >>6;

	station_classmark2.a5_2 = msuBuf[offset] & 0x01;
	station_classmark2.a5_3 = msuBuf[offset] & 0x02 >> 1;
	station_classmark2.cm3 = msuBuf[offset++] & 0x80 >> 7;

	pdu.PutIE(LAYER3INFO_IE_MOBILE_STATION_CLASSMARK2, sizeof(SMobileStationClassmark2), (char *)&station_classmark2);

	//Mobile Identity
	elmLen = msuBuf[offset++];

	msiInd = msuBuf[offset];
	if ((msiInd & 0x7) == 0x1) {
		// [:7] IMSI
		imsi_len = GetIMSITMSI(&msuBuf[offset], elmLen, imsi);
		pdu.PutIE(LAYER3INFO_IE_IMSI, imsi_len, (char *)imsi);
	}
	else if ((msiInd & 0x7) == 0x4)
	{
		// [:4] TMSI
		offset++;
		tmsi_len = elmLen -1;
		memcpy(tmsi, &msuBuf[offset], tmsi_len);
		pdu.PutIE(LAYER3INFO_IE_TMSI, tmsi_len, (char *)tmsi);
	}
	else if((msiInd & 0x7) == 0x2)
	{
		//IMEI
		imei_len = GetIMSITMSI(&msuBuf[offset], elmLen, imei);
		pdu.PutIE(LAYER3INFO_IE_IMEI, imei_len, (char *)imei);
	}
}




void layer3_partial_release(unsigned char *msuBuf, short msu_len, CPduBase &pdu)
{
	short offset = 0;
	unsigned char *pPdu = msuBuf;

	if((msuBuf == NULL) || (msu_len <= 0)){
		//Print("layer2_partial_release:input parameter error!");
		return;
	}

	pdu.PutIE(LAYER3INFO_IE_CHANNEL_DESCRIPTION, sizeof(SChannelDescription), (char *)pPdu);
	offset += sizeof(SChannelDescription);
}



void layer3_physical_information(unsigned char *msuBuf, short msu_len, CPduBase &pdu)
{
	short offset = 0;
	struct STimingAdvance timing;

	if((msuBuf == NULL) || (msu_len <= 0)){
		//Print("layer3_physical_information:input parameter error!");
		return;
	}

	memset(&timing, 0, sizeof(STimingAdvance));
	timing.timing_advence_value = msuBuf[offset]&0x3F;
	pdu.PutIE(LAYER3INFO_IE_TIMING_ADVANCE, sizeof(STimingAdvance), (char *)&timing);
	offset += sizeof(STimingAdvance);
}



void layer3_rr_status(unsigned char *msuBuf, short msu_len, CPduBase &pdu)
{
	unsigned char *pPdu = msuBuf;

	if((msuBuf == NULL) || (msu_len <= 0)){
		//Print("layer3_rr_status:input parameter error!");
		return;
	}

	//RR cause
	pdu.PutIE(LAYER3INFO_IE_RR_CAUSE, sizeof(SRrCause), (char *)pPdu);
}


void layer3_system_information_type1(unsigned char *msuBuf, short msu_len, CPduBase &pdu)
{
	short offset = 0;
	unsigned char *pPdu = msuBuf;
	unsigned char elmLen = 0;
	struct SRachControlParameters rach_control;
	struct SSl1RestOctets sl_rest;

	if((msuBuf == NULL) || (msu_len <= 0)){
		//Print("layer3_system_information_type1:input parameter error!");
		return;
	}

	elmLen = 16;
	pdu.PutIE(LAYER3INFO_IE_CELL_CHANNEL_DESCRIPT, sizeof(SCellChannelDescrip), (char *)(pPdu+offset));
	offset += elmLen;

	memcpy(&rach_control, &msuBuf[offset], sizeof(SRachControlParameters));
	pdu.PutIE(LAYER3INFO_IE_RACH_CONTROL_PARAMETER, sizeof(SRachControlParameters), (char *)&rach_control);
	offset += sizeof(SRachControlParameters);

	//SI 1 Rest Octets
	memcpy(&sl_rest, &msuBuf[offset], sizeof(SSl1RestOctets));
	pdu.PutIE(LAYER3INFO_IE_SL1_REST_OCTETS, sizeof(SSl1RestOctets), (char *)&sl_rest);

}
/*
#pragma pack(1)
struct link_header
{
	UINT8	time_slot	: 5;
	UINT8	E1_num	: 3;
	UINT8	board_num : 	8;
};
struct link_info
{
	short linknum;
	short address_TEI;
	bool operator <(link_info const& _A) const
	{
		if(linknum<_A.linknum)  
		return true;
		else
		return false;
	}

};
class CCellInfo
{
	public:
	unsigned char l_cgi[28];
	unsigned char ba_bitmap0[124];
	struct SVBitFormat ba_vbit[111];
};
#pragma pack()
*/
unsigned char local_cgi [300][28];
unsigned char local_cgi_print [100][28];
int cgi_num = 2;
int print_num = 0;

⌨️ 快捷键说明

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