mirror of
https://github.com/asterisk/asterisk.git
synced 2025-09-03 11:25:35 +00:00
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
This commit is contained in:
@@ -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);
|
||||
|
Reference in New Issue
Block a user