summaryrefslogtreecommitdiff
path: root/channels
diff options
context:
space:
mode:
authorMark Michelson <mmichelson@digium.com>2012-09-04 15:50:30 +0000
committerMark Michelson <mmichelson@digium.com>2012-09-04 15:50:30 +0000
commita40f702aef6f9cc779bd718475175e53154147da (patch)
tree3598580893c26d16e8c77dbe62eaa0293be8fab0 /channels
parent1b6cf69e7bcdeaab2a0243ddfe5ae7aa8d3642db (diff)
Fix issue where SIP devices were not notified when custom devices changed to "ringing".
The problem had to do with logic used when checking for what the oldest ringing channel was. The problem was that if no channel was found, then no notification would be sent. For custom device states, there is no associated channel, so no notification would get sent. This fixes the issue by still sending the notification even if no associated channel can be found for a ringing device state change. (closes issue ASTERISK-20297) Reported by Noah Engelberth ........ Merged revisions 372137 from http://svn.asterisk.org/svn/asterisk/branches/11 git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@372138 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'channels')
-rw-r--r--channels/chan_sip.c39
1 files changed, 18 insertions, 21 deletions
diff --git a/channels/chan_sip.c b/channels/chan_sip.c
index 1de780634..2774841a4 100644
--- a/channels/chan_sip.c
+++ b/channels/chan_sip.c
@@ -15859,22 +15859,22 @@ static int extensionstate_update(const char *context, const char *exten, struct
} else if (data->state & AST_EXTENSION_RINGING) {
/* check if another channel than last time is ringing now to be notified */
struct ast_channel *ringing = find_ringing_channel(data->device_state_info, p);
- if (!ringing) {
- /* there's something wrong, the device is ringing but there is no
- * ringing channel (yet, chan_sip is strange
- * the device is in AST_DEVICE_RINGING but the channel is in AST_STATE_DOWN)
- */
- sip_pvt_unlock(p);
- return 0;
- }
- if (!ast_tvcmp(ast_channel_creationtime(ringing), p->last_ringing_channel_time)) {
- /* we assume here that no two channels have the exact same creation time */
- ao2_ref(ringing, -1);
- sip_pvt_unlock(p);
- return 0;
+ if (ringing) {
+ if (!ast_tvcmp(ast_channel_creationtime(ringing), p->last_ringing_channel_time)) {
+ /* we assume here that no two channels have the exact same creation time */
+ ao2_ref(ringing, -1);
+ sip_pvt_unlock(p);
+ return 0;
+ } else {
+ p->last_ringing_channel_time = ast_channel_creationtime(ringing);
+ ao2_ref(ringing, -1);
+ }
}
- p->last_ringing_channel_time = ast_channel_creationtime(ringing);
- ao2_ref(ringing, -1);
+ /* If no ringing channel was found, it doesn't necessarily indicate anything bad.
+ * Likely, a device state change occurred for a custom device state, which does not
+ * correspond to any channel. In such a case, just go ahead and pass the notification
+ * along.
+ */
}
/* ref before unref because the new could be the same as the old one. Don't risk destruction! */
if (data->device_state_info) {
@@ -27011,13 +27011,10 @@ static int handle_request_subscribe(struct sip_pvt *p, struct sip_request *req,
if (ringing) {
p->last_ringing_channel_time = ast_channel_creationtime(ringing);
ao2_ref(ringing, -1);
- } else {
- /* The device is ringing but there is no ringing channel (chan_sip:
- * the device can be AST_DEVICE_RINGING but the channel is AST_STATE_DOWN yet),
- * correct state for state_notify_build_xml not to search a ringing channel.
- */
- data.state &= ~AST_EXTENSION_RINGING;
}
+ /* If there is no channel, this likely indicates that the ringing indication
+ * is due to a custom device state. These do not have associated channels.
+ */
}
extensionstate_update(p->context, p->exten, &data, p, TRUE);
append_history(p, "Subscribestatus", "%s", ast_extension_state2str(data.state));