@ -1403,12 +1403,11 @@ struct ast_sip_channel_pvt *ast_sip_channel_pvt_alloc(void *pvt, struct ast_sip_
}
struct ast_sip_session * ast_sip_session_alloc ( struct ast_sip_endpoint * endpoint ,
struct ast_sip_contact * contact , pjsip_inv_session * inv_session )
struct ast_sip_contact * contact , pjsip_inv_session * inv_session , pjsip_rx_data * rdata )
{
RAII_VAR ( struct ast_sip_session * , session , NULL , ao2_cleanup ) ;
struct ast_sip_session_supplement * iter ;
int dsp_features = 0 ;
char tps_name [ AST_TASKPROCESSOR_MAX_NAME + 1 ] ;
session = ao2_alloc ( sizeof ( * session ) , session_destructor ) ;
if ( ! session ) {
@ -1429,11 +1428,24 @@ struct ast_sip_session *ast_sip_session_alloc(struct ast_sip_endpoint *endpoint,
/* fill session->media with available types */
ao2_callback ( sdp_handlers , OBJ_NODATA , add_session_media , session ) ;
/* Create name with seq number appended. */
ast_taskprocessor_build_name ( tps_name , sizeof ( tps_name ) , " pjsip/session/%s " ,
ast_sorcery_object_get_id ( endpoint ) ) ;
if ( rdata ) {
/*
* We must continue using the serializer that the original
* INVITE came in on for the dialog . There may be
* retransmissions already enqueued in the original
* serializer that can result in reentrancy and message
* sequencing problems .
*/
session - > serializer = ast_sip_get_distributor_serializer ( rdata ) ;
} else {
char tps_name [ AST_TASKPROCESSOR_MAX_NAME + 1 ] ;
session - > serializer = ast_sip_create_serializer ( tps_name ) ;
/* Create name with seq number appended. */
ast_taskprocessor_build_name ( tps_name , sizeof ( tps_name ) , " pjsip/outsess/%s " ,
ast_sorcery_object_get_id ( endpoint ) ) ;
session - > serializer = ast_sip_create_serializer ( tps_name ) ;
}
if ( ! session - > serializer ) {
return NULL ;
}
@ -1731,7 +1743,9 @@ struct ast_sip_session *ast_sip_session_create_outgoing(struct ast_sip_endpoint
timer . sess_expires = endpoint - > extensions . timer . sess_expires ;
pjsip_timer_init_session ( inv_session , & timer ) ;
if ( ! ( session = ast_sip_session_alloc ( endpoint , found_contact ? found_contact : contact , inv_session ) ) ) {
session = ast_sip_session_alloc ( endpoint , found_contact ? found_contact : contact ,
inv_session , NULL ) ;
if ( ! session ) {
pjsip_inv_terminate ( inv_session , 500 , PJ_FALSE ) ;
return NULL ;
}
@ -2142,7 +2156,7 @@ static void handle_new_invite_request(pjsip_rx_data *rdata)
return ;
}
session = ast_sip_session_alloc ( endpoint , NULL , inv_session );
session = ast_sip_session_alloc ( endpoint , NULL , inv_session , rdata );
if ( ! session ) {
if ( pjsip_inv_initial_answer ( inv_session , rdata , 500 , NULL , NULL , & tdata ) = = PJ_SUCCESS ) {
pjsip_inv_terminate ( inv_session , 500 , PJ_FALSE ) ;