mesh: Add Time-outs to critical dbus send-with-replies 15/234215/1
authorBrian Gix <brian.gix@intel.com>
Tue, 14 Apr 2020 08:55:57 +0000 (10:55 +0200)
committerAbhay Agarwal <ay.agarwal@samsung.com>
Fri, 22 May 2020 04:23:43 +0000 (09:53 +0530)
JoinComplete() dbus method calls are the only time that node tokens are
delivered to client Applications, so if the call fails for any reason
(including time-outs) the daemon has a way to clean-up the stale unused
node data.

Change-Id: I9a524fc93a2987ec4d3480c6caaa10726d9d77c6
Signed-off-by: Abhay Agarwal <ay.agarwal@samsung.com>
mesh/dbus.c
mesh/dbus.h
mesh/mesh.c

index 6b9694a..bf0f73b 100644 (file)
@@ -37,6 +37,14 @@ struct error_entry {
        const char *default_desc;
 };
 
+struct send_info {
+       struct l_dbus *dbus;
+       struct l_timeout *timeout;
+       l_dbus_message_func_t cb;
+       void *user_data;
+       uint32_t serial;
+};
+
 /*
  * Important: The entries in this table follow the order of
  * enumerated values in mesh_error (file error.h)
@@ -143,3 +151,35 @@ void dbus_append_dict_entry_basic(struct l_dbus_message_builder *builder,
        l_dbus_message_builder_leave_variant(builder);
        l_dbus_message_builder_leave_dict(builder);
 }
+
+static void send_reply(struct l_dbus_message *message, void *user_data)
+{
+       struct send_info *info = user_data;
+
+       l_timeout_remove(info->timeout);
+       info->cb(message, info->user_data);
+       l_free(info);
+}
+
+static void send_timeout(struct l_timeout *timeout, void *user_data)
+{
+       struct send_info *info = user_data;
+
+       l_dbus_cancel(info->dbus, info->serial);
+       send_reply(NULL, info);
+}
+
+void dbus_send_with_timeout(struct l_dbus *dbus, struct l_dbus_message *msg,
+                                               l_dbus_message_func_t cb,
+                                               void *user_data,
+                                               unsigned int seconds)
+{
+       struct send_info *info = l_new(struct send_info, 1);
+
+       info->dbus = dbus;
+       info->cb = cb;
+       info->user_data = user_data;
+       info->serial = l_dbus_send_with_reply(dbus, msg, send_reply,
+                                                               info, NULL);
+       info->timeout = l_timeout_create(seconds, send_timeout, info, NULL);
+}
index e7643a5..aafb85f 100644 (file)
@@ -20,6 +20,8 @@
 #define BLUEZ_MESH_PATH "/org/bluez/mesh"
 #define BLUEZ_MESH_SERVICE "org.bluez.mesh"
 
+#define DEFAULT_DBUS_TIMEOUT   30
+
 bool dbus_init(struct l_dbus *dbus);
 struct l_dbus *dbus_get_bus(void);
 void dbus_append_byte_array(struct l_dbus_message_builder *builder,
@@ -31,3 +33,7 @@ bool dbus_match_interface(struct l_dbus_message_iter *interfaces,
                                                        const char *match);
 struct l_dbus_message *dbus_error(struct l_dbus_message *msg, int err,
                                                const char *description);
+void dbus_send_with_timeout(struct l_dbus *dbus, struct l_dbus_message *msg,
+                                               l_dbus_message_func_t cb,
+                                               void *user_data,
+                                               unsigned int seconds);
index 807b152..51115b4 100644 (file)
@@ -460,7 +460,7 @@ static bool prov_complete_cb(void *user_data, uint8_t status,
        path = node_get_app_path(join_pending->node);
 
        if (status == PROV_ERR_SUCCESS &&
-           !node_add_pending_local(join_pending->node, info))
+                       !node_add_pending_local(join_pending->node, info))
                status = PROV_ERR_UNEXPECTED_ERR;
 
        if (status != PROV_ERR_SUCCESS) {
@@ -476,8 +476,8 @@ static bool prov_complete_cb(void *user_data, uint8_t status,
                                                "JoinComplete");
 
        l_dbus_message_set_arguments(msg, "t", l_get_be64(token));
-       l_dbus_send_with_reply(dbus, msg,
-                               prov_join_complete_reply_cb, NULL, NULL);
+       dbus_send_with_timeout(dbus, msg, prov_join_complete_reply_cb,
+                                               NULL, DEFAULT_DBUS_TIMEOUT);
 
        return true;
 }
@@ -722,8 +722,8 @@ static void create_node_ready_cb(void *user_data, int status,
                                                "JoinComplete");
 
        l_dbus_message_set_arguments(msg, "t", l_get_be64(token));
-       l_dbus_send_with_reply(dbus, msg,
-                               create_join_complete_reply_cb, node, NULL);
+       dbus_send_with_timeout(dbus, msg, create_join_complete_reply_cb,
+                                               node, DEFAULT_DBUS_TIMEOUT);
 }
 
 static struct l_dbus_message *create_network_call(struct l_dbus *dbus,