📄 svisupcri.cpp
字号:
#include "stdafx.h"
#define NOPASS 0
#define PASS 0xff
#define BYTEOFPVAR 3
extern BYTE BUFSETMEM[];
extern BYTE compare(BYTE *code,BYTE *crit,BYTE floh);
extern BYTE compareaddr(BYTE *msg,BYTE *crit);
extern BYTE comparespcode(BYTE *msg,BYTE *crit);
extern BYTE compareDPC14(BYTE *msg,BYTE *crit);
extern BYTE compareOPC14(BYTE *msg,BYTE *crit);
BYTE compareISUPaddr(BYTE *msg,BYTE *crit,BYTE noa)
{BYTE startbit,bitlen,c,temp;
BYTE code[10];
startbit=*crit++;
bitlen=*crit++; //crit-->logic sign
if(noa<(startbit+bitlen)) return NOPASS;
msg += startbit/8;
startbit %=8;
if(startbit!=0) //startbit=0
{
for (c=0;c<bitlen/8;c++)
{temp=*msg; temp&= 0xf0; code[c]=temp>>4;
temp=*msg++; temp&=0x0f; code[c] |=temp<<4;
}
if((bitlen%8)!=0)
{temp=*msg; temp &= 0xf0; code[c]=temp;}
} //startbit=0
else //startbit=4
{
for (c=0;c<bitlen/8;c++)
{temp=*msg; temp &= 0xf0; code[c]=temp>>4;
temp=(*msg++)&0x0f; code[c] |=temp<<4;
}
if((bitlen%8)!=0)
{temp=*msg++; temp &= 0x0f; code[c]=temp<<4;}
}//startbit=4
return (compare(&code[0],crit,0));
}
BYTE ISUPmesscri14(BYTE *bmsg,BYTE *crit)
{
BYTE selecth1h0=0;
BYTE fldno,numofbyte,varno,head,li;
BYTE stat,code,*msg,cic[2];
WORD temp;
do{
fldno = *crit++;
numofbyte=*(crit+3);
if(fldno<=11)
{switch (fldno)
{
case 7://DPC
msg=bmsg;
if (numofbyte==0)//compare with var
{varno = (*(crit+4))*BYTEOFPVAR;stat=PASS;
if (BUFSETMEM[varno]!=*msg
||BUFSETMEM[varno+1]!=(*(msg+1)&0x3f) )
stat=NOPASS;
crit +=5; //crit-->OR(F7)/AND(F8)/CC
}
else //compare with criteria
{stat=compareDPC14(msg,crit);
if (*(crit+2)==0xf5) numofbyte *=2;//logical sign
crit += 4+numofbyte;//crit-->OR(F7)/AND(F8)/CC
}
break;
case 8://OPC
msg=bmsg+1;
if(numofbyte==0)//compare with var
{varno = (*(crit+4))*BYTEOFPVAR;stat=PASS;
if( BUFSETMEM[varno]!=(*msg&0xc0)
||BUFSETMEM[varno+1]!=*(msg+1)
||BUFSETMEM[varno+2]!=(*(msg+2)&0x0f) )
stat=NOPASS;
crit +=5; //crit-->OR/AND/0xaa
}
else //compare with criteria
{stat=compareOPC14(msg,crit);
if (*(crit+2)==0xf5) numofbyte *=2;//logical sign
crit += 4+numofbyte;//crit-->OR(F7)/AND(F8)/CC
}
break;
case 9://SLS
msg=bmsg+4; //msg-->sls
if (numofbyte==0)//compare with var
{varno = (*(crit+4))*BYTEOFPVAR;stat=PASS;
if (BUFSETMEM[varno]!=(*msg&0xf0)) stat=NOPASS;
crit +=5; //crit-->OR/AND/0xaa
}
else //compare with criteria
{code=*(bmsg+3)&0xf0; code=code>>4;
stat=compare(&code,crit+2,0);
if (*(crit+2)==0xf5) numofbyte *=2;//logical sign
crit += 4+numofbyte;//crit-->OR(F7)/AND(F8)/CC
}
break;
case 10: //CIC
stat=NOPASS;
msg=bmsg+4; //msg-->cic
if (numofbyte==0)//compare with var
{varno = (*(crit+4))*BYTEOFPVAR;stat=PASS;
if ((BUFSETMEM[varno]!=*msg)
||(BUFSETMEM[varno+1]!= ((*(msg+1))&0x0f)) )
{stat=NOPASS;break;}
crit +=5; //crit-->OR/AND/0xaa
}
else //compare with criteria
{temp=*(WORD *)msg;
cic[0]=LOBYTE(temp);cic[1]=HIBYTE(temp);
stat=compare(&cic[0],crit+2,0);
if (*(crit+2)==0xf5) numofbyte *=2;//logical sign
crit += 4+numofbyte;//crit-->OR(F7)/AND(F8)/CC
}
break;
case 11: //MT
selecth1h0=0xff;
head=code=*(bmsg+6);
stat=compare(&code,crit+2,0);
if (*(crit+2)==0xf5) numofbyte *=2;//logical sign
crit += 4+numofbyte;//crit-->OR(F7)/AND(F8)/CC
break;
default:stat=NOPASS; break;
}//switch
}//if(fldno<=11)
else//field>11
{switch(head)
{
case 0x01://IAM
switch(fldno)
{
case 23://$3.9,P42,过滤被叫号码
msg=bmsg+14; //msg-->LI of CLDNO
li=*msg++; //msg-->ODD/EVEN of CLDNO
li-=2;
li*=2;
if((*msg&0x80)!=0) li--; //addr is odd
msg+=2; //msg-->1st addr
stat=compareISUPaddr(msg,crit,li);
break;
case 40://3.10,P44,过滤主叫号码
msg=bmsg+14; //msg-->LI of CLDNO
li=*msg++; //msg-->ODD/EVEN of CLDNO
msg+=li; //msg-->li of TNSN(if exist)
stat=NOPASS;
if(*msg==0x23) {msg++; li=*msg++; msg+=li;} //存在转接网选择
if(*msg==0x01) msg+=8; //存在呼叫参考
if(*msg==0x0a)//存在主叫用户号码
{msg++; //msg-->LI of CLGPC
li=*msg++; //msg-->ODD/EVEN of CLDNO
li-=2;
li*=8;
if((*msg&0x80)!=0) li-=4; //addr is odd
msg+=2; //msg-->1st addr
stat=compareISUPaddr(msg,crit,li);
}//存在主叫用户号码
break;
default:break;
}//switch
break;
case 0x04://INFO
if(fldno!=25) {stat=NOPASS;break;}
//过滤主叫号码
msg=bmsg+9; //msg-->INFIN
stat=NOPASS;
if((*msg&0x03)==0x03)//存在主叫用户号码
{if((*msg&0x20)==0x20) msg++;
msg+=3; //msg-->li of CLGPC
li=*msg++; //msg-->ODD/EVEN of CLDNO
li-=2;
li*=8;
if((*msg&0x80)!=0) li-=4; //addr is odd
msg+=2; //msg-->1st addr
stat=compareISUPaddr(msg,crit,li);
}
break;
default:break;
}//switch
}//field>11
crit++; //crit-->F7/F8/AA
if((stat!=PASS && *crit==0xf8)//the condition isn't pass & and
||(stat==PASS && *crit==0xf7))//the condition is pass & or
break;
else if ((stat==PASS && *crit==0xf8)//condition is pass & OR
||(stat!=PASS && *crit==0xf7))//condition isn't pass & AND
crit++;
} while(*crit!=0xaa);
return stat;
}
BYTE ISUPmesscri(BYTE *bmsg,BYTE *crit)
{
BYTE selecth1h0=0;
BYTE fldno,numofbyte,varno,head,li;
BYTE c,stat,code,cic[2],*msg;
WORD temp;
do{
fldno = *crit++;
numofbyte=*(crit+3);
if(fldno<=11)
{switch (fldno)
{
case 7://DPC
msg=bmsg;
if (numofbyte==0)//compare with var
{varno = (*(crit+4))*BYTEOFPVAR;stat=PASS;
for (c=0;c<3;c++)
{if (BUFSETMEM[varno+c]!=*(msg+c)) {stat=NOPASS;break;}}
crit +=5; //crit-->OR(F7)/AND(F8)/CC
}
else //compare with criteria
{stat=comparespcode(msg,crit);
if (*(crit+2)==0xf5) numofbyte *=2;//logical sign
crit += 4+numofbyte;//crit-->OR(F7)/AND(F8)/CC
}
break;
case 8://OPC
msg=bmsg+3;
if(numofbyte==0)//compare with var
{varno = (*(crit+4))*BYTEOFPVAR;stat=PASS;
for (c=0;c<3;c++)
{if (BUFSETMEM[varno+c]!=*(msg+c)) {stat=NOPASS;break;}}
crit +=5; //crit-->OR/AND/0xaa
}
else //compare with criteria
{stat=comparespcode(msg,crit);
if (*(crit+2)==0xf5) numofbyte *=2;//logical sign
crit += 4+numofbyte;//crit-->OR(F7)/AND(F8)/CC
}
break;
case 9://SLS
if (numofbyte==0)//compare with var
{varno = (*(crit+4))*BYTEOFPVAR;stat=PASS;
if (BUFSETMEM[varno]!=*(bmsg+6)) {stat=NOPASS;break;}
crit +=5; //crit-->OR/AND/0xaa
}
else //compare with criteria
{code=*(msg+6)&0x0f;
stat=compare(&code,crit+2,0);
if (*(crit+2)==0xf5) numofbyte *=2;//logical sign
crit += 4+numofbyte;//crit-->OR(F7)/AND(F8)/CC
}
break;
case 10: //CIC
stat=NOPASS;
msg=bmsg+7; //msg-->cic
if (numofbyte==0)//compare with var
{varno = (*(crit+4))*BYTEOFPVAR;stat=PASS;
if ((BUFSETMEM[varno]!=*msg)
||(BUFSETMEM[varno+1]!= ((*(msg+1))&0x0f)) )
{stat=NOPASS;break;}
crit +=5; //crit-->OR/AND/0xaa
}
else //compare with criteria
{temp=*(WORD *)msg;
cic[0]=LOBYTE(temp);cic[1]=HIBYTE(temp);
stat=compare(&cic[0],crit+2,0);
if (*(crit+2)==0xf5) numofbyte *=2;//logical sign
crit += 4+numofbyte;//crit-->OR(F7)/AND(F8)/CC
}
break;
case 11: //MT
selecth1h0=0xff;
head=code=*(bmsg+9); //get MT
stat=compare(&code,crit+2,0);
if (*(crit+2)==0xf5) numofbyte *=2;//logical sign
crit += 4+numofbyte;//crit-->OR(F7)/AND(F8)/CC
break;
default:stat=NOPASS; break;
}//switch
}//if(fldno<=11)
else//field>11
{switch(head)
{
case 0x01://IAM
switch(fldno)
{
case 23://23,$3.9,P42,过滤被叫号码
msg=bmsg+17; //msg-->LI of CLDNO
li=*msg++; //msg-->ODD/EVEN of CLDNO
li-=2;
li*=2;
if((*msg&0x80)!=0) li--; //addr is odd
msg+=2; //msg-->1st addr
stat=compareISUPaddr(msg,crit,li);
break;
case 40://3.10,P44,过滤主叫号码
msg=bmsg+17; //msg-->LI of CLDNO
li=*msg++; //msg-->ODD/EVEN of CLDNO
msg+=li; //msg-->li of TNSN(if exist)
stat=NOPASS;
if(*msg==0x23) {msg++; li=*msg++; msg+=li;} //存在转接网选择
if(*msg==0x01) msg+=8; //存在呼叫参考
if(*msg==0x0a)//存在主叫用户号码
{msg++; //msg-->LI of CLGPC
li=*msg++; //msg-->ODD/EVEN of CLDNO
li-=2;
li*=8;
if((*msg&0x80)!=0) li-=4; //addr is odd
msg+=2; //msg-->1st addr
stat=compareISUPaddr(msg,crit,li);
}//存在主叫用户号码
break;
default:break;
}//switch
break;
case 0x04://INFO
if(fldno!=25) {stat=NOPASS;break;}
//过滤主叫号码
msg=bmsg+12; //msg-->INFIN
stat=NOPASS;
if((*msg&0x03)==0x03)//存在主叫用户号码
{if((*msg&0x20)==0x20) msg++;
msg+=3; //msg-->li of CLGPC
li=*msg++; //msg-->ODD/EVEN of CLDNO
li-=2;
li*=8;
if((*msg&0x80)!=0) li-=4; //addr is odd
msg+=2; //msg-->1st addr
stat=compareISUPaddr(msg,crit,li);
}
break;
default:break;
}//switch
}//field>11
crit++; //crit-->F7/F8/AA
if((stat!=PASS && *crit==0xf8)//the condition isn't pass & and
||(stat==PASS && *crit==0xf7))//the condition is pass & or
break;
else if ((stat==PASS && *crit==0xf8)//condition is pass & OR
||(stat!=PASS && *crit==0xf7))//condition isn't pass & AND
crit++;
} while(*crit!=0xaa);
return stat;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -