mirror of
https://github.com/torvalds/linux.git
synced 2026-09-23 13:14:02 +02:00
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:
parent
76a58ffd74
commit
f5bf226f3c
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 */
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user