summaryrefslogtreecommitdiff
path: root/channels/chan_sip.c
diff options
context:
space:
mode:
authorAlec L Davis <sivad.a@paradise.net.nz>2013-05-08 07:21:09 +0000
committerAlec L Davis <sivad.a@paradise.net.nz>2013-05-08 07:21:09 +0000
commitefd28c676a4a467f1bb31d3359c43c2f1d70029b (patch)
treeceb6157dca07edbc1bffecbec0d6aa1fbefaf35d /channels/chan_sip.c
parenta61060cf41ba4eced0120122ca447f114f791359 (diff)
chan_sip: NOTIFYs for BLF start queuing up and fail to be sent out after retries fail
RFC6665 4.2.2: ... after a failed State NOTIFY transaction remove the subscription The problem is that the State Notify requests rely on the 200OK reponse for pacing control and to not confuse the notify susbsystem. The issue is, the pendinginvite isn't cleared if a response isn't received, thus further notify's are never sent. The solution, follow RFC 6665 4.2.2's 'SHOULD' and remove the subscription after failure. (closes issue ASTERISK-21677) Reported by: Dan Martens Tested by: alecdavis alecdavis (license 585) Review https://reviewboard.asterisk.org/r/2475/ ........ Merged revisions 387875 from http://svn.asterisk.org/svn/asterisk/branches/1.8 ........ Merged revisions 387880 from http://svn.asterisk.org/svn/asterisk/branches/11 git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@387885 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'channels/chan_sip.c')
-rw-r--r--channels/chan_sip.c15
1 files changed, 14 insertions, 1 deletions
diff --git a/channels/chan_sip.c b/channels/chan_sip.c
index 24cd95b8a..8cd739e49 100644
--- a/channels/chan_sip.c
+++ b/channels/chan_sip.c
@@ -14805,7 +14805,20 @@ static int transmit_state_notify(struct sip_pvt *p, struct state_notify_data *da
p->pendinginvite = p->ocseq; /* Remember that we have a pending NOTIFY in order not to confuse the NOTIFY subsystem */
- return send_request(p, &req, XMIT_RELIABLE, p->ocseq);
+ /* Send as XMIT_CRITICAL as we may never receive a 200 OK Response which clears p->pendinginvite.
+ *
+ * extensionstate_update() uses p->pendinginvite for queuing control.
+ * Updates stall if pendinginvite <> 0.
+ *
+ * The most appropriate solution is to remove the subscription when the NOTIFY transaction fails.
+ * The client will re-subscribe after restarting or maxexpiry timeout.
+ */
+
+ /* RFC6665 4.2.2. Sending State Information to Subscribers
+ * If the NOTIFY request fails due to expiration of SIP Timer F (transaction timeout),
+ * the notifier SHOULD remove the subscription.
+ */
+ return send_request(p, &req, XMIT_CRITICAL, p->ocseq);
}
/*! \brief Notify user of messages waiting in voicemail (RFC3842)