Skip to content

Commit

Permalink
topos: reworked dialog update in order to refresh contact values
Browse files Browse the repository at this point in the history
- related to GH #1005

(cherry picked from commit 639013a)
  • Loading branch information
miconda committed Mar 13, 2017
1 parent 944961e commit f714655
Show file tree
Hide file tree
Showing 4 changed files with 90 additions and 62 deletions.
3 changes: 2 additions & 1 deletion src/modules/topos/api.h
Expand Up @@ -38,7 +38,8 @@ typedef int (*tps_insert_branch_f)(tps_data_t *td);
typedef int (*tps_clean_branches_f)(void);
typedef int (*tps_load_branch_f)(sip_msg_t *msg, tps_data_t *md, tps_data_t *sd);
typedef int (*tps_load_dialog_f)(sip_msg_t *msg, tps_data_t *md, tps_data_t *sd);
typedef int (*tps_update_dialog_f)(sip_msg_t *msg, tps_data_t *md, tps_data_t *sd);
typedef int (*tps_update_dialog_f)(sip_msg_t *msg, tps_data_t *md, tps_data_t *sd,
uint32_t mode);
typedef int (*tps_end_dialog_f)(sip_msg_t *msg, tps_data_t *md, tps_data_t *sd);

typedef struct tps_storage_api {
Expand Down
100 changes: 53 additions & 47 deletions src/modules/topos/tps_msg.c
Expand Up @@ -258,6 +258,35 @@ int tps_skip_msg(sip_msg_t *msg)
return 0;
}

/**
*
*/
int tps_dlg_detect_direction(sip_msg_t *msg, tps_data_t *ptsd,
uint32_t *direction)
{
str ftag = {0, 0};
/* detect direction - get from-tag */
if(parse_from_header(msg)<0 || msg->from==NULL) {
LM_ERR("failed getting 'from' header!\n");
goto error;
}
ftag = get_from(msg)->tag_value;

if(ptsd->a_tag.len!=ftag.len) {
*direction = TPS_DIR_UPSTREAM;
} else {
if(memcmp(ptsd->a_tag.s, ftag.s, ftag.len)==0) {
*direction = TPS_DIR_DOWNSTREAM;
} else {
*direction = TPS_DIR_UPSTREAM;
}
}
return 0;

error:
return -1;
}

/**
*
*/
Expand Down Expand Up @@ -723,22 +752,10 @@ int tps_request_received(sip_msg_t *msg, int dialog)
goto error;
}

/* detect direction - get from-tag */
if(parse_from_header(msg)<0 || msg->from==NULL) {
LM_ERR("failed getting 'from' header!\n");
/* detect direction - via from-tag */
if(tps_dlg_detect_direction(msg, &stsd, &direction)<0) {
goto error;
}
ftag = get_from(msg)->tag_value;

if(stsd.a_tag.len!=ftag.len) {
direction = TPS_DIR_UPSTREAM;
} else {
if(memcmp(stsd.a_tag.s, ftag.s, ftag.len)==0) {
direction = TPS_DIR_DOWNSTREAM;
} else {
direction = TPS_DIR_UPSTREAM;
}
}
mtsd.direction = direction;

tps_storage_lock_release(&lkey);
Expand Down Expand Up @@ -791,7 +808,7 @@ int tps_response_received(sip_msg_t *msg)
tps_data_t btsd;
str lkey;
str ftag;
uint32_t direction;
uint32_t direction = TPS_DIR_DOWNSTREAM;

LM_DBG("handling incoming response\n");

Expand Down Expand Up @@ -820,27 +837,15 @@ int tps_response_received(sip_msg_t *msg)
goto error;
}

/* detect direction - get from-tag */
if(parse_from_header(msg)<0 || msg->from==NULL) {
LM_ERR("failed getting 'from' header!\n");
/* detect direction - via from-tag */
if(tps_dlg_detect_direction(msg, &stsd, &direction)<0) {
goto error;
}
ftag = get_from(msg)->tag_value;

if(stsd.a_tag.len!=ftag.len) {
direction = TPS_DIR_UPSTREAM;
} else {
if(memcmp(stsd.a_tag.s, ftag.s, ftag.len)==0) {
direction = TPS_DIR_DOWNSTREAM;
} else {
direction = TPS_DIR_UPSTREAM;
}
}
mtsd.direction = direction;
if(tps_storage_update_branch(msg, &mtsd, &btsd)<0) {
goto error;
}
if(tps_storage_update_dialog(msg, &mtsd, &stsd)<0) {
if(tps_storage_update_dialog(msg, &mtsd, &stsd, TPS_DBU_RPLATTRS)<0) {
goto error;
}
tps_storage_lock_release(&lkey);
Expand Down Expand Up @@ -869,7 +874,7 @@ int tps_request_sent(sip_msg_t *msg, int dialog, int local)
str lkey;
str ftag;
str xuuid;
int direction = TPS_DIR_DOWNSTREAM;
uint32_t direction = TPS_DIR_DOWNSTREAM;

LM_DBG("handling outgoing request\n");

Expand Down Expand Up @@ -908,22 +913,10 @@ int tps_request_sent(sip_msg_t *msg, int dialog, int local)
if(tps_storage_load_dialog(msg, &mtsd, &stsd)==0) {
ptsd = &stsd;
}
/* detect direction - get from-tag */
if(parse_from_header(msg)<0 || msg->from==NULL) {
LM_ERR("failed getting 'from' header!\n");
/* detect direction - via from-tag */
if(tps_dlg_detect_direction(msg, &stsd, &direction)<0) {
goto error;
}
ftag = get_from(msg)->tag_value;

if(stsd.a_tag.len!=ftag.len) {
direction = TPS_DIR_UPSTREAM;
} else {
if(memcmp(stsd.a_tag.s, ftag.s, ftag.len)==0) {
direction = TPS_DIR_DOWNSTREAM;
} else {
direction = TPS_DIR_UPSTREAM;
}
}
mtsd.direction = direction;
}

Expand Down Expand Up @@ -955,6 +948,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) {
goto error;
}

done:
tps_storage_lock_release(&lkey);
Expand All @@ -974,7 +970,7 @@ int tps_response_sent(sip_msg_t *msg)
tps_data_t stsd;
tps_data_t btsd;
str lkey;
int direction = TPS_DIR_UPSTREAM;
uint32_t direction = TPS_DIR_UPSTREAM;
str xvbranch = {0, 0};

LM_DBG("handling outgoing response\n");
Expand Down Expand Up @@ -1007,13 +1003,19 @@ int tps_response_sent(sip_msg_t *msg)
if(tps_storage_load_branch(msg, &mtsd, &btsd)<0) {
goto error;
}
LM_DBG("loaded dialog a_uuid [%.*s]\n",
LM_DBG("loaded branch a_uuid [%.*s]\n",
btsd.a_uuid.len, ZSW(btsd.a_uuid.s));
if(tps_storage_load_dialog(msg, &btsd, &stsd)<0) {
goto error;
}
tps_storage_lock_release(&lkey);

/* detect direction - via from-tag */
if(tps_dlg_detect_direction(msg, &stsd, &direction)<0) {
goto error1;
}
mtsd.direction = direction;

tps_remove_headers(msg, HDR_RECORDROUTE_T);
tps_remove_headers(msg, HDR_CONTACT_T);

Expand All @@ -1024,9 +1026,13 @@ int tps_response_sent(sip_msg_t *msg)
}

tps_reappend_rr(msg, &btsd, &btsd.x_rr);
if(tps_storage_update_dialog(msg, &mtsd, &stsd, TPS_DBU_CONTACT)<0) {
goto error1;
}
return 0;

error:
tps_storage_lock_release(&lkey);
error1:
return -1;
}
42 changes: 29 additions & 13 deletions src/modules/topos/tps_storage.c
Expand Up @@ -65,7 +65,8 @@ int tps_db_insert_branch(tps_data_t *td);
int tps_db_clean_branches(void);
int tps_db_load_branch(sip_msg_t *msg, tps_data_t *md, tps_data_t *sd);
int tps_db_load_dialog(sip_msg_t *msg, tps_data_t *md, tps_data_t *sd);
int tps_db_update_dialog(sip_msg_t *msg, tps_data_t *md, tps_data_t *sd);
int tps_db_update_dialog(sip_msg_t *msg, tps_data_t *md, tps_data_t *sd,
uint32_t mode);
int tps_db_end_dialog(sip_msg_t *msg, tps_data_t *md, tps_data_t *sd);

/**
Expand Down Expand Up @@ -1038,10 +1039,21 @@ int tps_storage_update_branch(sip_msg_t *msg, tps_data_t *md, tps_data_t *sd)
return 0;
}

#define TPS_DB_ADD_STRV(dcol, dval, cnr, cname, cval) \
do { \
if(cval.len>0) { \
dcol[cnr] = &cname; \
dval[cnr].type = DB1_STR; \
dval[cnr].val.str_val = TPS_STRZ(cval); \
cnr++; \
} \
} while(0)

/**
*
*/
int tps_db_update_dialog(sip_msg_t *msg, tps_data_t *md, tps_data_t *sd)
int tps_db_update_dialog(sip_msg_t *msg, tps_data_t *md, tps_data_t *sd,
uint32_t mode)
{
db_key_t db_keys[4];
db_op_t db_ops[4];
Expand Down Expand Up @@ -1075,12 +1087,14 @@ int tps_db_update_dialog(sip_msg_t *msg, tps_data_t *md, tps_data_t *sd)
}
nr_keys++;

db_ucols[nr_ucols] = &td_col_b_contact;
db_uvals[nr_ucols].type = DB1_STR;
db_uvals[nr_ucols].val.str_val = TPS_STRZ(md->b_contact);
nr_ucols++;
if(mode & TPS_DBU_CONTACT) {
TPS_DB_ADD_STRV(db_ucols, db_uvals, nr_ucols,
td_col_a_contact, md->a_contact);
TPS_DB_ADD_STRV(db_ucols, db_uvals, nr_ucols,
td_col_b_contact, md->b_contact);
}

if(msg->first_line.type==SIP_REPLY) {
if((mode & TPS_DBU_RPLATTRS) && msg->first_line.type==SIP_REPLY) {
if(sd->b_tag.len<=0
&& msg->first_line.u.reply.statuscode>=200
&& msg->first_line.u.reply.statuscode<300) {
Expand All @@ -1092,17 +1106,18 @@ int tps_db_update_dialog(sip_msg_t *msg, tps_data_t *md, tps_data_t *sd)
nr_ucols++;
}

db_ucols[nr_ucols] = &td_col_b_tag;
db_uvals[nr_ucols].type = DB1_STR;
db_uvals[nr_ucols].val.str_val = TPS_STRZ(md->b_tag);
nr_ucols++;
TPS_DB_ADD_STRV(db_ucols, db_uvals, nr_ucols,
td_col_b_tag, md->b_tag);

db_ucols[nr_ucols] = &td_col_iflags;
db_uvals[nr_ucols].type = DB1_INT;
db_uvals[nr_ucols].val.int_val = sd->iflags|TPS_IFLAG_DLGON;
nr_ucols++;
}
}
if(nr_ucols==0) {
return 0;
}
if (_tpsdbf.use_table(_tps_db_handle, &td_table_name) < 0) {
LM_ERR("failed to perform use table\n");
return -1;
Expand All @@ -1120,7 +1135,8 @@ int tps_db_update_dialog(sip_msg_t *msg, tps_data_t *md, tps_data_t *sd)
/**
*
*/
int tps_storage_update_dialog(sip_msg_t *msg, tps_data_t *md, tps_data_t *sd)
int tps_storage_update_dialog(sip_msg_t *msg, tps_data_t *md, tps_data_t *sd,
uint32_t mode)
{
int ret;

Expand All @@ -1138,7 +1154,7 @@ int tps_storage_update_dialog(sip_msg_t *msg, tps_data_t *md, tps_data_t *sd)
ret = tps_storage_link_msg(msg, md, md->direction);
if(ret<0) return -1;

return _tps_storage_api.update_dialog(msg, md, sd);
return _tps_storage_api.update_dialog(msg, md, sd, mode);
}

/**
Expand Down
7 changes: 6 additions & 1 deletion src/modules/topos/tps_storage.h
Expand Up @@ -37,6 +37,10 @@
#define TPS_IFLAG_INIT 1
#define TPS_IFLAG_DLGON 2

#define TPS_DBU_CONTACT (1<<0)
#define TPS_DBU_RPLATTRS (1<<1)
#define TPS_DBU_ALL (0xffffffff)

#define TPS_DATA_SIZE 8192
typedef struct tps_data {
char cbuf[TPS_DATA_SIZE];
Expand Down Expand Up @@ -87,7 +91,8 @@ int tps_storage_record(sip_msg_t *msg, tps_data_t *td, int dialog);
int tps_storage_load_branch(sip_msg_t *msg, tps_data_t *md, tps_data_t *sd);
int tps_storage_update_branch(sip_msg_t *msg, tps_data_t *md, tps_data_t *sd);
int tps_storage_load_dialog(sip_msg_t *msg, tps_data_t *md, tps_data_t *sd);
int tps_storage_update_dialog(sip_msg_t *msg, tps_data_t *md, tps_data_t *sd);
int tps_storage_update_dialog(sip_msg_t *msg, tps_data_t *md, tps_data_t *sd,
uint32_t mode);
int tps_storage_end_dialog(sip_msg_t *msg, tps_data_t *md, tps_data_t *sd);

int tps_storage_lock_set_init(void);
Expand Down

0 comments on commit f714655

Please sign in to comment.