@ -15272,6 +15272,20 @@ static void extract_host_from_hostport(char **hostport)
ast_sockaddr_split_hostport ( * hostport , hostport , & dont_care , PARSE_PORT_IGNORE ) ;
}
/*! \internal \brief Helper function to update a peer's lastmsgssent value
*/
static void update_peer_lastmsgssent ( struct sip_peer * peer , int value , int locked )
{
if ( ! locked ) {
ao2_lock ( peer ) ;
}
peer - > lastmsgssent = value ;
if ( ! locked ) {
ao2_unlock ( peer ) ;
}
}
/*! \brief Verify registration of user
- Registration is done in several steps , first a REGISTER without auth
to get a challenge ( nonce ) then a second one with auth
@ -15285,6 +15299,7 @@ static enum check_auth_result register_verify(struct sip_pvt *p, struct ast_sock
char tmp [ 256 ] ;
char * c , * name , * unused_password , * domain ;
char * uri2 = ast_strdupa ( uri ) ;
int send_mwi = 0 ;
terminate_uri ( uri2 ) ;
@ -15414,12 +15429,14 @@ static enum check_auth_result register_verify(struct sip_pvt *p, struct ast_sock
ast_string_field_set ( p , fullcontact , peer - > fullcontact ) ;
transmit_response_with_date ( p , " 200 OK " , req ) ;
res = 0 ;
send_mwi = 1 ;
break ;
case PARSE_REGISTER_UPDATE :
ast_string_field_set ( p , fullcontact , peer - > fullcontact ) ;
update_peer ( peer , p - > expiry ) ;
/* Say OK and ask subsystem to retransmit msg counter */
transmit_response_with_date ( p , " 200 OK " , req ) ;
send_mwi = 1 ;
res = 0 ;
break ;
}
@ -15454,6 +15471,7 @@ static enum check_auth_result register_verify(struct sip_pvt *p, struct ast_sock
case PARSE_REGISTER_QUERY :
ast_string_field_set ( p , fullcontact , peer - > fullcontact ) ;
transmit_response_with_date ( p , " 200 OK " , req ) ;
send_mwi = 1 ;
res = 0 ;
break ;
case PARSE_REGISTER_UPDATE :
@ -15461,6 +15479,7 @@ static enum check_auth_result register_verify(struct sip_pvt *p, struct ast_sock
/* Say OK and ask subsystem to retransmit msg counter */
transmit_response_with_date ( p , " 200 OK " , req ) ;
manager_event ( EVENT_FLAG_SYSTEM , " PeerStatus " , " ChannelType: SIP \r \n Peer: SIP/%s \r \n PeerStatus: Registered \r \n Address: %s \r \n " , peer - > name , ast_sockaddr_stringify ( addr ) ) ;
send_mwi = 1 ;
res = 0 ;
break ;
}
@ -15468,9 +15487,13 @@ static enum check_auth_result register_verify(struct sip_pvt *p, struct ast_sock
}
}
if ( ! res ) {
ao2_unlock ( p ) ;
sip_send_mwi_to_peer ( peer , 0 ) ;
ao2_lock ( p ) ;
if ( send_mwi ) {
ao2_unlock ( p ) ;
sip_send_mwi_to_peer ( peer , 0 ) ;
ao2_lock ( p ) ;
} else {
update_peer_lastmsgssent ( peer , - 1 , 0 ) ;
}
ast_devstate_changed ( AST_DEVICE_UNKNOWN , " SIP/%s " , peer - > name ) ;
}
if ( res < 0 ) {
@ -18250,6 +18273,7 @@ static char *_sip_show_peer(int type, int fd, struct mansession *s, const struct
ast_cli ( fd , " MOH Suggest : %s \n " , peer - > mohsuggest ) ;
ast_cli ( fd , " Mailbox : %s \n " , mailbox_str - > str ) ;
ast_cli ( fd , " VM Extension : %s \n " , peer - > vmexten ) ;
ast_cli ( fd , " LastMsgsSent : %d/%d \n " , ( peer - > lastmsgssent & 0x7fff0000 ) > > 16 , peer - > lastmsgssent & 0xffff ) ;
ast_cli ( fd , " Call limit : %d \n " , peer - > call_limit ) ;
ast_cli ( fd , " Max forwards : %d \n " , peer - > maxforwards ) ;
if ( peer - > busy_level )
@ -18365,6 +18389,7 @@ static char *_sip_show_peer(int type, int fd, struct mansession *s, const struct
peer_mailboxes_to_str ( & mailbox_str , peer ) ;
astman_append ( s , " VoiceMailbox: %s \r \n " , mailbox_str - > str ) ;
astman_append ( s , " TransferMode: %s \r \n " , transfermode2str ( peer - > allowtransfer ) ) ;
astman_append ( s , " LastMsgsSent: %d \r \n " , peer - > lastmsgssent ) ;
astman_append ( s , " Maxforwards: %d \r \n " , peer - > maxforwards ) ;
astman_append ( s , " Call-limit: %d \r \n " , peer - > call_limit ) ;
astman_append ( s , " Busy-level: %d \r \n " , peer - > busy_level ) ;
@ -26730,12 +26755,14 @@ static int sip_send_mwi_to_peer(struct sip_peer *peer, int cache_only)
}
if ( ast_test_flag ( ( & peer - > flags [ 1 ] ) , SIP_PAGE2_SUBSCRIBEMWIONLY ) & & ! peer - > mwipvt ) {
update_peer_lastmsgssent ( peer , - 1 , 1 ) ;
ao2_unlock ( peer ) ;
return - 1 ;
}
/* Do we have an IP address? If not, skip this peer */
if ( ast_sockaddr_isnull ( & peer - > addr ) & & ast_sockaddr_isnull ( & peer - > defaddr ) ) {
update_peer_lastmsgssent ( peer , - 1 , 1 ) ;
ao2_unlock ( peer ) ;
return - 1 ;
}
@ -26751,6 +26778,11 @@ static int sip_send_mwi_to_peer(struct sip_peer *peer, int cache_only)
return - 1 ;
}
ao2_unlock ( peer ) ;
/* If there is no mailbox do nothing */
if ( ast_strlen_zero ( mailbox_str - > str ) ) {
update_peer_lastmsgssent ( peer , - 1 , 0 ) ;
return 0 ;
}
ast_app_inboxcount ( mailbox_str - > str , & newmsgs , & oldmsgs ) ;
ao2_lock ( peer ) ;
}
@ -26763,6 +26795,7 @@ static int sip_send_mwi_to_peer(struct sip_peer *peer, int cache_only)
ao2_unlock ( peer ) ;
/* Build temporary dialog for this message */
if ( ! ( p = sip_alloc ( NULL , NULL , 0 , SIP_NOTIFY , NULL , NULL ) ) ) {
update_peer_lastmsgssent ( peer , - 1 , 0 ) ;
return - 1 ;
}
@ -26775,7 +26808,7 @@ static int sip_send_mwi_to_peer(struct sip_peer *peer, int cache_only)
/* Maybe they're not registered, etc. */
dialog_unlink_all ( p ) ;
dialog_unref ( p , " unref dialog p just created via sip_alloc " ) ;
/* sip_destroy(p); */
update_peer_lastmsgssent ( peer , - 1 , 0 ) ;
return - 1 ;
}
/* Recalculate our side, and recalculate Call ID */
@ -26808,6 +26841,8 @@ static int sip_send_mwi_to_peer(struct sip_peer *peer, int cache_only)
sip_pvt_unlock ( p ) ;
dialog_unref ( p , " unref dialog ptr p just before it goes out of scope at the end of sip_send_mwi_to_peer. " ) ;
update_peer_lastmsgssent ( peer , ( ( newmsgs > 0x7fff ? 0x7fff0000 : ( newmsgs < < 16 ) ) | ( oldmsgs > 0xffff ? 0xffff : oldmsgs ) ) , 0 ) ;
return 0 ;
}