2014-12-10 14:46:59

by Lukasz Rymanowski

[permalink] [raw]
Subject: [PATCH v2 0/4] android/bluetooth: Enable privacy mode on starup

This set add support for privacy mode in BfA.
This is in order to follow Android Lollipop

v2: Typo fix (important one) in patch 3/4.

Lukasz Rymanowski (4):
android/bluetooth: Start keep IRK for adapter
android/bluetooth: Store IRK when storing adapter config
android/bluetooth: Load IRK on adapter start
android/bluetooth: Enable LE privacy mode on BfA startup

android/bluetooth.c | 65 +++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 65 insertions(+)

--
1.8.4



2014-12-16 11:09:18

by Lukasz Rymanowski

[permalink] [raw]
Subject: Re: [PATCH v2 0/4] android/bluetooth: Enable privacy mode on starup

Hi,

On 10 December 2014 at 15:46, Lukasz Rymanowski
<[email protected]> wrote:
> This set add support for privacy mode in BfA.
> This is in order to follow Android Lollipop
>
> v2: Typo fix (important one) in patch 3/4.
>
> Lukasz Rymanowski (4):
> android/bluetooth: Start keep IRK for adapter
> android/bluetooth: Store IRK when storing adapter config
> android/bluetooth: Load IRK on adapter start
> android/bluetooth: Enable LE privacy mode on BfA startup
>

ping

> android/bluetooth.c | 65 +++++++++++++++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 65 insertions(+)
>
> --
> 1.8.4
>

2014-12-10 14:47:03

by Lukasz Rymanowski

[permalink] [raw]
Subject: [PATCH v2 4/4] android/bluetooth: Enable LE privacy mode on BfA startup

Lets follow Android Lollipop behaviour and enable privacy on
startup.
---
android/bluetooth.c | 26 ++++++++++++++++++++++++++
1 file changed, 26 insertions(+)

diff --git a/android/bluetooth.c b/android/bluetooth.c
index aba2b97..298133e 100644
--- a/android/bluetooth.c
+++ b/android/bluetooth.c
@@ -3413,6 +3413,28 @@ static void clear_auto_connect_list(void)
error("Could not clear auto connect list");
}

+static void set_privacy_complete(uint8_t status, uint16_t length,
+ const void *param, void *user_data)
+{
+ if (status != MGMT_STATUS_SUCCESS)
+ error("Failed to set privacy mode: %s (0x%02x)",
+ mgmt_errstr(status), status);
+}
+
+static void set_privacy(void)
+{
+ struct mgmt_cp_set_privacy cp;
+
+ cp.privacy = 0x01;
+ memcpy(cp.irk, adapter.irk, sizeof(adapter.irk));
+
+ if (mgmt_send(mgmt_if, MGMT_OP_SET_PRIVACY, adapter.index, sizeof(cp),
+ &cp, set_privacy_complete, NULL, NULL) > 0)
+ return;
+
+ error("Could not set privacy mode");
+}
+
static void read_info_complete(uint8_t status, uint16_t length,
const void *param, void *user_data)
{
@@ -3487,6 +3509,10 @@ static void read_info_complete(uint8_t status, uint16_t length,
if (missing_settings & MGMT_SETTING_BONDABLE)
set_mode(MGMT_OP_SET_BONDABLE, 0x01);

+ if ((adapter.supported_settings & MGMT_SETTING_LE) &&
+ (missing_settings & MGMT_SETTING_PRIVACY))
+ set_privacy();
+
load_devices_info(cb);
load_devices_cache();

--
1.8.4


2014-12-10 14:47:02

by Lukasz Rymanowski

[permalink] [raw]
Subject: [PATCH v2 3/4] android/bluetooth: Load IRK on adapter start

If IRK is not found it will be generated
---
android/bluetooth.c | 29 +++++++++++++++++++++++++++++
1 file changed, 29 insertions(+)

diff --git a/android/bluetooth.c b/android/bluetooth.c
index 8865eac..aba2b97 100644
--- a/android/bluetooth.c
+++ b/android/bluetooth.c
@@ -294,6 +294,22 @@ static void store_adapter_config(void)
g_key_file_free(key_file);
}

+static void generate_irk(void)
+{
+ int i;
+
+ srand(time(NULL));
+
+ /* Need to generate 16 octets */
+ for (i = 0; i < 16; i += 4) {
+ int a = rand();
+
+ memcpy(&adapter.irk[i], &a, 4);
+ }
+
+ store_adapter_config();
+}
+
static void load_adapter_config(void)
{
GError *gerr = NULL;
@@ -306,6 +322,7 @@ static void load_adapter_config(void)
str = g_key_file_get_string(key_file, "General", "Address", NULL);
if (!str) {
g_key_file_free(key_file);
+ generate_irk();
return;
}

@@ -321,6 +338,18 @@ static void load_adapter_config(void)
g_clear_error(&gerr);
}

+ str = g_key_file_get_string(key_file, "General", "IRK", NULL);
+ if (str) {
+ int i;
+
+ for (i = 0; i < 16; i++)
+ sscanf(str + (i * 2), "%02hhX", &adapter.irk[i]);
+
+ g_free(str);
+ } else {
+ generate_irk();
+ }
+
g_key_file_free(key_file);
}

--
1.8.4


2014-12-10 14:47:01

by Lukasz Rymanowski

[permalink] [raw]
Subject: [PATCH v2 2/4] android/bluetooth: Store IRK when storing adapter config

---
android/bluetooth.c | 7 +++++++
1 file changed, 7 insertions(+)

diff --git a/android/bluetooth.c b/android/bluetooth.c
index e9c5be1..8865eac 100644
--- a/android/bluetooth.c
+++ b/android/bluetooth.c
@@ -263,6 +263,8 @@ static void store_adapter_config(void)
gsize length = 0;
char addr[18];
char *data;
+ char key_str[33];
+ int i;

key_file = g_key_file_new();

@@ -279,6 +281,11 @@ static void store_adapter_config(void)
g_key_file_set_integer(key_file, "General", "DiscoverableTimeout",
adapter.discoverable_timeout);

+ for (i = 0; i < 16; i++)
+ sprintf(key_str + (i * 2), "%2.2X", adapter.irk[i]);
+
+ g_key_file_set_string(key_file, "General", "IRK", key_str);
+
data = g_key_file_to_data(key_file, &length, NULL);

g_file_set_contents(SETTINGS_FILE, data, length, NULL);
--
1.8.4


2014-12-10 14:47:00

by Lukasz Rymanowski

[permalink] [raw]
Subject: [PATCH v2 1/4] android/bluetooth: Start keep IRK for adapter

---
android/bluetooth.c | 3 +++
1 file changed, 3 insertions(+)

diff --git a/android/bluetooth.c b/android/bluetooth.c
index 48ca231..e9c5be1 100644
--- a/android/bluetooth.c
+++ b/android/bluetooth.c
@@ -176,6 +176,8 @@ static struct {

char *name;

+ uint8_t irk[16];
+
uint8_t max_advert_instance;
uint8_t rpa_offload_supported;
uint8_t max_irk_list_size;
@@ -196,6 +198,7 @@ static struct {
.index = MGMT_INDEX_NONE,
.dev_class = 0,
.name = NULL,
+ .irk = {0},
.max_advert_instance = 0,
.rpa_offload_supported = 0,
.max_irk_list_size = 0,
--
1.8.4