Upgraded LWIP to 1.4.0 released from Espressif.
Plus directly provided patch for user_interface.h.
This commit is contained in:
parent
711d464a2b
commit
5d5be35633
|
@ -24,6 +24,7 @@ typedef struct dhcps_msg {
|
||||||
|
|
||||||
#ifndef LWIP_OPEN_SRC
|
#ifndef LWIP_OPEN_SRC
|
||||||
struct dhcps_lease {
|
struct dhcps_lease {
|
||||||
|
bool enable;
|
||||||
struct ip_addr start_ip;
|
struct ip_addr start_ip;
|
||||||
struct ip_addr end_ip;
|
struct ip_addr end_ip;
|
||||||
};
|
};
|
||||||
|
@ -46,7 +47,8 @@ typedef struct _list_node{
|
||||||
struct _list_node *pnext;
|
struct _list_node *pnext;
|
||||||
}list_node;
|
}list_node;
|
||||||
|
|
||||||
#define DHCPS_LEASE_TIMER 0x05A0
|
extern uint32 dhcps_lease_time;
|
||||||
|
#define DHCPS_LEASE_TIMER dhcps_lease_time //0x05A0
|
||||||
#define DHCPS_MAX_LEASE 0x64
|
#define DHCPS_MAX_LEASE 0x64
|
||||||
#define BOOTP_BROADCAST 0x8000
|
#define BOOTP_BROADCAST 0x8000
|
||||||
|
|
||||||
|
@ -89,6 +91,7 @@ typedef struct _list_node{
|
||||||
#define DHCPS_STATE_ACK 3
|
#define DHCPS_STATE_ACK 3
|
||||||
#define DHCPS_STATE_NAK 4
|
#define DHCPS_STATE_NAK 4
|
||||||
#define DHCPS_STATE_IDLE 5
|
#define DHCPS_STATE_IDLE 5
|
||||||
|
#define DHCPS_STATE_RELEASE 6
|
||||||
|
|
||||||
#define dhcps_router_enabled(offer) ((offer & OFFER_ROUTER) != 0)
|
#define dhcps_router_enabled(offer) ((offer & OFFER_ROUTER) != 0)
|
||||||
|
|
||||||
|
|
|
@ -30,6 +30,7 @@ typedef void (* espconn_reconnect_callback)(void *arg, sint8 err);
|
||||||
#define ESPCONN_CONN -11 /* Not connected. */
|
#define ESPCONN_CONN -11 /* Not connected. */
|
||||||
|
|
||||||
#define ESPCONN_ARG -12 /* Illegal argument. */
|
#define ESPCONN_ARG -12 /* Illegal argument. */
|
||||||
|
#define ESPCONN_IF -14 /* Low_level error */
|
||||||
#define ESPCONN_ISCONN -15 /* Already connected. */
|
#define ESPCONN_ISCONN -15 /* Already connected. */
|
||||||
|
|
||||||
#define ESPCONN_HANDSHAKE -28 /* ssl handshake failed */
|
#define ESPCONN_HANDSHAKE -28 /* ssl handshake failed */
|
||||||
|
@ -168,7 +169,7 @@ typedef struct _espconn_msg{
|
||||||
struct espconn *pespconn;
|
struct espconn *pespconn;
|
||||||
comon_pkt pcommon;
|
comon_pkt pcommon;
|
||||||
uint8 count_opt;
|
uint8 count_opt;
|
||||||
sint16_t hs_status; //the status of the handshake
|
int16_t hs_status; //the status of the handshake
|
||||||
void *preverse;
|
void *preverse;
|
||||||
void *pssl;
|
void *pssl;
|
||||||
struct _espconn_msg *pnext;
|
struct _espconn_msg *pnext;
|
||||||
|
|
|
@ -45,6 +45,19 @@ extern sint8 espconn_udp_server(struct espconn *espconn);
|
||||||
|
|
||||||
extern err_t espconn_udp_sent(void *arg, uint8 *psent, uint16 length);
|
extern err_t espconn_udp_sent(void *arg, uint8 *psent, uint16 length);
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* FunctionName : espconn_udp_sendto
|
||||||
|
* Description : sent data for UDP
|
||||||
|
* Parameters : void *arg -- UDP to send
|
||||||
|
* uint8* psent -- Data to send
|
||||||
|
* uint16 length -- Length of data to send
|
||||||
|
* Returns : return espconn error code.
|
||||||
|
* - ESPCONN_OK. Successful. No error occured.
|
||||||
|
* - ESPCONN_MEM. Out of memory.
|
||||||
|
* - ESPCONN_RTE. Could not find route to destination address.
|
||||||
|
* - More errors could be returned by lower protocol layers.
|
||||||
|
*******************************************************************************/
|
||||||
|
extern err_t espconn_udp_sendto(void *arg, uint8 *psent, uint16 length);
|
||||||
|
|
||||||
#endif /* __ESPCONN_UDP_H__ */
|
#endif /* __ESPCONN_UDP_H__ */
|
||||||
|
|
||||||
|
|
|
@ -33,7 +33,7 @@
|
||||||
#define __LWIP_MEM_H__
|
#define __LWIP_MEM_H__
|
||||||
|
|
||||||
#include "lwip/opt.h"
|
#include "lwip/opt.h"
|
||||||
#include "mem_manager.h"
|
//#include "mem_manager.h"
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
|
@ -50,6 +50,7 @@ typedef size_t mem_size_t;
|
||||||
/* in case C library malloc() needs extra protection,
|
/* in case C library malloc() needs extra protection,
|
||||||
* allow these defines to be overridden.
|
* allow these defines to be overridden.
|
||||||
*/
|
*/
|
||||||
|
#ifndef MEMLEAK_DEBUG
|
||||||
#ifndef mem_free
|
#ifndef mem_free
|
||||||
#define mem_free vPortFree
|
#define mem_free vPortFree
|
||||||
#endif
|
#endif
|
||||||
|
@ -64,6 +65,28 @@ typedef size_t mem_size_t;
|
||||||
#endif
|
#endif
|
||||||
#ifndef mem_zalloc
|
#ifndef mem_zalloc
|
||||||
#define mem_zalloc pvPortZalloc
|
#define mem_zalloc pvPortZalloc
|
||||||
|
#endif
|
||||||
|
#else
|
||||||
|
#ifndef mem_free
|
||||||
|
#define mem_free(s) \
|
||||||
|
do{\
|
||||||
|
const char *file = mem_debug_file;\
|
||||||
|
vPortFree(s, file, __LINE__);\
|
||||||
|
}while(0)
|
||||||
|
#endif
|
||||||
|
#ifndef mem_malloc
|
||||||
|
#define mem_malloc(s) ({const char *file = mem_debug_file; pvPortMalloc(s, file, __LINE__);})
|
||||||
|
#endif
|
||||||
|
#ifndef mem_calloc
|
||||||
|
#define mem_calloc(s) ({const char *file = mem_debug_file; pvPortCalloc(s, file, __LINE__);})
|
||||||
|
#endif
|
||||||
|
#ifndef mem_realloc
|
||||||
|
#define mem_realloc(p, s) ({const char *file = mem_debug_file; pvPortRealloc(p, s, file, __LINE__);})
|
||||||
|
#endif
|
||||||
|
#ifndef mem_zalloc
|
||||||
|
#define mem_zalloc(s) ({const char *file = mem_debug_file; pvPortZalloc(s, file, __LINE__);})
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef os_malloc
|
#ifndef os_malloc
|
||||||
|
|
|
@ -130,6 +130,9 @@ typedef void (*netif_status_callback_fn)(struct netif *netif);
|
||||||
typedef err_t (*netif_igmp_mac_filter_fn)(struct netif *netif,
|
typedef err_t (*netif_igmp_mac_filter_fn)(struct netif *netif,
|
||||||
ip_addr_t *group, u8_t action);
|
ip_addr_t *group, u8_t action);
|
||||||
|
|
||||||
|
/*add DHCP event processing by LiuHan*/
|
||||||
|
typedef void (*dhcp_event_fn)(void);
|
||||||
|
|
||||||
/** Generic data structure used for all lwIP network interfaces.
|
/** Generic data structure used for all lwIP network interfaces.
|
||||||
* The following fields should be filled in by the initialization
|
* The following fields should be filled in by the initialization
|
||||||
* function for the device driver: hwaddr_len, hwaddr[], mtu, flags */
|
* function for the device driver: hwaddr_len, hwaddr[], mtu, flags */
|
||||||
|
@ -170,7 +173,7 @@ struct netif {
|
||||||
/** the DHCP client state information for this netif */
|
/** the DHCP client state information for this netif */
|
||||||
struct dhcp *dhcp;
|
struct dhcp *dhcp;
|
||||||
struct udp_pcb *dhcps_pcb; //dhcps
|
struct udp_pcb *dhcps_pcb; //dhcps
|
||||||
void *pad;
|
dhcp_event_fn dhcp_event;
|
||||||
#endif /* LWIP_DHCP */
|
#endif /* LWIP_DHCP */
|
||||||
#if LWIP_AUTOIP
|
#if LWIP_AUTOIP
|
||||||
/** the AutoIP client state information for this netif */
|
/** the AutoIP client state information for this netif */
|
||||||
|
|
|
@ -281,8 +281,8 @@ void sys_arch_unprotect(sys_prot_t pval)ICACHE_FLASH_ATTR;
|
||||||
#else
|
#else
|
||||||
|
|
||||||
#define SYS_ARCH_DECL_PROTECT(lev)
|
#define SYS_ARCH_DECL_PROTECT(lev)
|
||||||
#define SYS_ARCH_PROTECT(lev) lev = ets_intr_lock() //fix by ives at 2014.3.24
|
#define SYS_ARCH_PROTECT(lev) lev = os_intr_lock() //fix by ives at 2014.3.24
|
||||||
#define SYS_ARCH_UNPROTECT(lev) lev = ets_intr_unlock()
|
#define SYS_ARCH_UNPROTECT(lev) lev = os_intr_unlock()
|
||||||
|
|
||||||
#endif /* SYS_LIGHTWEIGHT_PROT */
|
#endif /* SYS_LIGHTWEIGHT_PROT */
|
||||||
|
|
||||||
|
|
|
@ -659,6 +659,13 @@
|
||||||
#define DHCP_DOES_ARP_CHECK ((LWIP_DHCP) && (LWIP_ARP))
|
#define DHCP_DOES_ARP_CHECK ((LWIP_DHCP) && (LWIP_ARP))
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* DHCP_MAXRTX: Maximum number of retries of current request.
|
||||||
|
*/
|
||||||
|
#ifndef DHCP_MAXRTX
|
||||||
|
#define DHCP_MAXRTX (*(volatile uint32*)0x600011E0)
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
------------------------------------
|
------------------------------------
|
||||||
---------- AUTOIP options ----------
|
---------- AUTOIP options ----------
|
||||||
|
@ -934,7 +941,7 @@
|
||||||
* Define to 0 if your device is low on memory.
|
* Define to 0 if your device is low on memory.
|
||||||
*/
|
*/
|
||||||
#ifndef TCP_QUEUE_OOSEQ
|
#ifndef TCP_QUEUE_OOSEQ
|
||||||
#define TCP_QUEUE_OOSEQ 0
|
#define TCP_QUEUE_OOSEQ 1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if 1
|
#if 1
|
||||||
|
|
|
@ -10,9 +10,13 @@
|
||||||
#ifndef LWIP_OPEN_SRC
|
#ifndef LWIP_OPEN_SRC
|
||||||
#include "net80211/ieee80211_var.h"
|
#include "net80211/ieee80211_var.h"
|
||||||
#endif
|
#endif
|
||||||
//#include "netif/wlan_lwip_if.h"
|
|
||||||
#include "user_interface.h"
|
#include "user_interface.h"
|
||||||
|
|
||||||
|
#ifdef MEMLEAK_DEBUG
|
||||||
|
static const char mem_debug_file[] ICACHE_RODATA_ATTR = __FILE__;
|
||||||
|
#endif
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////////
|
||||||
//static const uint8_t xid[4] = {0xad, 0xde, 0x12, 0x23};
|
//static const uint8_t xid[4] = {0xad, 0xde, 0x12, 0x23};
|
||||||
//static u8_t old_xid[4] = {0};
|
//static u8_t old_xid[4] = {0};
|
||||||
|
@ -23,12 +27,13 @@ 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 ip_addr client_address_plus;
|
||||||
|
|
||||||
struct dhcps_state s;
|
|
||||||
|
|
||||||
static struct dhcps_lease dhcps_lease;
|
static struct dhcps_lease dhcps_lease;
|
||||||
static bool dhcps_lease_flag = true;
|
//static bool dhcps_lease_flag = true;
|
||||||
static list_node *plist = NULL;
|
static list_node *plist = NULL;
|
||||||
static uint8 offer = 0xFF;
|
static uint8 offer = 0xFF;
|
||||||
|
static bool renew = false;
|
||||||
|
#define DHCPS_LEASE_TIME_DEF (120)
|
||||||
|
uint32 dhcps_lease_time = DHCPS_LEASE_TIME_DEF; //minute
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
* FunctionName : node_insert_to_list
|
* FunctionName : node_insert_to_list
|
||||||
* Description : insert the node to the list
|
* Description : insert the node to the list
|
||||||
|
@ -38,17 +43,35 @@ static uint8 offer = 0xFF;
|
||||||
void ICACHE_FLASH_ATTR node_insert_to_list(list_node **phead, list_node* pinsert)
|
void ICACHE_FLASH_ATTR node_insert_to_list(list_node **phead, list_node* pinsert)
|
||||||
{
|
{
|
||||||
list_node *plist = NULL;
|
list_node *plist = NULL;
|
||||||
|
struct dhcps_pool *pdhcps_pool = NULL;
|
||||||
|
struct dhcps_pool *pdhcps_node = NULL;
|
||||||
if (*phead == NULL)
|
if (*phead == NULL)
|
||||||
*phead = pinsert;
|
*phead = pinsert;
|
||||||
else {
|
else {
|
||||||
plist = *phead;
|
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 {
|
||||||
while (plist->pnext != NULL) {
|
while (plist->pnext != NULL) {
|
||||||
|
pdhcps_pool = plist->pnext->pnode;
|
||||||
|
if (pdhcps_node->ip.addr < pdhcps_pool->ip.addr) {
|
||||||
|
pinsert->pnext = plist->pnext;
|
||||||
|
plist->pnext = pinsert;
|
||||||
|
break;
|
||||||
|
}
|
||||||
plist = plist->pnext;
|
plist = plist->pnext;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(plist->pnext == NULL) {
|
||||||
plist->pnext = pinsert;
|
plist->pnext = pinsert;
|
||||||
}
|
}
|
||||||
pinsert->pnext = NULL;
|
}
|
||||||
|
}
|
||||||
|
// pinsert->pnext = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
|
@ -128,10 +151,10 @@ static uint8_t* ICACHE_FLASH_ATTR add_offer_options(uint8_t *optptr)
|
||||||
|
|
||||||
*optptr++ = DHCP_OPTION_LEASE_TIME;
|
*optptr++ = DHCP_OPTION_LEASE_TIME;
|
||||||
*optptr++ = 4;
|
*optptr++ = 4;
|
||||||
*optptr++ = 0x00;
|
*optptr++ = ((DHCPS_LEASE_TIMER * 60) >> 24) & 0xFF;
|
||||||
*optptr++ = 0x01;
|
*optptr++ = ((DHCPS_LEASE_TIMER * 60) >> 16) & 0xFF;
|
||||||
*optptr++ = 0x51;
|
*optptr++ = ((DHCPS_LEASE_TIMER * 60) >> 8) & 0xFF;
|
||||||
*optptr++ = 0x80;
|
*optptr++ = ((DHCPS_LEASE_TIMER * 60) >> 0) & 0xFF;
|
||||||
|
|
||||||
*optptr++ = DHCP_OPTION_SERVER_ID;
|
*optptr++ = DHCP_OPTION_SERVER_ID;
|
||||||
*optptr++ = 4;
|
*optptr++ = 4;
|
||||||
|
@ -460,6 +483,7 @@ static uint8_t ICACHE_FLASH_ATTR parse_options(uint8_t *optptr, sint16_t len)
|
||||||
{
|
{
|
||||||
struct ip_addr client;
|
struct ip_addr client;
|
||||||
bool is_dhcp_parse_end = false;
|
bool is_dhcp_parse_end = false;
|
||||||
|
struct dhcps_state s;
|
||||||
|
|
||||||
client.addr = *( (uint32_t *) &client_address);// Ҫ<><D2AA><EFBFBD><EFBFBD><EFBFBD>DHCP<43>ͻ<EFBFBD><CDBB>˵<EFBFBD>IP
|
client.addr = *( (uint32_t *) &client_address);// Ҫ<><D2AA><EFBFBD><EFBFBD><EFBFBD>DHCP<43>ͻ<EFBFBD><CDBB>˵<EFBFBD>IP
|
||||||
|
|
||||||
|
@ -516,7 +540,11 @@ static uint8_t ICACHE_FLASH_ATTR parse_options(uint8_t *optptr, sint16_t len)
|
||||||
|
|
||||||
case DHCPREQUEST://3
|
case DHCPREQUEST://3
|
||||||
if ( !(s.state == DHCPS_STATE_ACK || s.state == DHCPS_STATE_NAK) ) {
|
if ( !(s.state == DHCPS_STATE_ACK || s.state == DHCPS_STATE_NAK) ) {
|
||||||
|
if(renew == true) {
|
||||||
|
s.state = DHCPS_STATE_ACK;
|
||||||
|
} else {
|
||||||
s.state = DHCPS_STATE_NAK;
|
s.state = DHCPS_STATE_NAK;
|
||||||
|
}
|
||||||
#if DHCPS_DEBUG
|
#if DHCPS_DEBUG
|
||||||
os_printf("dhcps: DHCPD_STATE_NAK\n");
|
os_printf("dhcps: DHCPD_STATE_NAK\n");
|
||||||
#endif
|
#endif
|
||||||
|
@ -531,7 +559,7 @@ static uint8_t ICACHE_FLASH_ATTR parse_options(uint8_t *optptr, sint16_t len)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case DHCPRELEASE://7
|
case DHCPRELEASE://7
|
||||||
s.state = DHCPS_STATE_IDLE;
|
s.state = DHCPS_STATE_RELEASE;
|
||||||
#if DHCPS_DEBUG
|
#if DHCPS_DEBUG
|
||||||
os_printf("dhcps: DHCPD_STATE_IDLE\n");
|
os_printf("dhcps: DHCPD_STATE_IDLE\n");
|
||||||
#endif
|
#endif
|
||||||
|
@ -579,13 +607,17 @@ static sint16_t ICACHE_FLASH_ATTR parse_msg(struct dhcps_msg *m, u16_t len)
|
||||||
struct ip_addr addr_tmp;
|
struct ip_addr addr_tmp;
|
||||||
// os_memcpy((char *)old_xid, (char *)m->xid, sizeof(m->xid));
|
// os_memcpy((char *)old_xid, (char *)m->xid, sizeof(m->xid));
|
||||||
|
|
||||||
{
|
// {
|
||||||
struct dhcps_pool *pdhcps_pool = NULL;
|
struct dhcps_pool *pdhcps_pool = NULL;
|
||||||
list_node *pnode = NULL;
|
list_node *pnode = NULL;
|
||||||
list_node *pback_node = NULL;
|
list_node *pback_node = NULL;
|
||||||
|
struct ip_addr first_address;
|
||||||
|
bool flag = false;
|
||||||
|
|
||||||
POOL_START:
|
// POOL_START:
|
||||||
|
first_address.addr = dhcps_lease.start_ip.addr;
|
||||||
client_address.addr = client_address_plus.addr;
|
client_address.addr = client_address_plus.addr;
|
||||||
|
renew = false;
|
||||||
// addr_tmp.addr = htonl(client_address_plus.addr);
|
// addr_tmp.addr = htonl(client_address_plus.addr);
|
||||||
// addr_tmp.addr++;
|
// addr_tmp.addr++;
|
||||||
// client_address_plus.addr = htonl(addr_tmp.addr);
|
// client_address_plus.addr = htonl(addr_tmp.addr);
|
||||||
|
@ -593,8 +625,12 @@ static sint16_t ICACHE_FLASH_ATTR parse_msg(struct dhcps_msg *m, u16_t len)
|
||||||
pdhcps_pool = pback_node->pnode;
|
pdhcps_pool = pback_node->pnode;
|
||||||
if (os_memcmp(pdhcps_pool->mac, m->chaddr, sizeof(pdhcps_pool->mac)) == 0){
|
if (os_memcmp(pdhcps_pool->mac, m->chaddr, sizeof(pdhcps_pool->mac)) == 0){
|
||||||
// os_printf("the same device request ip\n");
|
// 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;
|
client_address.addr = pdhcps_pool->ip.addr;
|
||||||
pdhcps_pool->lease_timer = DHCPS_LEASE_TIMER;
|
pdhcps_pool->lease_timer = DHCPS_LEASE_TIMER;
|
||||||
|
pnode = pback_node;
|
||||||
goto POOL_CHECK;
|
goto POOL_CHECK;
|
||||||
} else if (pdhcps_pool->ip.addr == client_address_plus.addr){
|
} else if (pdhcps_pool->ip.addr == client_address_plus.addr){
|
||||||
// client_address.addr = client_address_plus.addr;
|
// client_address.addr = client_address_plus.addr;
|
||||||
|
@ -604,31 +640,79 @@ static sint16_t ICACHE_FLASH_ATTR parse_msg(struct dhcps_msg *m, u16_t len)
|
||||||
client_address_plus.addr = htonl(addr_tmp.addr);
|
client_address_plus.addr = htonl(addr_tmp.addr);
|
||||||
client_address.addr = client_address_plus.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 = (struct dhcps_pool *)os_zalloc(sizeof(struct dhcps_pool));
|
||||||
pdhcps_pool->ip.addr = client_address.addr;
|
pdhcps_pool->ip.addr = client_address.addr;
|
||||||
os_memcpy(pdhcps_pool->mac, m->chaddr, sizeof(pdhcps_pool->mac));
|
os_memcpy(pdhcps_pool->mac, m->chaddr, sizeof(pdhcps_pool->mac));
|
||||||
pdhcps_pool->lease_timer = DHCPS_LEASE_TIMER;
|
pdhcps_pool->lease_timer = DHCPS_LEASE_TIMER;
|
||||||
pnode = (list_node *)os_zalloc(sizeof(list_node ));
|
pnode = (list_node *)os_zalloc(sizeof(list_node ));
|
||||||
pnode->pnode = pdhcps_pool;
|
pnode->pnode = pdhcps_pool;
|
||||||
|
pnode->pnext = NULL;
|
||||||
node_insert_to_list(&plist,pnode);
|
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:
|
POOL_CHECK:
|
||||||
if ((client_address_plus.addr > dhcps_lease.end_ip.addr) || (ip_addr_isany(&client_address))){
|
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());
|
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);
|
node_remove_from_list(&plist,pnode);
|
||||||
os_free(pdhcps_pool);
|
|
||||||
pdhcps_pool = NULL;
|
|
||||||
os_free(pnode);
|
os_free(pnode);
|
||||||
pnode = NULL;
|
pnode = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pdhcps_pool != NULL) {
|
||||||
|
os_free(pdhcps_pool);
|
||||||
|
pdhcps_pool = NULL;
|
||||||
|
}
|
||||||
// client_address_plus.addr = dhcps_lease.start_ip.addr;
|
// client_address_plus.addr = dhcps_lease.start_ip.addr;
|
||||||
return 4;
|
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) {
|
if (wifi_softap_set_station_info(m->chaddr, &client_address) == false) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
// }
|
||||||
|
|
||||||
#if DHCPS_DEBUG
|
#if DHCPS_DEBUG
|
||||||
os_printf("dhcps: xid changed\n");
|
os_printf("dhcps: xid changed\n");
|
||||||
|
@ -638,8 +722,7 @@ static sint16_t ICACHE_FLASH_ATTR parse_msg(struct dhcps_msg *m, u16_t len)
|
||||||
// }
|
// }
|
||||||
|
|
||||||
// }
|
// }
|
||||||
|
return ret;
|
||||||
return parse_options(&m->options[4], len);
|
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -757,8 +840,27 @@ static void ICACHE_FLASH_ATTR handle_dhcp(void *arg,
|
||||||
static void ICACHE_FLASH_ATTR wifi_softap_init_dhcps_lease(uint32 ip)
|
static void ICACHE_FLASH_ATTR wifi_softap_init_dhcps_lease(uint32 ip)
|
||||||
{
|
{
|
||||||
uint32 softap_ip = 0,local_ip = 0;
|
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_flag) {
|
if (dhcps_lease.enable == FALSE) {
|
||||||
local_ip = softap_ip = htonl(ip);
|
local_ip = softap_ip = htonl(ip);
|
||||||
softap_ip &= 0xFFFFFF00;
|
softap_ip &= 0xFFFFFF00;
|
||||||
local_ip &= 0xFF;
|
local_ip &= 0xFF;
|
||||||
|
@ -769,10 +871,12 @@ static void ICACHE_FLASH_ATTR wifi_softap_init_dhcps_lease(uint32 ip)
|
||||||
|
|
||||||
os_bzero(&dhcps_lease, sizeof(dhcps_lease));
|
os_bzero(&dhcps_lease, sizeof(dhcps_lease));
|
||||||
dhcps_lease.start_ip.addr = softap_ip | local_ip;
|
dhcps_lease.start_ip.addr = softap_ip | local_ip;
|
||||||
dhcps_lease.end_ip.addr = softap_ip | (local_ip + DHCPS_MAX_LEASE);
|
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.start_ip.addr = htonl(dhcps_lease.start_ip.addr);
|
||||||
dhcps_lease.end_ip.addr= htonl(dhcps_lease.end_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_printf("start_ip = 0x%x, end_ip = 0x%x\n",dhcps_lease.start_ip, dhcps_lease.end_ip);
|
||||||
}
|
}
|
||||||
///////////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////////
|
||||||
|
@ -810,7 +914,7 @@ 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);
|
udp_disconnect(pcb_dhcps);
|
||||||
dhcps_lease_flag = true;
|
// dhcps_lease_flag = true;
|
||||||
if(apnetif->dhcps_pcb != NULL) {
|
if(apnetif->dhcps_pcb != NULL) {
|
||||||
udp_remove(apnetif->dhcps_pcb);
|
udp_remove(apnetif->dhcps_pcb);
|
||||||
apnetif->dhcps_pcb = NULL;
|
apnetif->dhcps_pcb = NULL;
|
||||||
|
@ -854,6 +958,7 @@ bool ICACHE_FLASH_ATTR wifi_softap_set_dhcps_lease(struct dhcps_lease *please)
|
||||||
if (please == NULL || wifi_softap_dhcps_status() == DHCP_STARTED)
|
if (please == NULL || wifi_softap_dhcps_status() == DHCP_STARTED)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
if(please->enable) {
|
||||||
os_bzero(&info, sizeof(struct ip_info));
|
os_bzero(&info, sizeof(struct ip_info));
|
||||||
wifi_get_ip_info(SOFTAP_IF, &info);
|
wifi_get_ip_info(SOFTAP_IF, &info);
|
||||||
softap_ip = htonl(info.ip.addr);
|
softap_ip = htonl(info.ip.addr);
|
||||||
|
@ -875,9 +980,13 @@ bool ICACHE_FLASH_ATTR wifi_softap_set_dhcps_lease(struct dhcps_lease *please)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
os_bzero(&dhcps_lease, sizeof(dhcps_lease));
|
os_bzero(&dhcps_lease, sizeof(dhcps_lease));
|
||||||
dhcps_lease.start_ip.addr = start_ip;
|
// dhcps_lease.start_ip.addr = start_ip;
|
||||||
dhcps_lease.end_ip.addr = end_ip;
|
// dhcps_lease.end_ip.addr = end_ip;
|
||||||
dhcps_lease_flag = false;
|
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;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -899,22 +1008,25 @@ bool ICACHE_FLASH_ATTR wifi_softap_get_dhcps_lease(struct dhcps_lease *please)
|
||||||
if (NULL == please)
|
if (NULL == please)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (dhcps_lease_flag){
|
// if (dhcps_lease_flag){
|
||||||
|
if (dhcps_lease.enable == FALSE){
|
||||||
if (wifi_softap_dhcps_status() == DHCP_STOPPED)
|
if (wifi_softap_dhcps_status() == DHCP_STOPPED)
|
||||||
return false;
|
return false;
|
||||||
} else {
|
} else {
|
||||||
os_bzero(please, sizeof(dhcps_lease));
|
// os_bzero(please, sizeof(dhcps_lease));
|
||||||
if (wifi_softap_dhcps_status() == DHCP_STOPPED){
|
// if (wifi_softap_dhcps_status() == DHCP_STOPPED){
|
||||||
please->start_ip.addr = htonl(dhcps_lease.start_ip.addr);
|
// please->start_ip.addr = htonl(dhcps_lease.start_ip.addr);
|
||||||
please->end_ip.addr = htonl(dhcps_lease.end_ip.addr);
|
// please->end_ip.addr = htonl(dhcps_lease.end_ip.addr);
|
||||||
}
|
// }
|
||||||
}
|
}
|
||||||
|
|
||||||
if (wifi_softap_dhcps_status() == DHCP_STARTED){
|
// if (wifi_softap_dhcps_status() == DHCP_STARTED){
|
||||||
os_bzero(please, sizeof(dhcps_lease));
|
// 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->start_ip.addr = dhcps_lease.start_ip.addr;
|
||||||
please->end_ip.addr = dhcps_lease.end_ip.addr;
|
please->end_ip.addr = dhcps_lease.end_ip.addr;
|
||||||
}
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -994,3 +1106,41 @@ bool ICACHE_FLASH_ATTR wifi_softap_set_dhcps_offer_option(uint8 level, void* opt
|
||||||
return offer_flag;
|
return offer_flag;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool ICACHE_FLASH_ATTR wifi_softap_set_dhcps_lease_time(uint32 minute)
|
||||||
|
{
|
||||||
|
uint8 opmode = wifi_get_opmode();
|
||||||
|
|
||||||
|
if (opmode == STATION_MODE || opmode == NULL_MODE) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (wifi_softap_dhcps_status() == DHCP_STARTED) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(minute == 0) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
dhcps_lease_time = minute;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ICACHE_FLASH_ATTR wifi_softap_reset_dhcps_lease_time(void)
|
||||||
|
{
|
||||||
|
uint8 opmode = wifi_get_opmode();
|
||||||
|
|
||||||
|
if (opmode == STATION_MODE || opmode == NULL_MODE) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (wifi_softap_dhcps_status() == DHCP_STARTED) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
dhcps_lease_time = DHCPS_LEASE_TIME_DEF;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32 ICACHE_FLASH_ATTR wifi_softap_get_dhcps_lease_time(void) // minute
|
||||||
|
{
|
||||||
|
return dhcps_lease_time;
|
||||||
|
}
|
||||||
|
|
|
@ -25,6 +25,10 @@
|
||||||
#include "lwip/app/espconn.h"
|
#include "lwip/app/espconn.h"
|
||||||
#include "user_interface.h"
|
#include "user_interface.h"
|
||||||
|
|
||||||
|
#ifdef MEMLEAK_DEBUG
|
||||||
|
static const char mem_debug_file[] ICACHE_RODATA_ATTR = __FILE__;
|
||||||
|
#endif
|
||||||
|
|
||||||
espconn_msg *plink_active = NULL;
|
espconn_msg *plink_active = NULL;
|
||||||
espconn_msg *pserver_list = NULL;
|
espconn_msg *pserver_list = NULL;
|
||||||
remot_info premot[linkMax];
|
remot_info premot[linkMax];
|
||||||
|
@ -385,6 +389,10 @@ espconn_sent(struct espconn *espconn, uint8 *psent, uint16 length)
|
||||||
if (espconn_copy_enabled(pnode)){
|
if (espconn_copy_enabled(pnode)){
|
||||||
if (espconn_tcp_get_buf_count(pnode->pcommon.pbuf) >= pnode ->pcommon.pbuf_num)
|
if (espconn_tcp_get_buf_count(pnode->pcommon.pbuf) >= pnode ->pcommon.pbuf_num)
|
||||||
return ESPCONN_MAXNUM;
|
return ESPCONN_MAXNUM;
|
||||||
|
} else {
|
||||||
|
struct tcp_pcb *pcb = pnode->pcommon.pcb;
|
||||||
|
if (pcb->snd_queuelen >= TCP_SND_QUEUELEN)
|
||||||
|
return ESPCONN_MAXNUM;
|
||||||
}
|
}
|
||||||
|
|
||||||
pbuf = (espconn_buf*) os_zalloc(sizeof(espconn_buf));
|
pbuf = (espconn_buf*) os_zalloc(sizeof(espconn_buf));
|
||||||
|
@ -405,13 +413,13 @@ espconn_sent(struct espconn *espconn, uint8 *psent, uint16 length)
|
||||||
if (espconn_copy_disabled(pnode))
|
if (espconn_copy_disabled(pnode))
|
||||||
pnode->pcommon.write_flag = false;
|
pnode->pcommon.write_flag = false;
|
||||||
error = espconn_tcp_write(pnode);
|
error = espconn_tcp_write(pnode);
|
||||||
if (error != ESPCONN_OK){
|
// if (error != ESPCONN_OK){
|
||||||
/*send the application packet fail,
|
// /*send the application packet fail,
|
||||||
* ensure that each allocated is deleted*/
|
// * ensure that each allocated is deleted*/
|
||||||
espconn_pbuf_delete(&pnode->pcommon.pbuf, pbuf);
|
// espconn_pbuf_delete(&pnode->pcommon.pbuf, pbuf);
|
||||||
os_free(pbuf);
|
// os_free(pbuf);
|
||||||
pbuf = NULL;
|
// pbuf = NULL;
|
||||||
}
|
// }
|
||||||
return error;
|
return error;
|
||||||
} else
|
} else
|
||||||
return ESPCONN_ARG;
|
return ESPCONN_ARG;
|
||||||
|
@ -428,6 +436,33 @@ espconn_sent(struct espconn *espconn, uint8 *psent, uint16 length)
|
||||||
return ESPCONN_ARG;
|
return ESPCONN_ARG;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* FunctionName : espconn_sendto
|
||||||
|
* Description : send data for UDP
|
||||||
|
* Parameters : espconn -- espconn to set for UDP
|
||||||
|
* psent -- data to send
|
||||||
|
* length -- length of data to send
|
||||||
|
* Returns : error
|
||||||
|
*******************************************************************************/
|
||||||
|
sint16 ICACHE_FLASH_ATTR
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*Find the node depend on the espconn message*/
|
||||||
|
value = espconn_find_connection(espconn, &pnode);
|
||||||
|
if (value && espconn->type == ESPCONN_UDP)
|
||||||
|
return espconn_udp_sendto(pnode, psent, length);
|
||||||
|
else
|
||||||
|
return ESPCONN_ARG;
|
||||||
|
}
|
||||||
|
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
* FunctionName : espconn_send
|
* FunctionName : espconn_send
|
||||||
* Description : sent data for client or server
|
* Description : sent data for client or server
|
||||||
|
|
|
@ -24,6 +24,10 @@
|
||||||
#include "lwip/mem.h"
|
#include "lwip/mem.h"
|
||||||
#include "lwip/app/espconn_tcp.h"
|
#include "lwip/app/espconn_tcp.h"
|
||||||
|
|
||||||
|
#ifdef MEMLEAK_DEBUG
|
||||||
|
static const char mem_debug_file[] ICACHE_RODATA_ATTR = __FILE__;
|
||||||
|
#endif
|
||||||
|
|
||||||
extern espconn_msg *plink_active;
|
extern espconn_msg *plink_active;
|
||||||
extern espconn_msg *pserver_list;
|
extern espconn_msg *pserver_list;
|
||||||
extern struct espconn_packet pktinfo[2];
|
extern struct espconn_packet pktinfo[2];
|
||||||
|
@ -71,7 +75,7 @@ espconn_kill_oldest(void)
|
||||||
inactivity = 0;
|
inactivity = 0;
|
||||||
inactive = NULL;
|
inactive = NULL;
|
||||||
for (pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) {
|
for (pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) {
|
||||||
if (pcb->state == FIN_WAIT_2){
|
if (pcb->state == FIN_WAIT_1 || pcb->state == FIN_WAIT_2){
|
||||||
if ((u32_t) (tcp_ticks - pcb->tmr) >= inactivity) {
|
if ((u32_t) (tcp_ticks - pcb->tmr) >= inactivity) {
|
||||||
inactivity = tcp_ticks - pcb->tmr;
|
inactivity = tcp_ticks - pcb->tmr;
|
||||||
inactive = pcb;
|
inactive = pcb;
|
||||||
|
@ -121,7 +125,7 @@ void ICACHE_FLASH_ATTR espconn_kill_oldest_pcb(void)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cpcb->state == FIN_WAIT_2 || cpcb->state == LAST_ACK){
|
if (cpcb->state == FIN_WAIT_1 || cpcb->state == FIN_WAIT_2 || cpcb->state == LAST_ACK){
|
||||||
num_tcp_fin++;
|
num_tcp_fin++;
|
||||||
if (num_tcp_fin == MEMP_NUM_TCP_PCB)
|
if (num_tcp_fin == MEMP_NUM_TCP_PCB)
|
||||||
break;
|
break;
|
||||||
|
@ -131,6 +135,8 @@ void ICACHE_FLASH_ATTR espconn_kill_oldest_pcb(void)
|
||||||
if (num_tcp_fin == MEMP_NUM_TCP_PCB){
|
if (num_tcp_fin == MEMP_NUM_TCP_PCB){
|
||||||
num_tcp_fin = 0;
|
num_tcp_fin = 0;
|
||||||
espconn_kill_oldest();
|
espconn_kill_oldest();
|
||||||
|
} else if (cpcb == NULL){
|
||||||
|
num_tcp_fin = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -902,6 +908,17 @@ espconn_tcp_client(struct espconn *espconn)
|
||||||
pclient->pespconn->state = ESPCONN_WAIT;
|
pclient->pespconn->state = ESPCONN_WAIT;
|
||||||
pclient->pcommon.pcb = pcb;
|
pclient->pcommon.pcb = pcb;
|
||||||
tcp_bind(pcb, IP_ADDR_ANY, pclient->pespconn->proto.tcp->local_port);
|
tcp_bind(pcb, IP_ADDR_ANY, pclient->pespconn->proto.tcp->local_port);
|
||||||
|
#if 0
|
||||||
|
pclient->pcommon.err = tcp_bind(pcb, IP_ADDR_ANY, pclient->pespconn->proto.tcp->local_port);
|
||||||
|
if (pclient->pcommon.err != ERR_OK){
|
||||||
|
/*remove the node from the client's active connection list*/
|
||||||
|
espconn_list_delete(&plink_active, pclient);
|
||||||
|
memp_free(MEMP_TCP_PCB, pcb);
|
||||||
|
os_free(pclient);
|
||||||
|
pclient = NULL;
|
||||||
|
return ERR_USE;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
/*Establish the connection*/
|
/*Establish the connection*/
|
||||||
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);
|
||||||
|
|
|
@ -22,9 +22,17 @@
|
||||||
|
|
||||||
#include "lwip/app/espconn_udp.h"
|
#include "lwip/app/espconn_udp.h"
|
||||||
|
|
||||||
//#include "net80211/ieee80211_var.h"
|
#ifdef MEMLEAK_DEBUG
|
||||||
|
static const char mem_debug_file[] ICACHE_RODATA_ATTR = __FILE__;
|
||||||
|
#endif
|
||||||
|
|
||||||
extern espconn_msg *plink_active;
|
extern espconn_msg *plink_active;
|
||||||
extern uint8 default_interface;
|
extern uint8 default_interface;
|
||||||
|
|
||||||
|
enum send_opt{
|
||||||
|
ESPCONN_SENDTO,
|
||||||
|
ESPCONN_SEND
|
||||||
|
};
|
||||||
static void ICACHE_FLASH_ATTR espconn_data_sentcb(struct espconn *pespconn)
|
static void ICACHE_FLASH_ATTR espconn_data_sentcb(struct espconn *pespconn)
|
||||||
{
|
{
|
||||||
if (pespconn == NULL) {
|
if (pespconn == NULL) {
|
||||||
|
@ -36,7 +44,7 @@ static void ICACHE_FLASH_ATTR espconn_data_sentcb(struct espconn *pespconn)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ICACHE_FLASH_ATTR espconn_data_sent(void *arg)
|
static void ICACHE_FLASH_ATTR espconn_data_sent(void *arg, enum send_opt opt)
|
||||||
{
|
{
|
||||||
espconn_msg *psent = arg;
|
espconn_msg *psent = arg;
|
||||||
|
|
||||||
|
@ -49,7 +57,11 @@ static void ICACHE_FLASH_ATTR espconn_data_sent(void *arg)
|
||||||
// sys_timeout(10, espconn_data_sentcb, psent->pespconn);
|
// sys_timeout(10, espconn_data_sentcb, psent->pespconn);
|
||||||
espconn_data_sentcb(psent->pespconn);
|
espconn_data_sentcb(psent->pespconn);
|
||||||
} else {
|
} else {
|
||||||
|
if (opt == ESPCONN_SEND){
|
||||||
espconn_udp_sent(arg, psent->pcommon.ptrbuf, psent->pcommon.cntr);
|
espconn_udp_sent(arg, psent->pcommon.ptrbuf, psent->pcommon.cntr);
|
||||||
|
} else {
|
||||||
|
espconn_udp_sendto(arg, psent->pcommon.ptrbuf, psent->pcommon.cntr);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -82,8 +94,8 @@ espconn_udp_sent(void *arg, uint8 *psent, uint16 length)
|
||||||
return ESPCONN_ARG;
|
return ESPCONN_ARG;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (TCP_MSS < length) {
|
if (1470 < length) {
|
||||||
datalen = TCP_MSS;
|
datalen = 1470;
|
||||||
} else {
|
} else {
|
||||||
datalen = length;
|
datalen = length;
|
||||||
}
|
}
|
||||||
|
@ -145,7 +157,111 @@ espconn_udp_sent(void *arg, uint8 *psent, uint16 length)
|
||||||
pbuf_free(p);
|
pbuf_free(p);
|
||||||
pudp_sent->pcommon.ptrbuf = psent + datalen;
|
pudp_sent->pcommon.ptrbuf = psent + datalen;
|
||||||
pudp_sent->pcommon.cntr = length - datalen;
|
pudp_sent->pcommon.cntr = length - datalen;
|
||||||
espconn_data_sent(pudp_sent);
|
espconn_data_sent(pudp_sent, ESPCONN_SEND);
|
||||||
|
if (err > 0)
|
||||||
|
return ESPCONN_IF;
|
||||||
|
return err;
|
||||||
|
} else {
|
||||||
|
pbuf_free(p);
|
||||||
|
return ESPCONN_RTE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* FunctionName : espconn_udp_sendto
|
||||||
|
* Description : sent data for UDP
|
||||||
|
* Parameters : void *arg -- UDP to send
|
||||||
|
* uint8* psent -- Data to send
|
||||||
|
* uint16 length -- Length of data to send
|
||||||
|
* Returns : return espconn error code.
|
||||||
|
* - ESPCONN_OK. Successful. No error occured.
|
||||||
|
* - ESPCONN_MEM. Out of memory.
|
||||||
|
* - ESPCONN_RTE. Could not find route to destination address.
|
||||||
|
* - More errors could be returned by lower protocol layers.
|
||||||
|
*******************************************************************************/
|
||||||
|
err_t ICACHE_FLASH_ATTR
|
||||||
|
espconn_udp_sendto(void *arg, uint8 *psent, uint16 length)
|
||||||
|
{
|
||||||
|
espconn_msg *pudp_sent = arg;
|
||||||
|
struct udp_pcb *upcb = pudp_sent->pcommon.pcb;
|
||||||
|
struct espconn *pespconn = pudp_sent->pespconn;
|
||||||
|
struct pbuf *p, *q ,*p_temp;
|
||||||
|
struct ip_addr dst_ip;
|
||||||
|
u16_t dst_port;
|
||||||
|
u8_t *data = NULL;
|
||||||
|
u16_t cnt = 0;
|
||||||
|
u16_t datalen = 0;
|
||||||
|
u16_t i = 0;
|
||||||
|
err_t err;
|
||||||
|
LWIP_DEBUGF(ESPCONN_UDP_DEBUG, ("espconn_udp_sent %d %d %p\n", __LINE__, length, upcb));
|
||||||
|
|
||||||
|
if (pudp_sent == NULL || upcb == NULL || psent == NULL || length == 0) {
|
||||||
|
return ESPCONN_ARG;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (1470 < length) {
|
||||||
|
datalen = 1470;
|
||||||
|
} else {
|
||||||
|
datalen = length;
|
||||||
|
}
|
||||||
|
|
||||||
|
p = pbuf_alloc(PBUF_TRANSPORT, datalen, PBUF_RAM);
|
||||||
|
LWIP_DEBUGF(ESPCONN_UDP_DEBUG, ("espconn_udp_sent %d %p\n", __LINE__, p));
|
||||||
|
|
||||||
|
if (p != NULL) {
|
||||||
|
q = p;
|
||||||
|
|
||||||
|
while (q != NULL) {
|
||||||
|
data = (u8_t *)q->payload;
|
||||||
|
LWIP_DEBUGF(ESPCONN_UDP_DEBUG, ("espconn_udp_sent %d %p\n", __LINE__, data));
|
||||||
|
|
||||||
|
for (i = 0; i < q->len; i++) {
|
||||||
|
data[i] = ((u8_t *) psent)[cnt++];
|
||||||
|
}
|
||||||
|
|
||||||
|
q = q->next;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return ESPCONN_MEM;
|
||||||
|
}
|
||||||
|
|
||||||
|
dst_port = pespconn->proto.udp->remote_port;
|
||||||
|
IP4_ADDR(&dst_ip, pespconn->proto.udp->remote_ip[0],
|
||||||
|
pespconn->proto.udp->remote_ip[1], pespconn->proto.udp->remote_ip[2],
|
||||||
|
pespconn->proto.udp->remote_ip[3]);
|
||||||
|
LWIP_DEBUGF(ESPCONN_UDP_DEBUG, ("espconn_udp_sent %d %x %d\n", __LINE__, upcb->remote_ip, upcb->remote_port));
|
||||||
|
|
||||||
|
struct netif *sta_netif = (struct netif *)eagle_lwip_getif(0x00);
|
||||||
|
struct netif *ap_netif = (struct netif *)eagle_lwip_getif(0x01);
|
||||||
|
|
||||||
|
if(wifi_get_opmode() == ESPCONN_AP_STA && default_interface == ESPCONN_AP_STA && sta_netif != NULL && ap_netif != NULL)
|
||||||
|
{
|
||||||
|
if(netif_is_up(sta_netif) && netif_is_up(ap_netif) && \
|
||||||
|
ip_addr_isbroadcast(&upcb->remote_ip, sta_netif) && \
|
||||||
|
ip_addr_isbroadcast(&upcb->remote_ip, ap_netif)) {
|
||||||
|
|
||||||
|
p_temp = pbuf_alloc(PBUF_TRANSPORT, datalen, PBUF_RAM);
|
||||||
|
if (pbuf_copy (p_temp,p) != ERR_OK) {
|
||||||
|
LWIP_DEBUGF(ESPCONN_UDP_DEBUG, ("espconn_udp_sendto: copying to new pbuf failed\n"));
|
||||||
|
return ESPCONN_ARG;
|
||||||
|
}
|
||||||
|
netif_set_default(sta_netif);
|
||||||
|
err = udp_sendto(upcb, p_temp, &dst_ip, dst_port);
|
||||||
|
pbuf_free(p_temp);
|
||||||
|
netif_set_default(ap_netif);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
err = udp_sendto(upcb, p, &dst_ip, dst_port);
|
||||||
|
|
||||||
|
if (p->ref != 0) {
|
||||||
|
pbuf_free(p);
|
||||||
|
pudp_sent->pcommon.ptrbuf = psent + datalen;
|
||||||
|
pudp_sent->pcommon.cntr = length - datalen;
|
||||||
|
if (err == ERR_OK)
|
||||||
|
espconn_data_sent(pudp_sent, ESPCONN_SENDTO);
|
||||||
|
|
||||||
|
if (err > 0)
|
||||||
|
return ESPCONN_IF;
|
||||||
return err;
|
return err;
|
||||||
} else {
|
} else {
|
||||||
pbuf_free(p);
|
pbuf_free(p);
|
||||||
|
@ -175,15 +291,10 @@ espconn_udp_recv(void *arg, struct udp_pcb *upcb, struct pbuf *p,
|
||||||
|
|
||||||
LWIP_DEBUGF(ESPCONN_UDP_DEBUG, ("espconn_udp_server_recv %d %p\n", __LINE__, upcb));
|
LWIP_DEBUGF(ESPCONN_UDP_DEBUG, ("espconn_udp_server_recv %d %p\n", __LINE__, upcb));
|
||||||
|
|
||||||
upcb->remote_port = port;
|
precv->pcommon.remote_ip[0] = ip4_addr1_16(addr);
|
||||||
upcb->remote_ip = *addr;
|
precv->pcommon.remote_ip[1] = ip4_addr2_16(addr);
|
||||||
|
precv->pcommon.remote_ip[2] = ip4_addr3_16(addr);
|
||||||
precv->pcommon.remote_ip[0] = ip4_addr1_16(&upcb->remote_ip);
|
precv->pcommon.remote_ip[3] = ip4_addr4_16(addr);
|
||||||
precv->pcommon.remote_ip[1] = ip4_addr2_16(&upcb->remote_ip);
|
|
||||||
precv->pcommon.remote_ip[2] = ip4_addr3_16(&upcb->remote_ip);
|
|
||||||
precv->pcommon.remote_ip[3] = ip4_addr4_16(&upcb->remote_ip);
|
|
||||||
os_memcpy(precv->pespconn->proto.udp->remote_ip, precv->pcommon.remote_ip, 4);
|
|
||||||
precv->pespconn->proto.udp->remote_port = port;
|
|
||||||
precv->pcommon.remote_port = port;
|
precv->pcommon.remote_port = port;
|
||||||
precv->pcommon.pcb = upcb;
|
precv->pcommon.pcb = upcb;
|
||||||
|
|
||||||
|
@ -196,31 +307,13 @@ espconn_udp_recv(void *arg, struct udp_pcb *upcb, struct pbuf *p,
|
||||||
} else {
|
} else {
|
||||||
wifi_get_ip_info(0, &ipconfig);
|
wifi_get_ip_info(0, &ipconfig);
|
||||||
}
|
}
|
||||||
// upcb->local_ip = ipconfig.ip;
|
|
||||||
precv->pespconn->proto.udp->local_ip[0] = ip4_addr1_16(&ipconfig.ip);
|
precv->pespconn->proto.udp->local_ip[0] = ip4_addr1_16(&ipconfig.ip);
|
||||||
precv->pespconn->proto.udp->local_ip[1] = ip4_addr2_16(&ipconfig.ip);
|
precv->pespconn->proto.udp->local_ip[1] = ip4_addr2_16(&ipconfig.ip);
|
||||||
precv->pespconn->proto.udp->local_ip[2] = ip4_addr3_16(&ipconfig.ip);
|
precv->pespconn->proto.udp->local_ip[2] = ip4_addr3_16(&ipconfig.ip);
|
||||||
precv->pespconn->proto.udp->local_ip[3] = ip4_addr4_16(&ipconfig.ip);
|
precv->pespconn->proto.udp->local_ip[3] = ip4_addr4_16(&ipconfig.ip);
|
||||||
|
|
||||||
if (p != NULL) {
|
if (p != NULL) {
|
||||||
// q = p;
|
|
||||||
|
|
||||||
// while (q != NULL) {
|
|
||||||
// pdata = (u8_t *)os_zalloc(q ->len + 1);
|
|
||||||
// length = pbuf_copy_partial(q, pdata, q ->len, 0);
|
|
||||||
//
|
|
||||||
// LWIP_DEBUGF(ESPCONN_UDP_DEBUG, ("espconn_udp_server_recv %d %x\n", __LINE__, length));
|
|
||||||
// precv->pcommon.pcb = upcb;
|
|
||||||
//
|
|
||||||
// if (length != 0) {
|
|
||||||
// if (precv->pespconn->recv_callback != NULL) {
|
|
||||||
// precv->pespconn->recv_callback(precv->pespconn, pdata, length);
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// q = q->next;
|
|
||||||
// os_free(pdata);
|
|
||||||
// }
|
|
||||||
pdata = (u8_t *)os_zalloc(p ->tot_len + 1);
|
pdata = (u8_t *)os_zalloc(p ->tot_len + 1);
|
||||||
length = pbuf_copy_partial(p, pdata, p ->tot_len, 0);
|
length = pbuf_copy_partial(p, pdata, p ->tot_len, 0);
|
||||||
precv->pcommon.pcb = upcb;
|
precv->pcommon.pcb = upcb;
|
||||||
|
|
|
@ -35,6 +35,10 @@
|
||||||
#if LWIP_TCP
|
#if LWIP_TCP
|
||||||
#include "lwip/tcp.h"
|
#include "lwip/tcp.h"
|
||||||
|
|
||||||
|
#ifdef MEMLEAK_DEBUG
|
||||||
|
static const char mem_debug_file[] ICACHE_RODATA_ATTR = __FILE__;
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This implements a netio server.
|
* This implements a netio server.
|
||||||
* The client sends a command word (4 bytes) then a data length word (4 bytes).
|
* The client sends a command word (4 bytes) then a data length word (4 bytes).
|
||||||
|
@ -321,7 +325,7 @@ netio_accept(void *arg, struct tcp_pcb *pcb, err_t err)
|
||||||
|
|
||||||
LWIP_UNUSED_ARG(err);
|
LWIP_UNUSED_ARG(err);
|
||||||
|
|
||||||
ns = mem_malloc(sizeof(struct netio_state));
|
ns = (struct netio_state *)mem_malloc(sizeof(struct netio_state));
|
||||||
|
|
||||||
if(ns == NULL){
|
if(ns == NULL){
|
||||||
return ERR_MEM;
|
return ERR_MEM;
|
||||||
|
@ -335,7 +339,7 @@ netio_accept(void *arg, struct tcp_pcb *pcb, err_t err)
|
||||||
#if NETIO_USE_STATIC_BUF == 1
|
#if NETIO_USE_STATIC_BUF == 1
|
||||||
ns->buf_ptr = netio_buf;
|
ns->buf_ptr = netio_buf;
|
||||||
#else
|
#else
|
||||||
ns->buf_ptr = mem_malloc(NETIO_BUF_SIZE);
|
ns->buf_ptr = (u8_t *)mem_malloc(NETIO_BUF_SIZE);
|
||||||
|
|
||||||
if(ns->buf_ptr == NULL){
|
if(ns->buf_ptr == NULL){
|
||||||
mem_free(ns);
|
mem_free(ns);
|
||||||
|
|
|
@ -63,6 +63,10 @@
|
||||||
#include "lwip/inet.h"
|
#include "lwip/inet.h"
|
||||||
#endif /* PING_USE_SOCKETS */
|
#endif /* PING_USE_SOCKETS */
|
||||||
|
|
||||||
|
#ifdef MEMLEAK_DEBUG
|
||||||
|
static const char mem_debug_file[] ICACHE_RODATA_ATTR = __FILE__;
|
||||||
|
#endif
|
||||||
|
|
||||||
/* ping variables */
|
/* ping variables */
|
||||||
static u16_t ping_seq_num = 0;
|
static u16_t ping_seq_num = 0;
|
||||||
static u32_t ping_time;
|
static u32_t ping_time;
|
||||||
|
|
|
@ -84,6 +84,10 @@
|
||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
|
#ifdef MEMLEAK_DEBUG
|
||||||
|
static const char mem_debug_file[] ICACHE_RODATA_ATTR = __FILE__;
|
||||||
|
#endif
|
||||||
|
|
||||||
/** Default for DHCP_GLOBAL_XID is 0xABCD0000
|
/** Default for DHCP_GLOBAL_XID is 0xABCD0000
|
||||||
* This can be changed by defining DHCP_GLOBAL_XID and DHCP_GLOBAL_XID_HEADER, e.g.
|
* This can be changed by defining DHCP_GLOBAL_XID and DHCP_GLOBAL_XID_HEADER, e.g.
|
||||||
* #define DHCP_GLOBAL_XID_HEADER "stdlib.h"
|
* #define DHCP_GLOBAL_XID_HEADER "stdlib.h"
|
||||||
|
@ -377,6 +381,15 @@ dhcp_fine_tmr()
|
||||||
while (netif != NULL) {
|
while (netif != NULL) {
|
||||||
/* only act on DHCP configured interfaces */
|
/* only act on DHCP configured interfaces */
|
||||||
if (netif->dhcp != NULL) {
|
if (netif->dhcp != NULL) {
|
||||||
|
/*add DHCP retries processing by LiuHan*/
|
||||||
|
if (DHCP_MAXRTX != 0) {
|
||||||
|
if (netif->dhcp->tries >= DHCP_MAXRTX){
|
||||||
|
os_printf("DHCP timeout\n");
|
||||||
|
if (netif->dhcp_event != NULL)
|
||||||
|
netif->dhcp_event();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
/* timer is active (non zero), and is about to trigger now */
|
/* timer is active (non zero), and is about to trigger now */
|
||||||
if (netif->dhcp->request_timeout > 1) {
|
if (netif->dhcp->request_timeout > 1) {
|
||||||
netif->dhcp->request_timeout--;
|
netif->dhcp->request_timeout--;
|
||||||
|
@ -392,6 +405,7 @@ dhcp_fine_tmr()
|
||||||
/* proceed to next network interface */
|
/* proceed to next network interface */
|
||||||
netif = netif->next;
|
netif = netif->next;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -83,6 +83,10 @@
|
||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
|
#ifdef MEMLEAK_DEBUG
|
||||||
|
static const char mem_debug_file[] ICACHE_RODATA_ATTR = __FILE__;
|
||||||
|
#endif
|
||||||
|
|
||||||
/** DNS server IP address */
|
/** DNS server IP address */
|
||||||
#ifndef DNS_SERVER_ADDRESS
|
#ifndef DNS_SERVER_ADDRESS
|
||||||
#define DNS_SERVER_ADDRESS(ipaddr) (ip4_addr_set_u32(ipaddr, 0xDEDE43D0)) /* resolver1.opendns.com(208.67.222.222) */
|
#define DNS_SERVER_ADDRESS(ipaddr) (ip4_addr_set_u32(ipaddr, 0xDEDE43D0)) /* resolver1.opendns.com(208.67.222.222) */
|
||||||
|
|
|
@ -261,7 +261,7 @@ lwip_init(void)
|
||||||
{
|
{
|
||||||
MEMP_NUM_TCP_PCB = 5;
|
MEMP_NUM_TCP_PCB = 5;
|
||||||
TCP_WND = (4 * TCP_MSS);
|
TCP_WND = (4 * TCP_MSS);
|
||||||
TCP_MAXRTX = 3;
|
TCP_MAXRTX = 12;
|
||||||
TCP_SYNMAXRTX = 6;
|
TCP_SYNMAXRTX = 6;
|
||||||
|
|
||||||
/* Sanity check user-configurable values */
|
/* Sanity check user-configurable values */
|
||||||
|
|
|
@ -95,6 +95,10 @@ Steve Reynolds
|
||||||
|
|
||||||
#include "string.h"
|
#include "string.h"
|
||||||
|
|
||||||
|
#ifdef MEMLEAK_DEBUG
|
||||||
|
static const char mem_debug_file[] ICACHE_RODATA_ATTR = __FILE__;
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* IGMP constants
|
* IGMP constants
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -49,6 +49,11 @@
|
||||||
#include "osapi.h"
|
#include "osapi.h"
|
||||||
#include "os_type.h"
|
#include "os_type.h"
|
||||||
#include "user_interface.h"
|
#include "user_interface.h"
|
||||||
|
|
||||||
|
#ifdef MEMLEAK_DEBUG
|
||||||
|
static const char mem_debug_file[] ICACHE_RODATA_ATTR = __FILE__;
|
||||||
|
#endif
|
||||||
|
|
||||||
/** DNS server IP address */
|
/** DNS server IP address */
|
||||||
#ifndef DNS_MULTICAST_ADDRESS
|
#ifndef DNS_MULTICAST_ADDRESS
|
||||||
#define DNS_MULTICAST_ADDRESS ipaddr_addr("224.0.0.251") /* resolver1.opendns.com */
|
#define DNS_MULTICAST_ADDRESS ipaddr_addr("224.0.0.251") /* resolver1.opendns.com */
|
||||||
|
@ -971,11 +976,21 @@ mdns_get_servername(void) {
|
||||||
|
|
||||||
void ICACHE_FLASH_ATTR
|
void ICACHE_FLASH_ATTR
|
||||||
mdns_server_unregister(void) {
|
mdns_server_unregister(void) {
|
||||||
|
struct ip_addr ap_host_addr;
|
||||||
|
struct ip_info ipconfig;
|
||||||
if(register_flag == 1){
|
if(register_flag == 1){
|
||||||
if (igmp_leavegroup(&host_addr, &multicast_addr) != ERR_OK) {
|
if (igmp_leavegroup(&host_addr, &multicast_addr) != ERR_OK) {
|
||||||
os_printf("udp_leave_multigrup failed!\n");
|
os_printf("sta udp_leave_multigrup failed!\n");
|
||||||
return;
|
return;
|
||||||
};
|
};
|
||||||
|
if(wifi_get_opmode() == 0x03 || wifi_get_opmode() == 0x02) {
|
||||||
|
wifi_get_ip_info(SOFTAP_IF, &ipconfig);
|
||||||
|
ap_host_addr.addr = ipconfig.ip.addr;
|
||||||
|
if (igmp_leavegroup(&ap_host_addr, &multicast_addr) != ERR_OK) {
|
||||||
|
os_printf("ap udp_join_multigrup failed!\n");
|
||||||
|
return;
|
||||||
|
};
|
||||||
|
}
|
||||||
register_flag = 0;
|
register_flag = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1013,6 +1028,8 @@ void ICACHE_FLASH_ATTR
|
||||||
mdns_init(struct mdns_info *info) {
|
mdns_init(struct mdns_info *info) {
|
||||||
/* initialize default DNS server address */
|
/* initialize default DNS server address */
|
||||||
multicast_addr.addr = DNS_MULTICAST_ADDRESS;
|
multicast_addr.addr = DNS_MULTICAST_ADDRESS;
|
||||||
|
struct ip_addr ap_host_addr;
|
||||||
|
struct ip_info ipconfig;
|
||||||
if (info->ipAddr == 0) {
|
if (info->ipAddr == 0) {
|
||||||
os_printf("mdns ip error!\n ");
|
os_printf("mdns ip error!\n ");
|
||||||
return;
|
return;
|
||||||
|
@ -1040,10 +1057,20 @@ mdns_init(struct mdns_info *info) {
|
||||||
|
|
||||||
if (mdns_pcb != NULL) {
|
if (mdns_pcb != NULL) {
|
||||||
/* join to the multicast address 224.0.0.251 */
|
/* join to the multicast address 224.0.0.251 */
|
||||||
|
if(wifi_get_opmode() == 0x03 || wifi_get_opmode() == 0x01) {
|
||||||
if (igmp_joingroup(&host_addr, &multicast_addr) != ERR_OK) {
|
if (igmp_joingroup(&host_addr, &multicast_addr) != ERR_OK) {
|
||||||
os_printf("udp_join_multigrup failed!\n");
|
os_printf("sta udp_join_multigrup failed!\n");
|
||||||
return;
|
return;
|
||||||
};
|
};
|
||||||
|
}
|
||||||
|
if(wifi_get_opmode() == 0x03 || wifi_get_opmode() == 0x02) {
|
||||||
|
wifi_get_ip_info(SOFTAP_IF, &ipconfig);
|
||||||
|
ap_host_addr.addr = ipconfig.ip.addr;
|
||||||
|
if (igmp_joingroup(&ap_host_addr, &multicast_addr) != ERR_OK) {
|
||||||
|
os_printf("ap udp_join_multigrup failed!\n");
|
||||||
|
return;
|
||||||
|
};
|
||||||
|
}
|
||||||
register_flag = 1;
|
register_flag = 1;
|
||||||
/* join to any IP address at the port 5353 */
|
/* join to any IP address at the port 5353 */
|
||||||
if (udp_bind(mdns_pcb, IP_ADDR_ANY, DNS_MDNS_PORT) != ERR_OK) {
|
if (udp_bind(mdns_pcb, IP_ADDR_ANY, DNS_MDNS_PORT) != ERR_OK) {
|
||||||
|
|
|
@ -79,6 +79,10 @@
|
||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
|
#ifdef MEMLEAK_DEBUG
|
||||||
|
static const char mem_debug_file[] ICACHE_RODATA_ATTR = __FILE__;
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef EBUF_LWIP
|
#ifdef EBUF_LWIP
|
||||||
#define EP_OFFSET 36
|
#define EP_OFFSET 36
|
||||||
#else
|
#else
|
||||||
|
@ -90,6 +94,45 @@
|
||||||
aligned there. Therefore, PBUF_POOL_BUFSIZE_ALIGNED can be used here. */
|
aligned there. Therefore, PBUF_POOL_BUFSIZE_ALIGNED can be used here. */
|
||||||
#define PBUF_POOL_BUFSIZE_ALIGNED LWIP_MEM_ALIGN_SIZE(PBUF_POOL_BUFSIZE)
|
#define PBUF_POOL_BUFSIZE_ALIGNED LWIP_MEM_ALIGN_SIZE(PBUF_POOL_BUFSIZE)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Attempt to reclaim some memory from queued out-of-sequence TCP segments
|
||||||
|
* if we run out of pool pbufs. It's better to give priority to new packets
|
||||||
|
* if we're running out.
|
||||||
|
*/
|
||||||
|
#if TCP_QUEUE_OOSEQ
|
||||||
|
void ICACHE_FLASH_ATTR
|
||||||
|
pbuf_free_ooseq_new(void* arg)
|
||||||
|
{
|
||||||
|
struct tcp_pcb* pcb;
|
||||||
|
struct tcp_seg *head = NULL;
|
||||||
|
struct tcp_seg *seg1 = NULL;
|
||||||
|
struct tcp_seg *seg2 = NULL;
|
||||||
|
for (pcb = tcp_active_pcbs; NULL != pcb; pcb = pcb->next) {
|
||||||
|
head = pcb->ooseq;
|
||||||
|
seg1 = head;
|
||||||
|
if (head != NULL) {
|
||||||
|
if (seg1->next == NULL){
|
||||||
|
head = head->next;
|
||||||
|
tcp_seg_free(seg1);
|
||||||
|
pcb->ooseq = head;
|
||||||
|
} else {
|
||||||
|
while (seg1 != NULL){
|
||||||
|
seg2 = seg1;
|
||||||
|
seg2 = seg2->next;
|
||||||
|
if (seg2 ->next == NULL){
|
||||||
|
seg1->next = seg2->next;
|
||||||
|
tcp_seg_free(seg2);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
seg1 = seg1->next;
|
||||||
|
}
|
||||||
|
pcb->ooseq = head;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#if !LWIP_TCP || !TCP_QUEUE_OOSEQ || NO_SYS
|
#if !LWIP_TCP || !TCP_QUEUE_OOSEQ || NO_SYS
|
||||||
#define PBUF_POOL_IS_EMPTY()
|
#define PBUF_POOL_IS_EMPTY()
|
||||||
#else /* !LWIP_TCP || !TCP_QUEUE_OOSEQ || NO_SYS */
|
#else /* !LWIP_TCP || !TCP_QUEUE_OOSEQ || NO_SYS */
|
||||||
|
|
|
@ -52,6 +52,10 @@
|
||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
|
#ifdef MEMLEAK_DEBUG
|
||||||
|
static const char mem_debug_file[] ICACHE_RODATA_ATTR = __FILE__;
|
||||||
|
#endif
|
||||||
|
|
||||||
/** The list of RAW PCBs */
|
/** The list of RAW PCBs */
|
||||||
static struct raw_pcb *raw_pcbs;
|
static struct raw_pcb *raw_pcbs;
|
||||||
|
|
||||||
|
|
|
@ -55,6 +55,10 @@
|
||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
|
#ifdef MEMLEAK_DEBUG
|
||||||
|
static const char mem_debug_file[] ICACHE_RODATA_ATTR = __FILE__;
|
||||||
|
#endif
|
||||||
|
|
||||||
#if TCP_DEBUG
|
#if TCP_DEBUG
|
||||||
const char tcp_state_str_rodata[][12] ICACHE_RODATA_ATTR = {
|
const char tcp_state_str_rodata[][12] ICACHE_RODATA_ATTR = {
|
||||||
"CLOSED",
|
"CLOSED",
|
||||||
|
|
|
@ -56,6 +56,10 @@
|
||||||
#include "lwip/snmp.h"
|
#include "lwip/snmp.h"
|
||||||
#include "arch/perf.h"
|
#include "arch/perf.h"
|
||||||
|
|
||||||
|
#ifdef MEMLEAK_DEBUG
|
||||||
|
static const char mem_debug_file[] ICACHE_RODATA_ATTR = __FILE__;
|
||||||
|
#endif
|
||||||
|
|
||||||
/* These variables are global to all functions involved in the input
|
/* These variables are global to all functions involved in the input
|
||||||
processing of TCP segments. They are set by the tcp_input()
|
processing of TCP segments. They are set by the tcp_input()
|
||||||
function. */
|
function. */
|
||||||
|
@ -436,6 +440,16 @@ aborted:
|
||||||
pbuf_free(inseg.p);//<2F>ͷ<EFBFBD>buffer
|
pbuf_free(inseg.p);//<2F>ͷ<EFBFBD>buffer
|
||||||
inseg.p = NULL;
|
inseg.p = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*add processing queue segments that arrive out of order by LiuHan*/
|
||||||
|
#if TCP_QUEUE_OOSEQ
|
||||||
|
extern char RxNodeNum(void);
|
||||||
|
if (RxNodeNum() < 2){
|
||||||
|
extern void pbuf_free_ooseq_new(void* arg);
|
||||||
|
// os_printf("reclaim some memory from queued\n");
|
||||||
|
pbuf_free_ooseq_new(NULL);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
/* If no matching PCB was found, send a TCP RST (reset) to the
|
/* If no matching PCB was found, send a TCP RST (reset) to the
|
||||||
|
|
|
@ -52,9 +52,14 @@
|
||||||
#include "lwip/inet_chksum.h"
|
#include "lwip/inet_chksum.h"
|
||||||
#include "lwip/stats.h"
|
#include "lwip/stats.h"
|
||||||
#include "lwip/snmp.h"
|
#include "lwip/snmp.h"
|
||||||
|
#include "netif/etharp.h"
|
||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
|
#ifdef MEMLEAK_DEBUG
|
||||||
|
static const char mem_debug_file[] ICACHE_RODATA_ATTR = __FILE__;
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Define some copy-macros for checksum-on-copy so that the code looks
|
/* Define some copy-macros for checksum-on-copy so that the code looks
|
||||||
nicer by preventing too many ifdef's. */
|
nicer by preventing too many ifdef's. */
|
||||||
#if TCP_CHECKSUM_ON_COPY
|
#if TCP_CHECKSUM_ON_COPY
|
||||||
|
@ -226,16 +231,7 @@ tcp_pbuf_prealloc(pbuf_layer layer, u16_t length, u16_t max_length,
|
||||||
LWIP_UNUSED_ARG(apiflags);
|
LWIP_UNUSED_ARG(apiflags);
|
||||||
LWIP_UNUSED_ARG(first_seg);
|
LWIP_UNUSED_ARG(first_seg);
|
||||||
/* always create MSS-sized pbufs */
|
/* always create MSS-sized pbufs */
|
||||||
#ifdef ESP_MESH_SUPPORT
|
|
||||||
if (espconn_mesh_is_on()) {
|
|
||||||
if (alloc > TCP_MSS)
|
|
||||||
alloc = TCP_MSS;
|
alloc = TCP_MSS;
|
||||||
} else {
|
|
||||||
alloc = TCP_MSS;
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
alloc = TCP_MSS;
|
|
||||||
#endif
|
|
||||||
#else /* LWIP_NETIF_TX_SINGLE_PBUF */
|
#else /* LWIP_NETIF_TX_SINGLE_PBUF */
|
||||||
if (length < max_length) {
|
if (length < max_length) {
|
||||||
/* Should we allocate an oversized pbuf, or just the minimum
|
/* Should we allocate an oversized pbuf, or just the minimum
|
||||||
|
@ -1451,6 +1447,7 @@ tcp_zero_window_probe(struct tcp_pcb *pcb)
|
||||||
struct pbuf *p;
|
struct pbuf *p;
|
||||||
struct tcp_hdr *tcphdr;
|
struct tcp_hdr *tcphdr;
|
||||||
struct tcp_seg *seg;
|
struct tcp_seg *seg;
|
||||||
|
u16_t offset = 0;
|
||||||
u16_t len;
|
u16_t len;
|
||||||
u8_t is_fin;
|
u8_t is_fin;
|
||||||
|
|
||||||
|
@ -1469,6 +1466,11 @@ tcp_zero_window_probe(struct tcp_pcb *pcb)
|
||||||
|
|
||||||
if(seg == NULL) {
|
if(seg == NULL) {
|
||||||
seg = pcb->unsent;
|
seg = pcb->unsent;
|
||||||
|
} else {
|
||||||
|
struct ip_hdr *iphdr = NULL;
|
||||||
|
iphdr = (struct ip_hdr *)((char*)seg->p->payload + SIZEOF_ETH_HDR);
|
||||||
|
offset = IPH_HL(iphdr)*4;
|
||||||
|
offset += SIZEOF_ETH_HDR;
|
||||||
}
|
}
|
||||||
if(seg == NULL) {
|
if(seg == NULL) {
|
||||||
return;
|
return;
|
||||||
|
@ -1492,7 +1494,12 @@ tcp_zero_window_probe(struct tcp_pcb *pcb)
|
||||||
/* Data segment, copy in one byte from the head of the unacked queue */
|
/* Data segment, copy in one byte from the head of the unacked queue */
|
||||||
struct tcp_hdr *thdr = (struct tcp_hdr *)seg->p->payload;
|
struct tcp_hdr *thdr = (struct tcp_hdr *)seg->p->payload;
|
||||||
char *d = ((char *)p->payload + TCP_HLEN);
|
char *d = ((char *)p->payload + TCP_HLEN);
|
||||||
|
if (pcb->unacked == NULL)
|
||||||
pbuf_copy_partial(seg->p, d, 1, TCPH_HDRLEN(thdr) * 4);
|
pbuf_copy_partial(seg->p, d, 1, TCPH_HDRLEN(thdr) * 4);
|
||||||
|
else {
|
||||||
|
thdr = (struct tcp_hdr *)((char*)seg->p->payload + offset);
|
||||||
|
pbuf_copy_partial(seg->p, d, 1, TCPH_HDRLEN(thdr) * 4 + offset);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#if CHECKSUM_GEN_TCP
|
#if CHECKSUM_GEN_TCP
|
||||||
|
|
|
@ -57,6 +57,9 @@
|
||||||
#include "lwip/igmp.h"
|
#include "lwip/igmp.h"
|
||||||
#include "lwip/dns.h"
|
#include "lwip/dns.h"
|
||||||
|
|
||||||
|
#ifdef MEMLEAK_DEBUG
|
||||||
|
static const char mem_debug_file[] ICACHE_RODATA_ATTR = __FILE__;
|
||||||
|
#endif
|
||||||
|
|
||||||
/** The one and only timeout list */
|
/** The one and only timeout list */
|
||||||
static struct sys_timeo *next_timeout = NULL;
|
static struct sys_timeo *next_timeout = NULL;
|
||||||
|
@ -245,6 +248,7 @@ void sys_timeouts_init(void)
|
||||||
sys_timeout(ARP_TMR_INTERVAL, arp_timer, NULL);
|
sys_timeout(ARP_TMR_INTERVAL, arp_timer, NULL);
|
||||||
#endif /* LWIP_ARP */
|
#endif /* LWIP_ARP */
|
||||||
#if LWIP_DHCP
|
#if LWIP_DHCP
|
||||||
|
DHCP_MAXRTX = 0;
|
||||||
sys_timeout(DHCP_COARSE_TIMER_MSECS, dhcp_timer_coarse, NULL);
|
sys_timeout(DHCP_COARSE_TIMER_MSECS, dhcp_timer_coarse, NULL);
|
||||||
sys_timeout(DHCP_FINE_TIMER_MSECS, dhcp_timer_fine, NULL);
|
sys_timeout(DHCP_FINE_TIMER_MSECS, dhcp_timer_fine, NULL);
|
||||||
#endif /* LWIP_DHCP */
|
#endif /* LWIP_DHCP */
|
||||||
|
@ -259,8 +263,8 @@ void sys_timeouts_init(void)
|
||||||
#endif /* LWIP_DNS */
|
#endif /* LWIP_DNS */
|
||||||
|
|
||||||
#if LWIP_TCP
|
#if LWIP_TCP
|
||||||
//sys_timeout(TCP_TMR_INTERVAL, tcpip_tcp_timer, NULL);
|
sys_timeout(TCP_TMR_INTERVAL, tcpip_tcp_timer, NULL);
|
||||||
sys_timeout(TCP_TMR_INTERVAL, tcp_timer_coarse, NULL);
|
// sys_timeout(TCP_TMR_INTERVAL, tcp_timer_coarse, NULL);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if NO_SYS
|
#if NO_SYS
|
||||||
|
|
|
@ -64,6 +64,10 @@
|
||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
|
#ifdef MEMLEAK_DEBUG
|
||||||
|
static const char mem_debug_file[] ICACHE_RODATA_ATTR = __FILE__;
|
||||||
|
#endif
|
||||||
|
|
||||||
/* The list of UDP PCBs */
|
/* The list of UDP PCBs */
|
||||||
/* exported in udp.h (was static) */
|
/* exported in udp.h (was static) */
|
||||||
struct udp_pcb *udp_pcbs;
|
struct udp_pcb *udp_pcbs;
|
||||||
|
|
|
@ -62,6 +62,10 @@
|
||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
|
#ifdef MEMLEAK_DEBUG
|
||||||
|
static const char mem_debug_file[] ICACHE_RODATA_ATTR = __FILE__;
|
||||||
|
#endif
|
||||||
|
|
||||||
const struct eth_addr ethbroadcast = {{0xff,0xff,0xff,0xff,0xff,0xff}};
|
const struct eth_addr ethbroadcast = {{0xff,0xff,0xff,0xff,0xff,0xff}};
|
||||||
const struct eth_addr ethzero = {{0,0,0,0,0,0}};
|
const struct eth_addr ethzero = {{0,0,0,0,0,0}};
|
||||||
|
|
||||||
|
|
|
@ -275,6 +275,7 @@ struct station_info {
|
||||||
};
|
};
|
||||||
|
|
||||||
struct dhcps_lease {
|
struct dhcps_lease {
|
||||||
|
bool enable;
|
||||||
struct ip_addr start_ip;
|
struct ip_addr start_ip;
|
||||||
struct ip_addr end_ip;
|
struct ip_addr end_ip;
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue