diff mbox series

[BlueZ,4/4] mesh: Add "node is busy" check for Leave() method

Message ID 20200609035909.51061-5-inga.stotland@intel.com (mailing list archive)
State Superseded
Headers show
Series Put safeguards around Leave call | expand

Commit Message

Stotland, Inga June 9, 2020, 3:59 a.m. UTC
This introduces the following behavior change for Leave() method:

If Leave method is called for a node that is being processed as a result
of a Create, Import, Join or Attach method calls in progress, node removal
is not allowed and org.bluez.mesh.Error.Busy error is returned.
---
 doc/mesh-api.txt |  2 ++
 mesh/mesh.c      |  5 ++++-
 mesh/node.c      | 19 +++++++++++++++++--
 mesh/node.h      |  2 +-
 4 files changed, 24 insertions(+), 4 deletions(-)

Comments

Stotland, Inga June 9, 2020, 2:35 p.m. UTC | #1
Please disregard this patch. Needs more thought. Patches 1-3 still
okay.

On Mon, 2020-06-08 at 20:59 -0700, Inga Stotland wrote:
> This introduces the following behavior change for Leave() method:
> 
> If Leave method is called for a node that is being processed as a result
> of a Create, Import, Join or Attach method calls in progress, node removal
> is not allowed and org.bluez.mesh.Error.Busy error is returned.
> ---
>  doc/mesh-api.txt |  2 ++
>  mesh/mesh.c      |  5 ++++-
>  mesh/node.c      | 19 +++++++++++++++++--
>  mesh/node.h      |  2 +-
>  4 files changed, 24 insertions(+), 4 deletions(-)
> 
> diff --git a/doc/mesh-api.txt b/doc/mesh-api.txt
> index e85f0bf52..b2eadc357 100644
> --- a/doc/mesh-api.txt
> +++ b/doc/mesh-api.txt
> @@ -126,6 +126,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)
>  
> diff --git a/mesh/mesh.c b/mesh/mesh.c
> index a5935c216..0a933ffed 100644
> --- a/mesh/mesh.c
> +++ b/mesh/mesh.c
> @@ -655,13 +655,16 @@ static struct l_dbus_message *leave_call(struct l_dbus *dbus,
>  						void *user_data)
>  {
>  	uint64_t token;
> +	int result;
>  
>  	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));
> +	result = node_remove(node_find_by_token(token));
> +	if (result != MESH_ERROR_NONE)
> +		return dbus_error(msg, result, NULL);
>  
>  	return l_dbus_message_new_method_return(msg);
>  }
> diff --git a/mesh/node.c b/mesh/node.c
> index 7ec06437b..a4c60ccb1 100644
> --- a/mesh/node.c
> +++ b/mesh/node.c
> @@ -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;
> @@ -344,16 +345,21 @@ static void free_node_resources(void *data)
>   * This function is called to free resources and remove the
>   * configuration files for the specified node.
>   */
> -void node_remove(struct mesh_node *node)
> +int node_remove(struct mesh_node *node)
>  {
>  	if (!node)
> -		return;
> +		return MESH_ERROR_NOT_FOUND;
> +
> +	if (node->busy)
> +		return MESH_ERROR_BUSY;
>  
>  	l_queue_remove(nodes, node);
>  
>  	mesh_config_destroy_nvm(node->cfg);
>  
>  	free_node_resources(node);
> +
> +	return MESH_ERROR_NONE;
>  }
>  
>  static bool add_models_from_storage(struct mesh_node *node,
> @@ -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;
> @@ -1674,6 +1685,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 +2360,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);
>  }
> diff --git a/mesh/node.h b/mesh/node.h
> index e26d410c8..c201670b8 100644
> --- a/mesh/node.h
> +++ b/mesh/node.h
> @@ -30,7 +30,7 @@ typedef void (*node_ready_func_t) (void *user_data, int status,
>  typedef void (*node_join_ready_func_t) (struct mesh_node *node,
>  						struct mesh_agent *agent);
>  
> -void node_remove(struct mesh_node *node);
> +int node_remove(struct mesh_node *node);
>  void node_join(const char *app_root, const char *sender, const uint8_t *uuid,
>  						node_join_ready_func_t cb);
>  uint8_t *node_uuid_get(struct mesh_node *node);
diff mbox series

Patch

diff --git a/doc/mesh-api.txt b/doc/mesh-api.txt
index e85f0bf52..b2eadc357 100644
--- a/doc/mesh-api.txt
+++ b/doc/mesh-api.txt
@@ -126,6 +126,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)
 
diff --git a/mesh/mesh.c b/mesh/mesh.c
index a5935c216..0a933ffed 100644
--- a/mesh/mesh.c
+++ b/mesh/mesh.c
@@ -655,13 +655,16 @@  static struct l_dbus_message *leave_call(struct l_dbus *dbus,
 						void *user_data)
 {
 	uint64_t token;
+	int result;
 
 	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));
+	result = node_remove(node_find_by_token(token));
+	if (result != MESH_ERROR_NONE)
+		return dbus_error(msg, result, NULL);
 
 	return l_dbus_message_new_method_return(msg);
 }
diff --git a/mesh/node.c b/mesh/node.c
index 7ec06437b..a4c60ccb1 100644
--- a/mesh/node.c
+++ b/mesh/node.c
@@ -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;
@@ -344,16 +345,21 @@  static void free_node_resources(void *data)
  * This function is called to free resources and remove the
  * configuration files for the specified node.
  */
-void node_remove(struct mesh_node *node)
+int node_remove(struct mesh_node *node)
 {
 	if (!node)
-		return;
+		return MESH_ERROR_NOT_FOUND;
+
+	if (node->busy)
+		return MESH_ERROR_BUSY;
 
 	l_queue_remove(nodes, node);
 
 	mesh_config_destroy_nvm(node->cfg);
 
 	free_node_resources(node);
+
+	return MESH_ERROR_NONE;
 }
 
 static bool add_models_from_storage(struct mesh_node *node,
@@ -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;
@@ -1674,6 +1685,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 +2360,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);
 }
diff --git a/mesh/node.h b/mesh/node.h
index e26d410c8..c201670b8 100644
--- a/mesh/node.h
+++ b/mesh/node.h
@@ -30,7 +30,7 @@  typedef void (*node_ready_func_t) (void *user_data, int status,
 typedef void (*node_join_ready_func_t) (struct mesh_node *node,
 						struct mesh_agent *agent);
 
-void node_remove(struct mesh_node *node);
+int node_remove(struct mesh_node *node);
 void node_join(const char *app_root, const char *sender, const uint8_t *uuid,
 						node_join_ready_func_t cb);
 uint8_t *node_uuid_get(struct mesh_node *node);