From patchwork Tue Aug 1 16:38:38 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Pauli Virtanen X-Patchwork-Id: 13337000 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id DF184C41513 for ; Tue, 1 Aug 2023 16:38:54 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231506AbjHAQiy (ORCPT ); Tue, 1 Aug 2023 12:38:54 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:60834 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231396AbjHAQiu (ORCPT ); Tue, 1 Aug 2023 12:38:50 -0400 Received: from lahtoruutu.iki.fi (lahtoruutu.iki.fi [185.185.170.37]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 4E9281FFA for ; Tue, 1 Aug 2023 09:38:48 -0700 (PDT) Received: from monolith.lan (unknown [193.138.7.198]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: pav) by lahtoruutu.iki.fi (Postfix) with ESMTPSA id 4RFgm62r5Zz49Q80; Tue, 1 Aug 2023 19:38:46 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=iki.fi; s=lahtoruutu; t=1690907926; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=cWDF6NzBpd2qffF2qX/Q4yfm5FctR7l8DJawxZV+a3E=; b=tj0542y2DIUUdYwHUgWtMte6Q9jDLoUTmT7kECOB3ia1vI92E2UqmigHjNPL3sBYSYlPp3 Pff5j/XhNbRGYEbhYPY9u1nPUeONncjo647POoP/yJnrd8whRAMx5QDkizcqjCNV+Uh5oE rKZ76N+jtBpe6kE+55a1a+aYVbwX85TPVKhvTFmK7Ie3kyxqYJyLw3SZUPm/alvJkmsUlt Niwra6+fy1zRm4LZOH+bAL/P6hDpbJpayRdPJNKV/1Z0GRobJtpuSIU24+F7qX+04uZ8dP xbOBgFhQOrcKwz6G4+6vhZvFy9Din3C/dfrN7hJCphvA4lpPaJ2VqeqT9XMk5A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=iki.fi; s=lahtoruutu; t=1690907926; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=cWDF6NzBpd2qffF2qX/Q4yfm5FctR7l8DJawxZV+a3E=; b=t14LqmqQ6a8TXLVtc53H4luh98C0oHdO0ogNAFyY7gneWFXIQvmRvHngXHtVuf6aXUUsJl NOA+kJTuQiAsWUVDvWBOukjw3siz9k5+UOVAHM5kxFuquBVibihUCMicnaxm4+nxBT+EaR h4RSx9J1yl+KrwhTS1dINcGFK8nOEDOFcXJd7ZFbmzjJXvDBdAySMxfNG9KQ/o7mZIoINc woSCuiSpn9Y/h9wFWkjIGX2IO0laBmFiG11x7laxrsW3qHXWZEqTh7mZYvq/h2MVzEroUf UiD+5ZdJvJK/09036RLj9uu0Dci2Qgpy0N2Gbglaj2M3jRI7sL8o38JTE1Gmfg== ARC-Authentication-Results: i=1; ORIGINATING; auth=pass smtp.auth=pav smtp.mailfrom=pav@iki.fi ARC-Seal: i=1; s=lahtoruutu; d=iki.fi; t=1690907926; a=rsa-sha256; cv=none; b=SfjuVWgBklRgxGBieApexnNXGZzeIEs/cFB/P2PqFX8qwHtJKn6a18MYbCwCMvU23D+Ax9 Cw5qPp7V9nT3X0Gxo6D4ma/TeB76V/gjDHndj96qGhfb9ERzOF2EOnVPtvCQ3qyXA5gHMr PSDPN+lrevukymJhuqLGPDzsgWhW3Z5ewovnqVyP3bTSElyIPhEF+hejZfs708INIluWLq znoUCZVEjYyLSnGMf/yrYyl62NGlihrgB9TcYQhTHmOUeA+4shYjMCvNOhzgm6Y6dUsh80 ONooK8K+lCrOS0v2jNGe5Rp5JmjDqbWCb2QO1OpQvoCHNVxmce+yWckCezBodQ== From: Pauli Virtanen To: linux-bluetooth@vger.kernel.org Cc: Pauli Virtanen Subject: [PATCH BlueZ v2 1/5] btdev: check error conditions for HCI_Create_Connection_Cancel Date: Tue, 1 Aug 2023 19:38:38 +0300 Message-ID: <5eca51146b08a512052261b88ae5c8a7437af5fc.1690907478.git.pav@iki.fi> X-Mailer: git-send-email 2.41.0 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-bluetooth@vger.kernel.org Create Connection Cancel shall return Command Complete with error status when there is no Create Connection that can be canceled. In these cases, we should not send a (spurious) Connection Complete event. Fix by keeping a list of pending Create Connection commands, and returning command errors if there is none pending at the moment. --- Notes: v2: emit Command_Complete (not Status) + fix compile emulator/btdev.c | 86 +++++++++++++++++++++++++++++++++++++++++------- monitor/bt.h | 4 +++ 2 files changed, 79 insertions(+), 11 deletions(-) diff --git a/emulator/btdev.c b/emulator/btdev.c index 637f0bb98..8658b4121 100644 --- a/emulator/btdev.c +++ b/emulator/btdev.c @@ -62,6 +62,7 @@ struct hook { #define MAX_HOOK_ENTRIES 16 #define MAX_EXT_ADV_SETS 3 +#define MAX_PENDING_CONN 16 struct btdev_conn { uint16_t handle; @@ -223,6 +224,8 @@ struct btdev { uint8_t le_rl_enable; uint16_t le_rl_timeout; + struct btdev *pending_conn[MAX_PENDING_CONN]; + uint8_t le_local_sk256[32]; uint16_t sync_train_interval; @@ -1211,10 +1214,36 @@ static struct btdev_conn *conn_link_bis(struct btdev *dev, struct btdev *remote, return conn; } +static void pending_conn_add(struct btdev *btdev, struct btdev *remote) +{ + unsigned int i; + + for (i = 0; i < ARRAY_SIZE(btdev->pending_conn); ++i) { + if (!btdev->pending_conn[i]) { + btdev->pending_conn[i] = remote; + return; + } + } +} + +static bool pending_conn_del(struct btdev *btdev, struct btdev *remote) +{ + unsigned int i; + + for (i = 0; i < ARRAY_SIZE(btdev->pending_conn); ++i) { + if (btdev->pending_conn[i] == remote) { + btdev->pending_conn[i] = NULL; + return true; + } + } + return false; +} + static void conn_complete(struct btdev *btdev, const uint8_t *bdaddr, uint8_t status) { struct bt_hci_evt_conn_complete cc; + struct btdev *remote = find_btdev_by_bdaddr(bdaddr); if (!status) { struct btdev_conn *conn; @@ -1223,6 +1252,8 @@ static void conn_complete(struct btdev *btdev, if (!conn) return; + pending_conn_del(conn->link->dev, btdev); + cc.status = status; memcpy(cc.bdaddr, btdev->bdaddr, 6); cc.encr_mode = 0x00; @@ -1240,6 +1271,8 @@ static void conn_complete(struct btdev *btdev, cc.link_type = 0x01; } + pending_conn_del(btdev, remote); + cc.status = status; memcpy(cc.bdaddr, bdaddr, 6); cc.encr_mode = 0x00; @@ -1260,6 +1293,8 @@ static int cmd_create_conn_complete(struct btdev *dev, const void *data, memcpy(cr.dev_class, dev->dev_class, 3); cr.link_type = 0x01; + pending_conn_add(dev, remote); + send_event(remote, BT_HCI_EVT_CONN_REQUEST, &cr, sizeof(cr)); } else { conn_complete(dev, cmd->bdaddr, BT_HCI_ERR_PAGE_TIMEOUT); @@ -1296,16 +1331,24 @@ static int cmd_add_sco_conn(struct btdev *dev, const void *data, uint8_t len) cc.encr_mode = 0x00; done: + pending_conn_del(dev, conn->link->dev); + send_event(dev, BT_HCI_EVT_CONN_COMPLETE, &cc, sizeof(cc)); return 0; } +static bool match_bdaddr(const void *data, const void *match_data) +{ + const struct btdev_conn *conn = data; + const uint8_t *bdaddr = match_data; + + return !memcmp(conn->link->dev->bdaddr, bdaddr, 6); +} + static int cmd_create_conn_cancel(struct btdev *dev, const void *data, uint8_t len) { - cmd_status(dev, BT_HCI_ERR_SUCCESS, BT_HCI_CMD_CREATE_CONN_CANCEL); - return 0; } @@ -1313,8 +1356,37 @@ static int cmd_create_conn_cancel_complete(struct btdev *dev, const void *data, uint8_t len) { const struct bt_hci_cmd_create_conn_cancel *cmd = data; + struct bt_hci_rsp_create_conn_cancel rp; + struct btdev *remote = find_btdev_by_bdaddr(cmd->bdaddr); + struct btdev_conn *conn; - conn_complete(dev, cmd->bdaddr, BT_HCI_ERR_UNKNOWN_CONN_ID); + /* BLUETOOTH CORE SPECIFICATION Version 5.4 | Vol 4, Part E page 1848 + * + * If the connection is already established, and the + * HCI_Connection_Complete event has been sent, then the Controller + * shall return an HCI_Command_Complete event with the error code + * Connection Already Exists (0x0B). If the HCI_Create_Connection_Cancel + * command is sent to the Controller without a preceding + * HCI_Create_Connection command to the same device, the BR/EDR + * Controller shall return an HCI_Command_Complete event with the error + * code Unknown Connection Identifier (0x02). + */ + if (pending_conn_del(dev, remote)) { + rp.status = BT_HCI_ERR_SUCCESS; + } else { + conn = queue_find(dev->conns, match_bdaddr, cmd->bdaddr); + if (conn) + rp.status = BT_HCI_ERR_CONN_ALREADY_EXISTS; + else + rp.status = BT_HCI_ERR_UNKNOWN_CONN_ID; + } + + memcpy(rp.bdaddr, cmd->bdaddr, sizeof(rp.bdaddr)); + + cmd_complete(dev, BT_HCI_CMD_CREATE_CONN_CANCEL, &rp, sizeof(rp)); + + if (!rp.status) + conn_complete(dev, cmd->bdaddr, BT_HCI_ERR_UNKNOWN_CONN_ID); return 0; } @@ -1372,14 +1444,6 @@ static int cmd_link_key_reply(struct btdev *dev, const void *data, uint8_t len) return 0; } -static bool match_bdaddr(const void *data, const void *match_data) -{ - const struct btdev_conn *conn = data; - const uint8_t *bdaddr = match_data; - - return !memcmp(conn->link->dev->bdaddr, bdaddr, 6); -} - static void auth_complete(struct btdev_conn *conn, uint8_t status) { struct bt_hci_evt_auth_complete ev; diff --git a/monitor/bt.h b/monitor/bt.h index dca2dc8b8..6fb81abfe 100644 --- a/monitor/bt.h +++ b/monitor/bt.h @@ -590,6 +590,10 @@ struct bt_hci_cmd_add_sco_conn { struct bt_hci_cmd_create_conn_cancel { uint8_t bdaddr[6]; } __attribute__ ((packed)); +struct bt_hci_rsp_create_conn_cancel { + uint8_t status; + uint8_t bdaddr[6]; +} __attribute__ ((packed)); #define BT_HCI_CMD_ACCEPT_CONN_REQUEST 0x0409 struct bt_hci_cmd_accept_conn_request { From patchwork Tue Aug 1 16:38:39 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Pauli Virtanen X-Patchwork-Id: 13336999 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 2E153C04A94 for ; Tue, 1 Aug 2023 16:38:54 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231494AbjHAQiw (ORCPT ); Tue, 1 Aug 2023 12:38:52 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:60832 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231377AbjHAQit (ORCPT ); Tue, 1 Aug 2023 12:38:49 -0400 Received: from lahtoruutu.iki.fi (lahtoruutu.iki.fi [IPv6:2a0b:5c81:1c1::37]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 37B411FE8 for ; Tue, 1 Aug 2023 09:38:48 -0700 (PDT) Received: from monolith.lan (unknown [193.138.7.198]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: pav) by lahtoruutu.iki.fi (Postfix) with ESMTPSA id 4RFgm63rYGz49QBP; Tue, 1 Aug 2023 19:38:46 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=iki.fi; s=lahtoruutu; t=1690907926; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=bXGlzG0HOmoIdevnyhrOyZ1aMraEhvkaqTn8FITNBOA=; b=jSPKuPgtt6HUdzSeuCTA+h/RU3KmVJkSmU8lhURIYh1qBv4QJYGBhhsZxsSpwpsmhOvvj9 7SCBzIwhlKW4myPtWuDqdYCSFbkMRsBaMjF5WmGCKPH/14E0JI2ssXCX9ChHX1hm2fEnt/ uAMyTunzjqZ9IQEpCu7Le3r5T8NV7FLuNEuFG8v7T4B2tZLn5ic4KjkDd5nm0Ga3AI2g1Y /NaTYF5DksCKEqYRgRdyEmTCK1+pjjEv8T4pG7MlPAjSAKFmnCD9qQIqa8mYVgDYwGJEvF 0lNdI0zNusV/sVubpIFfDJeMJugIrRgi+D9RwezcbSNrNYpSI/QuLElpfQ7uug== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=iki.fi; s=lahtoruutu; t=1690907926; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=bXGlzG0HOmoIdevnyhrOyZ1aMraEhvkaqTn8FITNBOA=; b=Iiu1tKzLTjqjHkcTONgmn4OIlE01SfXLzsVvatUi94LSzxDgTmeevIVW+poWrLwKpKugQ6 JqtBx2MPPnlN2f8is7L85gAqHzfzCONdlw0cHMg54NmunwI0O51P+UkqW6ml8NIqTUJwmz eyfl2PaRFLXhPWgtT2CbpADiwFPk38oiWDgGUfUablVJX0I/K39r93jiqzY+WDbJDDojnU YAIdxVMylZh6/jeJdWXvpFb0JxCrNz6jkrF0HUdtyf29OR9TSke4fo3rPSQZWQ3oLFuuID vaGNJe/BV5aTq+c3owLxkVKgg3eVIkiiZ7vS1C7w3wSR6miLRx3r5hReVR6gmg== ARC-Authentication-Results: i=1; ORIGINATING; auth=pass smtp.auth=pav smtp.mailfrom=pav@iki.fi ARC-Seal: i=1; s=lahtoruutu; d=iki.fi; t=1690907926; a=rsa-sha256; cv=none; b=NpD+RXPu5/blepl2pz+AkUY5bicI/zqecCPaOaQm008bt2DjjFLZAyDmRo8zfoB4TKMyLu 0KY7cRYOhIMDWeHQMJMdobOqsZNyPc2IOmLdHZ0ex1hQJRPLmfuCrpRBBk90DFF+qBF4Eo w7CnWINfSa++rZDQ4z2CwG696+v/CFVk51QWTmfPuMHACNmYbilYrFGvabUCmeZchZ0/86 ljIQht4ycv1yxwKgtef1tpf9aASDYVnRcc8rlkuu2v6IsklGpY+YKg6uuqxh7Ce8elJR9F qgnKZTOE2Ni/vhZb+WByZ7DO+HfYcWOhKGyDjTqO7GL4AFVtzay5joLFSDnyYw== From: Pauli Virtanen To: linux-bluetooth@vger.kernel.org Cc: Pauli Virtanen Subject: [PATCH BlueZ v2 2/5] btdev: fix Command Status command opcodes for Setup Sync Conn Date: Tue, 1 Aug 2023 19:38:39 +0300 Message-ID: <87afe28e40f3bade2466073ace781625235850b9.1690907478.git.pav@iki.fi> X-Mailer: git-send-email 2.41.0 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-bluetooth@vger.kernel.org The command opcode should be the CMD, not EVT. --- Notes: v2: no change emulator/btdev.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/emulator/btdev.c b/emulator/btdev.c index 8658b4121..38dcb189e 100644 --- a/emulator/btdev.c +++ b/emulator/btdev.c @@ -2685,7 +2685,7 @@ static int cmd_enhanced_setup_sync_conn(struct btdev *dev, const void *data, if (cmd->tx_coding_format[0] > 5) status = BT_HCI_ERR_INVALID_PARAMETERS; - cmd_status(dev, status, BT_HCI_EVT_SYNC_CONN_COMPLETE); + cmd_status(dev, status, BT_HCI_CMD_ENHANCED_SETUP_SYNC_CONN); return 0; } @@ -2731,7 +2731,7 @@ done: static int cmd_setup_sync_conn(struct btdev *dev, const void *data, uint8_t len) { - cmd_status(dev, BT_HCI_ERR_SUCCESS, BT_HCI_EVT_SYNC_CONN_COMPLETE); + cmd_status(dev, BT_HCI_ERR_SUCCESS, BT_HCI_CMD_SETUP_SYNC_CONN); return 0; } From patchwork Tue Aug 1 16:38:40 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Pauli Virtanen X-Patchwork-Id: 13337002 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 073F6C00528 for ; Tue, 1 Aug 2023 16:38:57 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231547AbjHAQi4 (ORCPT ); Tue, 1 Aug 2023 12:38:56 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:60838 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231445AbjHAQiv (ORCPT ); Tue, 1 Aug 2023 12:38:51 -0400 Received: from lahtoruutu.iki.fi (lahtoruutu.iki.fi [IPv6:2a0b:5c81:1c1::37]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 3826E1FEF for ; Tue, 1 Aug 2023 09:38:48 -0700 (PDT) Received: from monolith.lan (unknown [193.138.7.198]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: pav) by lahtoruutu.iki.fi (Postfix) with ESMTPSA id 4RFgm64tvQz49QCH; Tue, 1 Aug 2023 19:38:46 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=iki.fi; s=lahtoruutu; t=1690907926; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=Vny7Zivh9gdqXmHyeVJZW/b/wLvrUmeMdVCGs7E3l1w=; b=cSpB5vyx81srtTv7jn7A9k5X8ZbnOPDjOsNrnE0AMSX9s82bvlOB6jpcE/z3EixvwXvnyb 8LmmV45Nql65aMhhTU4ur0xd9gjgkIzsmxtPnirbJ1enI2g4w1DG8K5qo/Orzfy7DRM0ja QsEcuNDBoY+CZFGvjJjC3Ldh/T/2mqeJwPZlZ1L+2VaSWRYHC4xwbnxzIeNPbu9dX4bea4 2w+5ZaznvsEtaGQ1MaiuFkn+BnYPtVtZgz/P45uib1sXL3RmOyfeBPo0wHUIpfHAKJBH6K nEOAapKWXbXd6c/rewNeg1tLJstY5qyscgkABz77mdW0JVv517qkJNrJMYkb1A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=iki.fi; s=lahtoruutu; t=1690907926; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=Vny7Zivh9gdqXmHyeVJZW/b/wLvrUmeMdVCGs7E3l1w=; b=Z8iNJLuiRBxhU7IpS0Qajv+LJrnnAZSdKuBjvrro95fR4G7DVgmAqDZ9XMAuXnnfxIckVp 9FASejnR4EEyg7iDw673IGZWauCcUHzIuTjN7ZbZP0ao01loMXJm2312J/IGlgi7P7Ujjf cmSb6r/wWG5pmX04jtfRKonNyHAVgb713ikWohBHja/p0pIvLsl0rpWeuBaHT0XKz8wf3I sgSEUmwlGXS5qXhCO9XsFMJ+SggNBCeiVBhyAvvu4wryOt5WtTpAsdtny27Et/4jCb9gUy QEoA4G0crKFc5lnNyOPrx9SzMWk7Hk53+p49I84VVSKbWEPqLwfwtT4At4HmTg== ARC-Authentication-Results: i=1; ORIGINATING; auth=pass smtp.auth=pav smtp.mailfrom=pav@iki.fi ARC-Seal: i=1; s=lahtoruutu; d=iki.fi; t=1690907926; a=rsa-sha256; cv=none; b=FwpkKJN2LhSwyp13AoJbvLHcK35nFpHBvAHTBFetNdYw3J6fmR9K4HyaPUU+XT8HOjKUQR tS5c4Lhit+CyIK+FqV+S96zQcCkMnCK9KJFCnweKTYbROqzpcMZO0EeaLsaOWiiwv/DQ8z JngTV8BjhhmkFdsPhz5hiaRm6//QGOeOgK20nC7fne6QhtkIhzJS4fmHX/ZXQF0FSga0eO D6Q5gHdyuU+6Xww0y4jfREzp6lZY6iOT/FXMGApvwE3TekDGK/2017iSWwkGqXVYpzsCGF VsJCWGoVt8+mcHWZh3Yos618ygZSGwKgG+s41dXD3MsWdcoPTsFLYbEYHmvaEQ== From: Pauli Virtanen To: linux-bluetooth@vger.kernel.org Cc: Pauli Virtanen Subject: [PATCH BlueZ v2 3/5] sco-tester: test local and remote disconnecting simultaneously Date: Tue, 1 Aug 2023 19:38:40 +0300 Message-ID: <79e933c8dee03c77c2b05a9d90612d04ed991da2.1690907478.git.pav@iki.fi> X-Mailer: git-send-email 2.41.0 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-bluetooth@vger.kernel.org Demonstrate a kernel race condition when remote side disconnects at the same time as local side tries to cancel the connection. I.e. [controller] > HCI Synchronous Connect Complete [controller] > HCI Disconnection Complete (from remote) [user] shutdown(sco_socket) [kernel] hci_conn_abort(SCO handle) [kernel] > HCI Create Connection Cancel [kernel] < HCI Synchronous Connect Complete [kernel] < HCI Disconnect Complete [controller] < HCI Create Connection Cancel [controller] > HCI Command Status (Create Connection Cancel) [kernel] < HCI Command Status (Create Connection Cancel) and then we get BUG: KASAN: slab-use-after-free in hci_conn_failed when hci_conn_abort tries to delete the same connection a second time. This type of crash is probably not limited to the sequence here, but for this one it was possible to get the timing right in the emulator. Add a test that hits this in the emulator environment (pretty narrow window to hit on real hardware): eSCO Simultaneous Disconnect - Failure --- Notes: v2: no change ================================================================== BUG: KASAN: slab-use-after-free in hci_conn_failed+0x25/0x190 Read of size 8 at addr ffff8880029e1958 by task kworker/u3:2/35 CPU: 0 PID: 35 Comm: kworker/u3:2 Not tainted 6.5.0-rc1-00520-gf57f797eebfe #152 Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS 1.16.2-1.fc38 04/01/2014 Workqueue: hci0 hci_cmd_sync_work Call Trace: print_report+0xce/0x620 ? __virt_addr_valid+0xd8/0x160 ? hci_conn_failed+0x25/0x190 kasan_report+0xd5/0x110 ? hci_conn_failed+0x25/0x190 hci_conn_failed+0x25/0x190 hci_abort_conn_sync+0x23b/0x370 ? __pfx_hci_abort_conn_sync+0x10/0x10 ? __pfx_lock_acquire+0x10/0x10 ? __pfx_abort_conn_sync+0x10/0x10 ? __pfx_abort_conn_sync+0x10/0x10 hci_cmd_sync_work+0x125/0x200 process_one_work+0x4ee/0x8f0 ? __pfx_process_one_work+0x10/0x10 ? __kthread_parkme+0x5f/0xe0 ? mark_held_locks+0x1a/0x90 worker_thread+0x8c/0x630 ? __kthread_parkme+0xc5/0xe0 ? __pfx_worker_thread+0x10/0x10 kthread+0x17c/0x1c0 ? __pfx_kthread+0x10/0x10 ret_from_fork+0x2b/0x50 Allocated by task 31: kasan_save_stack+0x33/0x60 kasan_set_track+0x24/0x30 __kasan_kmalloc+0x8f/0xa0 hci_conn_add+0xa8/0xad0 hci_connect_sco+0x1cf/0x6e0 sco_sock_connect+0x1a2/0x600 __sys_connect+0x1a2/0x1d0 __x64_sys_connect+0x3b/0x50 do_syscall_64+0x47/0x90 entry_SYSCALL_64_after_hwframe+0x6c/0xd6 Freed by task 32: kasan_save_stack+0x33/0x60 kasan_set_track+0x24/0x30 kasan_save_free_info+0x2b/0x50 __kasan_slab_free+0xfa/0x150 __kmem_cache_free+0xab/0x200 device_release+0x58/0xf0 kobject_put+0xee/0x310 hci_disconn_complete_evt+0x276/0x3a0 hci_event_packet+0x54b/0x800 hci_rx_work+0x2a4/0xae0 process_one_work+0x4ee/0x8f0 worker_thread+0x8c/0x630 kthread+0x17c/0x1c0 ret_from_fork+0x2b/0x50 Last potentially related work creation: kasan_save_stack+0x33/0x60 __kasan_record_aux_stack+0x94/0xa0 insert_work+0x2d/0x150 __queue_work+0x2f1/0x610 queue_delayed_work_on+0x88/0x90 sco_chan_del+0x117/0x230 sco_sock_shutdown+0x109/0x230 __sys_shutdown+0xb4/0x130 __x64_sys_shutdown+0x29/0x40 do_syscall_64+0x47/0x90 entry_SYSCALL_64_after_hwframe+0x6c/0xd6 The buggy address belongs to the object at ffff8880029e1000 which belongs to the cache kmalloc-4k of size 4096 The buggy address is located 2392 bytes inside of freed 4096-byte region [ffff8880029e1000, ffff8880029e2000) The buggy address belongs to the physical page: page:ffffea00000a7800 refcount:1 mapcount:0 mapping:0000000000000000 index:0x0 pfn:0x29e0 head:ffffea00000a7800 order:3 entire_mapcount:0 nr_pages_mapped:0 pincount:0 flags: 0x4000000000010200(slab|head|zone=1) page_type: 0xffffffff() raw: 4000000000010200 ffff8880010424c0 ffffea0000063010 ffffea00000a8610 raw: 0000000000000000 0000000000020002 00000001ffffffff 0000000000000000 page dumped because: kasan: bad access detected Memory state around the buggy address: ffff8880029e1800: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb ffff8880029e1880: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb >ffff8880029e1900: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb ^ ffff8880029e1980: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb ffff8880029e1a00: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb ================================================================== tools/sco-tester.c | 59 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) diff --git a/tools/sco-tester.c b/tools/sco-tester.c index 44606328a..f3de42c7b 100644 --- a/tools/sco-tester.c +++ b/tools/sco-tester.c @@ -29,6 +29,7 @@ #include "src/shared/tester.h" #include "src/shared/mgmt.h" +#include "src/shared/util.h" struct test_data { const void *test_data; @@ -37,6 +38,7 @@ struct test_data { struct hciemu *hciemu; enum hciemu_type hciemu_type; unsigned int io_id; + int sk; bool disable_esco; bool enable_codecs; }; @@ -225,6 +227,7 @@ static void test_data_free(void *test_data) break; \ user->hciemu_type = HCIEMU_TYPE_BREDRLE; \ user->io_id = 0; \ + user->sk = -1; \ user->test_data = data; \ user->disable_esco = _disable_esco; \ user->enable_codecs = _enable_codecs; \ @@ -250,6 +253,10 @@ static const struct sco_client_data connect_failure = { .expect_err = EOPNOTSUPP }; +static const struct sco_client_data connect_failure_reset = { + .expect_err = ECONNRESET +}; + const uint8_t data[] = {0, 1, 2, 3, 4, 5, 6, 7, 8}; static const struct sco_client_data connect_send_success = { @@ -650,6 +657,8 @@ static void test_connect(const void *test_data) return; } + data->sk = sk; + io = g_io_channel_unix_new(sk); g_io_channel_set_close_on_unref(io, TRUE); @@ -745,6 +754,52 @@ static void test_connect_offload_msbc(const void *test_data) end: close(sk); } + +static bool hook_simult_disc(const void *msg, uint16_t len, void *user_data) +{ + const struct bt_hci_evt_sync_conn_complete *ev = msg; + struct test_data *data = tester_get_data(); + struct bthost *bthost; + + tester_print("Simultaneous disconnect"); + + if (len != sizeof(struct bt_hci_evt_sync_conn_complete)) { + tester_test_failed(); + return true; + } + + /* Disconnect from local and remote sides at the same time */ + bthost = hciemu_client_get_host(data->hciemu); + bthost_hci_disconnect(bthost, le16_to_cpu(ev->handle), 0x13); + + shutdown(data->sk, SHUT_RDWR); + + return true; +} + +static bool hook_delay_cmd(const void *data, uint16_t len, void *user_data) +{ + tester_print("Delaying emulator response..."); + g_usleep(250000); + tester_print("Delaying emulator response... Done."); + return true; +} + +static void test_connect_simult_disc(const void *test_data) +{ + struct test_data *data = tester_get_data(); + + /* Kernel shall not crash, but <= 6.5-rc1 crash */ + hciemu_add_hook(data->hciemu, HCIEMU_HOOK_POST_EVT, + BT_HCI_EVT_SYNC_CONN_COMPLETE, + hook_simult_disc, NULL); + hciemu_add_hook(data->hciemu, HCIEMU_HOOK_PRE_CMD, + BT_HCI_CMD_CREATE_CONN_CANCEL, + hook_delay_cmd, NULL); + + test_connect(test_data); +} + int main(int argc, char *argv[]) { tester_init(&argc, &argv); @@ -767,6 +822,10 @@ int main(int argc, char *argv[]) test_sco("eSCO mSBC - Success", &connect_success, setup_powered, test_connect_transp); + test_sco("eSCO Simultaneous Disconnect - Failure", + &connect_failure_reset, setup_powered, + test_connect_simult_disc); + test_sco_11("SCO CVSD 1.1 - Success", &connect_success, setup_powered, test_connect); From patchwork Tue Aug 1 16:38:41 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Pauli Virtanen X-Patchwork-Id: 13337001 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 8C1D8C001DF for ; Tue, 1 Aug 2023 16:38:55 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231546AbjHAQiz (ORCPT ); Tue, 1 Aug 2023 12:38:55 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:60836 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231404AbjHAQiu (ORCPT ); Tue, 1 Aug 2023 12:38:50 -0400 Received: from lahtoruutu.iki.fi (lahtoruutu.iki.fi [IPv6:2a0b:5c81:1c1::37]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 521391FFD for ; Tue, 1 Aug 2023 09:38:48 -0700 (PDT) Received: from monolith.lan (unknown [193.138.7.198]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: pav) by lahtoruutu.iki.fi (Postfix) with ESMTPSA id 4RFgm65yGkz49QCy; Tue, 1 Aug 2023 19:38:46 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=iki.fi; s=lahtoruutu; t=1690907926; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=5f3Az5ebVbCj29lMqMtIGN2PGzN3+1Ael6CcI4sAPvI=; b=KUsxc1dPYCXl+d9iOGmp0L+3/mh43DeL6+xDgw9tYgFja1m1TCeiJzIog2hoZ61n0m82S0 ycAUinRCjxNglgE1zjXUrRmV0h6Plps5V+t+4TbAwVwp0rj0KdQvxCJibFnTOREGCwjAej AVZlr3zI6rbjGYDexMDv9wNMojrE+G4VrUOVvCmZSvM9SjNd47oDOBqK+dmar7Pobmgoyp RCsQdrNeR1sKLJ1XTfgrt6KN6eGxaR7DF6icH4FXt52YsdyenrUhXwL0vK8MnKpEduPQzR 1rWKN2F+qRL2zTJjXzDWvipVYJGipFcOkndv/Kcz84v+QAaO9aG33R4A7naw3A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=iki.fi; s=lahtoruutu; t=1690907926; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=5f3Az5ebVbCj29lMqMtIGN2PGzN3+1Ael6CcI4sAPvI=; b=L8kFlcgDN5UAkI/MCyiPW+ubeVF1bmK34EuOZPsUFBdvcMUQZN8paXVeA0CvmhecduoJXT ewuythBMD489hCQee75pzgSwC/Tnxw0b7jDuZtEpa4U565Zw92XO9J7/L+lEqgEhWAuU1q IxPWlxl3tgg/a4Km1Ipc+HjSe124Q2OofqtIUbywEmKM4BQNyk9RQWvjaE8KMdYi3FxxVp 45ZiBshd2KN23WY/TCtAgWeP3w2e6uzc0u+nawqhcPGFiRTtnsRbF67O6/NaGl2w95ba7V /m9nrhrjIT8h76I1XGy4VBPtwLV6GQehrKLeEGInos+QkoSUBinS9Zjv3Y2EYw== ARC-Authentication-Results: i=1; ORIGINATING; auth=pass smtp.auth=pav smtp.mailfrom=pav@iki.fi ARC-Seal: i=1; s=lahtoruutu; d=iki.fi; t=1690907926; a=rsa-sha256; cv=none; b=hTK3kzkLXLfHiuHJXTq7Lk7bzrGMAvfDXmESG7VPj+E7ke6M+5SM9kPzUHXzlDywwvohTR uqzH7aC+HLO1fm0GmqZ3ypCUkzBR+BFiQuzuAtJYJGoPMvK9hhQxJ5GOISc7LAuCHDx9sD AgB4t+GB8Zncw1EGu1IfSqeeWx1llK5Ilai0lM4R2SYPndq4SyqL0lykKCLZy1bVaNkt7r JSClrKGBhONipR2TG8pFQi99RZxeb1JdXhhn6IjZuWyF7ODAqhx2O1uUGWI2J37Q6iPeL7 T3tT+Ul3Cy6eDbxRf2YSZNdGjGbCCniTAcKBjOHogubJ7IPUSgRo1v3pnqDgFw== From: Pauli Virtanen To: linux-bluetooth@vger.kernel.org Cc: Pauli Virtanen Subject: [PATCH BlueZ v2 4/5] iso-tester: test with large CIS_ID and invalid CIG_ID/CIS_ID Date: Tue, 1 Aug 2023 19:38:41 +0300 Message-ID: <4126dc74da175954db56a40d4fa9cf47448c4e6c.1690907478.git.pav@iki.fi> X-Mailer: git-send-email 2.41.0 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-bluetooth@vger.kernel.org Add test with a large CIS_ID and multiple CIS so it hits an error condition in current kernels (which is why the AC configuration is used). Add tests for invalid configurations with bad or duplicate IDs, and for trying to connect two CIS in same CIG without BT_DEFER_SETUP. ISO QoS CIG 0xF0 - Invalid ISO QoS CIS 0xF0 - Invalid ISO Connect2 CIG 0x01 - Success/Invalid ISO AC 6(ii) CIS 0xEF/auto - Success ISO AC 6(ii) CIS 0xEF/0xEF - Invalid --- Notes: v2: no change Current bluetooth-next/master fails these tests with ISO QoS CIG 0xF0 - Invalid Timed out 2.301 seconds ISO QoS CIS 0xF0 - Invalid Failed 0.117 seconds ISO Connect2 CIG 0x01 - Success/Invalid Failed 0.189 seconds ISO AC 6(ii) CIS 0xEF/auto - Success Failed 0.196 seconds tools/iso-tester.c | 72 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) diff --git a/tools/iso-tester.c b/tools/iso-tester.c index 8f43d7bec..9f853a0f9 100644 --- a/tools/iso-tester.c +++ b/tools/iso-tester.c @@ -95,6 +95,10 @@ QOS_FULL(0x01, 0x02, \ {}, QOS_IO(_interval, _latency, _sdu, _phy, _rtn)) +#define QOS_OUT_1_EF(_interval, _latency, _sdu, _phy, _rtn) \ + QOS_FULL(0x01, 0xEF, \ + {}, QOS_IO(_interval, _latency, _sdu, _phy, _rtn)) + #define QOS_IN(_interval, _latency, _sdu, _phy, _rtn) \ QOS_FULL(BT_ISO_QOS_CIG_UNSET, BT_ISO_QOS_CIS_UNSET, \ QOS_IO(_interval, _latency, _sdu, _phy, _rtn), {}) @@ -172,6 +176,7 @@ */ #define AC_6ii_1 QOS_OUT_1(10000, 10, 40, 0x02, 2) #define AC_6ii_2 QOS_OUT_1(10000, 10, 40, 0x02, 2) +#define AC_6ii_1_EF QOS_OUT_1_EF(10000, 10, 40, 0x02, 2) /* different CIS ID */ /* Two unidirectional CISes. Unicast Server is Audio Sink and Audio Source. * #1 - CIG 1 CIS 1 (input) * #2 - CIG 1 CIS 2 (output) @@ -801,6 +806,16 @@ static const struct iso_client_data connect_reject = { .expect_err = -ENOSYS }; +static const struct iso_client_data connect_cig_f0_invalid = { + .qos = QOS_FULL(0xF0, 0x00, {}, QOS_IO(10000, 10, 40, 0x02, 2)), + .expect_err = -EINVAL +}; + +static const struct iso_client_data connect_cis_f0_invalid = { + .qos = QOS_FULL(0x00, 0xF0, {}, QOS_IO(10000, 10, 40, 0x02, 2)), + .expect_err = -EINVAL +}; + static const uint8_t data_16_2_1[40] = { [0 ... 39] = 0xff }; static const struct iovec send_16_2_1 = { .iov_base = (void *)data_16_2_1, @@ -960,6 +975,22 @@ static const struct iso_client_data reconnect_ac_6ii = { .disconnect = true, }; +static const struct iso_client_data connect_ac_6ii_cis_ef_auto = { + .qos = AC_6ii_1_EF, + .qos_2 = AC_6ii_2, + .expect_err = 0, + .mconn = true, + .defer = true, +}; + +static const struct iso_client_data connect_ac_6ii_cis_ef_ef = { + .qos = AC_6ii_1_EF, + .qos_2 = AC_6ii_1_EF, + .expect_err = -EINVAL, + .mconn = true, + .defer = true, +}; + static const struct iso_client_data connect_ac_7i = { .qos = AC_7i_1, .qos_2 = AC_7i_2, @@ -2371,6 +2402,29 @@ static void test_connect2_seq(const void *test_data) setup_connect(data, 0, iso_connect2_seq_cb); } +static void test_connect2_nodefer(const void *test_data) +{ + struct test_data *data = tester_get_data(); + int sk, err; + + /* Second connect() shall fail, because CIG is then busy, + * but the first connect() shall succeed. + */ + setup_connect(data, 0, iso_connect_cb); + + sk = create_iso_sock(data); + if (sk < 0) { + tester_test_failed(); + return; + } + + err = connect_iso_sock(data, 1, sk); + if (err != -EINVAL) + tester_test_failed(); + + close(sk); +} + static void test_bcast(const void *test_data) { struct test_data *data = tester_get_data(); @@ -2518,6 +2572,12 @@ int main(int argc, char *argv[]) test_iso("ISO QoS - Invalid", &connect_invalid, setup_powered, test_connect); + test_iso("ISO QoS CIG 0xF0 - Invalid", &connect_cig_f0_invalid, + setup_powered, test_connect); + + test_iso("ISO QoS CIS 0xF0 - Invalid", &connect_cis_f0_invalid, + setup_powered, test_connect); + test_iso_rej("ISO Connect - Reject", &connect_reject, setup_powered, test_connect, BT_HCI_ERR_CONN_FAILED_TO_ESTABLISH); @@ -2545,6 +2605,10 @@ int main(int argc, char *argv[]) setup_powered, test_connect2); + test_iso2("ISO Connect2 CIG 0x01 - Success/Invalid", &connect_1_16_2_1, + setup_powered, + test_connect2_nodefer); + test_iso("ISO Defer Send - Success", &connect_16_2_1_defer_send, setup_powered, test_connect); @@ -2630,6 +2694,14 @@ int main(int argc, char *argv[]) setup_powered, test_reconnect); + test_iso2("ISO AC 6(ii) CIS 0xEF/auto - Success", + &connect_ac_6ii_cis_ef_auto, + setup_powered, test_connect); + + test_iso2("ISO AC 6(ii) CIS 0xEF/0xEF - Invalid", + &connect_ac_6ii_cis_ef_ef, + setup_powered, test_connect); + test_iso("ISO Broadcaster - Success", &bcast_16_2_1_send, setup_powered, test_bcast); test_iso("ISO Broadcaster Encrypted - Success", &bcast_enc_16_2_1_send, From patchwork Tue Aug 1 16:38:42 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Pauli Virtanen X-Patchwork-Id: 13337003 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id E27B9C04A94 for ; Tue, 1 Aug 2023 16:38:57 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231572AbjHAQi4 (ORCPT ); Tue, 1 Aug 2023 12:38:56 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:60844 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231479AbjHAQiw (ORCPT ); Tue, 1 Aug 2023 12:38:52 -0400 Received: from lahtoruutu.iki.fi (lahtoruutu.iki.fi [IPv6:2a0b:5c81:1c1::37]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 391E81FE5 for ; Tue, 1 Aug 2023 09:38:51 -0700 (PDT) Received: from monolith.lan (unknown [193.138.7.198]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: pav) by lahtoruutu.iki.fi (Postfix) with ESMTPSA id 4RFgm670Yzz49QDC; Tue, 1 Aug 2023 19:38:46 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=iki.fi; s=lahtoruutu; t=1690907927; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=aA9WBYwLW9Pq/8rjGKY9g7y1iXggWwfbmq0+4mehOSw=; b=eWVEfvfS2SOeEQHcMsKoLvwDahRSKau7FdFfLLsJAAf3atobl6YjfSIGqSU6J7ALu5Qg+9 gkHa4pNHFXCGK+xHrv+I7/4wf0CkvzpR9x7UHB/VZDfXcp4NYGBZ5Pn2is3KUKkjR66ISF Q9BGCkRST5Ce3WbYkWyD8hl9kaAn/UZ/nNrlc/R/SnP65PaN6ZZyQHrG2J9tEvxDSCrLNl U3nBL19bFmmon9DxwnKxz9u5qNIvVXU2I509exvA4/+aDC6uObFcszvCOC4LxmGBx8RuZB PFh86HmNQ+8b9RPzKAm8ueT4iCW83lev+l2Ac496cvGd3QlFPJKnTvunGVbh6w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=iki.fi; s=lahtoruutu; t=1690907927; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=aA9WBYwLW9Pq/8rjGKY9g7y1iXggWwfbmq0+4mehOSw=; b=pe0knknrRjARFbZ+xfVuS5NDd9kAQcFBRatNZix18QykZcYLmXkXJCYuIUCNjji/hhk2HR m8Gm4b0QWFO9KBG5gCJgqMkpicH+UaXiXymL5mOXdJdyCQfgn/hOMjDBipv8nVwSWV7ruX AaExaaB5n08Qqq92lmsSD8v9ZJn22epFAn1WY2CakzNyELeIf/OyQRgb0cZMZRNkHA2jY4 W8IWzqa7hlsOErppvy5E/acvjdk1/2QvSSXxgPIB3fTMByufjju9MW16NjPL1IJQCu0LYB xjO3oPHblzkAlBo9KPYlsg2YtcSOHzHr1SJ6cWREyYO/ujlk3cIJ/VA/qVjjhg== ARC-Authentication-Results: i=1; ORIGINATING; auth=pass smtp.auth=pav smtp.mailfrom=pav@iki.fi ARC-Seal: i=1; s=lahtoruutu; d=iki.fi; t=1690907927; a=rsa-sha256; cv=none; b=IvAK/MERLwCNd1Qa/Bu7xDrGZjKmRCvjra+bSEBKxn7qOiOVfi9Two4HDhcGV2phP/rJzv ybaKMsYwWCrYsUORmzlOkquayLs3a1whUejhEZ6jojNr3ZqmpM1Oj+x8QVODFlZr0thJd8 hJ/TTTKXHyqYgfyHcw6IAyYJCN44mP+/Ha2+lSehFhbU3SIza4FN4FHmrDJtThMZ4C3F6d d8XYQg0pJnPfhHs+/SKEIXjNplEhmAlp71S59f+9EUL93pQ9TN0qaZoyE69Dqfvm1+8jPC RiU5+aNSN+wwZqBVIgn4r/IvUFPagZkkC4F2X7cqwFCoRwIEOuT75QlDTNOgKA== From: Pauli Virtanen To: linux-bluetooth@vger.kernel.org Cc: Pauli Virtanen Subject: [PATCH BlueZ v2 5/5] iso-tester: add tests checking Remove CIG is emitted Date: Tue, 1 Aug 2023 19:38:42 +0300 Message-ID: <3b903474a8a71074f58882382065f4b695b0454e.1690907478.git.pav@iki.fi> X-Mailer: git-send-email 2.41.0 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-bluetooth@vger.kernel.org Kernel should send LE Remove CIG after all CIS are shut down. Add tests checking this, closing either immediately or after waiting connection to complete. ISO Defer Close - Success ISO Connect Close - Success ISO Defer Wait Close - Success ISO Connect Wait Close - Success --- Notes: v2: no change tools/iso-tester.c | 96 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 96 insertions(+) diff --git a/tools/iso-tester.c b/tools/iso-tester.c index 9f853a0f9..bbf959420 100644 --- a/tools/iso-tester.c +++ b/tools/iso-tester.c @@ -2425,6 +2425,90 @@ static void test_connect2_nodefer(const void *test_data) close(sk); } +static gboolean iso_connect_close_cb(GIOChannel *io, GIOCondition cond, + gpointer user_data) +{ + struct test_data *data = user_data; + + data->io_id[0] = 0; + + tester_print("Disconnected"); + + --data->step; + if (!data->step) + tester_test_passed(); + + return FALSE; +} + +static bool hook_remove_cig(const void *msg, uint16_t len, void *user_data) +{ + struct test_data *data = user_data; + + tester_print("Remove CIG"); + + --data->step; + if (!data->step) + tester_test_passed(); + + return true; +} + +static void test_connect_close(const void *test_data) +{ + struct test_data *data = tester_get_data(); + int sk; + GIOChannel *io; + + data->step = 2; + + hciemu_add_hook(data->hciemu, HCIEMU_HOOK_PRE_CMD, + BT_HCI_CMD_LE_REMOVE_CIG, + hook_remove_cig, data); + + sk = setup_sock(data, 0); + if (sk < 0) + return; + + io = g_io_channel_unix_new(sk); + g_io_channel_set_close_on_unref(io, TRUE); + data->io_id[0] = g_io_add_watch(io, G_IO_HUP, iso_connect_close_cb, + data); + + shutdown(sk, SHUT_RDWR); +} + +static gboolean iso_connect_wait_close_cb(GIOChannel *io, GIOCondition cond, + gpointer user_data) +{ + struct test_data *data = tester_get_data(); + int sk; + + tester_print("Connected"); + + sk = g_io_channel_unix_get_fd(io); + + data->io_id[0] = g_io_add_watch(io, G_IO_HUP, iso_connect_close_cb, + data); + + shutdown(sk, SHUT_RDWR); + + return FALSE; +} + +static void test_connect_wait_close(const void *test_data) +{ + struct test_data *data = tester_get_data(); + + data->step = 1; + + hciemu_add_hook(data->hciemu, HCIEMU_HOOK_PRE_CMD, + BT_HCI_CMD_LE_REMOVE_CIG, + hook_remove_cig, data); + + setup_connect(data, 0, iso_connect_wait_close_cb); +} + static void test_bcast(const void *test_data) { struct test_data *data = tester_get_data(); @@ -2601,6 +2685,18 @@ int main(int argc, char *argv[]) test_iso("ISO Defer Connect - Success", &defer_16_2_1, setup_powered, test_connect); + test_iso("ISO Defer Close - Success", &defer_16_2_1, setup_powered, + test_connect_close); + + test_iso("ISO Connect Close - Success", &connect_16_2_1, setup_powered, + test_connect_close); + + test_iso("ISO Defer Wait Close - Success", &defer_16_2_1, + setup_powered, test_connect_wait_close); + + test_iso("ISO Connect Wait Close - Success", &connect_16_2_1, + setup_powered, test_connect_wait_close); + test_iso2("ISO Defer Connect2 CIG 0x01 - Success", &defer_1_16_2_1, setup_powered, test_connect2);