From: Joshua Colp Date: Thu, 7 Jul 2016 15:38:45 +0000 (-0300) Subject: chan_sip/res_pjsip_t38: Handle a request to negotiate T.38 after it is enabled. X-Git-Tag: certified/13.1-cert8~6 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=690e23433b4accc422afdf28bb00d062a0d4d797;p=thirdparty%2Fasterisk.git chan_sip/res_pjsip_t38: Handle a request to negotiate T.38 after it is enabled. Some T.38 implementations may send another re-invite after the initial one which adds additional negotiation details (such as the max bitrate). Currently this will fail when passthrough is being done in chan_sip as we do nothing if T.38 is already active. Other handlers of T.38 inside of Asterisk (such as res_fax) handle this scenario so this change adds support for it to chan_sip and res_pjsip_t38. If a request to negotiate is received while T.38 is already enabled a new re-INVITE is sent and negotiation is done again. ASTERISK-26179 #close Change-Id: I0298494d3da6df3219bbfa4be9aa04015043145c --- diff --git a/channels/chan_sip.c b/channels/chan_sip.c index b86493697e..836aa67ca7 100644 --- a/channels/chan_sip.c +++ b/channels/chan_sip.c @@ -7533,7 +7533,8 @@ static int interpret_t38_parameters(struct sip_pvt *p, const struct ast_control_ ast_udptl_set_local_max_ifp(p->udptl, p->t38.our_parms.max_ifp); change_t38_state(p, T38_ENABLED); transmit_response_with_t38_sdp(p, "200 OK", &p->initreq, XMIT_CRITICAL); - } else if (p->t38.state != T38_ENABLED) { + } else if ((p->t38.state != T38_ENABLED) || ((p->t38.state == T38_ENABLED) && + (parameters->request_response == AST_T38_REQUEST_NEGOTIATE))) { p->t38.our_parms = *parameters; ast_udptl_set_local_max_ifp(p->udptl, p->t38.our_parms.max_ifp); change_t38_state(p, T38_LOCAL_REINVITE); diff --git a/res/res_pjsip_t38.c b/res/res_pjsip_t38.c index f47a29aaa6..e117e47fc2 100644 --- a/res/res_pjsip_t38.c +++ b/res/res_pjsip_t38.c @@ -348,7 +348,9 @@ static int t38_interpret_parameters(void *obj) ast_udptl_set_local_max_ifp(session_media->udptl, state->our_parms.max_ifp); t38_change_state(data->session, session_media, state, T38_ENABLED); ast_sip_session_resume_reinvite(data->session); - } else if (data->session->t38state != T38_ENABLED) { + } else if ((data->session->t38state != T38_ENABLED) || + ((data->session->t38state == T38_ENABLED) && + (parameters->request_response == AST_T38_REQUEST_NEGOTIATE))) { if (t38_initialize_session(data->session, session_media)) { break; }