From 9ce7b0ceb7a73d932a0d3280b26946ecd7a7780a Mon Sep 17 00:00:00 2001 From: sakumisu <1203593632@qq.com> Date: Mon, 13 Nov 2023 19:54:05 +0800 Subject: [PATCH] fix rndis query & set msg wLength, only support one rndis device --- cherryusb_config_template.h | 1 - class/wireless/usbh_rndis.c | 46 ++++++++----------------------------- 2 files changed, 9 insertions(+), 38 deletions(-) diff --git a/cherryusb_config_template.h b/cherryusb_config_template.h index 1d1f0556..074cedb8 100644 --- a/cherryusb_config_template.h +++ b/cherryusb_config_template.h @@ -102,7 +102,6 @@ #define CONFIG_USBHOST_MAX_MSC_CLASS 2 #define CONFIG_USBHOST_MAX_AUDIO_CLASS 1 #define CONFIG_USBHOST_MAX_VIDEO_CLASS 1 -#define CONFIG_USBHOST_MAX_RNDIS_CLASS 1 #define CONFIG_USBHOST_DEV_NAMELEN 16 diff --git a/class/wireless/usbh_rndis.c b/class/wireless/usbh_rndis.c index 36c56839..762fc6e9 100644 --- a/class/wireless/usbh_rndis.c +++ b/class/wireless/usbh_rndis.c @@ -7,37 +7,11 @@ #include "usbh_rndis.h" #include "rndis_protocol.h" -#define DEV_FORMAT "/dev/rndis%d" +#define DEV_FORMAT "/dev/rndis" USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t g_rndis_buf[4096]; -static struct usbh_rndis g_rndis_class[CONFIG_USBHOST_MAX_RNDIS_CLASS]; -static uint32_t g_devinuse = 0; - -static struct usbh_rndis *usbh_rndis_class_alloc(void) -{ - int devno; - - for (devno = 0; devno < CONFIG_USBHOST_MAX_RNDIS_CLASS; devno++) { - if ((g_devinuse & (1 << devno)) == 0) { - g_devinuse |= (1 << devno); - memset(&g_rndis_class[devno], 0, sizeof(struct usbh_rndis)); - g_rndis_class[devno].minor = devno; - return &g_rndis_class[devno]; - } - } - return NULL; -} - -static void usbh_rndis_class_free(struct usbh_rndis *rndis_class) -{ - int devno = rndis_class->minor; - - if (devno >= 0 && devno < 32) { - g_devinuse &= ~(1 << devno); - } - memset(rndis_class, 0, sizeof(struct usbh_rndis)); -} +static struct usbh_rndis g_rndis_class; static int usbh_rndis_init_msg_transfer(struct usbh_rndis *rndis_class) { @@ -107,7 +81,7 @@ int usbh_rndis_query_msg_transfer(struct usbh_rndis *rndis_class, uint32_t oid, setup->bRequest = CDC_REQUEST_SEND_ENCAPSULATED_COMMAND; setup->wValue = 0; setup->wIndex = 0; - setup->wLength = sizeof(rndis_query_msg_t); + setup->wLength = query_len + sizeof(rndis_query_msg_t); ret = usbh_control_transfer(rndis_class->hport->ep0, setup, (uint8_t *)cmd); if (ret < 0) { @@ -159,7 +133,7 @@ static int usbh_rndis_set_msg_transfer(struct usbh_rndis *rndis_class, uint32_t setup->bRequest = CDC_REQUEST_SEND_ENCAPSULATED_COMMAND; setup->wValue = 0; setup->wIndex = 0; - setup->wLength = sizeof(rndis_set_msg_t); + setup->wLength = info_len + sizeof(rndis_set_msg_t); ret = usbh_control_transfer(rndis_class->hport->ep0, setup, (uint8_t *)cmd); if (ret < 0) { @@ -269,11 +243,9 @@ static int usbh_rndis_connect(struct usbh_hubport *hport, uint8_t intf) uint8_t tmp_buffer[512]; uint8_t data[32]; - struct usbh_rndis *rndis_class = usbh_rndis_class_alloc(); - if (rndis_class == NULL) { - USB_LOG_ERR("Fail to alloc rndis_class\r\n"); - return -ENOMEM; - } + struct usbh_rndis *rndis_class = &g_rndis_class; + + memset(rndis_class, 0, sizeof(struct usbh_rndis)); rndis_class->hport = hport; rndis_class->ctrl_intf = intf; @@ -388,7 +360,7 @@ static int usbh_rndis_connect(struct usbh_hubport *hport, uint8_t intf) } USB_LOG_INFO("rndis set OID_802_3_MULTICAST_LIST success\r\n"); - snprintf(hport->config.intf[intf].devname, CONFIG_USBHOST_DEV_NAMELEN, DEV_FORMAT, rndis_class->minor); + memcpy(hport->config.intf[intf].devname, DEV_FORMAT, CONFIG_USBHOST_DEV_NAMELEN); USB_LOG_INFO("Register RNDIS Class:%s\r\n", hport->config.intf[intf].devname); usbh_rndis_run(rndis_class); @@ -418,7 +390,7 @@ static int usbh_rndis_disconnect(struct usbh_hubport *hport, uint8_t intf) usbh_rndis_stop(rndis_class); } - usbh_rndis_class_free(rndis_class); + memset(rndis_class, 0, sizeof(struct usbh_rndis)); } return ret;