From c4bacc62ced2fa9c8f386b145b4f5bc5549ac5c4 Mon Sep 17 00:00:00 2001
From: windowsair <msdn_02@sina.com>
Date: Thu, 8 Apr 2021 22:29:01 +0800
Subject: [PATCH] refactor: Cache friendly

---
 Makefile            |   9 ----
 main/DAP_handle.c   | 100 ++++++++++++++++++--------------------------
 main/usbip_server.c |  13 +++---
 main/usbip_server.h |   2 +-
 4 files changed, 47 insertions(+), 77 deletions(-)
 delete mode 100644 Makefile

diff --git a/Makefile b/Makefile
deleted file mode 100644
index e965b90..0000000
--- a/Makefile
+++ /dev/null
@@ -1,9 +0,0 @@
-#
-# This is a project Makefile. It is assumed the directory this Makefile resides in is a
-# project subdirectory.
-#
-
-PROJECT_NAME := tcp_server
-
-include $(IDF_PATH)/make/project.mk
-
diff --git a/main/DAP_handle.c b/main/DAP_handle.c
index 1aa3f9d..a27aa1f 100644
--- a/main/DAP_handle.c
+++ b/main/DAP_handle.c
@@ -31,44 +31,40 @@
 #include "lwip/sys.h"
 #include <lwip/netdb.h>
 
+#if (USE_WINUSB == 1)
+typedef struct
+{
+    uint32_t length;
+    uint8_t buf[DAP_PACKET_SIZE];
+} DapPacket_t;
+#else
+typedef struct
+{
+    uint8_t buf[DAP_PACKET_SIZE];
+} DapPacket_t;
+#endif
+
+#define DAP_HANDLE_SIZE (sizeof(DapPacket_t))
+
+
 extern int kSock;
 extern TaskHandle_t kDAPTaskHandle;
 
 int kRestartDAPHandle = 0;
 
 
-#if (USE_WINUSB == 1)
-typedef struct
-{
-    uint32_t length;
-    uint8_t buf[DAP_PACKET_SIZE];
-} DAPPacetDataType;
-#else
-typedef struct
-{
-    uint8_t buf[DAP_PACKET_SIZE];
-} DAPPacetDataType;
-#endif
-
-
-#define DAP_HANDLE_SIZE (sizeof(DAPPacetDataType))
-
-static DAPPacetDataType DAPDataProcessed;
+static DapPacket_t DAPDataProcessed;
 static int dap_respond = 0;
 
-
 // SWO Trace
 static uint8_t *swo_data_to_send = NULL;
 static uint32_t swo_data_num;
 
-
-
 // DAP handle
 static RingbufHandle_t dap_dataIN_handle = NULL;
 static RingbufHandle_t dap_dataOUT_handle = NULL;
 static SemaphoreHandle_t data_response_mux = NULL;
 
-static void unpack(void *data, int size);
 
 void handle_dap_data_request(usbip_stage2_header *header, uint32_t length)
 {
@@ -149,7 +145,7 @@ void DAP_Thread(void *argument)
     data_response_mux = xSemaphoreCreateMutex();
     size_t packetSize;
     int resLength;
-    DAPPacetDataType *item;
+    DapPacket_t *item;
 
     if (dap_dataIN_handle == NULL || dap_dataIN_handle == NULL ||
         data_response_mux == NULL)
@@ -180,8 +176,8 @@ void DAP_Thread(void *argument)
 
             ulTaskNotifyTake(pdFALSE, portMAX_DELAY);
             packetSize = 0;
-            item = (DAPPacetDataType *)xRingbufferReceiveUpTo(dap_dataIN_handle, &packetSize,
-                                                              pdMS_TO_TICKS(1), DAP_HANDLE_SIZE);
+            item = (DapPacket_t *)xRingbufferReceiveUpTo(dap_dataIN_handle, &packetSize,
+                                                         pdMS_TO_TICKS(1), DAP_HANDLE_SIZE);
             if (packetSize == 0)
             {
                 break;
@@ -201,14 +197,14 @@ void DAP_Thread(void *argument)
             }
 
             resLength = DAP_ProcessCommand((uint8_t *)item->buf, (uint8_t *)DAPDataProcessed.buf); // use first 4 byte to save length
-            resLength &= 0xFFFF; // res length in lower 16 bits
+            resLength &= 0xFFFF;                                                                   // res length in lower 16 bits
 
             vRingbufferReturnItem(dap_dataIN_handle, (void *)item); // process done.
 
             // now prepare to reply
-        #if (USE_WINUSB == 1)
+#if (USE_WINUSB == 1)
             DAPDataProcessed.length = resLength;
-        #endif
+#endif
             xRingbufferSend(dap_dataOUT_handle, (void *)&DAPDataProcessed, DAP_HANDLE_SIZE, portMAX_DELAY);
 
             if (xSemaphoreTake(data_response_mux, portMAX_DELAY) == pdTRUE)
@@ -222,25 +218,25 @@ void DAP_Thread(void *argument)
 
 int fast_reply(uint8_t *buf, uint32_t length)
 {
-    if (length == 48 && buf[3] == 1 && buf[15] == 1 && buf[19] == 1)
+    usbip_stage2_header *buf_header = (usbip_stage2_header *)buf;
+    if (length == 48 &&
+        buf_header->base.command == PP_HTONL(USBIP_STAGE2_REQ_SUBMIT) &&
+        buf_header->base.direction == PP_HTONL(USBIP_DIR_IN) &&
+        buf_header->base.ep == PP_HTONL(1))
     {
         if (dap_respond > 0)
         {
-            DAPPacetDataType *item;
+            DapPacket_t *item;
             size_t packetSize = 0;
-            item = (DAPPacetDataType *)xRingbufferReceiveUpTo(dap_dataOUT_handle, &packetSize,
-                                                              pdMS_TO_TICKS(10), DAP_HANDLE_SIZE);
+            item = (DapPacket_t *)xRingbufferReceiveUpTo(dap_dataOUT_handle, &packetSize,
+                                                         pdMS_TO_TICKS(10), DAP_HANDLE_SIZE);
             if (packetSize == DAP_HANDLE_SIZE)
             {
-                unpack((uint32_t *)buf, sizeof(usbip_stage2_header));
-
-            #if (USE_WINUSB == 1)
-                uint32_t resLength = item->length;
-                send_stage2_submit_data_fast((usbip_stage2_header *)buf, 0, item->buf, resLength);
-            #else
-                send_stage2_submit_data_fast((usbip_stage2_header *)buf, 0, item->buf, DAP_HANDLE_SIZE);
-            #endif
-
+#if (USE_WINUSB == 1)
+                send_stage2_submit_data_fast((usbip_stage2_header *)buf, item->buf, item->length);
+#else
+                send_stage2_submit_data_fast((usbip_stage2_header *)buf, item->buf, DAP_HANDLE_SIZE);
+#endif
 
                 if (xSemaphoreTake(data_response_mux, portMAX_DELAY) == pdTRUE)
                 {
@@ -259,28 +255,14 @@ int fast_reply(uint8_t *buf, uint32_t length)
         }
         else
         {
-            //// TODO: ep0 dir 0 ?
-            buf[0x3] = 0x3; // command
-            buf[0xF] = 0;  // direction
-            buf[0x16] = 0;
-            buf[0x17] = 0;
-            buf[27] = 0;
-            buf[39] = 0;
+            buf_header->base.command = PP_HTONL(USBIP_STAGE2_RSP_SUBMIT);
+            buf_header->base.direction = PP_HTONL(USBIP_DIR_OUT);
+            buf_header->u.ret_submit.status = 0;
+            buf_header->u.ret_submit.data_length = 0;
+            buf_header->u.ret_submit.error_count = 0;
             send(kSock, buf, 48, 0);
             return 1;
         }
     }
     return 0;
 }
-
-static void unpack(void *data, int size)
-{
-    // Ignore the setup field
-    int sz = (size / sizeof(uint32_t)) - 2;
-    uint32_t *ptr = (uint32_t *)data;
-
-    for (int i = 0; i < sz; i++)
-    {
-        ptr[i] = ntohl(ptr[i]);
-    }
-}
\ No newline at end of file
diff --git a/main/usbip_server.c b/main/usbip_server.c
index 0e8ab2b..f0784e9 100644
--- a/main/usbip_server.c
+++ b/main/usbip_server.c
@@ -339,7 +339,7 @@ void send_stage2_submit(usbip_stage2_header *req_header, int32_t status, int32_t
 
     req_header->u.ret_submit.status = status;
     req_header->u.ret_submit.data_length = data_length;
-
+    // already unpacked
     pack(req_header, sizeof(usbip_stage2_header));
     send(kSock, req_header, sizeof(usbip_stage2_header), 0);
 }
@@ -355,19 +355,16 @@ void send_stage2_submit_data(usbip_stage2_header *req_header, int32_t status, co
     }
 }
 
-void send_stage2_submit_data_fast(usbip_stage2_header *req_header, int32_t status, const void *const data, int32_t data_length)
+void send_stage2_submit_data_fast(usbip_stage2_header *req_header, const void *const data, int32_t data_length)
 {
     uint8_t * send_buf = (uint8_t *)req_header;
 
-    req_header->base.command = USBIP_STAGE2_RSP_SUBMIT;
-    req_header->base.direction = !(req_header->base.direction);
+    req_header->base.command = PP_HTONL(USBIP_STAGE2_RSP_SUBMIT);
+    req_header->base.direction = htonl(!(req_header->base.direction));
 
     memset(&(req_header->u.ret_submit), 0, sizeof(usbip_stage2_header_ret_submit));
+    req_header->u.ret_submit.data_length = htonl(data_length);
 
-    req_header->u.ret_submit.status = status;
-    req_header->u.ret_submit.data_length = data_length;
-
-    pack(req_header, sizeof(usbip_stage2_header));
 
     // payload
     memcpy(&send_buf[sizeof(usbip_stage2_header)], data, data_length);
diff --git a/main/usbip_server.h b/main/usbip_server.h
index 08b6c10..8d68243 100644
--- a/main/usbip_server.h
+++ b/main/usbip_server.h
@@ -15,7 +15,7 @@ int attach(uint8_t *buffer, uint32_t length);
 int emulate(uint8_t *buffer, uint32_t length);
 void send_stage2_submit_data(usbip_stage2_header *req_header, int32_t status, const void * const data, int32_t data_length);
 void send_stage2_submit(usbip_stage2_header *req_header, int32_t status, int32_t data_length);
-void send_stage2_submit_data_fast(usbip_stage2_header *req_header, int32_t status, const void *const data, int32_t data_length);
+void send_stage2_submit_data_fast(usbip_stage2_header *req_header, const void *const data, int32_t data_length);
 
 
 #endif
\ No newline at end of file