Re: [PATCH v3 3/8] emulator: add BT_HCI_CMD_LE_CREATE_CONN_CANCEL handling

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

 



Hi Jakub,

On Wed, Sep 02, 2015, Jakub Pawlowski wrote:
> This patch adds handling of BT_HCI_CMD_LE_CREATE_CONN_CANCEL command.
> 
> If btdev_set_le_noresp_conn_request is called on btdev, other devices that
> try to connect to it will stuck on BT_HCI_CMD_LE_CREATE_CONN, by not
> sending bt_hci_evt_le_conn_complete event back. Thanks to that,
> BT_HCI_CMD_LE_CREATE_CONN_CANCEL can be triggered to cancel connect
> attempt.
> ---
>  emulator/btdev.c  | 45 +++++++++++++++++++++++++++++++++++++++++++++
>  emulator/btdev.h  |  2 ++
>  emulator/hciemu.c |  8 ++++++++
>  emulator/hciemu.h |  3 +++
>  4 files changed, 58 insertions(+)
> 
> diff --git a/emulator/btdev.c b/emulator/btdev.c
> index 60e8e8c..1645776 100644
> --- a/emulator/btdev.c
> +++ b/emulator/btdev.c
> @@ -145,6 +145,11 @@ struct btdev {
>  	uint16_t sync_train_interval;
>  	uint32_t sync_train_timeout;
>  	uint8_t  sync_train_service_data;
> +
> +	bool     le_noresp_conn_request;
> +	bool     pending_le_conn;
> +	uint8_t  pending_le_conn_addr[6];
> +	uint8_t  pending_le_conn_addr_type;
>  };
>  
>  struct inquiry_data {
> @@ -674,6 +679,11 @@ bool btdev_is_le_scan_enabled(struct btdev *btdev)
>  	return btdev->le_scan_enable;
>  }
>  
> +void btdev_set_le_noresp_conn_request(struct btdev *btdev, bool value)
> +{
> +	btdev->le_noresp_conn_request = value;
> +}
> +
>  static bool use_ssp(struct btdev *btdev1, struct btdev *btdev2)
>  {
>  	if (btdev1->auth_enable || btdev2->auth_enable)
> @@ -1134,6 +1144,9 @@ static void le_conn_complete(struct btdev *btdev,
>  		cc->handle = cpu_to_le16(42);
>  	}
>  
> +	if (btdev->pending_le_conn)
> +		btdev->pending_le_conn = false;
> +
>  	cc->status = status;
>  	cc->peer_addr_type = bdaddr_type;
>  	memcpy(cc->peer_addr, bdaddr, 6);
> @@ -1183,6 +1196,13 @@ static void le_conn_request(struct btdev *btdev, const uint8_t *bdaddr,
>  {
>  	struct btdev *remote = find_btdev_by_bdaddr_type(bdaddr, bdaddr_type);
>  
> +	if (remote && remote->le_noresp_conn_request) {
> +		btdev->pending_le_conn = true;
> +		memcpy(btdev->pending_le_conn_addr, bdaddr, 6);
> +		btdev->pending_le_conn_addr_type = bdaddr_type;
> +		return;
> +	}

btdev.c has a hooks mechanism to avoid adding test-specific complexity
from creeping in by letting the exception handling be in the test code
itself. In this case, couldn't you use command hooks to deal with the
le_create_conn & le_create_conn_cancel commands in the tester and
prevent the default handlers for them from running in btdev.c (by
returning 'false' from the hook callback)?

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