@@ -116,6 +116,7 @@ Methods:
org.bluez.mesh.Error.InvalidArguments
org.bluez.mesh.Error.NotFound,
org.bluez.mesh.Error.AlreadyExists,
+ org.bluez.mesh.Error.Busy,
org.bluez.mesh.Error.Failed
void Leave(uint64 token)
@@ -126,6 +127,8 @@ Methods:
PossibleErrors:
org.bluez.mesh.Error.InvalidArguments
+ org.bluez.mesh.Error.NotFound
+ org.bluez.mesh.Error.Busy
void CreateNetwork(object app_root, array{byte}[16] uuid)
@@ -655,13 +655,21 @@ static struct l_dbus_message *leave_call(struct l_dbus *dbus,
void *user_data)
{
uint64_t token;
+ struct mesh_node *node;
l_debug("Leave");
if (!l_dbus_message_get_arguments(msg, "t", &token))
return dbus_error(msg, MESH_ERROR_INVALID_ARGS, NULL);
- node_remove(node_find_by_token(token));
+ node = node_find_by_token(token);
+ if (!node)
+ return dbus_error(msg, MESH_ERROR_NOT_FOUND, NULL);
+
+ if (node_is_busy(node))
+ return dbus_error(msg, MESH_ERROR_BUSY, NULL);
+
+ node_remove(node);
return l_dbus_message_new_method_return(msg);
}
@@ -88,6 +88,7 @@ struct mesh_node {
char *storage_dir;
uint32_t disc_watch;
uint32_t seq_number;
+ bool busy;
bool provisioner;
uint16_t primary;
struct node_composition comp;
@@ -598,6 +599,11 @@ bool node_is_provisioner(struct mesh_node *node)
return node->provisioner;
}
+bool node_is_busy(struct mesh_node *node)
+{
+ return node->busy;
+}
+
void node_app_key_delete(struct mesh_node *node, uint16_t net_idx,
uint16_t app_idx)
{
@@ -1352,6 +1358,8 @@ static bool add_local_node(struct mesh_node *node, uint16_t unicast, bool kr,
/* Initialize configuration server model */
cfgmod_server_init(node, PRIMARY_ELE_IDX);
+ node->busy = true;
+
return true;
}
@@ -1459,6 +1467,9 @@ static void get_managed_objects_cb(struct l_dbus_message *msg, void *user_data)
struct keyring_net_key net_key;
uint8_t dev_key[16];
+ if (req->type == REQUEST_TYPE_ATTACH)
+ req->attach->busy = false;
+
if (!msg || l_dbus_message_is_error(msg)) {
l_error("Failed to get app's dbus objects");
goto fail;
@@ -1654,6 +1665,12 @@ void node_attach(const char *app_root, const char *sender, uint64_t token,
return;
}
+ /* Check if there is a pending request associated with this node */
+ if (node->busy) {
+ cb(user_data, MESH_ERROR_BUSY, NULL);
+ return;
+ }
+
/* Check if the node is already in use */
if (node->owner) {
l_warn("The node is already in use");
@@ -1674,6 +1691,8 @@ void node_attach(const char *app_root, const char *sender, uint64_t token,
req->attach = node;
req->type = REQUEST_TYPE_ATTACH;
+ node->busy = true;
+
send_managed_objects_request(sender, app_root, req);
}
@@ -2347,6 +2366,8 @@ void node_finalize_new_node(struct mesh_node *node, struct mesh_io *io)
free_node_dbus_resources(node);
mesh_agent_remove(node->agent);
+ node->busy = false;
+
/* Register callback for the node's io */
attach_io(node, io);
}
@@ -39,6 +39,7 @@ struct mesh_node *node_find_by_addr(uint16_t addr);
struct mesh_node *node_find_by_uuid(uint8_t uuid[16]);
struct mesh_node *node_find_by_token(uint64_t token);
bool node_is_provisioner(struct mesh_node *node);
+bool node_is_busy(struct mesh_node *node);
void node_app_key_delete(struct mesh_node *node, uint16_t net_idx,
uint16_t app_idx);
uint16_t node_get_primary(struct mesh_node *node);
@@ -412,8 +412,6 @@ class Application(dbus.service.Object):
token = value
have_token = True
- if attached == False:
- attach(token)
@dbus.service.method(MESH_APPLICATION_IFACE,
in_signature="s", out_signature="")