]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
res_pjsip_refer: ensure refer progress is still sent after Proceeding()
authorlvl <digium@lvlconsultancy.nl>
Tue, 3 Mar 2020 16:57:27 +0000 (16:57 +0000)
committerKevin Harwell <kharwell@digium.com>
Wed, 4 Mar 2020 19:04:02 +0000 (13:04 -0600)
ASTERISK-28766 #close

Change-Id: I5ce2210062f9325db762edbf6e46075079bb2cd1

res/res_pjsip_refer.c

index 3c73801e8ba6a58541c93d7ef96180efb9cd1159..1282d227d6b423e09a6cced5e4aed0d4b9a6fa58 100644 (file)
@@ -233,11 +233,12 @@ static struct ast_frame *refer_progress_framehook(struct ast_channel *chan, stru
        /* Determine the state of the REFER based on the control frames (or voice frames) passing */
        if (f->frametype == AST_FRAME_VOICE && !progress->subclass) {
                /* Media is passing without progress, this means the call has been answered */
+               progress->subclass = AST_CONTROL_ANSWER;
                notification = refer_progress_notification_alloc(progress, 200, PJSIP_EVSUB_STATE_TERMINATED);
        } else if (f->frametype == AST_FRAME_CONTROL) {
                /* Based on the control frame being written we can send a NOTIFY advising of the progress */
                if ((f->subclass.integer == AST_CONTROL_RING) || (f->subclass.integer == AST_CONTROL_RINGING)) {
-                       progress->subclass = f->subclass.integer;
+                       /* Don't set progress->subclass; an ANSWER can still follow */
                        notification = refer_progress_notification_alloc(progress, 180, PJSIP_EVSUB_STATE_ACTIVE);
                } else if (f->subclass.integer == AST_CONTROL_BUSY) {
                        progress->subclass = f->subclass.integer;
@@ -246,10 +247,10 @@ static struct ast_frame *refer_progress_framehook(struct ast_channel *chan, stru
                        progress->subclass = f->subclass.integer;
                        notification = refer_progress_notification_alloc(progress, 503, PJSIP_EVSUB_STATE_TERMINATED);
                } else if (f->subclass.integer == AST_CONTROL_PROGRESS) {
-                       progress->subclass = f->subclass.integer;
+                       /* Don't set progress->subclass; an ANSWER can still follow */
                        notification = refer_progress_notification_alloc(progress, 183, PJSIP_EVSUB_STATE_ACTIVE);
                } else if (f->subclass.integer == AST_CONTROL_PROCEEDING) {
-                       progress->subclass = f->subclass.integer;
+                       /* Don't set progress->subclass; an ANSWER can still follow */
                        notification = refer_progress_notification_alloc(progress, 100, PJSIP_EVSUB_STATE_ACTIVE);
                } else if (f->subclass.integer == AST_CONTROL_ANSWER) {
                        progress->subclass = f->subclass.integer;