summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsakumisu <[email protected]>2024-04-28 19:54:53 +0800
committersakumisu <[email protected]>2024-04-28 19:54:53 +0800
commit6abe6befa86af32f055289d7735eaeb8199caec4 (patch)
treeea0da749326af2f77e898c31460c818655e8f2b9
parent7ee77b42ee9171f4eba587b128a28e52b581b904 (diff)
fix rndis msg when mss is larger than rndis rx size
-rw-r--r--class/wireless/usbh_rndis.c59
1 files changed, 31 insertions, 28 deletions
diff --git a/class/wireless/usbh_rndis.c b/class/wireless/usbh_rndis.c
index 1a13b2f0..bc0e71f5 100644
--- a/class/wireless/usbh_rndis.c
+++ b/class/wireless/usbh_rndis.c
@@ -467,43 +467,46 @@ find_class:
goto find_class;
}
- g_rndis_rx_length = g_rndis_class.bulkin_urb.actual_length;
- pmg_offset = 0;
- while (g_rndis_rx_length > 0) {
- USB_LOG_DBG("rxlen:%d\r\n", g_rndis_rx_length);
+ g_rndis_rx_length += g_rndis_class.bulkin_urb.actual_length;
+ if (g_rndis_rx_length % USB_GET_MAXPACKETSIZE(g_rndis_class.bulkin->wMaxPacketSize)) {
+ pmg_offset = 0;
+ while (g_rndis_rx_length > 0) {
+ USB_LOG_DBG("rxlen:%d\r\n", g_rndis_rx_length);
- pmsg = (rndis_data_packet_t *)(g_rndis_rx_buffer + pmg_offset);
+ pmsg = (rndis_data_packet_t *)(g_rndis_rx_buffer + pmg_offset);
- /* Not word-aligned case */
- if (pmg_offset & 0x3) {
- memcpy(&temp, pmsg, sizeof(rndis_data_packet_t));
- pmsg = &temp;
- }
+ /* Not word-aligned case */
+ if (pmg_offset & 0x3) {
+ memcpy(&temp, pmsg, sizeof(rndis_data_packet_t));
+ pmsg = &temp;
+ }
- if (pmsg->MessageType == REMOTE_NDIS_PACKET_MSG) {
- p = pbuf_alloc(PBUF_RAW, pmsg->DataLength, PBUF_POOL);
- if (p != NULL) {
- payload_offset = 0;
- for (q = p; q != NULL; q = q->next) {
- void *src = (void *)(g_rndis_rx_buffer + pmg_offset + sizeof(rndis_generic_msg_t) + pmsg->DataOffset + payload_offset);
- memcpy(q->payload, src, q->len);
- payload_offset += q->len;
- }
+ if (pmsg->MessageType == REMOTE_NDIS_PACKET_MSG) {
+ p = pbuf_alloc(PBUF_RAW, pmsg->DataLength, PBUF_POOL);
+ if (p != NULL) {
+ payload_offset = 0;
+ for (q = p; q != NULL; q = q->next) {
+ void *src = (void *)(g_rndis_rx_buffer + pmg_offset + sizeof(rndis_generic_msg_t) + pmsg->DataOffset + payload_offset);
+ memcpy(q->payload, src, q->len);
+ payload_offset += q->len;
+ }
- err = netif->input(p, netif);
- if (err != ERR_OK) {
- pbuf_free(p);
+ err = netif->input(p, netif);
+ if (err != ERR_OK) {
+ pbuf_free(p);
+ }
+ pmg_offset += pmsg->MessageLength;
+ g_rndis_rx_length -= pmsg->MessageLength;
+ } else {
+ g_rndis_rx_length = 0;
+ USB_LOG_ERR("No memory to alloc pbuf for rndis rx\r\n");
}
- pmg_offset += pmsg->MessageLength;
- g_rndis_rx_length -= pmsg->MessageLength;
} else {
g_rndis_rx_length = 0;
- USB_LOG_ERR("No memory to alloc pbuf for rndis rx\r\n");
+ USB_LOG_ERR("Error rndis packet message\r\n");
}
- } else {
- g_rndis_rx_length = 0;
- USB_LOG_ERR("Error rndis packet message\r\n");
}
+ } else {
}
}