summaryrefslogtreecommitdiff
path: root/pjsip
diff options
context:
space:
mode:
authorRiza Sulistyo <riza@teluu.com>2013-02-27 14:18:20 +0000
committerRiza Sulistyo <riza@teluu.com>2013-02-27 14:18:20 +0000
commit8e69f7842a49e2baa3c187cdced8fb5bca3d9cda (patch)
tree282133a4cd095141861e54cb6977b86e3cd715a4 /pjsip
parent04def0c646296839d73b6f81526d6d91ad6f2fd6 (diff)
Re #1607: backported to 1.x
git-svn-id: http://svn.pjsip.org/repos/pjproject/branches/1.x@4398 74dad513-b988-da41-8d7b-12977e46ad98
Diffstat (limited to 'pjsip')
-rw-r--r--pjsip/src/pjsua-lib/pjsua_acc.c23
1 files changed, 20 insertions, 3 deletions
diff --git a/pjsip/src/pjsua-lib/pjsua_acc.c b/pjsip/src/pjsua-lib/pjsua_acc.c
index 6888e3fd..f488db00 100644
--- a/pjsip/src/pjsua-lib/pjsua_acc.c
+++ b/pjsip/src/pjsua-lib/pjsua_acc.c
@@ -1667,9 +1667,26 @@ static void update_keep_alive(pjsua_acc *acc, pj_bool_t start,
/* Save transport and destination address. */
acc->ka_transport = param->rdata->tp_info.transport;
pjsip_transport_add_ref(acc->ka_transport);
- pj_memcpy(&acc->ka_target, &param->rdata->pkt_info.src_addr,
- param->rdata->pkt_info.src_addr_len);
- acc->ka_target_len = param->rdata->pkt_info.src_addr_len;
+
+ /* https://trac.pjsip.org/repos/ticket/1607:
+ * Calculate the destination address from the original request. Some
+ * (broken) servers send the response using different source address
+ * than the one that receives the request, which is forbidden by RFC
+ * 3581.
+ */
+ {
+ pjsip_transaction *tsx;
+ pjsip_tx_data *req;
+
+ tsx = pjsip_rdata_get_tsx(param->rdata);
+ PJ_ASSERT_ON_FAIL(tsx, return);
+
+ req = tsx->last_tx;
+
+ pj_memcpy(&acc->ka_target, &req->tp_info.dst_addr,
+ req->tp_info.dst_addr_len);
+ acc->ka_target_len = req->tp_info.dst_addr_len;
+ }
/* Setup and start the timer */
acc->ka_timer.cb = &keep_alive_timer_cb;