Browse Source

modules/debugger: Added module parameter reset_msgid. Added RPC command dbg.reset_msgid

The message id ($mi) will be reset but internally there is no change. This can be
useful for unit tests cases.
Victor Seva 12 years ago
parent
commit
5cbedc6b51

+ 100 - 0
modules/debugger/debugger_api.c

@@ -179,6 +179,11 @@ int _dbg_step_usleep = 100000;
  */
  */
 int _dbg_step_loops = 200;
 int _dbg_step_loops = 200;
 
 
+/**
+ * disabled by default
+ */
+int _dbg_reset_msgid = 0;
+
 /**
 /**
  *
  *
  */
  */
@@ -199,6 +204,9 @@ typedef struct _dbg_pid
 	unsigned int state;
 	unsigned int state;
 	dbg_cmd_t in;
 	dbg_cmd_t in;
 	dbg_cmd_t out;
 	dbg_cmd_t out;
+	gen_lock_t *lock;
+	unsigned int reset_msgid; /* flag to reset the id */
+	unsigned int msgid_base; /* real id since the reset */
 } dbg_pid_t;
 } dbg_pid_t;
 
 
 /**
 /**
@@ -227,6 +235,48 @@ typedef struct _dbg_bp
  */
  */
 static dbg_bp_t *_dbg_bp_list = NULL;
 static dbg_bp_t *_dbg_bp_list = NULL;
 
 
+/* defined later */
+int dbg_get_pid_index(unsigned int pid);
+
+/*!
+ * \brief Callback function that checks if reset_msgid is set
+ *  and modifies msg->id if necessary.
+ * \param msg SIP message
+ * \param flags unused
+ * \param bar unused
+ * \return 1 on success, -1 on failure
+ */
+int dbg_msgid_filter(struct sip_msg *msg, unsigned int flags, void *bar)
+{
+	unsigned int process_no = my_pid();
+	int indx = dbg_get_pid_index(process_no);
+	unsigned int msgid_base = 0;
+	unsigned int msgid_new = 0;
+	if(indx<0) return -1;
+	LM_DBG("process_no:%d indx:%d\n", process_no, indx);
+	lock_get(_dbg_pid_list[indx].lock);
+	if(_dbg_pid_list[indx].reset_msgid==1)
+	{
+		LM_DBG("reset_msgid! msgid_base:%d\n", msg->id);
+		_dbg_pid_list[indx].reset_msgid = 0;
+		_dbg_pid_list[indx].msgid_base = msg->id - 1;
+	}
+	msgid_base = _dbg_pid_list[indx].msgid_base;
+	lock_release(_dbg_pid_list[indx].lock);
+	msgid_new = msg->id - msgid_base;
+	LM_DBG("msg->id:%d msgid_base:%d -> %d\n", msg->id, msgid_base, msgid_new);
+	if(msgid_new>0)
+	{
+		msg->id = msgid_new;
+		return 1;
+	}
+	else
+	{
+		LM_WARN("msgid_new<=0??\n");
+		return -1;
+	}
+}
+
 /**
 /**
  * callback executed for each cfg action
  * callback executed for each cfg action
  */
  */
@@ -497,6 +547,22 @@ int dbg_init_mypid(void)
 		_dbg_pid_list[process_no].set |= DBG_ABKPOINT_ON;
 		_dbg_pid_list[process_no].set |= DBG_ABKPOINT_ON;
 	if(_dbg_cfgtrace==1)
 	if(_dbg_cfgtrace==1)
 		_dbg_pid_list[process_no].set |= DBG_CFGTRACE_ON;
 		_dbg_pid_list[process_no].set |= DBG_CFGTRACE_ON;
+	if(_dbg_reset_msgid==1)
+	{
+		LM_DBG("[%d] create locks\n", process_no);
+		_dbg_pid_list[process_no].lock = lock_alloc();
+		if(_dbg_pid_list[process_no].lock==NULL)
+		{
+			LM_ERR("cannot allocate the lock\n");
+			return -1;
+		}
+		if(lock_init(_dbg_pid_list[process_no].lock)==NULL)
+		{
+			LM_ERR("cannot init the lock\n");
+			lock_dealloc(_dbg_pid_list[process_no].lock);
+			return -1;
+		}
+	}
 	return 0;
 	return 0;
 }
 }
 
 
@@ -876,6 +942,39 @@ static void dbg_rpc_mod_level(rpc_t* rpc, void* ctx){
 	rpc->add(ctx, "s", "200 ok");
 	rpc->add(ctx, "s", "200 ok");
 }
 }
 
 
+/**
+ *
+ */
+static const char* dbg_rpc_reset_msgid_doc[2] = {
+	"Reset msgid on all process",
+	0
+};
+
+static void dbg_rpc_reset_msgid(rpc_t* rpc, void* ctx){
+	int i;
+	if (_dbg_reset_msgid==0)
+	{
+		rpc->fault(ctx, 500, "reset_msgid is 0. Set it to 1 to enable.");
+		return;
+	}
+	if(_dbg_pid_list==NULL)
+	{
+		rpc->fault(ctx, 500, "_dbg_pid_list is NULL");
+		return;
+	}
+	LM_DBG("set reset_msgid\n");
+	for(i=0; i<_dbg_pid_no; i++)
+	{
+		if (_dbg_pid_list[i].lock!=NULL)
+		{
+			lock_get(_dbg_pid_list[i].lock);
+			_dbg_pid_list[i].reset_msgid = 1;
+			lock_release(_dbg_pid_list[i].lock);
+		}
+	}
+	rpc->add(ctx, "s", "200 ok");
+}
+
 /**
 /**
  *
  *
  */
  */
@@ -884,6 +983,7 @@ rpc_export_t dbg_rpc[] = {
 	{"dbg.ls",        dbg_rpc_list,      dbg_rpc_list_doc,      0},
 	{"dbg.ls",        dbg_rpc_list,      dbg_rpc_list_doc,      0},
 	{"dbg.trace",     dbg_rpc_trace,     dbg_rpc_trace_doc,     0},
 	{"dbg.trace",     dbg_rpc_trace,     dbg_rpc_trace_doc,     0},
 	{"dbg.mod_level", dbg_rpc_mod_level, dbg_rpc_mod_level_doc, 0},
 	{"dbg.mod_level", dbg_rpc_mod_level, dbg_rpc_mod_level_doc, 0},
+	{"dbg.reset_msgid", dbg_rpc_reset_msgid, dbg_rpc_reset_msgid_doc, 0},
 	{0, 0, 0, 0}
 	{0, 0, 0, 0}
 };
 };
 
 

+ 10 - 0
modules/debugger/debugger_api.h

@@ -40,6 +40,16 @@ void dbg_enable_mod_levels(void);
 int dbg_init_pvcache(void);
 int dbg_init_pvcache(void);
 void dbg_enable_log_assign(void);
 void dbg_enable_log_assign(void);
 
 
+/*!
+ * \brief Callback function that checks if reset_msgid is set
+ *  and modifies msg->id if necessary.
+ * \param msg SIP message
+ * \param flags unused
+ * \param bar unused
+ * \return 1 on success, -1 on failure
+ */
+int dbg_msgid_filter(struct sip_msg *msg, unsigned int flags, void *bar);
+
 #define DBG_DP_NULL			1
 #define DBG_DP_NULL			1
 #define DBG_DP_AVP			2
 #define DBG_DP_AVP			2
 #define DBG_DP_SCRIPTVAR	4
 #define DBG_DP_SCRIPTVAR	4

+ 12 - 0
modules/debugger/debugger_mod.c

@@ -33,6 +33,7 @@
 #include "../../mod_fix.h"
 #include "../../mod_fix.h"
 #include "../../parser/parse_param.h"
 #include "../../parser/parse_param.h"
 #include "../../shm_init.h"
 #include "../../shm_init.h"
+#include "../../script_cb.h"
 
 
 #include "debugger_api.h"
 #include "debugger_api.h"
 #include "debugger_config.h"
 #include "debugger_config.h"
@@ -58,6 +59,7 @@ extern int _dbg_cfgtrace_facility;
 extern char *_dbg_cfgtrace_prefix;
 extern char *_dbg_cfgtrace_prefix;
 extern int _dbg_step_usleep;
 extern int _dbg_step_usleep;
 extern int _dbg_step_loops;
 extern int _dbg_step_loops;
+extern int _dbg_reset_msgid;
 
 
 static char * _dbg_cfgtrace_facility_str = 0;
 static char * _dbg_cfgtrace_facility_str = 0;
 static int _dbg_log_assign = 0;
 static int _dbg_log_assign = 0;
@@ -86,6 +88,7 @@ static param_export_t params[]={
 	{"mod_hash_size",     INT_PARAM, &default_dbg_cfg.mod_hash_size},
 	{"mod_hash_size",     INT_PARAM, &default_dbg_cfg.mod_hash_size},
 	{"mod_level_mode",    INT_PARAM, &default_dbg_cfg.mod_level_mode},
 	{"mod_level_mode",    INT_PARAM, &default_dbg_cfg.mod_level_mode},
 	{"mod_level",         STR_PARAM|USE_FUNC_PARAM, (void*)dbg_mod_level_param},
 	{"mod_level",         STR_PARAM|USE_FUNC_PARAM, (void*)dbg_mod_level_param},
+	{"reset_msgid",       INT_PARAM, &_dbg_reset_msgid},
 	{0, 0, 0}
 	{0, 0, 0}
 };
 };
 
 
@@ -152,6 +155,15 @@ static int mod_init(void)
 			return -1;
 			return -1;
 		}
 		}
 	}
 	}
+	if(_dbg_reset_msgid==1)
+	{
+		unsigned int ALL = REQUEST_CB+FAILURE_CB+ONREPLY_CB
+		  +BRANCH_CB+ONSEND_CB+ERROR_CB+LOCAL_CB+EVENT_CB+BRANCH_FAILURE_CB;
+		if (register_script_cb(dbg_msgid_filter, PRE_SCRIPT_CB|ALL, 0) != 0) {
+			LM_ERR("could not insert callback");
+			return -1;
+		}
+	}
 	return dbg_init_bp_list();
 	return dbg_init_bp_list();
 }
 }
 
 

+ 44 - 0
modules/debugger/doc/debugger_admin.xml

@@ -415,6 +415,27 @@ dbg_pv_dump(30, "L_DBG");
 	    </example>
 	    </example>
 	</section>
 	</section>
 
 
+	<section>
+	    <title><varname>reset_msgid</varname> (int)</title>
+	    <para>
+		Used to enable or disable the ability to reset the msgid ($mi)
+		through the dbg.reset_msgid RPC command. (0 - disabled, 1 - enabled).
+	    </para>
+	    <para>
+		<emphasis>
+		    Default value is <quote>0</quote> - feature disabled.
+		</emphasis>
+	    </para>
+	    <example>
+		<title>Set <varname>reset_msgid</varname> parameter</title>
+		<programlisting format="linespecific">
+...
+modparam("debugger", "reset_msgid", 1)
+...
+</programlisting>
+	    </example>
+	</section>
+
     </section>
     </section>
 	
 	
 	<section>
 	<section>
@@ -575,6 +596,29 @@ dbg_pv_dump(30, "L_DBG");
 		</programlisting>
 		</programlisting>
     </section>
     </section>
 
 
+	<section>
+		<title>
+		<function moreinfo="none">dbg.reset_msgid</function>
+		</title>
+		<para>
+			Resets the message sequence ($mi). Internally there is no real change.
+			This can be useful for unit test cases in order to be able to replicate
+			exactly the same kamailio output.
+
+			You need to set the debugger parameter reset_msgid to 1 to activate this
+			functionallity.
+		</para>
+		<para>
+		Name: <emphasis>dbg.reset_msgid</emphasis>
+		</para>
+		<para>
+		Examples of use with &sercmd;:
+		</para>
+        <programlisting  format="linespecific">
+		dbg.reset_msgid
+		</programlisting>
+    </section>
+
     </section>
     </section>
 	<section>
 	<section>
 		<title>Usage</title>
 		<title>Usage</title>