res_pjsip_rfc3326: Prefer Q.850 cause code over SIP.

Resolves: #116
This commit is contained in:
Sean Bright 2023-06-12 11:31:33 -04:00 committed by asterisk-org-access-app[bot]
parent 492638409c
commit 153095dd91
1 changed files with 11 additions and 19 deletions

View File

@ -40,37 +40,29 @@ static void rfc3326_use_reason_header(struct ast_sip_session *session, struct pj
pjsip_generic_string_hdr *header; pjsip_generic_string_hdr *header;
char buf[20]; char buf[20];
char *cause; char *cause;
char *text; int code_q850 = 0, code_sip = 0;
int code;
int cause_q850, cause_sip;
header = pjsip_msg_find_hdr_by_name(rdata->msg_info.msg, &str_reason, NULL); header = pjsip_msg_find_hdr_by_name(rdata->msg_info.msg, &str_reason, NULL);
for (; header; for (; header;
header = pjsip_msg_find_hdr_by_name(rdata->msg_info.msg, &str_reason, header->next)) { header = pjsip_msg_find_hdr_by_name(rdata->msg_info.msg, &str_reason, header->next)) {
int cause_q850, cause_sip;
ast_copy_pj_str(buf, &header->hvalue, sizeof(buf)); ast_copy_pj_str(buf, &header->hvalue, sizeof(buf));
cause = ast_skip_blanks(buf); cause = ast_skip_blanks(buf);
cause_q850 = !strncasecmp(cause, "Q.850", 5); cause_q850 = !strncasecmp(cause, "Q.850", 5);
cause_sip = !strncasecmp(cause, "SIP", 3); cause_sip = !strncasecmp(cause, "SIP", 3);
if ((cause_q850 || cause_sip) && (cause = strstr(cause, "cause="))) { if ((cause_q850 || cause_sip) && (cause = strstr(cause, "cause="))) {
/* If text is present get rid of it */ int *code = cause_q850 ? &code_q850 : &code_sip;
if ((text = strchr(cause, ';'))) { if (sscanf(cause, "cause=%30d", code) != 1) {
*text = '\0'; *code = 0;
} }
}
}
if (sscanf(cause, "cause=%30d", &code) != 1) { if (code_q850) {
continue; ast_channel_hangupcause_set(session->channel, code_q850 & 0x7f);
} } else if (code_sip) {
} else { ast_channel_hangupcause_set(session->channel, ast_sip_hangup_sip2cause(code_sip));
continue;
}
if (cause_q850) {
ast_channel_hangupcause_set(session->channel, code & 0x7f);
break;
} else if (cause_sip) {
ast_channel_hangupcause_set(session->channel, ast_sip_hangup_sip2cause(code));
break;
}
} }
} }