mirror of
				https://github.com/espressif/esp-idf.git
				synced 2025-10-31 04:59:55 +00:00 
			
		
		
		
	backport bugfix lwip for v4.0
This commit is contained in:
		| @@ -32,20 +32,22 @@ typedef struct { | ||||
|     int sock; | ||||
| } 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; | ||||
|     struct in_addr **addr_list; | ||||
|     he = gethostbyname(host); | ||||
|     if (he == NULL) { | ||||
|         return ESP_FAIL; | ||||
|     } | ||||
|     addr_list = (struct in_addr **)he->h_addr_list; | ||||
|     if (addr_list[0] == NULL) { | ||||
|     int err = getaddrinfo(host, NULL, &hints, &res); | ||||
|     if(err != 0 || res == NULL) { | ||||
|         ESP_LOGE(TAG, "DNS lookup failed err=%d res=%p", err, res); | ||||
|         return ESP_FAIL; | ||||
|     } | ||||
|     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; | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -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++) { | ||||
|             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_down(esp_netif[tcpip_if]); | ||||
|   | ||||
| @@ -77,7 +77,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) { | ||||
| @@ -101,10 +101,10 @@ static void tcp_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 | ||||
|   | ||||
| @@ -88,7 +88,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); | ||||
|  | ||||
|   | ||||
| @@ -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); | ||||
|   | ||||
| @@ -70,7 +70,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); | ||||
|  | ||||
| @@ -82,10 +82,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... | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 xueyunfei
					xueyunfei