فهرست منبع

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 سال پیش
والد
کامیت
5cbedc6b51
4فایلهای تغییر یافته به همراه166 افزوده شده و 0 حذف شده
  1. 100 0
      modules/debugger/debugger_api.c
  2. 10 0
      modules/debugger/debugger_api.h
  3. 12 0
      modules/debugger/debugger_mod.c
  4. 44 0
      modules/debugger/doc/debugger_admin.xml

+ 100 - 0
modules/debugger/debugger_api.c

@@ -179,6 +179,11 @@ int _dbg_step_usleep = 100000;
  */
 int _dbg_step_loops = 200;
 
+/**
+ * disabled by default
+ */
+int _dbg_reset_msgid = 0;
+
 /**
  *
  */
@@ -199,6 +204,9 @@ typedef struct _dbg_pid
 	unsigned int state;
 	dbg_cmd_t in;
 	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;
 
 /**
@@ -227,6 +235,48 @@ typedef struct _dbg_bp
  */
 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
  */
@@ -497,6 +547,22 @@ int dbg_init_mypid(void)
 		_dbg_pid_list[process_no].set |= DBG_ABKPOINT_ON;
 	if(_dbg_cfgtrace==1)
 		_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;
 }
 
@@ -876,6 +942,39 @@ static void dbg_rpc_mod_level(rpc_t* rpc, void* ctx){
 	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.trace",     dbg_rpc_trace,     dbg_rpc_trace_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}
 };
 

+ 10 - 0
modules/debugger/debugger_api.h

@@ -40,6 +40,16 @@ void dbg_enable_mod_levels(void);
 int dbg_init_pvcache(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_AVP			2
 #define DBG_DP_SCRIPTVAR	4

+ 12 - 0
modules/debugger/debugger_mod.c

@@ -33,6 +33,7 @@
 #include "../../mod_fix.h"
 #include "../../parser/parse_param.h"
 #include "../../shm_init.h"
+#include "../../script_cb.h"
 
 #include "debugger_api.h"
 #include "debugger_config.h"
@@ -58,6 +59,7 @@ extern int _dbg_cfgtrace_facility;
 extern char *_dbg_cfgtrace_prefix;
 extern int _dbg_step_usleep;
 extern int _dbg_step_loops;
+extern int _dbg_reset_msgid;
 
 static char * _dbg_cfgtrace_facility_str = 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_level_mode",    INT_PARAM, &default_dbg_cfg.mod_level_mode},
 	{"mod_level",         STR_PARAM|USE_FUNC_PARAM, (void*)dbg_mod_level_param},
+	{"reset_msgid",       INT_PARAM, &_dbg_reset_msgid},
 	{0, 0, 0}
 };
 
@@ -152,6 +155,15 @@ static int mod_init(void)
 			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();
 }
 

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

@@ -415,6 +415,27 @@ dbg_pv_dump(30, "L_DBG");
 	    </example>
 	</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>
@@ -575,6 +596,29 @@ dbg_pv_dump(30, "L_DBG");
 		</programlisting>
     </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>
 		<title>Usage</title>