📄 sccpdispgsm.cpp
字号:
*dispbuf++=dfldno+2;
*dispbuf++=paralen;
UDTlen-=paralen;
for(c=0;c<paralen;c++) *dispbuf++=*(recbuf+c);
*dispbuf++=0xcc;
displen+=paralen+3;
}//indefinite format
else //short or long format
{if((*recbuf&0x80)==0)//short length
{*dispbuf++=dfldno+1;
*dispbuf++=1;
paralen=*dispbuf++=*recbuf++;
*dispbuf++=8;
*dispbuf++=paralen;
*dispbuf++=0xcc;
displen+=6;
UDTlen--;
}//short length
else if((*recbuf&0x7f)!=0)//long format
{*dispbuf++=dfldno+1;
*dispbuf++=2;
*dispbuf++=*recbuf++;
paralen=*dispbuf++=*recbuf++;
*dispbuf++=8;
*dispbuf++=paralen;
*dispbuf++=0xcc;
displen+=7;
UDTlen-=2;
}//long format
UDTlen-=paralen;
if(paralen!=0)
{*dispbuf++=dfldno+2;
*dispbuf++=paralen;
for(c=0;c<paralen;c++) *dispbuf++=*(recbuf+c);
*dispbuf++=0xcc;
displen+=paralen+3;
}
}//else:short or long format
recbuf+=lenfmt*2;
}
void procDIALOGPARTdisp(BYTE dfldno)
{ BYTE lenfmt=0;
BYTE paralen,len,c,*bufbak;
//Dialog Part tag code:8bits
bytedisp(dfldno)
UDTlen--;
//Dialog Part length
lenfmt+=procTCLENGTHdisp(dfldno+1);
//External Tag code:8bits
bytedisp(dfldno+2)
UDTlen--;
//External Tag length
if(*recbuf==0x80)//indefinite format
{
//process indefinite format length
*dispbuf++=dfldno+3;
*dispbuf++=1;
*dispbuf++=*recbuf;
*dispbuf++=8;
*dispbuf++=*recbuf++;
*dispbuf++=0xcc;
displen+=6;
UDTlen--;
lenfmt++;
//process External Tag content
paralen=0;
len=*(recbuf+1);//get sub-len
bufbak=recbuf;
while(*(WORD *)recbuf!=0) //EOC tag
{if(*(recbuf+1)==0x80)//sub len is indefinite format
{lenfmt++; recbuf+=2; paralen+=2; UDTlen -= 2;}
else
{if ((*(recbuf+1)&0x80)==0x80) //long format
{recbuf++; paralen++; UDTlen--;}
len=*(recbuf+1);
recbuf+=2;
UDTlen -= 2;
paralen+=2;
recbuf+=len;
paralen+=len;
}//else
}//while
//process tag content
recbuf=bufbak;
*dispbuf++=dfldno+4;
*dispbuf++=paralen;
for(c=0;c<paralen;c++) *dispbuf++=*recbuf++;
UDTlen -= paralen;
*dispbuf++=0xcc;
displen+=paralen+3;
}//indefinite format
else //short or long format
{if((*recbuf&0x80)==0)//short length
{*dispbuf++=dfldno+3;
*dispbuf++=1;
paralen=*dispbuf++=*recbuf++;
*dispbuf++=8;
*dispbuf++=paralen;
*dispbuf++=0xcc;
displen+=6;
UDTlen--;
}//short length
else if((*recbuf&0x7f)!=0)//long format
{*dispbuf++=dfldno+3;
*dispbuf++=2;
*dispbuf++=*recbuf++;
paralen=*dispbuf++=*recbuf++;
*dispbuf++=8;
*dispbuf++=paralen;
*dispbuf++=0xcc;
displen+=7;
UDTlen -= 2;
}//long format
//process tag content
if(paralen!=0)
{*dispbuf++=dfldno+4;
*dispbuf++=paralen;
for(c=0;c<paralen;c++) *dispbuf++=*recbuf++;
*dispbuf++=0xcc;
UDTlen -= paralen;
displen+=paralen+3;
}
}//else:short or long format
recbuf+=lenfmt*2;
UDTlen -= lenfmt*2;
}
BYTE *pSS7MSGSTART;
void procUDTDATACDMADisp();
void procUDTDATACDMADisp()
{
#if 1
BYTE c;
int len;
//DATA length:8bits
*dispbuf++=0x22;
*dispbuf++=1;
UDTlen=*dispbuf++=*recbuf++;
*dispbuf++=8;
*dispbuf++=UDTlen;
*dispbuf++=0xcc;
//DATA content
*dispbuf++=DATAFIELDNO;
*dispbuf++=UDTlen;
for(c=0;c<UDTlen;c++) *dispbuf++=*(recbuf+c);
*dispbuf++=0xcc;
displen +=UDTlen+9;
#endif
// len=GoThoughSINGLEMsg(pSS7MSGSTART,dispbuf);
displen+=len;
dispbuf+=len;
}
void procUDTDATADisp(BYTE dfldno,BYTE up)
{ BYTE c,tag,lenfmt;
//DATA length:8bits
*dispbuf++=dfldno;
*dispbuf++=1;
UDTlen=*dispbuf++=*recbuf++;
*dispbuf++=8;
*dispbuf++=UDTlen;
*dispbuf++=0xcc;
//DATA content
*dispbuf++=DATAFIELDNO;
*dispbuf++=UDTlen;
for(c=0;c<UDTlen;c++) *dispbuf++=*(recbuf+c);
*dispbuf++=0xcc;
displen +=UDTlen+9;
if(up==0x01)//SCMG
{
//SCMG Message Type Code:8bits
bytedisp(0x41)
//SSN Reflected:8bits
bytedisp(0x42)
//DPC Reflected:24bits
proc3byte(0x43)
//subsystem mixed indicator:2bits,D1-D0
*dispbuf++=0x44;
*dispbuf++=1;
*dispbuf++=*recbuf;
*dispbuf++=2;
*dispbuf++=(*recbuf++)<<6;
*dispbuf++=0xcc;
displen += 6;
}//SCMG
else//TCAP
{
//TCAP MT tag code:8bits
tag=*recbuf; //get MT tag
//add by 2000.09.02 by LHG
if(tag!=0x61 && tag!=0x62 && tag!=0x64 && tag!=0x65 && tag!=0x67)
return;
bytedisp(DATAFIELDNO+1)
UDTlen--;
//Total message length
lenfmt=procTCLENGTHdisp(DATAFIELDNO+2);
dfldno=DATAFIELDNO+2;
switch(tag)
{
case 0x61: //Unidirectional
case 0x62: //Begin
case 0x64: //End
case 0x65: //Continue
if (tag==0x65)
//OTID(Continue) tag,M
{procPRIMITIVEIEDdisp(dfldno);dfldno+=3;}
//OTID(Begin)/DTID(Continue & End),M
if(tag!=0x61)
{procPRIMITIVEIEDdisp(dfldno);
if(UDTlen<=(lenfmt*2)) {recbuf+=lenfmt*2; UDTlen -=lenfmt*2; break;}
}
//Dialog Part,O
if(*recbuf==0x6b)//exist Dialog Part tag code
{dfldno=DIALODPARTFIELDNO;
procDIALOGPARTdisp(dfldno);
if (UDTlen<=(lenfmt*2)) {recbuf+=lenfmt*2; UDTlen -=lenfmt*2; break;}
}//exist Dialog Part tag code
if(*recbuf==0x6c)//exist Component Part
{dfldno=COMPONENTPARTFIELDNO;
//Component Part,M(Unidirectional);other is O
//Component Part tag code:8bits
bytedisp(dfldno)
UDTlen--;
dfldno++;
//Component Part length
lenfmt+=procTCLENGTHdisp(dfldno);
//process component
while(UDTlen>(lenfmt*2))
{if(*recbuf==0xa1)//Invoke component tag
procINVOKEdisp(COMPONENTTAGFIELDNO,up);
else if(*recbuf==0xa2)//Return result component tag
procRETURNRESULTdisp(COMPONENTTAGFIELDNO,up);
else if(*recbuf==0xa3)//Return error component tag
procRETURNERRdisp(COMPONENTTAGFIELDNO,up);
else if (*recbuf==0xa4)//Reject component tag
procREJECTdisp(COMPONENTTAGFIELDNO);
else if(*recbuf==0xa7)//Return result(not last)
procRETURNRESULTdisp(COMPONENTTAGFIELDNO,up);
else UDTlen=0;
if(UDTlen > lenfmt*2) //add by 2000.06.12
{
recbuf+=lenfmt*2;
UDTlen -= lenfmt*2;
}
}
}//exist Component Part
break;
case 0x67: //Abort
//OTID tag,M,primitive
procPRIMITIVEIEDdisp(dfldno);
//P-Abort Case tag,O,primitive
if (*recbuf==0x4a)//exist P-Abort Case tag
procPRIMITIVEIEDdisp(dfldno);
if (*recbuf==0x6b)//exist Dialog Part
procDIALOGPARTdisp(DIALODPARTFIELDNO);
recbuf+=lenfmt*2;
break;
default:break;
}//switch(tag)
}//TCAP
}
void procSCCPADDRDisp(BYTE dfldno,BYTE b24)
{ BYTE len,oddeven,code,c;
WORD temp16;
//ADDR Length:8bits
len=*recbuf; //get addr information length
bytedisp(dfldno)
// proc8bitsdisp(dfldno);
//ADDR Indicator(SP:D0;SSN:D1;GT:D5-D2;ROUTE:D6;SPARE:D7)
// proc8bitsdisp(dfldno+1);
code=*recbuf; //get ADDR Indicator
bytedisp(dfldno+1)
len--;
if(code&0x01) /*exist DPC*/
if(b24!=0) /*DPC is24bits*/
{proc24bitsdisp(dfldno+2);
len-=3;
}/*DPC is24bits*/
else/*DPC is 14bits*/
{*dispbuf++ = dfldno+2;
*dispbuf++ = 2;
temp16=*(WORD *)dispbuf=*(WORD *)recbuf;
dispbuf+=2;
recbuf+=2;
*dispbuf++ = 14;
temp16&=0x3fff;
*dispbuf++=HIBYTE(temp16);
*dispbuf++=LOBYTE(temp16);
*dispbuf++=0xcc;
displen+=8;
len-=2;
}//DPC is 14bits
if (len==0) return;
if(code&0x02)//exist SSN
{//proc8bitsdisp(dfldno+3);
SCCPSSN=*recbuf;
bytedisp(dfldno+3)
len--;
}//exist SSN
if(len==0) return;
code&=0x3c;
switch(code)
{
case 0x04://GT1
//Nature of Addr Indicator:8bits
oddeven=(*recbuf)&0x80;
// proc8bitsdisp(dfldno+6);
bytedisp(dfldno+6)
len--;
break;
case 0x08://GT2
//Translation Type:8bits
// proc8bitsdisp(dfldno+6);
bytedisp(dfldno+6)
len--;
break;
case 0x0c://GT3
case 0x10://GT4
//Translation Type:8bits
//proc8bitsdisp(dfldno+4);
bytedisp(dfldno+4)
//numbering plan(4bits:D7-D4);encoding scheme(4bits:D3-D0)
*dispbuf++=dfldno+5;
*dispbuf++=1;
oddeven=*dispbuf++=*recbuf;
oddeven&=0x0f;
*dispbuf++=4;
*dispbuf++=oddeven<<4;
*dispbuf++=0xcc;
*dispbuf++=dfldno+6;
*dispbuf++=0;
*dispbuf++=4;
*dispbuf++=(*recbuf++)&0xf0;
*dispbuf++=0xcc;
displen+=11;
len-=2;
//ADDR Information Indicator:8bits
if (code==0x10)
{//proc8bitsdisp(dfldno+7);
bytedisp(dfldno+7)
len--;
}
break;
default:break;
}//switch(code)
*dispbuf++=dfldno+8;
*dispbuf++=len;
for(c=0;c<len;c++) *dispbuf++=*(recbuf+c);
if(oddeven==0 || oddeven==0x02)//even
{*dispbuf++=len*8;
for(c=0;c<len;c++)
{*dispbuf++=(*recbuf>>4)|(*recbuf<<4); recbuf++;}
}//even
else//odd
{*dispbuf++=len*8-4;
for (c=0;c<len-1;c++)
{*dispbuf++=(*recbuf>>4)|(*recbuf<<4); recbuf++;}
*dispbuf++=*recbuf<<4; recbuf++;
}//odd
*dispbuf++=0xcc;
displen+=len*2+4;
}
void procSCCPDATADisp(BYTE dfldno)
{ BYTE len,c;
/*DATA length:8bits*/
*dispbuf++=dfldno;
*dispbuf++=1;
len=*dispbuf++=*recbuf++;
*dispbuf++=8;
*dispbuf++=len;
*dispbuf++=0xcc;
/*DATA content*/
*dispbuf++=DATAFIELDNO;
*dispbuf++=len;
for(c=0;c<len;c++) *dispbuf++=*recbuf++;
*dispbuf++=0xcc;
displen+=len+9;
}
void procUDTdata(BYTE dfldno,BYTE ssn,BYTE is24bits)
{ BYTE c;
#if 1 //and by aiming
BOOL bCDMAMSG=FALSE;
BYTE *pTEMP=recbuf;
//if(*pTEMP<=0X80)
{
pTEMP++;
}//else
{
// pTEMP+=2;
}
if((*pTEMP!=0x00)&&(*pTEMP!=0x61)&&(*pTEMP!=0x62)&&(*pTEMP!=0x63)&&(*pTEMP!=0x64)&&(*pTEMP!=0x65))
{
bCDMAMSG=TRUE;
}
if (bCDMAMSG)
{
procUDTDATACDMADisp(); //CDMAMSG
}else
#endif
if(ssn==0x01 && SCCPSSN==0x01) procUDTDATADisp(dfldno,1); //SCMG
else if (ssn==CAPTAG && SCCPSSN==CAPTAG)
procUDTDATADisp(dfldno,5); //CAP
else if (ssn>0x05&&ssn<0x0b&&SCCPSSN>0x05&&SCCPSSN<0x0b)
procUDTDATADisp(dfldno,6); //MAP
else if (ssn==0x0c||SCCPSSN==0x0c||ssn==0xf0||SCCPSSN==0xf0||ssn==0xf2||SCCPSSN==0xf2||ssn==0xf3||SCCPSSN==0xf3
|| (is24bits==1 && (ssn==0xfe||SCCPSSN==0xfe)) ) //update by 2000.07.21 LHG
procUDTDATADisp(dfldno,0x0c); //INAP
else if (ssn==0xfe||SCCPSSN==0xfe)//GSMA
{//DATA length:8bits
*dispbuf++=dfldno;
*dispbuf++=1;
UDTlen=*dispbuf++=*recbuf++;
*dispbuf++=8;
*dispbuf++=UDTlen;
*dispbuf++=0xcc;
//DATA content
*dispbuf++=DATAFIELDNO;
*dispbuf++=UDTlen;
for(c=0;c<UDTlen;c++) *dispbuf++=*(recbuf+c);
*dispbuf++=0xcc;
displen +=UDTlen+9;
#if MultiTS
procGSMAdisp();
#endif
}//GSMA
else procUDTDATADisp(dfldno,0x0f); //other
}
void procSCCPdisp(WORD slen)
{
BYTE temp1,is24bits,code,dfldno;
BYTE *bufbak,ssn;
//process SIO
temp1 = *recbuf; /*get SIO*/
proc8bitsdisp(6);
slen--;
// if((Version&0x01)==0) return;
//process DPC/OPC/SLC
temp1 &= 0xf0; /*get SSF*/
if (temp1==0xc0 && slen>5) /*DPC/OPC is 14bits*/
{procDPCOPCSLC14disp();
slen -= 4;
is24bits=0;
}/*DPC/OPC is 14bits*/
else if (temp1!=0xc0 && slen>8) /*DPC/OPC is 24bits*/
{
/*process dpc:24bits*/
proc24bitsdisp(7); /*display fld:7*/
/*process opc:24bits*/
proc24bitsdisp(8); /*display fld:8*/
/*process slc:D3-D0,4bits*/
*dispbuf++ = 9; /*display fld:9*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -