summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJenkins2 <jenkins2@gerrit.asterisk.org>2017-12-14 18:25:28 -0600
committerGerrit Code Review <gerrit2@gerrit.digium.api>2017-12-14 18:25:28 -0600
commit76deae295f9d2d3a317eee3c4596fdcc5af794f8 (patch)
treefd60b52eb0ffd66fda80adb36202f65d8e1779ae
parentcff0f366867fda31fc689a7b76c9e8fe67080a35 (diff)
parenta6f4edf032d2c1d1ab58393c47c635f5d1bcd10c (diff)
Merge "pjsip: Ignore state changes from old transactions." into 15
-rw-r--r--third-party/pjproject/patches/0050-dont_terminate_session_early.patch71
1 files changed, 71 insertions, 0 deletions
diff --git a/third-party/pjproject/patches/0050-dont_terminate_session_early.patch b/third-party/pjproject/patches/0050-dont_terminate_session_early.patch
new file mode 100644
index 000000000..718968c79
--- /dev/null
+++ b/third-party/pjproject/patches/0050-dont_terminate_session_early.patch
@@ -0,0 +1,71 @@
+commit ca0b723e92bd76bbda1bbd14477a829eaeeb675e
+Author: Joshua Colp <jcolp@digium.com>
+Date: Wed Dec 13 10:58:57 2017 +0000
+
+ Ignore transport error on completed transaction.
+ Don't disconnect call if transport error happens on transaction that is not initial INVITE transaction.
+
+ Scenario:
+
+ DNS lookup returning two servers.
+ Sending INVITE to first server over TCP.
+ Response received with code 503 (Service Unavailable).
+ Failover to second server, sending second INVITE after restarting the session.
+ TCP connection for the first INVITE getting disconnected and causing call disconnection (while second INVITE is still outstanding).
+
+ This is a backport of 5714 from upstream PJSIP.
+
+diff --git a/pjsip/src/pjsip-ua/sip_inv.c b/pjsip/src/pjsip-ua/sip_inv.c
+index ac4d1949..0173cb4c 100644
+--- a/pjsip/src/pjsip-ua/sip_inv.c
++++ b/pjsip/src/pjsip-ua/sip_inv.c
+@@ -4254,8 +4254,7 @@ static void inv_on_state_calling( pjsip_inv_session *inv, pjsip_event *e)
+ if ((tsx->status_code == PJSIP_SC_CALL_TSX_DOES_NOT_EXIST &&
+ tsx->method.id != PJSIP_CANCEL_METHOD) ||
+ tsx->status_code == PJSIP_SC_REQUEST_TIMEOUT ||
+- tsx->status_code == PJSIP_SC_TSX_TIMEOUT ||
+- tsx->status_code == PJSIP_SC_TSX_TRANSPORT_ERROR)
++ tsx->status_code == PJSIP_SC_TSX_TIMEOUT)
+ {
+ inv_set_cause(inv, tsx->status_code, &tsx->status_text);
+ inv_set_state(inv, PJSIP_INV_STATE_DISCONNECTED, e);
+diff --git a/pjsip/src/pjsip/sip_transaction.c b/pjsip/src/pjsip/sip_transaction.c
+index 7ac3d1b7..d52b12a7 100644
+--- a/pjsip/src/pjsip/sip_transaction.c
++++ b/pjsip/src/pjsip/sip_transaction.c
+@@ -2044,9 +2044,14 @@ static void transport_callback(void *token, pjsip_tx_data *tdata,
+ */
+ lock_timer(tsx);
+ tsx->transport_err = (pj_status_t)-sent;
+- tsx_cancel_timer(tsx, &tsx->timeout_timer);
+- tsx_schedule_timer(tsx, &tsx->timeout_timer, &delay,
+- TRANSPORT_ERR_TIMER);
++ /* Don't cancel timeout timer if tsx state is already
++ * PJSIP_TSX_STATE_COMPLETED (see #2076).
++ */
++ if (tsx->state < PJSIP_TSX_STATE_COMPLETED) {
++ tsx_cancel_timer(tsx, &tsx->timeout_timer);
++ tsx_schedule_timer(tsx, &tsx->timeout_timer, &delay,
++ TRANSPORT_ERR_TIMER);
++ }
+ unlock_timer(tsx);
+ }
+
+@@ -2077,9 +2082,14 @@ static void tsx_tp_state_callback( pjsip_transport *tp,
+ */
+ lock_timer(tsx);
+ tsx->transport_err = info->status;
+- tsx_cancel_timer(tsx, &tsx->timeout_timer);
+- tsx_schedule_timer(tsx, &tsx->timeout_timer, &delay,
+- TRANSPORT_ERR_TIMER);
++ /* Don't cancel timeout timer if tsx state is already
++ * PJSIP_TSX_STATE_COMPLETED (see #2076).
++ */
++ if (tsx->state < PJSIP_TSX_STATE_COMPLETED) {
++ tsx_cancel_timer(tsx, &tsx->timeout_timer);
++ tsx_schedule_timer(tsx, &tsx->timeout_timer, &delay,
++ TRANSPORT_ERR_TIMER);
++ }
+ unlock_timer(tsx);
+ }
+ }