Matthew Briggs <Matthew.Briggs <at> telecom.co.nz> writes: > > I'm posting the following modifications in case others have been battling the same sipp limitations as I > have. Feel free to incorporate, use individually or ignore.
Correction to the above patch: there was an inconsistency in the name of the new parameter (-rxsf / -sfrx) in the previous posted version. It is now consistently -rxsf Apologies. Matt Diff against SIPP v3.2 attached below: ================================ diff -bruN ../orig/sipp.svn/Makefile sipp.svn/Makefile --- ../orig/sipp.svn/Makefile 2008-10-30 01:20:06.000000000 +1300 +++ sipp.svn/Makefile 2011-12-17 09:28:00.796875000 +1300 @@ -153,7 +153,7 @@ INCDIR_hpux=-I. -I/usr/local/include -I/opt/openssl/include INCDIR_tru64=-I. -I/opt/openssl/include INCDIR_SunOS=-I. -I/usr/local/ssl/include/ -INCDIR_Cygwin=-I. -I/usr/include/openssl -I/usr/include - I/usr/lib/WpdPack/Include +INCDIR_Cygwin=-I. -I/usr/include/openssl -I/usr/include - I/usr/lib/WpdPack/Include -I/usr/include/ncurses INCDIR_Darwin=-I. -I/usr/local/ssl/include INCDIR=$(INCDIR_$(SYSTEM)) diff -bruN ../orig/sipp.svn/call.cpp sipp.svn/call.cpp --- ../orig/sipp.svn/call.cpp 2010-11-09 02:02:28.000000000 +1300 +++ sipp.svn/call.cpp 2011-12-17 15:03:16.921875000 +1300 @@ -249,6 +249,8 @@ (_RCAST(struct sockaddr_in *, &(play_args_a.to)))->sin_family = AF_INET; (_RCAST(struct sockaddr_in *, &(play_args_a.to)))->sin_port = audio_port; (_RCAST(struct sockaddr_in *, &(play_args_a.to)))->sin_addr.s_addr = ip_media; + play_args_a.tos = AUDIO_TOS; + } video_port = get_remote_port_media(msg, PAT_VIDEO); if (video_port) { @@ -256,6 +258,7 @@ (_RCAST(struct sockaddr_in *, &(play_args_v.to)))->sin_family = AF_INET; (_RCAST(struct sockaddr_in *, &(play_args_v.to)))->sin_port = video_port; (_RCAST(struct sockaddr_in *, &(play_args_v.to)))->sin_addr.s_addr = ip_media; + play_args_v.tos = VIDEO_TOS; } hasMediaInformation = 1; } @@ -311,12 +314,12 @@ } /******************* Call class implementation ****************/ -call::call(char *p_id, bool use_ipv6, int userId, struct sockaddr_storage *dest) : listener(p_id, true) { - init(main_scenario, NULL, dest, p_id, userId, use_ipv6, false, false); +call::call(scenario * call_scenario, char *p_id, bool use_ipv6, int userId, struct sockaddr_storage *dest) : listener(p_id, true) { + init(call_scenario, NULL, dest, p_id, userId, use_ipv6, false, false); } -call::call(char *p_id, struct sipp_socket *socket, struct sockaddr_storage *dest) : listener(p_id, true) { - init(main_scenario, socket, dest, p_id, 0 /* No User. */, socket->ss_ipv6, false /* Not Auto. */, false); +call::call(scenario * call_scenario, char *p_id, struct sipp_socket *socket, struct sockaddr_storage *dest) : listener(p_id, true) { + init(call_scenario, socket, dest, p_id, 0 /* No User. */, socket->ss_ipv6, false /* Not Auto. */, false); } call::call(scenario * call_scenario, struct sipp_socket *socket, struct sockaddr_storage *dest, char * p_id, int userId, bool ipv6, bool isAutomatic, bool isInitialization) : listener(p_id, true) { @@ -3811,12 +3814,12 @@ #define PTHREAD_STACK_MIN 16384 #endif //pthread_attr_setstacksize(&attr, PTHREAD_STACK_MIN); - if (media_thread != 0) { + //if (media_thread != 0) { // If a media_thread is already active, kill it before starting a new one - pthread_cancel(media_thread); - pthread_join(media_thread, NULL); - media_thread = 0; - } + // pthread_cancel(media_thread); + // pthread_join(media_thread, NULL); + // media_thread = 0; + // } int ret = pthread_create(&media_thread, &attr, send_wrapper, (void *) play_args); if(ret) diff -bruN ../orig/sipp.svn/call.hpp sipp.svn/call.hpp --- ../orig/sipp.svn/call.hpp 2009-04-16 00:10:03.000000000 +1200 +++ sipp.svn/call.hpp 2011-12-17 15:02:12.593750000 +1300 @@ -68,8 +68,8 @@ public: /* These are wrappers for various circumstances, (private) init does the real work. */ //call(char * p_id, int userId, bool ipv6, bool isAutomatic); - call(char *p_id, bool use_ipv6, int userId, struct sockaddr_storage *dest); - call(char *p_id, struct sipp_socket *socket, struct sockaddr_storage *dest); + call(scenario * call_scenario, char *p_id, bool use_ipv6, int userId, struct sockaddr_storage *dest); + call(scenario * call_scenario, char *p_id, struct sipp_socket *socket, struct sockaddr_storage *dest); static call *add_call(int userId, bool ipv6, struct sockaddr_storage *dest); call(scenario * call_scenario, struct sipp_socket *socket, struct sockaddr_storage *dest, char * p_id, int userId, bool ipv6, bool isAutomatic, bool isInitCall); diff -bruN ../orig/sipp.svn/scenario.cpp sipp.svn/scenario.cpp --- ../orig/sipp.svn/scenario.cpp 2009-04-16 00:10:03.000000000 +1200 +++ sipp.svn/scenario.cpp 2011-12-18 09:58:29.515625000 +1300 @@ -142,6 +142,7 @@ /******** Global variables which compose the scenario file **********/ +scenario *rx_scenario; scenario *main_scenario; scenario *ooc_scenario; scenario *display_scenario; @@ -1208,7 +1209,7 @@ bool isRecvCmdFound = false; bool isSendCmdFound = false; - creationMode = -1; + if (creationMode!=MODE_MIXED) creationMode = -1; sendMode = -1; thirdPartyMode = MODE_3PCC_NONE; diff -bruN ../orig/sipp.svn/scenario.hpp sipp.svn/scenario.hpp --- ../orig/sipp.svn/scenario.hpp 2008-08-23 07:08:05.000000000 +1200 +++ sipp.svn/scenario.hpp 2011-12-17 14:45:30.859375000 +1300 @@ -42,6 +42,7 @@ #define MODE_CLIENT 0 #define MODE_SERVER 1 +#define MODE_MIXED 2 #define MODE_3PCC_NONE 0 #define MODE_3PCC_CONTROLLER_A 2 @@ -223,6 +224,7 @@ /* There are external variable containing the current scenario */ extern scenario *main_scenario; +extern scenario *rx_scenario; extern scenario *ooc_scenario; extern scenario *display_scenario; extern int creationMode; diff -bruN ../orig/sipp.svn/send_packets.c sipp.svn/send_packets.c --- ../orig/sipp.svn/send_packets.c 2009-05-28 23:01:17.000000000 +1200 +++ sipp.svn/send_packets.c 2011-12-18 11:23:49.640625000 +1300 @@ -139,6 +139,8 @@ struct sockaddr_in6 to6, from6; char buffer[PCAP_MAXPACKET]; int temp_sum; + u_int8_t tos = play_args->tos; + int toslen = sizeof(tos); #ifndef MSG_DONTWAIT int fd_flags; @@ -159,8 +161,14 @@ } from_port = &(((struct sockaddr_in *)(void *) from )->sin_port); to_port = &(((struct sockaddr_in *)(void *) to )->sin_port); + + if ( setsockopt(sock, IPPROTO_IP, IP_TOS, (char *) &tos, toslen) < 0 ) + ERROR("Setsockopt failed to set IPv4 TOS"); + + // Note: in cygwin need to create following windows registry key to get TOS to work: IgnoreUserTOSSetting = 0 } + #ifndef MSG_DONTWAIT fd_flags = fcntl(sock, F_GETFL , NULL); fd_flags |= O_NONBLOCK; diff -bruN ../orig/sipp.svn/send_packets.h sipp.svn/send_packets.h --- ../orig/sipp.svn/send_packets.h 2006-06-06 08:07:17.000000000 +1200 +++ sipp.svn/send_packets.h 2011-12-17 09:28:02.093750000 +1300 @@ -115,6 +115,7 @@ /* Used in send_packets thread */ struct sockaddr_storage to; struct sockaddr_storage from; + unsigned char tos; } play_args_t; #ifdef __cplusplus diff -bruN ../orig/sipp.svn/sipp.cpp sipp.svn/sipp.cpp --- ../orig/sipp.svn/sipp.cpp 2010-11-12 23:12:32.000000000 +1300 +++ sipp.svn/sipp.cpp 2011-12-18 11:22:48.421875000 +1300 @@ -130,6 +130,8 @@ #define SIPP_OPTION_LFNAME 36 #define SIPP_OPTION_LFOVERWRITE 37 #define SIPP_OPTION_PLUGIN 38 +#define SIPP_OPTION_RX_SCENARIO 39 +#define SIPP_OPTION_RX_INPUT_FILE 40 /* Put Each option, its help text, and type in this table. */ struct sipp_option options_table[] = { @@ -176,6 +178,9 @@ {"fd", "Set the statistics dump log report frequency. Default is 60 and default unit is seconds.", SIPP_OPTION_TIME_SEC, &report_freq_dumpLog, 1}, {"i", "Set the local IP address for 'Contact:','Via:', and 'From:' headers. Default is primary host IP address.\n", SIPP_OPTION_IP, local_ip, 1}, + {"rxinf", "Inject values from an external CSV file during calls into the scenarios.\n" + "First line of this file say whether the data is to be read in sequence (SEQUENTIAL), random (RANDOM), or user (USER) order.\n" + "Each line corresponds to one call and has one or more ';' delimited data fields. Those fields can be referred as [field0], [field1], ... in the xml scenario file. Several CSV files can be used simultaneously (syntax: -inf f1.csv -inf f2.csv ...)", SIPP_OPTION_RX_INPUT_FILE, NULL, 1}, {"inf", "Inject values from an external CSV file during calls into the scenarios.\n" "First line of this file say whether the data is to be read in sequence (SEQUENTIAL), random (RANDOM), or user (USER) order.\n" "Each line corresponds to one call and has one or more ';' delimited data fields. Those fields can be referred as [field0], [field1], ... in the xml scenario file. Several CSV files can be used simultaneously (syntax: -inf f1.csv -inf f2.csv ...)", SIPP_OPTION_INPUT_FILE, NULL, 1}, @@ -261,6 +266,7 @@ {"s", "Set the username part of the resquest URI. Default is 'service'.", SIPP_OPTION_STRING, &service, 1}, {"sd", "Dumps a default scenario (embeded in the sipp executable)", SIPP_OPTION_SCENARIO, NULL, 0}, {"sf", "Loads an alternate xml scenario file. To learn more about XML scenario syntax, use the -sd option to dump embedded scenarios. They contain all the necessary help.", SIPP_OPTION_SCENARIO, NULL, 2}, + {"rxsf", "Loads an alternate receive xml scenario file as the second scenario - enabling a mixture of originating and terminating calls to be executed. If this is included then the second scenario MUST be a server mode scenario, and the first scenario (specified in -sf / -sn) MUST be a client-mode scenario. If both -snrx and -sfrx are ommitted then only a single scenario is executed.\n", SIPP_OPTION_RX_SCENARIO, NULL, 2}, {"shortmessage_file", "Set the name of the short message log file.", SIPP_OPTION_LFNAME, &shortmessage_lfi, 1}, {"shortmessage_overwrite", "Overwrite the short message log file (default true).", SIPP_OPTION_LFOVERWRITE, &shortmessage_lfi, 1}, {"oocsf", "Load out-of-call scenario.", SIPP_OPTION_OOC_SCENARIO, NULL, 2}, @@ -280,7 +286,7 @@ "- '3pcc-C-B' : Controller B side.\n" "- '3pcc-A' : A side.\n" "- '3pcc-B' : B side.\n", SIPP_OPTION_SCENARIO, NULL, 2}, - + {"rxrn", "Use a default scenario (embedded in the sipp executable) for the second scenario - enabling a mixture of originating and terminating calls to be executed. If this is included then the second scenario MUST be a server mode scenario, and the first scenario (specified in -sf / -sn) MUST be a client-mode scenario. If both -snrx and -sfrx are ommitted then only a single scenario is executed.\n", SIPP_OPTION_RX_SCENARIO, NULL, 2}, {"stat_delimiter", "Set the delimiter for the statistics file", SIPP_OPTION_STRING, &stat_delimiter, 1}, {"stf", "Set the file name to use to dump statistics", SIPP_OPTION_ARGI, &argiFileName, 1}, @@ -778,7 +784,7 @@ sprintf(temp_str, "%3.1f(%d ms)/%5.3fs", rate, duration, (double)rate_period_ms / 1000.0); } unsigned long long total_calls = display_scenario->stats->GetStat(CStat::CPT_C_IncomingCallCreated) + display_scenario->stats->GetStat(CStat::CPT_C_OutgoingCallCreated); - if( creationMode == MODE_SERVER) { + if(( creationMode == MODE_SERVER) || ((creationMode == MODE_MIXED) and (display_scenario==rx_scenario))) { fprintf (f, " Port Total-time Total-calls Transport" @@ -790,7 +796,7 @@ total_calls, TRANSPORT_TO_STRING(transport)); } else { - assert(creationMode == MODE_CLIENT); + assert((creationMode == MODE_CLIENT) || ((creationMode == MODE_MIXED) and (display_scenario==main_scenario))); if (users >= 0) { fprintf(f, " Users (length)"); } else { @@ -827,7 +833,7 @@ (clock_tick-last_report_time) / divisor); /* 2nd line */ - if( creationMode == MODE_SERVER) { + if(( creationMode == MODE_SERVER) || ((creationMode == MODE_MIXED) and (display_scenario==rx_scenario))) { sprintf(temp_str, "%llu calls", display_scenario->stats- >GetStat(CStat::CPT_C_CurrentCall)); } else { sprintf(temp_str, "%llu calls (limit %d)", display_scenario->stats->GetStat(CStat::CPT_C_CurrentCall), open_calls_allowed); @@ -844,7 +850,8 @@ sprintf(temp_str,"%llu dead call msg (discarded)", display_scenario->stats->GetStat(CStat::CPT_G_C_DeadCallMsgs)); fprintf(f," %-37s", temp_str); - if( creationMode == MODE_CLIENT) { + if ((creationMode == MODE_CLIENT) || ((creationMode == MODE_MIXED) and (display_scenario==main_scenario))) + { sprintf(temp_str,"%llu out-of-call msg (discarded)", display_scenario->stats->GetStat(CStat::CPT_G_C_OutOfCallMsgs)); fprintf(f," %-37s", temp_str); @@ -944,7 +951,7 @@ sprintf(temp_str, "%s", src->getMethod()); } - if(creationMode == MODE_SERVER) { + if((creationMode == MODE_SERVER) || ((creationMode == MODE_MIXED) and (display_scenario==rx_scenario))) { fprintf(f," <---------- %-10s ", temp_str); } else { fprintf(f," %10s ----------> ", temp_str); @@ -971,7 +978,7 @@ "" /* Unexpected. */); } } else if(curmsg -> recv_response) { - if(creationMode == MODE_SERVER) { + if((creationMode == MODE_SERVER) || ((creationMode == MODE_MIXED) and (display_scenario==rx_scenario))) { fprintf(f," ----------> %-10d ", curmsg -> recv_response); } else { fprintf(f," %10d <---------- ", curmsg -> recv_response); @@ -1014,7 +1021,7 @@ } int len = strlen(desc) < 9 ? 9 : strlen(desc); - if(creationMode == MODE_SERVER) { + if((creationMode == MODE_SERVER) || ((creationMode == MODE_MIXED) and (display_scenario==rx_scenario))) { fprintf(f," [%9s] Pause%*s", desc, 23 - len > 0 ? 23 - len : 0, ""); } else { fprintf(f," Pause [%9s]%*s", desc, 18 - len > 0 ? 18 - len : 0, ""); @@ -1023,7 +1030,7 @@ fprintf(f,"%-9d", curmsg->sessions); fprintf(f," %-9lu" , curmsg->nb_unexp); } else if(curmsg -> recv_request) { - if(creationMode == MODE_SERVER) { + if((creationMode == MODE_SERVER) || ((creationMode == MODE_MIXED) and (display_scenario==rx_scenario))) { fprintf(f," ----------> %-10s ", curmsg -> recv_request); } else { fprintf(f," %10s <---------- ", curmsg -> recv_request); @@ -1268,6 +1275,10 @@ default: ERROR("Internal error: creationMode=%d, thirdPartyMode=%d", creationMode, thirdPartyMode); } + } else if((creationMode == MODE_MIXED) and (display_scenario == main_scenario)) { + fprintf(f,"----------------Sipp Mixed Mode - main - call originating scenario------------" SIPP_ENDL); + } else if((creationMode == MODE_MIXED) and (display_scenario == rx_scenario)) { + fprintf(f,"-----------------Sipp Mixed mode - rx - call terminating screnario-------------" SIPP_ENDL); } else { assert(creationMode == MODE_SERVER); switch(thirdPartyMode) { @@ -1672,6 +1683,8 @@ display_scenario = main_scenario; } else if (!strcmp(rest, "ooc")) { display_scenario = ooc_scenario; + } else if (!strcmp(rest, "rx")) { + display_scenario = rx_scenario; } else { WARNING("Unknown display scenario: %s", rest); } @@ -3041,6 +3054,7 @@ CStat::formatTime(¤tTime),call_id, get_incoming_header_content(msg,"CSeq:"), get_incoming_first_line(msg)); } + /* got as message not relating to a known call */ if(!listener_ptr) { if(thirdPartyMode == MODE_3PCC_CONTROLLER_B || thirdPartyMode == MODE_3PCC_A_PASSIVE @@ -3048,7 +3062,7 @@ { // Adding a new OUTGOING call ! main_scenario->stats->computeStat(CStat::E_CREATE_OUTGOING_CALL); - call *new_ptr = new call(call_id, is_ipv6, 0, use_remote_sending_addr ? &remote_sending_sockaddr : &remote_sockaddr); + call *new_ptr = new call(main_scenario, call_id, is_ipv6, 0, use_remote_sending_addr ? &remote_sending_sockaddr : &remote_sockaddr); if (!new_ptr) { ERROR("Out of memory allocating a call!"); } @@ -3089,7 +3103,23 @@ // Adding a new INCOMING call ! main_scenario->stats->computeStat(CStat::E_CREATE_INCOMING_CALL); - listener_ptr = new call(call_id, socket, use_remote_sending_addr ? &remote_sending_sockaddr : src); + listener_ptr = new call(main_scenario, call_id, socket, use_remote_sending_addr ? &remote_sending_sockaddr : src); + if (!listener_ptr) { + ERROR("Out of memory allocating a call!"); + } + } + else if(creationMode == MODE_MIXED) + { +/* Ignore quitting for now ... as this is triggered when all tx calls are active + if (quitting >= 1) { + CStat::globalStat(CStat::E_OUT_OF_CALL_MSGS); + TRACE_MSG("Discarded message for new calls while quitting\n"); + return; + } +*/ + // Adding a new INCOMING call ! + rx_scenario->stats->computeStat(CStat::E_CREATE_INCOMING_CALL); + listener_ptr = new call(rx_scenario, call_id, socket, use_remote_sending_addr ? &remote_sending_sockaddr : src); if (!listener_ptr) { ERROR("Out of memory allocating a call!"); } @@ -3118,6 +3148,7 @@ } else { CStat::globalStat(CStat::E_OUT_OF_CALL_MSGS); WARNING("Discarding message which can't be mapped to a known SIPp call:\n%s", msg); + } } } @@ -3131,6 +3162,7 @@ { listener_ptr -> process_twinSippCom(msg); } + /* This is a message on a known call - process it */ else { listener_ptr -> process_incoming(msg, src); @@ -3862,6 +3894,9 @@ int socket_fd(bool use_ipv6, int transport) { int socket_type; int fd; + u_int8_t tos = SIP_TOS; + int toslen = sizeof(tos); + switch(transport) { case T_UDP: @@ -3880,6 +3915,10 @@ ERROR("Unable to get a %s socket (3)", TRANSPORT_TO_STRING(transport)); } + if(!use_ipv6) { + if ( setsockopt(fd, IPPROTO_IP, IP_TOS, (char *) &tos, toslen) < 0 ) + ERROR("Setsockopt"); + } return fd; } @@ -4302,6 +4341,28 @@ } } break; + case SIPP_OPTION_RX_INPUT_FILE: + { + REQUIRE_ARG(); + CHECK_PASS(); + FileContents *rxData = new FileContents(argv[argi]); + char *name = argv[argi]; + if (strrchr(name, '/')) { + name = strrchr(name, '/') + 1; + } else if (strrchr(name, '\\')) { + name = strrchr(name, '\\') + 1; + } + assert(name); + inFiles[name] = rxData; + /* By default, the first file is used for IP address input. */ + if (!rx_ip_file) { + rx_ip_file = name; + } + if (!rx_default_file) { + rx_default_file = name; + } + } + break; case SIPP_OPTION_INDEX_FILE: REQUIRE_ARG(); REQUIRE_ARG(); @@ -4479,7 +4540,6 @@ main_scenario->stats->setFileName(scenario_file, (char*)".csv"); } else if (!strcmp(argv[argi - 1], "-sn")) { int i = find_scenario(argv[argi]); - main_scenario = new scenario(0, i); scenario_file = new char [strlen(argv[argi])+1] ; sprintf(scenario_file,"%s", argv[argi]); @@ -4492,6 +4552,26 @@ ERROR("Internal error, I don't recognize %s as a scenario option\n", argv[argi] - 1); } break; + case SIPP_OPTION_RX_SCENARIO: + REQUIRE_ARG(); + CHECK_PASS(); + creationMode=MODE_MIXED; + if (!strcmp(argv[argi - 1], "-rxsf")) { + rx_scenario_file = new char [strlen(argv[argi])+1] ; + sprintf(rx_scenario_file,"%s", argv[argi]); + rx_scenario_file = remove_pattern (rx_scenario_file, (char*)".xml"); + rx_scenario = new scenario(argv[argi], 0); + rx_scenario->stats->setFileName(rx_scenario_file, (char*)".csv"); + } else if (!strcmp(argv[argi - 1], "-rxsn")) { + int i = find_scenario(argv[argi]); + rx_scenario = new scenario(0, i); + rx_scenario_file = new char [strlen(argv[argi])+1] ; + sprintf(rx_scenario_file,"%s", argv[argi]); + rx_scenario->stats->setFileName(argv[argi], (char*)".csv"); + } else { + ERROR("Internal error, I don't recognize %s as a scenario option\n", argv[argi] - 1); + } + break; case SIPP_OPTION_OOC_SCENARIO: REQUIRE_ARG(); CHECK_PASS(); @@ -4900,7 +4980,8 @@ /* Setting the rate and its dependant params (open_calls_allowed) */ /* If we are a client, then create the task to open new calls. */ - if (creationMode == MODE_CLIENT) { + if ((creationMode == MODE_CLIENT) || ((creationMode == MODE_MIXED) and (display_scenario==main_scenario))) + { opentask::initialize(); opentask::set_rate(rate); } Files ../orig/sipp.svn/sipp.exe and sipp.svn/sipp.exe differ diff -bruN ../orig/sipp.svn/sipp.hpp sipp.svn/sipp.hpp --- ../orig/sipp.svn/sipp.hpp 2010-11-09 02:02:28.000000000 +1300 +++ sipp.svn/sipp.hpp 2011-12-17 13:16:42.859375000 +1300 @@ -178,6 +178,13 @@ #define DEFAULT_BEHAVIOR_ALL (DEFAULT_BEHAVIOR_BYE | DEFAULT_BEHAVIOR_ABORTUNEXP | DEFAULT_BEHAVIOR_PINGREPLY) + +/************ Matt's TOS parameters **********************/ +#define AUDIO_TOS 0xb8 +#define VIDEO_TOS 0x88 +#define SIP_TOS 0x68 + + /************ User controls and command line options ***********/ extern int duration _DEFVAL(0); @@ -306,6 +313,8 @@ typedef std::map<string, FileContents *> file_map; extern file_map inFiles; typedef std::map<string, str_int_map *> file_index; +extern char *rx_ip_file _DEFVAL(NULL); +extern char *rx_default_file _DEFVAL(NULL); extern char *ip_file _DEFVAL(NULL); extern char *default_file _DEFVAL(NULL); @@ -461,8 +470,9 @@ extern bool dumpInFile _DEFVAL(0); extern bool dumpInRtt _DEFVAL(0); extern bool useCountf _DEFVAL(0); -extern char * scenario_file; extern char * slave_cfg_file; +extern char * scenario_file; +extern char * rx_scenario_file; extern unsigned long long max_log_size _DEFVAL(0); extern unsigned long long ringbuffer_size _DEFVAL(0); ------------------------------------------------------------------------------ ------------------------------------------------------------------------------ Virtualization & Cloud Management Using Capacity Planning Cloud computing makes use of virtualization - but cloud computing also focuses on allowing computing to be delivered as a service. http://www.accelacomm.com/jaw/sfnl/114/51521223/ _______________________________________________ Sipp-users mailing list Sipp-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/sipp-users