From 82279620337f01e5bad719f6744540ec7af3e99e Mon Sep 17 00:00:00 2001 From: dongheng Date: Mon, 10 Jun 2019 14:32:51 +0800 Subject: [PATCH] feat(lwip): AutoIP trigger callback so that application can know IP changes --- components/lwip/lwip/src/core/ipv4/autoip.c | 8 ++++++++ components/lwip/lwip/src/core/ipv4/dhcp.c | 19 +++++++++++++++++++ components/lwip/lwip/src/include/lwip/dhcp.h | 8 ++++++++ components/tcpip_adapter/tcpip_adapter_lwip.c | 10 +++++++++- 4 files changed, 44 insertions(+), 1 deletion(-) diff --git a/components/lwip/lwip/src/core/ipv4/autoip.c b/components/lwip/lwip/src/core/ipv4/autoip.c index 10db8a34..f1a2b451 100644 --- a/components/lwip/lwip/src/core/ipv4/autoip.c +++ b/components/lwip/lwip/src/core/ipv4/autoip.c @@ -67,6 +67,7 @@ #include "lwip/autoip.h" #include "lwip/etharp.h" #include "lwip/prot/autoip.h" +#include "lwip/dhcp.h" #include @@ -241,6 +242,13 @@ autoip_bind(struct netif *netif) netif_set_addr(netif, &autoip->llipaddr, &sn_mask, &gw_addr); /* interface is used by routing now that an address is set */ +#if ESP_LWIP + struct dhcp *dhcp = netif_dhcp_data(netif); + if (dhcp->cb != NULL) { + dhcp->cb(netif); + } +#endif + return ERR_OK; } diff --git a/components/lwip/lwip/src/core/ipv4/dhcp.c b/components/lwip/lwip/src/core/ipv4/dhcp.c index fe373b1f..7590b6bc 100644 --- a/components/lwip/lwip/src/core/ipv4/dhcp.c +++ b/components/lwip/lwip/src/core/ipv4/dhcp.c @@ -1954,4 +1954,23 @@ dhcp_supplied_address(const struct netif *netif) return 0; } +#if ESP_LWIP +/** Set callback for dhcp, reserved parameter for future use. + * + * @param netif the netif from which to remove the struct dhcp + * @param cb callback for dhcp + */ +void dhcp_set_cb(struct netif *netif, void (*cb)(struct netif*)) +{ + struct dhcp *dhcp; + dhcp = netif_dhcp_data(netif); + + LWIP_ASSERT("netif != NULL", netif != NULL); + + if (dhcp != NULL) { + dhcp->cb = cb; + } +} +#endif + #endif /* LWIP_IPV4 && LWIP_DHCP */ diff --git a/components/lwip/lwip/src/include/lwip/dhcp.h b/components/lwip/lwip/src/include/lwip/dhcp.h index df932afb..4edc5175 100644 --- a/components/lwip/lwip/src/include/lwip/dhcp.h +++ b/components/lwip/lwip/src/include/lwip/dhcp.h @@ -103,6 +103,10 @@ struct dhcp ip4_addr_t offered_si_addr; char boot_file_name[DHCP_BOOT_FILE_LEN]; #endif /* LWIP_DHCP_BOOTPFILE */ + +#if ESP_LWIP + void (*cb)(struct netif*); /* callback for dhcp, add a parameter to show dhcp status if needed */ +#endif }; @@ -134,6 +138,10 @@ extern void dhcp_set_ntp_servers(u8_t num_ntp_servers, const ip4_addr_t* ntp_ser #define netif_dhcp_data(netif) ((struct dhcp*)netif_get_client_data(netif, LWIP_NETIF_CLIENT_DATA_INDEX_DHCP)) +#ifdef ESP_LWIP +void dhcp_set_cb(struct netif *netif, void (*cb)(struct netif*)); +#endif + #ifdef __cplusplus } #endif diff --git a/components/tcpip_adapter/tcpip_adapter_lwip.c b/components/tcpip_adapter/tcpip_adapter_lwip.c index 69aaa3f0..80e92490 100644 --- a/components/tcpip_adapter/tcpip_adapter_lwip.c +++ b/components/tcpip_adapter/tcpip_adapter_lwip.c @@ -98,9 +98,17 @@ static void tcpip_adapter_dhcps_cb(u8_t client_ip[4]) static err_t _dhcp_start(struct tcpip_api_call_data *p) { + err_t ret; struct tcpip_adapter_api_call_data *call = (struct tcpip_adapter_api_call_data *)p; - return dhcp_start(call->netif); + ret = dhcp_start(call->netif); + +#if ESP_LWIP + if (ret == ERR_OK) + dhcp_set_cb(call->netif, tcpip_adapter_dhcpc_cb); +#endif + + return ret; } static err_t _dhcp_stop(struct tcpip_api_call_data *p)