core: add is_allowed property in btd_service
authorYun-Hao Chung <howardchung@chromium.org>
Tue, 3 Aug 2021 11:43:05 +0000 (19:43 +0800)
committerAyush Garg <ayush.garg@samsung.com>
Fri, 11 Mar 2022 13:38:36 +0000 (19:08 +0530)
This adds is_allowed property in btd_service. When is_allowed is set to
false, calling btd_service_connect and service_accept will fail and the
existing service connection gets disconnected.

Reviewed-by: Miao-chen Chou <mcchou@chromium.org>
Signed-off-by: Anuj Jain <anuj01.jain@samsung.com>
Signed-off-by: Ayush Garg <ayush.garg@samsung.com>
src/service.c
src/service.h

index 9072f98..40f0fa5 100755 (executable)
@@ -41,6 +41,7 @@ struct btd_service {
        void                    *user_data;
        btd_service_state_t     state;
        int                     err;
+       bool                    is_allowed;
 };
 
 struct service_state_callback {
@@ -133,6 +134,7 @@ struct btd_service *service_create(struct btd_device *device,
        service->device = device; /* Weak ref */
        service->profile = profile;
        service->state = BTD_SERVICE_STATE_UNAVAILABLE;
+       service->is_allowed = true;
 
        return service;
 }
@@ -190,6 +192,12 @@ int service_accept(struct btd_service *service)
        if (!service->profile->accept)
                return -ENOSYS;
 
+       if (!service->is_allowed) {
+               info("service %s is not allowed",
+                                               service->profile->remote_uuid);
+               return -ECONNABORTED;
+       }
+
        err = service->profile->accept(service);
        if (!err)
                goto done;
@@ -252,6 +260,12 @@ int btd_service_connect(struct btd_service *service)
                return -EBUSY;
        }
 
+       if (!service->is_allowed) {
+               info("service %s is not allowed",
+                                               service->profile->remote_uuid);
+               return -ECONNABORTED;
+       }
+
        err = profile->connect(service);
        if (err == 0) {
                change_state(service, BTD_SERVICE_STATE_CONNECTING, 0);
@@ -368,6 +382,25 @@ bool btd_service_remove_state_cb(unsigned int id)
        return false;
 }
 
+void btd_service_set_allowed(struct btd_service *service, bool allowed)
+{
+       if (allowed == service->is_allowed)
+               return;
+
+       service->is_allowed = allowed;
+
+       if (!allowed && (service->state == BTD_SERVICE_STATE_CONNECTING ||
+                       service->state == BTD_SERVICE_STATE_CONNECTED)) {
+               btd_service_disconnect(service);
+               return;
+       }
+}
+
+bool btd_service_is_allowed(struct btd_service *service)
+{
+       return service->is_allowed;
+}
+
 void btd_service_connecting_complete(struct btd_service *service, int err)
 {
 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
index 88530cc..5a2a024 100755 (executable)
@@ -51,6 +51,8 @@ int btd_service_get_error(const struct btd_service *service);
 unsigned int btd_service_add_state_cb(btd_service_state_cb cb,
                                                        void *user_data);
 bool btd_service_remove_state_cb(unsigned int id);
+void btd_service_set_allowed(struct btd_service *service, bool allowed);
+bool btd_service_is_allowed(struct btd_service *service);
 
 /* Functions used by profile implementation */
 void btd_service_connecting_complete(struct btd_service *service, int err);