mirror of
				https://github.com/espressif/esp-idf.git
				synced 2025-10-30 20:51:41 +00:00 
			
		
		
		
	backport bugfix lwip for v4.0
This commit is contained in:
		| @@ -32,20 +32,22 @@ typedef struct { | |||||||
|     int sock; |     int sock; | ||||||
| } transport_tcp_t; | } transport_tcp_t; | ||||||
|  |  | ||||||
| static int resolve_dns(const char *host, struct sockaddr_in *ip) { | static int resolve_dns(const char *host, struct sockaddr_in *ip)  | ||||||
|  | { | ||||||
|  |     const struct addrinfo hints = { | ||||||
|  |         .ai_family = AF_INET, | ||||||
|  |         .ai_socktype = SOCK_STREAM, | ||||||
|  |     }; | ||||||
|  |     struct addrinfo *res; | ||||||
|  |  | ||||||
|     struct hostent *he; |     int err = getaddrinfo(host, NULL, &hints, &res); | ||||||
|     struct in_addr **addr_list; |     if(err != 0 || res == NULL) { | ||||||
|     he = gethostbyname(host); |         ESP_LOGE(TAG, "DNS lookup failed err=%d res=%p", err, res); | ||||||
|     if (he == NULL) { |  | ||||||
|         return ESP_FAIL; |  | ||||||
|     } |  | ||||||
|     addr_list = (struct in_addr **)he->h_addr_list; |  | ||||||
|     if (addr_list[0] == NULL) { |  | ||||||
|         return ESP_FAIL; |         return ESP_FAIL; | ||||||
|     } |     } | ||||||
|     ip->sin_family = AF_INET; |     ip->sin_family = AF_INET; | ||||||
|     memcpy(&ip->sin_addr, addr_list[0], sizeof(ip->sin_addr)); |     memcpy(&ip->sin_addr, &((struct sockaddr_in *)(res->ai_addr))->sin_addr, sizeof(ip->sin_addr)); | ||||||
|  |     freeaddrinfo(res); | ||||||
|     return ESP_OK; |     return ESP_OK; | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -360,6 +360,9 @@ esp_err_t tcpip_adapter_down(tcpip_adapter_if_t tcpip_if) | |||||||
|  |  | ||||||
|         for(int8_t i = 0 ;i < LWIP_IPV6_NUM_ADDRESSES ;i++) { |         for(int8_t i = 0 ;i < LWIP_IPV6_NUM_ADDRESSES ;i++) { | ||||||
|             netif_ip6_addr_set(esp_netif[tcpip_if], i, IP6_ADDR_ANY6); |             netif_ip6_addr_set(esp_netif[tcpip_if], i, IP6_ADDR_ANY6); | ||||||
|  |             netif_ip6_addr_set_valid_life(esp_netif[tcpip_if], i, 0); | ||||||
|  |             netif_ip6_addr_set_pref_life(esp_netif[tcpip_if], i, 0); | ||||||
|  |             netif_ip6_addr_set_state(esp_netif[tcpip_if], i, IP6_ADDR_INVALID); | ||||||
|         } |         } | ||||||
|         netif_set_addr(esp_netif[tcpip_if], IP4_ADDR_ANY4, IP4_ADDR_ANY4, IP4_ADDR_ANY4); |         netif_set_addr(esp_netif[tcpip_if], IP4_ADDR_ANY4, IP4_ADDR_ANY4, IP4_ADDR_ANY4); | ||||||
|         netif_set_down(esp_netif[tcpip_if]); |         netif_set_down(esp_netif[tcpip_if]); | ||||||
|   | |||||||
| @@ -77,7 +77,7 @@ static void tcp_server_task(void *pvParameters) | |||||||
|         } |         } | ||||||
|         ESP_LOGI(TAG, "Socket listening"); |         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); |         uint addr_len = sizeof(source_addr); | ||||||
|         int sock = accept(listen_sock, (struct sockaddr *)&source_addr, &addr_len); |         int sock = accept(listen_sock, (struct sockaddr *)&source_addr, &addr_len); | ||||||
|         if (sock < 0) { |         if (sock < 0) { | ||||||
| @@ -101,10 +101,10 @@ static void tcp_server_task(void *pvParameters) | |||||||
|             // Data received |             // Data received | ||||||
|             else { |             else { | ||||||
|                 // Get the sender's ip address as string |                 // Get the sender's ip address as string | ||||||
|                 if (source_addr.sin6_family == PF_INET) { |                 if (source_addr.ss_family == PF_INET) { | ||||||
|                     inet_ntoa_r(((struct sockaddr_in *)&source_addr)->sin_addr.s_addr, addr_str, sizeof(addr_str) - 1); |                     inet_ntoa_r(((struct sockaddr_in *)&source_addr)->sin_addr, addr_str, sizeof(addr_str) - 1); | ||||||
|                 } else if (source_addr.sin6_family == PF_INET6) { |                 } else if (source_addr.ss_family == PF_INET6) { | ||||||
|                     inet6_ntoa_r(source_addr.sin6_addr, addr_str, sizeof(addr_str) - 1); |                     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 |                 rx_buffer[len] = 0; // Null-terminate whatever we received and treat like a string | ||||||
|   | |||||||
| @@ -88,7 +88,7 @@ static void udp_client_task(void *pvParameters) | |||||||
|             } |             } | ||||||
|             ESP_LOGI(TAG, "Message sent"); |             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); |             socklen_t socklen = sizeof(source_addr); | ||||||
|             int len = recvfrom(sock, rx_buffer, sizeof(rx_buffer) - 1, 0, (struct sockaddr *)&source_addr, &socklen); |             int len = recvfrom(sock, rx_buffer, sizeof(rx_buffer) - 1, 0, (struct sockaddr *)&source_addr, &socklen); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -364,7 +364,7 @@ static void mcast_example_task(void *pvParameters) | |||||||
|                     char recvbuf[48]; |                     char recvbuf[48]; | ||||||
|                     char raddr_name[32] = { 0 }; |                     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); |                     socklen_t socklen = sizeof(raddr); | ||||||
|                     int len = recvfrom(sock, recvbuf, sizeof(recvbuf)-1, 0, |                     int len = recvfrom(sock, recvbuf, sizeof(recvbuf)-1, 0, | ||||||
|                                        (struct sockaddr *)&raddr, &socklen); |                                        (struct sockaddr *)&raddr, &socklen); | ||||||
| @@ -376,14 +376,14 @@ static void mcast_example_task(void *pvParameters) | |||||||
|  |  | ||||||
|                     // Get the sender's address as a string |                     // Get the sender's address as a string | ||||||
| #ifdef CONFIG_EXAMPLE_IPV4 | #ifdef CONFIG_EXAMPLE_IPV4 | ||||||
|                     if (raddr.sin6_family == PF_INET) { |                     if (raddr.ss_family == PF_INET) { | ||||||
|                         inet_ntoa_r(((struct sockaddr_in *)&raddr)->sin_addr.s_addr, |                         inet_ntoa_r(((struct sockaddr_in *)&raddr)->sin_addr, | ||||||
|                                     raddr_name, sizeof(raddr_name)-1); |                                     raddr_name, sizeof(raddr_name)-1); | ||||||
|                     } |                     } | ||||||
| #endif | #endif | ||||||
| #ifdef CONFIG_EXAMPLE_IPV6 | #ifdef CONFIG_EXAMPLE_IPV6 | ||||||
|                     if (raddr.sin6_family == PF_INET6) { |                     if (raddr.ss_family== PF_INET6) { | ||||||
|                         inet6_ntoa_r(raddr.sin6_addr, raddr_name, sizeof(raddr_name)-1); |                         inet6_ntoa_r(((struct sockaddr_in6 *)&raddr)->sin6_addr, raddr_name, sizeof(raddr_name)-1); | ||||||
|                     } |                     } | ||||||
| #endif | #endif | ||||||
|                     ESP_LOGI(TAG, "received %d bytes from %s:", len, raddr_name); |                     ESP_LOGI(TAG, "received %d bytes from %s:", len, raddr_name); | ||||||
|   | |||||||
| @@ -70,7 +70,7 @@ static void udp_server_task(void *pvParameters) | |||||||
|         while (1) { |         while (1) { | ||||||
|  |  | ||||||
|             ESP_LOGI(TAG, "Waiting for data"); |             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); |             socklen_t socklen = sizeof(source_addr); | ||||||
|             int len = recvfrom(sock, rx_buffer, sizeof(rx_buffer) - 1, 0, (struct sockaddr *)&source_addr, &socklen); |             int len = recvfrom(sock, rx_buffer, sizeof(rx_buffer) - 1, 0, (struct sockaddr *)&source_addr, &socklen); | ||||||
|  |  | ||||||
| @@ -82,10 +82,10 @@ static void udp_server_task(void *pvParameters) | |||||||
|             // Data received |             // Data received | ||||||
|             else { |             else { | ||||||
|                 // Get the sender's ip address as string |                 // Get the sender's ip address as string | ||||||
|                 if (source_addr.sin6_family == PF_INET) { |                 if (source_addr.ss_family == PF_INET) { | ||||||
|                     inet_ntoa_r(((struct sockaddr_in *)&source_addr)->sin_addr.s_addr, addr_str, sizeof(addr_str) - 1); |                     inet_ntoa_r(((struct sockaddr_in *)&source_addr)->sin_addr, addr_str, sizeof(addr_str) - 1); | ||||||
|                 } else if (source_addr.sin6_family == PF_INET6) { |                 } else if (source_addr.ss_family == PF_INET6) { | ||||||
|                     inet6_ntoa_r(source_addr.sin6_addr, addr_str, sizeof(addr_str) - 1); |                     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... |                 rx_buffer[len] = 0; // Null-terminate whatever we received and treat like a string... | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 xueyunfei
					xueyunfei