diff --git a/src/modules/topos/topos_mod.c b/src/modules/topos/topos_mod.c index dc8eba502f3..a248e606002 100644 --- a/src/modules/topos/topos_mod.c +++ b/src/modules/topos/topos_mod.c @@ -78,6 +78,7 @@ sruid_t _tps_sruid; static str _tps_db_url = str_init(DEFAULT_DB_URL); int _tps_param_mask_callid = 0; int _tps_sanity_checks = 0; +int _tps_rr_update = 0; str _tps_storage = str_init("db"); extern int _tps_branch_expire; @@ -141,6 +142,7 @@ static param_export_t params[]={ {"cparam_name", PARAM_STR, &_tps_cparam_name}, {"a_contact_avp", PARAM_STR, &_tps_acontact_avp}, {"b_contact_avp", PARAM_STR, &_tps_bcontact_avp}, + {"rr_update", PARAM_INT, &_tps_rr_update}, {0,0,0} }; diff --git a/src/modules/topos/tps_msg.c b/src/modules/topos/tps_msg.c index c296cd5b302..e3616391add 100644 --- a/src/modules/topos/tps_msg.c +++ b/src/modules/topos/tps_msg.c @@ -49,6 +49,7 @@ extern int _tps_param_mask_callid; extern int _tps_contact_mode; extern str _tps_cparam_name; +extern int _tps_rr_update; str _sr_hname_xbranch = str_init("P-SR-XBranch"); str _sr_hname_xuuid = str_init("P-SR-XUID"); @@ -368,11 +369,18 @@ int tps_pack_message(sip_msg_t *msg, tps_data_t *ptsd) int vlen; int r2; int isreq; + int rr_update = _tps_rr_update; if(ptsd->cp==NULL) { ptsd->cp = ptsd->cbuf; } + if(_tps_rr_update) { + if((msg->first_line.type==SIP_REQUEST) && !(get_to(msg)->tag_value.len>0)) { + rr_update = 0; + } + } + i = 0; for(hdr=msg->h_via1; hdr; hdr=next_sibling_hdr(hdr)) { for(via=(struct via_body*)hdr->parsed; via; via=via->next) { @@ -429,7 +437,7 @@ int tps_pack_message(sip_msg_t *msg, tps_data_t *ptsd) LM_ERR("no more space to pack rr headers\n"); return -1; } - if(isreq==1) { + if(isreq==1 || rr_update) { /* sip request - get a+s-side record route */ if(i>1) { if(i==2 &&r2==0) { @@ -441,6 +449,12 @@ int tps_pack_message(sip_msg_t *msg, tps_data_t *ptsd) *ptsd->cp = ','; ptsd->cp++; ptsd->a_rr.len++; + if(rr_update) { + ptsd->b_rr.len++; + } + } + if(i==1 && rr_update) { + ptsd->b_rr.s = ptsd->cp; } *ptsd->cp = '<'; if(i==1) { @@ -458,6 +472,9 @@ int tps_pack_message(sip_msg_t *msg, tps_data_t *ptsd) ptsd->cp++; ptsd->a_rr.len++; + if(rr_update) { + ptsd->b_rr.len++; + } memcpy(ptsd->cp, rr->nameaddr.uri.s, rr->nameaddr.uri.len); if(i==1) { @@ -483,6 +500,10 @@ int tps_pack_message(sip_msg_t *msg, tps_data_t *ptsd) *ptsd->cp = '>'; ptsd->cp++; ptsd->a_rr.len++; + if(rr_update) { + ptsd->b_rr.len += rr->nameaddr.uri.len; + ptsd->b_rr.len++; + } } else { /* sip response - get b-side record route */ if(i==1) { @@ -879,6 +900,11 @@ int tps_request_received(sip_msg_t *msg, int dialog) } if(dialog!=0) { tps_append_xuuid(msg, &stsd.a_uuid); + if(_tps_rr_update) { + if(tps_storage_update_dialog(msg, &mtsd, &stsd, TPS_DBU_RPLATTRS|TPS_DBU_BRR)<0) { + goto error; + } + } } return 0; @@ -934,7 +960,9 @@ int tps_response_received(sip_msg_t *msg) TPS_DBU_CONTACT|TPS_DBU_RPLATTRS)<0) { goto error; } - if(tps_storage_update_dialog(msg, &mtsd, &stsd, TPS_DBU_RPLATTRS)<0) { + if(tps_storage_update_dialog(msg, &mtsd, &stsd, + (_tps_rr_update)?(TPS_DBU_RPLATTRS|TPS_DBU_BRR|TPS_DBU_ARR) + :TPS_DBU_RPLATTRS)<0) { goto error; } tps_storage_lock_release(&lkey); @@ -1037,7 +1065,9 @@ int tps_request_sent(sip_msg_t *msg, int dialog, int local) if(dialog!=0) { tps_storage_end_dialog(msg, &mtsd, ptsd); - if(tps_storage_update_dialog(msg, &mtsd, &stsd, TPS_DBU_CONTACT)<0) { + if(tps_storage_update_dialog(msg, &mtsd, &stsd, + (_tps_rr_update)?(TPS_DBU_CONTACT|TPS_DBU_ARR) + :TPS_DBU_CONTACT)<0) { goto error; } } diff --git a/src/modules/topos/tps_storage.h b/src/modules/topos/tps_storage.h index fc69ccca4c7..aeda1962ec1 100644 --- a/src/modules/topos/tps_storage.h +++ b/src/modules/topos/tps_storage.h @@ -39,7 +39,9 @@ #define TPS_DBU_CONTACT (1<<0) #define TPS_DBU_RPLATTRS (1<<1) -#define TPS_DBU_ALL (0xffffffff) +#define TPS_DBU_ARR (1<<2) +#define TPS_DBU_BRR (1<<3) +#define TPS_DBU_ALL (0xffffffff) #define TPS_DATA_SIZE 8192 typedef struct tps_data {