1/* SPDX-License-Identifier: GPL-2.0+ */
2/*
3 * WebUSB descriptors and constants
4 *
5 * Copyright (C) 2023 Jó Ágila Bitsch <jgilab@gmail.com>
6 */
7
8#ifndef __LINUX_USB_WEBUSB_H
9#define __LINUX_USB_WEBUSB_H
10
11#include "uapi/linux/usb/ch9.h"
12
13/*
14 * Little Endian PlatformCapablityUUID for WebUSB
15 * 3408b638-09a9-47a0-8bfd-a0768815b665
16 * to identify Platform Device Capability descriptors as referring to WebUSB.
17 */
18#define WEBUSB_UUID \
19 GUID_INIT(0x3408b638, 0x09a9, 0x47a0, 0x8b, 0xfd, 0xa0, 0x76, 0x88, 0x15, 0xb6, 0x65)
20
21/*
22 * WebUSB Platform Capability data
23 *
24 * A device announces support for the
25 * WebUSB command set by including the following Platform Descriptor Data in its
26 * Binary Object Store associated with the WebUSB_UUID above.
27 * See: https://wicg.github.io/webusb/#webusb-platform-capability-descriptor
28 */
29struct usb_webusb_cap_data {
30 __le16 bcdVersion;
31#define WEBUSB_VERSION_1_00 cpu_to_le16(0x0100) /* currently only version 1.00 is defined */
32 u8 bVendorCode;
33 u8 iLandingPage;
34#define WEBUSB_LANDING_PAGE_NOT_PRESENT 0
35#define WEBUSB_LANDING_PAGE_PRESENT 1 /* we chose the fixed index 1 for the URL descriptor */
36} __packed;
37
38#define USB_WEBUSB_CAP_DATA_SIZE 4
39
40/*
41 * Get URL Request
42 *
43 * The request to fetch an URL is defined in https://wicg.github.io/webusb/#get-url as:
44 * bmRequestType: (USB_DIR_IN | USB_TYPE_VENDOR) = 11000000B
45 * bRequest: bVendorCode
46 * wValue: iLandingPage
47 * wIndex: GET_URL = 2
48 * wLength: Descriptor Length (typically U8_MAX = 255)
49 * Data: URL Descriptor
50 */
51#define WEBUSB_GET_URL 2
52
53/*
54 * This descriptor contains a single URL and is returned by the Get URL request.
55 *
56 * See: https://wicg.github.io/webusb/#url-descriptor
57 */
58struct webusb_url_descriptor {
59 u8 bLength;
60#define WEBUSB_URL_DESCRIPTOR_HEADER_LENGTH 3
61 u8 bDescriptorType;
62#define WEBUSB_URL_DESCRIPTOR_TYPE 3
63 u8 bScheme;
64#define WEBUSB_URL_SCHEME_HTTP 0
65#define WEBUSB_URL_SCHEME_HTTPS 1
66#define WEBUSB_URL_SCHEME_NONE 255
67 u8 URL[U8_MAX - WEBUSB_URL_DESCRIPTOR_HEADER_LENGTH];
68} __packed;
69
70/*
71 * Buffer size to hold the longest URL that can be in an URL descriptor
72 *
73 * The descriptor can be U8_MAX bytes long.
74 * WEBUSB_URL_DESCRIPTOR_HEADER_LENGTH bytes are used for a header.
75 * Since the longest prefix that might be stripped is "https://", we may accommodate an additional
76 * 8 bytes.
77 */
78#define WEBUSB_URL_RAW_MAX_LENGTH (U8_MAX - WEBUSB_URL_DESCRIPTOR_HEADER_LENGTH + 8)
79
80#endif /* __LINUX_USB_USBNET_H */
81

source code of linux/include/linux/usb/webusb.h