diff options
author | Kevin P. Fleming <kpfleming@digium.com> | 2005-12-17 03:45:25 +0000 |
---|---|---|
committer | Kevin P. Fleming <kpfleming@digium.com> | 2005-12-17 03:45:25 +0000 |
commit | caa2e580dac8e88ec75f6ce934f858bd52d105bc (patch) | |
tree | 430ad33cc50200205139fecd1b8e5014e46a565e /channels | |
parent | 9cc6ad4880dd2b599063edf0770ac9acc2986a17 (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
Diffstat (limited to 'channels')
-rw-r--r-- | channels/chan_sip.c | 30 |
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; } |