From d27077245be6063cdc05e40f549f5b60bae18fdd Mon Sep 17 00:00:00 2001 From: Arti Zirk Date: Thu, 30 Jun 2022 22:55:25 +0300 Subject: [PATCH] Fix NDIS oid query --- src/main.c | 2 +- src/rndis.c | 45 ++++++++++++++++++++------------------------- 2 files changed, 21 insertions(+), 26 deletions(-) diff --git a/src/main.c b/src/main.c index 9e13bec..e047375 100644 --- a/src/main.c +++ b/src/main.c @@ -10,7 +10,7 @@ int main(void) { usbd_device *usbd_dev; - SEGGER_RTT_printf(0, "Hello World\n"); + SEGGER_RTT_printf(0, "\nHello World\n"); rcc_clock_setup_pll(&rcc_hse_configs[RCC_CLOCK_HSE8_72MHZ]); diff --git a/src/rndis.c b/src/rndis.c index 49e58f6..9520c0b 100644 --- a/src/rndis.c +++ b/src/rndis.c @@ -160,8 +160,7 @@ static const char *usb_strings[] = { static void rndis_query_cmplt32(uint8_t **buf, uint32_t status, uint32_t data) { - rndis_query_cmplt_t *c; - c = (rndis_query_cmplt_t *)buf; + rndis_query_cmplt_t *c = (rndis_query_cmplt_t *)*buf; c->MessageType = REMOTE_NDIS_QUERY_CMPLT; c->MessageLength = sizeof(rndis_query_cmplt_t) + 4; c->Status = status; @@ -171,8 +170,7 @@ static void rndis_query_cmplt32(uint8_t **buf, uint32_t status, uint32_t data) } static void rndis_query_cmplt(uint8_t **buf, uint32_t status, const void *data, uint32_t size){ - rndis_query_cmplt_t *c; - c = (rndis_query_cmplt_t *)buf; + rndis_query_cmplt_t *c = (rndis_query_cmplt_t *)*buf; c->MessageType = REMOTE_NDIS_QUERY_CMPLT; c->MessageLength = sizeof(rndis_query_cmplt_t) + size; c->Status = status; @@ -191,15 +189,19 @@ static void rndis_handle_query(uint8_t **buf, uint16_t *len) } u; u.buf = *buf; + SEGGER_RTT_printf(0, "NDIS Query oid: 0x%08x, len: 0x%02x\n", u.get->Oid, u.get->InformationBufferLength); switch (u.get->Oid) { case OID_GEN_PHYSICAL_MEDIUM: - //rndis_query_cmplt32(buf, RNDIS_STATUS_SUCCESS, NDIS_MEDIUM_802_3); + rndis_query_cmplt32(buf, RNDIS_STATUS_SUCCESS, NDIS_MEDIUM_802_3); return; case OID_802_3_PERMANENT_ADDRESS: - //rndis_query_cmplt(buf, RNDIS_STATUS_SUCCESS, &permanent_hwaddr, sizeof(permanent_hwaddr)); + rndis_query_cmplt(buf, RNDIS_STATUS_SUCCESS, &permanent_hwaddr, sizeof(permanent_hwaddr)); + return; + default: + rndis_query_cmplt(buf, RNDIS_STATUS_FAILURE, NULL, 0); return; } } @@ -207,6 +209,9 @@ static void rndis_handle_query(uint8_t **buf, uint16_t *len) static enum usbd_request_return_codes rndis_control_request(usbd_device *usbd_dev, struct usb_setup_data *req, uint8_t **buf, uint16_t *len, void (**complete)(usbd_device *usbd_dev, struct usb_setup_data *req)) { + (void)req; + (void)complete; + union { void *buf; rndis_generic_msg_t *header; @@ -216,6 +221,7 @@ static enum usbd_request_return_codes rndis_control_request(usbd_device *usbd_de rndis_query_cmplt_t *get_c; rndis_set_msg_t *set; rndis_set_cmplt_t *set_c; + rndis_indicate_status_t *indic; } u; //SEGGER_RTT_printf(0, "bmRequestType: 0x%02x, bRequest: 0x%02x\n", req->bmRequestType, req->bRequest); @@ -224,11 +230,11 @@ static enum usbd_request_return_codes rndis_control_request(usbd_device *usbd_de switch (u.header->MessageType) { case REMOTE_NDIS_INITIALIZE_MSG: - //SEGGER_RTT_printf(0, "NDIS Init: HOST Ver %d.%d, Max MTU: %dbytes \n", u.init->MajorVersion, u.init->MinorVersion, u.init->MaxTransferSize); + SEGGER_RTT_printf(0, "NDIS Init: HOST Ver %d.%d, Max MTU: %dbytes \n", u.init->MajorVersion, u.init->MinorVersion, u.init->MaxTransferSize); u.init_c->MessageType = REMOTE_NDIS_INITIALIZE_CMPLT; return USBD_REQ_HANDLED; case REMOTE_NDIS_INITIALIZE_CMPLT: - //SEGGER_RTT_printf(0, "NDIS Init complete, MTU: %d\n", RNDIS_RX_BUFFER_SIZE); + SEGGER_RTT_printf(0, "NDIS Init complete, MTU: %d\n", RNDIS_RX_BUFFER_SIZE); u.init_c->MessageType = REMOTE_NDIS_INITIALIZE_CMPLT; u.init_c->MessageLength = sizeof(rndis_initialize_cmplt_t); // u.int_c->RequestId stays the same @@ -246,29 +252,14 @@ static enum usbd_request_return_codes rndis_control_request(usbd_device *usbd_de usbd_ep_write_packet(usbd_dev, 0x83, "\x01\x00\x00\x00\x00\x00\x00\x00", 8); return USBD_REQ_HANDLED; case REMOTE_NDIS_QUERY_MSG: - SEGGER_RTT_printf(0, "NDIS Query oid: 0x%08x, len: 0x%02x\n", u.get->Oid, u.get->InformationBufferLength); - if (u.get->Oid == OID_GEN_PHYSICAL_MEDIUM) { - u.get_c->MessageType = REMOTE_NDIS_QUERY_CMPLT; - u.get_c->MessageLength = sizeof(rndis_query_cmplt_t) + 4; - u.get_c->Status = RNDIS_STATUS_SUCCESS; - u.get_c->InformationBufferLength = 4; - u.get_c->InformationBufferOffset = 16; - *(uint32_t *)(u.get_c + 1) = 0x0; - } else if (u.get->Oid == OID_802_3_PERMANENT_ADDRESS) { - u.get_c->MessageType = REMOTE_NDIS_QUERY_CMPLT; - u.get_c->MessageLength = sizeof(rndis_query_cmplt_t) + sizeof(permanent_hwaddr); - u.get_c->Status = RNDIS_STATUS_SUCCESS; - u.get_c->InformationBufferLength = sizeof(permanent_hwaddr); - u.get_c->InformationBufferOffset = 16; - memcpy(u.get_c + 1, &permanent_hwaddr, sizeof(permanent_hwaddr)); - } - //rndis_handle_query(buf, len); + rndis_handle_query(buf, len); usbd_ep_write_packet(usbd_dev, 0x83, "\x01\x00\x00\x00\x00\x00\x00\x00", 8); //*len = u.get_c->MessageLength; return USBD_REQ_HANDLED; case REMOTE_NDIS_QUERY_CMPLT: SEGGER_RTT_printf(0, "NDIS Query complete\n"); *len = u.get_c->MessageLength; + usbd_ep_write_packet(usbd_dev, 0x83, "\x01\x00\x00\x00\x00\x00\x00\x00", 8); return USBD_REQ_HANDLED; case REMOTE_NDIS_SET_MSG: SEGGER_RTT_printf(0, "NDIS Set oid: 0x%08x, len 0x%02x\n", u.set->Oid, u.set->InformationBufferLength); @@ -281,6 +272,7 @@ static enum usbd_request_return_codes rndis_control_request(usbd_device *usbd_de case REMOTE_NDIS_SET_CMPLT: SEGGER_RTT_printf(0, "NDIS Set complete\n"); *len = u.set_c->MessageLength; + usbd_ep_write_packet(usbd_dev, 0x83, "\x01\x00\x00\x00\x00\x00\x00\x00", 8); return USBD_REQ_HANDLED; } SEGGER_RTT_printf(0, "NDIS unknown MessageType: 0x%08x, MessageLength: %d, max len: %d\n", u.header->MessageType, u.header->MessageLength, *len); @@ -289,6 +281,8 @@ static enum usbd_request_return_codes rndis_control_request(usbd_device *usbd_de static void rndis_data_rx_cb(usbd_device *usbd_dev, uint8_t ep) { + (void)ep; + char buf[64]; int len = usbd_ep_read_packet(usbd_dev, 0x01, buf, 64); @@ -306,6 +300,7 @@ static void rndis_set_config(usbd_device *usbd_dev, uint16_t wValue) usbd_ep_setup(usbd_dev, 0x01, USB_ENDPOINT_ATTR_BULK, 64, rndis_data_rx_cb); usbd_ep_setup(usbd_dev, 0x82, USB_ENDPOINT_ATTR_BULK, 64, NULL); + // Interrupt endpoint is used to only send notification that some data is ready to read usbd_ep_setup(usbd_dev, 0x83, USB_ENDPOINT_ATTR_INTERRUPT, 8, NULL); usbd_register_control_callback(usbd_dev,