summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--UPGRADE.txt7
-rw-r--r--channels/chan_sip.c35
2 files changed, 34 insertions, 8 deletions
diff --git a/UPGRADE.txt b/UPGRADE.txt
index d25bf55d8..4dab29121 100644
--- a/UPGRADE.txt
+++ b/UPGRADE.txt
@@ -198,6 +198,13 @@ chan_sip:
hash to be specified for the DTLS fingerprint placed in SDP. Supported
values are 'sha-1' and 'sha-256' with 'sha-256' being the default.
+ - The 'progressinband=never' option is now more zealous in the persecution of
+ progress messages coming from Asterisk. Channels bridged with a SIP channel
+ that has 'progressinband=never' set will not be able to forward their
+ progress indications through to the SIP device. chan_sip will now turn such
+ progress indications into a 180 Ringing (if a 180 has not yet been
+ transmitted) if 'progressinband=never'.
+
CLI commands:
- "core show settings" now lists the current console verbosity in addition
to the root console verbosity.
diff --git a/channels/chan_sip.c b/channels/chan_sip.c
index 086913b41..f76963b39 100644
--- a/channels/chan_sip.c
+++ b/channels/chan_sip.c
@@ -7428,8 +7428,11 @@ static int sip_write(struct ast_channel *ast, struct ast_frame *frame)
ast_set_flag(&p->flags[0], SIP_PROGRESS_SENT);
}
}
- p->lastrtptx = time(NULL);
- res = ast_rtp_instance_write(p->rtp, frame);
+ if (p->invitestate > INV_EARLY_MEDIA || (p->invitestate == INV_EARLY_MEDIA &&
+ ast_test_flag(&p->flags[0], SIP_PROGRESS_SENT))) {
+ p->lastrtptx = time(NULL);
+ res = ast_rtp_instance_write(p->rtp, frame);
+ }
}
sip_pvt_unlock(p);
}
@@ -7446,8 +7449,11 @@ static int sip_write(struct ast_channel *ast, struct ast_frame *frame)
transmit_provisional_response(p, "183 Session Progress", &p->initreq, TRUE);
ast_set_flag(&p->flags[0], SIP_PROGRESS_SENT);
}
- p->lastrtptx = time(NULL);
- res = ast_rtp_instance_write(p->vrtp, frame);
+ if (p->invitestate > INV_EARLY_MEDIA || (p->invitestate == INV_EARLY_MEDIA &&
+ ast_test_flag(&p->flags[0], SIP_PROGRESS_SENT))) {
+ p->lastrtptx = time(NULL);
+ res = ast_rtp_instance_write(p->vrtp, frame);
+ }
}
sip_pvt_unlock(p);
}
@@ -7467,8 +7473,11 @@ static int sip_write(struct ast_channel *ast, struct ast_frame *frame)
transmit_provisional_response(p, "183 Session Progress", &p->initreq, TRUE);
ast_set_flag(&p->flags[0], SIP_PROGRESS_SENT);
}
- p->lastrtptx = time(NULL);
- res = ast_rtp_instance_write(p->trtp, frame);
+ if (p->invitestate > INV_EARLY_MEDIA || (p->invitestate == INV_EARLY_MEDIA &&
+ ast_test_flag(&p->flags[0], SIP_PROGRESS_SENT))) {
+ p->lastrtptx = time(NULL);
+ res = ast_rtp_instance_write(p->trtp, frame);
+ }
}
}
sip_pvt_unlock(p);
@@ -7896,8 +7905,14 @@ static int sip_indicate(struct ast_channel *ast, int condition, const void *data
!ast_test_flag(&p->flags[0], SIP_PROGRESS_SENT) &&
!ast_test_flag(&p->flags[0], SIP_OUTGOING)) {
p->invitestate = INV_EARLY_MEDIA;
- transmit_provisional_response(p, "183 Session Progress", &p->initreq, TRUE);
- ast_set_flag(&p->flags[0], SIP_PROGRESS_SENT);
+ /* SIP_PROG_INBAND_NEVER means sending 180 ringing in place of a 183 */
+ if (ast_test_flag(&p->flags[0], SIP_PROG_INBAND) != SIP_PROG_INBAND_NEVER) {
+ transmit_provisional_response(p, "183 Session Progress", &p->initreq, TRUE);
+ ast_set_flag(&p->flags[0], SIP_PROGRESS_SENT);
+ } else if (ast_channel_state(ast) == AST_STATE_RING && !ast_test_flag(&p->flags[0], SIP_RINGING)) {
+ transmit_provisional_response(p, "180 Ringing", &p->initreq, 0);
+ ast_set_flag(&p->flags[0], SIP_RINGING);
+ }
break;
}
res = -1;
@@ -23002,6 +23017,8 @@ static void handle_response_invite(struct sip_pvt *p, int resp, const char *rest
if (!req->ignore && p->owner) {
/* Queue a progress frame only if we have SDP in 180 or 182 */
ast_queue_control(p->owner, AST_CONTROL_PROGRESS);
+ /* We have not sent progress, but we have been sent progress so enable early media */
+ ast_set_flag(&p->flags[0], SIP_PROGRESS_SENT);
}
ast_rtp_instance_activate(p->rtp);
}
@@ -23085,6 +23102,8 @@ static void handle_response_invite(struct sip_pvt *p, int resp, const char *rest
if (!req->ignore && p->owner) {
/* Queue a progress frame */
ast_queue_control(p->owner, AST_CONTROL_PROGRESS);
+ /* We have not sent progress, but we have been sent progress so enable early media */
+ ast_set_flag(&p->flags[0], SIP_PROGRESS_SENT);
}
ast_rtp_instance_activate(p->rtp);
} else {