Module: sip-router Branch: master Commit: 15fc8b9c59aaf31f005e38f54d363f1e9d0a068e URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=15fc8b9c...
Author: Daniel-Constantin Mierla miconda@gmail.com Committer: Daniel-Constantin Mierla miconda@gmail.com Date: Tue Oct 7 08:48:31 2014 +0200
acc: option to work on a cloned sip msg request for getting acc attributes
- it applies for callback done in tm on reply received - avoids working on the shm stored request that can be concurently accessed and some header shortcuts can become set - clone_msg - new parameter to control this behavior, default is 1 (use a cloned structure)
---
modules/acc/acc_logic.c | 40 +++++++++++++++++++++++++--------------- modules/acc/acc_mod.c | 20 +++++++++++--------- 2 files changed, 36 insertions(+), 24 deletions(-)
diff --git a/modules/acc/acc_logic.c b/modules/acc/acc_logic.c index 975c0f9..bd3f1cc 100644 --- a/modules/acc/acc_logic.c +++ b/modules/acc/acc_logic.c @@ -482,6 +482,7 @@ static inline void on_missed(struct cell *t, struct sip_msg *req, }
+extern int _acc_clone_msg;
/* initiate a report if we previously enabled accounting for this t */ static inline void acc_onreply( struct cell* t, struct sip_msg *req, @@ -490,6 +491,8 @@ static inline void acc_onreply( struct cell* t, struct sip_msg *req, str new_uri_bk; int br = -1; hdr_field_t *hdr; + sip_msg_t tmsg; + sip_msg_t *preq;
/* acc_onreply is bound to TMCB_REPLY which may be called from _reply, like when FR hits; we should not miss this @@ -500,6 +503,13 @@ static inline void acc_onreply( struct cell* t, struct sip_msg *req, if (!should_acc_reply(req, reply, code)) return;
+ if(_acc_clone_msg==1) { + memcpy(&tmsg, req, sizeof(sip_msg_t)); + preq = &tmsg; + } else { + preq = req; + } + /* get winning branch index, if set */ if (t->relayed_reply_branch>=0) { br = t->relayed_reply_branch; @@ -511,9 +521,9 @@ static inline void acc_onreply( struct cell* t, struct sip_msg *req,
/* for reply processing, set as new_uri the one from selected branch */ if (br>=0) { - new_uri_bk = req->new_uri; - req->new_uri = t->uac[br].uri; - req->parsed_uri_ok = 0; + new_uri_bk = preq->new_uri; + preq->new_uri = t->uac[br].uri; + preq->parsed_uri_ok = 0; } else { new_uri_bk.len = -1; new_uri_bk.s = 0; @@ -522,31 +532,31 @@ static inline void acc_onreply( struct cell* t, struct sip_msg *req, env_set_to( get_rpl_to(t,reply) ); env_set_code_status( code, reply);
- if ( is_log_acc_on(req) ) { + if ( is_log_acc_on(preq) ) { env_set_text( ACC_ANSWERED, ACC_ANSWERED_LEN); - acc_log_request(req); + acc_log_request(preq); } #ifdef SQL_ACC - if (is_db_acc_on(req)) { - if(acc_db_set_table_name(req, db_table_acc_data, &db_table_acc)<0) { + if (is_db_acc_on(preq)) { + if(acc_db_set_table_name(preq, db_table_acc_data, &db_table_acc)<0) { LM_ERR("cannot set acc db table name\n"); } else { - acc_db_request(req); + acc_db_request(preq); } } #endif #ifdef RAD_ACC - if (is_rad_acc_on(req)) - acc_rad_request(req); + if (is_rad_acc_on(preq)) + acc_rad_request(preq); #endif /* DIAMETER */ #ifdef DIAM_ACC - if (is_diam_acc_on(req)) - acc_diam_request(req); + if (is_diam_acc_on(preq)) + acc_diam_request(preq); #endif
/* run extra acc engines */ - acc_run_engines(req, 0, NULL); + acc_run_engines(preq, 0, NULL);
if (new_uri_bk.len>=0) { req->new_uri = new_uri_bk; @@ -556,8 +566,8 @@ static inline void acc_onreply( struct cell* t, struct sip_msg *req, /* free header's parsed structures that were added by resolving acc attributes */ for( hdr=req->headers ; hdr ; hdr=hdr->next ) { if ( hdr->parsed && hdr_allocs_parse(hdr) && - (hdr->parsed<(void*)t->uas.request || - hdr->parsed>=(void*)t->uas.end_request)) { + (hdr->parsed<(void*)t->uas.request || + hdr->parsed>=(void*)t->uas.end_request)) { /* header parsed filed doesn't point inside uas.request memory * chunck -> it was added by resolving acc attributes -> free it as pkg */ DBG("removing hdr->parsed %d\n", hdr->type); diff --git a/modules/acc/acc_mod.c b/modules/acc/acc_mod.c index 831a137..2939cd3 100644 --- a/modules/acc/acc_mod.c +++ b/modules/acc/acc_mod.c @@ -119,6 +119,7 @@ int reason_from_hf = 0; /*!< assign reason from reason hf if present */ int acc_time_mode = 0; str acc_time_attr = str_init("time_attr"); str acc_time_exten = str_init("time_exten"); +int _acc_clone_msg = 1;
/*@}*/
@@ -275,14 +276,14 @@ static param_export_t params[] = { {"cdr_extra", PARAM_STRING, &cdr_log_extra_str }, {"cdr_start_id", PARAM_STR, &cdr_start_str }, {"cdr_end_id", PARAM_STR, &cdr_end_str }, - {"cdr_duration_id", PARAM_STR, &cdr_duration_str }, + {"cdr_duration_id", PARAM_STR, &cdr_duration_str }, {"cdr_expired_dlg_enable", INT_PARAM, &cdr_expired_dlg_enable }, #ifdef RAD_ACC - {"radius_config", PARAM_STRING, &radius_config }, + {"radius_config", PARAM_STRING, &radius_config }, {"radius_flag", INT_PARAM, &radius_flag }, {"radius_missed_flag", INT_PARAM, &radius_missed_flag }, {"service_type", INT_PARAM, &service_type }, - {"radius_extra", PARAM_STRING, &rad_extra_str }, + {"radius_extra", PARAM_STRING, &rad_extra_str }, #endif /* DIAMETER specific */ #ifdef DIAM_ACC @@ -290,13 +291,13 @@ static param_export_t params[] = { {"diameter_missed_flag", INT_PARAM, &diameter_missed_flag }, {"diameter_client_host", PARAM_STRING, &diameter_client_host }, {"diameter_client_port", INT_PARAM, &diameter_client_port }, - {"diameter_extra", PARAM_STRING, &dia_extra_str }, + {"diameter_extra", PARAM_STRING, &dia_extra_str }, #endif /* db-specific */ #ifdef SQL_ACC - {"db_flag", INT_PARAM, &db_flag }, - {"db_missed_flag", INT_PARAM, &db_missed_flag }, - {"db_extra", PARAM_STRING, &db_extra_str }, + {"db_flag", INT_PARAM, &db_flag }, + {"db_missed_flag", INT_PARAM, &db_missed_flag }, + {"db_extra", PARAM_STRING, &db_extra_str }, {"db_url", PARAM_STR, &db_url }, {"db_table_acc", PARAM_STR, &db_table_acc }, {"db_table_missed_calls",PARAM_STR, &db_table_mc }, @@ -307,14 +308,15 @@ static param_export_t params[] = { {"acc_sip_code_column", PARAM_STR, &acc_sipcode_col }, {"acc_sip_reason_column",PARAM_STR, &acc_sipreason_col }, {"acc_time_column", PARAM_STR, &acc_time_col }, - {"db_insert_mode", INT_PARAM, &acc_db_insert_mode }, + {"db_insert_mode", INT_PARAM, &acc_db_insert_mode }, #endif /* time-mode-specific */ {"time_mode", INT_PARAM, &acc_time_mode }, {"time_attr", PARAM_STR, &acc_time_attr }, {"time_exten", PARAM_STR, &acc_time_exten }, {"cdrs_table", PARAM_STR, &acc_cdrs_table }, - {"time_format", PARAM_STRING, &acc_time_format }, + {"time_format", PARAM_STRING, &acc_time_format }, + {"clone_msg", PARAM_INT, &_acc_clone_msg }, {0,0,0} };