---
mesh/node.c | 75 +++++++++++++++++++++++++----------------------------
1 file changed, 35 insertions(+), 40 deletions(-)
diff --git a/mesh/node.c b/mesh/node.c
index ceb46e4df..e51913edf 100644
--- a/mesh/node.c
+++ b/mesh/node.c
@@ -58,9 +58,11 @@
#define DEFAULT_CRPL 10
#define DEFAULT_SEQUENCE_NUMBER 0
-#define REQUEST_TYPE_JOIN 0
-#define REQUEST_TYPE_ATTACH 1
-#define REQUEST_TYPE_CREATE 2
+enum request_type {
+ REQUEST_TYPE_JOIN,
+ REQUEST_TYPE_ATTACH,
+ REQUEST_TYPE_CREATE,
+};
struct node_element {
char *path;
@@ -110,10 +112,16 @@ struct mesh_node {
};
struct managed_obj_request {
- void *data;
- void *cb;
- void *user_data;
- uint8_t type;
+ union {
+ const uint8_t *uuid;
+ struct mesh_node *node;
+ };
+ union {
+ node_ready_func_t ready_cb;
+ node_join_ready_func_t join_ready_cb;
+ };
+ struct l_dbus_message *pending_msg;
+ enum request_type type;
};
static struct l_queue *nodes;
@@ -1571,7 +1579,7 @@ static void get_managed_objects_cb(struct l_dbus_message *msg, void *user_data)
node = l_new(struct mesh_node, 1);
node->elements = l_queue_new();
} else {
- node = req->data;
+ node = req->node;
}
num_ele = 0;
@@ -1642,8 +1650,6 @@ static void get_managed_objects_cb(struct l_dbus_message *msg, void *user_data)
}
if (req->type == REQUEST_TYPE_ATTACH) {
- node_ready_func_t cb = req->cb;
-
if (num_ele != node->num_ele)
goto fail;
@@ -1652,7 +1658,7 @@ static void get_managed_objects_cb(struct l_dbus_message *msg, void *user_data)
node->disc_watch = l_dbus_add_disconnect_watch(bus,
node->owner, app_disc_cb, node, NULL);
- cb(req->user_data, MESH_ERROR_NONE, node);
+ req->ready_cb(req->pending_msg, MESH_ERROR_NONE, node);
} else
goto fail;
@@ -1665,8 +1671,6 @@ static void get_managed_objects_cb(struct l_dbus_message *msg, void *user_data)
init_storage_dir(node);
} else if (req->type == REQUEST_TYPE_JOIN) {
- node_join_ready_func_t cb = req->cb;
-
if (!agent) {
l_error("Interface %s not found",
MESH_PROVISION_AGENT_INTERFACE);
@@ -1675,22 +1679,20 @@ static void get_managed_objects_cb(struct l_dbus_message *msg, void *user_data)
node->num_ele = num_ele;
set_defaults(node);
- memcpy(node->uuid, req->data, 16);
+ memcpy(node->uuid, req->uuid, 16);
if (!create_node_config(node, node->uuid))
goto fail;
- cb(node, agent);
-
+ req->join_ready_cb(node, agent);
} else {
/* Callback for create node request */
- node_ready_func_t cb = req->cb;
struct keyring_net_key net_key;
uint8_t dev_key[16];
node->num_ele = num_ele;
set_defaults(node);
- memcpy(node->uuid, req->data, 16);
+ memcpy(node->uuid, req->uuid, 16);
if (!create_node_config(node, node->uuid))
goto fail;
@@ -1717,7 +1719,7 @@ static void get_managed_objects_cb(struct l_dbus_message *msg, void *user_data)
if (!keyring_put_net_key(node, PRIMARY_NET_IDX, &net_key))
goto fail;
- cb(req->user_data, MESH_ERROR_NONE, node);
+ req->ready_cb(req->pending_msg, MESH_ERROR_NONE, node);
}
return;
@@ -1726,26 +1728,19 @@ fail:
mesh_agent_remove(agent);
if (!is_new) {
- /* Handle failed Attach request */
- node_ready_func_t cb = req->cb;
-
free_node_dbus_resources(node);
- cb(req->user_data, MESH_ERROR_FAILED, node);
+ req->ready_cb(req->pending_msg, MESH_ERROR_FAILED, node);
} else {
/* Handle failed Join and Create requests */
if (node)
node_remove(node);
- if (req->type == REQUEST_TYPE_JOIN) {
- node_join_ready_func_t cb = req->cb;
-
- cb(NULL, NULL);
- } else {
- node_ready_func_t cb = req->cb;
-
- cb(req->user_data, MESH_ERROR_FAILED, NULL);
- }
+ if (req->type == REQUEST_TYPE_JOIN)
+ req->join_ready_cb(NULL, NULL);
+ else
+ req->ready_cb(req->pending_msg, MESH_ERROR_FAILED,
+ NULL);
}
}
@@ -1770,9 +1765,9 @@ int node_attach(const char *app_path, const char *sender, uint64_t token,
node->owner = l_strdup(sender);
req = l_new(struct managed_obj_request, 1);
- req->data = node;
- req->cb = cb;
- req->user_data = user_data;
+ req->node = node;
+ req->ready_cb = cb;
+ req->pending_msg = user_data;
req->type = REQUEST_TYPE_ATTACH;
l_dbus_method_call(dbus_get_bus(), sender, app_path,
@@ -1794,8 +1789,8 @@ void node_join(const char *app_path, const char *sender, const uint8_t *uuid,
l_debug("");
req = l_new(struct managed_obj_request, 1);
- req->data = (void *) uuid;
- req->cb = cb;
+ req->uuid = uuid;
+ req->join_ready_cb = cb;
req->type = REQUEST_TYPE_JOIN;
l_dbus_method_call(dbus_get_bus(), sender, app_path,
@@ -1813,9 +1808,9 @@ void node_create(const char *app_path, const char *sender, const uint8_t *uuid,
l_debug("");
req = l_new(struct managed_obj_request, 1);
- req->data = (void *) uuid;
- req->cb = cb;
- req->user_data = user_data;
+ req->uuid = uuid;
+ req->ready_cb = cb;
+ req->pending_msg = user_data;
req->type = REQUEST_TYPE_CREATE;
l_dbus_method_call(dbus_get_bus(), sender, app_path,
--
2.22.0