Merged revisions 7513 via svnmerge from
authorKevin P. Fleming <kpfleming@digium.com>
Sat, 17 Dec 2005 03:45:25 +0000 (03:45 +0000)
committerKevin P. Fleming <kpfleming@digium.com>
Sat, 17 Dec 2005 03:45:25 +0000 (03:45 +0000)
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

channels/chan_sip.c

index 2f9e095..87226a6 100644 (file)
@@ -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 {
                        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));
                        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)
                }
                if (!p->expiry)
-                       ast_set_flag(p, SIP_NEEDDESTROY);       
+                       ast_set_flag(p, SIP_NEEDDESTROY);
        }
        return 1;
 }
        }
        return 1;
 }