From 19eabc092d4a413f0d402a32c4eb274e22546db2 Mon Sep 17 00:00:00 2001 From: =?utf8?q?=E5=AD=99=E6=98=A5=E9=98=B3?= Date: Tue, 5 Aug 2025 10:55:57 +0800 Subject: [PATCH] =?utf8?q?=E4=BC=98=E5=8C=96lwip=E5=8F=82=E6=95=B0?= =?utf8?q?=EF=BC=8C=E6=B7=BB=E5=8A=A0=E5=A4=9A=E7=BA=BF=E7=A8=8B=E5=AE=89?= =?utf8?q?=E5=85=A8=E6=94=AF=E6=8C=81=E3=80=82=E6=B7=BB=E5=8A=A0netdb=20?= =?utf8?q?=E5=86=85=E5=AD=98=E5=AF=B9=E9=BD=90=E5=AE=89=E5=85=A8=E7=AD=96?= =?utf8?q?=E7=95=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- .../lwip-2.1/porting/include/arch/sys_arch.h | 8 ++++++++ .../lwip-2.1/porting/include/lwip/lwipopts.h | 3 +++ .../lwip/port/lwip-2.1/porting/src/sys_arch.c | 16 ++++++++++++++++ .../openharmony/third_party/lwip/src/api/netdb.c | 6 +++--- .../openharmony/third_party/lwip/src/api/tcpip.c | 6 ++---- .../third_party/lwip/src/core/tcp_out.c | 2 +- .../third_party/lwip/src/include/lwip/netdb.h | 9 ++++++++- 7 files changed, 41 insertions(+), 9 deletions(-) diff --git a/code/sdk/open_source/openharmony/third_party/lwip/port/lwip-2.1/porting/include/arch/sys_arch.h b/code/sdk/open_source/openharmony/third_party/lwip/port/lwip-2.1/porting/include/arch/sys_arch.h index 3541e9072..a2e42f751 100644 --- a/code/sdk/open_source/openharmony/third_party/lwip/port/lwip-2.1/porting/include/arch/sys_arch.h +++ b/code/sdk/open_source/openharmony/third_party/lwip/port/lwip-2.1/porting/include/arch/sys_arch.h @@ -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 diff --git a/code/sdk/open_source/openharmony/third_party/lwip/port/lwip-2.1/porting/include/lwip/lwipopts.h b/code/sdk/open_source/openharmony/third_party/lwip/port/lwip-2.1/porting/include/lwip/lwipopts.h index 6b09419a2..7d39869de 100644 --- a/code/sdk/open_source/openharmony/third_party/lwip/port/lwip-2.1/porting/include/lwip/lwipopts.h +++ b/code/sdk/open_source/openharmony/third_party/lwip/port/lwip-2.1/porting/include/lwip/lwipopts.h @@ -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 diff --git a/code/sdk/open_source/openharmony/third_party/lwip/port/lwip-2.1/porting/src/sys_arch.c b/code/sdk/open_source/openharmony/third_party/lwip/port/lwip-2.1/porting/src/sys_arch.c index 9b89ab052..abab9b940 100644 --- a/code/sdk/open_source/openharmony/third_party/lwip/port/lwip-2.1/porting/src/sys_arch.c +++ b/code/sdk/open_source/openharmony/third_party/lwip/port/lwip-2.1/porting/src/sys_arch.c @@ -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; +} diff --git a/code/sdk/open_source/openharmony/third_party/lwip/src/api/netdb.c b/code/sdk/open_source/openharmony/third_party/lwip/src/api/netdb.c index bca575d45..aa71ee903 100644 --- a/code/sdk/open_source/openharmony/third_party/lwip/src/api/netdb.c +++ b/code/sdk/open_source/openharmony/third_party/lwip/src/api/netdb.c @@ -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; diff --git a/code/sdk/open_source/openharmony/third_party/lwip/src/api/tcpip.c b/code/sdk/open_source/openharmony/third_party/lwip/src/api/tcpip.c index bd0d3842d..3f2afee14 100644 --- a/code/sdk/open_source/openharmony/third_party/lwip/src/api/tcpip.c +++ b/code/sdk/open_source/openharmony/third_party/lwip/src/api/tcpip.c @@ -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) { diff --git a/code/sdk/open_source/openharmony/third_party/lwip/src/core/tcp_out.c b/code/sdk/open_source/openharmony/third_party/lwip/src/core/tcp_out.c index e7418e4f7..89ca4d44e 100644 --- a/code/sdk/open_source/openharmony/third_party/lwip/src/core/tcp_out.c +++ b/code/sdk/open_source/openharmony/third_party/lwip/src/core/tcp_out.c @@ -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; diff --git a/code/sdk/open_source/openharmony/third_party/lwip/src/include/lwip/netdb.h b/code/sdk/open_source/openharmony/third_party/lwip/src/include/lwip/netdb.h index d3d15dfac..b501648ac 100644 --- a/code/sdk/open_source/openharmony/third_party/lwip/src/include/lwip/netdb.h +++ b/code/sdk/open_source/openharmony/third_party/lwip/src/include/lwip/netdb.h @@ -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 */ -- 2.17.1