diff --git a/UPGRADE.txt b/UPGRADE.txt index d25bf55d824d7f5363691736c785ba5f2922138b..4dab291215c9f341de2c97fc3130f60e576935b6 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 086913b41e1d493d3906b26fb7282ed950041567..f76963b3974302045ecd0a687b2e68a67944f3fa 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 {