mirror of https://github.com/sipwise/kamailio.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
445 lines
9.1 KiB
445 lines
9.1 KiB
|
|
/* test program -> switch speed */
|
|
/*
|
|
*
|
|
* Copyright (C) 2001-2003 FhG Fokus
|
|
*
|
|
* This file is part of ser, a free SIP server.
|
|
*
|
|
* ser is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
* (at your option) any later version
|
|
*
|
|
* For a license to use the ser software under conditions
|
|
* other than those described here, or to purchase support for this
|
|
* software, please contact iptel.org by e-mail at the following addresses:
|
|
* info@iptel.org
|
|
*
|
|
* ser is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
*/
|
|
|
|
|
|
|
|
/* parsing: compact form:
|
|
* Via: v:
|
|
* From: f:
|
|
* To: t:
|
|
* Cseq: n/a
|
|
* Call-ID: i:
|
|
* Contact: m:
|
|
* Max-Forwards: n/a
|
|
* Route: n/a
|
|
*/
|
|
|
|
enum { INITIAL=0,
|
|
VIA1, VIA2,
|
|
FROM1, FROM2, FROM3,
|
|
TO1,
|
|
C_START, CSEQ2, CSEQ3,
|
|
CALLID2, CALLID3, CALLID4, CALLID5, CALLID6,
|
|
CONTACT2, CONTACT3, CONTACT4, CONTACT5, CONTACT6,
|
|
M_START, MAXFORWARDS2, MAXFORWARDS3, MAXFORWARDS4, MAXFORWARDS5,
|
|
MAXFORWARDS6, MAXFORWARDS7, MAXFORWARDS8, MAXFORWARDS9, MAXFORWARDS10,
|
|
MAXFORWARDS11,
|
|
ROUTE1, ROUTE2, ROUTE3, ROUTE4,
|
|
/* final states*/
|
|
F_VIA=1000, F_FROM, F_TO, F_CSEQ, F_CALLID, F_CONTACT, F_MAXFORWARDS,
|
|
F_ROUTE,
|
|
I_START,
|
|
|
|
UNKNOWN_HEADER=200,
|
|
BODY=220,
|
|
LF=25000,
|
|
};
|
|
|
|
#include <stdio.h>
|
|
|
|
int main(int argc, char** argv)
|
|
{
|
|
|
|
char* t;
|
|
register int state;
|
|
int i;
|
|
int err;
|
|
err=0;
|
|
|
|
state=INITIAL;
|
|
printf(" %s (%d)\n", argv[0], argc);
|
|
if (argc<2){
|
|
fprintf(stderr, " no parameters\n");
|
|
exit(-1);
|
|
}
|
|
|
|
for (i=0;i<10000000;i++){
|
|
|
|
for(t=argv[1];*t;t++){
|
|
switch(*t){
|
|
case 'V':
|
|
case 'v':
|
|
switch(state){
|
|
case INITIAL:
|
|
state=VIA1;
|
|
break;
|
|
case UNKNOWN_HEADER: break;
|
|
default:
|
|
state=UNKNOWN_HEADER;
|
|
}
|
|
break;
|
|
case 'I':
|
|
case 'i':
|
|
switch(state){
|
|
case VIA1:
|
|
state=VIA2;
|
|
break;
|
|
case CALLID5:
|
|
state=CALLID6;
|
|
break;
|
|
case INITIAL:
|
|
state=I_START;
|
|
break;
|
|
case UNKNOWN_HEADER: break;
|
|
default:
|
|
state=UNKNOWN_HEADER;
|
|
}
|
|
break;
|
|
case 'A':
|
|
case 'a':
|
|
switch(state){
|
|
case VIA2:
|
|
state=F_VIA;
|
|
break;
|
|
case C_START: /*CALLID1*/
|
|
state=CALLID2;
|
|
break;
|
|
case CONTACT4:
|
|
state=CONTACT5;
|
|
break;
|
|
case M_START:
|
|
state=MAXFORWARDS2;
|
|
break;
|
|
case MAXFORWARDS8:
|
|
state=MAXFORWARDS9;
|
|
break;
|
|
case UNKNOWN_HEADER: break;
|
|
default:
|
|
state=UNKNOWN_HEADER;
|
|
}
|
|
break;
|
|
case 'F':
|
|
case 'f':
|
|
switch(state){
|
|
case INITIAL:
|
|
state=FROM1;
|
|
break;
|
|
case MAXFORWARDS4:
|
|
state=MAXFORWARDS5;
|
|
break;
|
|
case UNKNOWN_HEADER: break;
|
|
default:
|
|
state=UNKNOWN_HEADER;
|
|
}
|
|
break;
|
|
case 'R':
|
|
case 'r':
|
|
switch(state){
|
|
case INITIAL:
|
|
state=ROUTE1;
|
|
break;
|
|
case FROM1:
|
|
state=FROM2;
|
|
break;
|
|
case MAXFORWARDS6:
|
|
state=MAXFORWARDS7;
|
|
break;
|
|
case MAXFORWARDS9:
|
|
state=MAXFORWARDS10;
|
|
break;
|
|
case UNKNOWN_HEADER: break;
|
|
default:
|
|
state=UNKNOWN_HEADER;
|
|
}
|
|
break;
|
|
case 'O':
|
|
case 'o':
|
|
switch(state){
|
|
case FROM2:
|
|
state=FROM3;
|
|
break;
|
|
case TO1:
|
|
state=F_TO;
|
|
break;
|
|
case C_START: /*CONTACT1 */
|
|
state=CONTACT2;
|
|
break;
|
|
case ROUTE1:
|
|
state=ROUTE2;
|
|
break;
|
|
case MAXFORWARDS5:
|
|
state=MAXFORWARDS6;
|
|
break;
|
|
case UNKNOWN_HEADER: break;
|
|
default:
|
|
state=UNKNOWN_HEADER;
|
|
}
|
|
break;
|
|
case 'M':
|
|
case 'm':
|
|
switch(state){
|
|
case INITIAL:
|
|
state=M_START;
|
|
break;
|
|
case FROM3:
|
|
state=F_FROM;
|
|
break;
|
|
case UNKNOWN_HEADER: break;
|
|
default:
|
|
state=UNKNOWN_HEADER;
|
|
}
|
|
break;
|
|
case 'T':
|
|
case 't':
|
|
switch(state){
|
|
case INITIAL:
|
|
state=TO1;
|
|
break;
|
|
case CONTACT3:
|
|
state=CONTACT4;
|
|
break;
|
|
case CONTACT6:
|
|
state=F_CONTACT;
|
|
break;
|
|
case ROUTE3:
|
|
state=ROUTE4;
|
|
break;
|
|
case UNKNOWN_HEADER: break;
|
|
default:
|
|
state=UNKNOWN_HEADER;
|
|
}
|
|
break;
|
|
case 'C':
|
|
case 'c':
|
|
switch(state){
|
|
case INITIAL:
|
|
state=C_START;
|
|
break;
|
|
case CONTACT5:
|
|
state=CONTACT6;
|
|
break;
|
|
case UNKNOWN_HEADER: break;
|
|
default:
|
|
state=UNKNOWN_HEADER;
|
|
}
|
|
break;
|
|
case 'S':
|
|
case 's':
|
|
switch(state){
|
|
case C_START:
|
|
state=CSEQ2;
|
|
break;
|
|
case MAXFORWARDS11:
|
|
state=F_MAXFORWARDS;
|
|
break;
|
|
case UNKNOWN_HEADER: break;
|
|
default:
|
|
state=UNKNOWN_HEADER;
|
|
}
|
|
break;
|
|
case 'E':
|
|
case 'e':
|
|
switch(state){
|
|
case CSEQ2:
|
|
state=CSEQ3;
|
|
break;
|
|
case ROUTE4:
|
|
state=F_ROUTE;
|
|
break;
|
|
case UNKNOWN_HEADER: break;
|
|
default:
|
|
state=UNKNOWN_HEADER;
|
|
}
|
|
break;
|
|
case 'Q':
|
|
case 'q':
|
|
switch(state){
|
|
case CSEQ3:
|
|
state=F_CSEQ;
|
|
break;
|
|
case UNKNOWN_HEADER: break;
|
|
default:
|
|
state=UNKNOWN_HEADER;
|
|
}
|
|
break;
|
|
case 'L':
|
|
case 'l':
|
|
switch(state){
|
|
case CALLID2:
|
|
state=CALLID3;
|
|
break;
|
|
case CALLID3:
|
|
state=CALLID4;
|
|
break;
|
|
case UNKNOWN_HEADER: break;
|
|
default:
|
|
state=UNKNOWN_HEADER;
|
|
}
|
|
break;
|
|
case 'D':
|
|
case 'd':
|
|
switch(state){
|
|
case CALLID6:
|
|
state=F_CALLID;
|
|
break;
|
|
case MAXFORWARDS10:
|
|
state=MAXFORWARDS11;
|
|
break;
|
|
case UNKNOWN_HEADER: break;
|
|
default:
|
|
state=UNKNOWN_HEADER;
|
|
}
|
|
break;
|
|
case 'N':
|
|
case 'n':
|
|
switch(state){
|
|
case CONTACT2:
|
|
state=CONTACT3;
|
|
break;
|
|
case UNKNOWN_HEADER: break;
|
|
default:
|
|
state=UNKNOWN_HEADER;
|
|
}
|
|
break;
|
|
case 'X':
|
|
case 'x':
|
|
switch(state){
|
|
case MAXFORWARDS2:
|
|
state=MAXFORWARDS3;
|
|
break;
|
|
case UNKNOWN_HEADER: break;
|
|
default:
|
|
state=UNKNOWN_HEADER;
|
|
}
|
|
break;
|
|
case '-':
|
|
switch(state){
|
|
case CALLID4:
|
|
state=CALLID5;
|
|
break;
|
|
case MAXFORWARDS3:
|
|
state=MAXFORWARDS4;
|
|
break;
|
|
case UNKNOWN_HEADER: break;
|
|
default:
|
|
state=UNKNOWN_HEADER;
|
|
}
|
|
break;
|
|
case 'W':
|
|
case 'w':
|
|
switch(state){
|
|
case MAXFORWARDS7:
|
|
state=MAXFORWARDS8;
|
|
break;
|
|
case UNKNOWN_HEADER: break;
|
|
default:
|
|
state=UNKNOWN_HEADER;
|
|
}
|
|
break;
|
|
case 'U':
|
|
case 'u':
|
|
switch(state){
|
|
case ROUTE2:
|
|
state=ROUTE3;
|
|
break;
|
|
case UNKNOWN_HEADER: break;
|
|
default:
|
|
state=UNKNOWN_HEADER;
|
|
}
|
|
break;
|
|
case ' ':
|
|
switch(state){
|
|
case INITIAL:
|
|
break; /*eat space */
|
|
case F_VIA:
|
|
case F_FROM:
|
|
case F_TO:
|
|
case F_CSEQ:
|
|
case F_CALLID:
|
|
case F_CONTACT:
|
|
case F_MAXFORWARDS:
|
|
case F_ROUTE:
|
|
break; /* eat trailing space*/
|
|
case VIA1:
|
|
/*compact form: v: */
|
|
state=F_VIA;
|
|
break;
|
|
case FROM1:
|
|
/*compact form f:*/
|
|
state=F_FROM;
|
|
break;
|
|
case TO1:
|
|
/*compact form t:*/
|
|
state=F_TO;
|
|
break;
|
|
case I_START:
|
|
/*compact form i: (Call-ID)*/
|
|
state=F_CALLID;
|
|
break;
|
|
case M_START:
|
|
/*compact form m: (Contact)*/
|
|
state=F_CONTACT;
|
|
break;
|
|
case UNKNOWN_HEADER: break;
|
|
default:
|
|
state=UNKNOWN_HEADER;
|
|
}
|
|
break;
|
|
case ':':
|
|
switch(state){
|
|
case F_VIA:
|
|
case VIA1: /* compact form*/
|
|
case F_FROM:
|
|
case FROM1: /*compact form*/
|
|
case F_TO:
|
|
case TO1: /*compact form*/
|
|
case F_CSEQ:
|
|
case F_CALLID:
|
|
case I_START: /*compact form*/
|
|
case F_CONTACT:
|
|
case M_START: /*compact form*/
|
|
case F_MAXFORWARDS:
|
|
case F_ROUTE:
|
|
// printf("found header, state=%d\n", state);
|
|
state=INITIAL; /* reset to test*/
|
|
break;
|
|
case UNKNOWN_HEADER:
|
|
default:
|
|
/*printf("found unknown header, state=%d\n",
|
|
state);*/
|
|
err=1;
|
|
state=INITIAL;
|
|
}
|
|
break;
|
|
default:
|
|
/*fprintf(stderr, "Unexpected char <%c> encountered"
|
|
" state=%d\n", *t, state);
|
|
exit(-1);*/
|
|
state=UNKNOWN_HEADER;
|
|
}
|
|
}
|
|
|
|
} //for i
|
|
if (err) printf("Error unknown header\n");
|
|
printf("final state=%d\n", state);
|
|
|
|
exit(0);
|
|
|
|
}
|
|
|