Re: [PATCH 1/3] android/gatt: Fix scan handling

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Łukasz,

On Sunday 23 of March 2014 21:20:08 Lukasz Rymanowski wrote:
> Android has its own ScanQueue which is used for tracking scanning
> clients which means we do not have to have this logic internally.
> 
> Android will call Scan Off only when his scanQueue is empty.
> ---
>  android/gatt.c | 62 ++++++++++++++++++----------------------------------------
>  1 file changed, 19 insertions(+), 43 deletions(-)
> 
> diff --git a/android/gatt.c b/android/gatt.c
> index 0dfb90e..775adec 100644
> --- a/android/gatt.c
> +++ b/android/gatt.c
> @@ -71,9 +71,9 @@ struct gatt_device {
>  
>  static struct ipc *hal_ipc = NULL;
>  static bdaddr_t adapter_addr;
> +static bool scanning = false;
>  
>  static struct queue *gatt_clients = NULL;
> -static struct queue *scan_clients = NULL;
>  static struct queue *conn_list	= NULL;		/* Connected devices */
>  static struct queue *conn_wait_queue = NULL;	/* Devs waiting to connect */
>  
> @@ -192,13 +192,6 @@ static void handle_client_unregister(const void *buf, uint16_t len)
>  		goto failed;
>  	}
>  
> -	queue_remove_if(scan_clients, match_by_value,
> -						INT_TO_PTR(cmd->client_if));
> -
> -	/* If there is no client interesting in scan, just stop it */
> -	if (queue_isempty(scan_clients))
> -		bt_le_discovery_stop(NULL);
> -
>  	free(cl);
>  	status = HAL_STATUS_SUCCESS;
>  
> @@ -350,7 +343,7 @@ static void le_device_found_handler(bdaddr_t *addr, uint8_t addr_type,
>  	struct hal_ev_gatt_client_scan_result *ev = (void *) buf;
>  	char bda[18];
>  
> -	if (queue_isempty(scan_clients))
> +	if (!scanning)
>  		goto connect;
>  
>  	ba2str(addr, bda);
> @@ -541,51 +534,43 @@ static void handle_client_scan(const void *buf, uint16_t len)
>  	const struct hal_cmd_gatt_client_scan *cmd = buf;
>  	uint8_t status;
>  	void *registered;
> -	void *l;
>  
>  	DBG("new state %d", cmd->start);
>  
>  	registered = queue_find(gatt_clients, match_client_by_id,
>  						INT_TO_PTR(cmd->client_if));
> +	if (!registered) {
> +		error("gatt: Client not registered");
> +		status = HAL_STATUS_FAILED;
> +		goto reply;
> +	}
> +
>  	/* Turn off scan */
>  	if (!cmd->start) {
> -		if (registered)
> -			queue_remove_if(scan_clients, match_by_value,
> -						INT_TO_PTR(cmd->client_if));
> +		DBG("Stopping LE SCAN");
>  
> -		if (queue_isempty(scan_clients)) {
> -			DBG("Stopping LE SCAN");
> +		if (scanning) {
>  			bt_le_discovery_stop(NULL);
> +			scanning = false;
>  		}
>  
>  		status = HAL_STATUS_SUCCESS;
>  		goto reply;
>  	}
>  
> -	/* If device already do scan, reply with success and avoid to add it
> -	 * again to the list
> -	 */
> -	l = queue_find(scan_clients, match_by_value,
> -						INT_TO_PTR(cmd->client_if));
> -	if (l) {
> +	/* Reply success if we already do scan */
> +	if (scanning) {
>  		status = HAL_STATUS_SUCCESS;
>  		goto reply;
>  	}
>  
> +	/* Turn on scan */
>  	if (!bt_le_discovery_start(le_device_found_handler)) {
>  		error("gatt: LE scan switch failed");
>  		status = HAL_STATUS_FAILED;
>  		goto reply;
>  	}
> -
> -	/* Add scan client to the list if its registered */
> -	if (registered && !queue_push_tail(scan_clients,
> -						INT_TO_PTR(cmd->client_if))) {
> -		error("gatt: Cannot push scan client");
> -		status = HAL_STATUS_FAILED;
> -		goto reply;
> -	}
> -
> +	scanning = true;
>  	status = HAL_STATUS_SUCCESS;
>  
>  reply:
> @@ -724,12 +709,10 @@ static void handle_client_connect(const void *buf, uint16_t len)
>  	}
>  
>  	/* Start le scan if not started */
> -	if (queue_isempty(scan_clients)) {
> -		if (!bt_le_discovery_start(le_device_found_handler)) {
> -			error("gatt: Could not start scan");
> -			status = HAL_STATUS_FAILED;
> -			goto reply;
> -		}
> +	if (!scanning && !bt_le_discovery_start(le_device_found_handler)) {
> +		error("gatt: Could not start scan");
> +		status = HAL_STATUS_FAILED;
> +		goto reply;
>  	}
>  
>  	if (!queue_push_tail(conn_wait_queue, dev)) {
> @@ -1226,13 +1209,6 @@ bool bt_gatt_register(struct ipc *ipc, const bdaddr_t *addr)
>  		return false;
>  	}
>  
> -	scan_clients = queue_new();
> -	if (!scan_clients) {
> -		error("gatt: Cannot allocate scan_clients");
> -		queue_destroy(gatt_clients, NULL);
> -		return false;
> -	}
> -
>  	return true;
>  }
>  
> 

As discussed offline, patches 1 and 2 are now pushed. Thanks.

Also please remember to put that info into document describing gatt HAL
when one will be created.

-- 
Best regards, 
Szymon Janc
--
To unsubscribe from this list: send the line "unsubscribe linux-bluetooth" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Bluez Devel]     [Linux Wireless Networking]     [Linux Wireless Personal Area Networking]     [Linux ATH6KL]     [Linux USB Devel]     [Linux Media Drivers]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Big List of Linux Books]

  Powered by Linux