]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
bridging: Ensure successful T.38 negotation
authorTorrey Searle <torrey@voxbone.com>
Wed, 5 Apr 2017 11:41:29 +0000 (13:41 +0200)
committerGeorge Joseph <gjoseph@digium.com>
Wed, 12 Apr 2017 12:57:22 +0000 (07:57 -0500)
When a T.38 happens immediatly after call establishment, the control
frame can be lost because the other leg is not yet in the bridge.

This patch detects this case an makes sure T.38 negotation happens
when the 2nd leg is being made compatible with the negotating
first leg

ASTERISK-26923 #close

Change-Id: If334125ee61ed63550d242fc9efe7987e37e1d94

bridges/bridge_simple.c

index 35544f84fac1e7535e773d8fb8beaf187a737e88..158c443537a1ea5a863c8d39e8ec6ecb53a06b2f 100644 (file)
@@ -56,6 +56,19 @@ static int simple_bridge_join(struct ast_bridge *bridge, struct ast_bridge_chann
                return 0;
        }
 
+       /* Request resend of T.38 negotiation if in progress and the other leg not yet T.38
+        */
+       if (ast_channel_get_t38_state(c0) == T38_STATE_NEGOTIATING && ast_channel_get_t38_state(c1) == T38_STATE_UNKNOWN) {
+               struct ast_control_t38_parameters parameters = { .request_response = AST_T38_REQUEST_PARMS, };
+               ast_debug(3, "Sending T.38 param renegotiation to first channel %s.\n", ast_channel_name(c0));
+               ast_indicate_data(c0, AST_CONTROL_T38_PARAMETERS, &parameters, sizeof(parameters));
+       }
+       if (ast_channel_get_t38_state(c1) == T38_STATE_NEGOTIATING && ast_channel_get_t38_state(c0) == T38_STATE_UNKNOWN) {
+               struct ast_control_t38_parameters parameters = { .request_response = AST_T38_REQUEST_PARMS, };
+               ast_debug(3, "Sending T.38 param renegotiation to second channel %s.\n", ast_channel_name(c1));
+               ast_indicate_data(c1, AST_CONTROL_T38_PARAMETERS, &parameters, sizeof(parameters));
+       }
+
        return ast_channel_make_compatible(c0, c1);
 }