diff --git a/tools/sdk/changelog.txt b/tools/sdk/changelog.txt index fb6a2fc3e..0b722598f 100644 --- a/tools/sdk/changelog.txt +++ b/tools/sdk/changelog.txt @@ -1,3 +1,41 @@ +ESP8266_NONOS_SDK_V1.5.3_16_04_16 Release Note +---------------------------------------------- +Optimization: +1. Supported ISSI flash. +2. SmartConfig updated to version 2.5.4, solved the issue that AirKiss may fail in certain cases. +3. libphy.a updated to version 9281. +4. AT updated to version 1.00. +5. Added lwip_open_src_template_proj in ESP8266_NONOS_SDK\examples for open source LWIP. +6. Added peripheral_test in ESP8266_NONOS_SDK\examples. +7. Moved driver_lib folder to be as ESP8266_NONOS_SDK\driver_lib. +8. Added SPI driver, refer to ESP8266_NONOS_SDK\driver_lib\driver\spi_interface.c. +9. Optimized espconn. +10. Optimized DNS function. +11. Optimized mDNS function. +12. Optimized the disconnection when ESP8266 runs as TCP server. +13. Optimized DHCP server: after DHCP release, it will assign the first unused IP to next DHCP client. +14. Removed the limitation of freedom sending unencrypted beacon/probe req/probe resp. +15. Resolved the issue that wifi_station_get_connect_status returned incorrect status when some router restarted. +16. Revised the SSL server crash issue. + +Added APIs: +1. WPA2-Enterprise APIs +wifi_station_set_username : set user name for WPA2-Enterprise +wifi_station_clear_username : clear user name for WPA2-Enterprise +2. AT APIs +at_set_escape_character : set escape character for AT commands + +AT_V1.0 Release Note: +Optimization: +1. Revised the flash map of AT firmware in no bootmode, please download the bin files according to at\readme. +2. Revised the problem that AT+PING may fail when using some special router. +3. Optimized AT firmware when receiving TCP data with UART flow control. + +Added AT commands +1. AT+CIPDOMAIN: for DNS function. + + + ESP8266_NONOS_SDK_V1.5.2_16_01_29 Release Note ---------------------------------------------- diff --git a/tools/sdk/include/at_custom.h b/tools/sdk/include/at_custom.h index 59f1a578d..e856ee79c 100644 --- a/tools/sdk/include/at_custom.h +++ b/tools/sdk/include/at_custom.h @@ -37,6 +37,8 @@ typedef void (*at_custom_uart_rx_intr)(uint8* data,int32 len); typedef void (*at_custom_response_func_type)(const char *str); +typedef void (*at_fake_uart_tx_func_type)(const uint8*data,uint32 length); + extern uint8 at_customLinkMax; /** @@ -140,4 +142,27 @@ uint32 at_get_version(void); * @retval None */ void at_register_uart_rx_intr(at_custom_uart_rx_intr rx_func); +/** + * @brief notify at module that has receive data + * @param data: data buffer. + * @param length: data length + * @retval data len,if ok len == length + */ +uint32 at_fake_uart_rx(uint8* data,uint32 length); + +/** + * @brief enable fake uart,and register fake uart tx + * @param enable: enable fake uart. + * @param at_fake_uart_tx_func: + * @retval data len,if ok len == length + */ +bool at_fake_uart_enable(bool enable,at_fake_uart_tx_func_type at_fake_uart_tx_func); + +/** + * @brief set at escape character + * @param ch: escape character. + * @retval TRUE,if set ok,otherwize FALSE. + */ +bool at_set_escape_character(uint8 ch); + #endif diff --git a/tools/sdk/include/user_interface.h b/tools/sdk/include/user_interface.h index 19492e618..743f413aa 100644 --- a/tools/sdk/include/user_interface.h +++ b/tools/sdk/include/user_interface.h @@ -356,6 +356,9 @@ sleep_type_t wifi_get_sleep_type(void); void wifi_fpm_open(void); void wifi_fpm_close(void); void wifi_fpm_do_wakeup(void); +typedef void (*fpm_wakeup_cb)(void); +void wifi_fpm_set_wakeup_cb(fpm_wakeup_cb cb); + sint8 wifi_fpm_do_sleep(uint32 sleep_time_in_us); void wifi_fpm_set_sleep_type(sleep_type_t type); sleep_type_t wifi_fpm_get_sleep_type(void); diff --git a/tools/sdk/lib/libat.a b/tools/sdk/lib/libat.a index 819fa79ae..4db6a1033 100644 Binary files a/tools/sdk/lib/libat.a and b/tools/sdk/lib/libat.a differ diff --git a/tools/sdk/lib/liblwip.a b/tools/sdk/lib/liblwip.a index 06dd54f3f..dbe722dff 100644 Binary files a/tools/sdk/lib/liblwip.a and b/tools/sdk/lib/liblwip.a differ diff --git a/tools/sdk/lib/libmain.a b/tools/sdk/lib/libmain.a index 5d6b763a6..05857bb83 100644 Binary files a/tools/sdk/lib/libmain.a and b/tools/sdk/lib/libmain.a differ diff --git a/tools/sdk/lib/libnet80211.a b/tools/sdk/lib/libnet80211.a index ad088c4b2..3461bae89 100644 Binary files a/tools/sdk/lib/libnet80211.a and b/tools/sdk/lib/libnet80211.a differ diff --git a/tools/sdk/lib/libphy.a b/tools/sdk/lib/libphy.a index 5ba5d47d8..64b17ca26 100644 Binary files a/tools/sdk/lib/libphy.a and b/tools/sdk/lib/libphy.a differ diff --git a/tools/sdk/lib/libpp.a b/tools/sdk/lib/libpp.a index 060cd4a31..ec5004193 100644 Binary files a/tools/sdk/lib/libpp.a and b/tools/sdk/lib/libpp.a differ diff --git a/tools/sdk/lib/libsmartconfig.a b/tools/sdk/lib/libsmartconfig.a index 3aaa3573c..c0d4e27bd 100644 Binary files a/tools/sdk/lib/libsmartconfig.a and b/tools/sdk/lib/libsmartconfig.a differ diff --git a/tools/sdk/lib/libssl.a b/tools/sdk/lib/libssl.a index 86b360ee9..14e131a6b 100644 Binary files a/tools/sdk/lib/libssl.a and b/tools/sdk/lib/libssl.a differ diff --git a/tools/sdk/lib/libupgrade.a b/tools/sdk/lib/libupgrade.a index 926c8564b..4ff86489d 100644 Binary files a/tools/sdk/lib/libupgrade.a and b/tools/sdk/lib/libupgrade.a differ diff --git a/tools/sdk/lwip/include/lwip/app/dhcpserver.h b/tools/sdk/lwip/include/lwip/app/dhcpserver.h index 6a82cefee..63e762c6e 100644 --- a/tools/sdk/lwip/include/lwip/app/dhcpserver.h +++ b/tools/sdk/lwip/include/lwip/app/dhcpserver.h @@ -35,10 +35,23 @@ enum dhcps_offer_option{ }; #endif +typedef enum { + DHCPS_TYPE_DYNAMIC, + DHCPS_TYPE_STATIC +} dhcps_type_t; + +typedef enum { + DHCPS_STATE_ONLINE, + DHCPS_STATE_OFFLINE +} dhcps_state_t; + struct dhcps_pool{ struct ip_addr ip; uint8 mac[6]; uint32 lease_timer; + dhcps_type_t type; + dhcps_state_t state; + }; typedef struct _list_node{ diff --git a/tools/sdk/lwip/include/lwip/app/espconn.h b/tools/sdk/lwip/include/lwip/app/espconn.h index ae9ed5019..9738b5e22 100644 --- a/tools/sdk/lwip/include/lwip/app/espconn.h +++ b/tools/sdk/lwip/include/lwip/app/espconn.h @@ -127,6 +127,14 @@ enum espconn_level{ ESPCONN_KEEPCNT }; +enum espconn_mode{ + ESPCONN_NOMODE, + ESPCONN_TCPSERVER_MODE, + ESPCONN_TCPCLIENT_MODE, + ESPCONN_UDP_MODE, + ESPCONN_NUM_MODE +}; + struct espconn_packet{ uint16 sent_length; /* sent length successful*/ uint16 snd_buf_size; /* Available buffer size for sending */ @@ -169,6 +177,7 @@ typedef struct _espconn_msg{ struct espconn *pespconn; comon_pkt pcommon; uint8 count_opt; + uint8 espconn_mode; sint16_t hs_status; //the status of the handshake void *preverse; void *pssl; diff --git a/tools/sdk/lwip/include/lwipopts.h b/tools/sdk/lwip/include/lwipopts.h index 1ddd9ec5b..f16b424c0 100644 --- a/tools/sdk/lwip/include/lwipopts.h +++ b/tools/sdk/lwip/include/lwipopts.h @@ -569,7 +569,7 @@ * IP_DEFAULT_TTL: Default value for Time-To-Live used by transport layers. */ #ifndef IP_DEFAULT_TTL -#define IP_DEFAULT_TTL 255 +#define IP_DEFAULT_TTL 128 #endif /** diff --git a/tools/sdk/lwip/src/app/dhcpserver.c b/tools/sdk/lwip/src/app/dhcpserver.c index ba6fd14b1..916b46398 100644 --- a/tools/sdk/lwip/src/app/dhcpserver.c +++ b/tools/sdk/lwip/src/app/dhcpserver.c @@ -1,5 +1,5 @@ #include "lwip/inet.h" -#include "lwip/err.h" +#include "lwip/err.h" #include "lwip/pbuf.h" #include "lwip/udp.h" #include "lwip/mem.h" @@ -24,15 +24,18 @@ static struct udp_pcb *pcb_dhcps = NULL; static struct ip_addr broadcast_dhcps; static struct ip_addr server_address; static struct ip_addr client_address;//added -static struct ip_addr client_address_plus; static struct dhcps_lease dhcps_lease; //static bool dhcps_lease_flag = true; static list_node *plist = NULL; static uint8 offer = 0xFF; static bool renew = false; -#define DHCPS_LEASE_TIME_DEF (120) +#define DHCPS_LEASE_TIME_DEF (120) uint32 dhcps_lease_time = DHCPS_LEASE_TIME_DEF; //minute + +void wifi_softap_dhcps_client_leave(u8 *bssid, struct ip_addr *ip,bool force); +uint32 wifi_softap_dhcps_client_update(u8 *bssid, struct ip_addr *ip); + /****************************************************************************** * FunctionName : node_insert_to_list * Description : insert the node to the list @@ -41,20 +44,20 @@ uint32 dhcps_lease_time = DHCPS_LEASE_TIME_DEF; //minute *******************************************************************************/ void ICACHE_FLASH_ATTR node_insert_to_list(list_node **phead, list_node* pinsert) { - list_node *plist = NULL; - struct dhcps_pool *pdhcps_pool = NULL; - struct dhcps_pool *pdhcps_node = NULL; - if (*phead == NULL) - *phead = pinsert; - else { - plist = *phead; - pdhcps_node = pinsert->pnode; - pdhcps_pool = plist->pnode; + list_node *plist = NULL; + struct dhcps_pool *pdhcps_pool = NULL; + struct dhcps_pool *pdhcps_node = NULL; + if (*phead == NULL) + *phead = pinsert; + else { + plist = *phead; + pdhcps_node = pinsert->pnode; + pdhcps_pool = plist->pnode; - if(pdhcps_node->ip.addr < pdhcps_pool->ip.addr) { - pinsert->pnext = plist; - *phead = pinsert; - } else { + if(pdhcps_node->ip.addr < pdhcps_pool->ip.addr) { + pinsert->pnext = plist; + *phead = pinsert; + } else { while (plist->pnext != NULL) { pdhcps_pool = plist->pnext->pnode; if (pdhcps_node->ip.addr < pdhcps_pool->ip.addr) { @@ -68,9 +71,9 @@ void ICACHE_FLASH_ATTR node_insert_to_list(list_node **phead, list_node* pinsert if(plist->pnext == NULL) { plist->pnext = pinsert; } - } - } -// pinsert->pnext = NULL; + } + } +// pinsert->pnext = NULL; } /****************************************************************************** @@ -81,23 +84,23 @@ void ICACHE_FLASH_ATTR node_insert_to_list(list_node **phead, list_node* pinsert *******************************************************************************/ void ICACHE_FLASH_ATTR node_remove_from_list(list_node **phead, list_node* pdelete) { - list_node *plist = NULL; + list_node *plist = NULL; - plist = *phead; - if (plist == NULL){ - *phead = NULL; - } else { - if (plist == pdelete){ - *phead = plist->pnext; - } else { - while (plist != NULL) { - if (plist->pnext == pdelete){ - plist->pnext = pdelete->pnext; - } - plist = plist->pnext; - } - } - } + plist = *phead; + if (plist == NULL){ + *phead = NULL; + } else { + if (plist == pdelete){ + *phead = plist->pnext; + } else { + while (plist != NULL) { + if (plist->pnext == pdelete){ + plist->pnext = pdelete->pnext; + } + plist = plist->pnext; + } + } + } } /////////////////////////////////////////////////////////////////////////////////// /* @@ -136,14 +139,14 @@ static uint8_t* ICACHE_FLASH_ATTR add_offer_options(uint8_t *optptr) *optptr++ = DHCP_OPTION_SUBNET_MASK; *optptr++ = 4; //length *optptr++ = 255; - *optptr++ = 240; + *optptr++ = 240; *optptr++ = 0; *optptr++ = 0; #else *optptr++ = DHCP_OPTION_SUBNET_MASK; *optptr++ = 4; *optptr++ = 255; - *optptr++ = 255; + *optptr++ = 255; *optptr++ = 255; *optptr++ = 0; #endif @@ -163,25 +166,25 @@ static uint8_t* ICACHE_FLASH_ATTR add_offer_options(uint8_t *optptr) *optptr++ = ip4_addr4( &ipadd); if (dhcps_router_enabled(offer)){ - struct ip_info if_ip; - os_bzero(&if_ip, sizeof(struct ip_info)); - wifi_get_ip_info(SOFTAP_IF, &if_ip); + struct ip_info if_ip; + os_bzero(&if_ip, sizeof(struct ip_info)); + wifi_get_ip_info(SOFTAP_IF, &if_ip); - *optptr++ = DHCP_OPTION_ROUTER; - *optptr++ = 4; - *optptr++ = ip4_addr1( &if_ip.gw); - *optptr++ = ip4_addr2( &if_ip.gw); - *optptr++ = ip4_addr3( &if_ip.gw); - *optptr++ = ip4_addr4( &if_ip.gw); + *optptr++ = DHCP_OPTION_ROUTER; + *optptr++ = 4; + *optptr++ = ip4_addr1( &if_ip.gw); + *optptr++ = ip4_addr2( &if_ip.gw); + *optptr++ = ip4_addr3( &if_ip.gw); + *optptr++ = ip4_addr4( &if_ip.gw); } #ifdef USE_DNS - *optptr++ = DHCP_OPTION_DNS_SERVER; - *optptr++ = 4; - *optptr++ = ip4_addr1( &ipadd); - *optptr++ = ip4_addr2( &ipadd); - *optptr++ = ip4_addr3( &ipadd); - *optptr++ = ip4_addr4( &ipadd); + *optptr++ = DHCP_OPTION_DNS_SERVER; + *optptr++ = 4; + *optptr++ = ip4_addr1( &ipadd); + *optptr++ = ip4_addr2( &ipadd); + *optptr++ = ip4_addr3( &ipadd); + *optptr++ = ip4_addr4( &ipadd); #endif #ifdef CLASS_B_NET @@ -203,10 +206,10 @@ static uint8_t* ICACHE_FLASH_ATTR add_offer_options(uint8_t *optptr) *optptr++ = DHCP_OPTION_INTERFACE_MTU; *optptr++ = 2; #ifdef CLASS_B_NET - *optptr++ = 0x05; + *optptr++ = 0x05; *optptr++ = 0xdc; #else - *optptr++ = 0x02; + *optptr++ = 0x02; *optptr++ = 0x40; #endif @@ -214,15 +217,15 @@ static uint8_t* ICACHE_FLASH_ATTR add_offer_options(uint8_t *optptr) *optptr++ = 1; *optptr++ = 0x00; - *optptr++ = 43; - *optptr++ = 6; + *optptr++ = 43; + *optptr++ = 6; - *optptr++ = 0x01; + *optptr++ = 0x01; *optptr++ = 4; *optptr++ = 0x00; *optptr++ = 0x00; *optptr++ = 0x00; - *optptr++ = 0x02; + *optptr++ = 0x02; return optptr; } @@ -247,7 +250,7 @@ static void ICACHE_FLASH_ATTR create_msg(struct dhcps_msg *m) { struct ip_addr client; - client.addr = *( (uint32_t *) &client_address); + client.addr = client_address.addr; m->op = DHCP_REPLY; m->htype = DHCP_HTYPE_ETHERNET; @@ -278,61 +281,55 @@ static void ICACHE_FLASH_ATTR create_msg(struct dhcps_msg *m) static void ICACHE_FLASH_ATTR send_offer(struct dhcps_msg *m) { uint8_t *end; - struct pbuf *p, *q; - u8_t *data; - u16_t cnt=0; - u16_t i; - err_t SendOffer_err_t; + struct pbuf *p, *q; + u8_t *data; + u16_t cnt=0; + u16_t i; + err_t SendOffer_err_t; create_msg(m); end = add_msg_type(&m->options[4], DHCPOFFER); end = add_offer_options(end); end = add_end(end); - p = pbuf_alloc(PBUF_TRANSPORT, sizeof(struct dhcps_msg), PBUF_RAM); + p = pbuf_alloc(PBUF_TRANSPORT, sizeof(struct dhcps_msg), PBUF_RAM); #if DHCPS_DEBUG - os_printf("udhcp: send_offer>>p->ref = %d\n", p->ref); + os_printf("udhcp: send_offer>>p->ref = %d\n", p->ref); #endif - if(p != NULL){ - -#if DHCPS_DEBUG - os_printf("dhcps: send_offer>>pbuf_alloc succeed\n"); - os_printf("dhcps: send_offer>>p->tot_len = %d\n", p->tot_len); - os_printf("dhcps: send_offer>>p->len = %d\n", p->len); -#endif - q = p; - while(q != NULL){ - data = (u8_t *)q->payload; - for(i=0; ilen; i++) - { - data[i] = ((u8_t *) m)[cnt++]; -#if DHCPS_DEBUG - os_printf("%02x ",data[i]); - if((i+1)%16 == 0){ - os_printf("\n"); - } -#endif - } + if(p != NULL){ - q = q->next; - } - }else{ - #if DHCPS_DEBUG - os_printf("dhcps: send_offer>>pbuf_alloc failed\n"); + os_printf("dhcps: send_offer>>pbuf_alloc succeed\n"); + os_printf("dhcps: send_offer>>p->tot_len = %d\n", p->tot_len); + os_printf("dhcps: send_offer>>p->len = %d\n", p->len); #endif - return; - } + q = p; + while(q != NULL){ + data = (u8_t *)q->payload; + for(i=0; ilen; i++) + { + data[i] = ((u8_t *) m)[cnt++]; + } + + q = q->next; + } + }else{ + +#if DHCPS_DEBUG + os_printf("dhcps: send_offer>>pbuf_alloc failed\n"); +#endif + return; + } SendOffer_err_t = udp_sendto( pcb_dhcps, p, &broadcast_dhcps, DHCPS_CLIENT_PORT ); #if DHCPS_DEBUG - os_printf("dhcps: send_offer>>udp_sendto result %x\n",SendOffer_err_t); + os_printf("dhcps: send_offer>>udp_sendto result %x\n",SendOffer_err_t); #endif - if(p->ref != 0){ + if(p->ref != 0){ #if DHCPS_DEBUG - os_printf("udhcp: send_offer>>free pbuf\n"); + os_printf("udhcp: send_offer>>free pbuf\n"); #endif - pbuf_free(p); - } + pbuf_free(p); + } } /////////////////////////////////////////////////////////////////////////////////// /* @@ -344,61 +341,55 @@ static void ICACHE_FLASH_ATTR send_offer(struct dhcps_msg *m) static void ICACHE_FLASH_ATTR send_nak(struct dhcps_msg *m) { - u8_t *end; - struct pbuf *p, *q; - u8_t *data; - u16_t cnt=0; - u16_t i; - err_t SendNak_err_t; + u8_t *end; + struct pbuf *p, *q; + u8_t *data; + u16_t cnt=0; + u16_t i; + err_t SendNak_err_t; create_msg(m); end = add_msg_type(&m->options[4], DHCPNAK); end = add_end(end); - p = pbuf_alloc(PBUF_TRANSPORT, sizeof(struct dhcps_msg), PBUF_RAM); + p = pbuf_alloc(PBUF_TRANSPORT, sizeof(struct dhcps_msg), PBUF_RAM); #if DHCPS_DEBUG - os_printf("udhcp: send_nak>>p->ref = %d\n", p->ref); + os_printf("udhcp: send_nak>>p->ref = %d\n", p->ref); #endif - if(p != NULL){ - -#if DHCPS_DEBUG - os_printf("dhcps: send_nak>>pbuf_alloc succeed\n"); - os_printf("dhcps: send_nak>>p->tot_len = %d\n", p->tot_len); - os_printf("dhcps: send_nak>>p->len = %d\n", p->len); -#endif - q = p; - while(q != NULL){ - data = (u8_t *)q->payload; - for(i=0; ilen; i++) - { - data[i] = ((u8_t *) m)[cnt++]; -#if DHCPS_DEBUG - os_printf("%02x ",data[i]); - if((i+1)%16 == 0){ - os_printf("\n"); - } -#endif - } + if(p != NULL){ - q = q->next; - } - }else{ - #if DHCPS_DEBUG - os_printf("dhcps: send_nak>>pbuf_alloc failed\n"); + os_printf("dhcps: send_nak>>pbuf_alloc succeed\n"); + os_printf("dhcps: send_nak>>p->tot_len = %d\n", p->tot_len); + os_printf("dhcps: send_nak>>p->len = %d\n", p->len); #endif - return; - } + q = p; + while(q != NULL){ + data = (u8_t *)q->payload; + for(i=0; ilen; i++) + { + data[i] = ((u8_t *) m)[cnt++]; + } + + q = q->next; + } + }else{ + +#if DHCPS_DEBUG + os_printf("dhcps: send_nak>>pbuf_alloc failed\n"); +#endif + return; + } SendNak_err_t = udp_sendto( pcb_dhcps, p, &broadcast_dhcps, DHCPS_CLIENT_PORT ); #if DHCPS_DEBUG - os_printf("dhcps: send_nak>>udp_sendto result %x\n",SendNak_err_t); + os_printf("dhcps: send_nak>>udp_sendto result %x\n",SendNak_err_t); #endif - if(p->ref != 0){ -#if DHCPS_DEBUG - os_printf("udhcp: send_nak>>free pbuf\n"); + if(p->ref != 0){ +#if DHCPS_DEBUG + os_printf("udhcp: send_nak>>free pbuf\n"); #endif - pbuf_free(p); - } + pbuf_free(p); + } } /////////////////////////////////////////////////////////////////////////////////// /* @@ -410,63 +401,57 @@ static void ICACHE_FLASH_ATTR send_nak(struct dhcps_msg *m) static void ICACHE_FLASH_ATTR send_ack(struct dhcps_msg *m) { - u8_t *end; - struct pbuf *p, *q; - u8_t *data; - u16_t cnt=0; - u16_t i; - err_t SendAck_err_t; + u8_t *end; + struct pbuf *p, *q; + u8_t *data; + u16_t cnt=0; + u16_t i; + err_t SendAck_err_t; create_msg(m); end = add_msg_type(&m->options[4], DHCPACK); end = add_offer_options(end); end = add_end(end); - - p = pbuf_alloc(PBUF_TRANSPORT, sizeof(struct dhcps_msg), PBUF_RAM); -#if DHCPS_DEBUG - os_printf("udhcp: send_ack>>p->ref = %d\n", p->ref); -#endif - if(p != NULL){ - -#if DHCPS_DEBUG - os_printf("dhcps: send_ack>>pbuf_alloc succeed\n"); - os_printf("dhcps: send_ack>>p->tot_len = %d\n", p->tot_len); - os_printf("dhcps: send_ack>>p->len = %d\n", p->len); -#endif - q = p; - while(q != NULL){ - data = (u8_t *)q->payload; - for(i=0; ilen; i++) - { - data[i] = ((u8_t *) m)[cnt++]; -#if DHCPS_DEBUG - os_printf("%02x ",data[i]); - if((i+1)%16 == 0){ - os_printf("\n"); - } -#endif - } - q = q->next; - } - }else{ - + p = pbuf_alloc(PBUF_TRANSPORT, sizeof(struct dhcps_msg), PBUF_RAM); #if DHCPS_DEBUG - os_printf("dhcps: send_ack>>pbuf_alloc failed\n"); + os_printf("udhcp: send_ack>>p->ref = %d\n", p->ref); #endif - return; - } + if(p != NULL){ + +#if DHCPS_DEBUG + os_printf("dhcps: send_ack>>pbuf_alloc succeed\n"); + os_printf("dhcps: send_ack>>p->tot_len = %d\n", p->tot_len); + os_printf("dhcps: send_ack>>p->len = %d\n", p->len); +#endif + q = p; + while(q != NULL){ + data = (u8_t *)q->payload; + for(i=0; ilen; i++) + { + data[i] = ((u8_t *) m)[cnt++]; + } + + q = q->next; + } + }else{ + +#if DHCPS_DEBUG + os_printf("dhcps: send_ack>>pbuf_alloc failed\n"); +#endif + return; + } SendAck_err_t = udp_sendto( pcb_dhcps, p, &broadcast_dhcps, DHCPS_CLIENT_PORT ); #if DHCPS_DEBUG - os_printf("dhcps: send_ack>>udp_sendto result %x\n",SendAck_err_t); + os_printf("dhcps: send_ack>>udp_sendto result %x\n",SendAck_err_t); #endif - - if(p->ref != 0){ + + if(p->ref != 0){ #if DHCPS_DEBUG - os_printf("udhcp: send_ack>>free pbuf\n"); + os_printf("udhcp: send_ack>>free pbuf\n"); #endif - pbuf_free(p); - } + pbuf_free(p); + } } /////////////////////////////////////////////////////////////////////////////////// /* @@ -481,10 +466,10 @@ static void ICACHE_FLASH_ATTR send_ack(struct dhcps_msg *m) static uint8_t ICACHE_FLASH_ATTR parse_options(uint8_t *optptr, sint16_t len) { struct ip_addr client; - bool is_dhcp_parse_end = false; - struct dhcps_state s; + bool is_dhcp_parse_end = false; + struct dhcps_state s; - client.addr = *( (uint32_t *) &client_address); + client.addr = *( (uint32_t *) &client_address);// Ҫ�����DHCP�ͻ��˵�IP u8_t *end = optptr + len; u16_t type = 0; @@ -493,51 +478,51 @@ static uint8_t ICACHE_FLASH_ATTR parse_options(uint8_t *optptr, sint16_t len) while (optptr < end) { #if DHCPS_DEBUG - os_printf("dhcps: (sint16_t)*optptr = %d\n", (sint16_t)*optptr); + os_printf("dhcps: (sint16_t)*optptr = %d\n", (sint16_t)*optptr); #endif - switch ((sint16_t) *optptr) { + switch ((sint16_t) *optptr) { - case DHCP_OPTION_MSG_TYPE: //53 + case DHCP_OPTION_MSG_TYPE: //53 type = *(optptr + 2); break; case DHCP_OPTION_REQ_IPADDR://50 + //os_printf("dhcps:0x%08x,0x%08x\n",client.addr,*(uint32*)(optptr+2)); if( os_memcmp( (char *) &client.addr, (char *) optptr+2,4)==0 ) { #if DHCPS_DEBUG - os_printf("dhcps: DHCP_OPTION_REQ_IPADDR = 0 ok\n"); + os_printf("dhcps: DHCP_OPTION_REQ_IPADDR = 0 ok\n"); #endif s.state = DHCPS_STATE_ACK; }else { #if DHCPS_DEBUG - os_printf("dhcps: DHCP_OPTION_REQ_IPADDR != 0 err\n"); + os_printf("dhcps: DHCP_OPTION_REQ_IPADDR != 0 err\n"); #endif s.state = DHCPS_STATE_NAK; } break; case DHCP_OPTION_END: - { - is_dhcp_parse_end = true; - } + { + is_dhcp_parse_end = true; + } break; } - if(is_dhcp_parse_end){ - break; - } + if(is_dhcp_parse_end){ + break; + } optptr += optptr[1] + 2; } switch (type){ - - case DHCPDISCOVER://1 + case DHCPDISCOVER://1 s.state = DHCPS_STATE_OFFER; #if DHCPS_DEBUG - os_printf("dhcps: DHCPD_STATE_OFFER\n"); + os_printf("dhcps: DHCPD_STATE_OFFER\n"); #endif break; - case DHCPREQUEST://3 + case DHCPREQUEST://3 if ( !(s.state == DHCPS_STATE_ACK || s.state == DHCPS_STATE_NAK) ) { if(renew == true) { s.state = DHCPS_STATE_ACK; @@ -545,185 +530,51 @@ static uint8_t ICACHE_FLASH_ATTR parse_options(uint8_t *optptr, sint16_t len) s.state = DHCPS_STATE_NAK; } #if DHCPS_DEBUG - os_printf("dhcps: DHCPD_STATE_NAK\n"); + os_printf("dhcps: DHCPD_STATE_NAK\n"); #endif } break; - case DHCPDECLINE://4 + case DHCPDECLINE://4 s.state = DHCPS_STATE_IDLE; #if DHCPS_DEBUG - os_printf("dhcps: DHCPD_STATE_IDLE\n"); + os_printf("dhcps: DHCPD_STATE_IDLE\n"); #endif break; - case DHCPRELEASE://7 + case DHCPRELEASE://7 s.state = DHCPS_STATE_RELEASE; #if DHCPS_DEBUG - os_printf("dhcps: DHCPD_STATE_IDLE\n"); + os_printf("dhcps: DHCPD_STATE_IDLE\n"); #endif break; } #if DHCPS_DEBUG - os_printf("dhcps: return s.state = %d\n", s.state); + os_printf("dhcps: return s.state = %d\n", s.state); #endif return s.state; } /////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////// static sint16_t ICACHE_FLASH_ATTR parse_msg(struct dhcps_msg *m, u16_t len) -{ - if(os_memcmp((char *)m->options, - &magic_cookie, - sizeof(magic_cookie)) == 0){ -#if DHCPS_DEBUG - os_printf("dhcps: len = %d\n", len); -#endif - /* - * ��¼��ǰ��xid���ﴦ���? - * �˺�ΪDHCP�ͻ����������û�ͳһ��ȡIPʱ�� - */ -// if((old_xid[0] == 0) && -// (old_xid[1] == 0) && -// (old_xid[2] == 0) && -// (old_xid[3] == 0)){ -// /* -// * old_xidδ��¼�κ����? -// * �϶��ǵ�һ��ʹ�� -// */ -// os_memcpy((char *)old_xid, (char *)m->xid, sizeof(m->xid)); -// }else{ -// /* -// * ���δ����DHCP msg��Я���xid���ϴμ�¼�IJ�ͬ�� -// * �϶�Ϊ��ͬ��DHCP�ͻ��˷��ͣ���ʱ����Ҫ����Ŀͻ���IP -// * ���� 192.168.4.100(0x6404A8C0) <--> 192.168.4.200(0xC804A8C0) -// * -// */ -// if(os_memcmp((char *)old_xid, (char *)m->xid, sizeof(m->xid)) != 0){ - /* - * ��¼���ε�xid�ţ�ͬʱ�����IP���� - */ - struct ip_addr addr_tmp; -// os_memcpy((char *)old_xid, (char *)m->xid, sizeof(m->xid)); +{ + if(os_memcmp((char *)m->options, + &magic_cookie, + sizeof(magic_cookie)) == 0){ + struct ip_addr ip; + os_memcpy(&ip.addr,m->ciaddr,sizeof(ip.addr)); + client_address.addr = wifi_softap_dhcps_client_update(m->chaddr,&ip); -// { - struct dhcps_pool *pdhcps_pool = NULL; - list_node *pnode = NULL; - list_node *pback_node = NULL; - struct ip_addr first_address; - bool flag = false; + sint16_t ret = parse_options(&m->options[4], len); -// POOL_START: - first_address.addr = dhcps_lease.start_ip.addr; - client_address.addr = client_address_plus.addr; - renew = false; -// addr_tmp.addr = htonl(client_address_plus.addr); -// addr_tmp.addr++; -// client_address_plus.addr = htonl(addr_tmp.addr); - for (pback_node = plist; pback_node != NULL;pback_node = pback_node->pnext) { - pdhcps_pool = pback_node->pnode; - if (os_memcmp(pdhcps_pool->mac, m->chaddr, sizeof(pdhcps_pool->mac)) == 0){ -// os_printf("the same device request ip\n"); - if (os_memcmp(&pdhcps_pool->ip.addr, m->ciaddr, sizeof(pdhcps_pool->ip.addr)) == 0) { - renew = true; - } - client_address.addr = pdhcps_pool->ip.addr; - pdhcps_pool->lease_timer = DHCPS_LEASE_TIMER; - pnode = pback_node; - goto POOL_CHECK; - } else if (pdhcps_pool->ip.addr == client_address_plus.addr){ -// client_address.addr = client_address_plus.addr; -// os_printf("the ip addr has been request\n"); - addr_tmp.addr = htonl(client_address_plus.addr); - addr_tmp.addr++; - client_address_plus.addr = htonl(addr_tmp.addr); - client_address.addr = client_address_plus.addr; - } + if(ret == DHCPS_STATE_RELEASE) { + wifi_softap_dhcps_client_leave(m->chaddr,&ip,TRUE); // force to delete + client_address.addr = ip.addr; + } - if(flag == false) { // search the fisrt unused ip - if(first_address.addr < pdhcps_pool->ip.addr) { - flag = true; - } else { - addr_tmp.addr = htonl(first_address.addr); - addr_tmp.addr++; - first_address.addr = htonl(addr_tmp.addr); - } - } - } - if (client_address_plus.addr > dhcps_lease.end_ip.addr) { - client_address.addr = first_address.addr; - } - if (client_address.addr > dhcps_lease.end_ip.addr) { - client_address_plus.addr = dhcps_lease.start_ip.addr; - pdhcps_pool = NULL; - pnode = NULL; - } else { - pdhcps_pool = (struct dhcps_pool *)os_zalloc(sizeof(struct dhcps_pool)); - pdhcps_pool->ip.addr = client_address.addr; - os_memcpy(pdhcps_pool->mac, m->chaddr, sizeof(pdhcps_pool->mac)); - pdhcps_pool->lease_timer = DHCPS_LEASE_TIMER; - pnode = (list_node *)os_zalloc(sizeof(list_node )); - pnode->pnode = pdhcps_pool; - pnode->pnext = NULL; - node_insert_to_list(&plist,pnode); - if (client_address.addr == dhcps_lease.end_ip.addr) { - client_address_plus.addr = dhcps_lease.start_ip.addr; - } else { - addr_tmp.addr = htonl(client_address.addr); - addr_tmp.addr++; - client_address_plus.addr = htonl(addr_tmp.addr); - } - } - - POOL_CHECK: - if ((client_address.addr > dhcps_lease.end_ip.addr) || (ip_addr_isany(&client_address))){ - os_printf("client_address_plus.addr %x %d\n", client_address_plus.addr, system_get_free_heap_size()); - if(pnode != NULL) { - node_remove_from_list(&plist,pnode); - os_free(pnode); - pnode = NULL; - } - - if (pdhcps_pool != NULL) { - os_free(pdhcps_pool); - pdhcps_pool = NULL; - } -// client_address_plus.addr = dhcps_lease.start_ip.addr; - return 4; - } - - sint16_t ret = parse_options(&m->options[4], len);; - - if(ret == DHCPS_STATE_RELEASE) { - if(pnode != NULL) { - node_remove_from_list(&plist,pnode); - os_free(pnode); - pnode = NULL; - } - - if (pdhcps_pool != NULL) { - os_free(pdhcps_pool); - pdhcps_pool = NULL; - } - os_memset(&client_address,0x0,sizeof(client_address)); - } - - if (wifi_softap_set_station_info(m->chaddr, &client_address) == false) { - return 0; - } -// } - -#if DHCPS_DEBUG - os_printf("dhcps: xid changed\n"); - os_printf("dhcps: client_address.addr = %x\n", client_address.addr); -#endif - -// } - -// } - return ret; - } - return 0; + return ret; + } + return 0; } /////////////////////////////////////////////////////////////////////////////////// /* @@ -738,98 +589,86 @@ static sint16_t ICACHE_FLASH_ATTR parse_msg(struct dhcps_msg *m, u16_t len) */ /////////////////////////////////////////////////////////////////////////////////// static void ICACHE_FLASH_ATTR handle_dhcp(void *arg, - struct udp_pcb *pcb, - struct pbuf *p, - struct ip_addr *addr, - uint16_t port) + struct udp_pcb *pcb, + struct pbuf *p, + struct ip_addr *addr, + uint16_t port) { - struct dhcps_msg *pmsg_dhcps = NULL; - sint16_t tlen = 0; + struct dhcps_msg *pmsg_dhcps = NULL; + sint16_t tlen = 0; u16_t i = 0; - u16_t dhcps_msg_cnt = 0; - u8_t *p_dhcps_msg = NULL; - u8_t *data = NULL; + u16_t dhcps_msg_cnt = 0; + u8_t *p_dhcps_msg = NULL; + u8_t *data = NULL; #if DHCPS_DEBUG - os_printf("dhcps: handle_dhcp-> receive a packet\n"); + os_printf("dhcps: handle_dhcp-> receive a packet\n"); #endif - if (p==NULL) return; + if (p==NULL) return; - pmsg_dhcps = (struct dhcps_msg *)os_zalloc(sizeof(struct dhcps_msg)); - if (NULL == pmsg_dhcps){ - pbuf_free(p); - return; - } - p_dhcps_msg = (u8_t *)pmsg_dhcps; - tlen = p->tot_len; - data = p->payload; + pmsg_dhcps = (struct dhcps_msg *)os_zalloc(sizeof(struct dhcps_msg)); + if (NULL == pmsg_dhcps){ + pbuf_free(p); + return; + } + p_dhcps_msg = (u8_t *)pmsg_dhcps; + tlen = p->tot_len; + data = p->payload; #if DHCPS_DEBUG - os_printf("dhcps: handle_dhcp-> p->tot_len = %d\n", tlen); - os_printf("dhcps: handle_dhcp-> p->len = %d\n", p->len); -#endif + os_printf("dhcps: handle_dhcp-> p->tot_len = %d\n", tlen); + os_printf("dhcps: handle_dhcp-> p->len = %d\n", p->len); +#endif - for(i=0; ilen; i++){ - p_dhcps_msg[dhcps_msg_cnt++] = data[i]; -#if DHCPS_DEBUG - os_printf("%02x ",data[i]); - if((i+1)%16 == 0){ - os_printf("\n"); - } -#endif - } - - if(p->next != NULL) { -#if DHCPS_DEBUG - os_printf("dhcps: handle_dhcp-> p->next != NULL\n"); - os_printf("dhcps: handle_dhcp-> p->next->tot_len = %d\n",p->next->tot_len); - os_printf("dhcps: handle_dhcp-> p->next->len = %d\n",p->next->len); -#endif - - data = p->next->payload; - for(i=0; inext->len; i++){ - p_dhcps_msg[dhcps_msg_cnt++] = data[i]; -#if DHCPS_DEBUG - os_printf("%02x ",data[i]); - if((i+1)%16 == 0){ - os_printf("\n"); - } -#endif - } - } + for(i=0; ilen; i++){ + p_dhcps_msg[dhcps_msg_cnt++] = data[i]; + } - /* - * DHCP �ͻ���������Ϣ���� - */ + if(p->next != NULL) { #if DHCPS_DEBUG - os_printf("dhcps: handle_dhcp-> parse_msg(p)\n"); + os_printf("dhcps: handle_dhcp-> p->next != NULL\n"); + os_printf("dhcps: handle_dhcp-> p->next->tot_len = %d\n",p->next->tot_len); + os_printf("dhcps: handle_dhcp-> p->next->len = %d\n",p->next->len); #endif - + + data = p->next->payload; + for(i=0; inext->len; i++){ + p_dhcps_msg[dhcps_msg_cnt++] = data[i]; + } + } + + /* + * DHCP �ͻ���������Ϣ���� + */ +#if DHCPS_DEBUG + os_printf("dhcps: handle_dhcp-> parse_msg(p)\n"); +#endif + switch(parse_msg(pmsg_dhcps, tlen - 240)) { - case DHCPS_STATE_OFFER://1 + case DHCPS_STATE_OFFER://1 #if DHCPS_DEBUG - os_printf("dhcps: handle_dhcp-> DHCPD_STATE_OFFER\n"); -#endif - send_offer(pmsg_dhcps); - break; - case DHCPS_STATE_ACK://3 -#if DHCPS_DEBUG - os_printf("dhcps: handle_dhcp-> DHCPD_STATE_ACK\n"); -#endif - send_ack(pmsg_dhcps); - break; - case DHCPS_STATE_NAK://4 -#if DHCPS_DEBUG - os_printf("dhcps: handle_dhcp-> DHCPD_STATE_NAK\n"); + os_printf("dhcps: handle_dhcp-> DHCPD_STATE_OFFER\n"); #endif - send_nak(pmsg_dhcps); - break; - default : - break; + send_offer(pmsg_dhcps); + break; + case DHCPS_STATE_ACK://3 +#if DHCPS_DEBUG + os_printf("dhcps: handle_dhcp-> DHCPD_STATE_ACK\n"); +#endif + send_ack(pmsg_dhcps); + break; + case DHCPS_STATE_NAK://4 +#if DHCPS_DEBUG + os_printf("dhcps: handle_dhcp-> DHCPD_STATE_NAK\n"); +#endif + send_nak(pmsg_dhcps); + break; + default : + break; } #if DHCPS_DEBUG - os_printf("dhcps: handle_dhcp-> pbuf_free(p)\n"); + os_printf("dhcps: handle_dhcp-> pbuf_free(p)\n"); #endif pbuf_free(p); os_free(pmsg_dhcps); @@ -838,270 +677,272 @@ static void ICACHE_FLASH_ATTR handle_dhcp(void *arg, /////////////////////////////////////////////////////////////////////////////////// static void ICACHE_FLASH_ATTR wifi_softap_init_dhcps_lease(uint32 ip) { - uint32 softap_ip = 0,local_ip = 0; - uint32 start_ip = 0; - uint32 end_ip = 0; -// if (dhcps_lease_flag) { - if (dhcps_lease.enable == TRUE) { - softap_ip = htonl(ip); - start_ip = htonl(dhcps_lease.start_ip.addr); - end_ip = htonl(dhcps_lease.end_ip.addr); - /*config ip information can't contain local ip*/ - if ((start_ip <= softap_ip) && (softap_ip <= end_ip)) { - dhcps_lease.enable = FALSE; - } else { - /*config ip information must be in the same segment as the local ip*/ - softap_ip >>= 8; - if (((start_ip >> 8 != softap_ip) || (end_ip >> 8 != softap_ip)) - || (end_ip - start_ip > DHCPS_MAX_LEASE)) { - dhcps_lease.enable = FALSE; - } - } - } + uint32 softap_ip = 0,local_ip = 0; + uint32 start_ip = 0; + uint32 end_ip = 0; +// if (dhcps_lease_flag) { + if (dhcps_lease.enable == TRUE) { + softap_ip = htonl(ip); + start_ip = htonl(dhcps_lease.start_ip.addr); + end_ip = htonl(dhcps_lease.end_ip.addr); + /*config ip information can't contain local ip*/ + if ((start_ip <= softap_ip) && (softap_ip <= end_ip)) { + dhcps_lease.enable = FALSE; + } else { + /*config ip information must be in the same segment as the local ip*/ + softap_ip >>= 8; + if (((start_ip >> 8 != softap_ip) || (end_ip >> 8 != softap_ip)) + || (end_ip - start_ip > DHCPS_MAX_LEASE)) { + dhcps_lease.enable = FALSE; + } + } + } - if (dhcps_lease.enable == FALSE) { - local_ip = softap_ip = htonl(ip); - softap_ip &= 0xFFFFFF00; - local_ip &= 0xFF; - if (local_ip >= 0x80) - local_ip -= DHCPS_MAX_LEASE; - else - local_ip ++; + if (dhcps_lease.enable == FALSE) { + local_ip = softap_ip = htonl(ip); + softap_ip &= 0xFFFFFF00; + local_ip &= 0xFF; + if (local_ip >= 0x80) + local_ip -= DHCPS_MAX_LEASE; + else + local_ip ++; - os_bzero(&dhcps_lease, sizeof(dhcps_lease)); - dhcps_lease.start_ip.addr = softap_ip | local_ip; - dhcps_lease.end_ip.addr = softap_ip | (local_ip + DHCPS_MAX_LEASE - 1); - dhcps_lease.start_ip.addr = htonl(dhcps_lease.start_ip.addr); - dhcps_lease.end_ip.addr= htonl(dhcps_lease.end_ip.addr); - } -// dhcps_lease.start_ip.addr = htonl(dhcps_lease.start_ip.addr); -// dhcps_lease.end_ip.addr= htonl(dhcps_lease.end_ip.addr); -// os_printf("start_ip = 0x%x, end_ip = 0x%x\n",dhcps_lease.start_ip, dhcps_lease.end_ip); + os_bzero(&dhcps_lease, sizeof(dhcps_lease)); + dhcps_lease.start_ip.addr = softap_ip | local_ip; + dhcps_lease.end_ip.addr = softap_ip | (local_ip + DHCPS_MAX_LEASE - 1); + dhcps_lease.start_ip.addr = htonl(dhcps_lease.start_ip.addr); + dhcps_lease.end_ip.addr= htonl(dhcps_lease.end_ip.addr); + } +// dhcps_lease.start_ip.addr = htonl(dhcps_lease.start_ip.addr); +// dhcps_lease.end_ip.addr= htonl(dhcps_lease.end_ip.addr); +// os_printf("start_ip = 0x%x, end_ip = 0x%x\n",dhcps_lease.start_ip, dhcps_lease.end_ip); } /////////////////////////////////////////////////////////////////////////////////// void ICACHE_FLASH_ATTR dhcps_start(struct ip_info *info) { - struct netif * apnetif = (struct netif *)eagle_lwip_getif(0x01); + struct netif * apnetif = (struct netif *)eagle_lwip_getif(0x01); - if(apnetif->dhcps_pcb != NULL) { + if(apnetif->dhcps_pcb != NULL) { udp_remove(apnetif->dhcps_pcb); } - pcb_dhcps = udp_new(); - if (pcb_dhcps == NULL || info ==NULL) { - os_printf("dhcps_start(): could not obtain pcb\n"); - } + pcb_dhcps = udp_new(); + if (pcb_dhcps == NULL || info ==NULL) { + os_printf("dhcps_start(): could not obtain pcb\n"); + } - apnetif->dhcps_pcb = pcb_dhcps; + apnetif->dhcps_pcb = pcb_dhcps; - IP4_ADDR(&broadcast_dhcps, 255, 255, 255, 255); + IP4_ADDR(&broadcast_dhcps, 255, 255, 255, 255); - server_address = info->ip; - wifi_softap_init_dhcps_lease(server_address.addr); - client_address_plus.addr = dhcps_lease.start_ip.addr; + server_address = info->ip; + wifi_softap_init_dhcps_lease(server_address.addr); - udp_bind(pcb_dhcps, IP_ADDR_ANY, DHCPS_SERVER_PORT); - udp_recv(pcb_dhcps, handle_dhcp, NULL); + udp_bind(pcb_dhcps, IP_ADDR_ANY, DHCPS_SERVER_PORT); + udp_recv(pcb_dhcps, handle_dhcp, NULL); #if DHCPS_DEBUG - os_printf("dhcps:dhcps_start->udp_recv function Set a receive callback handle_dhcp for UDP_PCB pcb_dhcps\n"); + os_printf("dhcps:dhcps_start->udp_recv function Set a receive callback handle_dhcp for UDP_PCB pcb_dhcps\n"); #endif - + } void ICACHE_FLASH_ATTR dhcps_stop(void) { - struct netif * apnetif = (struct netif *)eagle_lwip_getif(0x01); + struct netif * apnetif = (struct netif *)eagle_lwip_getif(0x01); - udp_disconnect(pcb_dhcps); -// dhcps_lease_flag = true; + udp_disconnect(pcb_dhcps); +// dhcps_lease_flag = true; if(apnetif->dhcps_pcb != NULL) { udp_remove(apnetif->dhcps_pcb); apnetif->dhcps_pcb = NULL; } - //udp_remove(pcb_dhcps); - list_node *pnode = NULL; - list_node *pback_node = NULL; - pnode = plist; - while (pnode != NULL) { - pback_node = pnode; - pnode = pback_node->pnext; - node_remove_from_list(&plist, pback_node); - os_free(pback_node->pnode); - pback_node->pnode = NULL; - os_free(pback_node); - pback_node = NULL; - } + //udp_remove(pcb_dhcps); + list_node *pnode = NULL; + list_node *pback_node = NULL; + pnode = plist; + while (pnode != NULL) { + pback_node = pnode; + pnode = pback_node->pnext; + node_remove_from_list(&plist, pback_node); + os_free(pback_node->pnode); + pback_node->pnode = NULL; + os_free(pback_node); + pback_node = NULL; + } } /****************************************************************************** * FunctionName : wifi_softap_set_dhcps_lease * Description : set the lease information of DHCP server * Parameters : please -- Additional argument to set the lease information, - * Little-Endian. + * Little-Endian. * Returns : true or false *******************************************************************************/ bool ICACHE_FLASH_ATTR wifi_softap_set_dhcps_lease(struct dhcps_lease *please) { - struct ip_info info; - uint32 softap_ip = 0; - uint32 start_ip = 0; - uint32 end_ip = 0; + struct ip_info info; + uint32 softap_ip = 0; + uint32 start_ip = 0; + uint32 end_ip = 0; - uint8 opmode = wifi_get_opmode(); + uint8 opmode = wifi_get_opmode(); - if (opmode == STATION_MODE || opmode == NULL_MODE) { - return false; - } + if (opmode == STATION_MODE || opmode == NULL_MODE) { + return false; + } - if (please == NULL || wifi_softap_dhcps_status() == DHCP_STARTED) - return false; + if (please == NULL || wifi_softap_dhcps_status() == DHCP_STARTED) + return false; - if(please->enable) { - os_bzero(&info, sizeof(struct ip_info)); - wifi_get_ip_info(SOFTAP_IF, &info); - softap_ip = htonl(info.ip.addr); - start_ip = htonl(please->start_ip.addr); - end_ip = htonl(please->end_ip.addr); + if(please->enable) { + os_bzero(&info, sizeof(struct ip_info)); + wifi_get_ip_info(SOFTAP_IF, &info); + softap_ip = htonl(info.ip.addr); + start_ip = htonl(please->start_ip.addr); + end_ip = htonl(please->end_ip.addr); - /*config ip information can't contain local ip*/ - if ((start_ip <= softap_ip) && (softap_ip <= end_ip)) - return false; + /*config ip information can't contain local ip*/ + if ((start_ip <= softap_ip) && (softap_ip <= end_ip)) + return false; - /*config ip information must be in the same segment as the local ip*/ - softap_ip >>= 8; - if ((start_ip >> 8 != softap_ip) - || (end_ip >> 8 != softap_ip)) { - return false; - } + /*config ip information must be in the same segment as the local ip*/ + softap_ip >>= 8; + if ((start_ip >> 8 != softap_ip) + || (end_ip >> 8 != softap_ip)) { + return false; + } - if (end_ip - start_ip > DHCPS_MAX_LEASE) - return false; + if (end_ip - start_ip > DHCPS_MAX_LEASE) + return false; - os_bzero(&dhcps_lease, sizeof(dhcps_lease)); -// dhcps_lease.start_ip.addr = start_ip; -// dhcps_lease.end_ip.addr = end_ip; - dhcps_lease.start_ip.addr = please->start_ip.addr; - dhcps_lease.end_ip.addr = please->end_ip.addr; - } - dhcps_lease.enable = please->enable; -// dhcps_lease_flag = false; - return true; + os_bzero(&dhcps_lease, sizeof(dhcps_lease)); +// dhcps_lease.start_ip.addr = start_ip; +// dhcps_lease.end_ip.addr = end_ip; + dhcps_lease.start_ip.addr = please->start_ip.addr; + dhcps_lease.end_ip.addr = please->end_ip.addr; + } + dhcps_lease.enable = please->enable; +// dhcps_lease_flag = false; + return true; } /****************************************************************************** * FunctionName : wifi_softap_get_dhcps_lease * Description : get the lease information of DHCP server * Parameters : please -- Additional argument to get the lease information, - * Little-Endian. + * Little-Endian. * Returns : true or false *******************************************************************************/ bool ICACHE_FLASH_ATTR wifi_softap_get_dhcps_lease(struct dhcps_lease *please) { - uint8 opmode = wifi_get_opmode(); + uint8 opmode = wifi_get_opmode(); - if (opmode == STATION_MODE || opmode == NULL_MODE) { - return false; - } + if (opmode == STATION_MODE || opmode == NULL_MODE) { + return false; + } - if (NULL == please) - return false; + if (NULL == please) + return false; -// if (dhcps_lease_flag){ - if (dhcps_lease.enable == FALSE){ - if (wifi_softap_dhcps_status() == DHCP_STOPPED) - return false; - } else { -// os_bzero(please, sizeof(dhcps_lease)); -// if (wifi_softap_dhcps_status() == DHCP_STOPPED){ -// please->start_ip.addr = htonl(dhcps_lease.start_ip.addr); -// please->end_ip.addr = htonl(dhcps_lease.end_ip.addr); -// } - } +// if (dhcps_lease_flag){ + if (dhcps_lease.enable == FALSE){ + if (wifi_softap_dhcps_status() == DHCP_STOPPED) + return false; + } else { +// os_bzero(please, sizeof(dhcps_lease)); +// if (wifi_softap_dhcps_status() == DHCP_STOPPED){ +// please->start_ip.addr = htonl(dhcps_lease.start_ip.addr); +// please->end_ip.addr = htonl(dhcps_lease.end_ip.addr); +// } + } -// if (wifi_softap_dhcps_status() == DHCP_STARTED){ -// os_bzero(please, sizeof(dhcps_lease)); -// please->start_ip.addr = dhcps_lease.start_ip.addr; -// please->end_ip.addr = dhcps_lease.end_ip.addr; -// } - please->start_ip.addr = dhcps_lease.start_ip.addr; - please->end_ip.addr = dhcps_lease.end_ip.addr; - return true; +// if (wifi_softap_dhcps_status() == DHCP_STARTED){ +// os_bzero(please, sizeof(dhcps_lease)); +// please->start_ip.addr = dhcps_lease.start_ip.addr; +// please->end_ip.addr = dhcps_lease.end_ip.addr; +// } + please->start_ip.addr = dhcps_lease.start_ip.addr; + please->end_ip.addr = dhcps_lease.end_ip.addr; + return true; } static void ICACHE_FLASH_ATTR kill_oldest_dhcps_pool(void) { - list_node *pre = NULL, *p = NULL; - list_node *minpre = NULL, *minp = NULL; - struct dhcps_pool *pdhcps_pool = NULL, *pmin_pool = NULL; - pre = plist; - p = pre->pnext; - minpre = pre; - minp = p; - while (p != NULL){ - pdhcps_pool = p->pnode; - pmin_pool = minp->pnode; - if (pdhcps_pool->lease_timer < pmin_pool->lease_timer){ - minp = p; - minpre = pre; - } - pre = p; - p = p->pnext; - } - minpre->pnext = minp->pnext; - os_free(minp->pnode); - minp->pnode = NULL; - os_free(minp); - minp = NULL; + list_node *pre = NULL, *p = NULL; + list_node *minpre = NULL, *minp = NULL; + struct dhcps_pool *pdhcps_pool = NULL, *pmin_pool = NULL; + pre = plist; + p = pre->pnext; + minpre = pre; + minp = p; + while (p != NULL){ + pdhcps_pool = p->pnode; + pmin_pool = minp->pnode; + if (pdhcps_pool->lease_timer < pmin_pool->lease_timer){ + minp = p; + minpre = pre; + } + pre = p; + p = p->pnext; + } + minpre->pnext = minp->pnext;pdhcps_pool->state = DHCPS_STATE_OFFLINE; + os_free(minp->pnode); + minp->pnode = NULL; + os_free(minp); + minp = NULL; } void ICACHE_FLASH_ATTR dhcps_coarse_tmr(void) { - uint8 num_dhcps_pool = 0; - list_node *pback_node = NULL; - list_node *pnode = NULL; - struct dhcps_pool *pdhcps_pool = NULL; - pnode = plist; - while (pnode != NULL) { - pdhcps_pool = pnode->pnode; - pdhcps_pool->lease_timer --; - if (pdhcps_pool->lease_timer == 0){ - pback_node = pnode; - pnode = pback_node->pnext; - node_remove_from_list(&plist,pback_node); - os_free(pback_node->pnode); - pback_node->pnode = NULL; - os_free(pback_node); - pback_node = NULL; - } else { - pnode = pnode ->pnext; - num_dhcps_pool ++; - } - } + uint8 num_dhcps_pool = 0; + list_node *pback_node = NULL; + list_node *pnode = NULL; + struct dhcps_pool *pdhcps_pool = NULL; + pnode = plist; + while (pnode != NULL) { + pdhcps_pool = pnode->pnode; + if ( pdhcps_pool->type == DHCPS_TYPE_DYNAMIC) { + pdhcps_pool->lease_timer --; + } + if (pdhcps_pool->lease_timer == 0){ + pback_node = pnode; + pnode = pback_node->pnext; + node_remove_from_list(&plist,pback_node); + os_free(pback_node->pnode); + pback_node->pnode = NULL; + os_free(pback_node); + pback_node = NULL; + } else { + pnode = pnode ->pnext; + num_dhcps_pool ++; + } + } - if (num_dhcps_pool >= MAX_STATION_NUM) - kill_oldest_dhcps_pool(); + if (num_dhcps_pool >= MAX_STATION_NUM) + kill_oldest_dhcps_pool(); } bool ICACHE_FLASH_ATTR wifi_softap_set_dhcps_offer_option(uint8 level, void* optarg) { - bool offer_flag = true; - if (optarg == NULL && wifi_softap_dhcps_status() == false) - return false; + bool offer_flag = true; + uint8 option = 0; + if (optarg == NULL && wifi_softap_dhcps_status() == false) + return false; - if (level <= OFFER_START || level >= OFFER_END) - return false; + if (level <= OFFER_START || level >= OFFER_END) + return false; - switch (level){ - case OFFER_ROUTER: - offer = (*(uint8 *)optarg) & 0x01; - offer_flag = true; - break; - default : - offer_flag = false; - break; - } - return offer_flag; + switch (level){ + case OFFER_ROUTER: + offer = (*(uint8 *)optarg) & 0x01; + offer_flag = true; + break; + default : + offer_flag = false; + break; + } + return offer_flag; } bool ICACHE_FLASH_ATTR wifi_softap_set_dhcps_lease_time(uint32 minute) @@ -1142,3 +983,178 @@ uint32 ICACHE_FLASH_ATTR wifi_softap_get_dhcps_lease_time(void) // minute { return dhcps_lease_time; } + +void ICACHE_FLASH_ATTR wifi_softap_dhcps_client_leave(u8 *bssid, struct ip_addr *ip,bool force) +{ + struct dhcps_pool *pdhcps_pool = NULL; + list_node *pback_node = NULL; + + if ((bssid == NULL) || (ip == NULL)) { + return; + } + + for (pback_node = plist; pback_node != NULL;pback_node = pback_node->pnext) { + pdhcps_pool = pback_node->pnode; + if (os_memcmp(pdhcps_pool->mac, bssid, sizeof(pdhcps_pool->mac)) == 0){ + if (os_memcmp(&pdhcps_pool->ip.addr, &ip->addr, sizeof(pdhcps_pool->ip.addr)) == 0) { + if ((pdhcps_pool->type == DHCPS_TYPE_STATIC) || (force)) { + if(pback_node != NULL) { + node_remove_from_list(&plist,pback_node); + os_free(pback_node); + pback_node = NULL; + } + + if (pdhcps_pool != NULL) { + os_free(pdhcps_pool); + pdhcps_pool = NULL; + } + } else { + pdhcps_pool->state = DHCPS_STATE_OFFLINE; + } + + struct ip_addr ip_zero; + os_memset(&ip_zero,0x0,sizeof(ip_zero)); + wifi_softap_set_station_info(bssid, &ip_zero); + break; + } + } + } +} + +uint32 ICACHE_FLASH_ATTR wifi_softap_dhcps_client_update(u8 *bssid, struct ip_addr *ip) +{ + struct dhcps_pool *pdhcps_pool = NULL; + list_node *pback_node = NULL; + list_node *pmac_node = NULL; + list_node *pip_node = NULL; + bool flag = FALSE; + uint32 start_ip = dhcps_lease.start_ip.addr; + uint32 end_ip = dhcps_lease.end_ip.addr; + dhcps_type_t type = DHCPS_TYPE_DYNAMIC; + if (bssid == NULL) { + return IPADDR_ANY; + } + + if (ip) { + if (IPADDR_BROADCAST == ip->addr) { + return IPADDR_ANY; + } else if (IPADDR_ANY == ip->addr) { + ip = NULL; + } else { + type = DHCPS_TYPE_STATIC; + } + } + + renew = FALSE; + for (pback_node = plist; pback_node != NULL;pback_node = pback_node->pnext) { + pdhcps_pool = pback_node->pnode; + //os_printf("mac:"MACSTR"bssid:"MACSTR"\r\n",MAC2STR(pdhcps_pool->mac),MAC2STR(bssid)); + if (os_memcmp(pdhcps_pool->mac, bssid, sizeof(pdhcps_pool->mac)) == 0){ + pmac_node = pback_node; + if (ip == NULL) { + flag = TRUE; + break; + } + } + if (ip != NULL) { + if (os_memcmp(&pdhcps_pool->ip.addr, &ip->addr, sizeof(pdhcps_pool->ip.addr)) == 0) { + pip_node = pback_node; + } + } else if (flag == FALSE){ + if (os_memcmp(&pdhcps_pool->ip.addr, &start_ip, sizeof(pdhcps_pool->ip.addr)) != 0) { + flag = TRUE; + } else { + start_ip = htonl((ntohl(start_ip) + 1)); + } + } + } + + if ((ip == NULL) && (flag == FALSE)) { + if (plist == NULL) { + if (start_ip <= end_ip) { + flag = TRUE; + } else { + return IPADDR_ANY; + } + } else { + if (start_ip == end_ip) { + return IPADDR_ANY; + } + start_ip = htonl((ntohl(start_ip) + 1)); + flag = TRUE; + } + } + + if (pmac_node != NULL) { // update new ip + if (pip_node != NULL){ + pdhcps_pool = pip_node->pnode; + + if (pip_node != pmac_node) { + if(pdhcps_pool->state != DHCPS_STATE_OFFLINE) { // ip is used + return IPADDR_ANY; + } + + // mac exists and ip exists in other node,delete mac + node_remove_from_list(&plist,pmac_node); + os_free(pmac_node); + pmac_node = pip_node; + os_memcpy(pdhcps_pool->mac, bssid, sizeof(pdhcps_pool->mac)); + } else { + renew = true; + type = DHCPS_TYPE_DYNAMIC; + } + + pdhcps_pool->lease_timer = DHCPS_LEASE_TIMER; + pdhcps_pool->type = type; + pdhcps_pool->state = DHCPS_STATE_ONLINE; + + } else { + pdhcps_pool = pmac_node->pnode; + if (ip != NULL) { + pdhcps_pool->ip.addr = ip->addr; + } else if (flag == TRUE) { + pdhcps_pool->ip.addr = start_ip; + } else { // no ip to distribute + return IPADDR_ANY; + } + + node_remove_from_list(&plist,pmac_node); + pdhcps_pool->lease_timer = DHCPS_LEASE_TIMER; + pdhcps_pool->type = type; + pdhcps_pool->state = DHCPS_STATE_ONLINE; + node_insert_to_list(&plist,pmac_node); + } + } else { // new station + if (pip_node != NULL) { // maybe ip has used + pdhcps_pool = pip_node->pnode; + if (pdhcps_pool->state != DHCPS_STATE_OFFLINE) { + return IPADDR_ANY; + } + os_memcpy(pdhcps_pool->mac, bssid, sizeof(pdhcps_pool->mac)); + pdhcps_pool->lease_timer = DHCPS_LEASE_TIMER; + pdhcps_pool->type = type; + pdhcps_pool->state = DHCPS_STATE_ONLINE; + } else { + pdhcps_pool = (struct dhcps_pool *)os_zalloc(sizeof(struct dhcps_pool)); + if (ip != NULL) { + pdhcps_pool->ip.addr = ip->addr; + } else if (flag == TRUE) { + pdhcps_pool->ip.addr = start_ip; + } else { // no ip to distribute + os_free(pdhcps_pool); + return IPADDR_ANY; + } + os_memcpy(pdhcps_pool->mac, bssid, sizeof(pdhcps_pool->mac)); + pdhcps_pool->lease_timer = DHCPS_LEASE_TIMER; + pdhcps_pool->type = type; + pdhcps_pool->state = DHCPS_STATE_ONLINE; + pback_node = (list_node *)os_zalloc(sizeof(list_node )); + pback_node->pnode = pdhcps_pool; + pback_node->pnext = NULL; + node_insert_to_list(&plist,pback_node); + } + } + wifi_softap_set_station_info(bssid, &pdhcps_pool->ip); + + return pdhcps_pool->ip.addr; +} diff --git a/tools/sdk/lwip/src/app/espconn.c b/tools/sdk/lwip/src/app/espconn.c index 179fa174e..8d82e4cd6 100644 --- a/tools/sdk/lwip/src/app/espconn.c +++ b/tools/sdk/lwip/src/app/espconn.c @@ -264,6 +264,7 @@ espconn_connect(struct espconn *espconn) uint8 connect_status = 0; sint8 value = ESPCONN_OK; espconn_msg *plist = NULL; + remot_info *pinfo = NULL; if (espconn == NULL) { return ESPCONN_ARG; @@ -448,6 +449,7 @@ espconn_sendto(struct espconn *espconn, uint8 *psent, uint16 length) { espconn_msg *pnode = NULL; bool value = false; + err_t error = ESPCONN_OK; if (espconn == NULL || psent == NULL || length == 0) { return ESPCONN_ARG; @@ -674,7 +676,8 @@ sint8 ICACHE_FLASH_ATTR espconn_tcp_set_buf_count(struct espconn *espconn, uint8 } } - return ESPCONN_ARG; + if (plist == NULL) + return ESPCONN_ARG; } /****************************************************************************** @@ -951,7 +954,7 @@ espconn_disconnect(struct espconn *espconn) if (value){ /*protect for redisconnection*/ - if (espconn->state == ESPCONN_CLOSE) + if (pnode->preverse == NULL && espconn->state == ESPCONN_CLOSE) return ESPCONN_INPROGRESS; espconn_tcp_disconnect(pnode,0); //1 force, 0 normal return ESPCONN_OK; diff --git a/tools/sdk/lwip/src/app/espconn_tcp.c b/tools/sdk/lwip/src/app/espconn_tcp.c index e21075070..9be0ac453 100644 --- a/tools/sdk/lwip/src/app/espconn_tcp.c +++ b/tools/sdk/lwip/src/app/espconn_tcp.c @@ -152,6 +152,7 @@ void ICACHE_FLASH_ATTR espconn_kill_pcb(u16_t port) struct tcp_pcb *cpcb = NULL; uint8 i = 0; struct tcp_pcb *inactive = NULL; + struct tcp_pcb *prev = NULL; u8_t pcb_remove; /* Check if the address already is in use (on all lists) */ for (i = 1; i < 4; i++) { @@ -186,7 +187,7 @@ struct tcp_pcb *ICACHE_FLASH_ATTR espconn_find_current_pcb(espconn_msg *pcurrent uint16 local_port = pcurrent_msg->pcommon.local_port; uint32 local_ip = pcurrent_msg->pcommon.local_ip; uint16 remote_port = pcurrent_msg->pcommon.remote_port; - uint32 remote_ip = *((uint32*)(pcurrent_msg->pcommon.remote_ip)); + uint32 remote_ip = *((uint32*)&pcurrent_msg->pcommon.remote_ip); struct tcp_pcb *find_pcb = NULL; if (pcurrent_msg ->preverse == NULL){/*Find the server's TCP block*/ if (local_ip == 0|| local_port == 0) return pcurrent_msg->pcommon.pcb; @@ -218,6 +219,30 @@ struct tcp_pcb *ICACHE_FLASH_ATTR espconn_find_current_pcb(espconn_msg *pcurrent return NULL; } +/****************************************************************************** + * FunctionName : espconn_tcp_memp_free + * Description : frees the connection memory in the server mode + * Parameters : arg -- Additional argument to pass to the function + * Returns : none +*******************************************************************************/ +void ICACHE_FLASH_ATTR espconn_tcp_memp_free(espconn_msg *pmemp) +{ + struct espconn *espconn = NULL; + if (pmemp == NULL) + return; + + if (pmemp->espconn_mode == ESPCONN_TCPSERVER_MODE){ + if (pmemp->pespconn != NULL && pmemp->pespconn->proto.tcp != NULL) + os_free(pmemp->pespconn->proto.tcp); + pmemp->pespconn->proto.tcp = NULL; + + os_free(pmemp->pespconn); + pmemp->pespconn = NULL; + } + os_free(pmemp); + pmemp = NULL; +} + /****************************************************************************** * FunctionName : espconn_tcp_reconnect * Description : reconnect with host @@ -234,24 +259,15 @@ espconn_tcp_reconnect(void *arg) espconn_kill_oldest_pcb(); if (precon_cb != NULL) { struct espconn *espconn = precon_cb->preverse; + re_err = precon_cb->pcommon.err; if (precon_cb->pespconn != NULL){ if (espconn != NULL){/*Process the server's message block*/ if (precon_cb->pespconn->proto.tcp != NULL){ espconn_copy_partial(espconn, precon_cb->pespconn); - espconn_printf("server: %d.%d.%d.%d : %d reconnection\n", espconn->proto.tcp->remote_ip[0], - espconn->proto.tcp->remote_ip[1],espconn->proto.tcp->remote_ip[2], - espconn->proto.tcp->remote_ip[3],espconn->proto.tcp->remote_port); - os_free(precon_cb->pespconn->proto.tcp); - precon_cb->pespconn->proto.tcp = NULL; } - os_free(precon_cb->pespconn); - precon_cb->pespconn = NULL; } else {/*Process the client's message block*/ espconn = precon_cb->pespconn; - espconn_printf("client: %d.%d.%d.%d : %d reconnection\n", espconn->proto.tcp->local_ip[0], - espconn->proto.tcp->local_ip[1],espconn->proto.tcp->local_ip[2], - espconn->proto.tcp->local_ip[3],espconn->proto.tcp->local_port); } } @@ -266,11 +282,13 @@ espconn_tcp_reconnect(void *arg) } os_bzero(&pktinfo[1], sizeof(struct espconn_packet)); os_memcpy(&pktinfo[1], (void*)&precon_cb->pcommon.packet_info, sizeof(struct espconn_packet)); - os_free(precon_cb); - precon_cb = NULL; + if (espconn && espconn->proto.tcp && espconn->proto.tcp->reconnect_callback != NULL) { espconn->proto.tcp->reconnect_callback(espconn, re_err); } + + /*frees the connection memory*/ + espconn_tcp_memp_free(precon_cb); } else { espconn_printf("espconn_tcp_reconnect err\n"); } @@ -286,31 +304,24 @@ static void ICACHE_FLASH_ATTR espconn_tcp_disconnect_successful(void *arg) { espconn_msg *pdiscon_cb = arg; + sint8 dis_err = 0; espconn_buf *pdis_buf = NULL; espconn_buf *pdis_back = NULL; espconn_kill_oldest_pcb(); if (pdiscon_cb != NULL) { struct espconn *espconn = pdiscon_cb->preverse; + dis_err = pdiscon_cb->pcommon.err; if (pdiscon_cb->pespconn != NULL){ struct tcp_pcb *pcb = NULL; if (espconn != NULL){/*Process the server's message block*/ if (pdiscon_cb->pespconn->proto.tcp != NULL && espconn->proto.tcp){ espconn_copy_partial(espconn, pdiscon_cb->pespconn); - espconn_printf("server: %d.%d.%d.%d : %d disconnect\n", espconn->proto.tcp->remote_ip[0], - espconn->proto.tcp->remote_ip[1],espconn->proto.tcp->remote_ip[2], - espconn->proto.tcp->remote_ip[3],espconn->proto.tcp->remote_port); - os_free(pdiscon_cb->pespconn->proto.tcp); - pdiscon_cb->pespconn->proto.tcp = NULL; } - os_free(pdiscon_cb->pespconn); - pdiscon_cb->pespconn = NULL; } else {/*Process the client's message block*/ espconn = pdiscon_cb->pespconn; - espconn_printf("client: %d.%d.%d.%d : %d disconnect\n", espconn->proto.tcp->local_ip[0], - espconn->proto.tcp->local_ip[1],espconn->proto.tcp->local_ip[2], - espconn->proto.tcp->local_ip[3],espconn->proto.tcp->local_port); } + /*process the current TCP block*/ pcb = espconn_find_current_pcb(pdiscon_cb); if (pcb != NULL){ @@ -365,11 +376,13 @@ espconn_tcp_disconnect_successful(void *arg) } os_bzero(&pktinfo[0], sizeof(struct espconn_packet)); os_memcpy(&pktinfo[0], (void*)&pdiscon_cb->pcommon.packet_info, sizeof(struct espconn_packet)); - os_free(pdiscon_cb); - pdiscon_cb = NULL; + if (espconn->proto.tcp && espconn->proto.tcp->disconnect_callback != NULL) { espconn->proto.tcp->disconnect_callback(espconn); } + + /*frees the connection memory*/ + espconn_tcp_memp_free(pdiscon_cb); } else { espconn_printf("espconn_tcp_disconnect err\n"); } @@ -434,6 +447,7 @@ espconn_tcp_sent(void *arg, uint8 *psent, uint16 length) struct tcp_pcb *pcb = NULL; err_t err = 0; u16_t len = 0; + u8_t data_to_send = false; espconn_printf("espconn_tcp_sent ptcp_sent %p psent %p length %d\n", ptcp_sent, psent, length); @@ -807,8 +821,6 @@ espconn_client_err(void *arg, err_t err) case CLOSED: perr_cb->pcommon.err = ESPCONN_CONN; break; - default: - break; } } else { perr_cb->pcommon.err = err; @@ -928,6 +940,7 @@ espconn_tcp_client(struct espconn *espconn) } #endif /*Establish the connection*/ + pclient->espconn_mode = ESPCONN_TCPCLIENT_MODE; pclient->pcommon.err = tcp_connect(pcb, &ipaddr, pclient->pespconn->proto.tcp->remote_port, espconn_client_connect); if (pclient->pcommon.err == ERR_RTE){ @@ -1026,7 +1039,7 @@ espconn_server_recv(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t err) precv_cb->pespconn ->state = ESPCONN_READ; precv_cb->pcommon.pcb = pcb; if (precv_cb->pespconn->recv_callback != NULL) { - precv_cb->pespconn->recv_callback(precv_cb->pespconn, (char*)data_ptr, data_cntr); + precv_cb->pespconn->recv_callback(precv_cb->pespconn, data_ptr, data_cntr); } /*switch the state of espconn for next packet copy*/ @@ -1236,6 +1249,7 @@ espconn_tcp_accept(void *arg, struct tcp_pcb *pcb, err_t err) espconn_list_creat(&plink_active, paccept); paccept->preverse = espconn; + paccept->espconn_mode = ESPCONN_TCPSERVER_MODE; paccept->pespconn = (struct espconn *)os_zalloc(sizeof(struct espconn)); if (paccept->pespconn == NULL) return ERR_MEM; @@ -1345,13 +1359,13 @@ espconn_tcp_server(struct espconn *espconn) *******************************************************************************/ sint8 ICACHE_FLASH_ATTR espconn_tcp_delete(struct espconn *pdeletecon) { - err_t err = ESPCONN_ARG; + err_t err; remot_info *pinfo = NULL; espconn_msg *pdelete_msg = NULL; struct tcp_pcb *pcb = NULL; if (pdeletecon == NULL) - return err; + return ESPCONN_ARG; espconn_get_connection_info(pdeletecon, &pinfo , 0); /*make sure all the active connection have been disconnect*/ @@ -1374,7 +1388,10 @@ sint8 ICACHE_FLASH_ATTR espconn_tcp_delete(struct espconn *pdeletecon) } pdelete_msg = pdelete_msg->pnext; } - return err; + if (err == ERR_OK) + return err; + else + return ESPCONN_ARG; } } diff --git a/tools/sdk/lwip/src/app/espconn_udp.c b/tools/sdk/lwip/src/app/espconn_udp.c index bff756ae9..6e6b0ab4e 100644 --- a/tools/sdk/lwip/src/app/espconn_udp.c +++ b/tools/sdk/lwip/src/app/espconn_udp.c @@ -285,6 +285,7 @@ espconn_udp_recv(void *arg, struct udp_pcb *upcb, struct pbuf *p, struct ip_addr *addr, u16_t port) { espconn_msg *precv = arg; + struct pbuf *q = NULL; u8_t *pdata = NULL; u16_t length = 0; struct ip_info ipconfig; @@ -320,7 +321,7 @@ espconn_udp_recv(void *arg, struct udp_pcb *upcb, struct pbuf *p, pbuf_free(p); if (length != 0) { if (precv->pespconn->recv_callback != NULL) { - precv->pespconn->recv_callback(precv->pespconn, (char *)pdata, length); + precv->pespconn->recv_callback(precv->pespconn, pdata, length); } } os_free(pdata); diff --git a/tools/sdk/lwip/src/app/ping.c b/tools/sdk/lwip/src/app/ping.c index ae863a6e1..6bd6f0ea0 100644 --- a/tools/sdk/lwip/src/app/ping.c +++ b/tools/sdk/lwip/src/app/ping.c @@ -109,7 +109,7 @@ ping_prepare_echo( struct icmp_echo_hdr *iecho, u16_t len) iecho->chksum = inet_chksum(iecho, len); } -/* + static void ICACHE_FLASH_ATTR ping_prepare_er(struct icmp_echo_hdr *iecho, u16_t len) { @@ -120,7 +120,7 @@ ping_prepare_er(struct icmp_echo_hdr *iecho, u16_t len) iecho->chksum = inet_chksum(iecho, len); } -*/ + /* Ping using the raw ip */ static u8_t ICACHE_FLASH_ATTR ping_recv(void *arg, struct raw_pcb *pcb, struct pbuf *p, ip_addr_t *addr) diff --git a/tools/sdk/lwip/src/core/dns.c b/tools/sdk/lwip/src/core/dns.c index 4225d83f2..a98095d0a 100644 --- a/tools/sdk/lwip/src/core/dns.c +++ b/tools/sdk/lwip/src/core/dns.c @@ -450,26 +450,25 @@ dns_local_addhost(const char *hostname, const ip_addr_t *addr) * better check for failure: != IPADDR_NONE) or IPADDR_NONE if the hostname * was not found in the cached dns_table. */ -/* static u32_t ICACHE_FLASH_ATTR dns_lookup(const char *name) { u8_t i; #if DNS_LOCAL_HOSTLIST || defined(DNS_LOOKUP_LOCAL_EXTERN) u32_t addr; -#endif +#endif /* DNS_LOCAL_HOSTLIST || defined(DNS_LOOKUP_LOCAL_EXTERN) */ #if DNS_LOCAL_HOSTLIST if ((addr = dns_lookup_local(name)) != IPADDR_NONE) { return addr; } -#endif +#endif /* DNS_LOCAL_HOSTLIST */ #ifdef DNS_LOOKUP_LOCAL_EXTERN if((addr = DNS_LOOKUP_LOCAL_EXTERN(name)) != IPADDR_NONE) { return addr; } -#endif +#endif /* DNS_LOOKUP_LOCAL_EXTERN */ - // Walk through name list, return entry if found. If not, return NULL. + /* Walk through name list, return entry if found. If not, return NULL. */ for (i = 0; i < DNS_TABLE_SIZE; ++i) { if ((dns_table[i].state == DNS_STATE_DONE) && (strcmp(name, dns_table[i].name) == 0)) { @@ -482,7 +481,7 @@ dns_lookup(const char *name) return IPADDR_NONE; } -*/ + #if DNS_DOES_NAME_CHECK /** * Compare the "dotted" name "query" with the encoded name "response" @@ -775,9 +774,7 @@ dns_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p, ip_addr_t *addr, u16_t if (i < DNS_TABLE_SIZE) { pEntry = &dns_table[i]; if(pEntry->state == DNS_STATE_ASKING) { - /* This entry is now completed. */ - pEntry->state = DNS_STATE_DONE; - pEntry->err = hdr->flags2 & DNS_FLAG2_ERR_MASK; + pEntry->err = hdr->flags2 & DNS_FLAG2_ERR_MASK; /* We only care about the question(s) and the answers. The authrr and the extrarr are simply discarded. */ @@ -788,8 +785,11 @@ dns_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p, ip_addr_t *addr, u16_t if (((hdr->flags1 & DNS_FLAG1_RESPONSE) == 0) || (pEntry->err != 0) || (nquestions != 1)) { LWIP_DEBUGF(DNS_DEBUG, ("dns_recv: \"%s\": error in flags\n", pEntry->name)); /* call callback to indicate error, clean up memory and return */ - goto responseerr; + //goto responseerr; + goto memerr; } + /* This entry is now completed. */ + pEntry->state = DNS_STATE_DONE; #if DNS_DOES_NAME_CHECK /* Check if the name in the "question" part match with the name in the entry. */ diff --git a/tools/sdk/lwip/src/core/ipv4/icmp.c b/tools/sdk/lwip/src/core/ipv4/icmp.c index 7b11d06b3..2eb3b02cc 100644 --- a/tools/sdk/lwip/src/core/ipv4/icmp.c +++ b/tools/sdk/lwip/src/core/ipv4/icmp.c @@ -47,6 +47,7 @@ #include "lwip/inet_chksum.h" #include "lwip/ip.h" #include "lwip/def.h" +#include "lwipopts.h" #include "lwip/stats.h" #include "lwip/snmp.h" diff --git a/tools/sdk/lwip/src/core/ipv4/igmp.c b/tools/sdk/lwip/src/core/ipv4/igmp.c index 2e937ca60..2bb69e4d9 100644 --- a/tools/sdk/lwip/src/core/ipv4/igmp.c +++ b/tools/sdk/lwip/src/core/ipv4/igmp.c @@ -710,6 +710,17 @@ igmp_start_timer(struct igmp_group *group, u8_t max_time) group->timer = (LWIP_RAND() % (max_time - 1)) + 1; } +/** + * Stop a timer for an igmp_group + * + * @param group the igmp_group for which to stop the timer + */ +static void +igmp_stop_timer(struct igmp_group *group) +{ + group->timer = 0; +} + /** * Delaying membership report for a group if necessary * diff --git a/tools/sdk/lwip/src/core/mdns.c b/tools/sdk/lwip/src/core/mdns.c index 3267c2e45..604d96f92 100644 --- a/tools/sdk/lwip/src/core/mdns.c +++ b/tools/sdk/lwip/src/core/mdns.c @@ -900,11 +900,27 @@ mdns_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p, struct ip_addr *addr, void ICACHE_FLASH_ATTR mdns_close(void) { - if (mdns_pcb != NULL && ms_info != NULL) + uint8 text_index = 0; + if (mdns_pcb != NULL && ms_info != NULL) { udp_remove(mdns_pcb); + for(text_index = 0;text_index < 10;text_index++) { + if(ms_info->txt_data[text_index] != NULL) { + os_free(ms_info->txt_data[text_index]); + ms_info->txt_data[text_index] = NULL; + } + } + if (ms_info->host_name != NULL) { + os_free(ms_info->host_name); + ms_info->host_name = NULL; + } + if (ms_info->server_name != NULL) { + os_free(ms_info->server_name); + ms_info->server_name = NULL; + } os_free(ms_info); mdns_pcb = NULL; ms_info = NULL; + } } @@ -1034,9 +1050,24 @@ mdns_init(struct mdns_info *info) { multicast_addr.addr = DNS_MULTICAST_ADDRESS; struct ip_addr ap_host_addr; struct ip_info ipconfig; + uint8 text_index = 0; ms_info = (struct mdns_info *)os_zalloc(sizeof(struct mdns_info)); if (ms_info != NULL) { os_memcpy(ms_info,info,sizeof(struct mdns_info)); + ms_info->host_name = (char *)os_zalloc(os_strlen(info->host_name)+1); + os_memcpy(ms_info->host_name,info->host_name,os_strlen(info->host_name)); + ms_info->server_name = (char *)os_zalloc(os_strlen(info->server_name)+1); + os_memcpy(ms_info->server_name,info->server_name,os_strlen(info->server_name)); + for(text_index = 0;text_index < 10;text_index++) { + if(info->txt_data[text_index] != NULL) { + ms_info->txt_data[text_index] = (char *)os_zalloc(os_strlen(info->txt_data[text_index])+1); + os_memcpy(ms_info->txt_data[text_index],info->txt_data[text_index],os_strlen(info->txt_data[text_index])); + } else { + break; + } + + } + } else { os_printf("ms_info alloc failed\n"); return; diff --git a/tools/sdk/lwip/src/core/sntp.c b/tools/sdk/lwip/src/core/sntp.c index 0a635a9a0..677de93b2 100644 --- a/tools/sdk/lwip/src/core/sntp.c +++ b/tools/sdk/lwip/src/core/sntp.c @@ -268,10 +268,7 @@ struct sntp_server { }; static struct sntp_server sntp_servers[SNTP_MAX_SERVERS]; -#if SNTP_GET_SERVERS_FROM_DHCP static u8_t sntp_set_servers_from_dhcp; -#endif - #if SNTP_SUPPORT_MULTIPLE_SERVERS /** The currently used server (initialized to 0) */ static u8_t sntp_current_server; @@ -364,6 +361,7 @@ sntp_mktm_r(const time_t * tim_p ,struct tm *res ,int is_gmtime) { long days, rem; time_t lcltime; + int i; int y; int yleap; const int *ip; diff --git a/tools/sdk/lwip/src/core/timers.c b/tools/sdk/lwip/src/core/timers.c index a2cc13554..e682bd2d7 100644 --- a/tools/sdk/lwip/src/core/timers.c +++ b/tools/sdk/lwip/src/core/timers.c @@ -114,7 +114,7 @@ tcp_timer_needed(void) * * @param arg unused argument */ -/* + static void ICACHE_FLASH_ATTR tcp_timer_coarse(void *arg) { @@ -123,7 +123,7 @@ tcp_timer_coarse(void *arg) tcp_tmr(); sys_timeout(TCP_TMR_INTERVAL, tcp_timer_coarse, NULL); } -*/ + #endif /* LWIP_TCP */ #if IP_REASSEMBLY diff --git a/tools/sdk/version b/tools/sdk/version index 6d6fd6026..4afad1988 100644 --- a/tools/sdk/version +++ b/tools/sdk/version @@ -1 +1 @@ -1.5.1_16_01_08 \ No newline at end of file +1.5.3_16_04_18 \ No newline at end of file