diff options
Diffstat (limited to 'class/wireless')
| -rw-r--r-- | class/wireless/usbd_rndis.c | 57 | ||||
| -rw-r--r-- | class/wireless/usbh_rndis.c | 265 |
2 files changed, 183 insertions, 139 deletions
diff --git a/class/wireless/usbd_rndis.c b/class/wireless/usbd_rndis.c index 5fceb98f..ea62c50e 100644 --- a/class/wireless/usbd_rndis.c +++ b/class/wireless/usbd_rndis.c @@ -28,7 +28,7 @@ struct usbd_rndis_priv { uint8_t mac[6]; } g_usbd_rndis; -#if CONFIG_USBDEV_RNDIS_RESP_BUFFER_SIZE < 140 +#if CONFIG_USBDEV_RNDIS_RESP_BUFFER_SIZE < 156 #undef CONFIG_USBDEV_RNDIS_RESP_BUFFER_SIZE #define CONFIG_USBDEV_RNDIS_RESP_BUFFER_SIZE 156 #endif @@ -112,8 +112,7 @@ static int rndis_class_interface_request_handler(uint8_t busid, struct usb_setup case CDC_REQUEST_SEND_ENCAPSULATED_COMMAND: g_usbd_rndis.set_rsp_get = true; - rndis_encapsulated_cmd_handler(*data, setup->wLength); - break; + return rndis_encapsulated_cmd_handler(*data, setup->wLength); case CDC_REQUEST_GET_ENCAPSULATED_RESPONSE: g_usbd_rndis.set_rsp_get = false; @@ -162,7 +161,9 @@ static int rndis_init_cmd_handler(uint8_t *data, uint32_t len) rndis_initialize_msg_t *cmd = (rndis_initialize_msg_t *)data; rndis_initialize_cmplt_t *resp; - (void)len; + if (len < sizeof(rndis_initialize_msg_t)) { + return -1; + } resp = ((rndis_initialize_cmplt_t *)rndis_encapsulated_resp_buffer); resp->RequestId = cmd->RequestId; @@ -190,7 +191,10 @@ static int rndis_halt_cmd_handler(uint8_t *data, uint32_t len) rndis_halt_msg_t *resp; (void)data; - (void)len; + + if (len < sizeof(rndis_halt_msg_t)) { + return -1; + } resp = ((rndis_halt_msg_t *)rndis_encapsulated_resp_buffer); resp->MessageLength = 0; @@ -207,7 +211,9 @@ static int rndis_query_cmd_handler(uint8_t *data, uint32_t len) uint8_t *infomation_buffer; uint32_t infomation_len = 0; - (void)len; + if (len < sizeof(rndis_query_msg_t)) { + return -1; + } resp = ((rndis_query_cmplt_t *)rndis_encapsulated_resp_buffer); resp->MessageType = REMOTE_NDIS_QUERY_CMPLT; @@ -354,8 +360,11 @@ static int rndis_set_cmd_handler(uint8_t *data, uint32_t len) rndis_set_msg_t *cmd = (rndis_set_msg_t *)data; rndis_set_cmplt_t *resp; rndis_config_parameter_t *param; + uint32_t *filter; - (void)len; + if (len < sizeof(rndis_set_msg_t)) { + return -1; + } resp = ((rndis_set_cmplt_t *)rndis_encapsulated_resp_buffer); resp->RequestId = cmd->RequestId; @@ -367,21 +376,12 @@ static int rndis_set_cmd_handler(uint8_t *data, uint32_t len) case OID_GEN_RNDIS_CONFIG_PARAMETER: break; case OID_GEN_CURRENT_PACKET_FILTER: - if (cmd->InformationBufferLength < sizeof(g_usbd_rndis.net_filter)) { - resp->Status = RNDIS_STATUS_INVALID_DATA; - } else { - uint32_t *filter; - /* Parameter starts at offset buf_offset of the req_id field */ - filter = (uint32_t *)((uint8_t *)&(cmd->RequestId) + cmd->InformationBufferOffset); - - //g_usbd_rndis.net_filter = param->ParameterNameOffset; - g_usbd_rndis.net_filter = *(uint32_t *)filter; - if (g_usbd_rndis.net_filter) { - g_usbd_rndis.init_state = rndis_data_initialized; - } else { - g_usbd_rndis.init_state = rndis_initialized; - } + if (len < (sizeof(rndis_set_msg_t) + cmd->InformationBufferLength)) { + return -1; } + + filter = (uint32_t *)(data + sizeof(rndis_set_msg_t)); + g_usbd_rndis.net_filter = *filter; break; case OID_GEN_CURRENT_LOOKAHEAD: break; @@ -409,7 +409,10 @@ static int rndis_reset_cmd_handler(uint8_t *data, uint32_t len) rndis_reset_cmplt_t *resp; (void)data; - (void)len; + + if (len < sizeof(rndis_reset_cmplt_t)) { + return -1; + } resp = ((rndis_reset_cmplt_t *)rndis_encapsulated_resp_buffer); resp->MessageType = REMOTE_NDIS_RESET_CMPLT; @@ -429,7 +432,9 @@ static int rndis_keepalive_cmd_handler(uint8_t *data, uint32_t len) rndis_keepalive_msg_t *cmd = (rndis_keepalive_msg_t *)data; rndis_keepalive_cmplt_t *resp; - (void)len; + if (len < sizeof(rndis_keepalive_msg_t)) { + return -1; + } resp = ((rndis_keepalive_cmplt_t *)rndis_encapsulated_resp_buffer); resp->RequestId = cmd->RequestId; @@ -512,7 +517,7 @@ int usbd_rndis_start_write(uint8_t *buf, uint32_t len) return -USB_ERR_BUSY; } - if((len % usbd_get_ep_mps(0, rndis_ep_data[RNDIS_IN_EP_IDX].ep_addr)) == 0) { + if ((len % usbd_get_ep_mps(0, rndis_ep_data[RNDIS_IN_EP_IDX].ep_addr)) == 0) { /* If the data length is a multiple of the endpoint max packet size, add one byte to indicate the end of the transfer. */ len += 1; } @@ -628,7 +633,7 @@ int usbd_rndis_set_connect(bool connect) return -USB_ERR_NOTCONN; } - if(g_usbd_rndis.set_rsp_get) + if (g_usbd_rndis.set_rsp_get) return -USB_ERR_BUSY; rndis_indicate_status_t *resp; @@ -636,7 +641,7 @@ int usbd_rndis_set_connect(bool connect) resp = ((rndis_indicate_status_t *)rndis_encapsulated_resp_buffer); resp->MessageType = REMOTE_NDIS_INDICATE_STATUS_MSG; resp->MessageLength = sizeof(rndis_indicate_status_t); - if(connect) { + if (connect) { resp->Status = RNDIS_STATUS_MEDIA_CONNECT; g_usbd_rndis.link_status = NDIS_MEDIA_STATE_CONNECTED; } else { diff --git a/class/wireless/usbh_rndis.c b/class/wireless/usbh_rndis.c index 709630cb..2e657af1 100644 --- a/class/wireless/usbh_rndis.c +++ b/class/wireless/usbh_rndis.c @@ -13,10 +13,11 @@ #define DEV_FORMAT "/dev/rndis" -USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t g_rndis_buf[512]; +#if CONFIG_USBHOST_RNDIS_ETH_MAX_RX_SIZE > (16 * 1024) +#error "CONFIG_USBHOST_RNDIS_ETH_MAX_RX_SIZE must be less than 16K" +#endif -#define CONFIG_USBHOST_RNDIS_ETH_MAX_FRAME_SIZE 1514 -#define CONFIG_USBHOST_RNDIS_ETH_MSG_SIZE (CONFIG_USBHOST_RNDIS_ETH_MAX_FRAME_SIZE + 44) +USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t g_rndis_buf[512]; static USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t g_rndis_rx_buffer[USB_ALIGN_UP(CONFIG_USBHOST_RNDIS_ETH_MAX_RX_SIZE, CONFIG_USB_ALIGN_SIZE)]; static USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t g_rndis_tx_buffer[USB_ALIGN_UP(CONFIG_USBHOST_RNDIS_ETH_MAX_TX_SIZE, CONFIG_USB_ALIGN_SIZE)]; @@ -39,12 +40,96 @@ static int usbh_rndis_get_notification(struct usbh_rndis *rndis_class) return 0; } +static int usbh_rndis_parse_resp(struct usbh_rndis *rndis_class) +{ + struct usb_setup_packet *setup; + rndis_generic_msg_t *resp_generic; + int ret; + + if (!rndis_class || !rndis_class->hport) { + return -USB_ERR_INVAL; + } + setup = rndis_class->hport->setup; + + usbh_rndis_get_notification(rndis_class); + + setup->bmRequestType = USB_REQUEST_DIR_IN | USB_REQUEST_CLASS | USB_REQUEST_RECIPIENT_INTERFACE; + setup->bRequest = CDC_REQUEST_GET_ENCAPSULATED_RESPONSE; + setup->wValue = 0; + setup->wIndex = 0; + setup->wLength = sizeof(g_rndis_buf); + + ret = usbh_control_transfer(rndis_class->hport, setup, g_rndis_buf); + if (ret < sizeof(rndis_generic_msg_t)) { + USB_LOG_ERR("resp recv error, ret: %d\r\n", ret); + return ret; + } + + resp_generic = (rndis_generic_msg_t *)g_rndis_buf; + if (resp_generic->MessageLength != ret) { + USB_LOG_ERR("resp length error, expect: %d, actual: %d\r\n", resp_generic->MessageLength, ret); + return -USB_ERR_RANGE; + } + + switch (resp_generic->MessageType) { + case REMOTE_NDIS_INITIALIZE_CMPLT: + if (ret != sizeof(rndis_initialize_cmplt_t)) { + return -USB_ERR_RANGE; + } + rndis_initialize_cmplt_t *resp_init; + + resp_init = (rndis_initialize_cmplt_t *)g_rndis_buf; + + rndis_class->max_transfer_pkts = resp_init->MaxPacketsPerTransfer; + rndis_class->max_transfer_size = resp_init->MaxTransferSize; + USB_LOG_INFO("MaxPacketsPerTransfer: %u\r\n", (unsigned int)resp_init->MaxPacketsPerTransfer); + USB_LOG_INFO("MaxTransferSize: %u\r\n", (unsigned int)resp_init->MaxTransferSize); + break; + case REMOTE_NDIS_QUERY_CMPLT: + if (ret < sizeof(rndis_query_cmplt_t)) { + return -USB_ERR_RANGE; + } + + rndis_query_cmplt_t *resp_query; + resp_query = (rndis_query_cmplt_t *)g_rndis_buf; + + if (ret != (sizeof(rndis_query_cmplt_t) + resp_query->InformationBufferLength)) { + return -USB_ERR_RANGE; + } + if (resp_query->InformationBufferOffset != (sizeof(rndis_query_cmplt_t) - sizeof(rndis_generic_msg_t))) { + return -USB_ERR_RANGE; + } + + break; + case REMOTE_NDIS_SET_CMPLT: + break; + case REMOTE_NDIS_RESET_CMPLT: + break; + case REMOTE_NDIS_KEEPALIVE_CMPLT: + break; + case REMOTE_NDIS_INDICATE_STATUS_MSG: + if (ret != sizeof(rndis_indicate_status_t)) { + return -USB_ERR_RANGE; + } + + rndis_indicate_status_t *resp_indicate; + resp_indicate = (rndis_indicate_status_t *)g_rndis_buf; + + rndis_class->connect_status = (resp_indicate->Status == RNDIS_STATUS_MEDIA_CONNECT) ? true : false; + break; + + default: + break; + } + + return ret; +} + static int usbh_rndis_init_msg_transfer(struct usbh_rndis *rndis_class) { struct usb_setup_packet *setup; - int ret = 0; + int ret; rndis_initialize_msg_t *cmd; - rndis_initialize_cmplt_t *resp; if (!rndis_class || !rndis_class->hport) { return -USB_ERR_INVAL; @@ -68,46 +153,36 @@ static int usbh_rndis_init_msg_transfer(struct usbh_rndis *rndis_class) ret = usbh_control_transfer(rndis_class->hport, setup, (uint8_t *)cmd); if (ret < 0) { - USB_LOG_ERR("init send error, ret: %d\r\n", ret); - return ret; - } - - usbh_rndis_get_notification(rndis_class); - - resp = (rndis_initialize_cmplt_t *)g_rndis_buf; - - setup->bmRequestType = USB_REQUEST_DIR_IN | USB_REQUEST_CLASS | USB_REQUEST_RECIPIENT_INTERFACE; - setup->bRequest = CDC_REQUEST_GET_ENCAPSULATED_RESPONSE; - setup->wValue = 0; - setup->wIndex = 0; - setup->wLength = sizeof(g_rndis_buf); - - ret = usbh_control_transfer(rndis_class->hport, setup, (uint8_t *)resp); - if (ret < 0) { - USB_LOG_ERR("init recv error, ret: %d\r\n", ret); + USB_LOG_ERR("init msg send error, ret: %d\r\n", ret); return ret; } - rndis_class->max_transfer_pkts = resp->MaxPacketsPerTransfer; - rndis_class->max_transfer_size = resp->MaxTransferSize; - USB_LOG_INFO("MaxPacketsPerTransfer: %u\r\n", (unsigned int)resp->MaxPacketsPerTransfer); - USB_LOG_INFO("MaxTransferSize: %u\r\n", (unsigned int)resp->MaxTransferSize); - - return ret; + return usbh_rndis_parse_resp(rndis_class); } -int usbh_rndis_query_msg_transfer(struct usbh_rndis *rndis_class, uint32_t oid, uint32_t query_len, uint8_t *info, uint32_t *info_len) +static int usbh_rndis_query_msg_transfer(struct usbh_rndis *rndis_class, + uint32_t oid, + uint32_t query_len, + uint8_t *info, + uint32_t info_max_len, + uint32_t *info_len) { struct usb_setup_packet *setup; - int ret = 0; + int ret; rndis_query_msg_t *cmd; rndis_query_cmplt_t *resp; if (!rndis_class || !rndis_class->hport) { return -USB_ERR_INVAL; } + + if(query_len > (sizeof(g_rndis_buf) - sizeof(rndis_query_msg_t))) { + return -USB_ERR_NOMEM; + } + setup = rndis_class->hport->setup; + cmd = (rndis_query_msg_t *)g_rndis_buf; cmd->MessageType = REMOTE_NDIS_QUERY_MSG; @@ -126,26 +201,29 @@ int usbh_rndis_query_msg_transfer(struct usbh_rndis *rndis_class, uint32_t oid, ret = usbh_control_transfer(rndis_class->hport, setup, (uint8_t *)cmd); if (ret < 0) { - USB_LOG_ERR("oid:%08x send error, ret: %d\r\n", (unsigned int)oid, ret); + USB_LOG_ERR("query oid:%08x msg send error, ret: %d\r\n", (unsigned int)oid, ret); return ret; } - usbh_rndis_get_notification(rndis_class); + ret = usbh_rndis_parse_resp(rndis_class); + if (ret < 0) { + return ret; + } resp = (rndis_query_cmplt_t *)g_rndis_buf; - setup->bmRequestType = USB_REQUEST_DIR_IN | USB_REQUEST_CLASS | USB_REQUEST_RECIPIENT_INTERFACE; - setup->bRequest = CDC_REQUEST_GET_ENCAPSULATED_RESPONSE; - setup->wValue = 0; - setup->wIndex = 0; - setup->wLength = sizeof(g_rndis_buf); - - ret = usbh_control_transfer(rndis_class->hport, setup, (uint8_t *)resp); - if (ret < 0) { - USB_LOG_ERR("oid:%08x recv error, ret: %d\r\n", (unsigned int)oid, ret); + if(resp->MessageType != REMOTE_NDIS_QUERY_CMPLT) { return ret; } + if (query_len != 0 && resp->InformationBufferLength != query_len) { + return -USB_ERR_RANGE; + } + + if (resp->InformationBufferLength > info_max_len) { + return -USB_ERR_NOMEM; + } + memcpy(info, ((uint8_t *)resp + sizeof(rndis_query_cmplt_t)), resp->InformationBufferLength); *info_len = resp->InformationBufferLength; @@ -155,13 +233,17 @@ int usbh_rndis_query_msg_transfer(struct usbh_rndis *rndis_class, uint32_t oid, static int usbh_rndis_set_msg_transfer(struct usbh_rndis *rndis_class, uint32_t oid, uint8_t *info, uint32_t info_len) { struct usb_setup_packet *setup; - int ret = 0; + int ret; rndis_set_msg_t *cmd; - rndis_set_cmplt_t *resp; if (!rndis_class || !rndis_class->hport) { return -USB_ERR_INVAL; } + + if(info_len > (sizeof(g_rndis_buf) - sizeof(rndis_set_msg_t))) { + return -USB_ERR_NOMEM; + } + setup = rndis_class->hport->setup; cmd = (rndis_set_msg_t *)g_rndis_buf; @@ -187,35 +269,24 @@ static int usbh_rndis_set_msg_transfer(struct usbh_rndis *rndis_class, uint32_t return ret; } - usbh_rndis_get_notification(rndis_class); - - resp = (rndis_set_cmplt_t *)g_rndis_buf; - - setup->bmRequestType = USB_REQUEST_DIR_IN | USB_REQUEST_CLASS | USB_REQUEST_RECIPIENT_INTERFACE; - setup->bRequest = CDC_REQUEST_GET_ENCAPSULATED_RESPONSE; - setup->wValue = 0; - setup->wIndex = 0; - setup->wLength = sizeof(g_rndis_buf); - - ret = usbh_control_transfer(rndis_class->hport, setup, (uint8_t *)resp); - if (ret < 0) { - USB_LOG_ERR("oid:%08x recv error, ret: %d\r\n", (unsigned int)oid, ret); - return ret; - } - - return ret; + return usbh_rndis_parse_resp(rndis_class); } int usbh_rndis_get_connect_status(struct usbh_rndis *rndis_class) { int ret; - uint8_t data[32]; + uint8_t data[4]; uint32_t data_len; - ret = usbh_rndis_query_msg_transfer(rndis_class, OID_GEN_MEDIA_CONNECT_STATUS, 4, data, &data_len); + ret = usbh_rndis_query_msg_transfer(rndis_class, OID_GEN_MEDIA_CONNECT_STATUS, 4, data, sizeof(data), &data_len); if (ret < 0) { return ret; } + + if (ret == sizeof(rndis_indicate_status_t)) { + return 0; + } + if (NDIS_MEDIA_STATE_CONNECTED == data[0]) { rndis_class->connect_status = true; } else { @@ -229,7 +300,6 @@ int usbh_rndis_keepalive(struct usbh_rndis *rndis_class) struct usb_setup_packet *setup; int ret = 0; rndis_keepalive_msg_t *cmd; - rndis_keepalive_cmplt_t *resp; if (!rndis_class || !rndis_class->hport) { return -USB_ERR_INVAL; @@ -254,23 +324,7 @@ int usbh_rndis_keepalive(struct usbh_rndis *rndis_class) return ret; } - usbh_rndis_get_notification(rndis_class); - - resp = (rndis_keepalive_cmplt_t *)g_rndis_buf; - - setup->bmRequestType = USB_REQUEST_DIR_IN | USB_REQUEST_CLASS | USB_REQUEST_RECIPIENT_INTERFACE; - setup->bRequest = CDC_REQUEST_GET_ENCAPSULATED_RESPONSE; - setup->wValue = 0; - setup->wIndex = 0; - setup->wLength = sizeof(g_rndis_buf); - - ret = usbh_control_transfer(rndis_class->hport, setup, (uint8_t *)resp); - if (ret < 0) { - USB_LOG_ERR("keepalive recv error, ret: %d\r\n", ret); - return ret; - } - - return ret; + return usbh_rndis_parse_resp(rndis_class); } static int usbh_rndis_connect(struct usbh_hubport *hport, uint8_t intf) @@ -282,7 +336,7 @@ static int usbh_rndis_connect(struct usbh_hubport *hport, uint8_t intf) uint32_t oid_num = 0; uint32_t data_len; uint8_t tmp_buffer[512]; - uint8_t data[32]; + uint8_t data[6]; struct usbh_rndis *rndis_class = &g_rndis_class; @@ -313,7 +367,7 @@ static int usbh_rndis_connect(struct usbh_hubport *hport, uint8_t intf) return ret; } - ret = usbh_rndis_query_msg_transfer(rndis_class, OID_GEN_SUPPORTED_LIST, 0, tmp_buffer, &data_len); + ret = usbh_rndis_query_msg_transfer(rndis_class, OID_GEN_SUPPORTED_LIST, 0, tmp_buffer, sizeof(tmp_buffer), &data_len); if (ret < 0) { return ret; } @@ -326,19 +380,19 @@ static int usbh_rndis_connect(struct usbh_hubport *hport, uint8_t intf) oid = oid_support_list[i]; switch (oid) { case OID_GEN_PHYSICAL_MEDIUM: - ret = usbh_rndis_query_msg_transfer(rndis_class, OID_GEN_PHYSICAL_MEDIUM, 4, data, &data_len); + ret = usbh_rndis_query_msg_transfer(rndis_class, OID_GEN_PHYSICAL_MEDIUM, 4, data, sizeof(data), &data_len); if (ret < 0) { goto query_errorout; } break; case OID_GEN_MAXIMUM_FRAME_SIZE: - ret = usbh_rndis_query_msg_transfer(rndis_class, OID_GEN_MAXIMUM_FRAME_SIZE, 4, data, &data_len); + ret = usbh_rndis_query_msg_transfer(rndis_class, OID_GEN_MAXIMUM_FRAME_SIZE, 4, data, sizeof(data), &data_len); if (ret < 0) { goto query_errorout; } break; case OID_GEN_LINK_SPEED: - ret = usbh_rndis_query_msg_transfer(rndis_class, OID_GEN_LINK_SPEED, 4, data, &data_len); + ret = usbh_rndis_query_msg_transfer(rndis_class, OID_GEN_LINK_SPEED, 4, data, sizeof(data), &data_len); if (ret < 0) { goto query_errorout; } @@ -346,7 +400,7 @@ static int usbh_rndis_connect(struct usbh_hubport *hport, uint8_t intf) memcpy(&rndis_class->link_speed, data, 4); break; case OID_GEN_MEDIA_CONNECT_STATUS: - ret = usbh_rndis_query_msg_transfer(rndis_class, OID_GEN_MEDIA_CONNECT_STATUS, 4, data, &data_len); + ret = usbh_rndis_query_msg_transfer(rndis_class, OID_GEN_MEDIA_CONNECT_STATUS, 4, data, sizeof(data), &data_len); if (ret < 0) { goto query_errorout; } @@ -357,13 +411,13 @@ static int usbh_rndis_connect(struct usbh_hubport *hport, uint8_t intf) } break; case OID_802_3_MAXIMUM_LIST_SIZE: - ret = usbh_rndis_query_msg_transfer(rndis_class, OID_802_3_MAXIMUM_LIST_SIZE, 4, data, &data_len); + ret = usbh_rndis_query_msg_transfer(rndis_class, OID_802_3_MAXIMUM_LIST_SIZE, 4, data, sizeof(data), &data_len); if (ret < 0) { goto query_errorout; } break; case OID_802_3_CURRENT_ADDRESS: - ret = usbh_rndis_query_msg_transfer(rndis_class, OID_802_3_CURRENT_ADDRESS, 6, data, &data_len); + ret = usbh_rndis_query_msg_transfer(rndis_class, OID_802_3_CURRENT_ADDRESS, 6, data, sizeof(data), &data_len); if (ret < 0) { goto query_errorout; } @@ -373,7 +427,7 @@ static int usbh_rndis_connect(struct usbh_hubport *hport, uint8_t intf) } break; case OID_802_3_PERMANENT_ADDRESS: - ret = usbh_rndis_query_msg_transfer(rndis_class, OID_802_3_PERMANENT_ADDRESS, 6, data, &data_len); + ret = usbh_rndis_query_msg_transfer(rndis_class, OID_802_3_PERMANENT_ADDRESS, 6, data, sizeof(data), &data_len); if (ret < 0) { goto query_errorout; } @@ -451,11 +505,6 @@ void usbh_rndis_rx_thread(CONFIG_USB_OSAL_THREAD_SET_ARGV) uint32_t pmg_offset; rndis_data_packet_t *pmsg; rndis_data_packet_t temp; -#if CONFIG_USBHOST_RNDIS_ETH_MAX_RX_SIZE <= (16 * 1024) - uint32_t transfer_size = CONFIG_USBHOST_RNDIS_ETH_MAX_RX_SIZE; -#else - uint32_t transfer_size = (16 * 1024); -#endif (void)CONFIG_USB_OSAL_THREAD_GET_ARGV; @@ -479,22 +528,21 @@ find_class: g_rndis_rx_length = 0; while (1) { - usbh_bulk_urb_fill(&g_rndis_class.bulkin_urb, g_rndis_class.hport, g_rndis_class.bulkin, &g_rndis_rx_buffer[g_rndis_rx_length], transfer_size, USB_OSAL_WAITING_FOREVER, NULL, NULL); + usbh_bulk_urb_fill(&g_rndis_class.bulkin_urb, g_rndis_class.hport, g_rndis_class.bulkin, g_rndis_rx_buffer, CONFIG_USBHOST_RNDIS_ETH_MAX_RX_SIZE, USB_OSAL_WAITING_FOREVER, NULL, NULL); ret = usbh_submit_urb(&g_rndis_class.bulkin_urb); if (ret < 0) { break; } - g_rndis_rx_length += g_rndis_class.bulkin_urb.actual_length; + g_rndis_rx_length = g_rndis_class.bulkin_urb.actual_length; + if (g_rndis_rx_length == 0) { + USB_LOG_WRN("rndis rx length is 0 but no zero required in spec\r\n"); + continue; + } - /* A transfer is complete because last packet is a short packet. - * Short packet is not zero, match g_rndis_rx_length % USB_GET_MAXPACKETSIZE(g_rndis_class.bulkin->wMaxPacketSize). - * Short packet cannot be zero. - */ if (g_rndis_rx_length % USB_GET_MAXPACKETSIZE(g_rndis_class.bulkin->wMaxPacketSize)) { pmg_offset = 0; - - uint32_t total_len = g_rndis_rx_length; + USB_LOG_DBG("rxlen:%d\r\n", g_rndis_rx_length); while (g_rndis_rx_length > 0) { USB_LOG_DBG("rxlen:%u\r\n", (unsigned int)g_rndis_rx_length); @@ -519,21 +567,12 @@ find_class: g_rndis_rx_length = 0; } } else { - USB_LOG_ERR("offset:%u,remain:%u,total:%u\r\n", (unsigned int)pmg_offset, (unsigned int)g_rndis_rx_length, (unsigned int)total_len); + USB_LOG_ERR("Error rndis packet message, offset:%u, remain:%u\r\n", (unsigned int)pmg_offset, (unsigned int)g_rndis_rx_length); g_rndis_rx_length = 0; - USB_LOG_ERR("Error rndis packet message\r\n"); } } } else { -#if CONFIG_USBHOST_RNDIS_ETH_MAX_RX_SIZE <= (16 * 1024) - if (g_rndis_rx_length == CONFIG_USBHOST_RNDIS_ETH_MAX_RX_SIZE) { -#else - if ((g_rndis_rx_length + (16 * 1024)) > CONFIG_USBHOST_RNDIS_ETH_MAX_RX_SIZE) { -#endif - USB_LOG_ERR("Rx packet is overflow, please reduce tcp window size or increase CONFIG_USBHOST_RNDIS_ETH_MAX_RX_SIZE\r\n"); - while (1) { - } - } + USB_LOG_ERR("rndis packet overflow\r\n"); } } |
