Thread (7 messages) flat view 7 messages, 3 authors, 2021-09-17

Re: [Bluez PATCH v2 1/2] plugins/admin: add adapter_remove handler

From: Yun-hao Chung <hidden>
Date: 2021-09-15 12:32:15

Gentle ping. Thanks.


On Mon, Sep 6, 2021 at 2:03 PM Howard Chung [off-list ref] wrote:
quoted hunk ↗ jump to hunk
From: Yun-Hao Chung <redacted>

Currently admin doesn't handle adapter removed callbacks, which causes
interfaces AdminPolicySet1 and AdminPolicyStatus1 not being
unregistered, which in turns causes these interfaces can not be
re-registered once adapter is back.

This adds handler for adapter_remove.

Reviewed-by: Shyh-In Hwang <redacted>
Reviewed-by: Miao-chen Chou <redacted>
---
tested with following steps
1. rmmod btusb
2. modprobe btusb
3. read allowlist via bluetoothctl

Changes in v2:
1. Fix make errors

 plugins/admin.c | 35 ++++++++++++++++++++++++++++-------
 1 file changed, 28 insertions(+), 7 deletions(-)
diff --git a/plugins/admin.c b/plugins/admin.c
index 02fec04568ba..82c00cabdb6b 100644
--- a/plugins/admin.c
+++ b/plugins/admin.c
@@ -85,6 +85,17 @@ static void admin_policy_free(void *data)
        g_free(admin_policy);
 }

+static void admin_policy_destroy(struct btd_admin_policy *admin_policy)
+{
+       const char *path = adapter_get_path(admin_policy->adapter);
+
+       g_dbus_unregister_interface(dbus_conn, path,
+                                               ADMIN_POLICY_SET_INTERFACE);
+       g_dbus_unregister_interface(dbus_conn, path,
+                                               ADMIN_POLICY_STATUS_INTERFACE);
+       admin_policy_free(admin_policy);
+}
+
 static bool uuid_match(const void *data, const void *match_data)
 {
        const bt_uuid_t *uuid = data;
@@ -492,7 +503,7 @@ static int admin_policy_adapter_probe(struct btd_adapter *adapter)
        if (!g_dbus_register_interface(dbus_conn, adapter_path,
                                        ADMIN_POLICY_SET_INTERFACE,
                                        admin_policy_adapter_methods, NULL,
-                                       NULL, policy_data, admin_policy_free)) {
+                                       NULL, policy_data, NULL)) {
                btd_error(policy_data->adapter_id,
                        "Admin Policy Set interface init failed on path %s",
                                                                adapter_path);
@@ -506,7 +517,7 @@ static int admin_policy_adapter_probe(struct btd_adapter *adapter)
                                        ADMIN_POLICY_STATUS_INTERFACE,
                                        NULL, NULL,
                                        admin_policy_adapter_properties,
-                                       policy_data, admin_policy_free)) {
+                                       policy_data, NULL)) {
                btd_error(policy_data->adapter_id,
                        "Admin Policy Status interface init failed on path %s",
                                                                adapter_path);
@@ -574,10 +585,24 @@ static void admin_policy_device_removed(struct btd_adapter *adapter,
                unregister_device_data(data, NULL);
 }

+static void admin_policy_remove(struct btd_adapter *adapter)
+{
+       DBG("");
+
+       queue_foreach(devices, unregister_device_data, NULL);
+       queue_destroy(devices, g_free);
+
+       if (policy_data) {
+               admin_policy_destroy(policy_data);
+               policy_data = NULL;
+       }
+}
+
 static struct btd_adapter_driver admin_policy_driver = {
        .name   = "admin_policy",
        .probe  = admin_policy_adapter_probe,
        .resume = NULL,
+       .remove = admin_policy_remove,
        .device_resolved = admin_policy_device_added,
        .device_removed = admin_policy_device_removed
 };
@@ -597,11 +622,7 @@ static void admin_exit(void)
        DBG("");

        btd_unregister_adapter_driver(&admin_policy_driver);
-       queue_foreach(devices, unregister_device_data, NULL);
-       queue_destroy(devices, g_free);
-
-       if (policy_data)
-               admin_policy_free(policy_data);
+       admin_policy_remove(NULL);
 }

 BLUETOOTH_PLUGIN_DEFINE(admin, VERSION,
--
2.33.0.153.gba50c8fa24-goog
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help