From 5192377be91a09b48476944b05c3ec182758e88c Mon Sep 17 00:00:00 2001 From: Stefan Mititelu Date: Tue, 17 Nov 2015 12:39:22 +0200 Subject: [PATCH 01/14] rtpengine: Add db 'disabled' column Able to load rtp nodes state from database. Add "disabled" column with disabled_col modparam: - if disabled != 0, disable the node permanent (similar to disabling it manually using kamctl fifo command) - if disabled == 0, keep the current behaviour (set ticks to 0, ping and disable temporary in case the node is not responding) --- modules/rtpengine/doc/rtpengine_admin.xml | 21 ++++++++++++++++++ modules/rtpengine/rtpengine.c | 26 ++++++++++++----------- modules/rtpengine/rtpengine.h | 6 +++++- modules/rtpengine/rtpengine_db.c | 19 +++++++++++++---- 4 files changed, 55 insertions(+), 17 deletions(-) diff --git a/modules/rtpengine/doc/rtpengine_admin.xml b/modules/rtpengine/doc/rtpengine_admin.xml index 8b623c8c112..b29a1087d6e 100644 --- a/modules/rtpengine/doc/rtpengine_admin.xml +++ b/modules/rtpengine/doc/rtpengine_admin.xml @@ -453,6 +453,27 @@ modparam("rtpengine", "hash_table_size", "123") ... modparam("rtpengine", "hash_table_tout", "300") ... + + + + + +
+ <varname>disabled_col</varname> (string) + + Column name in the rtpproxy table. If database mode is activated, + set the state of rtp nodes according to this column, on startup. + The MySQL value for this column is INT. + + + By default, the column name is "disabled". + + + Set <varname>disabled_col</varname> parameter + +... +modparam("rtpengine", "disabled_col", "disabled_column_name") +...
diff --git a/modules/rtpengine/rtpengine.c b/modules/rtpengine/rtpengine.c index bba10efc4b7..016d82c6d06 100644 --- a/modules/rtpengine/rtpengine.c +++ b/modules/rtpengine/rtpengine.c @@ -103,9 +103,6 @@ MODULE_VERSION #define MI_SET_NATPING_STATE "nh_enable_ping" #define MI_DEFAULT_NATPING_STATE 1 -#define MI_MIN_RECHECK_TICKS 0 -#define MI_MAX_RECHECK_TICKS (unsigned int)-1 - #define MI_ENABLE_RTP_PROXY "nh_enable_rtpp" #define MI_SHOW_RTP_PROXIES "nh_show_rtpp" #define MI_PING_RTP_PROXY "nh_ping_rtpp" @@ -338,9 +335,10 @@ static param_export_t params[] = { {"rtpengine_tout_ms", INT_PARAM, &rtpengine_tout_ms }, {"rtpengine_allow_op", INT_PARAM, &rtpengine_allow_op }, {"queried_nodes_limit", INT_PARAM, &queried_nodes_limit }, - {"db_url", PARAM_STR, &rtpp_db_url }, - {"table_name", PARAM_STR, &rtpp_table_name }, - {"url_col", PARAM_STR, &rtpp_url_col }, + {"db_url", PARAM_STR, &rtpp_db_url }, + {"table_name", PARAM_STR, &rtpp_table_name }, + {"url_col", PARAM_STR, &rtpp_url_col }, + {"disabled_col", PARAM_STR, &rtpp_disabled_col }, {"extra_id_pv", PARAM_STR, &extra_id_pv_param }, {"setid_avp", PARAM_STRING, &setid_avp_param }, {"force_send_interface", PARAM_STRING, &force_send_ip_str }, @@ -644,7 +642,7 @@ struct rtpp_set *get_rtpp_set(int set_id) } -int add_rtpengine_socks(struct rtpp_set * rtpp_list, char * rtpproxy) +int add_rtpengine_socks(struct rtpp_set * rtpp_list, char * rtpproxy, int disabled, unsigned int ticks) { /* Make rtp proxies list. */ char *p, *p1, *p2, *plim; @@ -679,10 +677,14 @@ int add_rtpengine_socks(struct rtpp_set * rtpp_list, char * rtpproxy) } memset(pnode, 0, sizeof(*pnode)); pnode->idx = rtpp_no++; - pnode->rn_recheck_ticks = 0; + if (ticks == MI_MAX_RECHECK_TICKS) { + pnode->rn_recheck_ticks = ticks; + } else { + pnode->rn_recheck_ticks = ticks + get_ticks(); + } pnode->rn_weight = weight; pnode->rn_umode = 0; - pnode->rn_disabled = 0; + pnode->rn_disabled = disabled; pnode->rn_url.s = shm_malloc(p2 - p1 + 1); if (pnode->rn_url.s == NULL) { shm_free(pnode); @@ -775,7 +777,7 @@ static int rtpengine_add_rtpengine_set( char * rtp_proxies) if (rtpp_list != NULL) { - if (add_rtpengine_socks(rtpp_list, rtp_proxies) != 0) + if (add_rtpengine_socks(rtpp_list, rtp_proxies, 0, 0) != 0) goto error; else return 0; @@ -2114,8 +2116,8 @@ rtpp_test(struct rtpp_node *node, int isdisabled, int force) cp = send_rtpp_command(node, dict, &ret); if (!cp) { - node->rn_disabled = 1; - node->rn_recheck_ticks = get_ticks() + rtpengine_disable_tout; + node->rn_disabled = 1; + node->rn_recheck_ticks = get_ticks() + rtpengine_disable_tout; LM_ERR("proxy did not respond to ping\n"); goto error; } diff --git a/modules/rtpengine/rtpengine.h b/modules/rtpengine/rtpengine.h index 71ce2645485..5d46b5bb4e2 100644 --- a/modules/rtpengine/rtpengine.h +++ b/modules/rtpengine/rtpengine.h @@ -26,6 +26,9 @@ #include "bencode.h" #include "../../str.h" +#define MI_MIN_RECHECK_TICKS 0 +#define MI_MAX_RECHECK_TICKS (unsigned int)-1 + struct rtpp_node { unsigned int idx; /* overall index */ str rn_url; /* unparsed, deletable */ @@ -59,7 +62,7 @@ struct rtpp_set_head{ struct rtpp_set *get_rtpp_set(int set_id); -int add_rtpengine_socks(struct rtpp_set * rtpp_list, char * rtpproxy); +int add_rtpengine_socks(struct rtpp_set * rtpp_list, char * rtpproxy, int disabled, unsigned int ticks); int init_rtpproxy_db(void); @@ -67,6 +70,7 @@ int init_rtpproxy_db(void); extern str rtpp_db_url; extern str rtpp_table_name; extern str rtpp_url_col; +extern str rtpp_disabled_col; #endif diff --git a/modules/rtpengine/rtpengine_db.c b/modules/rtpengine/rtpengine_db.c index 82c64bb4a1a..bd4f08fcd86 100644 --- a/modules/rtpengine/rtpengine_db.c +++ b/modules/rtpengine/rtpengine_db.c @@ -34,6 +34,7 @@ str rtpp_db_url = {NULL, 0}; str rtpp_table_name = str_init("rtpproxy"); str rtpp_set_id_col = str_init("set_id"); str rtpp_url_col = str_init("url"); +str rtpp_disabled_col = str_init("disabled"); static int rtpp_connect_db(void) { @@ -63,13 +64,16 @@ static int rtpp_load_db(void) db1_res_t *res = NULL; db_val_t *values = NULL; db_row_t *rows = NULL; - db_key_t query_cols[] = {&rtpp_set_id_col, &rtpp_url_col}; + db_key_t query_cols[] = {&rtpp_set_id_col, &rtpp_url_col, &rtpp_disabled_col}; str url; int set_id; + int disabled; + unsigned int ticks; + /* int weight, flags; */ int n_rows = 0; - int n_cols = 2; + int n_cols = 3; if (rtpp_db_handle == NULL) { @@ -101,6 +105,12 @@ static int rtpp_load_db(void) set_id = VAL_INT(values); url.s = VAL_STR(values+1).s; url.len = strlen(url.s); + disabled = VAL_INT(values+2); + if (disabled) { + ticks = MI_MAX_RECHECK_TICKS; + } else { + ticks = 0; + } /* weight = VAL_INT(values+2); flags = VAL_INT(values+3); @@ -111,9 +121,10 @@ static int rtpp_load_db(void) continue; } - if (add_rtpengine_socks(rtpp_list, url.s) != 0) + if (add_rtpengine_socks(rtpp_list, url.s, disabled, ticks) != 0) { - LM_ERR("error inserting '%.*s' into set %d\n", url.len, url.s, set_id); + LM_ERR("error inserting '%.*s' into set %d disabled=%d\n", + url.len, url.s, set_id, disabled); } } From 55734eb2ea6dfcda679570f08b3bf331a4f44f76 Mon Sep 17 00:00:00 2001 From: Stefan Mititelu Date: Tue, 17 Nov 2015 13:37:19 +0200 Subject: [PATCH 02/14] rtpengine: Add setid_col modparam Allow setid column name. Updated doku. --- modules/rtpengine/doc/rtpengine_admin.xml | 23 ++++++++++++++++++++++- modules/rtpengine/rtpengine.c | 1 + modules/rtpengine/rtpengine.h | 1 + modules/rtpengine/rtpengine_db.c | 14 +++++++------- 4 files changed, 31 insertions(+), 8 deletions(-) diff --git a/modules/rtpengine/doc/rtpengine_admin.xml b/modules/rtpengine/doc/rtpengine_admin.xml index b29a1087d6e..d2b28bde7d5 100644 --- a/modules/rtpengine/doc/rtpengine_admin.xml +++ b/modules/rtpengine/doc/rtpengine_admin.xml @@ -458,12 +458,33 @@ modparam("rtpengine", "hash_table_tout", "300") +
+ <varname>setid_col</varname> (string) + + Column name in the rtpproxy table. If database mode is activated, + set the setid of rtp nodes according to this column, on startup. + The MySQL value for this column should be INT UNSIGNED. + + + By default, the column name is "setid". + + + Set <varname>setid_col</varname> parameter + +... +modparam("rtpengine", "setid_col", "setid_column_name") +... + + +
+ +
<varname>disabled_col</varname> (string) Column name in the rtpproxy table. If database mode is activated, set the state of rtp nodes according to this column, on startup. - The MySQL value for this column is INT. + The MySQL value for this column should be INT. By default, the column name is "disabled". diff --git a/modules/rtpengine/rtpengine.c b/modules/rtpengine/rtpengine.c index 016d82c6d06..42646b339f1 100644 --- a/modules/rtpengine/rtpengine.c +++ b/modules/rtpengine/rtpengine.c @@ -337,6 +337,7 @@ static param_export_t params[] = { {"queried_nodes_limit", INT_PARAM, &queried_nodes_limit }, {"db_url", PARAM_STR, &rtpp_db_url }, {"table_name", PARAM_STR, &rtpp_table_name }, + {"setid_col", PARAM_STR, &rtpp_setid_col }, {"url_col", PARAM_STR, &rtpp_url_col }, {"disabled_col", PARAM_STR, &rtpp_disabled_col }, {"extra_id_pv", PARAM_STR, &extra_id_pv_param }, diff --git a/modules/rtpengine/rtpengine.h b/modules/rtpengine/rtpengine.h index 5d46b5bb4e2..48eeaf1f071 100644 --- a/modules/rtpengine/rtpengine.h +++ b/modules/rtpengine/rtpengine.h @@ -69,6 +69,7 @@ int init_rtpproxy_db(void); extern str rtpp_db_url; extern str rtpp_table_name; +extern str rtpp_setid_col; extern str rtpp_url_col; extern str rtpp_disabled_col; diff --git a/modules/rtpengine/rtpengine_db.c b/modules/rtpengine/rtpengine_db.c index bd4f08fcd86..87cdc605303 100644 --- a/modules/rtpengine/rtpengine_db.c +++ b/modules/rtpengine/rtpengine_db.c @@ -32,7 +32,7 @@ static db1_con_t *rtpp_db_handle = NULL; str rtpp_db_url = {NULL, 0}; str rtpp_table_name = str_init("rtpproxy"); -str rtpp_set_id_col = str_init("set_id"); +str rtpp_setid_col = str_init("setid"); str rtpp_url_col = str_init("url"); str rtpp_disabled_col = str_init("disabled"); @@ -64,10 +64,10 @@ static int rtpp_load_db(void) db1_res_t *res = NULL; db_val_t *values = NULL; db_row_t *rows = NULL; - db_key_t query_cols[] = {&rtpp_set_id_col, &rtpp_url_col, &rtpp_disabled_col}; + db_key_t query_cols[] = {&rtpp_setid_col, &rtpp_url_col, &rtpp_disabled_col}; str url; - int set_id; + int setid; int disabled; unsigned int ticks; @@ -102,7 +102,7 @@ static int rtpp_load_db(void) { values = ROW_VALUES(rows + i); - set_id = VAL_INT(values); + setid = VAL_INT(values); url.s = VAL_STR(values+1).s; url.len = strlen(url.s); disabled = VAL_INT(values+2); @@ -115,16 +115,16 @@ static int rtpp_load_db(void) weight = VAL_INT(values+2); flags = VAL_INT(values+3); */ - if ((rtpp_list = get_rtpp_set(set_id)) == NULL) + if ((rtpp_list = get_rtpp_set(setid)) == NULL) { - LM_ERR("error getting rtpp_list for set %d\n", set_id); + LM_ERR("error getting rtpp_list for set %d\n", setid); continue; } if (add_rtpengine_socks(rtpp_list, url.s, disabled, ticks) != 0) { LM_ERR("error inserting '%.*s' into set %d disabled=%d\n", - url.len, url.s, set_id, disabled); + url.len, url.s, setid, disabled); } } From 20e4a5d5d415e12e3dca5dd3dab5f36c49058b42 Mon Sep 17 00:00:00 2001 From: Stefan Mititelu Date: Tue, 17 Nov 2015 14:28:35 +0200 Subject: [PATCH 03/14] rtpengine: Update doku for rtpengine database The module is able to load nodes specified in a database. Update doku for this. --- modules/rtpengine/doc/rtpengine_admin.xml | 105 +++++++++++++++++++++- modules/rtpengine/rtpengine_db.c | 2 +- 2 files changed, 104 insertions(+), 3 deletions(-) diff --git a/modules/rtpengine/doc/rtpengine_admin.xml b/modules/rtpengine/doc/rtpengine_admin.xml index d2b28bde7d5..4fd04815ae6 100644 --- a/modules/rtpengine/doc/rtpengine_admin.xml +++ b/modules/rtpengine/doc/rtpengine_admin.xml @@ -458,10 +458,86 @@ modparam("rtpengine", "hash_table_tout", "300")
+ + +
+ <varname>db_url</varname> (string) + + The rtpengine datablase url. If present and valid, it activates database mode. + Node information is read from database, not from config. + + + By default, the datablase url is NULL (not set). + + + Set <varname>db_url</varname> parameter + +... +modparam("rtpengine", "db_url", "mysql://pass@localhost/db") +... + + +
+ + +
+ <varname>table_name</varname> (string) + + The rtpengine table name. If database mode is activated (i.e. valid db_url), + set the name of rtpengine table, on startup. + + + By default, the rtpengine table name is "rtpengine". + + + NOTE: One needs to add the version of the rtpengine table in the version table. + The current version is version 1. + + + Set <varname>table_name</varname> parameter + +... +modparam("rtpengine", "table_name", "rtpengine_table_name") +... + + + + + Setup <varname>rtpengine</varname> table + +mysql> describe rtpengine; ++----------+------------------+------+-----+---------+-------+ +| Field | Type | Null | Key | Default | Extra | ++----------+------------------+------+-----+---------+-------+ +| setid | int(10) unsigned | NO | | NULL | | +| url | varchar(64) | NO | | NULL | | +| disabled | int(11) | NO | | NULL | | ++----------+------------------+------+-----+---------+-------+ + +mysql> select * from rtpengine; ++-------+---------------------------+----------+ +| setid | url | disabled | ++-------+---------------------------+----------+ +| 0 | udp:rtpproxy1.domain:8800 | 0 | +| 0 | udp:rtpproxy2.domain:8800 | 1 | ++-------+---------------------------+----------+ + +mysql> select * from version; ++---------------------------+---------------+ +| table_name | table_version | ++---------------------------+---------------+ +| rtpengine | 1 | ++---------------------------+---------------+ +... + + +
+ +
<varname>setid_col</varname> (string) - Column name in the rtpproxy table. If database mode is activated, + Column name in the rtpengine table. If database mode is activated (i.e. valid db_url), set the setid of rtp nodes according to this column, on startup. The MySQL value for this column should be INT UNSIGNED. @@ -479,10 +555,31 @@ modparam("rtpengine", "setid_col", "setid_column_name")
+
+ <varname>url_col</varname> (string) + + Column name in the rtpengine table. If database mode is activated (i.e. valid db_url), + set the url of rtp nodes according to this column, on startup. + The MySQL value for this column should be INT UNSIGNED. + + + By default, the column name is "url". + + + Set <varname>url_col</varname> parameter + +... +modparam("rtpengine", "url_col", "url_column_name") +... + + +
+ +
<varname>disabled_col</varname> (string) - Column name in the rtpproxy table. If database mode is activated, + Column name in the rtpengine table. If database mode is activated (i.e. valid db_url), set the state of rtp nodes according to this column, on startup. The MySQL value for this column should be INT. @@ -502,6 +599,10 @@ modparam("rtpengine", "disabled_col", "disabled_column_name")
+ + + +
Functions
diff --git a/modules/rtpengine/rtpengine_db.c b/modules/rtpengine/rtpengine_db.c index 87cdc605303..0af8a2eaaa9 100644 --- a/modules/rtpengine/rtpengine_db.c +++ b/modules/rtpengine/rtpengine_db.c @@ -31,7 +31,7 @@ static db_func_t rtpp_dbf; static db1_con_t *rtpp_db_handle = NULL; str rtpp_db_url = {NULL, 0}; -str rtpp_table_name = str_init("rtpproxy"); +str rtpp_table_name = str_init("rtpengine"); str rtpp_setid_col = str_init("setid"); str rtpp_url_col = str_init("url"); str rtpp_disabled_col = str_init("disabled"); From 3e25dce1918e007a5db3752143c427a512a08dd2 Mon Sep 17 00:00:00 2001 From: Stefan Mititelu Date: Tue, 17 Nov 2015 16:45:00 +0200 Subject: [PATCH 04/14] rtpengine: Add setid_default modparam Add option to change the default set id. If setid_avp is configured, the active set used is the avp value. If setid_avp is not configured, the active set used is setid_default value. --- modules/rtpengine/doc/rtpengine_admin.xml | 23 ++++++++++++++++++++++- modules/rtpengine/rtpengine.c | 22 ++++++++++++++++------ 2 files changed, 38 insertions(+), 7 deletions(-) diff --git a/modules/rtpengine/doc/rtpengine_admin.xml b/modules/rtpengine/doc/rtpengine_admin.xml index 4fd04815ae6..83333780356 100644 --- a/modules/rtpengine/doc/rtpengine_admin.xml +++ b/modules/rtpengine/doc/rtpengine_admin.xml @@ -294,7 +294,7 @@ modparam("rtpengine", "extra_id_pv", "$avp(extra_id)")
-
+
<varname>setid_avp</varname> (string) The parameter defines an AVP that, if set, @@ -597,8 +597,29 @@ modparam("rtpengine", "disabled_col", "disabled_column_name")
+
+ <varname>setid_default</varname> (string) + + The default set of nodes to be used. + + + By default, the setid is 0. + + + NOTE that if setid_avp is configured, this value will be ignored and + the active set will be chosen according to the setid_avp. + + + Set <varname>setid_default</varname> parameter + +... +modparam("rtpengine", "setid_default", 11) +... + +
+
diff --git a/modules/rtpengine/rtpengine.c b/modules/rtpengine/rtpengine.c index 42646b339f1..4b84d5939fd 100644 --- a/modules/rtpengine/rtpengine.c +++ b/modules/rtpengine/rtpengine.c @@ -235,6 +235,7 @@ static str extra_id_pv_param = {NULL, 0}; static char *setid_avp_param = NULL; static int hash_table_tout = 3600; static int hash_table_size = 256; +static int setid_default = DEFAULT_RTPP_SET_ID; static char ** rtpp_strings=0; static int rtpp_sets=0; /*used in rtpengine_set_store()*/ @@ -340,14 +341,15 @@ static param_export_t params[] = { {"setid_col", PARAM_STR, &rtpp_setid_col }, {"url_col", PARAM_STR, &rtpp_url_col }, {"disabled_col", PARAM_STR, &rtpp_disabled_col }, - {"extra_id_pv", PARAM_STR, &extra_id_pv_param }, - {"setid_avp", PARAM_STRING, &setid_avp_param }, - {"force_send_interface", PARAM_STRING, &force_send_ip_str }, - {"rtp_inst_pvar", PARAM_STR, &rtp_inst_pv_param }, - {"write_sdp_pv", PARAM_STR, &write_sdp_pvar_str }, - {"read_sdp_pv", PARAM_STR, &read_sdp_pvar_str }, + {"extra_id_pv", PARAM_STR, &extra_id_pv_param }, + {"setid_avp", PARAM_STRING, &setid_avp_param }, + {"force_send_interface", PARAM_STRING, &force_send_ip_str }, + {"rtp_inst_pvar", PARAM_STR, &rtp_inst_pv_param }, + {"write_sdp_pv", PARAM_STR, &write_sdp_pvar_str }, + {"read_sdp_pv", PARAM_STR, &read_sdp_pvar_str }, {"hash_table_tout", INT_PARAM, &hash_table_tout }, {"hash_table_size", INT_PARAM, &hash_table_size }, + {"setid_default", INT_PARAM, &setid_default }, {0, 0, 0} }; @@ -1505,6 +1507,14 @@ mod_init(void) LM_DBG("rtpengine_hash_table_init(%d) success!\n", hash_table_size); } + /* select the default set */ + default_rtpp_set = select_rtpp_set(setid_default); + if (!default_rtpp_set) { + LM_NOTICE("Default rtpp set %d NOT found\n", setid_default); + } else { + LM_DBG("Default rtpp set %d found\n", setid_default); + } + return 0; } From d884698c9184cc649a2846b8070b78900cc7a215 Mon Sep 17 00:00:00 2001 From: Stefan Mititelu Date: Tue, 24 Nov 2015 14:50:01 +0200 Subject: [PATCH 05/14] rtpengine: Add kamctl nh_reload_rtpp Fifo command to allow reload from database node table. Updates the state of the nodes or creates new ones; does not delete the old nodes, not present anymore in the database. Updated doku. --- modules/rtpengine/doc/rtpengine_admin.xml | 24 ++++++++++++ modules/rtpengine/rtpengine.c | 46 ++++++++++++++++++++++- 2 files changed, 68 insertions(+), 2 deletions(-) diff --git a/modules/rtpengine/doc/rtpengine_admin.xml b/modules/rtpengine/doc/rtpengine_admin.xml index 83333780356..a11b6f1d65e 100644 --- a/modules/rtpengine/doc/rtpengine_admin.xml +++ b/modules/rtpengine/doc/rtpengine_admin.xml @@ -1231,6 +1231,30 @@ $ &ctltool; fifo nh_ping_rtpp all
+ +
+ <function moreinfo="none">nh_reload_rtpp</function> + + Reloads the database node table content if configured. + Returns specific message related to success, failure and no db_url configured. + + + NOTE: The current behaviour updates the nodes state or creates new ones, + based on the database content. Old nodes are not deleted if they are deleted + from database. This may require locking on the global nodes list. + + + + <function moreinfo="none">nh_reload_rtpp</function> usage + +... +$ &ctltool; fifo nh_reload_rtpp +... + + +
+ +
<function moreinfo="none">nh_show_hash_total</function> diff --git a/modules/rtpengine/rtpengine.c b/modules/rtpengine/rtpengine.c index 4b84d5939fd..36b09a8c76a 100644 --- a/modules/rtpengine/rtpengine.c +++ b/modules/rtpengine/rtpengine.c @@ -107,7 +107,14 @@ MODULE_VERSION #define MI_SHOW_RTP_PROXIES "nh_show_rtpp" #define MI_PING_RTP_PROXY "nh_ping_rtpp" #define MI_SHOW_HASH_TOTAL "nh_show_hash_total" - +#define MI_RELOAD_RTP_PROXY "nh_reload_rtpp" + +#define MI_DB_NOT_FOUND "RTP database not found" +#define MI_DB_NOT_FOUND_LEN (sizeof(MI_DB_NOT_FOUND)-1) +#define MI_DB_ERR "Error reloading from RTP database" +#define MI_DB_ERR_LEN (sizeof(MI_DB_ERR)-1) +#define MI_DB_OK "Success reloading from RTP database" +#define MI_DB_OK_LEN (sizeof(MI_DB_OK)-1) #define MI_RTP_PROXY_NOT_FOUND "RTP proxy not found" #define MI_RTP_PROXY_NOT_FOUND_LEN (sizeof(MI_RTP_PROXY_NOT_FOUND)-1) #define MI_PING_DISABLED "NATping disabled from script" @@ -222,6 +229,7 @@ static struct mi_root* mi_enable_rtp_proxy(struct mi_root* cmd_tree, void* param static struct mi_root* mi_show_rtp_proxy(struct mi_root* cmd_tree, void* param); static struct mi_root* mi_ping_rtp_proxy(struct mi_root* cmd_tree, void* param); static struct mi_root* mi_show_hash_total(struct mi_root* cmd_tree, void* param); +static struct mi_root* mi_reload_rtp_proxy(struct mi_root* cmd_tree, void* param); static int rtpengine_disable_tout = 60; @@ -357,7 +365,8 @@ static mi_export_t mi_cmds[] = { {MI_ENABLE_RTP_PROXY, mi_enable_rtp_proxy, 0, 0, 0}, {MI_SHOW_RTP_PROXIES, mi_show_rtp_proxy, 0, 0, 0}, {MI_PING_RTP_PROXY, mi_ping_rtp_proxy, 0, 0, 0}, - {MI_SHOW_HASH_TOTAL, mi_show_hash_total, 0, 0, 0}, + {MI_SHOW_HASH_TOTAL, mi_show_hash_total, 0, 0, 0}, + {MI_RELOAD_RTP_PROXY, mi_reload_rtp_proxy, 0, 0, 0}, { 0, 0, 0, 0, 0} }; @@ -1374,6 +1383,39 @@ static struct mi_root* mi_show_hash_total(struct mi_root* cmd_tree, void* param) return init_mi_tree(404, MI_HASH_ENTRIES_FAIL, MI_HASH_ENTRIES_FAIL_LEN); } +static struct mi_root* +mi_reload_rtp_proxy(struct mi_root* cmd_tree, void* param) +{ + struct mi_root *root = NULL; + + if (rtpp_db_url.s == NULL) { + // no database + root = init_mi_tree(404, MI_DB_NOT_FOUND, MI_DB_NOT_FOUND_LEN); + if (!root) { + LM_ERR("the MI tree cannot be initialized!\n"); + return 0; + } + } else { + if (init_rtpproxy_db() < 0) { + // fail reloading from database + root = init_mi_tree(404, MI_DB_ERR, MI_DB_ERR_LEN); + if (!root) { + LM_ERR("the MI tree cannot be initialized!\n"); + return 0; + } + } else { + // success reloading from database + root = init_mi_tree(200, MI_DB_OK, MI_DB_OK_LEN); + if (!root) { + LM_ERR("the MI tree cannot be initialized!\n"); + return 0; + } + } + } + + return root; +} + static int mod_init(void) From 0def328282cb8551823554978d7e32afa7ca4110 Mon Sep 17 00:00:00 2001 From: Stefan Mititelu Date: Tue, 24 Nov 2015 17:35:19 +0200 Subject: [PATCH 06/14] rtpengine: Check set uniqueness for rtpp node If node already found in set, update details like weight, recheck_ticks, disabled status. Else, create new node for the specific set. This is especially useful when reloading the nodes from database via 'kamctl fifo nh_rtpp_reload'; just to update the nodes,no shm_free and realloc needed. Also applicable for the config file nodes. This per set uniqueness of the nodes is plausible given the possibility to set the weight of the rtpp nodes. --- modules/rtpengine/rtpengine.c | 43 +++++++++++++++++++++++++++++++---- modules/rtpengine/rtpengine.h | 1 + 2 files changed, 40 insertions(+), 4 deletions(-) diff --git a/modules/rtpengine/rtpengine.c b/modules/rtpengine/rtpengine.c index 36b09a8c76a..501763b1efb 100644 --- a/modules/rtpengine/rtpengine.c +++ b/modules/rtpengine/rtpengine.c @@ -204,7 +204,7 @@ static char *send_rtpp_command(struct rtpp_node *, bencode_item_t *, int *); static int get_extra_id(struct sip_msg* msg, str *id_str); static int rtpengine_set_store(modparam_t type, void * val); -static int rtpengine_add_rtpengine_set( char * rtp_proxies); +static int rtpengine_add_rtpengine_set(char * rtp_proxies, int disabled, unsigned int ticks); static int mod_init(void); static int child_init(int); @@ -521,6 +521,9 @@ static int bind_force_send_ip(int sock_idx) return 0; } +static inline int str_cmp(const str *a , const str *b) { + return ! (a->len == b->len && ! strncmp(a->s, b->s, a->len)); +} static inline int str_eq(const str *p, const char *q) { int l = strlen(q); @@ -530,6 +533,7 @@ static inline int str_eq(const str *p, const char *q) { return 0; return 1; } + static inline str str_prefix(const str *p, const char *q) { str ret; ret.s = NULL; @@ -587,6 +591,25 @@ static int rtpengine_set_store(modparam_t type, void * val){ return 0; } +struct rtpp_node *get_rtpp_node(struct rtpp_set *rtpp_list, str *url) +{ + struct rtpp_node *rtpp_node; + + if (rtpp_list == NULL) { + return NULL; + } + + rtpp_node = rtpp_list->rn_first; + while (rtpp_node) { + if (str_cmp(&rtpp_node->rn_url, url) == 0) { + return rtpp_node; + } + rtpp_node = rtpp_node->rn_next; + } + + return NULL; +} + struct rtpp_set *get_rtpp_set(int set_id) { struct rtpp_set * rtpp_list; @@ -659,6 +682,7 @@ int add_rtpengine_socks(struct rtpp_set * rtpp_list, char * rtpproxy, int disabl /* Make rtp proxies list. */ char *p, *p1, *p2, *plim; struct rtpp_node *pnode; + struct rtpp_node *rtpp_node; int weight; p = rtpproxy; @@ -720,6 +744,16 @@ int add_rtpengine_socks(struct rtpp_set * rtpp_list, char * rtpproxy, int disabl pnode->rn_address += 5; } + // if node found in set, update it for disabled state + rtpp_node = get_rtpp_node(rtpp_list, &pnode->rn_url); + if (rtpp_node) { + rtpp_node->rn_disabled = pnode->rn_disabled; + rtpp_node->rn_recheck_ticks = pnode->rn_recheck_ticks; + rtpp_node->rn_weight = pnode->rn_weight; + shm_free(pnode); + continue; + } + if (rtpp_list->rn_first == NULL) { rtpp_list->rn_first = pnode; } else { @@ -736,7 +770,7 @@ int add_rtpengine_socks(struct rtpp_set * rtpp_list, char * rtpproxy, int disabl /* 0-succes * -1 - erorr * */ -static int rtpengine_add_rtpengine_set( char * rtp_proxies) +static int rtpengine_add_rtpengine_set(char * rtp_proxies, int disabled, unsigned int ticks) { char *p,*p2; struct rtpp_set * rtpp_list; @@ -789,7 +823,8 @@ static int rtpengine_add_rtpengine_set( char * rtp_proxies) if (rtpp_list != NULL) { - if (add_rtpengine_socks(rtpp_list, rtp_proxies, 0, 0) != 0) + + if (add_rtpengine_socks(rtpp_list, rtp_proxies, disabled, ticks) != 0) goto error; else return 0; @@ -1439,7 +1474,7 @@ mod_init(void) { /* storing the list of rtp proxy sets in shared memory*/ for(i=0;i Date: Wed, 2 Dec 2015 12:35:09 +0200 Subject: [PATCH 07/14] rtpengine: Add db 'weight' column Add weight column with weight_col modparam. Updated doku. --- modules/rtpengine/doc/rtpengine_admin.xml | 40 ++++++++++++++++++----- modules/rtpengine/rtpengine.c | 22 +++++++------ modules/rtpengine/rtpengine.h | 3 +- modules/rtpengine/rtpengine_db.c | 15 +++++---- 4 files changed, 53 insertions(+), 27 deletions(-) diff --git a/modules/rtpengine/doc/rtpengine_admin.xml b/modules/rtpengine/doc/rtpengine_admin.xml index a11b6f1d65e..699a6efcf5d 100644 --- a/modules/rtpengine/doc/rtpengine_admin.xml +++ b/modules/rtpengine/doc/rtpengine_admin.xml @@ -510,17 +510,18 @@ mysql> describe rtpengine; | Field | Type | Null | Key | Default | Extra | +----------+------------------+------+-----+---------+-------+ | setid | int(10) unsigned | NO | | NULL | | -| url | varchar(64) | NO | | NULL | | +| url | varchar(256) | NO | | NULL | | +| weight | int(10) unsigned | NO | | NULL | | | disabled | int(11) | NO | | NULL | | +----------+------------------+------+-----+---------+-------+ mysql> select * from rtpengine; -+-------+---------------------------+----------+ -| setid | url | disabled | -+-------+---------------------------+----------+ -| 0 | udp:rtpproxy1.domain:8800 | 0 | -| 0 | udp:rtpproxy2.domain:8800 | 1 | -+-------+---------------------------+----------+ ++-------+---------------------------+--------+----------+ +| setid | url | weight | disabled | ++-------+---------------------------+--------+----------+ +| 0 | udp:rtpproxy1.domain:8800 | 100 | 0 | +| 0 | udp:rtpproxy2.domain:8800 | 200 | 1 | ++-------+---------------------------+--------+----------+ mysql> select * from version; +---------------------------+---------------+ @@ -528,7 +529,6 @@ mysql> select * from version; +---------------------------+---------------+ | rtpengine | 1 | +---------------------------+---------------+ -...
@@ -560,7 +560,7 @@ modparam("rtpengine", "setid_col", "setid_column_name") Column name in the rtpengine table. If database mode is activated (i.e. valid db_url), set the url of rtp nodes according to this column, on startup. - The MySQL value for this column should be INT UNSIGNED. + The MySQL value for this column should be VARCHAR. By default, the column name is "url". @@ -576,6 +576,28 @@ modparam("rtpengine", "url_col", "url_column_name") +
+ <varname>weight_col</varname> (string) + + Column name in the rtpengine table. If database mode is activated (i.e. valid db_url), + set the weight of rtp nodes according to this column, on startup. The column value has + priority over the URL weight. + The MySQL value for this column should be INT UNSIGNED. + + + By default, the column name is "weight". + + + Set <varname>weight_col</varname> parameter + +... +modparam("rtpengine", "weight_col", "weight_column_name") +... + + +
+ +
<varname>disabled_col</varname> (string) diff --git a/modules/rtpengine/rtpengine.c b/modules/rtpengine/rtpengine.c index 501763b1efb..4cb090738d3 100644 --- a/modules/rtpengine/rtpengine.c +++ b/modules/rtpengine/rtpengine.c @@ -204,7 +204,7 @@ static char *send_rtpp_command(struct rtpp_node *, bencode_item_t *, int *); static int get_extra_id(struct sip_msg* msg, str *id_str); static int rtpengine_set_store(modparam_t type, void * val); -static int rtpengine_add_rtpengine_set(char * rtp_proxies, int disabled, unsigned int ticks); +static int rtpengine_add_rtpengine_set(char * rtp_proxies, unsigned int weight, int disabled, unsigned int ticks); static int mod_init(void); static int child_init(int); @@ -348,6 +348,7 @@ static param_export_t params[] = { {"table_name", PARAM_STR, &rtpp_table_name }, {"setid_col", PARAM_STR, &rtpp_setid_col }, {"url_col", PARAM_STR, &rtpp_url_col }, + {"weight_col", PARAM_STR, &rtpp_weight_col }, {"disabled_col", PARAM_STR, &rtpp_disabled_col }, {"extra_id_pv", PARAM_STR, &extra_id_pv_param }, {"setid_avp", PARAM_STRING, &setid_avp_param }, @@ -677,19 +678,20 @@ struct rtpp_set *get_rtpp_set(int set_id) } -int add_rtpengine_socks(struct rtpp_set * rtpp_list, char * rtpproxy, int disabled, unsigned int ticks) +int add_rtpengine_socks(struct rtpp_set * rtpp_list, char * rtpproxy, + unsigned int weight, int disabled, unsigned int ticks) { /* Make rtp proxies list. */ char *p, *p1, *p2, *plim; struct rtpp_node *pnode; struct rtpp_node *rtpp_node; - int weight; + int local_weight; p = rtpproxy; plim = p + strlen(p); for(;;) { - weight = 1; + local_weight = weight; while (*p && isspace((int)*p)) ++p; if (p >= plim) @@ -702,7 +704,7 @@ int add_rtpengine_socks(struct rtpp_set * rtpp_list, char * rtpproxy, int disabl /* Have weight specified? If yes, scan it */ p2 = memchr(p1, '=', p - p1); if (p2 != NULL) { - weight = strtoul(p2 + 1, NULL, 10); + local_weight = strtoul(p2 + 1, NULL, 10); } else { p2 = p; } @@ -718,7 +720,7 @@ int add_rtpengine_socks(struct rtpp_set * rtpp_list, char * rtpproxy, int disabl } else { pnode->rn_recheck_ticks = ticks + get_ticks(); } - pnode->rn_weight = weight; + pnode->rn_weight = local_weight; pnode->rn_umode = 0; pnode->rn_disabled = disabled; pnode->rn_url.s = shm_malloc(p2 - p1 + 1); @@ -744,7 +746,7 @@ int add_rtpengine_socks(struct rtpp_set * rtpp_list, char * rtpproxy, int disabl pnode->rn_address += 5; } - // if node found in set, update it for disabled state + // if node found in set, update it rtpp_node = get_rtpp_node(rtpp_list, &pnode->rn_url); if (rtpp_node) { rtpp_node->rn_disabled = pnode->rn_disabled; @@ -770,7 +772,7 @@ int add_rtpengine_socks(struct rtpp_set * rtpp_list, char * rtpproxy, int disabl /* 0-succes * -1 - erorr * */ -static int rtpengine_add_rtpengine_set(char * rtp_proxies, int disabled, unsigned int ticks) +static int rtpengine_add_rtpengine_set(char * rtp_proxies, unsigned int weight, int disabled, unsigned int ticks) { char *p,*p2; struct rtpp_set * rtpp_list; @@ -824,7 +826,7 @@ static int rtpengine_add_rtpengine_set(char * rtp_proxies, int disabled, unsigne if (rtpp_list != NULL) { - if (add_rtpengine_socks(rtpp_list, rtp_proxies, disabled, ticks) != 0) + if (add_rtpengine_socks(rtpp_list, rtp_proxies, weight, disabled, ticks) != 0) goto error; else return 0; @@ -1474,7 +1476,7 @@ mod_init(void) { /* storing the list of rtp proxy sets in shared memory*/ for(i=0;i Date: Thu, 3 Dec 2015 11:01:41 +0200 Subject: [PATCH 08/14] rtpengine: Check node address when adding to set The node address has to start with 'udp:', 'udp6:' or 'unix:' and to end with a valid port number. Else, the node is ignored and is not added to the set. --- modules/rtpengine/rtpengine.c | 75 ++++++++++++++++++++++++++------ modules/rtpengine/rtpengine.h | 2 +- modules/rtpengine/rtpengine_db.c | 2 +- 3 files changed, 64 insertions(+), 15 deletions(-) diff --git a/modules/rtpengine/rtpengine.c b/modules/rtpengine/rtpengine.c index 4cb090738d3..b6c7b9a30f6 100644 --- a/modules/rtpengine/rtpengine.c +++ b/modules/rtpengine/rtpengine.c @@ -679,13 +679,14 @@ struct rtpp_set *get_rtpp_set(int set_id) int add_rtpengine_socks(struct rtpp_set * rtpp_list, char * rtpproxy, - unsigned int weight, int disabled, unsigned int ticks) + unsigned int weight, int disabled, unsigned int ticks, int isDB) { /* Make rtp proxies list. */ char *p, *p1, *p2, *plim; struct rtpp_node *pnode; struct rtpp_node *rtpp_node; - int local_weight; + unsigned int local_weight, port; + str s1; p = rtpproxy; plim = p + strlen(p); @@ -701,19 +702,27 @@ int add_rtpengine_socks(struct rtpp_set * rtpp_list, char * rtpproxy, ++p; if (p <= p1) break; /* may happen??? */ - /* Have weight specified? If yes, scan it */ - p2 = memchr(p1, '=', p - p1); - if (p2 != NULL) { - local_weight = strtoul(p2 + 1, NULL, 10); - } else { - p2 = p; + p2 = p; + + /* if called for database, consider simple, single char *URL */ + /* if called for config, consider weight URL */ + if (!isDB) { + /* Have weight specified? If yes, scan it */ + p2 = memchr(p1, '=', p - p1); + if (p2 != NULL) { + local_weight = strtoul(p2 + 1, NULL, 10); + } else { + p2 = p; + } } + pnode = shm_malloc(sizeof(struct rtpp_node)); if (pnode == NULL) { LM_ERR("no shm memory left\n"); return -1; } memset(pnode, 0, sizeof(*pnode)); + pnode->idx = rtpp_no++; if (ticks == MI_MAX_RECHECK_TICKS) { pnode->rn_recheck_ticks = ticks; @@ -725,13 +734,14 @@ int add_rtpengine_socks(struct rtpp_set * rtpp_list, char * rtpproxy, pnode->rn_disabled = disabled; pnode->rn_url.s = shm_malloc(p2 - p1 + 1); if (pnode->rn_url.s == NULL) { + rtpp_no--; shm_free(pnode); LM_ERR("no shm memory left\n"); return -1; } memmove(pnode->rn_url.s, p1, p2 - p1); - pnode->rn_url.s[p2 - p1] = 0; - pnode->rn_url.len = p2-p1; + pnode->rn_url.s[p2 - p1] = 0; + pnode->rn_url.len = p2-p1; /* Leave only address in rn_address */ pnode->rn_address = pnode->rn_url.s; @@ -744,16 +754,49 @@ int add_rtpengine_socks(struct rtpp_set * rtpp_list, char * rtpproxy, } else if (strncasecmp(pnode->rn_address, "unix:", 5) == 0) { pnode->rn_umode = 0; pnode->rn_address += 5; + } else { + LM_WARN("Node address must start with 'udp:' or 'udp6:' or 'unix:'. Ignore '%s'.\n", pnode->rn_address); + rtpp_no--; + shm_free(pnode->rn_url.s); + shm_free(pnode); + continue; + } + + /* Check the rn_address is 'hostname:port' */ + /* Check the rn_address port is valid */ + p1 = strchr(pnode->rn_address, ':'); + if (p1 != NULL) { + p1++; + } + + if (p1 != NULL && p1 != '\0') { + s1.s = p1; + s1.len = strlen(p1); + if (str2int(&s1, &port) < 0 || port > 0xFFFF) { + LM_WARN("Node address must end with a valid port number. Ignore '%s'.\n", pnode->rn_address); + rtpp_no--; + shm_free(pnode->rn_url.s); + shm_free(pnode); + continue; + } } - // if node found in set, update it + /* If node found in set, update it */ rtpp_node = get_rtpp_node(rtpp_list, &pnode->rn_url); if (rtpp_node) { rtpp_node->rn_disabled = pnode->rn_disabled; rtpp_node->rn_recheck_ticks = pnode->rn_recheck_ticks; rtpp_node->rn_weight = pnode->rn_weight; + + rtpp_no--; + shm_free(pnode->rn_url.s); shm_free(pnode); - continue; + + if (!isDB) { + continue; + } else { + return 0; + } } if (rtpp_list->rn_first == NULL) { @@ -764,6 +807,12 @@ int add_rtpengine_socks(struct rtpp_set * rtpp_list, char * rtpproxy, rtpp_list->rn_last = pnode; rtpp_list->rtpp_node_count++; + + if (!isDB) { + continue; + } else { + return 0; + } } return 0; } @@ -826,7 +875,7 @@ static int rtpengine_add_rtpengine_set(char * rtp_proxies, unsigned int weight, if (rtpp_list != NULL) { - if (add_rtpengine_socks(rtpp_list, rtp_proxies, weight, disabled, ticks) != 0) + if (add_rtpengine_socks(rtpp_list, rtp_proxies, weight, disabled, ticks, 0) != 0) goto error; else return 0; diff --git a/modules/rtpengine/rtpengine.h b/modules/rtpengine/rtpengine.h index 7c9b952bb26..f29c9cc1969 100644 --- a/modules/rtpengine/rtpengine.h +++ b/modules/rtpengine/rtpengine.h @@ -63,7 +63,7 @@ struct rtpp_set_head{ struct rtpp_node *get_rtpp_node(struct rtpp_set *rtpp_list, str *url); struct rtpp_set *get_rtpp_set(int set_id); -int add_rtpengine_socks(struct rtpp_set * rtpp_list, char * rtpproxy, unsigned int weight, int disabled, unsigned int ticks); +int add_rtpengine_socks(struct rtpp_set * rtpp_list, char * rtpproxy, unsigned int weight, int disabled, unsigned int ticks, int isDB); int init_rtpproxy_db(void); diff --git a/modules/rtpengine/rtpengine_db.c b/modules/rtpengine/rtpengine_db.c index 280044d431a..e91b3cbce6a 100644 --- a/modules/rtpengine/rtpengine_db.c +++ b/modules/rtpengine/rtpengine_db.c @@ -122,7 +122,7 @@ static int rtpp_load_db(void) continue; } - if (add_rtpengine_socks(rtpp_list, url.s, weight, disabled, ticks) != 0) + if (add_rtpengine_socks(rtpp_list, url.s, weight, disabled, ticks, 1) != 0) { LM_ERR("error inserting '%.*s' into set %d disabled=%d\n", url.len, url.s, setid, disabled); From 174c7ab05e803e9c0288ada8bc4578bf7e6ea567 Mon Sep 17 00:00:00 2001 From: Stefan Mititelu Date: Wed, 25 Nov 2015 14:22:24 +0200 Subject: [PATCH 09/14] rtpengine: Update kamailio-db-devel .xml Add rtpengine .xml table documentation. Update version files. --- lib/srdb1/schema/kamailio-rtpengine.xml | 12 +++++ lib/srdb1/schema/rtpengine.xml | 60 +++++++++++++++++++++++ utils/kamctl/db_berkeley/kamailio/version | 2 + utils/kamctl/dbtext/kamailio/version | 1 + utils/kamctl/xhttp_pi/pi_framework.xml | 32 ++++++++++++ 5 files changed, 107 insertions(+) create mode 100644 lib/srdb1/schema/kamailio-rtpengine.xml create mode 100644 lib/srdb1/schema/rtpengine.xml diff --git a/lib/srdb1/schema/kamailio-rtpengine.xml b/lib/srdb1/schema/kamailio-rtpengine.xml new file mode 100644 index 00000000000..1958bec293b --- /dev/null +++ b/lib/srdb1/schema/kamailio-rtpengine.xml @@ -0,0 +1,12 @@ + + + %entities; +]> + + + RTPEngine + + diff --git a/lib/srdb1/schema/rtpengine.xml b/lib/srdb1/schema/rtpengine.xml new file mode 100644 index 00000000000..78a54c38c7e --- /dev/null +++ b/lib/srdb1/schema/rtpengine.xml @@ -0,0 +1,60 @@ + + +%entities; + +]> + + + rtpengine + 1 + &MYSQL_TABLE_TYPE; + + This table is used by the rtpengine module. It contains the sets of rtpengine instances used for proxying media between endpoints. More information about the rtpengine module can be found at: &KAMAILIO_MOD_DOC;rtpengine.html + + + + + setid + unsigned int + 10 + RTPEngine instance set ID + 0 + + + + + url + string + 64 + RTPEngine instance socket URL + + + + weight + unsigned int + 10 + RTPEngine instance weight + 1 + + + + + disabled + int + 1 + RTPEngine instance state + 0 + + + + + rtpengine_nodes + + + + + +
diff --git a/utils/kamctl/db_berkeley/kamailio/version b/utils/kamctl/db_berkeley/kamailio/version index 5796a95e463..0903a3730d7 100644 --- a/utils/kamctl/db_berkeley/kamailio/version +++ b/utils/kamctl/db_berkeley/kamailio/version @@ -102,6 +102,8 @@ rls_presentity| rls_presentity|1 rls_watchers| rls_watchers|3 +rtpengine| +rtpengine|1 rtpproxy| rtpproxy|1 sca_subscriptions| diff --git a/utils/kamctl/dbtext/kamailio/version b/utils/kamctl/dbtext/kamailio/version index adcfd00d450..cff21257c97 100644 --- a/utils/kamctl/dbtext/kamailio/version +++ b/utils/kamctl/dbtext/kamailio/version @@ -46,6 +46,7 @@ purplemap:1 re_grp:1 rls_presentity:1 rls_watchers:3 +rtpengine:1 rtpproxy:1 sca_subscriptions:1 silo:8 diff --git a/utils/kamctl/xhttp_pi/pi_framework.xml b/utils/kamctl/xhttp_pi/pi_framework.xml index 367fb9f6746..21676866344 100644 --- a/utils/kamctl/xhttp_pi/pi_framework.xml +++ b/utils/kamctl/xhttp_pi/pi_framework.xml @@ -669,6 +669,15 @@ from_domainDB1_STR updatedDB1_INT + + + rtpengine + mysql + setidDB1_INT + urlDB1_STR + weightDB1_INT + disabledDB1_INT + rtpproxy @@ -3531,6 +3540,29 @@ + + rtpengine + show + rtpengine + DB1_QUERY + + setid + url + weight + disabled + + + add + rtpengine + DB1_INSERT + + setid + url + weight + disabled + + + rtpproxy show From 65750d3422f97568623036a027ddebcbe636198d Mon Sep 17 00:00:00 2001 From: Stefan Mititelu Date: Fri, 4 Dec 2015 09:22:41 +0200 Subject: [PATCH 10/14] rtpengine: Update kamailio-db-devel db scripts Add rtpengine 'utils/kamctl/$dbschema' scripts. --- utils/kamctl/db_berkeley/kamailio/rtpengine | 10 +++++++++ utils/kamctl/db_sqlite/rtpengine-create.sql | 9 ++++++++ utils/kamctl/dbtext/kamailio/rtpengine | 1 + utils/kamctl/mysql/rtpengine-create.sql | 9 ++++++++ utils/kamctl/oracle/rtpengine-create.sql | 17 +++++++++++++++ utils/kamctl/postgres/rtpengine-create.sql | 9 ++++++++ utils/kamctl/xhttp_pi/rtpengine-mod | 23 +++++++++++++++++++++ utils/kamctl/xhttp_pi/rtpengine-table | 9 ++++++++ 8 files changed, 87 insertions(+) create mode 100644 utils/kamctl/db_berkeley/kamailio/rtpengine create mode 100644 utils/kamctl/db_sqlite/rtpengine-create.sql create mode 100644 utils/kamctl/dbtext/kamailio/rtpengine create mode 100644 utils/kamctl/mysql/rtpengine-create.sql create mode 100644 utils/kamctl/oracle/rtpengine-create.sql create mode 100644 utils/kamctl/postgres/rtpengine-create.sql create mode 100644 utils/kamctl/xhttp_pi/rtpengine-mod create mode 100644 utils/kamctl/xhttp_pi/rtpengine-table diff --git a/utils/kamctl/db_berkeley/kamailio/rtpengine b/utils/kamctl/db_berkeley/kamailio/rtpengine new file mode 100644 index 00000000000..629fbc7ab01 --- /dev/null +++ b/utils/kamctl/db_berkeley/kamailio/rtpengine @@ -0,0 +1,10 @@ +METADATA_COLUMNS +setid(int) url(str) weight(int) disabled(int) +METADATA_KEY +0 2 3 +METADATA_READONLY +0 +METADATA_LOGFLAGS +0 +METADATA_DEFAULTS +0|NIL|1|0 diff --git a/utils/kamctl/db_sqlite/rtpengine-create.sql b/utils/kamctl/db_sqlite/rtpengine-create.sql new file mode 100644 index 00000000000..20c73585a44 --- /dev/null +++ b/utils/kamctl/db_sqlite/rtpengine-create.sql @@ -0,0 +1,9 @@ +INSERT INTO version (table_name, table_version) values ('rtpengine','1'); +CREATE TABLE rtpengine ( + setid INTEGER DEFAULT 0 NOT NULL, + url VARCHAR(64) NOT NULL, + weight INTEGER DEFAULT 1 NOT NULL, + disabled INTEGER DEFAULT 0 NOT NULL, + CONSTRAINT rtpengine_rtpengine_nodes PRIMARY KEY (setid, url) +); + diff --git a/utils/kamctl/dbtext/kamailio/rtpengine b/utils/kamctl/dbtext/kamailio/rtpengine new file mode 100644 index 00000000000..13f39e07d4c --- /dev/null +++ b/utils/kamctl/dbtext/kamailio/rtpengine @@ -0,0 +1 @@ +setid(int) url(string) weight(int) disabled(int) diff --git a/utils/kamctl/mysql/rtpengine-create.sql b/utils/kamctl/mysql/rtpengine-create.sql new file mode 100644 index 00000000000..55662ae2fa9 --- /dev/null +++ b/utils/kamctl/mysql/rtpengine-create.sql @@ -0,0 +1,9 @@ +INSERT INTO version (table_name, table_version) values ('rtpengine','1'); +CREATE TABLE `rtpengine` ( + `setid` INT(10) UNSIGNED DEFAULT 0 NOT NULL, + `url` VARCHAR(64) NOT NULL, + `weight` INT(10) UNSIGNED DEFAULT 1 NOT NULL, + `disabled` INT(1) DEFAULT 0 NOT NULL, + CONSTRAINT rtpengine_nodes PRIMARY KEY (`setid`, `url`) +); + diff --git a/utils/kamctl/oracle/rtpengine-create.sql b/utils/kamctl/oracle/rtpengine-create.sql new file mode 100644 index 00000000000..202764b9134 --- /dev/null +++ b/utils/kamctl/oracle/rtpengine-create.sql @@ -0,0 +1,17 @@ +INSERT INTO version (table_name, table_version) values ('rtpengine','1'); +CREATE TABLE rtpengine ( + setid NUMBER(10) DEFAULT 0 NOT NULL, + url VARCHAR2(64), + weight NUMBER(10) DEFAULT 1 NOT NULL, + disabled NUMBER(10) DEFAULT 0 NOT NULL, + CONSTRAINT rtpengine_rtpengine_nodes PRIMARY KEY (setid, url) +); + +CREATE OR REPLACE TRIGGER rtpengine_tr +before insert on rtpengine FOR EACH ROW +BEGIN + auto_id(:NEW.id); +END rtpengine_tr; +/ +BEGIN map2users('rtpengine'); END; +/ diff --git a/utils/kamctl/postgres/rtpengine-create.sql b/utils/kamctl/postgres/rtpengine-create.sql new file mode 100644 index 00000000000..20c73585a44 --- /dev/null +++ b/utils/kamctl/postgres/rtpengine-create.sql @@ -0,0 +1,9 @@ +INSERT INTO version (table_name, table_version) values ('rtpengine','1'); +CREATE TABLE rtpengine ( + setid INTEGER DEFAULT 0 NOT NULL, + url VARCHAR(64) NOT NULL, + weight INTEGER DEFAULT 1 NOT NULL, + disabled INTEGER DEFAULT 0 NOT NULL, + CONSTRAINT rtpengine_rtpengine_nodes PRIMARY KEY (setid, url) +); + diff --git a/utils/kamctl/xhttp_pi/rtpengine-mod b/utils/kamctl/xhttp_pi/rtpengine-mod new file mode 100644 index 00000000000..e97e6043ef8 --- /dev/null +++ b/utils/kamctl/xhttp_pi/rtpengine-mod @@ -0,0 +1,23 @@ + + rtpengine + show + rtpengine + DB1_QUERY + + setid + url + weight + disabled + + + add + rtpengine + DB1_INSERT + + setid + url + weight + disabled + + + diff --git a/utils/kamctl/xhttp_pi/rtpengine-table b/utils/kamctl/xhttp_pi/rtpengine-table new file mode 100644 index 00000000000..4edb001b0a4 --- /dev/null +++ b/utils/kamctl/xhttp_pi/rtpengine-table @@ -0,0 +1,9 @@ + + + rtpengine + mysql + setidDB1_INT + urlDB1_STR + weightDB1_INT + disabledDB1_INT + From 5ce6df2d3aee023f0e2d4f9cad14d6e560557ae2 Mon Sep 17 00:00:00 2001 From: Stefan Mititelu Date: Thu, 10 Dec 2015 16:59:30 +0200 Subject: [PATCH 11/14] rtpengine: Add hiding of deleted table nodes 'kamctl fifo nh_show_rtpp all' reflects the rtpengine table state. When node is deleted from the table the node itself isn't freed but disabled permanent and hidden for display. This is mainly because one might want the current session to finish for the deleted table nodes (see allow_op modparam). Hiding the nodes and not freeing them will spare time deciding if there are any sessions left for the deleted rtpengine. --- modules/rtpengine/doc/rtpengine_admin.xml | 11 ++++-- modules/rtpengine/rtpengine.c | 44 +++++++++++++++++++++++ modules/rtpengine/rtpengine.h | 5 +++ modules/rtpengine/rtpengine_db.c | 3 ++ 4 files changed, 60 insertions(+), 3 deletions(-) diff --git a/modules/rtpengine/doc/rtpengine_admin.xml b/modules/rtpengine/doc/rtpengine_admin.xml index 699a6efcf5d..6875e5fa35b 100644 --- a/modules/rtpengine/doc/rtpengine_admin.xml +++ b/modules/rtpengine/doc/rtpengine_admin.xml @@ -221,6 +221,11 @@ modparam("rtpengine", "rtpengine_tout_ms", 2000) This is useful when deactivating a node for maintanance and reject new sessions but allow current ones to finish.
+ The behaviour is the same for a rtpengine deleted table node. + When the node is deleted from the table and the table reloaded (see nh_reload_rtpp) the node actually is disabled(permanent) and hidden for display. + Next time the same node will be added in the table, and the content reloaded, it will be updated and re-displayed. + + Default value is 0 to keep the current behaviour. @@ -1261,9 +1266,9 @@ $ &ctltool; fifo nh_ping_rtpp all Returns specific message related to success, failure and no db_url configured. - NOTE: The current behaviour updates the nodes state or creates new ones, - based on the database content. Old nodes are not deleted if they are deleted - from database. This may require locking on the global nodes list. + NOTE: The current behaviour updates the nodes state or creates new ones or + hides old ones, based on the database content. If allow_op modparam is enabled, + the sessions are still allowed to finish for the hidden old nodes. diff --git a/modules/rtpengine/rtpengine.c b/modules/rtpengine/rtpengine.c index b6c7b9a30f6..908260680c5 100644 --- a/modules/rtpengine/rtpengine.c +++ b/modules/rtpengine/rtpengine.c @@ -387,6 +387,45 @@ struct module_exports exports = { child_init }; +/* hide the node from display and disable it permanent */ +int rtpengine_delete_node(struct rtpp_node *rtpp_node) +{ + rtpp_node->rn_displayed = 0; + rtpp_node->rn_disabled = MI_MAX_RECHECK_TICKS; + + return 1; +} + + +int rtpengine_delete_node_set(struct rtpp_set *rtpp_list) +{ + struct rtpp_node *rtpp_node; + + for(rtpp_node = rtpp_list->rn_first; rtpp_node != NULL; + rtpp_node = rtpp_node->rn_next) { + rtpengine_delete_node(rtpp_node); + } + + return 1; +} + + +int rtpengine_delete_node_all() +{ + struct rtpp_set *rtpp_list; + + if (!rtpp_set_list) { + return 1; + } + + for(rtpp_list = rtpp_set_list->rset_first; rtpp_list != NULL; + rtpp_list = rtpp_list->rset_next) { + rtpengine_delete_node_set(rtpp_list); + } + + return 1; +} + static int get_ip_type(char *str_addr) { @@ -732,6 +771,7 @@ int add_rtpengine_socks(struct rtpp_set * rtpp_list, char * rtpproxy, pnode->rn_weight = local_weight; pnode->rn_umode = 0; pnode->rn_disabled = disabled; + pnode->rn_displayed = 1; pnode->rn_url.s = shm_malloc(p2 - p1 + 1); if (pnode->rn_url.s == NULL) { rtpp_no--; @@ -785,6 +825,7 @@ int add_rtpengine_socks(struct rtpp_set * rtpp_list, char * rtpproxy, rtpp_node = get_rtpp_node(rtpp_list, &pnode->rn_url); if (rtpp_node) { rtpp_node->rn_disabled = pnode->rn_disabled; + rtpp_node->rn_displayed = pnode->rn_displayed; rtpp_node->rn_recheck_ticks = pnode->rn_recheck_ticks; rtpp_node->rn_weight = pnode->rn_weight; @@ -1265,6 +1306,9 @@ static struct mi_root* mi_show_rtp_proxy(struct mi_root* cmd_tree, void* param) for(crt_rtpp = rtpp_list->rn_first; crt_rtpp != NULL; crt_rtpp = crt_rtpp->rn_next) { + if (!crt_rtpp->rn_displayed) { + continue; + } /* found a matching rtpp - show it */ if (found == MI_FOUND_ALL || diff --git a/modules/rtpengine/rtpengine.h b/modules/rtpengine/rtpengine.h index f29c9cc1969..45a7401be45 100644 --- a/modules/rtpengine/rtpengine.h +++ b/modules/rtpengine/rtpengine.h @@ -36,6 +36,7 @@ struct rtpp_node { char *rn_address; /* substring of rn_url */ int rn_disabled; /* found unaccessible? */ unsigned rn_weight; /* for load balancing */ + unsigned int rn_displayed; /* for delete at db reload */ unsigned int rn_recheck_ticks; int rn_rep_supported; int rn_ptl_supported; @@ -65,6 +66,10 @@ struct rtpp_node *get_rtpp_node(struct rtpp_set *rtpp_list, str *url); struct rtpp_set *get_rtpp_set(int set_id); int add_rtpengine_socks(struct rtpp_set * rtpp_list, char * rtpproxy, unsigned int weight, int disabled, unsigned int ticks, int isDB); +int rtpengine_delete_node(struct rtpp_node *rtpp_node); +int rtpengine_delete_node_set(struct rtpp_set *rtpp_list); +int rtpengine_delete_node_all(); + int init_rtpproxy_db(void); diff --git a/modules/rtpengine/rtpengine_db.c b/modules/rtpengine/rtpengine_db.c index e91b3cbce6a..eda7bbb2463 100644 --- a/modules/rtpengine/rtpengine_db.c +++ b/modules/rtpengine/rtpengine_db.c @@ -98,6 +98,9 @@ static int rtpp_load_db(void) LM_WARN("No rtpproxy instances in database\n"); return 0; } + + rtpengine_delete_node_all(); + for (i=0; i<n_rows; i++) { values = ROW_VALUES(rows + i); From 98877b5b393e4f7d0ec4127f6964f2b2ad24ab64 Mon Sep 17 00:00:00 2001 From: Stefan Mititelu <stefan.mititelu@1and1.ro> Date: Fri, 11 Dec 2015 13:33:55 +0200 Subject: [PATCH 12/14] rtpengine: Add code indentation Add proper tab-like code indentation. --- modules/rtpengine/rtpengine.c | 811 +++++++++++++++++----------------- modules/rtpengine/rtpengine.h | 26 +- 2 files changed, 407 insertions(+), 430 deletions(-) diff --git a/modules/rtpengine/rtpengine.c b/modules/rtpengine/rtpengine.c index 908260680c5..4af1c5e0c31 100644 --- a/modules/rtpengine/rtpengine.c +++ b/modules/rtpengine/rtpengine.c @@ -91,74 +91,74 @@ MODULE_VERSION #endif /* NAT UAC test constants */ -#define NAT_UAC_TEST_C_1918 0x01 -#define NAT_UAC_TEST_RCVD 0x02 -#define NAT_UAC_TEST_V_1918 0x04 -#define NAT_UAC_TEST_S_1918 0x08 -#define NAT_UAC_TEST_RPORT 0x10 +#define NAT_UAC_TEST_C_1918 0x01 +#define NAT_UAC_TEST_RCVD 0x02 +#define NAT_UAC_TEST_V_1918 0x04 +#define NAT_UAC_TEST_S_1918 0x08 +#define NAT_UAC_TEST_RPORT 0x10 -#define DEFAULT_RTPP_SET_ID 0 -#define MAX_RTPP_TRIED_NODES 50 -#define MI_SET_NATPING_STATE "nh_enable_ping" -#define MI_DEFAULT_NATPING_STATE 1 +#define DEFAULT_RTPP_SET_ID 0 +#define MAX_RTPP_TRIED_NODES 50 +#define MI_SET_NATPING_STATE "nh_enable_ping" +#define MI_DEFAULT_NATPING_STATE 1 #define MI_ENABLE_RTP_PROXY "nh_enable_rtpp" #define MI_SHOW_RTP_PROXIES "nh_show_rtpp" -#define MI_PING_RTP_PROXY "nh_ping_rtpp" -#define MI_SHOW_HASH_TOTAL "nh_show_hash_total" -#define MI_RELOAD_RTP_PROXY "nh_reload_rtpp" - -#define MI_DB_NOT_FOUND "RTP database not found" -#define MI_DB_NOT_FOUND_LEN (sizeof(MI_DB_NOT_FOUND)-1) -#define MI_DB_ERR "Error reloading from RTP database" -#define MI_DB_ERR_LEN (sizeof(MI_DB_ERR)-1) -#define MI_DB_OK "Success reloading from RTP database" -#define MI_DB_OK_LEN (sizeof(MI_DB_OK)-1) -#define MI_RTP_PROXY_NOT_FOUND "RTP proxy not found" -#define MI_RTP_PROXY_NOT_FOUND_LEN (sizeof(MI_RTP_PROXY_NOT_FOUND)-1) -#define MI_PING_DISABLED "NATping disabled from script" -#define MI_PING_DISABLED_LEN (sizeof(MI_PING_DISABLED)-1) -#define MI_DISABLED_PERMANENT "1 (permanent)" -#define MI_DISABLED_PERMANENT_LEN (sizeof(MI_DISABLED_PERMANENT)-1) -#define MI_SET "set" -#define MI_SET_LEN (sizeof(MI_SET)-1) -#define MI_INDEX "index" +#define MI_PING_RTP_PROXY "nh_ping_rtpp" +#define MI_SHOW_HASH_TOTAL "nh_show_hash_total" +#define MI_RELOAD_RTP_PROXY "nh_reload_rtpp" + +#define MI_DB_NOT_FOUND "RTP database not found" +#define MI_DB_NOT_FOUND_LEN (sizeof(MI_DB_NOT_FOUND)-1) +#define MI_DB_ERR "Error reloading from RTP database" +#define MI_DB_ERR_LEN (sizeof(MI_DB_ERR)-1) +#define MI_DB_OK "Success reloading from RTP database" +#define MI_DB_OK_LEN (sizeof(MI_DB_OK)-1) +#define MI_RTP_PROXY_NOT_FOUND "RTP proxy not found" +#define MI_RTP_PROXY_NOT_FOUND_LEN (sizeof(MI_RTP_PROXY_NOT_FOUND)-1) +#define MI_PING_DISABLED "NAT ping disabled from script" +#define MI_PING_DISABLED_LEN (sizeof(MI_PING_DISABLED)-1) +#define MI_DISABLED_PERMANENT "1(permanent)" +#define MI_DISABLED_PERMANENT_LEN (sizeof(MI_DISABLED_PERMANENT)-1) +#define MI_SET "set" +#define MI_SET_LEN (sizeof(MI_SET)-1) +#define MI_INDEX "index" #define MI_INDEX_LEN (sizeof(MI_INDEX)-1) -#define MI_ENABLED "enabled" +#define MI_ENABLED "enabled" #define MI_ENABLED_LEN (sizeof(MI_ENABLED)-1) -#define MI_DISABLED "disabled" +#define MI_DISABLED "disabled" #define MI_DISABLED_LEN (sizeof(MI_DISABLED)-1) -#define MI_WEIGHT "weight" +#define MI_WEIGHT "weight" #define MI_WEIGHT_LEN (sizeof(MI_WEIGHT)-1) #define MI_RECHECK_TICKS "recheck_ticks" #define MI_RECHECK_T_LEN (sizeof(MI_RECHECK_TICKS)-1) -#define MI_ERROR "Error when adding rtpp node details" -#define MI_ERROR_LEN (sizeof(MI_ERROR)-1) -#define MI_ALL "all" -#define MI_ALL_LEN (sizeof(MI_ALL)-1) -#define MI_ENABLE "enable" -#define MI_ENABLE_LEN (sizeof(MI_ENABLE)-1) -#define MI_DISABLE "disable" -#define MI_DISABLE_LEN (sizeof(MI_DISABLE)-1) -#define MI_PING "ping" -#define MI_PING_LEN (sizeof(MI_PING)-1) -#define MI_SUCCESS "success" -#define MI_SUCCESS_LEN (sizeof(MI_SUCCESS)-1) -#define MI_FAIL "fail" -#define MI_FAIL_LEN (sizeof(MI_FAIL)-1) +#define MI_ERROR "Error when adding rtpp node details" +#define MI_ERROR_LEN (sizeof(MI_ERROR)-1) +#define MI_ALL "all" +#define MI_ALL_LEN (sizeof(MI_ALL)-1) +#define MI_ENABLE "enable" +#define MI_ENABLE_LEN (sizeof(MI_ENABLE)-1) +#define MI_DISABLE "disable" +#define MI_DISABLE_LEN (sizeof(MI_DISABLE)-1) +#define MI_PING "ping" +#define MI_PING_LEN (sizeof(MI_PING)-1) +#define MI_SUCCESS "success" +#define MI_SUCCESS_LEN (sizeof(MI_SUCCESS)-1) +#define MI_FAIL "fail" +#define MI_FAIL_LEN (sizeof(MI_FAIL)-1) #define MI_HASH_ENTRIES "entries" #define MI_HASH_ENTRIES_LEN (sizeof(MI_HASH_ENTRIES)-1) -#define MI_HASH_ENTRIES_FAIL "Fail to get entry details" -#define MI_HASH_ENTRIES_FAIL_LEN (sizeof(MI_HASH_ENTRIES_FAIL)-1) +#define MI_HASH_ENTRIES_FAIL "Fail to get entry details" +#define MI_HASH_ENTRIES_FAIL_LEN (sizeof(MI_HASH_ENTRIES_FAIL)-1) -#define MI_FOUND_ALL 2 -#define MI_FOUND_ONE 1 -#define MI_FOUND_NONE 0 +#define MI_FOUND_ALL 2 +#define MI_FOUND_ONE 1 +#define MI_FOUND_NONE 0 -#define CPORT "22222" +#define CPORT "22222" enum rtpe_operation { OP_OFFER = 1, @@ -214,10 +214,7 @@ static int get_ip_type(char *str_addr); static int get_ip_scope(char *str_addr); // useful for link-local ipv6 static int bind_force_send_ip(int sock_idx); -static int add_rtpp_node_info(struct mi_node *node, - struct rtpp_node *crt_rtpp, - struct rtpp_set *rtpp_list); - +static int add_rtpp_node_info(struct mi_node *node, struct rtpp_node *crt_rtpp, struct rtpp_set *rtpp_list); static int rtpp_test_ping(struct rtpp_node *node); /* Pseudo-Variables */ @@ -265,14 +262,14 @@ static pv_spec_t *rtp_inst_pvar = NULL; static unsigned int rtpp_no = 0; static int *rtpp_socks = 0; -static int setid_avp_type; +static int setid_avp_type; static int_str setid_avp; -static str write_sdp_pvar_str = {NULL, 0}; -static pv_spec_t* write_sdp_pvar = NULL; +static str write_sdp_pvar_str = {NULL, 0}; +static pv_spec_t *write_sdp_pvar = NULL; -static str read_sdp_pvar_str = {NULL, 0}; -static pv_spec_t* read_sdp_pvar = NULL; +static str read_sdp_pvar_str = {NULL, 0}; +static pv_spec_t *read_sdp_pvar = NULL; #define RTPENGINE_SESS_LIMIT_MSG "Parallel session limit reached" #define RTPENGINE_SESS_LIMIT_MSG_LEN (sizeof(RTPENGINE_SESS_LIMIT_MSG)-1) @@ -294,46 +291,46 @@ unsigned int *natping_state=0; static pv_elem_t *extra_id_pv = NULL; static cmd_export_t cmds[] = { - {"set_rtpengine_set", (cmd_function)set_rtpengine_set_f, 1, + {"set_rtpengine_set", (cmd_function)set_rtpengine_set_f, 1, fixup_set_id, 0, ANY_ROUTE}, - {"set_rtpengine_set", (cmd_function)set_rtpengine_set_f, 2, + {"set_rtpengine_set", (cmd_function)set_rtpengine_set_f, 2, fixup_set_id, 0, ANY_ROUTE}, - {"start_recording", (cmd_function)start_recording_f, 0, + {"start_recording", (cmd_function)start_recording_f, 0, 0, 0, ANY_ROUTE }, - {"rtpengine_offer", (cmd_function)rtpengine_offer1_f, 0, + {"rtpengine_offer", (cmd_function)rtpengine_offer1_f, 0, 0, 0, ANY_ROUTE}, - {"rtpengine_offer", (cmd_function)rtpengine_offer1_f, 1, + {"rtpengine_offer", (cmd_function)rtpengine_offer1_f, 1, fixup_spve_null, 0, ANY_ROUTE}, - {"rtpengine_answer", (cmd_function)rtpengine_answer1_f, 0, + {"rtpengine_answer", (cmd_function)rtpengine_answer1_f, 0, 0, 0, ANY_ROUTE}, - {"rtpengine_answer", (cmd_function)rtpengine_answer1_f, 1, + {"rtpengine_answer", (cmd_function)rtpengine_answer1_f, 1, fixup_spve_null, 0, ANY_ROUTE}, - {"rtpengine_manage", (cmd_function)rtpengine_manage1_f, 0, + {"rtpengine_manage", (cmd_function)rtpengine_manage1_f, 0, 0, 0, ANY_ROUTE}, - {"rtpengine_manage", (cmd_function)rtpengine_manage1_f, 1, + {"rtpengine_manage", (cmd_function)rtpengine_manage1_f, 1, fixup_spve_null, 0, ANY_ROUTE}, - {"rtpengine_delete", (cmd_function)rtpengine_delete1_f, 0, + {"rtpengine_delete", (cmd_function)rtpengine_delete1_f, 0, 0, 0, ANY_ROUTE}, - {"rtpengine_delete", (cmd_function)rtpengine_delete1_f, 1, + {"rtpengine_delete", (cmd_function)rtpengine_delete1_f, 1, fixup_spve_null, 0, ANY_ROUTE}, {0, 0, 0, 0, 0, 0} }; static pv_export_t mod_pvs[] = { - {{"rtpstat", (sizeof("rtpstat")-1)}, /* RTP-Statistics */ - PVT_OTHER, pv_get_rtpstat_f, 0, 0, 0, 0, 0}, - {{0, 0}, 0, 0, 0, 0, 0, 0, 0} + {{"rtpstat", (sizeof("rtpstat")-1)}, /* RTP-Statistics */ + PVT_OTHER, pv_get_rtpstat_f, 0, 0, 0, 0, 0}, + {{0, 0}, 0, 0, 0, 0, 0, 0, 0} }; static param_export_t params[] = { @@ -607,8 +604,7 @@ static int rtpengine_set_store(modparam_t type, void * val){ return -1; } } else {/*realloc to make room for the current set*/ - rtpp_strings = (char**)pkg_realloc(rtpp_strings, - (rtpp_sets+1)* sizeof(char*)); + rtpp_strings = (char**)pkg_realloc(rtpp_strings, (rtpp_sets+1)* sizeof(char*)); if(!rtpp_strings){ LM_ERR("no pkg memory left\n"); return -1; @@ -658,8 +654,7 @@ struct rtpp_set *get_rtpp_set(int set_id) if (set_id < DEFAULT_RTPP_SET_ID ) { - LM_ERR(" invalid rtpproxy set value [%d]\n", - set_id); + LM_ERR(" invalid rtpproxy set value [%d]\n", set_id); return NULL; } @@ -859,8 +854,8 @@ int add_rtpengine_socks(struct rtpp_set * rtpp_list, char * rtpproxy, } -/* 0-succes - * -1 - erorr +/* 0 - succes + * -1 - erorr * */ static int rtpengine_add_rtpengine_set(char * rtp_proxies, unsigned int weight, int disabled, unsigned int ticks) { @@ -974,41 +969,40 @@ static int fixup_set_id(void ** param, int param_no) static int rtpp_test_ping(struct rtpp_node *node) { - bencode_buffer_t bencbuf; - bencode_item_t *dict; - char *cp; - int ret; - - if (bencode_buffer_init(&bencbuf)) { - return -1; - } - dict = bencode_dictionary(&bencbuf); - bencode_dictionary_add_string(dict, "command", command_strings[OP_PING]); - - if (bencbuf.error) { - goto error; - } - - cp = send_rtpp_command(node, dict, &ret); - if (!cp) { - goto error; - } - - dict = bencode_decode_expect(&bencbuf, cp, ret, BENCODE_DICTIONARY); - if (!dict || bencode_dictionary_get_strcmp(dict, "result", "pong")) { - goto error; - } - - bencode_buffer_free(&bencbuf); - return 0; + bencode_buffer_t bencbuf; + bencode_item_t *dict; + char *cp; + int ret; + + if (bencode_buffer_init(&bencbuf)) { + return -1; + } + dict = bencode_dictionary(&bencbuf); + bencode_dictionary_add_string(dict, "command", command_strings[OP_PING]); + + if (bencbuf.error) { + goto error; + } + + cp = send_rtpp_command(node, dict, &ret); + if (!cp) { + goto error; + } + + dict = bencode_decode_expect(&bencbuf, cp, ret, BENCODE_DICTIONARY); + if (!dict || bencode_dictionary_get_strcmp(dict, "result", "pong")) { + goto error; + } + + bencode_buffer_free(&bencbuf); + return 0; error: - bencode_buffer_free(&bencbuf); - return -1; + bencode_buffer_free(&bencbuf); + return -1; } -static struct mi_root* mi_enable_rtp_proxy(struct mi_root *cmd_tree, - void *param ) +static struct mi_root* mi_enable_rtp_proxy(struct mi_root *cmd_tree, void *param) { struct mi_node *node, *crt_node; struct rtpp_set *rtpp_list; @@ -1026,7 +1020,7 @@ static struct mi_root* mi_enable_rtp_proxy(struct mi_root *cmd_tree, enable = 0; if (rtpp_set_list == NULL) { - return init_mi_tree(404, MI_RTP_PROXY_NOT_FOUND, MI_RTP_PROXY_NOT_FOUND_LEN); + return init_mi_tree(404, MI_RTP_PROXY_NOT_FOUND, MI_RTP_PROXY_NOT_FOUND_LEN); } node = cmd_tree->node.kids; @@ -1060,47 +1054,48 @@ static struct mi_root* mi_enable_rtp_proxy(struct mi_root *cmd_tree, return init_mi_tree(400, MI_MISSING_PARM_S, MI_MISSING_PARM_LEN); } - /* found a matching all - show all rtpp */ - if (strncmp(MI_ALL, rtpp_url.s, MI_ALL_LEN) == 0) { - found = MI_FOUND_ALL; - } + /* found a matching all - show all rtpp */ + if (strncmp(MI_ALL, rtpp_url.s, MI_ALL_LEN) == 0) { + found = MI_FOUND_ALL; + } for(rtpp_list = rtpp_set_list->rset_first; rtpp_list != NULL; - rtpp_list = rtpp_list->rset_next) { + rtpp_list = rtpp_list->rset_next) { for(crt_rtpp = rtpp_list->rn_first; crt_rtpp != NULL; - crt_rtpp = crt_rtpp->rn_next) { - - /* found a matching rtpp - show it */ - if (found == MI_FOUND_ALL || - (crt_rtpp->rn_url.len == rtpp_url.len && - strncmp(crt_rtpp->rn_url.s, rtpp_url.s, rtpp_url.len) == 0)) { - /* do ping when try to enable the rtpp */ - if (enable) { - - /* if ping success, enable the rtpp and reset ticks */ - if (rtpp_test_ping(crt_rtpp) == 0) { - crt_rtpp->rn_disabled = 0; - crt_rtpp->rn_recheck_ticks = MI_MIN_RECHECK_TICKS; - - /* if ping fail, disable the rtpps but _not_ permanently*/ - } else { - crt_rtpp->rn_recheck_ticks = get_ticks() + rtpengine_disable_tout; - crt_rtpp->rn_disabled = 1; - found_rtpp_disabled = 1; - } - - /* do not ping when disable the rtpp; disable it permanenty */ - } else { + crt_rtpp = crt_rtpp->rn_next) { + + /* found a matching rtpp - show it */ + if (found == MI_FOUND_ALL || + (crt_rtpp->rn_url.len == rtpp_url.len && + strncmp(crt_rtpp->rn_url.s, rtpp_url.s, rtpp_url.len) == 0)) { + + /* do ping when try to enable the rtpp */ + if (enable) { + + /* if ping success, enable the rtpp and reset ticks */ + if (rtpp_test_ping(crt_rtpp) == 0) { + crt_rtpp->rn_disabled = 0; + crt_rtpp->rn_recheck_ticks = MI_MIN_RECHECK_TICKS; + + /* if ping fail, disable the rtpps but _not_ permanently*/ + } else { + crt_rtpp->rn_recheck_ticks = get_ticks() + rtpengine_disable_tout; + crt_rtpp->rn_disabled = 1; + found_rtpp_disabled = 1; + } + + /* do not ping when disable the rtpp; disable it permanenty */ + } else { crt_rtpp->rn_disabled = 1; - crt_rtpp->rn_recheck_ticks = MI_MAX_RECHECK_TICKS; - } + crt_rtpp->rn_recheck_ticks = MI_MAX_RECHECK_TICKS; + } - if (found == MI_FOUND_NONE) { - found = MI_FOUND_ONE; - found_rtpp = crt_rtpp; - } - } + if (found == MI_FOUND_NONE) { + found = MI_FOUND_ONE; + found_rtpp = crt_rtpp; + } + } } } @@ -1112,49 +1107,45 @@ static struct mi_root* mi_enable_rtp_proxy(struct mi_root *cmd_tree, node = &root->node; switch (found) { - case MI_FOUND_ALL: - snode.s = MI_ALL; - snode.len = MI_ALL_LEN; - break; - case MI_FOUND_ONE: - snode.s = found_rtpp->rn_url.s; - snode.len = found_rtpp->rn_url.len; - break; - default: - if (root) { - free_mi_tree(root); - } - return init_mi_tree(404, MI_RTP_PROXY_NOT_FOUND, MI_RTP_PROXY_NOT_FOUND_LEN); - } - - svalue.s = MI_SUCCESS; - svalue.len = MI_SUCCESS_LEN; - - if (enable) { - sattr.s = MI_ENABLE; - sattr.len = MI_ENABLE_LEN; - - if (found_rtpp_disabled) { - svalue.s = MI_FAIL; - svalue.len = MI_FAIL_LEN; - } - } else { - sattr.s = MI_DISABLE; - sattr.len = MI_DISABLE_LEN; - } - - if (!(crt_node = add_mi_node_child(node, 0, - snode.s, snode.len, - 0, 0)) ) { - LM_ERR("cannot add the child node to the tree\n"); - goto error; - } - - if ((attr = add_mi_attr(crt_node, MI_DUP_VALUE, - sattr.s, sattr.len, - svalue.s, svalue.len)) == 0) { - LM_ERR("cannot add attributes to the node\n"); - goto error; + case MI_FOUND_ALL: + snode.s = MI_ALL; + snode.len = MI_ALL_LEN; + break; + case MI_FOUND_ONE: + snode.s = found_rtpp->rn_url.s; + snode.len = found_rtpp->rn_url.len; + break; + default: + if (root) { + free_mi_tree(root); + } + return init_mi_tree(404, MI_RTP_PROXY_NOT_FOUND, MI_RTP_PROXY_NOT_FOUND_LEN); + } + + svalue.s = MI_SUCCESS; + svalue.len = MI_SUCCESS_LEN; + + if (enable) { + sattr.s = MI_ENABLE; + sattr.len = MI_ENABLE_LEN; + + if (found_rtpp_disabled) { + svalue.s = MI_FAIL; + svalue.len = MI_FAIL_LEN; + } + } else { + sattr.s = MI_DISABLE; + sattr.len = MI_DISABLE_LEN; + } + + if (!(crt_node = add_mi_node_child(node, 0, snode.s, snode.len, 0, 0))) { + LM_ERR("cannot add the child node to the tree\n"); + goto error; + } + + if ((attr = add_mi_attr(crt_node, MI_DUP_VALUE, sattr.s, sattr.len, svalue.s, svalue.len)) == 0) { + LM_ERR("cannot add attributes to the node\n"); + goto error; } @@ -1162,7 +1153,7 @@ static struct mi_root* mi_enable_rtp_proxy(struct mi_root *cmd_tree, error: if (root) { - free_mi_tree(root); + free_mi_tree(root); } return init_mi_tree(404, MI_ERROR, MI_ERROR_LEN); } @@ -1179,17 +1170,15 @@ static struct mi_root* mi_enable_rtp_proxy(struct mi_root *cmd_tree, goto _error;\ }\ if(((_child) = add_mi_node_child((_parent), MI_DUP_VALUE, (_name), \ - (_name_len), (_string), (_len)) ) == 0)\ + (_name_len), (_string), (_len))) == 0)\ goto _error;\ }while(0); -static int add_rtpp_node_info (struct mi_node *node, - struct rtpp_node *crt_rtpp, - struct rtpp_set *rtpp_list) +static int add_rtpp_node_info (struct mi_node *node, struct rtpp_node *crt_rtpp, struct rtpp_set *rtpp_list) { int id_len, len; - int rtpp_ticks; + int rtpp_ticks; struct mi_node *crt_node, *child; struct mi_attr *attr; char *string, *id; @@ -1197,55 +1186,52 @@ static int add_rtpp_node_info (struct mi_node *node, string = id = 0; id = int2str(rtpp_list->id_set, &id_len); - if(!id) { - LM_ERR("cannot convert set id\n"); - goto error; + if (!id) { + LM_ERR("cannot convert set id\n"); + goto error; } - if(!(crt_node = add_mi_node_child(node, 0, crt_rtpp->rn_url.s, - crt_rtpp->rn_url.len, 0,0)) ) { - LM_ERR("cannot add the child node to the tree\n"); - goto error; + if (!(crt_node = add_mi_node_child(node, 0, crt_rtpp->rn_url.s, crt_rtpp->rn_url.len, 0,0))) { + LM_ERR("cannot add the child node to the tree\n"); + goto error; } LM_DBG("adding node name %s \n",crt_rtpp->rn_url.s ); - if((attr = add_mi_attr(crt_node, MI_DUP_VALUE, MI_SET, MI_SET_LEN, - id, id_len))== 0) { - LM_ERR("cannot add attributes to the node\n"); - goto error; + if ((attr = add_mi_attr(crt_node, MI_DUP_VALUE, MI_SET, MI_SET_LEN, id, id_len)) == 0) { + LM_ERR("cannot add attributes to the node\n"); + goto error; } add_rtpp_node_int_info(crt_node, MI_INDEX, MI_INDEX_LEN, - crt_rtpp->idx, child, len, string, error); + crt_rtpp->idx, child, len, string, error); if ((1 == crt_rtpp->rn_disabled ) && (crt_rtpp->rn_recheck_ticks == MI_MAX_RECHECK_TICKS)) { - if( !(child = add_mi_node_child(crt_node, MI_DUP_VALUE, MI_DISABLED, MI_DISABLED_LEN, - MI_DISABLED_PERMANENT, MI_DISABLED_PERMANENT_LEN))) { - LM_ERR("cannot add disabled (permanent) message\n"); - goto error; - } - } - else { - add_rtpp_node_int_info(crt_node, MI_DISABLED, MI_DISABLED_LEN, - crt_rtpp->rn_disabled, child, len, string, error); + if (!(child = add_mi_node_child(crt_node, MI_DUP_VALUE, MI_DISABLED, MI_DISABLED_LEN, + MI_DISABLED_PERMANENT, MI_DISABLED_PERMANENT_LEN))) { + LM_ERR("cannot add disabled (permanent) message\n"); + goto error; + } + } else { + add_rtpp_node_int_info(crt_node, MI_DISABLED, MI_DISABLED_LEN, + crt_rtpp->rn_disabled, child, len, string, error); } add_rtpp_node_int_info(crt_node, MI_WEIGHT, MI_WEIGHT_LEN, - crt_rtpp->rn_weight, child, len, string, error); + crt_rtpp->rn_weight, child, len, string, error); if (crt_rtpp->rn_recheck_ticks == MI_MAX_RECHECK_TICKS) { - if( !(child = add_mi_node_child(crt_node, MI_DUP_VALUE, - MI_RECHECK_TICKS, MI_RECHECK_T_LEN, - "N/A", sizeof("N/A") - 1))) { - LM_ERR("cannot add MAX recheck_ticks value\n"); - goto error; - } + if (!(child = add_mi_node_child(crt_node, MI_DUP_VALUE, + MI_RECHECK_TICKS, MI_RECHECK_T_LEN, + "N/A", sizeof("N/A") - 1))) { + LM_ERR("cannot add MAX recheck_ticks value\n"); + goto error; + } } else { - rtpp_ticks = crt_rtpp->rn_recheck_ticks - get_ticks(); - rtpp_ticks = rtpp_ticks < 0 ? 0 : rtpp_ticks; - add_rtpp_node_int_info(crt_node, MI_RECHECK_TICKS, MI_RECHECK_T_LEN, - rtpp_ticks, child, len, string, error); + rtpp_ticks = crt_rtpp->rn_recheck_ticks - get_ticks(); + rtpp_ticks = rtpp_ticks < 0 ? 0 : rtpp_ticks; + add_rtpp_node_int_info(crt_node, MI_RECHECK_TICKS, MI_RECHECK_T_LEN, + rtpp_ticks, child, len, string, error); } return 0; @@ -1266,7 +1252,7 @@ static struct mi_root* mi_show_rtp_proxy(struct mi_root* cmd_tree, void* param) found = MI_FOUND_NONE; if (rtpp_set_list == NULL) { - return init_mi_tree(404, MI_RTP_PROXY_NOT_FOUND, MI_RTP_PROXY_NOT_FOUND_LEN); + return init_mi_tree(404, MI_RTP_PROXY_NOT_FOUND, MI_RTP_PROXY_NOT_FOUND_LEN); } node = cmd_tree->node.kids; @@ -1280,7 +1266,7 @@ static struct mi_root* mi_show_rtp_proxy(struct mi_root* cmd_tree, void* param) rtpp_url = node->value; if (strncmp(MI_ALL, rtpp_url.s, MI_ALL_LEN) != 0 && rtpp_set_list == NULL) { - return init_mi_tree(404, MI_RTP_PROXY_NOT_FOUND, MI_RTP_PROXY_NOT_FOUND_LEN); + return init_mi_tree(404, MI_RTP_PROXY_NOT_FOUND, MI_RTP_PROXY_NOT_FOUND_LEN); } node = node->next; @@ -1296,45 +1282,46 @@ static struct mi_root* mi_show_rtp_proxy(struct mi_root* cmd_tree, void* param) node = &root->node; - /* found a matching all - show all rtpp */ - if (strncmp(MI_ALL, rtpp_url.s, MI_ALL_LEN) == 0) { - found = MI_FOUND_ALL; - } + /* found a matching all - show all rtpp */ + if (strncmp(MI_ALL, rtpp_url.s, MI_ALL_LEN) == 0) { + found = MI_FOUND_ALL; + } for(rtpp_list = rtpp_set_list->rset_first; rtpp_list != NULL; - rtpp_list = rtpp_list->rset_next) { + rtpp_list = rtpp_list->rset_next) { for(crt_rtpp = rtpp_list->rn_first; crt_rtpp != NULL; - crt_rtpp = crt_rtpp->rn_next) { + crt_rtpp = crt_rtpp->rn_next) { + if (!crt_rtpp->rn_displayed) { continue; } - /* found a matching rtpp - show it */ - if (found == MI_FOUND_ALL || - (crt_rtpp->rn_url.len == rtpp_url.len && - strncmp(crt_rtpp->rn_url.s, rtpp_url.s, rtpp_url.len) == 0)) { + /* found a matching rtpp - show it */ + if (found == MI_FOUND_ALL || + (crt_rtpp->rn_url.len == rtpp_url.len && + strncmp(crt_rtpp->rn_url.s, rtpp_url.s, rtpp_url.len) == 0)) { - if (add_rtpp_node_info(node, crt_rtpp, rtpp_list) < 0) { - goto error; - } + if (add_rtpp_node_info(node, crt_rtpp, rtpp_list) < 0) { + goto error; + } - if (found == MI_FOUND_NONE) { - found = MI_FOUND_ONE; - } - } + if (found == MI_FOUND_NONE) { + found = MI_FOUND_ONE; + } + } } } switch (found) { - case MI_FOUND_ALL: - case MI_FOUND_ONE: - break; - default: - if (root) { - free_mi_tree(root); - } - return init_mi_tree(404, MI_RTP_PROXY_NOT_FOUND, MI_RTP_PROXY_NOT_FOUND_LEN); + case MI_FOUND_ALL: + case MI_FOUND_ONE: + break; + default: + if (root) { + free_mi_tree(root); + } + return init_mi_tree(404, MI_RTP_PROXY_NOT_FOUND, MI_RTP_PROXY_NOT_FOUND_LEN); } return root; @@ -1362,7 +1349,7 @@ static struct mi_root* mi_ping_rtp_proxy(struct mi_root* cmd_tree, void* param) found_rtpp = NULL; if (rtpp_set_list == NULL) { - return init_mi_tree(404, MI_RTP_PROXY_NOT_FOUND, MI_RTP_PROXY_NOT_FOUND_LEN); + return init_mi_tree(404, MI_RTP_PROXY_NOT_FOUND, MI_RTP_PROXY_NOT_FOUND_LEN); } node = cmd_tree->node.kids; @@ -1381,35 +1368,35 @@ static struct mi_root* mi_ping_rtp_proxy(struct mi_root* cmd_tree, void* param) return init_mi_tree( 400, MI_MISSING_PARM_S, MI_MISSING_PARM_LEN); } - /* found a matching all - ping all rtpp */ - if (strncmp(MI_ALL, rtpp_url.s, MI_ALL_LEN) == 0) { - found = MI_FOUND_ALL; - } + /* found a matching all - ping all rtpp */ + if (strncmp(MI_ALL, rtpp_url.s, MI_ALL_LEN) == 0) { + found = MI_FOUND_ALL; + } for (rtpp_list = rtpp_set_list->rset_first; rtpp_list != NULL; - rtpp_list = rtpp_list->rset_next) { + rtpp_list = rtpp_list->rset_next) { for (crt_rtpp = rtpp_list->rn_first; crt_rtpp != NULL; - crt_rtpp = crt_rtpp->rn_next) { + crt_rtpp = crt_rtpp->rn_next) { - /* found a matching rtpp - ping it */ - if (found == MI_FOUND_ALL || - (crt_rtpp->rn_url.len == rtpp_url.len && - strncmp(crt_rtpp->rn_url.s, rtpp_url.s, rtpp_url.len) == 0)) { + /* found a matching rtpp - ping it */ + if (found == MI_FOUND_ALL || + (crt_rtpp->rn_url.len == rtpp_url.len && + strncmp(crt_rtpp->rn_url.s, rtpp_url.s, rtpp_url.len) == 0)) { - /* if ping fail */ - if (rtpp_test_ping(crt_rtpp) < 0) { - crt_rtpp->rn_recheck_ticks = get_ticks() + rtpengine_disable_tout; - found_rtpp_disabled = 1; - crt_rtpp->rn_disabled = 1; - } + /* if ping fail */ + if (rtpp_test_ping(crt_rtpp) < 0) { + crt_rtpp->rn_recheck_ticks = get_ticks() + rtpengine_disable_tout; + found_rtpp_disabled = 1; + crt_rtpp->rn_disabled = 1; + } - if (found == MI_FOUND_NONE) { - found = MI_FOUND_ONE; - found_rtpp = crt_rtpp; - } - } - } + if (found == MI_FOUND_NONE) { + found = MI_FOUND_ONE; + found_rtpp = crt_rtpp; + } + } + } } root = init_mi_tree(200, MI_OK_S, MI_OK_LEN); @@ -1421,51 +1408,47 @@ static struct mi_root* mi_ping_rtp_proxy(struct mi_root* cmd_tree, void* param) node = &root->node; switch (found) { - case MI_FOUND_ALL: - snode.s = MI_ALL; - snode.len = MI_ALL_LEN; - break; - case MI_FOUND_ONE: - snode.s = found_rtpp->rn_url.s; - snode.len = found_rtpp->rn_url.len; - break; - default: - if (root) { - free_mi_tree(root); - } - return init_mi_tree(404, MI_RTP_PROXY_NOT_FOUND, MI_RTP_PROXY_NOT_FOUND_LEN); - } - - sattr.s = MI_PING; - sattr.len = MI_PING_LEN; - - if (found_rtpp_disabled) { - svalue.s = MI_FAIL; - svalue.len = MI_FAIL_LEN; - } else { - svalue.s = MI_SUCCESS; - svalue.len = MI_SUCCESS_LEN; - } - - if (!(crt_node = add_mi_node_child(node, 0, - snode.s, snode.len, - 0, 0)) ) { - LM_ERR("cannot add the child node to the tree\n"); - goto error; - } - - if ((attr = add_mi_attr(crt_node, MI_DUP_VALUE, - sattr.s, sattr.len, - svalue.s, svalue.len)) == 0) { - LM_ERR("cannot add attributes to the node\n"); - goto error; + case MI_FOUND_ALL: + snode.s = MI_ALL; + snode.len = MI_ALL_LEN; + break; + case MI_FOUND_ONE: + snode.s = found_rtpp->rn_url.s; + snode.len = found_rtpp->rn_url.len; + break; + default: + if (root) { + free_mi_tree(root); + } + return init_mi_tree(404, MI_RTP_PROXY_NOT_FOUND, MI_RTP_PROXY_NOT_FOUND_LEN); + } + + sattr.s = MI_PING; + sattr.len = MI_PING_LEN; + + if (found_rtpp_disabled) { + svalue.s = MI_FAIL; + svalue.len = MI_FAIL_LEN; + } else { + svalue.s = MI_SUCCESS; + svalue.len = MI_SUCCESS_LEN; + } + + if (!(crt_node = add_mi_node_child(node, 0, snode.s, snode.len, 0, 0))) { + LM_ERR("cannot add the child node to the tree\n"); + goto error; + } + + if ((attr = add_mi_attr(crt_node, MI_DUP_VALUE, sattr.s, sattr.len, svalue.s, svalue.len)) == 0) { + LM_ERR("cannot add attributes to the node\n"); + goto error; } return root; error: if (root) { - free_mi_tree(root); + free_mi_tree(root); } return init_mi_tree(404, MI_ERROR, MI_ERROR_LEN); } @@ -1488,7 +1471,7 @@ static struct mi_root* mi_show_hash_total(struct mi_root* cmd_tree, void* param) node = &root->node; // Create new node and add it to the roots's kids - if(!(crt_node = add_mi_node_child(node, MI_DUP_NAME, "total", strlen("total"), 0, 0))) { + if (!(crt_node = add_mi_node_child(node, MI_DUP_NAME, "total", strlen("total"), 0, 0))) { LM_ERR("cannot add the child node to the tree\n"); goto error; } @@ -1507,7 +1490,7 @@ static struct mi_root* mi_show_hash_total(struct mi_root* cmd_tree, void* param) error: if (root) { - free_mi_tree(root); + free_mi_tree(root); } return init_mi_tree(404, MI_HASH_ENTRIES_FAIL, MI_HASH_ENTRIES_FAIL_LEN); @@ -1526,14 +1509,14 @@ mi_reload_rtp_proxy(struct mi_root* cmd_tree, void* param) return 0; } } else { - if (init_rtpproxy_db() < 0) { + if (init_rtpproxy_db() < 0) { // fail reloading from database root = init_mi_tree(404, MI_DB_ERR, MI_DB_ERR_LEN); if (!root) { LM_ERR("the MI tree cannot be initialized!\n"); return 0; } - } else { + } else { // success reloading from database root = init_mi_tree(200, MI_DB_OK, MI_DB_OK_LEN); if (!root) { @@ -1594,11 +1577,11 @@ mod_init(void) rtp_inst_pv_param.len = strlen(rtp_inst_pv_param.s); rtp_inst_pvar = pv_cache_get(&rtp_inst_pv_param); if ((rtp_inst_pvar == NULL) || - ((rtp_inst_pvar->type != PVT_AVP) && - (rtp_inst_pvar->type != PVT_XAVP) && - (rtp_inst_pvar->type != PVT_SCRIPTVAR))) { - LM_ERR("Invalid pvar name <%.*s>\n", rtp_inst_pv_param.len, rtp_inst_pv_param.s); - return -1; + ((rtp_inst_pvar->type != PVT_AVP) && + (rtp_inst_pvar->type != PVT_XAVP) && + (rtp_inst_pvar->type != PVT_SCRIPTVAR))) { + LM_ERR("Invalid pvar name <%.*s>\n", rtp_inst_pv_param.len, rtp_inst_pv_param.s); + return -1; } } @@ -1613,27 +1596,25 @@ mod_init(void) } if (setid_avp_param) { - s.s = setid_avp_param; s.len = strlen(s.s); - avp_spec = pv_cache_get(&s); - if (avp_spec==NULL || (avp_spec->type != PVT_AVP)) { - LM_ERR("malformed or non AVP definition <%s>\n", - setid_avp_param); - return -1; - } - if (pv_get_avp_name(0, &(avp_spec->pvp), &setid_avp, - &avp_flags) != 0) { - LM_ERR("invalid AVP definition <%s>\n", setid_avp_param); - return -1; - } - setid_avp_type = avp_flags; + s.s = setid_avp_param; s.len = strlen(s.s); + avp_spec = pv_cache_get(&s); + if (avp_spec==NULL || (avp_spec->type != PVT_AVP)) { + LM_ERR("malformed or non AVP definition <%s>\n", setid_avp_param); + return -1; + } + if (pv_get_avp_name(0, &(avp_spec->pvp), &setid_avp, &avp_flags) != 0) { + LM_ERR("invalid AVP definition <%s>\n", setid_avp_param); + return -1; + } + setid_avp_type = avp_flags; } if (write_sdp_pvar_str.len > 0) { write_sdp_pvar = pv_cache_get(&write_sdp_pvar_str); if (write_sdp_pvar == NULL - || (write_sdp_pvar->type != PVT_AVP && write_sdp_pvar->type != PVT_SCRIPTVAR) ) { + || (write_sdp_pvar->type != PVT_AVP && write_sdp_pvar->type != PVT_SCRIPTVAR) ) { LM_ERR("write_sdp_pv: not a valid AVP or VAR definition <%.*s>\n", - write_sdp_pvar_str.len, write_sdp_pvar_str.s); + write_sdp_pvar_str.len, write_sdp_pvar_str.s); return -1; } } @@ -1641,9 +1622,9 @@ mod_init(void) if (read_sdp_pvar_str.len > 0) { read_sdp_pvar = pv_cache_get(&read_sdp_pvar_str); if (read_sdp_pvar == NULL - || (read_sdp_pvar->type != PVT_AVP && read_sdp_pvar->type != PVT_SCRIPTVAR) ) { + || (read_sdp_pvar->type != PVT_AVP && read_sdp_pvar->type != PVT_SCRIPTVAR) ) { LM_ERR("read_sdp_pv: not a valid AVP or VAR definition <%.*s>\n", - read_sdp_pvar_str.len, read_sdp_pvar_str.s); + read_sdp_pvar_str.len, read_sdp_pvar_str.s); return -1; } } @@ -1659,14 +1640,14 @@ mod_init(void) if (load_tm_api( &tmb ) < 0) { LM_DBG("could not load the TM-functions - answer-offer model" - " auto-detection is disabled\n"); + " auto-detection is disabled\n"); memset(&tmb, 0, sizeof(struct tm_binds)); } /* Determine IP addr type (IPv4 or IPv6 allowed) */ force_send_ip_af = get_ip_type(force_send_ip_str); if (force_send_ip_af != AF_INET && force_send_ip_af != AF_INET6 && - strlen(force_send_ip_str) > 0) { + strlen(force_send_ip_str) > 0) { LM_ERR("%s is an unknown address\n", force_send_ip_str); return -1; } @@ -1757,7 +1738,7 @@ child_init(int rank) pkg_free(hostname); rtpp_socks[pnode->idx] = socket((pnode->rn_umode == 6) - ? AF_INET6 : AF_INET, SOCK_DGRAM, 0); + ? AF_INET6 : AF_INET, SOCK_DGRAM, 0); if (rtpp_socks[pnode->idx] == -1) { LM_ERR("can't create socket\n"); freeaddrinfo(res); @@ -1766,8 +1747,8 @@ child_init(int rank) #ifdef IP_MTU_DISCOVER setsockopt(rtpp_socks[pnode->idx], IPPROTO_IP, - IP_MTU_DISCOVER, &ip_mtu_discover, - sizeof(ip_mtu_discover)); + IP_MTU_DISCOVER, &ip_mtu_discover, + sizeof(ip_mtu_discover)); #endif if (bind_force_send_ip(pnode->idx) == -1) { @@ -2203,11 +2184,11 @@ static bencode_item_t *rtpp_function_call(bencode_buffer_t *bencbuf, struct sip_ if (!bencode_dictionary_get_strcmp(resp, "result", "error")) { if (!bencode_dictionary_get_str(resp, "error-reason", &error)) { - LM_ERR("proxy return error but didn't give an error reason: %.*s\n", ret, cp); + LM_ERR("proxy return error but didn't give an error reason: %.*s\n", ret, cp); } else { if ((RTPENGINE_SESS_LIMIT_MSG_LEN == error.len) && - (strncmp(error.s, RTPENGINE_SESS_LIMIT_MSG, RTPENGINE_SESS_LIMIT_MSG_LEN) == 0)) + (strncmp(error.s, RTPENGINE_SESS_LIMIT_MSG, RTPENGINE_SESS_LIMIT_MSG_LEN) == 0)) { LM_WARN("proxy %.*s: %.*s", node->rn_url.len, node->rn_url.s , error.len, error.s); goto select_node; @@ -2278,7 +2259,7 @@ rtpp_test(struct rtpp_node *node, int isdisabled, int force) int ret; if(node->rn_recheck_ticks == MI_MAX_RECHECK_TICKS){ - LM_DBG("rtpp %s disabled for ever\n", node->rn_url.s); + LM_DBG("rtpp %s disabled for ever\n", node->rn_url.s); return 1; } if (force == 0) { @@ -2312,13 +2293,13 @@ rtpp_test(struct rtpp_node *node, int isdisabled, int force) } LM_INFO("rtp proxy <%s> found, support for it %senabled\n", - node->rn_url.s, force == 0 ? "re-" : ""); + node->rn_url.s, force == 0 ? "re-" : ""); bencode_buffer_free(&bencbuf); return 0; benc_error: - LM_ERR("out of memory - bencode failed\n"); + LM_ERR("out of memory - bencode failed\n"); error: bencode_buffer_free(&bencbuf); return 1; @@ -2333,7 +2314,7 @@ send_rtpp_command(struct rtpp_node *node, bencode_item_t *dict, int *outlen) static char buf[0x10000]; struct pollfd fds[1]; struct iovec *v; - str out = STR_NULL; + str out = STR_NULL; v = bencode_iovec(dict, &vcnt, 1, 0); if (!v) { @@ -2347,7 +2328,7 @@ send_rtpp_command(struct rtpp_node *node, bencode_item_t *dict, int *outlen) memset(&addr, 0, sizeof(addr)); addr.sun_family = AF_LOCAL; strncpy(addr.sun_path, node->rn_address, - sizeof(addr.sun_path) - 1); + sizeof(addr.sun_path) - 1); #ifdef HAVE_SOCKADDR_SA_LEN addr.sun_len = strlen(addr.sun_path); #endif @@ -2385,7 +2366,7 @@ send_rtpp_command(struct rtpp_node *node, bencode_item_t *dict, int *outlen) fds[0].revents = 0; /* Drain input buffer */ while ((poll(fds, 1, 0) == 1) && - ((fds[0].revents & POLLIN) != 0)) { + ((fds[0].revents & POLLIN) != 0)) { recv(rtpp_socks[node->idx], buf, sizeof(buf) - 1, 0); fds[0].revents = 0; } @@ -2396,12 +2377,12 @@ send_rtpp_command(struct rtpp_node *node, bencode_item_t *dict, int *outlen) len = writev(rtpp_socks[node->idx], v, vcnt + 1); } while (len == -1 && (errno == EINTR || errno == ENOBUFS)); if (len <= 0) { - bencode_get_str(bencode_dictionary_get(dict, "command"), &out); + bencode_get_str(bencode_dictionary_get(dict, "command"), &out); LM_ERR("can't send command \"%.*s\" to RTP proxy <%s>\n", out.len, out.s, node->rn_url.s); goto badproxy; } while ((poll(fds, 1, rtpengine_tout_ms) == 1) && - (fds[0].revents & POLLIN) != 0) { + (fds[0].revents & POLLIN) != 0) { do { len = recv(rtpp_socks[node->idx], buf, sizeof(buf)-1, 0); } while (len == -1 && errno == EINTR); @@ -2410,7 +2391,7 @@ send_rtpp_command(struct rtpp_node *node, bencode_item_t *dict, int *outlen) goto badproxy; } if (len >= (v[0].iov_len - 1) && - memcmp(buf, v[0].iov_base, (v[0].iov_len - 1)) == 0) { + memcmp(buf, v[0].iov_base, (v[0].iov_len - 1)) == 0) { len -= (v[0].iov_len - 1); cp += (v[0].iov_len - 1); if (len != 0) { @@ -2446,14 +2427,14 @@ static struct rtpp_set * select_rtpp_set(int id_set ){ struct rtpp_set * rtpp_list; /*is it a valid set_id?*/ - if(!rtpp_set_list || !rtpp_set_list->rset_first){ + if (!rtpp_set_list || !rtpp_set_list->rset_first) { LM_ERR("no rtp_proxy configured\n"); return 0; } - for(rtpp_list=rtpp_set_list->rset_first; rtpp_list!=0 && - rtpp_list->id_set!=id_set; rtpp_list=rtpp_list->rset_next); - if(!rtpp_list){ + for (rtpp_list=rtpp_set_list->rset_first; rtpp_list!=0 && + rtpp_list->id_set!=id_set; rtpp_list=rtpp_list->rset_next); + if (!rtpp_list) { LM_ERR(" script error-invalid id_set to be selected\n"); } @@ -2542,10 +2523,10 @@ select_rtpp_node_new(str callid, str viabranch, int do_test) callid.len, callid.len, callid.s, viabranch.len, viabranch.s); return node; } - memset(entry, 0, sizeof(struct rtpengine_hash_entry)); + memset(entry, 0, sizeof(struct rtpengine_hash_entry)); /* fill the entry */ - if (callid.s && callid.len > 0) { + if (callid.s && callid.len > 0) { if (shm_str_dup(&entry->callid, &callid) < 0) { LM_ERR("rtpengine hash table fail to duplicate calllen=%d callid=%.*s\n", callid.len, callid.len, callid.s); @@ -2553,7 +2534,7 @@ select_rtpp_node_new(str callid, str viabranch, int do_test) return node; } } - if (viabranch.s && viabranch.len > 0) { + if (viabranch.s && viabranch.len > 0) { if (shm_str_dup(&entry->viabranch, &viabranch) < 0) { LM_ERR("rtpengine hash table fail to duplicate calllen=%d viabranch=%.*s\n", callid.len, viabranch.len, viabranch.s); @@ -2654,11 +2635,11 @@ select_rtpp_node(str callid, str viabranch, int do_test) static int get_extra_id(struct sip_msg* msg, str *id_str) { - if(msg==NULL || extra_id_pv==NULL || id_str==NULL) { + if (msg == NULL || extra_id_pv == NULL || id_str == NULL) { LM_ERR("bad parameters\n"); return -1; } - if (pv_printf_s(msg, extra_id_pv, id_str)<0) { + if (pv_printf_s(msg, extra_id_pv, id_str) < 0) { LM_ERR("cannot print the additional id\n"); return -1; } @@ -2670,36 +2651,34 @@ get_extra_id(struct sip_msg* msg, str *id_str) { static int set_rtpengine_set_from_avp(struct sip_msg *msg, int direction) { - struct usr_avp *avp; - int_str setid_val; - - if ((setid_avp_param == NULL) || - (avp = search_first_avp(setid_avp_type, setid_avp, &setid_val, 0)) - == NULL) - { - if (direction == 1 || !selected_rtpp_set_2) - active_rtpp_set = selected_rtpp_set_1; - else - active_rtpp_set = selected_rtpp_set_2; - return 1; - } - - if (avp->flags&AVP_VAL_STR) { - LM_ERR("setid_avp must hold an integer value\n"); - return -1; - } + struct usr_avp *avp; + int_str setid_val; - active_rtpp_set = select_rtpp_set(setid_val.n); - if(active_rtpp_set == NULL) { - LM_ERR("could not locate rtpproxy set %d\n", setid_val.n); - return -1; - } + if ((setid_avp_param == NULL) || + (avp = search_first_avp(setid_avp_type, setid_avp, &setid_val, 0)) == NULL) { + if (direction == 1 || !selected_rtpp_set_2) + active_rtpp_set = selected_rtpp_set_1; + else + active_rtpp_set = selected_rtpp_set_2; + return 1; + } - LM_DBG("using rtpengine set %d\n", setid_val.n); + if (avp->flags&AVP_VAL_STR) { + LM_ERR("setid_avp must hold an integer value\n"); + return -1; + } - current_msg_id = msg->id; + active_rtpp_set = select_rtpp_set(setid_val.n); + if(active_rtpp_set == NULL) { + LM_ERR("could not locate rtpproxy set %d\n", setid_val.n); + return -1; + } - return 1; + LM_DBG("using rtpengine set %d\n", setid_val.n); + + current_msg_id = msg->id; + + return 1; } static int rtpengine_delete(struct sip_msg *msg, const char *flags) { @@ -2714,7 +2693,7 @@ static int rtpengine_rtpp_set_wrap(struct sip_msg *msg, int (*func)(struct sip_m body_intermediate.s = NULL; if (set_rtpengine_set_from_avp(msg, direction) == -1) - return -1; + return -1; more = 1; if (!selected_rtpp_set_2 || selected_rtpp_set_2 == selected_rtpp_set_1) @@ -2729,7 +2708,7 @@ static int rtpengine_rtpp_set_wrap(struct sip_msg *msg, int (*func)(struct sip_m direction = (direction == 1) ? 2 : 1; if (set_rtpengine_set_from_avp(msg, direction) == -1) - return -1; + return -1; ret = func(msg, data, 0); body_intermediate.s = NULL; @@ -2785,20 +2764,20 @@ set_rtpengine_set_n(struct sip_msg *msg, rtpp_set_link_t *rtpl, struct rtpp_set node = (*out)->rn_first; while (node != NULL) { - if (node->rn_disabled == 0) nb_active_nodes++; - node = node->rn_next; + if (node->rn_disabled == 0) nb_active_nodes++; + node = node->rn_next; } if ( nb_active_nodes > 0 ) { LM_DBG("rtpp: selected proxy set ID %d with %d active nodes.\n", - current_msg_id, nb_active_nodes); + current_msg_id, nb_active_nodes); return nb_active_nodes; } else { LM_WARN("rtpp: selected proxy set ID %d but it has no active node.\n", - current_msg_id); + current_msg_id); return -2; } } @@ -2836,8 +2815,8 @@ rtpengine_manage(struct sip_msg *msg, const char *flags) int method; int nosdp; - if(msg->cseq==NULL && ((parse_headers(msg, HDR_CSEQ_F, 0)==-1) - || (msg->cseq==NULL))) + if (msg->cseq==NULL && ((parse_headers(msg, HDR_CSEQ_F, 0)==-1) || + (msg->cseq==NULL))) { LM_ERR("no CSEQ header\n"); return -1; @@ -2845,19 +2824,19 @@ rtpengine_manage(struct sip_msg *msg, const char *flags) method = get_cseq(msg)->method_id; - if(!(method==METHOD_INVITE || method==METHOD_ACK || method==METHOD_CANCEL - || method==METHOD_BYE || method==METHOD_UPDATE)) + if (!(method==METHOD_INVITE || method==METHOD_ACK || method==METHOD_CANCEL + || method==METHOD_BYE || method==METHOD_UPDATE)) return -1; - if(method==METHOD_CANCEL || method==METHOD_BYE) + if (method==METHOD_CANCEL || method==METHOD_BYE) return rtpengine_delete(msg, flags); - if(msg->msg_flags & FL_SDP_BODY) + if (msg->msg_flags & FL_SDP_BODY) nosdp = 0; else nosdp = parse_sdp(msg); - if(msg->first_line.type == SIP_REQUEST) { + if (msg->first_line.type == SIP_REQUEST) { if(method==METHOD_ACK && nosdp==0) return rtpengine_offer_answer(msg, flags, OP_ANSWER, 0); if(method==METHOD_UPDATE && nosdp==0) @@ -2871,16 +2850,16 @@ rtpengine_manage(struct sip_msg *msg, const char *flags) return rtpengine_delete(msg, flags); return rtpengine_offer_answer(msg, flags, OP_OFFER, 0); } - } else if(msg->first_line.type == SIP_REPLY) { - if(msg->first_line.u.reply.statuscode>=300) + } else if (msg->first_line.type == SIP_REPLY) { + if (msg->first_line.u.reply.statuscode>=300) return rtpengine_delete(msg, flags); - if(nosdp==0) { - if(method==METHOD_UPDATE) + if (nosdp==0) { + if (method==METHOD_UPDATE) return rtpengine_offer_answer(msg, flags, OP_ANSWER, 0); - if(tmb.t_gett==NULL || tmb.t_gett()==NULL + if (tmb.t_gett==NULL || tmb.t_gett()==NULL || tmb.t_gett()==T_UNDEFINED) return rtpengine_offer_answer(msg, flags, OP_ANSWER, 0); - if(tmb.t_gett()->uas.request->msg_flags & FL_SDP_BODY) + if (tmb.t_gett()->uas.request->msg_flags & FL_SDP_BODY) return rtpengine_offer_answer(msg, flags, OP_ANSWER, 0); return rtpengine_offer_answer(msg, flags, OP_OFFER, 0); } @@ -3057,8 +3036,7 @@ static int rtpengine_rtpstat_wrap(struct sip_msg *msg, void *d, int more) { * Returns the current RTP-Statistics from the RTP-Proxy */ static int -pv_get_rtpstat_f(struct sip_msg *msg, pv_param_t *param, - pv_value_t *res) +pv_get_rtpstat_f(struct sip_msg *msg, pv_param_t *param, pv_value_t *res) { void *parms[2]; @@ -3079,8 +3057,7 @@ set_rtp_inst_pvar(struct sip_msg *msg, const str * const uri) { val.flags = PV_VAL_STR; val.rs = *uri; - if (rtp_inst_pvar->setf(msg, &rtp_inst_pvar->pvp, (int)EQ_T, &val) < 0) - { + if (rtp_inst_pvar->setf(msg, &rtp_inst_pvar->pvp, (int)EQ_T, &val) < 0) { LM_ERR("Failed to add RTP Engine URI to pvar\n"); return -1; } diff --git a/modules/rtpengine/rtpengine.h b/modules/rtpengine/rtpengine.h index 45a7401be45..1fd7a2f6d4a 100644 --- a/modules/rtpengine/rtpengine.h +++ b/modules/rtpengine/rtpengine.h @@ -27,36 +27,36 @@ #include "../../str.h" #define MI_MIN_RECHECK_TICKS 0 -#define MI_MAX_RECHECK_TICKS (unsigned int)-1 +#define MI_MAX_RECHECK_TICKS ((unsigned int)-1) struct rtpp_node { unsigned int idx; /* overall index */ - str rn_url; /* unparsed, deletable */ - int rn_umode; - char *rn_address; /* substring of rn_url */ - int rn_disabled; /* found unaccessible? */ - unsigned rn_weight; /* for load balancing */ + str rn_url; /* unparsed, deletable */ + int rn_umode; + char *rn_address; /* substring of rn_url */ + int rn_disabled; /* found unaccessible? */ + unsigned int rn_weight; /* for load balancing */ unsigned int rn_displayed; /* for delete at db reload */ unsigned int rn_recheck_ticks; - int rn_rep_supported; - int rn_ptl_supported; + int rn_rep_supported; + int rn_ptl_supported; struct rtpp_node *rn_next; }; -struct rtpp_set{ +struct rtpp_set { unsigned int id_set; - unsigned weight_sum; + unsigned int weight_sum; unsigned int rtpp_node_count; - int set_disabled; + int set_disabled; unsigned int set_recheck_ticks; struct rtpp_node *rn_first; struct rtpp_node *rn_last; - struct rtpp_set *rset_next; + struct rtpp_set *rset_next; }; -struct rtpp_set_head{ +struct rtpp_set_head { struct rtpp_set *rset_first; struct rtpp_set *rset_last; }; From b79d23436bbfceb0debb8ff829b5ff8d2e49c46d Mon Sep 17 00:00:00 2001 From: Stefan Mititelu <stefan.mititelu@1and1.ro> Date: Fri, 11 Dec 2015 17:21:16 +0200 Subject: [PATCH 13/14] rtpengine: Don't add invalid URL node, in db mode Don't continue parsing the node url if errors were spotted, in db mode. --- modules/rtpengine/rtpengine.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/modules/rtpengine/rtpengine.c b/modules/rtpengine/rtpengine.c index 4af1c5e0c31..8481c43a87f 100644 --- a/modules/rtpengine/rtpengine.c +++ b/modules/rtpengine/rtpengine.c @@ -794,7 +794,12 @@ int add_rtpengine_socks(struct rtpp_set * rtpp_list, char * rtpproxy, rtpp_no--; shm_free(pnode->rn_url.s); shm_free(pnode); - continue; + + if (!isDB) { + continue; + } else { + return 0; + } } /* Check the rn_address is 'hostname:port' */ @@ -812,7 +817,12 @@ int add_rtpengine_socks(struct rtpp_set * rtpp_list, char * rtpproxy, rtpp_no--; shm_free(pnode->rn_url.s); shm_free(pnode); - continue; + + if (!isDB) { + continue; + } else { + return 0; + } } } From 789dec73bd5f906b47ad95ee4e55ba2db3d7d3e2 Mon Sep 17 00:00:00 2001 From: Stefan Mititelu <stefan.mititelu@1and1.ro> Date: Wed, 20 Jan 2016 10:11:49 +0200 Subject: [PATCH 14/14] rtpengine: rebuild rtpp_socks before send command - update node selection only from displayed nodes - update rtpp_set_list alocation from get_rtpp_set() to mod_init(); thus all procs will have reference to the list of sets. - add locks for rtpp_set_head and rtpp_set - make rtpp_no shm variable guarded by rtpp_no_lock - add rtpp_socks_size pkg variable - compare rtpp_socks_size with rtpp_no and rebuild rtpp_socks if they differ --- modules/rtpengine/rtpengine.c | 317 ++++++++++++++++++++++++++----- modules/rtpengine/rtpengine.h | 2 + modules/rtpengine/rtpengine_db.c | 4 +- 3 files changed, 274 insertions(+), 49 deletions(-) diff --git a/modules/rtpengine/rtpengine.c b/modules/rtpengine/rtpengine.c index 8481c43a87f..178225897a4 100644 --- a/modules/rtpengine/rtpengine.c +++ b/modules/rtpengine/rtpengine.c @@ -200,6 +200,7 @@ static struct rtpp_set * select_rtpp_set(int id_set); static struct rtpp_node *select_rtpp_node_new(str, str, int); static struct rtpp_node *select_rtpp_node_old(str, str, int); static struct rtpp_node *select_rtpp_node(str, str, int); +static int build_rtpp_socks(unsigned int current_rtpp_no); static char *send_rtpp_command(struct rtpp_node *, bencode_item_t *, int *); static int get_extra_id(struct sip_msg* msg, str *id_str); @@ -259,8 +260,10 @@ static str rtp_inst_pv_param = {NULL, 0}; static pv_spec_t *rtp_inst_pvar = NULL; /* array with the sockets used by rtpporxy (per process)*/ -static unsigned int rtpp_no = 0; +static unsigned int *rtpp_no = 0; +static gen_lock_t *rtpp_no_lock = 0; static int *rtpp_socks = 0; +static unsigned int rtpp_socks_size = 0; static int setid_avp_type; static int_str setid_avp; @@ -398,10 +401,12 @@ int rtpengine_delete_node_set(struct rtpp_set *rtpp_list) { struct rtpp_node *rtpp_node; + lock_get(rtpp_list->rset_lock); for(rtpp_node = rtpp_list->rn_first; rtpp_node != NULL; rtpp_node = rtpp_node->rn_next) { rtpengine_delete_node(rtpp_node); } + lock_release(rtpp_list->rset_lock); return 1; } @@ -415,10 +420,12 @@ int rtpengine_delete_node_all() return 1; } + lock_get(rtpp_set_list->rset_head_lock); for(rtpp_list = rtpp_set_list->rset_first; rtpp_list != NULL; rtpp_list = rtpp_list->rset_next) { rtpengine_delete_node_set(rtpp_list); } + lock_release(rtpp_set_list->rset_head_lock); return 1; } @@ -635,13 +642,16 @@ struct rtpp_node *get_rtpp_node(struct rtpp_set *rtpp_list, str *url) return NULL; } + lock_get(rtpp_list->rset_lock); rtpp_node = rtpp_list->rn_first; while (rtpp_node) { if (str_cmp(&rtpp_node->rn_url, url) == 0) { + lock_release(rtpp_list->rset_lock); return rtpp_node; } rtpp_node = rtpp_node->rn_next; } + lock_release(rtpp_list->rset_lock); return NULL; } @@ -660,8 +670,9 @@ struct rtpp_set *get_rtpp_set(int set_id) my_current_id = set_id; /*search for the current_id*/ + lock_get(rtpp_set_list->rset_head_lock); rtpp_list = rtpp_set_list ? rtpp_set_list->rset_first : 0; - while( rtpp_list != 0 && rtpp_list->id_set!=my_current_id) + while (rtpp_list != 0 && rtpp_list->id_set!=my_current_id) rtpp_list = rtpp_list->rset_next; if (rtpp_list==NULL) @@ -669,11 +680,29 @@ struct rtpp_set *get_rtpp_set(int set_id) rtpp_list = shm_malloc(sizeof(struct rtpp_set)); if(!rtpp_list) { + lock_release(rtpp_set_list->rset_head_lock); LM_ERR("no shm memory left to create new rtpproxy set %d\n", my_current_id); return NULL; } memset(rtpp_list, 0, sizeof(struct rtpp_set)); rtpp_list->id_set = my_current_id; + rtpp_list->rset_lock = lock_alloc(); + if (!rtpp_list->rset_lock) { + lock_release(rtpp_set_list->rset_head_lock); + LM_ERR("no shm memory left to create rtpproxy set lock\n"); + shm_free(rtpp_list); + rtpp_list = NULL; + return NULL; + } + if (lock_init(rtpp_list->rset_lock) == 0) { + lock_release(rtpp_set_list->rset_head_lock); + LM_ERR("could not init rtpproxy set lock\n"); + lock_dealloc((void*)rtpp_list->rset_lock); + rtpp_list->rset_lock = NULL; + shm_free(rtpp_list); + rtpp_list = NULL; + return NULL; + } new_list = 1; } else { @@ -682,15 +711,6 @@ struct rtpp_set *get_rtpp_set(int set_id) if (new_list) { - if(!rtpp_set_list){/*initialize the list of set*/ - rtpp_set_list = shm_malloc(sizeof(struct rtpp_set_head)); - if(!rtpp_set_list){ - LM_ERR("no shm memory left to create list of proxysets\n"); - return NULL; - } - memset(rtpp_set_list, 0, sizeof(struct rtpp_set_head)); - } - /*update the list of set info*/ if (!rtpp_set_list->rset_first) { @@ -708,6 +728,8 @@ struct rtpp_set *get_rtpp_set(int set_id) default_rtpp_set = rtpp_list; } } + lock_release(rtpp_set_list->rset_head_lock); + return rtpp_list; } @@ -757,7 +779,9 @@ int add_rtpengine_socks(struct rtpp_set * rtpp_list, char * rtpproxy, } memset(pnode, 0, sizeof(*pnode)); - pnode->idx = rtpp_no++; + lock_get(rtpp_no_lock); + pnode->idx = *rtpp_no; + if (ticks == MI_MAX_RECHECK_TICKS) { pnode->rn_recheck_ticks = ticks; } else { @@ -769,7 +793,7 @@ int add_rtpengine_socks(struct rtpp_set * rtpp_list, char * rtpproxy, pnode->rn_displayed = 1; pnode->rn_url.s = shm_malloc(p2 - p1 + 1); if (pnode->rn_url.s == NULL) { - rtpp_no--; + lock_release(rtpp_no_lock); shm_free(pnode); LM_ERR("no shm memory left\n"); return -1; @@ -790,8 +814,8 @@ int add_rtpengine_socks(struct rtpp_set * rtpp_list, char * rtpproxy, pnode->rn_umode = 0; pnode->rn_address += 5; } else { + lock_release(rtpp_no_lock); LM_WARN("Node address must start with 'udp:' or 'udp6:' or 'unix:'. Ignore '%s'.\n", pnode->rn_address); - rtpp_no--; shm_free(pnode->rn_url.s); shm_free(pnode); @@ -813,8 +837,8 @@ int add_rtpengine_socks(struct rtpp_set * rtpp_list, char * rtpproxy, s1.s = p1; s1.len = strlen(p1); if (str2int(&s1, &port) < 0 || port > 0xFFFF) { + lock_release(rtpp_no_lock); LM_WARN("Node address must end with a valid port number. Ignore '%s'.\n", pnode->rn_address); - rtpp_no--; shm_free(pnode->rn_url.s); shm_free(pnode); @@ -828,13 +852,16 @@ int add_rtpengine_socks(struct rtpp_set * rtpp_list, char * rtpproxy, /* If node found in set, update it */ rtpp_node = get_rtpp_node(rtpp_list, &pnode->rn_url); + + lock_get(rtpp_list->rset_lock); if (rtpp_node) { rtpp_node->rn_disabled = pnode->rn_disabled; rtpp_node->rn_displayed = pnode->rn_displayed; rtpp_node->rn_recheck_ticks = pnode->rn_recheck_ticks; rtpp_node->rn_weight = pnode->rn_weight; + lock_release(rtpp_list->rset_lock); + lock_release(rtpp_no_lock); - rtpp_no--; shm_free(pnode->rn_url.s); shm_free(pnode); @@ -853,6 +880,10 @@ int add_rtpengine_socks(struct rtpp_set * rtpp_list, char * rtpproxy, rtpp_list->rn_last = pnode; rtpp_list->rtpp_node_count++; + lock_release(rtpp_list->rset_lock); + + *rtpp_no = *rtpp_no + 1; + lock_release(rtpp_no_lock); if (!isDB) { continue; @@ -1069,12 +1100,18 @@ static struct mi_root* mi_enable_rtp_proxy(struct mi_root *cmd_tree, void *param found = MI_FOUND_ALL; } + lock_get(rtpp_set_list->rset_head_lock); for(rtpp_list = rtpp_set_list->rset_first; rtpp_list != NULL; rtpp_list = rtpp_list->rset_next) { + lock_get(rtpp_list->rset_lock); for(crt_rtpp = rtpp_list->rn_first; crt_rtpp != NULL; crt_rtpp = crt_rtpp->rn_next) { + if (!crt_rtpp->rn_displayed) { + continue; + } + /* found a matching rtpp - show it */ if (found == MI_FOUND_ALL || (crt_rtpp->rn_url.len == rtpp_url.len && @@ -1107,7 +1144,9 @@ static struct mi_root* mi_enable_rtp_proxy(struct mi_root *cmd_tree, void *param } } } + lock_release(rtpp_list->rset_lock); } + lock_release(rtpp_set_list->rset_head_lock); root = init_mi_tree(200, MI_OK_S, MI_OK_LEN); if (!root) { @@ -1297,9 +1336,11 @@ static struct mi_root* mi_show_rtp_proxy(struct mi_root* cmd_tree, void* param) found = MI_FOUND_ALL; } + lock_get(rtpp_set_list->rset_head_lock); for(rtpp_list = rtpp_set_list->rset_first; rtpp_list != NULL; rtpp_list = rtpp_list->rset_next) { + lock_get(rtpp_list->rset_lock); for(crt_rtpp = rtpp_list->rn_first; crt_rtpp != NULL; crt_rtpp = crt_rtpp->rn_next) { @@ -1313,6 +1354,8 @@ static struct mi_root* mi_show_rtp_proxy(struct mi_root* cmd_tree, void* param) strncmp(crt_rtpp->rn_url.s, rtpp_url.s, rtpp_url.len) == 0)) { if (add_rtpp_node_info(node, crt_rtpp, rtpp_list) < 0) { + lock_release(rtpp_list->rset_lock); + lock_release(rtpp_set_list->rset_head_lock); goto error; } @@ -1321,7 +1364,9 @@ static struct mi_root* mi_show_rtp_proxy(struct mi_root* cmd_tree, void* param) } } } + lock_release(rtpp_list->rset_lock); } + lock_release(rtpp_set_list->rset_head_lock); switch (found) { case MI_FOUND_ALL: @@ -1383,12 +1428,18 @@ static struct mi_root* mi_ping_rtp_proxy(struct mi_root* cmd_tree, void* param) found = MI_FOUND_ALL; } + lock_get(rtpp_set_list->rset_head_lock); for (rtpp_list = rtpp_set_list->rset_first; rtpp_list != NULL; rtpp_list = rtpp_list->rset_next) { + lock_get(rtpp_list->rset_lock); for (crt_rtpp = rtpp_list->rn_first; crt_rtpp != NULL; crt_rtpp = crt_rtpp->rn_next) { + if (!crt_rtpp->rn_displayed) { + continue; + } + /* found a matching rtpp - ping it */ if (found == MI_FOUND_ALL || (crt_rtpp->rn_url.len == rtpp_url.len && @@ -1407,7 +1458,9 @@ static struct mi_root* mi_ping_rtp_proxy(struct mi_root* cmd_tree, void* param) } } } + lock_release(rtpp_list->rset_lock); } + lock_release(rtpp_set_list->rset_head_lock); root = init_mi_tree(200, MI_OK_S, MI_OK_LEN); if (!root) { @@ -1510,6 +1563,7 @@ static struct mi_root* mi_reload_rtp_proxy(struct mi_root* cmd_tree, void* param) { struct mi_root *root = NULL; + unsigned int current_rtpp_no; if (rtpp_db_url.s == NULL) { // no database @@ -1527,6 +1581,14 @@ mi_reload_rtp_proxy(struct mi_root* cmd_tree, void* param) return 0; } } else { + lock_get(rtpp_no_lock); + current_rtpp_no = *rtpp_no; + lock_release(rtpp_no_lock); + + if (rtpp_socks_size != current_rtpp_no) { + build_rtpp_socks(current_rtpp_no); + } + // success reloading from database root = init_mi_tree(200, MI_DB_OK, MI_DB_OK_LEN); if (!root) { @@ -1554,9 +1616,44 @@ mod_init(void) return -1; } - /* any rtpproxy configured? */ - if(rtpp_set_list) - default_rtpp_set = select_rtpp_set(DEFAULT_RTPP_SET_ID); + rtpp_no = (unsigned int*)shm_malloc(sizeof(unsigned int)); + if (!rtpp_no) { + LM_ERR("no more shm memory for rtpp_no\n"); + return -1; + } + *rtpp_no = 0; + + rtpp_no_lock = lock_alloc(); + if (!rtpp_no_lock) { + LM_ERR("no more shm memory for rtpp_no_lock\n"); + return -1; + } + + if (lock_init(rtpp_no_lock) == 0) { + LM_ERR("could not init rtpp_no_lock\n"); + return -1; + } + + /* initialize the list of set; mod_destroy does shm_free() if fail */ + if (!rtpp_set_list) { + rtpp_set_list = shm_malloc(sizeof(struct rtpp_set_head)); + if(!rtpp_set_list){ + LM_ERR("no shm memory left to create list of proxysets\n"); + return -1; + } + memset(rtpp_set_list, 0, sizeof(struct rtpp_set_head)); + + rtpp_set_list->rset_head_lock = lock_alloc(); + if (!rtpp_set_list->rset_head_lock) { + LM_ERR("no shm memory left to create list of proxysets lock\n"); + return -1; + } + + if (lock_init(rtpp_set_list->rset_head_lock) == 0) { + LM_ERR("could not init rtpproxy list of proxysets lock\n"); + return -1; + } + } if (rtpp_db_url.s == NULL) { @@ -1583,6 +1680,10 @@ mod_init(void) } } + /* any rtpproxy configured? */ + if (rtpp_set_list) + default_rtpp_set = select_rtpp_set(DEFAULT_RTPP_SET_ID); + if (rtp_inst_pv_param.s) { rtp_inst_pv_param.len = strlen(rtp_inst_pv_param.s); rtp_inst_pvar = pv_cache_get(&rtp_inst_pv_param); @@ -1681,11 +1782,8 @@ mod_init(void) return 0; } - -static int -child_init(int rank) -{ - int n; +static int build_rtpp_socks(unsigned int current_rtpp_no) { + int n, i; char *cp; struct addrinfo hints, *res; struct rtpp_set *rtpp_list; @@ -1694,22 +1792,26 @@ child_init(int rank) int ip_mtu_discover = IP_PMTUDISC_DONT; #endif - if(rtpp_set_list==NULL ) - return 0; - - /* Iterate known RTP proxies - create sockets */ - mypid = getpid(); + // close current sockets + for (i = 0; i < rtpp_socks_size; i++) { + if (rtpp_socks[i] >= 0) { + close(rtpp_socks[i]); + } + } - rtpp_socks = (int*)pkg_malloc( sizeof(int)*rtpp_no ); - if (rtpp_socks==NULL) { - LM_ERR("no more pkg memory\n"); + rtpp_socks_size = current_rtpp_no; + rtpp_socks = (int*)pkg_realloc(rtpp_socks, sizeof(int)*(rtpp_socks_size)); + if (!rtpp_socks) { + LM_ERR("no more pkg memory for rtpp_socks\n"); return -1; } - for(rtpp_list = rtpp_set_list->rset_first; rtpp_list != 0; - rtpp_list = rtpp_list->rset_next){ + lock_get(rtpp_set_list->rset_head_lock); + for (rtpp_list = rtpp_set_list->rset_first; rtpp_list != 0; + rtpp_list = rtpp_list->rset_next) { - for (pnode=rtpp_list->rn_first; pnode!=0; pnode = pnode->rn_next){ + lock_get(rtpp_list->rset_lock); + for (pnode=rtpp_list->rn_first; pnode!=0; pnode = pnode->rn_next) { char *hostname; if (pnode->rn_umode == 0) { @@ -1724,7 +1826,8 @@ child_init(int rank) hostname = (char*)pkg_malloc(sizeof(char) * (strlen(pnode->rn_address) + 1)); if (hostname==NULL) { LM_ERR("no more pkg memory\n"); - return -1; + rtpp_socks[pnode->idx] = -1; + continue; } strcpy(hostname, pnode->rn_address); @@ -1743,7 +1846,8 @@ child_init(int rank) if ((n = getaddrinfo(hostname, cp, &hints, &res)) != 0) { LM_ERR("%s\n", gai_strerror(n)); pkg_free(hostname); - return -1; + rtpp_socks[pnode->idx] = -1; + continue; } pkg_free(hostname); @@ -1752,7 +1856,7 @@ child_init(int rank) if (rtpp_socks[pnode->idx] == -1) { LM_ERR("can't create socket\n"); freeaddrinfo(res); - return -1; + continue; } #ifdef IP_MTU_DISCOVER @@ -1766,7 +1870,7 @@ child_init(int rank) close(rtpp_socks[pnode->idx]); rtpp_socks[pnode->idx] = -1; freeaddrinfo(res); - return -1; + continue; } if (connect(rtpp_socks[pnode->idx], res->ai_addr, res->ai_addrlen) == -1) { @@ -1774,13 +1878,41 @@ child_init(int rank) close(rtpp_socks[pnode->idx]); rtpp_socks[pnode->idx] = -1; freeaddrinfo(res); - return -1; + continue; } freeaddrinfo(res); rptest: pnode->rn_disabled = rtpp_test(pnode, 0, 1); } + lock_release(rtpp_list->rset_lock); + } + lock_release(rtpp_set_list->rset_head_lock); + + return 0; +} + +static int +child_init(int rank) +{ + if(!rtpp_set_list) + return 0; + + mypid = getpid(); + + lock_get(rtpp_no_lock); + rtpp_socks_size = *rtpp_no; + lock_release(rtpp_no_lock); + + rtpp_socks = (int*)pkg_malloc(sizeof(int)*(rtpp_socks_size)); + if (!rtpp_socks) { + LM_ERR("no more pkg memory for rtpp_socks\n"); + return -1; + } + + /* Iterate known RTP proxies - create sockets */ + if (rtpp_socks_size) { + build_rtpp_socks(rtpp_socks_size); } return 0; @@ -1796,11 +1928,39 @@ static void mod_destroy(void) if (natping_state) shm_free(natping_state); - if(rtpp_set_list == NULL) + if (rtpp_no) { + shm_free(rtpp_no); + rtpp_no = NULL; + } + + if (rtpp_no_lock) { + lock_destroy(rtpp_no_lock); + lock_dealloc(rtpp_no_lock); + rtpp_no_lock = NULL; + } + + if (!rtpp_set_list) { + return; + } + + if (!rtpp_set_list->rset_head_lock) { + shm_free(rtpp_set_list); + rtpp_set_list = NULL; return; + } + lock_get(rtpp_set_list->rset_head_lock); for(crt_list = rtpp_set_list->rset_first; crt_list != NULL; ){ + if (!crt_list->rset_lock) { + last_list = crt_list; + crt_list = last_list->rset_next; + shm_free(last_list); + last_list = NULL; + continue; + } + + lock_get(crt_list->rset_lock); for(crt_rtpp = crt_list->rn_first; crt_rtpp != NULL; ){ if(crt_rtpp->rn_url.s) @@ -1810,13 +1970,25 @@ static void mod_destroy(void) crt_rtpp = last_rtpp->rn_next; shm_free(last_rtpp); } - last_list = crt_list; crt_list = last_list->rset_next; + lock_release(crt_list->rset_lock); + + lock_destroy(last_list->rset_lock); + lock_dealloc((void*)last_list->rset_lock); + last_list->rset_lock = NULL; + shm_free(last_list); + last_list = NULL; } + lock_release(rtpp_set_list->rset_head_lock); + + lock_destroy(rtpp_set_list->rset_head_lock); + lock_dealloc((void*)rtpp_set_list->rset_head_lock); + rtpp_set_list->rset_head_lock = NULL; shm_free(rtpp_set_list); + rtpp_set_list = NULL; /* destroy the hastable which keeps the call-id <-> selected_node relation */ if (!rtpengine_hash_table_destroy()) { @@ -2437,8 +2609,15 @@ static struct rtpp_set * select_rtpp_set(int id_set ){ struct rtpp_set * rtpp_list; /*is it a valid set_id?*/ - if (!rtpp_set_list || !rtpp_set_list->rset_first) { - LM_ERR("no rtp_proxy configured\n"); + if (!rtpp_set_list) { + LM_ERR("no rtpp_set_list\n"); + return 0; + } + + lock_get(rtpp_set_list->rset_head_lock); + if (!rtpp_set_list->rset_first) { + LM_ERR("no rtpp_set_list->rset_first\n"); + lock_release(rtpp_set_list->rset_head_lock); return 0; } @@ -2447,6 +2626,7 @@ static struct rtpp_set * select_rtpp_set(int id_set ){ if (!rtpp_list) { LM_ERR(" script error-invalid id_set to be selected\n"); } + lock_release(rtpp_set_list->rset_head_lock); return rtpp_list; } @@ -2470,7 +2650,13 @@ select_rtpp_node_new(str callid, str viabranch, int do_test) retry: weight_sum = 0; + lock_get(active_rtpp_set->rset_lock); for (node=active_rtpp_set->rn_first; node!=NULL; node=node->rn_next) { + /* Select only between displayed machines */ + if (!node->rn_displayed) { + continue; + } + /* Try to enable if it's time to try. */ if (node->rn_disabled && node->rn_recheck_ticks <= get_ticks()){ node->rn_disabled = rtpp_test(node, 1, 0); @@ -2481,6 +2667,7 @@ select_rtpp_node_new(str callid, str viabranch, int do_test) weight_sum += node->rn_weight; } } + lock_release(active_rtpp_set->rset_lock); /* No proxies? Force all to be redetected, if not yet */ if (weight_sum == 0) { @@ -2490,9 +2677,16 @@ select_rtpp_node_new(str callid, str viabranch, int do_test) was_forced = 1; + lock_get(active_rtpp_set->rset_lock); for(node=active_rtpp_set->rn_first; node!=NULL; node=node->rn_next) { + /* Select only between displayed machines */ + if (!node->rn_displayed) { + continue; + } + node->rn_disabled = rtpp_test(node, 1, 1); } + lock_release(active_rtpp_set->rset_lock); goto retry; } @@ -2503,27 +2697,40 @@ select_rtpp_node_new(str callid, str viabranch, int do_test) /* * Scan proxy list and decrease until appropriate proxy is found. */ + lock_get(active_rtpp_set->rset_lock); for (node=active_rtpp_set->rn_first; node!=NULL; node=node->rn_next) { + /* Select only between displayed machines */ + if (!node->rn_displayed) { + continue; + } + /* Select only between enabled machines */ if (node->rn_disabled) continue; /* Found enabled machine */ - if (sumcut < node->rn_weight) + if (sumcut < node->rn_weight) { + lock_release(active_rtpp_set->rset_lock); goto found; + } /* Update sumcut if enabled machine */ sumcut -= node->rn_weight; } + lock_release(active_rtpp_set->rset_lock); /* No node list */ return NULL; found: if (do_test) { + lock_get(active_rtpp_set->rset_lock); node->rn_disabled = rtpp_test(node, node->rn_disabled, 0); - if (node->rn_disabled) + if (node->rn_disabled) { + lock_release(active_rtpp_set->rset_lock); goto retry; + } + lock_release(active_rtpp_set->rset_lock); } /* build the entry */ @@ -2601,8 +2808,22 @@ static struct rtpp_node * select_rtpp_node(str callid, str viabranch, int do_test) { struct rtpp_node *node = NULL; + unsigned int current_rtpp_no; + + lock_get(rtpp_no_lock); + current_rtpp_no = *rtpp_no; + lock_release(rtpp_no_lock); + + if (rtpp_socks_size != current_rtpp_no) { + build_rtpp_socks(current_rtpp_no); + } + + if (!active_rtpp_set) { + default_rtpp_set = select_rtpp_set(setid_default); + active_rtpp_set = default_rtpp_set; + } - if(!active_rtpp_set) { + if (!active_rtpp_set) { LM_ERR("script error - no valid set selected\n"); return NULL; } @@ -2771,12 +2992,14 @@ set_rtpengine_set_n(struct sip_msg *msg, rtpp_set_link_t *rtpl, struct rtpp_set } current_msg_id = msg->id; + lock_get((*out)->rset_lock); node = (*out)->rn_first; while (node != NULL) { if (node->rn_disabled == 0) nb_active_nodes++; node = node->rn_next; } + lock_release((*out)->rset_lock); if ( nb_active_nodes > 0 ) { diff --git a/modules/rtpengine/rtpengine.h b/modules/rtpengine/rtpengine.h index 1fd7a2f6d4a..bb9114e9b63 100644 --- a/modules/rtpengine/rtpengine.h +++ b/modules/rtpengine/rtpengine.h @@ -53,12 +53,14 @@ struct rtpp_set { struct rtpp_node *rn_first; struct rtpp_node *rn_last; struct rtpp_set *rset_next; + gen_lock_t *rset_lock; }; struct rtpp_set_head { struct rtpp_set *rset_first; struct rtpp_set *rset_last; + gen_lock_t *rset_head_lock; }; diff --git a/modules/rtpengine/rtpengine_db.c b/modules/rtpengine/rtpengine_db.c index eda7bbb2463..495118221c9 100644 --- a/modules/rtpengine/rtpengine_db.c +++ b/modules/rtpengine/rtpengine_db.c @@ -91,6 +91,8 @@ static int rtpp_load_db(void) return -1; } + rtpengine_delete_node_all(); + n_rows = RES_ROW_N(res); rows = RES_ROWS(res); if (n_rows == 0) @@ -99,8 +101,6 @@ static int rtpp_load_db(void) return 0; } - rtpengine_delete_node_all(); - for (i=0; i<n_rows; i++) { values = ROW_VALUES(rows + i);