From 034ac357adeefad2cea9af579be6391ab17866c0 Mon Sep 17 00:00:00 2001 From: Jean Aunis Date: Fri, 22 Nov 2019 15:32:42 +0100 Subject: [PATCH] ARI: Ability to inhibit COLP frames when adding channels to a bridge This patch adds a new flag "inhibitConnectedLineUpdates" to the 'addChannel' operation in the Bridges REST API. When set, this flag avoids generating COLP frames when the specified channels enter the bridge. ASTERISK-28629 Change-Id: Ib995d4f0c6106279aa448b34b042b68f0f2ca5dc --- doc/CHANGES-staging/ari-bridges-inhibit-colp.txt | 5 +++++ include/asterisk/bridge_features.h | 2 ++ include/asterisk/stasis_app.h | 10 ++++++++++ res/ari/resource_bridges.c | 1 + res/ari/resource_bridges.h | 2 ++ res/res_ari_bridges.c | 7 +++++++ res/stasis/control.c | 12 +++++++++++- rest-api/api-docs/bridges.json | 9 +++++++++ 8 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 doc/CHANGES-staging/ari-bridges-inhibit-colp.txt diff --git a/doc/CHANGES-staging/ari-bridges-inhibit-colp.txt b/doc/CHANGES-staging/ari-bridges-inhibit-colp.txt new file mode 100644 index 0000000000..cdc9ffb80a --- /dev/null +++ b/doc/CHANGES-staging/ari-bridges-inhibit-colp.txt @@ -0,0 +1,5 @@ +Subject: ARI + +A new parameter 'inhibitConnectedLineUpdates' is now available in the +'bridges.addChannel' call. This prevents the identity of the newly connected +channel from being presented to other bridge members. diff --git a/include/asterisk/bridge_features.h b/include/asterisk/bridge_features.h index f9af8fbfd9..9b5f70f703 100644 --- a/include/asterisk/bridge_features.h +++ b/include/asterisk/bridge_features.h @@ -277,6 +277,8 @@ struct ast_bridge_features { unsigned int mute:1; /*! TRUE if DTMF should be passed into the bridge tech. */ unsigned int dtmf_passthrough:1; + /*! TRUE to avoid generating COLP frames when joining the bridge */ + unsigned int inhibit_colp:1; }; /*! diff --git a/include/asterisk/stasis_app.h b/include/asterisk/stasis_app.h index 01c7ff4d7c..285d54a089 100644 --- a/include/asterisk/stasis_app.h +++ b/include/asterisk/stasis_app.h @@ -837,6 +837,16 @@ void stasis_app_control_absorb_dtmf_in_bridge( void stasis_app_control_mute_in_bridge( struct stasis_app_control *control, int mute); +/*! + * \since 18 + * \brief Set whether COLP frames should be generated when joining the bridge + * + * \param control Control whose channel should have its COLP frames inhibited when bridged + * \param mute Whether COLP frames should be generated (0) or not (1). + */ +void stasis_app_control_inhibit_colp_in_bridge( + struct stasis_app_control *control, int inhibit_colp); + /*! * \since 12 * \brief Gets the bridge currently associated with a control object. diff --git a/res/ari/resource_bridges.c b/res/ari/resource_bridges.c index 33e4cd1817..e4e70641a9 100644 --- a/res/ari/resource_bridges.c +++ b/res/ari/resource_bridges.c @@ -221,6 +221,7 @@ void ast_ari_bridges_add_channel(struct ast_variable *headers, if (!stasis_app_control_bridge_features_init(list->controls[i])) { stasis_app_control_absorb_dtmf_in_bridge(list->controls[i], args->absorb_dtmf); stasis_app_control_mute_in_bridge(list->controls[i], args->mute); + stasis_app_control_inhibit_colp_in_bridge(list->controls[i], args->inhibit_connected_line_updates); } } diff --git a/res/ari/resource_bridges.h b/res/ari/resource_bridges.h index 0d0286c31b..83a353227c 100644 --- a/res/ari/resource_bridges.h +++ b/res/ari/resource_bridges.h @@ -154,6 +154,8 @@ struct ast_ari_bridges_add_channel_args { int absorb_dtmf; /*! Mute audio from this channel, preventing it to pass through to the bridge */ int mute; + /*! Do not present the identity of the newly connected channel to other bridge members */ + int inhibit_connected_line_updates; }; /*! * \brief Body parsing function for /bridges/{bridgeId}/addChannel. diff --git a/res/res_ari_bridges.c b/res/res_ari_bridges.c index 7ef0f684a5..0f0f22bae5 100644 --- a/res/res_ari_bridges.c +++ b/res/res_ari_bridges.c @@ -440,6 +440,10 @@ int ast_ari_bridges_add_channel_parse_body( if (field) { args->mute = ast_json_is_true(field); } + field = ast_json_object_get(body, "inhibitConnectedLineUpdates"); + if (field) { + args->inhibit_connected_line_updates = ast_json_is_true(field); + } return 0; } @@ -515,6 +519,9 @@ static void ast_ari_bridges_add_channel_cb( if (strcmp(i->name, "mute") == 0) { args.mute = ast_true(i->value); } else + if (strcmp(i->name, "inhibitConnectedLineUpdates") == 0) { + args.inhibit_connected_line_updates = ast_true(i->value); + } else {} } for (i = path_vars; i; i = i->next) { diff --git a/res/stasis/control.c b/res/stasis/control.c index 96ddf39d0c..584e60ecfa 100644 --- a/res/stasis/control.c +++ b/res/stasis/control.c @@ -1285,6 +1285,7 @@ int control_swap_channel_in_bridge(struct stasis_app_control *control, struct as { int res; struct ast_bridge_features *features; + int flags = AST_BRIDGE_IMPART_CHAN_DEPARTABLE; if (!control || !bridge) { return -1; @@ -1332,6 +1333,9 @@ int control_swap_channel_in_bridge(struct stasis_app_control *control, struct as /* Pull bridge features from the control */ features = control->bridge_features; control->bridge_features = NULL; + if (features && features->inhibit_colp) { + flags |= AST_BRIDGE_IMPART_INHIBIT_JOIN_COLP; + } ast_assert(stasis_app_get_bridge(control) == NULL); /* We need to set control->bridge here since bridge_after_cb may be run @@ -1349,7 +1353,7 @@ int control_swap_channel_in_bridge(struct stasis_app_control *control, struct as chan, swap, features, /* features */ - AST_BRIDGE_IMPART_CHAN_DEPARTABLE); + flags); if (res != 0) { /* ast_bridge_impart failed before it could spawn the depart * thread. The callbacks aren't called in this case. @@ -1469,6 +1473,12 @@ void stasis_app_control_mute_in_bridge( control->bridge_features->mute = mute; } +void stasis_app_control_inhibit_colp_in_bridge( + struct stasis_app_control *control, int inhibit_colp) +{ + control->bridge_features->inhibit_colp = inhibit_colp; +} + void control_flush_queue(struct stasis_app_control *control) { struct ao2_iterator iter; diff --git a/rest-api/api-docs/bridges.json b/rest-api/api-docs/bridges.json index 22743c3be3..a46513791f 100644 --- a/rest-api/api-docs/bridges.json +++ b/rest-api/api-docs/bridges.json @@ -191,6 +191,15 @@ "allowMultiple": false, "dataType": "boolean", "defaultValue": false + }, + { + "name": "inhibitConnectedLineUpdates", + "description": "Do not present the identity of the newly connected channel to other bridge members", + "paramType": "query", + "required": false, + "allowMultiple": false, + "dataType": "boolean", + "defaultValue": false } ], "errorResponses": [