@ -1585,8 +1585,11 @@ static struct topology_change_refresh_data *topology_change_refresh_data_alloc(
static int on_topology_change_response ( struct ast_sip_session * session , pjsip_rx_data * rdata )
{
SCOPE_ENTER ( 1 , " %s Status code: %d \n " , ast_sip_session_get_name ( session ) ,
rdata - > msg_info . msg - > line . status . code ) ;
SCOPE_ENTER ( 3 , " %s: Received response code %d. PT: %s AT: %s \n " , ast_sip_session_get_name ( session ) ,
rdata - > msg_info . msg - > line . status . code ,
ast_str_tmp ( 256 , ast_stream_topology_to_str ( session - > pending_media_state - > topology , & STR_TMP ) ) ,
ast_str_tmp ( 256 , ast_stream_topology_to_str ( session - > active_media_state - > topology , & STR_TMP ) ) ) ;
if ( PJSIP_IS_STATUS_IN_CLASS ( rdata - > msg_info . msg - > line . status . code , 200 ) ) {
/* The topology was changed to something new so give notice to what requested
@ -1594,27 +1597,33 @@ static int on_topology_change_response(struct ast_sip_session *session, pjsip_rx
*/
if ( session - > channel ) {
ast_queue_control ( session - > channel , AST_CONTROL_STREAM_TOPOLOGY_CHANGED ) ;
SCOPE_EXIT_RTN_VALUE ( 0 , " %s: Queued topology change frame \n " , ast_sip_session_get_name ( session ) ) ;
}
SCOPE_EXIT_RTN_VALUE ( 0 , " %s: No channel? Can't queue topology change frame \n " , ast_sip_session_get_name ( session ) ) ;
} else if ( 300 < = rdata - > msg_info . msg - > line . status . code ) {
/* The topology change failed, so drop the current pending media state */
ast_sip_session_media_state_reset ( session - > pending_media_state ) ;
SCOPE_EXIT_RTN_VALUE ( 0 , " %s: response code > 300. Resetting pending media state \n " , ast_sip_session_get_name ( session ) ) ;
}
SCOPE_EXIT_RTN_VALUE ( 0 );
SCOPE_EXIT_RTN_VALUE ( 0 , " %s: Nothing to do \n " , ast_sip_session_get_name ( session ) );
}
static int send_topology_change_refresh ( void * data )
{
struct topology_change_refresh_data * refresh_data = data ;
struct ast_sip_session * session = refresh_data - > session ;
int ret ;
SCOPE_ENTER ( 1 , " %s \n " , ast_sip_session_get_name ( refresh_data - > session ) ) ;
SCOPE_ENTER ( 3 , " %s: %s \n " , ast_sip_session_get_name ( session ) ,
ast_str_tmp ( 256 , ast_stream_topology_to_str ( refresh_data - > media_state - > topology , & STR_TMP ) ) ) ;
ret = ast_sip_session_refresh ( refresh_data - > session , NULL , NULL , on_topology_change_response ,
ret = ast_sip_session_refresh ( session , NULL , NULL , on_topology_change_response ,
AST_SIP_SESSION_REFRESH_METHOD_INVITE , 1 , refresh_data - > media_state ) ;
refresh_data - > media_state = NULL ;
topology_change_refresh_data_free ( refresh_data ) ;
SCOPE_EXIT_RTN_VALUE ( ret , " RC: %d\n " , ret ) ;
SCOPE_EXIT_RTN_VALUE ( ret , " %s\n " , ast_sip_session_get_name ( session ) ) ;
}
static int handle_topology_request_change ( struct ast_sip_session * session ,
@ -1647,10 +1656,15 @@ static int chan_pjsip_indicate(struct ast_channel *ast, int condition, const voi
size_t device_buf_size ;
int i ;
const struct ast_stream_topology * topology ;
struct ast_frame f = { . frametype = AST_FRAME_CONTROL , . subclass = { . integer = condition } } ;
char subclass [ 40 ] = " " ;
SCOPE_ENTER ( 1 , " %s Handling %s \n " , ast_channel_name ( ast ) ,
ast_frame_subclass2str ( & f , subclass , sizeof ( subclass ) , NULL , 0 ) ) ;
struct ast_frame f = {
. frametype = AST_FRAME_CONTROL ,
. subclass = {
. integer = condition
}
} ;
char condition_name [ 256 ] ;
SCOPE_ENTER ( 3 , " %s: Indicated %s \n " , ast_channel_name ( ast ) ,
ast_frame_subclass2str ( & f , condition_name , sizeof ( condition_name ) , NULL , 0 ) ) ;
switch ( condition ) {
case AST_CONTROL_RINGING :
@ -1755,9 +1769,9 @@ static int chan_pjsip_indicate(struct ast_channel *ast, int condition, const voi
ao2_ref ( channel - > session , + 1 ) ;
# ifdef HAVE_PJSIP_INV_SESSION_REF
if ( pjsip_inv_add_ref ( channel - > session - > inv_session ) ! = PJ_SUCCESS ) {
ast_log ( LOG_ERROR , " Can't increase the session reference counter \n " ) ;
ao2_cleanup ( channel - > session ) ;
SCOPE_EXIT_RTN_VALUE ( - 1 , " Couldn't increase the session reference counter \n " ) ;
SCOPE_EXIT_LOG_RTN_VALUE ( - 1 , LOG_ERROR , " %s: Couldn't increase the session reference counter \n " ,
ast_channel_name ( ast ) ) ;
}
# endif
if ( ast_sip_push_task ( channel - > session - > serializer , update_connected_line_information , channel - > session ) ) {
@ -1847,6 +1861,8 @@ static int chan_pjsip_indicate(struct ast_channel *ast, int condition, const voi
break ;
case AST_CONTROL_STREAM_TOPOLOGY_REQUEST_CHANGE :
topology = data ;
ast_trace ( - 1 , " %s: New topology: %s \n " , ast_channel_name ( ast ) ,
ast_str_tmp ( 256 , ast_stream_topology_to_str ( topology , & STR_TMP ) ) ) ;
res = handle_topology_request_change ( channel - > session , topology ) ;
break ;
case AST_CONTROL_STREAM_TOPOLOGY_CHANGED :
@ -1866,18 +1882,17 @@ static int chan_pjsip_indicate(struct ast_channel *ast, int condition, const voi
struct indicate_data * ind_data = indicate_data_alloc ( channel - > session , condition , response_code , data , datalen ) ;
if ( ! ind_data ) {
SCOPE_EXIT_ RTN_VALUE( - 1 , " Couldn't create indicate data \n " ) ;
SCOPE_EXIT_ LOG_ RTN_VALUE( - 1 , LOG_ERROR , " %s: Couldn't alloc indicate data \n " , ast_channel_name ( ast ) ) ;
}
# ifdef HAVE_PJSIP_INV_SESSION_REF
if ( pjsip_inv_add_ref ( ind_data - > session - > inv_session ) ! = PJ_SUCCESS ) {
ast_log ( LOG_ERROR , " Can't increase the session reference counter \n " ) ;
ao2_cleanup ( ind_data ) ;
SCOPE_EXIT_ RTN_VALUE( - 1 , " Couldn't increase the session reference counter\n " ) ;
SCOPE_EXIT_ LOG_ RTN_VALUE( - 1 , LOG_ERROR , " %s: Couldn't increase the session reference counter\n " , ast_channel_name ( ast ) ) ;
}
# endif
if ( ast_sip_push_task ( channel - > session - > serializer , indicate , ind_data ) ) {
ast_log ( LOG_ NOTICE, " Cannot send response code %d to endpoint %s. Could not queue task properly\n " ,
response_code , ast_sorcery_object_get_id ( channel - > session - > endpoint ) ) ;
ast_log ( LOG_ ERROR, " %s: Cannot send response code %d to endpoint %s. Could not queue task properly\n " ,
ast_channel_name ( ast ) , response_code , ast_sorcery_object_get_id ( channel - > session - > endpoint ) ) ;
# ifdef HAVE_PJSIP_INV_SESSION_REF
pjsip_inv_dec_ref ( ind_data - > session - > inv_session ) ;
# endif
@ -1886,7 +1901,7 @@ static int chan_pjsip_indicate(struct ast_channel *ast, int condition, const voi
}
}
SCOPE_EXIT_RTN_VALUE ( res , " RC: %d\n " , res ) ;
SCOPE_EXIT_RTN_VALUE ( res , " %s\n " , ast_channel_name ( ast ) ) ;
}
struct transfer_data {
@ -3079,10 +3094,10 @@ static int chan_pjsip_incoming_request(struct ast_sip_session *session, struct p
RAII_VAR ( struct ast_datastore * , datastore , NULL , ao2_cleanup ) ;
struct transport_info_data * transport_data ;
pjsip_tx_data * packet = NULL ;
SCOPE_ENTER ( 1 , " %s \n " , ast_sip_session_get_name ( session ) ) ;
SCOPE_ENTER ( 3 , " %s \n " , ast_sip_session_get_name ( session ) ) ;
if ( session - > channel ) {
SCOPE_EXIT_RTN_VALUE ( 0 , " Already have channel\n " ) ;
SCOPE_EXIT_RTN_VALUE ( 0 , " %s: No channel\n " , ast_sip_session_get_name ( session ) ) ;
}
/* Check for a to-tag to determine if this is a reinvite */
@ -3098,17 +3113,17 @@ static int chan_pjsip_incoming_request(struct ast_sip_session *session, struct p
*/
session - > defer_terminate = 0 ;
ast_sip_session_terminate ( session , 400 ) ;
SCOPE_EXIT_RTN_VALUE ( - 1 , " Reinvite without channel\n " ) ;
SCOPE_EXIT_RTN_VALUE ( - 1 , " %s: We have a To tag but no channel. Terminating session\n " , ast_sip_session_get_name ( session ) ) ;
}
datastore = ast_sip_session_alloc_datastore ( & transport_info , " transport_info " ) ;
if ( ! datastore ) {
SCOPE_EXIT_ RTN_VALUE( - 1 , " Couldn't create datastore \n " ) ;
SCOPE_EXIT_ LOG_ RTN_VALUE( - 1 , LOG_ERROR , " %s: Couldn't alloc transport_info datastore \n " , ast_sip_session_get_name ( session ) ) ;
}
transport_data = ast_calloc ( 1 , sizeof ( * transport_data ) ) ;
if ( ! transport_data ) {
SCOPE_EXIT_ RTN_VALUE( - 1 , " Couldn't create transport_data \n " ) ;
SCOPE_EXIT_ LOG_ RTN_VALUE( - 1 , LOG_ERROR , " %s: Couldn't alloc transport_info \n " , ast_sip_session_get_name ( session ) ) ;
}
pj_sockaddr_cp ( & transport_data - > local_addr , & rdata - > tp_info . transport - > local_addr ) ;
pj_sockaddr_cp ( & transport_data - > remote_addr , & rdata - > pkt_info . src_addr ) ;
@ -3121,12 +3136,12 @@ static int chan_pjsip_incoming_request(struct ast_sip_session *session, struct p
ast_sip_session_send_response ( session , packet ) ;
}
ast_log( LOG_ERROR , " Failed to allocate new PJSIP channel on incoming SIP INVITE\n " );
SCOPE_EXIT_RTN_VALUE ( - 1 , " Couldn't create channel \n " ) ;
SCOPE_EXIT_LOG_RTN_VALUE( - 1 , LOG_ERROR , " %s: Failed to allocate new PJSIP channel on incoming SIP INVITE\n " ,
ast_sip_session_get_name ( session ) ) ;
}
/* channel gets created on incoming request, but we wait to call start
so other supplements have a chance to run */
SCOPE_EXIT_RTN_VALUE ( 0 );
SCOPE_EXIT_RTN_VALUE ( 0 , " %s \n " , ast_sip_session_get_name ( session ) );
}
static int call_pickup_incoming_request ( struct ast_sip_session * session , pjsip_rx_data * rdata )
@ -3225,11 +3240,10 @@ static void chan_pjsip_incoming_response(struct ast_sip_session *session, struct
struct pjsip_status_line status = rdata - > msg_info . msg - > line . status ;
struct ast_control_pvt_cause_code * cause_code ;
int data_size = sizeof ( * cause_code ) ;
SCOPE_ENTER ( 1 , " %s Method: %.*s Status: %d \n " , ast_sip_session_get_name ( session ) ,
( int ) rdata - > msg_info . cseq - > method . name . slen , rdata - > msg_info . cseq - > method . name . ptr , status . code ) ;
SCOPE_ENTER ( 3 , " %s: Status: %d \n " , ast_sip_session_get_name ( session ) , status . code ) ;
if ( ! session - > channel ) {
SCOPE_EXIT_RTN ( " No channel\n " ) ;
SCOPE_EXIT_RTN ( " %s: No channel\n " , ast_sip_session_get_name ( session ) ) ;
}
/* Build and send the tech-specific cause information */
@ -3249,8 +3263,7 @@ static void chan_pjsip_incoming_response(struct ast_sip_session *session, struct
switch ( status . code ) {
case 180 :
ast_trace ( 1 , " %s Method: %.*s Status: %d Queueing RINGING \n " , ast_sip_session_get_name ( session ) ,
( int ) rdata - > msg_info . cseq - > method . name . slen , rdata - > msg_info . cseq - > method . name . ptr , status . code ) ;
ast_trace ( - 1 , " %s: Queueing RINGING \n " , ast_sip_session_get_name ( session ) ) ;
ast_queue_control ( session - > channel , AST_CONTROL_RINGING ) ;
ast_channel_lock ( session - > channel ) ;
if ( ast_channel_state ( session - > channel ) ! = AST_STATE_UP ) {
@ -3259,6 +3272,7 @@ static void chan_pjsip_incoming_response(struct ast_sip_session *session, struct
ast_channel_unlock ( session - > channel ) ;
break ;
case 183 :
ast_trace ( - 1 , " %s: Queueing PROGRESS \n " , ast_sip_session_get_name ( session ) ) ;
if ( session - > endpoint - > ignore_183_without_sdp ) {
pjsip_rdata_sdp_info * sdp = pjsip_rdata_get_sdp_info ( rdata ) ;
if ( sdp & & sdp - > body . ptr ) {
@ -3273,34 +3287,28 @@ static void chan_pjsip_incoming_response(struct ast_sip_session *session, struct
}
break ;
case 200 :
ast_trace ( 1 , " %s Method: %.*s Status: %d Queueing ANSWER \n " , ast_sip_session_get_name ( session ) ,
( int ) rdata - > msg_info . cseq - > method . name . slen , rdata - > msg_info . cseq - > method . name . ptr , status . code ) ;
ast_trace ( - 1 , " %s: Queueing ANSWER \n " , ast_sip_session_get_name ( session ) ) ;
ast_queue_control ( session - > channel , AST_CONTROL_ANSWER ) ;
break ;
default :
ast_trace ( 1 , " %s Method: %.*s Status: %d Ignored \n " , ast_sip_session_get_name ( session ) ,
( int ) rdata - > msg_info . cseq - > method . name . slen , rdata - > msg_info . cseq - > method . name . ptr , status . code ) ;
ast_trace ( - 1 , " %s: Not queueing anything \n " , ast_sip_session_get_name ( session ) ) ;
break ;
}
SCOPE_EXIT_RTN ( ) ;
SCOPE_EXIT_RTN ( " %s \n " , ast_sip_session_get_name ( session ) ) ;
}
static int chan_pjsip_incoming_ack ( struct ast_sip_session * session , struct pjsip_rx_data * rdata )
{
SCOPE_ENTER ( 1 , " %s Method: %.*s Status: %d After Media \n " , ast_sip_session_get_name ( session ) ,
( int ) rdata - > msg_info . cseq - > method . name . slen , rdata - > msg_info . cseq - > method . name . ptr ,
rdata - > msg_info . msg - > line . status . code ) ;
SCOPE_ENTER ( 3 , " %s \n " , ast_sip_session_get_name ( session ) ) ;
if ( rdata - > msg_info . msg - > line . req . method . id = = PJSIP_ACK_METHOD ) {
if ( session - > endpoint - > media . direct_media . enabled & & session - > channel ) {
ast_trace ( 1 , " %s Method: %.*s Queueing SRCCHANGE \n " , ast_sip_session_get_name ( session ) ,
( int ) rdata - > msg_info . cseq - > method . name . slen , rdata - > msg_info . cseq - > method . name . ptr ) ;
ast_trace ( - 1 , " %s: Queueing SRCCHANGE \n " , ast_sip_session_get_name ( session ) ) ;
ast_queue_control ( session - > channel , AST_CONTROL_SRCCHANGE ) ;
}
}
SCOPE_EXIT_RTN_VALUE ( 0 );
SCOPE_EXIT_RTN_VALUE ( 0 , " %s \n " , ast_sip_session_get_name ( session ) );
}
static int update_devstate ( void * obj , void * arg , int flags )