优化lwip参数,添加多线程安全支持。添加netdb 内存对齐安全策略 2044/1 2044/head 2048/target/1
author孙春阳 <snickersun@163.com>
Tue, 5 Aug 2025 02:55:57 +0000 (10:55 +0800)
committer孙春阳 <snickersun@163.com>
Tue, 5 Aug 2025 02:55:57 +0000 (10:55 +0800)
code/sdk/open_source/openharmony/third_party/lwip/port/lwip-2.1/porting/include/arch/sys_arch.h
code/sdk/open_source/openharmony/third_party/lwip/port/lwip-2.1/porting/include/lwip/lwipopts.h
code/sdk/open_source/openharmony/third_party/lwip/port/lwip-2.1/porting/src/sys_arch.c
code/sdk/open_source/openharmony/third_party/lwip/src/api/netdb.c
code/sdk/open_source/openharmony/third_party/lwip/src/api/tcpip.c
code/sdk/open_source/openharmony/third_party/lwip/src/core/tcp_out.c
code/sdk/open_source/openharmony/third_party/lwip/src/include/lwip/netdb.h

index 3541e90..a2e42f7 100644 (file)
@@ -63,6 +63,14 @@ typedef void *sys_prot_t;
  */
 typedef uint32_t sys_thread_t;
 
+/* Mailbox expansion flags */
+#define MBOX_NO_EXPAND    0
+#define MBOX_AUTO_EXPAND  1
+
+/* Netconn thread semaphore */
+sys_sem_t* sys_arch_netconn_sem_get(void);
+#define LWIP_NETCONN_THREAD_SEM_GET()   sys_arch_netconn_sem_get()
+
 #ifdef __cplusplus
 }
 #endif
index 6b09419..7d39869 100644 (file)
@@ -91,6 +91,9 @@
 #define LWIP_SOCKET_SELECT_FUNC
 #define LWIP_SOCKET_POLL_FUNC
 
+//多线程安全支持
+#define LWIP_NETCONN_SEM_PER_THREAD     1   
+
 // Options for old lwipopts.h
 #define MEM_SIZE                        (512*1024) //(4*1024*1024) // (512*1024)
 #define IP_FRAG_MAX_MTU                 1500
index 9b89ab0..abab9b9 100644 (file)
@@ -474,3 +474,19 @@ void LwipLogPrintf(const char *fmt, ...)
     }
     LWIP_LOGGER(buf);
 }
+
+/**
+ * Netconn thread semaphore
+ */
+static sys_sem_t netconn_sem = 0;
+
+sys_sem_t* sys_arch_netconn_sem_get(void)
+{
+    if (netconn_sem == 0) {
+        UINT32 ret = LOS_SemCreate(0, &netconn_sem);
+        if (ret != LOS_OK) {
+            return NULL;
+        }
+    }
+    return &netconn_sem;
+}
index bca575d..aa71ee9 100644 (file)
@@ -351,7 +351,7 @@ lwip_getaddrinfo(const char *nodename, const char *servname,
     }
   }
 
-  total_size = sizeof(struct addrinfo) + sizeof(struct sockaddr_storage);
+  total_size = sizeof(struct addrinfo) + sizeof(struct sockaddr_storage) + LWIP_SOCKET_ADDR_ALIGNMENT;
   if (nodename != NULL) {
     namelen = strlen(nodename);
     if (namelen > DNS_MAX_NAME_LENGTH) {
@@ -371,6 +371,7 @@ lwip_getaddrinfo(const char *nodename, const char *servname,
   memset(ai, 0, total_size);
   /* cast through void* to get rid of alignment warnings */
   sa = (struct sockaddr_storage *)(void *)((u8_t *)ai + sizeof(struct addrinfo));
+  sa = LWIP_SOCKET_ADDR_ALIGN(sa);
   if (IP_IS_V6_VAL(addr)) {
 #if LWIP_IPV6
     struct sockaddr_in6 *sa6 = (struct sockaddr_in6 *)sa;
@@ -381,7 +382,6 @@ lwip_getaddrinfo(const char *nodename, const char *servname,
     sa6->sin6_port = lwip_htons((u16_t)port_nr);
     sa6->sin6_scope_id = ip6_addr_zone(ip_2_ip6(&addr));
     ai->ai_family = AF_INET6;
-    ai->ai_addrlen = sizeof(struct sockaddr_in6);
 #endif /* LWIP_IPV6 */
   } else {
 #if LWIP_IPV4
@@ -392,7 +392,6 @@ lwip_getaddrinfo(const char *nodename, const char *servname,
     sa4->sin_len = sizeof(struct sockaddr_in);
     sa4->sin_port = lwip_htons((u16_t)port_nr);
     ai->ai_family = AF_INET;
-    ai->ai_addrlen = sizeof(struct sockaddr_in);
 #endif /* LWIP_IPV4 */
   }
 
@@ -408,6 +407,7 @@ lwip_getaddrinfo(const char *nodename, const char *servname,
     MEMCPY(ai->ai_canonname, nodename, namelen);
     ai->ai_canonname[namelen] = 0;
   }
+  ai->ai_addrlen = sizeof(struct sockaddr_storage);
   ai->ai_addr = (struct sockaddr *)sa;
 
   *res = ai;
index bd0d384..3f2afee 100644 (file)
@@ -49,7 +49,6 @@
 #include "lwip/pbuf.h"
 #include "lwip/etharp.h"
 #include "netif/ethernet.h"
-#include "custom_utils.h"
 
 #define TCPIP_MSG_VAR_REF(name)     API_VAR_REF(name)
 #define TCPIP_MSG_VAR_DECLARE(name) API_VAR_DECLARE(struct tcpip_msg, name)
@@ -66,9 +65,6 @@ static sys_mbox_t tcpip_mbox;
 sys_mutex_t lock_tcpip_core;
 #endif /* LWIP_TCPIP_CORE_LOCKING */
 
-
-static app_task_definition_t taskcfg={0};
-
 static void tcpip_thread_handle_msg(struct tcpip_msg *msg);
 
 #if !LWIP_TIMERS
@@ -612,6 +608,8 @@ tcpip_callbackmsg_trycallback_fromisr(struct tcpip_callback_msg *msg)
  * @param initfunc a function to call when tcpip_thread is running and finished initializing
  * @param arg argument to pass to initfunc
  */
+ #include "custom_utils.h"
+ static app_task_definition_t taskcfg={0};
 void
 tcpip_init(tcpip_init_done_fn initfunc, void *arg)
 {
index e7418e4..89ca4d4 100644 (file)
@@ -1554,7 +1554,7 @@ tcp_output_segment(struct tcp_seg *seg, struct tcp_pcb *pcb, struct netif *netif
   }
 #if LWIP_TCP_TIMESTAMPS
   pcb->ts_lastacksent = pcb->rcv_nxt;
-0
+
   if (seg->flags & TF_SEG_OPTS_TS) {
     tcp_build_timestamp_option(pcb, opts);
     opts += 3;
index d3d15df..b501648 100644 (file)
@@ -112,7 +112,14 @@ struct addrinfo {
 };
 #endif /* LWIP_DNS_API_DECLARE_STRUCTS */
 
-#define NETDB_ELEM_SIZE           (sizeof(struct addrinfo) + sizeof(struct sockaddr_storage) + DNS_MAX_NAME_LENGTH + 1)
+#define LWIP_SOCKET_ADDR_ALIGNMENT 4
+#ifndef LWIP_SOCKET_ADDR_ALIGN
+#define LWIP_SOCKET_ADDR_ALIGN(addr) \
+  ((void *)(((uintptr_t)(addr) + LWIP_SOCKET_ADDR_ALIGNMENT - 1) & ~(uintptr_t)(LWIP_SOCKET_ADDR_ALIGNMENT - 1)))
+#endif
+
+#define NETDB_ELEM_SIZE \
+    (sizeof(struct addrinfo) + sizeof(struct sockaddr_storage) + DNS_MAX_NAME_LENGTH + LWIP_SOCKET_ADDR_ALIGNMENT + 1)
 
 #if LWIP_DNS_API_DECLARE_H_ERRNO
 /* application accessible error code set by the DNS API functions */