📄 layer3infodecode.cpp
字号:
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 + -