📄 scenario.cpp
字号:
} else { // end "assign_to" ERROR("'ereg' action without 'assign_to' " "argument (mandatory)"); } if(currentRegExp != NULL) { delete[] currentRegExp; } currentRegExp = NULL; } else { // end if regexp ERROR("'ereg' action without 'regexp' argument (mandatory)"); } } /* end !strcmp(actionElem, "ereg") */ else if(!strcmp(actionElem, "log")) { if(ptr = xp_get_value((char *)"message")) { tmpAction.setActionType(CAction::E_AT_LOG_TO_FILE); tmpAction.setMessage(ptr); /* the action is well formed, adding it in the */ /* tmpActionTable */ tmpActions.setAction(tmpAction); tmpActionNumber++; } } /* end !strcmp(actionElem, "log") */ else if(!strcmp(actionElem, "exec")) { if(ptr = xp_get_value((char *)"command")) { tmpAction.setActionType(CAction::E_AT_EXECUTE_CMD); tmpAction.setCmdLine(ptr); /* the action is well formed, adding it in the */ /* tmpActionTable */ tmpActions.setAction(tmpAction); tmpActionNumber++; } /* end (ptr = xp_get_value("command") */ else if(ptr = xp_get_value((char *)"int_cmd")) { CAction::T_IntCmdType type(CAction::E_INTCMD_STOPCALL); /* assume the default */ if (!strcmp(ptr, "stop_now")) { type = CAction::E_INTCMD_STOP_NOW; } else if (!strcmp(ptr, "stop_gracefully")) { type = CAction::E_INTCMD_STOP_ALL; } else if (!strcmp(ptr, "stop_call")) { type = CAction::E_INTCMD_STOPCALL; } /* the action is well formed, adding it in the */ /* tmpActionTable */ tmpAction.setActionType(CAction::E_AT_EXEC_INTCMD); tmpAction.setIntCmd(type); tmpActions.setAction(tmpAction); tmpActionNumber++;#ifdef PCAPPLAY } else if (ptr = xp_get_value((char *) "play_pcap_audio")) { tmpAction.setPcapArgs(ptr); tmpAction.setActionType(CAction::E_AT_PLAY_PCAP_AUDIO); tmpActions.setAction(tmpAction); tmpActionNumber++; hasMedia = 1; } else if (ptr = xp_get_value((char *) "play_pcap_video")) { tmpAction.setPcapArgs(ptr); tmpAction.setActionType(CAction::E_AT_PLAY_PCAP_VIDEO); tmpActions.setAction(tmpAction); tmpActionNumber++; hasMedia = 1;#endif } else { ERROR("illegal <exec> in the scenario\n"); } } xp_close_element(); recvScenarioLen++; } // end while // creation the action list for this message if(tmpActionNumber != 0) { if(scenario[scenario_len] != NULL) { if(scenario[scenario_len]->M_actions != NULL) delete(scenario[scenario_len]->M_actions); scenario[scenario_len]->M_actions = new CActions(tmpActions); } } } // end if "action" xp_close_element(); }// end open element}// char* manipulation : create a int[] from a char*// test first is the char* is formed by int separeted by coma// and then create the tableint isWellFormed(char * P_listeStr, int * nombre){ char * ptr = P_listeStr; int sizeOf; bool isANumber; (*nombre) = 0; sizeOf = strlen(P_listeStr); // getting the number if(sizeOf > 0) { // is the string well formed ? [0-9] [,] isANumber = false; for(int i=0; i<=sizeOf; i++) { switch(ptr[i]) { case ',': if(isANumber == false) { return(0); } else { (*nombre)++; } isANumber = false; break; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': isANumber = true; break; case '\t': case ' ' : break; case '\0': if(isANumber == false) { return(0); } else { (*nombre)++; } break; default: return(0); } } // end for } return(1);}int createIntegerTable(char * P_listeStr, unsigned int ** listeInteger, int * sizeOfList){ int nb=0; char * ptr = P_listeStr; char * ptr_prev = P_listeStr; unsigned int current_int; if(isWellFormed(P_listeStr, sizeOfList) == 1) { (*listeInteger) = new unsigned int[(*sizeOfList)]; while((*ptr) != ('\0')) { if((*ptr) == ',') { sscanf(ptr_prev, "%u", ¤t_int); if (nb<(*sizeOfList)) (*listeInteger)[nb] = current_int; nb++; ptr_prev = ptr+1; } ptr++; } // Read the last sscanf(ptr_prev, "%u", ¤t_int); if (nb<(*sizeOfList)) (*listeInteger)[nb] = current_int; nb++; return(1); } return(0);}// TIP: to integrate an existing XML scenario, use the following sed line:// cat ../3pcc-controller-B.xml | sed -e 's/\"/\\\"/g' -e 's/\(.*\)/\"\1\\n\"/'char * default_scenario [] = { /************* Default_scenario[0] ***************/(char *)"<?xml version=\"1.0\" encoding=\"ISO-8859-1\" ?>\n""<!DOCTYPE scenario SYSTEM \"sipp.dtd\">\n""\n""<!-- This program is free software; you can redistribute it and/or -->\n""<!-- modify it under the terms of the GNU General Public License as -->\n""<!-- published by the Free Software Foundation; either version 2 of the -->\n""<!-- License, or (at your option) any later version. -->\n""<!-- -->\n""<!-- This program is distributed in the hope that it will be useful, -->\n""<!-- but WITHOUT ANY WARRANTY; without even the implied warranty of -->\n""<!-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -->\n""<!-- GNU General Public License for more details. -->\n""<!-- -->\n""<!-- You should have received a copy of the GNU General Public License -->\n""<!-- along with this program; if not, write to the -->\n""<!-- Free Software Foundation, Inc., -->\n""<!-- 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -->\n""<!-- -->\n""<!-- Sipp default 'uac' scenario. -->\n""<!-- -->\n""\n""<scenario name=\"Basic Sipstone UAC\">\n"" <!-- In client mode (sipp placing calls), the Call-ID MUST be -->\n"" <!-- generated by sipp. To do so, use [call_id] keyword. -->\n"" <send retrans=\"500\">\n"" <![CDATA[\n""\n"" INVITE sip:[service]@[remote_ip]:[remote_port] SIP/2.0\n"" Via: SIP/2.0/[transport] [local_ip]:[local_port];branch=[branch]\n"" From: sipp <sip:sipp@[local_ip]:[local_port]>;tag=[call_number]\n"" To: sut <sip:[service]@[remote_ip]:[remote_port]>\n"" Call-ID: [call_id]\n"" CSeq: 1 INVITE\n"" Contact: sip:sipp@[local_ip]:[local_port]\n"" Max-Forwards: 70\n"" Subject: Performance Test\n"" Content-Type: application/sdp\n"" Content-Length: [len]\n""\n"" v=0\n"" o=user1 53655765 2353687637 IN IP[local_ip_type] [local_ip]\n"" s=-\n"" c=IN IP[media_ip_type] [media_ip]\n"" t=0 0\n"" m=audio [media_port] RTP/AVP 0\n"" a=rtpmap:0 PCMU/8000\n""\n"" ]]>\n"" </send>\n""\n"" <recv response=\"100\"\n"" optional=\"true\">\n"" </recv>\n""\n"" <recv response=\"180\" optional=\"true\">\n"" </recv>\n""\n"" <recv response=\"183\" optional=\"true\">\n"" </recv>\n""\n"" <!-- By adding rrs=\"true\" (Record Route Sets), the route sets -->\n"" <!-- are saved and used for following messages sent. Useful to test -->\n"" <!-- against stateful SIP proxies/B2BUAs. -->\n"" <recv response=\"200\" rtd=\"true\">\n"" </recv>\n""\n"" <!-- Packet lost can be simulated in any send/recv message by -->\n"" <!-- by adding the 'lost = \"10\"'. Value can be [1-100] percent. -->\n"" <send>\n"" <![CDATA[\n""\n"" ACK sip:[service]@[remote_ip]:[remote_port] SIP/2.0\n"" Via: SIP/2.0/[transport] [local_ip]:[local_port];branch=[branch]\n"" From: sipp <sip:sipp@[local_ip]:[local_port]>;tag=[call_number]\n"" To: sut <sip:[service]@[remote_ip]:[remote_port]>[peer_tag_param]\n"" Call-ID: [call_id]\n"" CSeq: 1 ACK\n"" Contact: sip:sipp@[local_ip]:[local_port]\n"" Max-Forwards: 70\n"" Subject: Performance Test\n"" Content-Length: 0\n""\n"" ]]>\n"" </send>\n""\n"" <!-- This delay can be customized by the -d command-line option -->\n"" <!-- or by adding a 'milliseconds = \"value\"' option here. -->\n"" <pause/>\n""\n"" <!-- The 'crlf' option inserts a blank line in the statistics report. -->\n"" <send retrans=\"500\">\n"" <![CDATA[\n""\n"" BYE sip:[service]@[remote_ip]:[remote_port] SIP/2.0\n"" Via: SIP/2.0/[transport] [local_ip]:[local_port];branch=[branch]\n"" From: sipp <sip:sipp@[local_ip]:[local_port]>;tag=[call_number]\n"" To: sut <sip:[service]@[remote_ip]:[remote_port]>[peer_tag_param]\n"" Call-ID: [call_id]\n"" CSeq: 2 BYE\n"" Contact: sip:sipp@[local_ip]:[local_port]\n"" Max-Forwards: 70\n"" Subject: Performance Test\n"" Content-Length: 0\n""\n"" ]]>\n"" </send>\n""\n"" <recv response=\"200\" crlf=\"true\">\n"" </recv>\n""\n"" <!-- definition of the response time repartition table (unit is ms) -->\n"" <ResponseTimeRepartition value=\"10, 20, 30, 40, 50, 100, 150, 200\"/>\n""\n"" <!-- definition of the call length repartition table (unit is ms) -->\n"" <CallLengthRepartition value=\"10, 50, 100, 500, 1000, 5000, 10000\"/>\n""\n""</scenario>\n""\n", /************* Default_scenario[1] ***************/(char *)"<?xml version=\"1.0\" encoding=\"ISO-8859-1\" ?>\n""<!DOCTYPE scenario SYSTEM \"sipp.dtd\">\n""\n""<!-- This program is free software; you can redistribute it and/or -->\n""<!-- modify it under the terms of the GNU General Public License as -->\n""<!-- published by the Free Software Foundation; either version 2 of the -->\n""<!-- License, or (at your option) any later version. -->\n""<!-- -->\n""<!-- This program is distributed in the hope that it will be useful, -->\n""<!-- but WITHOUT ANY WARRANTY; without even the implied warranty of -->\n""<!-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -->\n""<!-- GNU General Public License for more details. -->\n""<!-- -->\n""<!-- You should have received a copy of the GNU General Public License -->\n""<!-- along with this program; if not, write to the -->\n""<!-- Free Software Foundation, Inc., -->\n""<!-- 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -->\n""<!-- -->\n""<!-- Sipp default 'uas' scenario. -->\n""<!-- -->\n""\n""<scenario name=\"Basic UAS responder\">\n"" <!-- By adding rrs=\"true\" (Record Route Sets), the route sets -->\n"" <!-- are saved and used for following messages sent. Useful to test -->\n"" <!-- against stateful SIP proxies/B2BUAs. -->\n"" <recv request=\"INVITE\" crlf=\"true\">\n"" </recv>\n""\n"" <!-- The '[last_*]' keyword is replaced automatically by the -->\n"" <!-- specified header if it was present in the last message received -->\n"" <!-- (except if it was a retransmission). If the header was not -->\n"" <!-- present or if no message has been received, the '[last_*]' -->\n"" <!-- keyword is discarded, and all bytes until the end of the line -->\n"" <!-- are also discarded. -->\n"" <!-- -->\n"" <!-- If the specified header was present several times in the -->\n"" <!-- message, all occurences are concatenated (CRLF seperated) -->\n"" <!-- to be used in place of the '[last_*]' keyword. -->\n"
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -