From 7f128c52865d6aa978ad74e0d96e3fd6ff78fdd7 Mon Sep 17 00:00:00 2001 From: zvecr Date: Wed, 30 Mar 2022 02:09:19 +0100 Subject: [PATCH] Remove some assumptions on packet format --- quantum/xap/xap.h | 12 ++++++++++++ tmk_core/protocol/chibios/usb_main.c | 26 ++++++++++++++------------ tmk_core/protocol/lufa/lufa.c | 24 +++++++++++++----------- tmk_core/protocol/vusb/vusb.c | 24 +++++++++++++----------- 4 files changed, 52 insertions(+), 34 deletions(-) diff --git a/quantum/xap/xap.h b/quantum/xap/xap.h index f3cab6aef2..67e41d31ea 100644 --- a/quantum/xap/xap.h +++ b/quantum/xap/xap.h @@ -41,4 +41,16 @@ bool xap_respond_data_P(xap_token_t token, const void *data, size_t length); void xap_send(xap_token_t token, xap_response_flags_t response_flags, const void *data, size_t length); +// TODO: gen from xap defs? +typedef struct { + xap_token_t token; + uint8_t length; +} xap_request_header_t; + +typedef struct { + xap_token_t token; + xap_response_flags_t flags; + uint8_t length; +} xap_response_header_t; + #include diff --git a/tmk_core/protocol/chibios/usb_main.c b/tmk_core/protocol/chibios/usb_main.c index a95ca79da9..32de4622c1 100644 --- a/tmk_core/protocol/chibios/usb_main.c +++ b/tmk_core/protocol/chibios/usb_main.c @@ -113,7 +113,7 @@ static const USBDescriptor *usb_get_descriptor_cb(USBDriver *usbp, uint8_t dtype static USBDescriptor desc; uint16_t wValue = ((uint16_t)dtype << 8) | dindex; desc.ud_string = NULL; - desc.ud_size = get_usb_descriptor(wValue, wIndex, (const void **const) & desc.ud_string); + desc.ud_size = get_usb_descriptor(wValue, wIndex, (const void **const)&desc.ud_string); if (desc.ud_string == NULL) return NULL; else @@ -1138,25 +1138,27 @@ void xap_send_base(uint8_t *data, uint8_t length) { } void xap_send(xap_token_t token, uint8_t response_flags, const void *data, size_t length) { - uint8_t rdata[XAP_EPSIZE] = {0}; - *(xap_token_t *)&rdata[0] = token; - if (length > (XAP_EPSIZE - 4)) response_flags &= ~(XAP_RESPONSE_FLAG_SUCCESS); - rdata[2] = response_flags; + uint8_t rdata[XAP_EPSIZE] = {0}; + xap_response_header_t *header = (xap_response_header_t *)&rdata[0]; + header->token = token; + + if (length > (XAP_EPSIZE - sizeof(xap_response_header_t))) response_flags &= ~(XAP_RESPONSE_FLAG_SUCCESS); + header->flags = response_flags; + if (response_flags & (XAP_RESPONSE_FLAG_SUCCESS)) { - rdata[3] = (uint8_t)length; + header->length = (uint8_t)length; if (data != NULL) { - memcpy(&rdata[4], data, length); + memcpy(&rdata[sizeof(xap_response_header_t)], data, length); } } xap_send_base(rdata, sizeof(rdata)); } void xap_receive_base(const void *data) { - const uint8_t *u8data = (const uint8_t *)data; - xap_token_t token = *(xap_token_t *)&u8data[0]; - uint8_t length = u8data[2]; - if (length <= (XAP_EPSIZE - 3)) { - xap_receive(token, &u8data[3], length); + const uint8_t *u8data = (const uint8_t *)data; + xap_request_header_t *header = (xap_request_header_t *)&u8data[0]; + if (header->length <= (XAP_EPSIZE - sizeof(xap_request_header_t))) { + xap_receive(header->token, &u8data[sizeof(xap_request_header_t)], header->length); } } diff --git a/tmk_core/protocol/lufa/lufa.c b/tmk_core/protocol/lufa/lufa.c index 0dcf1036c4..b3fe89c319 100644 --- a/tmk_core/protocol/lufa/lufa.c +++ b/tmk_core/protocol/lufa/lufa.c @@ -244,25 +244,27 @@ void xap_send_base(uint8_t *data, uint8_t length) { } void xap_send(xap_token_t token, uint8_t response_flags, const void *data, size_t length) { - uint8_t rdata[XAP_EPSIZE] = {0}; - *(xap_token_t *)&rdata[0] = token; - if (length > (XAP_EPSIZE - 4)) response_flags &= ~(XAP_RESPONSE_FLAG_SUCCESS); - rdata[2] = response_flags; + uint8_t rdata[XAP_EPSIZE] = {0}; + xap_response_header_t *header = (xap_response_header_t *)&rdata[0]; + header->token = token; + + if (length > (XAP_EPSIZE - sizeof(xap_response_header_t))) response_flags &= ~(XAP_RESPONSE_FLAG_SUCCESS); + header->flags = response_flags; + if (response_flags & (XAP_RESPONSE_FLAG_SUCCESS)) { - rdata[3] = (uint8_t)length; + header->length = (uint8_t)length; if (data != NULL) { - memcpy(&rdata[4], data, length); + memcpy(&rdata[sizeof(xap_response_header_t)], data, length); } } xap_send_base(rdata, sizeof(rdata)); } void xap_receive_base(const void *data) { - const uint8_t *u8data = (const uint8_t *)data; - xap_token_t token = *(xap_token_t *)&u8data[0]; - uint8_t length = u8data[2]; - if (length <= (XAP_EPSIZE - 3)) { - xap_receive(token, &u8data[3], length); + const uint8_t *u8data = (const uint8_t *)data; + xap_request_header_t *header = (xap_request_header_t *)&u8data[0]; + if (header->length <= (XAP_EPSIZE - sizeof(xap_request_header_t))) { + xap_receive(header->token, &u8data[sizeof(xap_request_header_t)], header->length); } } diff --git a/tmk_core/protocol/vusb/vusb.c b/tmk_core/protocol/vusb/vusb.c index 8e120b4ca9..6cf451144f 100644 --- a/tmk_core/protocol/vusb/vusb.c +++ b/tmk_core/protocol/vusb/vusb.c @@ -205,25 +205,27 @@ void xap_send_base(uint8_t *data, uint8_t length) { } void xap_send(xap_token_t token, uint8_t response_flags, const void *data, size_t length) { - uint8_t rdata[XAP_BUFFER_SIZE] = {0}; - *(xap_token_t *)&rdata[0] = token; - if (length > (XAP_BUFFER_SIZE - 4)) response_flags &= ~(XAP_RESPONSE_FLAG_SUCCESS); - rdata[2] = response_flags; + uint8_t rdata[XAP_BUFFER_SIZE] = {0}; + xap_response_header_t *header = (xap_response_header_t *)&rdata[0]; + header->token = token; + + if (length > (XAP_BUFFER_SIZE - sizeof(xap_response_header_t))) response_flags &= ~(XAP_RESPONSE_FLAG_SUCCESS); + header->flags = response_flags; + if (response_flags & (XAP_RESPONSE_FLAG_SUCCESS)) { - rdata[3] = (uint8_t)length; + header->length = (uint8_t)length; if (data != NULL) { - memcpy(&rdata[4], data, length); + memcpy(&rdata[sizeof(xap_response_header_t)], data, length); } } xap_send_base(rdata, sizeof(rdata)); } void xap_receive_base(const void *data) { - const uint8_t *u8data = (const uint8_t *)data; - xap_token_t token = *(xap_token_t *)&u8data[0]; - uint8_t length = u8data[2]; - if (length <= (XAP_BUFFER_SIZE - 3)) { - xap_receive(token, &u8data[3], length); + const uint8_t *u8data = (const uint8_t *)data; + xap_request_header_t *header = (xap_request_header_t *)&u8data[0]; + if (header->length <= (XAP_BUFFER_SIZE - sizeof(xap_request_header_t))) { + xap_receive(header->token, &u8data[sizeof(xap_request_header_t)], header->length); } }