From nobody Mon Nov 02 03:02:48 2026 X-Original-To: dev-commits-src-main@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4jHxMr38spz6yVl5 for ; Mon, 02 Nov 2026 03:02:48 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange x25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id 4jHxMr0d8Nz4SDR for ; Mon, 02 Nov 2026 03:02:48 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1793588568; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=Xj4u8jTHNnZBL5XBiXDBoV8PMfvPid1tFe9sjretjIM=; b=bKBKUfDjHQWYohgt/sCnqdahySNai9VQTOK3GiLQQyBHVr5mj738SpII+COvHHaCM8BNQd NzRWtW7mHeS+3RY0J53zDv+jC1MubtjXJwR/P+iLLlhNjZIgpGStByQ20llZZqgFhwuqiS u9QF/8jASurYAtayrfvEEaFZ2/mZdXUuiUDBYCndxV/1YAxY79WrnSQ/i9wtGzR1nimtca pLrINeVUUsYfCbz8Zq4M5J+8zEagR7zhglnCJyftyklz0GjI9C3cIPQwK18y5NCVIF4mHM JapkMpSpdJK/PXIAY+79mNG0SGY3z60JXtejr/sDQvS6n14+pEKv2l7qyW49Qg== ARC-Seal: i=1; a=rsa-sha256; d=freebsd.org; s=dkim; cv=none; t=1793588568; b=GZz2BvtzIl2zKd7pp6rRqW9MxKDdfNomziLB6zXXJ4wVUmVYuANZpofM7ZnNiquIfzIFQI l6RSm4xiA4v07RTQ+agDftW5FOLXyZkWfZeO2i9t3XGta0Y/m7f4P8RwpOEPXQFDPVwRom jiOBvP+We2cr3YIQp7Skd7jmfSq7RWL4erHLFcNxGjlw3XgQ/WLGkNoHtzgpqPAOgUiBVP vt3vRWpN+hauH7Oh51IaX9SPo9u3KwlLw/Hf5VcViquF2ys84f8WUlgSMHgFNS4+K6IiLy Axk7CPe5xb0x08dVb5FcQoV4eFlT/ul3udISu7Fd8eCQ1nDoMgW0IDWNodQzgQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1793588568; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=Xj4u8jTHNnZBL5XBiXDBoV8PMfvPid1tFe9sjretjIM=; b=d8wzsd9l6zxJLqygo+cORb/p37RXRLCcwMr2IM8HEPkxRpulPSm6QvX0j6ZknQfv7P5vGv 4pXpU4Kux1EbHgW25sCtKhMUy/twnDXjjSDyYuROPA02qbdr7y/Mec3n4Tt3dBT7R+Dz6W 1dkCks2BlTx3/meHRlrzik+v8DjenGsJNXY2QdlnPdir9dFvzv1PC38TjObAnNxp+0HRL1 8uSr6B83vl9yWwSRmBU9Dr23g2OivQMMJyceb9IwPFVDzJv9jhxR69iOXoNnZIWKqu7/e/ 8BQPKNqkfJA7oALlFa16lO3Cc7JmsUTngPa1675EHJ0uAJhqxuoxDYj/UQHV4w== ARC-Authentication-Results: i=1; mx1.freebsd.org; none Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4jHxMr0F5WzR5V for ; Mon, 02 Nov 2026 03:02:48 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 38ef3 by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Mon, 02 Nov 2026 03:02:48 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: ShengYi Hung Subject: git: ab18352d8f9d - main - usb: Add usbd_bos_foreach helper List-Archive: https://lists.freebsd.org/archives/dev-commits-src-main X-BeenThere: dev-commits-src-main@freebsd.org Sender: owner-dev-commits-src-main@FreeBSD.org List-Id: Commit messages for the main branch of the src repository List-Post: List-Help: List-Subscribe: List-Unsubscribe: List-Owner: Precedence: list MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: aokblast X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: ab18352d8f9dd26d94da1165259460ead44a9e4c Auto-Submitted: auto-generated Date: Mon, 02 Nov 2026 03:02:48 +0000 Message-Id: <6ae7fd58.38ef3.318ed6d4@gitrepo.freebsd.org> The branch main has been updated by aokblast: URL: https://cgit.FreeBSD.org/src/commit/?id=ab18352d8f9dd26d94da1165259460ead44a9e4c commit ab18352d8f9dd26d94da1165259460ead44a9e4c Author: ShengYi Hung AuthorDate: 2026-05-22 16:18:57 +0000 Commit: ShengYi Hung CommitDate: 2026-11-02 03:02:11 +0000 usb: Add usbd_bos_foreach helper Iterate the capabilities of a BOS descriptor. Sponsored by: The FreeBSD Foundation Differential Revision: https://reviews.freebsd.org/D57199 --- sys/dev/usb/usb_parse.c | 45 +++++++++++++++++++++++++++++++++++++++++++++ sys/dev/usb/usbdi_util.h | 2 ++ 2 files changed, 47 insertions(+) diff --git a/sys/dev/usb/usb_parse.c b/sys/dev/usb/usb_parse.c index bb592f1a4c03..7beb4dbd29a2 100644 --- a/sys/dev/usb/usb_parse.c +++ b/sys/dev/usb/usb_parse.c @@ -315,3 +315,48 @@ usbd_get_no_alts(struct usb_config_descriptor *cd, } return (n); } + +/*------------------------------------------------------------------------* + * usbd_bos_foreach + * + * This function iterates the capabilities of a BOS descriptor. "bos" + * must be the complete descriptor, because "wTotalLength" is taken as + * the size of the buffer. + * + * Returns: + * NULL: End of capabilities + * Else: Pointer to the next capability + *------------------------------------------------------------------------*/ +struct usb_bos_cap_descriptor * +usbd_bos_foreach(struct usb_bos_descriptor *bos, + struct usb_bos_cap_descriptor *cap) +{ + uint32_t offset; + uint32_t total; + + /* + * No capability + */ + if (bos == NULL || bos->bLength < sizeof(*bos)) + return (NULL); + + total = UGETW(bos->wTotalLength); + + if (cap == NULL) + offset = bos->bLength; + else + offset = (uint8_t *)cap - (uint8_t *)bos + cap->bLength; + + /* + * The returned capability must be complete + */ + if (offset + sizeof(*cap) > total) + return (NULL); + + cap = (struct usb_bos_cap_descriptor *)((uint8_t *)bos + offset); + + if (cap->bLength < sizeof(*cap) || offset + cap->bLength > total) + return (NULL); + + return (cap); +} diff --git a/sys/dev/usb/usbdi_util.h b/sys/dev/usb/usbdi_util.h index 403327e8070f..0b422387f97c 100644 --- a/sys/dev/usb/usbdi_util.h +++ b/sys/dev/usb/usbdi_util.h @@ -54,6 +54,8 @@ struct usb_endpoint_descriptor *usb_edesc_foreach( struct usb_endpoint_ss_comp_descriptor *usb_ed_comp_foreach( struct usb_config_descriptor *cd, struct usb_endpoint_ss_comp_descriptor *ped); +struct usb_bos_cap_descriptor *usbd_bos_foreach(struct usb_bos_descriptor *bos, + struct usb_bos_cap_descriptor *cap); uint8_t usbd_get_no_descriptors(struct usb_config_descriptor *cd, uint8_t type); uint8_t usbd_get_no_alts(struct usb_config_descriptor *cd,