summaryrefslogtreecommitdiff
path: root/src/advertising.c
diff options
context:
space:
mode:
authorDaniel Winkler <danielwinkler@google.com>2020-10-29 16:06:20 -0700
committerLuiz Augusto von Dentz <luiz.von.dentz@intel.com>2020-10-29 17:45:34 -0700
commit3e6157966f4d76b410fb0d1f371e07415d3d141a (patch)
tree4e1724d64b78dddc27dadde1dcfdf22949d95640 /src/advertising.c
parentf63c569f971ba9c6f028a9c8bf68be300efbba94 (diff)
downloadbluez-3e6157966f4d76b410fb0d1f371e07415d3d141a.tar.gz
advertising: Expose SupportedCapabilities for advertising
To help our advertising clients understand the device capabilities, this patch adds a SupportedCapabilities dbus endpoint for the advertising manager. The primary reason behind this is to provide the valid LE tx power range the controller supports (populated if controller supports BT5), so a client can know the valid power range before requesting a tx power for their advertisement. I also thought it would be useful to indicate the max advertising data length and scan response length in this endpoint, since some clients will find it useful to set their advertising data (currently experimental feature) or scan response data (possible future feature) directly. This patch has been tested on Hatch (BT5 support) and Kukui (No BT5 support) chromebooks to verify that the dbus endpoint contains the correct data.
Diffstat (limited to 'src/advertising.c')
-rw-r--r--src/advertising.c35
1 files changed, 35 insertions, 0 deletions
diff --git a/src/advertising.c b/src/advertising.c
index f12534776..4f5123fa1 100644
--- a/src/advertising.c
+++ b/src/advertising.c
@@ -1640,12 +1640,47 @@ static gboolean get_supported_secondary(const GDBusPropertyTable *property,
return TRUE;
}
+static gboolean get_supported_cap(const GDBusPropertyTable *property,
+ DBusMessageIter *iter, void *data)
+{
+ struct btd_adv_manager *manager = data;
+ DBusMessageIter dict;
+ int16_t min_tx_power = manager->min_tx_power;
+ int16_t max_tx_power = manager->max_tx_power;
+
+ dbus_message_iter_open_container(iter, DBUS_TYPE_ARRAY,
+ DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING
+ DBUS_TYPE_STRING_AS_STRING
+ DBUS_TYPE_VARIANT_AS_STRING
+ DBUS_DICT_ENTRY_END_CHAR_AS_STRING,
+ &dict);
+
+ if (min_tx_power != ADV_TX_POWER_NO_PREFERENCE)
+ dict_append_entry(&dict, "MinTxPower", DBUS_TYPE_INT16,
+ &min_tx_power);
+
+ if (max_tx_power != ADV_TX_POWER_NO_PREFERENCE)
+ dict_append_entry(&dict, "MaxTxPower", DBUS_TYPE_INT16,
+ &max_tx_power);
+
+ dict_append_entry(&dict, "MaxAdvLen", DBUS_TYPE_BYTE,
+ &manager->max_adv_len);
+ dict_append_entry(&dict, "MaxScnRspLen", DBUS_TYPE_BYTE,
+ &manager->max_scan_rsp_len);
+
+ dbus_message_iter_close_container(iter, &dict);
+
+ return TRUE;
+}
+
static const GDBusPropertyTable properties[] = {
{ "ActiveInstances", "y", get_active_instances, NULL, NULL },
{ "SupportedInstances", "y", get_instances, NULL, NULL },
{ "SupportedIncludes", "as", get_supported_includes, NULL, NULL },
{ "SupportedSecondaryChannels", "as", get_supported_secondary, NULL,
secondary_exits },
+ { "SupportedCapabilities", "a{sv}", get_supported_cap, NULL, NULL,
+ G_DBUS_PROPERTY_FLAG_EXPERIMENTAL},
{ }
};