From 501fce7fdd447c13d93b69189dd7bb2c112eec89 Mon Sep 17 00:00:00 2001 From: xueyunfei Date: Wed, 1 Jul 2020 15:35:46 +0800 Subject: [PATCH] backport bugfix lwip for v4.2 --- components/esp_netif/lwip/esp_netif_lwip.c | 10 +++++++--- .../protocols/sockets/tcp_server/main/tcp_server.c | 10 +++++----- .../protocols/sockets/udp_client/main/udp_client.c | 2 +- .../udp_multicast/main/udp_multicast_example_main.c | 10 +++++----- .../protocols/sockets/udp_server/main/udp_server.c | 10 +++++----- 5 files changed, 23 insertions(+), 19 deletions(-) diff --git a/components/esp_netif/lwip/esp_netif_lwip.c b/components/esp_netif/lwip/esp_netif_lwip.c index ec183f37a6..a646dbbe0c 100644 --- a/components/esp_netif/lwip/esp_netif_lwip.c +++ b/components/esp_netif/lwip/esp_netif_lwip.c @@ -1171,6 +1171,9 @@ static esp_err_t esp_netif_down_api(esp_netif_api_msg_t *msg) } for(int8_t i = 0 ;i < LWIP_IPV6_NUM_ADDRESSES ;i++) { netif_ip6_addr_set(lwip_netif, i, IP6_ADDR_ANY6); + netif_ip6_addr_set_valid_life(lwip_netif, i, 0); + netif_ip6_addr_set_pref_life(lwip_netif, i, 0); + netif_ip6_addr_set_state(lwip_netif, i, IP6_ADDR_INVALID); } netif_set_addr(lwip_netif, IP4_ADDR_ANY4, IP4_ADDR_ANY4, IP4_ADDR_ANY4); netif_set_down(lwip_netif); @@ -1519,9 +1522,10 @@ esp_err_t esp_netif_get_ip6_global(esp_netif_t *esp_netif, esp_ip6_addr_t *if_ip if (p_netif != NULL && netif_is_up(p_netif)) { for (i = 1; i < LWIP_IPV6_NUM_ADDRESSES; i++) { - if (ip6_addr_ispreferred(netif_ip6_addr_state(p_netif, i))) { - memcpy(if_ip6, &p_netif->ip6_addr[i], sizeof(ip6_addr_t)); - return ESP_OK; + if (ip6_addr_ispreferred(netif_ip6_addr_state(p_netif, i)) && + ip6_addr_isglobal(netif_ip6_addr(p_netif, i))) { + memcpy(if_ip6, &p_netif->ip6_addr[i], sizeof(ip6_addr_t)); + return ESP_OK; } } } diff --git a/examples/protocols/sockets/tcp_server/main/tcp_server.c b/examples/protocols/sockets/tcp_server/main/tcp_server.c index 18284fd3ed..48a76d1ba3 100644 --- a/examples/protocols/sockets/tcp_server/main/tcp_server.c +++ b/examples/protocols/sockets/tcp_server/main/tcp_server.c @@ -111,7 +111,7 @@ static void tcp_server_task(void *pvParameters) ESP_LOGI(TAG, "Socket listening"); - struct sockaddr_in6 source_addr; // Large enough for both IPv4 or IPv6 + struct sockaddr_storage source_addr; // Large enough for both IPv4 or IPv6 uint addr_len = sizeof(source_addr); int sock = accept(listen_sock, (struct sockaddr *)&source_addr, &addr_len); if (sock < 0) { @@ -120,10 +120,10 @@ static void tcp_server_task(void *pvParameters) } // Convert ip address to string - if (source_addr.sin6_family == PF_INET) { - inet_ntoa_r(((struct sockaddr_in *)&source_addr)->sin_addr.s_addr, addr_str, sizeof(addr_str) - 1); - } else if (source_addr.sin6_family == PF_INET6) { - inet6_ntoa_r(source_addr.sin6_addr, addr_str, sizeof(addr_str) - 1); + if (source_addr.ss_family == PF_INET) { + inet_ntoa_r(((struct sockaddr_in *)&source_addr)->sin_addr, addr_str, sizeof(addr_str) - 1); + } else if (source_addr.ss_family == PF_INET6) { + inet6_ntoa_r(((struct sockaddr_in6 *)&source_addr)->sin6_addr, addr_str, sizeof(addr_str) - 1); } ESP_LOGI(TAG, "Socket accepted ip address: %s", addr_str); diff --git a/examples/protocols/sockets/udp_client/main/udp_client.c b/examples/protocols/sockets/udp_client/main/udp_client.c index 08a15cfab2..f175fec469 100644 --- a/examples/protocols/sockets/udp_client/main/udp_client.c +++ b/examples/protocols/sockets/udp_client/main/udp_client.c @@ -84,7 +84,7 @@ static void udp_client_task(void *pvParameters) } ESP_LOGI(TAG, "Message sent"); - struct sockaddr_in source_addr; // Large enough for both IPv4 or IPv6 + struct sockaddr_storage source_addr; // Large enough for both IPv4 or IPv6 socklen_t socklen = sizeof(source_addr); int len = recvfrom(sock, rx_buffer, sizeof(rx_buffer) - 1, 0, (struct sockaddr *)&source_addr, &socklen); diff --git a/examples/protocols/sockets/udp_multicast/main/udp_multicast_example_main.c b/examples/protocols/sockets/udp_multicast/main/udp_multicast_example_main.c index 6215e73270..2eed56f510 100644 --- a/examples/protocols/sockets/udp_multicast/main/udp_multicast_example_main.c +++ b/examples/protocols/sockets/udp_multicast/main/udp_multicast_example_main.c @@ -364,7 +364,7 @@ static void mcast_example_task(void *pvParameters) char recvbuf[48]; char raddr_name[32] = { 0 }; - struct sockaddr_in6 raddr; // Large enough for both IPv4 or IPv6 + struct sockaddr_storage raddr; // Large enough for both IPv4 or IPv6 socklen_t socklen = sizeof(raddr); int len = recvfrom(sock, recvbuf, sizeof(recvbuf)-1, 0, (struct sockaddr *)&raddr, &socklen); @@ -376,14 +376,14 @@ static void mcast_example_task(void *pvParameters) // Get the sender's address as a string #ifdef CONFIG_EXAMPLE_IPV4 - if (raddr.sin6_family == PF_INET) { - inet_ntoa_r(((struct sockaddr_in *)&raddr)->sin_addr.s_addr, + if (raddr.ss_family == PF_INET) { + inet_ntoa_r(((struct sockaddr_in *)&raddr)->sin_addr, raddr_name, sizeof(raddr_name)-1); } #endif #ifdef CONFIG_EXAMPLE_IPV6 - if (raddr.sin6_family == PF_INET6) { - inet6_ntoa_r(raddr.sin6_addr, raddr_name, sizeof(raddr_name)-1); + if (raddr.ss_family== PF_INET6) { + inet6_ntoa_r(((struct sockaddr_in6 *)&raddr)->sin6_addr, raddr_name, sizeof(raddr_name)-1); } #endif ESP_LOGI(TAG, "received %d bytes from %s:", len, raddr_name); diff --git a/examples/protocols/sockets/udp_server/main/udp_server.c b/examples/protocols/sockets/udp_server/main/udp_server.c index 86a283d402..26ec46bc5f 100644 --- a/examples/protocols/sockets/udp_server/main/udp_server.c +++ b/examples/protocols/sockets/udp_server/main/udp_server.c @@ -76,7 +76,7 @@ static void udp_server_task(void *pvParameters) while (1) { ESP_LOGI(TAG, "Waiting for data"); - struct sockaddr_in6 source_addr; // Large enough for both IPv4 or IPv6 + struct sockaddr_storage source_addr; // Large enough for both IPv4 or IPv6 socklen_t socklen = sizeof(source_addr); int len = recvfrom(sock, rx_buffer, sizeof(rx_buffer) - 1, 0, (struct sockaddr *)&source_addr, &socklen); @@ -88,10 +88,10 @@ static void udp_server_task(void *pvParameters) // Data received else { // Get the sender's ip address as string - if (source_addr.sin6_family == PF_INET) { - inet_ntoa_r(((struct sockaddr_in *)&source_addr)->sin_addr.s_addr, addr_str, sizeof(addr_str) - 1); - } else if (source_addr.sin6_family == PF_INET6) { - inet6_ntoa_r(source_addr.sin6_addr, addr_str, sizeof(addr_str) - 1); + if (source_addr.ss_family == PF_INET) { + inet_ntoa_r(((struct sockaddr_in *)&source_addr)->sin_addr, addr_str, sizeof(addr_str) - 1); + } else if (source_addr.ss_family == PF_INET6) { + inet6_ntoa_r(((struct sockaddr_in6 *)&source_addr)->sin6_addr, addr_str, sizeof(addr_str) - 1); } rx_buffer[len] = 0; // Null-terminate whatever we received and treat like a string...