From 4896ca97081e163d91617e9fb5e278d7366f5753 Mon Sep 17 00:00:00 2001 From: jaybeepee Date: Thu, 7 May 2015 11:35:31 +0200 Subject: [PATCH] tmp/interconnectroute: added external partner id to query and return in AVP --- modules/interconnectroute/db.c | 46 +++++++++++++------------- modules/interconnectroute/query.c | 11 ++++++ modules/interconnectroute/route_data.c | 9 +++-- modules/interconnectroute/route_data.h | 3 +- 4 files changed, 43 insertions(+), 26 deletions(-) diff --git a/modules/interconnectroute/db.c b/modules/interconnectroute/db.c index 7a2f78e824d..b923d81b123 100644 --- a/modules/interconnectroute/db.c +++ b/modules/interconnectroute/db.c @@ -4,7 +4,7 @@ db1_con_t * interconnectroute_dbh = NULL; db_func_t interconnectroute_dbf; -static char *orig_route_data_query = "select TFROM.INTERNAL_ID as FROM_TRUNK_ID, TTO.INTERNAL_ID as TO_TRUNK_ID, RT.ROUTE_ID as ROUTE_ID from " +static char *orig_route_data_query = "select TFROM.INTERNAL_ID as FROM_TRUNK_ID, TTO.INTERNAL_ID as TO_TRUNK_ID, RT.ROUTE_ID as ROUTE_ID, TTO.EXTERNAL_ID as EXTERNAL_PARTNER_ID from " "service_rate SR " "join interconnect_trunk TFROM on TFROM.INTERCONNECT_PARTNER_ID = SR.FROM_INTERCONNECT_PARTNER_ID " "join interconnect_trunk TTO on TTO.INTERCONNECT_PARTNER_ID = SR.TO_INTERCONNECT_PARTNER_ID " @@ -25,7 +25,6 @@ static char *orig_route_data_query = "select TFROM.INTERNAL_ID as FROM_TRUNK_ID, "SELECT FROM_INTERCONNECT_PARTNER_ID AS IPID, PRIORITY " "FROM service_rate " "WHERE '%.*s' like concat(FROM_PREFIX,'%') " -" AND SERVICE_CODE = '%.*s' AND LEG='%.*s' " "ORDER BY length(FROM_PREFIX) desc limit 1 " ") " ") " @@ -46,7 +45,6 @@ static char *orig_route_data_query = "select TFROM.INTERNAL_ID as FROM_TRUNK_ID, "UNION " "( " "SELECT TO_INTERCONNECT_PARTNER_ID AS IPID, PRIORITY " -" AND SERVICE_CODE = '%.*s' AND LEG='%.*s' " "FROM service_rate " "WHERE '%.*s' like concat(TO_PREFIX,'%') " "ORDER BY length(TO_PREFIX) desc limit 1 " @@ -60,7 +58,7 @@ static char *orig_route_data_query = "select TFROM.INTERNAL_ID as FROM_TRUNK_ID, "and SR.LEG = '%.*s' " "order by SR.PRIORITY DESC, RT.PRIORITY DESC LIMIT 1;"; -static char *term_route_data_query = "select TFROM.INTERNAL_ID as FROM_TRUNK_ID, TTO.INTERNAL_ID as TO_TRUNK_ID from " +static char *term_route_data_query = "select TFROM.INTERNAL_ID as FROM_TRUNK_ID, TTO.INTERNAL_ID as TO_TRUNK_ID, TFROM.EXTERNAL_ID as EXTERNAL_PARTNER_ID from " "service_rate SR " "join interconnect_trunk TFROM on TFROM.INTERCONNECT_PARTNER_ID = SR.FROM_INTERCONNECT_PARTNER_ID " "join interconnect_trunk TTO on TTO.INTERCONNECT_PARTNER_ID = SR.TO_INTERCONNECT_PARTNER_ID " @@ -80,7 +78,6 @@ static char *term_route_data_query = "select TFROM.INTERNAL_ID as FROM_TRUNK_ID, "SELECT FROM_INTERCONNECT_PARTNER_ID AS IPID, PRIORITY " "FROM service_rate " "WHERE '%.*s' like concat(FROM_PREFIX,'%') " -" AND SERVICE_CODE = '%.*s' AND LEG='%.*s' " "ORDER BY length(FROM_PREFIX) desc limit 1 " ") " ") " @@ -103,7 +100,6 @@ static char *term_route_data_query = "select TFROM.INTERNAL_ID as FROM_TRUNK_ID, "SELECT TO_INTERCONNECT_PARTNER_ID AS IPID, PRIORITY " "FROM service_rate " "WHERE '%.*s' like concat(TO_PREFIX,'%') " -" AND SERVICE_CODE = '%.*s' AND LEG='%.*s' " "ORDER BY length(TO_PREFIX) desc limit 1 " ") " ") " @@ -169,22 +165,19 @@ int get_orig_route_data(str* a_number, str* b_number, str* leg, str* sc, ix_rout db1_res_t* route_rs; db_row_t* route_row; db_val_t* route_vals; - str query_s, incoming_trunk_id, outgoing_trunk_id, route_id; + str query_s, incoming_trunk_id, outgoing_trunk_id, route_id, external_trunk_id; route_data_t* new_route; ix_route_list_t* route_list = new_route_list(); int num_rows; - if (strlen(orig_route_data_query) + a_number->len + a_number->len + b_number->len + b_number->len + (3*leg->len) + (3*sc->len) > QUERY_LEN) { + if (strlen(orig_route_data_query) + a_number->len + a_number->len + b_number->len + b_number->len + leg->len + sc->len > QUERY_LEN) { LM_ERR("query too big\n"); return -1; } - snprintf(query, QUERY_LEN, orig_route_data_query, a_number->len, a_number->s, a_number->len, a_number->s, - sc->len, sc->s, leg->len, leg->s, - b_number->len, b_number->s, - sc->len, sc->s, leg->len, leg->s, - b_number->len, b_number->s, sc->len, sc->s, leg->len, leg->s); + snprintf(query, QUERY_LEN, orig_route_data_query, a_number->len, a_number->s, a_number->len, a_number->s, b_number->len, b_number->s, + b_number->len, b_number->s, sc->len, sc->s, leg->len, leg->s); query_s.s = query; query_s.len = strlen(query); @@ -222,8 +215,13 @@ int get_orig_route_data(str* a_number, str* b_number, str* leg, str* sc, ix_rout route_id.len = strlen(route_id.s); LM_DBG("route_id: [%.*s]\n", route_id.len, route_id.s); } - - new_route = new_route_data(&incoming_trunk_id, &outgoing_trunk_id, &route_id); + if (!VAL_NULL(route_vals+3)) { + external_trunk_id.s = (char*) VAL_STRING(route_vals+3); + external_trunk_id.len = strlen(external_trunk_id.s); + LM_DBG("external_trunk_id: [%.*s]\n", external_trunk_id.len, external_trunk_id.s); + } + + new_route = new_route_data(&incoming_trunk_id, &outgoing_trunk_id, &route_id, &external_trunk_id); if (!new_route) { LM_DBG("Could not get new route... continuing\n"); continue; @@ -266,22 +264,19 @@ int get_term_route_data(str* a_number, str* b_number, str* leg, str* sc, str* ex db1_res_t* route_rs; db_row_t* route_row; db_val_t* route_vals; - str query_s, incoming_trunk_id, outgoing_trunk_id; + str query_s, incoming_trunk_id, outgoing_trunk_id, external_trunk_id; route_data_t* new_route; ix_route_list_t* route_list = new_route_list(); int num_rows; - if (strlen(term_route_data_query) + a_number->len + a_number->len + b_number->len + a_number->len + (3*leg->len) + (3*sc->len) + ext_trunk_id->len > QUERY_LEN) { + if (strlen(term_route_data_query) + a_number->len + a_number->len + b_number->len + a_number->len + leg->len + sc->len + ext_trunk_id->len > QUERY_LEN) { LM_ERR("query too big\n"); return -1; } - snprintf(query, QUERY_LEN, term_route_data_query, a_number->len, a_number->s, a_number->len, a_number->s, - sc->len, sc->s, leg->len, leg->s, - b_number->len, b_number->s, - b_number->len, b_number->s, sc->len, sc->s, leg->len, leg->s, - sc->len, sc->s, leg->len, leg->s, ext_trunk_id->len, ext_trunk_id->s); + snprintf(query, QUERY_LEN, term_route_data_query, a_number->len, a_number->s, a_number->len, a_number->s, b_number->len, b_number->s, + b_number->len, b_number->s, sc->len, sc->s, leg->len, leg->s, ext_trunk_id->len, ext_trunk_id->s); query_s.s = query; query_s.len = strlen(query); @@ -315,8 +310,13 @@ int get_term_route_data(str* a_number, str* b_number, str* leg, str* sc, str* ex outgoing_trunk_id.len = strlen(outgoing_trunk_id.s); LM_DBG("outgoing_trunk_id: [%.*s]\n", outgoing_trunk_id.len, outgoing_trunk_id.s); } + if (!VAL_NULL(route_vals+2)) { + external_trunk_id.s = (char*) VAL_STRING(route_vals+1); + external_trunk_id.len = strlen(external_trunk_id.s); + LM_DBG("external_trunk_id: [%.*s]\n", external_trunk_id.len, external_trunk_id.s); + } - new_route = new_route_data(&incoming_trunk_id, &outgoing_trunk_id, 0); + new_route = new_route_data(&incoming_trunk_id, &outgoing_trunk_id, 0, &external_trunk_id); if (!new_route) { LM_DBG("Could not get new route... continuing\n"); continue; diff --git a/modules/interconnectroute/query.c b/modules/interconnectroute/query.c index da79f769938..c2c0b58ba6f 100644 --- a/modules/interconnectroute/query.c +++ b/modules/interconnectroute/query.c @@ -80,12 +80,15 @@ int create_orig_avps(route_data_t* route_data) { create_response_avp_string("ix_incoming_trunk_id", &route_data->incoming_trunk_id); create_response_avp_string("ix_outgoing_trunk_id", &route_data->outgoing_trunk_id); create_response_avp_string("ix_route_id", &route_data->route_id); + create_response_avp_string("ix_external_trunk_id", &route_data->external_trunk_id); + return 1; } int create_term_avps(route_data_t* route_data) { create_response_avp_string("ix_incoming_trunk_id", &route_data->incoming_trunk_id); create_response_avp_string("ix_outgoing_trunk_id", &route_data->outgoing_trunk_id); + create_response_avp_string("ix_external_trunk_id", &route_data->external_trunk_id); return 1; } @@ -208,6 +211,10 @@ int ix_orig_trunk_query(struct sip_msg* msg) { create_orig_avps(ix_route_list->first); free_route_list(ix_route_list); + + if(free_called_asserted_identity) { + if(called_asserted_identity.s) shm_free(called_asserted_identity.s);// shm_malloc in cscf_get_public_identity_from_requri + } return 1; @@ -335,6 +342,10 @@ int ix_term_trunk_query(struct sip_msg* msg, char* ext_trunk_id) { free_route_list(ix_route_list); + if(free_called_asserted_identity) { + if(called_asserted_identity.s) shm_free(called_asserted_identity.s);// shm_malloc in cscf_get_public_identity_from_requri + } + return 1; diff --git a/modules/interconnectroute/route_data.c b/modules/interconnectroute/route_data.c index e868b5b89d1..90b9cbe854a 100644 --- a/modules/interconnectroute/route_data.c +++ b/modules/interconnectroute/route_data.c @@ -23,10 +23,10 @@ int free_route_list (ix_route_list_t* ix_route_list) { return 1; } -route_data_t* new_route_data(str* incoming_trunk_id, str* outgoing_trunk_id, str* route_id) { +route_data_t* new_route_data(str* incoming_trunk_id, str* outgoing_trunk_id, str* route_id, str* external_trunk_id) { struct route_data* route_data; char *p; - int len = sizeof(struct route_data) + incoming_trunk_id->len + outgoing_trunk_id->len; + int len = sizeof(struct route_data) + incoming_trunk_id->len + outgoing_trunk_id->len + external_trunk_id->len; if(route_id) len = len + route_id->len; route_data = (struct route_data*)pkg_malloc(len); @@ -56,6 +56,11 @@ route_data_t* new_route_data(str* incoming_trunk_id, str* outgoing_trunk_id, str p+=route_id->len; } + route_data->external_trunk_id.s = p; + memcpy(p, external_trunk_id->s, external_trunk_id->len); + route_data->external_trunk_id.len = external_trunk_id->len; + p+= external_trunk_id->len; + if (p != (((char*) route_data) + len)) { LM_CRIT("buffer overflow\n"); pkg_free(route_data); diff --git a/modules/interconnectroute/route_data.h b/modules/interconnectroute/route_data.h index 2a2fd3a32c3..26c30ba058c 100644 --- a/modules/interconnectroute/route_data.h +++ b/modules/interconnectroute/route_data.h @@ -13,6 +13,7 @@ typedef struct route_data { str incoming_trunk_id; str outgoing_trunk_id; + str external_trunk_id; str route_id; struct route_data* next; struct route_data* prev; @@ -24,7 +25,7 @@ typedef struct ix_route_list { int count; } ix_route_list_t; -route_data_t* new_route_data(str* incoming_trunk_id, str* outgoing_trunk_id, str* route_id); +route_data_t* new_route_data(str* incoming_trunk_id, str* outgoing_trunk_id, str* route_id, str* external_trunk_id); ix_route_list_t* new_route_list(); int add_route(struct ix_route_list* list, struct route_data* route); int free_route_data(route_data_t* route_data);