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.
269 lines
7.0 KiB
269 lines
7.0 KiB
/*
|
|
* This program 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.
|
|
*
|
|
* This program 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
|
|
*
|
|
* Author : Richard GAYRAUD - 04 Nov 2003
|
|
* Olivier Jacques
|
|
* From Hewlett Packard Company.
|
|
* Peter Higginson
|
|
* JPeG
|
|
* Guillaume TEISSIER from FTR&D
|
|
*/
|
|
|
|
#ifndef __SCENARIO__
|
|
#define __SCENARIO__
|
|
|
|
#include <map>
|
|
#include <sys/socket.h>
|
|
#include "actions.hpp"
|
|
#include "variables.hpp"
|
|
#include "message.hpp"
|
|
#include "stat.hpp"
|
|
|
|
|
|
#define MSG_TYPE_SENDCMD 0
|
|
#define MSG_TYPE_RECVCMD 1
|
|
|
|
#define MSG_TYPE_SEND 2
|
|
#define MSG_TYPE_RECV 3
|
|
#define MSG_TYPE_PAUSE 4
|
|
#define MSG_TYPE_NOP 5
|
|
|
|
#define MODE_CLIENT 0
|
|
#define MODE_SERVER 1
|
|
|
|
#define MODE_3PCC_NONE 0
|
|
#define MODE_3PCC_CONTROLLER_A 2
|
|
#define MODE_3PCC_CONTROLLER_B 3
|
|
#define MODE_3PCC_A_PASSIVE 4
|
|
|
|
/* 3pcc extended mode*/
|
|
#define MODE_MASTER 5
|
|
#define MODE_MASTER_PASSIVE 6
|
|
#define MODE_SLAVE 7
|
|
|
|
#define OPTIONAL_TRUE 1
|
|
#define OPTIONAL_FALSE 0
|
|
#define OPTIONAL_GLOBAL 2
|
|
|
|
class message {
|
|
|
|
public:
|
|
/* If this is a pause */
|
|
CSample *pause_distribution;
|
|
int pause_variable;
|
|
/* This string is used for the display screen. */
|
|
char *pause_desc;
|
|
/* Is this a final pause, intended for catching retransmissions? */
|
|
bool timewait;
|
|
|
|
/* Number of sessions in a pause */
|
|
int sessions;
|
|
|
|
/* should collect route set? */
|
|
bool bShouldRecordRoutes;
|
|
|
|
/* should collect authentication info? */
|
|
bool bShouldAuthenticate;
|
|
|
|
/* If this is a send */
|
|
SendingMessage *send_scheme;
|
|
unsigned int retrans_delay;
|
|
/* The receive/send timeout. */
|
|
unsigned int timeout;
|
|
|
|
/* 3pcc extended mode: if this is a sendCmd */
|
|
char * peer_dest;
|
|
|
|
/* 3pcc extended mode: if this is a recvCmd */
|
|
char * peer_src;
|
|
|
|
/* If this is a recv */
|
|
int recv_response;
|
|
char * recv_request;
|
|
int optional;
|
|
bool advance_state;
|
|
int regexp_match;
|
|
regex_t * regexp_compile;
|
|
|
|
/* Anyway */
|
|
int start_rtd;
|
|
int stop_rtd;
|
|
bool repeat_rtd;
|
|
int counter;
|
|
double lost;
|
|
int crlf;
|
|
bool hide;
|
|
char * display_str;
|
|
int next;
|
|
char * nextLabel;
|
|
int test;
|
|
int condexec;
|
|
bool condexec_inverse;
|
|
int chance;/* 0=always, RAND_MAX+1=never (test rand() >= chance) */
|
|
int on_timeout;
|
|
char * onTimeoutLabel;
|
|
|
|
/* Statistics */
|
|
unsigned long nb_sent;
|
|
unsigned long nb_recv;
|
|
unsigned long nb_sent_retrans;
|
|
unsigned long nb_recv_retrans;
|
|
unsigned long nb_timeout;
|
|
unsigned long nb_unexp;
|
|
unsigned long nb_lost;
|
|
|
|
CActions* M_actions;
|
|
|
|
int M_type;
|
|
|
|
SendingMessage *M_sendCmdData;
|
|
unsigned long M_nbCmdSent;
|
|
unsigned long M_nbCmdRecv;
|
|
|
|
typedef enum {
|
|
ContentLengthNoPresent = 0,
|
|
ContentLengthValueZero,
|
|
ContentLengthValueNoZero
|
|
}ContentLengthFlag;
|
|
|
|
ContentLengthFlag content_length_flag ;
|
|
|
|
char *recv_response_for_cseq_method_list;
|
|
int start_txn;
|
|
int ack_txn;
|
|
int response_txn;
|
|
int index;
|
|
const char * desc;
|
|
|
|
message(int index, const char *desc);
|
|
~message();
|
|
};
|
|
|
|
typedef std::vector<message *> msgvec;
|
|
|
|
struct txnControlInfo {
|
|
char *name;
|
|
bool isInvite;
|
|
int acks;
|
|
int started;
|
|
int responses;
|
|
};
|
|
typedef std::vector<txnControlInfo> txnvec;
|
|
|
|
|
|
class scenario {
|
|
public:
|
|
scenario(char * filename, int deflt);
|
|
~scenario();
|
|
|
|
void runInit();
|
|
|
|
msgvec messages;
|
|
msgvec initmessages;
|
|
char *name;
|
|
int duration;
|
|
txnvec transactions;
|
|
int unexpected_jump;
|
|
int retaddr;
|
|
int pausedaddr;
|
|
|
|
void computeSippMode();
|
|
|
|
int get_var(const char *varName, const char *what);
|
|
int get_counter(const char *varName, const char *what);
|
|
int get_rtd(const char *ptr, bool start);
|
|
int find_var(const char *varName, const char *what);
|
|
|
|
CStat *stats;
|
|
AllocVariableTable *allocVars;
|
|
|
|
private:
|
|
|
|
/* The mapping of labels to IDs. */
|
|
str_int_map labelMap;
|
|
str_int_map initLabelMap;
|
|
|
|
str_int_map txnMap;
|
|
|
|
bool found_timewait;
|
|
|
|
void getBookKeeping(message *message);
|
|
void getCommonAttributes(message *message);
|
|
void getActionForThisMessage(message *message);
|
|
void parseAction(CActions *actions);
|
|
void handle_arithmetic(CAction *tmpAction, char *what);
|
|
void handle_rhs(CAction *tmpAction, char *what);
|
|
void checkOptionalRecv(char *elem, unsigned int scenario_file_cursor);
|
|
|
|
void apply_labels(msgvec v, str_int_map labels);
|
|
void validate_variable_usage();
|
|
void validate_txn_usage();
|
|
|
|
int get_txn(const char *txnName, const char *what, bool start, bool isInvite, bool isAck);
|
|
int xp_get_var(const char *name, const char *what);
|
|
int xp_get_var(const char *name, const char *what, int defval);
|
|
|
|
bool hidedefault;
|
|
bool last_recv_optional;
|
|
};
|
|
|
|
/* There are external variable containing the current scenario */
|
|
extern scenario *main_scenario;
|
|
extern scenario *ooc_scenario;
|
|
extern scenario *aa_scenario;
|
|
extern scenario *display_scenario;
|
|
extern int creationMode;
|
|
extern int sendMode;
|
|
extern int thirdPartyMode;
|
|
|
|
extern message::ContentLengthFlag content_length_flag;
|
|
|
|
void load_scenario(char * filename,
|
|
int deflt);
|
|
|
|
/* 3pcc extended mode */
|
|
void parse_slave_cfg();
|
|
|
|
void getActionForThisMessage();
|
|
CSample *parse_distribution(bool oldstyle);
|
|
int createIntegerTable(char * P_listeStr,
|
|
unsigned int ** listeInteger,
|
|
int * sizeOfList);
|
|
|
|
int isWellFormed(char * P_listeStr,
|
|
int * nombre);
|
|
|
|
/* String table functions. */
|
|
int createStringTable(char * inputString, char *** stringList, int *sizeOfList);
|
|
void freeStringTable(char ** stringList, int sizeOfList);
|
|
|
|
|
|
|
|
int find_scenario(const char *scenario);
|
|
extern char * default_scenario[12];
|
|
|
|
/* Useful utility functions for parsing integers, etc. */
|
|
long get_long(const char *ptr, const char *what);
|
|
unsigned long long get_long_long(const char *ptr, const char *what);
|
|
long get_time(const char *ptr, const char *what, int multiplier);
|
|
double get_double(const char *ptr, const char *what);
|
|
bool get_bool(const char *ptr, const char *what);
|
|
int time_string(double ms, char *res, int reslen);
|
|
int get_var(const char *varName, const char *what);
|
|
|
|
extern int get_cr_number(char *msg);
|
|
|
|
#endif
|