diff --git a/app/Makefile b/app/Makefile index 341195f1..cfc62c29 100644 --- a/app/Makefile +++ b/app/Makefile @@ -56,6 +56,7 @@ LINKFLAGS_eagle.app.v6 = \ -u call_user_start \ -Wl,-static \ -Wl,--start-group \ + -lminic \ -lgcc \ -lhal \ -lphy \ diff --git a/app/user/user_main.c b/app/user/user_main.c index fa14a45d..b068bffe 100644 --- a/app/user/user_main.c +++ b/app/user/user_main.c @@ -17,8 +17,6 @@ #include "lwip/dns.h" #include "lwip/netdb.h" -#include "udhcp/dhcpd.h" - #define server_ip "192.168.101.142" #define server_port 9669 diff --git a/examples/smart_config/Makefile b/examples/smart_config/Makefile index a014c058..394feecf 100644 --- a/examples/smart_config/Makefile +++ b/examples/smart_config/Makefile @@ -56,6 +56,7 @@ LINKFLAGS_eagle.app.v6 = \ -u call_user_start \ -Wl,-static \ -Wl,--start-group \ + -lminic \ -lgcc \ -lhal \ -lphy \ @@ -65,7 +66,6 @@ LINKFLAGS_eagle.app.v6 = \ -lmain \ -lfreertos \ -llwip \ - -ludhcp \ -lsmartconfig \ $(DEP_LIBS_eagle.app.v6) \ -Wl,--end-group diff --git a/examples/smart_config/user/user_main.c b/examples/smart_config/user/user_main.c index 91b8e9c4..334dd9d4 100644 --- a/examples/smart_config/user/user_main.c +++ b/examples/smart_config/user/user_main.c @@ -17,8 +17,6 @@ #include "lwip/dns.h" #include "lwip/netdb.h" -#include "udhcp/dhcpd.h" - #define server_ip "192.168.101.142" #define server_port 9669 diff --git a/include/espressif/esp_softap.h b/include/espressif/esp_softap.h index e6f2a723..0078c486 100644 --- a/include/espressif/esp_softap.h +++ b/include/espressif/esp_softap.h @@ -6,6 +6,8 @@ #ifndef __ESP_SOFTAP_H__ #define __ESP_SOFTAP_H__ +#include "queue.h" + struct softap_config { uint8 ssid[32]; uint8 password[64]; @@ -17,6 +19,13 @@ struct softap_config { uint16 beacon_interval; }; +struct station_info { + STAILQ_ENTRY(station_info) next; + + u8 bssid[6]; + struct ip_addr ip; +}; + bool wifi_softap_get_config(struct softap_config *config); bool wifi_softap_get_config_default(struct softap_config *config); bool wifi_softap_set_config(struct softap_config *config); diff --git a/include/freertos/FreeRTOSConfig.h b/include/freertos/FreeRTOSConfig.h index 5c22444f..5cae6ecf 100644 --- a/include/freertos/FreeRTOSConfig.h +++ b/include/freertos/FreeRTOSConfig.h @@ -96,6 +96,7 @@ #define configCHECK_FOR_STACK_OVERFLOW 2 #define configUSE_MUTEXES 1 +#define configUSE_RECURSIVE_MUTEXES 1 #define configUSE_TIMERS 1 #if configUSE_TIMERS diff --git a/include/freertos/StackMacros.h b/include/freertos/StackMacros.h index 7fa9503c..467da7ea 100644 --- a/include/freertos/StackMacros.h +++ b/include/freertos/StackMacros.h @@ -134,7 +134,7 @@ #define taskSECOND_CHECK_FOR_STACK_OVERFLOW() \ { \ - static const unsigned char ucExpectedStackBytes[] = { tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, \ + static const unsigned char ucExpectedStackBytes[] ICACHE_RODATA_ATTR = { tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, \ tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, \ tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, \ tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, \ diff --git a/include/freertos/portmacro.h b/include/freertos/portmacro.h index 93f4e1b3..98f75c1e 100644 --- a/include/freertos/portmacro.h +++ b/include/freertos/portmacro.h @@ -178,13 +178,15 @@ void _xt_isr_mask (uint32 mask); uint32 _xt_read_ints (void); void _xt_clear_ints(uint32 mask); - /* interrupt related */ -typedef void (* _xt_isr)(void); - -void _xt_isr_attach (uint8 i, _xt_isr func); +typedef void (* _xt_isr)(void *arg); +void _xt_isr_attach (uint8 i, _xt_isr func, void *arg); +typedef struct _xt_isr_entry_ { + _xt_isr handler; + void * arg; +} _xt_isr_entry; #ifdef __cplusplus } diff --git a/include/lwip/lwip/err.h b/include/lwip/lwip/err.h index 837203d1..c1566b24 100644 --- a/include/lwip/lwip/err.h +++ b/include/lwip/lwip/err.h @@ -58,6 +58,22 @@ typedef s8_t err_t; #define ERR_VAL -6 /* Illegal value. */ #define ERR_WOULDBLOCK -7 /* Operation would block. */ #define ERR_USE -8 /* Address in use. */ + +#ifdef LWIP_ESP8266 +#define ERR_ALREADY -9 /* Already connected. */ +#define ERR_ISCONN -10 /* Conn already established.*/ + +#define ERR_IS_FATAL(e) ((e) < ERR_ISCONN) + +#define ERR_ABRT -11 /* Connection aborted. */ +#define ERR_RST -12 /* Connection reset. */ +#define ERR_CLSD -13 /* Connection closed. */ +#define ERR_CONN -14 /* Not connected. */ + +#define ERR_ARG -15 /* Illegal argument. */ + +#define ERR_IF -16 /* Low-level netif error */ +#else #define ERR_ISCONN -9 /* Already connected. */ #define ERR_IS_FATAL(e) ((e) < ERR_ISCONN) @@ -70,7 +86,7 @@ typedef s8_t err_t; #define ERR_ARG -14 /* Illegal argument. */ #define ERR_IF -15 /* Low-level netif error */ - +#endif #ifdef LWIP_DEBUG extern const char *lwip_strerr(err_t err); diff --git a/include/lwip/lwip/opt.h b/include/lwip/lwip/opt.h index 6f55d2a0..a768e544 100644 --- a/include/lwip/lwip/opt.h +++ b/include/lwip/lwip/opt.h @@ -1649,6 +1649,7 @@ #else #define LINK_STATS 0 +#define ETHARP_STATS 0 #define IP_STATS 0 #define IPFRAG_STATS 0 #define ICMP_STATS 0 diff --git a/include/lwip/lwipopts.h b/include/lwip/lwipopts.h index a465f5b8..4592bcfa 100644 --- a/include/lwip/lwipopts.h +++ b/include/lwip/lwipopts.h @@ -49,13 +49,13 @@ * MEMCPY: override this if you have a faster implementation at hand than the * one included in your C library */ -#define MEMCPY(dst,src,len) memcpy(dst,src,len) +#define MEMCPY(dst,src,len) ets_memcpy(dst,src,len) /** * SMEMCPY: override this with care! Some compilers (e.g. gcc) can inline a * call to memcpy() if the length is known at compile time and is small. */ -#define SMEMCPY(dst,src,len) memcpy(dst,src,len) +#define SMEMCPY(dst,src,len) ets_memcpy(dst,src,len) /* ------------------------------------ @@ -135,7 +135,7 @@ * that this option does not affect incoming packet sizes, which can be * controlled via IP_REASSEMBLY. */ -#define IP_FRAG 1 +#define IP_FRAG 0 /** * IP_REASS_MAXAGE: Maximum time (in multiples of IP_TMR_INTERVAL - so seconds, normally) @@ -278,6 +278,13 @@ ---------- Thread options ---------- ------------------------------------ */ +/** + * TCPIP_THREAD_NAME: The name assigned to the main tcpip thread. + */ +#ifndef TCPIP_THREAD_NAME +#define TCPIP_THREAD_NAME "tiT" +#endif + /** * TCPIP_THREAD_STACKSIZE: The stack size used by the main tcpip thread. * The stack size value itself is platform-dependent, but is passed to @@ -325,6 +332,11 @@ ---------- Sequential layer options ---------- ---------------------------------------------- */ +/** + * LWIP_TCPIP_CORE_LOCKING: (EXPERIMENTAL!) + * Don't use it if you're not an active lwIP project member + */ +#define LWIP_TCPIP_CORE_LOCKING 1 /* ------------------------------------ @@ -365,6 +377,12 @@ ---------- Statistics options ---------- ---------------------------------------- */ +/** + * LWIP_STATS==1: Enable statistics collection in lwip_stats. + */ +#ifndef LWIP_STATS +#define LWIP_STATS 0 +#endif /* --------------------------------- diff --git a/include/udhcp/common.h b/include/udhcp/common.h deleted file mode 100644 index 4b6ee572..00000000 --- a/include/udhcp/common.h +++ /dev/null @@ -1,434 +0,0 @@ -/* vi: set sw=4 ts=4: */ -/* - * Russ Dill September 2001 - * Rewritten by Vladimir Oleynik (C) 2003 - * - * Licensed under GPLv2 or later, see file LICENSE in this source tree. - */ -#ifndef UDHCP_COMMON_H -#define UDHCP_COMMON_H 1 - -#include "esp_common.h" - -#include "lwip/sockets.h" - -//PUSH_AND_SET_FUNCTION_VISIBILITY_TO_HIDDEN - -extern const uint8_t MAC_BCAST_ADDR[6]; /* six all-ones */ - -#ifndef BUFSIZ -# define BUFSIZ 1024 -#endif - -typedef int smallint; -typedef unsigned smalluint; - -/* Providing hard guarantee on minimum size (think of BUFSIZ == 128) */ -enum { COMMON_BUFSIZE = (BUFSIZ >= 256*sizeof(void*) ? BUFSIZ+1 : 256*sizeof(void*)) }; -extern char bb_common_bufsiz1[COMMON_BUFSIZE]; - -/* In this form code with pipes is much more readable */ -struct fd_pair { int rd; int wr; }; - -/* Having next pointer as a first member allows easy creation - * of "llist-compatible" structs, and using llist_FOO functions - * on them. - */ -typedef struct llist_t { - struct llist_t *link; - char *data; -} llist_t; - -void llist_add_to(llist_t **old_head, void *data); -void llist_add_to_end(llist_t **list_head, void *data); -void *llist_pop(llist_t **elm); -void llist_unlink(llist_t **head, llist_t *elm); -void llist_free(llist_t *elm, void (*freeit)(void *data)); -llist_t *llist_rev(llist_t *list); -llist_t *llist_find_str(llist_t *first, const char *str); - -//unsigned long long monotonic_ns(void); -//unsigned long long monotonic_us(void); -//unsigned long long monotonic_ms(void); -unsigned monotonic_sec(void); - -/* performs reasonably well (gcc usually inlines memcpy here) */ -# define move_from_unaligned_int(v, intp) (memcpy(&(v), (intp), sizeof(int))) -# define move_from_unaligned_long(v, longp) (memcpy(&(v), (longp), sizeof(long))) -# define move_from_unaligned16(v, u16p) (memcpy(&(v), (u16p), 2)) -# define move_from_unaligned32(v, u32p) (memcpy(&(v), (u32p), 4)) -# define move_to_unaligned16(u16p, v) do { \ - uint16_t __t = (v); \ - memcpy((u16p), &__t, 2); \ -} while (0) -# define move_to_unaligned32(u32p, v) do { \ - uint32_t __t = (v); \ - memcpy((u32p), &__t, 4); \ -} while (0) - -enum { wrote_pidfile = 0 }; -#define write_pidfile(path) ((void)0) -#define remove_pidfile(path) ((void)0) - -#ifndef ENABLE_FEATURE_UDHCP_8021Q -#define ENABLE_FEATURE_UDHCP_8021Q 0 -#endif - -#ifndef ENABLE_FEATURE_UDHCP_RFC3397 -#define ENABLE_FEATURE_UDHCP_RFC3397 0 -#endif - -#ifndef ENABLE_LONG_OPTS -#define ENABLE_LONG_OPTS 0 -#endif - -#ifndef ENABLE_FEATURE_UDHCPC_ARPING -#define ENABLE_FEATURE_UDHCPC_ARPING 0 -#endif - -#ifndef ENABLE_FEATURE_UDHCP_PORT -#define ENABLE_FEATURE_UDHCP_PORT 0 -#endif - -#ifndef ENABLE_FEATURE_UDHCPD_BASE_IP_ON_MAC -#define ENABLE_FEATURE_UDHCPD_BASE_IP_ON_MAC 0 -#endif - -#ifndef ENABLE_NOMMU -#define ENABLE_NOMMU 0 -#endif - -#ifndef ENABLE_FEATURE_IPV6 -#define ENABLE_FEATURE_IPV6 0 -#endif - -#ifndef ENABLE_FEATURE_UDHCPD_WRITE_LEASES_EARLY -#define ENABLE_FEATURE_UDHCPD_WRITE_LEASES_EARLY 0 -#endif - -/* - * For 0.9.29 and svn, __ARCH_USE_MMU__ indicates no-mmu reliably. - * For earlier versions there is no reliable way to check if we are building - * for a mmu-less system. - */ -#if ENABLE_NOMMU -# define BB_MMU 0 -# define USE_FOR_NOMMU(...) __VA_ARGS__ -# define USE_FOR_MMU(...) -#else -# define BB_MMU 1 -# define USE_FOR_NOMMU(...) -# define USE_FOR_MMU(...) __VA_ARGS__ -#endif - -#define ARRAY_SIZE(x) ((unsigned)(sizeof(x) / sizeof((x)[0]))) - -/*** DHCP packet ***/ - -/* DHCP protocol. See RFC 2131 */ -#define DHCP_MAGIC 0x63825363 -#define DHCP_OPTIONS_BUFSIZE 308 -#define BOOTREQUEST 1 -#define BOOTREPLY 2 - -//TODO: rename ciaddr/yiaddr/chaddr -struct dhcp_packet { - uint8_t op; /* BOOTREQUEST or BOOTREPLY */ - uint8_t htype; /* hardware address type. 1 = 10mb ethernet */ - uint8_t hlen; /* hardware address length */ - uint8_t hops; /* used by relay agents only */ - uint32_t xid; /* unique id */ - uint16_t secs; /* elapsed since client began acquisition/renewal */ - uint16_t flags; /* only one flag so far: */ -#define BROADCAST_FLAG 0x8000 /* "I need broadcast replies" */ - uint32_t ciaddr; /* client IP (if client is in BOUND, RENEW or REBINDING state) */ - uint32_t yiaddr; /* 'your' (client) IP address */ - /* IP address of next server to use in bootstrap, returned in DHCPOFFER, DHCPACK by server */ - uint32_t siaddr_nip; - uint32_t gateway_nip; /* relay agent IP address */ - uint8_t chaddr[16]; /* link-layer client hardware address (MAC) */ - uint8_t sname[64]; /* server host name (ASCIZ) */ - uint8_t file[128]; /* boot file name (ASCIZ) */ - uint32_t cookie; /* fixed first four option bytes (99,130,83,99 dec) */ - uint8_t options[DHCP_OPTIONS_BUFSIZE];// + CONFIG_UDHCPC_SLACK_FOR_BUGGY_SERVERS]; -}; - -#define DHCP_PKT_SNAME_LEN 64 -#define DHCP_PKT_FILE_LEN 128 -#define DHCP_PKT_SNAME_LEN_STR "64" -#define DHCP_PKT_FILE_LEN_STR "128" - -//struct ip_udp_dhcp_packet { -// struct ip_hdr ip; -// struct udp_hdr udp; -// struct dhcp_packet data; -//}; -// -//struct udp_dhcp_packet { -// struct udp_hdr udp; -// struct dhcp_packet data; -//}; - -enum { -// IP_UDP_DHCP_SIZE = sizeof(struct ip_udp_dhcp_packet),// - CONFIG_UDHCPC_SLACK_FOR_BUGGY_SERVERS, -// UDP_DHCP_SIZE = sizeof(struct udp_dhcp_packet),// - CONFIG_UDHCPC_SLACK_FOR_BUGGY_SERVERS, - DHCP_SIZE = sizeof(struct dhcp_packet),// - CONFIG_UDHCPC_SLACK_FOR_BUGGY_SERVERS, -}; - -/* Let's see whether compiler understood us right */ -//struct BUG_bad_sizeof_struct_ip_udp_dhcp_packet { -// char c[IP_UDP_DHCP_SIZE == 576 ? 1 : -1]; -//}; - - -/*** Options ***/ - -enum { - OPTION_IP = 1, - OPTION_IP_PAIR, - OPTION_STRING, - /* Opts of STRING_HOST type will be sanitized before they are passed - * to udhcpc script's environment: */ - OPTION_STRING_HOST, -// OPTION_BOOLEAN, - OPTION_U8, - OPTION_U16, -// OPTION_S16, - OPTION_U32, - OPTION_S32, - OPTION_BIN, - OPTION_STATIC_ROUTES, - OPTION_6RD, -#if ENABLE_FEATURE_UDHCP_RFC3397 - OPTION_DNS_STRING, /* RFC1035 compressed domain name list */ - OPTION_SIP_SERVERS, -#endif - - OPTION_TYPE_MASK = 0x0f, - /* Client requests this option by default */ - OPTION_REQ = 0x10, - /* There can be a list of 1 or more of these */ - OPTION_LIST = 0x20, -}; - -/* DHCP option codes (partial list). See RFC 2132 and - * http://www.iana.org/assignments/bootp-dhcp-parameters/ - * Commented out options are handled by common option machinery, - * uncommented ones have special cases (grep for them to see). - */ -#define DHCP_PADDING 0x00 -#define DHCP_SUBNET 0x01 -//#define DHCP_TIME_OFFSET 0x02 /* (localtime - UTC_time) in seconds. signed */ -#define DHCP_ROUTER 0x03 -//#define DHCP_TIME_SERVER 0x04 /* RFC 868 time server (32-bit, 0 = 1.1.1900) */ -//#define DHCP_NAME_SERVER 0x05 /* IEN 116 _really_ ancient kind of NS */ -//#define DHCP_DNS_SERVER 0x06 -//#define DHCP_LOG_SERVER 0x07 /* port 704 UDP log (not syslog) -//#define DHCP_COOKIE_SERVER 0x08 /* "quote of the day" server */ -//#define DHCP_LPR_SERVER 0x09 -#define DHCP_HOST_NAME 0x0c /* either client informs server or server gives name to client */ -//#define DHCP_BOOT_SIZE 0x0d -//#define DHCP_DOMAIN_NAME 0x0f /* server gives domain suffix */ -//#define DHCP_SWAP_SERVER 0x10 -//#define DHCP_ROOT_PATH 0x11 -//#define DHCP_IP_TTL 0x17 -//#define DHCP_MTU 0x1a -//#define DHCP_BROADCAST 0x1c -//#define DHCP_ROUTES 0x21 -//#define DHCP_NIS_DOMAIN 0x28 -//#define DHCP_NIS_SERVER 0x29 -//#define DHCP_NTP_SERVER 0x2a -//#define DHCP_WINS_SERVER 0x2c -#define DHCP_REQUESTED_IP 0x32 /* sent by client if specific IP is wanted */ -#define DHCP_LEASE_TIME 0x33 -#define DHCP_OPTION_OVERLOAD 0x34 -#define DHCP_MESSAGE_TYPE 0x35 -#define DHCP_SERVER_ID 0x36 /* by default server's IP */ -#define DHCP_PARAM_REQ 0x37 /* list of options client wants */ -//#define DHCP_ERR_MESSAGE 0x38 /* error message when sending NAK etc */ -#define DHCP_MAX_SIZE 0x39 -#define DHCP_VENDOR 0x3c /* client's vendor (a string) */ -#define DHCP_CLIENT_ID 0x3d /* by default client's MAC addr, but may be arbitrarily long */ -//#define DHCP_TFTP_SERVER_NAME 0x42 /* same as 'sname' field */ -//#define DHCP_BOOT_FILE 0x43 /* same as 'file' field */ -//#define DHCP_USER_CLASS 0x4d /* RFC 3004. set of LASCII strings. "I am a printer" etc */ -#define DHCP_FQDN 0x51 /* client asks to update DNS to map its FQDN to its new IP */ -//#define DHCP_DOMAIN_SEARCH 0x77 /* RFC 3397. set of ASCIZ string, DNS-style compressed */ -//#define DHCP_SIP_SERVERS 0x78 /* RFC 3361. flag byte, then: 0: domain names, 1: IP addrs */ -//#define DHCP_STATIC_ROUTES 0x79 /* RFC 3442. (mask,ip,router) tuples */ -//#define DHCP_VLAN_ID 0x84 /* 802.1P VLAN ID */ -//#define DHCP_VLAN_PRIORITY 0x85 /* 802.1Q VLAN priority */ -//#define DHCP_PXE_CONF_FILE 0xd1 /* RFC 5071 Configuration File */ -//#define DHCP_MS_STATIC_ROUTES 0xf9 /* Microsoft's pre-RFC 3442 code for 0x79? */ -//#define DHCP_WPAD 0xfc /* MSIE's Web Proxy Autodiscovery Protocol */ -#define DHCP_END 0xff - -/* Offsets in option byte sequence */ -#define OPT_CODE 0 -#define OPT_LEN 1 -#define OPT_DATA 2 -/* Bits in "overload" option */ -#define OPTION_FIELD 0 -#define FILE_FIELD 1 -#define SNAME_FIELD 2 - -/* DHCP_MESSAGE_TYPE values */ -#define DHCPDISCOVER 1 /* client -> server */ -#define DHCPOFFER 2 /* client <- server */ -#define DHCPREQUEST 3 /* client -> server */ -#define DHCPDECLINE 4 /* client -> server */ -#define DHCPACK 5 /* client <- server */ -#define DHCPNAK 6 /* client <- server */ -#define DHCPRELEASE 7 /* client -> server */ -#define DHCPINFORM 8 /* client -> server */ -#define DHCP_MINTYPE DHCPDISCOVER -#define DHCP_MAXTYPE DHCPINFORM - -struct dhcp_optflag { - uint8_t flags; - uint8_t code; -}; - -struct option_set { - uint8_t *data; - struct option_set *next; -}; - -extern const struct dhcp_optflag dhcp_optflags[]; -extern const char dhcp_option_strings[]; -extern const uint8_t dhcp_option_lengths[]; - -unsigned udhcp_option_idx(const char *name); - -uint8_t *udhcp_get_option(struct dhcp_packet *packet, int code); -int udhcp_end_option(uint8_t *optionptr); -void udhcp_add_binary_option(struct dhcp_packet *packet, uint8_t *addopt); -void udhcp_add_simple_option(struct dhcp_packet *packet, uint8_t code, uint32_t data); -#if ENABLE_FEATURE_UDHCP_RFC3397 -char *dname_dec(const uint8_t *cstr, int clen, const char *pre); -uint8_t *dname_enc(const uint8_t *cstr, int clen, const char *src, int *retlen); -#endif -struct option_set *udhcp_find_option(struct option_set *opt_list, uint8_t code); - - -// RFC 2131 Table 5: Fields and options used by DHCP clients -// -// Fields 'hops', 'yiaddr', 'siaddr', 'giaddr' are always zero -// -// Field DHCPDISCOVER DHCPINFORM DHCPREQUEST DHCPDECLINE DHCPRELEASE -// ----- ------------ ------------ ----------- ----------- ----------- -// 'xid' selected by client selected by client 'xid' from server selected by client selected by client -// DHCPOFFER message -// 'secs' 0 or seconds since 0 or seconds since 0 or seconds since 0 0 -// DHCP process started DHCP process started DHCP process started -// 'flags' Set 'BROADCAST' Set 'BROADCAST' Set 'BROADCAST' 0 0 -// flag if client flag if client flag if client -// requires broadcast requires broadcast requires broadcast -// reply reply reply -// 'ciaddr' 0 client's IP 0 or client's IP 0 client's IP -// (BOUND/RENEW/REBIND) -// 'chaddr' client's MAC client's MAC client's MAC client's MAC client's MAC -// 'sname' options or sname options or sname options or sname (unused) (unused) -// 'file' options or file options or file options or file (unused) (unused) -// 'options' options options options message type opt message type opt -// -// Option DHCPDISCOVER DHCPINFORM DHCPREQUEST DHCPDECLINE DHCPRELEASE -// ------ ------------ ---------- ----------- ----------- ----------- -// Requested IP address MAY MUST NOT MUST (in MUST MUST NOT -// SELECTING or -// INIT-REBOOT) -// MUST NOT (in -// BOUND or -// RENEWING) -// IP address lease time MAY MUST NOT MAY MUST NOT MUST NOT -// Use 'file'/'sname' fields MAY MAY MAY MAY MAY -// Client identifier MAY MAY MAY MAY MAY -// Vendor class identifier MAY MAY MAY MUST NOT MUST NOT -// Server identifier MUST NOT MUST NOT MUST (after MUST MUST -// SELECTING) -// MUST NOT (after -// INIT-REBOOT, -// BOUND, RENEWING -// or REBINDING) -// Parameter request list MAY MAY MAY MUST NOT MUST NOT -// Maximum message size MAY MAY MAY MUST NOT MUST NOT -// Message SHOULD NOT SHOULD NOT SHOULD NOT SHOULD SHOULD -// Site-specific MAY MAY MAY MUST NOT MUST NOT -// All others MAY MAY MAY MUST NOT MUST NOT - - -/*** Logging ***/ - -#if defined CONFIG_UDHCP_DEBUG && CONFIG_UDHCP_DEBUG >= 1 -# define IF_UDHCP_VERBOSE(...) __VA_ARGS__ -extern unsigned dhcp_verbose; -# define log1(...) do { if (dhcp_verbose >= 1) bb_info_msg(__VA_ARGS__); } while (0) -# if CONFIG_UDHCP_DEBUG >= 2 -void udhcp_dump_packet(struct dhcp_packet *packet) FAST_FUNC; -# define log2(...) do { if (dhcp_verbose >= 2) bb_info_msg(__VA_ARGS__); } while (0) -# else -# define udhcp_dump_packet(...) ((void)0) -# define log2(...) ((void)0) -# endif -# if CONFIG_UDHCP_DEBUG >= 3 -# define log3(...) do { if (dhcp_verbose >= 3) bb_info_msg(__VA_ARGS__); } while (0) -# else -# define log3(...) ((void)0) -# endif -#else -# define IF_UDHCP_VERBOSE(...) -# define udhcp_dump_packet(...) ((void)0) -# define log1(...) ((void)0) -# define log2(...) ((void)0) -# define log3(...) ((void)0) -#endif - -//#define UDHCP_DBG - -#ifdef UDHCP_DBG -#define UDHCP_DEBUG os_printf -#else -#define UDHCP_DEBUG(...) -#endif - -/*** Other shared functions ***/ - -/* 2nd param is "uint32_t*" */ -int udhcp_str2nip(const char *str, void *arg); -/* 2nd param is "struct option_set**" */ -int udhcp_str2optset(const char *str, void *arg); - -void udhcp_init_header(struct dhcp_packet *packet, char type); - -int udhcp_recv_kernel_packet(struct dhcp_packet *packet, int fd); - -//int udhcp_send_raw_packet(struct dhcp_packet *dhcp_pkt, -// uint32_t source_nip, int source_port, -// uint32_t dest_nip, int dest_port, const uint8_t *dest_arp, -// int ifindex); - -int udhcp_send_kernel_packet(struct dhcp_packet *dhcp_pkt, - uint32_t source_nip, int source_port, - uint32_t dest_nip, int dest_port); - -void udhcp_sp_setup(void); -int udhcp_sp_fd_set(fd_set *rfds, int extra_fd); -int udhcp_sp_read(const fd_set *rfds); - -int udhcp_read_interface(const char *interface, int *ifindex, uint32_t *nip, uint8_t *mac); - -int udhcp_listen_socket(/*uint32_t ip,*/ int port, const char *inf); - -/* Returns 1 if no reply received */ -int arpping(uint32_t test_nip, - const uint8_t *safe_mac, - uint32_t from_ip, - uint8_t *from_mac, - const char *interface); - -/* note: ip is a pointer to an IPv6 in network order, possibly misaliged */ -int sprint_nip6(char *dest, /*const char *pre,*/ const uint8_t *ip); - -//POP_SAVED_FUNCTION_VISIBILITY - -#endif diff --git a/include/udhcp/dhcpc.h b/include/udhcp/dhcpc.h deleted file mode 100644 index 1896d40d..00000000 --- a/include/udhcp/dhcpc.h +++ /dev/null @@ -1,42 +0,0 @@ -/* vi: set sw=4 ts=4: */ -/* - * Licensed under GPLv2, see file LICENSE in this source tree. - */ -#ifndef UDHCP_DHCPC_H -#define UDHCP_DHCPC_H 1 - -//PUSH_AND_SET_FUNCTION_VISIBILITY_TO_HIDDEN - -struct client_config_t { - uint8_t client_mac[6]; /* Our mac address */ -// IF_FEATURE_UDHCP_PORT(uint16_t port;) - int ifindex; /* Index number of the interface to use */ - uint8_t opt_mask[256 / 8]; /* Bitmask of options to send (-O option) */ - const char *interface; /* The name of the interface to use */ - char *pidfile; /* Optionally store the process ID */ - const char *script; /* User script to run at dhcp events */ - struct option_set *options; /* list of DHCP options to send to server */ - uint8_t *clientid; /* Optional client id to use */ - uint8_t *vendorclass; /* Optional vendor class-id to use */ - uint8_t *hostname; /* Optional hostname to use */ - uint8_t *fqdn; /* Optional fully qualified domain name to use */ - - uint16_t first_secs; - uint16_t last_secs; -}; - -/* server_config sits in 1st half of bb_common_bufsiz1 */ -#define client_config (*(struct client_config_t*)(&bb_common_bufsiz1[COMMON_BUFSIZE / 2])) - -#if ENABLE_FEATURE_UDHCP_PORT -#define CLIENT_PORT (client_config.port) -#define CLIENT_PORT6 (client_config.port) -#else -#define CLIENT_PORT 68 -#define CLIENT_PORT6 546 -#endif - -//POP_SAVED_FUNCTION_VISIBILITY - -#endif - diff --git a/include/udhcp/dhcpd.h b/include/udhcp/dhcpd.h deleted file mode 100644 index 7524d37b..00000000 --- a/include/udhcp/dhcpd.h +++ /dev/null @@ -1,146 +0,0 @@ -/* vi: set sw=4 ts=4: */ -/* - * Licensed under GPLv2, see file LICENSE in this source tree. - */ -#ifndef UDHCP_DHCPD_H -#define UDHCP_DHCPD_H 1 - -//PUSH_AND_SET_FUNCTION_VISIBILITY_TO_HIDDEN - -/* Defaults you may want to tweak */ -/* Default max_lease_sec */ -#define DEFAULT_LEASE_TIME (60*60*24 * 10) -#define LEASES_FILE CONFIG_DHCPD_LEASES_FILE -/* Where to find the DHCP server configuration file */ -#define DHCPD_CONF_FILE "/etc/udhcpd.conf" - -#ifndef ENABLE_FEATURE_UDHCP_PORT -#define ENABLE_FEATURE_UDHCP_PORT 0 -#endif - -struct static_lease { - struct static_lease *next; - uint32_t nip; - uint8_t mac[6]; -}; - -struct server_config_t { - char *interface; /* interface to use */ -//TODO: ifindex, server_nip, server_mac -// are obtained from interface name. -// Instead of querying them *once*, create update_server_network_data_cache() -// and call it before any usage of these fields. -// update_server_network_data_cache() must re-query data -// if more than N seconds have passed after last use. - int ifindex; - uint32_t server_nip; -#if ENABLE_FEATURE_UDHCP_PORT - uint16_t port; -#endif - uint8_t server_mac[6]; /* our MAC address (used only for ARP probing) */ - struct option_set *options; /* list of DHCP options loaded from the config file */ - /* start,end are in host order: we need to compare start <= ip <= end */ - uint32_t start_ip; /* start address of leases, in host order */ - uint32_t end_ip; /* end of leases, in host order */ - uint32_t max_lease_sec; /* maximum lease time (host order) */ - uint32_t min_lease_sec; /* minimum lease time a client can request */ - uint32_t max_leases; /* maximum number of leases (including reserved addresses) */ - uint32_t auto_time; /* how long should udhcpd wait before writing a config file. - * if this is zero, it will only write one on SIGUSR1 */ - uint32_t decline_time; /* how long an address is reserved if a client returns a - * decline message */ - uint32_t conflict_time; /* how long an arp conflict offender is leased for */ - uint32_t offer_time; /* how long an offered address is reserved */ - uint32_t siaddr_nip; /* "next server" bootp option */ - char *lease_file; - char *pidfile; - char *notify_file; /* what to run whenever leases are written */ - char *sname; /* bootp server name */ - char *boot_file; /* bootp boot file option */ - struct static_lease *static_leases; /* List of ip/mac pairs to assign static leases */ -}; - -#define server_config (*(struct server_config_t*)&bb_common_bufsiz1) -/* client_config sits in 2nd half of bb_common_bufsiz1 */ - -#if ENABLE_FEATURE_UDHCP_PORT -#define SERVER_PORT (server_config.port) -#define SERVER_PORT6 (server_config.port) -#else -#define SERVER_PORT 67 -#define SERVER_PORT6 547 -#endif - - -typedef uint32_t leasetime_t; -typedef sint32_t signed_leasetime_t; - -struct dyn_lease { - /* Unix time when lease expires. Kept in memory in host order. - * When written to file, converted to network order - * and adjusted (current time subtracted) */ - leasetime_t expires; - /* "nip": IP in network order */ - uint32_t lease_nip; - /* We use lease_mac[6], since e.g. ARP probing uses - * only 6 first bytes anyway. We check received dhcp packets - * that their hlen == 6 and thus chaddr has only 6 significant bytes - * (dhcp packet has chaddr[16], not [6]) - */ - uint8_t lease_mac[6]; - char hostname[20]; - uint8_t pad[2]; - /* total size is a multiply of 4 */ -}; - -extern struct dyn_lease *g_leases; - -struct dyn_lease *add_lease( - const uint8_t *chaddr, uint32_t yiaddr, - leasetime_t leasetime, - const char *hostname, int hostname_len - ); -int is_expired_lease(struct dyn_lease *lease); -struct dyn_lease *find_lease_by_mac(const uint8_t *mac); -struct dyn_lease *find_lease_by_nip(uint32_t nip); -uint32_t find_free_or_expired_nip(const uint8_t *safe_mac); - - -/* Config file parser will pass static lease info to this function - * which will add it to a data structure that can be searched later */ -void add_static_lease(struct static_lease **st_lease_pp, uint8_t *mac, uint32_t nip); -/* Find static lease IP by mac */ -uint32_t get_static_nip_by_mac(struct static_lease *st_lease, void *arg); -/* Check to see if an IP is reserved as a static IP */ -int is_nip_reserved(struct static_lease *st_lease, uint32_t nip); -/* Print out static leases just to check what's going on (debug code) */ -#ifdef UDHCP_DBG -void log_static_leases(struct static_lease **st_lease_pp); -#else -# define log_static_leases(st_lease_pp) ((void)0) -#endif - -struct dhcp_info{ - /* start,end are in host order: we need to compare start <= ip <= end */ - uint32_t start_ip; /* start address of leases, in host order */ - uint32_t end_ip; /* end of leases, in host order */ - - uint32_t max_leases; /* maximum number of leases (including reserved addresses) */ - uint32_t auto_time; /* how long should udhcpd wait before writing a config file. - * if this is zero, it will only write one on SIGUSR1 */ - uint32_t decline_time; /* how long an address is reserved if a client returns a - * decline message */ - uint32_t conflict_time; /* how long an arp conflict offender is leased for */ - uint32_t offer_time; /* how long an offered address is reserved */ - uint32_t max_lease_sec; /* maximum lease time (host order) */ - uint32_t min_lease_sec; /* minimum lease time a client can request */ -}; - -void read_config(const char *file); -void write_leases(void); -void read_leases(const char *file); - -void udhcpd_start(void); -//POP_SAVED_FUNCTION_VISIBILITY - -#endif diff --git a/ld/eagle.rom.addr.v6.ld b/ld/eagle.rom.addr.v6.ld index bb75518d..ff595a73 100644 --- a/ld/eagle.rom.addr.v6.ld +++ b/ld/eagle.rom.addr.v6.ld @@ -40,15 +40,15 @@ PROVIDE ( __umoddi3 = 0x4000d770 ); PROVIDE ( __umodsi3 = 0x4000e268 ); PROVIDE ( __umulsidi3 = 0x4000dcf0 ); -PROVIDE ( bzero = 0x40002ae8 ); -PROVIDE ( memcmp = 0x400018d4 ); -PROVIDE ( memcpy = 0x400018b4 ); -PROVIDE ( memmove = 0x400018c4 ); -PROVIDE ( memset = 0x400018a4 ); +PROVIDE ( ets_bzero = 0x40002ae8 ); +PROVIDE ( ets_memcmp = 0x400018d4 ); +PROVIDE ( ets_memcpy = 0x400018b4 ); +PROVIDE ( ets_memmove = 0x400018c4 ); +PROVIDE ( ets_memset = 0x400018a4 ); -PROVIDE ( strcmp = 0x40002aa8 ); -PROVIDE ( strcpy = 0x40002a88 ); -PROVIDE ( strlen = 0x40002ac8 ); -PROVIDE ( strncmp = 0x40002ab8 ); -PROVIDE ( strncpy = 0x40002a98 ); -PROVIDE ( strstr = 0x40002ad8 ); +PROVIDE ( ets_strcmp = 0x40002aa8 ); +PROVIDE ( ets_strcpy = 0x40002a88 ); +PROVIDE ( ets_strlen = 0x40002ac8 ); +PROVIDE ( ets_strncmp = 0x40002ab8 ); +PROVIDE ( ets_strncpy = 0x40002a98 ); +PROVIDE ( ets_strstr = 0x40002ad8 ); diff --git a/lib/libcirom.a b/lib/libcirom.a new file mode 100644 index 00000000..ebf17ef4 Binary files /dev/null and b/lib/libcirom.a differ diff --git a/lib/libfreertos.a b/lib/libfreertos.a index ef3ad901..da8f12aa 100644 Binary files a/lib/libfreertos.a and b/lib/libfreertos.a differ diff --git a/lib/libjson.a b/lib/libjson.a index 4aec12f1..d31a2ef4 100644 Binary files a/lib/libjson.a and b/lib/libjson.a differ diff --git a/lib/liblwip.a b/lib/liblwip.a index 7529eb4a..f6325745 100644 Binary files a/lib/liblwip.a and b/lib/liblwip.a differ diff --git a/lib/libmain.a b/lib/libmain.a index 1e9e46ae..34d73d39 100644 Binary files a/lib/libmain.a and b/lib/libmain.a differ diff --git a/lib/libminic.a b/lib/libminic.a new file mode 100644 index 00000000..0179c877 Binary files /dev/null and b/lib/libminic.a differ diff --git a/lib/libnet80211.a b/lib/libnet80211.a index 598fd48a..e9d7fd76 100644 Binary files a/lib/libnet80211.a and b/lib/libnet80211.a differ diff --git a/lib/libpp.a b/lib/libpp.a index 2dd87eed..f7db8737 100644 Binary files a/lib/libpp.a and b/lib/libpp.a differ diff --git a/lib/libsmartconfig.a b/lib/libsmartconfig.a index a770dce6..c596b720 100644 Binary files a/lib/libsmartconfig.a and b/lib/libsmartconfig.a differ diff --git a/lib/libssl.a b/lib/libssl.a index e81cf91f..db026bee 100644 Binary files a/lib/libssl.a and b/lib/libssl.a differ diff --git a/lib/libwpa.a b/lib/libwpa.a index e59cc511..e25686e4 100644 Binary files a/lib/libwpa.a and b/lib/libwpa.a differ diff --git a/third_party/freertos/heap_4.c b/third_party/freertos/heap_4.c index 51eae949..a9ecf85d 100644 --- a/third_party/freertos/heap_4.c +++ b/third_party/freertos/heap_4.c @@ -127,7 +127,7 @@ static void prvHeapInit( void ); /* The size of the structure placed at the beginning of each allocated memory block must by correctly byte aligned. */ -static const unsigned short heapSTRUCT_SIZE = ( ( sizeof ( xBlockLink ) + ( portBYTE_ALIGNMENT - 1 ) ) & ~portBYTE_ALIGNMENT_MASK ); +static const size_t heapSTRUCT_SIZE ICACHE_RODATA_ATTR = ( ( sizeof ( xBlockLink ) + ( portBYTE_ALIGNMENT - 1 ) ) & ~portBYTE_ALIGNMENT_MASK ); /* Ensure the pxEnd pointer will end up on the correct byte alignment. */ //static const size_t xTotalHeapSize = ( ( size_t ) heapADJUSTED_HEAP_SIZE ) & ( ( size_t ) ~portBYTE_ALIGNMENT_MASK ); @@ -317,7 +317,7 @@ void *pvPortCalloc(size_t count, size_t size) p = pvPortMalloc(count * size); if (p) { /* zero the memory */ - memset(p, 0, count * size); + ets_memset(p, 0, count * size); } return p; } @@ -341,7 +341,7 @@ void *pvPortRealloc(void *mem, size_t newsize) p = pvPortMalloc(newsize); if (p) { /* zero the memory */ - memcpy(p, mem, newsize); + ets_memcpy(p, mem, newsize); vPortFree(mem); } return p; @@ -351,13 +351,15 @@ void *realloc(void *ptr, size_t nbytes) __attribute__((alias("pvPortRealloc"))); /*-----------------------------------------------------------*/ -size_t xPortGetFreeHeapSize( void ) +size_t ICACHE_FLASH_ATTR +xPortGetFreeHeapSize( void ) { return xFreeBytesRemaining; } /*-----------------------------------------------------------*/ -void vPortInitialiseBlocks( void ) +void ICACHE_FLASH_ATTR +vPortInitialiseBlocks( void ) { /* This just exists to keep the linker quiet. */ } diff --git a/third_party/freertos/port.c b/third_party/freertos/port.c index fee9337d..8b135d1e 100644 --- a/third_party/freertos/port.c +++ b/third_party/freertos/port.c @@ -184,7 +184,7 @@ GPIOIntrHdl(void) } } #else -void SoftIsrHdl(void) +void SoftIsrHdl(void *arg) { //if(DbgVal5==1) //printf("GP_%d,",SWReq); @@ -228,18 +228,18 @@ xPortStartScheduler( void ) //pendsv setting /*******GPIO sdio_clk isr*********/ #if 0 - _xt_isr_attach(ETS_GPIO_INUM, GPIOIntrHdl); + _xt_isr_attach(ETS_GPIO_INUM, GPIOIntrHdl, NULL); _xt_isr_unmask(1<