瀏覽代碼

siptrace: new parameter trace_init_mode

- control what kind of tracing is initialized for the module
Daniel-Constantin Mierla 5 年之前
父節點
當前提交
42c7c7a12b
共有 1 個文件被更改,包括 111 次插入97 次删除
  1. 111 97
      src/modules/siptrace/siptrace.c

+ 111 - 97
src/modules/siptrace/siptrace.c

@@ -119,6 +119,12 @@ static inline int trace_parse_raw_uri(siptrace_info_t* info);
 
 int siptrace_net_data_recv(sr_event_param_t *evp);
 int siptrace_net_data_send(sr_event_param_t *evp);
+
+#define SIPTRACE_INIT_MODE_ALL 0
+#define SIPTRACE_INIT_MODE_CORECB 1
+#define SIPTRACE_INIT_MODE_SCRIPT 2
+
+static int _siptrace_init_mode = 0;
 static int _siptrace_mode = 0;
 
 
@@ -243,6 +249,7 @@ static param_export_t params[] = {
 	{"hep_version", INT_PARAM, &hep_version},
 	{"hep_capture_id", INT_PARAM, &hep_capture_id},
 	{"trace_delayed", INT_PARAM, &trace_delayed},
+	{"trace_init_mode", PARAM_INT, &_siptrace_init_mode},
 	{"trace_mode", PARAM_INT, &_siptrace_mode},
 	{0, 0, 0}
 };
@@ -297,83 +304,28 @@ static int mod_init(void)
 		return -1;
 	}
 
-	if(trace_flag_param!=-1) {
-		if(trace_flag_param < -1 || trace_flag_param > (int)MAX_FLAG) {
-			LM_ERR("invalid trace flag %d\n", trace_flag_param);
-			return -1;
-		}
-		trace_flag = 1 << trace_flag_param;
-	}
-
 	if(hep_version != 1 && hep_version != 2 && hep_version != 3) {
 		LM_ERR("unsupported version of HEP");
 		return -1;
 	}
 
-	/* Find a database module if needed */
-	if((_siptrace_mode & SIPTRACE_MODE_DB) || (trace_to_database != 0)) {
-		if(db_bind_mod(&db_url, &db_funcs)) {
-			LM_ERR("unable to bind database module\n");
-			return -1;
-		}
-		if(!DB_CAPABILITY(db_funcs, DB_CAP_INSERT)) {
-			LM_ERR("database modules does not provide all functions needed"
-				   " by module\n");
-			return -1;
-		}
-	}
-
 	trace_on_flag = (int *)shm_malloc(sizeof(int));
 	if(trace_on_flag == NULL) {
 		LM_ERR("no more shm memory left\n");
 		return -1;
 	}
-
 	*trace_on_flag = trace_on;
 
-	xheaders_write_flag = (int *)shm_malloc(sizeof(int));
-	xheaders_read_flag = (int *)shm_malloc(sizeof(int));
-	if(!(xheaders_write_flag && xheaders_read_flag)) {
-		LM_ERR("no more shm memory left\n");
-		return -1;
-	}
-	*xheaders_write_flag = xheaders_write;
-	*xheaders_read_flag = xheaders_read;
-
-	/* register callbacks to TM */
-	if(load_tm_api(&tmb) != 0) {
-		LM_WARN("can't load tm api. Will not install tm callbacks.\n");
-	}
-
-	if (load_dlg_api(&dlgb) < 0) {
-		LM_INFO("can't load dlg api. Will not install dialog callbacks.\n");
-	} else {
-		if (dlgb.register_dlgcb(NULL, DLGCB_CREATED, trace_dialog, NULL, NULL) != 0) {
-			LM_ERR("failed to register dialog callbacks! Tracing dialogs won't be available\n");
-		}
-	}
-
-	/* bind the SL API */
-	if(sl_load_api(&slb) != 0) {
-		LM_WARN("cannot bind to SL API. Will not install sl callbacks.\n");
-	} else {
-		/* register sl callbacks */
-		memset(&slcb, 0, sizeof(sl_cbelem_t));
-
-		slcb.type = SLCB_REPLY_READY;
-		slcb.cbf = trace_sl_onreply_out;
-		if(slb.register_cb(&slcb) != 0) {
-			LM_ERR("can't register for SLCB_REPLY_READY\n");
+	/* find a database module if needed */
+	if((_siptrace_mode & SIPTRACE_MODE_DB) || (trace_to_database != 0)) {
+		if(db_bind_mod(&db_url, &db_funcs)) {
+			LM_ERR("unable to bind database module\n");
 			return -1;
 		}
-
-		if(trace_sl_acks) {
-			slcb.type = SLCB_ACK_FILTERED;
-			slcb.cbf = trace_sl_ack_in;
-			if(slb.register_cb(&slcb) != 0) {
-				LM_ERR("can't register for SLCB_ACK_FILTERED\n");
-				return -1;
-			}
+		if(!DB_CAPABILITY(db_funcs, DB_CAP_INSERT)) {
+			LM_ERR("database modules does not provide all functions needed"
+				   " by module\n");
+			return -1;
 		}
 	}
 
@@ -418,48 +370,110 @@ static int mod_init(void)
 		}
 	}
 
-	if(traced_user_avp_str.s && traced_user_avp_str.len > 0) {
-		if(pv_parse_spec(&traced_user_avp_str, &avp_spec) == 0
-				|| avp_spec.type != PVT_AVP) {
-			LM_ERR("malformed or non AVP %.*s AVP definition\n",
-					traced_user_avp_str.len, traced_user_avp_str.s);
-			return -1;
+	xheaders_write_flag = (int *)shm_malloc(sizeof(int));
+	xheaders_read_flag = (int *)shm_malloc(sizeof(int));
+	if(!(xheaders_write_flag && xheaders_read_flag)) {
+		LM_ERR("no more shm memory left\n");
+		return -1;
+	}
+	*xheaders_write_flag = xheaders_write;
+	*xheaders_read_flag = xheaders_read;
+
+	if(_siptrace_init_mode==SIPTRACE_INIT_MODE_ALL
+			|| _siptrace_init_mode==SIPTRACE_INIT_MODE_SCRIPT) {
+		if(trace_flag_param!=-1) {
+			if(trace_flag_param < -1 || trace_flag_param > (int)MAX_FLAG) {
+				LM_ERR("invalid trace flag %d\n", trace_flag_param);
+				return -1;
+			}
+			trace_flag = 1 << trace_flag_param;
 		}
 
-		if(pv_get_avp_name(
-				   0, &avp_spec.pvp, &traced_user_avp, &traced_user_avp_type)
-				!= 0) {
-			LM_ERR("[%.*s] - invalid AVP definition\n", traced_user_avp_str.len,
-					traced_user_avp_str.s);
-			return -1;
+		/* register callbacks to TM */
+		if(load_tm_api(&tmb) != 0) {
+			LM_WARN("can't load tm api. Will not install tm callbacks.\n");
 		}
-	} else {
-		traced_user_avp.n = 0;
-		traced_user_avp_type = 0;
-	}
-	if(trace_table_avp_str.s && trace_table_avp_str.len > 0) {
-		if(pv_parse_spec(&trace_table_avp_str, &avp_spec) == 0
-				|| avp_spec.type != PVT_AVP) {
-			LM_ERR("malformed or non AVP %.*s AVP definition\n",
-					trace_table_avp_str.len, trace_table_avp_str.s);
-			return -1;
+
+		if (load_dlg_api(&dlgb) < 0) {
+			LM_INFO("can't load dlg api. Will not install dialog callbacks.\n");
+		} else {
+			if (dlgb.register_dlgcb(NULL, DLGCB_CREATED, trace_dialog, NULL, NULL) != 0) {
+				LM_ERR("failed to register dialog callbacks! Tracing dialogs won't be available\n");
+			}
 		}
 
-		if(pv_get_avp_name(
-				   0, &avp_spec.pvp, &trace_table_avp, &trace_table_avp_type)
-				!= 0) {
-			LM_ERR("[%.*s] - invalid AVP definition\n", trace_table_avp_str.len,
-					trace_table_avp_str.s);
-			return -1;
+		/* bind the SL API */
+		if(sl_load_api(&slb) != 0) {
+			LM_WARN("cannot bind to SL API. Will not install sl callbacks.\n");
+		} else {
+			/* register sl callbacks */
+			memset(&slcb, 0, sizeof(sl_cbelem_t));
+
+			slcb.type = SLCB_REPLY_READY;
+			slcb.cbf = trace_sl_onreply_out;
+			if(slb.register_cb(&slcb) != 0) {
+				LM_ERR("can't register for SLCB_REPLY_READY\n");
+				return -1;
+			}
+
+			if(trace_sl_acks) {
+				slcb.type = SLCB_ACK_FILTERED;
+				slcb.cbf = trace_sl_ack_in;
+				if(slb.register_cb(&slcb) != 0) {
+					LM_ERR("can't register for SLCB_ACK_FILTERED\n");
+					return -1;
+				}
+			}
+		}
+		if(traced_user_avp_str.s && traced_user_avp_str.len > 0) {
+			if(pv_parse_spec(&traced_user_avp_str, &avp_spec) == 0
+					|| avp_spec.type != PVT_AVP) {
+				LM_ERR("malformed or non AVP %.*s AVP definition\n",
+						traced_user_avp_str.len, traced_user_avp_str.s);
+				return -1;
+			}
+
+			if(pv_get_avp_name(
+					   0, &avp_spec.pvp, &traced_user_avp, &traced_user_avp_type)
+					!= 0) {
+				LM_ERR("[%.*s] - invalid AVP definition\n", traced_user_avp_str.len,
+						traced_user_avp_str.s);
+				return -1;
+			}
+		} else {
+			traced_user_avp.n = 0;
+			traced_user_avp_type = 0;
+		}
+		if(trace_table_avp_str.s && trace_table_avp_str.len > 0) {
+			if(pv_parse_spec(&trace_table_avp_str, &avp_spec) == 0
+					|| avp_spec.type != PVT_AVP) {
+				LM_ERR("malformed or non AVP %.*s AVP definition\n",
+						trace_table_avp_str.len, trace_table_avp_str.s);
+				return -1;
+			}
+
+			if(pv_get_avp_name(
+					   0, &avp_spec.pvp, &trace_table_avp, &trace_table_avp_type)
+					!= 0) {
+				LM_ERR("[%.*s] - invalid AVP definition\n", trace_table_avp_str.len,
+						trace_table_avp_str.s);
+				return -1;
+			}
+		} else {
+			trace_table_avp.n = 0;
+			trace_table_avp_type = 0;
 		}
-	} else {
-		trace_table_avp.n = 0;
-		trace_table_avp_type = 0;
 	}
 
-	if(_siptrace_mode != SIPTRACE_MODE_NONE) {
-		sr_event_register_cb(SREV_NET_DATA_RECV, siptrace_net_data_recv);
-		sr_event_register_cb(SREV_NET_DATA_SEND, siptrace_net_data_send);
+	if(_siptrace_init_mode==SIPTRACE_INIT_MODE_ALL
+			|| _siptrace_init_mode==SIPTRACE_INIT_MODE_CORECB) {
+		if(_siptrace_mode != SIPTRACE_MODE_NONE) {
+			sr_event_register_cb(SREV_NET_DATA_RECV, siptrace_net_data_recv);
+			sr_event_register_cb(SREV_NET_DATA_SEND, siptrace_net_data_send);
+		} else if(_siptrace_init_mode==SIPTRACE_INIT_MODE_CORECB) {
+			LM_ERR("invalid config options for core callbacks tracing\n");
+			return -1;
+		}
 	}
 	return 0;
 }