summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Michelson <mmichelson@digium.com>2013-10-15 15:26:06 +0000
committerMark Michelson <mmichelson@digium.com>2013-10-15 15:26:06 +0000
commit2c927b871f570c9724f9957fb17d961ee9ecb45c (patch)
treea46b8cb85a6679fe04d2f2ff0b21b4e6980a40cc
parent55e15a2cc92b9c90dbe0d97d20e5a89430016deb (diff)
Prevent chan_sip from sending duplicate BYEs.
When a 200 OK for an initial INVITE is received, we were doing the right thing by ACKing and sending an immediate BYE. However, we also were doing the wrong thing and queuing an answer frame, thus causing the call to be answered. This would cause the call to be hung up by the channel thread, thus resulting in a second BYE being sent out. In this fix, I also have set the hangupcause to be correct since the initial BYE being sent by Asterisk had an unknown hangup cause. I have changed to using "Bearer capabilty not available" since the call was hung up due to an SDP offer/answer error. (closes issue ASTERISK-22621) reported by Kinsey Moore ........ Merged revisions 400970 from http://svn.asterisk.org/svn/asterisk/branches/1.8 ........ Merged revisions 400971 from http://svn.asterisk.org/svn/asterisk/branches/11 ........ Merged revisions 400984 from http://svn.asterisk.org/svn/asterisk/branches/12 git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@400998 65c4cc65-6c06-0410-ace0-fbb531ad65f3
-rw-r--r--channels/chan_sip.c8
1 files changed, 6 insertions, 2 deletions
diff --git a/channels/chan_sip.c b/channels/chan_sip.c
index b1caa1f05..44077ab71 100644
--- a/channels/chan_sip.c
+++ b/channels/chan_sip.c
@@ -23261,12 +23261,16 @@ static void handle_response_invite(struct sip_pvt *p, int resp, const char *rest
}
p->authtries = 0;
if (find_sdp(req)) {
- if ((res = process_sdp(p, req, SDP_T38_ACCEPT)) && !req->ignore)
+ if ((res = process_sdp(p, req, SDP_T38_ACCEPT)) && !req->ignore) {
if (!reinvite) {
/* This 200 OK's SDP is not acceptable, so we need to ack, then hangup */
/* For re-invites, we try to recover */
ast_set_flag(&p->flags[0], SIP_PENDINGBYE);
+ ast_channel_hangupcause_set(p->owner, AST_CAUSE_BEARERCAPABILITY_NOTAVAIL);
+ p->hangupcause = AST_CAUSE_BEARERCAPABILITY_NOTAVAIL;
+ sip_queue_hangup_cause(p, AST_CAUSE_BEARERCAPABILITY_NOTAVAIL);
}
+ }
ast_rtp_instance_activate(p->rtp);
} else if (!reinvite) {
struct ast_sockaddr remote_address = {{0,}};
@@ -23336,7 +23340,7 @@ static void handle_response_invite(struct sip_pvt *p, int resp, const char *rest
}
if (!req->ignore && p->owner) {
- if (!reinvite) {
+ if (!reinvite && !res) {
ast_queue_control(p->owner, AST_CONTROL_ANSWER);
} else { /* RE-invite */
if (p->t38.state == T38_DISABLED || p->t38.state == T38_REJECTED) {