summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Winkler <danielwinkler@google.com>2021-03-16 16:22:15 -0700
committerLuiz Augusto von Dentz <luiz.von.dentz@intel.com>2021-03-17 11:30:27 -0700
commitced871671806fbe191609d04adaada1a4dba31f5 (patch)
tree70ea602e9410fe17208695f1d04a582e2f2cd533
parent571e41a19a25f527daad2911f0b4e76a640d6ef4 (diff)
downloadbluez-ced871671806fbe191609d04adaada1a4dba31f5.tar.gz
advertising: Add SupportedFeatures to LEAdvertisingManager1
The new SupportedFeatures member tells advertising clients whether the platform has hardware support for advertising or capability to set tx power of advertisements. Additionally, fix small typo in "secondary_exists" function name. Change is tested on hatch and kukui chromebooks by using dbus-send to verify that SupportedFeatures always exists, and is only populated when extended advertising is available. Reviewed-by: Miao-chen Chou <mcchou@chromium.org>
-rw-r--r--lib/mgmt.h2
-rw-r--r--src/advertising.c44
2 files changed, 44 insertions, 2 deletions
diff --git a/lib/mgmt.h b/lib/mgmt.h
index 76a03c9c2..c0021abd8 100644
--- a/lib/mgmt.h
+++ b/lib/mgmt.h
@@ -503,6 +503,8 @@ struct mgmt_rp_add_advertising {
#define MGMT_ADV_FLAG_SEC_1M (1 << 7)
#define MGMT_ADV_FLAG_SEC_2M (1 << 8)
#define MGMT_ADV_FLAG_SEC_CODED (1 << 9)
+#define MGMT_ADV_FLAG_CAN_SET_TX_POWER (1 << 10)
+#define MGMT_ADV_FLAG_HW_OFFLOAD (1 << 11)
#define MGMT_ADV_PARAM_DURATION (1 << 12)
#define MGMT_ADV_PARAM_TIMEOUT (1 << 13)
#define MGMT_ADV_PARAM_INTERVALS (1 << 14)
diff --git a/src/advertising.c b/src/advertising.c
index d76e97a74..4ab449ceb 100644
--- a/src/advertising.c
+++ b/src/advertising.c
@@ -1618,7 +1618,8 @@ static void append_secondary(struct btd_adv_manager *manager,
}
}
-static gboolean secondary_exits(const GDBusPropertyTable *property, void *data)
+static gboolean secondary_exists(const GDBusPropertyTable *property,
+ void *data)
{
struct btd_adv_manager *manager = data;
@@ -1642,6 +1643,43 @@ static gboolean get_supported_secondary(const GDBusPropertyTable *property,
return TRUE;
}
+static struct adv_feature {
+ int flag;
+ const char *name;
+} features[] = {
+ { MGMT_ADV_FLAG_CAN_SET_TX_POWER, "CanSetTxPower" },
+ { MGMT_ADV_FLAG_HW_OFFLOAD, "HardwareOffload" },
+ { },
+};
+
+static void append_features(struct btd_adv_manager *manager,
+ DBusMessageIter *iter)
+{
+ struct adv_feature *feat;
+
+ for (feat = features; feat->name; feat++) {
+ if (manager->supported_flags & feat->flag)
+ dbus_message_iter_append_basic(iter, DBUS_TYPE_STRING,
+ &feat->name);
+ }
+}
+
+static gboolean get_supported_features(const GDBusPropertyTable *property,
+ DBusMessageIter *iter, void *data)
+{
+ struct btd_adv_manager *manager = data;
+ DBusMessageIter entry;
+
+ dbus_message_iter_open_container(iter, DBUS_TYPE_ARRAY,
+ DBUS_TYPE_STRING_AS_STRING, &entry);
+
+ append_features(manager, &entry);
+
+ dbus_message_iter_close_container(iter, &entry);
+
+ return TRUE;
+}
+
static gboolean get_supported_cap(const GDBusPropertyTable *property,
DBusMessageIter *iter, void *data)
{
@@ -1680,7 +1718,9 @@ static const GDBusPropertyTable properties[] = {
{ "SupportedInstances", "y", get_instances, NULL, NULL },
{ "SupportedIncludes", "as", get_supported_includes, NULL, NULL },
{ "SupportedSecondaryChannels", "as", get_supported_secondary, NULL,
- secondary_exits },
+ secondary_exists },
+ { "SupportedFeatures", "as", get_supported_features, NULL, NULL,
+ G_DBUS_PROPERTY_FLAG_EXPERIMENTAL},
{ "SupportedCapabilities", "a{sv}", get_supported_cap, NULL, NULL,
G_DBUS_PROPERTY_FLAG_EXPERIMENTAL},
{ }