summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenny Prijono <bennylp@teluu.com>2007-10-31 15:52:09 +0000
committerBenny Prijono <bennylp@teluu.com>2007-10-31 15:52:09 +0000
commit31312b374394c95addd6418da8be7acc5c4002b4 (patch)
tree80236ffe28e330fe8620f5c42d5c798add0df303
parentef040a9c543b0b51e0f278ebb7a3e6a9588e9b83 (diff)
Ticket #408: Route set shouldn't be updated once it has been set (thanks Anshuman S. Rawat)
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@1537 74dad513-b988-da41-8d7b-12977e46ad98
-rw-r--r--pjsip/include/pjsip/sip_dialog.h1
-rw-r--r--pjsip/src/pjsip/sip_dialog.c14
2 files changed, 9 insertions, 6 deletions
diff --git a/pjsip/include/pjsip/sip_dialog.h b/pjsip/include/pjsip/sip_dialog.h
index 626ec08b..b11ba4c8 100644
--- a/pjsip/include/pjsip/sip_dialog.h
+++ b/pjsip/include/pjsip/sip_dialog.h
@@ -130,6 +130,7 @@ struct pjsip_dialog
pj_bool_t add_allow; /**< Add Allow header in requests? */
pjsip_cid_hdr *call_id; /**< Call-ID header. */
pjsip_route_hdr route_set; /**< Route set. */
+ pj_bool_t route_set_frozen; /**< Route set has been set. */
pjsip_auth_clt_sess auth_sess; /**< Client authentication session. */
/** Session counter. */
diff --git a/pjsip/src/pjsip/sip_dialog.c b/pjsip/src/pjsip/sip_dialog.c
index 85212bb9..b4317753 100644
--- a/pjsip/src/pjsip/sip_dialog.c
+++ b/pjsip/src/pjsip/sip_dialog.c
@@ -472,6 +472,7 @@ PJ_DEF(pj_status_t) pjsip_dlg_create_uas( pjsip_user_agent *ua,
rr = (pjsip_route_hdr*) pjsip_msg_find_hdr(rdata->msg_info.msg,
PJSIP_H_RECORD_ROUTE, rr);
}
+ dlg->route_set_frozen = PJ_TRUE;
/* Init client authentication session. */
status = pjsip_auth_clt_init(&dlg->auth_sess, dlg->endpt,
@@ -641,6 +642,7 @@ PJ_DEF(pj_status_t) pjsip_dlg_fork( const pjsip_dialog *first_dlg,
r = r->next;
}
+ dlg->route_set_frozen = PJ_TRUE;
/* Clone client authentication session. */
status = pjsip_auth_clt_clone(dlg->pool, &dlg->auth_sess,
@@ -1540,6 +1542,10 @@ static void dlg_update_routeset(pjsip_dialog *dlg, const pjsip_msg *msg)
{
const pjsip_hdr *hdr, *end_hdr;
+ /* Ignore if route set has been set */
+ if (dlg->route_set_frozen)
+ return;
+
pj_list_init(&dlg->route_set);
end_hdr = &msg->hdr;
@@ -1551,6 +1557,7 @@ static void dlg_update_routeset(pjsip_dialog *dlg, const pjsip_msg *msg)
pj_list_push_back(&dlg->route_set, r);
}
}
+ dlg->route_set_frozen = PJ_TRUE;
}
/* This function is called by user agent upon receiving incoming response
@@ -1559,7 +1566,6 @@ static void dlg_update_routeset(pjsip_dialog *dlg, const pjsip_msg *msg)
void pjsip_dlg_on_rx_response( pjsip_dialog *dlg, pjsip_rx_data *rdata )
{
unsigned i;
- pj_bool_t routeset_updated = PJ_FALSE;
int res_code;
PJ_LOG(5,(dlg->obj_name, "Received %s",
@@ -1613,7 +1619,6 @@ void pjsip_dlg_on_rx_response( pjsip_dialog *dlg, pjsip_rx_data *rdata )
* route set for future requests in this dialog.
*/
dlg_update_routeset(dlg, rdata->msg_info.msg);
- routeset_updated = PJ_TRUE;
/* The remote target MUST be set to the URI from the Contact header
* field of the response.
@@ -1673,10 +1678,7 @@ void pjsip_dlg_on_rx_response( pjsip_dialog *dlg, pjsip_rx_data *rdata )
dlg->target = dlg->remote.contact->uri;
}
- if (!routeset_updated) {
- dlg_update_routeset(dlg, rdata->msg_info.msg);
- routeset_updated = PJ_TRUE;
- }
+ dlg_update_routeset(dlg, rdata->msg_info.msg);
}