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 --- v2: - fix short packet (hdr) debug message: use endian-converted value --- drivers/net/mctp/mctp-usblib.c | 14 ++++++++------ include/linux/usb/mctp-usb.h | 11 ++++++++--- 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/drivers/net/mctp/mctp-usblib.c b/drivers/net/mctp/mctp-usblib.c index 2e464254353e..d58178f47c06 100644 --- a/drivers/net/mctp/mctp-usblib.c +++ b/drivers/net/mctp/mctp-usblib.c @@ -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; } diff --git a/include/linux/usb/mctp-usb.h b/include/linux/usb/mctp-usb.h index 2e1cde6a6745..1a5e795b4ec1 100644 --- a/include/linux/usb/mctp-usb.h +++ b/include/linux/usb/mctp-usb.h @@ -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 #include +/* + * 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 */ -- 2.47.3