@ -1229,10 +1229,9 @@ static void subscription_setup_dialog(struct sip_subscription_tree *sub_tree, pj
pjsip_dlg_inc_session ( dlg , & pubsub_module ) ;
pjsip_dlg_inc_session ( dlg , & pubsub_module ) ;
}
}
static struct sip_subscription_tree * allocate_subscription_tree ( struct ast_sip_endpoint * endpoint )
static struct sip_subscription_tree * allocate_subscription_tree ( struct ast_sip_endpoint * endpoint , pjsip_rx_data * rdata )
{
{
struct sip_subscription_tree * sub_tree ;
struct sip_subscription_tree * sub_tree ;
char tps_name [ AST_TASKPROCESSOR_MAX_NAME + 1 ] ;
sub_tree = ao2_alloc ( sizeof * sub_tree , subscription_tree_destructor ) ;
sub_tree = ao2_alloc ( sizeof * sub_tree , subscription_tree_destructor ) ;
if ( ! sub_tree ) {
if ( ! sub_tree ) {
@ -1241,11 +1240,24 @@ static struct sip_subscription_tree *allocate_subscription_tree(struct ast_sip_e
ast_module_ref ( ast_module_info - > self ) ;
ast_module_ref ( ast_module_info - > self ) ;
/* Create name with seq number appended. */
if ( rdata ) {
ast_taskprocessor_build_name ( tps_name , sizeof ( tps_name ) , " pjsip/pubsub/%s " ,
/*
ast_sorcery_object_get_id ( endpoint ) ) ;
* We must continue using the serializer that the original
* SUBSCRIBE 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 .
*/
sub_tree - > serializer = ast_sip_get_distributor_serializer ( rdata ) ;
} else {
char tps_name [ AST_TASKPROCESSOR_MAX_NAME + 1 ] ;
/* Create name with seq number appended. */
ast_taskprocessor_build_name ( tps_name , sizeof ( tps_name ) , " pjsip/pubsub/%s " ,
ast_sorcery_object_get_id ( endpoint ) ) ;
sub_tree - > serializer = ast_sip_create_serializer_named ( tps_name ) ;
sub_tree - > serializer = ast_sip_create_serializer_named ( tps_name ) ;
}
if ( ! sub_tree - > serializer ) {
if ( ! sub_tree - > serializer ) {
ao2_ref ( sub_tree , - 1 ) ;
ao2_ref ( sub_tree , - 1 ) ;
return NULL ;
return NULL ;
@ -1286,7 +1298,7 @@ static struct sip_subscription_tree *create_subscription_tree(const struct ast_s
pjsip_dialog * dlg ;
pjsip_dialog * dlg ;
struct subscription_persistence * persistence ;
struct subscription_persistence * persistence ;
sub_tree = allocate_subscription_tree ( endpoint );
sub_tree = allocate_subscription_tree ( endpoint , rdata );
if ( ! sub_tree ) {
if ( ! sub_tree ) {
* dlg_status = PJ_ENOMEM ;
* dlg_status = PJ_ENOMEM ;
return NULL ;
return NULL ;
@ -1593,7 +1605,7 @@ struct ast_sip_subscription *ast_sip_create_subscription(const struct ast_sip_su
pjsip_evsub * evsub ;
pjsip_evsub * evsub ;
struct sip_subscription_tree * sub_tree = NULL ;
struct sip_subscription_tree * sub_tree = NULL ;
sub_tree = allocate_subscription_tree ( endpoint );
sub_tree = allocate_subscription_tree ( endpoint , NULL );
if ( ! sub_tree ) {
if ( ! sub_tree ) {
return NULL ;
return NULL ;
}
}