net: mctp: usb: Accommodate DSP0283 v1.1 header format

In the v1.1 update to DSP0283, we have a larger header field, of 13 bits
rather than 8.

In order to accommodate this, in preparation for proper v1.1 support,
expand our struct mctp_usb_hdr's len field to a u16, and endian-convert
when necessary. Because we don't yet support spanning mode, we will
never receive or transmit with the top 5 bits set, so we always mask
out anyway.

This allows for a future change where we allow spanning mode with
>512-byte transfers.

Signed-off-by: Jeremy Kerr <jk@codeconstruct.com.au>
Link: https://patch.msgid.link/20260724-dev-mctp-usb-1-1-v5-7-e66bbba0dbdc@codeconstruct.com.au
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
Jeremy Kerr 2026-07-24 13:15:28 +08:00 committed by Jakub Kicinski
parent 76a58ffd74
commit f5bf226f3c
2 changed files with 16 additions and 9 deletions

View File

@ -99,6 +99,7 @@ int mctp_usblib_rx_complete(struct net_device *netdev,
while (skb) {
struct sk_buff *skb2 = NULL;
struct mctp_usb_hdr *hdr;
u16 hdr_len;
/* length of MCTP packet, no USB header */
u8 pkt_len;
@ -116,21 +117,23 @@ int mctp_usblib_rx_complete(struct net_device *netdev,
break;
}
if (hdr->len <
hdr_len = be16_to_cpu(hdr->len) & MCTP_USB_1_0_PKTLEN_MAX;
if (hdr_len <
sizeof(struct mctp_hdr) + sizeof(struct mctp_usb_hdr)) {
netdev_dbg(netdev, "rx: short packet (hdr) %d\n",
hdr->len);
hdr_len);
rc = -EPROTO;
break;
}
/* we know we have at least sizeof(struct mctp_usb_hdr) here */
pkt_len = hdr->len - sizeof(struct mctp_usb_hdr);
pkt_len = hdr_len - sizeof(struct mctp_usb_hdr);
if (pkt_len > skb->len) {
rc = -EPROTO;
netdev_dbg(netdev,
"rx: short packet (xfer) %d, actual %d\n",
hdr->len, skb->len);
hdr_len, skb->len);
break;
}
@ -399,8 +402,7 @@ static int mctp_usblib_tx_skb_prepare(struct sk_buff *skb,
}
hdr->id = cpu_to_be16(MCTP_USB_DMTF_ID);
hdr->rsvd = 0;
hdr->len = plen + sizeof(*hdr);
hdr->len = cpu_to_be16(plen + sizeof(*hdr));
return 0;
}

View File

@ -2,7 +2,7 @@
/*
* mctp-usb.h - MCTP USB transport binding: common definitions,
* based on DMTF0283 specification:
* https://www.dmtf.org/sites/default/files/standards/documents/DSP0283_1.0.1.pdf
* https://www.dmtf.org/sites/default/files/standards/documents/DSP0283_1.1.0.pdf
*
* These are protocol-level definitions, that may be shared between host
* and gadget drivers.
@ -17,10 +17,15 @@
#include <linux/skbuff.h>
#include <linux/types.h>
/*
* MCTP-over-USB transport header. DSP0283 v1.0 has an 8-bit length field
* (preceded by 8 reserved bits), v1.1 has a 13-bit length field (preceded by
* 3 reserved bits). We use a be16 for our length to handle the larger v1.1
* representation, and mask as appropriate.
*/
struct mctp_usb_hdr {
__be16 id;
u8 rsvd;
u8 len;
__be16 len;
} __packed;
/* max transfer size for DSP0283 v1.0 */