From 095d163050f9e353a7fe94ed1574621c2b3163e7 Mon Sep 17 00:00:00 2001 From: Liu Zhi Fu Date: Wed, 15 Nov 2017 16:15:24 +0800 Subject: [PATCH] lwip: rebind UDP/TCP pcb to valid ip address when ip is changed This change fix the issue UDP/TCP pcb failed to rebind to correct ip address when ip is changed --- components/lwip/core/netif.c | 14 ++++++++++++-- components/lwip/include/lwip/lwip/netif.h | 1 + 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/components/lwip/core/netif.c b/components/lwip/core/netif.c index 76e6f6132..2b25143c6 100755 --- a/components/lwip/core/netif.c +++ b/components/lwip/core/netif.c @@ -453,14 +453,20 @@ void netif_set_ipaddr(struct netif *netif, const ip4_addr_t *ipaddr) { ip4_addr_t new_addr = (ipaddr ? *ipaddr : *IP4_ADDR_ANY); +#if ESP_LWIP + ip4_addr_t *last_addr = ip_2_ip4(&netif->last_ip_addr); +#else + ip4_addr_t *last_addr = netif_ip4_addr(netif); +#endif + /* address is actually being changed? */ if (ip4_addr_cmp(&new_addr, netif_ip4_addr(netif)) == 0) { LWIP_DEBUGF(NETIF_DEBUG | LWIP_DBG_STATE, ("netif_set_ipaddr: netif address being changed\n")); #if LWIP_TCP - tcp_netif_ipv4_addr_changed(netif_ip4_addr(netif), ipaddr); + tcp_netif_ipv4_addr_changed(last_addr, ipaddr); #endif /* LWIP_TCP */ #if LWIP_UDP - udp_netif_ipv4_addr_changed(netif_ip4_addr(netif), ipaddr); + udp_netif_ipv4_addr_changed(last_addr, ipaddr); #endif /* LWIP_UDP */ mib2_remove_ip4(netif); @@ -482,6 +488,10 @@ netif_set_ipaddr(struct netif *netif, const ip4_addr_t *ipaddr) ip4_addr2_16(netif_ip4_addr(netif)), ip4_addr3_16(netif_ip4_addr(netif)), ip4_addr4_16(netif_ip4_addr(netif)))); + + if (ipaddr && !ip4_addr_isany(ipaddr)) { + ip4_addr_set(ip_2_ip4(&netif->last_ip_addr), ipaddr); + } } /** diff --git a/components/lwip/include/lwip/lwip/netif.h b/components/lwip/include/lwip/lwip/netif.h index f5ca067ed..bd25b8217 100755 --- a/components/lwip/include/lwip/lwip/netif.h +++ b/components/lwip/include/lwip/lwip/netif.h @@ -333,6 +333,7 @@ struct netif { #if ESP_LWIP void (*l2_buffer_free_notify)(void *user_buf); /* Allows LWIP to notify driver when a L2-supplied pbuf can be freed */ + ip_addr_t last_ip_addr; /* Store last non-zero ip address */ #endif };