From patchwork Sun Apr 27 10:44:35 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Pauli Virtanen X-Patchwork-Id: 885869 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 F272C2376E0 for ; Sun, 27 Apr 2025 10:44:55 +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=1745750699; cv=pass; b=uyPKe7QCLXMPvYa7B3qSOttfQBoEpcOjW4F+KktP8k6rB9fSDWI5Y98YqILxF65VnD60/TbCm5tDfEGGt77H6F2oMunLTCpN7IJSf32cniaBS71Xc6blSmAJ1X+zyT2Q+qHliJAbPWavbsHrLanybRQcU8YyvFiHshi3tVIncbo= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745750699; c=relaxed/simple; bh=CIFUk183Yl9bZ6PlEyw087s8V47fpGEyYlVSd2tVAc4=; h=From:To:Cc:Subject:Date:Message-ID:MIME-Version; b=G89063VhIrCSlgXkyOyIt6tmSq6VeUa4PkmUrPrsjKKyGfQFNpM6A4LUlzWKIXr8R0uQBuU6GxiPpF/yoAUomRm0M1tochZ4vq5YT4lQRQYcCt6Q3mWWoqq3nfktlnr3/dDI7Uu4lro1yO5jByZPQt2Vg0hKlFsl9bmUZzm4l4g= 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=akHb+tk3; 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="akHb+tk3" Received: from monolith.lan (unknown [193.138.7.178]) (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 4ZljrW2HV3z49QJY; Sun, 27 Apr 2025 13:44:43 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=iki.fi; s=lahtoruutu; t=1745750683; 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; bh=f6AZj7XWYgdMwSQlxjGUdQ2NoZiGiGc7vvKhY8ypxVI=; b=akHb+tk3PbB50EjxLa83skLFJFGqijrFqQHDlrimMC8DAgS7RA4b5gbutBxhayP8pqK0Mo +DbxikbZxbczimA2tdBXv6zNEAB1ODITPdLhuDeg9YeQUVFZ7Vx+3229A5+i/z6tZCdspN bCftIsf6MDxrj57eE2pJV2OMOwES9g8tGgL4sJqFskpCTvt73ICugI0Og4Y59kb8Y1Jxnv c9Hx1P/7c7UdieU24AJD6FUBzZHJxQl6gAi97CrT6zu/00C/Hs54pLFclu1A4l6NJgXXgI Vd9ALChrM+oo3/T+upqt2zjEEpS4vz6QjDulvOI0c/Hhi6j6+2fW8AxwvGEktQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=iki.fi; s=lahtoruutu; t=1745750683; 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; bh=f6AZj7XWYgdMwSQlxjGUdQ2NoZiGiGc7vvKhY8ypxVI=; b=WHxZ096STwUvaZSUqWx6/ZnpNRU6eDYwBM9pN87wGPSlyWvoD6amlNb0eNreCAAOWQrPkc wJnpsOK8pbSmo5pTy3ViAdEzOt7iD6IffygTRvby5wsfbQpklcS6lDLCzc2/aw2ugYwPzC qL6TG6raH/RC4GYtWOeJv8vizT0VSO/GinBPPuCHjCnwCVteNekioj7ARr1QOLXlljA61A 1TpKoEfDAokTETdclo4oomzTiVg892YtNdATvMT5Ats97aRtiLzA2YRu0OgtO5Ods0bWYX TEZLpYcPNyvQlOffsc5GIkT5fqruSXAR0xOUCHBpMAFnI+U3XXrm1rEJoQfhlw== ARC-Seal: i=1; s=lahtoruutu; d=iki.fi; t=1745750683; a=rsa-sha256; cv=none; b=VZLNJp/8zcNNrMM319WADpeJXzaasim9u3n2Fb6OkFdlTn86CfMKeRyAxePIYBJsGWgB8f kJR1cHqsUdeuLysO0xq20xu/nCZAMSjo57Cs60yVpMJqjlK5F9S3EcJ8eYZH5LfQfaSTR2 +D5rFA8Ro7A4shcpHoMEKyeCME8k2bFNP+a7TKgOGctv91cO2q5IuGhxCpWb9l8X/UUi2z +YE118awHuWHLf6GQtN5P900RjhlccUnvwzCNrC7Qz9cBPLDo4mcbazNrP5uqiugwZQ4d+ ZZDSeTuZNhLaEoeDQ7qQN2j1ZEwWEcbKdtdif8/m3iUj1fsuisK/DN20fZpSdw== ARC-Authentication-Results: i=1; ORIGINATING; auth=pass smtp.auth=pav smtp.mailfrom=pav@iki.fi From: Pauli Virtanen To: linux-bluetooth@vger.kernel.org Cc: Pauli Virtanen Subject: [PATCH BlueZ 1/5] tools: add tests for RX timestamping Date: Sun, 27 Apr 2025 13:44:35 +0300 Message-ID: X-Mailer: git-send-email 2.49.0 Precedence: bulk X-Mailing-List: linux-bluetooth@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Add tests: ISO Receive - RX Timestamping L2CAP BR/EDR Client - RX Timestamping L2CAP BR/EDR Client - RX Timestamping 32k L2CAP LE Client - RX Timestamping L2CAP LE Client - RX Timestamping 32k --- tools/iso-tester.c | 22 +++++++++++- tools/l2cap-tester.c | 60 ++++++++++++++++++++++++++++++++- tools/tester.h | 80 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 160 insertions(+), 2 deletions(-) diff --git a/tools/iso-tester.c b/tools/iso-tester.c index 63f6951e3..ff6418ce9 100644 --- a/tools/iso-tester.c +++ b/tools/iso-tester.c @@ -1118,6 +1118,15 @@ static const struct iso_client_data listen_16_2_1_recv_pkt_status = { .pkt_status = 0x02, }; +static const struct iso_client_data listen_16_2_1_recv_rx_timestamping = { + .qos = QOS_16_2_1, + .expect_err = 0, + .recv = &send_16_2_1, + .server = true, + .so_timestamping = (SOF_TIMESTAMPING_SOFTWARE | + SOF_TIMESTAMPING_RX_SOFTWARE), +}; + static const struct iso_client_data defer_16_2_1 = { .qos = QOS_16_2_1, .expect_err = 0, @@ -2148,7 +2157,7 @@ static gboolean iso_recv_data(GIOChannel *io, GIOCondition cond, struct test_data *data = user_data; const struct iso_client_data *isodata = data->test_data; int sk = g_io_channel_unix_get_fd(io); - unsigned char control[64]; + unsigned char control[256]; ssize_t ret; char buf[1024]; struct msghdr msg; @@ -2202,6 +2211,9 @@ static gboolean iso_recv_data(GIOChannel *io, GIOCondition cond, return FALSE; } + if (isodata->so_timestamping & SOF_TIMESTAMPING_RX_SOFTWARE) + rx_timestamp_check(&msg); + if (memcmp(buf, isodata->recv->iov_base, ret)) tester_test_failed(); else @@ -2224,6 +2236,10 @@ static void iso_recv(struct test_data *data, GIOChannel *io) return; } + if (rx_timestamping_init(g_io_channel_unix_get_fd(io), + isodata->so_timestamping)) + return; + host = hciemu_client_get_host(data->hciemu); bthost_send_iso(host, data->handle, isodata->ts, sn++, 0, isodata->pkt_status, isodata->recv, 1); @@ -3704,6 +3720,10 @@ int main(int argc, char *argv[]) &listen_16_2_1_recv_pkt_status, setup_powered, test_listen); + test_iso("ISO Receive - RX Timestamping", + &listen_16_2_1_recv_rx_timestamping, + setup_powered, test_listen); + test_iso("ISO Defer - Success", &defer_16_2_1, setup_powered, test_defer); diff --git a/tools/l2cap-tester.c b/tools/l2cap-tester.c index 41ef62578..9087d635d 100644 --- a/tools/l2cap-tester.c +++ b/tools/l2cap-tester.c @@ -357,6 +357,24 @@ static const struct l2cap_data client_connect_read_32k_success_test = { .data_len = sizeof(l2_data_32k), }; +static const struct l2cap_data client_connect_rx_timestamping_test = { + .client_psm = 0x1001, + .server_psm = 0x1001, + .read_data = l2_data, + .data_len = sizeof(l2_data), + .so_timestamping = (SOF_TIMESTAMPING_SOFTWARE | + SOF_TIMESTAMPING_RX_SOFTWARE), +}; + +static const struct l2cap_data client_connect_rx_timestamping_32k_test = { + .client_psm = 0x1001, + .server_psm = 0x1001, + .read_data = l2_data_32k, + .data_len = sizeof(l2_data_32k), + .so_timestamping = (SOF_TIMESTAMPING_SOFTWARE | + SOF_TIMESTAMPING_RX_SOFTWARE), +}; + static const struct l2cap_data client_connect_write_success_test = { .client_psm = 0x1001, .server_psm = 0x1001, @@ -575,6 +593,27 @@ static const struct l2cap_data le_client_connect_read_32k_success_test = { .data_len = sizeof(l2_data_32k), }; +static const struct l2cap_data le_client_connect_rx_timestamping_test = { + .client_psm = 0x0080, + .server_psm = 0x0080, + .read_data = l2_data, + .data_len = sizeof(l2_data), + .so_timestamping = (SOF_TIMESTAMPING_SOFTWARE | + SOF_TIMESTAMPING_RX_SOFTWARE), +}; + +static const struct l2cap_data le_client_connect_rx_timestamping_32k_test = { + .client_psm = 0x0080, + .server_psm = 0x0080, + .mtu = 672, + .mps = 251, + .credits = 147, + .read_data = l2_data_32k, + .data_len = sizeof(l2_data_32k), + .so_timestamping = (SOF_TIMESTAMPING_SOFTWARE | + SOF_TIMESTAMPING_RX_SOFTWARE), +}; + static const struct l2cap_data le_client_connect_write_success_test = { .client_psm = 0x0080, .server_psm = 0x0080, @@ -1227,13 +1266,14 @@ static gboolean sock_received_data(GIOChannel *io, GIOCondition cond, { struct test_data *data = tester_get_data(); const struct l2cap_data *l2data = data->test_data; + bool tstamp = l2data->so_timestamping & SOF_TIMESTAMPING_RX_SOFTWARE; char buf[1024]; int sk; ssize_t len; sk = g_io_channel_unix_get_fd(io); - len = read(sk, buf, sizeof(buf)); + len = recv_tstamp(sk, buf, sizeof(buf), tstamp); if (len < 0) { tester_warn("Unable to read: %s (%d)", strerror(errno), errno); tester_test_failed(); @@ -1430,6 +1470,10 @@ static void l2cap_read_data(struct test_data *data, GIOChannel *io, data->step = 0; + if (rx_timestamping_init(g_io_channel_unix_get_fd(io), + l2data->so_timestamping)) + return; + bthost = hciemu_client_get_host(data->hciemu); g_io_add_watch(io, G_IO_IN, sock_received_data, NULL); @@ -2535,6 +2579,14 @@ int main(int argc, char *argv[]) &client_connect_read_32k_success_test, setup_powered_client, test_connect); + test_l2cap_bredr("L2CAP BR/EDR Client - RX Timestamping", + &client_connect_rx_timestamping_test, + setup_powered_client, test_connect); + + test_l2cap_bredr("L2CAP BR/EDR Client - RX Timestamping 32k", + &client_connect_rx_timestamping_32k_test, + setup_powered_client, test_connect); + test_l2cap_bredr("L2CAP BR/EDR Client - Write Success", &client_connect_write_success_test, setup_powered_client, test_connect); @@ -2619,6 +2671,12 @@ int main(int argc, char *argv[]) test_l2cap_le("L2CAP LE Client - Read 32k Success", &le_client_connect_read_32k_success_test, setup_powered_client, test_connect); + test_l2cap_le("L2CAP LE Client - RX Timestamping", + &le_client_connect_rx_timestamping_test, + setup_powered_client, test_connect); + test_l2cap_le("L2CAP LE Client - RX Timestamping 32k", + &le_client_connect_rx_timestamping_32k_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); diff --git a/tools/tester.h b/tools/tester.h index 4e7d7226b..bdfff356f 100644 --- a/tools/tester.h +++ b/tools/tester.h @@ -198,3 +198,83 @@ static inline int tx_tstamp_recv(struct tx_tstamp_data *data, int sk, int len) return data->count - data->pos; } + +static inline int rx_timestamp_check(struct msghdr *msg) +{ + struct cmsghdr *cmsg; + struct timespec now; + int64_t t = 0; + + for (cmsg = CMSG_FIRSTHDR(msg); cmsg; cmsg = CMSG_NXTHDR(msg, cmsg)) { + struct scm_timestamping *tss; + + if (cmsg->cmsg_level != SOL_SOCKET) + continue; + if (cmsg->cmsg_type != SCM_TIMESTAMPING) + continue; + + tss = (struct scm_timestamping *)CMSG_DATA(cmsg); + t = TS_NSEC(&tss->ts[0]); + break; + } + if (!cmsg) { + tester_warn("RX timestamp missing"); + return -EINVAL; + } + + clock_gettime(CLOCK_REALTIME, &now); + + if (TS_NSEC(&now) < t || TS_NSEC(&now) > t + SEC_NSEC(10)) { + tester_warn("RX timestamp bad time"); + return -EINVAL; + } + + tester_print("Got valid RX timestamp"); + return 0; +} + +static inline ssize_t recv_tstamp(int sk, void *buf, size_t size, bool tstamp) +{ + union { + char buf[2 * CMSG_SPACE(sizeof(struct scm_timestamping))]; + struct cmsghdr align; + } control; + struct iovec data = { + .iov_base = buf, + .iov_len = size + }; + struct msghdr msg = { + .msg_iov = &data, + .msg_iovlen = 1, + .msg_control = control.buf, + .msg_controllen = sizeof(control.buf), + }; + ssize_t ret; + + ret = recvmsg(sk, &msg, 0); + if (ret < 0 || !tstamp) + return ret; + + if (rx_timestamp_check(&msg)) { + errno = EIO; + return -1; + } + + return ret; +} + +static inline int rx_timestamping_init(int fd, int flags) +{ + socklen_t len = sizeof(flags); + + if (!(flags & SOF_TIMESTAMPING_RX_SOFTWARE)) + return 0; + + if (setsockopt(fd, SOL_SOCKET, SO_TIMESTAMPING, &flags, len) < 0) { + tester_warn("failed to set SO_TIMESTAMPING"); + tester_test_failed(); + return -EIO; + } + + return 0; +} From patchwork Sun Apr 27 10:44:36 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Pauli Virtanen X-Patchwork-Id: 885341 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 E474D2376E0 for ; Sun, 27 Apr 2025 10:44:59 +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=1745750702; cv=pass; b=idngPWnGYKpu79CHlp5nFJ4tDKkTw6C40umhdrpAnpxFfEWP9zFo5ykHo0YJESNsEEjG0IJxVmI6S6tCUbTZ+XslwsxaFwBrHCtdQtzxf22dnurevbOlPVbMTBxugZIvvPYYQt+mNOYg5Lb3IPRdhapKa7tcvKfW757S6a69sWU= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745750702; c=relaxed/simple; bh=oaMCX+83pfPECWEVDWwsqzVJrVPaqFLEa9zF3myEC0k=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=K16MxqL65FPlNSaLvFSV4rAPjemSndRVBcwwma2KGQWwTM1E8nK8QjHqSj1JbCsGPMvjUGXW3gmflrvLtgPoVDWBs+742+adem6suImpfgVb2cf+SIxnVWjs4P2TjHTd60OCQvjMyFogaHtmvJ4pfbbTXIoKkM+J34hwn5tvDX0= 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=ZRqWIkpj; 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="ZRqWIkpj" Received: from monolith.lan (unknown [193.138.7.178]) (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 4Zljrc17Xkz49QK4; Sun, 27 Apr 2025 13:44:48 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=iki.fi; s=lahtoruutu; t=1745750688; 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=ka87tBIY6uJ82bwf3XcmSTA1HqD87KSKUrdKoZawFi0=; b=ZRqWIkpj8HEd9zhCxvb8XzwJVr5Z+jcAncmnb8kRphmOL7mPhiexxnz7upp3ZFmdBXhVkW 60g1VGUv1Y0u8djDlcpBPt0IYYfqHe/9sWJRl9xud/8zBzqoTUF8BivfxMukYOxyeVR/HZ rYwlyiHZWa3XuIO1ztJWmlQsSXjlyEGOdX1c1gDGrGX+Ct5RjIpaNa4vN2/t4tYc5wHPyw kKlyM0BCFtqTLXYudBpUGNbZdqqd5mymBGi+tp9fs06Lop6+zlFF1B1sHDK5iJ5/r8VWvw OWXaK327fJ1Hg1Rd9TepaZiSOupGc1ZFmk7jbWhF/WUf6bXV/bFDvvBe4HYfvg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=iki.fi; s=lahtoruutu; t=1745750688; 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=ka87tBIY6uJ82bwf3XcmSTA1HqD87KSKUrdKoZawFi0=; b=nj5dqFJJS/xb20C+uj/i3gHE37WVXQkdT0kapFWuS9T9iq3Fse+K50ZKIi0sEExdBxJzFO WBEV8rDJpLNKHLrHJEQzM/TUCNAnocTzd5XBtQCo8os4NzkKqFIrdqW/auE7ljfM4A7RbS r41zyTy0Ymc2B3ZHqJIBArQbkwpkiIdcCvS19stUKvvKaLDkfu/3d+n47IRdsR//s8Vbr5 iUMJEDuaUCB/jJPt9c+Vx75q5CfTYDKXvdVBWSZ+UQ8XBhikCVP0MEw7H9ECFtzLI6PaB2 ozWY8M82LsZmXeXYFORij7KGDX+64FNeYsJ4Ya6Q9SO2YQw2Jq9GyiiuZPVflg== ARC-Seal: i=1; s=lahtoruutu; d=iki.fi; t=1745750688; a=rsa-sha256; cv=none; b=BtuVuZY7hD3SGBffVh2ETbRMsAO8eB2iifiP5l/N/pk95MNlQML9cbINOlijRHH5XKsuk8 One6GBT19cTrhOeTiwOIUwVQAqhltrH5S7UBFPPASIRsx/fItLl1ifbn3n9YQwN+IaYxGf mqvaghH6zKfnz9GBELIxy2d/IuNFWbOK+bbXMk4Tl48Tw0odmKtdaK+/zPgz/izXZFec5a 2fXzSkof7q0SjhcCtmVulnJSgktv66AkZdc+1Zb8/TnuyX3ivrx6kpM1QXO+6d8AfpbmLy Xsd2cq5FdKE3+QQJ0YeaZH269NlCzfOHD+/cWMosy+6+A+qKmTOc0gV8vEtjcA== ARC-Authentication-Results: i=1; ORIGINATING; auth=pass smtp.auth=pav smtp.mailfrom=pav@iki.fi From: Pauli Virtanen To: linux-bluetooth@vger.kernel.org Cc: Pauli Virtanen Subject: [PATCH BlueZ 2/5] bthost: implement fragmenting to ACL MTU Date: Sun, 27 Apr 2025 13:44:36 +0300 Message-ID: <71abcfee88f0f739b2c811e48151e0ee99212bb0.1745750626.git.pav@iki.fi> X-Mailer: git-send-email 2.49.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 Support fragmenting ACL packets to given ACL MTU. --- emulator/bthost.c | 94 +++++++++++++++++++++++++++++++++++++++-------- emulator/bthost.h | 2 + 2 files changed, 80 insertions(+), 16 deletions(-) diff --git a/emulator/bthost.c b/emulator/bthost.c index 5db750aae..1ae33ba6b 100644 --- a/emulator/bthost.c +++ b/emulator/bthost.c @@ -255,6 +255,7 @@ struct bthost { bthost_accept_conn_cb accept_iso_cb; bthost_new_conn_cb new_iso_cb; void *new_iso_data; + uint16_t acl_mtu; struct rfcomm_connection_data *rfcomm_conn_data; struct l2cap_conn_cb_data *new_l2cap_conn_data; struct rfcomm_conn_cb_data *new_rfcomm_conn_data; @@ -294,6 +295,7 @@ struct bthost *bthost_create(void) /* Set defaults */ bthost->io_capability = 0x03; + bthost->acl_mtu = UINT16_MAX; return bthost; } @@ -572,6 +574,14 @@ void bthost_set_send_handler(struct bthost *bthost, bthost_send_func handler, bthost->send_data = user_data; } +void bthost_set_acl_mtu(struct bthost *bthost, uint16_t mtu) +{ + if (!bthost) + return; + + bthost->acl_mtu = mtu; +} + static void queue_command(struct bthost *bthost, const struct iovec *iov, int iovlen) { @@ -619,37 +629,89 @@ static void send_packet(struct bthost *bthost, const struct iovec *iov, bthost->send_handler(iov, iovlen, bthost->send_data); } +static void iov_pull_n(struct iovec *src, unsigned int *src_cnt, + struct iovec *dst, unsigned int *dst_cnt, unsigned int max_dst, + size_t len) +{ + unsigned int i; + size_t count; + + *dst_cnt = 0; + + while (len && *dst_cnt < max_dst && *src_cnt) { + count = len; + if (count > src[0].iov_len) + count = src[0].iov_len; + + dst[*dst_cnt].iov_base = src[0].iov_base; + dst[*dst_cnt].iov_len = count; + *dst_cnt += 1; + + util_iov_pull(&src[0], count); + len -= count; + + if (!src[0].iov_len) { + for (i = 1; i < *src_cnt; ++i) + src[i - 1] = src[i]; + *src_cnt -= 1; + } + } +} + static void send_iov(struct bthost *bthost, uint16_t handle, uint16_t cid, - const struct iovec *iov, int iovcnt) + const struct iovec *iov, unsigned int iovcnt) { struct bt_hci_acl_hdr acl_hdr; struct bt_l2cap_hdr l2_hdr; uint8_t pkt = BT_H4_ACL_PKT; struct iovec pdu[3 + iovcnt]; - int i, len = 0; + struct iovec payload[1 + iovcnt]; + size_t payload_mtu, len; + int flag; + unsigned int i; + len = 0; for (i = 0; i < iovcnt; i++) { - pdu[3 + i].iov_base = iov[i].iov_base; - pdu[3 + i].iov_len = iov[i].iov_len; + payload[1 + i].iov_base = iov[i].iov_base; + payload[1 + i].iov_len = iov[i].iov_len; len += iov[i].iov_len; } - pdu[0].iov_base = &pkt; - pdu[0].iov_len = sizeof(pkt); - - acl_hdr.handle = acl_handle_pack(handle, 0); - acl_hdr.dlen = cpu_to_le16(len + sizeof(l2_hdr)); - - pdu[1].iov_base = &acl_hdr; - pdu[1].iov_len = sizeof(acl_hdr); - l2_hdr.cid = cpu_to_le16(cid); l2_hdr.len = cpu_to_le16(len); + payload[0].iov_base = &l2_hdr; + payload[0].iov_len = sizeof(l2_hdr); - pdu[2].iov_base = &l2_hdr; - pdu[2].iov_len = sizeof(l2_hdr); + len += sizeof(l2_hdr); + iovcnt++; - send_packet(bthost, pdu, 3 + iovcnt); + /* Fragment to ACL MTU */ + + payload_mtu = bthost->acl_mtu - pdu[0].iov_len - pdu[1].iov_len; + + flag = 0x00; + do { + size_t count = (len > payload_mtu) ? payload_mtu : len; + unsigned int pdu_iovcnt; + + pdu[0].iov_base = &pkt; + pdu[0].iov_len = sizeof(pkt); + + acl_hdr.dlen = cpu_to_le16(count); + acl_hdr.handle = acl_handle_pack(handle, flag); + + pdu[1].iov_base = &acl_hdr; + pdu[1].iov_len = sizeof(acl_hdr); + + iov_pull_n(payload, &iovcnt, &pdu[2], &pdu_iovcnt, + ARRAY_SIZE(pdu) - 2, count); + pdu_iovcnt += 2; + + send_packet(bthost, pdu, pdu_iovcnt); + + len -= count; + flag = 0x01; + } while (len); } static void send_acl(struct bthost *bthost, uint16_t handle, uint16_t cid, diff --git a/emulator/bthost.h b/emulator/bthost.h index 405d66bf0..583a8b6df 100644 --- a/emulator/bthost.h +++ b/emulator/bthost.h @@ -36,6 +36,8 @@ void bthost_debug(struct bthost *bthost, const char *format, ...) void bthost_set_send_handler(struct bthost *bthost, bthost_send_func handler, void *user_data); +void bthost_set_acl_mtu(struct bthost *bthost, uint16_t mtu); + void bthost_receive_h4(struct bthost *bthost, const void *data, uint16_t len); typedef void (*bthost_cmd_complete_cb) (uint16_t opcode, uint8_t status, From patchwork Sun Apr 27 10:44:37 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Pauli Virtanen X-Patchwork-Id: 885870 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 F26BE1F5821 for ; Sun, 27 Apr 2025 10:44:55 +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=1745750698; cv=pass; b=VR5TgRS8pYQ3T4uqWkIlM+IVhOXhCedHKVWP8Z//cSVX7MLWkPJO7xqrzkcyBmRo//1erQTb3kPUr1zJkfuF7a/bsF3/z1SbYwCSzqOC3B10o/fiGw4n/pKUT20vhrPvuoDmSugAfre58ry5lOVhhY03Qmr8cTKWs6ol/7mau14= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745750698; c=relaxed/simple; bh=2eIcF11R4y8YSEOlKtCK/ypYEHPgW8khGnY8uEeNKuI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=HIwaYaCm+uQhQ2sXsOkGMz5xtP/DSNcAqxcdKcDIrwnDLQJxBb3RYLwuN9EUf7uno5Kci1SfmDNk7d2Gabt4RinBBojQxINZLP3iyIdfHe31peDGJ3gSeFstjFVCf8QfCIWX+9QACNJgG1JhgEix3rtzcyDgAgdPjglW9j70SX4= 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=O7zFb+GZ; 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="O7zFb+GZ" Received: from monolith.lan (unknown [193.138.7.178]) (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 4Zljrh6qJqz49QKK; Sun, 27 Apr 2025 13:44:52 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=iki.fi; s=lahtoruutu; t=1745750693; 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=kGVdXYo19TJjQxJ11y5ttsqlc+cF9jVl//LSJcPcRD4=; b=O7zFb+GZNB5Ja5QBfrTQWUWFy8uOcjHlraXiDK0kS0oEwK6eWTZRGMxh2YO4LdVNtopmQ8 05kowz5NR08F3JIxivyFhKQT4x5NTIVy16pTzziwOImxOlLYWCjJOEcZskfpPoMKfXo4vC EQ86Ed4CIWFGAU1UgRAF8gO3QetQAIGEvHEqjSVhVvtMkyqlou1btr+hJ5i9nEVK6T2Iox LMUruG7b+fwV911ZhvIyFvwCsDUjKCBSqj4bdtzBLBrzDijEQ6qsNX7zZJBopsLjrjDvB/ exQNunWTf8iZRNx7OO8+8/1ajNPgYJeD904wP6N4c+i7bZFsKc0YyCkYAGQKZw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=iki.fi; s=lahtoruutu; t=1745750693; 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=kGVdXYo19TJjQxJ11y5ttsqlc+cF9jVl//LSJcPcRD4=; b=t3YOhljigsUE9IkzW9/ifDiqm/gm74kJMtUoj3wjymlcu21eiK2svLiCpVLTTeiucvNwOi /UYNTeuc7t1F27KHu8paT3nI+60n3TvIKtchpMNrA87QoBf7D+hAH4gD40hLoVJoWndWF1 +ITwX+/3rQT/Ie3eK0eRCWs8GC5eu5+opQtNvqmg3XDPQP5rrjRt492PHPO2sI7tuiCI+X PgTg3Dcob9m4zH5Nmiylhk0EWsEK2zJco8VFsSQ+25AMt8y9uzn44tszwZ6yJ5lQcxTPpT uCrVDisRFmriOIG+lel9wuxyApryBd4k+V7GtPDg7+Pf9uyz8Nh/GNBCGLuxhw== ARC-Seal: i=1; s=lahtoruutu; d=iki.fi; t=1745750693; a=rsa-sha256; cv=none; b=NrTyCEkZj4nwmfx8yQoiUGkDhNTVz9jceLisRCouK0aiRiOqd49HM9Mn12t/u10qJbULAi EYjUrjyB0eBvow7aREJRMgZKPInOkADCC3ZL4kQKa96NoKA2hxM0RVXEvF3obbanW74pJX nMVDd4ZOUT61GMtn+AY7DK/5XT+3mewQq6LdkbNVG0jRajMVSZeixBHw3W7b7qOot4C9up aJ4zRMDs9y0jTH/Mm8YziT/DMfuOg/HFIGrw6M1zQNOSy8VtbYWTgY5HCn6zdMnTxZvIiu bGTxNhIDNh4sIb4ZpxLxaJkY+24a/ZpceOjR+bpWcyYs5IEWp8/vFdxig+P3Ug== ARC-Authentication-Results: i=1; ORIGINATING; auth=pass smtp.auth=pav smtp.mailfrom=pav@iki.fi From: Pauli Virtanen To: linux-bluetooth@vger.kernel.org Cc: Pauli Virtanen Subject: [PATCH BlueZ 3/5] hciemu: set bthost ACL MTU to match btdev Date: Sun, 27 Apr 2025 13:44:37 +0300 Message-ID: <258a6c7a911bd864ad15e81bd7155ddf47a1fa6f.1745750626.git.pav@iki.fi> X-Mailer: git-send-email 2.49.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 the bthost ACL MTU to avoid generating larger packets than the btdev ACL MTU. This tests RX timestamping on ACL fragmentation. --- emulator/btdev.c | 11 +++++++++++ emulator/btdev.h | 3 +++ emulator/hciemu.c | 4 ++++ 3 files changed, 18 insertions(+) diff --git a/emulator/btdev.c b/emulator/btdev.c index 76bae5ea1..cf5c36bb4 100644 --- a/emulator/btdev.c +++ b/emulator/btdev.c @@ -7460,6 +7460,17 @@ const uint8_t *btdev_get_adv_addr(struct btdev *btdev, uint8_t handle) return ext_adv_addr(btdev, ext_adv); } +void btdev_get_mtu(struct btdev *btdev, uint16_t *acl, uint16_t *sco, + uint16_t *iso) +{ + if (acl) + *acl = btdev->acl_mtu; + if (sco) + *acl = btdev->sco_mtu; + if (iso) + *iso = btdev->iso_mtu; +} + void btdev_set_le_states(struct btdev *btdev, const uint8_t *le_states) { memcpy(btdev->le_states, le_states, sizeof(btdev->le_states)); diff --git a/emulator/btdev.h b/emulator/btdev.h index a96c1a325..c7b3b468a 100644 --- a/emulator/btdev.h +++ b/emulator/btdev.h @@ -84,6 +84,9 @@ uint8_t btdev_get_le_scan_enable(struct btdev *btdev); const uint8_t *btdev_get_adv_addr(struct btdev *btdev, uint8_t handle); +void btdev_get_mtu(struct btdev *btdev, uint16_t *acl, uint16_t *sco, + uint16_t *iso); + void btdev_set_le_states(struct btdev *btdev, const uint8_t *le_states); void btdev_set_al_len(struct btdev *btdev, uint8_t len); diff --git a/emulator/hciemu.c b/emulator/hciemu.c index ccc57aada..8529caae8 100644 --- a/emulator/hciemu.c +++ b/emulator/hciemu.c @@ -308,6 +308,7 @@ static struct hciemu_client *hciemu_client_new(struct hciemu *hciemu, { struct hciemu_client *client; int sv[2]; + uint16_t mtu; client = new0(struct hciemu_client, 1); if (!client) @@ -342,6 +343,9 @@ static struct hciemu_client *hciemu_client_new(struct hciemu *hciemu, client->host_source = create_source_bthost(sv[1], client->host); client->start_source = g_idle_add(start_host, client); + btdev_get_mtu(client->dev, &mtu, NULL, NULL); + bthost_set_acl_mtu(client->host, mtu); + return client; } From patchwork Sun Apr 27 10:44:38 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Pauli Virtanen X-Patchwork-Id: 885342 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 8AC342459C9 for ; Sun, 27 Apr 2025 10:44:56 +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=1745750699; cv=pass; b=bYZ+fvhc2eW1lLja6GC54tDaCROxz69sxgnjzTivnfk/bpWuXPizNP8lYE3Ix6ukCuGUafrM/Pi6tKe8rF6/kEuB2WzTp5R3x/OcNeGC7VD6GepmGrB7oGRTpHZVf81YTpjS/TZFGTpT/kKCmgmgE5cYzkjhqV6HHG9WUdwd4vo= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745750699; c=relaxed/simple; bh=dJ9BGXtlV0YqiN+XrFlGdYUL5iQQPsASWTX+kDuf4Ns=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=rBSXJAFlpqG4Mbgv74uSGH59yUrD7rFD46j3w8wbPywzbfq1P5x+9msL19jYqdg+vcpR2QiFfqJiV9qjUmPWh8nJs+DVzESVVUGBpFYMsb9XuwBGqCDN2EilfOra1A/eTT9vo5sYCMyusTtmgTVIkigp69Aj4A5wo0CFrBnDv7Y= 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=ivqpq2Uh; 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="ivqpq2Uh" Received: from monolith.lan (unknown [193.138.7.178]) (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 4Zljrk0zM3z49QJv; Sun, 27 Apr 2025 13:44:54 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=iki.fi; s=lahtoruutu; t=1745750694; 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=gpPlndArWFqZeEqXmU0v8Ut53EzDd+QekLndD77nOb4=; b=ivqpq2UhS5UBUFLxviNa4JXjYduJ1lRSCDBgFxtI/IgmCasnO0PT2+0MNCamXRhFX32Idg uLFG9v1V1CqpzmetOmIIdkwCDI+4Xzz8MDAii10s6tKmcQx7Bw2kCs2ieX/qulLToc6BPJ 8TlnlkdVNhay4/BWhZnIoEZz3WGgrqENnwXybMgM0Dgax7uXSNln+m3G4Bn2GTzS2ilra8 colscFp16DK/mb2uAHrqg/137mDw+7W02DNwS8C8iiZp4D4I91Q2+rUITc1rjVMe6cXIHb hW847XEVOX6RTE9JDSAVyOycKpj2Zwx4Dm5roo4geFxuJ6YkhrV8rmxmJWeA6g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=iki.fi; s=lahtoruutu; t=1745750694; 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=gpPlndArWFqZeEqXmU0v8Ut53EzDd+QekLndD77nOb4=; b=k0xu01Q4lpDSm9cB3Zb2PV6ftuOR2Ska9fWPQegHSeBtP3ygne5Z4d20ELLHLDWNUhesYZ 5z40qZsZjuhRHrBGtwpLEmjMwdIr3bgKi5iLzsfQ9bBxBGXPVjKxE0xJ1Y5tdIM4mI6L+I jb99X8Dfybfdi9/8WMnJ+7C17GB4BKAVjE24CkqcAVvdQBjTqlngMYV2EZ4MDiTOUgth9b p36e36UqYtsFTa845anUxi1BGQywXhWR0cJl55DMpZ3XIhRrr7KuazUJjvzFk9ECGBZpZV YRTnRPuXmq0uDtDPeCYZMiFGC1gbqoM48ALBr7kTCTpcS+ACp/2nh7rMqQqdzw== ARC-Seal: i=1; s=lahtoruutu; d=iki.fi; t=1745750694; a=rsa-sha256; cv=none; b=SpGTjklKpwjauI4o0Ci6+a9Mdv0MenekyUvP9ZOqv9aLRkd4NREjjnZpudoMwxbiPA5nj8 7QRUT9eoextMCR8axeKgNxvF56bpjR+QukMQUUVYAleL4e9dJ3LHBA7Jr+fokqxUpOHDlD FlRdEEADYliZSH6msmknGdmi3UA34X49cIbQhGThoxVxT+kcMyPgJigBplGy9kwCa7uYf1 AmsZrfUoDXr9pLFARv2jlEdfG3eGxmwiyHy0ckzolWAQbqqTvNqQMzKkTwmWDrEdkueR9I LwUR//zF1V0RqV+8aKfy5P9v7lL+39/DBGywjJt3lEUfuRCzsxnr7hs6CU8qVQ== ARC-Authentication-Results: i=1; ORIGINATING; auth=pass smtp.auth=pav smtp.mailfrom=pav@iki.fi From: Pauli Virtanen To: linux-bluetooth@vger.kernel.org Cc: Pauli Virtanen Subject: [PATCH BlueZ 4/5] bthost: support sending SCO packets Date: Sun, 27 Apr 2025 13:44:38 +0300 Message-ID: <1a6c413e2d6d7d0e0f96b2e5d32079b1dad6fdf5.1745750626.git.pav@iki.fi> X-Mailer: git-send-email 2.49.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 function to send SCO packets via bthost. --- emulator/bthost.c | 32 ++++++++++++++++++++++++++++++++ emulator/bthost.h | 2 ++ 2 files changed, 34 insertions(+) diff --git a/emulator/bthost.c b/emulator/bthost.c index 1ae33ba6b..214583cc5 100644 --- a/emulator/bthost.c +++ b/emulator/bthost.c @@ -40,6 +40,7 @@ #define acl_flags(h) (h >> 12) #define sco_flags_status(f) (f & 0x03) +#define sco_flags_pack(status) (status & 0x03) #define iso_flags_pb(f) (f & 0x0003) #define iso_flags_ts(f) ((f >> 2) & 0x0001) @@ -878,6 +879,37 @@ void bthost_send_cid_v(struct bthost *bthost, uint16_t handle, uint16_t cid, send_iov(bthost, handle, cid, iov, iovcnt); } +void bthost_send_sco(struct bthost *bthost, uint16_t handle, uint8_t pkt_status, + const struct iovec *iov, int iovcnt) +{ + uint8_t pkt = BT_H4_SCO_PKT; + struct iovec pdu[2 + iovcnt]; + struct bt_hci_sco_hdr sco_hdr; + struct btconn *conn; + int i, len = 0; + + conn = bthost_find_conn(bthost, handle); + if (!conn) + return; + + for (i = 0; i < iovcnt; i++) { + pdu[2 + i].iov_base = iov[i].iov_base; + pdu[2 + i].iov_len = iov[i].iov_len; + len += iov[i].iov_len; + } + + pdu[0].iov_base = &pkt; + pdu[0].iov_len = sizeof(pkt); + + sco_hdr.handle = acl_handle_pack(handle, sco_flags_pack(pkt_status)); + sco_hdr.dlen = len; + + pdu[1].iov_base = &sco_hdr; + pdu[1].iov_len = sizeof(sco_hdr); + + send_packet(bthost, pdu, 2 + iovcnt); +} + static void send_iso(struct bthost *bthost, uint16_t handle, bool ts, uint16_t sn, uint32_t timestamp, uint8_t pkt_status, const struct iovec *iov, int iovcnt) diff --git a/emulator/bthost.h b/emulator/bthost.h index 583a8b6df..db640daff 100644 --- a/emulator/bthost.h +++ b/emulator/bthost.h @@ -92,6 +92,8 @@ void bthost_send_cid(struct bthost *bthost, uint16_t handle, uint16_t cid, const void *data, uint16_t len); void bthost_send_cid_v(struct bthost *bthost, uint16_t handle, uint16_t cid, const struct iovec *iov, int iovcnt); +void bthost_send_sco(struct bthost *bthost, uint16_t handle, uint8_t pkt_status, + const struct iovec *iov, int iovcnt); void bthost_send_iso(struct bthost *bthost, uint16_t handle, bool ts, uint16_t sn, uint32_t timestamp, uint8_t pkt_status, const struct iovec *iov, int iovcnt); From patchwork Sun Apr 27 10:44:39 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Pauli Virtanen X-Patchwork-Id: 885868 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 2CFF52512E4 for ; Sun, 27 Apr 2025 10:45:01 +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=1745750702; cv=pass; b=DZzw4g4ueuB8VyK25LIwc6K39rMXYalzNn4y4b+tfTTcb0GoO3ce3F7RWqxKv6BNRQdR7SlRYrXiERc+myH6lSwasJc/E6R9FsraZMTcBa2Ewpvoyn6pwby5jzuwapySMqpBIAX+z1jdttMI95rK1IU1f7RIK0O4xGxEDJ9gA+Y= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745750702; c=relaxed/simple; bh=YrqV2D7ZW3vuR/dCBmJ9pLzNzJXTDpHpGcPPX42+Qzg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=QVzPhVF4zeoSrMrEoBx0SKPCOQU2gibdWBX5Df0FzlDp3sEbmCa4dbC5jCOsXB1f6qlyIi17lZV/Uj6vqRO4AFdWibqL6RoOwnwZEIk/wCJfhxbBcs4d/H+aKuAHhmptkYGz7kfh52F4pJq9LMOww/bYZmEdgAN4rVl0udk+FSM= 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=Ot+HpprU; 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="Ot+HpprU" Received: from monolith.lan (unknown [193.138.7.178]) (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 4Zljrk6PSjz49QKQ; Sun, 27 Apr 2025 13:44:54 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=iki.fi; s=lahtoruutu; t=1745750695; 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=EQvZDlrK04YhL4nNHdrZayEpEJlAjOptRgSIV2zeNGk=; b=Ot+HpprUhk4av9b4JZKi08aSKhpd2FwtKKa0IjQ2cuyYs7zrBVHqfI9ex9EKz6/ttRVS/u 9CNNQ4F9PC8EvX7fCJaidVrqV0SeMYfLtvRmnszPwy7d9fTmlRx0qA6bXRH6zxBJiKph05 cu/Tk0TAq3YrikkUiYlv4eR6H0pIW5kQFwPtHrKX6JZ8NGG7LTS0JOXEEa104yNM6+E1XV OVx23nPCGu96b2NVuXkx7sLR6DPL388Z9suzONBbhiUVPlIa64RuTTlFZkcdrKTovuwcVp gQ0Otd4bFkbEL205nV08q/VEb4wlguPZip9EKxTpBX37bJiq6csV4WEGjPSkSQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=iki.fi; s=lahtoruutu; t=1745750695; 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=EQvZDlrK04YhL4nNHdrZayEpEJlAjOptRgSIV2zeNGk=; b=evURzy5pAGHih3YiPOfI1ZvdKBbn/ih5AHpeCQPI3oEwtS1zy51UaYtPtETJhXZoDf5Zmu 1xHcG7G2lpfjKhKSUSIpO21OXdfOOwvu8uI9gnwHjl5evW04HGxWm4IR+aH5W9zthjrSgD IiO59WcCBaG6EML9d6YUVhYqJ6uz4OpAf4uCIBibrqFq97Rc8sxW0sDmOlQwW2kCaitiFa 7gnuVdK/XkRs+X4TlEKB2P0BUTrmMcAs7uCptEOO75gjs9CGo5pbFMjeUk63shDkuBJd7o FJfjRSQKiCMbAs6bUFIP2x3Yf5eaFD0+kpun2NSiPBQSyDOz1iS5MtFLbAm4zA== ARC-Seal: i=1; s=lahtoruutu; d=iki.fi; t=1745750695; a=rsa-sha256; cv=none; b=QKjmOCxoaOxDT7zAfhgbFedjDdKJrqlspbYKE8B9Z2V/K2dG4fyrT6cHSHZyCyxrTW7r36 Mpdy1VkX0K7cG/hGlpGB2pwc1HX8+nKslSksEv+AWiyKYkZZFd5z8MNA5B2yQ3SKaXOmgU z1kUNmKREDsSF2uuXhQknueK97VJpqAR2Zd4P3AQi95pwUxmXcYEeKdKOjb9e1wPXgTEVh 2gm6TySOI3npHxqLCXBWXglZLpaNSu0nTVh312BC9kaYrBLRbfLh4Z0pL6LriBe5jQC72c XY2K54zbyoUMMMW/hLkd+SRjomOV4IqdlIG4j8V1vQjZ0UC2Yjw6kOOZUdSdmg== ARC-Authentication-Results: i=1; ORIGINATING; auth=pass smtp.auth=pav smtp.mailfrom=pav@iki.fi From: Pauli Virtanen To: linux-bluetooth@vger.kernel.org Cc: Pauli Virtanen Subject: [PATCH BlueZ 5/5] sco-tester: add SCO receive and RX timestamping tests Date: Sun, 27 Apr 2025 13:44:39 +0300 Message-ID: <7bfc6765fd01c72c49c9b926d86d7b4d3b0030de.1745750626.git.pav@iki.fi> X-Mailer: git-send-email 2.49.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: SCO CVSD Recv - Success SCO CVSD Recv - RX Timestamping --- tools/sco-tester.c | 84 +++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 83 insertions(+), 1 deletion(-) diff --git a/tools/sco-tester.c b/tools/sco-tester.c index 650f8bab3..fc89d1d29 100644 --- a/tools/sco-tester.c +++ b/tools/sco-tester.c @@ -52,6 +52,7 @@ struct test_data { struct sco_client_data { int expect_err; + const uint8_t *recv_data; const uint8_t *send_data; uint16_t data_len; @@ -300,6 +301,20 @@ static const struct sco_client_data connect_failure_reset = { const uint8_t data[] = {0, 1, 2, 3, 4, 5, 6, 7, 8}; +static const struct sco_client_data connect_recv_success = { + .expect_err = 0, + .data_len = sizeof(data), + .recv_data = data, +}; + +static const struct sco_client_data connect_recv_rx_ts_success = { + .expect_err = 0, + .data_len = sizeof(data), + .recv_data = data, + .so_timestamping = (SOF_TIMESTAMPING_SOFTWARE | + SOF_TIMESTAMPING_RX_SOFTWARE), +}; + static const struct sco_client_data connect_send_success = { .expect_err = 0, .data_len = sizeof(data), @@ -401,7 +416,7 @@ static void setup_powered_callback(uint8_t status, uint16_t length, bthost_set_cmd_complete_cb(bthost, client_connectable_complete, data); bthost_write_scan_enable(bthost, 0x03); - if (scodata && scodata->send_data) + if (scodata && (scodata->send_data || scodata->recv_data)) bthost_set_sco_cb(bthost, sco_new_conn, data); } @@ -783,6 +798,64 @@ static void sco_tx_timestamping(struct test_data *data, GIOChannel *io) data->err_io_id = g_io_add_watch(io, G_IO_ERR, recv_errqueue, data); } +static gboolean sock_received_data(GIOChannel *io, GIOCondition cond, + gpointer user_data) +{ + struct test_data *data = tester_get_data(); + const struct sco_client_data *scodata = data->test_data; + bool tstamp = scodata->so_timestamping & SOF_TIMESTAMPING_RX_SOFTWARE; + char buf[1024]; + int sk; + ssize_t len; + + sk = g_io_channel_unix_get_fd(io); + + len = recv_tstamp(sk, buf, sizeof(buf), tstamp); + if (len < 0) { + tester_warn("Unable to read: %s (%d)", strerror(errno), errno); + tester_test_failed(); + return FALSE; + } + + tester_debug("read: %d", (int)len); + + if (len != scodata->data_len) { + tester_test_failed(); + return FALSE; + } + + --data->step; + + if (len != scodata->data_len || + memcmp(buf, scodata->recv_data, scodata->data_len)) + tester_test_failed(); + else if (!data->step) + tester_test_passed(); + else + return TRUE; + + return FALSE; +} + +static void sco_recv_data(struct test_data *data, GIOChannel *io) +{ + const struct sco_client_data *scodata = data->test_data; + struct iovec iov = { (void *)scodata->recv_data, scodata->data_len }; + struct bthost *bthost; + + data->step = 0; + + if (rx_timestamping_init(g_io_channel_unix_get_fd(io), + scodata->so_timestamping)) + return; + + bthost = hciemu_client_get_host(data->hciemu); + g_io_add_watch(io, G_IO_IN, sock_received_data, NULL); + + bthost_send_sco(bthost, data->handle, 0x00, &iov, 1); + ++data->step; +} + static gboolean sco_connect_cb(GIOChannel *io, GIOCondition cond, gpointer user_data) { @@ -805,6 +878,9 @@ static gboolean sco_connect_cb(GIOChannel *io, GIOCondition cond, else tester_print("Successfully connected"); + if (scodata->recv_data) + sco_recv_data(data, io); + if (scodata->send_data) { ssize_t ret = 0; unsigned int count; @@ -1137,6 +1213,12 @@ int main(int argc, char *argv[]) test_sco_11("SCO mSBC 1.1 - Failure", &connect_failure, setup_powered, test_connect_transp); + test_sco("SCO CVSD Recv - Success", &connect_recv_success, + setup_powered, test_connect); + + test_sco("SCO CVSD Recv - RX Timestamping", &connect_recv_rx_ts_success, + setup_powered, test_connect); + test_sco("SCO CVSD Send - Success", &connect_send_success, setup_powered, test_connect);