[Asterisk-code-review] res pjsip refer.c: Delay sending the initial SIP Notify with... (asterisk[13])

Kevin Harwell asteriskteam at digium.com
Tue Mar 1 18:10:55 CST 2016


Kevin Harwell has uploaded a new change for review.

  https://gerrit.asterisk.org/2321

Change subject: res_pjsip_refer.c: Delay sending the initial SIP Notify with frag 100
......................................................................

res_pjsip_refer.c: Delay sending the initial SIP Notify with frag 100

During the transfer process, some phones (okay it was the Jitsi softphone,
but maybe others are out there) send a "bye" immediately after receiving a
SIP Notify. When a "bye" is received early for some types of transfers the
transferer channel may no longer be available during late stage transfer
processing.

For instance, during an attended transfer involving stasis bridging at one
point the created local channel looks for an associated swap channel in
order to retrieve the stasis application name. If the transferer gets hung
up early, then leaves the bridge the local channel fails to find it when
looking it up. The local channel then has no way to know which stasis app
to enter, so it fails and hangs up as well. Thus the transfer does not
complete as expected.

This patch delays the sending of the initial notify in order to give the
transfer process enough time to gather the necessary data for a successful
transfer.

ASTERISK-25771

Change-Id: I09cfc9a5d6ed4c007bc70625e0972b470393bf16
---
M res/res_pjsip_refer.c
1 file changed, 16 insertions(+), 7 deletions(-)


  git pull ssh://gerrit.asterisk.org:29418/asterisk refs/changes/21/2321/1

diff --git a/res/res_pjsip_refer.c b/res/res_pjsip_refer.c
index c23097e..e14565c 100644
--- a/res/res_pjsip_refer.c
+++ b/res/res_pjsip_refer.c
@@ -59,6 +59,8 @@
 	struct transfer_channel_data *transfer_data;
 	/*! \brief Uniqueid of transferee channel */
 	char *transferee;
+	/*! \brief Flag indicating if the 100 notify has been sent */
+	int sent_100;
 };
 
 /*! \brief REFER Progress notification structure */
@@ -131,6 +133,20 @@
 		ao2_cleanup(notification->progress);
 
 		notification->progress->sub = NULL;
+	}
+
+	/*
+	 * If a notify with sip frag 100 has not been sent then send that first. If it fails
+	 * for some reason we'll just continue as if it was sent.
+	 */
+	if (!notification->progress->sent_100) {
+		notification->progress->sent_100 = 1;
+		if (notification->response != 100) {
+			ast_debug(3, "Sending initial 100 Trying NOTIFY for progress monitor '%p'\n", notification->progress);
+			if (pjsip_xfer_notify(sub, PJSIP_EVSUB_STATE_ACTIVE, 100, NULL, &tdata) == PJ_SUCCESS) {
+				pjsip_xfer_send_request(sub, tdata);
+			}
+		}
 	}
 
 	ast_debug(3, "Sending NOTIFY with response '%d' and state '%u' on subscription '%p' and progress monitor '%p'\n",
@@ -340,7 +356,6 @@
 	const pj_str_t str_refer_sub = { "Refer-Sub", 9 };
 	pjsip_generic_string_hdr *refer_sub = NULL;
 	const pj_str_t str_true = { "true", 4 };
-	pjsip_tx_data *tdata;
 	pjsip_hdr hdr_list;
 	char tps_name[AST_TASKPROCESSOR_MAX_NAME + 1];
 
@@ -391,12 +406,6 @@
 	/* Accept the REFER request */
 	ast_debug(3, "Accepting REFER request for progress monitor '%p'\n", *progress);
 	pjsip_xfer_accept((*progress)->sub, rdata, 202, &hdr_list);
-
-	/* Send initial NOTIFY Request */
-	ast_debug(3, "Sending initial 100 Trying NOTIFY for progress monitor '%p'\n", *progress);
-	if (pjsip_xfer_notify((*progress)->sub, PJSIP_EVSUB_STATE_ACTIVE, 100, NULL, &tdata) == PJ_SUCCESS) {
-		pjsip_xfer_send_request((*progress)->sub, tdata);
-	}
 
 	return 0;
 

-- 
To view, visit https://gerrit.asterisk.org/2321
To unsubscribe, visit https://gerrit.asterisk.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I09cfc9a5d6ed4c007bc70625e0972b470393bf16
Gerrit-PatchSet: 1
Gerrit-Project: asterisk
Gerrit-Branch: 13
Gerrit-Owner: Kevin Harwell <kharwell at digium.com>



More information about the asterisk-code-review mailing list