From 98da1971e3342a63be22b32137089e802f2c8af6 Mon Sep 17 00:00:00 2001 From: George Joseph Date: Thu, 7 Jun 2018 07:46:03 -0600 Subject: [PATCH] chan_pjsip: Register for "BEFORE_MEDIA" responses chan_pjsip wasn't registering for "BEFORE_MEDIA" responses which meant it was not updating HANGUPCAUSE for 4XX responses. If the remote end sent a "180 Ringing", then a "486 Busy", the hangup cause was left at "180 Normal Clearing". * Removed chan_pjsip_incoming_response from the original session supplement (which was handling only "AFTER MEDIA") and added it to a new session supplement which accepts both "BEFORE_MEDIA" and "AFTER_MEDIA". * Also cleaned up some cleanup code in load module. ASTERISK-27902 Change-Id: If9b860541887aca8ac2c9f2ed51ceb0550fb007a --- channels/chan_pjsip.c | 30 +++++++++++++++++++----------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/channels/chan_pjsip.c b/channels/chan_pjsip.c index c7344d2c69..4da0361f1d 100644 --- a/channels/chan_pjsip.c +++ b/channels/chan_pjsip.c @@ -147,11 +147,18 @@ static struct ast_sip_session_supplement chan_pjsip_supplement = { .session_begin = chan_pjsip_session_begin, .session_end = chan_pjsip_session_end, .incoming_request = chan_pjsip_incoming_request, - .incoming_response = chan_pjsip_incoming_response, /* It is important that this supplement runs after media has been negotiated */ .response_priority = AST_SIP_SESSION_AFTER_MEDIA, }; +/*! \brief SIP session supplement structure just for responses */ +static struct ast_sip_session_supplement chan_pjsip_supplement_response = { + .method = "INVITE", + .priority = AST_SIP_SUPPLEMENT_PRIORITY_CHANNEL, + .incoming_response = chan_pjsip_incoming_response, + .response_priority = AST_SIP_SESSION_BEFORE_MEDIA | AST_SIP_SESSION_AFTER_MEDIA, +}; + static int chan_pjsip_incoming_ack(struct ast_sip_session *session, struct pjsip_rx_data *rdata); static struct ast_sip_session_supplement chan_pjsip_ack_supplement = { @@ -2837,6 +2844,11 @@ static int load_module(void) goto end; } + if (ast_sip_session_register_supplement(&chan_pjsip_supplement_response)) { + ast_log(LOG_ERROR, "Unable to register PJSIP supplement\n"); + goto end; + } + if (!(pjsip_uids_onhold = ao2_container_alloc_hash(AO2_ALLOC_OPT_LOCK_RWLOCK, AO2_CONTAINER_ALLOC_OPT_DUPS_REJECT, 37, uid_hold_hash_fn, uid_hold_sort_fn, NULL))) { @@ -2846,31 +2858,21 @@ static int load_module(void) if (ast_sip_session_register_supplement(&call_pickup_supplement)) { ast_log(LOG_ERROR, "Unable to register PJSIP call pickup supplement\n"); - ast_sip_session_unregister_supplement(&chan_pjsip_supplement); goto end; } if (ast_sip_session_register_supplement(&pbx_start_supplement)) { ast_log(LOG_ERROR, "Unable to register PJSIP pbx start supplement\n"); - ast_sip_session_unregister_supplement(&chan_pjsip_supplement); - ast_sip_session_unregister_supplement(&call_pickup_supplement); goto end; } if (ast_sip_session_register_supplement(&chan_pjsip_ack_supplement)) { ast_log(LOG_ERROR, "Unable to register PJSIP ACK supplement\n"); - ast_sip_session_unregister_supplement(&pbx_start_supplement); - ast_sip_session_unregister_supplement(&chan_pjsip_supplement); - ast_sip_session_unregister_supplement(&call_pickup_supplement); goto end; } if (pjsip_channel_cli_register()) { ast_log(LOG_ERROR, "Unable to register PJSIP Channel CLI\n"); - ast_sip_session_unregister_supplement(&chan_pjsip_ack_supplement); - ast_sip_session_unregister_supplement(&pbx_start_supplement); - ast_sip_session_unregister_supplement(&chan_pjsip_supplement); - ast_sip_session_unregister_supplement(&call_pickup_supplement); goto end; } @@ -2886,6 +2888,11 @@ static int load_module(void) end: ao2_cleanup(pjsip_uids_onhold); pjsip_uids_onhold = NULL; + ast_sip_session_unregister_supplement(&chan_pjsip_ack_supplement); + ast_sip_session_unregister_supplement(&pbx_start_supplement); + ast_sip_session_unregister_supplement(&chan_pjsip_supplement_response); + ast_sip_session_unregister_supplement(&chan_pjsip_supplement); + ast_sip_session_unregister_supplement(&call_pickup_supplement); ast_custom_function_unregister(&dtmf_mode_function); ast_custom_function_unregister(&media_offer_function); ast_custom_function_unregister(&chan_pjsip_dial_contacts_function); @@ -2904,6 +2911,7 @@ static int unload_module(void) pjsip_channel_cli_unregister(); + ast_sip_session_unregister_supplement(&chan_pjsip_supplement_response); ast_sip_session_unregister_supplement(&chan_pjsip_supplement); ast_sip_session_unregister_supplement(&pbx_start_supplement); ast_sip_session_unregister_supplement(&chan_pjsip_ack_supplement);