move a large block out of do_monitor() and into a function,
[asterisk/asterisk.git] / channels / chan_sip.c
index cb1f81d..f98bc35 100644 (file)
@@ -14575,6 +14575,59 @@ static int does_peer_need_mwi(struct sip_peer *peer)
 }
 
 
 }
 
 
+/*! \brief helper function for the monitoring thread */
+static void check_rtp_timeout(struct sip_pvt *sip, time_t t)
+{
+       if (sip->rtp && sip->owner &&
+           (sip->owner->_state == AST_STATE_UP) &&
+           !sip->redirip.sin_addr.s_addr) {
+               if (sip->lastrtptx &&
+                   sip->rtpkeepalive &&
+                   (t > sip->lastrtptx + sip->rtpkeepalive)) {
+                       /* Need to send an empty RTP packet */
+                       sip->lastrtptx = time(NULL);
+                       ast_rtp_sendcng(sip->rtp, 0);
+               }
+               if (sip->lastrtprx &&
+                   (sip->rtptimeout || sip->rtpholdtimeout) &&
+                   (t > sip->lastrtprx + sip->rtptimeout)) {
+                       /* Might be a timeout now -- see if we're on hold */
+                       struct sockaddr_in sin;
+                       ast_rtp_get_peer(sip->rtp, &sin);
+                       if (sin.sin_addr.s_addr || 
+                           (sip->rtpholdtimeout && 
+                            (t > sip->lastrtprx + sip->rtpholdtimeout))) {
+                               /* Needs a hangup */
+                               if (sip->rtptimeout) {
+                                       while (sip->owner && ast_channel_trylock(sip->owner)) {
+                                               ast_mutex_unlock(&sip->lock);
+                                               usleep(1);
+                                               ast_mutex_lock(&sip->lock);
+                                       }
+                                       if (sip->owner) {
+                                               if (!(ast_rtp_get_bridged(sip->rtp))) {
+                                                       ast_log(LOG_NOTICE,
+                                                               "Disconnecting call '%s' for lack of RTP activity in %ld seconds\n",
+                                                               sip->owner->name,
+                                                               (long) (t - sip->lastrtprx));
+                                                       /* Issue a softhangup */
+                                                       ast_softhangup_nolock(sip->owner, AST_SOFTHANGUP_DEV);
+                                               } else
+                                                       ast_log(LOG_NOTICE, "'%s' will not be disconnected in %ld seconds because it is directly bridged to another RTP stream\n", sip->owner->name, (long) (t - sip->lastrtprx));
+                                               ast_channel_unlock(sip->owner);
+                                               /* forget the timeouts for this call, since a hangup
+                                                  has already been requested and we don't want to
+                                                  repeatedly request hangups
+                                               */
+                                               sip->rtptimeout = 0;
+                                               sip->rtpholdtimeout = 0;
+                                       }
+                               }
+                       }
+               }
+       }
+}
+
 /*! \brief The SIP monitoring thread 
 \note  This thread monitors all the SIP sessions and peers that needs notification of mwi
        (and thus do not have a separate thread) indefinitely 
 /*! \brief The SIP monitoring thread 
 \note  This thread monitors all the SIP sessions and peers that needs notification of mwi
        (and thus do not have a separate thread) indefinitely 
@@ -14621,54 +14674,7 @@ restartsearch:
                for (sip = iflist; !fastrestart && sip; sip = sip->next) {
                        ast_mutex_lock(&sip->lock);
                        /* Check RTP timeouts and kill calls if we have a timeout set and do not get RTP */
                for (sip = iflist; !fastrestart && sip; sip = sip->next) {
                        ast_mutex_lock(&sip->lock);
                        /* Check RTP timeouts and kill calls if we have a timeout set and do not get RTP */
-                       if (sip->rtp && sip->owner &&
-                           (sip->owner->_state == AST_STATE_UP) &&
-                           !sip->redirip.sin_addr.s_addr) {
-                               if (sip->lastrtptx &&
-                                   sip->rtpkeepalive &&
-                                   (t > sip->lastrtptx + sip->rtpkeepalive)) {
-                                       /* Need to send an empty RTP packet */
-                                       sip->lastrtptx = time(NULL);
-                                       ast_rtp_sendcng(sip->rtp, 0);
-                               }
-                               if (sip->lastrtprx &&
-                                   (sip->rtptimeout || sip->rtpholdtimeout) &&
-                                   (t > sip->lastrtprx + sip->rtptimeout)) {
-                                       /* Might be a timeout now -- see if we're on hold */
-                                       struct sockaddr_in sin;
-                                       ast_rtp_get_peer(sip->rtp, &sin);
-                                       if (sin.sin_addr.s_addr || 
-                                           (sip->rtpholdtimeout && 
-                                            (t > sip->lastrtprx + sip->rtpholdtimeout))) {
-                                               /* Needs a hangup */
-                                               if (sip->rtptimeout) {
-                                                       while (sip->owner && ast_channel_trylock(sip->owner)) {
-                                                               ast_mutex_unlock(&sip->lock);
-                                                               usleep(1);
-                                                               ast_mutex_lock(&sip->lock);
-                                                       }
-                                                       if (sip->owner) {
-                                                               if (!(ast_rtp_get_bridged(sip->rtp))) {
-                                                                       ast_log(LOG_NOTICE,
-                                                                               "Disconnecting call '%s' for lack of RTP activity in %ld seconds\n",
-                                                                               sip->owner->name,
-                                                                               (long) (t - sip->lastrtprx));
-                                                                       /* Issue a softhangup */
-                                                                       ast_softhangup_nolock(sip->owner, AST_SOFTHANGUP_DEV);
-                                                               } else
-                                                                       ast_log(LOG_NOTICE, "'%s' will not be disconnected in %ld seconds because it is directly bridged to another RTP stream\n", sip->owner->name, (long) (t - sip->lastrtprx));
-                                                               ast_channel_unlock(sip->owner);
-                                                               /* forget the timeouts for this call, since a hangup
-                                                                  has already been requested and we don't want to
-                                                                  repeatedly request hangups
-                                                               */
-                                                               sip->rtptimeout = 0;
-                                                               sip->rtpholdtimeout = 0;
-                                                       }
-                                               }
-                                       }
-                               }
-                       }
+                       check_rtp_timeout(sip, t);
                        /* If we have sessions that needs to be destroyed, do it now */
                        if (ast_test_flag(&sip->flags[0], SIP_NEEDDESTROY) && !sip->packets &&
                            !sip->owner) {
                        /* If we have sessions that needs to be destroyed, do it now */
                        if (ast_test_flag(&sip->flags[0], SIP_NEEDDESTROY) && !sip->packets &&
                            !sip->owner) {