From patchwork Thu Mar 14 18:21:10 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Pauli Virtanen X-Patchwork-Id: 13592652 Received: from lahtoruutu.iki.fi (lahtoruutu.iki.fi [185.185.170.37]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id EB5A91A38D0 for ; Thu, 14 Mar 2024 18:21:35 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=pass smtp.client-ip=185.185.170.37 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710440497; cv=pass; b=DXqsUVPjNHIWcM2FViRFenpRGeSDWhSzMVco8DGVZc04fQb+KpTj171P5td/f161qIuinA0l1dzoALY74zMJPIUv/D7eVrNGOS4k8762if6J5ft29eA64mwQXvXOtIc0YcX2dTazdz7SRg601knDrbnHjOCDEO22HEds9+2BkQU= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710440497; c=relaxed/simple; bh=K+u0oLtWLd+fmilQfy2XV5Q9USzIQs1tly6O35BIZ+s=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=j2sXglnFHJLj57Nsxx/GkSZwLTZM0BSJ/RmBBSRFfWnkC6OkulXpUqma/bedfh46dDl8yu4ZKBB89FDhSIXDB/Ymui8T220YzDDZifPRzzlQq0Gbcz4jEC26ZVpGWBadlisM+MfnCKHhGdFD/uPMA88CwHraRqxeQvD8Ji6mx1o= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=iki.fi; spf=pass smtp.mailfrom=iki.fi; dkim=pass (2048-bit key) header.d=iki.fi header.i=@iki.fi header.b=B8hcOs5F; arc=pass smtp.client-ip=185.185.170.37 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=iki.fi Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=iki.fi Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=iki.fi header.i=@iki.fi header.b="B8hcOs5F" 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 4TwbLH1B2pz49Pv3; Thu, 14 Mar 2024 20:21:27 +0200 (EET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=iki.fi; s=lahtoruutu; t=1710440487; 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=HbJSH9ORtrrC1U4ANhQMwZfXmtBmrQ/6M2eokaZ+tVM=; b=B8hcOs5F2idyKd9SwfLRnBHflemwy0PFZ9BRnrZoERLLEUsHApKE8kHVplPDuWUzHqNWsm 0uaywo8tL/sdolVhK7shfZrxunBjuIvHq17+opjBGc07eVpJeAfaJxxP7FgqxXJB6YrFqG AkEsCyezoWGaM4PDLIIklwp2JHU1mUYPMDx5nRHqJjnjuuQIq4VoDnnwBeI/K33T/dtEc+ bvOUaIZ5UDi1JQbj+Hynk0blpxHGqdiLvUk7qq4NFxCAiyjvbc5dqTQgi3hp4pqlWlJjod Uc4hE3lX6nT01DzsEfDKPs560klAnKWaPhbTS92w8FxpDJjznz8OBfLG4nP68g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=iki.fi; s=lahtoruutu; t=1710440487; 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=HbJSH9ORtrrC1U4ANhQMwZfXmtBmrQ/6M2eokaZ+tVM=; b=L3iUAz+7FBc7F3CPzNoXmitbVvQyt5LpcCgM14CddBa7WwOxzdcNXrAP/GdMlvxSWPbyZn udHIWJGrIKTzfoY4E6WUJ/qC/YaYEtpdWzKDqqG0//HGkEHMlAofZtpMdcVi8joS4Jc4Zn CDHbRcwgPQSmZ8SIdYFcJfS8mH0R7EChBcepg7100WwEj7SQ16nqzfA5RhNHSBpiWO1bML FXmHspI3EymHQJ0X9CF1WIIdOpo4F2ylrXR9i9nbun7fcJ4mvQa38Apl0g7TC34jfoiUCi MMRd6JF34FS1fp/wx+gKYuFJO8IWO89fyOtVpU/33iC3SwpTp5mPDsOuGpsDqA== 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=1710440487; a=rsa-sha256; cv=none; b=deDEDPTIKX1nxtjkiBEZPIGHjlv4EaKKpgyQN5IXhXMH0Q7lME9MqtUEPPzizWT+ejv0Uo rgD5uhIvx/RE5n/4hnbiz83ORr0M7KKO/atfGie8njt9DUD1cpy4C4HSXtOQyowzpiHSdv 3bhV32uxOv7keaJUu19NmDXCD0wpfx5N+J8khOy74HjkuAI+Jh+bpxUC0/uaj+lxUZ/cQ0 vlUq+9S/JWrRPgZMVyTk32q0ifDUwEtMbG1Bbi3A77Ys513UCVuqr2/AwdTezVTiC25gLu 8vIHm5nIokhWs4a2E4O9lVC4gK50O5Ui+jV3E9vKELgBAMIPq6osmTu6GCrneg== From: Pauli Virtanen To: linux-bluetooth@vger.kernel.org Cc: Pauli Virtanen Subject: [PATCH BlueZ v2 1/9] lib: add BT_SCM_ERROR and BT_NO_ERRQUEUE_POLL Date: Thu, 14 Mar 2024 20:21:10 +0200 Message-ID: <1e611b09ab57ce0ba42c377a75f12a6eaf70e133.1710440408.git.pav@iki.fi> X-Mailer: git-send-email 2.44.0 In-Reply-To: References: Precedence: bulk X-Mailing-List: linux-bluetooth@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Add new CMSG type used in new kernel TX timestamping support. Add new socket option. --- lib/bluetooth.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lib/bluetooth.h b/lib/bluetooth.h index 75dc960c8..7c310a69b 100644 --- a/lib/bluetooth.h +++ b/lib/bluetooth.h @@ -141,6 +141,7 @@ struct bt_voice { #define BT_PKT_STATUS 16 #define BT_SCM_PKT_STATUS 0x03 +#define BT_SCM_ERROR 0x04 #define BT_ISO_QOS 17 @@ -239,6 +240,8 @@ enum { #define BT_ISO_BASE 20 +#define BT_NO_ERRQUEUE_POLL 21 + /* Byte order conversions */ #if __BYTE_ORDER == __LITTLE_ENDIAN #define htobs(d) (d) From patchwork Thu Mar 14 18:21:11 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Pauli Virtanen X-Patchwork-Id: 13592654 Received: from lahtoruutu.iki.fi (lahtoruutu.iki.fi [185.185.170.37]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 02A2276F1A for ; Thu, 14 Mar 2024 18:21:36 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=pass smtp.client-ip=185.185.170.37 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710440499; cv=pass; b=J6MuEtEr9Z3oOMFz09908YRyUk7wmgtWWMXo5jxqdB4jwOhxdQMnq8DNVqxJ0A3cM8SbB8IM9uxc/7joxycCv8r8kuV6vYk66JPv3Svj4MDuMxaryF6GTxIm7y0+zw6Anav1HyQoaJlTbjBug9p/IjXTUhZFVmc3AlPEA4jONy4= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710440499; c=relaxed/simple; bh=HPBHqUvTIk8ZkfujlIF1JNSb67Sjs238Y8dzpCkUqvQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=eiBKU4dwgc/K38ps5IL44zJUNzacXSizw4B+IweOCNUZxu+a+Ihc+F0LQbZ5ngK+3fWazA1HkhowJOPrxH4nNbQWgZcsG96zBo2HgDO7ebkOuf9XQI/AHswVL5IVgefaKkmSNhEw+XoEkTSViVs8ZNTzIFcZQEtusD/IguFSXhg= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=iki.fi; spf=pass smtp.mailfrom=iki.fi; dkim=pass (2048-bit key) header.d=iki.fi header.i=@iki.fi header.b=WQT3m0ss; arc=pass smtp.client-ip=185.185.170.37 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=iki.fi Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=iki.fi Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=iki.fi header.i=@iki.fi header.b="WQT3m0ss" 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 4TwbLJ15KHz49PwQ; Thu, 14 Mar 2024 20:21:28 +0200 (EET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=iki.fi; s=lahtoruutu; t=1710440488; 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=PuYtDCBuNW6LF6P42ZRMelLjm1b3B+qDfqrXHnj+Rzc=; b=WQT3m0ssBqeYl/9BwOMkOTAZBc873ADTORug8u7JWsVRtQXBX5vh7dZfY8l1Cx5RFL756G NwO2J5Edw3BmUBfVnDGEn6wq9FGvBjaz9wupGAoRO0kRP0S4jxxavNegRuSbv2vidlSfmk ewhzBmhLpDZ0Wg1dO0mjUx/YHIbFJFPmurgah5PuIZtjx2ahnh3pP59Ax0VvuAhcznIaJu WtrWfxuMZlm3/lxmM4IavfAo3cK0OgC4B8fXfw5LHxykjhtphfNhmjLMHTR+rjuw7JQvb+ rPlpLmKO2BIiA5jfGl48lYd3AH+5iG886PzNy9Ot9PY4fmbENSNzF2tVtEOKdA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=iki.fi; s=lahtoruutu; t=1710440488; 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=PuYtDCBuNW6LF6P42ZRMelLjm1b3B+qDfqrXHnj+Rzc=; b=RHNx0lBPhhzIqMzkP4rDmyRloVfaeuCOnRQpFKnHuNg4OWRtkAom/kJVL1iJ1TIkQqpC2h O3nNHvynmdLAyudiRPRJdUKk/OfohhCYLJGEYls0KvHQV4JTu9xZSHIU2BwYHBdr/3t0gJ S9qhuqAfl09bnuokxhzNtY49xhDCMLZRhLzhQNLQC2bg9AnvMyQfyZH1o91x3U/qttXoZv FC4nWRZpUia6vZfUXx05vf2JrT4tUxO+AA6cO9QY21RvIi0gK+QGO1Ltb23SnRvP18vp5H vXI0JJ3MyaXiLa+d7e4zYJe+PhKQOmqk1F+OxML1eit1IZM1puNhbGbbjSSw5Q== 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=1710440488; a=rsa-sha256; cv=none; b=APlR9vpfdXzVgzxg/0mrSsuIJLmDr5WcvUVUG7Drorxb1OYIfEm/J0sRHAvoGl4kye6Zja 66wpdmTYes7saUUipn9z2BhexIOnJKhlHYlLIOCbkngdsPB2arXOGZ1tNWNb2vjrk8/CUq +XD1wBW6J2wZsRvvA00iULBiZQRHriAFf/hdpqWbLN3F7W2BUoH+fEFmiZs+diCB1EMiwH oDkTDe35kNA3UsLUKEnhBLcuiB40OMxXrHjpgvTWQQNjzMWt1Jz03gmHzNqXfmI1S+CMmQ XrNkEGDEsX++NllVBhznARuPmitvz5QcbItVdxBLVw8iH/m9KfUbMoIolAzYuw== From: Pauli Virtanen To: linux-bluetooth@vger.kernel.org Cc: Pauli Virtanen Subject: [PATCH BlueZ v2 2/9] iso-tester: Add tests for TX timestamping Date: Thu, 14 Mar 2024 20:21:11 +0200 Message-ID: X-Mailer: git-send-email 2.44.0 In-Reply-To: References: Precedence: bulk X-Mailing-List: linux-bluetooth@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Add TX timestamping test utilities in new tester-utils.h, so that they can be shared between testers. Add tests: ISO Send - TX Timestamping ISO Send - TX Sched Timestamping ISO Send - TX Msg Timestamping --- tools/iso-tester.c | 169 ++++++++++++++++++++++++++++++++++++++++--- tools/tester-utils.h | 163 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 322 insertions(+), 10 deletions(-) create mode 100644 tools/tester-utils.h diff --git a/tools/iso-tester.c b/tools/iso-tester.c index 1864b9e9d..08f8d0286 100644 --- a/tools/iso-tester.c +++ b/tools/iso-tester.c @@ -18,6 +18,9 @@ #include #include +#include +#include + #include #include "lib/bluetooth.h" @@ -34,6 +37,8 @@ #include "src/shared/util.h" #include "src/shared/queue.h" +#include "tester-utils.h" + #define QOS_IO(_interval, _latency, _sdu, _phy, _rtn) \ { \ .interval = _interval, \ @@ -462,11 +467,12 @@ struct test_data { uint16_t handle; uint16_t acl_handle; struct queue *io_queue; - unsigned int io_id[2]; + unsigned int io_id[3]; uint8_t client_num; int step; bool reconnect; bool suspending; + struct tx_tstamp_data tx_ts; }; struct iso_client_data { @@ -487,6 +493,10 @@ struct iso_client_data { size_t base_len; bool listen_bind; bool pa_bind; + uint32_t so_timestamping; + bool msg_timestamping; + unsigned int send_extra; + unsigned int send_extra_pre_ts; }; static void mgmt_debug(const char *str, void *user_data) @@ -675,15 +685,14 @@ static void io_free(void *data) static void test_data_free(void *test_data) { struct test_data *data = test_data; + unsigned int i; if (data->io_queue) queue_destroy(data->io_queue, io_free); - if (data->io_id[0] > 0) - g_source_remove(data->io_id[0]); - - if (data->io_id[1] > 0) - g_source_remove(data->io_id[1]); + for (i = 0; i < ARRAY_SIZE(data->io_id); ++i) + if (data->io_id[i] > 0) + g_source_remove(data->io_id[i]); free(data); } @@ -985,6 +994,38 @@ static const struct iso_client_data connect_16_2_1_send = { .send = &send_16_2_1, }; +static const struct iso_client_data connect_send_tx_timestamping = { + .qos = QOS_16_2_1, + .expect_err = 0, + .send = &send_16_2_1, + .so_timestamping = (SOF_TIMESTAMPING_SOFTWARE | + SOF_TIMESTAMPING_OPT_ID | + SOF_TIMESTAMPING_TX_SOFTWARE), + .send_extra = 1, + .send_extra_pre_ts = 2, +}; + +static const struct iso_client_data connect_send_tx_sched_timestamping = { + .qos = QOS_16_2_1, + .expect_err = 0, + .send = &send_16_2_1, + .so_timestamping = (SOF_TIMESTAMPING_SOFTWARE | + SOF_TIMESTAMPING_TX_SOFTWARE | + SOF_TIMESTAMPING_OPT_TSONLY | + SOF_TIMESTAMPING_TX_SCHED), + .send_extra = 1, +}; + +static const struct iso_client_data connect_send_tx_msg_timestamping = { + .qos = QOS_16_2_1, + .expect_err = 0, + .send = &send_16_2_1, + .so_timestamping = (SOF_TIMESTAMPING_SOFTWARE | + SOF_TIMESTAMPING_TX_SOFTWARE), + .send_extra = 1, + .msg_timestamping = true, +}; + static const struct iso_client_data listen_16_2_1_recv = { .qos = QOS_16_2_1, .expect_err = 0, @@ -1408,14 +1449,17 @@ static void bthost_recv_data(const void *buf, uint16_t len, void *user_data) struct test_data *data = user_data; const struct iso_client_data *isodata = data->test_data; + --data->step; + tester_print("Client received %u bytes of data", len); if (isodata->send && (isodata->send->iov_len != len || memcmp(isodata->send->iov_base, buf, len))) { if (!isodata->recv->iov_base) tester_test_failed(); - } else + } else if (!data->step) { tester_test_passed(); + } } static void bthost_iso_disconnected(void *user_data) @@ -2056,17 +2100,95 @@ static void iso_recv(struct test_data *data, GIOChannel *io) data->io_id[0] = g_io_add_watch(io, G_IO_IN, iso_recv_data, data); } -static void iso_send(struct test_data *data, GIOChannel *io) +static gboolean iso_recv_errqueue(GIOChannel *io, GIOCondition cond, + gpointer user_data) { + struct test_data *data = user_data; const struct iso_client_data *isodata = data->test_data; - ssize_t ret; + int sk = g_io_channel_unix_get_fd(io); + int err; + + data->step--; + + err = tx_tstamp_recv(&data->tx_ts, sk, isodata->send->iov_len); + if (err > 0) + return TRUE; + else if (!err && !data->step) + tester_test_passed(); + else + tester_test_failed(); + + data->io_id[2] = 0; + return FALSE; +} + +static void iso_tx_timestamping(struct test_data *data, GIOChannel *io) +{ + const struct iso_client_data *isodata = data->test_data; + struct so_timestamping so = { + .flags = isodata->so_timestamping, + }; int sk; + int err; + unsigned int count; + + if (!(isodata->so_timestamping & SOF_TIMESTAMPING_TX_RECORD_MASK)) + return; + + tester_print("Enabling TX timestamping"); + + tx_tstamp_init(&data->tx_ts, isodata->so_timestamping); + + for (count = 0; count < isodata->send_extra + 1; ++count) + data->step += tx_tstamp_expect(&data->tx_ts); sk = g_io_channel_unix_get_fd(io); + data->io_id[2] = g_io_add_watch(io, G_IO_ERR, iso_recv_errqueue, data); + + if (isodata->msg_timestamping) + so.flags &= ~SOF_TIMESTAMPING_TX_RECORD_MASK; + + err = setsockopt(sk, SOL_SOCKET, SO_TIMESTAMPING, &so, sizeof(so)); + if (err < 0) { + tester_warn("setsockopt SO_TIMESTAMPING: %s (%d)", + strerror(errno), errno); + tester_test_failed(); + return; + } +} + +static void iso_send_data(struct test_data *data, GIOChannel *io) +{ + const struct iso_client_data *isodata = data->test_data; + char control[CMSG_SPACE(sizeof(uint32_t))]; + struct msghdr msg = { + .msg_iov = (struct iovec *)isodata->send, + .msg_iovlen = 1, + }; + struct cmsghdr *cmsg; + ssize_t ret; + int sk; + tester_print("Writing %zu bytes of data", isodata->send->iov_len); - ret = writev(sk, isodata->send, 1); + sk = g_io_channel_unix_get_fd(io); + + if (isodata->msg_timestamping) { + memset(control, 0, sizeof(control)); + msg.msg_control = control; + msg.msg_controllen = sizeof(control); + + cmsg = CMSG_FIRSTHDR(&msg); + cmsg->cmsg_level = SOL_SOCKET; + cmsg->cmsg_type = SO_TIMESTAMPING; + cmsg->cmsg_len = CMSG_LEN(sizeof(uint32_t)); + + *((uint32_t *)CMSG_DATA(cmsg)) = (isodata->so_timestamping & + SOF_TIMESTAMPING_TX_RECORD_MASK); + } + + ret = sendmsg(sk, &msg, 0); if (ret < 0 || isodata->send->iov_len != (size_t) ret) { tester_warn("Failed to write %zu bytes: %s (%d)", isodata->send->iov_len, strerror(errno), errno); @@ -2074,6 +2196,22 @@ static void iso_send(struct test_data *data, GIOChannel *io) return; } + data->step++; +} + +static void iso_send(struct test_data *data, GIOChannel *io) +{ + const struct iso_client_data *isodata = data->test_data; + unsigned int count; + + for (count = 0; count < isodata->send_extra_pre_ts; ++count) + iso_send_data(data, io); + + iso_tx_timestamping(data, io); + + for (count = 0; count < isodata->send_extra + 1; ++count) + iso_send_data(data, io); + if (isodata->bcast) { tester_test_passed(); return; @@ -3172,6 +3310,17 @@ int main(int argc, char *argv[]) test_iso("ISO Send - Success", &connect_16_2_1_send, setup_powered, test_connect); + test_iso("ISO Send - TX Timestamping", &connect_send_tx_timestamping, + setup_powered, test_connect); + + test_iso("ISO Send - TX Sched Timestamping", + &connect_send_tx_sched_timestamping, setup_powered, + test_connect); + + test_iso("ISO Send - TX Msg Timestamping", + &connect_send_tx_msg_timestamping, setup_powered, + test_connect); + test_iso("ISO Receive - Success", &listen_16_2_1_recv, setup_powered, test_listen); diff --git a/tools/tester-utils.h b/tools/tester-utils.h new file mode 100644 index 000000000..617de842e --- /dev/null +++ b/tools/tester-utils.h @@ -0,0 +1,163 @@ +// SPDX-License-Identifier: LGPL-2.1-or-later +/* + * + * BlueZ - Bluetooth protocol stack for Linux + * + * Copyright (C) 2022 Intel Corporation. + * + */ + +#include +#include +#include +#include +#include +#include +#include + +#include + +#define SEC_NSEC(_t) ((_t) * 1000000000LL) +#define TS_NSEC(_ts) (SEC_NSEC((_ts)->tv_sec) + (_ts)->tv_nsec) + +struct tx_tstamp_data { + struct { + uint32_t id; + uint32_t type; + } expect[16]; + unsigned int pos; + unsigned int count; + unsigned int sent; + uint32_t so_timestamping; +}; + +static inline void tx_tstamp_init(struct tx_tstamp_data *data, + uint32_t so_timestamping) +{ + memset(data, 0, sizeof(*data)); + memset(data->expect, 0xff, sizeof(data->expect)); + + data->so_timestamping = so_timestamping; +} + +static inline int tx_tstamp_expect(struct tx_tstamp_data *data) +{ + unsigned int pos = data->count; + int steps; + + if (data->so_timestamping & SOF_TIMESTAMPING_TX_SCHED) { + g_assert(pos < ARRAY_SIZE(data->expect)); + data->expect[pos].type = SCM_TSTAMP_SCHED; + data->expect[pos].id = data->sent; + pos++; + } + + if (data->so_timestamping & SOF_TIMESTAMPING_TX_SOFTWARE) { + g_assert(pos < ARRAY_SIZE(data->expect)); + data->expect[pos].type = SCM_TSTAMP_SND; + data->expect[pos].id = data->sent; + pos++; + } + + data->sent++; + + steps = pos - data->count; + data->count = pos; + return steps; +} + +static inline int tx_tstamp_recv(struct tx_tstamp_data *data, int sk, int len) +{ + unsigned char control[512]; + ssize_t ret; + char buf[1024]; + struct msghdr msg; + struct iovec iov; + struct cmsghdr *cmsg; + struct scm_timestamping *tss = NULL; + struct sock_extended_err *serr = NULL; + struct timespec now; + + iov.iov_base = buf; + iov.iov_len = sizeof(buf); + + memset(&msg, 0, sizeof(msg)); + msg.msg_iov = &iov; + msg.msg_iovlen = 1; + msg.msg_control = control; + msg.msg_controllen = sizeof(control); + + ret = recvmsg(sk, &msg, MSG_ERRQUEUE); + if (ret < 0) { + tester_warn("Failed to read from errqueue: %s (%d)", + strerror(errno), errno); + return -EINVAL; + } + + if (data->so_timestamping & SOF_TIMESTAMPING_OPT_TSONLY) { + if (ret != 0) { + tester_warn("Packet copied back to errqueue"); + return -EINVAL; + } + } else if (len > ret) { + tester_warn("Packet not copied back to errqueue: %zd", ret); + return -EINVAL; + } + + for (cmsg = CMSG_FIRSTHDR(&msg); cmsg != NULL; + cmsg = CMSG_NXTHDR(&msg, cmsg)) { + if (cmsg->cmsg_level == SOL_SOCKET && + cmsg->cmsg_type == SCM_TIMESTAMPING) { + tss = (void *)CMSG_DATA(cmsg); + } else if (cmsg->cmsg_level == SOL_BLUETOOTH && + cmsg->cmsg_type == BT_SCM_ERROR) { + serr = (void *)CMSG_DATA(cmsg); + } + } + + if (!tss) { + tester_warn("SCM_TIMESTAMPING not found"); + return -EINVAL; + } + + if (!serr) { + tester_warn("BT_SCM_ERROR not found"); + return -EINVAL; + } + + if (serr->ee_errno != ENOMSG || + serr->ee_origin != SO_EE_ORIGIN_TIMESTAMPING) { + tester_warn("BT_SCM_ERROR wrong for timestamping"); + return -EINVAL; + } + + clock_gettime(CLOCK_REALTIME, &now); + + if (TS_NSEC(&now) < TS_NSEC(tss->ts) || + TS_NSEC(&now) > TS_NSEC(tss->ts) + SEC_NSEC(10)) { + tester_warn("nonsense in timestamp"); + return -EINVAL; + } + + if (data->pos >= data->count) { + tester_warn("Too many timestamps"); + return -EINVAL; + } + + if ((data->so_timestamping & SOF_TIMESTAMPING_OPT_ID) && + serr->ee_data != data->expect[data->pos].id) { + tester_warn("Bad timestamp id %u", serr->ee_data); + return -EINVAL; + } + + if (serr->ee_info != data->expect[data->pos].type) { + tester_warn("Bad timestamp type %u", serr->ee_info); + return -EINVAL; + } + + tester_print("Got valid TX timestamp %u", data->pos); + + ++data->pos; + + return data->count - data->pos; +} From patchwork Thu Mar 14 18:21:12 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Pauli Virtanen X-Patchwork-Id: 13592655 Received: from lahtoruutu.iki.fi (lahtoruutu.iki.fi [185.185.170.37]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 71E8276F1F for ; Thu, 14 Mar 2024 18:21:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=pass smtp.client-ip=185.185.170.37 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710440499; cv=pass; b=jhcew6SS/iZkyhwgUifKz1hLcaHoTf7vixc7CdtheykH69n1JCc/X2lHQXQcTVHN73LysxJsuVOEOZsDZU1QlG70Jr2ynE7q9hNkUCE3pDCSnXgM6Tf19wjYIfHVKgZ+pwNgvzWIxaWFE1KA+2E6uTzPT3odVrhr6qBb4P1PNYI= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710440499; c=relaxed/simple; bh=kRnp7V3lDW3v6atmRTpeyY8sqVIQFjFY0kd1VmPR/Ws=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Pxbohy/BU2+Q0KqyxBe8abEhA0RH4Osir/QLN6zpaOhkOo20kuMTs+2P0o8MD6kOe+PvzIPfbKqXS1C4L87r0T+IeESMh9Gzgny7rKMJH+8rVCL3olLcd/H3DsMuEHQwKCq7PaqV5Fe/GTa+d97G7RD/8VvE8O9qPApvQRSz9Mw= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=iki.fi; spf=pass smtp.mailfrom=iki.fi; dkim=pass (2048-bit key) header.d=iki.fi header.i=@iki.fi header.b=fDegzOAO; arc=pass smtp.client-ip=185.185.170.37 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=iki.fi Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=iki.fi Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=iki.fi header.i=@iki.fi header.b="fDegzOAO" 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 4TwbLK0nlXz49Pvb; Thu, 14 Mar 2024 20:21:28 +0200 (EET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=iki.fi; s=lahtoruutu; t=1710440489; 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=V1ZAG7iQohgKpksnivQ289GL76Qye04C74/31MpvBes=; b=fDegzOAOeMxSrpuZbGmMmsI/VPOKUkHN9hv4mE6FSmNpZq/o06Wd3JzTir4oJUcD4yOnJP aqzpfO9VOZ3gYpe+KEHWLJcbhurEI67Q44/FA6+8ANgsCQ5Y+oAYlcMfXlkXP7Ahpm8XIP GcZTtFrVb8gkCHBj4cPvt1Cd9QBWe1HFBJgYqq6ueg64IXJVNP42h6CpYzQSqiscdMLpO5 YQB/WwJP07CwfLMzf+2TlkDrjAvbzQ/Fhf8HUnNUI7PXJCFtTGi+Jm4w7FK1jfPrGIcJFE ZaeuAeRnTgTrLYVmmokSBc7IFgRHwz/LvrI9PdXr6PcFwe6WCZ6iuNdNgfmLeg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=iki.fi; s=lahtoruutu; t=1710440489; 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=V1ZAG7iQohgKpksnivQ289GL76Qye04C74/31MpvBes=; b=g7LKvCmVTmxsBMsM1Vf2hND/8FzQG2W+047rjYG0cGKCxXfXYf4LKzSj2m9bVilFOFB5V2 W6UoBiDCQ4UwiBl2umdBOxcmDbZK2jQqf4v/MjK2HKSFq/vu8/lbBZT4vsoAQT4QGnGlYj oUB7SA9NSN1tCqUlf1mIbryvDdAywtrKIznNgE2+8sBP3eLUw0v5SFMwG/XjspySZsao2u zBihVW1J/jMbcB6ZGYrsXNM/bPub317QmjqyCB1smjAXhmNKpBnxB9jR2sbySpS4cDqQSD QU3+irI4R6za4WaYdrz+MT4WQtytPsGfAeTSxJpBjfpNS9UXeRieUJ67hSi5nQ== 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=1710440489; a=rsa-sha256; cv=none; b=gZittj2dAD+I9YuSHGm4Iw9JoyLWtdsfNBG7Nj/Qv6SwPgd1dNJ4YzDMwgk4GEnR2ANrBL +dri9Ap9vIo1WyIvZfIL9R0LEevu1TZANvowZwPbdRImPaoQY9v2fNel+LlOiTzznVzARN BullTPX3cGqnEM3Z0SldWylNYTsm3zvrkYdEGFagHfJkeyKGRCwFL/cloKtXJxmZd+hKVi daOSv8GvXAzmSxBJgXwVLVgpc0hxPD8H2i2x18f0OrO7cHoFM+D5jSf7NcQHUNO/DOn2Ti 7Vv5cBqxvBLb/nyuAx6Jx99VtDPE4piGfnNnUxKpz31w83ybX44m4np6VWoOeQ== From: Pauli Virtanen To: linux-bluetooth@vger.kernel.org Cc: Pauli Virtanen Subject: [PATCH BlueZ v2 3/9] l2cap-tester: Add test for TX timestamping Date: Thu, 14 Mar 2024 20:21:12 +0200 Message-ID: X-Mailer: git-send-email 2.44.0 In-Reply-To: References: Precedence: bulk X-Mailing-List: linux-bluetooth@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Add test L2CAP BR/EDR Client - TX Timestamping --- tools/l2cap-tester.c | 106 +++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 101 insertions(+), 5 deletions(-) diff --git a/tools/l2cap-tester.c b/tools/l2cap-tester.c index 461f2c27c..f990110d9 100644 --- a/tools/l2cap-tester.c +++ b/tools/l2cap-tester.c @@ -30,6 +30,9 @@ #include "src/shared/tester.h" #include "src/shared/mgmt.h" +#include "src/shared/util.h" + +#include "tester-utils.h" struct test_data { const void *test_data; @@ -38,12 +41,15 @@ struct test_data { struct hciemu *hciemu; enum hciemu_type hciemu_type; unsigned int io_id; + unsigned int err_io_id; uint16_t handle; uint16_t scid; uint16_t dcid; int sk; int sk2; bool host_disconnected; + int step; + struct tx_tstamp_data tx_ts; }; struct l2cap_data { @@ -86,6 +92,9 @@ struct l2cap_data { bool defer; bool shut_sock_wr; + + uint32_t so_timestamping; + unsigned int send_extra; }; static void print_debug(const char *str, void *user_data) @@ -226,6 +235,11 @@ static void test_post_teardown(const void *test_data) data->io_id = 0; } + if (data->err_io_id > 0) { + g_source_remove(data->err_io_id); + data->err_io_id = 0; + } + hciemu_unref(data->hciemu); data->hciemu = NULL; } @@ -245,6 +259,7 @@ static void test_data_free(void *test_data) break; \ user->hciemu_type = HCIEMU_TYPE_BREDR; \ user->io_id = 0; \ + user->err_io_id = 0; \ user->test_data = data; \ tester_add_full(name, data, \ test_pre_setup, setup, func, NULL, \ @@ -259,6 +274,7 @@ static void test_data_free(void *test_data) break; \ user->hciemu_type = HCIEMU_TYPE_LE; \ user->io_id = 0; \ + user->err_io_id = 0; \ user->test_data = data; \ tester_add_full(name, data, \ test_pre_setup, setup, func, NULL, \ @@ -321,6 +337,17 @@ static const struct l2cap_data client_connect_write_success_test = { .data_len = sizeof(l2_data), }; +static const struct l2cap_data client_connect_tx_timestamping_test = { + .client_psm = 0x1001, + .server_psm = 0x1001, + .write_data = l2_data, + .data_len = sizeof(l2_data), + .so_timestamping = (SOF_TIMESTAMPING_SOFTWARE | + SOF_TIMESTAMPING_OPT_ID | + SOF_TIMESTAMPING_TX_SOFTWARE), + .send_extra = 2, +}; + static const struct l2cap_data client_connect_shut_wr_success_test = { .client_psm = 0x1001, .server_psm = 0x1001, @@ -1096,6 +1123,8 @@ static void bthost_received_data(const void *buf, uint16_t len, struct test_data *data = tester_get_data(); const struct l2cap_data *l2data = data->test_data; + --data->step; + if (len != l2data->data_len) { tester_test_failed(); return; @@ -1103,7 +1132,7 @@ static void bthost_received_data(const void *buf, uint16_t len, if (memcmp(buf, l2data->write_data, l2data->data_len)) tester_test_failed(); - else + else if (!data->step) tester_test_passed(); } @@ -1207,6 +1236,61 @@ static bool check_mtu(struct test_data *data, int sk) return true; } +static gboolean recv_errqueue(GIOChannel *io, GIOCondition cond, + gpointer user_data) +{ + struct test_data *data = user_data; + const struct l2cap_data *l2data = data->test_data; + int sk = g_io_channel_unix_get_fd(io); + int err; + + data->step--; + + err = tx_tstamp_recv(&data->tx_ts, sk, l2data->data_len); + if (err > 0) + return TRUE; + else if (!err && !data->step) + tester_test_passed(); + else + tester_test_failed(); + + data->err_io_id = 0; + return FALSE; +} + +static void l2cap_tx_timestamping(struct test_data *data, GIOChannel *io) +{ + const struct l2cap_data *l2data = data->test_data; + struct so_timestamping so = { + .flags = l2data->so_timestamping, + }; + int sk; + int err; + unsigned int count; + + if (!(l2data->so_timestamping & SOF_TIMESTAMPING_TX_RECORD_MASK)) + return; + + sk = g_io_channel_unix_get_fd(io); + + tester_print("Enabling TX timestamping"); + + tx_tstamp_init(&data->tx_ts, l2data->so_timestamping); + + for (count = 0; count < l2data->send_extra + 1; ++count) + data->step += tx_tstamp_expect(&data->tx_ts); + + err = setsockopt(sk, SOL_SOCKET, SO_TIMESTAMPING, &so, sizeof(so)); + if (err < 0) { + tester_warn("setsockopt SO_TIMESTAMPING: %s (%d)", + strerror(errno), errno); + tester_test_failed(); + return; + } + + data->err_io_id = g_io_add_watch(io, G_IO_ERR, recv_errqueue, data); +} + static gboolean l2cap_connect_cb(GIOChannel *io, GIOCondition cond, gpointer user_data) { @@ -1249,15 +1333,23 @@ static gboolean l2cap_connect_cb(GIOChannel *io, GIOCondition cond, } else if (l2data->write_data) { struct bthost *bthost; ssize_t ret; + unsigned int count; + + data->step = 0; bthost = hciemu_client_get_host(data->hciemu); bthost_add_cid_hook(bthost, data->handle, data->dcid, bthost_received_data, NULL); - ret = write(sk, l2data->write_data, l2data->data_len); - if (ret != l2data->data_len) { - tester_warn("Unable to write all data"); - tester_test_failed(); + l2cap_tx_timestamping(data, io); + + for (count = 0; count < l2data->send_extra + 1; ++count) { + ret = write(sk, l2data->write_data, l2data->data_len); + if (ret != l2data->data_len) { + tester_warn("Unable to write all data"); + tester_test_failed(); + } + ++data->step; } return FALSE; @@ -2280,6 +2372,10 @@ int main(int argc, char *argv[]) &client_connect_write_success_test, setup_powered_client, test_connect); + test_l2cap_bredr("L2CAP BR/EDR Client - TX Timestamping", + &client_connect_tx_timestamping_test, + setup_powered_client, test_connect); + test_l2cap_bredr("L2CAP BR/EDR Client - Invalid PSM 1", &client_connect_nval_psm_test_1, setup_powered_client, test_connect); From patchwork Thu Mar 14 18:21:13 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Pauli Virtanen X-Patchwork-Id: 13592653 Received: from lahtoruutu.iki.fi (lahtoruutu.iki.fi [185.185.170.37]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 71E3374C0F for ; Thu, 14 Mar 2024 18:21:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=pass smtp.client-ip=185.185.170.37 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710440499; cv=pass; b=EpW+UKfr8OfCO0Ccr45BqRtryE9oskB8nZQGfoC/RJFCCrEDCY0/Tbzr4pF4RLkRquuYwG2Kq341g9sseEZarIf7Rtv1a8G5OOI80w4gD6AA7V5lTKlqoyI2qZW1O4/Ubud8H9KoFWywyuvt4Nc/fCAfDVIGO9he6qKn4AXB5i8= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710440499; c=relaxed/simple; bh=TY2fqdnHm/1qXm5oAZeAZQByaO0VJhMajIR2AvaXsms=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=ONf/ZHUDCRVbAw/enk0rZazhywnyMaWGL4uVpzH4yrKnsSaT3Kof91N0HUdrOmNRFldrhYzUMaxvFzJhkGQ+LygRIlgRIWaenngBlZbyP4Y3xVrjVyMvJBe2vC75/tgaTRXzMFPCd/9nJoc1O2ULbXFYQACsCUT1r4UdrW3ygkQ= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=iki.fi; spf=pass smtp.mailfrom=iki.fi; dkim=pass (2048-bit key) header.d=iki.fi header.i=@iki.fi header.b=VsKKpcBx; arc=pass smtp.client-ip=185.185.170.37 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=iki.fi Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=iki.fi Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=iki.fi header.i=@iki.fi header.b="VsKKpcBx" 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 4TwbLL0RTGz49PxK; Thu, 14 Mar 2024 20:21:29 +0200 (EET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=iki.fi; s=lahtoruutu; t=1710440490; 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=EMCfKk9RH++FCunQyWDEpkYQewc5l2UzI2FcSnTVpG4=; b=VsKKpcBxj9rh4p1q4nYUe5M9ET+U5+R+GAYoaD4XCuDy1bEazU0VP0ZUzgnDtRkNsm3rF9 XzmF5EobCmkBTLcL8k/SW2bMBu9a1hUSjvX+4DG7QkgztU2WGIwzxguO1+k0Acga4XyzG5 2iBIcu2ynL1oJYwuFqOy6djVT3fIJVmfgU8Nz4LyOxa5AXajBEAvoxGrEoMRNXKcMtcgbx oJGnVoq4OtZXTerhaxjTfqnWj6BPAaz58FimHtQ6JYcVBiugqdk9YEKTxp0Kqh7xyOn8wr CSh3x60YvHLjXODZzMe0ZQkYbic7n2q832zZ6epULKaJrFSYiobux8uuOzHEfw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=iki.fi; s=lahtoruutu; t=1710440490; 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=EMCfKk9RH++FCunQyWDEpkYQewc5l2UzI2FcSnTVpG4=; b=Kw/e4tEeCOAwj1TscA4gM4mMeEFwux9UzlYJQ736MjZp/LSL9szGfEeUJZmHI1NHD+OhZ5 klIrRVhuOQKVvMbHbZ/TpIx3lsP66vbPpJjND68HxbN0RhaV2VaDJW2J5aY8qY7Ep17w/e FDWgb22MtA1NA9nwNnMOjSVaC8oa1N/fFENK6gKm4dXvhbCcUHl7po+6YuZrLOFDgA/EYI NKF6QitlUYr8iEyEchpzNKv9oeNalijwSF2QVvVbaRYLoORNwYqfREDGgJzgssuz4s3uIe 3DPUm88kTHgnAnKe75GtfKm0d/0bZ/MxzydAQuRPKaiMYoMV5Vs2BpMBsMofOQ== 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=1710440490; a=rsa-sha256; cv=none; b=eAHLrjMLrD/ef4V2MTXEQB8+X+fFABXK4lVig3l0edRKuZKF3i9twJ61h+fOu69/TAwjOh LwUC6iuCEEVZ7XIr0+H84Xr5glQ0yDmVo5KJh42dyuWONFjz/MVotgncaC5qYmUZblyTxL z4ThIjQ0ry7h+XGtXQ0g1oxHmo+xh4kxkbSzuxEtUJ89bhAyO8yptieNN7XsN+4oqmeLMs yyBXItBK/mNXdWeYv3u219MiyC/4Ax3ocghGPRkgk/u/C6umyvPJR00BSB3EEmLh0Tz9ol LFL25aqCs4KBY2ZVeSfURZgaGwdnBECJOqfASNqlFG17P9p9P1jRxAh+bizKCA== From: Pauli Virtanen To: linux-bluetooth@vger.kernel.org Cc: Pauli Virtanen Subject: [PATCH BlueZ v2 4/9] btdev: set nonzero SCO mtu & max pkt Date: Thu, 14 Mar 2024 20:21:13 +0200 Message-ID: X-Mailer: git-send-email 2.44.0 In-Reply-To: References: Precedence: bulk X-Mailing-List: linux-bluetooth@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Set nonzero max pkt count, so that kernel can transmit data. The request & accept/reject flow is not emulated yet. --- emulator/btdev.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/emulator/btdev.c b/emulator/btdev.c index 0ad6b2793..a63136fad 100644 --- a/emulator/btdev.c +++ b/emulator/btdev.c @@ -148,6 +148,8 @@ struct btdev { uint8_t feat_page_2[8]; uint16_t acl_mtu; uint16_t acl_max_pkt; + uint16_t sco_mtu; + uint16_t sco_max_pkt; uint16_t iso_mtu; uint16_t iso_max_pkt; uint8_t country_code; @@ -653,9 +655,9 @@ static int cmd_read_buffer_size(struct btdev *dev, const void *data, rsp.status = BT_HCI_ERR_SUCCESS; rsp.acl_mtu = cpu_to_le16(dev->acl_mtu); - rsp.sco_mtu = 0; + rsp.sco_mtu = cpu_to_le16(dev->sco_mtu); rsp.acl_max_pkt = cpu_to_le16(dev->acl_max_pkt); - rsp.sco_max_pkt = cpu_to_le16(0); + rsp.sco_max_pkt = cpu_to_le16(dev->sco_max_pkt); cmd_complete(dev, BT_HCI_CMD_READ_BUFFER_SIZE, &rsp, sizeof(rsp)); @@ -2764,6 +2766,8 @@ static int cmd_enhanced_setup_sync_conn_complete(struct btdev *dev, goto done; } + /* TODO: HCI_Connection_Request connection flow */ + cc.status = BT_HCI_ERR_SUCCESS; memcpy(cc.bdaddr, conn->link->dev->bdaddr, 6); @@ -7173,6 +7177,9 @@ struct btdev *btdev_create(enum btdev_type type, uint16_t id) btdev->acl_mtu = 192; btdev->acl_max_pkt = 1; + btdev->sco_mtu = 72; + btdev->sco_max_pkt = 1; + btdev->iso_mtu = 251; btdev->iso_max_pkt = 1; btdev->big_handle = 0xff; From patchwork Thu Mar 14 18:21:14 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Pauli Virtanen X-Patchwork-Id: 13592658 Received: from lahtoruutu.iki.fi (lahtoruutu.iki.fi [185.185.170.37]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 86B2A7762B for ; Thu, 14 Mar 2024 18:21:38 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=pass smtp.client-ip=185.185.170.37 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710440501; cv=pass; b=PedLht+LSdMpaKgC7RdnPYab6BxDmeyXayXhGMrtI7DH6w5g/DablrqyMu1Qvg/Xr+syzv1UHdgcwAv35vbz2i7r/fnKr+zPrN0LcSPDSLN3b48f21+gM5XUGupCYu9vhKBtCDeHLVHgLvymhwlfJZ8VtCqiuttqO+WU7d0D58w= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710440501; c=relaxed/simple; bh=1Ux7vU2EN6XfhF2iHSUa7m1yjbwoXsqdQj+LuIZ5DzQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=XJ3cB/0m/oSt7yfLIlrPKuwcTUaL9J6JlQrKUDbV3yB7vw3xymOuWde05HlXebnKpc+/+woMaXlnLlld1SCPp27LfBJ0O4SG2fT0ac3VBT1N9M9p4jpf+jM/MDso1zdHAgVLUXC9FcB5c2cNNyxIssUfMul93m/onMv1z8TtoXE= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=iki.fi; spf=pass smtp.mailfrom=iki.fi; dkim=pass (2048-bit key) header.d=iki.fi header.i=@iki.fi header.b=GgjbwI0H; arc=pass smtp.client-ip=185.185.170.37 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=iki.fi Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=iki.fi Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=iki.fi header.i=@iki.fi header.b="GgjbwI0H" 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 4TwbLM02frz49PyZ; Thu, 14 Mar 2024 20:21:30 +0200 (EET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=iki.fi; s=lahtoruutu; t=1710440491; 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=DwyCCRgw3xaKuhE1uxZhmGMrtIEPd+B5gXuytRvdC/E=; b=GgjbwI0HrLFDszInDQdGkdkLn+6FqYuGmDMFbvcQAhhM6nyzWwJd8FdOpXcetdCMGSZw9N E2cIjQU1h04VrQ3NMqYYAOHqL8z1LBQmJh+FmwPo1H1JURBRDnQv1INEMX/DA0+Xa2s4zZ w3a78O8/r67FZrcI2+Fid0v3f3rrZb+z0mtLiXXloFKDWealcx3XFOVP5eZ+89Wl/6k2dd l4+Jtz9dfhmRGu3WiR/YP3+GQtm1ZnQ62agObCRE4578eN5Kp7oECcph/N9Cx46oWC+0ov vrfWOMCrjS2SMQ5LnByWI2Rzn9VzTVXMCYn+E1dH+0Kz251mnNm8OrPC/OYSDg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=iki.fi; s=lahtoruutu; t=1710440491; 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=DwyCCRgw3xaKuhE1uxZhmGMrtIEPd+B5gXuytRvdC/E=; b=SbGEcxg5Y4tJmak01VMZd5u2BoeYkPzTSAOpngAhaiwa0LUUUhV9GfrKzZnPRyyeZIq0xD qWAEElfjPv5ffKfPr6UBCU34k66fE+CS8hcXuBcF+u4fN+GhGIRzDZW/UO2atOYr1v3iE1 r0teZT4WHIrCOuXAyQq2t617k0KAB0HWTBb1+0GoYs1yF+XsHWIIFlhgrzYGhIWU6IQSl3 VIxwmJX+o+jEj4DJyHCyVEeJ+eZ8Dx49sBrKrSeySgec9wEqADqBUm/6xt/AciSDumN7fO M9+tAC3t63ZVSRezh+8dpQh/mZZ3u/sYsUhPWhBiNBm6Slw4DcnawSusg/UCKA== 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=1710440491; a=rsa-sha256; cv=none; b=qcEgjWLD6U90XAeXv8ytgIk3CMkbHcFc9m4xIHxzoTMZ0zXbNM1Nsp2bCdZDX+Hlq0Qt7L V0947HuwyVQWA52nOOLUQ4hGaP9AMSKutv2h2Rh8lACufI7LEnW4wNWimNVtaLVfreAJ8K SakfS/NE8xGXS9jfR29VlPz9BQptrM9iVNCYvQsZqXdOph46gfrvMplAEsAhjuuJTCtbbf E9kHQD29FmztmKmGXNx3VAfkLHZC8M2RxSGV2pu3a4cCRqGr3/YXzle6n/h7x8UAAMLsyF HMEJBEj/R+VEX9jBppjF1ocRPuQ53qGhg3rpYskTH1olcoVB2d2awXVxmYPNZQ== From: Pauli Virtanen To: linux-bluetooth@vger.kernel.org Cc: Pauli Virtanen Subject: [PATCH BlueZ v2 5/9] sco-tester: add TX timestamping test Date: Thu, 14 Mar 2024 20:21:14 +0200 Message-ID: <87e454b997d2211e1bea4b017a5f5ca22734550f.1710440408.git.pav@iki.fi> X-Mailer: git-send-email 2.44.0 In-Reply-To: References: Precedence: bulk X-Mailing-List: linux-bluetooth@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Add test: SCO CVSD Send - TX Timestamping --- tools/sco-tester.c | 94 ++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 91 insertions(+), 3 deletions(-) diff --git a/tools/sco-tester.c b/tools/sco-tester.c index ecc65e092..8997e86f7 100644 --- a/tools/sco-tester.c +++ b/tools/sco-tester.c @@ -31,6 +31,8 @@ #include "src/shared/mgmt.h" #include "src/shared/util.h" +#include "tester-utils.h" + struct test_data { const void *test_data; struct mgmt *mgmt; @@ -38,15 +40,20 @@ struct test_data { struct hciemu *hciemu; enum hciemu_type hciemu_type; unsigned int io_id; + unsigned int err_io_id; int sk; bool disable_esco; bool enable_codecs; + int step; + struct tx_tstamp_data tx_ts; }; struct sco_client_data { int expect_err; const uint8_t *send_data; uint16_t data_len; + uint32_t so_timestamping; + unsigned int send_extra; }; static void print_debug(const char *str, void *user_data) @@ -227,8 +234,10 @@ static void test_data_free(void *test_data) break; \ user->hciemu_type = HCIEMU_TYPE_BREDRLE; \ user->io_id = 0; \ + user->err_io_id = 0; \ user->sk = -1; \ user->test_data = data; \ + user->step = 0; \ user->disable_esco = _disable_esco; \ user->enable_codecs = _enable_codecs; \ tester_add_full(name, data, \ @@ -265,6 +274,16 @@ static const struct sco_client_data connect_send_success = { .send_data = data }; +static const struct sco_client_data connect_send_tx_timestamping = { + .expect_err = 0, + .data_len = sizeof(data), + .send_data = data, + .so_timestamping = (SOF_TIMESTAMPING_SOFTWARE | + SOF_TIMESTAMPING_OPT_ID | + SOF_TIMESTAMPING_TX_SOFTWARE), + .send_extra = 2, +}; + static void client_connectable_complete(uint16_t opcode, uint8_t status, const void *param, uint8_t len, void *user_data) @@ -595,6 +614,61 @@ static int connect_sco_sock(struct test_data *data, int sk) return 0; } +static gboolean recv_errqueue(GIOChannel *io, GIOCondition cond, + gpointer user_data) +{ + struct test_data *data = user_data; + const struct sco_client_data *scodata = data->test_data; + int sk = g_io_channel_unix_get_fd(io); + int err; + + data->step--; + + err = tx_tstamp_recv(&data->tx_ts, sk, scodata->data_len); + if (err > 0) + return TRUE; + else if (!err && !data->step) + tester_test_passed(); + else + tester_test_failed(); + + data->err_io_id = 0; + return FALSE; +} + +static void sco_tx_timestamping(struct test_data *data, GIOChannel *io) +{ + const struct sco_client_data *scodata = data->test_data; + struct so_timestamping so = { + .flags = scodata->so_timestamping, + }; + int sk; + int err; + unsigned int count; + + if (!(scodata->so_timestamping & SOF_TIMESTAMPING_TX_RECORD_MASK)) + return; + + sk = g_io_channel_unix_get_fd(io); + + tester_print("Enabling TX timestamping"); + + tx_tstamp_init(&data->tx_ts, scodata->so_timestamping); + + for (count = 0; count < scodata->send_extra + 1; ++count) + data->step += tx_tstamp_expect(&data->tx_ts); + + err = setsockopt(sk, SOL_SOCKET, SO_TIMESTAMPING, &so, sizeof(so)); + if (err < 0) { + tester_warn("setsockopt SO_TIMESTAMPING: %s (%d)", + strerror(errno), errno); + tester_test_failed(); + return; + } + + data->err_io_id = g_io_add_watch(io, G_IO_ERR, recv_errqueue, data); +} + static gboolean sco_connect_cb(GIOChannel *io, GIOCondition cond, gpointer user_data) { @@ -619,10 +693,20 @@ static gboolean sco_connect_cb(GIOChannel *io, GIOCondition cond, if (scodata->send_data) { ssize_t ret; + unsigned int count; + + data->step = 0; - tester_print("Writing %u bytes of data", scodata->data_len); + sco_tx_timestamping(data, io); - ret = write(sk, scodata->send_data, scodata->data_len); + tester_print("Writing %u*%u bytes of data", + scodata->send_extra + 1, scodata->data_len); + + for (count = 0; count < scodata->send_extra + 1; ++count) { + ret = write(sk, scodata->send_data, scodata->data_len); + if (scodata->data_len != ret) + break; + } if (scodata->data_len != ret) { tester_warn("Failed to write %u bytes: %zu %s (%d)", scodata->data_len, ret, strerror(errno), @@ -633,7 +717,7 @@ static gboolean sco_connect_cb(GIOChannel *io, GIOCondition cond, if (-err != scodata->expect_err) tester_test_failed(); - else + else if (!data->step) tester_test_passed(); return FALSE; @@ -869,6 +953,10 @@ int main(int argc, char *argv[]) test_sco("SCO CVSD Send - Success", &connect_send_success, setup_powered, test_connect); + test_sco("SCO CVSD Send - TX Timestamping", + &connect_send_tx_timestamping, + setup_powered, test_connect); + test_offload_sco("Basic SCO Get Socket Option - Offload - Success", NULL, setup_powered, test_codecs_getsockopt); From patchwork Thu Mar 14 18:21:15 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Pauli Virtanen X-Patchwork-Id: 13592656 Received: from lahtoruutu.iki.fi (lahtoruutu.iki.fi [185.185.170.37]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 86ACE77626 for ; Thu, 14 Mar 2024 18:21:38 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=pass smtp.client-ip=185.185.170.37 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710440500; cv=pass; b=lyyGuqiLQjMjc3ZBUgBwsX9wspIrKs9LW4np8VruAHlfa9wxz9J9br1Dfvfs8G0Z7WEG0xBgiXfEDAxOJBpCnt3bZvE5zejyFOA0iSUFKPdVkElU0SpgWD9vaYXiGCPYtVNCuw3fP8BRVrq36XhGqjyEU2BuzdzLgkha2IZr4/c= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710440500; c=relaxed/simple; bh=SI2L/BY/+xja5cZSti2rAP6ySA6EPIsm3IH0CbzMyCA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=VTXtuUUVNjnyf/1kpSjW11goK7XbJHxJpI/qnX49N+IGHSph8/bA+JoE4EmzjQCkea5o4I9f+rBJwF3mZsQ7SkiaOxxB5TwXSMETupb1nHMnlG0MZdfCSeCZEqQsLU0DWIobm+hFlT5ATgIMr6UuVo3ZLTjY9191Eb8oESwOdWs= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=iki.fi; spf=pass smtp.mailfrom=iki.fi; dkim=pass (2048-bit key) header.d=iki.fi header.i=@iki.fi header.b=KaXRu9QT; arc=pass smtp.client-ip=185.185.170.37 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=iki.fi Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=iki.fi Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=iki.fi header.i=@iki.fi header.b="KaXRu9QT" 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 4TwbLN01yrz49Pyp; Thu, 14 Mar 2024 20:21:31 +0200 (EET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=iki.fi; s=lahtoruutu; t=1710440492; 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=ZLFhzfdhZUwusV8AXnmOoKbPCZ//+DwsOZ8N6ZZvG00=; b=KaXRu9QTBPykDF9UJzOXiFTRKUUAC0KlvE28YGt67LvEZnIoW6zmI4ze/k3MpO1s6ILmvo v8WrevqzVPfaQMgZivwo8QjpXNd1jJXbGTs9XS1OEMSeeiEYYaUC4HYHKwRYbFjT3xBT/U zCp0VH2IyKnG7Euk5Tc7PKLmM6wNgUO3Epghmr6hJ+Xdp0ecXgoYAeU8OUKrshGwQ+/I5T eigmUC+jSAmOT/HMzXgXM5LTp6fPQBIB176c/wZMIs4kjl5fa1IRiOvwnU75vmL85VXHQd /a6L+3ta3FNC0I2fmngUPNv++3gt9RKmyDx4fXgwlmiSPm8DVzZO9Yp7WfCSGg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=iki.fi; s=lahtoruutu; t=1710440492; 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=ZLFhzfdhZUwusV8AXnmOoKbPCZ//+DwsOZ8N6ZZvG00=; b=DkHQYb3VSIBwHb+1mZIZt2eBEjw8vIpDgYJ1WCvjnLgarGGBZ1LAdFJNa/MZpp9i6E+7fE kEgSvAaxuakVrZuu98osMdn2WbJcA6Y58vp3doLRqX6+Fe4xyV338c4fYeqqfeSKK3Cm3W 8XLqilBhe/jX7WVjrnEYF00UHGM8Css6D4wawihDUGtANGIDuPsKb/Lj5tSdJkMYP8ef3/ u1ERbP+VsPx/UwtMrxr6SDRC9vakuB+VdcLiPLXmefCyTH8+tvy4FJVU4gJ2KzaGSBx5+d Cg1ktmRr6XWd0StZLUN4MAz8cJGEaTPqyKnTtTU91Xfcqg2Zo7L5z35QjVW2xA== 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=1710440492; a=rsa-sha256; cv=none; b=XFUHNRqlGcGbmmbrPBRk3fAnF8Mc6wQWMwZGjWoGvR2wq/geks3xNufTyuBa1ufft9VRKi OusRhn/cmIV+zOe4uOan+NP/COZv+Ao3274CvvuoucFs+kxpH6xhbLlzg7VCa26Au5A5yp CerhJELkr9ZFTkjWZnH8iWu/y3KLMwBo7lhEin4dJcBw5x+q/lmeTqJxI0GBm7iNdVyhNj 2QwmqDdpg2juoIxljMiBIGT4M/zWoKjBL7PeLMIVBZG+UhfXcpRUQJEVGMGna63LN6sp2w rnQhFiTCnd/9F+8qYR7feGKPQBFTzrdqPWBEb+xL0BdAgs4K2iWRTCSK/BDfVw== From: Pauli Virtanen To: linux-bluetooth@vger.kernel.org Cc: Pauli Virtanen Subject: [PATCH BlueZ v2 6/9] shared/tester: run test with given name Date: Thu, 14 Mar 2024 20:21:15 +0200 Message-ID: X-Mailer: git-send-email 2.44.0 In-Reply-To: References: Precedence: bulk X-Mailing-List: linux-bluetooth@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Add option for running a single test with given name. Useful when some test names have a common prefix, so that neither -s or -p can distinguish them. --- src/shared/tester.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/shared/tester.c b/src/shared/tester.c index a1ee5b687..280f509b9 100644 --- a/src/shared/tester.c +++ b/src/shared/tester.c @@ -112,6 +112,7 @@ static gboolean option_monitor = FALSE; static gboolean option_list = FALSE; static const char *option_prefix = NULL; static const char *option_string = NULL; +static const char *option_name = NULL; struct monitor_hdr { uint16_t opcode; @@ -285,6 +286,12 @@ void tester_add_full(const char *name, const void *test_data, if (!test_func) return; + if (option_name && strcmp(name, option_name)) { + if (destroy) + destroy(user_data); + return; + } + if (option_prefix && !g_str_has_prefix(name, option_prefix)) { if (destroy) destroy(user_data); @@ -829,6 +836,8 @@ static GOptionEntry options[] = { "Enable monitor output" }, { "list", 'l', 0, G_OPTION_ARG_NONE, &option_list, "Only list the tests to be run" }, + { "name", 'n', 0, G_OPTION_ARG_STRING, &option_name, + "Run test with given name" }, { "prefix", 'p', 0, G_OPTION_ARG_STRING, &option_prefix, "Run tests matching provided prefix" }, { "string", 's', 0, G_OPTION_ARG_STRING, &option_string, From patchwork Thu Mar 14 18:21:16 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Pauli Virtanen X-Patchwork-Id: 13592659 Received: from lahtoruutu.iki.fi (lahtoruutu.iki.fi [185.185.170.37]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 517BD762DE for ; Thu, 14 Mar 2024 18:21:39 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=pass smtp.client-ip=185.185.170.37 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710440501; cv=pass; b=dSjtjGNS1r+NSakPM0UMEOrLCkxLjDD5O00xVkylJyKFAAU+u4yPAyYBS3lDlWBDMNeGxj7mAR0qSoIG4Rt2EcuNbMVQpy3VgwUFP5J47c7wlWiPbxNgY7HKUs6ihlFCXfmdkUdQY1dEeRtxDv7s5aOgKa4KVJVqQ5iMZXG3UUQ= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710440501; c=relaxed/simple; bh=R1O/ht1ocoXEyVTEdAgk2S2D/NajFcKMc1FubLogsP4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=aw08yVvKd8lBuGBwxhmFRlghSRgFGow6KxTxxY8esOhyS4oQYGuCMHvC8TtplVIrB91xxwccffgKYa0EJIi/RXnoIMIvn5336jnurM4A4xSVp89nm6ejxfQ0wKcNSTXHRuL/Iw6Y40xpQkN1iqzP+WBdOU8Cu0RCFRnwupKBh/Q= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=iki.fi; spf=pass smtp.mailfrom=iki.fi; dkim=pass (2048-bit key) header.d=iki.fi header.i=@iki.fi header.b=s5mmzCgN; arc=pass smtp.client-ip=185.185.170.37 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=iki.fi Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=iki.fi Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=iki.fi header.i=@iki.fi header.b="s5mmzCgN" 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 4TwbLN6lHPz49Ptk; Thu, 14 Mar 2024 20:21:32 +0200 (EET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=iki.fi; s=lahtoruutu; t=1710440493; 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=5JzT69tOdpsUYsIOroGvf9htTZN0rV5ZdKs7wA0E/5Y=; b=s5mmzCgNiUQMYOKly2S0NkzZHF0Ps4hRpa1/GwhloXXxFE0HzxQkkkGfa8kmIVFRA4D0u3 IqhkZGE6orZpe9KR2acXI6x6FV3rWKcitpxp87H62Z6O+K8UTOjljE9cmFKjx2NicECQXC pTNyD65z91f8DlYdW87tCCuUOFdjPFmv3QFgSXUXSUwt3c5wDc+URjWTW4eWdM95pvAbZP 3etpwzR/dX9Cdux3nYKZMGSCb32ZdMsV/LQqlMPZfrdP5fNwadGqThutkAhtk439bIVag6 n2v+QRR/u9QUETsKsOgZOhf6X6m8ZIwdadNPbY1rKuByKo+xm/b0ynViW0RTJQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=iki.fi; s=lahtoruutu; t=1710440493; 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=5JzT69tOdpsUYsIOroGvf9htTZN0rV5ZdKs7wA0E/5Y=; b=v6MVcW0VxLH9Il6HVX6Gh3q1w+bBqjgEgeLwIcqe5lRAdmgaDOc/LDzJeaiTeMYuP0h+p1 bjU77XdLQr3L1Sk4poPBSYZ5Z3O1meDdQOpSXiqho8rhBL3HKHTr86h+7MqtJjcBiyU5bf EBx51/d+a3z1hOfX47vZTrqvoANY5BBNqooj7MeqSfW4FBOBeRlrBxG9vxi01dR5xjRnoM d1akTBF+/Am+IdL1+Cs2dqpH4g7Mt35f2z7b76yGuHlRPfubU+C8Kl+zq4eW8V0oRAbJGE iXittkH/0H73++XP94iuxaQBYoJEraIfZ/7m9XqzAYQSAwO2MWSuVrBOt+Joew== 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=1710440493; a=rsa-sha256; cv=none; b=RsTbGYSttFX9rW6s6mUlGbvRW2ck0uKAvEcJJJX/6PQSImas0MJOMCMMsZaOMz3FtamQM+ csAmzbZ26of6rFMx2aQfR1dMIAYhGnwRm1jMLTo8/VftUCn/4LR88GyadlO9//hnnA4Lgf MqedoRyVw3zFfZfqguDiBMiRT98g7jVl3PXwPp94gxmF5SjqhRrseqei7poKw84AqUOQ3K ALuk0//2bJfrfRu33ceBRbhIxqZzP4k3U34XyH9kd76HoXNTrMGdds0QCbPGyq9mcCijca 9llI2L3iO/yqTmrRftuzKQg4wZGw173NNaYW5L1YtzJsZuRLl4CcmyTSuw4XHw== From: Pauli Virtanen To: linux-bluetooth@vger.kernel.org Cc: Pauli Virtanen Subject: [PATCH BlueZ v2 7/9] bthost: handle client L2CAP conn in LE credit based mode Date: Thu, 14 Mar 2024 20:21:16 +0200 Message-ID: <256516aa4a422430d28c4ac32666caa25f809430.1710440408.git.pav@iki.fi> X-Mailer: git-send-email 2.44.0 In-Reply-To: References: Precedence: bulk X-Mailing-List: linux-bluetooth@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Allow bthost hooks to receive data from L2CAP LE credit based connections. Handle LE credit header when receiving, and reassemble received SDU. Handle L2CAP LE credit header also in bthost_send_cid. --- emulator/bthost.c | 205 ++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 180 insertions(+), 25 deletions(-) diff --git a/emulator/bthost.c b/emulator/bthost.c index 8c40fce90..8616bf715 100644 --- a/emulator/bthost.c +++ b/emulator/bthost.c @@ -162,11 +162,21 @@ struct btconn { void *recv_data; }; +enum l2cap_mode { + L2CAP_MODE_OTHER, + L2CAP_MODE_LE_CRED, + L2CAP_MODE_LE_ENH_CRED, +}; + struct l2conn { + struct l2conn *next; uint16_t scid; uint16_t dcid; uint16_t psm; - struct l2conn *next; + enum l2cap_mode mode; + uint16_t data_len; + uint16_t recv_len; + void *recv_data; }; struct rcconn { @@ -275,6 +285,7 @@ struct bthost *bthost_create(void) static void l2conn_free(struct l2conn *conn) { + free(conn->recv_data); free(conn); } @@ -360,6 +371,7 @@ static struct l2conn *bthost_add_l2cap_conn(struct bthost *bthost, l2conn->psm = psm; l2conn->scid = scid; l2conn->dcid = dcid; + l2conn->mode = L2CAP_MODE_OTHER; l2conn->next = conn->l2conns; conn->l2conns = l2conn; @@ -415,6 +427,19 @@ static struct l2conn *btconn_find_l2cap_conn_by_scid(struct btconn *conn, return NULL; } +static struct l2conn *btconn_find_l2cap_conn_by_dcid(struct btconn *conn, + uint16_t dcid) +{ + struct l2conn *l2conn; + + for (l2conn = conn->l2conns; l2conn != NULL; l2conn = l2conn->next) { + if (l2conn->dcid == dcid) + return l2conn; + } + + return NULL; +} + static struct l2cap_conn_cb_data *bthost_find_l2cap_cb_by_psm( struct bthost *bthost, uint16_t psm) { @@ -609,14 +634,24 @@ static void send_iov(struct bthost *bthost, uint16_t handle, uint16_t cid, } static void send_acl(struct bthost *bthost, uint16_t handle, uint16_t cid, - const void *data, uint16_t len) + bool sdu_hdr, const void *data, uint16_t len) { - struct iovec iov; + struct iovec iov[2]; + uint16_t sdu; + int num = 0; + + if (sdu_hdr) { + sdu = cpu_to_le16(len); + iov[num].iov_base = &sdu; + iov[num].iov_len = sizeof(sdu); + num++; + } - iov.iov_base = (void *) data; - iov.iov_len = len; + iov[num].iov_base = (void *) data; + iov[num].iov_len = len; + num++; - send_iov(bthost, handle, cid, &iov, 1); + send_iov(bthost, handle, cid, iov, num); } static uint8_t l2cap_sig_send(struct bthost *bthost, struct btconn *conn, @@ -711,12 +746,19 @@ void bthost_send_cid(struct bthost *bthost, uint16_t handle, uint16_t cid, const void *data, uint16_t len) { struct btconn *conn; + struct l2conn *l2conn; + bool sdu_hdr = false; conn = bthost_find_conn(bthost, handle); if (!conn) return; - send_acl(bthost, handle, cid, data, len); + l2conn = btconn_find_l2cap_conn_by_dcid(conn, cid); + if (l2conn && (l2conn->mode == L2CAP_MODE_LE_CRED || + l2conn->mode == L2CAP_MODE_LE_ENH_CRED)) + sdu_hdr = true; + + send_acl(bthost, handle, cid, sdu_hdr, data, len); } void bthost_send_cid_v(struct bthost *bthost, uint16_t handle, uint16_t cid, @@ -1779,7 +1821,7 @@ static void rfcomm_sabm_send(struct bthost *bthost, struct btconn *conn, cmd.length = RFCOMM_LEN8(0); cmd.fcs = rfcomm_fcs2((uint8_t *)&cmd); - send_acl(bthost, conn->handle, l2conn->dcid, &cmd, sizeof(cmd)); + send_acl(bthost, conn->handle, l2conn->dcid, false, &cmd, sizeof(cmd)); } static bool l2cap_conn_rsp(struct bthost *bthost, struct btconn *conn, @@ -2110,6 +2152,7 @@ static bool l2cap_le_conn_req(struct bthost *bthost, struct btconn *conn, uint8_t ident, const void *data, uint16_t len) { const struct bt_l2cap_pdu_le_conn_req *req = data; + struct l2cap_conn_cb_data *cb_data; struct bt_l2cap_pdu_le_conn_rsp rsp; uint16_t psm; @@ -2124,7 +2167,8 @@ static bool l2cap_le_conn_req(struct bthost *bthost, struct btconn *conn, rsp.mps = 23; rsp.credits = 1; - if (bthost_find_l2cap_cb_by_psm(bthost, psm)) + cb_data = bthost_find_l2cap_cb_by_psm(bthost, psm); + if (cb_data) rsp.dcid = cpu_to_le16(conn->next_cid++); else rsp.result = cpu_to_le16(0x0002); /* PSM Not Supported */ @@ -2132,6 +2176,20 @@ static bool l2cap_le_conn_req(struct bthost *bthost, struct btconn *conn, l2cap_sig_send(bthost, conn, BT_L2CAP_PDU_LE_CONN_RSP, ident, &rsp, sizeof(rsp)); + if (!rsp.result) { + struct l2conn *l2conn; + + l2conn = bthost_add_l2cap_conn(bthost, conn, + le16_to_cpu(rsp.dcid), + le16_to_cpu(req->scid), + le16_to_cpu(psm)); + l2conn->mode = L2CAP_MODE_LE_CRED; + + if (cb_data && l2conn->psm == cb_data->psm && cb_data->func) + cb_data->func(conn->handle, l2conn->dcid, + cb_data->user_data); + } + return true; } @@ -2139,11 +2197,14 @@ static bool l2cap_le_conn_rsp(struct bthost *bthost, struct btconn *conn, uint8_t ident, const void *data, uint16_t len) { const struct bt_l2cap_pdu_le_conn_rsp *rsp = data; + struct l2conn *l2conn; if (len < sizeof(*rsp)) return false; /* TODO add L2CAP connection before with proper PSM */ - bthost_add_l2cap_conn(bthost, conn, 0, le16_to_cpu(rsp->dcid), 0); + l2conn = bthost_add_l2cap_conn(bthost, conn, 0, + le16_to_cpu(rsp->dcid), 0); + l2conn->mode = L2CAP_MODE_LE_CRED; return true; } @@ -2196,16 +2257,19 @@ static bool l2cap_ecred_conn_rsp(struct bthost *bthost, struct btconn *conn, uint16_t scid[5]; } __attribute__ ((packed)) *rsp = data; int num_scid, i; + struct l2conn *l2conn; if (len < sizeof(*rsp)) return false; num_scid = len / sizeof(*rsp->scid); - for (i = 0; i < num_scid; i++) + for (i = 0; i < num_scid; i++) { /* TODO add L2CAP connection before with proper PSM */ - bthost_add_l2cap_conn(bthost, conn, 0, + l2conn = bthost_add_l2cap_conn(bthost, conn, 0, le16_to_cpu(rsp->scid[i]), 0); + l2conn->mode = L2CAP_MODE_LE_ENH_CRED; + } return true; @@ -2333,7 +2397,7 @@ static void rfcomm_ua_send(struct bthost *bthost, struct btconn *conn, cmd.length = RFCOMM_LEN8(0); cmd.fcs = rfcomm_fcs2((uint8_t *)&cmd); - send_acl(bthost, conn->handle, l2conn->dcid, &cmd, sizeof(cmd)); + send_acl(bthost, conn->handle, l2conn->dcid, false, &cmd, sizeof(cmd)); } static void rfcomm_dm_send(struct bthost *bthost, struct btconn *conn, @@ -2347,7 +2411,7 @@ static void rfcomm_dm_send(struct bthost *bthost, struct btconn *conn, cmd.length = RFCOMM_LEN8(0); cmd.fcs = rfcomm_fcs2((uint8_t *)&cmd); - send_acl(bthost, conn->handle, l2conn->dcid, &cmd, sizeof(cmd)); + send_acl(bthost, conn->handle, l2conn->dcid, false, &cmd, sizeof(cmd)); } static void rfcomm_sabm_recv(struct bthost *bthost, struct btconn *conn, @@ -2636,12 +2700,97 @@ static void process_rfcomm(struct bthost *bthost, struct btconn *conn, } } +static void append_l2conn_data(struct bthost *bthost, struct l2conn *conn, + const void *data, uint16_t len) +{ + if (!conn->recv_data) { + bthost_debug(bthost, "Unexpected L2CAP SDU data: sCID 0x%4.4x ", + conn->scid); + return; + } + + if (conn->recv_len + len > conn->data_len) { + bthost_debug(bthost, "Unexpected L2CAP SDU data: sCID 0x%4.4x ", + conn->scid); + return; + } + + memcpy(conn->recv_data + conn->recv_len, data, len); + conn->recv_len += len; + + bthost_debug(bthost, "L2CAP SDU data: %u/%u bytes", conn->recv_len, + conn->data_len); +} + +static void free_l2conn_data(struct l2conn *conn) +{ + free(conn->recv_data); + conn->recv_data = NULL; + conn->recv_len = 0; + conn->data_len = 0; +} + +static void new_l2conn_data(struct bthost *bthost, struct l2conn *conn, + uint16_t len) +{ + free(conn->recv_data); + conn->recv_data = malloc(len); + conn->recv_len = 0; + conn->data_len = len; +} + +static bool process_l2cap_conn(struct bthost *bthost, struct btconn *conn, + struct l2conn *l2conn, struct iovec *data) +{ + struct bt_l2cap_pdu_le_flowctl_creds creds; + uint16_t sdu; + + if (!l2conn) + return true; + + switch (l2conn->mode) { + case L2CAP_MODE_LE_CRED: + case L2CAP_MODE_LE_ENH_CRED: + break; + case L2CAP_MODE_OTHER: + return true; + } + + /* Credit-based flow control */ + + creds.cid = cpu_to_le16(l2conn->scid); + creds.credits = cpu_to_le16(1); + l2cap_sig_send(bthost, conn, BT_L2CAP_PDU_LE_FLOWCTL_CREDS, 0, + &creds, sizeof(creds)); + + if (!l2conn->data_len) { + if (!util_iov_pull_le16(data, &sdu)) { + free_l2conn_data(l2conn); + bthost_debug(bthost, "L2CAP invalid SDU"); + return false; + } + new_l2conn_data(bthost, l2conn, sdu); + } + + append_l2conn_data(bthost, l2conn, data->iov_base, data->iov_len); + + if (l2conn->recv_len < l2conn->data_len) + return false; /* SDU incomplete */ + + l2conn->data_len = 0; + data->iov_base = l2conn->recv_data; + data->iov_len = l2conn->recv_len; + + return true; +} + static void process_l2cap(struct bthost *bthost, struct btconn *conn, - const void *data, uint16_t len) + const void *buf, uint16_t len) { - const struct bt_l2cap_hdr *l2_hdr = data; + const struct bt_l2cap_hdr *l2_hdr = buf; struct cid_hook *hook; struct l2conn *l2conn; + struct iovec data; uint16_t cid, l2_len; l2_len = le16_to_cpu(l2_hdr->len); @@ -2654,31 +2803,37 @@ static void process_l2cap(struct bthost *bthost, struct btconn *conn, bthost_debug(bthost, "L2CAP data: %u bytes", l2_len); cid = le16_to_cpu(l2_hdr->cid); + l2conn = btconn_find_l2cap_conn_by_scid(conn, cid); + + data.iov_base = (void *)l2_hdr->data; + data.iov_len = l2_len; + + if (!process_l2cap_conn(bthost, conn, l2conn, &data)) + return; hook = find_cid_hook(conn, cid); if (hook) { - hook->func(l2_hdr->data, l2_len, hook->user_data); + hook->func(data.iov_base, data.iov_len, hook->user_data); return; } switch (cid) { case 0x0001: - l2cap_sig(bthost, conn, l2_hdr->data, l2_len); + l2cap_sig(bthost, conn, data.iov_base, data.iov_len); break; case 0x0005: - l2cap_le_sig(bthost, conn, l2_hdr->data, l2_len); + l2cap_le_sig(bthost, conn, data.iov_base, data.iov_len); break; case 0x0006: - smp_data(conn->smp_data, l2_hdr->data, l2_len); + smp_data(conn->smp_data, data.iov_base, data.iov_len); break; case 0x0007: - smp_bredr_data(conn->smp_data, l2_hdr->data, l2_len); + smp_bredr_data(conn->smp_data, data.iov_base, data.iov_len); break; default: - l2conn = btconn_find_l2cap_conn_by_scid(conn, cid); if (l2conn && l2conn->psm == 0x0003) - process_rfcomm(bthost, conn, l2conn, l2_hdr->data, - l2_len); + process_rfcomm(bthost, conn, l2conn, data.iov_base, + data.iov_len); else bthost_debug(bthost, "Packet for unknown CID 0x%04x (%u)", @@ -3494,7 +3649,7 @@ void bthost_send_rfcomm_data(struct bthost *bthost, uint16_t handle, } uih_frame[uih_len - 1] = rfcomm_fcs((void *)hdr); - send_acl(bthost, handle, rcconn->scid, uih_frame, uih_len); + send_acl(bthost, handle, rcconn->scid, false, uih_frame, uih_len); free(uih_frame); } From patchwork Thu Mar 14 18:21:17 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Pauli Virtanen X-Patchwork-Id: 13592657 Received: from lahtoruutu.iki.fi (lahtoruutu.iki.fi [185.185.170.37]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 10BFF7762C for ; Thu, 14 Mar 2024 18:21:39 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=pass smtp.client-ip=185.185.170.37 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710440500; cv=pass; b=DwMSC35RTE20MwFyMAeVgcTTw60O7JiUoQGLkTVDwApVs1qjpsEGCVgfWfbGFh9QMUYEVJg9HlbWg1EY8pHPnavDVTgCOILOd0MJqJz2jaBAgYZSSFzLwwULj2tOwcaipJWd5l/0p7TtTFqfie6htYgrFxqJg4ZW/N1HBNDDV+0= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710440500; c=relaxed/simple; bh=TCLET5blhARH0Y9rYNPn+iH8jknXfTvFaUVSR0DWYpo=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=LbWViCfMSno26dDK1mL+wXxxPrnBkS9YAmQR0msVU92/vwxwfxxWifvi0qPr9PjlC7rDSDSzWEFjeX4sBtVpDqnf+enfyY0GAHskw20Be8yuegJJcDSnB+si6rudh6NHg7ly3JPVPesxnmbh/E2srdyikX4IboKBS9cmqR4b+iU= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=iki.fi; spf=pass smtp.mailfrom=iki.fi; dkim=pass (2048-bit key) header.d=iki.fi header.i=@iki.fi header.b=oyaLvVsK; arc=pass smtp.client-ip=185.185.170.37 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=iki.fi Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=iki.fi Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=iki.fi header.i=@iki.fi header.b="oyaLvVsK" 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 4TwbLP6NmQz49Pyr; Thu, 14 Mar 2024 20:21:33 +0200 (EET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=iki.fi; s=lahtoruutu; t=1710440494; 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=LrP4Nncol27MzA8D+MQJQLCx3rKITNmukLoTjk6w3oE=; b=oyaLvVsKzAReYTyenafIKDuFToCkzIAYDrlpkUfoHE/IHZTHQFy5trS+7VJ1DCNYOhNbhO XVr58AyEooP4WERfFxzPN6/64U5atNZDo1joV6cr6hNeNowhTIbOBJ02VGeq4k0ltixtBh 1Iy/ZsCBO17ZRlYRahzbU1aXahyaIhNaqxjFbY8ka3h/xrj2AToAKPExh2S4zhMoHYICv0 8k18+H6zEQOaQzZBshVScoPZVrpRVkRAVlqQFtZLLym2/ZkJvbwkaAmuyWuKeJk4EbuWcY 4SxZqMKulBKg975oUTdPlDI8ZlNnlB1o2oyRsTI5te8GncrTJqBObdkGOLKDfg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=iki.fi; s=lahtoruutu; t=1710440494; 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=LrP4Nncol27MzA8D+MQJQLCx3rKITNmukLoTjk6w3oE=; b=D8jPqvWSGfldUy/457y6esNZ62+fJwtC1xCRj2cURv8Ao0BeEwbMI9dOHCS3MOXERpcrrS xhoTptbU7KoufY6ij0PMOPueb1D0IoCImFYdR1NQDdgm7M2+uzw8DI6iX/u+glupg0tbJH 2eQaUGPwBBuVuvdlwwV+nD8bTFurMY3oJOmYdMcsrG7jsQiyJjQNzzVYxr3Bq+QwIPkQXN /risISK5RItG6FO99HcEHQACdM76HhsAQsZMYWY9mIdxsNekF1ohkKVcUoNMM5yLNueYnV Mq6Xq0z2xFVLxvJ2G4jlpd2fc+UwKTCMCMUaqTEj8Tsg7fZ8fo4sRsCfWxBtqA== 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=1710440494; a=rsa-sha256; cv=none; b=oOL4h+HRA0uncG1PPy1MMuGech0dXgunvtLcEW7JElxrwN4q0ceyuS3ST37j90aGjQOC/y g/TqFRP/1cQDd+4YyiZKGxWYZZQHogeyJor2K2hoC7NJTqMT3qseH1eWri7FdNW1d3hiqn 3mqVOqPgw1x+eFhdxKgyVIZxAIVEoHnE6AG2NJ67ktG0tSpWzMjt8DHoXsCCMCiYgdJZsW kWiJzcTHxKYf78mytwEkjbHWouAvNGLCSIlznxrR/CVAiM/NC9ox9psWqh7+DRjb5VyqZI BxvP8g+kpbtR49sRMFkHEf0ykXCXQBZErtOiV/R53yKhxCIgacrOSLkQ8In1sA== From: Pauli Virtanen To: linux-bluetooth@vger.kernel.org Cc: Pauli Virtanen Subject: [PATCH BlueZ v2 8/9] l2cap-tester: add tests for LE Client read/write/tx-timestamping Date: Thu, 14 Mar 2024 20:21:17 +0200 Message-ID: <2b4931513287038026c73ebbee40965346b83ca5.1710440408.git.pav@iki.fi> X-Mailer: git-send-email 2.44.0 In-Reply-To: References: Precedence: bulk X-Mailing-List: linux-bluetooth@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Add tests: L2CAP LE Client - Read Success L2CAP LE Client - Write Success L2CAP LE Client - TX Timestamping --- tools/l2cap-tester.c | 41 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) diff --git a/tools/l2cap-tester.c b/tools/l2cap-tester.c index f990110d9..d7f2e481a 100644 --- a/tools/l2cap-tester.c +++ b/tools/l2cap-tester.c @@ -484,6 +484,30 @@ static const struct l2cap_data le_client_connect_timeout_test_1 = { .timeout = 1, }; +static const struct l2cap_data le_client_connect_read_success_test = { + .client_psm = 0x0080, + .server_psm = 0x0080, + .read_data = l2_data, + .data_len = sizeof(l2_data), +}; + +static const struct l2cap_data le_client_connect_write_success_test = { + .client_psm = 0x0080, + .server_psm = 0x0080, + .write_data = l2_data, + .data_len = sizeof(l2_data), +}; + +static const struct l2cap_data le_client_connect_tx_timestamping_test = { + .client_psm = 0x0080, + .server_psm = 0x0080, + .write_data = l2_data, + .data_len = sizeof(l2_data), + .so_timestamping = (SOF_TIMESTAMPING_SOFTWARE | + SOF_TIMESTAMPING_OPT_ID | + SOF_TIMESTAMPING_TX_SOFTWARE), +}; + static const struct l2cap_data le_client_connect_adv_success_test_1 = { .client_psm = 0x0080, .server_psm = 0x0080, @@ -1079,6 +1103,8 @@ static gboolean client_received_data(GIOChannel *io, GIOCondition cond, char buf[1024]; int sk; + tester_debug("Client received data"); + sk = g_io_channel_unix_get_fd(io); if (read(sk, buf, l2data->data_len) != l2data->data_len) { tester_warn("Unable to read %u bytes", l2data->data_len); @@ -1123,6 +1149,8 @@ static void bthost_received_data(const void *buf, uint16_t len, struct test_data *data = tester_get_data(); const struct l2cap_data *l2data = data->test_data; + tester_debug("BTHost received data: %u bytes", len); + --data->step; if (len != l2data->data_len) { @@ -1313,7 +1341,7 @@ static gboolean l2cap_connect_cb(GIOChannel *io, GIOCondition cond, goto failed; } - tester_print("Successfully connected"); + tester_print("Successfully connected to CID 0x%04x", data->dcid); if (!check_mtu(data, sk)) { tester_test_failed(); @@ -1505,6 +1533,8 @@ static void client_l2cap_connect_cb(uint16_t handle, uint16_t cid, { struct test_data *data = user_data; + tester_debug("Client connect CID 0x%04x handle 0x%04x", cid, handle); + data->dcid = cid; data->handle = handle; } @@ -2430,6 +2460,15 @@ int main(int argc, char *argv[]) test_l2cap_le("L2CAP LE Client - Timeout", &le_client_connect_timeout_test_1, setup_powered_client, test_connect_timeout); + test_l2cap_le("L2CAP LE Client - Read Success", + &le_client_connect_read_success_test, + setup_powered_client, test_connect); + test_l2cap_le("L2CAP LE Client - Write Success", + &le_client_connect_write_success_test, + setup_powered_client, test_connect); + test_l2cap_le("L2CAP LE Client - TX Timestamping", + &le_client_connect_tx_timestamping_test, + setup_powered_client, test_connect); test_l2cap_le("L2CAP LE Client, Direct Advertising - Success", &le_client_connect_adv_success_test_1, setup_powered_client, test_connect); From patchwork Thu Mar 14 18:21:18 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Pauli Virtanen X-Patchwork-Id: 13592660 Received: from lahtoruutu.iki.fi (lahtoruutu.iki.fi [185.185.170.37]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id EE84E77627 for ; Thu, 14 Mar 2024 18:21:40 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=pass smtp.client-ip=185.185.170.37 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710440502; cv=pass; b=SJuQHzaCz6a3DOtTjZMu4E7neVfMN4lt5Q8ZQstGdq5PcNJQmpEKGwV6jc6jW3N4HdqHlPmQMpHaLusN9eORIwLxA22d+OYPRnNNX8riWW/rP4dUdKTFncEBBuXtMkG/Iol0rcmu0U+CcZE4f76BZ8qWD8Eo5Kmbb0SxpIznPPw= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710440502; c=relaxed/simple; bh=gxyYWf4Jg3YRpOtZpXSoGqJGHXP5LIfWNFG3g5de3Dk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=SFoBmRnN66utJNqTJNcAVr3Iqhqy1ixHLmF2oJP3U6n6B7ho5VSSKv9ZEhDtx/KTUF6OKmsbVCoJDitxtt1fc4O8vH9K98Jl+Bc+TTyugB4qgRso6Mf7g3WfnnDUPzph5Q6QSljyWSxh++SxRXMIokfF6X1vVDuec3/yPIHa9yU= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=iki.fi; spf=pass smtp.mailfrom=iki.fi; dkim=pass (2048-bit key) header.d=iki.fi header.i=@iki.fi header.b=gQCYfbKI; arc=pass smtp.client-ip=185.185.170.37 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=iki.fi Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=iki.fi Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=iki.fi header.i=@iki.fi header.b="gQCYfbKI" 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 4TwbLQ5zzGz49Pys; Thu, 14 Mar 2024 20:21:34 +0200 (EET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=iki.fi; s=lahtoruutu; t=1710440495; 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=FAbbky+ehz5ZvmAaQPE9CHGLSR1jUv9VD7+Y1PmIYRU=; b=gQCYfbKIUFoHnUExTU5pgUr1fC7uLbxkTE7fT4jmDrNxNgPr5gbFSxBAP4DF4qN3JtW7uL wF0MOWggVlSloSA5Ud9esyvlGOBOph7tMPMSK71ukgkF7uhj/YEVdzglj6ClIZpdvvcADk l10E7LoJ4D2Dx01YhjM5qXS04A7IoS6WXfeLA9nXRoPCFQZQJYzeao+bXOW7NtnZ+A0oqH Nb8ZiO/PTtJw26wIKgQ5BLHTw5BXdUFl0zPKTWmEUNh0vdXkB0EellkVT393BlnwFlGsZ2 8tzPCMBE9tlfEj+fySIurt0Rz5wXbRG4KBJTvF3+7xZtljsbY/w4uv1qp6gHCA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=iki.fi; s=lahtoruutu; t=1710440495; 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=FAbbky+ehz5ZvmAaQPE9CHGLSR1jUv9VD7+Y1PmIYRU=; b=eZ+pjaDq7LQHtUDiYKoY4cytUDNZgkmUzgMx703Y2q/qpK2RYMm5AKH1bkiLxdidofy435 ZNDFKXH1cPDRGUrSiliYf0y9S8HpTUogaEiMIWGqY6ie2R3XP0PYPQ0tdo0QsE5ByXTise xoCa0O/Xsr2fuQwVsbJ78PXTp2eXyDMb7J8OoLkO9G4KG4wGwkwFk7NIAxDBxXNEqZJBdg c8CH3QiRmWH7IdigdZz97zDwfbVbXfNbp+iQwEhPwC43yeWqGsLovNCdYo76hAO4QWd/Hu Jgpxgse6WfNlgEQM0X/DkQeh5vQZOPp7i8xBYxi2K0y0Qat2LGzgIf+X6ZaucA== 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=1710440495; a=rsa-sha256; cv=none; b=ZCyPQmNcfn4iox9sWSgN9FPOqYsn4hkeI6I7dKqD+wX9aShniZXAWR1rBnTye+CTyrw1A/ nbVWWZq/sCS4kSI/Ksx+56j0Vuc79oeMn8w29ww/d3HKE+uyL3Y8EaQkl+beAAGLvIXDB+ wvH4/U5AlB8hx5jz8p50gKmN5OI8x19MB2sTKZ4BIHg/YhrGH5vswIIappDs23+Cl4KESW kpnR6F8nZKeef599CgJ4vr0kBCeZeISQSPCWlGd+jPLmwV/ywTa7BwhI/VlFhfSkc6ALCf Q5tGDO11jofPtB9DGNTexX91qvYQXeZWRsZr+vdAJzE3b90wY8BH4tv1XBXODA== From: Pauli Virtanen To: linux-bluetooth@vger.kernel.org Cc: Pauli Virtanen Subject: [PATCH BlueZ v2 9/9] iso-tester: add test for BT_NO_ERRQUEUE_POLL Date: Thu, 14 Mar 2024 20:21:18 +0200 Message-ID: <9bb9a9149e16541db487f1c1fe5496a432d3a5f6.1710440408.git.pav@iki.fi> X-Mailer: git-send-email 2.44.0 In-Reply-To: References: Precedence: bulk X-Mailing-List: linux-bluetooth@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Add test: ISO Send - TX No Poll Timestamping --- tools/iso-tester.c | 72 ++++++++++++++++++++++++++++++++++++++++++-- tools/tester-utils.h | 3 ++ 2 files changed, 73 insertions(+), 2 deletions(-) diff --git a/tools/iso-tester.c b/tools/iso-tester.c index 08f8d0286..3a81f74bc 100644 --- a/tools/iso-tester.c +++ b/tools/iso-tester.c @@ -467,7 +467,7 @@ struct test_data { uint16_t handle; uint16_t acl_handle; struct queue *io_queue; - unsigned int io_id[3]; + unsigned int io_id[4]; uint8_t client_num; int step; bool reconnect; @@ -497,6 +497,7 @@ struct iso_client_data { bool msg_timestamping; unsigned int send_extra; unsigned int send_extra_pre_ts; + bool no_errqueue_poll; }; static void mgmt_debug(const char *str, void *user_data) @@ -1026,6 +1027,16 @@ static const struct iso_client_data connect_send_tx_msg_timestamping = { .msg_timestamping = true, }; +static const struct iso_client_data connect_send_tx_no_poll_timestamping = { + .qos = QOS_16_2_1, + .expect_err = 0, + .send = &send_16_2_1, + .so_timestamping = (SOF_TIMESTAMPING_SOFTWARE | + SOF_TIMESTAMPING_TX_SOFTWARE), + .send_extra = 1, + .no_errqueue_poll = true, +}; + static const struct iso_client_data listen_16_2_1_recv = { .qos = QOS_16_2_1, .expect_err = 0, @@ -2122,6 +2133,37 @@ static gboolean iso_recv_errqueue(GIOChannel *io, GIOCondition cond, return FALSE; } +static gboolean iso_fail_errqueue(GIOChannel *io, GIOCondition cond, + gpointer user_data) +{ + struct test_data *data = user_data; + + tester_warn("Unexpected POLLERR"); + tester_test_failed(); + + data->io_id[3] = 0; + return FALSE; +} + +static gboolean iso_timer_errqueue(gpointer user_data) +{ + struct test_data *data = user_data; + GIOChannel *io; + gboolean ret; + + io = queue_peek_head(data->io_queue); + g_assert(io); + + ret = iso_recv_errqueue(io, G_IO_IN, data); + if (!ret) { + if (data->io_id[3]) + g_source_remove(data->io_id[3]); + data->io_id[3] = 0; + } + + return ret; +} + static void iso_tx_timestamping(struct test_data *data, GIOChannel *io) { const struct iso_client_data *isodata = data->test_data; @@ -2144,7 +2186,29 @@ static void iso_tx_timestamping(struct test_data *data, GIOChannel *io) sk = g_io_channel_unix_get_fd(io); - data->io_id[2] = g_io_add_watch(io, G_IO_ERR, iso_recv_errqueue, data); + if (isodata->no_errqueue_poll) { + uint32_t flag = 1; + + err = setsockopt(sk, SOL_BLUETOOTH, BT_NO_ERRQUEUE_POLL, + &flag, sizeof(flag)); + if (err < 0) { + tester_warn("setsockopt BT_NO_ERRQUEUE_POLL: %s (%d)", + strerror(errno), errno); + tester_test_failed(); + return; + } + + if (!data->io_queue) + data->io_queue = queue_new(); + queue_push_head(data->io_queue, g_io_channel_ref(io)); + + data->io_id[2] = g_timeout_add(100, iso_timer_errqueue, data); + data->io_id[3] = g_io_add_watch(io, G_IO_ERR, iso_fail_errqueue, + data); + } else { + data->io_id[2] = g_io_add_watch(io, G_IO_ERR, iso_recv_errqueue, + data); + } if (isodata->msg_timestamping) so.flags &= ~SOF_TIMESTAMPING_TX_RECORD_MASK; @@ -3321,6 +3385,10 @@ int main(int argc, char *argv[]) &connect_send_tx_msg_timestamping, setup_powered, test_connect); + test_iso("ISO Send - TX No Poll Timestamping", + &connect_send_tx_no_poll_timestamping, setup_powered, + test_connect); + test_iso("ISO Receive - Success", &listen_16_2_1_recv, setup_powered, test_listen); diff --git a/tools/tester-utils.h b/tools/tester-utils.h index 617de842e..b6de084a4 100644 --- a/tools/tester-utils.h +++ b/tools/tester-utils.h @@ -89,6 +89,9 @@ static inline int tx_tstamp_recv(struct tx_tstamp_data *data, int sk, int len) ret = recvmsg(sk, &msg, MSG_ERRQUEUE); if (ret < 0) { + if (ret == EAGAIN || ret == EWOULDBLOCK) + return data->count - data->pos; + tester_warn("Failed to read from errqueue: %s (%d)", strerror(errno), errno); return -EINVAL;