summaryrefslogtreecommitdiff
path: root/android/bluetooth.c
diff options
context:
space:
mode:
authorLukasz Rymanowski <lukasz.rymanowski@tieto.com>2014-12-10 13:45:41 +0100
committerSzymon Janc <szymon.janc@tieto.com>2014-12-10 14:21:00 +0100
commit5fb15cc547dd89e6cb1244e69004105a4c1c820c (patch)
tree6f57cd5d3f1fed34c8599a62d6d67a3fd41c07df /android/bluetooth.c
parent59aaa3a7b40d84877767f0c5e9dc4d0a6a0decf4 (diff)
downloadbluez-5fb15cc547dd89e6cb1244e69004105a4c1c820c.tar.gz
android/bluetooth: Add support to read Le features by Android
LE Features is new property added in Android Lollipop. Framework is expecting to get those features on bluetooth start.
Diffstat (limited to 'android/bluetooth.c')
-rw-r--r--android/bluetooth.c48
1 files changed, 48 insertions, 0 deletions
diff --git a/android/bluetooth.c b/android/bluetooth.c
index ca3dd24b8..6443cfe91 100644
--- a/android/bluetooth.c
+++ b/android/bluetooth.c
@@ -176,6 +176,13 @@ static struct {
char *name;
+ uint8_t max_advert_instance;
+ uint8_t rpa_offload_supported;
+ uint8_t max_irk_list_size;
+ uint8_t max_scan_filters_supported;
+ uint16_t scan_result_storage_size;
+ uint8_t activity_energy_info_supported;
+
uint32_t current_settings;
uint32_t supported_settings;
@@ -189,6 +196,12 @@ static struct {
.index = MGMT_INDEX_NONE,
.dev_class = 0,
.name = NULL,
+ .max_advert_instance = 0,
+ .rpa_offload_supported = 0,
+ .max_irk_list_size = 0,
+ .max_scan_filters_supported = 0,
+ .scan_result_storage_size = 0,
+ .activity_energy_info_supported = 0,
.current_settings = 0,
.supported_settings = 0,
.cur_discovery_type = SCAN_TYPE_NONE,
@@ -3784,6 +3797,31 @@ static uint8_t get_adapter_discoverable_timeout(void)
return HAL_STATUS_SUCCESS;
}
+static void prepare_le_features(uint8_t *le_features)
+{
+ le_features[0] = !!(adapter.current_settings & MGMT_SETTING_PRIVACY);
+ le_features[1] = adapter.max_advert_instance;
+ le_features[2] = adapter.rpa_offload_supported;
+ le_features[3] = adapter.max_irk_list_size;
+ le_features[4] = adapter.max_scan_filters_supported;
+ /* lo byte */
+ le_features[5] = adapter.scan_result_storage_size;
+ /* hi byte */
+ le_features[6] = adapter.scan_result_storage_size >> 8;
+ le_features[7] = adapter.activity_energy_info_supported;
+}
+
+static uint8_t get_adapter_le_features(void)
+{
+ uint8_t le_features[8];
+
+ prepare_le_features(le_features);
+
+ send_adapter_property(HAL_PROP_ADAPTER_LOCAL_LE_FEAT,
+ sizeof(le_features), le_features);
+ return HAL_STATUS_SUCCESS;
+}
+
static void handle_get_adapter_prop_cmd(const void *buf, uint16_t len)
{
const struct hal_cmd_get_adapter_prop *cmd = buf;
@@ -3817,6 +3855,9 @@ static void handle_get_adapter_prop_cmd(const void *buf, uint16_t len)
case HAL_PROP_ADAPTER_DISC_TIMEOUT:
status = get_adapter_discoverable_timeout();
break;
+ case HAL_PROP_ADAPTER_LOCAL_LE_FEAT:
+ status = get_adapter_le_features();
+ break;
default:
status = HAL_STATUS_FAILED;
break;
@@ -3837,6 +3878,7 @@ static void get_adapter_properties(void)
uint8_t bonded[g_slist_length(bonded_devices) * sizeof(bdaddr_t)];
uint128_t uuids[g_slist_length(adapter.uuids)];
uint8_t android_bdaddr[6];
+ uint8_t le_features[8];
uint8_t type, mode;
size_t size, i;
GSList *l;
@@ -3898,6 +3940,12 @@ static void get_adapter_properties(void)
uuids);
ev->num_props++;
+ prepare_le_features(le_features);
+ size += fill_hal_prop(buf + size, HAL_PROP_ADAPTER_LOCAL_LE_FEAT,
+ sizeof(le_features), le_features);
+
+ ev->num_props++;
+
ipc_send_notif(hal_ipc, HAL_SERVICE_ID_BLUETOOTH,
HAL_EV_ADAPTER_PROPS_CHANGED, size, buf);
}