Re: [PATCHv2 1/6] android/health: Set L2CAP mode for MCAP channels

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

 



Hi Andrei,

On Monday 30 of June 2014 15:53:44 Andrei Emeltchenko wrote:
> From: Andrei Emeltchenko <andrei.emeltchenko@xxxxxxxxx>
> 
> Check configuration and set L2CAP mode. Enables several PTS test cases.
> ---
>  android/health.c | 73 ++++++++++++++++++++++++++++++++++++++++++++------------
>  1 file changed, 58 insertions(+), 15 deletions(-)
> 
> diff --git a/android/health.c b/android/health.c
> index 83ae107..fcb40f2 100644
> --- a/android/health.c
> +++ b/android/health.c
> @@ -1301,24 +1301,18 @@ static struct health_channel *create_channel(struct health_app *app,
>  	return channel;
>  }
>  
> -static struct health_channel *connect_channel(struct mcap_mcl *mcl,
> -								uint8_t mdepid)
> +static struct health_channel *connect_channel(struct health_app *app,
> +							struct mcap_mcl *mcl,
> +							uint8_t mdepid)
>  {
> -	struct health_app *app;
>  	struct health_device *device;
>  	struct health_channel *channel = NULL;
>  	bdaddr_t addr;
>  
> -	DBG("mcl %p mdepid %u", mcl, mdepid);
> +	DBG("app %p mdepid %u", app, mdepid);
>  
>  	mcap_mcl_get_addr(mcl, &addr);
>  
> -	if (mdepid == MDEP_ECHO)
> -		/* For echo service take last app */
> -		app = queue_peek_tail(apps);
> -	else
> -		app = search_app_by_mdepid(mdepid);
> -
>  	if (!app) {
>  		DBG("No app found for mdepid %u", mdepid);
>  		return NULL;
> @@ -1330,25 +1324,41 @@ static struct health_channel *connect_channel(struct mcap_mcl *mcl,
>  
>  	channel = create_channel(app, mdepid, device);
>  
> -	/* Channel is assigned here after creation */
> -	mcl->cb->user_data = channel;
> -
>  	return channel;
>  }
>  
> +static uint8_t conf_to_l2cap(uint8_t conf)
> +{
> +	return conf == CHANNEL_TYPE_STREAM ? L2CAP_MODE_STREAMING :
> +								L2CAP_MODE_ERTM;
> +}
> +
>  static uint8_t mcap_mdl_conn_req_cb(struct mcap_mcl *mcl, uint8_t mdepid,
>  				uint16_t mdlid, uint8_t *conf, void *data)
>  {
>  	GError *gerr = NULL;
>  	struct health_channel *channel;
> +	struct health_app *app;
> +	struct mdep_cfg *mdep;
>  
>  	DBG("Data channel request: mdepid %u mdlid %u", mdepid, mdlid);
>  
> -	/* TODO: find / create device */
> -	channel = connect_channel(mcl, mdepid);
> +	if (mdepid == MDEP_ECHO)
> +		/* For echo service take last app */
> +		app = queue_peek_tail(apps);
> +	else
> +		app = search_app_by_mdepid(mdepid);
> +
> +	if (!app)
> +		return MCAP_MDL_BUSY;
> +
> +	channel = connect_channel(app, mcl, mdepid);
>  	if (!channel)
>  		return MCAP_MDL_BUSY;
>  
> +	/* Channel is assigned here after creation */
> +	mcl->cb->user_data = channel;
> +
>  	if (mdepid == MDEP_ECHO) {
>  		switch (*conf) {
>  		case CHANNEL_TYPE_ANY:
> @@ -1379,6 +1389,39 @@ static uint8_t mcap_mdl_conn_req_cb(struct mcap_mcl *mcl, uint8_t mdepid,
>  		return MCAP_SUCCESS;
>  	}
>  
> +	mdep = queue_find(app->mdeps, match_mdep_by_id, INT_TO_PTR(mdepid));
> +	if (!mdep)
> +		return MCAP_MDL_BUSY;
> +
> +	switch (*conf) {
> +	case CHANNEL_TYPE_ANY:
> +		if (mdep->role == HAL_HEALTH_MDEP_ROLE_SINK)
> +			return MCAP_CONFIGURATION_REJECTED;
> +		else
> +			*conf = CHANNEL_TYPE_RELIABLE;
> +		break;
> +	case CHANNEL_TYPE_STREAM:
> +		if (mdep->role == HAL_HEALTH_MDEP_ROLE_SOURCE)
> +			return MCAP_CONFIGURATION_REJECTED;
> +		break;
> +	case CHANNEL_TYPE_RELIABLE:
> +		if (mdep->role == HAL_HEALTH_MDEP_ROLE_SOURCE)
> +			return MCAP_CONFIGURATION_REJECTED;
> +		break;
> +	default:
> +		/* Special case defined in HDP spec 3.4. When an invalid
> +		* configuration is received we shall close the MCL when
> +		* we are still processing the callback. */
> +		/* TODO: close device */
> +		return MCAP_CONFIGURATION_REJECTED; /* not processed */
> +	}
> +
> +	if (!mcap_set_data_chan_mode(mcap, conf_to_l2cap(*conf), &gerr)) {
> +		error("health: error setting L2CAP mode: %s", gerr->message);
> +		g_error_free(gerr);
> +		return MCAP_MDL_BUSY;
> +	}
> +
>  	return MCAP_SUCCESS;
>  }
 
All patches applied, thanks. 

-- 
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