summaryrefslogtreecommitdiff
path: root/channels
diff options
context:
space:
mode:
authorJoshua Colp <jcolp@digium.com>2016-07-07 12:38:45 -0300
committerJoshua Colp <jcolp@digium.com>2016-07-07 13:00:07 -0300
commit77b0145a25aa8c5d4b5c5de27150faf8f3a19eb5 (patch)
treead1bec4169e92a6aeee75fe289b90b8e5220fb5b /channels
parentac6824e4c32c49b8943fca85b318892ab4bb8df3 (diff)
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
Diffstat (limited to 'channels')
-rw-r--r--channels/chan_sip.c3
1 files changed, 2 insertions, 1 deletions
diff --git a/channels/chan_sip.c b/channels/chan_sip.c
index a5aa6c3d3..7d4cf8722 100644
--- a/channels/chan_sip.c
+++ b/channels/chan_sip.c
@@ -7665,7 +7665,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);