summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKevin P. Fleming <kpfleming@digium.com>2005-12-17 03:45:25 +0000
committerKevin P. Fleming <kpfleming@digium.com>2005-12-17 03:45:25 +0000
commitcaa2e580dac8e88ec75f6ce934f858bd52d105bc (patch)
tree430ad33cc50200205139fecd1b8e5014e46a565e
parent9cc6ad4880dd2b599063edf0770ac9acc2986a17 (diff)
Merged revisions 7513 via svnmerge from
https://origsvn.digium.com/svn/asterisk/branches/1.2 ........ r7513 | kpfleming | 2005-12-16 21:44:30 -0600 (Fri, 16 Dec 2005) | 2 lines forcibly expire previous subscriptions from a peer when they resubscribe (keeps them from building up and waiting for expiration, and stops us sending unwanted NOTIFY messages to devices) ........ git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@7514 65c4cc65-6c06-0410-ace0-fbb531ad65f3
-rw-r--r--channels/chan_sip.c30
1 files changed, 29 insertions, 1 deletions
diff --git a/channels/chan_sip.c b/channels/chan_sip.c
index 2f9e0958e..87226a6d7 100644
--- a/channels/chan_sip.c
+++ b/channels/chan_sip.c
@@ -10799,12 +10799,40 @@ static int handle_request_subscribe(struct sip_pvt *p, struct sip_request *req,
ast_set_flag(p, SIP_NEEDDESTROY);
return 0;
} else {
+ struct sip_pvt *p_old;
+
transmit_response(p, "200 OK", req);
transmit_state_notify(p, firststate, 1, 1); /* Send first notification */
append_history(p, "Subscribestatus", ast_extension_state2str(firststate));
+
+ /* remove any old subscription from this peer for the same exten/context,
+ as the peer has obviously forgotten about it and it's wasteful to wait
+ for it to expire and send NOTIFY messages to the peer only to have them
+ ignored (or generate errors)
+ */
+ ast_mutex_lock(&iflock);
+ for (p_old = iflist; p_old; p_old = p_old->next) {
+ if (p_old == p)
+ continue;
+ if (p_old->initreq.method != SIP_SUBSCRIBE)
+ continue;
+ if (p_old->subscribed == NONE)
+ continue;
+ ast_mutex_lock(&p_old->lock);
+ if (!strcmp(p_old->username, p->username)) {
+ if (!strcmp(p_old->exten, p->exten) &&
+ !strcmp(p_old->context, p->context)) {
+ ast_set_flag(p_old, SIP_NEEDDESTROY);
+ ast_mutex_unlock(&p_old->lock);
+ break;
+ }
+ }
+ ast_mutex_unlock(&p_old->lock);
+ }
+ ast_mutex_unlock(&iflock);
}
if (!p->expiry)
- ast_set_flag(p, SIP_NEEDDESTROY);
+ ast_set_flag(p, SIP_NEEDDESTROY);
}
return 1;
}