summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Winkler <danielwinkler@google.com>2020-10-29 16:06:16 -0700
committerLuiz Augusto von Dentz <luiz.von.dentz@intel.com>2020-10-29 17:42:46 -0700
commit657abc0ebe6ba049ae783d13f06e0eff6abd9ab2 (patch)
tree2c6163ab6ae8f2db41d9b5f262c2ae00d08d8cd3
parent838cafe4f04192f24eac97cbf9c93ffe60c7d6ad (diff)
downloadbluez-657abc0ebe6ba049ae783d13f06e0eff6abd9ab2.tar.gz
advertising: Detect if extended advertising mgmt commands are supported
We need to know if kernel supports the new MGMT interface. To do so, we check the return from adapter's MGMT_OP_READ_COMMANDS call for the new commands. This will later be used to route our requests for new advertisements. The change is tested by manually verifying that the correct MGMT commands are used when the feature is and is not available in kernel.
-rw-r--r--lib/mgmt.h4
-rw-r--r--src/adapter.c4
-rw-r--r--src/adapter.h1
-rw-r--r--src/advertising.c3
4 files changed, 12 insertions, 0 deletions
diff --git a/lib/mgmt.h b/lib/mgmt.h
index 6aa0f5f88..59608e7ea 100644
--- a/lib/mgmt.h
+++ b/lib/mgmt.h
@@ -700,6 +700,10 @@ struct mgmt_rp_remove_adv_monitor {
uint16_t monitor_handle;
} __packed;
+#define MGMT_OP_ADD_EXT_ADV_PARAMS 0x0054
+
+#define MGMT_OP_ADD_EXT_ADV_DATA 0x0055
+
#define MGMT_EV_CMD_COMPLETE 0x0001
struct mgmt_ev_cmd_complete {
uint16_t opcode;
diff --git a/src/adapter.c b/src/adapter.c
index 1f075ef5f..90beb897f 100644
--- a/src/adapter.c
+++ b/src/adapter.c
@@ -9566,6 +9566,10 @@ static void read_commands_complete(uint8_t status, uint16_t length,
DBG("kernel supports exp features");
kernel_features |= KERNEL_EXP_FEATURES;
break;
+ case MGMT_OP_ADD_EXT_ADV_PARAMS:
+ DBG("kernel supports ext adv commands");
+ kernel_features |= KERNEL_HAS_EXT_ADV_ADD_CMDS;
+ break;
default:
break;
}
diff --git a/src/adapter.h b/src/adapter.h
index dcc574857..ace72affd 100644
--- a/src/adapter.h
+++ b/src/adapter.h
@@ -233,6 +233,7 @@ enum kernel_features {
KERNEL_SET_SYSTEM_CONFIG = 1 << 2,
KERNEL_EXP_FEATURES = 1 << 3,
KERNEL_HAS_RESUME_EVT = 1 << 4,
+ KERNEL_HAS_EXT_ADV_ADD_CMDS = 1 << 5,
};
bool btd_has_kernel_features(uint32_t feature);
diff --git a/src/advertising.c b/src/advertising.c
index c03869e50..7c7599552 100644
--- a/src/advertising.c
+++ b/src/advertising.c
@@ -48,6 +48,7 @@ struct btd_adv_manager {
uint8_t max_ads;
uint32_t supported_flags;
unsigned int instance_bitmap;
+ bool extended_add_cmds;
};
#define AD_TYPE_BROADCAST 0
@@ -1417,6 +1418,8 @@ static struct btd_adv_manager *manager_create(struct btd_adapter *adapter,
manager->mgmt_index = btd_adapter_get_index(adapter);
manager->clients = queue_new();
manager->supported_flags = MGMT_ADV_FLAG_LOCAL_NAME;
+ manager->extended_add_cmds =
+ btd_has_kernel_features(KERNEL_HAS_EXT_ADV_ADD_CMDS);
if (!g_dbus_register_interface(btd_get_dbus_connection(),
adapter_get_path(manager->adapter),