* [PATCH v5 0/2] core: Add plugin-support for Manufacturer Specific Data EIR
@ 2014-10-20 14:50 Alfonso Acosta
2014-10-20 14:51 ` [PATCH v5 1/2] core: Add Manufacturer Specific Data EIR field Alfonso Acosta
` (2 more replies)
0 siblings, 3 replies; 4+ messages in thread
From: Alfonso Acosta @ 2014-10-20 14:50 UTC (permalink / raw)
To: linux-bluetooth
v5:
* rebased
* fixed warning
* fixed android compilation error
v4:
* Support for multiple MSD fields in the same EIR data block.
* Moved parsing to a separate function: eir_parse_msd()
v3:
* Corrections suggested by Johan on the handling of eir.h
* Parser sanity check on the size of the MSD payload.
* Minor typo correction on commit message.
Alfonso Acosta (2):
core: Add Manufacturer Specific Data EIR field
core: Add subscription API for Manufacturer Specific Data
src/adapter.c | 45 +++++++++++++++++++++++++++++++++++++++++++++
src/adapter.h | 10 ++++++++++
src/eir.c | 22 ++++++++++++++++++++++
src/eir.h | 10 ++++++++++
4 files changed, 87 insertions(+)
--
1.9.1
^ permalink raw reply [flat|nested] 4+ messages in thread
* [PATCH v5 1/2] core: Add Manufacturer Specific Data EIR field
2014-10-20 14:50 [PATCH v5 0/2] core: Add plugin-support for Manufacturer Specific Data EIR Alfonso Acosta
@ 2014-10-20 14:51 ` Alfonso Acosta
2014-10-20 14:51 ` [PATCH v5 2/2] core: Add subscription API for Manufacturer Specific Data Alfonso Acosta
2014-10-25 14:33 ` [PATCH v5 0/2] core: Add plugin-support for Manufacturer Specific Data EIR Johan Hedberg
2 siblings, 0 replies; 4+ messages in thread
From: Alfonso Acosta @ 2014-10-20 14:51 UTC (permalink / raw)
To: linux-bluetooth
Add data structure and parsing support.
---
src/eir.c | 22 ++++++++++++++++++++++
src/eir.h | 10 ++++++++++
2 files changed, 32 insertions(+)
diff --git a/src/eir.c b/src/eir.c
index d22ad91..2ea8731 100644
--- a/src/eir.c
+++ b/src/eir.c
@@ -53,6 +53,8 @@ void eir_data_free(struct eir_data *eir)
eir->hash = NULL;
g_free(eir->randomizer);
eir->randomizer = NULL;
+ g_slist_free_full(eir->msd_list, g_free);
+ eir->msd_list = NULL;
}
static void eir_parse_uuid16(struct eir_data *eir, const void *data,
@@ -137,6 +139,22 @@ static char *name2utf8(const uint8_t *name, uint8_t len)
return g_strdup(utf8_name);
}
+static void eir_parse_msd(struct eir_data *eir, const uint8_t *data,
+ uint8_t len)
+{
+ struct eir_msd *msd;
+
+ if (len < 2 || len > 2 + sizeof(msd->data))
+ return;
+
+ msd = g_malloc(sizeof(*msd));
+ msd->company = get_le16(data);
+ msd->data_len = len - 2;
+ memcpy(&msd->data, data + 2, msd->data_len);
+
+ eir->msd_list = g_slist_append(eir->msd_list, msd);
+}
+
void eir_parse(struct eir_data *eir, const uint8_t *eir_data, uint8_t eir_len)
{
uint16_t len = 0;
@@ -240,6 +258,10 @@ void eir_parse(struct eir_data *eir, const uint8_t *eir_data, uint8_t eir_len)
eir->did_product = data[4] | (data[5] << 8);
eir->did_version = data[6] | (data[7] << 8);
break;
+
+ case EIR_MANUFACTURER_DATA:
+ eir_parse_msd(eir, data, data_len);
+ break;
}
eir_data += field_len + 1;
diff --git a/src/eir.h b/src/eir.h
index e486fa2..86a9527 100644
--- a/src/eir.h
+++ b/src/eir.h
@@ -22,6 +22,8 @@
*
*/
+#include <hci.h>
+
#define EIR_FLAGS 0x01 /* flags */
#define EIR_UUID16_SOME 0x02 /* 16-bit UUID, more available */
#define EIR_UUID16_ALL 0x03 /* 16-bit UUID, all listed */
@@ -37,6 +39,7 @@
#define EIR_SSP_RANDOMIZER 0x0F /* SSP Randomizer */
#define EIR_DEVICE_ID 0x10 /* device ID */
#define EIR_GAP_APPEARANCE 0x19 /* GAP appearance */
+#define EIR_MANUFACTURER_DATA 0xFF /* Manufacturer Specific Data */
/* Flags Descriptions */
#define EIR_LIM_DISC 0x01 /* LE Limited Discoverable Mode */
@@ -47,6 +50,12 @@
#define EIR_SIM_HOST 0x10 /* Simultaneous LE and BR/EDR to Same
Device Capable (Host) */
+struct eir_msd {
+ uint16_t company;
+ uint8_t data[HCI_MAX_EIR_LENGTH];
+ uint8_t data_len;
+};
+
struct eir_data {
GSList *services;
unsigned int flags;
@@ -62,6 +71,7 @@ struct eir_data {
uint16_t did_product;
uint16_t did_version;
uint16_t did_source;
+ GSList *msd_list;
};
void eir_data_free(struct eir_data *eir);
--
1.9.1
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [PATCH v5 2/2] core: Add subscription API for Manufacturer Specific Data
2014-10-20 14:50 [PATCH v5 0/2] core: Add plugin-support for Manufacturer Specific Data EIR Alfonso Acosta
2014-10-20 14:51 ` [PATCH v5 1/2] core: Add Manufacturer Specific Data EIR field Alfonso Acosta
@ 2014-10-20 14:51 ` Alfonso Acosta
2014-10-25 14:33 ` [PATCH v5 0/2] core: Add plugin-support for Manufacturer Specific Data EIR Johan Hedberg
2 siblings, 0 replies; 4+ messages in thread
From: Alfonso Acosta @ 2014-10-20 14:51 UTC (permalink / raw)
To: linux-bluetooth
This patch allows plugins to be notified whenever an adapter receives
Manufacturer Specific Data in the advertising reports from a device.
This can happen when new device is discovered or when we autoconnect
to it.
---
src/adapter.c | 45 +++++++++++++++++++++++++++++++++++++++++++++
src/adapter.h | 10 ++++++++++
2 files changed, 55 insertions(+)
diff --git a/src/adapter.c b/src/adapter.c
index 1a7d4eb..54e7496 100644
--- a/src/adapter.c
+++ b/src/adapter.c
@@ -206,6 +206,7 @@ struct btd_adapter {
gboolean initialized;
GSList *pin_callbacks;
+ GSList *msd_callbacks;
GSList *drivers;
GSList *profiles;
@@ -4549,6 +4550,9 @@ static void adapter_remove(struct btd_adapter *adapter)
g_slist_free(adapter->pin_callbacks);
adapter->pin_callbacks = NULL;
+
+ g_slist_free(adapter->msd_callbacks);
+ adapter->msd_callbacks = NULL;
}
const char *adapter_get_path(struct btd_adapter *adapter)
@@ -4647,6 +4651,29 @@ static void confirm_name(struct btd_adapter *adapter, const bdaddr_t *bdaddr,
confirm_name_timeout, adapter);
}
+static void adapter_msd_notify(struct btd_adapter *adapter,
+ struct btd_device *dev,
+ GSList *msd_list)
+{
+ GSList *cb_l, *cb_next;
+ GSList *msd_l, *msd_next;
+
+ for (cb_l = adapter->msd_callbacks; cb_l != NULL; cb_l = cb_next) {
+ btd_msd_cb_t cb = cb_l->data;
+
+ cb_next = g_slist_next(cb_l);
+
+ for (msd_l = msd_list; msd_l != NULL; msd_l = msd_next) {
+ const struct eir_msd *msd = msd_l->data;
+
+ msd_next = g_slist_next(msd_l);
+
+ cb(adapter, dev, msd->company, msd->data,
+ msd->data_len);
+ }
+ }
+}
+
static void update_found_devices(struct btd_adapter *adapter,
const bdaddr_t *bdaddr,
uint8_t bdaddr_type, int8_t rssi,
@@ -4738,6 +4765,9 @@ static void update_found_devices(struct btd_adapter *adapter,
device_add_eir_uuids(dev, eir_data.services);
+ if (eir_data.msd_list)
+ adapter_msd_notify(adapter, dev, eir_data.msd_list);
+
eir_data_free(&eir_data);
/*
@@ -5173,6 +5203,18 @@ void btd_adapter_unregister_pin_cb(struct btd_adapter *adapter,
adapter->pin_callbacks = g_slist_remove(adapter->pin_callbacks, cb);
}
+void btd_adapter_unregister_msd_cb(struct btd_adapter *adapter,
+ btd_msd_cb_t cb)
+{
+ adapter->msd_callbacks = g_slist_remove(adapter->msd_callbacks, cb);
+}
+
+void btd_adapter_register_msd_cb(struct btd_adapter *adapter,
+ btd_msd_cb_t cb)
+{
+ adapter->msd_callbacks = g_slist_prepend(adapter->msd_callbacks, cb);
+}
+
int btd_adapter_set_fast_connectable(struct btd_adapter *adapter,
gboolean enable)
{
@@ -6663,6 +6705,9 @@ static void connected_callback(uint16_t index, uint16_t length,
btd_device_device_set_name(device, eir_data.name);
}
+ if (eir_data.msd_list)
+ adapter_msd_notify(adapter, device, eir_data.msd_list);
+
eir_data_free(&eir_data);
}
diff --git a/src/adapter.h b/src/adapter.h
index 6801fee..8f4098a 100644
--- a/src/adapter.h
+++ b/src/adapter.h
@@ -138,6 +138,16 @@ struct btd_adapter_pin_cb_iter *btd_adapter_pin_cb_iter_new(
void btd_adapter_pin_cb_iter_free(struct btd_adapter_pin_cb_iter *iter);
bool btd_adapter_pin_cb_iter_end(struct btd_adapter_pin_cb_iter *iter);
+typedef void (*btd_msd_cb_t) (struct btd_adapter *adapter,
+ struct btd_device *dev,
+ uint16_t company,
+ const uint8_t *data,
+ uint8_t data_len);
+void btd_adapter_register_msd_cb(struct btd_adapter *adapter,
+ btd_msd_cb_t cb);
+void btd_adapter_unregister_msd_cb(struct btd_adapter *adapter,
+ btd_msd_cb_t cb);
+
/* If TRUE, enables fast connectabe, i.e. reduces page scan interval and changes
* type. If FALSE, disables fast connectable, i.e. sets page scan interval and
* type to default values. Valid for both connectable and discoverable modes. */
--
1.9.1
^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCH v5 0/2] core: Add plugin-support for Manufacturer Specific Data EIR
2014-10-20 14:50 [PATCH v5 0/2] core: Add plugin-support for Manufacturer Specific Data EIR Alfonso Acosta
2014-10-20 14:51 ` [PATCH v5 1/2] core: Add Manufacturer Specific Data EIR field Alfonso Acosta
2014-10-20 14:51 ` [PATCH v5 2/2] core: Add subscription API for Manufacturer Specific Data Alfonso Acosta
@ 2014-10-25 14:33 ` Johan Hedberg
2 siblings, 0 replies; 4+ messages in thread
From: Johan Hedberg @ 2014-10-25 14:33 UTC (permalink / raw)
To: Alfonso Acosta; +Cc: linux-bluetooth
Hi Alfonso,
On Mon, Oct 20, 2014, Alfonso Acosta wrote:
> v5:
>
> * rebased
> * fixed warning
> * fixed android compilation error
>
> v4:
>
> * Support for multiple MSD fields in the same EIR data block.
> * Moved parsing to a separate function: eir_parse_msd()
>
> v3:
>
> * Corrections suggested by Johan on the handling of eir.h
> * Parser sanity check on the size of the MSD payload.
> * Minor typo correction on commit message.
>
> Alfonso Acosta (2):
> core: Add Manufacturer Specific Data EIR field
> core: Add subscription API for Manufacturer Specific Data
>
> src/adapter.c | 45 +++++++++++++++++++++++++++++++++++++++++++++
> src/adapter.h | 10 ++++++++++
> src/eir.c | 22 ++++++++++++++++++++++
> src/eir.h | 10 ++++++++++
> 4 files changed, 87 insertions(+)
Both of these patches have been applied. Note that I made a small change
to the first one to avoid a dependency on hci.h (by having a dedicated
define in eir.h).
Johan
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2014-10-25 14:33 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-10-20 14:50 [PATCH v5 0/2] core: Add plugin-support for Manufacturer Specific Data EIR Alfonso Acosta
2014-10-20 14:51 ` [PATCH v5 1/2] core: Add Manufacturer Specific Data EIR field Alfonso Acosta
2014-10-20 14:51 ` [PATCH v5 2/2] core: Add subscription API for Manufacturer Specific Data Alfonso Acosta
2014-10-25 14:33 ` [PATCH v5 0/2] core: Add plugin-support for Manufacturer Specific Data EIR Johan Hedberg
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.