From de07fe4e78e2b7df59fbdffd74ca655bd77570ba Mon Sep 17 00:00:00 2001 From: Daniel-Constantin Mierla Date: Tue, 25 Aug 2015 15:37:34 +0200 Subject: [PATCH] dialog: refresh value for contact uri for each re-invite --- modules/dialog/dlg_db_handler.c | 34 +++++++++++++----------- modules/dialog/dlg_handlers.c | 46 +++++++++++++++++++++++++++++++++ 2 files changed, 65 insertions(+), 15 deletions(-) diff --git a/modules/dialog/dlg_db_handler.c b/modules/dialog/dlg_db_handler.c index 9e8d2c462d4..64872cc56c6 100644 --- a/modules/dialog/dlg_db_handler.c +++ b/modules/dialog/dlg_db_handler.c @@ -701,15 +701,15 @@ int update_dialog_dbinfo_unsafe(struct dlg_cell * cell) db_val_t values[DIALOG_TABLE_COL_NO]; - db_key_t insert_keys[DIALOG_TABLE_COL_NO] = { &h_entry_column, - &h_id_column, &call_id_column, &from_uri_column, - &from_tag_column, &to_uri_column, &to_tag_column, - &from_sock_column, &to_sock_column, - &start_time_column, &state_column, &timeout_column, - &from_cseq_column, &to_cseq_column, &from_route_column, - &to_route_column, &from_contact_column,&to_contact_column, - &sflags_column, &toroute_name_column, &req_uri_column, - &xdata_column, &iflags_column }; + db_key_t insert_keys[DIALOG_TABLE_COL_NO] = { &h_entry_column, /*0*/ + &h_id_column, /*1*/ &call_id_column, /*2*/ &from_uri_column, /*3*/ + &from_tag_column, /*4*/ &to_uri_column, /*5*/ &to_tag_column, /*6*/ + &from_sock_column, /*7*/ &to_sock_column, /*8*/ + &start_time_column, /*9*/ &state_column, /*10*/ &timeout_column, /*11*/ + &from_cseq_column, /*12*/ &to_cseq_column, /*13*/ &from_contact_column, /*14*/ + &to_contact_column, /*15*/ &from_route_column, /*16*/ &to_route_column, /*17*/ + &sflags_column, /*18*/ &toroute_name_column, /*19*/ &req_uri_column, /*20*/ + &xdata_column, /*21*/ &iflags_column /*22*/ }; if( (cell->dflags & DLG_FLAG_NEW) != 0 || (cell->dflags & DLG_FLAG_CHANGED_VARS) != 0) { @@ -767,10 +767,10 @@ int update_dialog_dbinfo_unsafe(struct dlg_cell * cell) SET_STR_VALUE(values+12, cell->cseq[DLG_CALLER_LEG]); SET_STR_VALUE(values+13, cell->cseq[DLG_CALLEE_LEG]); - SET_STR_VALUE(values+14, cell->route_set[DLG_CALLER_LEG]); - SET_STR_VALUE(values+15, cell->route_set[DLG_CALLEE_LEG]); - SET_STR_VALUE(values+16, cell->contact[DLG_CALLER_LEG]); - SET_STR_VALUE(values+17, cell->contact[DLG_CALLEE_LEG]); + SET_STR_VALUE(values+14, cell->contact[DLG_CALLER_LEG]); + SET_STR_VALUE(values+15, cell->contact[DLG_CALLEE_LEG]); + SET_STR_VALUE(values+16, cell->route_set[DLG_CALLER_LEG]); + SET_STR_VALUE(values+17, cell->route_set[DLG_CALLEE_LEG]); SET_PROPER_NULL_FLAG(cell->route_set[DLG_CALLER_LEG], values, 14); SET_PROPER_NULL_FLAG(cell->route_set[DLG_CALLEE_LEG], values, 15); @@ -810,6 +810,7 @@ int update_dialog_dbinfo_unsafe(struct dlg_cell * cell) VAL_TYPE(values+10) = VAL_TYPE(values+11) = DB1_INT; VAL_TYPE(values+12) = VAL_TYPE(values+13) =DB1_STR; + VAL_TYPE(values+14) = VAL_TYPE(values+15) =DB1_STR; VAL_INT(values) = cell->h_entry; VAL_INT(values+1) = cell->h_id; @@ -819,14 +820,17 @@ int update_dialog_dbinfo_unsafe(struct dlg_cell * cell) SET_STR_VALUE(values+12, cell->cseq[DLG_CALLER_LEG]); SET_STR_VALUE(values+13, cell->cseq[DLG_CALLEE_LEG]); + SET_STR_VALUE(values+14, cell->contact[DLG_CALLER_LEG]); + SET_STR_VALUE(values+15, cell->contact[DLG_CALLEE_LEG]); VAL_NULL(values) = VAL_NULL(values+1) = VAL_NULL(values+10) = VAL_NULL(values+11) = - VAL_NULL(values+12) = VAL_NULL(values+13) = 0; + VAL_NULL(values+12) = VAL_NULL(values+13) = + VAL_NULL(values+14) = VAL_NULL(values+15) = 0; if((dialog_dbf.update(dialog_db_handle, (insert_keys), 0, - (values), (insert_keys+10), (values+10), 2, 4)) !=0){ + (values), (insert_keys+10), (values+10), 2, 6)) !=0){ LM_ERR("could not update database info\n"); goto error; } diff --git a/modules/dialog/dlg_handlers.c b/modules/dialog/dlg_handlers.c index 3768fd44c52..17456863672 100644 --- a/modules/dialog/dlg_handlers.c +++ b/modules/dialog/dlg_handlers.c @@ -991,6 +991,47 @@ static inline int parse_dlg_rr_param(char *p, char *end, int *h_entry, int *h_id } +/*! + * \brief Update the saved Contact information in dialog from SIP message + * \param dlg updated dialog + * \param req SIP request + * \param dir direction of request, must DLG_DIR_UPSTREAM or DLG_DIR_DOWNSTREAM + * \return 0 on success, -1 on failure + */ +static inline int dlg_refresh_contacts(struct dlg_cell *dlg, struct sip_msg *req, + unsigned int dir) +{ + str contact; + + if(req->first_line.type == SIP_REPLY) + return 0; + if(req->first_line.u.request.method_value != METHOD_INVITE) + return 0; + + /* extract the contact address */ + if (!req->contact&&(parse_headers(req,HDR_CONTACT_F,0)<0||!req->contact)){ + LM_ERR("bad sip message or missing Contact hdr\n"); + return -1; + } + if ( parse_contact(req->contact)<0 || + ((contact_body_t *)req->contact->parsed)->contacts==NULL || + ((contact_body_t *)req->contact->parsed)->contacts->next!=NULL ) { + LM_ERR("bad Contact HDR\n"); + return -1; + } + contact = ((contact_body_t *)req->contact->parsed)->contacts->uri; + + if ( dir==DLG_DIR_UPSTREAM) { + return dlg_update_contact(dlg, DLG_CALLEE_LEG, &contact); + } else if ( dir==DLG_DIR_DOWNSTREAM) { + return dlg_update_contact(dlg, DLG_CALLER_LEG, &contact); + } else { + LM_CRIT("dir is not set!\n"); + return -1; + } +} + + /*! * \brief Update the saved CSEQ information in dialog from SIP message * \param dlg updated dialog @@ -1311,6 +1352,11 @@ void dlg_onroute(struct sip_msg* req, str *route_params, void *param) } } if(event != DLG_EVENT_REQACK) { + if(dlg_refresh_contacts(dlg, req, dir)!=0) { + LM_ERR("contacts update failed\n"); + } else { + dlg->dflags |= DLG_FLAG_CHANGED; + } if(update_cseqs(dlg, req, dir)!=0) { LM_ERR("cseqs update failed\n"); } else {