summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoshua Colp <jcolp@digium.com>2016-09-14 09:42:46 -0400
committerJoshua Colp <jcolp@digium.com>2016-09-15 08:26:06 -0500
commit449719be008f8b7073d350f587c93159afa8f37f (patch)
tree255da9bf18ab1238436fb42deffede9721468ff0
parent11d05fc3699aa3547be722b83529bfecbe15ee4f (diff)
res_pjsip_multihomed: Change Contact port to listening port.
The res_pjsip_multihomed module determines what interface and transport a request is going out on and updates the SIP message accordingly with the address information. This currently incorrectly updates the Contact header for connectionful protocols to the ephemeral connection port, instead of the bound address for the listening socket which can actually accept the connection back. If the remote side attempts to connect back on the epehemeral port it will fail. This change makes it so the port is updated to the bound port on connectionful protocols and is maintained on UDP (as there can be multiple of those). ASTERISK-26374 #close Change-Id: I50f8dab65b9f75117d73ba5f6bbcf6c9871854ab
-rw-r--r--res/res_pjsip_multihomed.c7
1 files changed, 5 insertions, 2 deletions
diff --git a/res/res_pjsip_multihomed.c b/res/res_pjsip_multihomed.c
index 745bc37ea..d52f6e406 100644
--- a/res/res_pjsip_multihomed.c
+++ b/res/res_pjsip_multihomed.c
@@ -109,8 +109,11 @@ static pj_status_t multihomed_on_tx_message(pjsip_tx_data *tdata)
return PJ_SUCCESS;
}
- /* The port in the message should always be that of the original transport */
- prm.ret_port = tdata->tp_info.transport->local_name.port;
+ /* For UDP we can have multiple transports so the port needs to be maintained */
+ if (tdata->tp_info.transport->key.type == PJSIP_TRANSPORT_UDP ||
+ tdata->tp_info.transport->key.type == PJSIP_TRANSPORT_UDP6) {
+ prm.ret_port = tdata->tp_info.transport->local_name.port;
+ }
/* If the IP source differs from the existing transport see if we need to update it */
if (pj_strcmp(&prm.ret_addr, &tdata->tp_info.transport->local_name.host)) {