Proximity Monitor interface is registered for each GATT device since profile driver matches by GATT_UUID which is intended only for Reporter role. This patches splits Proximity profile driver into two separate drivers for Monitor and Reporter role to register interfaces properly. --- profiles/proximity/manager.c | 29 +++++++++++++++++++++-------- profiles/proximity/reporter.c | 2 +- profiles/proximity/reporter.h | 2 +- 3 files changed, 23 insertions(+), 10 deletions(-) diff --git a/profiles/proximity/manager.c b/profiles/proximity/manager.c index 39c2bfe..df87cb0 100644 --- a/profiles/proximity/manager.c +++ b/profiles/proximity/manager.c @@ -61,8 +61,6 @@ static int attio_device_probe(struct btd_device *device, GSList *uuids) struct gatt_primary *linkloss, *txpower, *immediate; GSList *l, *primaries; - reporter_device_probe(device); - primaries = btd_device_get_primaries(device); l = g_slist_find_custom(primaries, IMMEDIATE_ALERT_UUID, @@ -81,15 +79,21 @@ static int attio_device_probe(struct btd_device *device, GSList *uuids) static void attio_device_remove(struct btd_device *device) { monitor_unregister(device); - reporter_device_remove(device); } -static struct btd_profile pxp_profile = { - .name = "Proximity GATT Driver", - .remote_uuids = BTD_UUIDS(GATT_UUID, IMMEDIATE_ALERT_UUID, +static struct btd_profile pxp_monitor_profile = { + .name = "Proximity Monitor GATT Driver", + .remote_uuids = BTD_UUIDS(IMMEDIATE_ALERT_UUID, LINK_LOSS_UUID, TX_POWER_UUID), .device_probe = attio_device_probe, .device_remove = attio_device_remove, +}; + +static struct btd_profile pxp_reporter_profile = { + .name = "Proximity Reporter GATT Driver", + .remote_uuids = BTD_UUIDS(GATT_UUID), + .device_probe = reporter_device_probe, + .device_remove = reporter_device_remove, .adapter_probe = reporter_adapter_probe, .adapter_remove = reporter_adapter_remove, @@ -121,10 +125,19 @@ int proximity_manager_init(GKeyFile *config) { load_config_file(config); - return btd_profile_register(&pxp_profile); + if (btd_profile_register(&pxp_monitor_profile) < 0) + return -1; + + if (btd_profile_register(&pxp_reporter_profile) < 0) { + btd_profile_unregister(&pxp_monitor_profile); + return -1; + } + + return 0; } void proximity_manager_exit(void) { - btd_profile_unregister(&pxp_profile); + btd_profile_unregister(&pxp_monitor_profile); + btd_profile_unregister(&pxp_reporter_profile); } diff --git a/profiles/proximity/reporter.c b/profiles/proximity/reporter.c index 3843018..ae6af09 100644 --- a/profiles/proximity/reporter.c +++ b/profiles/proximity/reporter.c @@ -222,7 +222,7 @@ static void register_reporter_device(struct btd_device *device, radapter->devices = g_slist_prepend(radapter->devices, device); } -int reporter_device_probe(struct btd_device *device) +int reporter_device_probe(struct btd_device *device, GSList *uuids) { struct reporter_adapter *radapter; struct btd_adapter *adapter = device_get_adapter(device); diff --git a/profiles/proximity/reporter.h b/profiles/proximity/reporter.h index d038c0e..9b4b3a5 100644 --- a/profiles/proximity/reporter.h +++ b/profiles/proximity/reporter.h @@ -37,7 +37,7 @@ enum { }; void reporter_device_remove(struct btd_device *device); -int reporter_device_probe(struct btd_device *device); +int reporter_device_probe(struct btd_device *device, GSList *uuids); int reporter_adapter_probe(struct btd_adapter *adapter); void reporter_adapter_remove(struct btd_adapter *adapter); -- 1.7.11.3 -- To unsubscribe from this list: send the line "unsubscribe linux-bluetooth" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html