Commit c674d191 authored by Johny Mattsson's avatar Johny Mattsson
Browse files

Upgraded open-source LWIP.

From Espressif's lwip_open_src_template_proj_for_v1.3.0.zip
parent c1cd58e0
...@@ -17,6 +17,10 @@ ...@@ -17,6 +17,10 @@
#define UART0 0 #define UART0 0
#define UART1 1 #define UART1 1
#ifndef FUNC_U0RXD
#define FUNC_U0RXD 0
#endif
// UartDev is defined and initialized in rom code. // UartDev is defined and initialized in rom code.
extern UartDevice UartDev; extern UartDevice UartDev;
......
#ifndef __DHCPS_H__ #ifndef __DHCPS_H__
#define __DHCPS_H__ #define __DHCPS_H__
#define USE_DNS
typedef struct dhcps_state{ typedef struct dhcps_state{
sint16_t state; sint16_t state;
} dhcps_state; } dhcps_state;
...@@ -22,8 +24,14 @@ typedef struct dhcps_msg { ...@@ -22,8 +24,14 @@ typedef struct dhcps_msg {
#ifndef LWIP_OPEN_SRC #ifndef LWIP_OPEN_SRC
struct dhcps_lease { struct dhcps_lease {
uint32 start_ip; struct ip_addr start_ip;
uint32 end_ip; struct ip_addr end_ip;
};
enum dhcps_offer_option{
OFFER_START = 0x00,
OFFER_ROUTER = 0x01,
OFFER_END
}; };
#endif #endif
...@@ -51,11 +59,6 @@ typedef struct _list_node{ ...@@ -51,11 +59,6 @@ typedef struct _list_node{
#define DHCPS_SERVER_PORT 67 #define DHCPS_SERVER_PORT 67
#define DHCPS_CLIENT_PORT 68 #define DHCPS_CLIENT_PORT 68
/*
* Advertise DNS capability in DHCP OFFER
*/
#define USE_DNS 0
#define DHCPDISCOVER 1 #define DHCPDISCOVER 1
#define DHCPOFFER 2 #define DHCPOFFER 2
#define DHCPREQUEST 3 #define DHCPREQUEST 3
...@@ -79,7 +82,7 @@ typedef struct _list_node{ ...@@ -79,7 +82,7 @@ typedef struct _list_node{
//#define USE_CLASS_B_NET 1 //#define USE_CLASS_B_NET 1
#define DHCPS_DEBUG 0 #define DHCPS_DEBUG 0
#define MAX_STATION_NUM 8
#define DHCPS_STATE_OFFER 1 #define DHCPS_STATE_OFFER 1
#define DHCPS_STATE_DECLINE 2 #define DHCPS_STATE_DECLINE 2
...@@ -87,6 +90,8 @@ typedef struct _list_node{ ...@@ -87,6 +90,8 @@ typedef struct _list_node{
#define DHCPS_STATE_NAK 4 #define DHCPS_STATE_NAK 4
#define DHCPS_STATE_IDLE 5 #define DHCPS_STATE_IDLE 5
#define dhcps_router_enabled(offer) ((offer & OFFER_ROUTER) != 0)
void dhcps_start(struct ip_info *info); void dhcps_start(struct ip_info *info);
void dhcps_stop(void); void dhcps_stop(void);
......
...@@ -22,6 +22,7 @@ typedef void (* espconn_reconnect_callback)(void *arg, sint8 err); ...@@ -22,6 +22,7 @@ typedef void (* espconn_reconnect_callback)(void *arg, sint8 err);
#define ESPCONN_TIMEOUT -3 /* Timeout. */ #define ESPCONN_TIMEOUT -3 /* Timeout. */
#define ESPCONN_RTE -4 /* Routing problem. */ #define ESPCONN_RTE -4 /* Routing problem. */
#define ESPCONN_INPROGRESS -5 /* Operation in progress */ #define ESPCONN_INPROGRESS -5 /* Operation in progress */
#define ESPCONN_MAXNUM -7 /* Total number exceeds the set maximum*/
#define ESPCONN_ABRT -8 /* Connection aborted. */ #define ESPCONN_ABRT -8 /* Connection aborted. */
#define ESPCONN_RST -9 /* Connection reset. */ #define ESPCONN_RST -9 /* Connection reset. */
...@@ -31,6 +32,10 @@ typedef void (* espconn_reconnect_callback)(void *arg, sint8 err); ...@@ -31,6 +32,10 @@ typedef void (* espconn_reconnect_callback)(void *arg, sint8 err);
#define ESPCONN_ARG -12 /* Illegal argument. */ #define ESPCONN_ARG -12 /* Illegal argument. */
#define ESPCONN_ISCONN -15 /* Already connected. */ #define ESPCONN_ISCONN -15 /* Already connected. */
#define ESPCONN_HANDSHAKE -28 /* ssl handshake failed */
#define ESPCONN_RESP_TIMEOUT -29 /* ssl handshake no response*/
#define ESPCONN_PROTO_MSG -61 /* ssl application invalid */
#define ESPCONN_SSL 0x01 #define ESPCONN_SSL 0x01
#define ESPCONN_NORM 0x00 #define ESPCONN_NORM 0x00
...@@ -69,6 +74,7 @@ typedef struct _esp_tcp { ...@@ -69,6 +74,7 @@ typedef struct _esp_tcp {
espconn_connect_callback connect_callback; espconn_connect_callback connect_callback;
espconn_reconnect_callback reconnect_callback; espconn_reconnect_callback reconnect_callback;
espconn_connect_callback disconnect_callback; espconn_connect_callback disconnect_callback;
espconn_connect_callback write_finish_fn;
} esp_tcp; } esp_tcp;
typedef struct _esp_udp { typedef struct _esp_udp {
...@@ -106,34 +112,107 @@ struct espconn { ...@@ -106,34 +112,107 @@ struct espconn {
}; };
enum espconn_option{ enum espconn_option{
ESPCONN_REUSEADDR = 1, ESPCONN_START = 0x00,
ESPCONN_REUSEADDR = 0x01,
ESPCONN_NODELAY = 0x02,
ESPCONN_COPY = 0x04,
ESPCONN_KEEPALIVE = 0x08,
ESPCONN_END ESPCONN_END
}; };
enum espconn_level{
ESPCONN_KEEPIDLE,
ESPCONN_KEEPINTVL,
ESPCONN_KEEPCNT
};
struct espconn_packet{
uint16 sent_length; /* sent length successful*/
uint16 snd_buf_size; /* Available buffer size for sending */
uint16 snd_queuelen; /* Available buffer space for sending */
uint16 total_queuelen; /* total Available buffer space for sending */
uint32 packseqno; /* seqno to be sent */
uint32 packseq_nxt; /* seqno expected */
uint32 packnum;
};
typedef struct _espconn_buf{
uint8 *payload;
uint8 *punsent;
uint16 unsent;
uint16 len;
uint16 tot_len;
struct _espconn_buf *pnext;
} espconn_buf;
typedef struct _comon_pkt{ typedef struct _comon_pkt{
void *pcb; void *pcb;
int remote_port; int remote_port;
uint8 remote_ip[4]; uint8 remote_ip[4];
uint8 *ptrbuf; uint32 local_port;
uint32 local_ip;
espconn_buf *pbuf;
espconn_buf *ptail;
uint8* ptrbuf;
uint16 cntr; uint16 cntr;
uint16 write_len;
uint16 write_total;
sint8 err; sint8 err;
uint32 timeout; uint32 timeout;
uint32 recv_check; uint32 recv_check;
uint8 pbuf_num;
struct espconn_packet packet_info;
bool write_flag;
enum espconn_option espconn_opt; enum espconn_option espconn_opt;
os_timer_t ptimer;
}comon_pkt; }comon_pkt;
typedef struct _espconn_msg{ 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
void *preverse; void *preverse;
void *pssl; void *pssl;
struct _espconn_msg *pnext; struct _espconn_msg *pnext;
//***********Code for WIFI_BLOCK from upper**************
uint8 recv_hold_flag;
uint16 recv_holded_buf_Len;
}espconn_msg; }espconn_msg;
#ifndef _MDNS_INFO
#define _MDNS_INFO
struct mdns_info {
char *host_name;
char *server_name;
uint16 server_port;
unsigned long ipAddr;
char *txt_data[10];
};
#endif
#define linkMax 15
#define espconn_delay_disabled(espconn) (((espconn)->pcommon.espconn_opt & ESPCONN_NODELAY) != 0)
#define espconn_delay_enabled(espconn) (((espconn)->pcommon.espconn_opt & ESPCONN_NODELAY) == 0)
#define espconn_reuse_disabled(espconn) (((espconn)->pcommon.espconn_opt & ESPCONN_REUSEADDR) != 0)
#define espconn_copy_disabled(espconn) (((espconn)->pcommon.espconn_opt & ESPCONN_COPY) != 0)
#define espconn_copy_enabled(espconn) (((espconn)->pcommon.espconn_opt & ESPCONN_COPY) == 0)
#define espconn_keepalive_disabled(espconn) (((espconn)->pcommon.espconn_opt & ESPCONN_KEEPALIVE) != 0)
#define espconn_keepalive_enabled(espconn) (((espconn)->pcommon.espconn_opt & ESPCONN_KEEPALIVE) == 0)
#define espconn_TaskPrio 26
#define espconn_TaskQueueLen 15
enum espconn_sig {
SIG_ESPCONN_NONE,
SIG_ESPCONN_ERRER,
SIG_ESPCONN_LISTEN,
SIG_ESPCONN_CONNECT,
SIG_ESPCONN_WRITE,
SIG_ESPCONN_SEND,
SIG_ESPCONN_READ,
SIG_ESPCONN_CLOSE
};
/****************************************************************************** /******************************************************************************
* FunctionName : espconn_copy_partial * FunctionName : espconn_copy_partial
* Description : reconnect with host * Description : reconnect with host
...@@ -181,6 +260,16 @@ bool espconn_find_connection(struct espconn *pespconn, espconn_msg **pnode); ...@@ -181,6 +260,16 @@ bool espconn_find_connection(struct espconn *pespconn, espconn_msg **pnode);
sint8 espconn_get_connection_info(struct espconn *pespconn, remot_info **pcon_info, uint8 typeflags); sint8 espconn_get_connection_info(struct espconn *pespconn, remot_info **pcon_info, uint8 typeflags);
/******************************************************************************
* FunctionName : espconn_get_packet_info
* Description : get the packet info with host
* Parameters : espconn -- the espconn used to disconnect the connection
* infoarg -- the packet info
* Returns : the errur code
*******************************************************************************/
sint8 espconn_get_packet_info(struct espconn *espconn, struct espconn_packet* infoarg);
/****************************************************************************** /******************************************************************************
* FunctionName : espconn_connect * FunctionName : espconn_connect
* Description : The function given as the connect * Description : The function given as the connect
...@@ -226,6 +315,23 @@ extern sint8 espconn_accept(struct espconn *espconn); ...@@ -226,6 +315,23 @@ extern sint8 espconn_accept(struct espconn *espconn);
extern sint8 espconn_create(struct espconn *espconn); extern sint8 espconn_create(struct espconn *espconn);
/******************************************************************************
* FunctionName : espconn_tcp_get_wnd
* Description : get the window size of simulatenously active TCP connections
* Parameters : none
* Returns : the number of TCP_MSS active TCP connections
*******************************************************************************/
extern uint8 espconn_tcp_get_wnd(void);
/******************************************************************************
* FunctionName : espconn_tcp_set_max_con
* Description : set the window size simulatenously active TCP connections
* Parameters : num -- the number of TCP_MSS
* Returns : ESPCONN_ARG -- Illegal argument
* ESPCONN_OK -- No error
*******************************************************************************/
extern sint8 espconn_tcp_set_wnd(uint8 num);
/****************************************************************************** /******************************************************************************
* FunctionName : espconn_tcp_get_max_con * FunctionName : espconn_tcp_get_max_con
* Description : get the number of simulatenously active TCP connections * Description : get the number of simulatenously active TCP connections
...@@ -243,6 +349,42 @@ extern uint8 espconn_tcp_get_max_con(void); ...@@ -243,6 +349,42 @@ extern uint8 espconn_tcp_get_max_con(void);
*******************************************************************************/ *******************************************************************************/
extern sint8 espconn_tcp_set_max_con(uint8 num); extern sint8 espconn_tcp_set_max_con(uint8 num);
/******************************************************************************
* FunctionName : espconn_tcp_get_max_retran
* Description : get the Maximum number of retransmissions of data active TCP connections
* Parameters : none
* Returns : the Maximum number of retransmissions
*******************************************************************************/
extern uint8 espconn_tcp_get_max_retran(void);
/******************************************************************************
* FunctionName : espconn_tcp_set_max_retran
* Description : set the Maximum number of retransmissions of data active TCP connections
* Parameters : num -- the Maximum number of retransmissions
* Returns : result
*******************************************************************************/
extern sint8 espconn_tcp_set_max_retran(uint8 num);
/******************************************************************************
* FunctionName : espconn_tcp_get_max_syn
* Description : get the Maximum number of retransmissions of SYN segments
* Parameters : none
* Returns : the Maximum number of retransmissions
*******************************************************************************/
extern uint8 espconn_tcp_get_max_syn(void);
/******************************************************************************
* FunctionName : espconn_tcp_set_max_syn
* Description : set the Maximum number of retransmissions of SYN segments
* Parameters : num -- the Maximum number of retransmissions
* Returns : result
*******************************************************************************/
extern sint8 espconn_tcp_set_max_syn(uint8 num);
/****************************************************************************** /******************************************************************************
* FunctionName : espconn_tcp_get_max_con_allow * FunctionName : espconn_tcp_get_max_con_allow
* Description : get the count of simulatenously active connections on the server * Description : get the count of simulatenously active connections on the server
...@@ -261,6 +403,16 @@ extern sint8 espconn_tcp_get_max_con_allow(struct espconn *espconn); ...@@ -261,6 +403,16 @@ extern sint8 espconn_tcp_get_max_con_allow(struct espconn *espconn);
extern sint8 espconn_tcp_set_max_con_allow(struct espconn *espconn, uint8 num); extern sint8 espconn_tcp_set_max_con_allow(struct espconn *espconn, uint8 num);
/******************************************************************************
* FunctionName : espconn_tcp_set_buf_count
* Description : set the total number of espconn_buf on the unsent lists
* Parameters : espconn -- espconn to set the count
* num -- the total number of espconn_buf
* Returns : result
*******************************************************************************/
extern sint8 espconn_tcp_set_buf_count(struct espconn *espconn, uint8 num);
/****************************************************************************** /******************************************************************************
* FunctionName : espconn_regist_time * FunctionName : espconn_regist_time
* Description : used to specify the time that should be called when don't recv data * Description : used to specify the time that should be called when don't recv data
...@@ -283,6 +435,17 @@ extern sint8 espconn_regist_time(struct espconn *espconn, uint32 interval, uint8 ...@@ -283,6 +435,17 @@ extern sint8 espconn_regist_time(struct espconn *espconn, uint32 interval, uint8
extern sint8 espconn_regist_sentcb(struct espconn *espconn, espconn_sent_callback sent_cb); extern sint8 espconn_regist_sentcb(struct espconn *espconn, espconn_sent_callback sent_cb);
/******************************************************************************
* FunctionName : espconn_regist_sentcb
* Description : Used to specify the function that should be called when data
* has been successfully delivered to the remote host.
* Parameters : espconn -- espconn to set the sent callback
* sent_cb -- sent callback function to call for this espconn
* when data is successfully sent
* Returns : none
*******************************************************************************/
extern sint8 espconn_regist_write_finish(struct espconn *espconn, espconn_connect_callback write_finish_fn);
/****************************************************************************** /******************************************************************************
* FunctionName : espconn_sent * FunctionName : espconn_sent
* Description : sent data for client or server * Description : sent data for client or server
...@@ -356,6 +519,27 @@ extern uint32 espconn_port(void); ...@@ -356,6 +519,27 @@ extern uint32 espconn_port(void);
*******************************************************************************/ *******************************************************************************/
extern sint8 espconn_set_opt(struct espconn *espconn, uint8 opt); extern sint8 espconn_set_opt(struct espconn *espconn, uint8 opt);
/******************************************************************************
* FunctionName : espconn_set_keepalive
* Description : access level value for connection so that we set the value for
* keep alive
* Parameters : espconn -- the espconn used to set the connection
* level -- the connection's level
* value -- the value of time(s)
* Returns : access port value
*******************************************************************************/
extern sint8 espconn_set_keepalive(struct espconn *espconn, uint8 level, void* optarg);
/******************************************************************************
* FunctionName : espconn_get_keepalive
* Description : access level value for connection so that we get the value for
* keep alive
* Parameters : espconn -- the espconn used to get the connection
* level -- the connection's level
* Returns : access keep alive value
*******************************************************************************/
extern sint8 espconn_get_keepalive(struct espconn *espconn, uint8 level, void *optarg);
/****************************************************************************** /******************************************************************************
* FunctionName : espconn_gethostbyname * FunctionName : espconn_gethostbyname
* Description : Resolve a hostname (string) into an IP address. * Description : Resolve a hostname (string) into an IP address.
...@@ -395,20 +579,85 @@ extern sint8 espconn_igmp_join(ip_addr_t *host_ip, ip_addr_t *multicast_ip); ...@@ -395,20 +579,85 @@ extern sint8 espconn_igmp_join(ip_addr_t *host_ip, ip_addr_t *multicast_ip);
extern sint8 espconn_igmp_leave(ip_addr_t *host_ip, ip_addr_t *multicast_ip); extern sint8 espconn_igmp_leave(ip_addr_t *host_ip, ip_addr_t *multicast_ip);
/****************************************************************************** /******************************************************************************
* FunctionName : espconn_recv_hold * FunctionName : espconn_mdns_init
* Description : hold tcp receive * Description : register a device with mdns
* Parameters : espconn -- espconn to hold * Parameters : ipAddr -- the ip address of device
* hostname -- the hostname of device
* Returns : none * Returns : none
*******************************************************************************/ *******************************************************************************/
extern sint8 espconn_recv_hold(struct espconn *pespconn); extern void espconn_mdns_init(struct mdns_info *info);
/****************************************************************************** /******************************************************************************
* FunctionName : espconn_recv_unhold * FunctionName : espconn_mdns_init
* Description : unhold tcp receive * Description : close mdns socket
* Parameters : espconn -- espconn to unhold * Parameters : void
* Returns : none * Returns : none
*******************************************************************************/ *******************************************************************************/
extern sint8 espconn_recv_unhold(struct espconn *pespconn); extern void espconn_mdns_close(void);
/******************************************************************************
* FunctionName : mdns_server_register
* Description : register a server and join a multicast group
* Parameters : none
* Returns : none
*******************************************************************************/
extern void espconn_mdns_server_register(void);
/******************************************************************************
* FunctionName : mdns_server_register
* Description : unregister server and leave multicast group
* Parameters : none
* Returns : none
*******************************************************************************/
extern void espconn_mdns_server_unregister(void);
/******************************************************************************
* FunctionName : espconn_mdns_get_servername
* Description : get server name
* Parameters : none
* Returns : server name
*******************************************************************************/
extern char* espconn_mdns_get_servername(void);
/******************************************************************************
* FunctionName : espconn_mdns_get_servername
* Description : set server name
* Parameters : server name
* Returns : none
*******************************************************************************/
extern void espconn_mdns_set_servername(const char *name);
/******************************************************************************
* FunctionName : espconn_mdns_set_hostname
* Description : set host name
* Parameters : host name
* Returns : none
*******************************************************************************/
extern void espconn_mdns_set_hostname(char *name);
/******************************************************************************
* FunctionName : espconn_mdns_init
* Description : get host name
* Parameters : void
* Returns : hostname
*******************************************************************************/
extern char* espconn_mdns_get_hostname(void);
/******************************************************************************
* FunctionName : espconn_mdns_disable
* Description : join a multicast group
* Parameters : host_ip -- the ip address of udp server
* multicast_ip -- multicast ip given by user
* Returns : none
*******************************************************************************/
extern void espconn_mdns_disable(void);
/******************************************************************************
* FunctionName : espconn_mdns_enable
* Description : enable mdns
* Parameters : void
* Returns : none
*******************************************************************************/
extern void espconn_mdns_enable(void);
/******************************************************************************
* FunctionName : espconn_dns_setserver
* Description : Initialize one of the DNS servers.
* Parameters : numdns -- the index of the DNS server to set must
* be < DNS_MAX_SERVERS = 2
* dnsserver -- IP address of the DNS server to set
* Returns : none
*******************************************************************************/
extern void espconn_dns_setserver(u8_t numdns, ip_addr_t *dnsserver);
#endif #endif
...@@ -10,6 +10,18 @@ ...@@ -10,6 +10,18 @@
#define ESPCONN_TCP_TIMER 40 #define ESPCONN_TCP_TIMER 40
#endif #endif
#define espconn_keepalive_enable(pcb) ((pcb)->so_options |= SOF_KEEPALIVE)
#define espconn_keepalive_disable(pcb) ((pcb)->so_options &= ~SOF_KEEPALIVE)
/******************************************************************************
* FunctionName : espconn_kill_oldest_pcb
* Description : A oldest incoming connection has been killed.
* Parameters : none
* Returns : none
*******************************************************************************/
extern void espconn_kill_oldest_pcb(void);
/****************************************************************************** /******************************************************************************
* FunctionName : espconn_tcp_disconnect * FunctionName : espconn_tcp_disconnect
* Description : A new incoming connection has been disconnected. * Description : A new incoming connection has been disconnected.
......
...@@ -43,7 +43,7 @@ extern sint8 espconn_udp_server(struct espconn *espconn); ...@@ -43,7 +43,7 @@ extern sint8 espconn_udp_server(struct espconn *espconn);
* Returns : none * Returns : none
*******************************************************************************/ *******************************************************************************/
extern void espconn_udp_sent(void *arg, uint8 *psent, uint16 length); extern err_t espconn_udp_sent(void *arg, uint8 *psent, uint16 length);
#endif /* __ESPCONN_UDP_H__ */ #endif /* __ESPCONN_UDP_H__ */
......
...@@ -207,6 +207,15 @@ void dhcp_fine_tmr(void); ...@@ -207,6 +207,15 @@ void dhcp_fine_tmr(void);
#define DHCP_OPTION_TCP_TTL 37 #define DHCP_OPTION_TCP_TTL 37
#define DHCP_OPTION_END 255 #define DHCP_OPTION_END 255
/**add options for support more router by liuHan**/
#define DHCP_OPTION_DOMAIN_NAME 15
#define DHCP_OPTION_PRD 31
#define DHCP_OPTION_STATIC_ROUTER 33
#define DHCP_OPTION_VSN 43
#define DHCP_OPTION_NB_TINS 44
#define DHCP_OPTION_NB_TINT 46
#define DHCP_OPTION_NB_TIS 47
#define DHCP_OPTION_CLASSLESS_STATIC_ROUTER 121
/** DHCP options */ /** DHCP options */
#define DHCP_OPTION_REQUESTED_IP 50 /* RFC 2132 9.1, requested IP address */ #define DHCP_OPTION_REQUESTED_IP 50 /* RFC 2132 9.1, requested IP address */
#define DHCP_OPTION_LEASE_TIME 51 /* RFC 2132 9.2, time in seconds, in 4 bytes */ #define DHCP_OPTION_LEASE_TIME 51 /* RFC 2132 9.2, time in seconds, in 4 bytes */
......
...@@ -96,7 +96,7 @@ void igmp_input(struct pbuf *p, struct netif *inp, ip_addr_t *dest)ICACHE_FLAS ...@@ -96,7 +96,7 @@ void igmp_input(struct pbuf *p, struct netif *inp, ip_addr_t *dest)ICACHE_FLAS
err_t igmp_joingroup(ip_addr_t *ifaddr, ip_addr_t *groupaddr)ICACHE_FLASH_ATTR; err_t igmp_joingroup(ip_addr_t *ifaddr, ip_addr_t *groupaddr)ICACHE_FLASH_ATTR;
err_t igmp_leavegroup(ip_addr_t *ifaddr, ip_addr_t *groupaddr)ICACHE_FLASH_ATTR; err_t igmp_leavegroup(ip_addr_t *ifaddr, ip_addr_t *groupaddr)ICACHE_FLASH_ATTR;
void igmp_tmr(void)ICACHE_FLASH_ATTR; void igmp_tmr(void)ICACHE_FLASH_ATTR;
#define LWIP_RAND() rand() #define LWIP_RAND() r_rand()
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif
......
/**
* lwip MDNS resolver header file.
*
* Created on: Jul 29, 2010
* Author: Daniel Toma
* ported from uIP resolv.c Copyright (c) 2002-2003, Adam Dunkels.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. The name of the author may not be used to endorse or promote
* products derived from this software without specific prior
* written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef __LWIP_DNS_H__
#define __LWIP_DNS_H__
#include "lwip/opt.h"
#if LWIP_MDNS /* don't build if not configured for use in lwipopts.h */
/** DNS timer period */
#define DNS_TMR_INTERVAL 1000
/** mDNS Address offset flag*/
#define DNS_OFFSET_FLAG 0xC0 /* the offset flag in the DNS message */
#define DNS_DEFAULT_OFFSET 0x0C /* the offset is set at the beginning of the DNS message */
#define DNS_IP_ADDR_LEN 4
/** DNS field TYPE used for "Resource Records" */
#define DNS_RRTYPE_A 1 /* a host address */
#define DNS_RRTYPE_NS 2 /* an authoritative name server */
#define DNS_RRTYPE_MD 3 /* a mail destination (Obsolete - use MX) */
#define DNS_RRTYPE_MF 4 /* a mail forwarder (Obsolete - use MX) */
#define DNS_RRTYPE_CNAME 5 /* the canonical name for an alias */
#define DNS_RRTYPE_SOA 6 /* marks the start of a zone of authority */
#define DNS_RRTYPE_MB 7 /* a mailbox domain name (EXPERIMENTAL) */
#define DNS_RRTYPE_MG 8 /* a mail group member (EXPERIMENTAL) */
#define DNS_RRTYPE_MR 9 /* a mail rename domain name (EXPERIMENTAL) */
#define DNS_RRTYPE_NULL 10 /* a null RR (EXPERIMENTAL) */
#define DNS_RRTYPE_WKS 11 /* a well known service description */
#define DNS_RRTYPE_PTR 12 /* a domain name pointer */
#define DNS_RRTYPE_HINFO 13 /* host information */
#define DNS_RRTYPE_MINFO 14 /* mailbox or mail list information */
#define DNS_RRTYPE_MX 15 /* mail exchange */
#define DNS_RRTYPE_TXT 16 /* text strings */
#define DNS_RRTYPE_SRV 33 /* Service record */
#define DNS_RRTYPE_OPT 41 /* EDNS0 OPT record */
#define DNS_RRTYPE_TSIG 250 /* Transaction Signature */
#define DNS_RRTYPE_ANY 255 /*Not a DNS type, but a DNS query type, meaning "all types"*/
/* DNS field CLASS used for "Resource Records" */
#define DNS_RRCLASS_IN 1 /* the Internet */
#define DNS_RRCLASS_CS 2 /* the CSNET class (Obsolete - used only for examples in some obsolete RFCs) */
#define DNS_RRCLASS_CH 3 /* the CHAOS class */
#define DNS_RRCLASS_HS 4 /* Hesiod [Dyer 87] */
#define DNS_RRCLASS_FLUSH 0x800 /* Flush bit */
#define DNS_RRCLASS_FLUSH_IN 0x8001/* Flush bit and Internet*/
/** Callback which is invoked when a hostname is found.
* A function of this type must be implemented by the application using the DNS resolver.
* @param name pointer to the name that was looked up.
* @param ipaddr pointer to a struct ip_addr containing the IP address of the hostname,
* or NULL if the name could not be found (or on any other error).
* @param callback_arg a user-specified callback argument passed to dns_gethostbyname
*/
#ifndef _MDNS_INFO
#define _MDNS_INFO
struct mdns_info {
char *host_name;
char *server_name;
uint16 server_port;
unsigned long ipAddr;
char *txt_data[10];
};
#endif
//void mdns_enable(void);
//void mdns_disable(void);
//void mdns_init(struct mdns_info *info);
//void mdns_close(void);
//char* mdns_get_hostname(void);
//void mdns_set_hostname(char *name);
//void mdns_set_servername(const char *name);
//char* mdns_get_servername(void);
//void mdns_server_unregister(void);
//void mdns_server_register(void) ;
//void mdns_tmr(void);
//void Delay(unsigned long ulSeconds);
#endif /* LWIP_DNS */
#endif /* __LWIP_DNS_H__ */
...@@ -76,7 +76,7 @@ typedef enum { ...@@ -76,7 +76,7 @@ typedef enum {
#endif /* MEM_USE_POOLS */ #endif /* MEM_USE_POOLS */
#if MEMP_MEM_MALLOC || MEM_USE_POOLS #if MEMP_MEM_MALLOC || MEM_USE_POOLS
extern const u16_t memp_sizes[MEMP_MAX]; extern const u32_t memp_sizes[MEMP_MAX];
#endif /* MEMP_MEM_MALLOC || MEM_USE_POOLS */ #endif /* MEMP_MEM_MALLOC || MEM_USE_POOLS */
#if MEMP_MEM_MALLOC #if MEMP_MEM_MALLOC
......
...@@ -169,6 +169,7 @@ struct netif { ...@@ -169,6 +169,7 @@ struct netif {
#if LWIP_DHCP #if LWIP_DHCP
/** 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
#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 */
......
/*
* puck_def.h
*
* Created on: Jul 22, 2010
* Author: dtoma
*/
#ifndef PUCK_DEF_H_
#define PUCK_DEF_H_
#define INSTRUMENT_PORT 8760
#define INSTRUMENT_LENGTH 80
#define MDNS_NAME_LENGTH 68 //68
char* PUCK_SERVICE = NULL;
//#define PUCK_SERVICE "_Escpressif._tcp.local"
#define DNS_SD_SERVICE "_services._dns-sd._udp.local"
#define SERVICE_DESCRIPTION "PUCK PROTOCOL"
#define PUCK_SERVICE_LENGTH 30
#define UUID_LEN 16
#define DS_VERS_LEN 2
#define DS_SIZE_LEN 2
#define MAN_ID_LEN 4
#define MAN_MODEL_LEN 2
#define MAN_VERS_LEN 2
#define SER_NUM_LEN 4
#define NAME_LEN 64
#define PUCK_DATASHEET_SIZE 96
#define UUID_OFFSET 0
#define DS_VERS_OFFSET UUID_LEN + UUID_OFFSET
#define DS_SIZE_OFFSET DS_VERS_LEN + DS_VERS_OFFSET
#define MAN_ID_OFFSET DS_SIZE_LEN + DS_SIZE_OFFSET
#define MAN_MODEL_OFFSET MAN_ID_LEN + MAN_ID_OFFSET
#define MAN_VERS_OFFSET MAN_MODEL_LEN + MAN_MODEL_OFFSET
#define SER_NUM_OFFSET MAN_VERS_LEN + MAN_VERS_OFFSET
#define NAME_OFFSET SER_NUM_LEN + SER_NUM_OFFSET
#endif /* __PUCK_DEF_H__ */
#ifndef LWIP_SNTP_H
#define LWIP_SNTP_H
#include "lwip/opt.h"
#include "lwip/ip_addr.h"
#ifdef __cplusplus
extern "C" {
#endif
/** The maximum number of SNTP servers that can be set */
#ifndef SNTP_MAX_SERVERS
#define SNTP_MAX_SERVERS 3
#endif
/** Set this to 1 to implement the callback function called by dhcp when
* NTP servers are received. */
#ifndef SNTP_GET_SERVERS_FROM_DHCP
#define SNTP_GET_SERVERS_FROM_DHCP 0//LWIP_DHCP_GET_NTP_SRV
#endif
/* Set this to 1 to support DNS names (or IP address strings) to set sntp servers */
#ifndef SNTP_SERVER_DNS
#define SNTP_SERVER_DNS 1
#endif
/** One server address/name can be defined as default if SNTP_SERVER_DNS == 1:
* #define SNTP_SERVER_ADDRESS "pool.ntp.org"
*/
uint32 sntp_get_current_timestamp();
char* sntp_get_real_time(long t);
void sntp_init(void);
void sntp_stop(void);
sint8 sntp_get_timezone(void);
bool sntp_set_timezone(sint8 timezone);
void sntp_setserver(u8_t idx, ip_addr_t *addr);
ip_addr_t sntp_getserver(u8_t idx);
#if SNTP_SERVER_DNS
void sntp_setservername(u8_t idx, char *server);
char *sntp_getservername(u8_t idx);
#endif /* SNTP_SERVER_DNS */
#if SNTP_GET_SERVERS_FROM_DHCP
void sntp_servermode_dhcp(int set_servers_from_dhcp);
#else /* SNTP_GET_SERVERS_FROM_DHCP */
#define sntp_servermode_dhcp(x)
#endif /* SNTP_GET_SERVERS_FROM_DHCP */
#ifdef __cplusplus
}
#endif
#endif /* LWIP_SNTP_H */
...@@ -281,8 +281,8 @@ void sys_arch_unprotect(sys_prot_t pval)ICACHE_FLASH_ATTR; ...@@ -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 = os_intr_lock() //fix by ives at 2014.3.24 #define SYS_ARCH_PROTECT(lev) lev = ets_intr_lock() //fix by ives at 2014.3.24
#define SYS_ARCH_UNPROTECT(lev) lev = os_intr_unlock() #define SYS_ARCH_UNPROTECT(lev) lev = ets_intr_unlock()
#endif /* SYS_LIGHTWEIGHT_PROT */ #endif /* SYS_LIGHTWEIGHT_PROT */
......
...@@ -277,8 +277,6 @@ struct tcp_pcb { ...@@ -277,8 +277,6 @@ struct tcp_pcb {
/* KEEPALIVE counter */ /* KEEPALIVE counter */
u8_t keep_cnt_sent; u8_t keep_cnt_sent;
u8_t hold;
}; };
struct tcp_pcb_listen { struct tcp_pcb_listen {
......
...@@ -135,15 +135,15 @@ u32_t tcp_update_rcv_ann_wnd(struct tcp_pcb *pcb)ICACHE_FLASH_ATTR; ...@@ -135,15 +135,15 @@ u32_t tcp_update_rcv_ann_wnd(struct tcp_pcb *pcb)ICACHE_FLASH_ATTR;
/* Keepalive values, compliant with RFC 1122. Don't change this unless you know what you're doing */ /* Keepalive values, compliant with RFC 1122. Don't change this unless you know what you're doing */
#ifndef TCP_KEEPIDLE_DEFAULT #ifndef TCP_KEEPIDLE_DEFAULT
#define TCP_KEEPIDLE_DEFAULT 3000UL /* Default KEEPALIVE timer in milliseconds */ #define TCP_KEEPIDLE_DEFAULT 120000UL /* Default KEEPALIVE timer in milliseconds */
#endif #endif
#ifndef TCP_KEEPINTVL_DEFAULT #ifndef TCP_KEEPINTVL_DEFAULT
#define TCP_KEEPINTVL_DEFAULT 1000UL /* Default Time between KEEPALIVE probes in milliseconds */ #define TCP_KEEPINTVL_DEFAULT 10000UL /* Default Time between KEEPALIVE probes in milliseconds */
#endif #endif
#ifndef TCP_KEEPCNT_DEFAULT #ifndef TCP_KEEPCNT_DEFAULT
#define TCP_KEEPCNT_DEFAULT 3U /* Default Counter for KEEPALIVE probes */ #define TCP_KEEPCNT_DEFAULT 9U /* Default Counter for KEEPALIVE probes */
#endif #endif
#define TCP_MAXIDLE TCP_KEEPCNT_DEFAULT * TCP_KEEPINTVL_DEFAULT /* Maximum KEEPALIVE probe time */ #define TCP_MAXIDLE TCP_KEEPCNT_DEFAULT * TCP_KEEPINTVL_DEFAULT /* Maximum KEEPALIVE probe time */
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
#include "c_types.h" #include "c_types.h"
/*------------------------------------------------*/ /*------------------------��������------------------------*/
#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE #define MPU_WRAPPERS_INCLUDED_FROM_API_FILE
#ifndef IOT_SIP_MODE #ifndef IOT_SIP_MODE
...@@ -52,7 +52,7 @@ typedef struct A_BLOCK_LINK ...@@ -52,7 +52,7 @@ typedef struct A_BLOCK_LINK
size_t xBlockSize; //The size of the free block. size_t xBlockSize; //The size of the free block.
} xBlockLink; } xBlockLink;
static const unsigned short heapSTRUCT_SIZE = ( sizeof( xBlockLink ) + portBYTE_ALIGNMENT - ( sizeof( xBlockLink ) % portBYTE_ALIGNMENT ) ); static const size_t heapSTRUCT_SIZE ICACHE_RODATA_ATTR = ( sizeof( xBlockLink ) + portBYTE_ALIGNMENT - ( sizeof( xBlockLink ) % portBYTE_ALIGNMENT ) );
//static const size_t xTotalHeapSize = ( ( size_t ) configADJUSTED_HEAP_SIZE ) & ( ( size_t ) ~portBYTE_ALIGNMENT_MASK ); //static const size_t xTotalHeapSize = ( ( size_t ) configADJUSTED_HEAP_SIZE ) & ( ( size_t ) ~portBYTE_ALIGNMENT_MASK );
...@@ -61,7 +61,7 @@ static xBlockLink xStart, *pxEnd = NULL; ...@@ -61,7 +61,7 @@ static xBlockLink xStart, *pxEnd = NULL;
//static size_t xFreeBytesRemaining = ( ( size_t ) configADJUSTED_HEAP_SIZE ) & ( ( size_t ) ~portBYTE_ALIGNMENT_MASK ); //static size_t xFreeBytesRemaining = ( ( size_t ) configADJUSTED_HEAP_SIZE ) & ( ( size_t ) ~portBYTE_ALIGNMENT_MASK );
/*-----------------------------------------------------------*/ /*------------------------��������-----------------------------------*/
static void prvInsertBlockIntoFreeList( xBlockLink *pxBlockToInsert ) ;//ICACHE_FLASH_ATTR; static void prvInsertBlockIntoFreeList( xBlockLink *pxBlockToInsert ) ;//ICACHE_FLASH_ATTR;
......
...@@ -10,23 +10,25 @@ ...@@ -10,23 +10,25 @@
#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"
//////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////
static 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};
static const uint8_t magic_cookie[4] = {99, 130, 83, 99}; static const uint32 magic_cookie ICACHE_RODATA_ATTR = 0x63538263;
static struct udp_pcb *pcb_dhcps = NULL; 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 ip_addr client_address_plus;
static struct dhcps_msg msg_dhcps;
struct dhcps_state s; 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;
/****************************************************************************** /******************************************************************************
* FunctionName : node_insert_to_list * FunctionName : node_insert_to_list
* Description : insert the node to the list * Description : insert the node to the list
...@@ -138,14 +140,20 @@ static uint8_t* ICACHE_FLASH_ATTR add_offer_options(uint8_t *optptr) ...@@ -138,14 +140,20 @@ static uint8_t* ICACHE_FLASH_ATTR add_offer_options(uint8_t *optptr)
*optptr++ = ip4_addr3( &ipadd); *optptr++ = ip4_addr3( &ipadd);
*optptr++ = ip4_addr4( &ipadd); *optptr++ = ip4_addr4( &ipadd);
if (dhcps_router_enabled(offer)){
struct ip_info if_ip;
os_bzero(&if_ip, sizeof(struct ip_info));
wifi_get_ip_info(SOFTAP_IF, &if_ip);
*optptr++ = DHCP_OPTION_ROUTER; *optptr++ = DHCP_OPTION_ROUTER;
*optptr++ = 4; *optptr++ = 4;
*optptr++ = ip4_addr1( &ipadd); *optptr++ = ip4_addr1( &if_ip.gw);
*optptr++ = ip4_addr2( &ipadd); *optptr++ = ip4_addr2( &if_ip.gw);
*optptr++ = ip4_addr3( &ipadd); *optptr++ = ip4_addr3( &if_ip.gw);
*optptr++ = ip4_addr4( &ipadd); *optptr++ = ip4_addr4( &if_ip.gw);
}
#if USE_DNS #ifdef USE_DNS
*optptr++ = DHCP_OPTION_DNS_SERVER; *optptr++ = DHCP_OPTION_DNS_SERVER;
*optptr++ = 4; *optptr++ = 4;
*optptr++ = ip4_addr1( &ipadd); *optptr++ = ip4_addr1( &ipadd);
...@@ -154,7 +162,7 @@ static uint8_t* ICACHE_FLASH_ATTR add_offer_options(uint8_t *optptr) ...@@ -154,7 +162,7 @@ static uint8_t* ICACHE_FLASH_ATTR add_offer_options(uint8_t *optptr)
*optptr++ = ip4_addr4( &ipadd); *optptr++ = ip4_addr4( &ipadd);
#endif #endif
#ifdef USE_CLASS_B_NET #ifdef CLASS_B_NET
*optptr++ = DHCP_OPTION_BROADCAST_ADDRESS; *optptr++ = DHCP_OPTION_BROADCAST_ADDRESS;
*optptr++ = 4; *optptr++ = 4;
*optptr++ = ip4_addr1( &ipadd); *optptr++ = ip4_addr1( &ipadd);
...@@ -172,7 +180,7 @@ static uint8_t* ICACHE_FLASH_ATTR add_offer_options(uint8_t *optptr) ...@@ -172,7 +180,7 @@ static uint8_t* ICACHE_FLASH_ATTR add_offer_options(uint8_t *optptr)
*optptr++ = DHCP_OPTION_INTERFACE_MTU; *optptr++ = DHCP_OPTION_INTERFACE_MTU;
*optptr++ = 2; *optptr++ = 2;
#ifdef USE_CLASS_B_NET #ifdef CLASS_B_NET
*optptr++ = 0x05; *optptr++ = 0x05;
*optptr++ = 0xdc; *optptr++ = 0xdc;
#else #else
...@@ -212,11 +220,6 @@ static uint8_t* ICACHE_FLASH_ATTR add_end(uint8_t *optptr) ...@@ -212,11 +220,6 @@ static uint8_t* ICACHE_FLASH_ATTR add_end(uint8_t *optptr)
return optptr; return optptr;
} }
/////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////
/*
* ����һ��DHCP msg�ṹ��
*
* @param -- m ָ�򴴽���DHCP msg�ṹ�����?
*/
/////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////
static void ICACHE_FLASH_ATTR create_msg(struct dhcps_msg *m) static void ICACHE_FLASH_ATTR create_msg(struct dhcps_msg *m)
{ {
...@@ -228,7 +231,7 @@ static void ICACHE_FLASH_ATTR create_msg(struct dhcps_msg *m) ...@@ -228,7 +231,7 @@ static void ICACHE_FLASH_ATTR create_msg(struct dhcps_msg *m)
m->htype = DHCP_HTYPE_ETHERNET; m->htype = DHCP_HTYPE_ETHERNET;
m->hlen = 6; m->hlen = 6;
m->hops = 0; m->hops = 0;
os_memcpy((char *) xid, (char *) m->xid, sizeof(m->xid)); // os_memcpy((char *) xid, (char *) m->xid, sizeof(m->xid));
m->secs = 0; m->secs = 0;
m->flags = htons(BOOTP_BROADCAST); m->flags = htons(BOOTP_BROADCAST);
...@@ -241,7 +244,7 @@ static void ICACHE_FLASH_ATTR create_msg(struct dhcps_msg *m) ...@@ -241,7 +244,7 @@ static void ICACHE_FLASH_ATTR create_msg(struct dhcps_msg *m)
os_memset((char *) m->file, 0, sizeof(m->file)); os_memset((char *) m->file, 0, sizeof(m->file));
os_memset((char *) m->options, 0, sizeof(m->options)); os_memset((char *) m->options, 0, sizeof(m->options));
os_memcpy((char *) m->options, (char *) magic_cookie, sizeof(magic_cookie)); os_memcpy((char *) m->options, &magic_cookie, sizeof(magic_cookie));
} }
/////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////
/* /*
...@@ -544,7 +547,7 @@ static uint8_t ICACHE_FLASH_ATTR parse_options(uint8_t *optptr, sint16_t len) ...@@ -544,7 +547,7 @@ static uint8_t ICACHE_FLASH_ATTR parse_options(uint8_t *optptr, sint16_t len)
static sint16_t ICACHE_FLASH_ATTR parse_msg(struct dhcps_msg *m, u16_t len) 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,
(char *)magic_cookie, &magic_cookie,
sizeof(magic_cookie)) == 0){ sizeof(magic_cookie)) == 0){
#if DHCPS_DEBUG #if DHCPS_DEBUG
os_printf("dhcps: len = %d\n", len); os_printf("dhcps: len = %d\n", len);
...@@ -574,7 +577,7 @@ static sint16_t ICACHE_FLASH_ATTR parse_msg(struct dhcps_msg *m, u16_t len) ...@@ -574,7 +577,7 @@ static sint16_t ICACHE_FLASH_ATTR parse_msg(struct dhcps_msg *m, u16_t len)
* ��¼���ε�xid�ţ�ͬʱ�����IP���� * ��¼���ε�xid�ţ�ͬʱ�����IP����
*/ */
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;
...@@ -611,9 +614,15 @@ static sint16_t ICACHE_FLASH_ATTR parse_msg(struct dhcps_msg *m, u16_t len) ...@@ -611,9 +614,15 @@ static sint16_t ICACHE_FLASH_ATTR parse_msg(struct dhcps_msg *m, u16_t len)
node_insert_to_list(&plist,pnode); node_insert_to_list(&plist,pnode);
POOL_CHECK: POOL_CHECK:
if ((client_address_plus.addr > dhcps_lease.end_ip) || (ip_addr_isany(&client_address))){ if ((client_address_plus.addr > dhcps_lease.end_ip.addr) || (ip_addr_isany(&client_address))){
client_address_plus.addr = dhcps_lease.start_ip; os_printf("client_address_plus.addr %x %d\n", client_address_plus.addr, system_get_free_heap_size());
goto POOL_START; node_remove_from_list(&plist,pnode);
os_free(pdhcps_pool);
pdhcps_pool = NULL;
os_free(pnode);
pnode = NULL;
// client_address_plus.addr = dhcps_lease.start_ip.addr;
return 4;
} }
if (wifi_softap_set_station_info(m->chaddr, &client_address) == false) { if (wifi_softap_set_station_info(m->chaddr, &client_address) == false) {
...@@ -652,18 +661,24 @@ static void ICACHE_FLASH_ATTR handle_dhcp(void *arg, ...@@ -652,18 +661,24 @@ static void ICACHE_FLASH_ATTR handle_dhcp(void *arg,
struct ip_addr *addr, struct ip_addr *addr,
uint16_t port) uint16_t port)
{ {
struct dhcps_msg *pmsg_dhcps = NULL;
sint16_t tlen; sint16_t tlen = 0;
u16_t i; u16_t i = 0;
u16_t dhcps_msg_cnt=0; u16_t dhcps_msg_cnt = 0;
u8_t *p_dhcps_msg = (u8_t *)&msg_dhcps; u8_t *p_dhcps_msg = NULL;
u8_t *data; u8_t *data = NULL;
#if DHCPS_DEBUG #if DHCPS_DEBUG
os_printf("dhcps: handle_dhcp-> receive a packet\n"); os_printf("dhcps: handle_dhcp-> receive a packet\n");
#endif #endif
if (p==NULL) return; if (p==NULL) return;
pmsg_dhcps = (struct dhcps_msg *)os_zalloc(sizeof(struct dhcps_msg));
if (NULL == pmsg_dhcps){
pbuf_free(p);
return;
}
p_dhcps_msg = (u8_t *)pmsg_dhcps;
tlen = p->tot_len; tlen = p->tot_len;
data = p->payload; data = p->payload;
...@@ -672,7 +687,6 @@ static void ICACHE_FLASH_ATTR handle_dhcp(void *arg, ...@@ -672,7 +687,6 @@ static void ICACHE_FLASH_ATTR handle_dhcp(void *arg,
os_printf("dhcps: handle_dhcp-> p->len = %d\n", p->len); os_printf("dhcps: handle_dhcp-> p->len = %d\n", p->len);
#endif #endif
os_memset(&msg_dhcps, 0, sizeof(dhcps_msg));
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 #if DHCPS_DEBUG
...@@ -709,25 +723,25 @@ static void ICACHE_FLASH_ATTR handle_dhcp(void *arg, ...@@ -709,25 +723,25 @@ static void ICACHE_FLASH_ATTR handle_dhcp(void *arg,
os_printf("dhcps: handle_dhcp-> parse_msg(p)\n"); os_printf("dhcps: handle_dhcp-> parse_msg(p)\n");
#endif #endif
switch(parse_msg(&msg_dhcps, tlen - 240)) { switch(parse_msg(pmsg_dhcps, tlen - 240)) {
case DHCPS_STATE_OFFER://1 case DHCPS_STATE_OFFER://1
#if DHCPS_DEBUG #if DHCPS_DEBUG
os_printf("dhcps: handle_dhcp-> DHCPD_STATE_OFFER\n"); os_printf("dhcps: handle_dhcp-> DHCPD_STATE_OFFER\n");
#endif #endif
send_offer(&msg_dhcps); send_offer(pmsg_dhcps);
break; break;
case DHCPS_STATE_ACK://3 case DHCPS_STATE_ACK://3
#if DHCPS_DEBUG #if DHCPS_DEBUG
os_printf("dhcps: handle_dhcp-> DHCPD_STATE_ACK\n"); os_printf("dhcps: handle_dhcp-> DHCPD_STATE_ACK\n");
#endif #endif
send_ack(&msg_dhcps); send_ack(pmsg_dhcps);
break; break;
case DHCPS_STATE_NAK://4 case DHCPS_STATE_NAK://4
#if DHCPS_DEBUG #if DHCPS_DEBUG
os_printf("dhcps: handle_dhcp-> DHCPD_STATE_NAK\n"); os_printf("dhcps: handle_dhcp-> DHCPD_STATE_NAK\n");
#endif #endif
send_nak(&msg_dhcps); send_nak(pmsg_dhcps);
break; break;
default : default :
break; break;
...@@ -736,6 +750,8 @@ static void ICACHE_FLASH_ATTR handle_dhcp(void *arg, ...@@ -736,6 +750,8 @@ static void ICACHE_FLASH_ATTR handle_dhcp(void *arg,
os_printf("dhcps: handle_dhcp-> pbuf_free(p)\n"); os_printf("dhcps: handle_dhcp-> pbuf_free(p)\n");
#endif #endif
pbuf_free(p); pbuf_free(p);
os_free(pmsg_dhcps);
pmsg_dhcps = NULL;
} }
/////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////
static void ICACHE_FLASH_ATTR wifi_softap_init_dhcps_lease(uint32 ip) static void ICACHE_FLASH_ATTR wifi_softap_init_dhcps_lease(uint32 ip)
...@@ -752,27 +768,34 @@ static void ICACHE_FLASH_ATTR wifi_softap_init_dhcps_lease(uint32 ip) ...@@ -752,27 +768,34 @@ static void ICACHE_FLASH_ATTR wifi_softap_init_dhcps_lease(uint32 ip)
local_ip ++; local_ip ++;
os_bzero(&dhcps_lease, sizeof(dhcps_lease)); os_bzero(&dhcps_lease, sizeof(dhcps_lease));
dhcps_lease.start_ip = softap_ip | local_ip; dhcps_lease.start_ip.addr = softap_ip | local_ip;
dhcps_lease.end_ip = softap_ip | (local_ip + DHCPS_MAX_LEASE); dhcps_lease.end_ip.addr = softap_ip | (local_ip + DHCPS_MAX_LEASE);
} }
dhcps_lease.start_ip = htonl(dhcps_lease.start_ip); dhcps_lease.start_ip.addr = htonl(dhcps_lease.start_ip.addr);
dhcps_lease.end_ip= htonl(dhcps_lease.end_ip); 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);
} }
/////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////
void ICACHE_FLASH_ATTR dhcps_start(struct ip_info *info) void ICACHE_FLASH_ATTR dhcps_start(struct ip_info *info)
{ {
os_memset(&msg_dhcps, 0, sizeof(dhcps_msg)); struct netif * apnetif = (struct netif *)eagle_lwip_getif(0x01);
if(apnetif->dhcps_pcb != NULL) {
udp_remove(apnetif->dhcps_pcb);
}
pcb_dhcps = udp_new(); pcb_dhcps = udp_new();
if (pcb_dhcps == NULL || info ==NULL) { if (pcb_dhcps == NULL || info ==NULL) {
os_printf("dhcps_start(): could not obtain pcb\n"); os_printf("dhcps_start(): could not obtain pcb\n");
} }
apnetif->dhcps_pcb = pcb_dhcps;
IP4_ADDR(&broadcast_dhcps, 255, 255, 255, 255); IP4_ADDR(&broadcast_dhcps, 255, 255, 255, 255);
server_address = info->ip; 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; 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);
...@@ -784,8 +807,16 @@ void ICACHE_FLASH_ATTR dhcps_start(struct ip_info *info) ...@@ -784,8 +807,16 @@ void ICACHE_FLASH_ATTR dhcps_start(struct ip_info *info)
void ICACHE_FLASH_ATTR dhcps_stop(void) void ICACHE_FLASH_ATTR dhcps_stop(void)
{ {
struct netif * apnetif = (struct netif *)eagle_lwip_getif(0x01);
udp_disconnect(pcb_dhcps); udp_disconnect(pcb_dhcps);
udp_remove(pcb_dhcps); dhcps_lease_flag = true;
if(apnetif->dhcps_pcb != NULL) {
udp_remove(apnetif->dhcps_pcb);
apnetif->dhcps_pcb = NULL;
}
//udp_remove(pcb_dhcps);
list_node *pnode = NULL; list_node *pnode = NULL;
list_node *pback_node = NULL; list_node *pback_node = NULL;
pnode = plist; pnode = plist;
...@@ -800,42 +831,122 @@ void ICACHE_FLASH_ATTR dhcps_stop(void) ...@@ -800,42 +831,122 @@ void ICACHE_FLASH_ATTR dhcps_stop(void)
} }
} }
/******************************************************************************
* FunctionName : wifi_softap_set_dhcps_lease
* Description : set the lease information of DHCP server
* Parameters : please -- Additional argument to set the lease information,
* Little-Endian.
* Returns : true or false
*******************************************************************************/
bool ICACHE_FLASH_ATTR wifi_softap_set_dhcps_lease(struct dhcps_lease *please) bool ICACHE_FLASH_ATTR wifi_softap_set_dhcps_lease(struct dhcps_lease *please)
{ {
struct ip_info info; struct ip_info info;
uint32 softap_ip = 0; uint32 softap_ip = 0;
if (please == NULL) uint32 start_ip = 0;
uint32 end_ip = 0;
uint8 opmode = wifi_get_opmode();
if (opmode == STATION_MODE || opmode == NULL_MODE) {
return false;
}
if (please == NULL || wifi_softap_dhcps_status() == DHCP_STARTED)
return false; return false;
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);
please->start_ip = htonl(please->start_ip); start_ip = htonl(please->start_ip.addr);
please->end_ip = htonl(please->end_ip); end_ip = htonl(please->end_ip.addr);
/*config ip information can't contain local ip*/ /*config ip information can't contain local ip*/
if ((please->start_ip <= softap_ip) && (softap_ip <= please->end_ip)) if ((start_ip <= softap_ip) && (softap_ip <= end_ip))
return false; return false;
/*config ip information must be in the same segment as the local ip*/ /*config ip information must be in the same segment as the local ip*/
softap_ip >>= 8; softap_ip >>= 8;
if ((please->start_ip >> 8 != softap_ip) if ((start_ip >> 8 != softap_ip)
|| (please->end_ip >> 8 != softap_ip)) { || (end_ip >> 8 != softap_ip)) {
return false; return false;
} }
if (please->end_ip - please->start_ip > DHCPS_MAX_LEASE) if (end_ip - start_ip > DHCPS_MAX_LEASE)
return false; return false;
os_bzero(&dhcps_lease, sizeof(dhcps_lease)); os_bzero(&dhcps_lease, sizeof(dhcps_lease));
dhcps_lease.start_ip = please->start_ip; dhcps_lease.start_ip.addr = start_ip;
dhcps_lease.end_ip = please->end_ip; dhcps_lease.end_ip.addr = end_ip;
dhcps_lease_flag = false; dhcps_lease_flag = false;
return true; return true;
} }
/******************************************************************************
* FunctionName : wifi_softap_get_dhcps_lease
* Description : get the lease information of DHCP server
* Parameters : please -- Additional argument to get the lease information,
* Little-Endian.
* Returns : true or false
*******************************************************************************/
bool ICACHE_FLASH_ATTR wifi_softap_get_dhcps_lease(struct dhcps_lease *please)
{
uint8 opmode = wifi_get_opmode();
if (opmode == STATION_MODE || opmode == NULL_MODE) {
return false;
}
if (NULL == please)
return false;
if (dhcps_lease_flag){
if (wifi_softap_dhcps_status() == DHCP_STOPPED)
return false;
} else {
os_bzero(please, sizeof(dhcps_lease));
if (wifi_softap_dhcps_status() == DHCP_STOPPED){
please->start_ip.addr = htonl(dhcps_lease.start_ip.addr);
please->end_ip.addr = htonl(dhcps_lease.end_ip.addr);
}
}
if (wifi_softap_dhcps_status() == DHCP_STARTED){
os_bzero(please, sizeof(dhcps_lease));
please->start_ip.addr = dhcps_lease.start_ip.addr;
please->end_ip.addr = dhcps_lease.end_ip.addr;
}
return true;
}
static void ICACHE_FLASH_ATTR kill_oldest_dhcps_pool(void)
{
list_node *pre = NULL, *p = NULL;
list_node *minpre = NULL, *minp = NULL;
struct dhcps_pool *pdhcps_pool = NULL, *pmin_pool = NULL;
pre = plist;
p = pre->pnext;
minpre = pre;
minp = p;
while (p != NULL){
pdhcps_pool = p->pnode;
pmin_pool = minp->pnode;
if (pdhcps_pool->lease_timer < pmin_pool->lease_timer){
minp = p;
minpre = pre;
}
pre = p;
p = p->pnext;
}
minpre->pnext = minp->pnext;
os_free(minp->pnode);
minp->pnode = NULL;
os_free(minp);
minp = NULL;
}
void ICACHE_FLASH_ATTR dhcps_coarse_tmr(void) void ICACHE_FLASH_ATTR dhcps_coarse_tmr(void)
{ {
uint8 num_dhcps_pool = 0;
list_node *pback_node = NULL; list_node *pback_node = NULL;
list_node *pnode = NULL; list_node *pnode = NULL;
struct dhcps_pool *pdhcps_pool = NULL; struct dhcps_pool *pdhcps_pool = NULL;
...@@ -853,6 +964,33 @@ void ICACHE_FLASH_ATTR dhcps_coarse_tmr(void) ...@@ -853,6 +964,33 @@ void ICACHE_FLASH_ATTR dhcps_coarse_tmr(void)
pback_node = NULL; pback_node = NULL;
} else { } else {
pnode = pnode ->pnext; pnode = pnode ->pnext;
num_dhcps_pool ++;
}
} }
if (num_dhcps_pool >= MAX_STATION_NUM)
kill_oldest_dhcps_pool();
}
bool ICACHE_FLASH_ATTR wifi_softap_set_dhcps_offer_option(uint8 level, void* optarg)
{
bool offer_flag = true;
uint8 option = 0;
if (optarg == NULL && wifi_softap_dhcps_status() == false)
return false;
if (level <= OFFER_START || level >= OFFER_END)
return false;
switch (level){
case OFFER_ROUTER:
offer = (*(uint8 *)optarg) & 0x01;
offer_flag = true;
break;
default :
offer_flag = false;
break;
} }
return offer_flag;
} }
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment