@ -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
@ -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 */
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 ) {