From: Luiz Augusto von Dentz <luiz.von.dentz@xxxxxxxxx> This adds initiator argument to service_accept so profiles accepting the connection can use btd_service_is_initiator to determine if the connection was initiated locally (central) or remotely (peripheral). --- src/device.c | 18 ++++++++++++++++-- src/service.c | 4 +++- src/service.h | 2 +- 3 files changed, 20 insertions(+), 4 deletions(-) diff --git a/src/device.c b/src/device.c index b0309a1e7..a39eb8c64 100644 --- a/src/device.c +++ b/src/device.c @@ -158,6 +158,7 @@ struct bearer_state { bool bonded; bool connected; bool svc_resolved; + bool initiator; }; struct csrk_info { @@ -297,6 +298,16 @@ static struct bearer_state *get_state(struct btd_device *dev, return &dev->le_state; } +static bool get_initiator(struct btd_device *dev) +{ + if (dev->le_state.connected) + return dev->le_state.initiator; + if (dev->bredr_state.connected) + return dev->bredr_state.initiator; + + return false; +} + static GSList *find_service_with_profile(GSList *list, struct btd_profile *p) { GSList *l; @@ -3256,6 +3267,7 @@ void device_remove_connection(struct btd_device *device, uint8_t bdaddr_type) return; state->connected = false; + state->initiator = false; device->general_connect = FALSE; device_set_svc_refreshed(device, false); @@ -4169,7 +4181,7 @@ done: } /* Notify driver about the new connection */ - service_accept(service); + service_accept(service, get_initiator(device)); } static void device_add_gatt_services(struct btd_device *device) @@ -4191,7 +4203,7 @@ static void device_accept_gatt_profiles(struct btd_device *device) GSList *l; for (l = device->services; l != NULL; l = g_slist_next(l)) - service_accept(l->data); + service_accept(l->data, get_initiator(device)); } static void device_remove_gatt_service(struct btd_device *device, @@ -5899,6 +5911,8 @@ int device_connect_le(struct btd_device *dev) /* Keep this, so we can cancel the connection */ dev->att_io = io; + /* Set as initiator */ + dev->le_state.initiator = true; return 0; } diff --git a/src/service.c b/src/service.c index 14a4c292b..7c4dc8fe0 100644 --- a/src/service.c +++ b/src/service.c @@ -172,7 +172,7 @@ void service_remove(struct btd_service *service) btd_service_unref(service); } -int service_accept(struct btd_service *service) +int service_accept(struct btd_service *service, bool initiator) { char addr[18]; int err; @@ -198,6 +198,8 @@ int service_accept(struct btd_service *service) return -ECONNABORTED; } + service->initiator = initiator; + err = service->profile->accept(service); if (!err) goto done; diff --git a/src/service.h b/src/service.h index fa930f985..dc0d1d132 100644 --- a/src/service.h +++ b/src/service.h @@ -35,7 +35,7 @@ struct btd_service *service_create(struct btd_device *device, int service_probe(struct btd_service *service); void service_remove(struct btd_service *service); -int service_accept(struct btd_service *service); +int service_accept(struct btd_service *service, bool initiator); int service_set_connecting(struct btd_service *service); /* Connection control API */ -- 2.35.1