All of lore.kernel.org
 help / color / mirror / Atom feed
* [BlueZ PATCH v2 00/13] Add support for Advertisement Data
@ 2015-04-16 14:41 Luiz Augusto von Dentz
  2015-04-16 14:41 ` [BlueZ PATCH v2 01/13] doc/device-api: Add ServiceData and ManufacturerData Luiz Augusto von Dentz
                   ` (13 more replies)
  0 siblings, 14 replies; 15+ messages in thread
From: Luiz Augusto von Dentz @ 2015-04-16 14:41 UTC (permalink / raw)
  To: linux-bluetooth

From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>

v2: Fix parsing of ServiceData and add a patch to create device objects
for non-connectable devices.

This adds support for ServiceData and ManufacturerData and make the
necessary to bluetoothctl to print them:

[bluetooth]# info XX:XX:XX:XX:XX:XX
Device XX:XX:XX:XX:XX:XX
	Alias: XX-XX-XX-XX-XX-XX
	Paired: no
	Trusted: no
	Blocked: no
	Connected: no
	LegacyPairing: no
	ManufacturerData Key: 0x004c
	ManufacturerData Value: 0x0c
	ManufacturerData Value: 0x0e
	ManufacturerData Value: 0x00
	ManufacturerData Value: 0xf1
	ManufacturerData Value: 0xa6
	ManufacturerData Value: 0xdc
	ManufacturerData Value: 0xa1
	ManufacturerData Value: 0xc0
	ManufacturerData Value: 0x51
	ManufacturerData Value: 0x80
	ManufacturerData Value: 0xa7
	ManufacturerData Value: 0x83
	ManufacturerData Value: 0x62
	ManufacturerData Value: 0x95
	ManufacturerData Value: 0x18
	ManufacturerData Value: 0x79

[bluetooth]# info XX:XX:XX:XX:XX:XX
Device XX:XX:XX:XX:XX:XX
	Name: URI Beacon
	Alias: URI Beacon
	Paired: no
	Trusted: no
	Blocked: no
	Connected: no
	LegacyPairing: no
	UUID: Unknown                   (0000fed8-0000-1000-8000-00805f9b34fb)
	ServiceData Key: fed8
	ServiceData Value: 0x00
	ServiceData Value: 0x20
	ServiceData Value: 0x00
	ServiceData Value: 0x63
	ServiceData Value: 0x72
	ServiceData Value: 0x6f
	ServiceData Value: 0x73
	ServiceData Value: 0x73
	ServiceData Value: 0x77
	ServiceData Value: 0x61
	ServiceData Value: 0x6c
	ServiceData Value: 0x6b
	ServiceData Value: 0x2d
	ServiceData Value: 0x70
	ServiceData Value: 0x72
	ServiceData Value: 0x6f
	ServiceData Value: 0x6a
	ServiceData Value: 0x65
	ServiceData Value: 0x63
	ServiceData Value: 0x74
	ServiceData Value: 0x08

Currently the data is not stored persistently since it may change over
time, but it should be relatively easy to change that in case we want to
persist the information over restart/reboot.

Luiz Augusto von Dentz (13):
  doc/device-api: Add ServiceData and ManufacturerData
  shared/ad: Add bt_ad_foreach_manufacturer_data
  shared/ad: Add bt_ad_has_manufacturer_data
  core/dbus-common: Add dict helpers for basic keys
  core: Add implementation of ManufacturerData
  client: Fix no handling dict properly
  client: Make command info print ManufacturerData
  shared/ad: Add bt_ad_foreach_service_data
  shared/ad: Add bt_ad_has_service_data
  core: Add implementation of ServiceData
  client: Make command info print ServiceData
  core/eir: Fix service data parsing
  core/adapter: Create device even if not-connectable

 client/main.c      |  12 ++++-
 doc/device-api.txt |  11 +++++
 src/adapter.c      |  17 +++++--
 src/dbus-common.c  |  27 ++++++++---
 src/dbus-common.h  |   5 ++
 src/device.c       | 137 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 src/device.h       |   2 +
 src/eir.c          |   4 ++
 src/shared/ad.c    | 120 ++++++++++++++++++++++++++++++++++++----------
 src/shared/ad.h    |  26 ++++++++++
 10 files changed, 322 insertions(+), 39 deletions(-)

-- 
2.1.0


^ permalink raw reply	[flat|nested] 15+ messages in thread

* [BlueZ PATCH v2 01/13] doc/device-api: Add ServiceData and ManufacturerData
  2015-04-16 14:41 [BlueZ PATCH v2 00/13] Add support for Advertisement Data Luiz Augusto von Dentz
@ 2015-04-16 14:41 ` Luiz Augusto von Dentz
  2015-04-16 14:41 ` [BlueZ PATCH v2 02/13] shared/ad: Add bt_ad_foreach_manufacturer_data Luiz Augusto von Dentz
                   ` (12 subsequent siblings)
  13 siblings, 0 replies; 15+ messages in thread
From: Luiz Augusto von Dentz @ 2015-04-16 14:41 UTC (permalink / raw)
  To: linux-bluetooth

From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>

This adds ServiceData and ManufacturerData from advertisement data.
---
 doc/device-api.txt | 11 +++++++++++
 1 file changed, 11 insertions(+)

diff --git a/doc/device-api.txt b/doc/device-api.txt
index eec0024..72c597e 100644
--- a/doc/device-api.txt
+++ b/doc/device-api.txt
@@ -195,3 +195,14 @@ Properties	string Address [readonly]
 
 			Received Signal Strength Indicator of the remote
 			device (inquiry or advertising).
+
+		dict ManufacturerData [readonly, optional]
+
+			Manufacturer specific advertisement data. Keys are
+			16 bits Manufacturer ID followed by its byte array
+			value.
+
+		dict ServiceData [readonly, optional]
+
+			Service advertisement data. Keys are the UUIDs in
+			string format followed by its byte array value.
-- 
2.1.0


^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [BlueZ PATCH v2 02/13] shared/ad: Add bt_ad_foreach_manufacturer_data
  2015-04-16 14:41 [BlueZ PATCH v2 00/13] Add support for Advertisement Data Luiz Augusto von Dentz
  2015-04-16 14:41 ` [BlueZ PATCH v2 01/13] doc/device-api: Add ServiceData and ManufacturerData Luiz Augusto von Dentz
@ 2015-04-16 14:41 ` Luiz Augusto von Dentz
  2015-04-16 14:41 ` [BlueZ PATCH v2 03/13] shared/ad: Add bt_ad_has_manufacturer_data Luiz Augusto von Dentz
                   ` (11 subsequent siblings)
  13 siblings, 0 replies; 15+ messages in thread
From: Luiz Augusto von Dentz @ 2015-04-16 14:41 UTC (permalink / raw)
  To: linux-bluetooth

From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>

This adds bt_ad_foreach_manufacturer_data function that can be used
list entries added to manufacturer data.
---
 src/shared/ad.c | 29 ++++++++++++++++-------------
 src/shared/ad.h | 11 +++++++++++
 2 files changed, 27 insertions(+), 13 deletions(-)

diff --git a/src/shared/ad.c b/src/shared/ad.c
index d2c3f9b..d8b124d 100644
--- a/src/shared/ad.c
+++ b/src/shared/ad.c
@@ -39,12 +39,6 @@ struct uuid_data {
 	size_t len;
 };
 
-struct manufacturer_data {
-	uint16_t manufacturer_id;
-	uint8_t *data;
-	size_t len;
-};
-
 struct bt_ad *bt_ad_new(void)
 {
 	struct bt_ad *ad;
@@ -109,7 +103,7 @@ static bool uuid_data_match(const void *data, const void *elem)
 
 static void manuf_destroy(void *data)
 {
-	struct manufacturer_data *manuf = data;
+	struct bt_ad_manufacturer_data *manuf = data;
 
 	free(manuf->data);
 	free(manuf);
@@ -117,7 +111,7 @@ static void manuf_destroy(void *data)
 
 static bool manuf_match(const void *data, const void *elem)
 {
-	const struct manufacturer_data *manuf = elem;
+	const struct bt_ad_manufacturer_data *manuf = elem;
 	uint16_t manuf_id = PTR_TO_UINT(elem);
 
 	return manuf->manufacturer_id == manuf_id;
@@ -187,7 +181,7 @@ static size_t mfg_data_length(struct queue *manuf_data)
 	entry = queue_get_entries(manuf_data);
 
 	while (entry) {
-		struct manufacturer_data *data = entry->data;
+		struct bt_ad_manufacturer_data *data = entry->data;
 
 		length += 2 + sizeof(uint16_t) + data->len;
 
@@ -289,7 +283,7 @@ static void serialize_manuf_data(struct queue *manuf_data, uint8_t *buf,
 	const struct queue_entry *entry = queue_get_entries(manuf_data);
 
 	while (entry) {
-		struct manufacturer_data *data = entry->data;
+		struct bt_ad_manufacturer_data *data = entry->data;
 
 		buf[(*pos)++] = data->len + 2 + 1;
 
@@ -446,7 +440,7 @@ void bt_ad_clear_service_uuid(struct bt_ad *ad)
 bool bt_ad_add_manufacturer_data(struct bt_ad *ad, uint16_t manufacturer_id,
 							void *data, size_t len)
 {
-	struct manufacturer_data *new_data;
+	struct bt_ad_manufacturer_data *new_data;
 
 	if (!ad)
 		return false;
@@ -454,7 +448,7 @@ bool bt_ad_add_manufacturer_data(struct bt_ad *ad, uint16_t manufacturer_id,
 	if (len > (MAX_ADV_DATA_LEN - 2 - sizeof(uint16_t)))
 		return false;
 
-	new_data = new0(struct manufacturer_data, 1);
+	new_data = new0(struct bt_ad_manufacturer_data, 1);
 	if (!new_data)
 		return false;
 
@@ -478,9 +472,18 @@ bool bt_ad_add_manufacturer_data(struct bt_ad *ad, uint16_t manufacturer_id,
 	return false;
 }
 
+void bt_ad_foreach_manufacturer_data(struct bt_ad *ad, bt_ad_func_t func,
+							void *user_data)
+{
+	if (!ad)
+		return;
+
+	queue_foreach(ad->manufacturer_data, func, user_data);
+}
+
 bool bt_ad_remove_manufacturer_data(struct bt_ad *ad, uint16_t manufacturer_id)
 {
-	struct manufacturer_data *data;
+	struct bt_ad_manufacturer_data *data;
 
 	if (!ad)
 		return false;
diff --git a/src/shared/ad.h b/src/shared/ad.h
index f1060a1..6e916a3 100644
--- a/src/shared/ad.h
+++ b/src/shared/ad.h
@@ -23,8 +23,16 @@
 #include "lib/bluetooth.h"
 #include "lib/uuid.h"
 
+typedef void (*bt_ad_func_t)(void *data, void *user_data);
+
 struct bt_ad;
 
+struct bt_ad_manufacturer_data {
+	uint16_t manufacturer_id;
+	uint8_t *data;
+	size_t len;
+};
+
 struct bt_ad *bt_ad_new(void);
 
 struct bt_ad *bt_ad_ref(struct bt_ad *ad);
@@ -42,6 +50,9 @@ void bt_ad_clear_service_uuid(struct bt_ad *ad);
 bool bt_ad_add_manufacturer_data(struct bt_ad *ad, uint16_t manufacturer_data,
 						void *data, size_t len);
 
+void bt_ad_foreach_manufacturer_data(struct bt_ad *ad, bt_ad_func_t func,
+							void *user_data);
+
 bool bt_ad_remove_manufacturer_data(struct bt_ad *ad, uint16_t manufacturer_id);
 
 void bt_ad_clear_manufacturer_data(struct bt_ad *ad);
-- 
2.1.0


^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [BlueZ PATCH v2 03/13] shared/ad: Add bt_ad_has_manufacturer_data
  2015-04-16 14:41 [BlueZ PATCH v2 00/13] Add support for Advertisement Data Luiz Augusto von Dentz
  2015-04-16 14:41 ` [BlueZ PATCH v2 01/13] doc/device-api: Add ServiceData and ManufacturerData Luiz Augusto von Dentz
  2015-04-16 14:41 ` [BlueZ PATCH v2 02/13] shared/ad: Add bt_ad_foreach_manufacturer_data Luiz Augusto von Dentz
@ 2015-04-16 14:41 ` Luiz Augusto von Dentz
  2015-04-16 14:41 ` [BlueZ PATCH v2 04/13] core/dbus-common: Add dict helpers for basic keys Luiz Augusto von Dentz
                   ` (10 subsequent siblings)
  13 siblings, 0 replies; 15+ messages in thread
From: Luiz Augusto von Dentz @ 2015-04-16 14:41 UTC (permalink / raw)
  To: linux-bluetooth

From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>

This adds bt_ad_has_manufacturer_data function that can be used to
verify if data exists or in case of NULL if any data has been added.
---
 src/shared/ad.c | 31 +++++++++++++++++++++++++++++++
 src/shared/ad.h |  3 +++
 2 files changed, 34 insertions(+)

diff --git a/src/shared/ad.c b/src/shared/ad.c
index d8b124d..90d27e3 100644
--- a/src/shared/ad.c
+++ b/src/shared/ad.c
@@ -464,6 +464,11 @@ bool bt_ad_add_manufacturer_data(struct bt_ad *ad, uint16_t manufacturer_id,
 
 	new_data->len = len;
 
+	if (bt_ad_has_manufacturer_data(ad, new_data)) {
+		manuf_destroy(new_data);
+		return false;
+	}
+
 	if (queue_push_tail(ad->manufacturer_data, new_data))
 		return true;
 
@@ -472,6 +477,32 @@ bool bt_ad_add_manufacturer_data(struct bt_ad *ad, uint16_t manufacturer_id,
 	return false;
 }
 
+static bool manufacturer_data_match(const void *data, const void *user_data)
+{
+	const struct bt_ad_manufacturer_data *m1 = data;
+	const struct bt_ad_manufacturer_data *m2 = data;
+
+	if (m1->manufacturer_id != m2->manufacturer_id)
+		return false;
+
+	if (m1->len != m2->len)
+		return false;
+
+	return !memcmp(m1->data, m2->data, m1->len);
+}
+
+bool bt_ad_has_manufacturer_data(struct bt_ad *ad,
+				const struct bt_ad_manufacturer_data *data)
+{
+	if (!ad)
+		return false;
+
+	if (!data)
+		return !queue_isempty(ad->manufacturer_data);
+
+	return queue_find(ad->manufacturer_data, manufacturer_data_match, data);
+}
+
 void bt_ad_foreach_manufacturer_data(struct bt_ad *ad, bt_ad_func_t func,
 							void *user_data)
 {
diff --git a/src/shared/ad.h b/src/shared/ad.h
index 6e916a3..b7d9ade 100644
--- a/src/shared/ad.h
+++ b/src/shared/ad.h
@@ -50,6 +50,9 @@ void bt_ad_clear_service_uuid(struct bt_ad *ad);
 bool bt_ad_add_manufacturer_data(struct bt_ad *ad, uint16_t manufacturer_data,
 						void *data, size_t len);
 
+bool bt_ad_has_manufacturer_data(struct bt_ad *ad,
+				const struct bt_ad_manufacturer_data *data);
+
 void bt_ad_foreach_manufacturer_data(struct bt_ad *ad, bt_ad_func_t func,
 							void *user_data);
 
-- 
2.1.0


^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [BlueZ PATCH v2 04/13] core/dbus-common: Add dict helpers for basic keys
  2015-04-16 14:41 [BlueZ PATCH v2 00/13] Add support for Advertisement Data Luiz Augusto von Dentz
                   ` (2 preceding siblings ...)
  2015-04-16 14:41 ` [BlueZ PATCH v2 03/13] shared/ad: Add bt_ad_has_manufacturer_data Luiz Augusto von Dentz
@ 2015-04-16 14:41 ` Luiz Augusto von Dentz
  2015-04-16 14:41 ` [BlueZ PATCH v2 05/13] core: Add implementation of ManufacturerData Luiz Augusto von Dentz
                   ` (9 subsequent siblings)
  13 siblings, 0 replies; 15+ messages in thread
From: Luiz Augusto von Dentz @ 2015-04-16 14:41 UTC (permalink / raw)
  To: linux-bluetooth

From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>

The specification allows any basic type to be key:

  'A DICT_ENTRY works exactly like a struct, but rather than parentheses
   it uses curly braces, and it has more restrictions. The restrictions
   are: it occurs only as an array element type; it has exactly two
   single complete types inside the curly braces; the first single
   complete type (the "key") must be a basic type rather than a
   container type...'
---
 src/dbus-common.c | 27 +++++++++++++++++++++------
 src/dbus-common.h |  5 +++++
 2 files changed, 26 insertions(+), 6 deletions(-)

diff --git a/src/dbus-common.c b/src/dbus-common.c
index 936616b..adb0a7a 100644
--- a/src/dbus-common.c
+++ b/src/dbus-common.c
@@ -83,8 +83,8 @@ static void append_array_variant(DBusMessageIter *iter, int type, void *val,
 	dbus_message_iter_close_container(iter, &variant);
 }
 
-void dict_append_entry(DBusMessageIter *dict,
-			const char *key, int type, void *val)
+void dict_append_basic(DBusMessageIter *dict, int key_type, const void *key,
+						int type, void *val)
 {
 	DBusMessageIter entry;
 
@@ -97,28 +97,43 @@ void dict_append_entry(DBusMessageIter *dict,
 	dbus_message_iter_open_container(dict, DBUS_TYPE_DICT_ENTRY,
 							NULL, &entry);
 
-	dbus_message_iter_append_basic(&entry, DBUS_TYPE_STRING, &key);
+	dbus_message_iter_append_basic(&entry, key_type, key);
 
 	append_variant(&entry, type, val);
 
 	dbus_message_iter_close_container(dict, &entry);
+
 }
 
-void dict_append_array(DBusMessageIter *dict, const char *key, int type,
-			void *val, int n_elements)
+void dict_append_entry(DBusMessageIter *dict,
+			const char *key, int type, void *val)
+{
+	dict_append_basic(dict, DBUS_TYPE_STRING, &key, type, val);
+}
+
+void dict_append_basic_array(DBusMessageIter *dict, int key_type,
+					const void *key, int type, void *val,
+					int n_elements)
 {
 	DBusMessageIter entry;
 
 	dbus_message_iter_open_container(dict, DBUS_TYPE_DICT_ENTRY,
 						NULL, &entry);
 
-	dbus_message_iter_append_basic(&entry, DBUS_TYPE_STRING, &key);
+	dbus_message_iter_append_basic(&entry, key_type, key);
 
 	append_array_variant(&entry, type, val, n_elements);
 
 	dbus_message_iter_close_container(dict, &entry);
 }
 
+void dict_append_array(DBusMessageIter *dict, const char *key, int type,
+			void *val, int n_elements)
+{
+	dict_append_basic_array(dict, DBUS_TYPE_STRING, &key, type, val,
+								n_elements);
+}
+
 void set_dbus_connection(DBusConnection *conn)
 {
 	connection = conn;
diff --git a/src/dbus-common.h b/src/dbus-common.h
index f331b2f..2e7d51e 100644
--- a/src/dbus-common.h
+++ b/src/dbus-common.h
@@ -21,9 +21,14 @@
  *
  */
 
+void dict_append_basic(DBusMessageIter *dict, int key_type, const void *key,
+						int type, void *val);
 void dict_append_entry(DBusMessageIter *dict,
 			const char *key, int type, void *val);
 
+void dict_append_basic_array(DBusMessageIter *dict, int key_type,
+					const void *key, int type, void *val,
+					int n_elements);
 void dict_append_array(DBusMessageIter *dict, const char *key, int type,
 			void *val, int n_elements);
 
-- 
2.1.0


^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [BlueZ PATCH v2 05/13] core: Add implementation of ManufacturerData
  2015-04-16 14:41 [BlueZ PATCH v2 00/13] Add support for Advertisement Data Luiz Augusto von Dentz
                   ` (3 preceding siblings ...)
  2015-04-16 14:41 ` [BlueZ PATCH v2 04/13] core/dbus-common: Add dict helpers for basic keys Luiz Augusto von Dentz
@ 2015-04-16 14:41 ` Luiz Augusto von Dentz
  2015-04-16 14:41 ` [BlueZ PATCH v2 06/13] client: Fix no handling dict properly Luiz Augusto von Dentz
                   ` (8 subsequent siblings)
  13 siblings, 0 replies; 15+ messages in thread
From: Luiz Augusto von Dentz @ 2015-04-16 14:41 UTC (permalink / raw)
  To: linux-bluetooth

From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>

This adds 'ManufacturerData' property to Device interface.
---
 src/adapter.c |  4 +++-
 src/device.c  | 72 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 src/device.h  |  1 +
 3 files changed, 76 insertions(+), 1 deletion(-)

diff --git a/src/adapter.c b/src/adapter.c
index 7ffd302..078a8d2 100644
--- a/src/adapter.c
+++ b/src/adapter.c
@@ -5470,8 +5470,10 @@ static void update_found_devices(struct btd_adapter *adapter,
 
 	device_add_eir_uuids(dev, eir_data.services);
 
-	if (eir_data.msd_list)
+	if (eir_data.msd_list) {
+		device_set_manufacturer_data(dev, eir_data.msd_list);
 		adapter_msd_notify(adapter, dev, eir_data.msd_list);
+	}
 
 	eir_data_free(&eir_data);
 
diff --git a/src/device.c b/src/device.c
index 7b4548e..9284b8f 100644
--- a/src/device.c
+++ b/src/device.c
@@ -52,6 +52,7 @@
 #include "src/shared/gatt-db.h"
 #include "src/shared/gatt-client.h"
 #include "src/shared/gatt-server.h"
+#include "src/shared/ad.h"
 #include "btio/btio.h"
 #include "lib/mgmt.h"
 #include "attrib/att.h"
@@ -73,6 +74,7 @@
 #include "textfile.h"
 #include "storage.h"
 #include "attrib-server.h"
+#include "eir.h"
 
 #define IO_CAPABILITY_NOINPUTNOOUTPUT	0x03
 
@@ -192,6 +194,7 @@ struct btd_device {
 	bool		svc_refreshed;
 	GSList		*svc_callbacks;
 	GSList		*eir_uuids;
+	struct bt_ad	*ad;
 	char		name[MAX_NAME_LENGTH + 1];
 	char		*alias;
 	uint32_t	class;
@@ -628,6 +631,8 @@ static void device_free(gpointer user_data)
 
 	gatt_db_unref(device->db);
 
+	bt_ad_unref(device->ad);
+
 	if (device->tmp_records)
 		sdp_list_free(device->tmp_records,
 					(sdp_free_func_t) sdp_record_free);
@@ -1088,6 +1093,46 @@ static gboolean dev_property_get_adapter(const GDBusPropertyTable *property,
 	return TRUE;
 }
 
+static void append_manufacturer_data(void *data, void *user_data)
+{
+	struct bt_ad_manufacturer_data *md = data;
+	DBusMessageIter *dict = user_data;
+
+	dict_append_basic_array(dict, DBUS_TYPE_UINT16, &md->manufacturer_id,
+				DBUS_TYPE_BYTE, &md->data, md->len);
+}
+
+static gboolean
+dev_property_get_manufacturer_data(const GDBusPropertyTable *property,
+					DBusMessageIter *iter, void *data)
+{
+	struct btd_device *device = data;
+	DBusMessageIter dict;
+
+	dbus_message_iter_open_container(iter, DBUS_TYPE_ARRAY,
+					DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING
+					DBUS_TYPE_UINT16_AS_STRING
+					DBUS_TYPE_VARIANT_AS_STRING
+					DBUS_DICT_ENTRY_END_CHAR_AS_STRING,
+					&dict);
+
+	bt_ad_foreach_manufacturer_data(device->ad, append_manufacturer_data,
+									&dict);
+
+	dbus_message_iter_close_container(iter, &dict);
+
+	return TRUE;
+}
+
+static gboolean
+dev_property_manufacturer_data_exist(const GDBusPropertyTable *property,
+								void *data)
+{
+	struct btd_device *device = data;
+
+	return bt_ad_has_manufacturer_data(device->ad, NULL);
+}
+
 static gboolean disconnect_all(gpointer user_data)
 {
 	struct btd_device *device = user_data;
@@ -1418,6 +1463,24 @@ void device_add_eir_uuids(struct btd_device *dev, GSList *uuids)
 						DEVICE_INTERFACE, "UUIDs");
 }
 
+static void add_manufacturer_data(void *data, void *user_data)
+{
+	struct eir_msd *msd = data;
+	struct btd_device *dev = user_data;
+
+	if (!bt_ad_add_manufacturer_data(dev->ad, msd->company, msd->data,
+								msd->data_len))
+		return;
+
+	g_dbus_emit_property_changed(dbus_conn, dev->path,
+					DEVICE_INTERFACE, "ManufacturerData");
+}
+
+void device_set_manufacturer_data(struct btd_device *dev, GSList *list)
+{
+	g_slist_foreach(list, add_manufacturer_data, dev);
+}
+
 static struct btd_service *find_connectable_service(struct btd_device *dev,
 							const char *uuid)
 {
@@ -2174,6 +2237,9 @@ static const GDBusPropertyTable device_properties[] = {
 	{ "Modalias", "s", dev_property_get_modalias, NULL,
 						dev_property_exists_modalias },
 	{ "Adapter", "o", dev_property_get_adapter },
+	{ "ManufacturerData", "a{qv}", dev_property_get_manufacturer_data,
+				NULL, dev_property_manufacturer_data_exist,
+				G_DBUS_PROPERTY_FLAG_EXPERIMENTAL },
 	{ }
 };
 
@@ -2921,6 +2987,12 @@ static struct btd_device *device_new(struct btd_adapter *adapter,
 		return NULL;
 	}
 
+	device->ad = bt_ad_new();
+	if (!device->ad) {
+		device_free(device);
+		return NULL;
+	}
+
 	address_up = g_ascii_strup(address, -1);
 	device->path = g_strdup_printf("%s/dev_%s", adapter_path, address_up);
 	g_strdelimit(device->path, ":", '_');
diff --git a/src/device.h b/src/device.h
index 9e86469..1378d0f 100644
--- a/src/device.h
+++ b/src/device.h
@@ -75,6 +75,7 @@ void btd_device_gatt_set_service_changed(struct btd_device *device,
 bool device_attach_att(struct btd_device *dev, GIOChannel *io);
 void btd_device_add_uuid(struct btd_device *device, const char *uuid);
 void device_add_eir_uuids(struct btd_device *dev, GSList *uuids);
+void device_set_manufacturer_data(struct btd_device *dev, GSList *list);
 void device_probe_profile(gpointer a, gpointer b);
 void device_remove_profile(gpointer a, gpointer b);
 struct btd_adapter *device_get_adapter(struct btd_device *device);
-- 
2.1.0


^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [BlueZ PATCH v2 06/13] client: Fix no handling dict properly
  2015-04-16 14:41 [BlueZ PATCH v2 00/13] Add support for Advertisement Data Luiz Augusto von Dentz
                   ` (4 preceding siblings ...)
  2015-04-16 14:41 ` [BlueZ PATCH v2 05/13] core: Add implementation of ManufacturerData Luiz Augusto von Dentz
@ 2015-04-16 14:41 ` Luiz Augusto von Dentz
  2015-04-16 14:41 ` [BlueZ PATCH v2 07/13] client: Make command info print ManufacturerData Luiz Augusto von Dentz
                   ` (7 subsequent siblings)
  13 siblings, 0 replies; 15+ messages in thread
From: Luiz Augusto von Dentz @ 2015-04-16 14:41 UTC (permalink / raw)
  To: linux-bluetooth

From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>

D-Bus dict may contain keys that are not of string type.
---
 client/main.c | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)

diff --git a/client/main.c b/client/main.c
index bb67f3d..1e76aef 100644
--- a/client/main.c
+++ b/client/main.c
@@ -162,6 +162,7 @@ static void print_iter(const char *label, const char *name,
 	unsigned char byte;
 	const char *valstr;
 	DBusMessageIter subiter;
+	char *entry;
 
 	if (iter == NULL) {
 		rl_printf("%s%s is nil\n", label, name);
@@ -212,9 +213,14 @@ static void print_iter(const char *label, const char *name,
 		break;
 	case DBUS_TYPE_DICT_ENTRY:
 		dbus_message_iter_recurse(iter, &subiter);
-		dbus_message_iter_get_basic(&subiter, &valstr);
+		entry = g_strconcat(name, " Key", NULL);
+		print_iter(label, entry, &subiter);
+		g_free(entry);
+
+		entry = g_strconcat(name, " Value", NULL);
 		dbus_message_iter_next(&subiter);
-		print_iter(label, valstr, &subiter);
+		print_iter(label, entry, &subiter);
+		g_free(entry);
 		break;
 	default:
 		rl_printf("%s%s has unsupported type\n", label, name);
-- 
2.1.0


^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [BlueZ PATCH v2 07/13] client: Make command info print ManufacturerData
  2015-04-16 14:41 [BlueZ PATCH v2 00/13] Add support for Advertisement Data Luiz Augusto von Dentz
                   ` (5 preceding siblings ...)
  2015-04-16 14:41 ` [BlueZ PATCH v2 06/13] client: Fix no handling dict properly Luiz Augusto von Dentz
@ 2015-04-16 14:41 ` Luiz Augusto von Dentz
  2015-04-16 14:41 ` [BlueZ PATCH v2 08/13] shared/ad: Add bt_ad_foreach_service_data Luiz Augusto von Dentz
                   ` (6 subsequent siblings)
  13 siblings, 0 replies; 15+ messages in thread
From: Luiz Augusto von Dentz @ 2015-04-16 14:41 UTC (permalink / raw)
  To: linux-bluetooth

From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>

This makes command info to also print ManufacturerData if available.
---
 client/main.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/client/main.c b/client/main.c
index 1e76aef..f7a50f6 100644
--- a/client/main.c
+++ b/client/main.c
@@ -950,6 +950,7 @@ static void cmd_info(const char *arg)
 	print_property(proxy, "LegacyPairing");
 	print_uuids(proxy);
 	print_property(proxy, "Modalias");
+	print_property(proxy, "ManufacturerData");
 }
 
 static void pair_reply(DBusMessage *message, void *user_data)
-- 
2.1.0


^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [BlueZ PATCH v2 08/13] shared/ad: Add bt_ad_foreach_service_data
  2015-04-16 14:41 [BlueZ PATCH v2 00/13] Add support for Advertisement Data Luiz Augusto von Dentz
                   ` (6 preceding siblings ...)
  2015-04-16 14:41 ` [BlueZ PATCH v2 07/13] client: Make command info print ManufacturerData Luiz Augusto von Dentz
@ 2015-04-16 14:41 ` Luiz Augusto von Dentz
  2015-04-16 14:41 ` [BlueZ PATCH v2 09/13] shared/ad: Add bt_ad_has_service_data Luiz Augusto von Dentz
                   ` (5 subsequent siblings)
  13 siblings, 0 replies; 15+ messages in thread
From: Luiz Augusto von Dentz @ 2015-04-16 14:41 UTC (permalink / raw)
  To: linux-bluetooth

From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>

This adds bt_ad_foreach_service_data function that can be used
list entries added as service data.
---
 src/shared/ad.c | 29 ++++++++++++++++-------------
 src/shared/ad.h |  9 +++++++++
 2 files changed, 25 insertions(+), 13 deletions(-)

diff --git a/src/shared/ad.c b/src/shared/ad.c
index 90d27e3..7eb74ab 100644
--- a/src/shared/ad.c
+++ b/src/shared/ad.c
@@ -33,12 +33,6 @@ struct bt_ad {
 	struct queue *service_data;
 };
 
-struct uuid_data {
-	bt_uuid_t uuid;
-	uint8_t *data;
-	size_t len;
-};
-
 struct bt_ad *bt_ad_new(void)
 {
 	struct bt_ad *ad;
@@ -87,7 +81,7 @@ struct bt_ad *bt_ad_ref(struct bt_ad *ad)
 
 static void uuid_destroy(void *data)
 {
-	struct uuid_data *uuid_data = data;
+	struct bt_ad_service_data *uuid_data = data;
 
 	free(uuid_data->data);
 	free(uuid_data);
@@ -95,7 +89,7 @@ static void uuid_destroy(void *data)
 
 static bool uuid_data_match(const void *data, const void *elem)
 {
-	const struct uuid_data *uuid_data = elem;
+	const struct bt_ad_service_data *uuid_data = elem;
 	const bt_uuid_t *uuid = data;
 
 	return !bt_uuid_cmp(&uuid_data->uuid, uuid);
@@ -199,7 +193,7 @@ static size_t uuid_data_length(struct queue *uuid_data)
 	entry = queue_get_entries(uuid_data);
 
 	while (entry) {
-		struct uuid_data *data = entry->data;
+		struct bt_ad_service_data *data = entry->data;
 
 		length += 2 + bt_uuid_len(&data->uuid) + data->len;
 
@@ -307,7 +301,7 @@ static void serialize_service_data(struct queue *service_data, uint8_t *buf,
 	const struct queue_entry *entry = queue_get_entries(service_data);
 
 	while (entry) {
-		struct uuid_data *data = entry->data;
+		struct bt_ad_service_data *data = entry->data;
 		int uuid_len = bt_uuid_len(&data->uuid);
 
 		buf[(*pos)++] =  uuid_len + data->len + 1;
@@ -565,7 +559,7 @@ void bt_ad_clear_solicit_uuid(struct bt_ad *ad)
 bool bt_ad_add_service_data(struct bt_ad *ad, const bt_uuid_t *uuid, void *data,
 								size_t len)
 {
-	struct uuid_data *new_data;
+	struct bt_ad_service_data *new_data;
 
 	if (!ad)
 		return false;
@@ -573,7 +567,7 @@ bool bt_ad_add_service_data(struct bt_ad *ad, const bt_uuid_t *uuid, void *data,
 	if (len > (MAX_ADV_DATA_LEN - 2 - (size_t)bt_uuid_len(uuid)))
 		return false;
 
-	new_data = new0(struct uuid_data, 1);
+	new_data = new0(struct bt_ad_service_data, 1);
 	if (!new_data)
 		return false;
 
@@ -597,9 +591,18 @@ bool bt_ad_add_service_data(struct bt_ad *ad, const bt_uuid_t *uuid, void *data,
 	return false;
 }
 
+void bt_ad_foreach_service_data(struct bt_ad *ad, bt_ad_func_t func,
+							void *user_data)
+{
+	if (!ad)
+		return;
+
+	queue_foreach(ad->service_data, func, user_data);
+}
+
 bool bt_ad_remove_service_data(struct bt_ad *ad, bt_uuid_t *uuid)
 {
-	struct uuid_data *data;
+	struct bt_ad_service_data *data;
 
 	if (!ad)
 		return false;
diff --git a/src/shared/ad.h b/src/shared/ad.h
index b7d9ade..c31a040 100644
--- a/src/shared/ad.h
+++ b/src/shared/ad.h
@@ -33,6 +33,12 @@ struct bt_ad_manufacturer_data {
 	size_t len;
 };
 
+struct bt_ad_service_data {
+	bt_uuid_t uuid;
+	uint8_t *data;
+	size_t len;
+};
+
 struct bt_ad *bt_ad_new(void);
 
 struct bt_ad *bt_ad_ref(struct bt_ad *ad);
@@ -69,6 +75,9 @@ void bt_ad_clear_solicit_uuid(struct bt_ad *ad);
 bool bt_ad_add_service_data(struct bt_ad *ad, const bt_uuid_t *uuid, void *data,
 								size_t len);
 
+void bt_ad_foreach_service_data(struct bt_ad *ad, bt_ad_func_t func,
+							void *user_data);
+
 bool bt_ad_remove_service_data(struct bt_ad *ad, bt_uuid_t *uuid);
 
 void bt_ad_clear_service_data(struct bt_ad *ad);
-- 
2.1.0


^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [BlueZ PATCH v2 09/13] shared/ad: Add bt_ad_has_service_data
  2015-04-16 14:41 [BlueZ PATCH v2 00/13] Add support for Advertisement Data Luiz Augusto von Dentz
                   ` (7 preceding siblings ...)
  2015-04-16 14:41 ` [BlueZ PATCH v2 08/13] shared/ad: Add bt_ad_foreach_service_data Luiz Augusto von Dentz
@ 2015-04-16 14:41 ` Luiz Augusto von Dentz
  2015-04-16 14:41 ` [BlueZ PATCH v2 10/13] core: Add implementation of ServiceData Luiz Augusto von Dentz
                   ` (4 subsequent siblings)
  13 siblings, 0 replies; 15+ messages in thread
From: Luiz Augusto von Dentz @ 2015-04-16 14:41 UTC (permalink / raw)
  To: linux-bluetooth

From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>

This adds bt_ad_has_service_data function that can be used to
verify if data exists or in case of NULL if any data has been added.
---
 src/shared/ad.c | 31 +++++++++++++++++++++++++++++++
 src/shared/ad.h |  3 +++
 2 files changed, 34 insertions(+)

diff --git a/src/shared/ad.c b/src/shared/ad.c
index 7eb74ab..83f01e4 100644
--- a/src/shared/ad.c
+++ b/src/shared/ad.c
@@ -583,6 +583,11 @@ bool bt_ad_add_service_data(struct bt_ad *ad, const bt_uuid_t *uuid, void *data,
 
 	new_data->len = len;
 
+	if (bt_ad_has_service_data(ad, new_data)) {
+		uuid_destroy(new_data);
+		return false;
+	}
+
 	if (queue_push_tail(ad->service_data, new_data))
 		return true;
 
@@ -591,6 +596,32 @@ bool bt_ad_add_service_data(struct bt_ad *ad, const bt_uuid_t *uuid, void *data,
 	return false;
 }
 
+static bool service_data_match(const void *data, const void *user_data)
+{
+	const struct bt_ad_service_data *s1 = data;
+	const struct bt_ad_service_data *s2 = data;
+
+	if (bt_uuid_cmp(&s1->uuid, &s2->uuid))
+		return false;
+
+	if (s1->len != s2->len)
+		return false;
+
+	return !memcmp(s1->data, s2->data, s1->len);
+}
+
+bool bt_ad_has_service_data(struct bt_ad *ad,
+					const struct bt_ad_service_data *data)
+{
+	if (!ad)
+		return false;
+
+	if (!data)
+		return !queue_isempty(ad->service_data);
+
+	return queue_find(ad->service_data, service_data_match, data);
+}
+
 void bt_ad_foreach_service_data(struct bt_ad *ad, bt_ad_func_t func,
 							void *user_data)
 {
diff --git a/src/shared/ad.h b/src/shared/ad.h
index c31a040..4b313ab 100644
--- a/src/shared/ad.h
+++ b/src/shared/ad.h
@@ -75,6 +75,9 @@ void bt_ad_clear_solicit_uuid(struct bt_ad *ad);
 bool bt_ad_add_service_data(struct bt_ad *ad, const bt_uuid_t *uuid, void *data,
 								size_t len);
 
+bool bt_ad_has_service_data(struct bt_ad *ad,
+					const struct bt_ad_service_data *data);
+
 void bt_ad_foreach_service_data(struct bt_ad *ad, bt_ad_func_t func,
 							void *user_data);
 
-- 
2.1.0


^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [BlueZ PATCH v2 10/13] core: Add implementation of ServiceData
  2015-04-16 14:41 [BlueZ PATCH v2 00/13] Add support for Advertisement Data Luiz Augusto von Dentz
                   ` (8 preceding siblings ...)
  2015-04-16 14:41 ` [BlueZ PATCH v2 09/13] shared/ad: Add bt_ad_has_service_data Luiz Augusto von Dentz
@ 2015-04-16 14:41 ` Luiz Augusto von Dentz
  2015-04-16 14:41 ` [BlueZ PATCH v2 11/13] client: Make command info print ServiceData Luiz Augusto von Dentz
                   ` (3 subsequent siblings)
  13 siblings, 0 replies; 15+ messages in thread
From: Luiz Augusto von Dentz @ 2015-04-16 14:41 UTC (permalink / raw)
  To: linux-bluetooth

From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>

This adds 'ServiceData' property to Device interface.
---
 src/adapter.c |  3 +++
 src/device.c  | 65 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 src/device.h  |  1 +
 3 files changed, 69 insertions(+)

diff --git a/src/adapter.c b/src/adapter.c
index 078a8d2..9de161b 100644
--- a/src/adapter.c
+++ b/src/adapter.c
@@ -5475,6 +5475,9 @@ static void update_found_devices(struct btd_adapter *adapter,
 		adapter_msd_notify(adapter, dev, eir_data.msd_list);
 	}
 
+	if (eir_data.sd_list)
+		device_set_service_data(dev, eir_data.sd_list);
+
 	eir_data_free(&eir_data);
 
 	/*
diff --git a/src/device.c b/src/device.c
index 9284b8f..3552999 100644
--- a/src/device.c
+++ b/src/device.c
@@ -1133,6 +1133,47 @@ dev_property_manufacturer_data_exist(const GDBusPropertyTable *property,
 	return bt_ad_has_manufacturer_data(device->ad, NULL);
 }
 
+static void append_service_data(void *data, void *user_data)
+{
+	struct bt_ad_service_data *sd = data;
+	DBusMessageIter *dict = user_data;
+	char uuid_str[MAX_LEN_UUID_STR];
+
+	bt_uuid_to_string(&sd->uuid, uuid_str, sizeof(uuid_str));
+
+	dict_append_array(dict, uuid_str, DBUS_TYPE_BYTE, &sd->data, sd->len);
+}
+
+static gboolean
+dev_property_get_service_data(const GDBusPropertyTable *property,
+					DBusMessageIter *iter, void *data)
+{
+	struct btd_device *device = data;
+	DBusMessageIter dict;
+
+	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);
+
+	bt_ad_foreach_service_data(device->ad, append_service_data, &dict);
+
+	dbus_message_iter_close_container(iter, &dict);
+
+	return TRUE;
+}
+
+static gboolean
+dev_property_service_data_exist(const GDBusPropertyTable *property,
+								void *data)
+{
+	struct btd_device *device = data;
+
+	return bt_ad_has_service_data(device->ad, NULL);
+}
+
 static gboolean disconnect_all(gpointer user_data)
 {
 	struct btd_device *device = user_data;
@@ -1481,6 +1522,27 @@ void device_set_manufacturer_data(struct btd_device *dev, GSList *list)
 	g_slist_foreach(list, add_manufacturer_data, dev);
 }
 
+static void add_service_data(void *data, void *user_data)
+{
+	struct eir_sd *sd = data;
+	struct btd_device *dev = user_data;
+	bt_uuid_t uuid;
+
+	if (bt_string_to_uuid(&uuid, sd->uuid) < 0)
+		return;
+
+	if (!bt_ad_add_service_data(dev->ad, &uuid, sd->data, sd->data_len))
+		return;
+
+	g_dbus_emit_property_changed(dbus_conn, dev->path,
+					DEVICE_INTERFACE, "ServiceData");
+}
+
+void device_set_service_data(struct btd_device *dev, GSList *list)
+{
+	g_slist_foreach(list, add_service_data, dev);
+}
+
 static struct btd_service *find_connectable_service(struct btd_device *dev,
 							const char *uuid)
 {
@@ -2240,6 +2302,9 @@ static const GDBusPropertyTable device_properties[] = {
 	{ "ManufacturerData", "a{qv}", dev_property_get_manufacturer_data,
 				NULL, dev_property_manufacturer_data_exist,
 				G_DBUS_PROPERTY_FLAG_EXPERIMENTAL },
+	{ "ServiceData", "a{sv}", dev_property_get_service_data,
+				NULL, dev_property_service_data_exist,
+				G_DBUS_PROPERTY_FLAG_EXPERIMENTAL },
 	{ }
 };
 
diff --git a/src/device.h b/src/device.h
index 1378d0f..b91916d 100644
--- a/src/device.h
+++ b/src/device.h
@@ -76,6 +76,7 @@ bool device_attach_att(struct btd_device *dev, GIOChannel *io);
 void btd_device_add_uuid(struct btd_device *device, const char *uuid);
 void device_add_eir_uuids(struct btd_device *dev, GSList *uuids);
 void device_set_manufacturer_data(struct btd_device *dev, GSList *list);
+void device_set_service_data(struct btd_device *dev, GSList *list);
 void device_probe_profile(gpointer a, gpointer b);
 void device_remove_profile(gpointer a, gpointer b);
 struct btd_adapter *device_get_adapter(struct btd_device *device);
-- 
2.1.0


^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [BlueZ PATCH v2 11/13] client: Make command info print ServiceData
  2015-04-16 14:41 [BlueZ PATCH v2 00/13] Add support for Advertisement Data Luiz Augusto von Dentz
                   ` (9 preceding siblings ...)
  2015-04-16 14:41 ` [BlueZ PATCH v2 10/13] core: Add implementation of ServiceData Luiz Augusto von Dentz
@ 2015-04-16 14:41 ` Luiz Augusto von Dentz
  2015-04-16 14:41 ` [BlueZ PATCH v2 12/13] core/eir: Fix service data parsing Luiz Augusto von Dentz
                   ` (2 subsequent siblings)
  13 siblings, 0 replies; 15+ messages in thread
From: Luiz Augusto von Dentz @ 2015-04-16 14:41 UTC (permalink / raw)
  To: linux-bluetooth

From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>

This makes command info to also print ServiceData if available.
---
 client/main.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/client/main.c b/client/main.c
index f7a50f6..5250a33 100644
--- a/client/main.c
+++ b/client/main.c
@@ -951,6 +951,7 @@ static void cmd_info(const char *arg)
 	print_uuids(proxy);
 	print_property(proxy, "Modalias");
 	print_property(proxy, "ManufacturerData");
+	print_property(proxy, "ServiceData");
 }
 
 static void pair_reply(DBusMessage *message, void *user_data)
-- 
2.1.0


^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [BlueZ PATCH v2 12/13] core/eir: Fix service data parsing
  2015-04-16 14:41 [BlueZ PATCH v2 00/13] Add support for Advertisement Data Luiz Augusto von Dentz
                   ` (10 preceding siblings ...)
  2015-04-16 14:41 ` [BlueZ PATCH v2 11/13] client: Make command info print ServiceData Luiz Augusto von Dentz
@ 2015-04-16 14:41 ` Luiz Augusto von Dentz
  2015-04-16 14:41 ` [BlueZ PATCH v2 13/13] core/adapter: Create device even if not-connectable Luiz Augusto von Dentz
  2015-04-17 12:18 ` [BlueZ PATCH v2 00/13] Add support for Advertisement Data Luiz Augusto von Dentz
  13 siblings, 0 replies; 15+ messages in thread
From: Luiz Augusto von Dentz @ 2015-04-16 14:41 UTC (permalink / raw)
  To: linux-bluetooth

From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>

The UUID type was not being set correctly.
---
 src/eir.c | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/src/eir.c b/src/eir.c
index 34f6e16..c984fa5 100644
--- a/src/eir.c
+++ b/src/eir.c
@@ -191,6 +191,7 @@ static void eir_parse_uuid16_data(struct eir_data *eir, const uint8_t *data,
 	if (len < 2 || len > EIR_SD_MAX_LEN)
 		return;
 
+	service.type = SDP_UUID16;
 	service.value.uuid16 = get_le16(data);
 	eir_parse_sd(eir, &service, data + 2, len - 2);
 }
@@ -203,6 +204,7 @@ static void eir_parse_uuid32_data(struct eir_data *eir, const uint8_t *data,
 	if (len < 4 || len > EIR_SD_MAX_LEN)
 		return;
 
+	service.type = SDP_UUID32;
 	service.value.uuid32 = get_le32(data);
 	eir_parse_sd(eir, &service, data + 4, len - 4);
 }
@@ -216,6 +218,8 @@ static void eir_parse_uuid128_data(struct eir_data *eir, const uint8_t *data,
 	if (len < 16 || len > EIR_SD_MAX_LEN)
 		return;
 
+	service.type = SDP_UUID128;
+
 	for (k = 0; k < 16; k++)
 		service.value.uuid128.data[k] = data[16 - k - 1];
 
-- 
2.1.0


^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [BlueZ PATCH v2 13/13] core/adapter: Create device even if not-connectable
  2015-04-16 14:41 [BlueZ PATCH v2 00/13] Add support for Advertisement Data Luiz Augusto von Dentz
                   ` (11 preceding siblings ...)
  2015-04-16 14:41 ` [BlueZ PATCH v2 12/13] core/eir: Fix service data parsing Luiz Augusto von Dentz
@ 2015-04-16 14:41 ` Luiz Augusto von Dentz
  2015-04-17 12:18 ` [BlueZ PATCH v2 00/13] Add support for Advertisement Data Luiz Augusto von Dentz
  13 siblings, 0 replies; 15+ messages in thread
From: Luiz Augusto von Dentz @ 2015-04-16 14:41 UTC (permalink / raw)
  To: linux-bluetooth

From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>

If the device is in fact discoverable it should be no problem to create
a D-Bus object for it as the object is required in order to attach the
advertisement data in case a broadcaster/beacons come in range.
---
 src/adapter.c | 10 ++++++----
 1 file changed, 6 insertions(+), 4 deletions(-)

diff --git a/src/adapter.c b/src/adapter.c
index 9de161b..5af8489 100644
--- a/src/adapter.c
+++ b/src/adapter.c
@@ -5373,6 +5373,7 @@ static void update_found_devices(struct btd_adapter *adapter,
 					const bdaddr_t *bdaddr,
 					uint8_t bdaddr_type, int8_t rssi,
 					bool confirm, bool legacy,
+					bool not_connectable,
 					const uint8_t *data, uint8_t data_len)
 {
 	struct btd_device *dev;
@@ -5501,6 +5502,10 @@ static void update_found_devices(struct btd_adapter *adapter,
 	return;
 
 connect_le:
+	/* Ignore non-connectable events */
+	if (not_connectable)
+		return;
+
 	/*
 	 * If we're in the process of stopping passive scanning and
 	 * connecting another (or maybe even the same) LE device just
@@ -5563,15 +5568,12 @@ static void device_found_callback(uint16_t index, uint16_t length,
 	DBG("hci%u addr %s, rssi %d flags 0x%04x eir_len %u",
 			index, addr, ev->rssi, flags, eir_len);
 
-	/* Ignore non-connectable events for now */
-	if (flags & MGMT_DEV_FOUND_NOT_CONNECTABLE)
-		return;
-
 	confirm_name = (flags & MGMT_DEV_FOUND_CONFIRM_NAME);
 	legacy = (flags & MGMT_DEV_FOUND_LEGACY_PAIRING);
 
 	update_found_devices(adapter, &ev->addr.bdaddr, ev->addr.type,
 					ev->rssi, confirm_name, legacy,
+					flags & MGMT_DEV_FOUND_NOT_CONNECTABLE,
 					eir, eir_len);
 }
 
-- 
2.1.0


^ permalink raw reply related	[flat|nested] 15+ messages in thread

* Re: [BlueZ PATCH v2 00/13] Add support for Advertisement Data
  2015-04-16 14:41 [BlueZ PATCH v2 00/13] Add support for Advertisement Data Luiz Augusto von Dentz
                   ` (12 preceding siblings ...)
  2015-04-16 14:41 ` [BlueZ PATCH v2 13/13] core/adapter: Create device even if not-connectable Luiz Augusto von Dentz
@ 2015-04-17 12:18 ` Luiz Augusto von Dentz
  13 siblings, 0 replies; 15+ messages in thread
From: Luiz Augusto von Dentz @ 2015-04-17 12:18 UTC (permalink / raw)
  To: linux-bluetooth

Hi,

On Thu, Apr 16, 2015 at 5:41 PM, Luiz Augusto von Dentz
<luiz.dentz@gmail.com> wrote:
> From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
>
> v2: Fix parsing of ServiceData and add a patch to create device objects
> for non-connectable devices.
>
> This adds support for ServiceData and ManufacturerData and make the
> necessary to bluetoothctl to print them:
>
> [bluetooth]# info XX:XX:XX:XX:XX:XX
> Device XX:XX:XX:XX:XX:XX
>         Alias: XX-XX-XX-XX-XX-XX
>         Paired: no
>         Trusted: no
>         Blocked: no
>         Connected: no
>         LegacyPairing: no
>         ManufacturerData Key: 0x004c
>         ManufacturerData Value: 0x0c
>         ManufacturerData Value: 0x0e
>         ManufacturerData Value: 0x00
>         ManufacturerData Value: 0xf1
>         ManufacturerData Value: 0xa6
>         ManufacturerData Value: 0xdc
>         ManufacturerData Value: 0xa1
>         ManufacturerData Value: 0xc0
>         ManufacturerData Value: 0x51
>         ManufacturerData Value: 0x80
>         ManufacturerData Value: 0xa7
>         ManufacturerData Value: 0x83
>         ManufacturerData Value: 0x62
>         ManufacturerData Value: 0x95
>         ManufacturerData Value: 0x18
>         ManufacturerData Value: 0x79
>
> [bluetooth]# info XX:XX:XX:XX:XX:XX
> Device XX:XX:XX:XX:XX:XX
>         Name: URI Beacon
>         Alias: URI Beacon
>         Paired: no
>         Trusted: no
>         Blocked: no
>         Connected: no
>         LegacyPairing: no
>         UUID: Unknown                   (0000fed8-0000-1000-8000-00805f9b34fb)
>         ServiceData Key: fed8
>         ServiceData Value: 0x00
>         ServiceData Value: 0x20
>         ServiceData Value: 0x00
>         ServiceData Value: 0x63
>         ServiceData Value: 0x72
>         ServiceData Value: 0x6f
>         ServiceData Value: 0x73
>         ServiceData Value: 0x73
>         ServiceData Value: 0x77
>         ServiceData Value: 0x61
>         ServiceData Value: 0x6c
>         ServiceData Value: 0x6b
>         ServiceData Value: 0x2d
>         ServiceData Value: 0x70
>         ServiceData Value: 0x72
>         ServiceData Value: 0x6f
>         ServiceData Value: 0x6a
>         ServiceData Value: 0x65
>         ServiceData Value: 0x63
>         ServiceData Value: 0x74
>         ServiceData Value: 0x08
>
> Currently the data is not stored persistently since it may change over
> time, but it should be relatively easy to change that in case we want to
> persist the information over restart/reboot.
>
> Luiz Augusto von Dentz (13):
>   doc/device-api: Add ServiceData and ManufacturerData
>   shared/ad: Add bt_ad_foreach_manufacturer_data
>   shared/ad: Add bt_ad_has_manufacturer_data
>   core/dbus-common: Add dict helpers for basic keys
>   core: Add implementation of ManufacturerData
>   client: Fix no handling dict properly
>   client: Make command info print ManufacturerData
>   shared/ad: Add bt_ad_foreach_service_data
>   shared/ad: Add bt_ad_has_service_data
>   core: Add implementation of ServiceData
>   client: Make command info print ServiceData
>   core/eir: Fix service data parsing
>   core/adapter: Create device even if not-connectable
>
>  client/main.c      |  12 ++++-
>  doc/device-api.txt |  11 +++++
>  src/adapter.c      |  17 +++++--
>  src/dbus-common.c  |  27 ++++++++---
>  src/dbus-common.h  |   5 ++
>  src/device.c       | 137 +++++++++++++++++++++++++++++++++++++++++++++++++++++
>  src/device.h       |   2 +
>  src/eir.c          |   4 ++
>  src/shared/ad.c    | 120 ++++++++++++++++++++++++++++++++++++----------
>  src/shared/ad.h    |  26 ++++++++++
>  10 files changed, 322 insertions(+), 39 deletions(-)
>
> --
> 2.1.0

Pushed.


-- 
Luiz Augusto von Dentz

^ permalink raw reply	[flat|nested] 15+ messages in thread

end of thread, other threads:[~2015-04-17 12:18 UTC | newest]

Thread overview: 15+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-04-16 14:41 [BlueZ PATCH v2 00/13] Add support for Advertisement Data Luiz Augusto von Dentz
2015-04-16 14:41 ` [BlueZ PATCH v2 01/13] doc/device-api: Add ServiceData and ManufacturerData Luiz Augusto von Dentz
2015-04-16 14:41 ` [BlueZ PATCH v2 02/13] shared/ad: Add bt_ad_foreach_manufacturer_data Luiz Augusto von Dentz
2015-04-16 14:41 ` [BlueZ PATCH v2 03/13] shared/ad: Add bt_ad_has_manufacturer_data Luiz Augusto von Dentz
2015-04-16 14:41 ` [BlueZ PATCH v2 04/13] core/dbus-common: Add dict helpers for basic keys Luiz Augusto von Dentz
2015-04-16 14:41 ` [BlueZ PATCH v2 05/13] core: Add implementation of ManufacturerData Luiz Augusto von Dentz
2015-04-16 14:41 ` [BlueZ PATCH v2 06/13] client: Fix no handling dict properly Luiz Augusto von Dentz
2015-04-16 14:41 ` [BlueZ PATCH v2 07/13] client: Make command info print ManufacturerData Luiz Augusto von Dentz
2015-04-16 14:41 ` [BlueZ PATCH v2 08/13] shared/ad: Add bt_ad_foreach_service_data Luiz Augusto von Dentz
2015-04-16 14:41 ` [BlueZ PATCH v2 09/13] shared/ad: Add bt_ad_has_service_data Luiz Augusto von Dentz
2015-04-16 14:41 ` [BlueZ PATCH v2 10/13] core: Add implementation of ServiceData Luiz Augusto von Dentz
2015-04-16 14:41 ` [BlueZ PATCH v2 11/13] client: Make command info print ServiceData Luiz Augusto von Dentz
2015-04-16 14:41 ` [BlueZ PATCH v2 12/13] core/eir: Fix service data parsing Luiz Augusto von Dentz
2015-04-16 14:41 ` [BlueZ PATCH v2 13/13] core/adapter: Create device even if not-connectable Luiz Augusto von Dentz
2015-04-17 12:18 ` [BlueZ PATCH v2 00/13] Add support for Advertisement Data Luiz Augusto von Dentz

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.