1
0
mirror of https://github.com/esp8266/Arduino.git synced 2025-06-07 16:23:38 +03:00

Update SDK to 1.5.3

This commit is contained in:
Ivan Grokhotkov 2016-05-06 19:33:48 +08:00
parent d3434d345d
commit f266f8a2ff
27 changed files with 841 additions and 675 deletions

View File

@ -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 ESP8266_NONOS_SDK_V1.5.2_16_01_29 Release Note
---------------------------------------------- ----------------------------------------------

View File

@ -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_custom_response_func_type)(const char *str);
typedef void (*at_fake_uart_tx_func_type)(const uint8*data,uint32 length);
extern uint8 at_customLinkMax; extern uint8 at_customLinkMax;
/** /**
@ -140,4 +142,27 @@ uint32 at_get_version(void);
* @retval None * @retval None
*/ */
void at_register_uart_rx_intr(at_custom_uart_rx_intr rx_func); 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 #endif

View File

@ -356,6 +356,9 @@ sleep_type_t wifi_get_sleep_type(void);
void wifi_fpm_open(void); void wifi_fpm_open(void);
void wifi_fpm_close(void); void wifi_fpm_close(void);
void wifi_fpm_do_wakeup(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); sint8 wifi_fpm_do_sleep(uint32 sleep_time_in_us);
void wifi_fpm_set_sleep_type(sleep_type_t type); void wifi_fpm_set_sleep_type(sleep_type_t type);
sleep_type_t wifi_fpm_get_sleep_type(void); sleep_type_t wifi_fpm_get_sleep_type(void);

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -35,10 +35,23 @@ enum dhcps_offer_option{
}; };
#endif #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 dhcps_pool{
struct ip_addr ip; struct ip_addr ip;
uint8 mac[6]; uint8 mac[6];
uint32 lease_timer; uint32 lease_timer;
dhcps_type_t type;
dhcps_state_t state;
}; };
typedef struct _list_node{ typedef struct _list_node{

View File

@ -127,6 +127,14 @@ enum espconn_level{
ESPCONN_KEEPCNT ESPCONN_KEEPCNT
}; };
enum espconn_mode{
ESPCONN_NOMODE,
ESPCONN_TCPSERVER_MODE,
ESPCONN_TCPCLIENT_MODE,
ESPCONN_UDP_MODE,
ESPCONN_NUM_MODE
};
struct espconn_packet{ struct espconn_packet{
uint16 sent_length; /* sent length successful*/ uint16 sent_length; /* sent length successful*/
uint16 snd_buf_size; /* Available buffer size for sending */ uint16 snd_buf_size; /* Available buffer size for sending */
@ -169,6 +177,7 @@ typedef struct _espconn_msg{
struct espconn *pespconn; struct espconn *pespconn;
comon_pkt pcommon; comon_pkt pcommon;
uint8 count_opt; uint8 count_opt;
uint8 espconn_mode;
sint16_t hs_status; //the status of the handshake sint16_t hs_status; //the status of the handshake
void *preverse; void *preverse;
void *pssl; void *pssl;

View File

@ -569,7 +569,7 @@
* IP_DEFAULT_TTL: Default value for Time-To-Live used by transport layers. * IP_DEFAULT_TTL: Default value for Time-To-Live used by transport layers.
*/ */
#ifndef IP_DEFAULT_TTL #ifndef IP_DEFAULT_TTL
#define IP_DEFAULT_TTL 255 #define IP_DEFAULT_TTL 128
#endif #endif
/** /**

View File

@ -24,7 +24,6 @@ static struct udp_pcb *pcb_dhcps = NULL;
static struct ip_addr broadcast_dhcps; static struct ip_addr broadcast_dhcps;
static struct ip_addr server_address; static struct ip_addr server_address;
static struct ip_addr client_address;//added static struct ip_addr client_address;//added
static struct ip_addr client_address_plus;
static struct dhcps_lease dhcps_lease; static struct dhcps_lease dhcps_lease;
//static bool dhcps_lease_flag = true; //static bool dhcps_lease_flag = true;
@ -33,6 +32,10 @@ static uint8 offer = 0xFF;
static bool renew = false; 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 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 * FunctionName : node_insert_to_list
* Description : insert the node to the list * Description : insert the node to the list
@ -247,7 +250,7 @@ static void ICACHE_FLASH_ATTR create_msg(struct dhcps_msg *m)
{ {
struct ip_addr client; struct ip_addr client;
client.addr = *( (uint32_t *) &client_address); client.addr = client_address.addr;
m->op = DHCP_REPLY; m->op = DHCP_REPLY;
m->htype = DHCP_HTYPE_ETHERNET; m->htype = DHCP_HTYPE_ETHERNET;
@ -306,12 +309,6 @@ static void ICACHE_FLASH_ATTR send_offer(struct dhcps_msg *m)
for(i=0; i<q->len; i++) for(i=0; i<q->len; i++)
{ {
data[i] = ((u8_t *) m)[cnt++]; 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; q = q->next;
@ -372,12 +369,6 @@ static void ICACHE_FLASH_ATTR send_nak(struct dhcps_msg *m)
for(i=0; i<q->len; i++) for(i=0; i<q->len; i++)
{ {
data[i] = ((u8_t *) m)[cnt++]; 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; q = q->next;
@ -439,12 +430,6 @@ static void ICACHE_FLASH_ATTR send_ack(struct dhcps_msg *m)
for(i=0; i<q->len; i++) for(i=0; i<q->len; i++)
{ {
data[i] = ((u8_t *) m)[cnt++]; 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; q = q->next;
@ -484,7 +469,7 @@ static uint8_t ICACHE_FLASH_ATTR parse_options(uint8_t *optptr, sint16_t len)
bool is_dhcp_parse_end = false; bool is_dhcp_parse_end = false;
struct dhcps_state s; struct dhcps_state s;
client.addr = *( (uint32_t *) &client_address); client.addr = *( (uint32_t *) &client_address);// Ҫ<><D2AA><EFBFBD><EFBFBD><EFBFBD>DHCP<43>ͻ<EFBFBD><CDBB>˵<EFBFBD>IP
u8_t *end = optptr + len; u8_t *end = optptr + len;
u16_t type = 0; u16_t type = 0;
@ -502,6 +487,7 @@ static uint8_t ICACHE_FLASH_ATTR parse_options(uint8_t *optptr, sint16_t len)
break; break;
case DHCP_OPTION_REQ_IPADDR://50 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( os_memcmp( (char *) &client.addr, (char *) optptr+2,4)==0 ) {
#if DHCPS_DEBUG #if DHCPS_DEBUG
os_printf("dhcps: DHCP_OPTION_REQ_IPADDR = 0 ok\n"); os_printf("dhcps: DHCP_OPTION_REQ_IPADDR = 0 ok\n");
@ -529,7 +515,6 @@ static uint8_t ICACHE_FLASH_ATTR parse_options(uint8_t *optptr, sint16_t len)
} }
switch (type){ switch (type){
case DHCPDISCOVER://1 case DHCPDISCOVER://1
s.state = DHCPS_STATE_OFFER; s.state = DHCPS_STATE_OFFER;
#if DHCPS_DEBUG #if DHCPS_DEBUG
@ -576,151 +561,17 @@ static sint16_t ICACHE_FLASH_ATTR parse_msg(struct dhcps_msg *m, u16_t len)
if(os_memcmp((char *)m->options, if(os_memcmp((char *)m->options,
&magic_cookie, &magic_cookie,
sizeof(magic_cookie)) == 0){ sizeof(magic_cookie)) == 0){
#if DHCPS_DEBUG struct ip_addr ip;
os_printf("dhcps: len = %d\n", len); os_memcpy(&ip.addr,m->ciaddr,sizeof(ip.addr));
#endif client_address.addr = wifi_softap_dhcps_client_update(m->chaddr,&ip);
/*
* <EFBFBD><EFBFBD>¼<EFBFBD><EFBFBD>ǰ<EFBFBD><EFBFBD>xid<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
* <EFBFBD>˺<EFBFBD>ΪDHCP<EFBFBD>ͻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD>ͳһ<EFBFBD><EFBFBD>ȡIPʱ<EFBFBD><EFBFBD>
*/
// if((old_xid[0] == 0) &&
// (old_xid[1] == 0) &&
// (old_xid[2] == 0) &&
// (old_xid[3] == 0)){
// /*
// * old_xidδ<64><CEB4>¼<EFBFBD>κ<EFBFBD><CEBA><EFBFBD><EFBFBD>?
// * <20>϶<EFBFBD><CFB6>ǵ<EFBFBD>һ<EFBFBD><D2BB>ʹ<EFBFBD><CAB9>
// */
// os_memcpy((char *)old_xid, (char *)m->xid, sizeof(m->xid));
// }else{
// /*
// * <20><><EFBFBD>δ<EFBFBD><CEB4><EFBFBD><EFBFBD>DHCP msg<73><67>Я<EFBFBD><D0AF><EFBFBD>xid<69><64><EFBFBD>ϴμ<CFB4>¼<EFBFBD>IJ<EFBFBD>ͬ<EFBFBD><CDAC>
// * <20>϶<EFBFBD>Ϊ<EFBFBD><CEAA>ͬ<EFBFBD><CDAC>DHCP<43>ͻ<EFBFBD><CDBB>˷<EFBFBD><CBB7>ͣ<EFBFBD><CDA3><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>Ŀͻ<C4BF><CDBB><EFBFBD>IP
// * <20><><EFBFBD><EFBFBD> 192.168.4.100(0x6404A8C0) <--> 192.168.4.200(0xC804A8C0)
// *
// */
// if(os_memcmp((char *)old_xid, (char *)m->xid, sizeof(m->xid)) != 0){
/*
* <EFBFBD><EFBFBD>¼<EFBFBD><EFBFBD><EFBFBD>ε<EFBFBD>xid<EFBFBD>ţ<EFBFBD>ͬʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>IP<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
struct ip_addr addr_tmp;
// os_memcpy((char *)old_xid, (char *)m->xid, sizeof(m->xid));
// { sint16_t ret = parse_options(&m->options[4], len);
struct dhcps_pool *pdhcps_pool = NULL;
list_node *pnode = NULL;
list_node *pback_node = NULL;
struct ip_addr first_address;
bool flag = false;
// 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(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(ret == DHCPS_STATE_RELEASE) {
if(pnode != NULL) { wifi_softap_dhcps_client_leave(m->chaddr,&ip,TRUE); // force to delete
node_remove_from_list(&plist,pnode); client_address.addr = ip.addr;
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 ret;
} }
return 0; return 0;
@ -771,12 +622,6 @@ static void ICACHE_FLASH_ATTR handle_dhcp(void *arg,
for(i=0; i<p->len; i++){ for(i=0; i<p->len; i++){
p_dhcps_msg[dhcps_msg_cnt++] = data[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(p->next != NULL) {
@ -789,12 +634,6 @@ static void ICACHE_FLASH_ATTR handle_dhcp(void *arg,
data = p->next->payload; data = p->next->payload;
for(i=0; i<p->next->len; i++){ for(i=0; i<p->next->len; i++){
p_dhcps_msg[dhcps_msg_cnt++] = data[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
} }
} }
@ -898,7 +737,6 @@ void ICACHE_FLASH_ATTR dhcps_start(struct ip_info *info)
server_address = info->ip; server_address = info->ip;
wifi_softap_init_dhcps_lease(server_address.addr); wifi_softap_init_dhcps_lease(server_address.addr);
client_address_plus.addr = dhcps_lease.start_ip.addr;
udp_bind(pcb_dhcps, IP_ADDR_ANY, DHCPS_SERVER_PORT); udp_bind(pcb_dhcps, IP_ADDR_ANY, DHCPS_SERVER_PORT);
udp_recv(pcb_dhcps, handle_dhcp, NULL); udp_recv(pcb_dhcps, handle_dhcp, NULL);
@ -1048,7 +886,7 @@ static void ICACHE_FLASH_ATTR kill_oldest_dhcps_pool(void)
pre = p; pre = p;
p = p->pnext; p = p->pnext;
} }
minpre->pnext = minp->pnext; minpre->pnext = minp->pnext;pdhcps_pool->state = DHCPS_STATE_OFFLINE;
os_free(minp->pnode); os_free(minp->pnode);
minp->pnode = NULL; minp->pnode = NULL;
os_free(minp); os_free(minp);
@ -1064,7 +902,9 @@ void ICACHE_FLASH_ATTR dhcps_coarse_tmr(void)
pnode = plist; pnode = plist;
while (pnode != NULL) { while (pnode != NULL) {
pdhcps_pool = pnode->pnode; pdhcps_pool = pnode->pnode;
if ( pdhcps_pool->type == DHCPS_TYPE_DYNAMIC) {
pdhcps_pool->lease_timer --; pdhcps_pool->lease_timer --;
}
if (pdhcps_pool->lease_timer == 0){ if (pdhcps_pool->lease_timer == 0){
pback_node = pnode; pback_node = pnode;
pnode = pback_node->pnext; pnode = pback_node->pnext;
@ -1086,6 +926,7 @@ void ICACHE_FLASH_ATTR dhcps_coarse_tmr(void)
bool ICACHE_FLASH_ATTR wifi_softap_set_dhcps_offer_option(uint8 level, void* optarg) bool ICACHE_FLASH_ATTR wifi_softap_set_dhcps_offer_option(uint8 level, void* optarg)
{ {
bool offer_flag = true; bool offer_flag = true;
uint8 option = 0;
if (optarg == NULL && wifi_softap_dhcps_status() == false) if (optarg == NULL && wifi_softap_dhcps_status() == false)
return false; return false;
@ -1142,3 +983,178 @@ uint32 ICACHE_FLASH_ATTR wifi_softap_get_dhcps_lease_time(void) // minute
{ {
return dhcps_lease_time; 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;
}

View File

@ -264,6 +264,7 @@ espconn_connect(struct espconn *espconn)
uint8 connect_status = 0; uint8 connect_status = 0;
sint8 value = ESPCONN_OK; sint8 value = ESPCONN_OK;
espconn_msg *plist = NULL; espconn_msg *plist = NULL;
remot_info *pinfo = NULL;
if (espconn == NULL) { if (espconn == NULL) {
return ESPCONN_ARG; return ESPCONN_ARG;
@ -448,6 +449,7 @@ espconn_sendto(struct espconn *espconn, uint8 *psent, uint16 length)
{ {
espconn_msg *pnode = NULL; espconn_msg *pnode = NULL;
bool value = false; bool value = false;
err_t error = ESPCONN_OK;
if (espconn == NULL || psent == NULL || length == 0) { if (espconn == NULL || psent == NULL || length == 0) {
return ESPCONN_ARG; return ESPCONN_ARG;
@ -674,6 +676,7 @@ sint8 ICACHE_FLASH_ATTR espconn_tcp_set_buf_count(struct espconn *espconn, uint8
} }
} }
if (plist == NULL)
return ESPCONN_ARG; return ESPCONN_ARG;
} }
@ -951,7 +954,7 @@ espconn_disconnect(struct espconn *espconn)
if (value){ if (value){
/*protect for redisconnection*/ /*protect for redisconnection*/
if (espconn->state == ESPCONN_CLOSE) if (pnode->preverse == NULL && espconn->state == ESPCONN_CLOSE)
return ESPCONN_INPROGRESS; return ESPCONN_INPROGRESS;
espconn_tcp_disconnect(pnode,0); //1 force, 0 normal espconn_tcp_disconnect(pnode,0); //1 force, 0 normal
return ESPCONN_OK; return ESPCONN_OK;

View File

@ -152,6 +152,7 @@ void ICACHE_FLASH_ATTR espconn_kill_pcb(u16_t port)
struct tcp_pcb *cpcb = NULL; struct tcp_pcb *cpcb = NULL;
uint8 i = 0; uint8 i = 0;
struct tcp_pcb *inactive = NULL; struct tcp_pcb *inactive = NULL;
struct tcp_pcb *prev = NULL;
u8_t pcb_remove; u8_t pcb_remove;
/* Check if the address already is in use (on all lists) */ /* Check if the address already is in use (on all lists) */
for (i = 1; i < 4; i++) { 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; uint16 local_port = pcurrent_msg->pcommon.local_port;
uint32 local_ip = pcurrent_msg->pcommon.local_ip; uint32 local_ip = pcurrent_msg->pcommon.local_ip;
uint16 remote_port = pcurrent_msg->pcommon.remote_port; 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; struct tcp_pcb *find_pcb = NULL;
if (pcurrent_msg ->preverse == NULL){/*Find the server's TCP block*/ if (pcurrent_msg ->preverse == NULL){/*Find the server's TCP block*/
if (local_ip == 0|| local_port == 0) return pcurrent_msg->pcommon.pcb; 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; 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 * FunctionName : espconn_tcp_reconnect
* Description : reconnect with host * Description : reconnect with host
@ -234,24 +259,15 @@ espconn_tcp_reconnect(void *arg)
espconn_kill_oldest_pcb(); espconn_kill_oldest_pcb();
if (precon_cb != NULL) { if (precon_cb != NULL) {
struct espconn *espconn = precon_cb->preverse; struct espconn *espconn = precon_cb->preverse;
re_err = precon_cb->pcommon.err; re_err = precon_cb->pcommon.err;
if (precon_cb->pespconn != NULL){ if (precon_cb->pespconn != NULL){
if (espconn != NULL){/*Process the server's message block*/ if (espconn != NULL){/*Process the server's message block*/
if (precon_cb->pespconn->proto.tcp != NULL){ if (precon_cb->pespconn->proto.tcp != NULL){
espconn_copy_partial(espconn, precon_cb->pespconn); 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*/ } else {/*Process the client's message block*/
espconn = precon_cb->pespconn; 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_bzero(&pktinfo[1], sizeof(struct espconn_packet));
os_memcpy(&pktinfo[1], (void*)&precon_cb->pcommon.packet_info, 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) { if (espconn && espconn->proto.tcp && espconn->proto.tcp->reconnect_callback != NULL) {
espconn->proto.tcp->reconnect_callback(espconn, re_err); espconn->proto.tcp->reconnect_callback(espconn, re_err);
} }
/*frees the connection memory*/
espconn_tcp_memp_free(precon_cb);
} else { } else {
espconn_printf("espconn_tcp_reconnect err\n"); espconn_printf("espconn_tcp_reconnect err\n");
} }
@ -286,31 +304,24 @@ static void ICACHE_FLASH_ATTR
espconn_tcp_disconnect_successful(void *arg) espconn_tcp_disconnect_successful(void *arg)
{ {
espconn_msg *pdiscon_cb = arg; espconn_msg *pdiscon_cb = arg;
sint8 dis_err = 0;
espconn_buf *pdis_buf = NULL; espconn_buf *pdis_buf = NULL;
espconn_buf *pdis_back = NULL; espconn_buf *pdis_back = NULL;
espconn_kill_oldest_pcb(); espconn_kill_oldest_pcb();
if (pdiscon_cb != NULL) { if (pdiscon_cb != NULL) {
struct espconn *espconn = pdiscon_cb->preverse; struct espconn *espconn = pdiscon_cb->preverse;
dis_err = pdiscon_cb->pcommon.err;
if (pdiscon_cb->pespconn != NULL){ if (pdiscon_cb->pespconn != NULL){
struct tcp_pcb *pcb = NULL; struct tcp_pcb *pcb = NULL;
if (espconn != NULL){/*Process the server's message block*/ if (espconn != NULL){/*Process the server's message block*/
if (pdiscon_cb->pespconn->proto.tcp != NULL && espconn->proto.tcp){ if (pdiscon_cb->pespconn->proto.tcp != NULL && espconn->proto.tcp){
espconn_copy_partial(espconn, pdiscon_cb->pespconn); 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*/ } else {/*Process the client's message block*/
espconn = pdiscon_cb->pespconn; 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*/ /*process the current TCP block*/
pcb = espconn_find_current_pcb(pdiscon_cb); pcb = espconn_find_current_pcb(pdiscon_cb);
if (pcb != NULL){ if (pcb != NULL){
@ -365,11 +376,13 @@ espconn_tcp_disconnect_successful(void *arg)
} }
os_bzero(&pktinfo[0], sizeof(struct espconn_packet)); os_bzero(&pktinfo[0], sizeof(struct espconn_packet));
os_memcpy(&pktinfo[0], (void*)&pdiscon_cb->pcommon.packet_info, 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) { if (espconn->proto.tcp && espconn->proto.tcp->disconnect_callback != NULL) {
espconn->proto.tcp->disconnect_callback(espconn); espconn->proto.tcp->disconnect_callback(espconn);
} }
/*frees the connection memory*/
espconn_tcp_memp_free(pdiscon_cb);
} else { } else {
espconn_printf("espconn_tcp_disconnect err\n"); 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; struct tcp_pcb *pcb = NULL;
err_t err = 0; err_t err = 0;
u16_t len = 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); 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: case CLOSED:
perr_cb->pcommon.err = ESPCONN_CONN; perr_cb->pcommon.err = ESPCONN_CONN;
break; break;
default:
break;
} }
} else { } else {
perr_cb->pcommon.err = err; perr_cb->pcommon.err = err;
@ -928,6 +940,7 @@ espconn_tcp_client(struct espconn *espconn)
} }
#endif #endif
/*Establish the connection*/ /*Establish the connection*/
pclient->espconn_mode = ESPCONN_TCPCLIENT_MODE;
pclient->pcommon.err = tcp_connect(pcb, &ipaddr, pclient->pcommon.err = tcp_connect(pcb, &ipaddr,
pclient->pespconn->proto.tcp->remote_port, espconn_client_connect); pclient->pespconn->proto.tcp->remote_port, espconn_client_connect);
if (pclient->pcommon.err == ERR_RTE){ 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->pespconn ->state = ESPCONN_READ;
precv_cb->pcommon.pcb = pcb; precv_cb->pcommon.pcb = pcb;
if (precv_cb->pespconn->recv_callback != NULL) { 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*/ /*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); espconn_list_creat(&plink_active, paccept);
paccept->preverse = espconn; paccept->preverse = espconn;
paccept->espconn_mode = ESPCONN_TCPSERVER_MODE;
paccept->pespconn = (struct espconn *)os_zalloc(sizeof(struct espconn)); paccept->pespconn = (struct espconn *)os_zalloc(sizeof(struct espconn));
if (paccept->pespconn == NULL) if (paccept->pespconn == NULL)
return ERR_MEM; return ERR_MEM;
@ -1345,13 +1359,13 @@ espconn_tcp_server(struct espconn *espconn)
*******************************************************************************/ *******************************************************************************/
sint8 ICACHE_FLASH_ATTR espconn_tcp_delete(struct espconn *pdeletecon) sint8 ICACHE_FLASH_ATTR espconn_tcp_delete(struct espconn *pdeletecon)
{ {
err_t err = ESPCONN_ARG; err_t err;
remot_info *pinfo = NULL; remot_info *pinfo = NULL;
espconn_msg *pdelete_msg = NULL; espconn_msg *pdelete_msg = NULL;
struct tcp_pcb *pcb = NULL; struct tcp_pcb *pcb = NULL;
if (pdeletecon == NULL) if (pdeletecon == NULL)
return err; return ESPCONN_ARG;
espconn_get_connection_info(pdeletecon, &pinfo , 0); espconn_get_connection_info(pdeletecon, &pinfo , 0);
/*make sure all the active connection have been disconnect*/ /*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; pdelete_msg = pdelete_msg->pnext;
} }
if (err == ERR_OK)
return err; return err;
else
return ESPCONN_ARG;
} }
} }

View File

@ -285,6 +285,7 @@ espconn_udp_recv(void *arg, struct udp_pcb *upcb, struct pbuf *p,
struct ip_addr *addr, u16_t port) struct ip_addr *addr, u16_t port)
{ {
espconn_msg *precv = arg; espconn_msg *precv = arg;
struct pbuf *q = NULL;
u8_t *pdata = NULL; u8_t *pdata = NULL;
u16_t length = 0; u16_t length = 0;
struct ip_info ipconfig; struct ip_info ipconfig;
@ -320,7 +321,7 @@ espconn_udp_recv(void *arg, struct udp_pcb *upcb, struct pbuf *p,
pbuf_free(p); pbuf_free(p);
if (length != 0) { if (length != 0) {
if (precv->pespconn->recv_callback != NULL) { 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); os_free(pdata);

View File

@ -109,7 +109,7 @@ ping_prepare_echo( struct icmp_echo_hdr *iecho, u16_t len)
iecho->chksum = inet_chksum(iecho, len); iecho->chksum = inet_chksum(iecho, len);
} }
/*
static void ICACHE_FLASH_ATTR static void ICACHE_FLASH_ATTR
ping_prepare_er(struct icmp_echo_hdr *iecho, u16_t len) 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); iecho->chksum = inet_chksum(iecho, len);
} }
*/
/* Ping using the raw ip */ /* Ping using the raw ip */
static u8_t ICACHE_FLASH_ATTR static u8_t ICACHE_FLASH_ATTR
ping_recv(void *arg, struct raw_pcb *pcb, struct pbuf *p, ip_addr_t *addr) ping_recv(void *arg, struct raw_pcb *pcb, struct pbuf *p, ip_addr_t *addr)

View File

@ -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 * better check for failure: != IPADDR_NONE) or IPADDR_NONE if the hostname
* was not found in the cached dns_table. * was not found in the cached dns_table.
*/ */
/*
static u32_t ICACHE_FLASH_ATTR static u32_t ICACHE_FLASH_ATTR
dns_lookup(const char *name) dns_lookup(const char *name)
{ {
u8_t i; u8_t i;
#if DNS_LOCAL_HOSTLIST || defined(DNS_LOOKUP_LOCAL_EXTERN) #if DNS_LOCAL_HOSTLIST || defined(DNS_LOOKUP_LOCAL_EXTERN)
u32_t addr; u32_t addr;
#endif #endif /* DNS_LOCAL_HOSTLIST || defined(DNS_LOOKUP_LOCAL_EXTERN) */
#if DNS_LOCAL_HOSTLIST #if DNS_LOCAL_HOSTLIST
if ((addr = dns_lookup_local(name)) != IPADDR_NONE) { if ((addr = dns_lookup_local(name)) != IPADDR_NONE) {
return addr; return addr;
} }
#endif #endif /* DNS_LOCAL_HOSTLIST */
#ifdef DNS_LOOKUP_LOCAL_EXTERN #ifdef DNS_LOOKUP_LOCAL_EXTERN
if((addr = DNS_LOOKUP_LOCAL_EXTERN(name)) != IPADDR_NONE) { if((addr = DNS_LOOKUP_LOCAL_EXTERN(name)) != IPADDR_NONE) {
return addr; 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) { for (i = 0; i < DNS_TABLE_SIZE; ++i) {
if ((dns_table[i].state == DNS_STATE_DONE) && if ((dns_table[i].state == DNS_STATE_DONE) &&
(strcmp(name, dns_table[i].name) == 0)) { (strcmp(name, dns_table[i].name) == 0)) {
@ -482,7 +481,7 @@ dns_lookup(const char *name)
return IPADDR_NONE; return IPADDR_NONE;
} }
*/
#if DNS_DOES_NAME_CHECK #if DNS_DOES_NAME_CHECK
/** /**
* Compare the "dotted" name "query" with the encoded name "response" * Compare the "dotted" name "query" with the encoded name "response"
@ -775,8 +774,6 @@ dns_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p, ip_addr_t *addr, u16_t
if (i < DNS_TABLE_SIZE) { if (i < DNS_TABLE_SIZE) {
pEntry = &dns_table[i]; pEntry = &dns_table[i];
if(pEntry->state == DNS_STATE_ASKING) { 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 /* We only care about the question(s) and the answers. The authrr
@ -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)) { 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)); LWIP_DEBUGF(DNS_DEBUG, ("dns_recv: \"%s\": error in flags\n", pEntry->name));
/* call callback to indicate error, clean up memory and return */ /* 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 #if DNS_DOES_NAME_CHECK
/* Check if the name in the "question" part match with the name in the entry. */ /* Check if the name in the "question" part match with the name in the entry. */

View File

@ -47,6 +47,7 @@
#include "lwip/inet_chksum.h" #include "lwip/inet_chksum.h"
#include "lwip/ip.h" #include "lwip/ip.h"
#include "lwip/def.h" #include "lwip/def.h"
#include "lwipopts.h"
#include "lwip/stats.h" #include "lwip/stats.h"
#include "lwip/snmp.h" #include "lwip/snmp.h"

View File

@ -710,6 +710,17 @@ igmp_start_timer(struct igmp_group *group, u8_t max_time)
group->timer = (LWIP_RAND() % (max_time - 1)) + 1; 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 * Delaying membership report for a group if necessary
* *

View File

@ -900,11 +900,27 @@ mdns_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p, struct ip_addr *addr,
void ICACHE_FLASH_ATTR void ICACHE_FLASH_ATTR
mdns_close(void) 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); 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); os_free(ms_info);
mdns_pcb = NULL; mdns_pcb = NULL;
ms_info = NULL; ms_info = NULL;
}
} }
@ -1034,9 +1050,24 @@ mdns_init(struct mdns_info *info) {
multicast_addr.addr = DNS_MULTICAST_ADDRESS; multicast_addr.addr = DNS_MULTICAST_ADDRESS;
struct ip_addr ap_host_addr; struct ip_addr ap_host_addr;
struct ip_info ipconfig; struct ip_info ipconfig;
uint8 text_index = 0;
ms_info = (struct mdns_info *)os_zalloc(sizeof(struct mdns_info)); ms_info = (struct mdns_info *)os_zalloc(sizeof(struct mdns_info));
if (ms_info != NULL) { if (ms_info != NULL) {
os_memcpy(ms_info,info,sizeof(struct mdns_info)); 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 { } else {
os_printf("ms_info alloc failed\n"); os_printf("ms_info alloc failed\n");
return; return;

View File

@ -268,10 +268,7 @@ struct sntp_server {
}; };
static struct sntp_server sntp_servers[SNTP_MAX_SERVERS]; static struct sntp_server sntp_servers[SNTP_MAX_SERVERS];
#if SNTP_GET_SERVERS_FROM_DHCP
static u8_t sntp_set_servers_from_dhcp; static u8_t sntp_set_servers_from_dhcp;
#endif
#if SNTP_SUPPORT_MULTIPLE_SERVERS #if SNTP_SUPPORT_MULTIPLE_SERVERS
/** The currently used server (initialized to 0) */ /** The currently used server (initialized to 0) */
static u8_t sntp_current_server; 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; long days, rem;
time_t lcltime; time_t lcltime;
int i;
int y; int y;
int yleap; int yleap;
const int *ip; const int *ip;

View File

@ -114,7 +114,7 @@ tcp_timer_needed(void)
* *
* @param arg unused argument * @param arg unused argument
*/ */
/*
static void ICACHE_FLASH_ATTR static void ICACHE_FLASH_ATTR
tcp_timer_coarse(void *arg) tcp_timer_coarse(void *arg)
{ {
@ -123,7 +123,7 @@ tcp_timer_coarse(void *arg)
tcp_tmr(); tcp_tmr();
sys_timeout(TCP_TMR_INTERVAL, tcp_timer_coarse, NULL); sys_timeout(TCP_TMR_INTERVAL, tcp_timer_coarse, NULL);
} }
*/
#endif /* LWIP_TCP */ #endif /* LWIP_TCP */
#if IP_REASSEMBLY #if IP_REASSEMBLY

View File

@ -1 +1 @@
1.5.1_16_01_08 1.5.3_16_04_18