mirror of
https://github.com/nodemcu/nodemcu-firmware.git
synced 2025-01-30 21:12:55 +08:00
source file first commit, folder structure refact
This commit is contained in:
parent
13c69796b0
commit
cdd13b1af3
174
Makefile
Normal file
174
Makefile
Normal file
@ -0,0 +1,174 @@
|
|||||||
|
# copyright (c) 2010 Espressif System
|
||||||
|
#
|
||||||
|
ifndef PDIR
|
||||||
|
|
||||||
|
endif
|
||||||
|
|
||||||
|
AR = xt-ar
|
||||||
|
CC = xt-xcc
|
||||||
|
NM = xt-nm
|
||||||
|
CPP = xt-cpp
|
||||||
|
OBJCOPY = xt-objcopy
|
||||||
|
#MAKE = xt-make
|
||||||
|
|
||||||
|
CSRCS ?= $(wildcard *.c)
|
||||||
|
ASRCs ?= $(wildcard *.s)
|
||||||
|
ASRCS ?= $(wildcard *.S)
|
||||||
|
SUBDIRS ?= $(patsubst %/,%,$(dir $(wildcard */Makefile)))
|
||||||
|
|
||||||
|
ODIR := .output
|
||||||
|
OBJODIR := $(ODIR)/$(TARGET)/$(FLAVOR)/obj
|
||||||
|
|
||||||
|
OBJS := $(CSRCS:%.c=$(OBJODIR)/%.o) \
|
||||||
|
$(ASRCs:%.s=$(OBJODIR)/%.o) \
|
||||||
|
$(ASRCS:%.S=$(OBJODIR)/%.o)
|
||||||
|
|
||||||
|
DEPS := $(CSRCS:%.c=$(OBJODIR)/%.d) \
|
||||||
|
$(ASRCs:%.s=$(OBJODIR)/%.d) \
|
||||||
|
$(ASRCS:%.S=$(OBJODIR)/%.d)
|
||||||
|
|
||||||
|
LIBODIR := $(ODIR)/$(TARGET)/$(FLAVOR)/lib
|
||||||
|
OLIBS := $(GEN_LIBS:%=$(LIBODIR)/%)
|
||||||
|
|
||||||
|
IMAGEODIR := $(ODIR)/$(TARGET)/$(FLAVOR)/image
|
||||||
|
OIMAGES := $(GEN_IMAGES:%=$(IMAGEODIR)/%)
|
||||||
|
|
||||||
|
BINODIR := $(ODIR)/$(TARGET)/$(FLAVOR)/bin
|
||||||
|
OBINS := $(GEN_BINS:%=$(BINODIR)/%)
|
||||||
|
|
||||||
|
CCFLAGS += \
|
||||||
|
-g \
|
||||||
|
-O2 \
|
||||||
|
-Wpointer-arith \
|
||||||
|
-Wundef \
|
||||||
|
-Werror \
|
||||||
|
-Wl,-EL \
|
||||||
|
-fno-inline-functions \
|
||||||
|
-nostdlib \
|
||||||
|
-mlongcalls \
|
||||||
|
-mtext-section-literals
|
||||||
|
# -Wall
|
||||||
|
|
||||||
|
CFLAGS = $(CCFLAGS) $(DEFINES) $(EXTRA_CCFLAGS) $(INCLUDES)
|
||||||
|
DFLAGS = $(CCFLAGS) $(DDEFINES) $(EXTRA_CCFLAGS) $(INCLUDES)
|
||||||
|
|
||||||
|
|
||||||
|
#############################################################
|
||||||
|
# Functions
|
||||||
|
#
|
||||||
|
|
||||||
|
define ShortcutRule
|
||||||
|
$(1): .subdirs $(2)/$(1)
|
||||||
|
endef
|
||||||
|
|
||||||
|
define MakeLibrary
|
||||||
|
DEP_LIBS_$(1) = $$(foreach lib,$$(filter %.a,$$(COMPONENTS_$(1))),$$(dir $$(lib))$$(LIBODIR)/$$(notdir $$(lib)))
|
||||||
|
DEP_OBJS_$(1) = $$(foreach obj,$$(filter %.o,$$(COMPONENTS_$(1))),$$(dir $$(obj))$$(OBJODIR)/$$(notdir $$(obj)))
|
||||||
|
$$(LIBODIR)/$(1).a: $$(OBJS) $$(DEP_OBJS_$(1)) $$(DEP_LIBS_$(1)) $$(DEPENDS_$(1))
|
||||||
|
@mkdir -p $$(LIBODIR)
|
||||||
|
$$(if $$(filter %.a,$$?),mkdir -p $$(EXTRACT_DIR)_$(1))
|
||||||
|
$$(if $$(filter %.a,$$?),cd $$(EXTRACT_DIR)_$(1); $$(foreach lib,$$(filter %.a,$$?),$$(AR) xo $$(UP_EXTRACT_DIR)/$$(lib);))
|
||||||
|
$$(AR) ru $$@ $$(filter %.o,$$?) $$(if $$(filter %.a,$$?),$$(EXTRACT_DIR)_$(1)/*.o)
|
||||||
|
$$(if $$(filter %.a,$$?),$$(RM) -r $$(EXTRACT_DIR)_$(1))
|
||||||
|
endef
|
||||||
|
|
||||||
|
define MakeImage
|
||||||
|
DEP_LIBS_$(1) = $$(foreach lib,$$(filter %.a,$$(COMPONENTS_$(1))),$$(dir $$(lib))$$(LIBODIR)/$$(notdir $$(lib)))
|
||||||
|
DEP_OBJS_$(1) = $$(foreach obj,$$(filter %.o,$$(COMPONENTS_$(1))),$$(dir $$(obj))$$(OBJODIR)/$$(notdir $$(obj)))
|
||||||
|
$$(IMAGEODIR)/$(1).out: $$(OBJS) $$(DEP_OBJS_$(1)) $$(DEP_LIBS_$(1)) $$(DEPENDS_$(1))
|
||||||
|
@mkdir -p $$(IMAGEODIR)
|
||||||
|
$$(CC) $$(LDFLAGS) $$(if $$(LINKFLAGS_$(1)),$$(LINKFLAGS_$(1)),$$(LINKFLAGS_DEFAULT) $$(OBJS) $$(DEP_OBJS_$(1)) $$(DEP_LIBS_$(1))) -o $$@
|
||||||
|
endef
|
||||||
|
|
||||||
|
$(BINODIR)/%.bin: $(IMAGEODIR)/%.out
|
||||||
|
@mkdir -p $(BINODIR)
|
||||||
|
$(OBJCOPY) -O binary $< $@
|
||||||
|
|
||||||
|
#############################################################
|
||||||
|
# Rules base
|
||||||
|
# Should be done in top-level makefile only
|
||||||
|
#
|
||||||
|
|
||||||
|
all: .subdirs $(OBJS) $(OLIBS) $(OIMAGES) $(OBINS) $(SPECIAL_MKTARGETS)
|
||||||
|
|
||||||
|
clean:
|
||||||
|
$(foreach d, $(SUBDIRS), $(MAKE) -C $(d) clean;)
|
||||||
|
$(RM) -r $(ODIR)/$(TARGET)/$(FLAVOR)
|
||||||
|
|
||||||
|
clobber: $(SPECIAL_CLOBBER)
|
||||||
|
$(foreach d, $(SUBDIRS), $(MAKE) -C $(d) clobber;)
|
||||||
|
$(RM) -r $(ODIR)
|
||||||
|
|
||||||
|
.subdirs:
|
||||||
|
@set -e; $(foreach d, $(SUBDIRS), $(MAKE) -C $(d);)
|
||||||
|
|
||||||
|
#.subdirs:
|
||||||
|
# $(foreach d, $(SUBDIRS), $(MAKE) -C $(d))
|
||||||
|
|
||||||
|
ifneq ($(MAKECMDGOALS),clean)
|
||||||
|
ifneq ($(MAKECMDGOALS),clobber)
|
||||||
|
ifdef DEPS
|
||||||
|
sinclude $(DEPS)
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
$(OBJODIR)/%.o: %.c
|
||||||
|
@mkdir -p $(OBJODIR);
|
||||||
|
$(CC) $(if $(findstring $<,$(DSRCS)),$(DFLAGS),$(CFLAGS)) $(COPTS_$(*F)) -o $@ -c $<
|
||||||
|
|
||||||
|
$(OBJODIR)/%.d: %.c
|
||||||
|
@mkdir -p $(OBJODIR);
|
||||||
|
@echo DEPEND: $(CC) -M $(CFLAGS) $<
|
||||||
|
@set -e; rm -f $@; \
|
||||||
|
$(CC) -M $(CFLAGS) $< > $@.$$$$; \
|
||||||
|
sed 's,\($*\.o\)[ :]*,$(OBJODIR)/\1 $@ : ,g' < $@.$$$$ > $@; \
|
||||||
|
rm -f $@.$$$$
|
||||||
|
|
||||||
|
$(OBJODIR)/%.o: %.s
|
||||||
|
@mkdir -p $(OBJODIR);
|
||||||
|
$(CC) $(CFLAGS) -o $@ -c $<
|
||||||
|
|
||||||
|
$(OBJODIR)/%.d: %.s
|
||||||
|
@mkdir -p $(OBJODIR); \
|
||||||
|
set -e; rm -f $@; \
|
||||||
|
$(CC) -M $(CFLAGS) $< > $@.$$$$; \
|
||||||
|
sed 's,\($*\.o\)[ :]*,$(OBJODIR)/\1 $@ : ,g' < $@.$$$$ > $@; \
|
||||||
|
rm -f $@.$$$$
|
||||||
|
|
||||||
|
$(OBJODIR)/%.o: %.S
|
||||||
|
@mkdir -p $(OBJODIR);
|
||||||
|
$(CC) $(CFLAGS) -D__ASSEMBLER__ -o $@ -c $<
|
||||||
|
|
||||||
|
$(OBJODIR)/%.d: %.S
|
||||||
|
@mkdir -p $(OBJODIR); \
|
||||||
|
set -e; rm -f $@; \
|
||||||
|
$(CC) -M $(CFLAGS) $< > $@.$$$$; \
|
||||||
|
sed 's,\($*\.o\)[ :]*,$(OBJODIR)/\1 $@ : ,g' < $@.$$$$ > $@; \
|
||||||
|
rm -f $@.$$$$
|
||||||
|
|
||||||
|
$(foreach lib,$(GEN_LIBS),$(eval $(call ShortcutRule,$(lib),$(LIBODIR))))
|
||||||
|
|
||||||
|
$(foreach image,$(GEN_IMAGES),$(eval $(call ShortcutRule,$(image),$(IMAGEODIR))))
|
||||||
|
|
||||||
|
$(foreach bin,$(GEN_BINS),$(eval $(call ShortcutRule,$(bin),$(BINODIR))))
|
||||||
|
|
||||||
|
$(foreach lib,$(GEN_LIBS),$(eval $(call MakeLibrary,$(basename $(lib)))))
|
||||||
|
|
||||||
|
$(foreach image,$(GEN_IMAGES),$(eval $(call MakeImage,$(basename $(image)))))
|
||||||
|
|
||||||
|
#############################################################
|
||||||
|
# Recursion Magic - Don't touch this!!
|
||||||
|
#
|
||||||
|
# Each subtree potentially has an include directory
|
||||||
|
# corresponding to the common APIs applicable to modules
|
||||||
|
# rooted at that subtree. Accordingly, the INCLUDE PATH
|
||||||
|
# of a module can only contain the include directories up
|
||||||
|
# its parent path, and not its siblings
|
||||||
|
#
|
||||||
|
# Required for each makefile to inherit from the parent
|
||||||
|
#
|
||||||
|
|
||||||
|
INCLUDES := $(INCLUDES) -I $(PDIR)include -I $(PDIR)include/$(TARGET)
|
||||||
|
PDIR := ../$(PDIR)
|
||||||
|
sinclude $(PDIR)Makefile
|
50
README.md
50
README.md
@ -1,12 +1,26 @@
|
|||||||
# **NodeMcu** #
|
# **NodeMcu** #
|
||||||
|
version 0.9.4
|
||||||
###A lua based firmware for wifi-soc esp8266
|
###A lua based firmware for wifi-soc esp8266
|
||||||
version 0.9.2 build 2014-12-19
|
Build on [ESP8266 sdk 0.9.4](http://bbs.espressif.com/viewtopic.php?f=5&t=90)
|
||||||
|
Lua core based on [eLua project](http://www.eluaproject.net/)
|
||||||
|
File system based on [spiffs](https://github.com/pellepl/spiffs)
|
||||||
|
Open source development kit for NodeMCU [nodemcu-devkit](https://github.com/nodemcu/nodemcu-devkit)
|
||||||
|
Flash tool for NodeMCU [nodemcu-flasher](https://github.com/nodemcu/nodemcu-flasher)
|
||||||
|
|
||||||
|
wiki: [nodemcu wiki](https://github.com/nodemcu/nodemcu-firmware/wiki)
|
||||||
|
home: [nodemcu.com](http://www.nodemcu.com)
|
||||||
|
bbs: [中文论坛Chinese bbs](http://bbs.nodemcu.com)
|
||||||
|
Tencent QQ group QQ群: 309957875
|
||||||
|
|
||||||
# Change log
|
# Change log
|
||||||
|
2014-12-22<br />
|
||||||
|
update to sdk 0.9.4<br />
|
||||||
|
opensource
|
||||||
|
|
||||||
2014-12-19<br />
|
2014-12-19<br />
|
||||||
**Important** Re-arrange GPIO MAP due to development kit.[New Gpio Map](#new_gpio_map)<br />
|
**Important** Re-arrange GPIO MAP due to development kit.[New Gpio Map](#new_gpio_map)<br />
|
||||||
Add bitwise operation module.<br />
|
Add bitwise operation module.<br />
|
||||||
Modify net.socket:connect() api to accept domain name, auto DNS.<br />
|
Modify net.socket:connect() api to accept domain name, auto DNS.
|
||||||
Add firmware for flash size 1Mbytes, 2Mbytes, 4Mbytes.
|
|
||||||
|
|
||||||
|
|
||||||
[more change log](https://github.com/nodemcu/nodemcu-firmware/wiki/nodemcu_api_en#change_log)<br />
|
[more change log](https://github.com/nodemcu/nodemcu-firmware/wiki/nodemcu_api_en#change_log)<br />
|
||||||
@ -86,6 +100,30 @@ Add firmware for flash size 1Mbytes, 2Mbytes, 4Mbytes.
|
|||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
|
#Build option
|
||||||
|
####file ./app/include/user_config.h
|
||||||
|
```c
|
||||||
|
#define FLASH_512K
|
||||||
|
// #define FLASH_1M
|
||||||
|
// #define FLASH_2M
|
||||||
|
// #define FLASH_4M
|
||||||
|
...
|
||||||
|
#define LUA_USE_MODULES
|
||||||
|
#ifdef LUA_USE_MODULES
|
||||||
|
#define LUA_USE_MODULES_NODE
|
||||||
|
#define LUA_USE_MODULES_FILE
|
||||||
|
#define LUA_USE_MODULES_GPIO
|
||||||
|
#define LUA_USE_MODULES_WIFI
|
||||||
|
#define LUA_USE_MODULES_NET
|
||||||
|
#define LUA_USE_MODULES_PWM
|
||||||
|
#define LUA_USE_MODULES_I2C
|
||||||
|
#define LUA_USE_MODULES_TMR
|
||||||
|
#define LUA_USE_MODULES_ADC
|
||||||
|
#define LUA_USE_MODULES_UART
|
||||||
|
#define LUA_USE_MODULES_OW
|
||||||
|
//#define LUA_USE_MODULES_BIT
|
||||||
|
#endif /* LUA_USE_MODULES */
|
||||||
|
```
|
||||||
|
|
||||||
#Flash the firmware
|
#Flash the firmware
|
||||||
nodemcu_512k.bin: 0x00000<br />
|
nodemcu_512k.bin: 0x00000<br />
|
||||||
@ -227,9 +265,3 @@ braudrate:9600
|
|||||||
t = nil
|
t = nil
|
||||||
package.loaded["ds18b20"]=nil
|
package.loaded["ds18b20"]=nil
|
||||||
```
|
```
|
||||||
|
|
||||||
#Check this out
|
|
||||||
Tencent QQ group: 309957875<br/>
|
|
||||||
[nodemcu wiki](https://github.com/nodemcu/nodemcu-firmware/wiki)<br/>
|
|
||||||
[nodemcu.com](http://www.nodemcu.com)
|
|
||||||
[中文bbs](http://bbs.nodemcu.com)
|
|
||||||
|
2
app/.gitignore
vendored
Normal file
2
app/.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
*.output*
|
||||||
|
!.gitignore
|
166
app/Makefile
Normal file
166
app/Makefile
Normal file
@ -0,0 +1,166 @@
|
|||||||
|
#############################################################
|
||||||
|
# Required variables for each makefile
|
||||||
|
# Discard this section from all parent makefiles
|
||||||
|
# Expected variables (with automatic defaults):
|
||||||
|
# CSRCS (all "C" files in the dir)
|
||||||
|
# SUBDIRS (all subdirs with a Makefile)
|
||||||
|
# GEN_LIBS - list of libs to be generated ()
|
||||||
|
# GEN_IMAGES - list of object file images to be generated ()
|
||||||
|
# GEN_BINS - list of binaries to be generated ()
|
||||||
|
# COMPONENTS_xxx - a list of libs/objs in the form
|
||||||
|
# subdir/lib to be extracted and rolled up into
|
||||||
|
# a generated lib/image xxx.a ()
|
||||||
|
#
|
||||||
|
TARGET = eagle
|
||||||
|
#FLAVOR = release
|
||||||
|
FLAVOR = debug
|
||||||
|
|
||||||
|
#EXTRA_CCFLAGS += -u
|
||||||
|
|
||||||
|
ifndef PDIR # {
|
||||||
|
GEN_IMAGES= eagle.app.v6.out
|
||||||
|
GEN_BINS= eagle.app.v6.bin
|
||||||
|
SPECIAL_MKTARGETS=$(APP_MKTARGETS)
|
||||||
|
SUBDIRS= \
|
||||||
|
user \
|
||||||
|
driver \
|
||||||
|
lwip \
|
||||||
|
json \
|
||||||
|
ssl \
|
||||||
|
upgrade \
|
||||||
|
platform \
|
||||||
|
libc \
|
||||||
|
lua \
|
||||||
|
smart \
|
||||||
|
wofs \
|
||||||
|
modules \
|
||||||
|
spiffs
|
||||||
|
|
||||||
|
endif # } PDIR
|
||||||
|
|
||||||
|
APPDIR = .
|
||||||
|
LDDIR = ../ld
|
||||||
|
|
||||||
|
CCFLAGS += -Os
|
||||||
|
|
||||||
|
TARGET_LDFLAGS = \
|
||||||
|
-nostdlib \
|
||||||
|
-Wl,-EL \
|
||||||
|
--longcalls \
|
||||||
|
--text-section-literals
|
||||||
|
|
||||||
|
ifeq ($(FLAVOR),debug)
|
||||||
|
TARGET_LDFLAGS += -g -O2
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(FLAVOR),release)
|
||||||
|
TARGET_LDFLAGS += -g -O0
|
||||||
|
endif
|
||||||
|
|
||||||
|
LD_FILE = $(LDDIR)/eagle.app.v6.ld
|
||||||
|
|
||||||
|
ifeq ($(APP), 1)
|
||||||
|
LD_FILE = $(LDDIR)/eagle.app.v6.app1.ld
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(APP), 2)
|
||||||
|
LD_FILE = $(LDDIR)/eagle.app.v6.app2.ld
|
||||||
|
endif
|
||||||
|
|
||||||
|
COMPONENTS_eagle.app.v6 = \
|
||||||
|
user/libuser.a \
|
||||||
|
driver/libdriver.a \
|
||||||
|
lwip/liblwip.a \
|
||||||
|
json/libjson.a \
|
||||||
|
ssl/libssl.a \
|
||||||
|
upgrade/libupgrade.a \
|
||||||
|
platform/libplatform.a \
|
||||||
|
libc/liblibc.a \
|
||||||
|
lua/liblua.a \
|
||||||
|
smart/smart.a \
|
||||||
|
wofs/wofs.a \
|
||||||
|
spiffs/spiffs.a \
|
||||||
|
modules/libmodules.a
|
||||||
|
|
||||||
|
LINKFLAGS_eagle.app.v6 = \
|
||||||
|
-L../lib \
|
||||||
|
-nostdlib \
|
||||||
|
-T$(LD_FILE) \
|
||||||
|
-Wl,--no-check-sections \
|
||||||
|
-u call_user_start \
|
||||||
|
-Wl,-static \
|
||||||
|
-Wl,--start-group \
|
||||||
|
-lc \
|
||||||
|
-lgcc \
|
||||||
|
-lhal \
|
||||||
|
-lphy \
|
||||||
|
-lpp \
|
||||||
|
-lnet80211 \
|
||||||
|
-lwpa \
|
||||||
|
-lmain \
|
||||||
|
-ljson \
|
||||||
|
$(DEP_LIBS_eagle.app.v6) \
|
||||||
|
-Wl,--end-group
|
||||||
|
|
||||||
|
DEPENDS_eagle.app.v6 = \
|
||||||
|
$(LD_FILE) \
|
||||||
|
$(LDDIR)/eagle.rom.addr.v6.ld
|
||||||
|
|
||||||
|
#############################################################
|
||||||
|
# Configuration i.e. compile options etc.
|
||||||
|
# Target specific stuff (defines etc.) goes in here!
|
||||||
|
# Generally values applying to a tree are captured in the
|
||||||
|
# makefile at its root level - these are then overridden
|
||||||
|
# for a subtree within the makefile rooted therein
|
||||||
|
#
|
||||||
|
|
||||||
|
#UNIVERSAL_TARGET_DEFINES = \
|
||||||
|
|
||||||
|
# Other potential configuration flags include:
|
||||||
|
# -DTXRX_TXBUF_DEBUG
|
||||||
|
# -DTXRX_RXBUF_DEBUG
|
||||||
|
# -DWLAN_CONFIG_CCX
|
||||||
|
CONFIGURATION_DEFINES = -D__ets__ \
|
||||||
|
-DICACHE_FLASH \
|
||||||
|
-DLWIP_OPEN_SRC \
|
||||||
|
-DPBUF_RSV_FOR_WLAN \
|
||||||
|
-DEBUF_LWIP
|
||||||
|
|
||||||
|
DEFINES += \
|
||||||
|
$(UNIVERSAL_TARGET_DEFINES) \
|
||||||
|
$(CONFIGURATION_DEFINES)
|
||||||
|
|
||||||
|
DDEFINES += \
|
||||||
|
$(UNIVERSAL_TARGET_DEFINES) \
|
||||||
|
$(CONFIGURATION_DEFINES)
|
||||||
|
|
||||||
|
|
||||||
|
#############################################################
|
||||||
|
# Recursion Magic - Don't touch this!!
|
||||||
|
#
|
||||||
|
# Each subtree potentially has an include directory
|
||||||
|
# corresponding to the common APIs applicable to modules
|
||||||
|
# rooted at that subtree. Accordingly, the INCLUDE PATH
|
||||||
|
# of a module can only contain the include directories up
|
||||||
|
# its parent path, and not its siblings
|
||||||
|
#
|
||||||
|
# Required for each makefile to inherit from the parent
|
||||||
|
#
|
||||||
|
|
||||||
|
INCLUDES := $(INCLUDES) -I $(PDIR)include
|
||||||
|
INCLUDES += -I ./
|
||||||
|
PDIR := ../$(PDIR)
|
||||||
|
sinclude $(PDIR)Makefile
|
||||||
|
|
||||||
|
#########################################################################
|
||||||
|
#
|
||||||
|
# generate bin file
|
||||||
|
#
|
||||||
|
|
||||||
|
$(BINODIR)/%.bin: $(IMAGEODIR)/%.out
|
||||||
|
@mkdir -p $(BINODIR)
|
||||||
|
$(OBJCOPY) -O binary $< $@
|
||||||
|
|
||||||
|
.PHONY: FORCE
|
||||||
|
FORCE:
|
||||||
|
|
45
app/driver/Makefile
Normal file
45
app/driver/Makefile
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
|
||||||
|
#############################################################
|
||||||
|
# Required variables for each makefile
|
||||||
|
# Discard this section from all parent makefiles
|
||||||
|
# Expected variables (with automatic defaults):
|
||||||
|
# CSRCS (all "C" files in the dir)
|
||||||
|
# SUBDIRS (all subdirs with a Makefile)
|
||||||
|
# GEN_LIBS - list of libs to be generated ()
|
||||||
|
# GEN_IMAGES - list of images to be generated ()
|
||||||
|
# COMPONENTS_xxx - a list of libs/objs in the form
|
||||||
|
# subdir/lib to be extracted and rolled up into
|
||||||
|
# a generated lib/image xxx.a ()
|
||||||
|
#
|
||||||
|
ifndef PDIR
|
||||||
|
GEN_LIBS = libdriver.a
|
||||||
|
endif
|
||||||
|
|
||||||
|
|
||||||
|
#############################################################
|
||||||
|
# Configuration i.e. compile options etc.
|
||||||
|
# Target specific stuff (defines etc.) goes in here!
|
||||||
|
# Generally values applying to a tree are captured in the
|
||||||
|
# makefile at its root level - these are then overridden
|
||||||
|
# for a subtree within the makefile rooted therein
|
||||||
|
#
|
||||||
|
#DEFINES +=
|
||||||
|
|
||||||
|
#############################################################
|
||||||
|
# Recursion Magic - Don't touch this!!
|
||||||
|
#
|
||||||
|
# Each subtree potentially has an include directory
|
||||||
|
# corresponding to the common APIs applicable to modules
|
||||||
|
# rooted at that subtree. Accordingly, the INCLUDE PATH
|
||||||
|
# of a module can only contain the include directories up
|
||||||
|
# its parent path, and not its siblings
|
||||||
|
#
|
||||||
|
# Required for each makefile to inherit from the parent
|
||||||
|
#
|
||||||
|
|
||||||
|
INCLUDES := $(INCLUDES) -I $(PDIR)include
|
||||||
|
INCLUDES += -I ./
|
||||||
|
INCLUDES += -I ../platform
|
||||||
|
PDIR := ../$(PDIR)
|
||||||
|
sinclude $(PDIR)Makefile
|
||||||
|
|
42
app/driver/gpio16.c
Normal file
42
app/driver/gpio16.c
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
#include "ets_sys.h"
|
||||||
|
#include "osapi.h"
|
||||||
|
#include "driver/gpio16.h"
|
||||||
|
|
||||||
|
void ICACHE_FLASH_ATTR
|
||||||
|
gpio16_output_conf(void)
|
||||||
|
{
|
||||||
|
WRITE_PERI_REG(PAD_XPD_DCDC_CONF,
|
||||||
|
(READ_PERI_REG(PAD_XPD_DCDC_CONF) & 0xffffffbc) | (uint32)0x1); // mux configuration for XPD_DCDC to output rtc_gpio0
|
||||||
|
|
||||||
|
WRITE_PERI_REG(RTC_GPIO_CONF,
|
||||||
|
(READ_PERI_REG(RTC_GPIO_CONF) & (uint32)0xfffffffe) | (uint32)0x0); //mux configuration for out enable
|
||||||
|
|
||||||
|
WRITE_PERI_REG(RTC_GPIO_ENABLE,
|
||||||
|
(READ_PERI_REG(RTC_GPIO_ENABLE) & (uint32)0xfffffffe) | (uint32)0x1); //out enable
|
||||||
|
}
|
||||||
|
|
||||||
|
void ICACHE_FLASH_ATTR
|
||||||
|
gpio16_output_set(uint8 value)
|
||||||
|
{
|
||||||
|
WRITE_PERI_REG(RTC_GPIO_OUT,
|
||||||
|
(READ_PERI_REG(RTC_GPIO_OUT) & (uint32)0xfffffffe) | (uint32)(value & 1));
|
||||||
|
}
|
||||||
|
|
||||||
|
void ICACHE_FLASH_ATTR
|
||||||
|
gpio16_input_conf(void)
|
||||||
|
{
|
||||||
|
WRITE_PERI_REG(PAD_XPD_DCDC_CONF,
|
||||||
|
(READ_PERI_REG(PAD_XPD_DCDC_CONF) & 0xffffffbc) | (uint32)0x1); // mux configuration for XPD_DCDC and rtc_gpio0 connection
|
||||||
|
|
||||||
|
WRITE_PERI_REG(RTC_GPIO_CONF,
|
||||||
|
(READ_PERI_REG(RTC_GPIO_CONF) & (uint32)0xfffffffe) | (uint32)0x0); //mux configuration for out enable
|
||||||
|
|
||||||
|
WRITE_PERI_REG(RTC_GPIO_ENABLE,
|
||||||
|
READ_PERI_REG(RTC_GPIO_ENABLE) & (uint32)0xfffffffe); //out disable
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8 ICACHE_FLASH_ATTR
|
||||||
|
gpio16_input_get(void)
|
||||||
|
{
|
||||||
|
return (uint8)(READ_PERI_REG(RTC_GPIO_IN_DATA) & 1);
|
||||||
|
}
|
293
app/driver/i2c_master.c
Normal file
293
app/driver/i2c_master.c
Normal file
@ -0,0 +1,293 @@
|
|||||||
|
/******************************************************************************
|
||||||
|
* Copyright 2013-2014 Espressif Systems (Wuxi)
|
||||||
|
*
|
||||||
|
* FileName: i2c_master.c
|
||||||
|
*
|
||||||
|
* Description: i2c master API
|
||||||
|
*
|
||||||
|
* Modification history:
|
||||||
|
* 2014/3/12, v1.0 create this file.
|
||||||
|
*******************************************************************************/
|
||||||
|
#include "ets_sys.h"
|
||||||
|
#include "osapi.h"
|
||||||
|
#include "gpio.h"
|
||||||
|
|
||||||
|
#include "driver/i2c_master.h"
|
||||||
|
|
||||||
|
#include "pin_map.h"
|
||||||
|
|
||||||
|
LOCAL uint8 m_nLastSDA;
|
||||||
|
LOCAL uint8 m_nLastSCL;
|
||||||
|
|
||||||
|
LOCAL uint8 pinSDA = 2;
|
||||||
|
LOCAL uint8 pinSCL = 15;
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* FunctionName : i2c_master_setDC
|
||||||
|
* Description : Internal used function -
|
||||||
|
* set i2c SDA and SCL bit value for half clk cycle
|
||||||
|
* Parameters : uint8 SDA
|
||||||
|
* uint8 SCL
|
||||||
|
* Returns : NONE
|
||||||
|
*******************************************************************************/
|
||||||
|
LOCAL void ICACHE_FLASH_ATTR
|
||||||
|
i2c_master_setDC(uint8 SDA, uint8 SCL)
|
||||||
|
{
|
||||||
|
SDA &= 0x01;
|
||||||
|
SCL &= 0x01;
|
||||||
|
m_nLastSDA = SDA;
|
||||||
|
m_nLastSCL = SCL;
|
||||||
|
|
||||||
|
if ((0 == SDA) && (0 == SCL)) {
|
||||||
|
I2C_MASTER_SDA_LOW_SCL_LOW();
|
||||||
|
} else if ((0 == SDA) && (1 == SCL)) {
|
||||||
|
I2C_MASTER_SDA_LOW_SCL_HIGH();
|
||||||
|
} else if ((1 == SDA) && (0 == SCL)) {
|
||||||
|
I2C_MASTER_SDA_HIGH_SCL_LOW();
|
||||||
|
} else {
|
||||||
|
I2C_MASTER_SDA_HIGH_SCL_HIGH();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* FunctionName : i2c_master_getDC
|
||||||
|
* Description : Internal used function -
|
||||||
|
* get i2c SDA bit value
|
||||||
|
* Parameters : NONE
|
||||||
|
* Returns : uint8 - SDA bit value
|
||||||
|
*******************************************************************************/
|
||||||
|
LOCAL uint8 ICACHE_FLASH_ATTR
|
||||||
|
i2c_master_getDC(void)
|
||||||
|
{
|
||||||
|
uint8 sda_out;
|
||||||
|
sda_out = GPIO_INPUT_GET(GPIO_ID_PIN(I2C_MASTER_SDA_GPIO));
|
||||||
|
return sda_out;
|
||||||
|
}
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* FunctionName : i2c_master_init
|
||||||
|
* Description : initilize I2C bus to enable i2c operations
|
||||||
|
* Parameters : NONE
|
||||||
|
* Returns : NONE
|
||||||
|
*******************************************************************************/
|
||||||
|
void ICACHE_FLASH_ATTR
|
||||||
|
i2c_master_init(void)
|
||||||
|
{
|
||||||
|
uint8 i;
|
||||||
|
|
||||||
|
i2c_master_setDC(1, 0);
|
||||||
|
i2c_master_wait(5);
|
||||||
|
|
||||||
|
// when SCL = 0, toggle SDA to clear up
|
||||||
|
i2c_master_setDC(0, 0) ;
|
||||||
|
i2c_master_wait(5);
|
||||||
|
i2c_master_setDC(1, 0) ;
|
||||||
|
i2c_master_wait(5);
|
||||||
|
|
||||||
|
// set data_cnt to max value
|
||||||
|
for (i = 0; i < 28; i++) {
|
||||||
|
i2c_master_setDC(1, 0);
|
||||||
|
i2c_master_wait(5); // sda 1, scl 0
|
||||||
|
i2c_master_setDC(1, 1);
|
||||||
|
i2c_master_wait(5); // sda 1, scl 1
|
||||||
|
}
|
||||||
|
|
||||||
|
// reset all
|
||||||
|
i2c_master_stop();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8 i2c_master_get_pinSDA(){
|
||||||
|
return pinSDA;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8 i2c_master_get_pinSCL(){
|
||||||
|
return pinSCL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* FunctionName : i2c_master_gpio_init
|
||||||
|
* Description : config SDA and SCL gpio to open-drain output mode,
|
||||||
|
* mux and gpio num defined in i2c_master.h
|
||||||
|
* Parameters : NONE
|
||||||
|
* Returns : NONE
|
||||||
|
*******************************************************************************/
|
||||||
|
void ICACHE_FLASH_ATTR
|
||||||
|
i2c_master_gpio_init(uint8 sda, uint8 scl)
|
||||||
|
{
|
||||||
|
pinSDA = pin_num[sda];
|
||||||
|
pinSCL = pin_num[scl];
|
||||||
|
|
||||||
|
ETS_GPIO_INTR_DISABLE() ;
|
||||||
|
// ETS_INTR_LOCK();
|
||||||
|
|
||||||
|
PIN_FUNC_SELECT(I2C_MASTER_SDA_MUX, I2C_MASTER_SDA_FUNC);
|
||||||
|
PIN_FUNC_SELECT(I2C_MASTER_SCL_MUX, I2C_MASTER_SCL_FUNC);
|
||||||
|
|
||||||
|
GPIO_REG_WRITE(GPIO_PIN_ADDR(GPIO_ID_PIN(I2C_MASTER_SDA_GPIO)), GPIO_REG_READ(GPIO_PIN_ADDR(GPIO_ID_PIN(I2C_MASTER_SDA_GPIO))) | GPIO_PIN_PAD_DRIVER_SET(GPIO_PAD_DRIVER_ENABLE)); //open drain;
|
||||||
|
GPIO_REG_WRITE(GPIO_ENABLE_ADDRESS, GPIO_REG_READ(GPIO_ENABLE_ADDRESS) | (1 << I2C_MASTER_SDA_GPIO));
|
||||||
|
GPIO_REG_WRITE(GPIO_PIN_ADDR(GPIO_ID_PIN(I2C_MASTER_SCL_GPIO)), GPIO_REG_READ(GPIO_PIN_ADDR(GPIO_ID_PIN(I2C_MASTER_SCL_GPIO))) | GPIO_PIN_PAD_DRIVER_SET(GPIO_PAD_DRIVER_ENABLE)); //open drain;
|
||||||
|
GPIO_REG_WRITE(GPIO_ENABLE_ADDRESS, GPIO_REG_READ(GPIO_ENABLE_ADDRESS) | (1 << I2C_MASTER_SCL_GPIO));
|
||||||
|
|
||||||
|
I2C_MASTER_SDA_HIGH_SCL_HIGH();
|
||||||
|
|
||||||
|
ETS_GPIO_INTR_ENABLE() ;
|
||||||
|
// ETS_INTR_UNLOCK();
|
||||||
|
|
||||||
|
i2c_master_init();
|
||||||
|
}
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* FunctionName : i2c_master_start
|
||||||
|
* Description : set i2c to send state
|
||||||
|
* Parameters : NONE
|
||||||
|
* Returns : NONE
|
||||||
|
*******************************************************************************/
|
||||||
|
void ICACHE_FLASH_ATTR
|
||||||
|
i2c_master_start(void)
|
||||||
|
{
|
||||||
|
i2c_master_setDC(1, m_nLastSCL);
|
||||||
|
i2c_master_wait(5);
|
||||||
|
i2c_master_setDC(1, 1);
|
||||||
|
i2c_master_wait(5); // sda 1, scl 1
|
||||||
|
i2c_master_setDC(0, 1);
|
||||||
|
i2c_master_wait(5); // sda 0, scl 1
|
||||||
|
}
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* FunctionName : i2c_master_stop
|
||||||
|
* Description : set i2c to stop sending state
|
||||||
|
* Parameters : NONE
|
||||||
|
* Returns : NONE
|
||||||
|
*******************************************************************************/
|
||||||
|
void ICACHE_FLASH_ATTR
|
||||||
|
i2c_master_stop(void)
|
||||||
|
{
|
||||||
|
i2c_master_wait(5);
|
||||||
|
|
||||||
|
i2c_master_setDC(0, m_nLastSCL);
|
||||||
|
i2c_master_wait(5); // sda 0
|
||||||
|
i2c_master_setDC(0, 1);
|
||||||
|
i2c_master_wait(5); // sda 0, scl 1
|
||||||
|
i2c_master_setDC(1, 1);
|
||||||
|
i2c_master_wait(5); // sda 1, scl 1
|
||||||
|
}
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* FunctionName : i2c_master_setAck
|
||||||
|
* Description : set ack to i2c bus as level value
|
||||||
|
* Parameters : uint8 level - 0 or 1
|
||||||
|
* Returns : NONE
|
||||||
|
*******************************************************************************/
|
||||||
|
void ICACHE_FLASH_ATTR
|
||||||
|
i2c_master_setAck(uint8 level)
|
||||||
|
{
|
||||||
|
i2c_master_setDC(m_nLastSDA, 0);
|
||||||
|
i2c_master_wait(5);
|
||||||
|
i2c_master_setDC(level, 0);
|
||||||
|
i2c_master_wait(5); // sda level, scl 0
|
||||||
|
i2c_master_setDC(level, 1);
|
||||||
|
i2c_master_wait(8); // sda level, scl 1
|
||||||
|
i2c_master_setDC(level, 0);
|
||||||
|
i2c_master_wait(5); // sda level, scl 0
|
||||||
|
i2c_master_setDC(1, 0);
|
||||||
|
i2c_master_wait(5);
|
||||||
|
}
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* FunctionName : i2c_master_getAck
|
||||||
|
* Description : confirm if peer send ack
|
||||||
|
* Parameters : NONE
|
||||||
|
* Returns : uint8 - ack value, 0 or 1
|
||||||
|
*******************************************************************************/
|
||||||
|
uint8 ICACHE_FLASH_ATTR
|
||||||
|
i2c_master_getAck(void)
|
||||||
|
{
|
||||||
|
uint8 retVal;
|
||||||
|
i2c_master_setDC(m_nLastSDA, 0);
|
||||||
|
i2c_master_wait(5);
|
||||||
|
i2c_master_setDC(1, 0);
|
||||||
|
i2c_master_wait(5);
|
||||||
|
i2c_master_setDC(1, 1);
|
||||||
|
i2c_master_wait(5);
|
||||||
|
|
||||||
|
retVal = i2c_master_getDC();
|
||||||
|
i2c_master_wait(5);
|
||||||
|
i2c_master_setDC(1, 0);
|
||||||
|
i2c_master_wait(5);
|
||||||
|
|
||||||
|
return retVal;
|
||||||
|
}
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* FunctionName : i2c_master_readByte
|
||||||
|
* Description : read Byte from i2c bus
|
||||||
|
* Parameters : NONE
|
||||||
|
* Returns : uint8 - readed value
|
||||||
|
*******************************************************************************/
|
||||||
|
uint8 ICACHE_FLASH_ATTR
|
||||||
|
i2c_master_readByte(void)
|
||||||
|
{
|
||||||
|
uint8 retVal = 0;
|
||||||
|
uint8 k, i;
|
||||||
|
|
||||||
|
i2c_master_wait(5);
|
||||||
|
i2c_master_setDC(m_nLastSDA, 0);
|
||||||
|
i2c_master_wait(5); // sda 1, scl 0
|
||||||
|
|
||||||
|
for (i = 0; i < 8; i++) {
|
||||||
|
i2c_master_wait(5);
|
||||||
|
i2c_master_setDC(1, 0);
|
||||||
|
i2c_master_wait(5); // sda 1, scl 0
|
||||||
|
i2c_master_setDC(1, 1);
|
||||||
|
i2c_master_wait(5); // sda 1, scl 1
|
||||||
|
|
||||||
|
k = i2c_master_getDC();
|
||||||
|
i2c_master_wait(5);
|
||||||
|
|
||||||
|
if (i == 7) {
|
||||||
|
i2c_master_wait(3); ////
|
||||||
|
}
|
||||||
|
|
||||||
|
k <<= (7 - i);
|
||||||
|
retVal |= k;
|
||||||
|
}
|
||||||
|
|
||||||
|
i2c_master_setDC(1, 0);
|
||||||
|
i2c_master_wait(5); // sda 1, scl 0
|
||||||
|
|
||||||
|
return retVal;
|
||||||
|
}
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* FunctionName : i2c_master_writeByte
|
||||||
|
* Description : write wrdata value(one byte) into i2c
|
||||||
|
* Parameters : uint8 wrdata - write value
|
||||||
|
* Returns : NONE
|
||||||
|
*******************************************************************************/
|
||||||
|
void ICACHE_FLASH_ATTR
|
||||||
|
i2c_master_writeByte(uint8 wrdata)
|
||||||
|
{
|
||||||
|
uint8 dat;
|
||||||
|
sint8 i;
|
||||||
|
|
||||||
|
i2c_master_wait(5);
|
||||||
|
|
||||||
|
i2c_master_setDC(m_nLastSDA, 0);
|
||||||
|
i2c_master_wait(5);
|
||||||
|
|
||||||
|
for (i = 7; i >= 0; i--) {
|
||||||
|
dat = wrdata >> i;
|
||||||
|
i2c_master_setDC(dat, 0);
|
||||||
|
i2c_master_wait(5);
|
||||||
|
i2c_master_setDC(dat, 1);
|
||||||
|
i2c_master_wait(5);
|
||||||
|
|
||||||
|
if (i == 0) {
|
||||||
|
i2c_master_wait(3); ////
|
||||||
|
}
|
||||||
|
|
||||||
|
i2c_master_setDC(dat, 0);
|
||||||
|
i2c_master_wait(5);
|
||||||
|
}
|
||||||
|
}
|
162
app/driver/key.c
Normal file
162
app/driver/key.c
Normal file
@ -0,0 +1,162 @@
|
|||||||
|
/******************************************************************************
|
||||||
|
* Copyright 2013-2014 Espressif Systems (Wuxi)
|
||||||
|
*
|
||||||
|
* FileName: key.c
|
||||||
|
*
|
||||||
|
* Description: key driver, now can use different gpio and install different function
|
||||||
|
*
|
||||||
|
* Modification history:
|
||||||
|
* 2014/5/1, v1.0 create this file.
|
||||||
|
*******************************************************************************/
|
||||||
|
#include "ets_sys.h"
|
||||||
|
#include "os_type.h"
|
||||||
|
#include "osapi.h"
|
||||||
|
#include "mem.h"
|
||||||
|
#include "gpio.h"
|
||||||
|
#include "user_interface.h"
|
||||||
|
|
||||||
|
#include "driver/key.h"
|
||||||
|
|
||||||
|
LOCAL void key_intr_handler(struct keys_param *keys);
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* FunctionName : key_init_single
|
||||||
|
* Description : init single key's gpio and register function
|
||||||
|
* Parameters : uint8 gpio_id - which gpio to use
|
||||||
|
* uint32 gpio_name - gpio mux name
|
||||||
|
* uint32 gpio_func - gpio function
|
||||||
|
* key_function long_press - long press function, needed to install
|
||||||
|
* key_function short_press - short press function, needed to install
|
||||||
|
* Returns : single_key_param - single key parameter, needed by key init
|
||||||
|
*******************************************************************************/
|
||||||
|
struct single_key_param *ICACHE_FLASH_ATTR
|
||||||
|
key_init_single(uint8 gpio_id, uint32 gpio_name, uint8 gpio_func, key_function long_press, key_function short_press)
|
||||||
|
{
|
||||||
|
struct single_key_param *single_key = (struct single_key_param *)os_zalloc(sizeof(struct single_key_param));
|
||||||
|
|
||||||
|
single_key->gpio_id = gpio_id;
|
||||||
|
single_key->gpio_name = gpio_name;
|
||||||
|
single_key->gpio_func = gpio_func;
|
||||||
|
single_key->long_press = long_press;
|
||||||
|
single_key->short_press = short_press;
|
||||||
|
|
||||||
|
return single_key;
|
||||||
|
}
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* FunctionName : key_init
|
||||||
|
* Description : init keys
|
||||||
|
* Parameters : key_param *keys - keys parameter, which inited by key_init_single
|
||||||
|
* Returns : none
|
||||||
|
*******************************************************************************/
|
||||||
|
void ICACHE_FLASH_ATTR
|
||||||
|
key_init(struct keys_param *keys)
|
||||||
|
{
|
||||||
|
uint8 i;
|
||||||
|
|
||||||
|
ETS_GPIO_INTR_ATTACH(key_intr_handler, keys);
|
||||||
|
|
||||||
|
ETS_GPIO_INTR_DISABLE();
|
||||||
|
|
||||||
|
for (i = 0; i < keys->key_num; i++) {
|
||||||
|
keys->single_key[i]->key_level = 1;
|
||||||
|
|
||||||
|
PIN_FUNC_SELECT(keys->single_key[i]->gpio_name, keys->single_key[i]->gpio_func);
|
||||||
|
|
||||||
|
gpio_output_set(0, 0, 0, GPIO_ID_PIN(keys->single_key[i]->gpio_id));
|
||||||
|
|
||||||
|
gpio_register_set(GPIO_PIN_ADDR(keys->single_key[i]->gpio_id), GPIO_PIN_INT_TYPE_SET(GPIO_PIN_INTR_DISABLE)
|
||||||
|
| GPIO_PIN_PAD_DRIVER_SET(GPIO_PAD_DRIVER_DISABLE)
|
||||||
|
| GPIO_PIN_SOURCE_SET(GPIO_AS_PIN_SOURCE));
|
||||||
|
|
||||||
|
//clear gpio14 status
|
||||||
|
GPIO_REG_WRITE(GPIO_STATUS_W1TC_ADDRESS, BIT(keys->single_key[i]->gpio_id));
|
||||||
|
|
||||||
|
//enable interrupt
|
||||||
|
gpio_pin_intr_state_set(GPIO_ID_PIN(keys->single_key[i]->gpio_id), GPIO_PIN_INTR_NEGEDGE);
|
||||||
|
}
|
||||||
|
|
||||||
|
ETS_GPIO_INTR_ENABLE();
|
||||||
|
}
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* FunctionName : key_5s_cb
|
||||||
|
* Description : long press 5s timer callback
|
||||||
|
* Parameters : single_key_param *single_key - single key parameter
|
||||||
|
* Returns : none
|
||||||
|
*******************************************************************************/
|
||||||
|
LOCAL void ICACHE_FLASH_ATTR
|
||||||
|
key_5s_cb(struct single_key_param *single_key)
|
||||||
|
{
|
||||||
|
os_timer_disarm(&single_key->key_5s);
|
||||||
|
|
||||||
|
// low, then restart
|
||||||
|
if (0 == GPIO_INPUT_GET(GPIO_ID_PIN(single_key->gpio_id))) {
|
||||||
|
if (single_key->long_press) {
|
||||||
|
single_key->long_press();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* FunctionName : key_50ms_cb
|
||||||
|
* Description : 50ms timer callback to check it's a real key push
|
||||||
|
* Parameters : single_key_param *single_key - single key parameter
|
||||||
|
* Returns : none
|
||||||
|
*******************************************************************************/
|
||||||
|
LOCAL void ICACHE_FLASH_ATTR
|
||||||
|
key_50ms_cb(struct single_key_param *single_key)
|
||||||
|
{
|
||||||
|
os_timer_disarm(&single_key->key_50ms);
|
||||||
|
|
||||||
|
// high, then key is up
|
||||||
|
if (1 == GPIO_INPUT_GET(GPIO_ID_PIN(single_key->gpio_id))) {
|
||||||
|
os_timer_disarm(&single_key->key_5s);
|
||||||
|
single_key->key_level = 1;
|
||||||
|
gpio_pin_intr_state_set(GPIO_ID_PIN(single_key->gpio_id), GPIO_PIN_INTR_NEGEDGE);
|
||||||
|
|
||||||
|
if (single_key->short_press) {
|
||||||
|
single_key->short_press();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
gpio_pin_intr_state_set(GPIO_ID_PIN(single_key->gpio_id), GPIO_PIN_INTR_POSEDGE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* FunctionName : key_intr_handler
|
||||||
|
* Description : key interrupt handler
|
||||||
|
* Parameters : key_param *keys - keys parameter, which inited by key_init_single
|
||||||
|
* Returns : none
|
||||||
|
*******************************************************************************/
|
||||||
|
LOCAL void
|
||||||
|
key_intr_handler(struct keys_param *keys)
|
||||||
|
{
|
||||||
|
uint8 i;
|
||||||
|
uint32 gpio_status = GPIO_REG_READ(GPIO_STATUS_ADDRESS);
|
||||||
|
|
||||||
|
for (i = 0; i < keys->key_num; i++) {
|
||||||
|
if (gpio_status & BIT(keys->single_key[i]->gpio_id)) {
|
||||||
|
//disable interrupt
|
||||||
|
gpio_pin_intr_state_set(GPIO_ID_PIN(keys->single_key[i]->gpio_id), GPIO_PIN_INTR_DISABLE);
|
||||||
|
|
||||||
|
//clear interrupt status
|
||||||
|
GPIO_REG_WRITE(GPIO_STATUS_W1TC_ADDRESS, gpio_status & BIT(keys->single_key[i]->gpio_id));
|
||||||
|
|
||||||
|
if (keys->single_key[i]->key_level == 1) {
|
||||||
|
// 5s, restart & enter softap mode
|
||||||
|
os_timer_disarm(&keys->single_key[i]->key_5s);
|
||||||
|
os_timer_setfn(&keys->single_key[i]->key_5s, (os_timer_func_t *)key_5s_cb, keys->single_key[i]);
|
||||||
|
os_timer_arm(&keys->single_key[i]->key_5s, 5000, 0);
|
||||||
|
keys->single_key[i]->key_level = 0;
|
||||||
|
gpio_pin_intr_state_set(GPIO_ID_PIN(keys->single_key[i]->gpio_id), GPIO_PIN_INTR_POSEDGE);
|
||||||
|
} else {
|
||||||
|
// 50ms, check if this is a real key up
|
||||||
|
os_timer_disarm(&keys->single_key[i]->key_50ms);
|
||||||
|
os_timer_setfn(&keys->single_key[i]->key_50ms, (os_timer_func_t *)key_50ms_cb, keys->single_key[i]);
|
||||||
|
os_timer_arm(&keys->single_key[i]->key_50ms, 50, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
547
app/driver/onewire.c
Normal file
547
app/driver/onewire.c
Normal file
@ -0,0 +1,547 @@
|
|||||||
|
/*
|
||||||
|
Adaptation of Paul Stoffregen's One wire library to the NodeMcu
|
||||||
|
|
||||||
|
The latest version of this library may be found at:
|
||||||
|
http://www.pjrc.com/teensy/td_libs_OneWire.html
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining
|
||||||
|
a copy of this software and associated documentation files (the
|
||||||
|
"Software"), to deal in the Software without restriction, including
|
||||||
|
without limitation the rights to use, copy, modify, merge, publish,
|
||||||
|
distribute, sublicense, and/or sell copies of the Software, and to
|
||||||
|
permit persons to whom the Software is furnished to do so, subject to
|
||||||
|
the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be
|
||||||
|
included in all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||||
|
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||||
|
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||||
|
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
|
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
|
||||||
|
Much of the code was inspired by Derek Yerger's code, though I don't
|
||||||
|
think much of that remains. In any event that was..
|
||||||
|
(copyleft) 2006 by Derek Yerger - Free to distribute freely.
|
||||||
|
|
||||||
|
The CRC code was excerpted and inspired by the Dallas Semiconductor
|
||||||
|
sample code bearing this copyright.
|
||||||
|
//---------------------------------------------------------------------------
|
||||||
|
// Copyright (C) 2000 Dallas Semiconductor Corporation, All Rights Reserved.
|
||||||
|
//
|
||||||
|
// Permission is hereby granted, free of charge, to any person obtaining a
|
||||||
|
// copy of this software and associated documentation files (the "Software"),
|
||||||
|
// to deal in the Software without restriction, including without limitation
|
||||||
|
// the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||||
|
// and/or sell copies of the Software, and to permit persons to whom the
|
||||||
|
// Software is furnished to do so, subject to the following conditions:
|
||||||
|
//
|
||||||
|
// The above copyright notice and this permission notice shall be included
|
||||||
|
// in all copies or substantial portions of the Software.
|
||||||
|
//
|
||||||
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||||
|
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||||
|
// IN NO EVENT SHALL DALLAS SEMICONDUCTOR BE LIABLE FOR ANY CLAIM, DAMAGES
|
||||||
|
// OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||||
|
// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||||
|
// OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
//
|
||||||
|
// Except as contained in this notice, the name of Dallas Semiconductor
|
||||||
|
// shall not be used except as stated in the Dallas Semiconductor
|
||||||
|
// Branding Policy.
|
||||||
|
//--------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "driver/onewire.h"
|
||||||
|
#include "platform.h"
|
||||||
|
#include "osapi.h"
|
||||||
|
|
||||||
|
#define noInterrupts os_intr_lock
|
||||||
|
#define interrupts os_intr_unlock
|
||||||
|
#define delayMicroseconds os_delay_us
|
||||||
|
|
||||||
|
#if ONEWIRE_SEARCH
|
||||||
|
// global search state
|
||||||
|
static unsigned char ROM_NO[NUM_OW][8];
|
||||||
|
static uint8_t LastDiscrepancy[NUM_OW];
|
||||||
|
static uint8_t LastFamilyDiscrepancy[NUM_OW];
|
||||||
|
static uint8_t LastDeviceFlag[NUM_OW];
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void ICACHE_FLASH_ATTR onewire_init(uint8_t pin)
|
||||||
|
{
|
||||||
|
// pinMode(pin, INPUT);
|
||||||
|
platform_gpio_mode(pin, PLATFORM_GPIO_INPUT, PLATFORM_GPIO_PULLUP);
|
||||||
|
#if ONEWIRE_SEARCH
|
||||||
|
onewire_reset_search(pin);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Perform the onewire reset function. We will wait up to 250uS for
|
||||||
|
// the bus to come high, if it doesn't then it is broken or shorted
|
||||||
|
// and we return a 0;
|
||||||
|
//
|
||||||
|
// Returns 1 if a device asserted a presence pulse, 0 otherwise.
|
||||||
|
//
|
||||||
|
uint8_t ICACHE_FLASH_ATTR onewire_reset(uint8_t pin)
|
||||||
|
{
|
||||||
|
uint8_t r;
|
||||||
|
uint8_t retries = 125;
|
||||||
|
|
||||||
|
noInterrupts();
|
||||||
|
DIRECT_MODE_INPUT(pin);
|
||||||
|
interrupts();
|
||||||
|
// wait until the wire is high... just in case
|
||||||
|
do {
|
||||||
|
if (--retries == 0) return 0;
|
||||||
|
delayMicroseconds(2);
|
||||||
|
} while ( !DIRECT_READ(pin));
|
||||||
|
|
||||||
|
noInterrupts();
|
||||||
|
DIRECT_WRITE_LOW(pin);
|
||||||
|
DIRECT_MODE_OUTPUT(pin); // drive output low
|
||||||
|
interrupts();
|
||||||
|
delayMicroseconds(480);
|
||||||
|
noInterrupts();
|
||||||
|
DIRECT_MODE_INPUT(pin); // allow it to float
|
||||||
|
delayMicroseconds(70);
|
||||||
|
r = !DIRECT_READ(pin);
|
||||||
|
interrupts();
|
||||||
|
delayMicroseconds(410);
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Write a bit. Port and bit is used to cut lookup time and provide
|
||||||
|
// more certain timing.
|
||||||
|
//
|
||||||
|
static void ICACHE_FLASH_ATTR onewire_write_bit(uint8_t pin, uint8_t v)
|
||||||
|
{
|
||||||
|
if (v & 1) {
|
||||||
|
noInterrupts();
|
||||||
|
DIRECT_WRITE_LOW(pin);
|
||||||
|
DIRECT_MODE_OUTPUT(pin); // drive output low
|
||||||
|
delayMicroseconds(10);
|
||||||
|
DIRECT_WRITE_HIGH(pin); // drive output high
|
||||||
|
interrupts();
|
||||||
|
delayMicroseconds(55);
|
||||||
|
} else {
|
||||||
|
noInterrupts();
|
||||||
|
DIRECT_WRITE_LOW(pin);
|
||||||
|
DIRECT_MODE_OUTPUT(pin); // drive output low
|
||||||
|
delayMicroseconds(65);
|
||||||
|
DIRECT_WRITE_HIGH(pin); // drive output high
|
||||||
|
interrupts();
|
||||||
|
delayMicroseconds(5);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Read a bit. Port and bit is used to cut lookup time and provide
|
||||||
|
// more certain timing.
|
||||||
|
//
|
||||||
|
static uint8_t ICACHE_FLASH_ATTR onewire_read_bit(uint8_t pin)
|
||||||
|
{
|
||||||
|
uint8_t r;
|
||||||
|
|
||||||
|
noInterrupts();
|
||||||
|
DIRECT_MODE_OUTPUT(pin);
|
||||||
|
DIRECT_WRITE_LOW(pin);
|
||||||
|
delayMicroseconds(3);
|
||||||
|
DIRECT_MODE_INPUT(pin); // let pin float, pull up will raise
|
||||||
|
delayMicroseconds(10);
|
||||||
|
r = DIRECT_READ(pin);
|
||||||
|
interrupts();
|
||||||
|
delayMicroseconds(53);
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Write a byte. The writing code uses the active drivers to raise the
|
||||||
|
// pin high, if you need power after the write (e.g. DS18S20 in
|
||||||
|
// parasite power mode) then set 'power' to 1, otherwise the pin will
|
||||||
|
// go tri-state at the end of the write to avoid heating in a short or
|
||||||
|
// other mishap.
|
||||||
|
//
|
||||||
|
void ICACHE_FLASH_ATTR onewire_write(uint8_t pin, uint8_t v, uint8_t power /* = 0 */) {
|
||||||
|
uint8_t bitMask;
|
||||||
|
|
||||||
|
for (bitMask = 0x01; bitMask; bitMask <<= 1) {
|
||||||
|
onewire_write_bit(pin, (bitMask & v)?1:0);
|
||||||
|
}
|
||||||
|
if ( !power) {
|
||||||
|
noInterrupts();
|
||||||
|
DIRECT_MODE_INPUT(pin);
|
||||||
|
DIRECT_WRITE_LOW(pin);
|
||||||
|
interrupts();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ICACHE_FLASH_ATTR onewire_write_bytes(uint8_t pin, const uint8_t *buf, uint16_t count, bool power /* = 0 */) {
|
||||||
|
uint16_t i;
|
||||||
|
for (i = 0 ; i < count ; i++)
|
||||||
|
onewire_write(pin, buf[i], 0);
|
||||||
|
if (!power) {
|
||||||
|
noInterrupts();
|
||||||
|
DIRECT_MODE_INPUT(pin);
|
||||||
|
DIRECT_WRITE_LOW(pin);
|
||||||
|
interrupts();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Read a byte
|
||||||
|
//
|
||||||
|
uint8_t ICACHE_FLASH_ATTR onewire_read(uint8_t pin) {
|
||||||
|
uint8_t bitMask;
|
||||||
|
uint8_t r = 0;
|
||||||
|
|
||||||
|
for (bitMask = 0x01; bitMask; bitMask <<= 1) {
|
||||||
|
if (onewire_read_bit(pin)) r |= bitMask;
|
||||||
|
}
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ICACHE_FLASH_ATTR onewire_read_bytes(uint8_t pin, uint8_t *buf, uint16_t count) {
|
||||||
|
uint16_t i;
|
||||||
|
for (i = 0 ; i < count ; i++)
|
||||||
|
buf[i] = onewire_read(pin);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Do a ROM select
|
||||||
|
//
|
||||||
|
void ICACHE_FLASH_ATTR onewire_select(uint8_t pin, const uint8_t rom[8])
|
||||||
|
{
|
||||||
|
uint8_t i;
|
||||||
|
|
||||||
|
onewire_write(pin, 0x55, 0); // Choose ROM
|
||||||
|
|
||||||
|
for (i = 0; i < 8; i++) onewire_write(pin, rom[i], 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Do a ROM skip
|
||||||
|
//
|
||||||
|
void ICACHE_FLASH_ATTR onewire_skip(uint8_t pin)
|
||||||
|
{
|
||||||
|
onewire_write(pin, 0xCC, 0); // Skip ROM
|
||||||
|
}
|
||||||
|
|
||||||
|
void ICACHE_FLASH_ATTR onewire_depower(uint8_t pin)
|
||||||
|
{
|
||||||
|
noInterrupts();
|
||||||
|
DIRECT_MODE_INPUT(pin);
|
||||||
|
interrupts();
|
||||||
|
}
|
||||||
|
|
||||||
|
#if ONEWIRE_SEARCH
|
||||||
|
|
||||||
|
//
|
||||||
|
// You need to use this function to start a search again from the beginning.
|
||||||
|
// You do not need to do it for the first search, though you could.
|
||||||
|
//
|
||||||
|
void ICACHE_FLASH_ATTR onewire_reset_search(uint8_t pin)
|
||||||
|
{
|
||||||
|
// reset the search state
|
||||||
|
LastDiscrepancy[pin] = 0;
|
||||||
|
LastDeviceFlag[pin] = FALSE;
|
||||||
|
LastFamilyDiscrepancy[pin] = 0;
|
||||||
|
int i;
|
||||||
|
for(i = 7; ; i--) {
|
||||||
|
ROM_NO[pin][i] = 0;
|
||||||
|
if ( i == 0) break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Setup the search to find the device type 'family_code' on the next call
|
||||||
|
// to search(*newAddr) if it is present.
|
||||||
|
//
|
||||||
|
void ICACHE_FLASH_ATTR onewire_target_search(uint8_t pin, uint8_t family_code)
|
||||||
|
{
|
||||||
|
// set the search state to find SearchFamily type devices
|
||||||
|
ROM_NO[pin][0] = family_code;
|
||||||
|
uint8_t i;
|
||||||
|
for (i = 1; i < 8; i++)
|
||||||
|
ROM_NO[pin][i] = 0;
|
||||||
|
LastDiscrepancy[pin] = 64;
|
||||||
|
LastFamilyDiscrepancy[pin] = 0;
|
||||||
|
LastDeviceFlag[pin] = FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Perform a search. If this function returns a '1' then it has
|
||||||
|
// enumerated the next device and you may retrieve the ROM from the
|
||||||
|
// OneWire::address variable. If there are no devices, no further
|
||||||
|
// devices, or something horrible happens in the middle of the
|
||||||
|
// enumeration then a 0 is returned. If a new device is found then
|
||||||
|
// its address is copied to newAddr. Use OneWire::reset_search() to
|
||||||
|
// start over.
|
||||||
|
//
|
||||||
|
// --- Replaced by the one from the Dallas Semiconductor web site ---
|
||||||
|
//--------------------------------------------------------------------------
|
||||||
|
// Perform the 1-Wire Search Algorithm on the 1-Wire bus using the existing
|
||||||
|
// search state.
|
||||||
|
// Return TRUE : device found, ROM number in ROM_NO buffer
|
||||||
|
// FALSE : device not found, end of search
|
||||||
|
//
|
||||||
|
uint8_t ICACHE_FLASH_ATTR onewire_search(uint8_t pin, uint8_t *newAddr)
|
||||||
|
{
|
||||||
|
uint8_t id_bit_number;
|
||||||
|
uint8_t last_zero, rom_byte_number, search_result;
|
||||||
|
uint8_t id_bit, cmp_id_bit;
|
||||||
|
|
||||||
|
unsigned char rom_byte_mask, search_direction;
|
||||||
|
|
||||||
|
// initialize for search
|
||||||
|
id_bit_number = 1;
|
||||||
|
last_zero = 0;
|
||||||
|
rom_byte_number = 0;
|
||||||
|
rom_byte_mask = 1;
|
||||||
|
search_result = 0;
|
||||||
|
|
||||||
|
// if the last call was not the last one
|
||||||
|
if (!LastDeviceFlag[pin])
|
||||||
|
{
|
||||||
|
// 1-Wire reset
|
||||||
|
if (!onewire_reset(pin))
|
||||||
|
{
|
||||||
|
// reset the search
|
||||||
|
LastDiscrepancy[pin] = 0;
|
||||||
|
LastDeviceFlag[pin] = FALSE;
|
||||||
|
LastFamilyDiscrepancy[pin] = 0;
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// issue the search command
|
||||||
|
onewire_write(pin, 0xF0, 0);
|
||||||
|
|
||||||
|
// loop to do the search
|
||||||
|
do
|
||||||
|
{
|
||||||
|
// read a bit and its complement
|
||||||
|
id_bit = onewire_read_bit(pin);
|
||||||
|
cmp_id_bit = onewire_read_bit(pin);
|
||||||
|
|
||||||
|
// check for no devices on 1-wire
|
||||||
|
if ((id_bit == 1) && (cmp_id_bit == 1))
|
||||||
|
break;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// all devices coupled have 0 or 1
|
||||||
|
if (id_bit != cmp_id_bit)
|
||||||
|
search_direction = id_bit; // bit write value for search
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// if this discrepancy if before the Last Discrepancy
|
||||||
|
// on a previous next then pick the same as last time
|
||||||
|
if (id_bit_number < LastDiscrepancy[pin])
|
||||||
|
search_direction = ((ROM_NO[pin][rom_byte_number] & rom_byte_mask) > 0);
|
||||||
|
else
|
||||||
|
// if equal to last pick 1, if not then pick 0
|
||||||
|
search_direction = (id_bit_number == LastDiscrepancy[pin]);
|
||||||
|
|
||||||
|
// if 0 was picked then record its position in LastZero
|
||||||
|
if (search_direction == 0)
|
||||||
|
{
|
||||||
|
last_zero = id_bit_number;
|
||||||
|
|
||||||
|
// check for Last discrepancy in family
|
||||||
|
if (last_zero < 9)
|
||||||
|
LastFamilyDiscrepancy[pin] = last_zero;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// set or clear the bit in the ROM byte rom_byte_number
|
||||||
|
// with mask rom_byte_mask
|
||||||
|
if (search_direction == 1)
|
||||||
|
ROM_NO[pin][rom_byte_number] |= rom_byte_mask;
|
||||||
|
else
|
||||||
|
ROM_NO[pin][rom_byte_number] &= ~rom_byte_mask;
|
||||||
|
|
||||||
|
// serial number search direction write bit
|
||||||
|
onewire_write_bit(pin, search_direction);
|
||||||
|
|
||||||
|
// increment the byte counter id_bit_number
|
||||||
|
// and shift the mask rom_byte_mask
|
||||||
|
id_bit_number++;
|
||||||
|
rom_byte_mask <<= 1;
|
||||||
|
|
||||||
|
// if the mask is 0 then go to new SerialNum byte rom_byte_number and reset mask
|
||||||
|
if (rom_byte_mask == 0)
|
||||||
|
{
|
||||||
|
rom_byte_number++;
|
||||||
|
rom_byte_mask = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
while(rom_byte_number < 8); // loop until through all ROM bytes 0-7
|
||||||
|
|
||||||
|
// if the search was successful then
|
||||||
|
if (!(id_bit_number < 65))
|
||||||
|
{
|
||||||
|
// search successful so set LastDiscrepancy,LastDeviceFlag,search_result
|
||||||
|
LastDiscrepancy[pin] = last_zero;
|
||||||
|
|
||||||
|
// check for last device
|
||||||
|
if (LastDiscrepancy[pin] == 0)
|
||||||
|
LastDeviceFlag[pin] = TRUE;
|
||||||
|
|
||||||
|
search_result = TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// if no device found then reset counters so next 'search' will be like a first
|
||||||
|
if (!search_result || !ROM_NO[pin][0])
|
||||||
|
{
|
||||||
|
LastDiscrepancy[pin] = 0;
|
||||||
|
LastDeviceFlag[pin] = FALSE;
|
||||||
|
LastFamilyDiscrepancy[pin] = 0;
|
||||||
|
search_result = FALSE;
|
||||||
|
}
|
||||||
|
int i;
|
||||||
|
for (i = 0; i < 8; i++) newAddr[i] = ROM_NO[pin][i];
|
||||||
|
return search_result;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#if ONEWIRE_CRC
|
||||||
|
// The 1-Wire CRC scheme is described in Maxim Application Note 27:
|
||||||
|
// "Understanding and Using Cyclic Redundancy Checks with Maxim iButton Products"
|
||||||
|
//
|
||||||
|
|
||||||
|
#if ONEWIRE_CRC8_TABLE
|
||||||
|
// This table comes from Dallas sample code where it is freely reusable,
|
||||||
|
// though Copyright (C) 2000 Dallas Semiconductor Corporation
|
||||||
|
static const uint8_t dscrc_table[] = {
|
||||||
|
0, 94,188,226, 97, 63,221,131,194,156,126, 32,163,253, 31, 65,
|
||||||
|
157,195, 33,127,252,162, 64, 30, 95, 1,227,189, 62, 96,130,220,
|
||||||
|
35,125,159,193, 66, 28,254,160,225,191, 93, 3,128,222, 60, 98,
|
||||||
|
190,224, 2, 92,223,129, 99, 61,124, 34,192,158, 29, 67,161,255,
|
||||||
|
70, 24,250,164, 39,121,155,197,132,218, 56,102,229,187, 89, 7,
|
||||||
|
219,133,103, 57,186,228, 6, 88, 25, 71,165,251,120, 38,196,154,
|
||||||
|
101, 59,217,135, 4, 90,184,230,167,249, 27, 69,198,152,122, 36,
|
||||||
|
248,166, 68, 26,153,199, 37,123, 58,100,134,216, 91, 5,231,185,
|
||||||
|
140,210, 48,110,237,179, 81, 15, 78, 16,242,172, 47,113,147,205,
|
||||||
|
17, 79,173,243,112, 46,204,146,211,141,111, 49,178,236, 14, 80,
|
||||||
|
175,241, 19, 77,206,144,114, 44,109, 51,209,143, 12, 82,176,238,
|
||||||
|
50,108,142,208, 83, 13,239,177,240,174, 76, 18,145,207, 45,115,
|
||||||
|
202,148,118, 40,171,245, 23, 73, 8, 86,180,234,105, 55,213,139,
|
||||||
|
87, 9,235,181, 54,104,138,212,149,203, 41,119,244,170, 72, 22,
|
||||||
|
233,183, 85, 11,136,214, 52,106, 43,117,151,201, 74, 20,246,168,
|
||||||
|
116, 42,200,150, 21, 75,169,247,182,232, 10, 84,215,137,107, 53};
|
||||||
|
|
||||||
|
#ifndef pgm_read_byte
|
||||||
|
#define pgm_read_byte(addr) (*(const uint8_t *)(addr))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//
|
||||||
|
// Compute a Dallas Semiconductor 8 bit CRC. These show up in the ROM
|
||||||
|
// and the registers. (note: this might better be done without to
|
||||||
|
// table, it would probably be smaller and certainly fast enough
|
||||||
|
// compared to all those delayMicrosecond() calls. But I got
|
||||||
|
// confused, so I use this table from the examples.)
|
||||||
|
//
|
||||||
|
uint8_t ICACHE_FLASH_ATTR onewire_crc8(const uint8_t *addr, uint8_t len)
|
||||||
|
{
|
||||||
|
uint8_t crc = 0;
|
||||||
|
|
||||||
|
while (len--) {
|
||||||
|
crc = pgm_read_byte(dscrc_table + (crc ^ *addr++));
|
||||||
|
}
|
||||||
|
return crc;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
//
|
||||||
|
// Compute a Dallas Semiconductor 8 bit CRC directly.
|
||||||
|
// this is much slower, but much smaller, than the lookup table.
|
||||||
|
//
|
||||||
|
uint8_t ICACHE_FLASH_ATTR onewire_crc8(const uint8_t *addr, uint8_t len)
|
||||||
|
{
|
||||||
|
uint8_t crc = 0;
|
||||||
|
|
||||||
|
while (len--) {
|
||||||
|
uint8_t inbyte = *addr++;
|
||||||
|
for (uint8_t i = 8; i; i--) {
|
||||||
|
uint8_t mix = (crc ^ inbyte) & 0x01;
|
||||||
|
crc >>= 1;
|
||||||
|
if (mix) crc ^= 0x8C;
|
||||||
|
inbyte >>= 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return crc;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if ONEWIRE_CRC16
|
||||||
|
// Compute the 1-Wire CRC16 and compare it against the received CRC.
|
||||||
|
// Example usage (reading a DS2408):
|
||||||
|
// // Put everything in a buffer so we can compute the CRC easily.
|
||||||
|
// uint8_t buf[13];
|
||||||
|
// buf[0] = 0xF0; // Read PIO Registers
|
||||||
|
// buf[1] = 0x88; // LSB address
|
||||||
|
// buf[2] = 0x00; // MSB address
|
||||||
|
// WriteBytes(net, buf, 3); // Write 3 cmd bytes
|
||||||
|
// ReadBytes(net, buf+3, 10); // Read 6 data bytes, 2 0xFF, 2 CRC16
|
||||||
|
// if (!CheckCRC16(buf, 11, &buf[11])) {
|
||||||
|
// // Handle error.
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// @param input - Array of bytes to checksum.
|
||||||
|
// @param len - How many bytes to use.
|
||||||
|
// @param inverted_crc - The two CRC16 bytes in the received data.
|
||||||
|
// This should just point into the received data,
|
||||||
|
// *not* at a 16-bit integer.
|
||||||
|
// @param crc - The crc starting value (optional)
|
||||||
|
// @return True, iff the CRC matches.
|
||||||
|
bool ICACHE_FLASH_ATTR onewire_check_crc16(const uint8_t* input, uint16_t len, const uint8_t* inverted_crc, uint16_t crc)
|
||||||
|
{
|
||||||
|
crc = ~onewire_crc16(input, len, crc);
|
||||||
|
return (crc & 0xFF) == inverted_crc[0] && (crc >> 8) == inverted_crc[1];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Compute a Dallas Semiconductor 16 bit CRC. This is required to check
|
||||||
|
// the integrity of data received from many 1-Wire devices. Note that the
|
||||||
|
// CRC computed here is *not* what you'll get from the 1-Wire network,
|
||||||
|
// for two reasons:
|
||||||
|
// 1) The CRC is transmitted bitwise inverted.
|
||||||
|
// 2) Depending on the endian-ness of your processor, the binary
|
||||||
|
// representation of the two-byte return value may have a different
|
||||||
|
// byte order than the two bytes you get from 1-Wire.
|
||||||
|
// @param input - Array of bytes to checksum.
|
||||||
|
// @param len - How many bytes to use.
|
||||||
|
// @param crc - The crc starting value (optional)
|
||||||
|
// @return The CRC16, as defined by Dallas Semiconductor.
|
||||||
|
uint16_t ICACHE_FLASH_ATTR onewire_crc16(const uint8_t* input, uint16_t len, uint16_t crc)
|
||||||
|
{
|
||||||
|
static const uint8_t oddparity[16] =
|
||||||
|
{ 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0 };
|
||||||
|
|
||||||
|
uint16_t i;
|
||||||
|
for (i = 0 ; i < len ; i++) {
|
||||||
|
// Even though we're just copying a byte from the input,
|
||||||
|
// we'll be doing 16-bit computation with it.
|
||||||
|
uint16_t cdata = input[i];
|
||||||
|
cdata = (cdata ^ crc) & 0xff;
|
||||||
|
crc >>= 8;
|
||||||
|
|
||||||
|
if (oddparity[cdata & 0x0F] ^ oddparity[cdata >> 4])
|
||||||
|
crc ^= 0xC001;
|
||||||
|
|
||||||
|
cdata <<= 6;
|
||||||
|
crc ^= cdata;
|
||||||
|
cdata <<= 1;
|
||||||
|
crc ^= cdata;
|
||||||
|
}
|
||||||
|
return crc;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
446
app/driver/pwm.c
Normal file
446
app/driver/pwm.c
Normal file
@ -0,0 +1,446 @@
|
|||||||
|
/******************************************************************************
|
||||||
|
* Copyright 2013-2014 Espressif Systems (Wuxi)
|
||||||
|
*
|
||||||
|
* FileName: pwm.c
|
||||||
|
*
|
||||||
|
* Description: pwm driver
|
||||||
|
*
|
||||||
|
* Modification history:
|
||||||
|
* 2014/5/1, v1.0 create this file.
|
||||||
|
*******************************************************************************/
|
||||||
|
#include "platform.h"
|
||||||
|
|
||||||
|
#include "ets_sys.h"
|
||||||
|
#include "os_type.h"
|
||||||
|
#include "osapi.h"
|
||||||
|
#include "gpio.h"
|
||||||
|
|
||||||
|
#include "user_interface.h"
|
||||||
|
#include "driver/pwm.h"
|
||||||
|
|
||||||
|
// #define PWM_DBG os_printf
|
||||||
|
#define PWM_DBG
|
||||||
|
|
||||||
|
LOCAL struct pwm_single_param pwm_single_toggle[2][PWM_CHANNEL + 1];
|
||||||
|
LOCAL struct pwm_single_param *pwm_single;
|
||||||
|
|
||||||
|
LOCAL struct pwm_param pwm;
|
||||||
|
|
||||||
|
// LOCAL uint8 pwm_out_io_num[PWM_CHANNEL] = {PWM_0_OUT_IO_NUM, PWM_1_OUT_IO_NUM, PWM_2_OUT_IO_NUM};
|
||||||
|
LOCAL int8 pwm_out_io_num[PWM_CHANNEL] = {-1, -1, -1, -1, -1, -1};
|
||||||
|
|
||||||
|
LOCAL uint8 pwm_channel_toggle[2];
|
||||||
|
LOCAL uint8 *pwm_channel;
|
||||||
|
|
||||||
|
LOCAL uint8 pwm_toggle = 1;
|
||||||
|
LOCAL uint8 pwm_timer_down = 1;
|
||||||
|
|
||||||
|
LOCAL uint8 pwm_current_channel = 0;
|
||||||
|
|
||||||
|
LOCAL uint16 pwm_gpio = 0;
|
||||||
|
|
||||||
|
LOCAL uint8 pwm_channel_num = 0;
|
||||||
|
|
||||||
|
//XXX: 0xffffffff/(80000000/16)=35A
|
||||||
|
#define US_TO_RTC_TIMER_TICKS(t) \
|
||||||
|
((t) ? \
|
||||||
|
(((t) > 0x35A) ? \
|
||||||
|
(((t)>>2) * ((APB_CLK_FREQ>>4)/250000) + ((t)&0x3) * ((APB_CLK_FREQ>>4)/1000000)) : \
|
||||||
|
(((t) *(APB_CLK_FREQ>>4)) / 1000000)) : \
|
||||||
|
0)
|
||||||
|
|
||||||
|
//FRC1
|
||||||
|
#define FRC1_ENABLE_TIMER BIT7
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
DIVDED_BY_1 = 0,
|
||||||
|
DIVDED_BY_16 = 4,
|
||||||
|
DIVDED_BY_256 = 8,
|
||||||
|
} TIMER_PREDIVED_MODE;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
TM_LEVEL_INT = 1,
|
||||||
|
TM_EDGE_INT = 0,
|
||||||
|
} TIMER_INT_MODE;
|
||||||
|
|
||||||
|
LOCAL void ICACHE_FLASH_ATTR
|
||||||
|
pwm_insert_sort(struct pwm_single_param pwm[], uint8 n)
|
||||||
|
{
|
||||||
|
uint8 i;
|
||||||
|
|
||||||
|
for (i = 1; i < n; i++) {
|
||||||
|
if (pwm[i].h_time < pwm[i - 1].h_time) {
|
||||||
|
int8 j = i - 1;
|
||||||
|
struct pwm_single_param tmp;
|
||||||
|
|
||||||
|
os_memcpy(&tmp, &pwm[i], sizeof(struct pwm_single_param));
|
||||||
|
os_memcpy(&pwm[i], &pwm[i - 1], sizeof(struct pwm_single_param));
|
||||||
|
|
||||||
|
while (tmp.h_time < pwm[j].h_time) {
|
||||||
|
os_memcpy(&pwm[j + 1], &pwm[j], sizeof(struct pwm_single_param));
|
||||||
|
j--;
|
||||||
|
if (j < 0) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
os_memcpy(&pwm[j + 1], &tmp, sizeof(struct pwm_single_param));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
LOCAL volatile uint8 critical = 0;
|
||||||
|
|
||||||
|
#define LOCK_PWM(c) do { \
|
||||||
|
while( (c)==1 ); \
|
||||||
|
(c) = 1; \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define UNLOCK_PWM(c) do { \
|
||||||
|
(c) = 0; \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
void ICACHE_FLASH_ATTR
|
||||||
|
pwm_start(void)
|
||||||
|
{
|
||||||
|
uint8 i, j;
|
||||||
|
PWM_DBG("--Function pwm_start() is called\n");
|
||||||
|
PWM_DBG("pwm_gpio:%x,pwm_channel_num:%d\n",pwm_gpio,pwm_channel_num);
|
||||||
|
PWM_DBG("pwm_out_io_num[0]:%d,[1]:%d,[2]:%d\n",pwm_out_io_num[0],pwm_out_io_num[1],pwm_out_io_num[2]);
|
||||||
|
PWM_DBG("pwm.period:%d,pwm.duty[0]:%d,[1]:%d,[2]:%d\n",pwm.period,pwm.duty[0],pwm.duty[1],pwm.duty[2]);
|
||||||
|
|
||||||
|
LOCK_PWM(critical); // enter critical
|
||||||
|
|
||||||
|
struct pwm_single_param *local_single = pwm_single_toggle[pwm_toggle ^ 0x01];
|
||||||
|
uint8 *local_channel = &pwm_channel_toggle[pwm_toggle ^ 0x01];
|
||||||
|
|
||||||
|
// step 1: init PWM_CHANNEL+1 channels param
|
||||||
|
for (i = 0; i < pwm_channel_num; i++) {
|
||||||
|
uint32 us = pwm.period * pwm.duty[i] / PWM_DEPTH;
|
||||||
|
local_single[i].h_time = US_TO_RTC_TIMER_TICKS(us);
|
||||||
|
PWM_DBG("i:%d us:%d ht:%d\n",i,us,local_single[i].h_time);
|
||||||
|
local_single[i].gpio_set = 0;
|
||||||
|
local_single[i].gpio_clear = 1 << pin_num[pwm_out_io_num[i]];
|
||||||
|
}
|
||||||
|
|
||||||
|
local_single[pwm_channel_num].h_time = US_TO_RTC_TIMER_TICKS(pwm.period);
|
||||||
|
local_single[pwm_channel_num].gpio_set = pwm_gpio;
|
||||||
|
local_single[pwm_channel_num].gpio_clear = 0;
|
||||||
|
PWM_DBG("i:%d period:%d ht:%d\n",pwm_channel_num,pwm.period,local_single[pwm_channel_num].h_time);
|
||||||
|
// step 2: sort, small to big
|
||||||
|
pwm_insert_sort(local_single, pwm_channel_num + 1);
|
||||||
|
|
||||||
|
*local_channel = pwm_channel_num + 1;
|
||||||
|
PWM_DBG("1channel:%d,single[0]:%d,[1]:%d,[2]:%d,[3]:%d\n",*local_channel,local_single[0].h_time,local_single[1].h_time,local_single[2].h_time,local_single[3].h_time);
|
||||||
|
// step 3: combine same duty channels
|
||||||
|
for (i = pwm_channel_num; i > 0; i--) {
|
||||||
|
if (local_single[i].h_time == local_single[i - 1].h_time) {
|
||||||
|
local_single[i - 1].gpio_set |= local_single[i].gpio_set;
|
||||||
|
local_single[i - 1].gpio_clear |= local_single[i].gpio_clear;
|
||||||
|
|
||||||
|
for (j = i + 1; j < *local_channel; j++) {
|
||||||
|
os_memcpy(&local_single[j - 1], &local_single[j], sizeof(struct pwm_single_param));
|
||||||
|
}
|
||||||
|
|
||||||
|
(*local_channel)--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
PWM_DBG("2channel:%d,single[0]:%d,[1]:%d,[2]:%d,[3]:%d\n",*local_channel,local_single[0].h_time,local_single[1].h_time,local_single[2].h_time,local_single[3].h_time);
|
||||||
|
// step 4: cacl delt time
|
||||||
|
for (i = *local_channel - 1; i > 0; i--) {
|
||||||
|
local_single[i].h_time -= local_single[i - 1].h_time;
|
||||||
|
}
|
||||||
|
|
||||||
|
// step 5: last channel needs to clean
|
||||||
|
local_single[*local_channel-1].gpio_clear = 0;
|
||||||
|
|
||||||
|
// step 6: if first channel duty is 0, remove it
|
||||||
|
if (local_single[0].h_time == 0) {
|
||||||
|
local_single[*local_channel - 1].gpio_set &= ~local_single[0].gpio_clear;
|
||||||
|
local_single[*local_channel - 1].gpio_clear |= local_single[0].gpio_clear;
|
||||||
|
|
||||||
|
for (i = 1; i < *local_channel; i++) {
|
||||||
|
os_memcpy(&local_single[i - 1], &local_single[i], sizeof(struct pwm_single_param));
|
||||||
|
}
|
||||||
|
|
||||||
|
(*local_channel)--;
|
||||||
|
}
|
||||||
|
|
||||||
|
// if timer is down, need to set gpio and start timer
|
||||||
|
if (pwm_timer_down == 1) {
|
||||||
|
pwm_channel = local_channel;
|
||||||
|
pwm_single = local_single;
|
||||||
|
// start
|
||||||
|
gpio_output_set(local_single[0].gpio_set, local_single[0].gpio_clear, pwm_gpio, 0);
|
||||||
|
|
||||||
|
// yeah, if all channels' duty is 0 or 255, don't need to start timer, otherwise start...
|
||||||
|
if (*local_channel != 1) {
|
||||||
|
pwm_timer_down = 0;
|
||||||
|
RTC_REG_WRITE(FRC1_LOAD_ADDRESS, local_single[0].h_time);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pwm_toggle == 1) {
|
||||||
|
pwm_toggle = 0;
|
||||||
|
} else {
|
||||||
|
pwm_toggle = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
UNLOCK_PWM(critical); // leave critical
|
||||||
|
PWM_DBG("3channel:%d,single[0]:%d,[1]:%d,[2]:%d,[3]:%d\n",*local_channel,local_single[0].h_time,local_single[1].h_time,local_single[2].h_time,local_single[3].h_time);
|
||||||
|
}
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* FunctionName : pwm_set_duty
|
||||||
|
* Description : set each channel's duty params
|
||||||
|
* Parameters : uint8 duty : 0 ~ PWM_DEPTH
|
||||||
|
* uint8 channel : channel index
|
||||||
|
* Returns : NONE
|
||||||
|
*******************************************************************************/
|
||||||
|
void ICACHE_FLASH_ATTR
|
||||||
|
pwm_set_duty(uint16 duty, uint8 channel)
|
||||||
|
{
|
||||||
|
uint8 i;
|
||||||
|
for(i=0;i<pwm_channel_num;i++){
|
||||||
|
if(pwm_out_io_num[i] == channel){
|
||||||
|
channel = i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(i==pwm_channel_num) // non found
|
||||||
|
return;
|
||||||
|
|
||||||
|
LOCK_PWM(critical); // enter critical
|
||||||
|
if (duty < 1) {
|
||||||
|
pwm.duty[channel] = 0;
|
||||||
|
} else if (duty >= PWM_DEPTH) {
|
||||||
|
pwm.duty[channel] = PWM_DEPTH;
|
||||||
|
} else {
|
||||||
|
pwm.duty[channel] = duty;
|
||||||
|
}
|
||||||
|
UNLOCK_PWM(critical); // leave critical
|
||||||
|
}
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* FunctionName : pwm_set_freq
|
||||||
|
* Description : set pwm frequency
|
||||||
|
* Parameters : uint16 freq : 100hz typically
|
||||||
|
* Returns : NONE
|
||||||
|
*******************************************************************************/
|
||||||
|
void ICACHE_FLASH_ATTR
|
||||||
|
pwm_set_freq(uint16 freq, uint8 channel)
|
||||||
|
{
|
||||||
|
LOCK_PWM(critical); // enter critical
|
||||||
|
if (freq > PWM_FREQ_MAX) {
|
||||||
|
pwm.freq = PWM_FREQ_MAX;
|
||||||
|
} else if (freq < 1) {
|
||||||
|
pwm.freq = 1;
|
||||||
|
} else {
|
||||||
|
pwm.freq = freq;
|
||||||
|
}
|
||||||
|
|
||||||
|
pwm.period = PWM_1S / pwm.freq;
|
||||||
|
UNLOCK_PWM(critical); // leave critical
|
||||||
|
}
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* FunctionName : pwm_set_freq_duty
|
||||||
|
* Description : set pwm frequency and each channel's duty
|
||||||
|
* Parameters : uint16 freq : 100hz typically
|
||||||
|
* uint16 *duty : each channel's duty
|
||||||
|
* Returns : NONE
|
||||||
|
*******************************************************************************/
|
||||||
|
LOCAL void ICACHE_FLASH_ATTR
|
||||||
|
pwm_set_freq_duty(uint16 freq, uint16 *duty)
|
||||||
|
{
|
||||||
|
uint8 i;
|
||||||
|
|
||||||
|
pwm_set_freq(freq, 0);
|
||||||
|
|
||||||
|
for (i = 0; i < PWM_CHANNEL; i++) {
|
||||||
|
// pwm_set_duty(duty[i], i);
|
||||||
|
if(pwm_out_io_num[i] != -1)
|
||||||
|
pwm_set_duty(duty[i], pwm_out_io_num[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* FunctionName : pwm_get_duty
|
||||||
|
* Description : get duty of each channel
|
||||||
|
* Parameters : uint8 channel : channel index
|
||||||
|
* Returns : NONE
|
||||||
|
*******************************************************************************/
|
||||||
|
uint16 ICACHE_FLASH_ATTR
|
||||||
|
pwm_get_duty(uint8 channel)
|
||||||
|
{
|
||||||
|
uint8 i;
|
||||||
|
for(i=0;i<pwm_channel_num;i++){
|
||||||
|
if(pwm_out_io_num[i] == channel){
|
||||||
|
channel = i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(i==pwm_channel_num) // non found
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
return pwm.duty[channel];
|
||||||
|
}
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* FunctionName : pwm_get_freq
|
||||||
|
* Description : get pwm frequency
|
||||||
|
* Parameters : NONE
|
||||||
|
* Returns : uint16 : pwm frequency
|
||||||
|
*******************************************************************************/
|
||||||
|
uint16 ICACHE_FLASH_ATTR
|
||||||
|
pwm_get_freq(uint8 channel)
|
||||||
|
{
|
||||||
|
return pwm.freq;
|
||||||
|
}
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* FunctionName : pwm_period_timer
|
||||||
|
* Description : pwm period timer function, output high level,
|
||||||
|
* start each channel's high level timer
|
||||||
|
* Parameters : NONE
|
||||||
|
* Returns : NONE
|
||||||
|
*******************************************************************************/
|
||||||
|
LOCAL void
|
||||||
|
pwm_tim1_intr_handler(void)
|
||||||
|
{
|
||||||
|
uint8 local_toggle = pwm_toggle; // pwm_toggle may change outside
|
||||||
|
RTC_CLR_REG_MASK(FRC1_INT_ADDRESS, FRC1_INT_CLR_MASK);
|
||||||
|
|
||||||
|
if (pwm_current_channel >= (*pwm_channel - 1)) { // *pwm_channel may change outside
|
||||||
|
pwm_single = pwm_single_toggle[local_toggle];
|
||||||
|
pwm_channel = &pwm_channel_toggle[local_toggle];
|
||||||
|
|
||||||
|
gpio_output_set(pwm_single[*pwm_channel - 1].gpio_set,
|
||||||
|
pwm_single[*pwm_channel - 1].gpio_clear,
|
||||||
|
pwm_gpio,
|
||||||
|
0);
|
||||||
|
|
||||||
|
pwm_current_channel = 0;
|
||||||
|
|
||||||
|
if (*pwm_channel != 1) {
|
||||||
|
RTC_REG_WRITE(FRC1_LOAD_ADDRESS, pwm_single[pwm_current_channel].h_time);
|
||||||
|
} else {
|
||||||
|
pwm_timer_down = 1;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
gpio_output_set(pwm_single[pwm_current_channel].gpio_set,
|
||||||
|
pwm_single[pwm_current_channel].gpio_clear,
|
||||||
|
pwm_gpio, 0);
|
||||||
|
|
||||||
|
pwm_current_channel++;
|
||||||
|
RTC_REG_WRITE(FRC1_LOAD_ADDRESS, pwm_single[pwm_current_channel].h_time);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* FunctionName : pwm_init
|
||||||
|
* Description : pwm gpio, params and timer initialization
|
||||||
|
* Parameters : uint16 freq : pwm freq param
|
||||||
|
* uint16 *duty : each channel's duty
|
||||||
|
* Returns : NONE
|
||||||
|
*******************************************************************************/
|
||||||
|
void ICACHE_FLASH_ATTR
|
||||||
|
pwm_init(uint16 freq, uint16 *duty)
|
||||||
|
{
|
||||||
|
uint8 i;
|
||||||
|
|
||||||
|
ETS_FRC_TIMER1_INTR_ATTACH(pwm_tim1_intr_handler, NULL);
|
||||||
|
TM1_EDGE_INT_ENABLE();
|
||||||
|
ETS_FRC1_INTR_ENABLE();
|
||||||
|
|
||||||
|
RTC_CLR_REG_MASK(FRC1_INT_ADDRESS, FRC1_INT_CLR_MASK);
|
||||||
|
RTC_REG_WRITE(FRC1_CTRL_ADDRESS, //FRC2_AUTO_RELOAD|
|
||||||
|
DIVDED_BY_16
|
||||||
|
| FRC1_ENABLE_TIMER
|
||||||
|
| TM_EDGE_INT);
|
||||||
|
RTC_REG_WRITE(FRC1_LOAD_ADDRESS, 0);
|
||||||
|
|
||||||
|
// PIN_FUNC_SELECT(PWM_0_OUT_IO_MUX, PWM_0_OUT_IO_FUNC);
|
||||||
|
// PIN_FUNC_SELECT(PWM_1_OUT_IO_MUX, PWM_1_OUT_IO_FUNC);
|
||||||
|
// PIN_FUNC_SELECT(PWM_2_OUT_IO_MUX, PWM_2_OUT_IO_FUNC);
|
||||||
|
// GPIO_OUTPUT_SET(GPIO_ID_PIN(PWM_0_OUT_IO_NUM), 0);
|
||||||
|
// GPIO_OUTPUT_SET(GPIO_ID_PIN(PWM_1_OUT_IO_NUM), 0);
|
||||||
|
// GPIO_OUTPUT_SET(GPIO_ID_PIN(PWM_2_OUT_IO_NUM), 0);
|
||||||
|
|
||||||
|
for (i = 0; i < PWM_CHANNEL; i++) {
|
||||||
|
// pwm_gpio |= (1 << pwm_out_io_num[i]);
|
||||||
|
pwm_gpio = 0;
|
||||||
|
pwm.duty[0] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
pwm_set_freq(500, 0);
|
||||||
|
// pwm_set_freq_duty(freq, duty);
|
||||||
|
|
||||||
|
pwm_start();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ICACHE_FLASH_ATTR
|
||||||
|
pwm_add(uint8 channel){
|
||||||
|
PWM_DBG("--Function pwm_add() is called. channel:%d\n", channel);
|
||||||
|
PWM_DBG("pwm_gpio:%x,pwm_channel_num:%d\n",pwm_gpio,pwm_channel_num);
|
||||||
|
PWM_DBG("pwm_out_io_num[0]:%d,[1]:%d,[2]:%d\n",pwm_out_io_num[0],pwm_out_io_num[1],pwm_out_io_num[2]);
|
||||||
|
PWM_DBG("pwm.duty[0]:%d,[1]:%d,[2]:%d\n",pwm.duty[0],pwm.duty[1],pwm.duty[2]);
|
||||||
|
uint8 i;
|
||||||
|
for(i=0;i<PWM_CHANNEL;i++){
|
||||||
|
if(pwm_out_io_num[i]==channel) // already exist
|
||||||
|
return true;
|
||||||
|
if(pwm_out_io_num[i] == -1){ // empty exist
|
||||||
|
LOCK_PWM(critical); // enter critical
|
||||||
|
pwm_out_io_num[i] = channel;
|
||||||
|
pwm.duty[i] = 0;
|
||||||
|
pwm_gpio |= (1 << pin_num[channel]);
|
||||||
|
PIN_FUNC_SELECT(pin_mux[channel], pin_func[channel]);
|
||||||
|
GPIO_REG_WRITE(GPIO_PIN_ADDR(GPIO_ID_PIN(pin_num[channel])), GPIO_REG_READ(GPIO_PIN_ADDR(GPIO_ID_PIN(pin_num[channel]))) & (~ GPIO_PIN_PAD_DRIVER_SET(GPIO_PAD_DRIVER_ENABLE))); //disable open drain;
|
||||||
|
pwm_channel_num++;
|
||||||
|
UNLOCK_PWM(critical); // leave critical
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ICACHE_FLASH_ATTR
|
||||||
|
pwm_delete(uint8 channel){
|
||||||
|
PWM_DBG("--Function pwm_delete() is called. channel:%d\n", channel);
|
||||||
|
PWM_DBG("pwm_gpio:%x,pwm_channel_num:%d\n",pwm_gpio,pwm_channel_num);
|
||||||
|
PWM_DBG("pwm_out_io_num[0]:%d,[1]:%d,[2]:%d\n",pwm_out_io_num[0],pwm_out_io_num[1],pwm_out_io_num[2]);
|
||||||
|
PWM_DBG("pwm.duty[0]:%d,[1]:%d,[2]:%d\n",pwm.duty[0],pwm.duty[1],pwm.duty[2]);
|
||||||
|
uint8 i,j;
|
||||||
|
for(i=0;i<pwm_channel_num;i++){
|
||||||
|
if(pwm_out_io_num[i]==channel){ // exist
|
||||||
|
LOCK_PWM(critical); // enter critical
|
||||||
|
pwm_out_io_num[i] = -1;
|
||||||
|
pwm_gpio &= ~(1 << pin_num[channel]); //clear the bit
|
||||||
|
for(j=i;j<pwm_channel_num-1;j++){
|
||||||
|
pwm_out_io_num[j] = pwm_out_io_num[j+1];
|
||||||
|
pwm.duty[j] = pwm.duty[j+1];
|
||||||
|
}
|
||||||
|
pwm_out_io_num[pwm_channel_num-1] = -1;
|
||||||
|
pwm.duty[pwm_channel_num-1] = 0;
|
||||||
|
pwm_channel_num--;
|
||||||
|
UNLOCK_PWM(critical); // leave critical
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// non found
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ICACHE_FLASH_ATTR
|
||||||
|
pwm_exist(uint8 channel){
|
||||||
|
PWM_DBG("--Function pwm_exist() is called. channel:%d\n", channel);
|
||||||
|
PWM_DBG("pwm_gpio:%x,pwm_channel_num:%d\n",pwm_gpio,pwm_channel_num);
|
||||||
|
PWM_DBG("pwm_out_io_num[0]:%d,[1]:%d,[2]:%d\n",pwm_out_io_num[0],pwm_out_io_num[1],pwm_out_io_num[2]);
|
||||||
|
PWM_DBG("pwm.duty[0]:%d,[1]:%d,[2]:%d\n",pwm.duty[0],pwm.duty[1],pwm.duty[2]);
|
||||||
|
uint8 i;
|
||||||
|
for(i=0;i<PWM_CHANNEL;i++){
|
||||||
|
if(pwm_out_io_num[i]==channel) // exist
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
112
app/driver/readline.c
Normal file
112
app/driver/readline.c
Normal file
@ -0,0 +1,112 @@
|
|||||||
|
#include "ets_sys.h"
|
||||||
|
#include "os_type.h"
|
||||||
|
#include "osapi.h"
|
||||||
|
#include "driver/uart.h"
|
||||||
|
#include "c_types.h"
|
||||||
|
|
||||||
|
LOCAL os_timer_t readline_timer;
|
||||||
|
|
||||||
|
// UartDev is defined and initialized in rom code.
|
||||||
|
extern UartDevice UartDev;
|
||||||
|
|
||||||
|
#define uart_putc uart0_putc
|
||||||
|
|
||||||
|
char ICACHE_FLASH_ATTR uart_getc(void){
|
||||||
|
char c = 0;
|
||||||
|
RcvMsgBuff *pRxBuff = &(UartDev.rcv_buff);
|
||||||
|
if(pRxBuff->pWritePos == pRxBuff->pReadPos){ // empty
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
// ETS_UART_INTR_DISABLE();
|
||||||
|
ETS_INTR_LOCK();
|
||||||
|
c = (char)*(pRxBuff->pReadPos);
|
||||||
|
if (pRxBuff->pReadPos == (pRxBuff->pRcvMsgBuff + RX_BUFF_SIZE)) {
|
||||||
|
pRxBuff->pReadPos = pRxBuff->pRcvMsgBuff ;
|
||||||
|
} else {
|
||||||
|
pRxBuff->pReadPos++;
|
||||||
|
}
|
||||||
|
// ETS_UART_INTR_ENABLE();
|
||||||
|
ETS_INTR_UNLOCK();
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
int ICACHE_FLASH_ATTR readline4lua(const char *prompt, char *buffer, int length){
|
||||||
|
char ch;
|
||||||
|
int line_position;
|
||||||
|
|
||||||
|
start:
|
||||||
|
/* show prompt */
|
||||||
|
uart0_sendStr(prompt);
|
||||||
|
|
||||||
|
line_position = 0;
|
||||||
|
os_memset(buffer, 0, length);
|
||||||
|
while (1)
|
||||||
|
{
|
||||||
|
while ((ch = uart_getc()) != 0)
|
||||||
|
{
|
||||||
|
/* handle CR key */
|
||||||
|
if (ch == '\r')
|
||||||
|
{
|
||||||
|
char next;
|
||||||
|
if ((next = uart_getc()) != 0)
|
||||||
|
ch = next;
|
||||||
|
}
|
||||||
|
/* backspace key */
|
||||||
|
else if (ch == 0x7f || ch == 0x08)
|
||||||
|
{
|
||||||
|
if (line_position > 0)
|
||||||
|
{
|
||||||
|
uart_putc(0x08);
|
||||||
|
uart_putc(' ');
|
||||||
|
uart_putc(0x08);
|
||||||
|
line_position--;
|
||||||
|
}
|
||||||
|
buffer[line_position] = 0;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
/* EOF(ctrl+d) */
|
||||||
|
else if (ch == 0x04)
|
||||||
|
{
|
||||||
|
if (line_position == 0)
|
||||||
|
/* No input which makes lua interpreter close */
|
||||||
|
return 0;
|
||||||
|
else
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* end of line */
|
||||||
|
if (ch == '\r' || ch == '\n')
|
||||||
|
{
|
||||||
|
buffer[line_position] = 0;
|
||||||
|
uart_putc('\n');
|
||||||
|
if (line_position == 0)
|
||||||
|
{
|
||||||
|
/* Get a empty line, then go to get a new line */
|
||||||
|
goto start;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return line_position;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* other control character or not an acsii character */
|
||||||
|
if (ch < 0x20 || ch >= 0x80)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* echo */
|
||||||
|
uart_putc(ch);
|
||||||
|
buffer[line_position] = ch;
|
||||||
|
ch = 0;
|
||||||
|
line_position++;
|
||||||
|
|
||||||
|
/* it's a large line, discard it */
|
||||||
|
if (line_position >= length)
|
||||||
|
line_position = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
494
app/driver/spi.c
Normal file
494
app/driver/spi.c
Normal file
@ -0,0 +1,494 @@
|
|||||||
|
#include "driver/spi.h"
|
||||||
|
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* FunctionName : spi_lcd_mode_init
|
||||||
|
* Description : SPI master initial function for driving LCD TM035PDZV36
|
||||||
|
* Parameters : uint8 spi_no - SPI module number, Only "SPI" and "HSPI" are valid
|
||||||
|
*******************************************************************************/
|
||||||
|
void spi_lcd_mode_init(uint8 spi_no)
|
||||||
|
{
|
||||||
|
uint32 regvalue;
|
||||||
|
if(spi_no>1) return; //handle invalid input number
|
||||||
|
//bit9 of PERIPHS_IO_MUX should be cleared when HSPI clock doesn't equal CPU clock
|
||||||
|
//bit8 of PERIPHS_IO_MUX should be cleared when SPI clock doesn't equal CPU clock
|
||||||
|
if(spi_no==SPI){
|
||||||
|
WRITE_PERI_REG(PERIPHS_IO_MUX, 0x005); //clear bit9,and bit8
|
||||||
|
PIN_FUNC_SELECT(PERIPHS_IO_MUX_SD_CLK_U, 1);//configure io to spi mode
|
||||||
|
PIN_FUNC_SELECT(PERIPHS_IO_MUX_SD_CMD_U, 1);//configure io to spi mode
|
||||||
|
PIN_FUNC_SELECT(PERIPHS_IO_MUX_SD_DATA0_U, 1);//configure io to spi mode
|
||||||
|
PIN_FUNC_SELECT(PERIPHS_IO_MUX_SD_DATA1_U, 1);//configure io to spi mode
|
||||||
|
}else if(spi_no==HSPI){
|
||||||
|
WRITE_PERI_REG(PERIPHS_IO_MUX, 0x105); //clear bit9
|
||||||
|
PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDI_U, 2);//configure io to spi mode
|
||||||
|
PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTCK_U, 2);//configure io to spi mode
|
||||||
|
PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTMS_U, 2);//configure io to spi mode
|
||||||
|
PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDO_U, 2);//configure io to spi mode
|
||||||
|
}
|
||||||
|
|
||||||
|
SET_PERI_REG_MASK(SPI_USER(spi_no), SPI_CS_SETUP|SPI_CS_HOLD|SPI_USR_COMMAND);
|
||||||
|
CLEAR_PERI_REG_MASK(SPI_USER(spi_no), SPI_FLASH_MODE);
|
||||||
|
// SPI clock=CPU clock/8
|
||||||
|
WRITE_PERI_REG(SPI_CLOCK(spi_no),
|
||||||
|
((1&SPI_CLKDIV_PRE)<<SPI_CLKDIV_PRE_S)|
|
||||||
|
((3&SPI_CLKCNT_N)<<SPI_CLKCNT_N_S)|
|
||||||
|
((1&SPI_CLKCNT_H)<<SPI_CLKCNT_H_S)|
|
||||||
|
((3&SPI_CLKCNT_L)<<SPI_CLKCNT_L_S)); //clear bit 31,set SPI clock div
|
||||||
|
|
||||||
|
}
|
||||||
|
/******************************************************************************
|
||||||
|
* FunctionName : spi_lcd_9bit_write
|
||||||
|
* Description : SPI 9bits transmission function for driving LCD TM035PDZV36
|
||||||
|
* Parameters : uint8 spi_no - SPI module number, Only "SPI" and "HSPI" are valid
|
||||||
|
* uint8 high_bit - first high bit of the data, 0 is for "0",the other value 1-255 is for "1"
|
||||||
|
* uint8 low_8bit- the rest 8bits of the data.
|
||||||
|
*******************************************************************************/
|
||||||
|
void spi_lcd_9bit_write(uint8 spi_no,uint8 high_bit,uint8 low_8bit)
|
||||||
|
{
|
||||||
|
uint32 regvalue;
|
||||||
|
uint8 bytetemp;
|
||||||
|
if(spi_no>1) return; //handle invalid input number
|
||||||
|
|
||||||
|
if(high_bit) bytetemp=(low_8bit>>1)|0x80;
|
||||||
|
else bytetemp=(low_8bit>>1)&0x7f;
|
||||||
|
|
||||||
|
regvalue= ((8&SPI_USR_COMMAND_BITLEN)<<SPI_USR_COMMAND_BITLEN_S)|((uint32)bytetemp); //configure transmission variable,9bit transmission length and first 8 command bit
|
||||||
|
if(low_8bit&0x01) regvalue|=BIT15; //write the 9th bit
|
||||||
|
while(READ_PERI_REG(SPI_CMD(spi_no))&SPI_USR); //waiting for spi module available
|
||||||
|
WRITE_PERI_REG(SPI_USER2(spi_no), regvalue); //write command and command length into spi reg
|
||||||
|
SET_PERI_REG_MASK(SPI_CMD(spi_no), SPI_USR); //transmission start
|
||||||
|
}
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* FunctionName : spi_master_init
|
||||||
|
* Description : SPI master initial function for common byte units transmission
|
||||||
|
* Parameters : uint8 spi_no - SPI module number, Only "SPI" and "HSPI" are valid
|
||||||
|
*******************************************************************************/
|
||||||
|
void spi_master_init(uint8 spi_no)
|
||||||
|
{
|
||||||
|
uint32 regvalue;
|
||||||
|
|
||||||
|
if(spi_no>1) return; //handle invalid input number
|
||||||
|
|
||||||
|
|
||||||
|
if(spi_no==SPI){
|
||||||
|
WRITE_PERI_REG(PERIPHS_IO_MUX, 0x005);
|
||||||
|
PIN_FUNC_SELECT(PERIPHS_IO_MUX_SD_CLK_U, 1);//configure io to spi mode
|
||||||
|
PIN_FUNC_SELECT(PERIPHS_IO_MUX_SD_CMD_U, 1);//configure io to spi mode
|
||||||
|
PIN_FUNC_SELECT(PERIPHS_IO_MUX_SD_DATA0_U, 1);//configure io to spi mode
|
||||||
|
PIN_FUNC_SELECT(PERIPHS_IO_MUX_SD_DATA1_U, 1);//configure io to spi mode
|
||||||
|
}
|
||||||
|
else if(spi_no==HSPI){
|
||||||
|
WRITE_PERI_REG(PERIPHS_IO_MUX, 0x105);
|
||||||
|
PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDI_U, 2);//configure io to spi mode
|
||||||
|
PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTCK_U, 2);//configure io to spi mode
|
||||||
|
PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTMS_U, 2);//configure io to spi mode
|
||||||
|
PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDO_U, 2);//configure io to spi mode
|
||||||
|
}
|
||||||
|
|
||||||
|
SET_PERI_REG_MASK(SPI_USER(spi_no), SPI_CS_SETUP|SPI_CS_HOLD|SPI_USR_COMMAND|SPI_USR_MOSI);
|
||||||
|
CLEAR_PERI_REG_MASK(SPI_USER(spi_no), SPI_FLASH_MODE);
|
||||||
|
|
||||||
|
//clear Daul or Quad lines transmission mode
|
||||||
|
CLEAR_PERI_REG_MASK(SPI_CTRL(spi_no), SPI_QIO_MODE|SPI_DIO_MODE|SPI_DOUT_MODE|SPI_QOUT_MODE);
|
||||||
|
|
||||||
|
WRITE_PERI_REG(SPI_CLOCK(spi_no),
|
||||||
|
((3&SPI_CLKCNT_N)<<SPI_CLKCNT_N_S)|
|
||||||
|
((1&SPI_CLKCNT_H)<<SPI_CLKCNT_H_S)|
|
||||||
|
((3&SPI_CLKCNT_L)<<SPI_CLKCNT_L_S)); //clear bit 31,set SPI clock div
|
||||||
|
|
||||||
|
//set 8bit output buffer length, the buffer is the low 8bit of register"SPI_FLASH_C0"
|
||||||
|
WRITE_PERI_REG(SPI_USER1(spi_no),
|
||||||
|
((7&SPI_USR_MOSI_BITLEN)<<SPI_USR_MOSI_BITLEN_S)|
|
||||||
|
((7&SPI_USR_MISO_BITLEN)<<SPI_USR_MISO_BITLEN_S));
|
||||||
|
}
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* FunctionName : spi_mast_byte_write
|
||||||
|
* Description : SPI master 1 byte transmission function
|
||||||
|
* Parameters : uint8 spi_no - SPI module number, Only "SPI" and "HSPI" are valid
|
||||||
|
* uint8 data- transmitted data
|
||||||
|
*******************************************************************************/
|
||||||
|
void spi_mast_byte_write(uint8 spi_no,uint8 data)
|
||||||
|
{
|
||||||
|
uint32 regvalue;
|
||||||
|
|
||||||
|
if(spi_no>1) return; //handle invalid input number
|
||||||
|
|
||||||
|
while(READ_PERI_REG(SPI_CMD(spi_no))&SPI_USR);
|
||||||
|
CLEAR_PERI_REG_MASK(SPI_USER(spi_no), SPI_USR_MOSI|SPI_USR_MISO);
|
||||||
|
|
||||||
|
//SPI_FLASH_USER2 bit28-31 is cmd length,cmd bit length is value(0-15)+1,
|
||||||
|
// bit15-0 is cmd value.
|
||||||
|
WRITE_PERI_REG(SPI_USER2(spi_no),
|
||||||
|
((7&SPI_USR_COMMAND_BITLEN)<<SPI_USR_COMMAND_BITLEN_S)|((uint32)data));
|
||||||
|
SET_PERI_REG_MASK(SPI_CMD(spi_no), SPI_USR);
|
||||||
|
}
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* FunctionName : spi_byte_write_espslave
|
||||||
|
* Description : SPI master 1 byte transmission function for esp8266 slave,
|
||||||
|
* transmit 1byte data to esp8266 slave buffer needs 16bit transmission ,
|
||||||
|
* first byte is command 0x04 to write slave buffer, second byte is data
|
||||||
|
* Parameters : uint8 spi_no - SPI module number, Only "SPI" and "HSPI" are valid
|
||||||
|
* uint8 data- transmitted data
|
||||||
|
*******************************************************************************/
|
||||||
|
void spi_byte_write_espslave(uint8 spi_no,uint8 data)
|
||||||
|
{
|
||||||
|
uint32 regvalue;
|
||||||
|
|
||||||
|
if(spi_no>1) return; //handle invalid input number
|
||||||
|
|
||||||
|
while(READ_PERI_REG(SPI_CMD(spi_no))&SPI_USR);
|
||||||
|
SET_PERI_REG_MASK(SPI_USER(spi_no), SPI_USR_MOSI);
|
||||||
|
CLEAR_PERI_REG_MASK(SPI_USER(spi_no), SPI_USR_MISO|SPI_USR_ADDR|SPI_USR_DUMMY);
|
||||||
|
|
||||||
|
//SPI_FLASH_USER2 bit28-31 is cmd length,cmd bit length is value(0-15)+1,
|
||||||
|
// bit15-0 is cmd value.
|
||||||
|
//0x70000000 is for 8bits cmd, 0x04 is eps8266 slave write cmd value
|
||||||
|
WRITE_PERI_REG(SPI_USER2(spi_no),
|
||||||
|
((7&SPI_USR_COMMAND_BITLEN)<<SPI_USR_COMMAND_BITLEN_S)|4);
|
||||||
|
WRITE_PERI_REG(SPI_W0(spi_no), (uint32)(data));
|
||||||
|
SET_PERI_REG_MASK(SPI_CMD(spi_no), SPI_USR);
|
||||||
|
}
|
||||||
|
/******************************************************************************
|
||||||
|
* FunctionName : spi_byte_read_espslave
|
||||||
|
* Description : SPI master 1 byte read function for esp8266 slave,
|
||||||
|
* read 1byte data from esp8266 slave buffer needs 16bit transmission ,
|
||||||
|
* first byte is command 0x06 to read slave buffer, second byte is recieved data
|
||||||
|
* Parameters : uint8 spi_no - SPI module number, Only "SPI" and "HSPI" are valid
|
||||||
|
* uint8* data- recieved data address
|
||||||
|
*******************************************************************************/
|
||||||
|
void spi_byte_read_espslave(uint8 spi_no,uint8 *data)
|
||||||
|
{
|
||||||
|
uint32 regvalue;
|
||||||
|
|
||||||
|
if(spi_no>1) return; //handle invalid input number
|
||||||
|
|
||||||
|
while(READ_PERI_REG(SPI_CMD(spi_no))&SPI_USR);
|
||||||
|
|
||||||
|
SET_PERI_REG_MASK(SPI_USER(spi_no), SPI_USR_MISO);
|
||||||
|
CLEAR_PERI_REG_MASK(SPI_USER(spi_no), SPI_USR_MOSI|SPI_USR_ADDR|SPI_USR_DUMMY);
|
||||||
|
//SPI_FLASH_USER2 bit28-31 is cmd length,cmd bit length is value(0-15)+1,
|
||||||
|
// bit15-0 is cmd value.
|
||||||
|
//0x70000000 is for 8bits cmd, 0x06 is eps8266 slave read cmd value
|
||||||
|
WRITE_PERI_REG(SPI_USER2(spi_no),
|
||||||
|
((7&SPI_USR_COMMAND_BITLEN)<<SPI_USR_COMMAND_BITLEN_S)|6);
|
||||||
|
SET_PERI_REG_MASK(SPI_CMD(spi_no), SPI_USR);
|
||||||
|
|
||||||
|
while(READ_PERI_REG(SPI_CMD(spi_no))&SPI_USR);
|
||||||
|
*data=(uint8)(READ_PERI_REG(SPI_W0(spi_no))&0xff);
|
||||||
|
}
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* FunctionName : spi_slave_init
|
||||||
|
* Description : SPI slave mode initial funtion, including mode setting,
|
||||||
|
* IO setting, transmission interrupt opening, interrupt function registration
|
||||||
|
* Parameters : uint8 spi_no - SPI module number, Only "SPI" and "HSPI" are valid
|
||||||
|
*******************************************************************************/
|
||||||
|
void spi_slave_init(uint8 spi_no)
|
||||||
|
{
|
||||||
|
uint32 regvalue;
|
||||||
|
if(spi_no>1)
|
||||||
|
return; //handle invalid input number
|
||||||
|
|
||||||
|
//clear bit9,bit8 of reg PERIPHS_IO_MUX
|
||||||
|
//bit9 should be cleared when HSPI clock doesn't equal CPU clock
|
||||||
|
//bit8 should be cleared when SPI clock doesn't equal CPU clock
|
||||||
|
////WRITE_PERI_REG(PERIPHS_IO_MUX, 0x105); //clear bit9//TEST
|
||||||
|
if(spi_no==SPI){
|
||||||
|
PIN_FUNC_SELECT(PERIPHS_IO_MUX_SD_CLK_U, 1);//configure io to spi mode
|
||||||
|
PIN_FUNC_SELECT(PERIPHS_IO_MUX_SD_CMD_U, 1);//configure io to spi mode
|
||||||
|
PIN_FUNC_SELECT(PERIPHS_IO_MUX_SD_DATA0_U, 1);//configure io to spi mode
|
||||||
|
PIN_FUNC_SELECT(PERIPHS_IO_MUX_SD_DATA1_U, 1);//configure io to spi mode
|
||||||
|
}else if(spi_no==HSPI){
|
||||||
|
PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDI_U, 2);//configure io to spi mode
|
||||||
|
PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTCK_U, 2);//configure io to spi mode
|
||||||
|
PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTMS_U, 2);//configure io to spi mode
|
||||||
|
PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDO_U, 2);//configure io to spi mode
|
||||||
|
}
|
||||||
|
|
||||||
|
//regvalue=READ_PERI_REG(SPI_FLASH_SLAVE(spi_no));
|
||||||
|
//slave mode,slave use buffers which are register "SPI_FLASH_C0~C15", enable trans done isr
|
||||||
|
//set bit 30 bit 29 bit9,bit9 is trans done isr mask
|
||||||
|
SET_PERI_REG_MASK( SPI_SLAVE(spi_no),
|
||||||
|
SPI_SLAVE_MODE|SPI_SLV_WR_RD_BUF_EN|
|
||||||
|
SPI_SLV_WR_BUF_DONE_EN|SPI_SLV_RD_BUF_DONE_EN|
|
||||||
|
SPI_SLV_WR_STA_DONE_EN|SPI_SLV_RD_STA_DONE_EN|
|
||||||
|
SPI_TRANS_DONE_EN);
|
||||||
|
//disable general trans intr
|
||||||
|
//CLEAR_PERI_REG_MASK(SPI_SLAVE(spi_no),SPI_TRANS_DONE_EN);
|
||||||
|
|
||||||
|
CLEAR_PERI_REG_MASK(SPI_USER(spi_no), SPI_FLASH_MODE);//disable flash operation mode
|
||||||
|
SET_PERI_REG_MASK(SPI_USER(spi_no),SPI_USR_MISO_HIGHPART);//SLAVE SEND DATA BUFFER IN C8-C15
|
||||||
|
|
||||||
|
|
||||||
|
//////**************RUN WHEN SLAVE RECIEVE*******************///////
|
||||||
|
//tow lines below is to configure spi timing.
|
||||||
|
SET_PERI_REG_MASK(SPI_CTRL2(spi_no),(0x2&SPI_MOSI_DELAY_NUM)<<SPI_MOSI_DELAY_NUM_S) ;//delay num
|
||||||
|
os_printf("SPI_CTRL2 is %08x\n",READ_PERI_REG(SPI_CTRL2(spi_no)));
|
||||||
|
WRITE_PERI_REG(SPI_CLOCK(spi_no), 0);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/////***************************************************//////
|
||||||
|
|
||||||
|
//set 8 bit slave command length, because slave must have at least one bit addr,
|
||||||
|
//8 bit slave+8bit addr, so master device first 2 bytes can be regarded as a command
|
||||||
|
//and the following bytes are datas,
|
||||||
|
//32 bytes input wil be stored in SPI_FLASH_C0-C7
|
||||||
|
//32 bytes output data should be set to SPI_FLASH_C8-C15
|
||||||
|
WRITE_PERI_REG(SPI_USER2(spi_no), (0x7&SPI_USR_COMMAND_BITLEN)<<SPI_USR_COMMAND_BITLEN_S); //0x70000000
|
||||||
|
|
||||||
|
//set 8 bit slave recieve buffer length, the buffer is SPI_FLASH_C0-C7
|
||||||
|
//set 8 bit slave status register, which is the low 8 bit of register "SPI_FLASH_STATUS"
|
||||||
|
SET_PERI_REG_MASK(SPI_SLAVE1(spi_no), ((0xff&SPI_SLV_BUF_BITLEN)<< SPI_SLV_BUF_BITLEN_S)|
|
||||||
|
((0x7&SPI_SLV_STATUS_BITLEN)<<SPI_SLV_STATUS_BITLEN_S)|
|
||||||
|
((0x7&SPI_SLV_WR_ADDR_BITLEN)<<SPI_SLV_WR_ADDR_BITLEN_S)|
|
||||||
|
((0x7&SPI_SLV_RD_ADDR_BITLEN)<<SPI_SLV_RD_ADDR_BITLEN_S));
|
||||||
|
|
||||||
|
SET_PERI_REG_MASK(SPI_PIN(spi_no),BIT19);//BIT19
|
||||||
|
|
||||||
|
//maybe enable slave transmission liston
|
||||||
|
SET_PERI_REG_MASK(SPI_CMD(spi_no),SPI_USR);
|
||||||
|
//register level2 isr function, which contains spi, hspi and i2s events
|
||||||
|
ETS_SPI_INTR_ATTACH(spi_slave_isr_handler,NULL);
|
||||||
|
//enable level2 isr, which contains spi, hspi and i2s events
|
||||||
|
ETS_SPI_INTR_ENABLE();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* =============================================================================================
|
||||||
|
* code below is for spi slave r/w testcase with 2 r/w state lines connected to the spi master mcu
|
||||||
|
* replace with your own process functions
|
||||||
|
* find "add system_os_post here" in spi_slave_isr_handler.
|
||||||
|
* =============================================================================================
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef SPI_SLAVE_DEBUG
|
||||||
|
/******************************************************************************
|
||||||
|
* FunctionName : hspi_master_readwrite_repeat
|
||||||
|
* Description : SPI master test function for reading and writing esp8266 slave buffer,
|
||||||
|
the function uses HSPI module
|
||||||
|
*******************************************************************************/
|
||||||
|
os_timer_t timer2;
|
||||||
|
|
||||||
|
void hspi_master_readwrite_repeat(void)
|
||||||
|
{
|
||||||
|
static uint8 data=0;
|
||||||
|
uint8 temp;
|
||||||
|
|
||||||
|
os_timer_disarm(&timer2);
|
||||||
|
spi_byte_read_espslave(HSPI,&temp);
|
||||||
|
|
||||||
|
temp++;
|
||||||
|
spi_byte_write_espslave(HSPI,temp);
|
||||||
|
os_timer_setfn(&timer2, (os_timer_func_t *)hspi_master_readwrite_repeat, NULL);
|
||||||
|
os_timer_arm(&timer2, 500, 0);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* FunctionName : spi_slave_isr_handler
|
||||||
|
* Description : SPI interrupt function, SPI HSPI and I2S interrupt can trig this function
|
||||||
|
some basic operation like clear isr flag has been done,
|
||||||
|
and it is availible for adding user coder in the funtion
|
||||||
|
* Parameters : void *para- function parameter address, which has been registered in function spi_slave_init
|
||||||
|
*******************************************************************************/
|
||||||
|
#include "gpio.h"
|
||||||
|
#include "user_interface.h"
|
||||||
|
#include "mem.h"
|
||||||
|
static uint8 spi_data[32] = {0};
|
||||||
|
static uint8 idx = 0;
|
||||||
|
static uint8 spi_flg = 0;
|
||||||
|
#define SPI_MISO
|
||||||
|
#define SPI_QUEUE_LEN 8
|
||||||
|
os_event_t * spiQueue;
|
||||||
|
#define MOSI 0
|
||||||
|
#define MISO 1
|
||||||
|
#define STATUS_R_IN_WR 2
|
||||||
|
#define STATUS_W 3
|
||||||
|
#define TR_DONE_ALONE 4
|
||||||
|
#define WR_RD 5
|
||||||
|
#define DATA_ERROR 6
|
||||||
|
#define STATUS_R_IN_RD 7
|
||||||
|
//init the two intr line of slave
|
||||||
|
//gpio0: wr_ready ,and
|
||||||
|
//gpio2: rd_ready , controlled by slave
|
||||||
|
void ICACHE_FLASH_ATTR
|
||||||
|
gpio_init()
|
||||||
|
{
|
||||||
|
|
||||||
|
PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO0_U, FUNC_GPIO0);
|
||||||
|
PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO2_U, FUNC_GPIO2);
|
||||||
|
//PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO4_U, FUNC_GPIO4);
|
||||||
|
GPIO_OUTPUT_SET(0, 1);
|
||||||
|
GPIO_OUTPUT_SET(2, 0);
|
||||||
|
//GPIO_OUTPUT_SET(4, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void spi_slave_isr_handler(void *para)
|
||||||
|
{
|
||||||
|
uint32 regvalue,calvalue;
|
||||||
|
static uint8 state =0;
|
||||||
|
uint32 recv_data,send_data;
|
||||||
|
|
||||||
|
if(READ_PERI_REG(0x3ff00020)&BIT4){
|
||||||
|
//following 3 lines is to clear isr signal
|
||||||
|
CLEAR_PERI_REG_MASK(SPI_SLAVE(SPI), 0x3ff);
|
||||||
|
}else if(READ_PERI_REG(0x3ff00020)&BIT7){ //bit7 is for hspi isr,
|
||||||
|
regvalue=READ_PERI_REG(SPI_SLAVE(HSPI));
|
||||||
|
CLEAR_PERI_REG_MASK(SPI_SLAVE(HSPI),
|
||||||
|
SPI_TRANS_DONE_EN|
|
||||||
|
SPI_SLV_WR_STA_DONE_EN|
|
||||||
|
SPI_SLV_RD_STA_DONE_EN|
|
||||||
|
SPI_SLV_WR_BUF_DONE_EN|
|
||||||
|
SPI_SLV_RD_BUF_DONE_EN);
|
||||||
|
SET_PERI_REG_MASK(SPI_SLAVE(HSPI), SPI_SYNC_RESET);
|
||||||
|
CLEAR_PERI_REG_MASK(SPI_SLAVE(HSPI),
|
||||||
|
SPI_TRANS_DONE|
|
||||||
|
SPI_SLV_WR_STA_DONE|
|
||||||
|
SPI_SLV_RD_STA_DONE|
|
||||||
|
SPI_SLV_WR_BUF_DONE|
|
||||||
|
SPI_SLV_RD_BUF_DONE);
|
||||||
|
SET_PERI_REG_MASK(SPI_SLAVE(HSPI),
|
||||||
|
SPI_TRANS_DONE_EN|
|
||||||
|
SPI_SLV_WR_STA_DONE_EN|
|
||||||
|
SPI_SLV_RD_STA_DONE_EN|
|
||||||
|
SPI_SLV_WR_BUF_DONE_EN|
|
||||||
|
SPI_SLV_RD_BUF_DONE_EN);
|
||||||
|
|
||||||
|
if(regvalue&SPI_SLV_WR_BUF_DONE){
|
||||||
|
GPIO_OUTPUT_SET(0, 0);
|
||||||
|
idx=0;
|
||||||
|
while(idx<8){
|
||||||
|
recv_data=READ_PERI_REG(SPI_W0(HSPI)+(idx<<2));
|
||||||
|
spi_data[idx<<2] = recv_data&0xff;
|
||||||
|
spi_data[(idx<<2)+1] = (recv_data>>8)&0xff;
|
||||||
|
spi_data[(idx<<2)+2] = (recv_data>>16)&0xff;
|
||||||
|
spi_data[(idx<<2)+3] = (recv_data>>24)&0xff;
|
||||||
|
idx++;
|
||||||
|
}
|
||||||
|
//add system_os_post here
|
||||||
|
GPIO_OUTPUT_SET(0, 1);
|
||||||
|
}
|
||||||
|
if(regvalue&SPI_SLV_RD_BUF_DONE){
|
||||||
|
//it is necessary to call GPIO_OUTPUT_SET(2, 1), when new data is preped in SPI_W8-15 and needs to be sended.
|
||||||
|
GPIO_OUTPUT_SET(2, 0);
|
||||||
|
//add system_os_post here
|
||||||
|
//system_os_post(USER_TASK_PRIO_1,WR_RD,regvalue);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}else if(READ_PERI_REG(0x3ff00020)&BIT9){ //bit7 is for i2s isr,
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef SPI_SLAVE_DEBUG
|
||||||
|
|
||||||
|
void ICACHE_FLASH_ATTR
|
||||||
|
set_miso_data()
|
||||||
|
{
|
||||||
|
if(GPIO_INPUT_GET(2)==0){
|
||||||
|
WRITE_PERI_REG(SPI_W8(HSPI),0x05040302);
|
||||||
|
WRITE_PERI_REG(SPI_W9(HSPI),0x09080706);
|
||||||
|
WRITE_PERI_REG(SPI_W10(HSPI),0x0d0c0b0a);
|
||||||
|
WRITE_PERI_REG(SPI_W11(HSPI),0x11100f0e);
|
||||||
|
|
||||||
|
WRITE_PERI_REG(SPI_W12(HSPI),0x15141312);
|
||||||
|
WRITE_PERI_REG(SPI_W13(HSPI),0x19181716);
|
||||||
|
WRITE_PERI_REG(SPI_W14(HSPI),0x1d1c1b1a);
|
||||||
|
WRITE_PERI_REG(SPI_W15(HSPI),0x21201f1e);
|
||||||
|
GPIO_OUTPUT_SET(2, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void ICACHE_FLASH_ATTR
|
||||||
|
disp_spi_data()
|
||||||
|
{
|
||||||
|
uint8 i = 0;
|
||||||
|
for(i=0;i<32;i++){
|
||||||
|
os_printf("data %d : 0x%02x\n\r",i,spi_data[i]);
|
||||||
|
}
|
||||||
|
//os_printf("d31:0x%02x\n\r",spi_data[31]);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void ICACHE_FLASH_ATTR
|
||||||
|
spi_task(os_event_t *e)
|
||||||
|
{
|
||||||
|
uint8 data;
|
||||||
|
switch(e->sig){
|
||||||
|
case MOSI:
|
||||||
|
disp_spi_data();
|
||||||
|
break;
|
||||||
|
case STATUS_R_IN_WR :
|
||||||
|
os_printf("SR ERR in WRPR,Reg:%08x \n",e->par);
|
||||||
|
break;
|
||||||
|
case STATUS_W:
|
||||||
|
os_printf("SW ERR,Reg:%08x\n",e->par);
|
||||||
|
break;
|
||||||
|
case TR_DONE_ALONE:
|
||||||
|
os_printf("TD ALO ERR,Reg:%08x\n",e->par);
|
||||||
|
break;
|
||||||
|
case WR_RD:
|
||||||
|
os_printf("WR&RD ERR,Reg:%08x\n",e->par);
|
||||||
|
break;
|
||||||
|
case DATA_ERROR:
|
||||||
|
os_printf("Data ERR,Reg:%08x\n",e->par);
|
||||||
|
break;
|
||||||
|
case STATUS_R_IN_RD :
|
||||||
|
os_printf("SR ERR in RDPR,Reg:%08x\n",e->par);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ICACHE_FLASH_ATTR
|
||||||
|
spi_task_init(void)
|
||||||
|
{
|
||||||
|
spiQueue = (os_event_t*)os_malloc(sizeof(os_event_t)*SPI_QUEUE_LEN);
|
||||||
|
system_os_task(spi_task,USER_TASK_PRIO_1,spiQueue,SPI_QUEUE_LEN);
|
||||||
|
}
|
||||||
|
|
||||||
|
os_timer_t spi_timer_test;
|
||||||
|
|
||||||
|
void ICACHE_FLASH_ATTR
|
||||||
|
spi_test_init()
|
||||||
|
{
|
||||||
|
os_printf("spi init\n\r");
|
||||||
|
spi_slave_init(HSPI);
|
||||||
|
os_printf("gpio init\n\r");
|
||||||
|
gpio_init();
|
||||||
|
os_printf("spi task init \n\r");
|
||||||
|
spi_task_init();
|
||||||
|
#ifdef SPI_MISO
|
||||||
|
os_printf("spi miso init\n\r");
|
||||||
|
set_miso_data();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//os_timer_disarm(&spi_timer_test);
|
||||||
|
//os_timer_setfn(&spi_timer_test, (os_timer_func_t *)set_miso_data, NULL);//wjl
|
||||||
|
//os_timer_arm(&spi_timer_test,50,1);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
250
app/driver/uart.c
Normal file
250
app/driver/uart.c
Normal file
@ -0,0 +1,250 @@
|
|||||||
|
/******************************************************************************
|
||||||
|
* Copyright 2013-2014 Espressif Systems (Wuxi)
|
||||||
|
*
|
||||||
|
* FileName: uart.c
|
||||||
|
*
|
||||||
|
* Description: Two UART mode configration and interrupt handler.
|
||||||
|
* Check your hardware connection while use this mode.
|
||||||
|
*
|
||||||
|
* Modification history:
|
||||||
|
* 2014/3/12, v1.0 create this file.
|
||||||
|
*******************************************************************************/
|
||||||
|
#include "ets_sys.h"
|
||||||
|
#include "osapi.h"
|
||||||
|
#include "driver/uart.h"
|
||||||
|
#include "user_config.h"
|
||||||
|
|
||||||
|
#define UART0 0
|
||||||
|
#define UART1 1
|
||||||
|
|
||||||
|
// UartDev is defined and initialized in rom code.
|
||||||
|
extern UartDevice UartDev;
|
||||||
|
|
||||||
|
LOCAL void uart0_rx_intr_handler(void *para);
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* FunctionName : uart_config
|
||||||
|
* Description : Internal used function
|
||||||
|
* UART0 used for data TX/RX, RX buffer size is 0x100, interrupt enabled
|
||||||
|
* UART1 just used for debug output
|
||||||
|
* Parameters : uart_no, use UART0 or UART1 defined ahead
|
||||||
|
* Returns : NONE
|
||||||
|
*******************************************************************************/
|
||||||
|
LOCAL void ICACHE_FLASH_ATTR
|
||||||
|
uart_config(uint8 uart_no)
|
||||||
|
{
|
||||||
|
if (uart_no == UART1) {
|
||||||
|
PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO2_U, FUNC_U1TXD_BK);
|
||||||
|
} else {
|
||||||
|
/* rcv_buff size if 0x100 */
|
||||||
|
ETS_UART_INTR_ATTACH(uart0_rx_intr_handler, &(UartDev.rcv_buff));
|
||||||
|
PIN_PULLUP_DIS(PERIPHS_IO_MUX_U0TXD_U);
|
||||||
|
PIN_FUNC_SELECT(PERIPHS_IO_MUX_U0TXD_U, FUNC_U0TXD);
|
||||||
|
PIN_PULLUP_EN(PERIPHS_IO_MUX_U0RXD_U);
|
||||||
|
PIN_FUNC_SELECT(PERIPHS_IO_MUX_U0RXD_U, FUNC_U0RXD);
|
||||||
|
}
|
||||||
|
|
||||||
|
uart_div_modify(uart_no, UART_CLK_FREQ / (UartDev.baut_rate));
|
||||||
|
|
||||||
|
WRITE_PERI_REG(UART_CONF0(uart_no), UartDev.exist_parity
|
||||||
|
| UartDev.parity
|
||||||
|
| (UartDev.stop_bits << UART_STOP_BIT_NUM_S)
|
||||||
|
| (UartDev.data_bits << UART_BIT_NUM_S));
|
||||||
|
|
||||||
|
|
||||||
|
//clear rx and tx fifo,not ready
|
||||||
|
SET_PERI_REG_MASK(UART_CONF0(uart_no), UART_RXFIFO_RST | UART_TXFIFO_RST);
|
||||||
|
CLEAR_PERI_REG_MASK(UART_CONF0(uart_no), UART_RXFIFO_RST | UART_TXFIFO_RST);
|
||||||
|
|
||||||
|
//set rx fifo trigger
|
||||||
|
WRITE_PERI_REG(UART_CONF1(uart_no), (UartDev.rcv_buff.TrigLvl & UART_RXFIFO_FULL_THRHD) << UART_RXFIFO_FULL_THRHD_S);
|
||||||
|
|
||||||
|
//clear all interrupt
|
||||||
|
WRITE_PERI_REG(UART_INT_CLR(uart_no), 0xffff);
|
||||||
|
//enable rx_interrupt
|
||||||
|
SET_PERI_REG_MASK(UART_INT_ENA(uart_no), UART_RXFIFO_FULL_INT_ENA);
|
||||||
|
}
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* FunctionName : uart_tx_one_char
|
||||||
|
* Description : Internal used function
|
||||||
|
* Use uart interface to transfer one char
|
||||||
|
* Parameters : uint8 TxChar - character to tx
|
||||||
|
* Returns : OK
|
||||||
|
*******************************************************************************/
|
||||||
|
STATUS ICACHE_FLASH_ATTR
|
||||||
|
uart_tx_one_char(uint8 uart, uint8 TxChar)
|
||||||
|
{
|
||||||
|
while (true)
|
||||||
|
{
|
||||||
|
uint32 fifo_cnt = READ_PERI_REG(UART_STATUS(uart)) & (UART_TXFIFO_CNT<<UART_TXFIFO_CNT_S);
|
||||||
|
if ((fifo_cnt >> UART_TXFIFO_CNT_S & UART_TXFIFO_CNT) < 126) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
WRITE_PERI_REG(UART_FIFO(uart) , TxChar);
|
||||||
|
return OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* FunctionName : uart1_write_char
|
||||||
|
* Description : Internal used function
|
||||||
|
* Do some special deal while tx char is '\r' or '\n'
|
||||||
|
* Parameters : char c - character to tx
|
||||||
|
* Returns : NONE
|
||||||
|
*******************************************************************************/
|
||||||
|
LOCAL void ICACHE_FLASH_ATTR
|
||||||
|
uart1_write_char(char c)
|
||||||
|
{
|
||||||
|
if (c == '\n')
|
||||||
|
{
|
||||||
|
uart_tx_one_char(UART1, '\r');
|
||||||
|
uart_tx_one_char(UART1, '\n');
|
||||||
|
}
|
||||||
|
else if (c == '\r')
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
uart_tx_one_char(UART1, c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* FunctionName : uart0_tx_buffer
|
||||||
|
* Description : use uart0 to transfer buffer
|
||||||
|
* Parameters : uint8 *buf - point to send buffer
|
||||||
|
* uint16 len - buffer len
|
||||||
|
* Returns :
|
||||||
|
*******************************************************************************/
|
||||||
|
void ICACHE_FLASH_ATTR
|
||||||
|
uart0_tx_buffer(uint8 *buf, uint16 len)
|
||||||
|
{
|
||||||
|
uint16 i;
|
||||||
|
|
||||||
|
for (i = 0; i < len; i++)
|
||||||
|
{
|
||||||
|
uart_tx_one_char(UART0, buf[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* FunctionName : uart0_sendStr
|
||||||
|
* Description : use uart0 to transfer buffer
|
||||||
|
* Parameters : uint8 *buf - point to send buffer
|
||||||
|
* uint16 len - buffer len
|
||||||
|
* Returns :
|
||||||
|
*******************************************************************************/
|
||||||
|
void ICACHE_FLASH_ATTR uart0_sendStr(const char *str)
|
||||||
|
{
|
||||||
|
while(*str)
|
||||||
|
{
|
||||||
|
// uart_tx_one_char(UART0, *str++);
|
||||||
|
uart0_putc(*str++);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* FunctionName : uart0_putc
|
||||||
|
* Description : use uart0 to transfer char
|
||||||
|
* Parameters : uint8 c - send char
|
||||||
|
* Returns :
|
||||||
|
*******************************************************************************/
|
||||||
|
void ICACHE_FLASH_ATTR uart0_putc(const char c)
|
||||||
|
{
|
||||||
|
if (c == '\n')
|
||||||
|
{
|
||||||
|
uart_tx_one_char(UART0, '\r');
|
||||||
|
uart_tx_one_char(UART0, '\n');
|
||||||
|
}
|
||||||
|
else if (c == '\r')
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
uart_tx_one_char(UART0, c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* FunctionName : uart0_rx_intr_handler
|
||||||
|
* Description : Internal used function
|
||||||
|
* UART0 interrupt handler, add self handle code inside
|
||||||
|
* Parameters : void *para - point to ETS_UART_INTR_ATTACH's arg
|
||||||
|
* Returns : NONE
|
||||||
|
*******************************************************************************/
|
||||||
|
LOCAL void
|
||||||
|
uart0_rx_intr_handler(void *para)
|
||||||
|
{
|
||||||
|
/* uart0 and uart1 intr combine togther, when interrupt occur, see reg 0x3ff20020, bit2, bit0 represents
|
||||||
|
* uart1 and uart0 respectively
|
||||||
|
*/
|
||||||
|
RcvMsgBuff *pRxBuff = (RcvMsgBuff *)para;
|
||||||
|
uint8 RcvChar;
|
||||||
|
|
||||||
|
if (UART_RXFIFO_FULL_INT_ST != (READ_PERI_REG(UART_INT_ST(UART0)) & UART_RXFIFO_FULL_INT_ST)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
WRITE_PERI_REG(UART_INT_CLR(UART0), UART_RXFIFO_FULL_INT_CLR);
|
||||||
|
|
||||||
|
while (READ_PERI_REG(UART_STATUS(UART0)) & (UART_RXFIFO_CNT << UART_RXFIFO_CNT_S)) {
|
||||||
|
RcvChar = READ_PERI_REG(UART_FIFO(UART0)) & 0xFF;
|
||||||
|
|
||||||
|
/* you can add your handle code below.*/
|
||||||
|
|
||||||
|
*(pRxBuff->pWritePos) = RcvChar;
|
||||||
|
|
||||||
|
// insert here for get one command line from uart
|
||||||
|
if (RcvChar == '\r' || RcvChar == '\n' ) {
|
||||||
|
pRxBuff->BuffState = WRITE_OVER;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pRxBuff->pWritePos == (pRxBuff->pRcvMsgBuff + RX_BUFF_SIZE)) {
|
||||||
|
// overflow ...we may need more error handle here.
|
||||||
|
pRxBuff->pWritePos = pRxBuff->pRcvMsgBuff ;
|
||||||
|
} else {
|
||||||
|
pRxBuff->pWritePos++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pRxBuff->pWritePos == pRxBuff->pReadPos){ // overflow one byte, need push pReadPos one byte ahead
|
||||||
|
if (pRxBuff->pReadPos == (pRxBuff->pRcvMsgBuff + RX_BUFF_SIZE)) {
|
||||||
|
pRxBuff->pReadPos = pRxBuff->pRcvMsgBuff ;
|
||||||
|
} else {
|
||||||
|
pRxBuff->pReadPos++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* FunctionName : uart_init
|
||||||
|
* Description : user interface for init uart
|
||||||
|
* Parameters : UartBautRate uart0_br - uart0 bautrate
|
||||||
|
* UartBautRate uart1_br - uart1 bautrate
|
||||||
|
* Returns : NONE
|
||||||
|
*******************************************************************************/
|
||||||
|
void ICACHE_FLASH_ATTR
|
||||||
|
uart_init(UartBautRate uart0_br, UartBautRate uart1_br)
|
||||||
|
{
|
||||||
|
// rom use 74880 baut_rate, here reinitialize
|
||||||
|
UartDev.baut_rate = uart0_br;
|
||||||
|
uart_config(UART0);
|
||||||
|
UartDev.baut_rate = uart1_br;
|
||||||
|
uart_config(UART1);
|
||||||
|
ETS_UART_INTR_ENABLE();
|
||||||
|
|
||||||
|
// install uart1 putc callback
|
||||||
|
#ifndef NODE_DEBUG
|
||||||
|
os_install_putc1((void *)uart1_write_char);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void ICACHE_FLASH_ATTR
|
||||||
|
uart_setup(uint8 uart_no)
|
||||||
|
{
|
||||||
|
ETS_UART_INTR_DISABLE();
|
||||||
|
uart_config(uart_no);
|
||||||
|
ETS_UART_INTR_ENABLE();
|
||||||
|
}
|
27
app/gen_misc.bat
Normal file
27
app/gen_misc.bat
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
@echo off
|
||||||
|
set BACKPATH=%PATH%
|
||||||
|
set PATH=%BACKPATH%;%CD%\..\tools
|
||||||
|
@echo on
|
||||||
|
|
||||||
|
del /F ..\bin\eagle.app.v6.flash.bin ..\bin\eagle.app.v6.irom0text.bin ..\bin\eagle.app.v6.dump ..\bin\eagle.app.v6.S
|
||||||
|
|
||||||
|
cd .output\eagle\debug\image
|
||||||
|
|
||||||
|
xt-objdump -x -s eagle.app.v6.out > ..\..\..\..\..\bin\eagle.app.v6.dump
|
||||||
|
xt-objdump -S eagle.app.v6.out > ..\..\..\..\..\bin\eagle.app.v6.S
|
||||||
|
|
||||||
|
xt-objcopy --only-section .text -O binary eagle.app.v6.out eagle.app.v6.text.bin
|
||||||
|
xt-objcopy --only-section .data -O binary eagle.app.v6.out eagle.app.v6.data.bin
|
||||||
|
xt-objcopy --only-section .rodata -O binary eagle.app.v6.out eagle.app.v6.rodata.bin
|
||||||
|
xt-objcopy --only-section .irom0.text -O binary eagle.app.v6.out eagle.app.v6.irom0text.bin
|
||||||
|
|
||||||
|
gen_appbin.py eagle.app.v6.out v6
|
||||||
|
|
||||||
|
xcopy /y eagle.app.v6.irom0text.bin ..\..\..\..\..\bin\
|
||||||
|
xcopy /y eagle.app.v6.flash.bin ..\..\..\..\..\bin\
|
||||||
|
|
||||||
|
cd ..\..\..\..\
|
||||||
|
|
||||||
|
@echo off
|
||||||
|
set PATH=%BACKPATH%
|
||||||
|
@echo on
|
25
app/gen_misc.sh
Normal file
25
app/gen_misc.sh
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
#!/bin/bash -x
|
||||||
|
make
|
||||||
|
if [ $? == 0 ];then
|
||||||
|
rm ../bin/eagle.app.v6.flash.bin ../bin/eagle.app.v6.irom0text.bin ../bin/eagle.app.v6.dump ../bin/eagle.app.v6.S
|
||||||
|
|
||||||
|
cd .output/eagle/debug/image
|
||||||
|
|
||||||
|
xt-objdump -x -s eagle.app.v6.out > ../../../../../bin/eagle.app.v6.dump
|
||||||
|
xt-objdump -S eagle.app.v6.out > ../../../../../bin/eagle.app.v6.S
|
||||||
|
|
||||||
|
xt-objcopy --only-section .text -O binary eagle.app.v6.out eagle.app.v6.text.bin
|
||||||
|
xt-objcopy --only-section .data -O binary eagle.app.v6.out eagle.app.v6.data.bin
|
||||||
|
xt-objcopy --only-section .rodata -O binary eagle.app.v6.out eagle.app.v6.rodata.bin
|
||||||
|
xt-objcopy --only-section .irom0.text -O binary eagle.app.v6.out eagle.app.v6.irom0text.bin
|
||||||
|
|
||||||
|
../../../../../tools/gen_appbin.py eagle.app.v6.out v6
|
||||||
|
|
||||||
|
cp eagle.app.v6.irom0text.bin ../../../../../bin/
|
||||||
|
cp eagle.app.v6.flash.bin ../../../../../bin/
|
||||||
|
|
||||||
|
cd ../../../../../
|
||||||
|
|
||||||
|
else
|
||||||
|
echo "make error"
|
||||||
|
fi
|
27
app/gen_misc_plus.bat
Normal file
27
app/gen_misc_plus.bat
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
@echo off
|
||||||
|
set BACKPATH=%PATH%
|
||||||
|
set PATH=%BACKPATH%;%CD%\..\tools
|
||||||
|
@echo on
|
||||||
|
|
||||||
|
rm ..\bin\upgrade\%1.bin
|
||||||
|
|
||||||
|
cd .output\eagle\debug\image\
|
||||||
|
|
||||||
|
xt-objcopy --only-section .text -O binary eagle.app.v6.out eagle.app.v6.text.bin
|
||||||
|
xt-objcopy --only-section .data -O binary eagle.app.v6.out eagle.app.v6.data.bin
|
||||||
|
xt-objcopy --only-section .rodata -O binary eagle.app.v6.out eagle.app.v6.rodata.bin
|
||||||
|
xt-objcopy --only-section .irom0.text -O binary eagle.app.v6.out eagle.app.v6.irom0text.bin
|
||||||
|
|
||||||
|
gen_appbin.py eagle.app.v6.out v6
|
||||||
|
|
||||||
|
gen_flashbin.py eagle.app.v6.flash.bin eagle.app.v6.irom0text.bin
|
||||||
|
|
||||||
|
cp eagle.app.flash.bin %1.bin
|
||||||
|
|
||||||
|
xcopy /y %1.bin ..\..\..\..\..\bin\upgrade\
|
||||||
|
|
||||||
|
cd ..\..\..\..\
|
||||||
|
|
||||||
|
@echo off
|
||||||
|
set PATH=%BACKPATH%
|
||||||
|
@echo on
|
28
app/gen_misc_plus.sh
Normal file
28
app/gen_misc_plus.sh
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
#!/bin/bash -x
|
||||||
|
touch user/user_main.c
|
||||||
|
make APP=$1
|
||||||
|
if [ $? == 0 ];then
|
||||||
|
rm ../bin/upgrade/user$1.bin ../bin/upgrade/user$1.dump ../bin/upgrade/user$1.S
|
||||||
|
|
||||||
|
cd .output/eagle/debug/image/
|
||||||
|
|
||||||
|
xt-objdump -x -s eagle.app.v6.out > ../../../../../bin/upgrade/user$1.dump
|
||||||
|
xt-objdump -S eagle.app.v6.out > ../../../../../bin/upgrade/user$1.S
|
||||||
|
|
||||||
|
xt-objcopy --only-section .text -O binary eagle.app.v6.out eagle.app.v6.text.bin
|
||||||
|
xt-objcopy --only-section .data -O binary eagle.app.v6.out eagle.app.v6.data.bin
|
||||||
|
xt-objcopy --only-section .rodata -O binary eagle.app.v6.out eagle.app.v6.rodata.bin
|
||||||
|
xt-objcopy --only-section .irom0.text -O binary eagle.app.v6.out eagle.app.v6.irom0text.bin
|
||||||
|
|
||||||
|
../../../../../tools/gen_appbin.py eagle.app.v6.out v6
|
||||||
|
|
||||||
|
../../../../../tools/gen_flashbin.py eagle.app.v6.flash.bin eagle.app.v6.irom0text.bin
|
||||||
|
|
||||||
|
cp eagle.app.flash.bin user$1.bin
|
||||||
|
cp user$1.bin ../../../../../bin/upgrade/
|
||||||
|
|
||||||
|
cd ../../../../../
|
||||||
|
|
||||||
|
else
|
||||||
|
echo "make error"
|
||||||
|
fi
|
117
app/include/arch/cc.h
Normal file
117
app/include/arch/cc.h
Normal file
@ -0,0 +1,117 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2001, Swedish Institute of Computer Science.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* 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. Neither the name of the Institute nor the names of its contributors
|
||||||
|
* may be used to endorse or promote products derived from this software
|
||||||
|
* without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``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 INSTITUTE OR CONTRIBUTORS 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.
|
||||||
|
*
|
||||||
|
* This file is part of the lwIP TCP/IP stack.
|
||||||
|
*
|
||||||
|
* Author: Adam Dunkels <adam@sics.se>
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#ifndef __ARCH_CC_H__
|
||||||
|
#define __ARCH_CC_H__
|
||||||
|
|
||||||
|
//#include <string.h>
|
||||||
|
#include "c_types.h"
|
||||||
|
#include "ets_sys.h"
|
||||||
|
#include "osapi.h"
|
||||||
|
#define EFAULT 14
|
||||||
|
|
||||||
|
//#define LWIP_PROVIDE_ERRNO
|
||||||
|
|
||||||
|
#if (1)
|
||||||
|
#define BYTE_ORDER LITTLE_ENDIAN
|
||||||
|
#else
|
||||||
|
#define BYTE_ORDER BIG_ENDIAN
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
typedef unsigned char u8_t;
|
||||||
|
typedef signed char s8_t;
|
||||||
|
typedef unsigned short u16_t;
|
||||||
|
typedef signed short s16_t;
|
||||||
|
typedef unsigned long u32_t;
|
||||||
|
typedef signed long s32_t;
|
||||||
|
typedef unsigned long mem_ptr_t;
|
||||||
|
|
||||||
|
#define S16_F "d"
|
||||||
|
#define U16_F "d"
|
||||||
|
#define X16_F "x"
|
||||||
|
|
||||||
|
#define S32_F "d"
|
||||||
|
#define U32_F "d"
|
||||||
|
#define X32_F "x"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//#define PACK_STRUCT_FIELD(x) x __attribute__((packed))
|
||||||
|
#define PACK_STRUCT_FIELD(x) x
|
||||||
|
#define PACK_STRUCT_STRUCT __attribute__((packed))
|
||||||
|
#define PACK_STRUCT_BEGIN
|
||||||
|
#define PACK_STRUCT_END
|
||||||
|
|
||||||
|
//#define LWIP_DEBUG
|
||||||
|
|
||||||
|
#ifdef LWIP_DEBUG
|
||||||
|
#define LWIP_PLATFORM_DIAG(x) os_printf x
|
||||||
|
#define LWIP_PLATFORM_ASSERT(x) ETS_ASSERT(x)
|
||||||
|
#else
|
||||||
|
#define LWIP_PLATFORM_DIAG(x)
|
||||||
|
#define LWIP_PLATFORM_ASSERT(x)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define SYS_ARCH_DECL_PROTECT(x)
|
||||||
|
#define SYS_ARCH_PROTECT(x)
|
||||||
|
#define SYS_ARCH_UNPROTECT(x)
|
||||||
|
|
||||||
|
#define LWIP_PLATFORM_BYTESWAP 1
|
||||||
|
#define LWIP_PLATFORM_HTONS(_n) ((u16_t)((((_n) & 0xff) << 8) | (((_n) >> 8) & 0xff)))
|
||||||
|
#define LWIP_PLATFORM_HTONL(_n) ((u32_t)( (((_n) & 0xff) << 24) | (((_n) & 0xff00) << 8) | (((_n) >> 8) & 0xff00) | (((_n) >> 24) & 0xff) ))
|
||||||
|
|
||||||
|
#if LWIP_RAW
|
||||||
|
extern u8_t memp_memory_RAW_PCB_base[];
|
||||||
|
#endif /* LWIP_RAW */
|
||||||
|
|
||||||
|
#if LWIP_UDP
|
||||||
|
extern u8_t memp_memory_UDP_PCB_base[];
|
||||||
|
#endif /* LWIP_UDP */
|
||||||
|
|
||||||
|
#if LWIP_TCP
|
||||||
|
extern u8_t memp_memory_TCP_PCB_base[];
|
||||||
|
extern u8_t memp_memory_TCP_PCB_LISTEN_base[];
|
||||||
|
extern u8_t memp_memory_TCP_SEG_base[] SHMEM_ATTR;
|
||||||
|
#endif /* LWIP_TCP */
|
||||||
|
|
||||||
|
#if (!NO_SYS || (NO_SYS && !NO_SYS_NO_TIMERS)) /* LWIP_TIMERS */
|
||||||
|
extern u8_t memp_memory_SYS_TIMEOUT_base[];
|
||||||
|
#endif /* LWIP_TIMERS */
|
||||||
|
|
||||||
|
extern u8_t memp_memory_PBUF_base[];
|
||||||
|
extern u8_t memp_memory_PBUF_POOL_base[];
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* __ARCH_CC_H__ */
|
40
app/include/arch/perf.h
Normal file
40
app/include/arch/perf.h
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2001, Swedish Institute of Computer Science.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* 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. Neither the name of the Institute nor the names of its contributors
|
||||||
|
* may be used to endorse or promote products derived from this software
|
||||||
|
* without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``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 INSTITUTE OR CONTRIBUTORS 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.
|
||||||
|
*
|
||||||
|
* This file is part of the lwIP TCP/IP stack.
|
||||||
|
*
|
||||||
|
* Author: Adam Dunkels <adam@sics.se>
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#ifndef __PERF_H__
|
||||||
|
#define __PERF_H__
|
||||||
|
|
||||||
|
#define PERF_START /* null definition */
|
||||||
|
#define PERF_STOP(x) /* null definition */
|
||||||
|
|
||||||
|
#endif /* __PERF_H__ */
|
0
app/include/arch/sys_arch.h
Normal file
0
app/include/arch/sys_arch.h
Normal file
9
app/include/driver/gpio16.h
Normal file
9
app/include/driver/gpio16.h
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
#ifndef __GPIO16_H__
|
||||||
|
#define __GPIO16_H__
|
||||||
|
|
||||||
|
void gpio16_output_conf(void);
|
||||||
|
void gpio16_output_set(uint8 value);
|
||||||
|
void gpio16_input_conf(void);
|
||||||
|
uint8 gpio16_input_get(void);
|
||||||
|
|
||||||
|
#endif
|
69
app/include/driver/i2c_master.h
Normal file
69
app/include/driver/i2c_master.h
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
#ifndef __I2C_MASTER_H__
|
||||||
|
#define __I2C_MASTER_H__
|
||||||
|
|
||||||
|
#define I2C_MASTER_SDA_MUX (pin_mux[sda])
|
||||||
|
#define I2C_MASTER_SCL_MUX (pin_mux[scl])
|
||||||
|
#define I2C_MASTER_SDA_GPIO (pinSDA)
|
||||||
|
#define I2C_MASTER_SCL_GPIO (pinSCL)
|
||||||
|
#define I2C_MASTER_SDA_FUNC (pin_func[sda])
|
||||||
|
#define I2C_MASTER_SCL_FUNC (pin_func[scl])
|
||||||
|
|
||||||
|
// #define I2C_MASTER_SDA_MUX PERIPHS_IO_MUX_GPIO2_U
|
||||||
|
// #define I2C_MASTER_SCL_MUX PERIPHS_IO_MUX_MTDO_U
|
||||||
|
// #define I2C_MASTER_SDA_GPIO 2
|
||||||
|
// #define I2C_MASTER_SCL_GPIO 15
|
||||||
|
// #define I2C_MASTER_SDA_FUNC FUNC_GPIO2
|
||||||
|
// #define I2C_MASTER_SCL_FUNC FUNC_GPIO15
|
||||||
|
|
||||||
|
// #define I2C_MASTER_SDA_MUX PERIPHS_IO_MUX_GPIO2_U
|
||||||
|
// #define I2C_MASTER_SCL_MUX PERIPHS_IO_MUX_MTMS_U
|
||||||
|
// #define I2C_MASTER_SDA_GPIO 2
|
||||||
|
// #define I2C_MASTER_SCL_GPIO 14
|
||||||
|
// #define I2C_MASTER_SDA_FUNC FUNC_GPIO2
|
||||||
|
// #define I2C_MASTER_SCL_FUNC FUNC_GPIO14
|
||||||
|
|
||||||
|
//#define I2C_MASTER_SDA_MUX PERIPHS_IO_MUX_GPIO2_U
|
||||||
|
//#define I2C_MASTER_SCL_MUX PERIPHS_IO_MUX_GPIO0_U
|
||||||
|
//#define I2C_MASTER_SDA_GPIO 2
|
||||||
|
//#define I2C_MASTER_SCL_GPIO 0
|
||||||
|
//#define I2C_MASTER_SDA_FUNC FUNC_GPIO2
|
||||||
|
//#define I2C_MASTER_SCL_FUNC FUNC_GPIO0
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
#define I2C_MASTER_GPIO_SET(pin) \
|
||||||
|
gpio_output_set(1<<pin,0,1<<pin,0)
|
||||||
|
|
||||||
|
#define I2C_MASTER_GPIO_CLR(pin) \
|
||||||
|
gpio_output_set(0,1<<pin,1<<pin,0)
|
||||||
|
|
||||||
|
#define I2C_MASTER_GPIO_OUT(pin,val) \
|
||||||
|
if(val) I2C_MASTER_GPIO_SET(pin);\
|
||||||
|
else I2C_MASTER_GPIO_CLR(pin)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define I2C_MASTER_SDA_HIGH_SCL_HIGH() \
|
||||||
|
gpio_output_set(1<<I2C_MASTER_SDA_GPIO | 1<<I2C_MASTER_SCL_GPIO, 0, 1<<I2C_MASTER_SDA_GPIO | 1<<I2C_MASTER_SCL_GPIO, 0)
|
||||||
|
|
||||||
|
#define I2C_MASTER_SDA_HIGH_SCL_LOW() \
|
||||||
|
gpio_output_set(1<<I2C_MASTER_SDA_GPIO, 1<<I2C_MASTER_SCL_GPIO, 1<<I2C_MASTER_SDA_GPIO | 1<<I2C_MASTER_SCL_GPIO, 0)
|
||||||
|
|
||||||
|
#define I2C_MASTER_SDA_LOW_SCL_HIGH() \
|
||||||
|
gpio_output_set(1<<I2C_MASTER_SCL_GPIO, 1<<I2C_MASTER_SDA_GPIO, 1<<I2C_MASTER_SDA_GPIO | 1<<I2C_MASTER_SCL_GPIO, 0)
|
||||||
|
|
||||||
|
#define I2C_MASTER_SDA_LOW_SCL_LOW() \
|
||||||
|
gpio_output_set(0, 1<<I2C_MASTER_SDA_GPIO | 1<<I2C_MASTER_SCL_GPIO, 1<<I2C_MASTER_SDA_GPIO | 1<<I2C_MASTER_SCL_GPIO, 0)
|
||||||
|
|
||||||
|
void i2c_master_gpio_init(uint8 sda, uint8 scl);
|
||||||
|
void i2c_master_init(void);
|
||||||
|
|
||||||
|
#define i2c_master_wait os_delay_us
|
||||||
|
void i2c_master_stop(void);
|
||||||
|
void i2c_master_start(void);
|
||||||
|
void i2c_master_setAck(uint8 level);
|
||||||
|
uint8 i2c_master_getAck(void);
|
||||||
|
uint8 i2c_master_readByte(void);
|
||||||
|
void i2c_master_writeByte(uint8 wrdata);
|
||||||
|
uint8 i2c_master_get_pinSDA();
|
||||||
|
uint8 i2c_master_get_pinSCL();
|
||||||
|
|
||||||
|
#endif
|
27
app/include/driver/key.h
Normal file
27
app/include/driver/key.h
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
#ifndef __KEY_H__
|
||||||
|
#define __KEY_H__
|
||||||
|
|
||||||
|
#include "gpio.h"
|
||||||
|
|
||||||
|
typedef void (* key_function)(void);
|
||||||
|
|
||||||
|
struct single_key_param {
|
||||||
|
uint8 key_level;
|
||||||
|
uint8 gpio_id;
|
||||||
|
uint8 gpio_func;
|
||||||
|
uint32 gpio_name;
|
||||||
|
os_timer_t key_5s;
|
||||||
|
os_timer_t key_50ms;
|
||||||
|
key_function short_press;
|
||||||
|
key_function long_press;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct keys_param {
|
||||||
|
uint8 key_num;
|
||||||
|
struct single_key_param **single_key;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct single_key_param *key_init_single(uint8 gpio_id, uint32 gpio_name, uint8 gpio_func, key_function long_press, key_function short_press);
|
||||||
|
void key_init(struct keys_param *key);
|
||||||
|
|
||||||
|
#endif
|
150
app/include/driver/onewire.h
Normal file
150
app/include/driver/onewire.h
Normal file
@ -0,0 +1,150 @@
|
|||||||
|
#ifndef __ONEWIRE_H__
|
||||||
|
#define __ONEWIRE_H__
|
||||||
|
|
||||||
|
#include "c_types.h"
|
||||||
|
|
||||||
|
// You can exclude certain features from OneWire. In theory, this
|
||||||
|
// might save some space. In practice, the compiler automatically
|
||||||
|
// removes unused code (technically, the linker, using -fdata-sections
|
||||||
|
// and -ffunction-sections when compiling, and Wl,--gc-sections
|
||||||
|
// when linking), so most of these will not result in any code size
|
||||||
|
// reduction. Well, unless you try to use the missing features
|
||||||
|
// and redesign your program to not need them! ONEWIRE_CRC8_TABLE
|
||||||
|
// is the exception, because it selects a fast but large algorithm
|
||||||
|
// or a small but slow algorithm.
|
||||||
|
|
||||||
|
// you can exclude onewire_search by defining that to 0
|
||||||
|
#ifndef ONEWIRE_SEARCH
|
||||||
|
#define ONEWIRE_SEARCH 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// You can exclude CRC checks altogether by defining this to 0
|
||||||
|
#ifndef ONEWIRE_CRC
|
||||||
|
#define ONEWIRE_CRC 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Select the table-lookup method of computing the 8-bit CRC
|
||||||
|
// by setting this to 1. The lookup table enlarges code size by
|
||||||
|
// about 250 bytes. It does NOT consume RAM (but did in very
|
||||||
|
// old versions of OneWire). If you disable this, a slower
|
||||||
|
// but very compact algorithm is used.
|
||||||
|
#ifndef ONEWIRE_CRC8_TABLE
|
||||||
|
#define ONEWIRE_CRC8_TABLE 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// You can allow 16-bit CRC checks by defining this to 1
|
||||||
|
// (Note that ONEWIRE_CRC must also be 1.)
|
||||||
|
#ifndef ONEWIRE_CRC16
|
||||||
|
#define ONEWIRE_CRC16 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Platform specific I/O definitions
|
||||||
|
|
||||||
|
#define DIRECT_READ(pin) (0x1 & GPIO_INPUT_GET(GPIO_ID_PIN(pin_num[pin])))
|
||||||
|
#define DIRECT_MODE_INPUT(pin) GPIO_DIS_OUTPUT(pin_num[pin])
|
||||||
|
#define DIRECT_MODE_OUTPUT(pin)
|
||||||
|
#define DIRECT_WRITE_LOW(pin) (GPIO_OUTPUT_SET(GPIO_ID_PIN(pin_num[pin]), 0))
|
||||||
|
#define DIRECT_WRITE_HIGH(pin) (GPIO_OUTPUT_SET(GPIO_ID_PIN(pin_num[pin]), 1))
|
||||||
|
|
||||||
|
void onewire_init(uint8_t pin);
|
||||||
|
|
||||||
|
// Perform a 1-Wire reset cycle. Returns 1 if a device responds
|
||||||
|
// with a presence pulse. Returns 0 if there is no device or the
|
||||||
|
// bus is shorted or otherwise held low for more than 250uS
|
||||||
|
uint8_t onewire_reset(uint8_t pin);
|
||||||
|
|
||||||
|
// Issue a 1-Wire rom select command, you do the reset first.
|
||||||
|
void onewire_select(uint8_t pin, const uint8_t rom[8]);
|
||||||
|
|
||||||
|
// Issue a 1-Wire rom skip command, to address all on bus.
|
||||||
|
void onewire_skip(uint8_t pin);
|
||||||
|
|
||||||
|
// Write a byte. If 'power' is one then the wire is held high at
|
||||||
|
// the end for parasitically powered devices. You are responsible
|
||||||
|
// for eventually depowering it by calling depower() or doing
|
||||||
|
// another read or write.
|
||||||
|
void onewire_write(uint8_t pin, uint8_t v, uint8_t power);
|
||||||
|
|
||||||
|
void onewire_write_bytes(uint8_t pin, const uint8_t *buf, uint16_t count, bool power);
|
||||||
|
|
||||||
|
// Read a byte.
|
||||||
|
uint8_t onewire_read(uint8_t pin);
|
||||||
|
|
||||||
|
void onewire_read_bytes(uint8_t pin, uint8_t *buf, uint16_t count);
|
||||||
|
|
||||||
|
// Write a bit. The bus is always left powered at the end, see
|
||||||
|
// note in write() about that.
|
||||||
|
// void onewire_write_bit(uint8_t pin, uint8_t v);
|
||||||
|
|
||||||
|
// Read a bit.
|
||||||
|
// uint8_t onewire_read_bit(uint8_t pin);
|
||||||
|
|
||||||
|
// Stop forcing power onto the bus. You only need to do this if
|
||||||
|
// you used the 'power' flag to write() or used a write_bit() call
|
||||||
|
// and aren't about to do another read or write. You would rather
|
||||||
|
// not leave this powered if you don't have to, just in case
|
||||||
|
// someone shorts your bus.
|
||||||
|
void onewire_depower(uint8_t pin);
|
||||||
|
|
||||||
|
#if ONEWIRE_SEARCH
|
||||||
|
// Clear the search state so that if will start from the beginning again.
|
||||||
|
void onewire_reset_search(uint8_t pin);
|
||||||
|
|
||||||
|
// Setup the search to find the device type 'family_code' on the next call
|
||||||
|
// to search(*newAddr) if it is present.
|
||||||
|
void onewire_target_search(uint8_t pin, uint8_t family_code);
|
||||||
|
|
||||||
|
// Look for the next device. Returns 1 if a new address has been
|
||||||
|
// returned. A zero might mean that the bus is shorted, there are
|
||||||
|
// no devices, or you have already retrieved all of them. It
|
||||||
|
// might be a good idea to check the CRC to make sure you didn't
|
||||||
|
// get garbage. The order is deterministic. You will always get
|
||||||
|
// the same devices in the same order.
|
||||||
|
uint8_t onewire_search(uint8_t pin, uint8_t *newAddr);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if ONEWIRE_CRC
|
||||||
|
// Compute a Dallas Semiconductor 8 bit CRC, these are used in the
|
||||||
|
// ROM and scratchpad registers.
|
||||||
|
uint8_t onewire_crc8(const uint8_t *addr, uint8_t len);
|
||||||
|
|
||||||
|
#if ONEWIRE_CRC16
|
||||||
|
// Compute the 1-Wire CRC16 and compare it against the received CRC.
|
||||||
|
// Example usage (reading a DS2408):
|
||||||
|
// // Put everything in a buffer so we can compute the CRC easily.
|
||||||
|
// uint8_t buf[13];
|
||||||
|
// buf[0] = 0xF0; // Read PIO Registers
|
||||||
|
// buf[1] = 0x88; // LSB address
|
||||||
|
// buf[2] = 0x00; // MSB address
|
||||||
|
// WriteBytes(net, buf, 3); // Write 3 cmd bytes
|
||||||
|
// ReadBytes(net, buf+3, 10); // Read 6 data bytes, 2 0xFF, 2 CRC16
|
||||||
|
// if (!CheckCRC16(buf, 11, &buf[11])) {
|
||||||
|
// // Handle error.
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// @param input - Array of bytes to checksum.
|
||||||
|
// @param len - How many bytes to use.
|
||||||
|
// @param inverted_crc - The two CRC16 bytes in the received data.
|
||||||
|
// This should just point into the received data,
|
||||||
|
// *not* at a 16-bit integer.
|
||||||
|
// @param crc - The crc starting value (optional)
|
||||||
|
// @return True, iff the CRC matches.
|
||||||
|
bool onewire_check_crc16(const uint8_t* input, uint16_t len, const uint8_t* inverted_crc, uint16_t crc);
|
||||||
|
|
||||||
|
// Compute a Dallas Semiconductor 16 bit CRC. This is required to check
|
||||||
|
// the integrity of data received from many 1-Wire devices. Note that the
|
||||||
|
// CRC computed here is *not* what you'll get from the 1-Wire network,
|
||||||
|
// for two reasons:
|
||||||
|
// 1) The CRC is transmitted bitwise inverted.
|
||||||
|
// 2) Depending on the endian-ness of your processor, the binary
|
||||||
|
// representation of the two-byte return value may have a different
|
||||||
|
// byte order than the two bytes you get from 1-Wire.
|
||||||
|
// @param input - Array of bytes to checksum.
|
||||||
|
// @param len - How many bytes to use.
|
||||||
|
// @param crc - The crc starting value (optional)
|
||||||
|
// @return The CRC16, as defined by Dallas Semiconductor.
|
||||||
|
uint16_t onewire_crc16(const uint8_t* input, uint16_t len, uint16_t crc);
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
46
app/include/driver/pwm.h
Normal file
46
app/include/driver/pwm.h
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
#ifndef __PWM_H__
|
||||||
|
#define __PWM_H__
|
||||||
|
|
||||||
|
#define PWM_CHANNEL 6
|
||||||
|
|
||||||
|
struct pwm_single_param {
|
||||||
|
uint16 gpio_set;
|
||||||
|
uint16 gpio_clear;
|
||||||
|
uint32 h_time;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct pwm_param {
|
||||||
|
uint32 period;
|
||||||
|
uint16 freq;
|
||||||
|
uint16 duty[PWM_CHANNEL];
|
||||||
|
};
|
||||||
|
|
||||||
|
#define PWM_DEPTH 1023
|
||||||
|
#define PWM_FREQ_MAX 1000
|
||||||
|
|
||||||
|
#define PWM_1S 1000000
|
||||||
|
|
||||||
|
// #define PWM_0_OUT_IO_MUX PERIPHS_IO_MUX_MTMS_U
|
||||||
|
// #define PWM_0_OUT_IO_NUM 14
|
||||||
|
// #define PWM_0_OUT_IO_FUNC FUNC_GPIO14
|
||||||
|
|
||||||
|
// #define PWM_1_OUT_IO_MUX PERIPHS_IO_MUX_MTDI_U
|
||||||
|
// #define PWM_1_OUT_IO_NUM 12
|
||||||
|
// #define PWM_1_OUT_IO_FUNC FUNC_GPIO12
|
||||||
|
|
||||||
|
// #define PWM_2_OUT_IO_MUX PERIPHS_IO_MUX_MTCK_U
|
||||||
|
// #define PWM_2_OUT_IO_NUM 13
|
||||||
|
// #define PWM_2_OUT_IO_FUNC FUNC_GPIO13
|
||||||
|
|
||||||
|
void pwm_init(uint16 freq, uint16 *duty);
|
||||||
|
void pwm_start(void);
|
||||||
|
|
||||||
|
void pwm_set_duty(uint16 duty, uint8 channel);
|
||||||
|
uint16 pwm_get_duty(uint8 channel);
|
||||||
|
void pwm_set_freq(uint16 freq, uint8 channel);
|
||||||
|
uint16 pwm_get_freq(uint8 channel);
|
||||||
|
bool pwm_add(uint8 channel);
|
||||||
|
bool pwm_delete(uint8 channel);
|
||||||
|
bool pwm_exist(uint8 channel);
|
||||||
|
#endif
|
||||||
|
|
48
app/include/driver/spi.h
Normal file
48
app/include/driver/spi.h
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
#ifndef SPI_APP_H
|
||||||
|
#define SPI_APP_H
|
||||||
|
|
||||||
|
#include "spi_register.h"
|
||||||
|
#include "ets_sys.h"
|
||||||
|
#include "osapi.h"
|
||||||
|
#include "uart.h"
|
||||||
|
#include "os_type.h"
|
||||||
|
|
||||||
|
/*SPI number define*/
|
||||||
|
#define SPI 0
|
||||||
|
#define HSPI 1
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//lcd drive function
|
||||||
|
void spi_lcd_mode_init(uint8 spi_no);
|
||||||
|
void spi_lcd_9bit_write(uint8 spi_no,uint8 high_bit,uint8 low_8bit);
|
||||||
|
|
||||||
|
//spi master init funtion
|
||||||
|
void spi_master_init(uint8 spi_no);
|
||||||
|
//use spi send 8bit data
|
||||||
|
void spi_mast_byte_write(uint8 spi_no,uint8 data);
|
||||||
|
|
||||||
|
//transmit data to esp8266 slave buffer,which needs 16bit transmission ,
|
||||||
|
//first byte is master command 0x04, second byte is master data
|
||||||
|
void spi_byte_write_espslave(uint8 spi_no,uint8 data);
|
||||||
|
//read data from esp8266 slave buffer,which needs 16bit transmission ,
|
||||||
|
//first byte is master command 0x06, second byte is to read slave data
|
||||||
|
void spi_byte_read_espslave(uint8 spi_no,uint8 *data);
|
||||||
|
|
||||||
|
//esp8266 slave mode initial
|
||||||
|
void spi_slave_init(uint8 spi_no);
|
||||||
|
//esp8266 slave isr handle funtion,tiggered when any transmission is finished.
|
||||||
|
//the function is registered in spi_slave_init.
|
||||||
|
void spi_slave_isr_handler(void *para);
|
||||||
|
|
||||||
|
|
||||||
|
//hspi test function, used to test esp8266 spi slave
|
||||||
|
void hspi_master_readwrite_repeat(void);
|
||||||
|
|
||||||
|
|
||||||
|
void ICACHE_FLASH_ATTR
|
||||||
|
spi_test_init(void);
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
13
app/include/driver/spi_master.h
Normal file
13
app/include/driver/spi_master.h
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
#ifndef __SPI_MASTER_H__
|
||||||
|
#define __SPI_MASTER_H__
|
||||||
|
|
||||||
|
#include "driver/spi_register.h"
|
||||||
|
|
||||||
|
/*SPI number define*/
|
||||||
|
#define SPI 0
|
||||||
|
#define HSPI 1
|
||||||
|
|
||||||
|
void spi_master_init(uint8 spi_no);
|
||||||
|
void spi_master_9bit_write(uint8 spi_no, uint8 high_bit, uint8 low_8bit);
|
||||||
|
|
||||||
|
#endif
|
182
app/include/driver/spi_register.h
Normal file
182
app/include/driver/spi_register.h
Normal file
@ -0,0 +1,182 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2010 - 2011 Espressif System
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef SPI_REGISTER_H_INCLUDED
|
||||||
|
#define SPI_REGISTER_H_INCLUDED
|
||||||
|
|
||||||
|
#define REG_SPI_BASE(i) (0x60000200-i*0x100)
|
||||||
|
#define SPI_CMD(i) (REG_SPI_BASE(i) + 0x0)
|
||||||
|
#define SPI_USR (BIT(18))
|
||||||
|
|
||||||
|
#define SPI_ADDR(i) (REG_SPI_BASE(i) + 0x4)
|
||||||
|
|
||||||
|
#define SPI_CTRL(i) (REG_SPI_BASE(i) + 0x8)
|
||||||
|
#define SPI_WR_BIT_ORDER (BIT(26))
|
||||||
|
#define SPI_RD_BIT_ORDER (BIT(25))
|
||||||
|
#define SPI_QIO_MODE (BIT(24))
|
||||||
|
#define SPI_DIO_MODE (BIT(23))
|
||||||
|
#define SPI_QOUT_MODE (BIT(20))
|
||||||
|
#define SPI_DOUT_MODE (BIT(14))
|
||||||
|
#define SPI_FASTRD_MODE (BIT(13))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#define SPI_RD_STATUS(i) (REG_SPI_BASE(i) + 0x10)
|
||||||
|
|
||||||
|
#define SPI_CTRL2(i) (REG_SPI_BASE(i) + 0x14)
|
||||||
|
|
||||||
|
#define SPI_CS_DELAY_NUM 0x0000000F
|
||||||
|
#define SPI_CS_DELAY_NUM_S 28
|
||||||
|
#define SPI_CS_DELAY_MODE 0x00000003
|
||||||
|
#define SPI_CS_DELAY_MODE_S 26
|
||||||
|
#define SPI_MOSI_DELAY_NUM 0x00000007
|
||||||
|
#define SPI_MOSI_DELAY_NUM_S 23
|
||||||
|
#define SPI_MOSI_DELAY_MODE 0x00000003
|
||||||
|
#define SPI_MOSI_DELAY_MODE_S 21
|
||||||
|
#define SPI_MISO_DELAY_NUM 0x00000007
|
||||||
|
#define SPI_MISO_DELAY_NUM_S 18
|
||||||
|
#define SPI_MISO_DELAY_MODE 0x00000003
|
||||||
|
#define SPI_MISO_DELAY_MODE_S 16
|
||||||
|
#define SPI_CLOCK(i) (REG_SPI_BASE(i) + 0x18)
|
||||||
|
#define SPI_CLK_EQU_SYSCLK (BIT(31))
|
||||||
|
#define SPI_CLKDIV_PRE 0x00001FFF
|
||||||
|
#define SPI_CLKDIV_PRE_S 18
|
||||||
|
#define SPI_CLKCNT_N 0x0000003F
|
||||||
|
#define SPI_CLKCNT_N_S 12
|
||||||
|
#define SPI_CLKCNT_H 0x0000003F
|
||||||
|
#define SPI_CLKCNT_H_S 6
|
||||||
|
#define SPI_CLKCNT_L 0x0000003F
|
||||||
|
#define SPI_CLKCNT_L_S 0
|
||||||
|
|
||||||
|
#define SPI_USER(i) (REG_SPI_BASE(i) + 0x1C)
|
||||||
|
#define SPI_USR_COMMAND (BIT(31))
|
||||||
|
#define SPI_USR_ADDR (BIT(30))
|
||||||
|
#define SPI_USR_DUMMY (BIT(29))
|
||||||
|
#define SPI_USR_MISO (BIT(28))
|
||||||
|
#define SPI_USR_MOSI (BIT(27))
|
||||||
|
|
||||||
|
#define SPI_USR_MOSI_HIGHPART (BIT(25))
|
||||||
|
#define SPI_USR_MISO_HIGHPART (BIT(24))
|
||||||
|
|
||||||
|
|
||||||
|
#define SPI_SIO (BIT(16))
|
||||||
|
#define SPI_FWRITE_QIO (BIT(15))
|
||||||
|
#define SPI_FWRITE_DIO (BIT(14))
|
||||||
|
#define SPI_FWRITE_QUAD (BIT(13))
|
||||||
|
#define SPI_FWRITE_DUAL (BIT(12))
|
||||||
|
#define SPI_WR_BYTE_ORDER (BIT(11))
|
||||||
|
#define SPI_RD_BYTE_ORDER (BIT(10))
|
||||||
|
#define SPI_CK_OUT_EDGE (BIT(7))
|
||||||
|
#define SPI_CK_I_EDGE (BIT(6))
|
||||||
|
#define SPI_CS_SETUP (BIT(5))
|
||||||
|
#define SPI_CS_HOLD (BIT(4))
|
||||||
|
#define SPI_FLASH_MODE (BIT(2))
|
||||||
|
|
||||||
|
#define SPI_USER1(i) (REG_SPI_BASE(i) + 0x20)
|
||||||
|
#define SPI_USR_ADDR_BITLEN 0x0000003F
|
||||||
|
#define SPI_USR_ADDR_BITLEN_S 26
|
||||||
|
#define SPI_USR_MOSI_BITLEN 0x000001FF
|
||||||
|
#define SPI_USR_MOSI_BITLEN_S 17
|
||||||
|
#define SPI_USR_MISO_BITLEN 0x000001FF
|
||||||
|
#define SPI_USR_MISO_BITLEN_S 8
|
||||||
|
|
||||||
|
#define SPI_USR_DUMMY_CYCLELEN 0x000000FF
|
||||||
|
#define SPI_USR_DUMMY_CYCLELEN_S 0
|
||||||
|
|
||||||
|
#define SPI_USER2(i) (REG_SPI_BASE(i) + 0x24)
|
||||||
|
#define SPI_USR_COMMAND_BITLEN 0x0000000F
|
||||||
|
#define SPI_USR_COMMAND_BITLEN_S 28
|
||||||
|
#define SPI_USR_COMMAND_VALUE 0x0000FFFF
|
||||||
|
#define SPI_USR_COMMAND_VALUE_S 0
|
||||||
|
|
||||||
|
#define SPI_WR_STATUS(i) (REG_SPI_BASE(i) + 0x28)
|
||||||
|
#define SPI_PIN(i) (REG_SPI_BASE(i) + 0x2C)
|
||||||
|
#define SPI_CS2_DIS (BIT(2))
|
||||||
|
#define SPI_CS1_DIS (BIT(1))
|
||||||
|
#define SPI_CS0_DIS (BIT(0))
|
||||||
|
|
||||||
|
#define SPI_SLAVE(i) (REG_SPI_BASE(i) + 0x30)
|
||||||
|
#define SPI_SYNC_RESET (BIT(31))
|
||||||
|
#define SPI_SLAVE_MODE (BIT(30))
|
||||||
|
#define SPI_SLV_WR_RD_BUF_EN (BIT(29))
|
||||||
|
#define SPI_SLV_WR_RD_STA_EN (BIT(28))
|
||||||
|
#define SPI_SLV_CMD_DEFINE (BIT(27))
|
||||||
|
#define SPI_TRANS_CNT 0x0000000F
|
||||||
|
#define SPI_TRANS_CNT_S 23
|
||||||
|
#define SPI_TRANS_DONE_EN (BIT(9))
|
||||||
|
#define SPI_SLV_WR_STA_DONE_EN (BIT(8))
|
||||||
|
#define SPI_SLV_RD_STA_DONE_EN (BIT(7))
|
||||||
|
#define SPI_SLV_WR_BUF_DONE_EN (BIT(6))
|
||||||
|
#define SPI_SLV_RD_BUF_DONE_EN (BIT(5))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#define SLV_SPI_INT_EN 0x0000001f
|
||||||
|
#define SLV_SPI_INT_EN_S 5
|
||||||
|
|
||||||
|
#define SPI_TRANS_DONE (BIT(4))
|
||||||
|
#define SPI_SLV_WR_STA_DONE (BIT(3))
|
||||||
|
#define SPI_SLV_RD_STA_DONE (BIT(2))
|
||||||
|
#define SPI_SLV_WR_BUF_DONE (BIT(1))
|
||||||
|
#define SPI_SLV_RD_BUF_DONE (BIT(0))
|
||||||
|
|
||||||
|
#define SPI_SLAVE1(i) (REG_SPI_BASE(i) + 0x34)
|
||||||
|
#define SPI_SLV_STATUS_BITLEN 0x0000001F
|
||||||
|
#define SPI_SLV_STATUS_BITLEN_S 27
|
||||||
|
#define SPI_SLV_BUF_BITLEN 0x000001FF
|
||||||
|
#define SPI_SLV_BUF_BITLEN_S 16
|
||||||
|
#define SPI_SLV_RD_ADDR_BITLEN 0x0000003F
|
||||||
|
#define SPI_SLV_RD_ADDR_BITLEN_S 10
|
||||||
|
#define SPI_SLV_WR_ADDR_BITLEN 0x0000003F
|
||||||
|
#define SPI_SLV_WR_ADDR_BITLEN_S 4
|
||||||
|
|
||||||
|
#define SPI_SLV_WRSTA_DUMMY_EN (BIT(3))
|
||||||
|
#define SPI_SLV_RDSTA_DUMMY_EN (BIT(2))
|
||||||
|
#define SPI_SLV_WRBUF_DUMMY_EN (BIT(1))
|
||||||
|
#define SPI_SLV_RDBUF_DUMMY_EN (BIT(0))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#define SPI_SLAVE2(i) (REG_SPI_BASE(i) + 0x38)
|
||||||
|
#define SPI_SLV_WRBUF_DUMMY_CYCLELEN 0X000000FF
|
||||||
|
#define SPI_SLV_WRBUF_DUMMY_CYCLELEN_S 24
|
||||||
|
#define SPI_SLV_RDBUF_DUMMY_CYCLELEN 0X000000FF
|
||||||
|
#define SPI_SLV_RDBUF_DUMMY_CYCLELEN_S 16
|
||||||
|
#define SPI_SLV_WRSTR_DUMMY_CYCLELEN 0X000000FF
|
||||||
|
#define SPI_SLV_WRSTR_DUMMY_CYCLELEN_S 8
|
||||||
|
#define SPI_SLV_RDSTR_DUMMY_CYCLELEN 0x000000FF
|
||||||
|
#define SPI_SLV_RDSTR_DUMMY_CYCLELEN_S 0
|
||||||
|
|
||||||
|
#define SPI_SLAVE3(i) (REG_SPI_BASE(i) + 0x3C)
|
||||||
|
#define SPI_SLV_WRSTA_CMD_VALUE 0x000000FF
|
||||||
|
#define SPI_SLV_WRSTA_CMD_VALUE_S 24
|
||||||
|
#define SPI_SLV_RDSTA_CMD_VALUE 0x000000FF
|
||||||
|
#define SPI_SLV_RDSTA_CMD_VALUE_S 16
|
||||||
|
#define SPI_SLV_WRBUF_CMD_VALUE 0x000000FF
|
||||||
|
#define SPI_SLV_WRBUF_CMD_VALUE_S 8
|
||||||
|
#define SPI_SLV_RDBUF_CMD_VALUE 0x000000FF
|
||||||
|
#define SPI_SLV_RDBUF_CMD_VALUE_S 0
|
||||||
|
|
||||||
|
#define SPI_W0(i) (REG_SPI_BASE(i) +0x40)
|
||||||
|
#define SPI_W1(i) (REG_SPI_BASE(i) +0x44)
|
||||||
|
#define SPI_W2(i) (REG_SPI_BASE(i) +0x48)
|
||||||
|
#define SPI_W3(i) (REG_SPI_BASE(i) +0x4C)
|
||||||
|
#define SPI_W4(i) (REG_SPI_BASE(i) +0x50)
|
||||||
|
#define SPI_W5(i) (REG_SPI_BASE(i) +0x54)
|
||||||
|
#define SPI_W6(i) (REG_SPI_BASE(i) +0x58)
|
||||||
|
#define SPI_W7(i) (REG_SPI_BASE(i) +0x5C)
|
||||||
|
#define SPI_W8(i) (REG_SPI_BASE(i) +0x60)
|
||||||
|
#define SPI_W9(i) (REG_SPI_BASE(i) +0x64)
|
||||||
|
#define SPI_W10(i) (REG_SPI_BASE(i) +0x68)
|
||||||
|
#define SPI_W11(i) (REG_SPI_BASE(i) +0x6C)
|
||||||
|
#define SPI_W12(i) (REG_SPI_BASE(i) +0x70)
|
||||||
|
#define SPI_W13(i) (REG_SPI_BASE(i) +0x74)
|
||||||
|
#define SPI_W14(i) (REG_SPI_BASE(i) +0x78)
|
||||||
|
#define SPI_W15(i) (REG_SPI_BASE(i) +0x7C)
|
||||||
|
|
||||||
|
#define SPI_EXT3(i) (REG_SPI_BASE(i) + 0xFC)
|
||||||
|
#define SPI_INT_HOLD_ENA 0x00000003
|
||||||
|
#define SPI_INT_HOLD_ENA_S 0
|
||||||
|
#endif // SPI_REGISTER_H_INCLUDED
|
102
app/include/driver/uart.h
Normal file
102
app/include/driver/uart.h
Normal file
@ -0,0 +1,102 @@
|
|||||||
|
#ifndef UART_APP_H
|
||||||
|
#define UART_APP_H
|
||||||
|
|
||||||
|
#include "uart_register.h"
|
||||||
|
#include "eagle_soc.h"
|
||||||
|
#include "c_types.h"
|
||||||
|
|
||||||
|
#define RX_BUFF_SIZE 0x100
|
||||||
|
#define TX_BUFF_SIZE 100
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
FIVE_BITS = 0x0,
|
||||||
|
SIX_BITS = 0x1,
|
||||||
|
SEVEN_BITS = 0x2,
|
||||||
|
EIGHT_BITS = 0x3
|
||||||
|
} UartBitsNum4Char;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
ONE_STOP_BIT = 0,
|
||||||
|
ONE_HALF_STOP_BIT = BIT2,
|
||||||
|
TWO_STOP_BIT = BIT2
|
||||||
|
} UartStopBitsNum;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
NONE_BITS = 0,
|
||||||
|
ODD_BITS = 0,
|
||||||
|
EVEN_BITS = BIT4
|
||||||
|
} UartParityMode;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
STICK_PARITY_DIS = 0,
|
||||||
|
STICK_PARITY_EN = BIT3 | BIT5
|
||||||
|
} UartExistParity;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
BIT_RATE_9600 = 9600,
|
||||||
|
BIT_RATE_19200 = 19200,
|
||||||
|
BIT_RATE_38400 = 38400,
|
||||||
|
BIT_RATE_57600 = 57600,
|
||||||
|
BIT_RATE_74880 = 74880,
|
||||||
|
BIT_RATE_115200 = 115200,
|
||||||
|
BIT_RATE_230400 = 230400,
|
||||||
|
BIT_RATE_460800 = 460800,
|
||||||
|
BIT_RATE_921600 = 921600
|
||||||
|
} UartBautRate;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
NONE_CTRL,
|
||||||
|
HARDWARE_CTRL,
|
||||||
|
XON_XOFF_CTRL
|
||||||
|
} UartFlowCtrl;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
EMPTY,
|
||||||
|
UNDER_WRITE,
|
||||||
|
WRITE_OVER
|
||||||
|
} RcvMsgBuffState;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
uint32 RcvBuffSize;
|
||||||
|
uint8 *pRcvMsgBuff;
|
||||||
|
uint8 *pWritePos;
|
||||||
|
uint8 *pReadPos;
|
||||||
|
uint8 TrigLvl; //JLU: may need to pad
|
||||||
|
RcvMsgBuffState BuffState;
|
||||||
|
} RcvMsgBuff;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
uint32 TrxBuffSize;
|
||||||
|
uint8 *pTrxBuff;
|
||||||
|
} TrxMsgBuff;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
BAUD_RATE_DET,
|
||||||
|
WAIT_SYNC_FRM,
|
||||||
|
SRCH_MSG_HEAD,
|
||||||
|
RCV_MSG_BODY,
|
||||||
|
RCV_ESC_CHAR,
|
||||||
|
} RcvMsgState;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
UartBautRate baut_rate;
|
||||||
|
UartBitsNum4Char data_bits;
|
||||||
|
UartExistParity exist_parity;
|
||||||
|
UartParityMode parity; // chip size in byte
|
||||||
|
UartStopBitsNum stop_bits;
|
||||||
|
UartFlowCtrl flow_ctrl;
|
||||||
|
RcvMsgBuff rcv_buff;
|
||||||
|
TrxMsgBuff trx_buff;
|
||||||
|
RcvMsgState rcv_state;
|
||||||
|
int received;
|
||||||
|
int buff_uart_no; //indicate which uart use tx/rx buffer
|
||||||
|
} UartDevice;
|
||||||
|
|
||||||
|
void uart_init(UartBautRate uart0_br, UartBautRate uart1_br);
|
||||||
|
void uart0_sendStr(const char *str);
|
||||||
|
void uart0_putc(const char c);
|
||||||
|
void uart0_tx_buffer(uint8 *buf, uint16 len);
|
||||||
|
void uart_setup(uint8 uart_no);
|
||||||
|
STATUS uart_tx_one_char(uint8 uart, uint8 TxChar);
|
||||||
|
#endif
|
||||||
|
|
128
app/include/driver/uart_register.h
Normal file
128
app/include/driver/uart_register.h
Normal file
@ -0,0 +1,128 @@
|
|||||||
|
//Generated at 2012-07-03 18:44:06
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2010 - 2011 Espressif System
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef UART_REGISTER_H_INCLUDED
|
||||||
|
#define UART_REGISTER_H_INCLUDED
|
||||||
|
#define REG_UART_BASE( i ) (0x60000000+(i)*0xf00)
|
||||||
|
//version value:32'h062000
|
||||||
|
|
||||||
|
#define UART_FIFO( i ) (REG_UART_BASE( i ) + 0x0)
|
||||||
|
#define UART_RXFIFO_RD_BYTE 0x000000FF
|
||||||
|
#define UART_RXFIFO_RD_BYTE_S 0
|
||||||
|
|
||||||
|
#define UART_INT_RAW( i ) (REG_UART_BASE( i ) + 0x4)
|
||||||
|
#define UART_RXFIFO_TOUT_INT_RAW (BIT(8))
|
||||||
|
#define UART_BRK_DET_INT_RAW (BIT(7))
|
||||||
|
#define UART_CTS_CHG_INT_RAW (BIT(6))
|
||||||
|
#define UART_DSR_CHG_INT_RAW (BIT(5))
|
||||||
|
#define UART_RXFIFO_OVF_INT_RAW (BIT(4))
|
||||||
|
#define UART_FRM_ERR_INT_RAW (BIT(3))
|
||||||
|
#define UART_PARITY_ERR_INT_RAW (BIT(2))
|
||||||
|
#define UART_TXFIFO_EMPTY_INT_RAW (BIT(1))
|
||||||
|
#define UART_RXFIFO_FULL_INT_RAW (BIT(0))
|
||||||
|
|
||||||
|
#define UART_INT_ST( i ) (REG_UART_BASE( i ) + 0x8)
|
||||||
|
#define UART_RXFIFO_TOUT_INT_ST (BIT(8))
|
||||||
|
#define UART_BRK_DET_INT_ST (BIT(7))
|
||||||
|
#define UART_CTS_CHG_INT_ST (BIT(6))
|
||||||
|
#define UART_DSR_CHG_INT_ST (BIT(5))
|
||||||
|
#define UART_RXFIFO_OVF_INT_ST (BIT(4))
|
||||||
|
#define UART_FRM_ERR_INT_ST (BIT(3))
|
||||||
|
#define UART_PARITY_ERR_INT_ST (BIT(2))
|
||||||
|
#define UART_TXFIFO_EMPTY_INT_ST (BIT(1))
|
||||||
|
#define UART_RXFIFO_FULL_INT_ST (BIT(0))
|
||||||
|
|
||||||
|
#define UART_INT_ENA( i ) (REG_UART_BASE( i ) + 0xC)
|
||||||
|
#define UART_RXFIFO_TOUT_INT_ENA (BIT(8))
|
||||||
|
#define UART_BRK_DET_INT_ENA (BIT(7))
|
||||||
|
#define UART_CTS_CHG_INT_ENA (BIT(6))
|
||||||
|
#define UART_DSR_CHG_INT_ENA (BIT(5))
|
||||||
|
#define UART_RXFIFO_OVF_INT_ENA (BIT(4))
|
||||||
|
#define UART_FRM_ERR_INT_ENA (BIT(3))
|
||||||
|
#define UART_PARITY_ERR_INT_ENA (BIT(2))
|
||||||
|
#define UART_TXFIFO_EMPTY_INT_ENA (BIT(1))
|
||||||
|
#define UART_RXFIFO_FULL_INT_ENA (BIT(0))
|
||||||
|
|
||||||
|
#define UART_INT_CLR( i ) (REG_UART_BASE( i ) + 0x10)
|
||||||
|
#define UART_RXFIFO_TOUT_INT_CLR (BIT(8))
|
||||||
|
#define UART_BRK_DET_INT_CLR (BIT(7))
|
||||||
|
#define UART_CTS_CHG_INT_CLR (BIT(6))
|
||||||
|
#define UART_DSR_CHG_INT_CLR (BIT(5))
|
||||||
|
#define UART_RXFIFO_OVF_INT_CLR (BIT(4))
|
||||||
|
#define UART_FRM_ERR_INT_CLR (BIT(3))
|
||||||
|
#define UART_PARITY_ERR_INT_CLR (BIT(2))
|
||||||
|
#define UART_TXFIFO_EMPTY_INT_CLR (BIT(1))
|
||||||
|
#define UART_RXFIFO_FULL_INT_CLR (BIT(0))
|
||||||
|
|
||||||
|
#define UART_CLKDIV( i ) (REG_UART_BASE( i ) + 0x14)
|
||||||
|
#define UART_CLKDIV_CNT 0x000FFFFF
|
||||||
|
#define UART_CLKDIV_S 0
|
||||||
|
|
||||||
|
#define UART_AUTOBAUD( i ) (REG_UART_BASE( i ) + 0x18)
|
||||||
|
#define UART_GLITCH_FILT 0x000000FF
|
||||||
|
#define UART_GLITCH_FILT_S 8
|
||||||
|
#define UART_AUTOBAUD_EN (BIT(0))
|
||||||
|
|
||||||
|
#define UART_STATUS( i ) (REG_UART_BASE( i ) + 0x1C)
|
||||||
|
#define UART_TXD (BIT(31))
|
||||||
|
#define UART_RTSN (BIT(30))
|
||||||
|
#define UART_DTRN (BIT(29))
|
||||||
|
#define UART_TXFIFO_CNT 0x000000FF
|
||||||
|
#define UART_TXFIFO_CNT_S 16
|
||||||
|
#define UART_RXD (BIT(15))
|
||||||
|
#define UART_CTSN (BIT(14))
|
||||||
|
#define UART_DSRN (BIT(13))
|
||||||
|
#define UART_RXFIFO_CNT 0x000000FF
|
||||||
|
#define UART_RXFIFO_CNT_S 0
|
||||||
|
|
||||||
|
#define UART_CONF0( i ) (REG_UART_BASE( i ) + 0x20)
|
||||||
|
#define UART_TXFIFO_RST (BIT(18))
|
||||||
|
#define UART_RXFIFO_RST (BIT(17))
|
||||||
|
#define UART_IRDA_EN (BIT(16))
|
||||||
|
#define UART_TX_FLOW_EN (BIT(15))
|
||||||
|
#define UART_LOOPBACK (BIT(14))
|
||||||
|
#define UART_IRDA_RX_INV (BIT(13))
|
||||||
|
#define UART_IRDA_TX_INV (BIT(12))
|
||||||
|
#define UART_IRDA_WCTL (BIT(11))
|
||||||
|
#define UART_IRDA_TX_EN (BIT(10))
|
||||||
|
#define UART_IRDA_DPLX (BIT(9))
|
||||||
|
#define UART_TXD_BRK (BIT(8))
|
||||||
|
#define UART_SW_DTR (BIT(7))
|
||||||
|
#define UART_SW_RTS (BIT(6))
|
||||||
|
#define UART_STOP_BIT_NUM 0x00000003
|
||||||
|
#define UART_STOP_BIT_NUM_S 4
|
||||||
|
#define UART_BIT_NUM 0x00000003
|
||||||
|
#define UART_BIT_NUM_S 2
|
||||||
|
#define UART_PARITY_EN (BIT(1))
|
||||||
|
#define UART_PARITY (BIT(0))
|
||||||
|
|
||||||
|
#define UART_CONF1( i ) (REG_UART_BASE( i ) + 0x24)
|
||||||
|
#define UART_RX_TOUT_EN (BIT(31))
|
||||||
|
#define UART_RX_TOUT_THRHD 0x0000007F
|
||||||
|
#define UART_RX_TOUT_THRHD_S 24
|
||||||
|
#define UART_RX_FLOW_EN (BIT(23))
|
||||||
|
#define UART_RX_FLOW_THRHD 0x0000007F
|
||||||
|
#define UART_RX_FLOW_THRHD_S 16
|
||||||
|
#define UART_TXFIFO_EMPTY_THRHD 0x0000007F
|
||||||
|
#define UART_TXFIFO_EMPTY_THRHD_S 8
|
||||||
|
#define UART_RXFIFO_FULL_THRHD 0x0000007F
|
||||||
|
#define UART_RXFIFO_FULL_THRHD_S 0
|
||||||
|
|
||||||
|
#define UART_LOWPULSE( i ) (REG_UART_BASE( i ) + 0x28)
|
||||||
|
#define UART_LOWPULSE_MIN_CNT 0x000FFFFF
|
||||||
|
#define UART_LOWPULSE_MIN_CNT_S 0
|
||||||
|
|
||||||
|
#define UART_HIGHPULSE( i ) (REG_UART_BASE( i ) + 0x2C)
|
||||||
|
#define UART_HIGHPULSE_MIN_CNT 0x000FFFFF
|
||||||
|
#define UART_HIGHPULSE_MIN_CNT_S 0
|
||||||
|
|
||||||
|
#define UART_PULSE_NUM( i ) (REG_UART_BASE( i ) + 0x30)
|
||||||
|
#define UART_PULSE_NUM_CNT 0x0003FF
|
||||||
|
#define UART_PULSE_NUM_CNT_S 0
|
||||||
|
|
||||||
|
#define UART_DATE( i ) (REG_UART_BASE( i ) + 0x78)
|
||||||
|
#define UART_ID( i ) (REG_UART_BASE( i ) + 0x7C)
|
||||||
|
#endif // UART_REGISTER_H_INCLUDED
|
284
app/include/lwip/api.h
Normal file
284
app/include/lwip/api.h
Normal file
@ -0,0 +1,284 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2001-2004 Swedish Institute of Computer Science.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* This file is part of the lwIP TCP/IP stack.
|
||||||
|
*
|
||||||
|
* Author: Adam Dunkels <adam@sics.se>
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#ifndef __LWIP_API_H__
|
||||||
|
#define __LWIP_API_H__
|
||||||
|
|
||||||
|
#include "lwip/opt.h"
|
||||||
|
|
||||||
|
#if LWIP_NETCONN /* don't build if not configured for use in lwipopts.h */
|
||||||
|
|
||||||
|
#include <stddef.h> /* for size_t */
|
||||||
|
|
||||||
|
#include "lwip/netbuf.h"
|
||||||
|
#include "lwip/sys.h"
|
||||||
|
#include "lwip/ip_addr.h"
|
||||||
|
#include "lwip/err.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Throughout this file, IP addresses and port numbers are expected to be in
|
||||||
|
* the same byte order as in the corresponding pcb.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Flags for netconn_write (u8_t) */
|
||||||
|
#define NETCONN_NOFLAG 0x00
|
||||||
|
#define NETCONN_NOCOPY 0x00 /* Only for source code compatibility */
|
||||||
|
#define NETCONN_COPY 0x01
|
||||||
|
#define NETCONN_MORE 0x02
|
||||||
|
#define NETCONN_DONTBLOCK 0x04
|
||||||
|
|
||||||
|
/* Flags for struct netconn.flags (u8_t) */
|
||||||
|
/** TCP: when data passed to netconn_write doesn't fit into the send buffer,
|
||||||
|
this temporarily stores whether to wake up the original application task
|
||||||
|
if data couldn't be sent in the first try. */
|
||||||
|
#define NETCONN_FLAG_WRITE_DELAYED 0x01
|
||||||
|
/** Should this netconn avoid blocking? */
|
||||||
|
#define NETCONN_FLAG_NON_BLOCKING 0x02
|
||||||
|
/** Was the last connect action a non-blocking one? */
|
||||||
|
#define NETCONN_FLAG_IN_NONBLOCKING_CONNECT 0x04
|
||||||
|
/** If this is set, a TCP netconn must call netconn_recved() to update
|
||||||
|
the TCP receive window (done automatically if not set). */
|
||||||
|
#define NETCONN_FLAG_NO_AUTO_RECVED 0x08
|
||||||
|
/** If a nonblocking write has been rejected before, poll_tcp needs to
|
||||||
|
check if the netconn is writable again */
|
||||||
|
#define NETCONN_FLAG_CHECK_WRITESPACE 0x10
|
||||||
|
|
||||||
|
|
||||||
|
/* Helpers to process several netconn_types by the same code */
|
||||||
|
#define NETCONNTYPE_GROUP(t) (t&0xF0)
|
||||||
|
#define NETCONNTYPE_DATAGRAM(t) (t&0xE0)
|
||||||
|
|
||||||
|
/** Protocol family and type of the netconn */
|
||||||
|
enum netconn_type {
|
||||||
|
NETCONN_INVALID = 0,
|
||||||
|
/* NETCONN_TCP Group */
|
||||||
|
NETCONN_TCP = 0x10,
|
||||||
|
/* NETCONN_UDP Group */
|
||||||
|
NETCONN_UDP = 0x20,
|
||||||
|
NETCONN_UDPLITE = 0x21,
|
||||||
|
NETCONN_UDPNOCHKSUM= 0x22,
|
||||||
|
/* NETCONN_RAW Group */
|
||||||
|
NETCONN_RAW = 0x40
|
||||||
|
};
|
||||||
|
|
||||||
|
/** Current state of the netconn. Non-TCP netconns are always
|
||||||
|
* in state NETCONN_NONE! */
|
||||||
|
enum netconn_state {
|
||||||
|
NETCONN_NONE,
|
||||||
|
NETCONN_WRITE,
|
||||||
|
NETCONN_LISTEN,
|
||||||
|
NETCONN_CONNECT,
|
||||||
|
NETCONN_CLOSE
|
||||||
|
};
|
||||||
|
|
||||||
|
/** Use to inform the callback function about changes */
|
||||||
|
enum netconn_evt {
|
||||||
|
NETCONN_EVT_RCVPLUS,
|
||||||
|
NETCONN_EVT_RCVMINUS,
|
||||||
|
NETCONN_EVT_SENDPLUS,
|
||||||
|
NETCONN_EVT_SENDMINUS,
|
||||||
|
NETCONN_EVT_ERROR
|
||||||
|
};
|
||||||
|
|
||||||
|
#if LWIP_IGMP
|
||||||
|
/** Used for netconn_join_leave_group() */
|
||||||
|
enum netconn_igmp {
|
||||||
|
NETCONN_JOIN,
|
||||||
|
NETCONN_LEAVE
|
||||||
|
};
|
||||||
|
#endif /* LWIP_IGMP */
|
||||||
|
|
||||||
|
/* forward-declare some structs to avoid to include their headers */
|
||||||
|
struct ip_pcb;
|
||||||
|
struct tcp_pcb;
|
||||||
|
struct udp_pcb;
|
||||||
|
struct raw_pcb;
|
||||||
|
struct netconn;
|
||||||
|
struct api_msg_msg;
|
||||||
|
|
||||||
|
/** A callback prototype to inform about events for a netconn */
|
||||||
|
typedef void (* netconn_callback)(struct netconn *, enum netconn_evt, u16_t len);
|
||||||
|
|
||||||
|
/** A netconn descriptor */
|
||||||
|
struct netconn {
|
||||||
|
/** type of the netconn (TCP, UDP or RAW) */
|
||||||
|
enum netconn_type type;
|
||||||
|
/** current state of the netconn */
|
||||||
|
enum netconn_state state;
|
||||||
|
/** the lwIP internal protocol control block */
|
||||||
|
union {
|
||||||
|
struct ip_pcb *ip;
|
||||||
|
struct tcp_pcb *tcp;
|
||||||
|
struct udp_pcb *udp;
|
||||||
|
struct raw_pcb *raw;
|
||||||
|
} pcb;
|
||||||
|
/** the last error this netconn had */
|
||||||
|
err_t last_err;
|
||||||
|
/** sem that is used to synchroneously execute functions in the core context */
|
||||||
|
sys_sem_t op_completed;
|
||||||
|
/** mbox where received packets are stored until they are fetched
|
||||||
|
by the netconn application thread (can grow quite big) */
|
||||||
|
sys_mbox_t recvmbox;
|
||||||
|
#if LWIP_TCP
|
||||||
|
/** mbox where new connections are stored until processed
|
||||||
|
by the application thread */
|
||||||
|
sys_mbox_t acceptmbox;
|
||||||
|
#endif /* LWIP_TCP */
|
||||||
|
/** only used for socket layer */
|
||||||
|
#if LWIP_SOCKET
|
||||||
|
int socket;
|
||||||
|
#endif /* LWIP_SOCKET */
|
||||||
|
#if LWIP_SO_RCVTIMEO
|
||||||
|
/** timeout to wait for new data to be received
|
||||||
|
(or connections to arrive for listening netconns) */
|
||||||
|
int recv_timeout;
|
||||||
|
#endif /* LWIP_SO_RCVTIMEO */
|
||||||
|
#if LWIP_SO_RCVBUF
|
||||||
|
/** maximum amount of bytes queued in recvmbox
|
||||||
|
not used for TCP: adjust TCP_WND instead! */
|
||||||
|
int recv_bufsize;
|
||||||
|
/** number of bytes currently in recvmbox to be received,
|
||||||
|
tested against recv_bufsize to limit bytes on recvmbox
|
||||||
|
for UDP and RAW, used for FIONREAD */
|
||||||
|
s16_t recv_avail;
|
||||||
|
#endif /* LWIP_SO_RCVBUF */
|
||||||
|
/** flags holding more netconn-internal state, see NETCONN_FLAG_* defines */
|
||||||
|
u8_t flags;
|
||||||
|
#if LWIP_TCP
|
||||||
|
/** TCP: when data passed to netconn_write doesn't fit into the send buffer,
|
||||||
|
this temporarily stores how much is already sent. */
|
||||||
|
size_t write_offset;
|
||||||
|
/** TCP: when data passed to netconn_write doesn't fit into the send buffer,
|
||||||
|
this temporarily stores the message.
|
||||||
|
Also used during connect and close. */
|
||||||
|
struct api_msg_msg *current_msg;
|
||||||
|
#endif /* LWIP_TCP */
|
||||||
|
/** A callback function that is informed about events for this netconn */
|
||||||
|
netconn_callback callback;
|
||||||
|
};
|
||||||
|
|
||||||
|
/** Register an Network connection event */
|
||||||
|
#define API_EVENT(c,e,l) if (c->callback) { \
|
||||||
|
(*c->callback)(c, e, l); \
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Set conn->last_err to err but don't overwrite fatal errors */
|
||||||
|
#define NETCONN_SET_SAFE_ERR(conn, err) do { \
|
||||||
|
SYS_ARCH_DECL_PROTECT(lev); \
|
||||||
|
SYS_ARCH_PROTECT(lev); \
|
||||||
|
if (!ERR_IS_FATAL((conn)->last_err)) { \
|
||||||
|
(conn)->last_err = err; \
|
||||||
|
} \
|
||||||
|
SYS_ARCH_UNPROTECT(lev); \
|
||||||
|
} while(0);
|
||||||
|
|
||||||
|
/* Network connection functions: */
|
||||||
|
#define netconn_new(t) netconn_new_with_proto_and_callback(t, 0, NULL)
|
||||||
|
#define netconn_new_with_callback(t, c) netconn_new_with_proto_and_callback(t, 0, c)
|
||||||
|
struct
|
||||||
|
netconn *netconn_new_with_proto_and_callback(enum netconn_type t, u8_t proto,
|
||||||
|
netconn_callback callback);
|
||||||
|
err_t netconn_delete(struct netconn *conn);
|
||||||
|
/** Get the type of a netconn (as enum netconn_type). */
|
||||||
|
#define netconn_type(conn) (conn->type)
|
||||||
|
|
||||||
|
err_t netconn_getaddr(struct netconn *conn, ip_addr_t *addr,
|
||||||
|
u16_t *port, u8_t local);
|
||||||
|
#define netconn_peer(c,i,p) netconn_getaddr(c,i,p,0)
|
||||||
|
#define netconn_addr(c,i,p) netconn_getaddr(c,i,p,1)
|
||||||
|
|
||||||
|
err_t netconn_bind(struct netconn *conn, ip_addr_t *addr, u16_t port);
|
||||||
|
err_t netconn_connect(struct netconn *conn, ip_addr_t *addr, u16_t port);
|
||||||
|
err_t netconn_disconnect (struct netconn *conn);
|
||||||
|
err_t netconn_listen_with_backlog(struct netconn *conn, u8_t backlog);
|
||||||
|
#define netconn_listen(conn) netconn_listen_with_backlog(conn, TCP_DEFAULT_LISTEN_BACKLOG)
|
||||||
|
err_t netconn_accept(struct netconn *conn, struct netconn **new_conn);
|
||||||
|
err_t netconn_recv(struct netconn *conn, struct netbuf **new_buf);
|
||||||
|
err_t netconn_recv_tcp_pbuf(struct netconn *conn, struct pbuf **new_buf);
|
||||||
|
void netconn_recved(struct netconn *conn, u32_t length);
|
||||||
|
err_t netconn_sendto(struct netconn *conn, struct netbuf *buf,
|
||||||
|
ip_addr_t *addr, u16_t port);
|
||||||
|
err_t netconn_send(struct netconn *conn, struct netbuf *buf);
|
||||||
|
err_t netconn_write(struct netconn *conn, const void *dataptr, size_t size,
|
||||||
|
u8_t apiflags);
|
||||||
|
err_t netconn_close(struct netconn *conn);
|
||||||
|
err_t netconn_shutdown(struct netconn *conn, u8_t shut_rx, u8_t shut_tx);
|
||||||
|
|
||||||
|
#if LWIP_IGMP
|
||||||
|
err_t netconn_join_leave_group(struct netconn *conn, ip_addr_t *multiaddr,
|
||||||
|
ip_addr_t *netif_addr, enum netconn_igmp join_or_leave);
|
||||||
|
#endif /* LWIP_IGMP */
|
||||||
|
#if LWIP_DNS
|
||||||
|
err_t netconn_gethostbyname(const char *name, ip_addr_t *addr);
|
||||||
|
#endif /* LWIP_DNS */
|
||||||
|
|
||||||
|
#define netconn_err(conn) ((conn)->last_err)
|
||||||
|
#define netconn_recv_bufsize(conn) ((conn)->recv_bufsize)
|
||||||
|
|
||||||
|
/** Set the blocking status of netconn calls (@todo: write/send is missing) */
|
||||||
|
#define netconn_set_nonblocking(conn, val) do { if(val) { \
|
||||||
|
(conn)->flags |= NETCONN_FLAG_NON_BLOCKING; \
|
||||||
|
} else { \
|
||||||
|
(conn)->flags &= ~ NETCONN_FLAG_NON_BLOCKING; }} while(0)
|
||||||
|
/** Get the blocking status of netconn calls (@todo: write/send is missing) */
|
||||||
|
#define netconn_is_nonblocking(conn) (((conn)->flags & NETCONN_FLAG_NON_BLOCKING) != 0)
|
||||||
|
|
||||||
|
/** TCP: Set the no-auto-recved status of netconn calls (see NETCONN_FLAG_NO_AUTO_RECVED) */
|
||||||
|
#define netconn_set_noautorecved(conn, val) do { if(val) { \
|
||||||
|
(conn)->flags |= NETCONN_FLAG_NO_AUTO_RECVED; \
|
||||||
|
} else { \
|
||||||
|
(conn)->flags &= ~ NETCONN_FLAG_NO_AUTO_RECVED; }} while(0)
|
||||||
|
/** TCP: Get the no-auto-recved status of netconn calls (see NETCONN_FLAG_NO_AUTO_RECVED) */
|
||||||
|
#define netconn_get_noautorecved(conn) (((conn)->flags & NETCONN_FLAG_NO_AUTO_RECVED) != 0)
|
||||||
|
|
||||||
|
#if LWIP_SO_RCVTIMEO
|
||||||
|
/** Set the receive timeout in milliseconds */
|
||||||
|
#define netconn_set_recvtimeout(conn, timeout) ((conn)->recv_timeout = (timeout))
|
||||||
|
/** Get the receive timeout in milliseconds */
|
||||||
|
#define netconn_get_recvtimeout(conn) ((conn)->recv_timeout)
|
||||||
|
#endif /* LWIP_SO_RCVTIMEO */
|
||||||
|
#if LWIP_SO_RCVBUF
|
||||||
|
/** Set the receive buffer in bytes */
|
||||||
|
#define netconn_set_recvbufsize(conn, recvbufsize) ((conn)->recv_bufsize = (recvbufsize))
|
||||||
|
/** Get the receive buffer in bytes */
|
||||||
|
#define netconn_get_recvbufsize(conn) ((conn)->recv_bufsize)
|
||||||
|
#endif /* LWIP_SO_RCVBUF*/
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* LWIP_NETCONN */
|
||||||
|
|
||||||
|
#endif /* __LWIP_API_H__ */
|
174
app/include/lwip/api_msg.h
Normal file
174
app/include/lwip/api_msg.h
Normal file
@ -0,0 +1,174 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2001-2004 Swedish Institute of Computer Science.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* This file is part of the lwIP TCP/IP stack.
|
||||||
|
*
|
||||||
|
* Author: Adam Dunkels <adam@sics.se>
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#ifndef __LWIP_API_MSG_H__
|
||||||
|
#define __LWIP_API_MSG_H__
|
||||||
|
|
||||||
|
#include "lwip/opt.h"
|
||||||
|
|
||||||
|
#if LWIP_NETCONN /* don't build if not configured for use in lwipopts.h */
|
||||||
|
|
||||||
|
#include <stddef.h> /* for size_t */
|
||||||
|
|
||||||
|
#include "lwip/ip_addr.h"
|
||||||
|
#include "lwip/err.h"
|
||||||
|
#include "lwip/sys.h"
|
||||||
|
#include "lwip/igmp.h"
|
||||||
|
#include "lwip/api.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* For the netconn API, these values are use as a bitmask! */
|
||||||
|
#define NETCONN_SHUT_RD 1
|
||||||
|
#define NETCONN_SHUT_WR 2
|
||||||
|
#define NETCONN_SHUT_RDWR (NETCONN_SHUT_RD | NETCONN_SHUT_WR)
|
||||||
|
|
||||||
|
/* IP addresses and port numbers are expected to be in
|
||||||
|
* the same byte order as in the corresponding pcb.
|
||||||
|
*/
|
||||||
|
/** This struct includes everything that is necessary to execute a function
|
||||||
|
for a netconn in another thread context (mainly used to process netconns
|
||||||
|
in the tcpip_thread context to be thread safe). */
|
||||||
|
struct api_msg_msg {
|
||||||
|
/** The netconn which to process - always needed: it includes the semaphore
|
||||||
|
which is used to block the application thread until the function finished. */
|
||||||
|
struct netconn *conn;
|
||||||
|
/** The return value of the function executed in tcpip_thread. */
|
||||||
|
err_t err;
|
||||||
|
/** Depending on the executed function, one of these union members is used */
|
||||||
|
union {
|
||||||
|
/** used for do_send */
|
||||||
|
struct netbuf *b;
|
||||||
|
/** used for do_newconn */
|
||||||
|
struct {
|
||||||
|
u8_t proto;
|
||||||
|
} n;
|
||||||
|
/** used for do_bind and do_connect */
|
||||||
|
struct {
|
||||||
|
ip_addr_t *ipaddr;
|
||||||
|
u16_t port;
|
||||||
|
} bc;
|
||||||
|
/** used for do_getaddr */
|
||||||
|
struct {
|
||||||
|
ip_addr_t *ipaddr;
|
||||||
|
u16_t *port;
|
||||||
|
u8_t local;
|
||||||
|
} ad;
|
||||||
|
/** used for do_write */
|
||||||
|
struct {
|
||||||
|
const void *dataptr;
|
||||||
|
size_t len;
|
||||||
|
u8_t apiflags;
|
||||||
|
} w;
|
||||||
|
/** used for do_recv */
|
||||||
|
struct {
|
||||||
|
u32_t len;
|
||||||
|
} r;
|
||||||
|
/** used for do_close (/shutdown) */
|
||||||
|
struct {
|
||||||
|
u8_t shut;
|
||||||
|
} sd;
|
||||||
|
#if LWIP_IGMP
|
||||||
|
/** used for do_join_leave_group */
|
||||||
|
struct {
|
||||||
|
ip_addr_t *multiaddr;
|
||||||
|
ip_addr_t *netif_addr;
|
||||||
|
enum netconn_igmp join_or_leave;
|
||||||
|
} jl;
|
||||||
|
#endif /* LWIP_IGMP */
|
||||||
|
#if TCP_LISTEN_BACKLOG
|
||||||
|
struct {
|
||||||
|
u8_t backlog;
|
||||||
|
} lb;
|
||||||
|
#endif /* TCP_LISTEN_BACKLOG */
|
||||||
|
} msg;
|
||||||
|
};
|
||||||
|
|
||||||
|
/** This struct contains a function to execute in another thread context and
|
||||||
|
a struct api_msg_msg that serves as an argument for this function.
|
||||||
|
This is passed to tcpip_apimsg to execute functions in tcpip_thread context. */
|
||||||
|
struct api_msg {
|
||||||
|
/** function to execute in tcpip_thread context */
|
||||||
|
void (* function)(struct api_msg_msg *msg);
|
||||||
|
/** arguments for this function */
|
||||||
|
struct api_msg_msg msg;
|
||||||
|
};
|
||||||
|
|
||||||
|
#if LWIP_DNS
|
||||||
|
/** As do_gethostbyname requires more arguments but doesn't require a netconn,
|
||||||
|
it has its own struct (to avoid struct api_msg getting bigger than necessary).
|
||||||
|
do_gethostbyname must be called using tcpip_callback instead of tcpip_apimsg
|
||||||
|
(see netconn_gethostbyname). */
|
||||||
|
struct dns_api_msg {
|
||||||
|
/** Hostname to query or dotted IP address string */
|
||||||
|
const char *name;
|
||||||
|
/** Rhe resolved address is stored here */
|
||||||
|
ip_addr_t *addr;
|
||||||
|
/** This semaphore is posted when the name is resolved, the application thread
|
||||||
|
should wait on it. */
|
||||||
|
sys_sem_t *sem;
|
||||||
|
/** Errors are given back here */
|
||||||
|
err_t *err;
|
||||||
|
};
|
||||||
|
#endif /* LWIP_DNS */
|
||||||
|
|
||||||
|
void do_newconn ( struct api_msg_msg *msg);
|
||||||
|
void do_delconn ( struct api_msg_msg *msg);
|
||||||
|
void do_bind ( struct api_msg_msg *msg);
|
||||||
|
void do_connect ( struct api_msg_msg *msg);
|
||||||
|
void do_disconnect ( struct api_msg_msg *msg);
|
||||||
|
void do_listen ( struct api_msg_msg *msg);
|
||||||
|
void do_send ( struct api_msg_msg *msg);
|
||||||
|
void do_recv ( struct api_msg_msg *msg);
|
||||||
|
void do_write ( struct api_msg_msg *msg);
|
||||||
|
void do_getaddr ( struct api_msg_msg *msg);
|
||||||
|
void do_close ( struct api_msg_msg *msg);
|
||||||
|
void do_shutdown ( struct api_msg_msg *msg);
|
||||||
|
#if LWIP_IGMP
|
||||||
|
void do_join_leave_group( struct api_msg_msg *msg);
|
||||||
|
#endif /* LWIP_IGMP */
|
||||||
|
|
||||||
|
#if LWIP_DNS
|
||||||
|
void do_gethostbyname(void *arg);
|
||||||
|
#endif /* LWIP_DNS */
|
||||||
|
|
||||||
|
struct netconn* netconn_alloc(enum netconn_type t, netconn_callback callback);
|
||||||
|
void netconn_free(struct netconn *conn);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* LWIP_NETCONN */
|
||||||
|
|
||||||
|
#endif /* __LWIP_API_MSG_H__ */
|
89
app/include/lwip/app/dhcpserver.h
Normal file
89
app/include/lwip/app/dhcpserver.h
Normal file
@ -0,0 +1,89 @@
|
|||||||
|
#ifndef __DHCPS_H__
|
||||||
|
#define __DHCPS_H__
|
||||||
|
|
||||||
|
typedef struct dhcps_state{
|
||||||
|
sint16_t state;
|
||||||
|
} dhcps_state;
|
||||||
|
|
||||||
|
// <20><><EFBFBD><EFBFBD>dhcpclient<6E>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>DHCP msg<73>ṹ<EFBFBD><E1B9B9>
|
||||||
|
typedef struct dhcps_msg {
|
||||||
|
uint8_t op, htype, hlen, hops;
|
||||||
|
uint8_t xid[4];
|
||||||
|
uint16_t secs, flags;
|
||||||
|
uint8_t ciaddr[4];
|
||||||
|
uint8_t yiaddr[4];
|
||||||
|
uint8_t siaddr[4];
|
||||||
|
uint8_t giaddr[4];
|
||||||
|
uint8_t chaddr[16];
|
||||||
|
uint8_t sname[64];
|
||||||
|
uint8_t file[128];
|
||||||
|
uint8_t options[312];
|
||||||
|
}dhcps_msg;
|
||||||
|
|
||||||
|
#ifndef LWIP_OPEN_SRC
|
||||||
|
struct dhcps_lease {
|
||||||
|
uint32 start_ip;
|
||||||
|
uint32 end_ip;
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
struct dhcps_pool{
|
||||||
|
struct ip_addr ip;
|
||||||
|
uint8 mac[6];
|
||||||
|
uint32 lease_timer;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct _list_node{
|
||||||
|
void *pnode;
|
||||||
|
struct _list_node *pnext;
|
||||||
|
}list_node;
|
||||||
|
|
||||||
|
#define DHCPS_LEASE_TIMER 0x05A0
|
||||||
|
#define DHCPS_MAX_LEASE 0x64
|
||||||
|
#define BOOTP_BROADCAST 0x8000
|
||||||
|
|
||||||
|
#define DHCP_REQUEST 1
|
||||||
|
#define DHCP_REPLY 2
|
||||||
|
#define DHCP_HTYPE_ETHERNET 1
|
||||||
|
#define DHCP_HLEN_ETHERNET 6
|
||||||
|
#define DHCP_MSG_LEN 236
|
||||||
|
|
||||||
|
#define DHCPS_SERVER_PORT 67
|
||||||
|
#define DHCPS_CLIENT_PORT 68
|
||||||
|
|
||||||
|
#define DHCPDISCOVER 1
|
||||||
|
#define DHCPOFFER 2
|
||||||
|
#define DHCPREQUEST 3
|
||||||
|
#define DHCPDECLINE 4
|
||||||
|
#define DHCPACK 5
|
||||||
|
#define DHCPNAK 6
|
||||||
|
#define DHCPRELEASE 7
|
||||||
|
|
||||||
|
#define DHCP_OPTION_SUBNET_MASK 1
|
||||||
|
#define DHCP_OPTION_ROUTER 3
|
||||||
|
#define DHCP_OPTION_DNS_SERVER 6
|
||||||
|
#define DHCP_OPTION_REQ_IPADDR 50
|
||||||
|
#define DHCP_OPTION_LEASE_TIME 51
|
||||||
|
#define DHCP_OPTION_MSG_TYPE 53
|
||||||
|
#define DHCP_OPTION_SERVER_ID 54
|
||||||
|
#define DHCP_OPTION_INTERFACE_MTU 26
|
||||||
|
#define DHCP_OPTION_PERFORM_ROUTER_DISCOVERY 31
|
||||||
|
#define DHCP_OPTION_BROADCAST_ADDRESS 28
|
||||||
|
#define DHCP_OPTION_REQ_LIST 55
|
||||||
|
#define DHCP_OPTION_END 255
|
||||||
|
|
||||||
|
//#define USE_CLASS_B_NET 1
|
||||||
|
#define DHCPS_DEBUG 0
|
||||||
|
|
||||||
|
|
||||||
|
#define DHCPS_STATE_OFFER 1
|
||||||
|
#define DHCPS_STATE_DECLINE 2
|
||||||
|
#define DHCPS_STATE_ACK 3
|
||||||
|
#define DHCPS_STATE_NAK 4
|
||||||
|
#define DHCPS_STATE_IDLE 5
|
||||||
|
|
||||||
|
void dhcps_start(struct ip_info *info);
|
||||||
|
void dhcps_stop(void);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
398
app/include/lwip/app/espconn.h
Normal file
398
app/include/lwip/app/espconn.h
Normal file
@ -0,0 +1,398 @@
|
|||||||
|
#ifndef __ESPCONN_H__
|
||||||
|
#define __ESPCONN_H__
|
||||||
|
|
||||||
|
#include "lwip/dns.h"
|
||||||
|
#include "os_type.h"
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
#define espconn_printf(fmt, args...) os_printf(fmt,## args)
|
||||||
|
#else
|
||||||
|
#define espconn_printf(fmt, args...)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
typedef void *espconn_handle;
|
||||||
|
typedef void (* espconn_connect_callback)(void *arg);
|
||||||
|
typedef void (* espconn_reconnect_callback)(void *arg, sint8 err);
|
||||||
|
|
||||||
|
/* Definitions for error constants. */
|
||||||
|
|
||||||
|
#define ESPCONN_OK 0 /* No error, everything OK. */
|
||||||
|
#define ESPCONN_MEM -1 /* Out of memory error. */
|
||||||
|
#define ESPCONN_TIMEOUT -3 /* Timeout. */
|
||||||
|
#define ESPCONN_RTE -4 /* Routing problem. */
|
||||||
|
#define ESPCONN_INPROGRESS -5 /* Operation in progress */
|
||||||
|
|
||||||
|
#define ESPCONN_ABRT -8 /* Connection aborted. */
|
||||||
|
#define ESPCONN_RST -9 /* Connection reset. */
|
||||||
|
#define ESPCONN_CLSD -10 /* Connection closed. */
|
||||||
|
#define ESPCONN_CONN -11 /* Not connected. */
|
||||||
|
|
||||||
|
#define ESPCONN_ARG -12 /* Illegal argument. */
|
||||||
|
#define ESPCONN_ISCONN -15 /* Already connected. */
|
||||||
|
|
||||||
|
#define ESPCONN_SSL 0x01
|
||||||
|
#define ESPCONN_NORM 0x00
|
||||||
|
|
||||||
|
#define ESPCONN_STA 0x01
|
||||||
|
#define ESPCONN_AP 0x02
|
||||||
|
#define ESPCONN_AP_STA 0x03
|
||||||
|
|
||||||
|
#define STA_NETIF 0x00
|
||||||
|
#define AP_NETIF 0x01
|
||||||
|
|
||||||
|
/** Protocol family and type of the espconn */
|
||||||
|
enum espconn_type {
|
||||||
|
ESPCONN_INVALID = 0,
|
||||||
|
/* ESPCONN_TCP Group */
|
||||||
|
ESPCONN_TCP = 0x10,
|
||||||
|
/* ESPCONN_UDP Group */
|
||||||
|
ESPCONN_UDP = 0x20,
|
||||||
|
};
|
||||||
|
|
||||||
|
/** Current state of the espconn. Non-TCP espconn are always in state ESPCONN_NONE! */
|
||||||
|
enum espconn_state {
|
||||||
|
ESPCONN_NONE,
|
||||||
|
ESPCONN_WAIT,
|
||||||
|
ESPCONN_LISTEN,
|
||||||
|
ESPCONN_CONNECT,
|
||||||
|
ESPCONN_WRITE,
|
||||||
|
ESPCONN_READ,
|
||||||
|
ESPCONN_CLOSE
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct _esp_tcp {
|
||||||
|
int remote_port;
|
||||||
|
int local_port;
|
||||||
|
uint8 local_ip[4];
|
||||||
|
uint8 remote_ip[4];
|
||||||
|
espconn_connect_callback connect_callback;
|
||||||
|
espconn_reconnect_callback reconnect_callback;
|
||||||
|
espconn_connect_callback disconnect_callback;
|
||||||
|
} esp_tcp;
|
||||||
|
|
||||||
|
typedef struct _esp_udp {
|
||||||
|
int remote_port;
|
||||||
|
int local_port;
|
||||||
|
uint8 local_ip[4];
|
||||||
|
uint8 remote_ip[4];
|
||||||
|
} esp_udp;
|
||||||
|
|
||||||
|
typedef struct _remot_info{
|
||||||
|
enum espconn_state state;
|
||||||
|
int remote_port;
|
||||||
|
uint8 remote_ip[4];
|
||||||
|
}remot_info;
|
||||||
|
|
||||||
|
/** A callback prototype to inform about events for a espconn */
|
||||||
|
typedef void (* espconn_recv_callback)(void *arg, char *pdata, unsigned short len);
|
||||||
|
typedef void (* espconn_sent_callback)(void *arg);
|
||||||
|
|
||||||
|
/** A espconn descriptor */
|
||||||
|
struct espconn {
|
||||||
|
/** type of the espconn (TCP, UDP) */
|
||||||
|
enum espconn_type type;
|
||||||
|
/** current state of the espconn */
|
||||||
|
enum espconn_state state;
|
||||||
|
union {
|
||||||
|
esp_tcp *tcp;
|
||||||
|
esp_udp *udp;
|
||||||
|
} proto;
|
||||||
|
/** A callback function that is informed about events for this espconn */
|
||||||
|
espconn_recv_callback recv_callback;
|
||||||
|
espconn_sent_callback sent_callback;
|
||||||
|
uint8 link_cnt;
|
||||||
|
void *reverse;
|
||||||
|
};
|
||||||
|
|
||||||
|
enum espconn_option{
|
||||||
|
ESPCONN_REUSEADDR = 1,
|
||||||
|
ESPCONN_END
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct _comon_pkt{
|
||||||
|
void *pcb;
|
||||||
|
int remote_port;
|
||||||
|
uint8 remote_ip[4];
|
||||||
|
uint8 *ptrbuf;
|
||||||
|
uint16 cntr;
|
||||||
|
uint16 write_len;
|
||||||
|
uint16 write_total;
|
||||||
|
sint8 err;
|
||||||
|
uint32 timeout;
|
||||||
|
uint32 recv_check;
|
||||||
|
enum espconn_option espconn_opt;
|
||||||
|
os_timer_t ptimer;
|
||||||
|
}comon_pkt;
|
||||||
|
|
||||||
|
typedef struct _espconn_msg{
|
||||||
|
struct espconn *pespconn;
|
||||||
|
comon_pkt pcommon;
|
||||||
|
uint8 count_opt;
|
||||||
|
void *preverse;
|
||||||
|
void *pssl;
|
||||||
|
struct _espconn_msg *pnext;
|
||||||
|
}espconn_msg;
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* FunctionName : espconn_copy_partial
|
||||||
|
* Description : reconnect with host
|
||||||
|
* Parameters : arg -- Additional argument to pass to the callback function
|
||||||
|
* Returns : none
|
||||||
|
*******************************************************************************/
|
||||||
|
|
||||||
|
void espconn_copy_partial(struct espconn *pesp_dest, struct espconn *pesp_source);
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* FunctionName : espconn_copy_partial
|
||||||
|
* Description : insert the node to the active connection list
|
||||||
|
* Parameters : arg -- Additional argument to pass to the callback function
|
||||||
|
* Returns : none
|
||||||
|
*******************************************************************************/
|
||||||
|
|
||||||
|
void espconn_list_creat(espconn_msg **phead, espconn_msg* pinsert);
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* FunctionName : espconn_list_delete
|
||||||
|
* Description : remove the node from the active connection list
|
||||||
|
* Parameters : arg -- Additional argument to pass to the callback function
|
||||||
|
* Returns : none
|
||||||
|
*******************************************************************************/
|
||||||
|
|
||||||
|
void espconn_list_delete(espconn_msg **phead, espconn_msg* pdelete);
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* FunctionName : espconn_find_connection
|
||||||
|
* Description : Initialize the server: set up a listening PCB and bind it to
|
||||||
|
* the defined port
|
||||||
|
* Parameters : espconn -- the espconn used to build server
|
||||||
|
* Returns : none
|
||||||
|
*******************************************************************************/
|
||||||
|
|
||||||
|
bool espconn_find_connection(struct espconn *pespconn, espconn_msg **pnode);
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* FunctionName : espconn_get_connection_info
|
||||||
|
* Description : used to specify the function that should be called when disconnect
|
||||||
|
* Parameters : espconn -- espconn to set the err callback
|
||||||
|
* discon_cb -- err callback function to call when err
|
||||||
|
* Returns : none
|
||||||
|
*******************************************************************************/
|
||||||
|
|
||||||
|
sint8 espconn_get_connection_info(struct espconn *pespconn, remot_info **pcon_info, uint8 typeflags);
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* FunctionName : espconn_connect
|
||||||
|
* Description : The function given as the connect
|
||||||
|
* Parameters : espconn -- the espconn used to listen the connection
|
||||||
|
* Returns : none
|
||||||
|
*******************************************************************************/
|
||||||
|
|
||||||
|
extern sint8 espconn_connect(struct espconn *espconn);
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* FunctionName : espconn_disconnect
|
||||||
|
* Description : disconnect with host
|
||||||
|
* Parameters : espconn -- the espconn used to disconnect the connection
|
||||||
|
* Returns : none
|
||||||
|
*******************************************************************************/
|
||||||
|
|
||||||
|
extern sint8 espconn_disconnect(struct espconn *espconn);
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* FunctionName : espconn_delete
|
||||||
|
* Description : disconnect with host
|
||||||
|
* Parameters : espconn -- the espconn used to disconnect the connection
|
||||||
|
* Returns : none
|
||||||
|
*******************************************************************************/
|
||||||
|
|
||||||
|
extern sint8 espconn_delete(struct espconn *espconn);
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* FunctionName : espconn_accept
|
||||||
|
* Description : The function given as the listen
|
||||||
|
* Parameters : espconn -- the espconn used to listen the connection
|
||||||
|
* Returns : none
|
||||||
|
*******************************************************************************/
|
||||||
|
|
||||||
|
extern sint8 espconn_accept(struct espconn *espconn);
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* FunctionName : espconn_create
|
||||||
|
* Description : sent data for client or server
|
||||||
|
* Parameters : espconn -- espconn to the data transmission
|
||||||
|
* Returns : result
|
||||||
|
*******************************************************************************/
|
||||||
|
|
||||||
|
extern sint8 espconn_create(struct espconn *espconn);
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* FunctionName : espconn_tcp_get_max_con
|
||||||
|
* Description : get the number of simulatenously active TCP connections
|
||||||
|
* Parameters : none
|
||||||
|
* Returns : none
|
||||||
|
*******************************************************************************/
|
||||||
|
|
||||||
|
extern uint8 espconn_tcp_get_max_con(void);
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* FunctionName : espconn_tcp_set_max_con
|
||||||
|
* Description : set the number of simulatenously active TCP connections
|
||||||
|
* Parameters : num -- total number
|
||||||
|
* Returns : none
|
||||||
|
*******************************************************************************/
|
||||||
|
|
||||||
|
extern sint8 espconn_tcp_set_max_con(uint8 num);
|
||||||
|
/******************************************************************************
|
||||||
|
* FunctionName : espconn_tcp_get_max_con_allow
|
||||||
|
* Description : get the count of simulatenously active connections on the server
|
||||||
|
* Parameters : espconn -- espconn to get the count
|
||||||
|
* Returns : result
|
||||||
|
*******************************************************************************/
|
||||||
|
|
||||||
|
extern sint8 espconn_tcp_get_max_con_allow(struct espconn *espconn);
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* FunctionName : espconn_tcp_set_max_con_allow
|
||||||
|
* Description : set the count of simulatenously active connections on the server
|
||||||
|
* Parameters : espconn -- espconn to set the count
|
||||||
|
* Returns : result
|
||||||
|
*******************************************************************************/
|
||||||
|
|
||||||
|
extern sint8 espconn_tcp_set_max_con_allow(struct espconn *espconn, uint8 num);
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* FunctionName : espconn_regist_time
|
||||||
|
* Description : used to specify the time that should be called when don't recv data
|
||||||
|
* Parameters : espconn -- the espconn used to the connection
|
||||||
|
* interval -- the timer when don't recv data
|
||||||
|
* Returns : none
|
||||||
|
*******************************************************************************/
|
||||||
|
|
||||||
|
extern sint8 espconn_regist_time(struct espconn *espconn, uint32 interval, uint8 type_flag);
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* 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 : struct espconn *espconn -- espconn to set the sent callback
|
||||||
|
* espconn_sent_callback sent_cb -- sent callback function to
|
||||||
|
* call for this espconn when data is successfully sent
|
||||||
|
* Returns : none
|
||||||
|
*******************************************************************************/
|
||||||
|
|
||||||
|
extern sint8 espconn_regist_sentcb(struct espconn *espconn, espconn_sent_callback sent_cb);
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* FunctionName : espconn_sent
|
||||||
|
* Description : sent data for client or server
|
||||||
|
* Parameters : espconn -- espconn to set for client or server
|
||||||
|
* psent -- data to send
|
||||||
|
* length -- length of data to send
|
||||||
|
* Returns : none
|
||||||
|
*******************************************************************************/
|
||||||
|
|
||||||
|
extern sint8 espconn_sent(struct espconn *espconn, uint8 *psent, uint16 length);
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* FunctionName : espconn_regist_connectcb
|
||||||
|
* Description : used to specify the function that should be called when
|
||||||
|
* connects to host.
|
||||||
|
* Parameters : espconn -- espconn to set the connect callback
|
||||||
|
* connect_cb -- connected callback function to call when connected
|
||||||
|
* Returns : none
|
||||||
|
*******************************************************************************/
|
||||||
|
|
||||||
|
extern sint8 espconn_regist_connectcb(struct espconn *espconn, espconn_connect_callback connect_cb);
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* FunctionName : espconn_regist_recvcb
|
||||||
|
* Description : used to specify the function that should be called when recv
|
||||||
|
* data from host.
|
||||||
|
* Parameters : espconn -- espconn to set the recv callback
|
||||||
|
* recv_cb -- recv callback function to call when recv data
|
||||||
|
* Returns : none
|
||||||
|
*******************************************************************************/
|
||||||
|
|
||||||
|
extern sint8 espconn_regist_recvcb(struct espconn *espconn, espconn_recv_callback recv_cb);
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* FunctionName : espconn_regist_reconcb
|
||||||
|
* Description : used to specify the function that should be called when connection
|
||||||
|
* because of err disconnect.
|
||||||
|
* Parameters : espconn -- espconn to set the err callback
|
||||||
|
* recon_cb -- err callback function to call when err
|
||||||
|
* Returns : none
|
||||||
|
*******************************************************************************/
|
||||||
|
|
||||||
|
extern sint8 espconn_regist_reconcb(struct espconn *espconn, espconn_reconnect_callback recon_cb);
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* FunctionName : espconn_regist_disconcb
|
||||||
|
* Description : used to specify the function that should be called when disconnect
|
||||||
|
* Parameters : espconn -- espconn to set the err callback
|
||||||
|
* discon_cb -- err callback function to call when err
|
||||||
|
* Returns : none
|
||||||
|
*******************************************************************************/
|
||||||
|
|
||||||
|
extern sint8 espconn_regist_disconcb(struct espconn *espconn, espconn_connect_callback discon_cb);
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* FunctionName : espconn_port
|
||||||
|
* Description : access port value for client so that we don't end up bouncing
|
||||||
|
* all connections at the same time .
|
||||||
|
* Parameters : none
|
||||||
|
* Returns : access port value
|
||||||
|
*******************************************************************************/
|
||||||
|
|
||||||
|
extern uint32 espconn_port(void);
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* FunctionName : espconn_set_opt
|
||||||
|
* Description : access port value for client so that we don't end up bouncing
|
||||||
|
* all connections at the same time .
|
||||||
|
* Parameters : none
|
||||||
|
* Returns : access port value
|
||||||
|
*******************************************************************************/
|
||||||
|
extern sint8 espconn_set_opt(struct espconn *espconn, uint8 opt);
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* FunctionName : espconn_gethostbyname
|
||||||
|
* Description : Resolve a hostname (string) into an IP address.
|
||||||
|
* Parameters : pespconn -- espconn to resolve a hostname
|
||||||
|
* hostname -- the hostname that is to be queried
|
||||||
|
* addr -- pointer to a ip_addr_t where to store the address if
|
||||||
|
* it is already cached in the dns_table (only valid if
|
||||||
|
* ESPCONN_OK is returned!)
|
||||||
|
* found -- a callback function to be called on success, failure
|
||||||
|
* or timeout (only if ERR_INPROGRESS is returned!)
|
||||||
|
* Returns : err_t return code
|
||||||
|
* - ESPCONN_OK if hostname is a valid IP address string or the host
|
||||||
|
* name is already in the local names table.
|
||||||
|
* - ESPCONN_INPROGRESS enqueue a request to be sent to the DNS server
|
||||||
|
* for resolution if no errors are present.
|
||||||
|
* - ESPCONN_ARG: dns client not initialized or invalid hostname
|
||||||
|
*******************************************************************************/
|
||||||
|
|
||||||
|
extern sint8 espconn_gethostbyname(struct espconn *pespconn, const char *name, ip_addr_t *addr, dns_found_callback found);
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* FunctionName : espconn_igmp_join
|
||||||
|
* Description : join a multicast group
|
||||||
|
* Parameters : host_ip -- the ip address of udp server
|
||||||
|
* multicast_ip -- multicast ip given by user
|
||||||
|
* Returns : none
|
||||||
|
*******************************************************************************/
|
||||||
|
extern sint8 espconn_igmp_join(ip_addr_t *host_ip, ip_addr_t *multicast_ip);
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* FunctionName : espconn_igmp_leave
|
||||||
|
* Description : leave a multicast group
|
||||||
|
* Parameters : host_ip -- the ip address of udp server
|
||||||
|
* multicast_ip -- multicast ip given by user
|
||||||
|
* Returns : none
|
||||||
|
*******************************************************************************/
|
||||||
|
extern sint8 espconn_igmp_leave(ip_addr_t *host_ip, ip_addr_t *multicast_ip);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
43
app/include/lwip/app/espconn_tcp.h
Normal file
43
app/include/lwip/app/espconn_tcp.h
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
#ifndef __ESPCONN_TCP_H__
|
||||||
|
#define __ESPCONN_TCP_H__
|
||||||
|
|
||||||
|
#ifndef ESPCONN_TCP_DEBUG
|
||||||
|
#define ESPCONN_TCP_DEBUG LWIP_DBG_OFF
|
||||||
|
#endif
|
||||||
|
#include "lwip/app/espconn.h"
|
||||||
|
|
||||||
|
#ifndef ESPCONN_TCP_TIMER
|
||||||
|
#define ESPCONN_TCP_TIMER 40
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* FunctionName : espconn_tcp_disconnect
|
||||||
|
* Description : A new incoming connection has been disconnected.
|
||||||
|
* Parameters : espconn -- the espconn used to disconnect with host
|
||||||
|
* Returns : none
|
||||||
|
*******************************************************************************/
|
||||||
|
|
||||||
|
extern void espconn_tcp_disconnect(espconn_msg *pdiscon);
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* FunctionName : espconn_tcp_client
|
||||||
|
* Description : Initialize the client: set up a connect PCB and bind it to
|
||||||
|
* the defined port
|
||||||
|
* Parameters : espconn -- the espconn used to build client
|
||||||
|
* Returns : none
|
||||||
|
*******************************************************************************/
|
||||||
|
|
||||||
|
extern sint8 espconn_tcp_client(struct espconn* espconn);
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* FunctionName : espconn_tcp_server
|
||||||
|
* Description : Initialize the server: set up a listening PCB and bind it to
|
||||||
|
* the defined port
|
||||||
|
* Parameters : espconn -- the espconn used to build server
|
||||||
|
* Returns : none
|
||||||
|
*******************************************************************************/
|
||||||
|
|
||||||
|
extern sint8 espconn_tcp_server(struct espconn *espconn);
|
||||||
|
|
||||||
|
#endif /* __CLIENT_TCP_H__ */
|
||||||
|
|
51
app/include/lwip/app/espconn_udp.h
Normal file
51
app/include/lwip/app/espconn_udp.h
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
#ifndef __ESPCONN_UDP_H__
|
||||||
|
#define __ESPCONN_UDP_H__
|
||||||
|
|
||||||
|
#ifndef ESPCONN_UDP_DEBUG
|
||||||
|
#define ESPCONN_UDP_DEBUG LWIP_DBG_OFF
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "lwip/app/espconn.h"
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* FunctionName : espconn_udp_client
|
||||||
|
* Description : Initialize the client: set up a PCB and bind it to the port
|
||||||
|
* Parameters : pespconn -- the espconn used to build client
|
||||||
|
* Returns : none
|
||||||
|
*******************************************************************************/
|
||||||
|
|
||||||
|
extern sint8 espconn_udp_client(struct espconn *pespconn);
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* FunctionName : espconn_udp_disconnect
|
||||||
|
* Description : A new incoming connection has been disconnected.
|
||||||
|
* Parameters : espconn -- the espconn used to disconnect with host
|
||||||
|
* Returns : none
|
||||||
|
*******************************************************************************/
|
||||||
|
|
||||||
|
extern void espconn_udp_disconnect(espconn_msg *pdiscon);
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* FunctionName : espconn_udp_server
|
||||||
|
* Description : Initialize the server: set up a PCB and bind it to the port
|
||||||
|
* Parameters : pespconn -- the espconn used to build server
|
||||||
|
* Returns : none
|
||||||
|
*******************************************************************************/
|
||||||
|
|
||||||
|
extern sint8 espconn_udp_server(struct espconn *espconn);
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* FunctionName : espconn_udp_sent
|
||||||
|
* Description : sent data for client or server
|
||||||
|
* Parameters : void *arg -- client or server to send
|
||||||
|
* uint8* psent -- Data to send
|
||||||
|
* uint16 length -- Length of data to send
|
||||||
|
* Returns : none
|
||||||
|
*******************************************************************************/
|
||||||
|
|
||||||
|
extern void espconn_udp_sent(void *arg, uint8 *psent, uint16 length);
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* __ESPCONN_UDP_H__ */
|
||||||
|
|
||||||
|
|
85
app/include/lwip/app/ping.h
Normal file
85
app/include/lwip/app/ping.h
Normal file
@ -0,0 +1,85 @@
|
|||||||
|
#ifndef __PING_H__
|
||||||
|
#define __PING_H__
|
||||||
|
#include "lwip/ip_addr.h"
|
||||||
|
#include "lwip/icmp.h"
|
||||||
|
/**
|
||||||
|
* PING_USE_SOCKETS: Set to 1 to use sockets, otherwise the raw api is used
|
||||||
|
*/
|
||||||
|
#ifndef PING_USE_SOCKETS
|
||||||
|
#define PING_USE_SOCKETS LWIP_SOCKET
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* PING_DEBUG: Enable debugging for PING.
|
||||||
|
*/
|
||||||
|
#ifndef PING_DEBUG
|
||||||
|
#define PING_DEBUG LWIP_DBG_OFF
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/** ping receive timeout - in milliseconds */
|
||||||
|
#ifndef PING_RCV_TIMEO
|
||||||
|
#define PING_RCV_TIMEO 1000
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/** ping delay - in milliseconds */
|
||||||
|
#ifndef PING_COARSE
|
||||||
|
#define PING_COARSE 1000
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/** ping identifier - must fit on a u16_t */
|
||||||
|
#ifndef PING_ID
|
||||||
|
#define PING_ID 0xAFAF
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/** ping additional data size to include in the packet */
|
||||||
|
#ifndef PING_DATA_SIZE
|
||||||
|
#define PING_DATA_SIZE 32
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/** ping result action - no default action */
|
||||||
|
#ifndef PING_RESULT
|
||||||
|
#define PING_RESULT(ping_ok)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define DEFAULT_PING_MAX_COUNT 4
|
||||||
|
#define PING_TIMEOUT_MS 1000
|
||||||
|
|
||||||
|
typedef void (* ping_recv_function)(void* arg, void *pdata);
|
||||||
|
typedef void (* ping_sent_function)(void* arg, void *pdata);
|
||||||
|
|
||||||
|
struct ping_option{
|
||||||
|
uint32 count;
|
||||||
|
uint32 ip;
|
||||||
|
uint32 coarse_time;
|
||||||
|
ping_recv_function recv_function;
|
||||||
|
ping_sent_function sent_function;
|
||||||
|
void* reverse;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct ping_msg{
|
||||||
|
struct ping_option *ping_opt;
|
||||||
|
struct raw_pcb *ping_pcb;
|
||||||
|
uint32 ping_start;
|
||||||
|
uint32 ping_sent;
|
||||||
|
uint32 timeout_count;
|
||||||
|
uint32 max_count;
|
||||||
|
uint32 sent_count;
|
||||||
|
uint32 coarse_time;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct ping_resp{
|
||||||
|
uint32 total_count;
|
||||||
|
uint32 resp_time;
|
||||||
|
uint32 seqno;
|
||||||
|
uint32 timeout_count;
|
||||||
|
uint32 bytes;
|
||||||
|
uint32 total_bytes;
|
||||||
|
uint32 total_time;
|
||||||
|
sint8 ping_err;
|
||||||
|
};
|
||||||
|
|
||||||
|
bool ping_start(struct ping_option *ping_opt);
|
||||||
|
bool ping_regist_recv(struct ping_option *ping_opt, ping_recv_function ping_recv);
|
||||||
|
bool ping_regist_sent(struct ping_option *ping_opt, ping_sent_function ping_sent);
|
||||||
|
|
||||||
|
#endif /* __PING_H__ */
|
238
app/include/lwip/arch.h
Normal file
238
app/include/lwip/arch.h
Normal file
@ -0,0 +1,238 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2001-2004 Swedish Institute of Computer Science.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* This file is part of the lwIP TCP/IP stack.
|
||||||
|
*
|
||||||
|
* Author: Adam Dunkels <adam@sics.se>
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#ifndef __LWIP_ARCH_H__
|
||||||
|
#define __LWIP_ARCH_H__
|
||||||
|
|
||||||
|
#ifndef LITTLE_ENDIAN
|
||||||
|
#define LITTLE_ENDIAN 1234
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef BIG_ENDIAN
|
||||||
|
#define BIG_ENDIAN 4321
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "arch/cc.h"
|
||||||
|
|
||||||
|
/** Temporary: define format string for size_t if not defined in cc.h */
|
||||||
|
#ifndef SZT_F
|
||||||
|
#define SZT_F U32_F
|
||||||
|
#endif /* SZT_F */
|
||||||
|
/** Temporary upgrade helper: define format string for u8_t as hex if not
|
||||||
|
defined in cc.h */
|
||||||
|
#ifndef X8_F
|
||||||
|
#define X8_F "02x"
|
||||||
|
#endif /* X8_F */
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef PACK_STRUCT_BEGIN
|
||||||
|
#define PACK_STRUCT_BEGIN
|
||||||
|
#endif /* PACK_STRUCT_BEGIN */
|
||||||
|
|
||||||
|
#ifndef PACK_STRUCT_END
|
||||||
|
#define PACK_STRUCT_END
|
||||||
|
#endif /* PACK_STRUCT_END */
|
||||||
|
|
||||||
|
#ifndef PACK_STRUCT_FIELD
|
||||||
|
#define PACK_STRUCT_FIELD(x) x
|
||||||
|
#endif /* PACK_STRUCT_FIELD */
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef LWIP_UNUSED_ARG
|
||||||
|
#define LWIP_UNUSED_ARG(x) (void)x
|
||||||
|
#endif /* LWIP_UNUSED_ARG */
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef LWIP_PROVIDE_ERRNO
|
||||||
|
|
||||||
|
#define EPERM 1 /* Operation not permitted */
|
||||||
|
#define ENOENT 2 /* No such file or directory */
|
||||||
|
#define ESRCH 3 /* No such process */
|
||||||
|
#define EINTR 4 /* Interrupted system call */
|
||||||
|
#define EIO 5 /* I/O error */
|
||||||
|
#define ENXIO 6 /* No such device or address */
|
||||||
|
#define E2BIG 7 /* Arg list too long */
|
||||||
|
#define ENOEXEC 8 /* Exec format error */
|
||||||
|
#define EBADF 9 /* Bad file number */
|
||||||
|
#define ECHILD 10 /* No child processes */
|
||||||
|
#define EAGAIN 11 /* Try again */
|
||||||
|
#define ENOMEM 12 /* Out of memory */
|
||||||
|
#define EACCES 13 /* Permission denied */
|
||||||
|
#define EFAULT 14 /* Bad address */
|
||||||
|
#define ENOTBLK 15 /* Block device required */
|
||||||
|
#define EBUSY 16 /* Device or resource busy */
|
||||||
|
#define EEXIST 17 /* File exists */
|
||||||
|
#define EXDEV 18 /* Cross-device link */
|
||||||
|
#define ENODEV 19 /* No such device */
|
||||||
|
#define ENOTDIR 20 /* Not a directory */
|
||||||
|
#define EISDIR 21 /* Is a directory */
|
||||||
|
#define EINVAL 22 /* Invalid argument */
|
||||||
|
#define ENFILE 23 /* File table overflow */
|
||||||
|
#define EMFILE 24 /* Too many open files */
|
||||||
|
#define ENOTTY 25 /* Not a typewriter */
|
||||||
|
#define ETXTBSY 26 /* Text file busy */
|
||||||
|
#define EFBIG 27 /* File too large */
|
||||||
|
#define ENOSPC 28 /* No space left on device */
|
||||||
|
#define ESPIPE 29 /* Illegal seek */
|
||||||
|
#define EROFS 30 /* Read-only file system */
|
||||||
|
#define EMLINK 31 /* Too many links */
|
||||||
|
#define EPIPE 32 /* Broken pipe */
|
||||||
|
#define EDOM 33 /* Math argument out of domain of func */
|
||||||
|
#define ERANGE 34 /* Math result not representable */
|
||||||
|
#define EDEADLK 35 /* Resource deadlock would occur */
|
||||||
|
#define ENAMETOOLONG 36 /* File name too long */
|
||||||
|
#define ENOLCK 37 /* No record locks available */
|
||||||
|
#define ENOSYS 38 /* Function not implemented */
|
||||||
|
#define ENOTEMPTY 39 /* Directory not empty */
|
||||||
|
#define ELOOP 40 /* Too many symbolic links encountered */
|
||||||
|
#define EWOULDBLOCK EAGAIN /* Operation would block */
|
||||||
|
#define ENOMSG 42 /* No message of desired type */
|
||||||
|
#define EIDRM 43 /* Identifier removed */
|
||||||
|
#define ECHRNG 44 /* Channel number out of range */
|
||||||
|
#define EL2NSYNC 45 /* Level 2 not synchronized */
|
||||||
|
#define EL3HLT 46 /* Level 3 halted */
|
||||||
|
#define EL3RST 47 /* Level 3 reset */
|
||||||
|
#define ELNRNG 48 /* Link number out of range */
|
||||||
|
#define EUNATCH 49 /* Protocol driver not attached */
|
||||||
|
#define ENOCSI 50 /* No CSI structure available */
|
||||||
|
#define EL2HLT 51 /* Level 2 halted */
|
||||||
|
#define EBADE 52 /* Invalid exchange */
|
||||||
|
#define EBADR 53 /* Invalid request descriptor */
|
||||||
|
#define EXFULL 54 /* Exchange full */
|
||||||
|
#define ENOANO 55 /* No anode */
|
||||||
|
#define EBADRQC 56 /* Invalid request code */
|
||||||
|
#define EBADSLT 57 /* Invalid slot */
|
||||||
|
|
||||||
|
#define EDEADLOCK EDEADLK
|
||||||
|
|
||||||
|
#define EBFONT 59 /* Bad font file format */
|
||||||
|
#define ENOSTR 60 /* Device not a stream */
|
||||||
|
#define ENODATA 61 /* No data available */
|
||||||
|
#define ETIME 62 /* Timer expired */
|
||||||
|
#define ENOSR 63 /* Out of streams resources */
|
||||||
|
#define ENONET 64 /* Machine is not on the network */
|
||||||
|
#define ENOPKG 65 /* Package not installed */
|
||||||
|
#define EREMOTE 66 /* Object is remote */
|
||||||
|
#define ENOLINK 67 /* Link has been severed */
|
||||||
|
#define EADV 68 /* Advertise error */
|
||||||
|
#define ESRMNT 69 /* Srmount error */
|
||||||
|
#define ECOMM 70 /* Communication error on send */
|
||||||
|
#define EPROTO 71 /* Protocol error */
|
||||||
|
#define EMULTIHOP 72 /* Multihop attempted */
|
||||||
|
#define EDOTDOT 73 /* RFS specific error */
|
||||||
|
#define EBADMSG 74 /* Not a data message */
|
||||||
|
#define EOVERFLOW 75 /* Value too large for defined data type */
|
||||||
|
#define ENOTUNIQ 76 /* Name not unique on network */
|
||||||
|
#define EBADFD 77 /* File descriptor in bad state */
|
||||||
|
#define EREMCHG 78 /* Remote address changed */
|
||||||
|
#define ELIBACC 79 /* Can not access a needed shared library */
|
||||||
|
#define ELIBBAD 80 /* Accessing a corrupted shared library */
|
||||||
|
#define ELIBSCN 81 /* .lib section in a.out corrupted */
|
||||||
|
#define ELIBMAX 82 /* Attempting to link in too many shared libraries */
|
||||||
|
#define ELIBEXEC 83 /* Cannot exec a shared library directly */
|
||||||
|
#define EILSEQ 84 /* Illegal byte sequence */
|
||||||
|
#define ERESTART 85 /* Interrupted system call should be restarted */
|
||||||
|
#define ESTRPIPE 86 /* Streams pipe error */
|
||||||
|
#define EUSERS 87 /* Too many users */
|
||||||
|
#define ENOTSOCK 88 /* Socket operation on non-socket */
|
||||||
|
#define EDESTADDRREQ 89 /* Destination address required */
|
||||||
|
#define EMSGSIZE 90 /* Message too long */
|
||||||
|
#define EPROTOTYPE 91 /* Protocol wrong type for socket */
|
||||||
|
#define ENOPROTOOPT 92 /* Protocol not available */
|
||||||
|
#define EPROTONOSUPPORT 93 /* Protocol not supported */
|
||||||
|
#define ESOCKTNOSUPPORT 94 /* Socket type not supported */
|
||||||
|
#define EOPNOTSUPP 95 /* Operation not supported on transport endpoint */
|
||||||
|
#define EPFNOSUPPORT 96 /* Protocol family not supported */
|
||||||
|
#define EAFNOSUPPORT 97 /* Address family not supported by protocol */
|
||||||
|
#define EADDRINUSE 98 /* Address already in use */
|
||||||
|
#define EADDRNOTAVAIL 99 /* Cannot assign requested address */
|
||||||
|
#define ENETDOWN 100 /* Network is down */
|
||||||
|
#define ENETUNREACH 101 /* Network is unreachable */
|
||||||
|
#define ENETRESET 102 /* Network dropped connection because of reset */
|
||||||
|
#define ECONNABORTED 103 /* Software caused connection abort */
|
||||||
|
#define ECONNRESET 104 /* Connection reset by peer */
|
||||||
|
#define ENOBUFS 105 /* No buffer space available */
|
||||||
|
#define EISCONN 106 /* Transport endpoint is already connected */
|
||||||
|
#define ENOTCONN 107 /* Transport endpoint is not connected */
|
||||||
|
#define ESHUTDOWN 108 /* Cannot send after transport endpoint shutdown */
|
||||||
|
#define ETOOMANYREFS 109 /* Too many references: cannot splice */
|
||||||
|
#define ETIMEDOUT 110 /* Connection timed out */
|
||||||
|
#define ECONNREFUSED 111 /* Connection refused */
|
||||||
|
#define EHOSTDOWN 112 /* Host is down */
|
||||||
|
#define EHOSTUNREACH 113 /* No route to host */
|
||||||
|
#define EALREADY 114 /* Operation already in progress */
|
||||||
|
#define EINPROGRESS 115 /* Operation now in progress */
|
||||||
|
#define ESTALE 116 /* Stale NFS file handle */
|
||||||
|
#define EUCLEAN 117 /* Structure needs cleaning */
|
||||||
|
#define ENOTNAM 118 /* Not a XENIX named type file */
|
||||||
|
#define ENAVAIL 119 /* No XENIX semaphores available */
|
||||||
|
#define EISNAM 120 /* Is a named type file */
|
||||||
|
#define EREMOTEIO 121 /* Remote I/O error */
|
||||||
|
#define EDQUOT 122 /* Quota exceeded */
|
||||||
|
|
||||||
|
#define ENOMEDIUM 123 /* No medium found */
|
||||||
|
#define EMEDIUMTYPE 124 /* Wrong medium type */
|
||||||
|
|
||||||
|
|
||||||
|
#define ENSROK 0 /* DNS server returned answer with no data */
|
||||||
|
#define ENSRNODATA 160 /* DNS server returned answer with no data */
|
||||||
|
#define ENSRFORMERR 161 /* DNS server claims query was misformatted */
|
||||||
|
#define ENSRSERVFAIL 162 /* DNS server returned general failure */
|
||||||
|
#define ENSRNOTFOUND 163 /* Domain name not found */
|
||||||
|
#define ENSRNOTIMP 164 /* DNS server does not implement requested operation */
|
||||||
|
#define ENSRREFUSED 165 /* DNS server refused query */
|
||||||
|
#define ENSRBADQUERY 166 /* Misformatted DNS query */
|
||||||
|
#define ENSRBADNAME 167 /* Misformatted domain name */
|
||||||
|
#define ENSRBADFAMILY 168 /* Unsupported address family */
|
||||||
|
#define ENSRBADRESP 169 /* Misformatted DNS reply */
|
||||||
|
#define ENSRCONNREFUSED 170 /* Could not contact DNS servers */
|
||||||
|
#define ENSRTIMEOUT 171 /* Timeout while contacting DNS servers */
|
||||||
|
#define ENSROF 172 /* End of file */
|
||||||
|
#define ENSRFILE 173 /* Error reading file */
|
||||||
|
#define ENSRNOMEM 174 /* Out of memory */
|
||||||
|
#define ENSRDESTRUCTION 175 /* Application terminated lookup */
|
||||||
|
#define ENSRQUERYDOMAINTOOLONG 176 /* Domain name is too long */
|
||||||
|
#define ENSRCNAMELOOP 177 /* Domain name is too long */
|
||||||
|
|
||||||
|
#ifndef errno
|
||||||
|
extern int errno;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* LWIP_PROVIDE_ERRNO */
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* __LWIP_ARCH_H__ */
|
119
app/include/lwip/autoip.h
Normal file
119
app/include/lwip/autoip.h
Normal file
@ -0,0 +1,119 @@
|
|||||||
|
/**
|
||||||
|
* @file
|
||||||
|
*
|
||||||
|
* AutoIP Automatic LinkLocal IP Configuration
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
*
|
||||||
|
* Copyright (c) 2007 Dominik Spies <kontakt@dspies.de>
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* Author: Dominik Spies <kontakt@dspies.de>
|
||||||
|
*
|
||||||
|
* This is a AutoIP implementation for the lwIP TCP/IP stack. It aims to conform
|
||||||
|
* with RFC 3927.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* Please coordinate changes and requests with Dominik Spies
|
||||||
|
* <kontakt@dspies.de>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __LWIP_AUTOIP_H__
|
||||||
|
#define __LWIP_AUTOIP_H__
|
||||||
|
|
||||||
|
#include "lwip/opt.h"
|
||||||
|
|
||||||
|
#if LWIP_AUTOIP /* don't build if not configured for use in lwipopts.h */
|
||||||
|
|
||||||
|
#include "lwip/netif.h"
|
||||||
|
#include "lwip/udp.h"
|
||||||
|
#include "netif/etharp.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* AutoIP Timing */
|
||||||
|
#define AUTOIP_TMR_INTERVAL 100
|
||||||
|
#define AUTOIP_TICKS_PER_SECOND (1000 / AUTOIP_TMR_INTERVAL)
|
||||||
|
|
||||||
|
/* RFC 3927 Constants */
|
||||||
|
#define PROBE_WAIT 1 /* second (initial random delay) */
|
||||||
|
#define PROBE_MIN 1 /* second (minimum delay till repeated probe) */
|
||||||
|
#define PROBE_MAX 2 /* seconds (maximum delay till repeated probe) */
|
||||||
|
#define PROBE_NUM 3 /* (number of probe packets) */
|
||||||
|
#define ANNOUNCE_NUM 2 /* (number of announcement packets) */
|
||||||
|
#define ANNOUNCE_INTERVAL 2 /* seconds (time between announcement packets) */
|
||||||
|
#define ANNOUNCE_WAIT 2 /* seconds (delay before announcing) */
|
||||||
|
#define MAX_CONFLICTS 10 /* (max conflicts before rate limiting) */
|
||||||
|
#define RATE_LIMIT_INTERVAL 60 /* seconds (delay between successive attempts) */
|
||||||
|
#define DEFEND_INTERVAL 10 /* seconds (min. wait between defensive ARPs) */
|
||||||
|
|
||||||
|
/* AutoIP client states */
|
||||||
|
#define AUTOIP_STATE_OFF 0
|
||||||
|
#define AUTOIP_STATE_PROBING 1
|
||||||
|
#define AUTOIP_STATE_ANNOUNCING 2
|
||||||
|
#define AUTOIP_STATE_BOUND 3
|
||||||
|
|
||||||
|
struct autoip
|
||||||
|
{
|
||||||
|
ip_addr_t llipaddr; /* the currently selected, probed, announced or used LL IP-Address */
|
||||||
|
u8_t state; /* current AutoIP state machine state */
|
||||||
|
u8_t sent_num; /* sent number of probes or announces, dependent on state */
|
||||||
|
u16_t ttw; /* ticks to wait, tick is AUTOIP_TMR_INTERVAL long */
|
||||||
|
u8_t lastconflict; /* ticks until a conflict can be solved by defending */
|
||||||
|
u8_t tried_llipaddr; /* total number of probed/used Link Local IP-Addresses */
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/** Init srand, has to be called before entering mainloop */
|
||||||
|
void autoip_init(void);
|
||||||
|
|
||||||
|
/** Set a struct autoip allocated by the application to work with */
|
||||||
|
void autoip_set_struct(struct netif *netif, struct autoip *autoip);
|
||||||
|
|
||||||
|
/** Start AutoIP client */
|
||||||
|
err_t autoip_start(struct netif *netif);
|
||||||
|
|
||||||
|
/** Stop AutoIP client */
|
||||||
|
err_t autoip_stop(struct netif *netif);
|
||||||
|
|
||||||
|
/** Handles every incoming ARP Packet, called by etharp_arp_input */
|
||||||
|
void autoip_arp_reply(struct netif *netif, struct etharp_hdr *hdr);
|
||||||
|
|
||||||
|
/** Has to be called in loop every AUTOIP_TMR_INTERVAL milliseconds */
|
||||||
|
void autoip_tmr(void);
|
||||||
|
|
||||||
|
/** Handle a possible change in the network configuration */
|
||||||
|
void autoip_network_changed(struct netif *netif);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* LWIP_AUTOIP */
|
||||||
|
|
||||||
|
#endif /* __LWIP_AUTOIP_H__ */
|
98
app/include/lwip/debug.h
Normal file
98
app/include/lwip/debug.h
Normal file
@ -0,0 +1,98 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2001-2004 Swedish Institute of Computer Science.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* This file is part of the lwIP TCP/IP stack.
|
||||||
|
*
|
||||||
|
* Author: Adam Dunkels <adam@sics.se>
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#ifndef __LWIP_DEBUG_H__
|
||||||
|
#define __LWIP_DEBUG_H__
|
||||||
|
|
||||||
|
#include "lwip/arch.h"
|
||||||
|
|
||||||
|
/** lower two bits indicate debug level
|
||||||
|
* - 0 all
|
||||||
|
* - 1 warning
|
||||||
|
* - 2 serious
|
||||||
|
* - 3 severe
|
||||||
|
*/
|
||||||
|
#define LWIP_DBG_LEVEL_ALL 0x00
|
||||||
|
#define LWIP_DBG_LEVEL_OFF LWIP_DBG_LEVEL_ALL /* compatibility define only */
|
||||||
|
#define LWIP_DBG_LEVEL_WARNING 0x01 /* bad checksums, dropped packets, ... */
|
||||||
|
#define LWIP_DBG_LEVEL_SERIOUS 0x02 /* memory allocation failures, ... */
|
||||||
|
#define LWIP_DBG_LEVEL_SEVERE 0x03
|
||||||
|
#define LWIP_DBG_MASK_LEVEL 0x03
|
||||||
|
|
||||||
|
/** flag for LWIP_DEBUGF to enable that debug message */
|
||||||
|
#define LWIP_DBG_ON 0x80U
|
||||||
|
/** flag for LWIP_DEBUGF to disable that debug message */
|
||||||
|
#define LWIP_DBG_OFF 0x00U
|
||||||
|
|
||||||
|
/** flag for LWIP_DEBUGF indicating a tracing message (to follow program flow) */
|
||||||
|
#define LWIP_DBG_TRACE 0x40U
|
||||||
|
/** flag for LWIP_DEBUGF indicating a state debug message (to follow module states) */
|
||||||
|
#define LWIP_DBG_STATE 0x20U
|
||||||
|
/** flag for LWIP_DEBUGF indicating newly added code, not thoroughly tested yet */
|
||||||
|
#define LWIP_DBG_FRESH 0x10U
|
||||||
|
/** flag for LWIP_DEBUGF to halt after printing this debug message */
|
||||||
|
#define LWIP_DBG_HALT 0x08U
|
||||||
|
|
||||||
|
#ifndef LWIP_NOASSERT
|
||||||
|
#define LWIP_ASSERT(message, assertion) do { if(!(assertion)) \
|
||||||
|
LWIP_PLATFORM_ASSERT(message); } while(0)
|
||||||
|
#else /* LWIP_NOASSERT */
|
||||||
|
#define LWIP_ASSERT(message, assertion)
|
||||||
|
#endif /* LWIP_NOASSERT */
|
||||||
|
|
||||||
|
/** if "expression" isn't true, then print "message" and execute "handler" expression */
|
||||||
|
#ifndef LWIP_ERROR
|
||||||
|
#define LWIP_ERROR(message, expression, handler) do { if (!(expression)) { \
|
||||||
|
LWIP_PLATFORM_ASSERT(message); handler;}} while(0)
|
||||||
|
#endif /* LWIP_ERROR */
|
||||||
|
|
||||||
|
#ifdef LWIP_DEBUG
|
||||||
|
/** print debug message only if debug message type is enabled...
|
||||||
|
* AND is of correct type AND is at least LWIP_DBG_LEVEL
|
||||||
|
*/
|
||||||
|
#define LWIP_DEBUGF(debug, message) do { \
|
||||||
|
if ( \
|
||||||
|
((debug) & LWIP_DBG_ON) && \
|
||||||
|
((debug) & LWIP_DBG_TYPES_ON) && \
|
||||||
|
((s16_t)((debug) & LWIP_DBG_MASK_LEVEL) >= LWIP_DBG_MIN_LEVEL)) { \
|
||||||
|
LWIP_PLATFORM_DIAG(message); \
|
||||||
|
if ((debug) & LWIP_DBG_HALT) { \
|
||||||
|
while(1); \
|
||||||
|
} \
|
||||||
|
} \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
|
#else /* LWIP_DEBUG */
|
||||||
|
#define LWIP_DEBUGF(debug, message)
|
||||||
|
#endif /* LWIP_DEBUG */
|
||||||
|
|
||||||
|
#endif /* __LWIP_DEBUG_H__ */
|
||||||
|
|
127
app/include/lwip/def.h
Normal file
127
app/include/lwip/def.h
Normal file
@ -0,0 +1,127 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2001-2004 Swedish Institute of Computer Science.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* This file is part of the lwIP TCP/IP stack.
|
||||||
|
*
|
||||||
|
* Author: Adam Dunkels <adam@sics.se>
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#ifndef __LWIP_DEF_H__
|
||||||
|
#define __LWIP_DEF_H__
|
||||||
|
|
||||||
|
/* arch.h might define NULL already */
|
||||||
|
#include "lwip/arch.h"
|
||||||
|
#include "lwip/opt.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define LWIP_MAX(x , y) (((x) > (y)) ? (x) : (y))
|
||||||
|
#define LWIP_MIN(x , y) (((x) < (y)) ? (x) : (y))
|
||||||
|
|
||||||
|
#ifndef NULL
|
||||||
|
#define NULL ((void *)0)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/** Get the absolute difference between 2 u32_t values (correcting overflows)
|
||||||
|
* 'a' is expected to be 'higher' (without overflow) than 'b'. */
|
||||||
|
#define LWIP_U32_DIFF(a, b) (((a) >= (b)) ? ((a) - (b)) : (((a) + ((b) ^ 0xFFFFFFFF) + 1)))
|
||||||
|
|
||||||
|
/* Endianess-optimized shifting of two u8_t to create one u16_t */
|
||||||
|
#if BYTE_ORDER == LITTLE_ENDIAN
|
||||||
|
#define LWIP_MAKE_U16(a, b) ((a << 8) | b)
|
||||||
|
#else
|
||||||
|
#define LWIP_MAKE_U16(a, b) ((b << 8) | a)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef LWIP_PLATFORM_BYTESWAP
|
||||||
|
#define LWIP_PLATFORM_BYTESWAP 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef LWIP_PREFIX_BYTEORDER_FUNCS
|
||||||
|
/* workaround for naming collisions on some platforms */
|
||||||
|
|
||||||
|
#ifdef htons
|
||||||
|
#undef htons
|
||||||
|
#endif /* htons */
|
||||||
|
#ifdef htonl
|
||||||
|
#undef htonl
|
||||||
|
#endif /* htonl */
|
||||||
|
#ifdef ntohs
|
||||||
|
#undef ntohs
|
||||||
|
#endif /* ntohs */
|
||||||
|
#ifdef ntohl
|
||||||
|
#undef ntohl
|
||||||
|
#endif /* ntohl */
|
||||||
|
|
||||||
|
#define htons(x) lwip_htons(x)
|
||||||
|
#define ntohs(x) lwip_ntohs(x)
|
||||||
|
#define htonl(x) lwip_htonl(x)
|
||||||
|
#define ntohl(x) lwip_ntohl(x)
|
||||||
|
#endif /* LWIP_PREFIX_BYTEORDER_FUNCS */
|
||||||
|
|
||||||
|
#if BYTE_ORDER == BIG_ENDIAN
|
||||||
|
#define lwip_htons(x) (x)
|
||||||
|
#define lwip_ntohs(x) (x)
|
||||||
|
#define lwip_htonl(x) (x)
|
||||||
|
#define lwip_ntohl(x) (x)
|
||||||
|
#define PP_HTONS(x) (x)
|
||||||
|
#define PP_NTOHS(x) (x)
|
||||||
|
#define PP_HTONL(x) (x)
|
||||||
|
#define PP_NTOHL(x) (x)
|
||||||
|
#else /* BYTE_ORDER != BIG_ENDIAN */
|
||||||
|
#if LWIP_PLATFORM_BYTESWAP
|
||||||
|
#define lwip_htons(x) LWIP_PLATFORM_HTONS(x)
|
||||||
|
#define lwip_ntohs(x) LWIP_PLATFORM_HTONS(x)
|
||||||
|
#define lwip_htonl(x) LWIP_PLATFORM_HTONL(x)
|
||||||
|
#define lwip_ntohl(x) LWIP_PLATFORM_HTONL(x)
|
||||||
|
#else /* LWIP_PLATFORM_BYTESWAP */
|
||||||
|
u16_t lwip_htons(u16_t x);
|
||||||
|
u16_t lwip_ntohs(u16_t x);
|
||||||
|
u32_t lwip_htonl(u32_t x);
|
||||||
|
u32_t lwip_ntohl(u32_t x);
|
||||||
|
#endif /* LWIP_PLATFORM_BYTESWAP */
|
||||||
|
|
||||||
|
/* These macros should be calculated by the preprocessor and are used
|
||||||
|
with compile-time constants only (so that there is no little-endian
|
||||||
|
overhead at runtime). */
|
||||||
|
#define PP_HTONS(x) ((((x) & 0xff) << 8) | (((x) & 0xff00) >> 8))
|
||||||
|
#define PP_NTOHS(x) PP_HTONS(x)
|
||||||
|
#define PP_HTONL(x) ((((x) & 0xff) << 24) | \
|
||||||
|
(((x) & 0xff00) << 8) | \
|
||||||
|
(((x) & 0xff0000UL) >> 8) | \
|
||||||
|
(((x) & 0xff000000UL) >> 24))
|
||||||
|
#define PP_NTOHL(x) PP_HTONL(x)
|
||||||
|
|
||||||
|
#endif /* BYTE_ORDER == BIG_ENDIAN */
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* __LWIP_DEF_H__ */
|
||||||
|
|
243
app/include/lwip/dhcp.h
Normal file
243
app/include/lwip/dhcp.h
Normal file
@ -0,0 +1,243 @@
|
|||||||
|
/** @file
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __LWIP_DHCP_H__
|
||||||
|
#define __LWIP_DHCP_H__
|
||||||
|
|
||||||
|
#include "lwip/opt.h"
|
||||||
|
|
||||||
|
#if LWIP_DHCP /* don't build if not configured for use in lwipopts.h */
|
||||||
|
|
||||||
|
#include "lwip/netif.h"
|
||||||
|
#include "lwip/udp.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/** period (in seconds) of the application calling dhcp_coarse_tmr() */
|
||||||
|
#define DHCP_COARSE_TIMER_SECS 60
|
||||||
|
/** period (in milliseconds) of the application calling dhcp_coarse_tmr() */
|
||||||
|
#define DHCP_COARSE_TIMER_MSECS (DHCP_COARSE_TIMER_SECS * 1000UL)
|
||||||
|
/** period (in milliseconds) of the application calling dhcp_fine_tmr() */
|
||||||
|
#define DHCP_FINE_TIMER_MSECS 500
|
||||||
|
|
||||||
|
#define DHCP_CHADDR_LEN 16U
|
||||||
|
#define DHCP_SNAME_LEN 64U
|
||||||
|
#define DHCP_FILE_LEN 128U
|
||||||
|
|
||||||
|
struct dhcp
|
||||||
|
{
|
||||||
|
/** transaction identifier of last sent request */
|
||||||
|
u32_t xid;
|
||||||
|
/** our connection to the DHCP server */
|
||||||
|
struct udp_pcb *pcb;
|
||||||
|
/** incoming msg */
|
||||||
|
struct dhcp_msg *msg_in;
|
||||||
|
/** current DHCP state machine state */
|
||||||
|
u8_t state;
|
||||||
|
/** retries of current request */
|
||||||
|
u8_t tries;
|
||||||
|
#if LWIP_DHCP_AUTOIP_COOP
|
||||||
|
u8_t autoip_coop_state;
|
||||||
|
#endif
|
||||||
|
u8_t subnet_mask_given;
|
||||||
|
|
||||||
|
struct pbuf *p_out; /* pbuf of outcoming msg */
|
||||||
|
struct dhcp_msg *msg_out; /* outgoing msg */
|
||||||
|
u16_t options_out_len; /* outgoing msg options length */
|
||||||
|
u16_t request_timeout; /* #ticks with period DHCP_FINE_TIMER_SECS for request timeout */
|
||||||
|
u16_t t1_timeout; /* #ticks with period DHCP_COARSE_TIMER_SECS for renewal time */
|
||||||
|
u16_t t2_timeout; /* #ticks with period DHCP_COARSE_TIMER_SECS for rebind time */
|
||||||
|
ip_addr_t server_ip_addr; /* dhcp server address that offered this lease */
|
||||||
|
ip_addr_t offered_ip_addr;
|
||||||
|
ip_addr_t offered_sn_mask;
|
||||||
|
ip_addr_t offered_gw_addr;
|
||||||
|
|
||||||
|
u32_t offered_t0_lease; /* lease period (in seconds) */
|
||||||
|
u32_t offered_t1_renew; /* recommended renew time (usually 50% of lease period) */
|
||||||
|
u32_t offered_t2_rebind; /* recommended rebind time (usually 66% of lease period) */
|
||||||
|
/* @todo: LWIP_DHCP_BOOTP_FILE configuration option?
|
||||||
|
integrate with possible TFTP-client for booting? */
|
||||||
|
#define LWIP_DHCP_BOOTP_FILE 0
|
||||||
|
#if LWIP_DHCP_BOOTP_FILE
|
||||||
|
ip_addr_t offered_si_addr;
|
||||||
|
char boot_file_name[DHCP_FILE_LEN];
|
||||||
|
#endif /* LWIP_DHCP_BOOTPFILE */
|
||||||
|
};
|
||||||
|
|
||||||
|
/* MUST be compiled with "pack structs" or equivalent! */
|
||||||
|
#ifdef PACK_STRUCT_USE_INCLUDES
|
||||||
|
# include "arch/bpstruct.h"
|
||||||
|
#endif
|
||||||
|
PACK_STRUCT_BEGIN
|
||||||
|
/** minimum set of fields of any DHCP message */
|
||||||
|
struct dhcp_msg
|
||||||
|
{
|
||||||
|
PACK_STRUCT_FIELD(u8_t op);
|
||||||
|
PACK_STRUCT_FIELD(u8_t htype);
|
||||||
|
PACK_STRUCT_FIELD(u8_t hlen);
|
||||||
|
PACK_STRUCT_FIELD(u8_t hops);
|
||||||
|
PACK_STRUCT_FIELD(u32_t xid);
|
||||||
|
PACK_STRUCT_FIELD(u16_t secs);
|
||||||
|
PACK_STRUCT_FIELD(u16_t flags);
|
||||||
|
PACK_STRUCT_FIELD(ip_addr_p_t ciaddr);
|
||||||
|
PACK_STRUCT_FIELD(ip_addr_p_t yiaddr);
|
||||||
|
PACK_STRUCT_FIELD(ip_addr_p_t siaddr);
|
||||||
|
PACK_STRUCT_FIELD(ip_addr_p_t giaddr);
|
||||||
|
PACK_STRUCT_FIELD(u8_t chaddr[DHCP_CHADDR_LEN]);
|
||||||
|
PACK_STRUCT_FIELD(u8_t sname[DHCP_SNAME_LEN]);
|
||||||
|
PACK_STRUCT_FIELD(u8_t file[DHCP_FILE_LEN]);
|
||||||
|
PACK_STRUCT_FIELD(u32_t cookie);
|
||||||
|
#define DHCP_MIN_OPTIONS_LEN 68U
|
||||||
|
/** make sure user does not configure this too small */
|
||||||
|
#if ((defined(DHCP_OPTIONS_LEN)) && (DHCP_OPTIONS_LEN < DHCP_MIN_OPTIONS_LEN))
|
||||||
|
# undef DHCP_OPTIONS_LEN
|
||||||
|
#endif
|
||||||
|
/** allow this to be configured in lwipopts.h, but not too small */
|
||||||
|
#if (!defined(DHCP_OPTIONS_LEN))
|
||||||
|
/** set this to be sufficient for your options in outgoing DHCP msgs */
|
||||||
|
# define DHCP_OPTIONS_LEN DHCP_MIN_OPTIONS_LEN
|
||||||
|
#endif
|
||||||
|
PACK_STRUCT_FIELD(u8_t options[DHCP_OPTIONS_LEN]);
|
||||||
|
} PACK_STRUCT_STRUCT;
|
||||||
|
PACK_STRUCT_END
|
||||||
|
#ifdef PACK_STRUCT_USE_INCLUDES
|
||||||
|
# include "arch/epstruct.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void dhcp_set_struct(struct netif *netif, struct dhcp *dhcp);
|
||||||
|
/** Remove a struct dhcp previously set to the netif using dhcp_set_struct() */
|
||||||
|
#define dhcp_remove_struct(netif) do { (netif)->dhcp = NULL; } while(0)
|
||||||
|
void dhcp_cleanup(struct netif *netif);
|
||||||
|
/** start DHCP configuration */
|
||||||
|
err_t dhcp_start(struct netif *netif);
|
||||||
|
/** enforce early lease renewal (not needed normally)*/
|
||||||
|
err_t dhcp_renew(struct netif *netif);
|
||||||
|
/** release the DHCP lease, usually called before dhcp_stop()*/
|
||||||
|
err_t dhcp_release(struct netif *netif);
|
||||||
|
/** stop DHCP configuration */
|
||||||
|
void dhcp_stop(struct netif *netif);
|
||||||
|
/** inform server of our manual IP address */
|
||||||
|
void dhcp_inform(struct netif *netif);
|
||||||
|
/** Handle a possible change in the network configuration */
|
||||||
|
void dhcp_network_changed(struct netif *netif);
|
||||||
|
|
||||||
|
/** if enabled, check whether the offered IP address is not in use, using ARP */
|
||||||
|
#if DHCP_DOES_ARP_CHECK
|
||||||
|
void dhcp_arp_reply(struct netif *netif, ip_addr_t *addr);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/** to be called every minute */
|
||||||
|
void dhcp_coarse_tmr(void);
|
||||||
|
/** to be called every half second */
|
||||||
|
void dhcp_fine_tmr(void);
|
||||||
|
|
||||||
|
/** DHCP message item offsets and length */
|
||||||
|
#define DHCP_OP_OFS 0
|
||||||
|
#define DHCP_HTYPE_OFS 1
|
||||||
|
#define DHCP_HLEN_OFS 2
|
||||||
|
#define DHCP_HOPS_OFS 3
|
||||||
|
#define DHCP_XID_OFS 4
|
||||||
|
#define DHCP_SECS_OFS 8
|
||||||
|
#define DHCP_FLAGS_OFS 10
|
||||||
|
#define DHCP_CIADDR_OFS 12
|
||||||
|
#define DHCP_YIADDR_OFS 16
|
||||||
|
#define DHCP_SIADDR_OFS 20
|
||||||
|
#define DHCP_GIADDR_OFS 24
|
||||||
|
#define DHCP_CHADDR_OFS 28
|
||||||
|
#define DHCP_SNAME_OFS 44
|
||||||
|
#define DHCP_FILE_OFS 108
|
||||||
|
#define DHCP_MSG_LEN 236
|
||||||
|
|
||||||
|
#define DHCP_COOKIE_OFS DHCP_MSG_LEN
|
||||||
|
#define DHCP_OPTIONS_OFS (DHCP_MSG_LEN + 4)
|
||||||
|
|
||||||
|
#define DHCP_CLIENT_PORT 68
|
||||||
|
#define DHCP_SERVER_PORT 67
|
||||||
|
|
||||||
|
/** DHCP client states */
|
||||||
|
#define DHCP_OFF 0
|
||||||
|
#define DHCP_REQUESTING 1
|
||||||
|
#define DHCP_INIT 2
|
||||||
|
#define DHCP_REBOOTING 3
|
||||||
|
#define DHCP_REBINDING 4
|
||||||
|
#define DHCP_RENEWING 5
|
||||||
|
#define DHCP_SELECTING 6
|
||||||
|
#define DHCP_INFORMING 7
|
||||||
|
#define DHCP_CHECKING 8
|
||||||
|
#define DHCP_PERMANENT 9
|
||||||
|
#define DHCP_BOUND 10
|
||||||
|
/** not yet implemented #define DHCP_RELEASING 11 */
|
||||||
|
#define DHCP_BACKING_OFF 12
|
||||||
|
|
||||||
|
/** AUTOIP cooperatation flags */
|
||||||
|
#define DHCP_AUTOIP_COOP_STATE_OFF 0
|
||||||
|
#define DHCP_AUTOIP_COOP_STATE_ON 1
|
||||||
|
|
||||||
|
#define DHCP_BOOTREQUEST 1
|
||||||
|
#define DHCP_BOOTREPLY 2
|
||||||
|
|
||||||
|
/** DHCP message types */
|
||||||
|
#define DHCP_DISCOVER 1
|
||||||
|
#define DHCP_OFFER 2
|
||||||
|
#define DHCP_REQUEST 3
|
||||||
|
#define DHCP_DECLINE 4
|
||||||
|
#define DHCP_ACK 5
|
||||||
|
#define DHCP_NAK 6
|
||||||
|
#define DHCP_RELEASE 7
|
||||||
|
#define DHCP_INFORM 8
|
||||||
|
|
||||||
|
/** DHCP hardware type, currently only ethernet is supported */
|
||||||
|
#define DHCP_HTYPE_ETH 1
|
||||||
|
|
||||||
|
#define DHCP_MAGIC_COOKIE 0x63825363UL
|
||||||
|
|
||||||
|
/* This is a list of options for BOOTP and DHCP, see RFC 2132 for descriptions */
|
||||||
|
|
||||||
|
/** BootP options */
|
||||||
|
#define DHCP_OPTION_PAD 0
|
||||||
|
#define DHCP_OPTION_SUBNET_MASK 1 /* RFC 2132 3.3 */
|
||||||
|
#define DHCP_OPTION_ROUTER 3
|
||||||
|
#define DHCP_OPTION_DNS_SERVER 6
|
||||||
|
#define DHCP_OPTION_HOSTNAME 12
|
||||||
|
#define DHCP_OPTION_IP_TTL 23
|
||||||
|
#define DHCP_OPTION_MTU 26
|
||||||
|
#define DHCP_OPTION_BROADCAST 28
|
||||||
|
#define DHCP_OPTION_TCP_TTL 37
|
||||||
|
#define DHCP_OPTION_END 255
|
||||||
|
|
||||||
|
/** DHCP options */
|
||||||
|
#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_OVERLOAD 52 /* RFC2132 9.3, use file and/or sname field for options */
|
||||||
|
|
||||||
|
#define DHCP_OPTION_MESSAGE_TYPE 53 /* RFC 2132 9.6, important for DHCP */
|
||||||
|
#define DHCP_OPTION_MESSAGE_TYPE_LEN 1
|
||||||
|
|
||||||
|
#define DHCP_OPTION_SERVER_ID 54 /* RFC 2132 9.7, server IP address */
|
||||||
|
#define DHCP_OPTION_PARAMETER_REQUEST_LIST 55 /* RFC 2132 9.8, requested option types */
|
||||||
|
|
||||||
|
#define DHCP_OPTION_MAX_MSG_SIZE 57 /* RFC 2132 9.10, message size accepted >= 576 */
|
||||||
|
#define DHCP_OPTION_MAX_MSG_SIZE_LEN 2
|
||||||
|
|
||||||
|
#define DHCP_OPTION_T1 58 /* T1 renewal time */
|
||||||
|
#define DHCP_OPTION_T2 59 /* T2 rebinding time */
|
||||||
|
#define DHCP_OPTION_US 60
|
||||||
|
#define DHCP_OPTION_CLIENT_ID 61
|
||||||
|
#define DHCP_OPTION_TFTP_SERVERNAME 66
|
||||||
|
#define DHCP_OPTION_BOOTFILE 67
|
||||||
|
|
||||||
|
/** possible combinations of overloading the file and sname fields with options */
|
||||||
|
#define DHCP_OVERLOAD_NONE 0
|
||||||
|
#define DHCP_OVERLOAD_FILE 1
|
||||||
|
#define DHCP_OVERLOAD_SNAME 2
|
||||||
|
#define DHCP_OVERLOAD_SNAME_FILE 3
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* LWIP_DHCP */
|
||||||
|
|
||||||
|
#endif /*__LWIP_DHCP_H__*/
|
124
app/include/lwip/dns.h
Normal file
124
app/include/lwip/dns.h
Normal file
@ -0,0 +1,124 @@
|
|||||||
|
/**
|
||||||
|
* lwip DNS resolver header file.
|
||||||
|
|
||||||
|
* Author: Jim Pettinato
|
||||||
|
* April 2007
|
||||||
|
|
||||||
|
* 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_DNS /* don't build if not configured for use in lwipopts.h */
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/** DNS timer period */
|
||||||
|
#define DNS_TMR_INTERVAL 1000
|
||||||
|
|
||||||
|
/** 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 */
|
||||||
|
|
||||||
|
/** 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 */
|
||||||
|
|
||||||
|
/* The size used for the next line is rather a hack, but it prevents including socket.h in all files
|
||||||
|
that include memp.h, and that would possibly break portability (since socket.h defines some types
|
||||||
|
and constants possibly already define by the OS).
|
||||||
|
Calculation rule:
|
||||||
|
sizeof(struct addrinfo) + sizeof(struct sockaddr_in) + DNS_MAX_NAME_LENGTH + 1 byte zero-termination */
|
||||||
|
#define NETDB_ELEM_SIZE (32 + 16 + DNS_MAX_NAME_LENGTH + 1)
|
||||||
|
|
||||||
|
#if DNS_LOCAL_HOSTLIST
|
||||||
|
/** struct used for local host-list */
|
||||||
|
struct local_hostlist_entry {
|
||||||
|
/** static hostname */
|
||||||
|
const char *name;
|
||||||
|
/** static host address in network byteorder */
|
||||||
|
ip_addr_t addr;
|
||||||
|
struct local_hostlist_entry *next;
|
||||||
|
};
|
||||||
|
#if DNS_LOCAL_HOSTLIST_IS_DYNAMIC
|
||||||
|
#ifndef DNS_LOCAL_HOSTLIST_MAX_NAMELEN
|
||||||
|
#define DNS_LOCAL_HOSTLIST_MAX_NAMELEN DNS_MAX_NAME_LENGTH
|
||||||
|
#endif
|
||||||
|
#define LOCALHOSTLIST_ELEM_SIZE ((sizeof(struct local_hostlist_entry) + DNS_LOCAL_HOSTLIST_MAX_NAMELEN + 1))
|
||||||
|
#endif /* DNS_LOCAL_HOSTLIST_IS_DYNAMIC */
|
||||||
|
#endif /* DNS_LOCAL_HOSTLIST */
|
||||||
|
|
||||||
|
/** 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 an ip_addr_t 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
|
||||||
|
*/
|
||||||
|
typedef void (*dns_found_callback)(const char *name, ip_addr_t *ipaddr, void *callback_arg);
|
||||||
|
|
||||||
|
void dns_init(void);
|
||||||
|
void dns_tmr(void);
|
||||||
|
void dns_setserver(u8_t numdns, ip_addr_t *dnsserver);
|
||||||
|
ip_addr_t dns_getserver(u8_t numdns);
|
||||||
|
err_t dns_gethostbyname(const char *hostname, ip_addr_t *addr,
|
||||||
|
dns_found_callback found, void *callback_arg);
|
||||||
|
|
||||||
|
#if DNS_LOCAL_HOSTLIST && DNS_LOCAL_HOSTLIST_IS_DYNAMIC
|
||||||
|
int dns_local_removehost(const char *hostname, const ip_addr_t *addr);
|
||||||
|
err_t dns_local_addhost(const char *hostname, const ip_addr_t *addr);
|
||||||
|
#endif /* DNS_LOCAL_HOSTLIST && DNS_LOCAL_HOSTLIST_IS_DYNAMIC */
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* LWIP_DNS */
|
||||||
|
|
||||||
|
#endif /* __LWIP_DNS_H__ */
|
86
app/include/lwip/err.h
Normal file
86
app/include/lwip/err.h
Normal file
@ -0,0 +1,86 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2001-2004 Swedish Institute of Computer Science.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* This file is part of the lwIP TCP/IP stack.
|
||||||
|
*
|
||||||
|
* Author: Adam Dunkels <adam@sics.se>
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#ifndef __LWIP_ERR_H__
|
||||||
|
#define __LWIP_ERR_H__
|
||||||
|
|
||||||
|
#include "lwip/opt.h"
|
||||||
|
#include "lwip/arch.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/** Define LWIP_ERR_T in cc.h if you want to use
|
||||||
|
* a different type for your platform (must be signed). */
|
||||||
|
#ifdef LWIP_ERR_T
|
||||||
|
typedef LWIP_ERR_T err_t;
|
||||||
|
#else /* LWIP_ERR_T */
|
||||||
|
typedef s8_t err_t;
|
||||||
|
#endif /* LWIP_ERR_T*/
|
||||||
|
|
||||||
|
/* Definitions for error constants. */
|
||||||
|
|
||||||
|
#define ERR_OK 0 /* No error, everything OK. */
|
||||||
|
#define ERR_MEM -1 /* Out of memory error. */
|
||||||
|
#define ERR_BUF -2 /* Buffer error. */
|
||||||
|
#define ERR_TIMEOUT -3 /* Timeout. */
|
||||||
|
#define ERR_RTE -4 /* Routing problem. */
|
||||||
|
#define ERR_INPROGRESS -5 /* Operation in progress */
|
||||||
|
#define ERR_VAL -6 /* Illegal value. */
|
||||||
|
#define ERR_WOULDBLOCK -7 /* Operation would block. */
|
||||||
|
|
||||||
|
#define ERR_IS_FATAL(e) ((e) < ERR_WOULDBLOCK)
|
||||||
|
|
||||||
|
#define ERR_ABRT -8 /* Connection aborted. */
|
||||||
|
#define ERR_RST -9 /* Connection reset. */
|
||||||
|
#define ERR_CLSD -10 /* Connection closed. */
|
||||||
|
#define ERR_CONN -11 /* Not connected. */
|
||||||
|
|
||||||
|
#define ERR_ARG -12 /* Illegal argument. */
|
||||||
|
|
||||||
|
#define ERR_USE -13 /* Address in use. */
|
||||||
|
|
||||||
|
#define ERR_IF -14 /* Low-level netif error */
|
||||||
|
#define ERR_ISCONN -15 /* Already connected. */
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef LWIP_DEBUG
|
||||||
|
extern const char *lwip_strerr(err_t err)ICACHE_FLASH_ATTR;
|
||||||
|
#else
|
||||||
|
#define lwip_strerr(x) ""
|
||||||
|
#endif /* LWIP_DEBUG */
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* __LWIP_ERR_H__ */
|
115
app/include/lwip/icmp.h
Normal file
115
app/include/lwip/icmp.h
Normal file
@ -0,0 +1,115 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2001-2004 Swedish Institute of Computer Science.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* This file is part of the lwIP TCP/IP stack.
|
||||||
|
*
|
||||||
|
* Author: Adam Dunkels <adam@sics.se>
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#ifndef __LWIP_ICMP_H__
|
||||||
|
#define __LWIP_ICMP_H__
|
||||||
|
|
||||||
|
#include "lwip/opt.h"
|
||||||
|
#include "lwip/pbuf.h"
|
||||||
|
#include "lwip/ip_addr.h"
|
||||||
|
#include "lwip/netif.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define ICMP_ER 0 /* echo reply */
|
||||||
|
#define ICMP_DUR 3 /* destination unreachable */
|
||||||
|
#define ICMP_SQ 4 /* source quench */
|
||||||
|
#define ICMP_RD 5 /* redirect */
|
||||||
|
#define ICMP_ECHO 8 /* echo */
|
||||||
|
#define ICMP_TE 11 /* time exceeded */
|
||||||
|
#define ICMP_PP 12 /* parameter problem */
|
||||||
|
#define ICMP_TS 13 /* timestamp */
|
||||||
|
#define ICMP_TSR 14 /* timestamp reply */
|
||||||
|
#define ICMP_IRQ 15 /* information request */
|
||||||
|
#define ICMP_IR 16 /* information reply */
|
||||||
|
|
||||||
|
enum icmp_dur_type {
|
||||||
|
ICMP_DUR_NET = 0, /* net unreachable */
|
||||||
|
ICMP_DUR_HOST = 1, /* host unreachable */
|
||||||
|
ICMP_DUR_PROTO = 2, /* protocol unreachable */
|
||||||
|
ICMP_DUR_PORT = 3, /* port unreachable */
|
||||||
|
ICMP_DUR_FRAG = 4, /* fragmentation needed and DF set */
|
||||||
|
ICMP_DUR_SR = 5 /* source route failed */
|
||||||
|
};
|
||||||
|
|
||||||
|
enum icmp_te_type {
|
||||||
|
ICMP_TE_TTL = 0, /* time to live exceeded in transit */
|
||||||
|
ICMP_TE_FRAG = 1 /* fragment reassembly time exceeded */
|
||||||
|
};
|
||||||
|
|
||||||
|
#ifdef PACK_STRUCT_USE_INCLUDES
|
||||||
|
# include "arch/bpstruct.h"
|
||||||
|
#endif
|
||||||
|
/** This is the standard ICMP header only that the u32_t data
|
||||||
|
* is splitted to two u16_t like ICMP echo needs it.
|
||||||
|
* This header is also used for other ICMP types that do not
|
||||||
|
* use the data part.
|
||||||
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ICMP<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ײ<EFBFBD><EFBFBD>ṹ<EFBFBD><EFBFBD>
|
||||||
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ICMP<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ײ<EFBFBD><EFBFBD>кܴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԣ<EFBFBD>
|
||||||
|
* <EFBFBD>ýṹͬ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ICMP<EFBFBD><EFBFBD><EFBFBD>ġ<EFBFBD>
|
||||||
|
*/
|
||||||
|
PACK_STRUCT_BEGIN
|
||||||
|
struct icmp_echo_hdr {
|
||||||
|
PACK_STRUCT_FIELD(u8_t type);
|
||||||
|
PACK_STRUCT_FIELD(u8_t code);
|
||||||
|
PACK_STRUCT_FIELD(u16_t chksum);
|
||||||
|
PACK_STRUCT_FIELD(u16_t id);
|
||||||
|
PACK_STRUCT_FIELD(u16_t seqno);
|
||||||
|
} PACK_STRUCT_STRUCT;
|
||||||
|
PACK_STRUCT_END
|
||||||
|
#ifdef PACK_STRUCT_USE_INCLUDES
|
||||||
|
# include "arch/epstruct.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//<2F><>ȡICMP<4D>ײ<EFBFBD><D7B2><EFBFBD><EFBFBD>ֶ<EFBFBD>
|
||||||
|
#define ICMPH_TYPE(hdr) ((hdr)->type)
|
||||||
|
#define ICMPH_CODE(hdr) ((hdr)->code)
|
||||||
|
|
||||||
|
/** Combines type and code to an u16_t <20><>ICMP<4D><50><EFBFBD><EFBFBD><EFBFBD>ײ<EFBFBD><D7B2>ֶ<EFBFBD><D6B6><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD>Ӧֵ*/
|
||||||
|
#define ICMPH_TYPE_SET(hdr, t) ((hdr)->type = (t))
|
||||||
|
#define ICMPH_CODE_SET(hdr, c) ((hdr)->code = (c))
|
||||||
|
|
||||||
|
|
||||||
|
#if LWIP_ICMP /* don't build if not configured for use in lwipopts.h */
|
||||||
|
|
||||||
|
void icmp_input(struct pbuf *p, struct netif *inp)ICACHE_FLASH_ATTR;
|
||||||
|
void icmp_dest_unreach(struct pbuf *p, enum icmp_dur_type t)ICACHE_FLASH_ATTR;
|
||||||
|
void icmp_time_exceeded(struct pbuf *p, enum icmp_te_type t)ICACHE_FLASH_ATTR;
|
||||||
|
|
||||||
|
#endif /* LWIP_ICMP */
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* __LWIP_ICMP_H__ */
|
106
app/include/lwip/igmp.h
Normal file
106
app/include/lwip/igmp.h
Normal file
@ -0,0 +1,106 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2002 CITEL Technologies Ltd.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* 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. Neither the name of CITEL Technologies Ltd nor the names of its contributors
|
||||||
|
* may be used to endorse or promote products derived from this software
|
||||||
|
* without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY CITEL TECHNOLOGIES AND CONTRIBUTORS ``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 CITEL TECHNOLOGIES OR CONTRIBUTORS 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.
|
||||||
|
*
|
||||||
|
* This file is a contribution to the lwIP TCP/IP stack.
|
||||||
|
* The Swedish Institute of Computer Science and Adam Dunkels
|
||||||
|
* are specifically granted permission to redistribute this
|
||||||
|
* source code.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __LWIP_IGMP_H__
|
||||||
|
#define __LWIP_IGMP_H__
|
||||||
|
|
||||||
|
#include "lwip/opt.h"
|
||||||
|
#include "lwip/ip_addr.h"
|
||||||
|
#include "lwip/netif.h"
|
||||||
|
#include "lwip/pbuf.h"
|
||||||
|
|
||||||
|
#if LWIP_IGMP /* don't build if not configured for use in lwipopts.h */
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* IGMP timer */
|
||||||
|
#define IGMP_TMR_INTERVAL 100 /* Milliseconds */
|
||||||
|
#define IGMP_V1_DELAYING_MEMBER_TMR (1000/IGMP_TMR_INTERVAL)
|
||||||
|
#define IGMP_JOIN_DELAYING_MEMBER_TMR (500 /IGMP_TMR_INTERVAL)
|
||||||
|
|
||||||
|
/* MAC Filter Actions, these are passed to a netif's
|
||||||
|
* igmp_mac_filter callback function. */
|
||||||
|
#define IGMP_DEL_MAC_FILTER 0
|
||||||
|
#define IGMP_ADD_MAC_FILTER 1
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* igmp group structure - there is
|
||||||
|
* a list of groups for each interface
|
||||||
|
* these should really be linked from the interface, but
|
||||||
|
* if we keep them separate we will not affect the lwip original code
|
||||||
|
* too much
|
||||||
|
*
|
||||||
|
* There will be a group for the all systems group address but this
|
||||||
|
* will not run the state machine as it is used to kick off reports
|
||||||
|
* from all the other groups
|
||||||
|
*/
|
||||||
|
struct igmp_group {
|
||||||
|
/** next link */
|
||||||
|
struct igmp_group *next;
|
||||||
|
/** interface on which the group is active */
|
||||||
|
struct netif *netif;
|
||||||
|
/** multicast address */
|
||||||
|
ip_addr_t group_address;
|
||||||
|
/** signifies we were the last person to report */
|
||||||
|
u8_t last_reporter_flag;
|
||||||
|
/** current state of the group */
|
||||||
|
u8_t group_state;
|
||||||
|
/** timer for reporting, negative is OFF */
|
||||||
|
u16_t timer;
|
||||||
|
/** counter of simultaneous uses */
|
||||||
|
u8_t use;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Prototypes */
|
||||||
|
void igmp_init(void)ICACHE_FLASH_ATTR;
|
||||||
|
err_t igmp_start(struct netif *netif)ICACHE_FLASH_ATTR;
|
||||||
|
err_t igmp_stop(struct netif *netif)ICACHE_FLASH_ATTR;
|
||||||
|
void igmp_report_groups(struct netif *netif)ICACHE_FLASH_ATTR;
|
||||||
|
struct igmp_group *igmp_lookfor_group(struct netif *ifp, ip_addr_t *addr)ICACHE_FLASH_ATTR;
|
||||||
|
void igmp_input(struct pbuf *p, struct netif *inp, ip_addr_t *dest)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;
|
||||||
|
void igmp_tmr(void)ICACHE_FLASH_ATTR;
|
||||||
|
#define LWIP_RAND() rand()
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* LWIP_IGMP */
|
||||||
|
|
||||||
|
#endif /* __LWIP_IGMP_H__ */
|
107
app/include/lwip/inet.h
Normal file
107
app/include/lwip/inet.h
Normal file
@ -0,0 +1,107 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2001-2004 Swedish Institute of Computer Science.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* This file is part of the lwIP TCP/IP stack.
|
||||||
|
*
|
||||||
|
* Author: Adam Dunkels <adam@sics.se>
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#ifndef __LWIP_INET_H__
|
||||||
|
#define __LWIP_INET_H__
|
||||||
|
|
||||||
|
#include "lwip/opt.h"
|
||||||
|
#include "lwip/def.h"
|
||||||
|
#include "lwip/ip_addr.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/** For compatibility with BSD code */
|
||||||
|
struct in_addr {
|
||||||
|
u32_t s_addr;
|
||||||
|
};
|
||||||
|
|
||||||
|
/** 255.255.255.255 */
|
||||||
|
#define INADDR_NONE IPADDR_NONE
|
||||||
|
/** 127.0.0.1 */
|
||||||
|
#define INADDR_LOOPBACK IPADDR_LOOPBACK
|
||||||
|
/** 0.0.0.0 */
|
||||||
|
#define INADDR_ANY IPADDR_ANY
|
||||||
|
/** 255.255.255.255 */
|
||||||
|
#define INADDR_BROADCAST IPADDR_BROADCAST
|
||||||
|
|
||||||
|
/* Definitions of the bits in an Internet address integer.
|
||||||
|
|
||||||
|
On subnets, host and network parts are found according to
|
||||||
|
the subnet mask, not these masks. */
|
||||||
|
#define IN_CLASSA(a) IP_CLASSA(a)
|
||||||
|
#define IN_CLASSA_NET IP_CLASSA_NET
|
||||||
|
#define IN_CLASSA_NSHIFT IP_CLASSA_NSHIFT
|
||||||
|
#define IN_CLASSA_HOST IP_CLASSA_HOST
|
||||||
|
#define IN_CLASSA_MAX IP_CLASSA_MAX
|
||||||
|
|
||||||
|
#define IN_CLASSB(b) IP_CLASSB(b)
|
||||||
|
#define IN_CLASSB_NET IP_CLASSB_NET
|
||||||
|
#define IN_CLASSB_NSHIFT IP_CLASSB_NSHIFT
|
||||||
|
#define IN_CLASSB_HOST IP_CLASSB_HOST
|
||||||
|
#define IN_CLASSB_MAX IP_CLASSB_MAX
|
||||||
|
|
||||||
|
#define IN_CLASSC(c) IP_CLASSC(c)
|
||||||
|
#define IN_CLASSC_NET IP_CLASSC_NET
|
||||||
|
#define IN_CLASSC_NSHIFT IP_CLASSC_NSHIFT
|
||||||
|
#define IN_CLASSC_HOST IP_CLASSC_HOST
|
||||||
|
#define IN_CLASSC_MAX IP_CLASSC_MAX
|
||||||
|
|
||||||
|
#define IN_CLASSD(d) IP_CLASSD(d)
|
||||||
|
#define IN_CLASSD_NET IP_CLASSD_NET /* These ones aren't really */
|
||||||
|
#define IN_CLASSD_NSHIFT IP_CLASSD_NSHIFT /* net and host fields, but */
|
||||||
|
#define IN_CLASSD_HOST IP_CLASSD_HOST /* routing needn't know. */
|
||||||
|
#define IN_CLASSD_MAX IP_CLASSD_MAX
|
||||||
|
|
||||||
|
#define IN_MULTICAST(a) IP_MULTICAST(a)
|
||||||
|
|
||||||
|
#define IN_EXPERIMENTAL(a) IP_EXPERIMENTAL(a)
|
||||||
|
#define IN_BADCLASS(a) IP_BADCLASS(a)
|
||||||
|
|
||||||
|
#define IN_LOOPBACKNET IP_LOOPBACKNET
|
||||||
|
|
||||||
|
#define inet_addr_from_ipaddr(target_inaddr, source_ipaddr) ((target_inaddr)->s_addr = ip4_addr_get_u32(source_ipaddr))
|
||||||
|
#define inet_addr_to_ipaddr(target_ipaddr, source_inaddr) (ip4_addr_set_u32(target_ipaddr, (source_inaddr)->s_addr))
|
||||||
|
/* ATTENTION: the next define only works because both s_addr and ip_addr_t are an u32_t effectively! */
|
||||||
|
#define inet_addr_to_ipaddr_p(target_ipaddr_p, source_inaddr) ((target_ipaddr_p) = (ip_addr_t*)&((source_inaddr)->s_addr))
|
||||||
|
|
||||||
|
/* directly map this to the lwip internal functions */
|
||||||
|
#define inet_addr(cp) ipaddr_addr(cp)
|
||||||
|
#define inet_aton(cp, addr) ipaddr_aton(cp, (ip_addr_t*)addr)
|
||||||
|
#define inet_ntoa(addr) ipaddr_ntoa((ip_addr_t*)&(addr))
|
||||||
|
#define inet_ntoa_r(addr, buf, buflen) ipaddr_ntoa_r((ip_addr_t*)&(addr), buf, buflen)
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* __LWIP_INET_H__ */
|
90
app/include/lwip/inet_chksum.h
Normal file
90
app/include/lwip/inet_chksum.h
Normal file
@ -0,0 +1,90 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2001-2004 Swedish Institute of Computer Science.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* This file is part of the lwIP TCP/IP stack.
|
||||||
|
*
|
||||||
|
* Author: Adam Dunkels <adam@sics.se>
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#ifndef __LWIP_INET_CHKSUM_H__
|
||||||
|
#define __LWIP_INET_CHKSUM_H__
|
||||||
|
|
||||||
|
#include "lwip/opt.h"
|
||||||
|
|
||||||
|
#include "lwip/pbuf.h"
|
||||||
|
#include "lwip/ip_addr.h"
|
||||||
|
|
||||||
|
/** Swap the bytes in an u16_t: much like htons() for little-endian */
|
||||||
|
#ifndef SWAP_BYTES_IN_WORD
|
||||||
|
#if LWIP_PLATFORM_BYTESWAP && (BYTE_ORDER == LITTLE_ENDIAN)
|
||||||
|
/* little endian and PLATFORM_BYTESWAP defined */
|
||||||
|
#define SWAP_BYTES_IN_WORD(w) LWIP_PLATFORM_HTONS(w)
|
||||||
|
#else /* LWIP_PLATFORM_BYTESWAP && (BYTE_ORDER == LITTLE_ENDIAN) */
|
||||||
|
/* can't use htons on big endian (or PLATFORM_BYTESWAP not defined)... */
|
||||||
|
#define SWAP_BYTES_IN_WORD(w) (((w) & 0xff) << 8) | (((w) & 0xff00) >> 8)
|
||||||
|
#endif /* LWIP_PLATFORM_BYTESWAP && (BYTE_ORDER == LITTLE_ENDIAN)*/
|
||||||
|
#endif /* SWAP_BYTES_IN_WORD */
|
||||||
|
|
||||||
|
/** Split an u32_t in two u16_ts and add them up */
|
||||||
|
#ifndef FOLD_U32T
|
||||||
|
#define FOLD_U32T(u) (((u) >> 16) + ((u) & 0x0000ffffUL))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if LWIP_CHECKSUM_ON_COPY
|
||||||
|
/** Function-like macro: same as MEMCPY but returns the checksum of copied data
|
||||||
|
as u16_t */
|
||||||
|
#ifndef LWIP_CHKSUM_COPY
|
||||||
|
#define LWIP_CHKSUM_COPY(dst, src, len) lwip_chksum_copy(dst, src, len)
|
||||||
|
#ifndef LWIP_CHKSUM_COPY_ALGORITHM
|
||||||
|
#define LWIP_CHKSUM_COPY_ALGORITHM 1
|
||||||
|
#endif /* LWIP_CHKSUM_COPY_ALGORITHM */
|
||||||
|
#endif /* LWIP_CHKSUM_COPY */
|
||||||
|
#else /* LWIP_CHECKSUM_ON_COPY */
|
||||||
|
#define LWIP_CHKSUM_COPY_ALGORITHM 0
|
||||||
|
#endif /* LWIP_CHECKSUM_ON_COPY */
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
u16_t inet_chksum(void *dataptr, u16_t len)ICACHE_FLASH_ATTR;
|
||||||
|
u16_t inet_chksum_pbuf(struct pbuf *p)ICACHE_FLASH_ATTR;
|
||||||
|
u16_t inet_chksum_pseudo(struct pbuf *p,
|
||||||
|
ip_addr_t *src, ip_addr_t *dest,
|
||||||
|
u8_t proto, u16_t proto_len)ICACHE_FLASH_ATTR;
|
||||||
|
u16_t inet_chksum_pseudo_partial(struct pbuf *p,
|
||||||
|
ip_addr_t *src, ip_addr_t *dest,
|
||||||
|
u8_t proto, u16_t proto_len, u16_t chksum_len)ICACHE_FLASH_ATTR;
|
||||||
|
#if LWIP_CHKSUM_COPY_ALGORITHM
|
||||||
|
u16_t lwip_chksum_copy(void *dst, const void *src, u16_t len)ICACHE_FLASH_ATTR;
|
||||||
|
#endif /* LWIP_CHKSUM_COPY_ALGORITHM */
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* __LWIP_INET_H__ */
|
||||||
|
|
73
app/include/lwip/init.h
Normal file
73
app/include/lwip/init.h
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2001-2004 Swedish Institute of Computer Science.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* This file is part of the lwIP TCP/IP stack.
|
||||||
|
*
|
||||||
|
* Author: Adam Dunkels <adam@sics.se>
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#ifndef __LWIP_INIT_H__
|
||||||
|
#define __LWIP_INIT_H__
|
||||||
|
|
||||||
|
#include "lwip/opt.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/** X.x.x: Major version of the stack */
|
||||||
|
#define LWIP_VERSION_MAJOR 1U
|
||||||
|
/** x.X.x: Minor version of the stack */
|
||||||
|
#define LWIP_VERSION_MINOR 4U
|
||||||
|
/** x.x.X: Revision of the stack */
|
||||||
|
#define LWIP_VERSION_REVISION 0U
|
||||||
|
/** For release candidates, this is set to 1..254
|
||||||
|
* For official releases, this is set to 255 (LWIP_RC_RELEASE)
|
||||||
|
* For development versions (CVS), this is set to 0 (LWIP_RC_DEVELOPMENT) */
|
||||||
|
#define LWIP_VERSION_RC 2U
|
||||||
|
|
||||||
|
/** LWIP_VERSION_RC is set to LWIP_RC_RELEASE for official releases */
|
||||||
|
#define LWIP_RC_RELEASE 255U
|
||||||
|
/** LWIP_VERSION_RC is set to LWIP_RC_DEVELOPMENT for CVS versions */
|
||||||
|
#define LWIP_RC_DEVELOPMENT 0U
|
||||||
|
|
||||||
|
#define LWIP_VERSION_IS_RELEASE (LWIP_VERSION_RC == LWIP_RC_RELEASE)
|
||||||
|
#define LWIP_VERSION_IS_DEVELOPMENT (LWIP_VERSION_RC == LWIP_RC_DEVELOPMENT)
|
||||||
|
#define LWIP_VERSION_IS_RC ((LWIP_VERSION_RC != LWIP_RC_RELEASE) && (LWIP_VERSION_RC != LWIP_RC_DEVELOPMENT))
|
||||||
|
|
||||||
|
/** Provides the version of the stack */
|
||||||
|
#define LWIP_VERSION (LWIP_VERSION_MAJOR << 24 | LWIP_VERSION_MINOR << 16 | \
|
||||||
|
LWIP_VERSION_REVISION << 8 | LWIP_VERSION_RC)
|
||||||
|
|
||||||
|
/* Modules initialization */
|
||||||
|
void lwip_init(void) ICACHE_FLASH_ATTR;
|
||||||
|
//void lwip_init(void);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* __LWIP_INIT_H__ */
|
215
app/include/lwip/ip.h
Normal file
215
app/include/lwip/ip.h
Normal file
@ -0,0 +1,215 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2001-2004 Swedish Institute of Computer Science.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* This file is part of the lwIP TCP/IP stack.
|
||||||
|
*
|
||||||
|
* Author: Adam Dunkels <adam@sics.se>
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#ifndef __LWIP_IP_H__
|
||||||
|
#define __LWIP_IP_H__
|
||||||
|
|
||||||
|
#include "lwip/opt.h"
|
||||||
|
|
||||||
|
#include "lwip/def.h"
|
||||||
|
#include "lwip/pbuf.h"
|
||||||
|
#include "lwip/ip_addr.h"
|
||||||
|
#include "lwip/err.h"
|
||||||
|
#include "lwip/netif.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/** Currently, the function ip_output_if_opt() is only used with IGMP */
|
||||||
|
#define IP_OPTIONS_SEND LWIP_IGMP
|
||||||
|
|
||||||
|
#define IP_HLEN 20
|
||||||
|
|
||||||
|
#define IP_PROTO_ICMP 1
|
||||||
|
#define IP_PROTO_IGMP 2
|
||||||
|
#define IP_PROTO_UDP 17
|
||||||
|
#define IP_PROTO_UDPLITE 136
|
||||||
|
#define IP_PROTO_TCP 6
|
||||||
|
|
||||||
|
/* This is passed as the destination address to ip_output_if (not
|
||||||
|
to ip_output), meaning that an IP header already is constructed
|
||||||
|
in the pbuf. This is used when TCP retransmits. */
|
||||||
|
#ifdef IP_HDRINCL
|
||||||
|
#undef IP_HDRINCL
|
||||||
|
#endif /* IP_HDRINCL */
|
||||||
|
#define IP_HDRINCL NULL
|
||||||
|
|
||||||
|
#if LWIP_NETIF_HWADDRHINT
|
||||||
|
#define IP_PCB_ADDRHINT ;u8_t addr_hint
|
||||||
|
#else
|
||||||
|
#define IP_PCB_ADDRHINT
|
||||||
|
#endif /* LWIP_NETIF_HWADDRHINT */
|
||||||
|
|
||||||
|
/* This is the common part of all PCB types. It needs to be at the
|
||||||
|
beginning of a PCB type definition. It is located here so that
|
||||||
|
changes to this common part are made in one location instead of
|
||||||
|
having to change all PCB structs. */
|
||||||
|
#define IP_PCB \
|
||||||
|
/* ip addresses in network byte order */ \
|
||||||
|
ip_addr_t local_ip; \
|
||||||
|
ip_addr_t remote_ip; \
|
||||||
|
/* Socket options */ \
|
||||||
|
u8_t so_options; \
|
||||||
|
/* Type Of Service */ \
|
||||||
|
u8_t tos; \
|
||||||
|
/* Time To Live */ \
|
||||||
|
u8_t ttl \
|
||||||
|
/* link layer address resolution hint */ \
|
||||||
|
IP_PCB_ADDRHINT
|
||||||
|
|
||||||
|
struct ip_pcb {
|
||||||
|
/* Common members of all PCB types */
|
||||||
|
IP_PCB;
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Option flags per-socket. These are the same like SO_XXX.
|
||||||
|
*/
|
||||||
|
/*#define SOF_DEBUG (u8_t)0x01U Unimplemented: turn on debugging info recording */
|
||||||
|
#define SOF_ACCEPTCONN (u8_t)0x02U /* socket has had listen() */
|
||||||
|
#define SOF_REUSEADDR (u8_t)0x04U /* allow local address reuse */
|
||||||
|
#define SOF_KEEPALIVE (u8_t)0x08U /* keep connections alive */
|
||||||
|
/*#define SOF_DONTROUTE (u8_t)0x10U Unimplemented: just use interface addresses */
|
||||||
|
#define SOF_BROADCAST (u8_t)0x20U /* permit to send and to receive broadcast messages (see IP_SOF_BROADCAST option) */
|
||||||
|
/*#define SOF_USELOOPBACK (u8_t)0x40U Unimplemented: bypass hardware when possible */
|
||||||
|
#define SOF_LINGER (u8_t)0x80U /* linger on close if data present */
|
||||||
|
/*#define SOF_OOBINLINE (u16_t)0x0100U Unimplemented: leave received OOB data in line */
|
||||||
|
/*#define SOF_REUSEPORT (u16_t)0x0200U Unimplemented: allow local address & port reuse */
|
||||||
|
|
||||||
|
/* These flags are inherited (e.g. from a listen-pcb to a connection-pcb): */
|
||||||
|
#define SOF_INHERITED (SOF_REUSEADDR|SOF_KEEPALIVE|SOF_LINGER/*|SOF_DEBUG|SOF_DONTROUTE|SOF_OOBINLINE*/)
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef PACK_STRUCT_USE_INCLUDES
|
||||||
|
# include "arch/bpstruct.h"
|
||||||
|
#endif
|
||||||
|
PACK_STRUCT_BEGIN
|
||||||
|
struct ip_hdr {
|
||||||
|
/* version / header length / type of service */
|
||||||
|
PACK_STRUCT_FIELD(u16_t _v_hl_tos);
|
||||||
|
/* total length */
|
||||||
|
PACK_STRUCT_FIELD(u16_t _len);
|
||||||
|
/* identification */
|
||||||
|
PACK_STRUCT_FIELD(u16_t _id);
|
||||||
|
/* fragment offset field */
|
||||||
|
PACK_STRUCT_FIELD(u16_t _offset);
|
||||||
|
#define IP_RF 0x8000 /* reserved fragment flag */
|
||||||
|
#define IP_DF 0x4000 /* dont fragment flag */
|
||||||
|
#define IP_MF 0x2000 /* more fragments flag */
|
||||||
|
#define IP_OFFMASK 0x1fff /* mask for fragmenting bits */
|
||||||
|
/* time to live */
|
||||||
|
PACK_STRUCT_FIELD(u8_t _ttl);
|
||||||
|
/* protocol*/
|
||||||
|
PACK_STRUCT_FIELD(u8_t _proto);
|
||||||
|
/* checksum */
|
||||||
|
PACK_STRUCT_FIELD(u16_t _chksum);
|
||||||
|
/* source and destination IP addresses */
|
||||||
|
PACK_STRUCT_FIELD(ip_addr_p_t src);
|
||||||
|
PACK_STRUCT_FIELD(ip_addr_p_t dest);
|
||||||
|
} PACK_STRUCT_STRUCT;
|
||||||
|
PACK_STRUCT_END
|
||||||
|
#ifdef PACK_STRUCT_USE_INCLUDES
|
||||||
|
# include "arch/epstruct.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define IPH_V(hdr) (ntohs((hdr)->_v_hl_tos) >> 12)
|
||||||
|
#define IPH_HL(hdr) ((ntohs((hdr)->_v_hl_tos) >> 8) & 0x0f)
|
||||||
|
#define IPH_TOS(hdr) (ntohs((hdr)->_v_hl_tos) & 0xff)
|
||||||
|
#define IPH_LEN(hdr) ((hdr)->_len)
|
||||||
|
#define IPH_ID(hdr) ((hdr)->_id)
|
||||||
|
#define IPH_OFFSET(hdr) ((hdr)->_offset)
|
||||||
|
#define IPH_TTL(hdr) ((hdr)->_ttl)
|
||||||
|
#define IPH_PROTO(hdr) ((hdr)->_proto)
|
||||||
|
#define IPH_CHKSUM(hdr) ((hdr)->_chksum)
|
||||||
|
|
||||||
|
#define IPH_VHLTOS_SET(hdr, v, hl, tos) (hdr)->_v_hl_tos = (htons(((v) << 12) | ((hl) << 8) | (tos)))
|
||||||
|
#define IPH_LEN_SET(hdr, len) (hdr)->_len = (len)
|
||||||
|
#define IPH_ID_SET(hdr, id) (hdr)->_id = (id)
|
||||||
|
#define IPH_OFFSET_SET(hdr, off) (hdr)->_offset = (off)
|
||||||
|
#define IPH_TTL_SET(hdr, ttl) (hdr)->_ttl = (u8_t)(ttl)
|
||||||
|
#define IPH_PROTO_SET(hdr, proto) (hdr)->_proto = (u8_t)(proto)
|
||||||
|
#define IPH_CHKSUM_SET(hdr, chksum) (hdr)->_chksum = (chksum)
|
||||||
|
|
||||||
|
/** The interface that provided the packet for the current callback invocation. */
|
||||||
|
extern struct netif *current_netif;
|
||||||
|
/** Header of the input packet currently being processed. */
|
||||||
|
extern const struct ip_hdr *current_header;
|
||||||
|
/** Source IP address of current_header */
|
||||||
|
extern ip_addr_t current_iphdr_src;
|
||||||
|
/** Destination IP address of current_header */
|
||||||
|
extern ip_addr_t current_iphdr_dest;
|
||||||
|
|
||||||
|
#define ip_init() /* Compatibility define, not init needed. */
|
||||||
|
struct netif *ip_route(ip_addr_t *dest)ICACHE_FLASH_ATTR;
|
||||||
|
struct netif *ip_router(ip_addr_t *dest, ip_addr_t *source);
|
||||||
|
|
||||||
|
err_t ip_input(struct pbuf *p, struct netif *inp)ICACHE_FLASH_ATTR;
|
||||||
|
err_t ip_output(struct pbuf *p, ip_addr_t *src, ip_addr_t *dest,
|
||||||
|
u8_t ttl, u8_t tos, u8_t proto)ICACHE_FLASH_ATTR;
|
||||||
|
err_t ip_output_if(struct pbuf *p, ip_addr_t *src, ip_addr_t *dest,
|
||||||
|
u8_t ttl, u8_t tos, u8_t proto,
|
||||||
|
struct netif *netif)ICACHE_FLASH_ATTR;
|
||||||
|
#if LWIP_NETIF_HWADDRHINT
|
||||||
|
err_t ip_output_hinted(struct pbuf *p, ip_addr_t *src, ip_addr_t *dest,
|
||||||
|
u8_t ttl, u8_t tos, u8_t proto, u8_t *addr_hint)ICACHE_FLASH_ATTR;
|
||||||
|
#endif /* LWIP_NETIF_HWADDRHINT */
|
||||||
|
#if IP_OPTIONS_SEND
|
||||||
|
err_t ip_output_if_opt(struct pbuf *p, ip_addr_t *src, ip_addr_t *dest,
|
||||||
|
u8_t ttl, u8_t tos, u8_t proto, struct netif *netif, void *ip_options,
|
||||||
|
u16_t optlen)ICACHE_FLASH_ATTR;
|
||||||
|
#endif /* IP_OPTIONS_SEND */
|
||||||
|
/** Get the interface that received the current packet.
|
||||||
|
* This function must only be called from a receive callback (udp_recv,
|
||||||
|
* raw_recv, tcp_accept). It will return NULL otherwise. */
|
||||||
|
#define ip_current_netif() (current_netif)
|
||||||
|
/** Get the IP header of the current packet.
|
||||||
|
* This function must only be called from a receive callback (udp_recv,
|
||||||
|
* raw_recv, tcp_accept). It will return NULL otherwise. */
|
||||||
|
#define ip_current_header() (current_header)
|
||||||
|
/** Source IP address of current_header */
|
||||||
|
#define ip_current_src_addr() (¤t_iphdr_src)
|
||||||
|
/** Destination IP address of current_header */
|
||||||
|
#define ip_current_dest_addr() (¤t_iphdr_dest)
|
||||||
|
|
||||||
|
#if IP_DEBUG
|
||||||
|
void ip_debug_print(struct pbuf *p)ICACHE_FLASH_ATTR;
|
||||||
|
#else
|
||||||
|
#define ip_debug_print(p)
|
||||||
|
#endif /* IP_DEBUG */
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* __LWIP_IP_H__ */
|
||||||
|
|
||||||
|
|
256
app/include/lwip/ip_addr.h
Normal file
256
app/include/lwip/ip_addr.h
Normal file
@ -0,0 +1,256 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2001-2004 Swedish Institute of Computer Science.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* This file is part of the lwIP TCP/IP stack.
|
||||||
|
*
|
||||||
|
* Author: Adam Dunkels <adam@sics.se>
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#ifndef __LWIP_IP_ADDR_H__
|
||||||
|
#define __LWIP_IP_ADDR_H__
|
||||||
|
|
||||||
|
#include "lwip/opt.h"
|
||||||
|
#include "lwip/def.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* This is the aligned version of ip_addr_t,
|
||||||
|
used as local variable, on the stack, etc. */
|
||||||
|
struct ip_addr {
|
||||||
|
u32_t addr;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* This is the packed version of ip_addr_t,
|
||||||
|
used in network headers that are itself packed */
|
||||||
|
#ifdef PACK_STRUCT_USE_INCLUDES
|
||||||
|
# include "arch/bpstruct.h"
|
||||||
|
#endif
|
||||||
|
PACK_STRUCT_BEGIN
|
||||||
|
struct ip_addr_packed {
|
||||||
|
PACK_STRUCT_FIELD(u32_t addr);
|
||||||
|
} PACK_STRUCT_STRUCT;
|
||||||
|
PACK_STRUCT_END
|
||||||
|
#ifdef PACK_STRUCT_USE_INCLUDES
|
||||||
|
# include "arch/epstruct.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/** ip_addr_t uses a struct for convenience only, so that the same defines can
|
||||||
|
* operate both on ip_addr_t as well as on ip_addr_p_t. */
|
||||||
|
typedef struct ip_addr ip_addr_t;
|
||||||
|
typedef struct ip_addr_packed ip_addr_p_t;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* struct ipaddr2 is used in the definition of the ARP packet format in
|
||||||
|
* order to support compilers that don't have structure packing.
|
||||||
|
*/
|
||||||
|
#ifdef PACK_STRUCT_USE_INCLUDES
|
||||||
|
# include "arch/bpstruct.h"
|
||||||
|
#endif
|
||||||
|
PACK_STRUCT_BEGIN
|
||||||
|
struct ip_addr2 {
|
||||||
|
PACK_STRUCT_FIELD(u16_t addrw[2]);
|
||||||
|
} PACK_STRUCT_STRUCT;
|
||||||
|
PACK_STRUCT_END
|
||||||
|
#ifdef PACK_STRUCT_USE_INCLUDES
|
||||||
|
# include "arch/epstruct.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Forward declaration to not include netif.h */
|
||||||
|
struct netif;
|
||||||
|
|
||||||
|
extern const ip_addr_t ip_addr_any;
|
||||||
|
extern const ip_addr_t ip_addr_broadcast;
|
||||||
|
|
||||||
|
/** IP_ADDR_ can be used as a fixed IP address
|
||||||
|
* for the wildcard and the broadcast address
|
||||||
|
*/
|
||||||
|
#define IP_ADDR_ANY ((ip_addr_t *)&ip_addr_any)
|
||||||
|
#define IP_ADDR_BROADCAST ((ip_addr_t *)&ip_addr_broadcast)
|
||||||
|
|
||||||
|
/** 255.255.255.255 */
|
||||||
|
#define IPADDR_NONE ((u32_t)0xffffffffUL)
|
||||||
|
/** 127.0.0.1 */
|
||||||
|
#define IPADDR_LOOPBACK ((u32_t)0x7f000001UL)
|
||||||
|
/** 0.0.0.0 */
|
||||||
|
#define IPADDR_ANY ((u32_t)0x00000000UL)
|
||||||
|
/** 255.255.255.255 */
|
||||||
|
#define IPADDR_BROADCAST ((u32_t)0xffffffffUL)
|
||||||
|
|
||||||
|
/* Definitions of the bits in an Internet address integer.
|
||||||
|
|
||||||
|
On subnets, host and network parts are found according to
|
||||||
|
the subnet mask, not these masks. */
|
||||||
|
#define IP_CLASSA(a) ((((u32_t)(a)) & 0x80000000UL) == 0)
|
||||||
|
#define IP_CLASSA_NET 0xff000000
|
||||||
|
#define IP_CLASSA_NSHIFT 24
|
||||||
|
#define IP_CLASSA_HOST (0xffffffff & ~IP_CLASSA_NET)
|
||||||
|
#define IP_CLASSA_MAX 128
|
||||||
|
|
||||||
|
#define IP_CLASSB(a) ((((u32_t)(a)) & 0xc0000000UL) == 0x80000000UL)
|
||||||
|
#define IP_CLASSB_NET 0xffff0000
|
||||||
|
#define IP_CLASSB_NSHIFT 16
|
||||||
|
#define IP_CLASSB_HOST (0xffffffff & ~IP_CLASSB_NET)
|
||||||
|
#define IP_CLASSB_MAX 65536
|
||||||
|
|
||||||
|
#define IP_CLASSC(a) ((((u32_t)(a)) & 0xe0000000UL) == 0xc0000000UL)
|
||||||
|
#define IP_CLASSC_NET 0xffffff00
|
||||||
|
#define IP_CLASSC_NSHIFT 8
|
||||||
|
#define IP_CLASSC_HOST (0xffffffff & ~IP_CLASSC_NET)
|
||||||
|
|
||||||
|
#define IP_CLASSD(a) (((u32_t)(a) & 0xf0000000UL) == 0xe0000000UL)
|
||||||
|
#define IP_CLASSD_NET 0xf0000000 /* These ones aren't really */
|
||||||
|
#define IP_CLASSD_NSHIFT 28 /* net and host fields, but */
|
||||||
|
#define IP_CLASSD_HOST 0x0fffffff /* routing needn't know. */
|
||||||
|
#define IP_MULTICAST(a) IP_CLASSD(a)
|
||||||
|
|
||||||
|
#define IP_EXPERIMENTAL(a) (((u32_t)(a) & 0xf0000000UL) == 0xf0000000UL)
|
||||||
|
#define IP_BADCLASS(a) (((u32_t)(a) & 0xf0000000UL) == 0xf0000000UL)
|
||||||
|
|
||||||
|
#define IP_LOOPBACKNET 127 /* official! */
|
||||||
|
|
||||||
|
|
||||||
|
#if BYTE_ORDER == BIG_ENDIAN
|
||||||
|
/** Set an IP address given by the four byte-parts */
|
||||||
|
#define IP4_ADDR(ipaddr, a,b,c,d) \
|
||||||
|
(ipaddr)->addr = ((u32_t)((a) & 0xff) << 24) | \
|
||||||
|
((u32_t)((b) & 0xff) << 16) | \
|
||||||
|
((u32_t)((c) & 0xff) << 8) | \
|
||||||
|
(u32_t)((d) & 0xff)
|
||||||
|
#else
|
||||||
|
/** Set an IP address given by the four byte-parts.
|
||||||
|
Little-endian version that prevents the use of htonl. */
|
||||||
|
#define IP4_ADDR(ipaddr, a,b,c,d) \
|
||||||
|
(ipaddr)->addr = ((u32_t)((d) & 0xff) << 24) | \
|
||||||
|
((u32_t)((c) & 0xff) << 16) | \
|
||||||
|
((u32_t)((b) & 0xff) << 8) | \
|
||||||
|
(u32_t)((a) & 0xff)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/** MEMCPY-like copying of IP addresses where addresses are known to be
|
||||||
|
* 16-bit-aligned if the port is correctly configured (so a port could define
|
||||||
|
* this to copying 2 u16_t's) - no NULL-pointer-checking needed. */
|
||||||
|
#ifndef IPADDR2_COPY
|
||||||
|
#define IPADDR2_COPY(dest, src) SMEMCPY(dest, src, sizeof(ip_addr_t))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/** Copy IP address - faster than ip_addr_set: no NULL check */
|
||||||
|
#define ip_addr_copy(dest, src) ((dest).addr = (src).addr)
|
||||||
|
/** Safely copy one IP address to another (src may be NULL) */
|
||||||
|
#define ip_addr_set(dest, src) ((dest)->addr = \
|
||||||
|
((src) == NULL ? 0 : \
|
||||||
|
(src)->addr))
|
||||||
|
/** Set complete address to zero */
|
||||||
|
#define ip_addr_set_zero(ipaddr) ((ipaddr)->addr = 0)
|
||||||
|
/** Set address to IPADDR_ANY (no need for htonl()) */
|
||||||
|
#define ip_addr_set_any(ipaddr) ((ipaddr)->addr = IPADDR_ANY)
|
||||||
|
/** Set address to loopback address */
|
||||||
|
#define ip_addr_set_loopback(ipaddr) ((ipaddr)->addr = PP_HTONL(IPADDR_LOOPBACK))
|
||||||
|
/** Safely copy one IP address to another and change byte order
|
||||||
|
* from host- to network-order. */
|
||||||
|
#define ip_addr_set_hton(dest, src) ((dest)->addr = \
|
||||||
|
((src) == NULL ? 0:\
|
||||||
|
htonl((src)->addr)))
|
||||||
|
/** IPv4 only: set the IP address given as an u32_t */
|
||||||
|
#define ip4_addr_set_u32(dest_ipaddr, src_u32) ((dest_ipaddr)->addr = (src_u32))
|
||||||
|
/** IPv4 only: get the IP address as an u32_t */
|
||||||
|
#define ip4_addr_get_u32(src_ipaddr) ((src_ipaddr)->addr)
|
||||||
|
|
||||||
|
/** Get the network address by combining host address with netmask */
|
||||||
|
#define ip_addr_get_network(target, host, netmask) ((target)->addr = ((host)->addr) & ((netmask)->addr))
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Determine if two address are on the same network.
|
||||||
|
*
|
||||||
|
* @arg addr1 IP address 1
|
||||||
|
* @arg addr2 IP address 2
|
||||||
|
* @arg mask network identifier mask
|
||||||
|
* @return !0 if the network identifiers of both address match
|
||||||
|
*/
|
||||||
|
#define ip_addr_netcmp(addr1, addr2, mask) (((addr1)->addr & \
|
||||||
|
(mask)->addr) == \
|
||||||
|
((addr2)->addr & \
|
||||||
|
(mask)->addr))
|
||||||
|
#define ip_addr_cmp(addr1, addr2) ((addr1)->addr == (addr2)->addr)
|
||||||
|
|
||||||
|
#define ip_addr_isany(addr1) ((addr1) == NULL || (addr1)->addr == IPADDR_ANY)
|
||||||
|
|
||||||
|
#define ip_addr_isbroadcast(ipaddr, netif) ip4_addr_isbroadcast((ipaddr)->addr, (netif))
|
||||||
|
u8_t ip4_addr_isbroadcast(u32_t addr, const struct netif *netif)ICACHE_FLASH_ATTR;
|
||||||
|
|
||||||
|
#define ip_addr_netmask_valid(netmask) ip4_addr_netmask_valid((netmask)->addr)
|
||||||
|
u8_t ip4_addr_netmask_valid(u32_t netmask)ICACHE_FLASH_ATTR;
|
||||||
|
|
||||||
|
#define ip_addr_ismulticast(addr1) (((addr1)->addr & PP_HTONL(0xf0000000UL)) == PP_HTONL(0xe0000000UL))
|
||||||
|
|
||||||
|
#define ip_addr_islinklocal(addr1) (((addr1)->addr & PP_HTONL(0xffff0000UL)) == PP_HTONL(0xa9fe0000UL))
|
||||||
|
|
||||||
|
#define ip_addr_debug_print(debug, ipaddr) \
|
||||||
|
LWIP_DEBUGF(debug, ("%"U16_F".%"U16_F".%"U16_F".%"U16_F, \
|
||||||
|
ipaddr != NULL ? ip4_addr1_16(ipaddr) : 0, \
|
||||||
|
ipaddr != NULL ? ip4_addr2_16(ipaddr) : 0, \
|
||||||
|
ipaddr != NULL ? ip4_addr3_16(ipaddr) : 0, \
|
||||||
|
ipaddr != NULL ? ip4_addr4_16(ipaddr) : 0))
|
||||||
|
|
||||||
|
/* Get one byte from the 4-byte address */
|
||||||
|
#define ip4_addr1(ipaddr) (((u8_t*)(ipaddr))[0])
|
||||||
|
#define ip4_addr2(ipaddr) (((u8_t*)(ipaddr))[1])
|
||||||
|
#define ip4_addr3(ipaddr) (((u8_t*)(ipaddr))[2])
|
||||||
|
#define ip4_addr4(ipaddr) (((u8_t*)(ipaddr))[3])
|
||||||
|
/* These are cast to u16_t, with the intent that they are often arguments
|
||||||
|
* to printf using the U16_F format from cc.h. */
|
||||||
|
#define ip4_addr1_16(ipaddr) ((u16_t)ip4_addr1(ipaddr))
|
||||||
|
#define ip4_addr2_16(ipaddr) ((u16_t)ip4_addr2(ipaddr))
|
||||||
|
#define ip4_addr3_16(ipaddr) ((u16_t)ip4_addr3(ipaddr))
|
||||||
|
#define ip4_addr4_16(ipaddr) ((u16_t)ip4_addr4(ipaddr))
|
||||||
|
|
||||||
|
/** For backwards compatibility */
|
||||||
|
#define ip_ntoa(ipaddr) ipaddr_ntoa(ipaddr)
|
||||||
|
|
||||||
|
u32_t ipaddr_addr(const char *cp)ICACHE_FLASH_ATTR;
|
||||||
|
int ipaddr_aton(const char *cp, ip_addr_t *addr)ICACHE_FLASH_ATTR;
|
||||||
|
/** returns ptr to static buffer; not reentrant! */
|
||||||
|
char *ipaddr_ntoa(const ip_addr_t *addr)ICACHE_FLASH_ATTR;
|
||||||
|
char *ipaddr_ntoa_r(const ip_addr_t *addr, char *buf, int buflen)ICACHE_FLASH_ATTR;
|
||||||
|
|
||||||
|
#define IP2STR(ipaddr) ip4_addr1_16(ipaddr), \
|
||||||
|
ip4_addr2_16(ipaddr), \
|
||||||
|
ip4_addr3_16(ipaddr), \
|
||||||
|
ip4_addr4_16(ipaddr)
|
||||||
|
|
||||||
|
#define IPSTR "%d.%d.%d.%d"
|
||||||
|
|
||||||
|
struct ip_info {
|
||||||
|
struct ip_addr ip;
|
||||||
|
struct ip_addr netmask;
|
||||||
|
struct ip_addr gw;
|
||||||
|
};
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* __LWIP_IP_ADDR_H__ */
|
88
app/include/lwip/ip_frag.h
Normal file
88
app/include/lwip/ip_frag.h
Normal file
@ -0,0 +1,88 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2001-2004 Swedish Institute of Computer Science.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* This file is part of the lwIP TCP/IP stack.
|
||||||
|
*
|
||||||
|
* Author: Jani Monoses <jani@iv.ro>
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __LWIP_IP_FRAG_H__
|
||||||
|
#define __LWIP_IP_FRAG_H__
|
||||||
|
|
||||||
|
#include "lwip/opt.h"
|
||||||
|
#include "lwip/err.h"
|
||||||
|
#include "lwip/pbuf.h"
|
||||||
|
#include "lwip/netif.h"
|
||||||
|
#include "lwip/ip_addr.h"
|
||||||
|
#include "lwip/ip.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if IP_REASSEMBLY
|
||||||
|
/* The IP reassembly timer interval in milliseconds. */
|
||||||
|
#define IP_TMR_INTERVAL 1000
|
||||||
|
|
||||||
|
/* IP reassembly helper struct.
|
||||||
|
* This is exported because memp needs to know the size.
|
||||||
|
*/
|
||||||
|
struct ip_reassdata {
|
||||||
|
struct ip_reassdata *next;
|
||||||
|
struct pbuf *p;
|
||||||
|
struct ip_hdr iphdr;
|
||||||
|
u16_t datagram_len;
|
||||||
|
u8_t flags;
|
||||||
|
u8_t timer;
|
||||||
|
};
|
||||||
|
|
||||||
|
void ip_reass_init(void)ICACHE_FLASH_ATTR;
|
||||||
|
void ip_reass_tmr(void)ICACHE_FLASH_ATTR;
|
||||||
|
struct pbuf * ip_reass(struct pbuf *p)ICACHE_FLASH_ATTR;
|
||||||
|
#endif /* IP_REASSEMBLY */
|
||||||
|
|
||||||
|
#if IP_FRAG
|
||||||
|
#if !IP_FRAG_USES_STATIC_BUF && !LWIP_NETIF_TX_SINGLE_PBUF
|
||||||
|
/** A custom pbuf that holds a reference to another pbuf, which is freed
|
||||||
|
* when this custom pbuf is freed. This is used to create a custom PBUF_REF
|
||||||
|
* that points into the original pbuf. */
|
||||||
|
struct pbuf_custom_ref {
|
||||||
|
/** 'base class' */
|
||||||
|
struct pbuf_custom pc;
|
||||||
|
/** pointer to the original pbuf that is referenced */
|
||||||
|
struct pbuf *original;
|
||||||
|
};
|
||||||
|
#endif /* !IP_FRAG_USES_STATIC_BUF && !LWIP_NETIF_TX_SINGLE_PBUF */
|
||||||
|
|
||||||
|
err_t ip_frag(struct pbuf *p, struct netif *netif, ip_addr_t *dest)ICACHE_FLASH_ATTR;
|
||||||
|
#endif /* IP_FRAG */
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* __LWIP_IP_FRAG_H__ */
|
143
app/include/lwip/mem.h
Normal file
143
app/include/lwip/mem.h
Normal file
@ -0,0 +1,143 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2001-2004 Swedish Institute of Computer Science.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* This file is part of the lwIP TCP/IP stack.
|
||||||
|
*
|
||||||
|
* Author: Adam Dunkels <adam@sics.se>
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#ifndef __LWIP_MEM_H__
|
||||||
|
#define __LWIP_MEM_H__
|
||||||
|
|
||||||
|
#include "lwip/opt.h"
|
||||||
|
#include "mem_manager.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if MEM_LIBC_MALLOC
|
||||||
|
|
||||||
|
#include <stddef.h> /* for size_t */
|
||||||
|
|
||||||
|
typedef size_t mem_size_t;
|
||||||
|
|
||||||
|
/* aliases for C library malloc() */
|
||||||
|
#define mem_init()
|
||||||
|
/* in case C library malloc() needs extra protection,
|
||||||
|
* allow these defines to be overridden.
|
||||||
|
*/
|
||||||
|
#ifndef mem_free
|
||||||
|
#define mem_free vPortFree
|
||||||
|
#endif
|
||||||
|
#ifndef mem_malloc
|
||||||
|
#define mem_malloc pvPortMalloc
|
||||||
|
#endif
|
||||||
|
#ifndef mem_calloc
|
||||||
|
#define mem_calloc pvPortCalloc
|
||||||
|
#endif
|
||||||
|
#ifndef mem_realloc
|
||||||
|
#define mem_realloc pvPortRealloc
|
||||||
|
#endif
|
||||||
|
#ifndef mem_zalloc
|
||||||
|
#define mem_zalloc pvPortZalloc
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef os_malloc
|
||||||
|
#define os_malloc(s) mem_malloc((s))
|
||||||
|
#endif
|
||||||
|
#ifndef os_realloc
|
||||||
|
#define os_realloc(p, s) mem_realloc((p), (s))
|
||||||
|
#endif
|
||||||
|
#ifndef os_zalloc
|
||||||
|
#define os_zalloc(s) mem_zalloc((s))
|
||||||
|
#endif
|
||||||
|
#ifndef os_free
|
||||||
|
#define os_free(p) mem_free((p))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Since there is no C library allocation function to shrink memory without
|
||||||
|
moving it, define this to nothing. */
|
||||||
|
#ifndef mem_trim
|
||||||
|
#define mem_trim(mem, size) (mem)
|
||||||
|
#endif
|
||||||
|
#else /* MEM_LIBC_MALLOC */
|
||||||
|
|
||||||
|
/* MEM_SIZE would have to be aligned, but using 64000 here instead of
|
||||||
|
* 65535 leaves some room for alignment...
|
||||||
|
*/
|
||||||
|
#if MEM_SIZE > 64000l
|
||||||
|
typedef u32_t mem_size_t;
|
||||||
|
#define MEM_SIZE_F U32_F
|
||||||
|
#else
|
||||||
|
typedef u16_t mem_size_t;
|
||||||
|
#define MEM_SIZE_F U16_F
|
||||||
|
#endif /* MEM_SIZE > 64000 */
|
||||||
|
|
||||||
|
#if MEM_USE_POOLS
|
||||||
|
/** mem_init is not used when using pools instead of a heap */
|
||||||
|
#define mem_init()
|
||||||
|
/** mem_trim is not used when using pools instead of a heap:
|
||||||
|
we can't free part of a pool element and don't want to copy the rest */
|
||||||
|
#define mem_trim(mem, size) (mem)
|
||||||
|
#else /* MEM_USE_POOLS */
|
||||||
|
/* lwIP alternative malloc */
|
||||||
|
void mem_init(void)ICACHE_FLASH_ATTR;
|
||||||
|
void *mem_trim(void *mem, mem_size_t size)ICACHE_FLASH_ATTR;
|
||||||
|
#endif /* MEM_USE_POOLS */
|
||||||
|
void *mem_malloc(mem_size_t size)ICACHE_FLASH_ATTR;
|
||||||
|
void *mem_calloc(mem_size_t count, mem_size_t size)ICACHE_FLASH_ATTR;
|
||||||
|
void mem_free(void *mem)ICACHE_FLASH_ATTR;
|
||||||
|
#endif /* MEM_LIBC_MALLOC */
|
||||||
|
|
||||||
|
/** Calculate memory size for an aligned buffer - returns the next highest
|
||||||
|
* multiple of MEM_ALIGNMENT (e.g. LWIP_MEM_ALIGN_SIZE(3) and
|
||||||
|
* LWIP_MEM_ALIGN_SIZE(4) will both yield 4 for MEM_ALIGNMENT == 4).
|
||||||
|
*/
|
||||||
|
#ifndef LWIP_MEM_ALIGN_SIZE
|
||||||
|
#define LWIP_MEM_ALIGN_SIZE(size) (((size) + MEM_ALIGNMENT - 1) & ~(MEM_ALIGNMENT-1))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/** Calculate safe memory size for an aligned buffer when using an unaligned
|
||||||
|
* type as storage. This includes a safety-margin on (MEM_ALIGNMENT - 1) at the
|
||||||
|
* start (e.g. if buffer is u8_t[] and actual data will be u32_t*)
|
||||||
|
*/
|
||||||
|
#ifndef LWIP_MEM_ALIGN_BUFFER
|
||||||
|
#define LWIP_MEM_ALIGN_BUFFER(size) (((size) + MEM_ALIGNMENT - 1))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/** Align a memory pointer to the alignment defined by MEM_ALIGNMENT
|
||||||
|
* so that ADDR % MEM_ALIGNMENT == 0
|
||||||
|
*/
|
||||||
|
#ifndef LWIP_MEM_ALIGN
|
||||||
|
#define LWIP_MEM_ALIGN(addr) ((void *)(((mem_ptr_t)(addr) + MEM_ALIGNMENT - 1) & ~(mem_ptr_t)(MEM_ALIGNMENT-1)))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* __LWIP_MEM_H__ */
|
116
app/include/lwip/memp.h
Normal file
116
app/include/lwip/memp.h
Normal file
@ -0,0 +1,116 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2001-2004 Swedish Institute of Computer Science.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* This file is part of the lwIP TCP/IP stack.
|
||||||
|
*
|
||||||
|
* Author: Adam Dunkels <adam@sics.se>
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __LWIP_MEMP_H__
|
||||||
|
#define __LWIP_MEMP_H__
|
||||||
|
|
||||||
|
#include "lwip/opt.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Create the list of all memory pools managed by memp. MEMP_MAX represents a NULL pool at the end */
|
||||||
|
typedef enum {
|
||||||
|
#define LWIP_MEMPOOL(name,num,size,desc, attr) MEMP_##name,
|
||||||
|
#include "lwip/memp_std.h"
|
||||||
|
MEMP_MAX
|
||||||
|
} memp_t;
|
||||||
|
|
||||||
|
#if MEM_USE_POOLS
|
||||||
|
/* Use a helper type to get the start and end of the user "memory pools" for mem_malloc */
|
||||||
|
typedef enum {
|
||||||
|
/* Get the first (via:
|
||||||
|
MEMP_POOL_HELPER_START = ((u8_t) 1*MEMP_POOL_A + 0*MEMP_POOL_B + 0*MEMP_POOL_C + 0)*/
|
||||||
|
MEMP_POOL_HELPER_FIRST = ((u8_t)
|
||||||
|
#define LWIP_MEMPOOL(name,num,size,desc)
|
||||||
|
#define LWIP_MALLOC_MEMPOOL_START 1
|
||||||
|
#define LWIP_MALLOC_MEMPOOL(num, size) * MEMP_POOL_##size + 0
|
||||||
|
#define LWIP_MALLOC_MEMPOOL_END
|
||||||
|
#include "lwip/memp_std.h"
|
||||||
|
) ,
|
||||||
|
/* Get the last (via:
|
||||||
|
MEMP_POOL_HELPER_END = ((u8_t) 0 + MEMP_POOL_A*0 + MEMP_POOL_B*0 + MEMP_POOL_C*1) */
|
||||||
|
MEMP_POOL_HELPER_LAST = ((u8_t)
|
||||||
|
#define LWIP_MEMPOOL(name,num,size,desc)
|
||||||
|
#define LWIP_MALLOC_MEMPOOL_START
|
||||||
|
#define LWIP_MALLOC_MEMPOOL(num, size) 0 + MEMP_POOL_##size *
|
||||||
|
#define LWIP_MALLOC_MEMPOOL_END 1
|
||||||
|
#include "lwip/memp_std.h"
|
||||||
|
)
|
||||||
|
} memp_pool_helper_t;
|
||||||
|
|
||||||
|
/* The actual start and stop values are here (cast them over)
|
||||||
|
We use this helper type and these defines so we can avoid using const memp_t values */
|
||||||
|
#define MEMP_POOL_FIRST ((memp_t) MEMP_POOL_HELPER_FIRST)
|
||||||
|
#define MEMP_POOL_LAST ((memp_t) MEMP_POOL_HELPER_LAST)
|
||||||
|
#endif /* MEM_USE_POOLS */
|
||||||
|
|
||||||
|
#if MEMP_MEM_MALLOC || MEM_USE_POOLS
|
||||||
|
extern const u16_t memp_sizes[MEMP_MAX];
|
||||||
|
#endif /* MEMP_MEM_MALLOC || MEM_USE_POOLS */
|
||||||
|
|
||||||
|
#if MEMP_MEM_MALLOC
|
||||||
|
|
||||||
|
#include "mem.h"
|
||||||
|
|
||||||
|
#define memp_init()
|
||||||
|
#define memp_malloc(type) mem_malloc(memp_sizes[type])
|
||||||
|
#define memp_free(type, mem) mem_free(mem)
|
||||||
|
|
||||||
|
#else /* MEMP_MEM_MALLOC */
|
||||||
|
|
||||||
|
#if MEM_USE_POOLS
|
||||||
|
/** This structure is used to save the pool one element came from. */
|
||||||
|
struct memp_malloc_helper
|
||||||
|
{
|
||||||
|
memp_t poolnr;
|
||||||
|
};
|
||||||
|
#endif /* MEM_USE_POOLS */
|
||||||
|
|
||||||
|
void memp_init(void)ICACHE_FLASH_ATTR;
|
||||||
|
|
||||||
|
#if MEMP_OVERFLOW_CHECK
|
||||||
|
void *memp_malloc_fn(memp_t type, const char* file, const int line)ICACHE_FLASH_ATTR;
|
||||||
|
#define memp_malloc(t) memp_malloc_fn((t), __FILE__, __LINE__)
|
||||||
|
#else
|
||||||
|
void *memp_malloc(memp_t type)ICACHE_FLASH_ATTR;
|
||||||
|
#endif
|
||||||
|
void memp_free(memp_t type, void *mem)ICACHE_FLASH_ATTR;
|
||||||
|
|
||||||
|
#endif /* MEMP_MEM_MALLOC */
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* __LWIP_MEMP_H__ */
|
126
app/include/lwip/memp_std.h
Normal file
126
app/include/lwip/memp_std.h
Normal file
@ -0,0 +1,126 @@
|
|||||||
|
/*
|
||||||
|
* SETUP: Make sure we define everything we will need.
|
||||||
|
*
|
||||||
|
* We have create three types of pools:
|
||||||
|
* 1) MEMPOOL - standard pools
|
||||||
|
* 2) MALLOC_MEMPOOL - to be used by mem_malloc in mem.c
|
||||||
|
* 3) PBUF_MEMPOOL - a mempool of pbuf's, so include space for the pbuf struct
|
||||||
|
*
|
||||||
|
* If the include'r doesn't require any special treatment of each of the types
|
||||||
|
* above, then will declare #2 & #3 to be just standard mempools.
|
||||||
|
*/
|
||||||
|
#ifndef LWIP_MALLOC_MEMPOOL
|
||||||
|
/* This treats "malloc pools" just like any other pool.
|
||||||
|
The pools are a little bigger to provide 'size' as the amount of user data. */
|
||||||
|
#define LWIP_MALLOC_MEMPOOL(num, size) LWIP_MEMPOOL(POOL_##size, num, (size + sizeof(struct memp_malloc_helper)), "MALLOC_"#size, attr)
|
||||||
|
#define LWIP_MALLOC_MEMPOOL_START
|
||||||
|
#define LWIP_MALLOC_MEMPOOL_END
|
||||||
|
#endif /* LWIP_MALLOC_MEMPOOL */
|
||||||
|
|
||||||
|
#ifndef LWIP_PBUF_MEMPOOL
|
||||||
|
/* This treats "pbuf pools" just like any other pool.
|
||||||
|
* Allocates buffers for a pbuf struct AND a payload size */
|
||||||
|
#define LWIP_PBUF_MEMPOOL(name, num, payload, desc, attr) LWIP_MEMPOOL(name, num, (MEMP_ALIGN_SIZE(sizeof(struct pbuf)) + MEMP_ALIGN_SIZE(payload)), desc, attr)
|
||||||
|
#endif /* LWIP_PBUF_MEMPOOL */
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* A list of internal pools used by LWIP.
|
||||||
|
*
|
||||||
|
* LWIP_MEMPOOL(pool_name, number_elements, element_size, pool_description)
|
||||||
|
* creates a pool name MEMP_pool_name. description is used in stats.c
|
||||||
|
*/
|
||||||
|
#if LWIP_RAW
|
||||||
|
LWIP_MEMPOOL(RAW_PCB, MEMP_NUM_RAW_PCB, sizeof(struct raw_pcb), "RAW_PCB", DMEM_ATTR)
|
||||||
|
#endif /* LWIP_RAW */
|
||||||
|
|
||||||
|
#if LWIP_UDP
|
||||||
|
LWIP_MEMPOOL(UDP_PCB, MEMP_NUM_UDP_PCB, sizeof(struct udp_pcb), "UDP_PCB", DMEM_ATTR)
|
||||||
|
#endif /* LWIP_UDP */
|
||||||
|
|
||||||
|
#if LWIP_TCP
|
||||||
|
LWIP_MEMPOOL(TCP_PCB, MEMP_NUM_TCP_PCB, sizeof(struct tcp_pcb), "TCP_PCB", DMEM_ATTR)
|
||||||
|
LWIP_MEMPOOL(TCP_PCB_LISTEN, MEMP_NUM_TCP_PCB_LISTEN, sizeof(struct tcp_pcb_listen), "TCP_PCB_LISTEN", DMEM_ATTR)
|
||||||
|
LWIP_MEMPOOL(TCP_SEG, MEMP_NUM_TCP_SEG, sizeof(struct tcp_seg), "TCP_SEG", DMEM_ATTR)
|
||||||
|
#endif /* LWIP_TCP */
|
||||||
|
|
||||||
|
#if IP_REASSEMBLY
|
||||||
|
LWIP_MEMPOOL(REASSDATA, MEMP_NUM_REASSDATA, sizeof(struct ip_reassdata), "REASSDATA", DMEM_ATTR)
|
||||||
|
#endif /* IP_REASSEMBLY */
|
||||||
|
#if IP_FRAG && !IP_FRAG_USES_STATIC_BUF && !LWIP_NETIF_TX_SINGLE_PBUF
|
||||||
|
LWIP_MEMPOOL(FRAG_PBUF, MEMP_NUM_FRAG_PBUF, sizeof(struct pbuf_custom_ref),"FRAG_PBUF", DMEM_ATTR)
|
||||||
|
#endif /* IP_FRAG && !IP_FRAG_USES_STATIC_BUF && !LWIP_NETIF_TX_SINGLE_PBUF */
|
||||||
|
|
||||||
|
#if LWIP_NETCONN
|
||||||
|
LWIP_MEMPOOL(NETBUF, MEMP_NUM_NETBUF, sizeof(struct netbuf), "NETBUF")
|
||||||
|
LWIP_MEMPOOL(NETCONN, MEMP_NUM_NETCONN, sizeof(struct netconn), "NETCONN")
|
||||||
|
#endif /* LWIP_NETCONN */
|
||||||
|
|
||||||
|
#if NO_SYS==0
|
||||||
|
LWIP_MEMPOOL(TCPIP_MSG_API, MEMP_NUM_TCPIP_MSG_API, sizeof(struct tcpip_msg), "TCPIP_MSG_API")
|
||||||
|
#if !LWIP_TCPIP_CORE_LOCKING_INPUT
|
||||||
|
LWIP_MEMPOOL(TCPIP_MSG_INPKT,MEMP_NUM_TCPIP_MSG_INPKT, sizeof(struct tcpip_msg), "TCPIP_MSG_INPKT")
|
||||||
|
#endif /* !LWIP_TCPIP_CORE_LOCKING_INPUT */
|
||||||
|
#endif /* NO_SYS==0 */
|
||||||
|
|
||||||
|
#if ARP_QUEUEING
|
||||||
|
LWIP_MEMPOOL(ARP_QUEUE, MEMP_NUM_ARP_QUEUE, sizeof(struct etharp_q_entry), "ARP_QUEUE", DMEM_ATTR)
|
||||||
|
#endif /* ARP_QUEUEING */
|
||||||
|
|
||||||
|
#if LWIP_IGMP
|
||||||
|
LWIP_MEMPOOL(IGMP_GROUP, MEMP_NUM_IGMP_GROUP, sizeof(struct igmp_group), "IGMP_GROUP", DMEM_ATTR)
|
||||||
|
#endif /* LWIP_IGMP */
|
||||||
|
|
||||||
|
#if (!NO_SYS || (NO_SYS && !NO_SYS_NO_TIMERS)) /* LWIP_TIMERS */
|
||||||
|
LWIP_MEMPOOL(SYS_TIMEOUT, MEMP_NUM_SYS_TIMEOUT, sizeof(struct sys_timeo), "SYS_TIMEOUT", DMEM_ATTR)
|
||||||
|
#endif /* LWIP_TIMERS */
|
||||||
|
|
||||||
|
#if LWIP_SNMP
|
||||||
|
LWIP_MEMPOOL(SNMP_ROOTNODE, MEMP_NUM_SNMP_ROOTNODE, sizeof(struct mib_list_rootnode), "SNMP_ROOTNODE")
|
||||||
|
LWIP_MEMPOOL(SNMP_NODE, MEMP_NUM_SNMP_NODE, sizeof(struct mib_list_node), "SNMP_NODE")
|
||||||
|
LWIP_MEMPOOL(SNMP_VARBIND, MEMP_NUM_SNMP_VARBIND, sizeof(struct snmp_varbind), "SNMP_VARBIND")
|
||||||
|
LWIP_MEMPOOL(SNMP_VALUE, MEMP_NUM_SNMP_VALUE, SNMP_MAX_VALUE_SIZE, "SNMP_VALUE")
|
||||||
|
#endif /* LWIP_SNMP */
|
||||||
|
#if LWIP_DNS && LWIP_SOCKET
|
||||||
|
LWIP_MEMPOOL(NETDB, MEMP_NUM_NETDB, NETDB_ELEM_SIZE, "NETDB")
|
||||||
|
#endif /* LWIP_DNS && LWIP_SOCKET */
|
||||||
|
#if LWIP_DNS && DNS_LOCAL_HOSTLIST && DNS_LOCAL_HOSTLIST_IS_DYNAMIC
|
||||||
|
LWIP_MEMPOOL(LOCALHOSTLIST, MEMP_NUM_LOCALHOSTLIST, LOCALHOSTLIST_ELEM_SIZE, "LOCALHOSTLIST")
|
||||||
|
#endif /* LWIP_DNS && DNS_LOCAL_HOSTLIST && DNS_LOCAL_HOSTLIST_IS_DYNAMIC */
|
||||||
|
#if PPP_SUPPORT && PPPOE_SUPPORT
|
||||||
|
LWIP_MEMPOOL(PPPOE_IF, MEMP_NUM_PPPOE_INTERFACES, sizeof(struct pppoe_softc), "PPPOE_IF")
|
||||||
|
#endif /* PPP_SUPPORT && PPPOE_SUPPORT */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* A list of pools of pbuf's used by LWIP.
|
||||||
|
*
|
||||||
|
* LWIP_PBUF_MEMPOOL(pool_name, number_elements, pbuf_payload_size, pool_description)
|
||||||
|
* creates a pool name MEMP_pool_name. description is used in stats.c
|
||||||
|
* This allocates enough space for the pbuf struct and a payload.
|
||||||
|
* (Example: pbuf_payload_size=0 allocates only size for the struct)
|
||||||
|
*/
|
||||||
|
LWIP_PBUF_MEMPOOL(PBUF, MEMP_NUM_PBUF, 0, "PBUF_REF/ROM", DMEM_ATTR)
|
||||||
|
|
||||||
|
/* XXX: need to align to 4 byte as memp strcut is 4-byte long. otherwise will crash */
|
||||||
|
#define LWIP_MEM_ALIGN4_SIZE(size) (((size) + 4 - 1) & ~(4-1))
|
||||||
|
|
||||||
|
LWIP_PBUF_MEMPOOL(PBUF_POOL, PBUF_POOL_SIZE, LWIP_MEM_ALIGN4_SIZE(PBUF_POOL_BUFSIZE), "PBUF_POOL", DMEM_ATTR)
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Allow for user-defined pools; this must be explicitly set in lwipopts.h
|
||||||
|
* since the default is to NOT look for lwippools.h
|
||||||
|
*/
|
||||||
|
#if MEMP_USE_CUSTOM_POOLS
|
||||||
|
#include "lwippools.h"
|
||||||
|
#endif /* MEMP_USE_CUSTOM_POOLS */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* REQUIRED CLEANUP: Clear up so we don't get "multiply defined" error later
|
||||||
|
* (#undef is ignored for something that is not defined)
|
||||||
|
*/
|
||||||
|
#undef LWIP_MEMPOOL
|
||||||
|
#undef LWIP_MALLOC_MEMPOOL
|
||||||
|
#undef LWIP_MALLOC_MEMPOOL_START
|
||||||
|
#undef LWIP_MALLOC_MEMPOOL_END
|
||||||
|
#undef LWIP_PBUF_MEMPOOL
|
101
app/include/lwip/netbuf.h
Normal file
101
app/include/lwip/netbuf.h
Normal file
@ -0,0 +1,101 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2001-2004 Swedish Institute of Computer Science.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* This file is part of the lwIP TCP/IP stack.
|
||||||
|
*
|
||||||
|
* Author: Adam Dunkels <adam@sics.se>
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#ifndef __LWIP_NETBUF_H__
|
||||||
|
#define __LWIP_NETBUF_H__
|
||||||
|
|
||||||
|
#include "lwip/opt.h"
|
||||||
|
#include "lwip/pbuf.h"
|
||||||
|
#include "lwip/ip_addr.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/** This netbuf has dest-addr/port set */
|
||||||
|
#define NETBUF_FLAG_DESTADDR 0x01
|
||||||
|
/** This netbuf includes a checksum */
|
||||||
|
#define NETBUF_FLAG_CHKSUM 0x02
|
||||||
|
|
||||||
|
struct netbuf {
|
||||||
|
struct pbuf *p, *ptr;
|
||||||
|
ip_addr_t addr;
|
||||||
|
u16_t port;
|
||||||
|
#if LWIP_NETBUF_RECVINFO || LWIP_CHECKSUM_ON_COPY
|
||||||
|
#if LWIP_CHECKSUM_ON_COPY
|
||||||
|
u8_t flags;
|
||||||
|
#endif /* LWIP_CHECKSUM_ON_COPY */
|
||||||
|
u16_t toport_chksum;
|
||||||
|
#if LWIP_NETBUF_RECVINFO
|
||||||
|
ip_addr_t toaddr;
|
||||||
|
#endif /* LWIP_NETBUF_RECVINFO */
|
||||||
|
#endif /* LWIP_NETBUF_RECVINFO || LWIP_CHECKSUM_ON_COPY */
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Network buffer functions: */
|
||||||
|
struct netbuf * netbuf_new (void)ICACHE_FLASH_ATTR;
|
||||||
|
void netbuf_delete (struct netbuf *buf)ICACHE_FLASH_ATTR;
|
||||||
|
void * netbuf_alloc (struct netbuf *buf, u16_t size)ICACHE_FLASH_ATTR;
|
||||||
|
void netbuf_free (struct netbuf *buf)ICACHE_FLASH_ATTR;
|
||||||
|
err_t netbuf_ref (struct netbuf *buf,
|
||||||
|
const void *dataptr, u16_t size)ICACHE_FLASH_ATTR;
|
||||||
|
void netbuf_chain (struct netbuf *head,
|
||||||
|
struct netbuf *tail)ICACHE_FLASH_ATTR;
|
||||||
|
|
||||||
|
err_t netbuf_data (struct netbuf *buf,
|
||||||
|
void **dataptr, u16_t *len)ICACHE_FLASH_ATTR;
|
||||||
|
s8_t netbuf_next (struct netbuf *buf)ICACHE_FLASH_ATTR;
|
||||||
|
void netbuf_first (struct netbuf *buf)ICACHE_FLASH_ATTR;
|
||||||
|
|
||||||
|
|
||||||
|
#define netbuf_copy_partial(buf, dataptr, len, offset) \
|
||||||
|
pbuf_copy_partial((buf)->p, (dataptr), (len), (offset))
|
||||||
|
#define netbuf_copy(buf,dataptr,len) netbuf_copy_partial(buf, dataptr, len, 0)
|
||||||
|
#define netbuf_take(buf, dataptr, len) pbuf_take((buf)->p, dataptr, len)
|
||||||
|
#define netbuf_len(buf) ((buf)->p->tot_len)
|
||||||
|
#define netbuf_fromaddr(buf) (&((buf)->addr))
|
||||||
|
#define netbuf_set_fromaddr(buf, fromaddr) ip_addr_set((&(buf)->addr), fromaddr)
|
||||||
|
#define netbuf_fromport(buf) ((buf)->port)
|
||||||
|
#if LWIP_NETBUF_RECVINFO
|
||||||
|
#define netbuf_destaddr(buf) (&((buf)->toaddr))
|
||||||
|
#define netbuf_set_destaddr(buf, destaddr) ip_addr_set((&(buf)->addr), destaddr)
|
||||||
|
#define netbuf_destport(buf) (((buf)->flags & NETBUF_FLAG_DESTADDR) ? (buf)->toport_chksum : 0)
|
||||||
|
#endif /* LWIP_NETBUF_RECVINFO */
|
||||||
|
#if LWIP_CHECKSUM_ON_COPY
|
||||||
|
#define netbuf_set_chksum(buf, chksum) do { (buf)->flags = NETBUF_FLAG_CHKSUM; \
|
||||||
|
(buf)->toport_chksum = chksum; } while(0)
|
||||||
|
#endif /* LWIP_CHECKSUM_ON_COPY */
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* __LWIP_NETBUF_H__ */
|
124
app/include/lwip/netdb.h
Normal file
124
app/include/lwip/netdb.h
Normal file
@ -0,0 +1,124 @@
|
|||||||
|
/*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* This file is part of the lwIP TCP/IP stack.
|
||||||
|
*
|
||||||
|
* Author: Simon Goldschmidt
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#ifndef __LWIP_NETDB_H__
|
||||||
|
#define __LWIP_NETDB_H__
|
||||||
|
|
||||||
|
#include "lwip/opt.h"
|
||||||
|
|
||||||
|
#if LWIP_DNS && LWIP_SOCKET
|
||||||
|
|
||||||
|
#include <stddef.h> /* for size_t */
|
||||||
|
|
||||||
|
#include "lwip/inet.h"
|
||||||
|
#include "lwip/sockets.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* some rarely used options */
|
||||||
|
#ifndef LWIP_DNS_API_DECLARE_H_ERRNO
|
||||||
|
#define LWIP_DNS_API_DECLARE_H_ERRNO 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef LWIP_DNS_API_DEFINE_ERRORS
|
||||||
|
#define LWIP_DNS_API_DEFINE_ERRORS 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef LWIP_DNS_API_DECLARE_STRUCTS
|
||||||
|
#define LWIP_DNS_API_DECLARE_STRUCTS 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if LWIP_DNS_API_DEFINE_ERRORS
|
||||||
|
/** Errors used by the DNS API functions, h_errno can be one of them */
|
||||||
|
#define EAI_NONAME 200
|
||||||
|
#define EAI_SERVICE 201
|
||||||
|
#define EAI_FAIL 202
|
||||||
|
#define EAI_MEMORY 203
|
||||||
|
|
||||||
|
#define HOST_NOT_FOUND 210
|
||||||
|
#define NO_DATA 211
|
||||||
|
#define NO_RECOVERY 212
|
||||||
|
#define TRY_AGAIN 213
|
||||||
|
#endif /* LWIP_DNS_API_DEFINE_ERRORS */
|
||||||
|
|
||||||
|
#if LWIP_DNS_API_DECLARE_STRUCTS
|
||||||
|
struct hostent {
|
||||||
|
char *h_name; /* Official name of the host. */
|
||||||
|
char **h_aliases; /* A pointer to an array of pointers to alternative host names,
|
||||||
|
terminated by a null pointer. */
|
||||||
|
int h_addrtype; /* Address type. */
|
||||||
|
int h_length; /* The length, in bytes, of the address. */
|
||||||
|
char **h_addr_list; /* A pointer to an array of pointers to network addresses (in
|
||||||
|
network byte order) for the host, terminated by a null pointer. */
|
||||||
|
#define h_addr h_addr_list[0] /* for backward compatibility */
|
||||||
|
};
|
||||||
|
|
||||||
|
struct addrinfo {
|
||||||
|
int ai_flags; /* Input flags. */
|
||||||
|
int ai_family; /* Address family of socket. */
|
||||||
|
int ai_socktype; /* Socket type. */
|
||||||
|
int ai_protocol; /* Protocol of socket. */
|
||||||
|
socklen_t ai_addrlen; /* Length of socket address. */
|
||||||
|
struct sockaddr *ai_addr; /* Socket address of socket. */
|
||||||
|
char *ai_canonname; /* Canonical name of service location. */
|
||||||
|
struct addrinfo *ai_next; /* Pointer to next in list. */
|
||||||
|
};
|
||||||
|
#endif /* LWIP_DNS_API_DECLARE_STRUCTS */
|
||||||
|
|
||||||
|
#if LWIP_DNS_API_DECLARE_H_ERRNO
|
||||||
|
/* application accessable error code set by the DNS API functions */
|
||||||
|
extern int h_errno;
|
||||||
|
#endif /* LWIP_DNS_API_DECLARE_H_ERRNO*/
|
||||||
|
|
||||||
|
struct hostent *lwip_gethostbyname(const char *name);
|
||||||
|
int lwip_gethostbyname_r(const char *name, struct hostent *ret, char *buf,
|
||||||
|
size_t buflen, struct hostent **result, int *h_errnop);
|
||||||
|
void lwip_freeaddrinfo(struct addrinfo *ai);
|
||||||
|
int lwip_getaddrinfo(const char *nodename,
|
||||||
|
const char *servname,
|
||||||
|
const struct addrinfo *hints,
|
||||||
|
struct addrinfo **res);
|
||||||
|
|
||||||
|
#if LWIP_COMPAT_SOCKETS
|
||||||
|
#define gethostbyname(name) lwip_gethostbyname(name)
|
||||||
|
#define gethostbyname_r(name, ret, buf, buflen, result, h_errnop) \
|
||||||
|
lwip_gethostbyname_r(name, ret, buf, buflen, result, h_errnop)
|
||||||
|
#define freeaddrinfo(addrinfo) lwip_freeaddrinfo(addrinfo)
|
||||||
|
#define getaddrinfo(nodname, servname, hints, res) \
|
||||||
|
lwip_getaddrinfo(nodname, servname, hints, res)
|
||||||
|
#endif /* LWIP_COMPAT_SOCKETS */
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* LWIP_DNS && LWIP_SOCKET */
|
||||||
|
|
||||||
|
#endif /* __LWIP_NETDB_H__ */
|
315
app/include/lwip/netif.h
Normal file
315
app/include/lwip/netif.h
Normal file
@ -0,0 +1,315 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2001-2004 Swedish Institute of Computer Science.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* This file is part of the lwIP TCP/IP stack.
|
||||||
|
*
|
||||||
|
* Author: Adam Dunkels <adam@sics.se>
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#ifndef __LWIP_NETIF_H__
|
||||||
|
#define __LWIP_NETIF_H__
|
||||||
|
|
||||||
|
#include "lwip/opt.h"
|
||||||
|
|
||||||
|
#define ENABLE_LOOPBACK (LWIP_NETIF_LOOPBACK || LWIP_HAVE_LOOPIF)
|
||||||
|
|
||||||
|
#include "lwip/err.h"
|
||||||
|
|
||||||
|
#include "lwip/ip_addr.h"
|
||||||
|
|
||||||
|
#include "lwip/def.h"
|
||||||
|
#include "lwip/pbuf.h"
|
||||||
|
#if LWIP_DHCP
|
||||||
|
struct dhcp;
|
||||||
|
#endif
|
||||||
|
#if LWIP_AUTOIP
|
||||||
|
struct autoip;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Throughout this file, IP addresses are expected to be in
|
||||||
|
* the same byte order as in IP_PCB. */
|
||||||
|
|
||||||
|
/** must be the maximum of all used hardware address lengths
|
||||||
|
across all types of interfaces in use */
|
||||||
|
#define NETIF_MAX_HWADDR_LEN 6U
|
||||||
|
|
||||||
|
/** Whether the network interface is 'up'. This is
|
||||||
|
* a software flag used to control whether this network
|
||||||
|
* interface is enabled and processes traffic.
|
||||||
|
* It is set by the startup code (for static IP configuration) or
|
||||||
|
* by dhcp/autoip when an address has been assigned.
|
||||||
|
*/
|
||||||
|
#define NETIF_FLAG_UP 0x01U
|
||||||
|
/** If set, the netif has broadcast capability.
|
||||||
|
* Set by the netif driver in its init function. */
|
||||||
|
#define NETIF_FLAG_BROADCAST 0x02U
|
||||||
|
/** If set, the netif is one end of a point-to-point connection.
|
||||||
|
* Set by the netif driver in its init function. */
|
||||||
|
#define NETIF_FLAG_POINTTOPOINT 0x04U
|
||||||
|
/** If set, the interface is configured using DHCP.
|
||||||
|
* Set by the DHCP code when starting or stopping DHCP. */
|
||||||
|
#define NETIF_FLAG_DHCP 0x08U
|
||||||
|
/** If set, the interface has an active link
|
||||||
|
* (set by the network interface driver).
|
||||||
|
* Either set by the netif driver in its init function (if the link
|
||||||
|
* is up at that time) or at a later point once the link comes up
|
||||||
|
* (if link detection is supported by the hardware). */
|
||||||
|
#define NETIF_FLAG_LINK_UP 0x10U
|
||||||
|
/** If set, the netif is an ethernet device using ARP.
|
||||||
|
* Set by the netif driver in its init function.
|
||||||
|
* Used to check input packet types and use of DHCP. */
|
||||||
|
#define NETIF_FLAG_ETHARP 0x20U
|
||||||
|
/** If set, the netif is an ethernet device. It might not use
|
||||||
|
* ARP or TCP/IP if it is used for PPPoE only.
|
||||||
|
*/
|
||||||
|
#define NETIF_FLAG_ETHERNET 0x40U
|
||||||
|
/** If set, the netif has IGMP capability.
|
||||||
|
* Set by the netif driver in its init function. */
|
||||||
|
#define NETIF_FLAG_IGMP 0x80U
|
||||||
|
|
||||||
|
/** Function prototype for netif init functions. Set up flags and output/linkoutput
|
||||||
|
* callback functions in this function.
|
||||||
|
*
|
||||||
|
* @param netif The netif to initialize
|
||||||
|
*/
|
||||||
|
typedef err_t (*netif_init_fn)(struct netif *netif);
|
||||||
|
/** Function prototype for netif->input functions. This function is saved as 'input'
|
||||||
|
* callback function in the netif struct. Call it when a packet has been received.
|
||||||
|
*
|
||||||
|
* @param p The received packet, copied into a pbuf
|
||||||
|
* @param inp The netif which received the packet
|
||||||
|
*/
|
||||||
|
typedef err_t (*netif_input_fn)(struct pbuf *p, struct netif *inp);
|
||||||
|
/** Function prototype for netif->output functions. Called by lwIP when a packet
|
||||||
|
* shall be sent. For ethernet netif, set this to 'etharp_output' and set
|
||||||
|
* 'linkoutput'.
|
||||||
|
*
|
||||||
|
* @param netif The netif which shall send a packet
|
||||||
|
* @param p The packet to send (p->payload points to IP header)
|
||||||
|
* @param ipaddr The IP address to which the packet shall be sent
|
||||||
|
*/
|
||||||
|
typedef err_t (*netif_output_fn)(struct netif *netif, struct pbuf *p,
|
||||||
|
ip_addr_t *ipaddr);
|
||||||
|
/** Function prototype for netif->linkoutput functions. Only used for ethernet
|
||||||
|
* netifs. This function is called by ARP when a packet shall be sent.
|
||||||
|
*
|
||||||
|
* @param netif The netif which shall send a packet
|
||||||
|
* @param p The packet to send (raw ethernet packet)
|
||||||
|
*/
|
||||||
|
typedef err_t (*netif_linkoutput_fn)(struct netif *netif, struct pbuf *p);
|
||||||
|
/** Function prototype for netif status- or link-callback functions. */
|
||||||
|
typedef void (*netif_status_callback_fn)(struct netif *netif);
|
||||||
|
/** Function prototype for netif igmp_mac_filter functions */
|
||||||
|
typedef err_t (*netif_igmp_mac_filter_fn)(struct netif *netif,
|
||||||
|
ip_addr_t *group, u8_t action);
|
||||||
|
|
||||||
|
/** Generic data structure used for all lwIP network interfaces.
|
||||||
|
* The following fields should be filled in by the initialization
|
||||||
|
* function for the device driver: hwaddr_len, hwaddr[], mtu, flags */
|
||||||
|
struct netif {
|
||||||
|
/** pointer to next in linked list */
|
||||||
|
struct netif *next;
|
||||||
|
|
||||||
|
/** IP address configuration in network byte order */
|
||||||
|
ip_addr_t ip_addr;
|
||||||
|
ip_addr_t netmask;
|
||||||
|
ip_addr_t gw;
|
||||||
|
|
||||||
|
/** This function is called by the network device driver
|
||||||
|
* to pass a packet up the TCP/IP stack. <EFBFBD><EFBFBD>IP<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD>*/
|
||||||
|
netif_input_fn input;
|
||||||
|
/** This function is called by the IP module when it wants
|
||||||
|
* to send a packet on the interface. This function typically
|
||||||
|
* first resolves the hardware address, then sends the packet. <EFBFBD><EFBFBD><EFBFBD><EFBFBD>IP<EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD>*/
|
||||||
|
netif_output_fn output;
|
||||||
|
/** This function is called by the ARP module when it wants
|
||||||
|
* to send a packet on the interface. This function outputs
|
||||||
|
* the pbuf as-is on the link medium. <EFBFBD>ײ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
|
||||||
|
netif_linkoutput_fn linkoutput;
|
||||||
|
#if LWIP_NETIF_STATUS_CALLBACK
|
||||||
|
/** This function is called when the netif state is set to up or down
|
||||||
|
*/
|
||||||
|
netif_status_callback_fn status_callback;
|
||||||
|
#endif /* LWIP_NETIF_STATUS_CALLBACK */
|
||||||
|
#if LWIP_NETIF_LINK_CALLBACK
|
||||||
|
/** This function is called when the netif link is set to up or down
|
||||||
|
*/
|
||||||
|
netif_status_callback_fn link_callback;
|
||||||
|
#endif /* LWIP_NETIF_LINK_CALLBACK */
|
||||||
|
/** This field can be set by the device driver and could point
|
||||||
|
* to state information for the device. <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֶΣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD>ײ<EFBFBD><EFBFBD>豸<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ*/
|
||||||
|
void *state;
|
||||||
|
#if LWIP_DHCP
|
||||||
|
/** the DHCP client state information for this netif */
|
||||||
|
struct dhcp *dhcp;
|
||||||
|
#endif /* LWIP_DHCP */
|
||||||
|
#if LWIP_AUTOIP
|
||||||
|
/** the AutoIP client state information for this netif */
|
||||||
|
struct autoip *autoip;
|
||||||
|
#endif
|
||||||
|
#if LWIP_NETIF_HOSTNAME
|
||||||
|
/* the hostname for this netif, NULL is a valid value */
|
||||||
|
char* hostname;
|
||||||
|
#endif /* LWIP_NETIF_HOSTNAME */
|
||||||
|
/** maximum transfer unit (in bytes) <20>ýӿ<C3BD><D3BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD><DDB0><EFBFBD><EFBFBD>ȣ<EFBFBD><C8A3><EFBFBD><EFBFBD><EFBFBD>1500*/
|
||||||
|
u16_t mtu;
|
||||||
|
/** number of bytes used in hwaddr<64>ýӿ<C3BD><D3BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD> */
|
||||||
|
u8_t hwaddr_len;
|
||||||
|
/** link level hardware address of this interface <20>ýӿ<C3BD><D3BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ*/
|
||||||
|
u8_t hwaddr[NETIF_MAX_HWADDR_LEN];
|
||||||
|
/** flags (see NETIF_FLAG_ above) <20>ýӿ<C3BD>״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֶ<EFBFBD>*/
|
||||||
|
u8_t flags;
|
||||||
|
/** descriptive abbreviation <20>ýӿڵ<D3BF><DAB5><EFBFBD><EFBFBD><EFBFBD>*/
|
||||||
|
char name[2];
|
||||||
|
/** number of this interface <20>ýӿڵı<DAB5><C4B1><EFBFBD>*/
|
||||||
|
u8_t num;
|
||||||
|
#if LWIP_SNMP
|
||||||
|
/** link type (from "snmp_ifType" enum from snmp.h) */
|
||||||
|
u8_t link_type;
|
||||||
|
/** (estimate) link speed */
|
||||||
|
u32_t link_speed;
|
||||||
|
/** timestamp at last change made (up/down) */
|
||||||
|
u32_t ts;
|
||||||
|
/** counters */
|
||||||
|
u32_t ifinoctets;
|
||||||
|
u32_t ifinucastpkts;
|
||||||
|
u32_t ifinnucastpkts;
|
||||||
|
u32_t ifindiscards;
|
||||||
|
u32_t ifoutoctets;
|
||||||
|
u32_t ifoutucastpkts;
|
||||||
|
u32_t ifoutnucastpkts;
|
||||||
|
u32_t ifoutdiscards;
|
||||||
|
#endif /* LWIP_SNMP */
|
||||||
|
#if LWIP_IGMP
|
||||||
|
/** This function could be called to add or delete a entry in the multicast
|
||||||
|
filter table of the ethernet MAC.*/
|
||||||
|
netif_igmp_mac_filter_fn igmp_mac_filter;
|
||||||
|
#endif /* LWIP_IGMP */
|
||||||
|
#if LWIP_NETIF_HWADDRHINT
|
||||||
|
u8_t *addr_hint;
|
||||||
|
#endif /* LWIP_NETIF_HWADDRHINT */
|
||||||
|
#if ENABLE_LOOPBACK
|
||||||
|
/* List of packets to be queued for ourselves. ָ<><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><CDB8>Լ<EFBFBD><D4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD><DDB0><EFBFBD>pbuf*/
|
||||||
|
struct pbuf *loop_first;//<2F><>һ<EFBFBD><D2BB>
|
||||||
|
struct pbuf *loop_last;//<2F><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>
|
||||||
|
#if LWIP_LOOPBACK_MAX_PBUFS
|
||||||
|
u16_t loop_cnt_current;
|
||||||
|
#endif /* LWIP_LOOPBACK_MAX_PBUFS */
|
||||||
|
#endif /* ENABLE_LOOPBACK */
|
||||||
|
};
|
||||||
|
|
||||||
|
#if LWIP_SNMP
|
||||||
|
#define NETIF_INIT_SNMP(netif, type, speed) \
|
||||||
|
/* use "snmp_ifType" enum from snmp.h for "type", snmp_ifType_ethernet_csmacd by example */ \
|
||||||
|
(netif)->link_type = (type); \
|
||||||
|
/* your link speed here (units: bits per second) */ \
|
||||||
|
(netif)->link_speed = (speed); \
|
||||||
|
(netif)->ts = 0; \
|
||||||
|
(netif)->ifinoctets = 0; \
|
||||||
|
(netif)->ifinucastpkts = 0; \
|
||||||
|
(netif)->ifinnucastpkts = 0; \
|
||||||
|
(netif)->ifindiscards = 0; \
|
||||||
|
(netif)->ifoutoctets = 0; \
|
||||||
|
(netif)->ifoutucastpkts = 0; \
|
||||||
|
(netif)->ifoutnucastpkts = 0; \
|
||||||
|
(netif)->ifoutdiscards = 0
|
||||||
|
#else /* LWIP_SNMP */
|
||||||
|
#define NETIF_INIT_SNMP(netif, type, speed)
|
||||||
|
#endif /* LWIP_SNMP */
|
||||||
|
|
||||||
|
|
||||||
|
/** The list of network interfaces. */
|
||||||
|
extern struct netif *netif_list;
|
||||||
|
/** The default network interface. */
|
||||||
|
extern struct netif *netif_default;
|
||||||
|
|
||||||
|
void netif_init(void)ICACHE_FLASH_ATTR;
|
||||||
|
|
||||||
|
struct netif *netif_add(struct netif *netif, ip_addr_t *ipaddr, ip_addr_t *netmask,
|
||||||
|
ip_addr_t *gw, void *state, netif_init_fn init, netif_input_fn input)ICACHE_FLASH_ATTR;
|
||||||
|
|
||||||
|
void
|
||||||
|
netif_set_addr(struct netif *netif, ip_addr_t *ipaddr, ip_addr_t *netmask,
|
||||||
|
ip_addr_t *gw)ICACHE_FLASH_ATTR;
|
||||||
|
void netif_remove(struct netif * netif)ICACHE_FLASH_ATTR;
|
||||||
|
|
||||||
|
/* Returns a network interface given its name. The name is of the form
|
||||||
|
"et0", where the first two letters are the "name" field in the
|
||||||
|
netif structure, and the digit is in the num field in the same
|
||||||
|
structure. */
|
||||||
|
struct netif *netif_find(char *name)ICACHE_FLASH_ATTR;
|
||||||
|
|
||||||
|
void netif_set_default(struct netif *netif)ICACHE_FLASH_ATTR;
|
||||||
|
|
||||||
|
void netif_set_ipaddr(struct netif *netif, ip_addr_t *ipaddr)ICACHE_FLASH_ATTR;
|
||||||
|
void netif_set_netmask(struct netif *netif, ip_addr_t *netmask)ICACHE_FLASH_ATTR;
|
||||||
|
void netif_set_gw(struct netif *netif, ip_addr_t *gw)ICACHE_FLASH_ATTR;
|
||||||
|
|
||||||
|
void netif_set_up(struct netif *netif)ICACHE_FLASH_ATTR;
|
||||||
|
void netif_set_down(struct netif *netif)ICACHE_FLASH_ATTR;
|
||||||
|
/** Ask if an interface is up */
|
||||||
|
#define netif_is_up(netif) (((netif)->flags & NETIF_FLAG_UP) ? (u8_t)1 : (u8_t)0)
|
||||||
|
|
||||||
|
#if LWIP_NETIF_STATUS_CALLBACK
|
||||||
|
void netif_set_status_callback(struct netif *netif, netif_status_callback_fn status_callback)ICACHE_FLASH_ATTR;
|
||||||
|
#endif /* LWIP_NETIF_STATUS_CALLBACK */
|
||||||
|
|
||||||
|
void netif_set_link_up(struct netif *netif)ICACHE_FLASH_ATTR;
|
||||||
|
void netif_set_link_down(struct netif *netif)ICACHE_FLASH_ATTR;
|
||||||
|
/** Ask if a link is up */
|
||||||
|
#define netif_is_link_up(netif) (((netif)->flags & NETIF_FLAG_LINK_UP) ? (u8_t)1 : (u8_t)0)
|
||||||
|
|
||||||
|
#if LWIP_NETIF_LINK_CALLBACK
|
||||||
|
void netif_set_link_callback(struct netif *netif, netif_status_callback_fn link_callback)ICACHE_FLASH_ATTR;
|
||||||
|
#endif /* LWIP_NETIF_LINK_CALLBACK */
|
||||||
|
|
||||||
|
#if LWIP_NETIF_HOSTNAME
|
||||||
|
#define netif_set_hostname(netif, name) do { if((netif) != NULL) { (netif)->hostname = name; }}while(0)
|
||||||
|
#define netif_get_hostname(netif) (((netif) != NULL) ? ((netif)->hostname) : NULL)
|
||||||
|
#endif /* LWIP_NETIF_HOSTNAME */
|
||||||
|
|
||||||
|
#if LWIP_IGMP
|
||||||
|
#define netif_set_igmp_mac_filter(netif, function) do { if((netif) != NULL) { (netif)->igmp_mac_filter = function; }}while(0)
|
||||||
|
#define netif_get_igmp_mac_filter(netif) (((netif) != NULL) ? ((netif)->igmp_mac_filter) : NULL)
|
||||||
|
#endif /* LWIP_IGMP */
|
||||||
|
|
||||||
|
#if ENABLE_LOOPBACK
|
||||||
|
err_t netif_loop_output(struct netif *netif, struct pbuf *p, ip_addr_t *dest_ip)ICACHE_FLASH_ATTR;
|
||||||
|
void netif_poll(struct netif *netif)ICACHE_FLASH_ATTR;
|
||||||
|
#if !LWIP_NETIF_LOOPBACK_MULTITHREADING
|
||||||
|
void netif_poll_all(void)ICACHE_FLASH_ATTR;
|
||||||
|
#endif /* !LWIP_NETIF_LOOPBACK_MULTITHREADING */
|
||||||
|
#endif /* ENABLE_LOOPBACK */
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* __LWIP_NETIF_H__ */
|
108
app/include/lwip/netifapi.h
Normal file
108
app/include/lwip/netifapi.h
Normal file
@ -0,0 +1,108 @@
|
|||||||
|
/*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* This file is part of the lwIP TCP/IP stack.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __LWIP_NETIFAPI_H__
|
||||||
|
#define __LWIP_NETIFAPI_H__
|
||||||
|
|
||||||
|
#include "lwip/opt.h"
|
||||||
|
|
||||||
|
#if LWIP_NETIF_API /* don't build if not configured for use in lwipopts.h */
|
||||||
|
|
||||||
|
#include "lwip/sys.h"
|
||||||
|
#include "lwip/netif.h"
|
||||||
|
#include "lwip/dhcp.h"
|
||||||
|
#include "lwip/autoip.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
typedef void (*netifapi_void_fn)(struct netif *netif);
|
||||||
|
typedef err_t (*netifapi_errt_fn)(struct netif *netif);
|
||||||
|
|
||||||
|
struct netifapi_msg_msg {
|
||||||
|
#if !LWIP_TCPIP_CORE_LOCKING
|
||||||
|
sys_sem_t sem;
|
||||||
|
#endif /* !LWIP_TCPIP_CORE_LOCKING */
|
||||||
|
err_t err;
|
||||||
|
struct netif *netif;
|
||||||
|
union {
|
||||||
|
struct {
|
||||||
|
ip_addr_t *ipaddr;
|
||||||
|
ip_addr_t *netmask;
|
||||||
|
ip_addr_t *gw;
|
||||||
|
void *state;
|
||||||
|
netif_init_fn init;
|
||||||
|
netif_input_fn input;
|
||||||
|
} add;
|
||||||
|
struct {
|
||||||
|
netifapi_void_fn voidfunc;
|
||||||
|
netifapi_errt_fn errtfunc;
|
||||||
|
} common;
|
||||||
|
} msg;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct netifapi_msg {
|
||||||
|
void (* function)(struct netifapi_msg_msg *msg);
|
||||||
|
struct netifapi_msg_msg msg;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/* API for application */
|
||||||
|
err_t netifapi_netif_add ( struct netif *netif,
|
||||||
|
ip_addr_t *ipaddr,
|
||||||
|
ip_addr_t *netmask,
|
||||||
|
ip_addr_t *gw,
|
||||||
|
void *state,
|
||||||
|
netif_init_fn init,
|
||||||
|
netif_input_fn input);
|
||||||
|
|
||||||
|
err_t netifapi_netif_set_addr ( struct netif *netif,
|
||||||
|
ip_addr_t *ipaddr,
|
||||||
|
ip_addr_t *netmask,
|
||||||
|
ip_addr_t *gw );
|
||||||
|
|
||||||
|
err_t netifapi_netif_common ( struct netif *netif,
|
||||||
|
netifapi_void_fn voidfunc,
|
||||||
|
netifapi_errt_fn errtfunc);
|
||||||
|
|
||||||
|
#define netifapi_netif_remove(n) netifapi_netif_common(n, netif_remove, NULL)
|
||||||
|
#define netifapi_netif_set_up(n) netifapi_netif_common(n, netif_set_up, NULL)
|
||||||
|
#define netifapi_netif_set_down(n) netifapi_netif_common(n, netif_set_down, NULL)
|
||||||
|
#define netifapi_netif_set_default(n) netifapi_netif_common(n, netif_set_default, NULL)
|
||||||
|
#define netifapi_dhcp_start(n) netifapi_netif_common(n, NULL, dhcp_start)
|
||||||
|
#define netifapi_dhcp_stop(n) netifapi_netif_common(n, dhcp_stop, NULL)
|
||||||
|
#define netifapi_autoip_start(n) netifapi_netif_common(n, NULL, autoip_start)
|
||||||
|
#define netifapi_autoip_stop(n) netifapi_netif_common(n, NULL, autoip_stop)
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* LWIP_NETIF_API */
|
||||||
|
|
||||||
|
#endif /* __LWIP_NETIFAPI_H__ */
|
2043
app/include/lwip/opt.h
Normal file
2043
app/include/lwip/opt.h
Normal file
File diff suppressed because it is too large
Load Diff
160
app/include/lwip/pbuf.h
Normal file
160
app/include/lwip/pbuf.h
Normal file
@ -0,0 +1,160 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2001-2004 Swedish Institute of Computer Science.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* This file is part of the lwIP TCP/IP stack.
|
||||||
|
*
|
||||||
|
* Author: Adam Dunkels <adam@sics.se>
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __LWIP_PBUF_H__
|
||||||
|
#define __LWIP_PBUF_H__
|
||||||
|
|
||||||
|
#include "lwip/opt.h"
|
||||||
|
#include "lwip/err.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/** Currently, the pbuf_custom code is only needed for one specific configuration
|
||||||
|
* of IP_FRAG */
|
||||||
|
#define LWIP_SUPPORT_CUSTOM_PBUF (IP_FRAG && !IP_FRAG_USES_STATIC_BUF && !LWIP_NETIF_TX_SINGLE_PBUF)
|
||||||
|
|
||||||
|
#define PBUF_TRANSPORT_HLEN 20
|
||||||
|
#define PBUF_IP_HLEN 20
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
PBUF_TRANSPORT,
|
||||||
|
PBUF_IP,
|
||||||
|
PBUF_LINK,
|
||||||
|
PBUF_RAW
|
||||||
|
} pbuf_layer;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
PBUF_RAM, /* pbuf data is stored in RAM */
|
||||||
|
PBUF_ROM, /* pbuf data is stored in ROM */
|
||||||
|
PBUF_REF, /* pbuf comes from the pbuf pool */
|
||||||
|
PBUF_POOL, /* pbuf payload refers to RAM */
|
||||||
|
#ifdef EBUF_LWIP
|
||||||
|
PBUF_ESF_RX /* pbuf payload is from WLAN */
|
||||||
|
#endif /* ESF_LWIP */
|
||||||
|
} pbuf_type;
|
||||||
|
|
||||||
|
|
||||||
|
/** indicates this packet's data should be immediately passed to the application */
|
||||||
|
#define PBUF_FLAG_PUSH 0x01U
|
||||||
|
/** indicates this is a custom pbuf: pbuf_free and pbuf_header handle such a
|
||||||
|
a pbuf differently */
|
||||||
|
#define PBUF_FLAG_IS_CUSTOM 0x02U
|
||||||
|
/** indicates this pbuf is UDP multicast to be looped back */
|
||||||
|
#define PBUF_FLAG_MCASTLOOP 0x04U
|
||||||
|
|
||||||
|
struct pbuf {
|
||||||
|
/** next pbuf in singly linked pbuf chain */
|
||||||
|
struct pbuf *next;
|
||||||
|
|
||||||
|
/** pointer to the actual data in the buffer */
|
||||||
|
void *payload;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* total length of this buffer and all next buffers in chain
|
||||||
|
* belonging to the same packet.
|
||||||
|
*
|
||||||
|
* For non-queue packet chains this is the invariant:
|
||||||
|
* p->tot_len == p->len + (p->next? p->next->tot_len: 0)
|
||||||
|
*/
|
||||||
|
u16_t tot_len;
|
||||||
|
|
||||||
|
/** length of this buffer */
|
||||||
|
u16_t len;
|
||||||
|
|
||||||
|
/** pbuf_type as u8_t instead of enum to save space */
|
||||||
|
u8_t /*pbuf_type*/ type;
|
||||||
|
|
||||||
|
/** misc flags */
|
||||||
|
u8_t flags;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* the reference count always equals the number of pointers
|
||||||
|
* that refer to this pbuf. This can be pointers from an application,
|
||||||
|
* the stack itself, or pbuf->next pointers from a chain.
|
||||||
|
*/
|
||||||
|
u16_t ref;
|
||||||
|
|
||||||
|
/* add a pointer for esf_buf */
|
||||||
|
void * eb;
|
||||||
|
};
|
||||||
|
|
||||||
|
#if LWIP_SUPPORT_CUSTOM_PBUF
|
||||||
|
/** Prototype for a function to free a custom pbuf */
|
||||||
|
typedef void (*pbuf_free_custom_fn)(struct pbuf *p);
|
||||||
|
|
||||||
|
/** A custom pbuf: like a pbuf, but following a function pointer to free it. */
|
||||||
|
struct pbuf_custom {
|
||||||
|
/** The actual pbuf */
|
||||||
|
struct pbuf pbuf;
|
||||||
|
/** This function is called when pbuf_free deallocates this pbuf(_custom) */
|
||||||
|
pbuf_free_custom_fn custom_free_function;
|
||||||
|
};
|
||||||
|
#endif /* LWIP_SUPPORT_CUSTOM_PBUF */
|
||||||
|
|
||||||
|
/* Initializes the pbuf module. This call is empty for now, but may not be in future. */
|
||||||
|
#define pbuf_init()
|
||||||
|
|
||||||
|
struct pbuf *pbuf_alloc(pbuf_layer l, u16_t length, pbuf_type type)ICACHE_FLASH_ATTR;
|
||||||
|
#if LWIP_SUPPORT_CUSTOM_PBUF
|
||||||
|
struct pbuf *pbuf_alloced_custom(pbuf_layer l, u16_t length, pbuf_type type,
|
||||||
|
struct pbuf_custom *p, void *payload_mem,
|
||||||
|
u16_t payload_mem_len)ICACHE_FLASH_ATTR;
|
||||||
|
#endif /* LWIP_SUPPORT_CUSTOM_PBUF */
|
||||||
|
void pbuf_realloc(struct pbuf *p, u16_t size)ICACHE_FLASH_ATTR;
|
||||||
|
u8_t pbuf_header(struct pbuf *p, s16_t header_size)ICACHE_FLASH_ATTR;
|
||||||
|
void pbuf_ref(struct pbuf *p)ICACHE_FLASH_ATTR;
|
||||||
|
u8_t pbuf_free(struct pbuf *p)ICACHE_FLASH_ATTR;
|
||||||
|
u8_t pbuf_clen(struct pbuf *p)ICACHE_FLASH_ATTR;
|
||||||
|
void pbuf_cat(struct pbuf *head, struct pbuf *tail)ICACHE_FLASH_ATTR;
|
||||||
|
void pbuf_chain(struct pbuf *head, struct pbuf *tail)ICACHE_FLASH_ATTR;
|
||||||
|
struct pbuf *pbuf_dechain(struct pbuf *p)ICACHE_FLASH_ATTR;
|
||||||
|
err_t pbuf_copy(struct pbuf *p_to, struct pbuf *p_from)ICACHE_FLASH_ATTR;
|
||||||
|
u16_t pbuf_copy_partial(struct pbuf *p, void *dataptr, u16_t len, u16_t offset)ICACHE_FLASH_ATTR;
|
||||||
|
err_t pbuf_take(struct pbuf *buf, const void *dataptr, u16_t len)ICACHE_FLASH_ATTR;
|
||||||
|
struct pbuf *pbuf_coalesce(struct pbuf *p, pbuf_layer layer)ICACHE_FLASH_ATTR;
|
||||||
|
#if LWIP_CHECKSUM_ON_COPY
|
||||||
|
err_t pbuf_fill_chksum(struct pbuf *p, u16_t start_offset, const void *dataptr,
|
||||||
|
u16_t len, u16_t *chksum)ICACHE_FLASH_ATTR;
|
||||||
|
#endif /* LWIP_CHECKSUM_ON_COPY */
|
||||||
|
|
||||||
|
u8_t pbuf_get_at(struct pbuf* p, u16_t offset)ICACHE_FLASH_ATTR;
|
||||||
|
u16_t pbuf_memcmp(struct pbuf* p, u16_t offset, const void* s2, u16_t n)ICACHE_FLASH_ATTR;
|
||||||
|
u16_t pbuf_memfind(struct pbuf* p, const void* mem, u16_t mem_len, u16_t start_offset)ICACHE_FLASH_ATTR;
|
||||||
|
u16_t pbuf_strstr(struct pbuf* p, const char* substr)ICACHE_FLASH_ATTR;
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* __LWIP_PBUF_H__ */
|
98
app/include/lwip/raw.h
Normal file
98
app/include/lwip/raw.h
Normal file
@ -0,0 +1,98 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2001-2004 Swedish Institute of Computer Science.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* This file is part of the lwIP TCP/IP stack.
|
||||||
|
*
|
||||||
|
* Author: Adam Dunkels <adam@sics.se>
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#ifndef __LWIP_RAW_H__
|
||||||
|
#define __LWIP_RAW_H__
|
||||||
|
|
||||||
|
#include "lwip/opt.h"
|
||||||
|
|
||||||
|
#if LWIP_RAW /* don't build if not configured for use in lwipopts.h */
|
||||||
|
|
||||||
|
#include "lwip/pbuf.h"
|
||||||
|
#include "lwip/def.h"
|
||||||
|
#include "lwip/ip.h"
|
||||||
|
#include "lwip/ip_addr.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
struct raw_pcb;
|
||||||
|
|
||||||
|
/** Function prototype for raw pcb receive callback functions.
|
||||||
|
* @param arg user supplied argument (raw_pcb.recv_arg)
|
||||||
|
* @param pcb the raw_pcb which received data
|
||||||
|
* @param p the packet buffer that was received
|
||||||
|
* @param addr the remote IP address from which the packet was received
|
||||||
|
* @return 1 if the packet was 'eaten' (aka. deleted),
|
||||||
|
* 0 if the packet lives on
|
||||||
|
* If returning 1, the callback is responsible for freeing the pbuf
|
||||||
|
* if it's not used any more.
|
||||||
|
*/
|
||||||
|
typedef u8_t (*raw_recv_fn)(void *arg, struct raw_pcb *pcb, struct pbuf *p,
|
||||||
|
ip_addr_t *addr);
|
||||||
|
|
||||||
|
struct raw_pcb {
|
||||||
|
/* Common members of all PCB types */
|
||||||
|
IP_PCB;
|
||||||
|
|
||||||
|
struct raw_pcb *next;
|
||||||
|
|
||||||
|
u8_t protocol;
|
||||||
|
|
||||||
|
/** receive callback function */
|
||||||
|
raw_recv_fn recv;
|
||||||
|
/* user-supplied argument for the recv callback */
|
||||||
|
void *recv_arg;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* The following functions is the application layer interface to the
|
||||||
|
RAW code. */
|
||||||
|
struct raw_pcb * raw_new (u8_t proto)ICACHE_FLASH_ATTR;
|
||||||
|
void raw_remove (struct raw_pcb *pcb)ICACHE_FLASH_ATTR;
|
||||||
|
err_t raw_bind (struct raw_pcb *pcb, ip_addr_t *ipaddr)ICACHE_FLASH_ATTR;
|
||||||
|
err_t raw_connect (struct raw_pcb *pcb, ip_addr_t *ipaddr)ICACHE_FLASH_ATTR;
|
||||||
|
|
||||||
|
void raw_recv (struct raw_pcb *pcb, raw_recv_fn recv, void *recv_arg)ICACHE_FLASH_ATTR;
|
||||||
|
err_t raw_sendto (struct raw_pcb *pcb, struct pbuf *p, ip_addr_t *ipaddr)ICACHE_FLASH_ATTR;
|
||||||
|
err_t raw_send (struct raw_pcb *pcb, struct pbuf *p);
|
||||||
|
|
||||||
|
/* The following functions are the lower layer interface to RAW. */
|
||||||
|
u8_t raw_input (struct pbuf *p, struct netif *inp)ICACHE_FLASH_ATTR;
|
||||||
|
#define raw_init() /* Compatibility define, not init needed. */
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* LWIP_RAW */
|
||||||
|
|
||||||
|
#endif /* __LWIP_RAW_H__ */
|
141
app/include/lwip/sio.h
Normal file
141
app/include/lwip/sio.h
Normal file
@ -0,0 +1,141 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2001-2004 Swedish Institute of Computer Science.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* This file is part of the lwIP TCP/IP stack.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This is the interface to the platform specific serial IO module
|
||||||
|
* It needs to be implemented by those platforms which need SLIP or PPP
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __SIO_H__
|
||||||
|
#define __SIO_H__
|
||||||
|
|
||||||
|
#include "lwip/arch.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* If you want to define sio_fd_t elsewhere or differently,
|
||||||
|
define this in your cc.h file. */
|
||||||
|
#ifndef __sio_fd_t_defined
|
||||||
|
typedef void * sio_fd_t;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* The following functions can be defined to something else in your cc.h file
|
||||||
|
or be implemented in your custom sio.c file. */
|
||||||
|
|
||||||
|
#ifndef sio_open
|
||||||
|
/**
|
||||||
|
* Opens a serial device for communication.
|
||||||
|
*
|
||||||
|
* @param devnum device number
|
||||||
|
* @return handle to serial device if successful, NULL otherwise
|
||||||
|
*/
|
||||||
|
sio_fd_t sio_open(u8_t devnum)ICACHE_FLASH_ATTR;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef sio_send
|
||||||
|
/**
|
||||||
|
* Sends a single character to the serial device.
|
||||||
|
*
|
||||||
|
* @param c character to send
|
||||||
|
* @param fd serial device handle
|
||||||
|
*
|
||||||
|
* @note This function will block until the character can be sent.
|
||||||
|
*/
|
||||||
|
void sio_send(u8_t c, sio_fd_t fd)ICACHE_FLASH_ATTR;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef sio_recv
|
||||||
|
/**
|
||||||
|
* Receives a single character from the serial device.
|
||||||
|
*
|
||||||
|
* @param fd serial device handle
|
||||||
|
*
|
||||||
|
* @note This function will block until a character is received.
|
||||||
|
*/
|
||||||
|
u8_t sio_recv(sio_fd_t fd)ICACHE_FLASH_ATTR;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef sio_read
|
||||||
|
/**
|
||||||
|
* Reads from the serial device.
|
||||||
|
*
|
||||||
|
* @param fd serial device handle
|
||||||
|
* @param data pointer to data buffer for receiving
|
||||||
|
* @param len maximum length (in bytes) of data to receive
|
||||||
|
* @return number of bytes actually received - may be 0 if aborted by sio_read_abort
|
||||||
|
*
|
||||||
|
* @note This function will block until data can be received. The blocking
|
||||||
|
* can be cancelled by calling sio_read_abort().
|
||||||
|
*/
|
||||||
|
u32_t sio_read(sio_fd_t fd, u8_t *data, u32_t len)ICACHE_FLASH_ATTR;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef sio_tryread
|
||||||
|
/**
|
||||||
|
* Tries to read from the serial device. Same as sio_read but returns
|
||||||
|
* immediately if no data is available and never blocks.
|
||||||
|
*
|
||||||
|
* @param fd serial device handle
|
||||||
|
* @param data pointer to data buffer for receiving
|
||||||
|
* @param len maximum length (in bytes) of data to receive
|
||||||
|
* @return number of bytes actually received
|
||||||
|
*/
|
||||||
|
u32_t sio_tryread(sio_fd_t fd, u8_t *data, u32_t len)ICACHE_FLASH_ATTR;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef sio_write
|
||||||
|
/**
|
||||||
|
* Writes to the serial device.
|
||||||
|
*
|
||||||
|
* @param fd serial device handle
|
||||||
|
* @param data pointer to data to send
|
||||||
|
* @param len length (in bytes) of data to send
|
||||||
|
* @return number of bytes actually sent
|
||||||
|
*
|
||||||
|
* @note This function will block until all data can be sent.
|
||||||
|
*/
|
||||||
|
u32_t sio_write(sio_fd_t fd, u8_t *data, u32_t len)ICACHE_FLASH_ATTR;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef sio_read_abort
|
||||||
|
/**
|
||||||
|
* Aborts a blocking sio_read() call.
|
||||||
|
*
|
||||||
|
* @param fd serial device handle
|
||||||
|
*/
|
||||||
|
void sio_read_abort(sio_fd_t fd)ICACHE_FLASH_ATTR;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* __SIO_H__ */
|
367
app/include/lwip/snmp.h
Normal file
367
app/include/lwip/snmp.h
Normal file
@ -0,0 +1,367 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2001, 2002 Leon Woestenberg <leon.woestenberg@axon.tv>
|
||||||
|
* Copyright (c) 2001, 2002 Axon Digital Design B.V., The Netherlands.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* This file is part of the lwIP TCP/IP stack.
|
||||||
|
*
|
||||||
|
* Author: Leon Woestenberg <leon.woestenberg@axon.tv>
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#ifndef __LWIP_SNMP_H__
|
||||||
|
#define __LWIP_SNMP_H__
|
||||||
|
|
||||||
|
#include "lwip/opt.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "lwip/ip_addr.h"
|
||||||
|
|
||||||
|
struct udp_pcb;
|
||||||
|
struct netif;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see RFC1213, "MIB-II, 6. Definitions"
|
||||||
|
*/
|
||||||
|
enum snmp_ifType {
|
||||||
|
snmp_ifType_other=1, /* none of the following */
|
||||||
|
snmp_ifType_regular1822,
|
||||||
|
snmp_ifType_hdh1822,
|
||||||
|
snmp_ifType_ddn_x25,
|
||||||
|
snmp_ifType_rfc877_x25,
|
||||||
|
snmp_ifType_ethernet_csmacd,
|
||||||
|
snmp_ifType_iso88023_csmacd,
|
||||||
|
snmp_ifType_iso88024_tokenBus,
|
||||||
|
snmp_ifType_iso88025_tokenRing,
|
||||||
|
snmp_ifType_iso88026_man,
|
||||||
|
snmp_ifType_starLan,
|
||||||
|
snmp_ifType_proteon_10Mbit,
|
||||||
|
snmp_ifType_proteon_80Mbit,
|
||||||
|
snmp_ifType_hyperchannel,
|
||||||
|
snmp_ifType_fddi,
|
||||||
|
snmp_ifType_lapb,
|
||||||
|
snmp_ifType_sdlc,
|
||||||
|
snmp_ifType_ds1, /* T-1 */
|
||||||
|
snmp_ifType_e1, /* european equiv. of T-1 */
|
||||||
|
snmp_ifType_basicISDN,
|
||||||
|
snmp_ifType_primaryISDN, /* proprietary serial */
|
||||||
|
snmp_ifType_propPointToPointSerial,
|
||||||
|
snmp_ifType_ppp,
|
||||||
|
snmp_ifType_softwareLoopback,
|
||||||
|
snmp_ifType_eon, /* CLNP over IP [11] */
|
||||||
|
snmp_ifType_ethernet_3Mbit,
|
||||||
|
snmp_ifType_nsip, /* XNS over IP */
|
||||||
|
snmp_ifType_slip, /* generic SLIP */
|
||||||
|
snmp_ifType_ultra, /* ULTRA technologies */
|
||||||
|
snmp_ifType_ds3, /* T-3 */
|
||||||
|
snmp_ifType_sip, /* SMDS */
|
||||||
|
snmp_ifType_frame_relay
|
||||||
|
};
|
||||||
|
|
||||||
|
#if LWIP_SNMP /* don't build if not configured for use in lwipopts.h */
|
||||||
|
|
||||||
|
/** SNMP "sysuptime" Interval */
|
||||||
|
#define SNMP_SYSUPTIME_INTERVAL 10
|
||||||
|
|
||||||
|
/** fixed maximum length for object identifier type */
|
||||||
|
#define LWIP_SNMP_OBJ_ID_LEN 32
|
||||||
|
|
||||||
|
/** internal object identifier representation */
|
||||||
|
struct snmp_obj_id
|
||||||
|
{
|
||||||
|
u8_t len;
|
||||||
|
s32_t id[LWIP_SNMP_OBJ_ID_LEN];
|
||||||
|
};
|
||||||
|
|
||||||
|
/* system */
|
||||||
|
void snmp_set_sysdesr(u8_t* str, u8_t* len);
|
||||||
|
void snmp_set_sysobjid(struct snmp_obj_id *oid);
|
||||||
|
void snmp_get_sysobjid_ptr(struct snmp_obj_id **oid);
|
||||||
|
void snmp_inc_sysuptime(void);
|
||||||
|
void snmp_add_sysuptime(u32_t value);
|
||||||
|
void snmp_get_sysuptime(u32_t *value);
|
||||||
|
void snmp_set_syscontact(u8_t *ocstr, u8_t *ocstrlen);
|
||||||
|
void snmp_set_sysname(u8_t *ocstr, u8_t *ocstrlen);
|
||||||
|
void snmp_set_syslocation(u8_t *ocstr, u8_t *ocstrlen);
|
||||||
|
|
||||||
|
/* network interface */
|
||||||
|
void snmp_add_ifinoctets(struct netif *ni, u32_t value);
|
||||||
|
void snmp_inc_ifinucastpkts(struct netif *ni);
|
||||||
|
void snmp_inc_ifinnucastpkts(struct netif *ni);
|
||||||
|
void snmp_inc_ifindiscards(struct netif *ni);
|
||||||
|
void snmp_add_ifoutoctets(struct netif *ni, u32_t value);
|
||||||
|
void snmp_inc_ifoutucastpkts(struct netif *ni);
|
||||||
|
void snmp_inc_ifoutnucastpkts(struct netif *ni);
|
||||||
|
void snmp_inc_ifoutdiscards(struct netif *ni);
|
||||||
|
void snmp_inc_iflist(void);
|
||||||
|
void snmp_dec_iflist(void);
|
||||||
|
|
||||||
|
/* ARP (for atTable and ipNetToMediaTable) */
|
||||||
|
void snmp_insert_arpidx_tree(struct netif *ni, ip_addr_t *ip);
|
||||||
|
void snmp_delete_arpidx_tree(struct netif *ni, ip_addr_t *ip);
|
||||||
|
|
||||||
|
/* IP */
|
||||||
|
void snmp_inc_ipinreceives(void);
|
||||||
|
void snmp_inc_ipinhdrerrors(void);
|
||||||
|
void snmp_inc_ipinaddrerrors(void);
|
||||||
|
void snmp_inc_ipforwdatagrams(void);
|
||||||
|
void snmp_inc_ipinunknownprotos(void);
|
||||||
|
void snmp_inc_ipindiscards(void);
|
||||||
|
void snmp_inc_ipindelivers(void);
|
||||||
|
void snmp_inc_ipoutrequests(void);
|
||||||
|
void snmp_inc_ipoutdiscards(void);
|
||||||
|
void snmp_inc_ipoutnoroutes(void);
|
||||||
|
void snmp_inc_ipreasmreqds(void);
|
||||||
|
void snmp_inc_ipreasmoks(void);
|
||||||
|
void snmp_inc_ipreasmfails(void);
|
||||||
|
void snmp_inc_ipfragoks(void);
|
||||||
|
void snmp_inc_ipfragfails(void);
|
||||||
|
void snmp_inc_ipfragcreates(void);
|
||||||
|
void snmp_inc_iproutingdiscards(void);
|
||||||
|
void snmp_insert_ipaddridx_tree(struct netif *ni);
|
||||||
|
void snmp_delete_ipaddridx_tree(struct netif *ni);
|
||||||
|
void snmp_insert_iprteidx_tree(u8_t dflt, struct netif *ni);
|
||||||
|
void snmp_delete_iprteidx_tree(u8_t dflt, struct netif *ni);
|
||||||
|
|
||||||
|
/* ICMP */
|
||||||
|
void snmp_inc_icmpinmsgs(void);
|
||||||
|
void snmp_inc_icmpinerrors(void);
|
||||||
|
void snmp_inc_icmpindestunreachs(void);
|
||||||
|
void snmp_inc_icmpintimeexcds(void);
|
||||||
|
void snmp_inc_icmpinparmprobs(void);
|
||||||
|
void snmp_inc_icmpinsrcquenchs(void);
|
||||||
|
void snmp_inc_icmpinredirects(void);
|
||||||
|
void snmp_inc_icmpinechos(void);
|
||||||
|
void snmp_inc_icmpinechoreps(void);
|
||||||
|
void snmp_inc_icmpintimestamps(void);
|
||||||
|
void snmp_inc_icmpintimestampreps(void);
|
||||||
|
void snmp_inc_icmpinaddrmasks(void);
|
||||||
|
void snmp_inc_icmpinaddrmaskreps(void);
|
||||||
|
void snmp_inc_icmpoutmsgs(void);
|
||||||
|
void snmp_inc_icmpouterrors(void);
|
||||||
|
void snmp_inc_icmpoutdestunreachs(void);
|
||||||
|
void snmp_inc_icmpouttimeexcds(void);
|
||||||
|
void snmp_inc_icmpoutparmprobs(void);
|
||||||
|
void snmp_inc_icmpoutsrcquenchs(void);
|
||||||
|
void snmp_inc_icmpoutredirects(void);
|
||||||
|
void snmp_inc_icmpoutechos(void);
|
||||||
|
void snmp_inc_icmpoutechoreps(void);
|
||||||
|
void snmp_inc_icmpouttimestamps(void);
|
||||||
|
void snmp_inc_icmpouttimestampreps(void);
|
||||||
|
void snmp_inc_icmpoutaddrmasks(void);
|
||||||
|
void snmp_inc_icmpoutaddrmaskreps(void);
|
||||||
|
|
||||||
|
/* TCP */
|
||||||
|
void snmp_inc_tcpactiveopens(void);
|
||||||
|
void snmp_inc_tcppassiveopens(void);
|
||||||
|
void snmp_inc_tcpattemptfails(void);
|
||||||
|
void snmp_inc_tcpestabresets(void);
|
||||||
|
void snmp_inc_tcpinsegs(void);
|
||||||
|
void snmp_inc_tcpoutsegs(void);
|
||||||
|
void snmp_inc_tcpretranssegs(void);
|
||||||
|
void snmp_inc_tcpinerrs(void);
|
||||||
|
void snmp_inc_tcpoutrsts(void);
|
||||||
|
|
||||||
|
/* UDP */
|
||||||
|
void snmp_inc_udpindatagrams(void);
|
||||||
|
void snmp_inc_udpnoports(void);
|
||||||
|
void snmp_inc_udpinerrors(void);
|
||||||
|
void snmp_inc_udpoutdatagrams(void);
|
||||||
|
void snmp_insert_udpidx_tree(struct udp_pcb *pcb);
|
||||||
|
void snmp_delete_udpidx_tree(struct udp_pcb *pcb);
|
||||||
|
|
||||||
|
/* SNMP */
|
||||||
|
void snmp_inc_snmpinpkts(void);
|
||||||
|
void snmp_inc_snmpoutpkts(void);
|
||||||
|
void snmp_inc_snmpinbadversions(void);
|
||||||
|
void snmp_inc_snmpinbadcommunitynames(void);
|
||||||
|
void snmp_inc_snmpinbadcommunityuses(void);
|
||||||
|
void snmp_inc_snmpinasnparseerrs(void);
|
||||||
|
void snmp_inc_snmpintoobigs(void);
|
||||||
|
void snmp_inc_snmpinnosuchnames(void);
|
||||||
|
void snmp_inc_snmpinbadvalues(void);
|
||||||
|
void snmp_inc_snmpinreadonlys(void);
|
||||||
|
void snmp_inc_snmpingenerrs(void);
|
||||||
|
void snmp_add_snmpintotalreqvars(u8_t value);
|
||||||
|
void snmp_add_snmpintotalsetvars(u8_t value);
|
||||||
|
void snmp_inc_snmpingetrequests(void);
|
||||||
|
void snmp_inc_snmpingetnexts(void);
|
||||||
|
void snmp_inc_snmpinsetrequests(void);
|
||||||
|
void snmp_inc_snmpingetresponses(void);
|
||||||
|
void snmp_inc_snmpintraps(void);
|
||||||
|
void snmp_inc_snmpouttoobigs(void);
|
||||||
|
void snmp_inc_snmpoutnosuchnames(void);
|
||||||
|
void snmp_inc_snmpoutbadvalues(void);
|
||||||
|
void snmp_inc_snmpoutgenerrs(void);
|
||||||
|
void snmp_inc_snmpoutgetrequests(void);
|
||||||
|
void snmp_inc_snmpoutgetnexts(void);
|
||||||
|
void snmp_inc_snmpoutsetrequests(void);
|
||||||
|
void snmp_inc_snmpoutgetresponses(void);
|
||||||
|
void snmp_inc_snmpouttraps(void);
|
||||||
|
void snmp_get_snmpgrpid_ptr(struct snmp_obj_id **oid);
|
||||||
|
void snmp_set_snmpenableauthentraps(u8_t *value);
|
||||||
|
void snmp_get_snmpenableauthentraps(u8_t *value);
|
||||||
|
|
||||||
|
/* LWIP_SNMP support not available */
|
||||||
|
/* define everything to be empty */
|
||||||
|
#else
|
||||||
|
|
||||||
|
/* system */
|
||||||
|
#define snmp_set_sysdesr(str, len)
|
||||||
|
#define snmp_set_sysobjid(oid);
|
||||||
|
#define snmp_get_sysobjid_ptr(oid)
|
||||||
|
#define snmp_inc_sysuptime()
|
||||||
|
#define snmp_add_sysuptime(value)
|
||||||
|
#define snmp_get_sysuptime(value)
|
||||||
|
#define snmp_set_syscontact(ocstr, ocstrlen);
|
||||||
|
#define snmp_set_sysname(ocstr, ocstrlen);
|
||||||
|
#define snmp_set_syslocation(ocstr, ocstrlen);
|
||||||
|
|
||||||
|
/* network interface */
|
||||||
|
#define snmp_add_ifinoctets(ni,value)
|
||||||
|
#define snmp_inc_ifinucastpkts(ni)
|
||||||
|
#define snmp_inc_ifinnucastpkts(ni)
|
||||||
|
#define snmp_inc_ifindiscards(ni)
|
||||||
|
#define snmp_add_ifoutoctets(ni,value)
|
||||||
|
#define snmp_inc_ifoutucastpkts(ni)
|
||||||
|
#define snmp_inc_ifoutnucastpkts(ni)
|
||||||
|
#define snmp_inc_ifoutdiscards(ni)
|
||||||
|
#define snmp_inc_iflist()
|
||||||
|
#define snmp_dec_iflist()
|
||||||
|
|
||||||
|
/* ARP */
|
||||||
|
#define snmp_insert_arpidx_tree(ni,ip)
|
||||||
|
#define snmp_delete_arpidx_tree(ni,ip)
|
||||||
|
|
||||||
|
/* IP */
|
||||||
|
#define snmp_inc_ipinreceives()
|
||||||
|
#define snmp_inc_ipinhdrerrors()
|
||||||
|
#define snmp_inc_ipinaddrerrors()
|
||||||
|
#define snmp_inc_ipforwdatagrams()
|
||||||
|
#define snmp_inc_ipinunknownprotos()
|
||||||
|
#define snmp_inc_ipindiscards()
|
||||||
|
#define snmp_inc_ipindelivers()
|
||||||
|
#define snmp_inc_ipoutrequests()
|
||||||
|
#define snmp_inc_ipoutdiscards()
|
||||||
|
#define snmp_inc_ipoutnoroutes()
|
||||||
|
#define snmp_inc_ipreasmreqds()
|
||||||
|
#define snmp_inc_ipreasmoks()
|
||||||
|
#define snmp_inc_ipreasmfails()
|
||||||
|
#define snmp_inc_ipfragoks()
|
||||||
|
#define snmp_inc_ipfragfails()
|
||||||
|
#define snmp_inc_ipfragcreates()
|
||||||
|
#define snmp_inc_iproutingdiscards()
|
||||||
|
#define snmp_insert_ipaddridx_tree(ni)
|
||||||
|
#define snmp_delete_ipaddridx_tree(ni)
|
||||||
|
#define snmp_insert_iprteidx_tree(dflt, ni)
|
||||||
|
#define snmp_delete_iprteidx_tree(dflt, ni)
|
||||||
|
|
||||||
|
/* ICMP */
|
||||||
|
#define snmp_inc_icmpinmsgs()
|
||||||
|
#define snmp_inc_icmpinerrors()
|
||||||
|
#define snmp_inc_icmpindestunreachs()
|
||||||
|
#define snmp_inc_icmpintimeexcds()
|
||||||
|
#define snmp_inc_icmpinparmprobs()
|
||||||
|
#define snmp_inc_icmpinsrcquenchs()
|
||||||
|
#define snmp_inc_icmpinredirects()
|
||||||
|
#define snmp_inc_icmpinechos()
|
||||||
|
#define snmp_inc_icmpinechoreps()
|
||||||
|
#define snmp_inc_icmpintimestamps()
|
||||||
|
#define snmp_inc_icmpintimestampreps()
|
||||||
|
#define snmp_inc_icmpinaddrmasks()
|
||||||
|
#define snmp_inc_icmpinaddrmaskreps()
|
||||||
|
#define snmp_inc_icmpoutmsgs()
|
||||||
|
#define snmp_inc_icmpouterrors()
|
||||||
|
#define snmp_inc_icmpoutdestunreachs()
|
||||||
|
#define snmp_inc_icmpouttimeexcds()
|
||||||
|
#define snmp_inc_icmpoutparmprobs()
|
||||||
|
#define snmp_inc_icmpoutsrcquenchs()
|
||||||
|
#define snmp_inc_icmpoutredirects()
|
||||||
|
#define snmp_inc_icmpoutechos()
|
||||||
|
#define snmp_inc_icmpoutechoreps()
|
||||||
|
#define snmp_inc_icmpouttimestamps()
|
||||||
|
#define snmp_inc_icmpouttimestampreps()
|
||||||
|
#define snmp_inc_icmpoutaddrmasks()
|
||||||
|
#define snmp_inc_icmpoutaddrmaskreps()
|
||||||
|
/* TCP */
|
||||||
|
#define snmp_inc_tcpactiveopens()
|
||||||
|
#define snmp_inc_tcppassiveopens()
|
||||||
|
#define snmp_inc_tcpattemptfails()
|
||||||
|
#define snmp_inc_tcpestabresets()
|
||||||
|
#define snmp_inc_tcpinsegs()
|
||||||
|
#define snmp_inc_tcpoutsegs()
|
||||||
|
#define snmp_inc_tcpretranssegs()
|
||||||
|
#define snmp_inc_tcpinerrs()
|
||||||
|
#define snmp_inc_tcpoutrsts()
|
||||||
|
|
||||||
|
/* UDP */
|
||||||
|
#define snmp_inc_udpindatagrams()
|
||||||
|
#define snmp_inc_udpnoports()
|
||||||
|
#define snmp_inc_udpinerrors()
|
||||||
|
#define snmp_inc_udpoutdatagrams()
|
||||||
|
#define snmp_insert_udpidx_tree(pcb)
|
||||||
|
#define snmp_delete_udpidx_tree(pcb)
|
||||||
|
|
||||||
|
/* SNMP */
|
||||||
|
#define snmp_inc_snmpinpkts()
|
||||||
|
#define snmp_inc_snmpoutpkts()
|
||||||
|
#define snmp_inc_snmpinbadversions()
|
||||||
|
#define snmp_inc_snmpinbadcommunitynames()
|
||||||
|
#define snmp_inc_snmpinbadcommunityuses()
|
||||||
|
#define snmp_inc_snmpinasnparseerrs()
|
||||||
|
#define snmp_inc_snmpintoobigs()
|
||||||
|
#define snmp_inc_snmpinnosuchnames()
|
||||||
|
#define snmp_inc_snmpinbadvalues()
|
||||||
|
#define snmp_inc_snmpinreadonlys()
|
||||||
|
#define snmp_inc_snmpingenerrs()
|
||||||
|
#define snmp_add_snmpintotalreqvars(value)
|
||||||
|
#define snmp_add_snmpintotalsetvars(value)
|
||||||
|
#define snmp_inc_snmpingetrequests()
|
||||||
|
#define snmp_inc_snmpingetnexts()
|
||||||
|
#define snmp_inc_snmpinsetrequests()
|
||||||
|
#define snmp_inc_snmpingetresponses()
|
||||||
|
#define snmp_inc_snmpintraps()
|
||||||
|
#define snmp_inc_snmpouttoobigs()
|
||||||
|
#define snmp_inc_snmpoutnosuchnames()
|
||||||
|
#define snmp_inc_snmpoutbadvalues()
|
||||||
|
#define snmp_inc_snmpoutgenerrs()
|
||||||
|
#define snmp_inc_snmpoutgetrequests()
|
||||||
|
#define snmp_inc_snmpoutgetnexts()
|
||||||
|
#define snmp_inc_snmpoutsetrequests()
|
||||||
|
#define snmp_inc_snmpoutgetresponses()
|
||||||
|
#define snmp_inc_snmpouttraps()
|
||||||
|
#define snmp_get_snmpgrpid_ptr(oid)
|
||||||
|
#define snmp_set_snmpenableauthentraps(value)
|
||||||
|
#define snmp_get_snmpenableauthentraps(value)
|
||||||
|
|
||||||
|
#endif /* LWIP_SNMP */
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* __LWIP_SNMP_H__ */
|
101
app/include/lwip/snmp_asn1.h
Normal file
101
app/include/lwip/snmp_asn1.h
Normal file
@ -0,0 +1,101 @@
|
|||||||
|
/**
|
||||||
|
* @file
|
||||||
|
* Abstract Syntax Notation One (ISO 8824, 8825) codec.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2006 Axon Digital Design B.V., The Netherlands.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* Author: Christiaan Simons <christiaan.simons@axon.tv>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __LWIP_SNMP_ASN1_H__
|
||||||
|
#define __LWIP_SNMP_ASN1_H__
|
||||||
|
|
||||||
|
#include "lwip/opt.h"
|
||||||
|
#include "lwip/err.h"
|
||||||
|
#include "lwip/pbuf.h"
|
||||||
|
#include "lwip/snmp.h"
|
||||||
|
|
||||||
|
#if LWIP_SNMP
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define SNMP_ASN1_UNIV (0) /* (!0x80 | !0x40) */
|
||||||
|
#define SNMP_ASN1_APPLIC (0x40) /* (!0x80 | 0x40) */
|
||||||
|
#define SNMP_ASN1_CONTXT (0x80) /* ( 0x80 | !0x40) */
|
||||||
|
|
||||||
|
#define SNMP_ASN1_CONSTR (0x20) /* ( 0x20) */
|
||||||
|
#define SNMP_ASN1_PRIMIT (0) /* (!0x20) */
|
||||||
|
|
||||||
|
/* universal tags */
|
||||||
|
#define SNMP_ASN1_INTEG 2
|
||||||
|
#define SNMP_ASN1_OC_STR 4
|
||||||
|
#define SNMP_ASN1_NUL 5
|
||||||
|
#define SNMP_ASN1_OBJ_ID 6
|
||||||
|
#define SNMP_ASN1_SEQ 16
|
||||||
|
|
||||||
|
/* application specific (SNMP) tags */
|
||||||
|
#define SNMP_ASN1_IPADDR 0 /* octet string size(4) */
|
||||||
|
#define SNMP_ASN1_COUNTER 1 /* u32_t */
|
||||||
|
#define SNMP_ASN1_GAUGE 2 /* u32_t */
|
||||||
|
#define SNMP_ASN1_TIMETICKS 3 /* u32_t */
|
||||||
|
#define SNMP_ASN1_OPAQUE 4 /* octet string */
|
||||||
|
|
||||||
|
/* context specific (SNMP) tags */
|
||||||
|
#define SNMP_ASN1_PDU_GET_REQ 0
|
||||||
|
#define SNMP_ASN1_PDU_GET_NEXT_REQ 1
|
||||||
|
#define SNMP_ASN1_PDU_GET_RESP 2
|
||||||
|
#define SNMP_ASN1_PDU_SET_REQ 3
|
||||||
|
#define SNMP_ASN1_PDU_TRAP 4
|
||||||
|
|
||||||
|
err_t snmp_asn1_dec_type(struct pbuf *p, u16_t ofs, u8_t *type);
|
||||||
|
err_t snmp_asn1_dec_length(struct pbuf *p, u16_t ofs, u8_t *octets_used, u16_t *length);
|
||||||
|
err_t snmp_asn1_dec_u32t(struct pbuf *p, u16_t ofs, u16_t len, u32_t *value);
|
||||||
|
err_t snmp_asn1_dec_s32t(struct pbuf *p, u16_t ofs, u16_t len, s32_t *value);
|
||||||
|
err_t snmp_asn1_dec_oid(struct pbuf *p, u16_t ofs, u16_t len, struct snmp_obj_id *oid);
|
||||||
|
err_t snmp_asn1_dec_raw(struct pbuf *p, u16_t ofs, u16_t len, u16_t raw_len, u8_t *raw);
|
||||||
|
|
||||||
|
void snmp_asn1_enc_length_cnt(u16_t length, u8_t *octets_needed);
|
||||||
|
void snmp_asn1_enc_u32t_cnt(u32_t value, u16_t *octets_needed);
|
||||||
|
void snmp_asn1_enc_s32t_cnt(s32_t value, u16_t *octets_needed);
|
||||||
|
void snmp_asn1_enc_oid_cnt(u8_t ident_len, s32_t *ident, u16_t *octets_needed);
|
||||||
|
err_t snmp_asn1_enc_type(struct pbuf *p, u16_t ofs, u8_t type);
|
||||||
|
err_t snmp_asn1_enc_length(struct pbuf *p, u16_t ofs, u16_t length);
|
||||||
|
err_t snmp_asn1_enc_u32t(struct pbuf *p, u16_t ofs, u16_t octets_needed, u32_t value);
|
||||||
|
err_t snmp_asn1_enc_s32t(struct pbuf *p, u16_t ofs, u16_t octets_needed, s32_t value);
|
||||||
|
err_t snmp_asn1_enc_oid(struct pbuf *p, u16_t ofs, u8_t ident_len, s32_t *ident);
|
||||||
|
err_t snmp_asn1_enc_raw(struct pbuf *p, u16_t ofs, u16_t raw_len, u8_t *raw);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* LWIP_SNMP */
|
||||||
|
|
||||||
|
#endif /* __LWIP_SNMP_ASN1_H__ */
|
315
app/include/lwip/snmp_msg.h
Normal file
315
app/include/lwip/snmp_msg.h
Normal file
@ -0,0 +1,315 @@
|
|||||||
|
/**
|
||||||
|
* @file
|
||||||
|
* SNMP Agent message handling structures.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2006 Axon Digital Design B.V., The Netherlands.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* Author: Christiaan Simons <christiaan.simons@axon.tv>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __LWIP_SNMP_MSG_H__
|
||||||
|
#define __LWIP_SNMP_MSG_H__
|
||||||
|
|
||||||
|
#include "lwip/opt.h"
|
||||||
|
#include "lwip/snmp.h"
|
||||||
|
#include "lwip/snmp_structs.h"
|
||||||
|
#include "lwip/ip_addr.h"
|
||||||
|
#include "lwip/err.h"
|
||||||
|
|
||||||
|
#if LWIP_SNMP
|
||||||
|
|
||||||
|
#if SNMP_PRIVATE_MIB
|
||||||
|
/* When using a private MIB, you have to create a file 'private_mib.h' that contains
|
||||||
|
* a 'struct mib_array_node mib_private' which contains your MIB. */
|
||||||
|
#include "private_mib.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* The listen port of the SNMP agent. Clients have to make their requests to
|
||||||
|
this port. Most standard clients won't work if you change this! */
|
||||||
|
#ifndef SNMP_IN_PORT
|
||||||
|
#define SNMP_IN_PORT 161
|
||||||
|
#endif
|
||||||
|
/* The remote port the SNMP agent sends traps to. Most standard trap sinks won't
|
||||||
|
work if you change this! */
|
||||||
|
#ifndef SNMP_TRAP_PORT
|
||||||
|
#define SNMP_TRAP_PORT 162
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define SNMP_ES_NOERROR 0
|
||||||
|
#define SNMP_ES_TOOBIG 1
|
||||||
|
#define SNMP_ES_NOSUCHNAME 2
|
||||||
|
#define SNMP_ES_BADVALUE 3
|
||||||
|
#define SNMP_ES_READONLY 4
|
||||||
|
#define SNMP_ES_GENERROR 5
|
||||||
|
|
||||||
|
#define SNMP_GENTRAP_COLDSTART 0
|
||||||
|
#define SNMP_GENTRAP_WARMSTART 1
|
||||||
|
#define SNMP_GENTRAP_AUTHFAIL 4
|
||||||
|
#define SNMP_GENTRAP_ENTERPRISESPC 6
|
||||||
|
|
||||||
|
struct snmp_varbind
|
||||||
|
{
|
||||||
|
/* next pointer, NULL for last in list */
|
||||||
|
struct snmp_varbind *next;
|
||||||
|
/* previous pointer, NULL for first in list */
|
||||||
|
struct snmp_varbind *prev;
|
||||||
|
|
||||||
|
/* object identifier length (in s32_t) */
|
||||||
|
u8_t ident_len;
|
||||||
|
/* object identifier array */
|
||||||
|
s32_t *ident;
|
||||||
|
|
||||||
|
/* object value ASN1 type */
|
||||||
|
u8_t value_type;
|
||||||
|
/* object value length (in u8_t) */
|
||||||
|
u8_t value_len;
|
||||||
|
/* object value */
|
||||||
|
void *value;
|
||||||
|
|
||||||
|
/* encoding varbind seq length length */
|
||||||
|
u8_t seqlenlen;
|
||||||
|
/* encoding object identifier length length */
|
||||||
|
u8_t olenlen;
|
||||||
|
/* encoding object value length length */
|
||||||
|
u8_t vlenlen;
|
||||||
|
/* encoding varbind seq length */
|
||||||
|
u16_t seqlen;
|
||||||
|
/* encoding object identifier length */
|
||||||
|
u16_t olen;
|
||||||
|
/* encoding object value length */
|
||||||
|
u16_t vlen;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct snmp_varbind_root
|
||||||
|
{
|
||||||
|
struct snmp_varbind *head;
|
||||||
|
struct snmp_varbind *tail;
|
||||||
|
/* number of variable bindings in list */
|
||||||
|
u8_t count;
|
||||||
|
/* encoding varbind-list seq length length */
|
||||||
|
u8_t seqlenlen;
|
||||||
|
/* encoding varbind-list seq length */
|
||||||
|
u16_t seqlen;
|
||||||
|
};
|
||||||
|
|
||||||
|
/** output response message header length fields */
|
||||||
|
struct snmp_resp_header_lengths
|
||||||
|
{
|
||||||
|
/* encoding error-index length length */
|
||||||
|
u8_t erridxlenlen;
|
||||||
|
/* encoding error-status length length */
|
||||||
|
u8_t errstatlenlen;
|
||||||
|
/* encoding request id length length */
|
||||||
|
u8_t ridlenlen;
|
||||||
|
/* encoding pdu length length */
|
||||||
|
u8_t pdulenlen;
|
||||||
|
/* encoding community length length */
|
||||||
|
u8_t comlenlen;
|
||||||
|
/* encoding version length length */
|
||||||
|
u8_t verlenlen;
|
||||||
|
/* encoding sequence length length */
|
||||||
|
u8_t seqlenlen;
|
||||||
|
|
||||||
|
/* encoding error-index length */
|
||||||
|
u16_t erridxlen;
|
||||||
|
/* encoding error-status length */
|
||||||
|
u16_t errstatlen;
|
||||||
|
/* encoding request id length */
|
||||||
|
u16_t ridlen;
|
||||||
|
/* encoding pdu length */
|
||||||
|
u16_t pdulen;
|
||||||
|
/* encoding community length */
|
||||||
|
u16_t comlen;
|
||||||
|
/* encoding version length */
|
||||||
|
u16_t verlen;
|
||||||
|
/* encoding sequence length */
|
||||||
|
u16_t seqlen;
|
||||||
|
};
|
||||||
|
|
||||||
|
/** output response message header length fields */
|
||||||
|
struct snmp_trap_header_lengths
|
||||||
|
{
|
||||||
|
/* encoding timestamp length length */
|
||||||
|
u8_t tslenlen;
|
||||||
|
/* encoding specific-trap length length */
|
||||||
|
u8_t strplenlen;
|
||||||
|
/* encoding generic-trap length length */
|
||||||
|
u8_t gtrplenlen;
|
||||||
|
/* encoding agent-addr length length */
|
||||||
|
u8_t aaddrlenlen;
|
||||||
|
/* encoding enterprise-id length length */
|
||||||
|
u8_t eidlenlen;
|
||||||
|
/* encoding pdu length length */
|
||||||
|
u8_t pdulenlen;
|
||||||
|
/* encoding community length length */
|
||||||
|
u8_t comlenlen;
|
||||||
|
/* encoding version length length */
|
||||||
|
u8_t verlenlen;
|
||||||
|
/* encoding sequence length length */
|
||||||
|
u8_t seqlenlen;
|
||||||
|
|
||||||
|
/* encoding timestamp length */
|
||||||
|
u16_t tslen;
|
||||||
|
/* encoding specific-trap length */
|
||||||
|
u16_t strplen;
|
||||||
|
/* encoding generic-trap length */
|
||||||
|
u16_t gtrplen;
|
||||||
|
/* encoding agent-addr length */
|
||||||
|
u16_t aaddrlen;
|
||||||
|
/* encoding enterprise-id length */
|
||||||
|
u16_t eidlen;
|
||||||
|
/* encoding pdu length */
|
||||||
|
u16_t pdulen;
|
||||||
|
/* encoding community length */
|
||||||
|
u16_t comlen;
|
||||||
|
/* encoding version length */
|
||||||
|
u16_t verlen;
|
||||||
|
/* encoding sequence length */
|
||||||
|
u16_t seqlen;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Accepting new SNMP messages. */
|
||||||
|
#define SNMP_MSG_EMPTY 0
|
||||||
|
/* Search for matching object for variable binding. */
|
||||||
|
#define SNMP_MSG_SEARCH_OBJ 1
|
||||||
|
/* Perform SNMP operation on in-memory object.
|
||||||
|
Pass-through states, for symmetry only. */
|
||||||
|
#define SNMP_MSG_INTERNAL_GET_OBJDEF 2
|
||||||
|
#define SNMP_MSG_INTERNAL_GET_VALUE 3
|
||||||
|
#define SNMP_MSG_INTERNAL_SET_TEST 4
|
||||||
|
#define SNMP_MSG_INTERNAL_GET_OBJDEF_S 5
|
||||||
|
#define SNMP_MSG_INTERNAL_SET_VALUE 6
|
||||||
|
/* Perform SNMP operation on object located externally.
|
||||||
|
In theory this could be used for building a proxy agent.
|
||||||
|
Practical use is for an enterprise spc. app. gateway. */
|
||||||
|
#define SNMP_MSG_EXTERNAL_GET_OBJDEF 7
|
||||||
|
#define SNMP_MSG_EXTERNAL_GET_VALUE 8
|
||||||
|
#define SNMP_MSG_EXTERNAL_SET_TEST 9
|
||||||
|
#define SNMP_MSG_EXTERNAL_GET_OBJDEF_S 10
|
||||||
|
#define SNMP_MSG_EXTERNAL_SET_VALUE 11
|
||||||
|
|
||||||
|
#define SNMP_COMMUNITY_STR_LEN 64
|
||||||
|
struct snmp_msg_pstat
|
||||||
|
{
|
||||||
|
/* lwIP local port (161) binding */
|
||||||
|
struct udp_pcb *pcb;
|
||||||
|
/* source IP address */
|
||||||
|
ip_addr_t sip;
|
||||||
|
/* source UDP port */
|
||||||
|
u16_t sp;
|
||||||
|
/* request type */
|
||||||
|
u8_t rt;
|
||||||
|
/* request ID */
|
||||||
|
s32_t rid;
|
||||||
|
/* error status */
|
||||||
|
s32_t error_status;
|
||||||
|
/* error index */
|
||||||
|
s32_t error_index;
|
||||||
|
/* community name (zero terminated) */
|
||||||
|
u8_t community[SNMP_COMMUNITY_STR_LEN + 1];
|
||||||
|
/* community string length (exclusive zero term) */
|
||||||
|
u8_t com_strlen;
|
||||||
|
/* one out of MSG_EMPTY, MSG_DEMUX, MSG_INTERNAL, MSG_EXTERNAL_x */
|
||||||
|
u8_t state;
|
||||||
|
/* saved arguments for MSG_EXTERNAL_x */
|
||||||
|
struct mib_external_node *ext_mib_node;
|
||||||
|
struct snmp_name_ptr ext_name_ptr;
|
||||||
|
struct obj_def ext_object_def;
|
||||||
|
struct snmp_obj_id ext_oid;
|
||||||
|
/* index into input variable binding list */
|
||||||
|
u8_t vb_idx;
|
||||||
|
/* ptr into input variable binding list */
|
||||||
|
struct snmp_varbind *vb_ptr;
|
||||||
|
/* list of variable bindings from input */
|
||||||
|
struct snmp_varbind_root invb;
|
||||||
|
/* list of variable bindings to output */
|
||||||
|
struct snmp_varbind_root outvb;
|
||||||
|
/* output response lengths used in ASN encoding */
|
||||||
|
struct snmp_resp_header_lengths rhl;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct snmp_msg_trap
|
||||||
|
{
|
||||||
|
/* lwIP local port (161) binding */
|
||||||
|
struct udp_pcb *pcb;
|
||||||
|
/* destination IP address in network order */
|
||||||
|
ip_addr_t dip;
|
||||||
|
|
||||||
|
/* source enterprise ID (sysObjectID) */
|
||||||
|
struct snmp_obj_id *enterprise;
|
||||||
|
/* source IP address, raw network order format */
|
||||||
|
u8_t sip_raw[4];
|
||||||
|
/* generic trap code */
|
||||||
|
u32_t gen_trap;
|
||||||
|
/* specific trap code */
|
||||||
|
u32_t spc_trap;
|
||||||
|
/* timestamp */
|
||||||
|
u32_t ts;
|
||||||
|
/* list of variable bindings to output */
|
||||||
|
struct snmp_varbind_root outvb;
|
||||||
|
/* output trap lengths used in ASN encoding */
|
||||||
|
struct snmp_trap_header_lengths thl;
|
||||||
|
};
|
||||||
|
|
||||||
|
/** Agent Version constant, 0 = v1 oddity */
|
||||||
|
extern const s32_t snmp_version;
|
||||||
|
/** Agent default "public" community string */
|
||||||
|
extern const char snmp_publiccommunity[7];
|
||||||
|
|
||||||
|
extern struct snmp_msg_trap trap_msg;
|
||||||
|
|
||||||
|
/** Agent setup, start listening to port 161. */
|
||||||
|
void snmp_init(void);
|
||||||
|
void snmp_trap_dst_enable(u8_t dst_idx, u8_t enable);
|
||||||
|
void snmp_trap_dst_ip_set(u8_t dst_idx, ip_addr_t *dst);
|
||||||
|
|
||||||
|
/** Varbind-list functions. */
|
||||||
|
struct snmp_varbind* snmp_varbind_alloc(struct snmp_obj_id *oid, u8_t type, u8_t len);
|
||||||
|
void snmp_varbind_free(struct snmp_varbind *vb);
|
||||||
|
void snmp_varbind_list_free(struct snmp_varbind_root *root);
|
||||||
|
void snmp_varbind_tail_add(struct snmp_varbind_root *root, struct snmp_varbind *vb);
|
||||||
|
struct snmp_varbind* snmp_varbind_tail_remove(struct snmp_varbind_root *root);
|
||||||
|
|
||||||
|
/** Handle an internal (recv) or external (private response) event. */
|
||||||
|
void snmp_msg_event(u8_t request_id);
|
||||||
|
err_t snmp_send_response(struct snmp_msg_pstat *m_stat);
|
||||||
|
err_t snmp_send_trap(s8_t generic_trap, struct snmp_obj_id *eoid, s32_t specific_trap);
|
||||||
|
void snmp_coldstart_trap(void);
|
||||||
|
void snmp_authfail_trap(void);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* LWIP_SNMP */
|
||||||
|
|
||||||
|
#endif /* __LWIP_SNMP_MSG_H__ */
|
268
app/include/lwip/snmp_structs.h
Normal file
268
app/include/lwip/snmp_structs.h
Normal file
@ -0,0 +1,268 @@
|
|||||||
|
/**
|
||||||
|
* @file
|
||||||
|
* Generic MIB tree structures.
|
||||||
|
*
|
||||||
|
* @todo namespace prefixes
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2006 Axon Digital Design B.V., The Netherlands.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* Author: Christiaan Simons <christiaan.simons@axon.tv>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __LWIP_SNMP_STRUCTS_H__
|
||||||
|
#define __LWIP_SNMP_STRUCTS_H__
|
||||||
|
|
||||||
|
#include "lwip/opt.h"
|
||||||
|
|
||||||
|
#if LWIP_SNMP /* don't build if not configured for use in lwipopts.h */
|
||||||
|
|
||||||
|
#include "lwip/snmp.h"
|
||||||
|
|
||||||
|
#if SNMP_PRIVATE_MIB
|
||||||
|
/* When using a private MIB, you have to create a file 'private_mib.h' that contains
|
||||||
|
* a 'struct mib_array_node mib_private' which contains your MIB. */
|
||||||
|
#include "private_mib.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* MIB object instance */
|
||||||
|
#define MIB_OBJECT_NONE 0
|
||||||
|
#define MIB_OBJECT_SCALAR 1
|
||||||
|
#define MIB_OBJECT_TAB 2
|
||||||
|
|
||||||
|
/* MIB access types */
|
||||||
|
#define MIB_ACCESS_READ 1
|
||||||
|
#define MIB_ACCESS_WRITE 2
|
||||||
|
|
||||||
|
/* MIB object access */
|
||||||
|
#define MIB_OBJECT_READ_ONLY MIB_ACCESS_READ
|
||||||
|
#define MIB_OBJECT_READ_WRITE (MIB_ACCESS_READ | MIB_ACCESS_WRITE)
|
||||||
|
#define MIB_OBJECT_WRITE_ONLY MIB_ACCESS_WRITE
|
||||||
|
#define MIB_OBJECT_NOT_ACCESSIBLE 0
|
||||||
|
|
||||||
|
/** object definition returned by (get_object_def)() */
|
||||||
|
struct obj_def
|
||||||
|
{
|
||||||
|
/* MIB_OBJECT_NONE (0), MIB_OBJECT_SCALAR (1), MIB_OBJECT_TAB (2) */
|
||||||
|
u8_t instance;
|
||||||
|
/* 0 read-only, 1 read-write, 2 write-only, 3 not-accessible */
|
||||||
|
u8_t access;
|
||||||
|
/* ASN type for this object */
|
||||||
|
u8_t asn_type;
|
||||||
|
/* value length (host length) */
|
||||||
|
u16_t v_len;
|
||||||
|
/* length of instance part of supplied object identifier */
|
||||||
|
u8_t id_inst_len;
|
||||||
|
/* instance part of supplied object identifier */
|
||||||
|
s32_t *id_inst_ptr;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct snmp_name_ptr
|
||||||
|
{
|
||||||
|
u8_t ident_len;
|
||||||
|
s32_t *ident;
|
||||||
|
};
|
||||||
|
|
||||||
|
/** MIB const scalar (.0) node */
|
||||||
|
#define MIB_NODE_SC 0x01
|
||||||
|
/** MIB const array node */
|
||||||
|
#define MIB_NODE_AR 0x02
|
||||||
|
/** MIB array node (mem_malloced from RAM) */
|
||||||
|
#define MIB_NODE_RA 0x03
|
||||||
|
/** MIB list root node (mem_malloced from RAM) */
|
||||||
|
#define MIB_NODE_LR 0x04
|
||||||
|
/** MIB node for external objects */
|
||||||
|
#define MIB_NODE_EX 0x05
|
||||||
|
|
||||||
|
/** node "base class" layout, the mandatory fields for a node */
|
||||||
|
struct mib_node
|
||||||
|
{
|
||||||
|
/** returns struct obj_def for the given object identifier */
|
||||||
|
void (*get_object_def)(u8_t ident_len, s32_t *ident, struct obj_def *od);
|
||||||
|
/** returns object value for the given object identifier,
|
||||||
|
@note the caller must allocate at least len bytes for the value */
|
||||||
|
void (*get_value)(struct obj_def *od, u16_t len, void *value);
|
||||||
|
/** tests length and/or range BEFORE setting */
|
||||||
|
u8_t (*set_test)(struct obj_def *od, u16_t len, void *value);
|
||||||
|
/** sets object value, only to be called when set_test() */
|
||||||
|
void (*set_value)(struct obj_def *od, u16_t len, void *value);
|
||||||
|
/** One out of MIB_NODE_AR, MIB_NODE_LR or MIB_NODE_EX */
|
||||||
|
u8_t node_type;
|
||||||
|
/* array or max list length */
|
||||||
|
u16_t maxlength;
|
||||||
|
};
|
||||||
|
|
||||||
|
/** derived node for scalars .0 index */
|
||||||
|
typedef struct mib_node mib_scalar_node;
|
||||||
|
|
||||||
|
/** derived node, points to a fixed size const array
|
||||||
|
of sub-identifiers plus a 'child' pointer */
|
||||||
|
struct mib_array_node
|
||||||
|
{
|
||||||
|
/* inherited "base class" members */
|
||||||
|
void (*get_object_def)(u8_t ident_len, s32_t *ident, struct obj_def *od);
|
||||||
|
void (*get_value)(struct obj_def *od, u16_t len, void *value);
|
||||||
|
u8_t (*set_test)(struct obj_def *od, u16_t len, void *value);
|
||||||
|
void (*set_value)(struct obj_def *od, u16_t len, void *value);
|
||||||
|
|
||||||
|
u8_t node_type;
|
||||||
|
u16_t maxlength;
|
||||||
|
|
||||||
|
/* additional struct members */
|
||||||
|
const s32_t *objid;
|
||||||
|
struct mib_node* const *nptr;
|
||||||
|
};
|
||||||
|
|
||||||
|
/** derived node, points to a fixed size mem_malloced array
|
||||||
|
of sub-identifiers plus a 'child' pointer */
|
||||||
|
struct mib_ram_array_node
|
||||||
|
{
|
||||||
|
/* inherited "base class" members */
|
||||||
|
void (*get_object_def)(u8_t ident_len, s32_t *ident, struct obj_def *od);
|
||||||
|
void (*get_value)(struct obj_def *od, u16_t len, void *value);
|
||||||
|
u8_t (*set_test)(struct obj_def *od, u16_t len, void *value);
|
||||||
|
void (*set_value)(struct obj_def *od, u16_t len, void *value);
|
||||||
|
|
||||||
|
u8_t node_type;
|
||||||
|
u16_t maxlength;
|
||||||
|
|
||||||
|
/* aditional struct members */
|
||||||
|
s32_t *objid;
|
||||||
|
struct mib_node **nptr;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct mib_list_node
|
||||||
|
{
|
||||||
|
struct mib_list_node *prev;
|
||||||
|
struct mib_list_node *next;
|
||||||
|
s32_t objid;
|
||||||
|
struct mib_node *nptr;
|
||||||
|
};
|
||||||
|
|
||||||
|
/** derived node, points to a doubly linked list
|
||||||
|
of sub-identifiers plus a 'child' pointer */
|
||||||
|
struct mib_list_rootnode
|
||||||
|
{
|
||||||
|
/* inherited "base class" members */
|
||||||
|
void (*get_object_def)(u8_t ident_len, s32_t *ident, struct obj_def *od);
|
||||||
|
void (*get_value)(struct obj_def *od, u16_t len, void *value);
|
||||||
|
u8_t (*set_test)(struct obj_def *od, u16_t len, void *value);
|
||||||
|
void (*set_value)(struct obj_def *od, u16_t len, void *value);
|
||||||
|
|
||||||
|
u8_t node_type;
|
||||||
|
u16_t maxlength;
|
||||||
|
|
||||||
|
/* additional struct members */
|
||||||
|
struct mib_list_node *head;
|
||||||
|
struct mib_list_node *tail;
|
||||||
|
/* counts list nodes in list */
|
||||||
|
u16_t count;
|
||||||
|
};
|
||||||
|
|
||||||
|
/** derived node, has access functions for mib object in external memory or device
|
||||||
|
using 'tree_level' and 'idx', with a range 0 .. (level_length() - 1) */
|
||||||
|
struct mib_external_node
|
||||||
|
{
|
||||||
|
/* inherited "base class" members */
|
||||||
|
void (*get_object_def)(u8_t ident_len, s32_t *ident, struct obj_def *od);
|
||||||
|
void (*get_value)(struct obj_def *od, u16_t len, void *value);
|
||||||
|
u8_t (*set_test)(struct obj_def *od, u16_t len, void *value);
|
||||||
|
void (*set_value)(struct obj_def *od, u16_t len, void *value);
|
||||||
|
|
||||||
|
u8_t node_type;
|
||||||
|
u16_t maxlength;
|
||||||
|
|
||||||
|
/* additional struct members */
|
||||||
|
/** points to an external (in memory) record of some sort of addressing
|
||||||
|
information, passed to and interpreted by the funtions below */
|
||||||
|
void* addr_inf;
|
||||||
|
/** tree levels under this node */
|
||||||
|
u8_t tree_levels;
|
||||||
|
/** number of objects at this level */
|
||||||
|
u16_t (*level_length)(void* addr_inf, u8_t level);
|
||||||
|
/** compares object sub identifier with external id
|
||||||
|
return zero when equal, nonzero when unequal */
|
||||||
|
s32_t (*ident_cmp)(void* addr_inf, u8_t level, u16_t idx, s32_t sub_id);
|
||||||
|
void (*get_objid)(void* addr_inf, u8_t level, u16_t idx, s32_t *sub_id);
|
||||||
|
|
||||||
|
/** async Questions */
|
||||||
|
void (*get_object_def_q)(void* addr_inf, u8_t rid, u8_t ident_len, s32_t *ident);
|
||||||
|
void (*get_value_q)(u8_t rid, struct obj_def *od);
|
||||||
|
void (*set_test_q)(u8_t rid, struct obj_def *od);
|
||||||
|
void (*set_value_q)(u8_t rid, struct obj_def *od, u16_t len, void *value);
|
||||||
|
/** async Answers */
|
||||||
|
void (*get_object_def_a)(u8_t rid, u8_t ident_len, s32_t *ident, struct obj_def *od);
|
||||||
|
void (*get_value_a)(u8_t rid, struct obj_def *od, u16_t len, void *value);
|
||||||
|
u8_t (*set_test_a)(u8_t rid, struct obj_def *od, u16_t len, void *value);
|
||||||
|
void (*set_value_a)(u8_t rid, struct obj_def *od, u16_t len, void *value);
|
||||||
|
/** async Panic Close (agent returns error reply,
|
||||||
|
e.g. used for external transaction cleanup) */
|
||||||
|
void (*get_object_def_pc)(u8_t rid, u8_t ident_len, s32_t *ident);
|
||||||
|
void (*get_value_pc)(u8_t rid, struct obj_def *od);
|
||||||
|
void (*set_test_pc)(u8_t rid, struct obj_def *od);
|
||||||
|
void (*set_value_pc)(u8_t rid, struct obj_def *od);
|
||||||
|
};
|
||||||
|
|
||||||
|
/** export MIB tree from mib2.c */
|
||||||
|
extern const struct mib_array_node internet;
|
||||||
|
|
||||||
|
/** dummy function pointers for non-leaf MIB nodes from mib2.c */
|
||||||
|
void noleafs_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od);
|
||||||
|
void noleafs_get_value(struct obj_def *od, u16_t len, void *value);
|
||||||
|
u8_t noleafs_set_test(struct obj_def *od, u16_t len, void *value);
|
||||||
|
void noleafs_set_value(struct obj_def *od, u16_t len, void *value);
|
||||||
|
|
||||||
|
void snmp_oidtoip(s32_t *ident, ip_addr_t *ip);
|
||||||
|
void snmp_iptooid(ip_addr_t *ip, s32_t *ident);
|
||||||
|
void snmp_ifindextonetif(s32_t ifindex, struct netif **netif);
|
||||||
|
void snmp_netiftoifindex(struct netif *netif, s32_t *ifidx);
|
||||||
|
|
||||||
|
struct mib_list_node* snmp_mib_ln_alloc(s32_t id);
|
||||||
|
void snmp_mib_ln_free(struct mib_list_node *ln);
|
||||||
|
struct mib_list_rootnode* snmp_mib_lrn_alloc(void);
|
||||||
|
void snmp_mib_lrn_free(struct mib_list_rootnode *lrn);
|
||||||
|
|
||||||
|
s8_t snmp_mib_node_insert(struct mib_list_rootnode *rn, s32_t objid, struct mib_list_node **insn);
|
||||||
|
s8_t snmp_mib_node_find(struct mib_list_rootnode *rn, s32_t objid, struct mib_list_node **fn);
|
||||||
|
struct mib_list_rootnode *snmp_mib_node_delete(struct mib_list_rootnode *rn, struct mib_list_node *n);
|
||||||
|
|
||||||
|
struct mib_node* snmp_search_tree(struct mib_node *node, u8_t ident_len, s32_t *ident, struct snmp_name_ptr *np);
|
||||||
|
struct mib_node* snmp_expand_tree(struct mib_node *node, u8_t ident_len, s32_t *ident, struct snmp_obj_id *oidret);
|
||||||
|
u8_t snmp_iso_prefix_tst(u8_t ident_len, s32_t *ident);
|
||||||
|
u8_t snmp_iso_prefix_expand(u8_t ident_len, s32_t *ident, struct snmp_obj_id *oidret);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* LWIP_SNMP */
|
||||||
|
|
||||||
|
#endif /* __LWIP_SNMP_STRUCTS_H__ */
|
376
app/include/lwip/sockets.h
Normal file
376
app/include/lwip/sockets.h
Normal file
@ -0,0 +1,376 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2001-2004 Swedish Institute of Computer Science.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* This file is part of the lwIP TCP/IP stack.
|
||||||
|
*
|
||||||
|
* Author: Adam Dunkels <adam@sics.se>
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef __LWIP_SOCKETS_H__
|
||||||
|
#define __LWIP_SOCKETS_H__
|
||||||
|
|
||||||
|
#include "lwip/opt.h"
|
||||||
|
|
||||||
|
#if LWIP_SOCKET /* don't build if not configured for use in lwipopts.h */
|
||||||
|
|
||||||
|
#include <stddef.h> /* for size_t */
|
||||||
|
|
||||||
|
#include "lwip/ip_addr.h"
|
||||||
|
#include "lwip/inet.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* members are in network byte order */
|
||||||
|
struct sockaddr_in {
|
||||||
|
u8_t sin_len;
|
||||||
|
u8_t sin_family;
|
||||||
|
u16_t sin_port;
|
||||||
|
struct in_addr sin_addr;
|
||||||
|
char sin_zero[8];
|
||||||
|
};
|
||||||
|
|
||||||
|
struct sockaddr {
|
||||||
|
u8_t sa_len;
|
||||||
|
u8_t sa_family;
|
||||||
|
char sa_data[14];
|
||||||
|
};
|
||||||
|
|
||||||
|
#ifndef socklen_t
|
||||||
|
# define socklen_t u32_t
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Socket protocol types (TCP/UDP/RAW) */
|
||||||
|
#define SOCK_STREAM 1
|
||||||
|
#define SOCK_DGRAM 2
|
||||||
|
#define SOCK_RAW 3
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Option flags per-socket. These must match the SOF_ flags in ip.h (checked in init.c)
|
||||||
|
*/
|
||||||
|
#define SO_DEBUG 0x0001 /* Unimplemented: turn on debugging info recording */
|
||||||
|
#define SO_ACCEPTCONN 0x0002 /* socket has had listen() */
|
||||||
|
#define SO_REUSEADDR 0x0004 /* Allow local address reuse */
|
||||||
|
#define SO_KEEPALIVE 0x0008 /* keep connections alive */
|
||||||
|
#define SO_DONTROUTE 0x0010 /* Unimplemented: just use interface addresses */
|
||||||
|
#define SO_BROADCAST 0x0020 /* permit to send and to receive broadcast messages (see IP_SOF_BROADCAST option) */
|
||||||
|
#define SO_USELOOPBACK 0x0040 /* Unimplemented: bypass hardware when possible */
|
||||||
|
#define SO_LINGER 0x0080 /* linger on close if data present */
|
||||||
|
#define SO_OOBINLINE 0x0100 /* Unimplemented: leave received OOB data in line */
|
||||||
|
#define SO_REUSEPORT 0x0200 /* Unimplemented: allow local address & port reuse */
|
||||||
|
|
||||||
|
#define SO_DONTLINGER ((int)(~SO_LINGER))
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Additional options, not kept in so_options.
|
||||||
|
*/
|
||||||
|
#define SO_SNDBUF 0x1001 /* Unimplemented: send buffer size */
|
||||||
|
#define SO_RCVBUF 0x1002 /* receive buffer size */
|
||||||
|
#define SO_SNDLOWAT 0x1003 /* Unimplemented: send low-water mark */
|
||||||
|
#define SO_RCVLOWAT 0x1004 /* Unimplemented: receive low-water mark */
|
||||||
|
#define SO_SNDTIMEO 0x1005 /* Unimplemented: send timeout */
|
||||||
|
#define SO_RCVTIMEO 0x1006 /* receive timeout */
|
||||||
|
#define SO_ERROR 0x1007 /* get error status and clear */
|
||||||
|
#define SO_TYPE 0x1008 /* get socket type */
|
||||||
|
#define SO_CONTIMEO 0x1009 /* Unimplemented: connect timeout */
|
||||||
|
#define SO_NO_CHECK 0x100a /* don't create UDP checksum */
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Structure used for manipulating linger option.
|
||||||
|
*/
|
||||||
|
struct linger {
|
||||||
|
int l_onoff; /* option on/off */
|
||||||
|
int l_linger; /* linger time */
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Level number for (get/set)sockopt() to apply to socket itself.
|
||||||
|
*/
|
||||||
|
#define SOL_SOCKET 0xfff /* options for socket level */
|
||||||
|
|
||||||
|
|
||||||
|
#define AF_UNSPEC 0
|
||||||
|
#define AF_INET 2
|
||||||
|
#define PF_INET AF_INET
|
||||||
|
#define PF_UNSPEC AF_UNSPEC
|
||||||
|
|
||||||
|
#define IPPROTO_IP 0
|
||||||
|
#define IPPROTO_TCP 6
|
||||||
|
#define IPPROTO_UDP 17
|
||||||
|
#define IPPROTO_UDPLITE 136
|
||||||
|
|
||||||
|
/* Flags we can use with send and recv. */
|
||||||
|
#define MSG_PEEK 0x01 /* Peeks at an incoming message */
|
||||||
|
#define MSG_WAITALL 0x02 /* Unimplemented: Requests that the function block until the full amount of data requested can be returned */
|
||||||
|
#define MSG_OOB 0x04 /* Unimplemented: Requests out-of-band data. The significance and semantics of out-of-band data are protocol-specific */
|
||||||
|
#define MSG_DONTWAIT 0x08 /* Nonblocking i/o for this operation only */
|
||||||
|
#define MSG_MORE 0x10 /* Sender will send more */
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Options for level IPPROTO_IP
|
||||||
|
*/
|
||||||
|
#define IP_TOS 1
|
||||||
|
#define IP_TTL 2
|
||||||
|
|
||||||
|
#if LWIP_TCP
|
||||||
|
/*
|
||||||
|
* Options for level IPPROTO_TCP
|
||||||
|
*/
|
||||||
|
#define TCP_NODELAY 0x01 /* don't delay send to coalesce packets */
|
||||||
|
#define TCP_KEEPALIVE 0x02 /* send KEEPALIVE probes when idle for pcb->keep_idle milliseconds */
|
||||||
|
#define TCP_KEEPIDLE 0x03 /* set pcb->keep_idle - Same as TCP_KEEPALIVE, but use seconds for get/setsockopt */
|
||||||
|
#define TCP_KEEPINTVL 0x04 /* set pcb->keep_intvl - Use seconds for get/setsockopt */
|
||||||
|
#define TCP_KEEPCNT 0x05 /* set pcb->keep_cnt - Use number of probes sent for get/setsockopt */
|
||||||
|
#endif /* LWIP_TCP */
|
||||||
|
|
||||||
|
#if LWIP_UDP && LWIP_UDPLITE
|
||||||
|
/*
|
||||||
|
* Options for level IPPROTO_UDPLITE
|
||||||
|
*/
|
||||||
|
#define UDPLITE_SEND_CSCOV 0x01 /* sender checksum coverage */
|
||||||
|
#define UDPLITE_RECV_CSCOV 0x02 /* minimal receiver checksum coverage */
|
||||||
|
#endif /* LWIP_UDP && LWIP_UDPLITE*/
|
||||||
|
|
||||||
|
|
||||||
|
#if LWIP_IGMP
|
||||||
|
/*
|
||||||
|
* Options and types for UDP multicast traffic handling
|
||||||
|
*/
|
||||||
|
#define IP_ADD_MEMBERSHIP 3
|
||||||
|
#define IP_DROP_MEMBERSHIP 4
|
||||||
|
#define IP_MULTICAST_TTL 5
|
||||||
|
#define IP_MULTICAST_IF 6
|
||||||
|
#define IP_MULTICAST_LOOP 7
|
||||||
|
|
||||||
|
typedef struct ip_mreq {
|
||||||
|
struct in_addr imr_multiaddr; /* IP multicast address of group */
|
||||||
|
struct in_addr imr_interface; /* local IP address of interface */
|
||||||
|
} ip_mreq;
|
||||||
|
#endif /* LWIP_IGMP */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The Type of Service provides an indication of the abstract
|
||||||
|
* parameters of the quality of service desired. These parameters are
|
||||||
|
* to be used to guide the selection of the actual service parameters
|
||||||
|
* when transmitting a datagram through a particular network. Several
|
||||||
|
* networks offer service precedence, which somehow treats high
|
||||||
|
* precedence traffic as more important than other traffic (generally
|
||||||
|
* by accepting only traffic above a certain precedence at time of high
|
||||||
|
* load). The major choice is a three way tradeoff between low-delay,
|
||||||
|
* high-reliability, and high-throughput.
|
||||||
|
* The use of the Delay, Throughput, and Reliability indications may
|
||||||
|
* increase the cost (in some sense) of the service. In many networks
|
||||||
|
* better performance for one of these parameters is coupled with worse
|
||||||
|
* performance on another. Except for very unusual cases at most two
|
||||||
|
* of these three indications should be set.
|
||||||
|
*/
|
||||||
|
#define IPTOS_TOS_MASK 0x1E
|
||||||
|
#define IPTOS_TOS(tos) ((tos) & IPTOS_TOS_MASK)
|
||||||
|
#define IPTOS_LOWDELAY 0x10
|
||||||
|
#define IPTOS_THROUGHPUT 0x08
|
||||||
|
#define IPTOS_RELIABILITY 0x04
|
||||||
|
#define IPTOS_LOWCOST 0x02
|
||||||
|
#define IPTOS_MINCOST IPTOS_LOWCOST
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The Network Control precedence designation is intended to be used
|
||||||
|
* within a network only. The actual use and control of that
|
||||||
|
* designation is up to each network. The Internetwork Control
|
||||||
|
* designation is intended for use by gateway control originators only.
|
||||||
|
* If the actual use of these precedence designations is of concern to
|
||||||
|
* a particular network, it is the responsibility of that network to
|
||||||
|
* control the access to, and use of, those precedence designations.
|
||||||
|
*/
|
||||||
|
#define IPTOS_PREC_MASK 0xe0
|
||||||
|
#define IPTOS_PREC(tos) ((tos) & IPTOS_PREC_MASK)
|
||||||
|
#define IPTOS_PREC_NETCONTROL 0xe0
|
||||||
|
#define IPTOS_PREC_INTERNETCONTROL 0xc0
|
||||||
|
#define IPTOS_PREC_CRITIC_ECP 0xa0
|
||||||
|
#define IPTOS_PREC_FLASHOVERRIDE 0x80
|
||||||
|
#define IPTOS_PREC_FLASH 0x60
|
||||||
|
#define IPTOS_PREC_IMMEDIATE 0x40
|
||||||
|
#define IPTOS_PREC_PRIORITY 0x20
|
||||||
|
#define IPTOS_PREC_ROUTINE 0x00
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Commands for ioctlsocket(), taken from the BSD file fcntl.h.
|
||||||
|
* lwip_ioctl only supports FIONREAD and FIONBIO, for now
|
||||||
|
*
|
||||||
|
* Ioctl's have the command encoded in the lower word,
|
||||||
|
* and the size of any in or out parameters in the upper
|
||||||
|
* word. The high 2 bits of the upper word are used
|
||||||
|
* to encode the in/out status of the parameter; for now
|
||||||
|
* we restrict parameters to at most 128 bytes.
|
||||||
|
*/
|
||||||
|
#if !defined(FIONREAD) || !defined(FIONBIO)
|
||||||
|
#define IOCPARM_MASK 0x7fU /* parameters must be < 128 bytes */
|
||||||
|
#define IOC_VOID 0x20000000UL /* no parameters */
|
||||||
|
#define IOC_OUT 0x40000000UL /* copy out parameters */
|
||||||
|
#define IOC_IN 0x80000000UL /* copy in parameters */
|
||||||
|
#define IOC_INOUT (IOC_IN|IOC_OUT)
|
||||||
|
/* 0x20000000 distinguishes new &
|
||||||
|
old ioctl's */
|
||||||
|
#define _IO(x,y) (IOC_VOID|((x)<<8)|(y))
|
||||||
|
|
||||||
|
#define _IOR(x,y,t) (IOC_OUT|(((long)sizeof(t)&IOCPARM_MASK)<<16)|((x)<<8)|(y))
|
||||||
|
|
||||||
|
#define _IOW(x,y,t) (IOC_IN|(((long)sizeof(t)&IOCPARM_MASK)<<16)|((x)<<8)|(y))
|
||||||
|
#endif /* !defined(FIONREAD) || !defined(FIONBIO) */
|
||||||
|
|
||||||
|
#ifndef FIONREAD
|
||||||
|
#define FIONREAD _IOR('f', 127, unsigned long) /* get # bytes to read */
|
||||||
|
#endif
|
||||||
|
#ifndef FIONBIO
|
||||||
|
#define FIONBIO _IOW('f', 126, unsigned long) /* set/clear non-blocking i/o */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Socket I/O Controls: unimplemented */
|
||||||
|
#ifndef SIOCSHIWAT
|
||||||
|
#define SIOCSHIWAT _IOW('s', 0, unsigned long) /* set high watermark */
|
||||||
|
#define SIOCGHIWAT _IOR('s', 1, unsigned long) /* get high watermark */
|
||||||
|
#define SIOCSLOWAT _IOW('s', 2, unsigned long) /* set low watermark */
|
||||||
|
#define SIOCGLOWAT _IOR('s', 3, unsigned long) /* get low watermark */
|
||||||
|
#define SIOCATMARK _IOR('s', 7, unsigned long) /* at oob mark? */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* commands for fnctl */
|
||||||
|
#ifndef F_GETFL
|
||||||
|
#define F_GETFL 3
|
||||||
|
#endif
|
||||||
|
#ifndef F_SETFL
|
||||||
|
#define F_SETFL 4
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* File status flags and file access modes for fnctl,
|
||||||
|
these are bits in an int. */
|
||||||
|
#ifndef O_NONBLOCK
|
||||||
|
#define O_NONBLOCK 1 /* nonblocking I/O */
|
||||||
|
#endif
|
||||||
|
#ifndef O_NDELAY
|
||||||
|
#define O_NDELAY 1 /* same as O_NONBLOCK, for compatibility */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef SHUT_RD
|
||||||
|
#define SHUT_RD 0
|
||||||
|
#define SHUT_WR 1
|
||||||
|
#define SHUT_RDWR 2
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* FD_SET used for lwip_select */
|
||||||
|
#ifndef FD_SET
|
||||||
|
#undef FD_SETSIZE
|
||||||
|
/* Make FD_SETSIZE match NUM_SOCKETS in socket.c */
|
||||||
|
#define FD_SETSIZE MEMP_NUM_NETCONN
|
||||||
|
#define FD_SET(n, p) ((p)->fd_bits[(n)/8] |= (1 << ((n) & 7)))
|
||||||
|
#define FD_CLR(n, p) ((p)->fd_bits[(n)/8] &= ~(1 << ((n) & 7)))
|
||||||
|
#define FD_ISSET(n,p) ((p)->fd_bits[(n)/8] & (1 << ((n) & 7)))
|
||||||
|
#define FD_ZERO(p) memset((void*)(p),0,sizeof(*(p)))
|
||||||
|
|
||||||
|
typedef struct fd_set {
|
||||||
|
unsigned char fd_bits [(FD_SETSIZE+7)/8];
|
||||||
|
} fd_set;
|
||||||
|
|
||||||
|
#endif /* FD_SET */
|
||||||
|
|
||||||
|
/** LWIP_TIMEVAL_PRIVATE: if you want to use the struct timeval provided
|
||||||
|
* by your system, set this to 0 and include <sys/time.h> in cc.h */
|
||||||
|
#ifndef LWIP_TIMEVAL_PRIVATE
|
||||||
|
#define LWIP_TIMEVAL_PRIVATE 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if LWIP_TIMEVAL_PRIVATE
|
||||||
|
struct timeval {
|
||||||
|
long tv_sec; /* seconds */
|
||||||
|
long tv_usec; /* and microseconds */
|
||||||
|
};
|
||||||
|
#endif /* LWIP_TIMEVAL_PRIVATE */
|
||||||
|
|
||||||
|
void lwip_socket_init(void);
|
||||||
|
|
||||||
|
int lwip_accept(int s, struct sockaddr *addr, socklen_t *addrlen);
|
||||||
|
int lwip_bind(int s, const struct sockaddr *name, socklen_t namelen);
|
||||||
|
int lwip_shutdown(int s, int how);
|
||||||
|
int lwip_getpeername (int s, struct sockaddr *name, socklen_t *namelen);
|
||||||
|
int lwip_getsockname (int s, struct sockaddr *name, socklen_t *namelen);
|
||||||
|
int lwip_getsockopt (int s, int level, int optname, void *optval, socklen_t *optlen);
|
||||||
|
int lwip_setsockopt (int s, int level, int optname, const void *optval, socklen_t optlen);
|
||||||
|
int lwip_close(int s);
|
||||||
|
int lwip_connect(int s, const struct sockaddr *name, socklen_t namelen);
|
||||||
|
int lwip_listen(int s, int backlog);
|
||||||
|
int lwip_recv(int s, void *mem, size_t len, int flags);
|
||||||
|
int lwip_read(int s, void *mem, size_t len);
|
||||||
|
int lwip_recvfrom(int s, void *mem, size_t len, int flags,
|
||||||
|
struct sockaddr *from, socklen_t *fromlen);
|
||||||
|
int lwip_send(int s, const void *dataptr, size_t size, int flags);
|
||||||
|
int lwip_sendto(int s, const void *dataptr, size_t size, int flags,
|
||||||
|
const struct sockaddr *to, socklen_t tolen);
|
||||||
|
int lwip_socket(int domain, int type, int protocol);
|
||||||
|
int lwip_write(int s, const void *dataptr, size_t size);
|
||||||
|
int lwip_select(int maxfdp1, fd_set *readset, fd_set *writeset, fd_set *exceptset,
|
||||||
|
struct timeval *timeout);
|
||||||
|
int lwip_ioctl(int s, long cmd, void *argp);
|
||||||
|
int lwip_fcntl(int s, int cmd, int val);
|
||||||
|
|
||||||
|
#if LWIP_COMPAT_SOCKETS
|
||||||
|
#define accept(a,b,c) lwip_accept(a,b,c)
|
||||||
|
#define bind(a,b,c) lwip_bind(a,b,c)
|
||||||
|
#define shutdown(a,b) lwip_shutdown(a,b)
|
||||||
|
#define closesocket(s) lwip_close(s)
|
||||||
|
#define connect(a,b,c) lwip_connect(a,b,c)
|
||||||
|
#define getsockname(a,b,c) lwip_getsockname(a,b,c)
|
||||||
|
#define getpeername(a,b,c) lwip_getpeername(a,b,c)
|
||||||
|
#define setsockopt(a,b,c,d,e) lwip_setsockopt(a,b,c,d,e)
|
||||||
|
#define getsockopt(a,b,c,d,e) lwip_getsockopt(a,b,c,d,e)
|
||||||
|
#define listen(a,b) lwip_listen(a,b)
|
||||||
|
#define recv(a,b,c,d) lwip_recv(a,b,c,d)
|
||||||
|
#define recvfrom(a,b,c,d,e,f) lwip_recvfrom(a,b,c,d,e,f)
|
||||||
|
#define send(a,b,c,d) lwip_send(a,b,c,d)
|
||||||
|
#define sendto(a,b,c,d,e,f) lwip_sendto(a,b,c,d,e,f)
|
||||||
|
#define socket(a,b,c) lwip_socket(a,b,c)
|
||||||
|
#define select(a,b,c,d,e) lwip_select(a,b,c,d,e)
|
||||||
|
#define ioctlsocket(a,b,c) lwip_ioctl(a,b,c)
|
||||||
|
|
||||||
|
#if LWIP_POSIX_SOCKETS_IO_NAMES
|
||||||
|
#define read(a,b,c) lwip_read(a,b,c)
|
||||||
|
#define write(a,b,c) lwip_write(a,b,c)
|
||||||
|
#define close(s) lwip_close(s)
|
||||||
|
#endif /* LWIP_POSIX_SOCKETS_IO_NAMES */
|
||||||
|
|
||||||
|
#endif /* LWIP_COMPAT_SOCKETS */
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* LWIP_SOCKET */
|
||||||
|
|
||||||
|
#endif /* __LWIP_SOCKETS_H__ */
|
292
app/include/lwip/stats.h
Normal file
292
app/include/lwip/stats.h
Normal file
@ -0,0 +1,292 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2001-2004 Swedish Institute of Computer Science.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* This file is part of the lwIP TCP/IP stack.
|
||||||
|
*
|
||||||
|
* Author: Adam Dunkels <adam@sics.se>
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#ifndef __LWIP_STATS_H__
|
||||||
|
#define __LWIP_STATS_H__
|
||||||
|
|
||||||
|
#include "lwip/opt.h"
|
||||||
|
|
||||||
|
#include "lwip/mem.h"
|
||||||
|
#include "lwip/memp.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if LWIP_STATS
|
||||||
|
|
||||||
|
#ifndef LWIP_STATS_LARGE
|
||||||
|
#define LWIP_STATS_LARGE 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if LWIP_STATS_LARGE
|
||||||
|
#define STAT_COUNTER u32_t
|
||||||
|
#define STAT_COUNTER_F U32_F
|
||||||
|
#else
|
||||||
|
#define STAT_COUNTER u16_t
|
||||||
|
#define STAT_COUNTER_F U16_F
|
||||||
|
#endif
|
||||||
|
|
||||||
|
struct stats_proto {
|
||||||
|
STAT_COUNTER xmit; /* Transmitted packets. */
|
||||||
|
STAT_COUNTER recv; /* Received packets. */
|
||||||
|
STAT_COUNTER fw; /* Forwarded packets. */
|
||||||
|
STAT_COUNTER drop; /* Dropped packets. */
|
||||||
|
STAT_COUNTER chkerr; /* Checksum error. */
|
||||||
|
STAT_COUNTER lenerr; /* Invalid length error. */
|
||||||
|
STAT_COUNTER memerr; /* Out of memory error. */
|
||||||
|
STAT_COUNTER rterr; /* Routing error. */
|
||||||
|
STAT_COUNTER proterr; /* Protocol error. */
|
||||||
|
STAT_COUNTER opterr; /* Error in options. */
|
||||||
|
STAT_COUNTER err; /* Misc error. */
|
||||||
|
STAT_COUNTER cachehit;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct stats_igmp {
|
||||||
|
STAT_COUNTER xmit; /* Transmitted packets. */
|
||||||
|
STAT_COUNTER recv; /* Received packets. */
|
||||||
|
STAT_COUNTER drop; /* Dropped packets. */
|
||||||
|
STAT_COUNTER chkerr; /* Checksum error. */
|
||||||
|
STAT_COUNTER lenerr; /* Invalid length error. */
|
||||||
|
STAT_COUNTER memerr; /* Out of memory error. */
|
||||||
|
STAT_COUNTER proterr; /* Protocol error. */
|
||||||
|
STAT_COUNTER rx_v1; /* Received v1 frames. */
|
||||||
|
STAT_COUNTER rx_group; /* Received group-specific queries. */
|
||||||
|
STAT_COUNTER rx_general; /* Received general queries. */
|
||||||
|
STAT_COUNTER rx_report; /* Received reports. */
|
||||||
|
STAT_COUNTER tx_join; /* Sent joins. */
|
||||||
|
STAT_COUNTER tx_leave; /* Sent leaves. */
|
||||||
|
STAT_COUNTER tx_report; /* Sent reports. */
|
||||||
|
};
|
||||||
|
|
||||||
|
struct stats_mem {
|
||||||
|
#ifdef LWIP_DEBUG
|
||||||
|
const char *name;
|
||||||
|
#endif /* LWIP_DEBUG */
|
||||||
|
mem_size_t avail;
|
||||||
|
mem_size_t used;
|
||||||
|
mem_size_t max;
|
||||||
|
STAT_COUNTER err;
|
||||||
|
STAT_COUNTER illegal;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct stats_syselem {
|
||||||
|
STAT_COUNTER used;
|
||||||
|
STAT_COUNTER max;
|
||||||
|
STAT_COUNTER err;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct stats_sys {
|
||||||
|
struct stats_syselem sem;
|
||||||
|
struct stats_syselem mutex;
|
||||||
|
struct stats_syselem mbox;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct stats_ {
|
||||||
|
#if LINK_STATS
|
||||||
|
struct stats_proto link;
|
||||||
|
#endif
|
||||||
|
#if ETHARP_STATS
|
||||||
|
struct stats_proto etharp;
|
||||||
|
#endif
|
||||||
|
#if IPFRAG_STATS
|
||||||
|
struct stats_proto ip_frag;
|
||||||
|
#endif
|
||||||
|
#if IP_STATS
|
||||||
|
struct stats_proto ip;
|
||||||
|
#endif
|
||||||
|
#if ICMP_STATS
|
||||||
|
struct stats_proto icmp;
|
||||||
|
#endif
|
||||||
|
#if IGMP_STATS
|
||||||
|
struct stats_igmp igmp;
|
||||||
|
#endif
|
||||||
|
#if UDP_STATS
|
||||||
|
struct stats_proto udp;
|
||||||
|
#endif
|
||||||
|
#if TCP_STATS
|
||||||
|
struct stats_proto tcp;
|
||||||
|
#endif
|
||||||
|
#if MEM_STATS
|
||||||
|
struct stats_mem mem;
|
||||||
|
#endif
|
||||||
|
#if MEMP_STATS
|
||||||
|
struct stats_mem memp[MEMP_MAX];
|
||||||
|
#endif
|
||||||
|
#if SYS_STATS
|
||||||
|
struct stats_sys sys;
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
|
extern struct stats_ lwip_stats;
|
||||||
|
|
||||||
|
void stats_init(void)ICACHE_FLASH_ATTR;
|
||||||
|
|
||||||
|
#define STATS_INC(x) ++lwip_stats.x
|
||||||
|
#define STATS_DEC(x) --lwip_stats.x
|
||||||
|
#define STATS_INC_USED(x, y) do { lwip_stats.x.used += y; \
|
||||||
|
if (lwip_stats.x.max < lwip_stats.x.used) { \
|
||||||
|
lwip_stats.x.max = lwip_stats.x.used; \
|
||||||
|
} \
|
||||||
|
} while(0)
|
||||||
|
#else /* LWIP_STATS */
|
||||||
|
#define stats_init()
|
||||||
|
#define STATS_INC(x)
|
||||||
|
#define STATS_DEC(x)
|
||||||
|
#define STATS_INC_USED(x)
|
||||||
|
#endif /* LWIP_STATS */
|
||||||
|
|
||||||
|
#if TCP_STATS
|
||||||
|
#define TCP_STATS_INC(x) STATS_INC(x)
|
||||||
|
#define TCP_STATS_DISPLAY() stats_display_proto(&lwip_stats.tcp, "TCP")
|
||||||
|
#else
|
||||||
|
#define TCP_STATS_INC(x)
|
||||||
|
#define TCP_STATS_DISPLAY()
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if UDP_STATS
|
||||||
|
#define UDP_STATS_INC(x) STATS_INC(x)
|
||||||
|
#define UDP_STATS_DISPLAY() stats_display_proto(&lwip_stats.udp, "UDP")
|
||||||
|
#else
|
||||||
|
#define UDP_STATS_INC(x)
|
||||||
|
#define UDP_STATS_DISPLAY()
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if ICMP_STATS
|
||||||
|
#define ICMP_STATS_INC(x) STATS_INC(x)
|
||||||
|
#define ICMP_STATS_DISPLAY() stats_display_proto(&lwip_stats.icmp, "ICMP")
|
||||||
|
#else
|
||||||
|
#define ICMP_STATS_INC(x)
|
||||||
|
#define ICMP_STATS_DISPLAY()
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if IGMP_STATS
|
||||||
|
#define IGMP_STATS_INC(x) STATS_INC(x)
|
||||||
|
#define IGMP_STATS_DISPLAY() stats_display_igmp(&lwip_stats.igmp)
|
||||||
|
#else
|
||||||
|
#define IGMP_STATS_INC(x)
|
||||||
|
#define IGMP_STATS_DISPLAY()
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if IP_STATS
|
||||||
|
#define IP_STATS_INC(x) STATS_INC(x)
|
||||||
|
#define IP_STATS_DISPLAY() stats_display_proto(&lwip_stats.ip, "IP")
|
||||||
|
#else
|
||||||
|
#define IP_STATS_INC(x)
|
||||||
|
#define IP_STATS_DISPLAY()
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if IPFRAG_STATS
|
||||||
|
#define IPFRAG_STATS_INC(x) STATS_INC(x)
|
||||||
|
#define IPFRAG_STATS_DISPLAY() stats_display_proto(&lwip_stats.ip_frag, "IP_FRAG")
|
||||||
|
#else
|
||||||
|
#define IPFRAG_STATS_INC(x)
|
||||||
|
#define IPFRAG_STATS_DISPLAY()
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if ETHARP_STATS
|
||||||
|
#define ETHARP_STATS_INC(x) STATS_INC(x)
|
||||||
|
#define ETHARP_STATS_DISPLAY() stats_display_proto(&lwip_stats.etharp, "ETHARP")
|
||||||
|
#else
|
||||||
|
#define ETHARP_STATS_INC(x)
|
||||||
|
#define ETHARP_STATS_DISPLAY()
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if LINK_STATS
|
||||||
|
#define LINK_STATS_INC(x) STATS_INC(x)
|
||||||
|
#define LINK_STATS_DISPLAY() stats_display_proto(&lwip_stats.link, "LINK")
|
||||||
|
#else
|
||||||
|
#define LINK_STATS_INC(x)
|
||||||
|
#define LINK_STATS_DISPLAY()
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if MEM_STATS
|
||||||
|
#define MEM_STATS_AVAIL(x, y) lwip_stats.mem.x = y
|
||||||
|
#define MEM_STATS_INC(x) STATS_INC(mem.x)
|
||||||
|
#define MEM_STATS_INC_USED(x, y) STATS_INC_USED(mem, y)
|
||||||
|
#define MEM_STATS_DEC_USED(x, y) lwip_stats.mem.x -= y
|
||||||
|
#define MEM_STATS_DISPLAY() stats_display_mem(&lwip_stats.mem, "HEAP")
|
||||||
|
#else
|
||||||
|
#define MEM_STATS_AVAIL(x, y)
|
||||||
|
#define MEM_STATS_INC(x)
|
||||||
|
#define MEM_STATS_INC_USED(x, y)
|
||||||
|
#define MEM_STATS_DEC_USED(x, y)
|
||||||
|
#define MEM_STATS_DISPLAY()
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if MEMP_STATS
|
||||||
|
#define MEMP_STATS_AVAIL(x, i, y) lwip_stats.memp[i].x = y
|
||||||
|
#define MEMP_STATS_INC(x, i) STATS_INC(memp[i].x)
|
||||||
|
#define MEMP_STATS_DEC(x, i) STATS_DEC(memp[i].x)
|
||||||
|
#define MEMP_STATS_INC_USED(x, i) STATS_INC_USED(memp[i], 1)
|
||||||
|
#define MEMP_STATS_DISPLAY(i) stats_display_memp(&lwip_stats.memp[i], i)
|
||||||
|
#else
|
||||||
|
#define MEMP_STATS_AVAIL(x, i, y)
|
||||||
|
#define MEMP_STATS_INC(x, i)
|
||||||
|
#define MEMP_STATS_DEC(x, i)
|
||||||
|
#define MEMP_STATS_INC_USED(x, i)
|
||||||
|
#define MEMP_STATS_DISPLAY(i)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if SYS_STATS
|
||||||
|
#define SYS_STATS_INC(x) STATS_INC(sys.x)
|
||||||
|
#define SYS_STATS_DEC(x) STATS_DEC(sys.x)
|
||||||
|
#define SYS_STATS_INC_USED(x) STATS_INC_USED(sys.x, 1)
|
||||||
|
#define SYS_STATS_DISPLAY() stats_display_sys(&lwip_stats.sys)
|
||||||
|
#else
|
||||||
|
#define SYS_STATS_INC(x)
|
||||||
|
#define SYS_STATS_DEC(x)
|
||||||
|
#define SYS_STATS_INC_USED(x)
|
||||||
|
#define SYS_STATS_DISPLAY()
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Display of statistics */
|
||||||
|
#if LWIP_STATS_DISPLAY
|
||||||
|
void stats_display(void)ICACHE_FLASH_ATTR;
|
||||||
|
void stats_display_proto(struct stats_proto *proto, char *name)ICACHE_FLASH_ATTR;
|
||||||
|
void stats_display_igmp(struct stats_igmp *igmp)ICACHE_FLASH_ATTR;
|
||||||
|
void stats_display_mem(struct stats_mem *mem, char *name)ICACHE_FLASH_ATTR;
|
||||||
|
void stats_display_memp(struct stats_mem *mem, int index)ICACHE_FLASH_ATTR;
|
||||||
|
void stats_display_sys(struct stats_sys *sys)ICACHE_FLASH_ATTR;
|
||||||
|
#else /* LWIP_STATS_DISPLAY */
|
||||||
|
#define stats_display()
|
||||||
|
#define stats_display_proto(proto, name)
|
||||||
|
#define stats_display_igmp(igmp)
|
||||||
|
#define stats_display_mem(mem, name)
|
||||||
|
#define stats_display_memp(mem, index)
|
||||||
|
#define stats_display_sys(sys)
|
||||||
|
#endif /* LWIP_STATS_DISPLAY */
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* __LWIP_STATS_H__ */
|
337
app/include/lwip/sys.h
Normal file
337
app/include/lwip/sys.h
Normal file
@ -0,0 +1,337 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2001-2004 Swedish Institute of Computer Science.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* This file is part of the lwIP TCP/IP stack.
|
||||||
|
*
|
||||||
|
* Author: Adam Dunkels <adam@sics.se>
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#ifndef __LWIP_SYS_H__
|
||||||
|
#define __LWIP_SYS_H__
|
||||||
|
|
||||||
|
#include "lwip/opt.h"
|
||||||
|
|
||||||
|
#include "eagle_soc.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if NO_SYS
|
||||||
|
|
||||||
|
/* For a totally minimal and standalone system, we provide null
|
||||||
|
definitions of the sys_ functions. */
|
||||||
|
typedef u8_t sys_sem_t;
|
||||||
|
typedef u8_t sys_mutex_t;
|
||||||
|
typedef u8_t sys_mbox_t;
|
||||||
|
|
||||||
|
#define sys_sem_new(s, c) ERR_OK
|
||||||
|
#define sys_sem_signal(s)
|
||||||
|
#define sys_sem_wait(s)
|
||||||
|
#define sys_arch_sem_wait(s,t)
|
||||||
|
#define sys_sem_free(s)
|
||||||
|
#define sys_mutex_new(mu) ERR_OK
|
||||||
|
#define sys_mutex_lock(mu)
|
||||||
|
#define sys_mutex_unlock(mu)
|
||||||
|
#define sys_mutex_free(mu)
|
||||||
|
#define sys_mbox_new(m, s) ERR_OK
|
||||||
|
#define sys_mbox_fetch(m,d)
|
||||||
|
#define sys_mbox_tryfetch(m,d)
|
||||||
|
#define sys_mbox_post(m,d)
|
||||||
|
#define sys_mbox_trypost(m,d)
|
||||||
|
#define sys_mbox_free(m)
|
||||||
|
|
||||||
|
#define sys_thread_new(n,t,a,s,p)
|
||||||
|
|
||||||
|
#define sys_msleep(t)
|
||||||
|
|
||||||
|
#else /* NO_SYS */
|
||||||
|
|
||||||
|
/** Return code for timeouts from sys_arch_mbox_fetch and sys_arch_sem_wait */
|
||||||
|
#define SYS_ARCH_TIMEOUT 0xffffffffUL
|
||||||
|
|
||||||
|
/** sys_mbox_tryfetch() returns SYS_MBOX_EMPTY if appropriate.
|
||||||
|
* For now we use the same magic value, but we allow this to change in future.
|
||||||
|
*/
|
||||||
|
#define SYS_MBOX_EMPTY SYS_ARCH_TIMEOUT
|
||||||
|
|
||||||
|
#include "lwip/err.h"
|
||||||
|
#include "arch/sys_arch.h"
|
||||||
|
|
||||||
|
/** Function prototype for thread functions */
|
||||||
|
typedef void (*lwip_thread_fn)(void *arg);
|
||||||
|
|
||||||
|
/* Function prototypes for functions to be implemented by platform ports
|
||||||
|
(in sys_arch.c) */
|
||||||
|
|
||||||
|
/* Mutex functions: */
|
||||||
|
|
||||||
|
/** Define LWIP_COMPAT_MUTEX if the port has no mutexes and binary semaphores
|
||||||
|
should be used instead */
|
||||||
|
#if LWIP_COMPAT_MUTEX
|
||||||
|
/* for old ports that don't have mutexes: define them to binary semaphores */
|
||||||
|
#define sys_mutex_t sys_sem_t
|
||||||
|
#define sys_mutex_new(mutex) sys_sem_new(mutex, 1)
|
||||||
|
#define sys_mutex_lock(mutex) sys_sem_wait(mutex)
|
||||||
|
#define sys_mutex_unlock(mutex) sys_sem_signal(mutex)
|
||||||
|
#define sys_mutex_free(mutex) sys_sem_free(mutex)
|
||||||
|
#define sys_mutex_valid(mutex) sys_sem_valid(mutex)
|
||||||
|
#define sys_mutex_set_invalid(mutex) sys_sem_set_invalid(mutex)
|
||||||
|
|
||||||
|
#else /* LWIP_COMPAT_MUTEX */
|
||||||
|
|
||||||
|
/** Create a new mutex
|
||||||
|
* @param mutex pointer to the mutex to create
|
||||||
|
* @return a new mutex */
|
||||||
|
err_t sys_mutex_new(sys_mutex_t *mutex);
|
||||||
|
/** Lock a mutex
|
||||||
|
* @param mutex the mutex to lock */
|
||||||
|
void sys_mutex_lock(sys_mutex_t *mutex);
|
||||||
|
/** Unlock a mutex
|
||||||
|
* @param mutex the mutex to unlock */
|
||||||
|
void sys_mutex_unlock(sys_mutex_t *mutex);
|
||||||
|
/** Delete a semaphore
|
||||||
|
* @param mutex the mutex to delete */
|
||||||
|
void sys_mutex_free(sys_mutex_t *mutex);
|
||||||
|
#ifndef sys_mutex_valid
|
||||||
|
/** Check if a mutex is valid/allocated: return 1 for valid, 0 for invalid */
|
||||||
|
int sys_mutex_valid(sys_mutex_t *mutex);
|
||||||
|
#endif
|
||||||
|
#ifndef sys_mutex_set_invalid
|
||||||
|
/** Set a mutex invalid so that sys_mutex_valid returns 0 */
|
||||||
|
void sys_mutex_set_invalid(sys_mutex_t *mutex);
|
||||||
|
#endif
|
||||||
|
#endif /* LWIP_COMPAT_MUTEX */
|
||||||
|
|
||||||
|
/* Semaphore functions: */
|
||||||
|
|
||||||
|
/** Create a new semaphore
|
||||||
|
* @param sem pointer to the semaphore to create
|
||||||
|
* @param count initial count of the semaphore
|
||||||
|
* @return ERR_OK if successful, another err_t otherwise */
|
||||||
|
err_t sys_sem_new(sys_sem_t *sem, u8_t count);
|
||||||
|
/** Signals a semaphore
|
||||||
|
* @param sem the semaphore to signal */
|
||||||
|
void sys_sem_signal(sys_sem_t *sem);
|
||||||
|
/** Wait for a semaphore for the specified timeout
|
||||||
|
* @param sem the semaphore to wait for
|
||||||
|
* @param timeout timeout in milliseconds to wait (0 = wait forever)
|
||||||
|
* @return time (in milliseconds) waited for the semaphore
|
||||||
|
* or SYS_ARCH_TIMEOUT on timeout */
|
||||||
|
u32_t sys_arch_sem_wait(sys_sem_t *sem, u32_t timeout);
|
||||||
|
/** Delete a semaphore
|
||||||
|
* @param sem semaphore to delete */
|
||||||
|
void sys_sem_free(sys_sem_t *sem);
|
||||||
|
/** Wait for a semaphore - forever/no timeout */
|
||||||
|
#define sys_sem_wait(sem) sys_arch_sem_wait(sem, 0)
|
||||||
|
#ifndef sys_sem_valid
|
||||||
|
/** Check if a sempahore is valid/allocated: return 1 for valid, 0 for invalid */
|
||||||
|
int sys_sem_valid(sys_sem_t *sem);
|
||||||
|
#endif
|
||||||
|
#ifndef sys_sem_set_invalid
|
||||||
|
/** Set a semaphore invalid so that sys_sem_valid returns 0 */
|
||||||
|
void sys_sem_set_invalid(sys_sem_t *sem);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Time functions. */
|
||||||
|
#ifndef sys_msleep
|
||||||
|
void sys_msleep(u32_t ms); /* only has a (close to) 1 jiffy resolution. */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Mailbox functions. */
|
||||||
|
|
||||||
|
/** Create a new mbox of specified size
|
||||||
|
* @param mbox pointer to the mbox to create
|
||||||
|
* @param size (miminum) number of messages in this mbox
|
||||||
|
* @return ERR_OK if successful, another err_t otherwise */
|
||||||
|
err_t sys_mbox_new(sys_mbox_t *mbox, int size);
|
||||||
|
/** Post a message to an mbox - may not fail
|
||||||
|
* -> blocks if full, only used from tasks not from ISR
|
||||||
|
* @param mbox mbox to posts the message
|
||||||
|
* @param msg message to post (ATTENTION: can be NULL) */
|
||||||
|
void sys_mbox_post(sys_mbox_t *mbox, void *msg);
|
||||||
|
/** Try to post a message to an mbox - may fail if full or ISR
|
||||||
|
* @param mbox mbox to posts the message
|
||||||
|
* @param msg message to post (ATTENTION: can be NULL) */
|
||||||
|
err_t sys_mbox_trypost(sys_mbox_t *mbox, void *msg);
|
||||||
|
/** Wait for a new message to arrive in the mbox
|
||||||
|
* @param mbox mbox to get a message from
|
||||||
|
* @param msg pointer where the message is stored
|
||||||
|
* @param timeout maximum time (in milliseconds) to wait for a message
|
||||||
|
* @return time (in milliseconds) waited for a message, may be 0 if not waited
|
||||||
|
or SYS_ARCH_TIMEOUT on timeout
|
||||||
|
* The returned time has to be accurate to prevent timer jitter! */
|
||||||
|
u32_t sys_arch_mbox_fetch(sys_mbox_t *mbox, void **msg, u32_t timeout);
|
||||||
|
/* Allow port to override with a macro, e.g. special timout for sys_arch_mbox_fetch() */
|
||||||
|
#ifndef sys_arch_mbox_tryfetch
|
||||||
|
/** Wait for a new message to arrive in the mbox
|
||||||
|
* @param mbox mbox to get a message from
|
||||||
|
* @param msg pointer where the message is stored
|
||||||
|
* @param timeout maximum time (in milliseconds) to wait for a message
|
||||||
|
* @return 0 (milliseconds) if a message has been received
|
||||||
|
* or SYS_MBOX_EMPTY if the mailbox is empty */
|
||||||
|
u32_t sys_arch_mbox_tryfetch(sys_mbox_t *mbox, void **msg);
|
||||||
|
#endif
|
||||||
|
/** For now, we map straight to sys_arch implementation. */
|
||||||
|
#define sys_mbox_tryfetch(mbox, msg) sys_arch_mbox_tryfetch(mbox, msg)
|
||||||
|
/** Delete an mbox
|
||||||
|
* @param mbox mbox to delete */
|
||||||
|
void sys_mbox_free(sys_mbox_t *mbox);
|
||||||
|
#define sys_mbox_fetch(mbox, msg) sys_arch_mbox_fetch(mbox, msg, 0)
|
||||||
|
#ifndef sys_mbox_valid
|
||||||
|
/** Check if an mbox is valid/allocated: return 1 for valid, 0 for invalid */
|
||||||
|
int sys_mbox_valid(sys_mbox_t *mbox);
|
||||||
|
#endif
|
||||||
|
#ifndef sys_mbox_set_invalid
|
||||||
|
/** Set an mbox invalid so that sys_mbox_valid returns 0 */
|
||||||
|
void sys_mbox_set_invalid(sys_mbox_t *mbox);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/** The only thread function:
|
||||||
|
* Creates a new thread
|
||||||
|
* @param name human-readable name for the thread (used for debugging purposes)
|
||||||
|
* @param thread thread-function
|
||||||
|
* @param arg parameter passed to 'thread'
|
||||||
|
* @param stacksize stack size in bytes for the new thread (may be ignored by ports)
|
||||||
|
* @param prio priority of the new thread (may be ignored by ports) */
|
||||||
|
sys_thread_t sys_thread_new(const char *name, lwip_thread_fn thread, void *arg, int stacksize, int prio);
|
||||||
|
|
||||||
|
#endif /* NO_SYS */
|
||||||
|
|
||||||
|
/* sys_init() must be called before anthing else. */
|
||||||
|
void sys_init(void)ICACHE_FLASH_ATTR;
|
||||||
|
|
||||||
|
#ifndef sys_jiffies
|
||||||
|
/** Ticks/jiffies since power up. */
|
||||||
|
u32_t sys_jiffies(void)ICACHE_FLASH_ATTR;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/** Returns the current time in milliseconds,
|
||||||
|
* may be the same as sys_jiffies or at least based on it. */
|
||||||
|
static inline u32_t sys_now(void) ICACHE_FLASH_ATTR;
|
||||||
|
static inline u32_t sys_now(void)
|
||||||
|
{
|
||||||
|
return NOW()/(TIMER_CLK_FREQ/1000);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Critical Region Protection */
|
||||||
|
/* These functions must be implemented in the sys_arch.c file.
|
||||||
|
In some implementations they can provide a more light-weight protection
|
||||||
|
mechanism than using semaphores. Otherwise semaphores can be used for
|
||||||
|
implementation */
|
||||||
|
#ifndef SYS_ARCH_PROTECT
|
||||||
|
/** SYS_LIGHTWEIGHT_PROT
|
||||||
|
* define SYS_LIGHTWEIGHT_PROT in lwipopts.h if you want inter-task protection
|
||||||
|
* for certain critical regions during buffer allocation, deallocation and memory
|
||||||
|
* allocation and deallocation.
|
||||||
|
*/
|
||||||
|
#if SYS_LIGHTWEIGHT_PROT
|
||||||
|
|
||||||
|
/** SYS_ARCH_DECL_PROTECT
|
||||||
|
* declare a protection variable. This macro will default to defining a variable of
|
||||||
|
* type sys_prot_t. If a particular port needs a different implementation, then
|
||||||
|
* this macro may be defined in sys_arch.h.
|
||||||
|
*/
|
||||||
|
#define SYS_ARCH_DECL_PROTECT(lev) sys_prot_t lev
|
||||||
|
/** SYS_ARCH_PROTECT
|
||||||
|
* Perform a "fast" protect. This could be implemented by
|
||||||
|
* disabling interrupts for an embedded system or by using a semaphore or
|
||||||
|
* mutex. The implementation should allow calling SYS_ARCH_PROTECT when
|
||||||
|
* already protected. The old protection level is returned in the variable
|
||||||
|
* "lev". This macro will default to calling the sys_arch_protect() function
|
||||||
|
* which should be implemented in sys_arch.c. If a particular port needs a
|
||||||
|
* different implementation, then this macro may be defined in sys_arch.h
|
||||||
|
*/
|
||||||
|
#define SYS_ARCH_PROTECT(lev) lev = sys_arch_protect()
|
||||||
|
/** SYS_ARCH_UNPROTECT
|
||||||
|
* Perform a "fast" set of the protection level to "lev". This could be
|
||||||
|
* implemented by setting the interrupt level to "lev" within the MACRO or by
|
||||||
|
* using a semaphore or mutex. This macro will default to calling the
|
||||||
|
* sys_arch_unprotect() function which should be implemented in
|
||||||
|
* sys_arch.c. If a particular port needs a different implementation, then
|
||||||
|
* this macro may be defined in sys_arch.h
|
||||||
|
*/
|
||||||
|
#define SYS_ARCH_UNPROTECT(lev) sys_arch_unprotect(lev)
|
||||||
|
sys_prot_t sys_arch_protect(void)ICACHE_FLASH_ATTR;
|
||||||
|
void sys_arch_unprotect(sys_prot_t pval)ICACHE_FLASH_ATTR;
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
#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_UNPROTECT(lev) lev = os_intr_unlock()
|
||||||
|
|
||||||
|
#endif /* SYS_LIGHTWEIGHT_PROT */
|
||||||
|
|
||||||
|
#endif /* SYS_ARCH_PROTECT */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Macros to set/get and increase/decrease variables in a thread-safe way.
|
||||||
|
* Use these for accessing variable that are used from more than one thread.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef SYS_ARCH_INC
|
||||||
|
#define SYS_ARCH_INC(var, val) do { \
|
||||||
|
SYS_ARCH_DECL_PROTECT(old_level); \
|
||||||
|
SYS_ARCH_PROTECT(old_level); \
|
||||||
|
var += val; \
|
||||||
|
SYS_ARCH_UNPROTECT(old_level); \
|
||||||
|
} while(0)
|
||||||
|
#endif /* SYS_ARCH_INC */
|
||||||
|
|
||||||
|
#ifndef SYS_ARCH_DEC
|
||||||
|
#define SYS_ARCH_DEC(var, val) do { \
|
||||||
|
SYS_ARCH_DECL_PROTECT(old_level); \
|
||||||
|
SYS_ARCH_PROTECT(old_level); \
|
||||||
|
var -= val; \
|
||||||
|
SYS_ARCH_UNPROTECT(old_level); \
|
||||||
|
} while(0)
|
||||||
|
#endif /* SYS_ARCH_DEC */
|
||||||
|
|
||||||
|
#ifndef SYS_ARCH_GET
|
||||||
|
#define SYS_ARCH_GET(var, ret) do { \
|
||||||
|
SYS_ARCH_DECL_PROTECT(old_level); \
|
||||||
|
SYS_ARCH_PROTECT(old_level); \
|
||||||
|
ret = var; \
|
||||||
|
SYS_ARCH_UNPROTECT(old_level); \
|
||||||
|
} while(0)
|
||||||
|
#endif /* SYS_ARCH_GET */
|
||||||
|
|
||||||
|
#ifndef SYS_ARCH_SET
|
||||||
|
#define SYS_ARCH_SET(var, val) do { \
|
||||||
|
SYS_ARCH_DECL_PROTECT(old_level); \
|
||||||
|
SYS_ARCH_PROTECT(old_level); \
|
||||||
|
var = val; \
|
||||||
|
SYS_ARCH_UNPROTECT(old_level); \
|
||||||
|
} while(0)
|
||||||
|
#endif /* SYS_ARCH_SET */
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* __LWIP_SYS_H__ */
|
377
app/include/lwip/tcp.h
Normal file
377
app/include/lwip/tcp.h
Normal file
@ -0,0 +1,377 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2001-2004 Swedish Institute of Computer Science.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* This file is part of the lwIP TCP/IP stack.
|
||||||
|
*
|
||||||
|
* Author: Adam Dunkels <adam@sics.se>
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#ifndef __LWIP_TCP_H__
|
||||||
|
#define __LWIP_TCP_H__
|
||||||
|
|
||||||
|
#include "lwip/opt.h"
|
||||||
|
|
||||||
|
#if LWIP_TCP /* don't build if not configured for use in lwipopts.h */
|
||||||
|
|
||||||
|
#include "lwip/sys.h"
|
||||||
|
#include "lwip/mem.h"
|
||||||
|
#include "lwip/pbuf.h"
|
||||||
|
#include "lwip/ip.h"
|
||||||
|
#include "lwip/icmp.h"
|
||||||
|
#include "lwip/err.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
struct tcp_pcb;
|
||||||
|
|
||||||
|
/** Function prototype for tcp accept callback functions. Called when a new
|
||||||
|
* connection can be accepted on a listening pcb.
|
||||||
|
*
|
||||||
|
* @param arg Additional argument to pass to the callback function (@see tcp_arg())
|
||||||
|
* @param newpcb The new connection pcb
|
||||||
|
* @param err An error code if there has been an error accepting.
|
||||||
|
* Only return ERR_ABRT if you have called tcp_abort from within the
|
||||||
|
* callback function!
|
||||||
|
*/
|
||||||
|
typedef err_t (*tcp_accept_fn)(void *arg, struct tcp_pcb *newpcb, err_t err);
|
||||||
|
|
||||||
|
/** Function prototype for tcp receive callback functions. Called when data has
|
||||||
|
* been received.
|
||||||
|
*
|
||||||
|
* @param arg Additional argument to pass to the callback function (@see tcp_arg())
|
||||||
|
* @param tpcb The connection pcb which received data
|
||||||
|
* @param p The received data (or NULL when the connection has been closed!)
|
||||||
|
* @param err An error code if there has been an error receiving
|
||||||
|
* Only return ERR_ABRT if you have called tcp_abort from within the
|
||||||
|
* callback function!
|
||||||
|
*/
|
||||||
|
typedef err_t (*tcp_recv_fn)(void *arg, struct tcp_pcb *tpcb,
|
||||||
|
struct pbuf *p, err_t err);
|
||||||
|
|
||||||
|
/** Function prototype for tcp sent callback functions. Called when sent data has
|
||||||
|
* been acknowledged by the remote side. Use it to free corresponding resources.
|
||||||
|
* This also means that the pcb has now space available to send new data.
|
||||||
|
*
|
||||||
|
* @param arg Additional argument to pass to the callback function (@see tcp_arg())
|
||||||
|
* @param tpcb The connection pcb for which data has been acknowledged
|
||||||
|
* @param len The amount of bytes acknowledged
|
||||||
|
* @return ERR_OK: try to send some data by calling tcp_output
|
||||||
|
* Only return ERR_ABRT if you have called tcp_abort from within the
|
||||||
|
* callback function!
|
||||||
|
*/
|
||||||
|
typedef err_t (*tcp_sent_fn)(void *arg, struct tcp_pcb *tpcb,
|
||||||
|
u16_t len);
|
||||||
|
|
||||||
|
/** Function prototype for tcp poll callback functions. Called periodically as
|
||||||
|
* specified by @see tcp_poll.
|
||||||
|
*
|
||||||
|
* @param arg Additional argument to pass to the callback function (@see tcp_arg())
|
||||||
|
* @param tpcb tcp pcb
|
||||||
|
* @return ERR_OK: try to send some data by calling tcp_output
|
||||||
|
* Only return ERR_ABRT if you have called tcp_abort from within the
|
||||||
|
* callback function!
|
||||||
|
*/
|
||||||
|
typedef err_t (*tcp_poll_fn)(void *arg, struct tcp_pcb *tpcb);
|
||||||
|
|
||||||
|
/** Function prototype for tcp error callback functions. Called when the pcb
|
||||||
|
* receives a RST or is unexpectedly closed for any other reason.
|
||||||
|
*
|
||||||
|
* @note The corresponding pcb is already freed when this callback is called!
|
||||||
|
*
|
||||||
|
* @param arg Additional argument to pass to the callback function (@see tcp_arg())
|
||||||
|
* @param err Error code to indicate why the pcb has been closed
|
||||||
|
* ERR_ABRT: aborted through tcp_abort or by a TCP timer
|
||||||
|
* ERR_RST: the connection was reset by the remote host
|
||||||
|
*/
|
||||||
|
typedef void (*tcp_err_fn)(void *arg, err_t err);
|
||||||
|
|
||||||
|
/** Function prototype for tcp connected callback functions. Called when a pcb
|
||||||
|
* is connected to the remote side after initiating a connection attempt by
|
||||||
|
* calling tcp_connect().
|
||||||
|
*
|
||||||
|
* @param arg Additional argument to pass to the callback function (@see tcp_arg())
|
||||||
|
* @param tpcb The connection pcb which is connected
|
||||||
|
* @param err An unused error code, always ERR_OK currently ;-) TODO!
|
||||||
|
* Only return ERR_ABRT if you have called tcp_abort from within the
|
||||||
|
* callback function!
|
||||||
|
*
|
||||||
|
* @note When a connection attempt fails, the error callback is currently called!
|
||||||
|
*/
|
||||||
|
typedef err_t (*tcp_connected_fn)(void *arg, struct tcp_pcb *tpcb, err_t err);
|
||||||
|
|
||||||
|
enum tcp_state {
|
||||||
|
CLOSED = 0,
|
||||||
|
LISTEN = 1,
|
||||||
|
SYN_SENT = 2,
|
||||||
|
SYN_RCVD = 3,
|
||||||
|
ESTABLISHED = 4,
|
||||||
|
FIN_WAIT_1 = 5,
|
||||||
|
FIN_WAIT_2 = 6,
|
||||||
|
CLOSE_WAIT = 7,
|
||||||
|
CLOSING = 8,
|
||||||
|
LAST_ACK = 9,
|
||||||
|
TIME_WAIT = 10
|
||||||
|
};
|
||||||
|
|
||||||
|
#if LWIP_CALLBACK_API
|
||||||
|
/* Function to call when a listener has been connected.
|
||||||
|
* @param arg user-supplied argument (tcp_pcb.callback_arg)
|
||||||
|
* @param pcb a new tcp_pcb that now is connected
|
||||||
|
* @param err an error argument (TODO: that is current always ERR_OK?)
|
||||||
|
* @return ERR_OK: accept the new connection,
|
||||||
|
* any other err_t abortsthe new connection
|
||||||
|
*/
|
||||||
|
#define DEF_ACCEPT_CALLBACK tcp_accept_fn accept;
|
||||||
|
#else /* LWIP_CALLBACK_API */
|
||||||
|
#define DEF_ACCEPT_CALLBACK
|
||||||
|
#endif /* LWIP_CALLBACK_API */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* members common to struct tcp_pcb and struct tcp_listen_pcb
|
||||||
|
*/
|
||||||
|
#define TCP_PCB_COMMON(type) \
|
||||||
|
type *next; /* for the linked list */ \
|
||||||
|
enum tcp_state state; /* TCP state */ \
|
||||||
|
u8_t prio; \
|
||||||
|
void *callback_arg; \
|
||||||
|
/* the accept callback for listen- and normal pcbs, if LWIP_CALLBACK_API */ \
|
||||||
|
DEF_ACCEPT_CALLBACK \
|
||||||
|
/* ports are in host byte order */ \
|
||||||
|
u16_t local_port
|
||||||
|
|
||||||
|
|
||||||
|
/* the TCP protocol control block */
|
||||||
|
struct tcp_pcb {
|
||||||
|
/** common PCB members */
|
||||||
|
IP_PCB;
|
||||||
|
/** protocol specific PCB members */
|
||||||
|
TCP_PCB_COMMON(struct tcp_pcb);
|
||||||
|
|
||||||
|
/* ports are in host byte order */
|
||||||
|
u16_t remote_port;
|
||||||
|
|
||||||
|
u8_t flags;
|
||||||
|
#define TF_ACK_DELAY ((u8_t)0x01U) /* Delayed ACK. */
|
||||||
|
#define TF_ACK_NOW ((u8_t)0x02U) /* Immediate ACK. */
|
||||||
|
#define TF_INFR ((u8_t)0x04U) /* In fast recovery. */
|
||||||
|
#define TF_TIMESTAMP ((u8_t)0x08U) /* Timestamp option enabled */
|
||||||
|
#define TF_RXCLOSED ((u8_t)0x10U) /* rx closed by tcp_shutdown */
|
||||||
|
#define TF_FIN ((u8_t)0x20U) /* Connection was closed locally (FIN segment enqueued). */
|
||||||
|
#define TF_NODELAY ((u8_t)0x40U) /* Disable Nagle algorithm */
|
||||||
|
#define TF_NAGLEMEMERR ((u8_t)0x80U) /* nagle enabled, memerr, try to output to prevent delayed ACK to happen */
|
||||||
|
|
||||||
|
/* the rest of the fields are in host byte order
|
||||||
|
as we have to do some math with them */
|
||||||
|
/* receiver variables */
|
||||||
|
u32_t rcv_nxt; /* next seqno expected */
|
||||||
|
u16_t rcv_wnd; /* receiver window available */
|
||||||
|
u16_t rcv_ann_wnd; /* receiver window to announce */
|
||||||
|
u32_t rcv_ann_right_edge; /* announced right edge of window */
|
||||||
|
|
||||||
|
/* Timers */
|
||||||
|
u32_t tmr;
|
||||||
|
u8_t polltmr, pollinterval;
|
||||||
|
|
||||||
|
/* Retransmission timer. */
|
||||||
|
s16_t rtime;
|
||||||
|
|
||||||
|
u16_t mss; /* maximum segment size */
|
||||||
|
|
||||||
|
/* RTT (round trip time) estimation variables */
|
||||||
|
u32_t rttest; /* RTT estimate in 500ms ticks */
|
||||||
|
u32_t rtseq; /* sequence number being timed */
|
||||||
|
s16_t sa, sv; /* @todo document this */
|
||||||
|
|
||||||
|
s16_t rto; /* retransmission time-out */
|
||||||
|
u8_t nrtx; /* number of retransmissions */
|
||||||
|
|
||||||
|
/* fast retransmit/recovery */
|
||||||
|
u32_t lastack; /* Highest acknowledged seqno. */
|
||||||
|
u8_t dupacks;
|
||||||
|
|
||||||
|
/* congestion avoidance/control variables */
|
||||||
|
u16_t cwnd;
|
||||||
|
u16_t ssthresh;
|
||||||
|
|
||||||
|
/* sender variables */
|
||||||
|
u32_t snd_nxt; /* next new seqno to be sent */
|
||||||
|
u16_t snd_wnd; /* sender window */
|
||||||
|
u32_t snd_wl1, snd_wl2; /* Sequence and acknowledgement numbers of last
|
||||||
|
window update. */
|
||||||
|
u32_t snd_lbb; /* Sequence number of next byte to be buffered. */
|
||||||
|
|
||||||
|
u16_t acked;
|
||||||
|
|
||||||
|
u16_t snd_buf; /* Available buffer space for sending (in bytes). */
|
||||||
|
#define TCP_SNDQUEUELEN_OVERFLOW (0xffff-3)
|
||||||
|
u16_t snd_queuelen; /* Available buffer space for sending (in tcp_segs). */
|
||||||
|
|
||||||
|
#if TCP_OVERSIZE
|
||||||
|
/* Extra bytes available at the end of the last pbuf in unsent. */
|
||||||
|
u16_t unsent_oversize;
|
||||||
|
#endif /* TCP_OVERSIZE */
|
||||||
|
|
||||||
|
/* These are ordered by sequence number: */
|
||||||
|
struct tcp_seg *unsent; /* Unsent (queued) segments. */
|
||||||
|
struct tcp_seg *unacked; /* Sent but unacknowledged segments. */
|
||||||
|
#if TCP_QUEUE_OOSEQ
|
||||||
|
struct tcp_seg *ooseq; /* Received out of sequence segments. */
|
||||||
|
#endif /* TCP_QUEUE_OOSEQ */
|
||||||
|
|
||||||
|
struct pbuf *refused_data; /* Data previously received but not yet taken by upper layer */
|
||||||
|
|
||||||
|
#if LWIP_CALLBACK_API
|
||||||
|
/* Function to be called when more send buffer space is available. */
|
||||||
|
tcp_sent_fn sent;
|
||||||
|
/* Function to be called when (in-sequence) data has arrived. */
|
||||||
|
tcp_recv_fn recv;
|
||||||
|
/* Function to be called when a connection has been set up. */
|
||||||
|
tcp_connected_fn connected;
|
||||||
|
/* Function which is called periodically. */
|
||||||
|
tcp_poll_fn poll;
|
||||||
|
/* Function to be called whenever a fatal error occurs. */
|
||||||
|
tcp_err_fn errf;
|
||||||
|
#endif /* LWIP_CALLBACK_API */
|
||||||
|
|
||||||
|
#if LWIP_TCP_TIMESTAMPS
|
||||||
|
u32_t ts_lastacksent;
|
||||||
|
u32_t ts_recent;
|
||||||
|
#endif /* LWIP_TCP_TIMESTAMPS */
|
||||||
|
|
||||||
|
/* idle time before KEEPALIVE is sent */
|
||||||
|
u32_t keep_idle;
|
||||||
|
#if LWIP_TCP_KEEPALIVE
|
||||||
|
u32_t keep_intvl;
|
||||||
|
u32_t keep_cnt;
|
||||||
|
#endif /* LWIP_TCP_KEEPALIVE */
|
||||||
|
|
||||||
|
/* Persist timer counter */
|
||||||
|
u32_t persist_cnt;
|
||||||
|
/* Persist timer back-off */
|
||||||
|
u8_t persist_backoff;
|
||||||
|
|
||||||
|
/* KEEPALIVE counter */
|
||||||
|
u8_t keep_cnt_sent;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct tcp_pcb_listen {
|
||||||
|
/* Common members of all PCB types */
|
||||||
|
IP_PCB;
|
||||||
|
/* Protocol specific PCB members */
|
||||||
|
TCP_PCB_COMMON(struct tcp_pcb_listen);
|
||||||
|
|
||||||
|
#if TCP_LISTEN_BACKLOG
|
||||||
|
u8_t backlog;
|
||||||
|
u8_t accepts_pending;
|
||||||
|
#endif /* TCP_LISTEN_BACKLOG */
|
||||||
|
};
|
||||||
|
|
||||||
|
#if LWIP_EVENT_API
|
||||||
|
|
||||||
|
enum lwip_event {
|
||||||
|
LWIP_EVENT_ACCEPT,
|
||||||
|
LWIP_EVENT_SENT,
|
||||||
|
LWIP_EVENT_RECV,
|
||||||
|
LWIP_EVENT_CONNECTED,
|
||||||
|
LWIP_EVENT_POLL,
|
||||||
|
LWIP_EVENT_ERR
|
||||||
|
};
|
||||||
|
|
||||||
|
err_t lwip_tcp_event(void *arg, struct tcp_pcb *pcb,
|
||||||
|
enum lwip_event,
|
||||||
|
struct pbuf *p,
|
||||||
|
u16_t size,
|
||||||
|
err_t err);
|
||||||
|
|
||||||
|
#endif /* LWIP_EVENT_API */
|
||||||
|
|
||||||
|
/* Application program's interface: */
|
||||||
|
struct tcp_pcb * tcp_new (void)ICACHE_FLASH_ATTR;
|
||||||
|
|
||||||
|
void tcp_arg (struct tcp_pcb *pcb, void *arg) ICACHE_FLASH_ATTR;
|
||||||
|
void tcp_accept (struct tcp_pcb *pcb, tcp_accept_fn accept) ICACHE_FLASH_ATTR;
|
||||||
|
void tcp_recv (struct tcp_pcb *pcb, tcp_recv_fn recv) ICACHE_FLASH_ATTR;
|
||||||
|
void tcp_sent (struct tcp_pcb *pcb, tcp_sent_fn sent)ICACHE_FLASH_ATTR;
|
||||||
|
void tcp_poll (struct tcp_pcb *pcb, tcp_poll_fn poll, u8_t interval)ICACHE_FLASH_ATTR;
|
||||||
|
void tcp_err (struct tcp_pcb *pcb, tcp_err_fn err)ICACHE_FLASH_ATTR;
|
||||||
|
|
||||||
|
#define tcp_mss(pcb) (((pcb)->flags & TF_TIMESTAMP) ? ((pcb)->mss - 12) : (pcb)->mss)
|
||||||
|
#define tcp_sndbuf(pcb) ((pcb)->snd_buf)
|
||||||
|
#define tcp_sndqueuelen(pcb) ((pcb)->snd_queuelen)
|
||||||
|
#define tcp_nagle_disable(pcb) ((pcb)->flags |= TF_NODELAY)
|
||||||
|
#define tcp_nagle_enable(pcb) ((pcb)->flags &= ~TF_NODELAY)
|
||||||
|
#define tcp_nagle_disabled(pcb) (((pcb)->flags & TF_NODELAY) != 0)
|
||||||
|
|
||||||
|
#if TCP_LISTEN_BACKLOG
|
||||||
|
#define tcp_accepted(pcb) do { \
|
||||||
|
LWIP_ASSERT("pcb->state == LISTEN (called for wrong pcb?)", pcb->state == LISTEN); \
|
||||||
|
(((struct tcp_pcb_listen *)(pcb))->accepts_pending--); } while(0)
|
||||||
|
#else /* TCP_LISTEN_BACKLOG */
|
||||||
|
#define tcp_accepted(pcb) LWIP_ASSERT("pcb->state == LISTEN (called for wrong pcb?)", \
|
||||||
|
pcb->state == LISTEN)
|
||||||
|
#endif /* TCP_LISTEN_BACKLOG */
|
||||||
|
|
||||||
|
void tcp_recved (struct tcp_pcb *pcb, u16_t len)ICACHE_FLASH_ATTR;
|
||||||
|
err_t tcp_bind (struct tcp_pcb *pcb, ip_addr_t *ipaddr,
|
||||||
|
u16_t port)ICACHE_FLASH_ATTR;
|
||||||
|
err_t tcp_connect (struct tcp_pcb *pcb, ip_addr_t *ipaddr,
|
||||||
|
u16_t port, tcp_connected_fn connected)ICACHE_FLASH_ATTR;
|
||||||
|
|
||||||
|
struct tcp_pcb * tcp_listen_with_backlog(struct tcp_pcb *pcb, u8_t backlog)ICACHE_FLASH_ATTR;
|
||||||
|
#define tcp_listen(pcb) tcp_listen_with_backlog(pcb, TCP_DEFAULT_LISTEN_BACKLOG)
|
||||||
|
|
||||||
|
void tcp_abort (struct tcp_pcb *pcb)ICACHE_FLASH_ATTR;
|
||||||
|
err_t tcp_close (struct tcp_pcb *pcb)ICACHE_FLASH_ATTR;
|
||||||
|
err_t tcp_shutdown(struct tcp_pcb *pcb, int shut_rx, int shut_tx)ICACHE_FLASH_ATTR;
|
||||||
|
|
||||||
|
/* Flags for "apiflags" parameter in tcp_write */
|
||||||
|
#define TCP_WRITE_FLAG_COPY 0x01
|
||||||
|
#define TCP_WRITE_FLAG_MORE 0x02
|
||||||
|
|
||||||
|
err_t tcp_write (struct tcp_pcb *pcb, const void *dataptr, u16_t len,
|
||||||
|
u8_t apiflags)ICACHE_FLASH_ATTR;
|
||||||
|
|
||||||
|
void tcp_setprio (struct tcp_pcb *pcb, u8_t prio)ICACHE_FLASH_ATTR;
|
||||||
|
|
||||||
|
#define TCP_PRIO_MIN 1
|
||||||
|
#define TCP_PRIO_NORMAL 64
|
||||||
|
#define TCP_PRIO_MAX 127
|
||||||
|
|
||||||
|
extern err_t tcp_output(struct tcp_pcb *pcb);
|
||||||
|
|
||||||
|
|
||||||
|
const char* tcp_debug_state_str(enum tcp_state s)ICACHE_FLASH_ATTR;
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* LWIP_TCP */
|
||||||
|
|
||||||
|
#endif /* __LWIP_TCP_H__ */
|
472
app/include/lwip/tcp_impl.h
Normal file
472
app/include/lwip/tcp_impl.h
Normal file
@ -0,0 +1,472 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2001-2004 Swedish Institute of Computer Science.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* This file is part of the lwIP TCP/IP stack.
|
||||||
|
*
|
||||||
|
* Author: Adam Dunkels <adam@sics.se>
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#ifndef __LWIP_TCP_IMPL_H__
|
||||||
|
#define __LWIP_TCP_IMPL_H__
|
||||||
|
|
||||||
|
#include "lwip/opt.h"
|
||||||
|
|
||||||
|
#if LWIP_TCP /* don't build if not configured for use in lwipopts.h */
|
||||||
|
|
||||||
|
#include "lwip/tcp.h"
|
||||||
|
#include "lwip/sys.h"
|
||||||
|
#include "lwip/mem.h"
|
||||||
|
#include "lwip/pbuf.h"
|
||||||
|
#include "lwip/ip.h"
|
||||||
|
#include "lwip/icmp.h"
|
||||||
|
#include "lwip/err.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Functions for interfacing with TCP: */
|
||||||
|
|
||||||
|
/* Lower layer interface to TCP: */
|
||||||
|
#define tcp_init() /* Compatibility define, no init needed. */
|
||||||
|
void tcp_tmr (void)ICACHE_FLASH_ATTR; /* Must be called every
|
||||||
|
TCP_TMR_INTERVAL
|
||||||
|
ms. (Typically 250 ms). */
|
||||||
|
/* It is also possible to call these two functions at the right
|
||||||
|
intervals (instead of calling tcp_tmr()). */
|
||||||
|
void tcp_slowtmr (void)ICACHE_FLASH_ATTR;
|
||||||
|
void tcp_fasttmr (void)ICACHE_FLASH_ATTR;
|
||||||
|
|
||||||
|
|
||||||
|
/* Only used by IP to pass a TCP segment to TCP: */
|
||||||
|
void tcp_input (struct pbuf *p, struct netif *inp)ICACHE_FLASH_ATTR;
|
||||||
|
/* Used within the TCP code only: */
|
||||||
|
struct tcp_pcb * tcp_alloc (u8_t prio)ICACHE_FLASH_ATTR;
|
||||||
|
void tcp_abandon (struct tcp_pcb *pcb, int reset)ICACHE_FLASH_ATTR;
|
||||||
|
err_t tcp_send_empty_ack(struct tcp_pcb *pcb)ICACHE_FLASH_ATTR;
|
||||||
|
void tcp_rexmit (struct tcp_pcb *pcb)ICACHE_FLASH_ATTR;
|
||||||
|
void tcp_rexmit_rto (struct tcp_pcb *pcb)ICACHE_FLASH_ATTR;
|
||||||
|
void tcp_rexmit_fast (struct tcp_pcb *pcb)ICACHE_FLASH_ATTR;
|
||||||
|
u32_t tcp_update_rcv_ann_wnd(struct tcp_pcb *pcb)ICACHE_FLASH_ATTR;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This is the Nagle algorithm: try to combine user data to send as few TCP
|
||||||
|
* segments as possible. Only send if
|
||||||
|
* - no previously transmitted data on the connection remains unacknowledged or
|
||||||
|
* - the TF_NODELAY flag is set (nagle algorithm turned off for this pcb) or
|
||||||
|
* - the only unsent segment is at least pcb->mss bytes long (or there is more
|
||||||
|
* than one unsent segment - with lwIP, this can happen although unsent->len < mss)
|
||||||
|
* - or if we are in fast-retransmit (TF_INFR)
|
||||||
|
*/
|
||||||
|
#define tcp_do_output_nagle(tpcb) ((((tpcb)->unacked == NULL) || \
|
||||||
|
((tpcb)->flags & (TF_NODELAY | TF_INFR)) || \
|
||||||
|
(((tpcb)->unsent != NULL) && (((tpcb)->unsent->next != NULL) || \
|
||||||
|
((tpcb)->unsent->len >= (tpcb)->mss))) \
|
||||||
|
) ? 1 : 0)
|
||||||
|
#define tcp_output_nagle(tpcb) (tcp_do_output_nagle(tpcb) ? tcp_output(tpcb) : ERR_OK)
|
||||||
|
|
||||||
|
|
||||||
|
#define TCP_SEQ_LT(a,b) ((s32_t)((a)-(b)) < 0)
|
||||||
|
#define TCP_SEQ_LEQ(a,b) ((s32_t)((a)-(b)) <= 0)
|
||||||
|
#define TCP_SEQ_GT(a,b) ((s32_t)((a)-(b)) > 0)
|
||||||
|
#define TCP_SEQ_GEQ(a,b) ((s32_t)((a)-(b)) >= 0)
|
||||||
|
/* is b<=a<=c? */
|
||||||
|
#if 0 /* see bug #10548 */
|
||||||
|
#define TCP_SEQ_BETWEEN(a,b,c) ((c)-(b) >= (a)-(b))
|
||||||
|
#endif
|
||||||
|
#define TCP_SEQ_BETWEEN(a,b,c) (TCP_SEQ_GEQ(a,b) && TCP_SEQ_LEQ(a,c))
|
||||||
|
#define TCP_FIN 0x01U
|
||||||
|
#define TCP_SYN 0x02U
|
||||||
|
#define TCP_RST 0x04U
|
||||||
|
#define TCP_PSH 0x08U
|
||||||
|
#define TCP_ACK 0x10U
|
||||||
|
#define TCP_URG 0x20U
|
||||||
|
#define TCP_ECE 0x40U
|
||||||
|
#define TCP_CWR 0x80U
|
||||||
|
|
||||||
|
#define TCP_FLAGS 0x3fU
|
||||||
|
|
||||||
|
/* Length of the TCP header, excluding options. */
|
||||||
|
#define TCP_HLEN 20
|
||||||
|
|
||||||
|
#ifndef TCP_TMR_INTERVAL
|
||||||
|
#define TCP_TMR_INTERVAL 125 /* The TCP timer interval in milliseconds. */
|
||||||
|
#endif /* TCP_TMR_INTERVAL */
|
||||||
|
|
||||||
|
#ifndef TCP_FAST_INTERVAL
|
||||||
|
#define TCP_FAST_INTERVAL TCP_TMR_INTERVAL /* the fine grained timeout in milliseconds */
|
||||||
|
#endif /* TCP_FAST_INTERVAL */
|
||||||
|
|
||||||
|
#ifndef TCP_SLOW_INTERVAL
|
||||||
|
#define TCP_SLOW_INTERVAL (2*TCP_TMR_INTERVAL) /* the coarse grained timeout in milliseconds */
|
||||||
|
#endif /* TCP_SLOW_INTERVAL */
|
||||||
|
|
||||||
|
#define TCP_FIN_WAIT_TIMEOUT 20000 /* milliseconds */
|
||||||
|
#define TCP_SYN_RCVD_TIMEOUT 20000 /* milliseconds */
|
||||||
|
|
||||||
|
#define TCP_OOSEQ_TIMEOUT 6U /* x RTO */
|
||||||
|
|
||||||
|
#ifndef TCP_MSL
|
||||||
|
#define TCP_MSL 60000UL /* The maximum segment lifetime in milliseconds */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Keepalive values, compliant with RFC 1122. Don't change this unless you know what you're doing */
|
||||||
|
#ifndef TCP_KEEPIDLE_DEFAULT
|
||||||
|
#define TCP_KEEPIDLE_DEFAULT 3000UL /* Default KEEPALIVE timer in milliseconds */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef TCP_KEEPINTVL_DEFAULT
|
||||||
|
#define TCP_KEEPINTVL_DEFAULT 1000UL /* Default Time between KEEPALIVE probes in milliseconds */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef TCP_KEEPCNT_DEFAULT
|
||||||
|
#define TCP_KEEPCNT_DEFAULT 3U /* Default Counter for KEEPALIVE probes */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define TCP_MAXIDLE TCP_KEEPCNT_DEFAULT * TCP_KEEPINTVL_DEFAULT /* Maximum KEEPALIVE probe time */
|
||||||
|
|
||||||
|
/* Fields are (of course) in network byte order.
|
||||||
|
* Some fields are converted to host byte order in tcp_input().
|
||||||
|
*/
|
||||||
|
#ifdef PACK_STRUCT_USE_INCLUDES
|
||||||
|
# include "arch/bpstruct.h"
|
||||||
|
#endif
|
||||||
|
PACK_STRUCT_BEGIN
|
||||||
|
struct tcp_hdr {
|
||||||
|
PACK_STRUCT_FIELD(u16_t src); //Դ<>˿<EFBFBD>
|
||||||
|
PACK_STRUCT_FIELD(u16_t dest); //Ŀ<>Ķ˿<C4B6>
|
||||||
|
PACK_STRUCT_FIELD(u32_t seqno); //<2F><><EFBFBD>
|
||||||
|
PACK_STRUCT_FIELD(u32_t ackno); //Ӧ<><D3A6><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
PACK_STRUCT_FIELD(u16_t _hdrlen_rsvd_flags);//<2F>ײ<EFBFBD><D7B2><EFBFBD><EFBFBD><EFBFBD>+<2B><><EFBFBD><EFBFBD>λ+<2B><>־λ
|
||||||
|
PACK_STRUCT_FIELD(u16_t wnd); //<2F><><EFBFBD>ڴ<EFBFBD>С
|
||||||
|
PACK_STRUCT_FIELD(u16_t chksum); //У<><D0A3><EFBFBD>
|
||||||
|
PACK_STRUCT_FIELD(u16_t urgp); //<2F><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
|
||||||
|
} PACK_STRUCT_STRUCT;
|
||||||
|
PACK_STRUCT_END
|
||||||
|
#ifdef PACK_STRUCT_USE_INCLUDES
|
||||||
|
# include "arch/epstruct.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define TCPH_OFFSET(phdr) (ntohs((phdr)->_hdrlen_rsvd_flags) >> 8)
|
||||||
|
#define TCPH_HDRLEN(phdr) (ntohs((phdr)->_hdrlen_rsvd_flags) >> 12)
|
||||||
|
#define TCPH_FLAGS(phdr) (ntohs((phdr)->_hdrlen_rsvd_flags) & TCP_FLAGS)
|
||||||
|
|
||||||
|
#define TCPH_OFFSET_SET(phdr, offset) (phdr)->_hdrlen_rsvd_flags = htons(((offset) << 8) | TCPH_FLAGS(phdr))
|
||||||
|
#define TCPH_HDRLEN_SET(phdr, len) (phdr)->_hdrlen_rsvd_flags = htons(((len) << 12) | TCPH_FLAGS(phdr))
|
||||||
|
#define TCPH_FLAGS_SET(phdr, flags) (phdr)->_hdrlen_rsvd_flags = (((phdr)->_hdrlen_rsvd_flags & PP_HTONS((u16_t)(~(u16_t)(TCP_FLAGS)))) | htons(flags))
|
||||||
|
#define TCPH_HDRLEN_FLAGS_SET(phdr, len, flags) (phdr)->_hdrlen_rsvd_flags = htons(((len) << 12) | (flags))
|
||||||
|
|
||||||
|
#define TCPH_SET_FLAG(phdr, flags ) (phdr)->_hdrlen_rsvd_flags = ((phdr)->_hdrlen_rsvd_flags | htons(flags))
|
||||||
|
#define TCPH_UNSET_FLAG(phdr, flags) (phdr)->_hdrlen_rsvd_flags = htons(ntohs((phdr)->_hdrlen_rsvd_flags) | (TCPH_FLAGS(phdr) & ~(flags)) )
|
||||||
|
|
||||||
|
#define TCP_TCPLEN(seg) ((seg)->len + ((TCPH_FLAGS((seg)->tcphdr) & (TCP_FIN | TCP_SYN)) != 0))
|
||||||
|
|
||||||
|
/** Flags used on input processing, not on pcb->flags
|
||||||
|
*/
|
||||||
|
#define TF_RESET (u8_t)0x08U /* Connection was reset. */
|
||||||
|
#define TF_CLOSED (u8_t)0x10U /* Connection was sucessfully closed. */
|
||||||
|
#define TF_GOT_FIN (u8_t)0x20U /* Connection was closed by the remote end. */
|
||||||
|
|
||||||
|
|
||||||
|
#if LWIP_EVENT_API
|
||||||
|
|
||||||
|
#define TCP_EVENT_ACCEPT(pcb,err,ret) ret = lwip_tcp_event((pcb)->callback_arg, (pcb),\
|
||||||
|
LWIP_EVENT_ACCEPT, NULL, 0, err)
|
||||||
|
#define TCP_EVENT_SENT(pcb,space,ret) ret = lwip_tcp_event((pcb)->callback_arg, (pcb),\
|
||||||
|
LWIP_EVENT_SENT, NULL, space, ERR_OK)
|
||||||
|
#define TCP_EVENT_RECV(pcb,p,err,ret) ret = lwip_tcp_event((pcb)->callback_arg, (pcb),\
|
||||||
|
LWIP_EVENT_RECV, (p), 0, (err))
|
||||||
|
#define TCP_EVENT_CLOSED(pcb,ret) ret = lwip_tcp_event((pcb)->callback_arg, (pcb),\
|
||||||
|
LWIP_EVENT_RECV, NULL, 0, ERR_OK)
|
||||||
|
#define TCP_EVENT_CONNECTED(pcb,err,ret) ret = lwip_tcp_event((pcb)->callback_arg, (pcb),\
|
||||||
|
LWIP_EVENT_CONNECTED, NULL, 0, (err))
|
||||||
|
#define TCP_EVENT_POLL(pcb,ret) ret = lwip_tcp_event((pcb)->callback_arg, (pcb),\
|
||||||
|
LWIP_EVENT_POLL, NULL, 0, ERR_OK)
|
||||||
|
#define TCP_EVENT_ERR(errf,arg,err) lwip_tcp_event((arg), NULL, \
|
||||||
|
LWIP_EVENT_ERR, NULL, 0, (err))
|
||||||
|
|
||||||
|
#else /* LWIP_EVENT_API */
|
||||||
|
|
||||||
|
#define TCP_EVENT_ACCEPT(pcb,err,ret) \
|
||||||
|
do { \
|
||||||
|
if((pcb)->accept != NULL) \
|
||||||
|
(ret) = (pcb)->accept((pcb)->callback_arg,(pcb),(err)); \
|
||||||
|
else (ret) = ERR_ARG; \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define TCP_EVENT_SENT(pcb,space,ret) \
|
||||||
|
do { \
|
||||||
|
if((pcb)->sent != NULL) \
|
||||||
|
(ret) = (pcb)->sent((pcb)->callback_arg,(pcb),(space)); \
|
||||||
|
else (ret) = ERR_OK; \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define TCP_EVENT_RECV(pcb,p,err,ret) \
|
||||||
|
do { \
|
||||||
|
if((pcb)->recv != NULL) { \
|
||||||
|
(ret) = (pcb)->recv((pcb)->callback_arg,(pcb),(p),(err));\
|
||||||
|
} else { \
|
||||||
|
(ret) = tcp_recv_null(NULL, (pcb), (p), (err)); \
|
||||||
|
} \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define TCP_EVENT_CLOSED(pcb,ret) \
|
||||||
|
do { \
|
||||||
|
if(((pcb)->recv != NULL)) { \
|
||||||
|
(ret) = (pcb)->recv((pcb)->callback_arg,(pcb),NULL,ERR_OK);\
|
||||||
|
} else { \
|
||||||
|
(ret) = ERR_OK; \
|
||||||
|
} \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define TCP_EVENT_CONNECTED(pcb,err,ret) \
|
||||||
|
do { \
|
||||||
|
if((pcb)->connected != NULL) \
|
||||||
|
(ret) = (pcb)->connected((pcb)->callback_arg,(pcb),(err)); \
|
||||||
|
else (ret) = ERR_OK; \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define TCP_EVENT_POLL(pcb,ret) \
|
||||||
|
do { \
|
||||||
|
if((pcb)->poll != NULL) \
|
||||||
|
(ret) = (pcb)->poll((pcb)->callback_arg,(pcb)); \
|
||||||
|
else (ret) = ERR_OK; \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define TCP_EVENT_ERR(errf,arg,err) \
|
||||||
|
do { \
|
||||||
|
if((errf) != NULL) \
|
||||||
|
(errf)((arg),(err)); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#endif /* LWIP_EVENT_API */
|
||||||
|
|
||||||
|
/** Enabled extra-check for TCP_OVERSIZE if LWIP_DEBUG is enabled */
|
||||||
|
#if TCP_OVERSIZE && defined(LWIP_DEBUG)
|
||||||
|
#define TCP_OVERSIZE_DBGCHECK 1
|
||||||
|
#else
|
||||||
|
#define TCP_OVERSIZE_DBGCHECK 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/** Don't generate checksum on copy if CHECKSUM_GEN_TCP is disabled */
|
||||||
|
#define TCP_CHECKSUM_ON_COPY (LWIP_CHECKSUM_ON_COPY && CHECKSUM_GEN_TCP)
|
||||||
|
|
||||||
|
/* This structure represents a TCP segment on the unsent, unacked and ooseq queues */
|
||||||
|
struct tcp_seg {
|
||||||
|
struct tcp_seg *next; /* used when putting segements on a queue */
|
||||||
|
struct pbuf *p; /* buffer containing data + TCP header */
|
||||||
|
void *dataptr; /* pointer to the TCP data in the pbuf */
|
||||||
|
u16_t len; /* the TCP length of this segment */
|
||||||
|
#if TCP_OVERSIZE_DBGCHECK
|
||||||
|
u16_t oversize_left; /* Extra bytes available at the end of the last
|
||||||
|
pbuf in unsent (used for asserting vs.
|
||||||
|
tcp_pcb.unsent_oversized only) */
|
||||||
|
#endif /* TCP_OVERSIZE_DBGCHECK */
|
||||||
|
#if TCP_CHECKSUM_ON_COPY
|
||||||
|
u16_t chksum;
|
||||||
|
u8_t chksum_swapped;
|
||||||
|
#endif /* TCP_CHECKSUM_ON_COPY */
|
||||||
|
u8_t flags;
|
||||||
|
#define TF_SEG_OPTS_MSS (u8_t)0x01U /* Include MSS option. */
|
||||||
|
#define TF_SEG_OPTS_TS (u8_t)0x02U /* Include timestamp option. */
|
||||||
|
#define TF_SEG_DATA_CHECKSUMMED (u8_t)0x04U /* ALL data (not the header) is
|
||||||
|
checksummed into 'chksum' */
|
||||||
|
struct tcp_hdr *tcphdr; /* the TCP header */
|
||||||
|
};
|
||||||
|
|
||||||
|
#define LWIP_TCP_OPT_LENGTH(flags) \
|
||||||
|
(flags & TF_SEG_OPTS_MSS ? 4 : 0) + \
|
||||||
|
(flags & TF_SEG_OPTS_TS ? 12 : 0)
|
||||||
|
|
||||||
|
/** This returns a TCP header option for MSS in an u32_t */
|
||||||
|
#define TCP_BUILD_MSS_OPTION(x) (x) = PP_HTONL(((u32_t)2 << 24) | \
|
||||||
|
((u32_t)4 << 16) | \
|
||||||
|
(((u32_t)TCP_MSS / 256) << 8) | \
|
||||||
|
(TCP_MSS & 255))
|
||||||
|
|
||||||
|
/* Global variables: */
|
||||||
|
extern struct tcp_pcb *tcp_input_pcb;
|
||||||
|
extern u32_t tcp_ticks;
|
||||||
|
|
||||||
|
/* The TCP PCB lists. */
|
||||||
|
union tcp_listen_pcbs_t { /* List of all TCP PCBs in LISTEN state. */
|
||||||
|
struct tcp_pcb_listen *listen_pcbs;
|
||||||
|
struct tcp_pcb *pcbs;
|
||||||
|
};
|
||||||
|
extern struct tcp_pcb *tcp_bound_pcbs;
|
||||||
|
extern union tcp_listen_pcbs_t tcp_listen_pcbs;
|
||||||
|
extern struct tcp_pcb *tcp_active_pcbs; /* List of all TCP PCBs that are in a
|
||||||
|
state in which they accept or send
|
||||||
|
data. */
|
||||||
|
extern struct tcp_pcb *tcp_tw_pcbs; /* List of all TCP PCBs in TIME-WAIT. */
|
||||||
|
|
||||||
|
extern struct tcp_pcb *tcp_tmp_pcb; /* Only used for temporary storage. */
|
||||||
|
|
||||||
|
/* Axioms about the above lists:
|
||||||
|
1) Every TCP PCB that is not CLOSED is in one of the lists.
|
||||||
|
2) A PCB is only in one of the lists.
|
||||||
|
3) All PCBs in the tcp_listen_pcbs list is in LISTEN state.
|
||||||
|
4) All PCBs in the tcp_tw_pcbs list is in TIME-WAIT state.
|
||||||
|
*/
|
||||||
|
/* Define two macros, TCP_REG and TCP_RMV that registers a TCP PCB
|
||||||
|
with a PCB list or removes a PCB from a list, respectively. */
|
||||||
|
#ifndef TCP_DEBUG_PCB_LISTS
|
||||||
|
#define TCP_DEBUG_PCB_LISTS 0
|
||||||
|
#endif
|
||||||
|
#if TCP_DEBUG_PCB_LISTS
|
||||||
|
#define TCP_REG(pcbs, npcb) do {\
|
||||||
|
LWIP_DEBUGF(TCP_DEBUG, ("TCP_REG %p local port %d\n", (npcb), (npcb)->local_port)); \
|
||||||
|
for(tcp_tmp_pcb = *(pcbs); \
|
||||||
|
tcp_tmp_pcb != NULL; \
|
||||||
|
tcp_tmp_pcb = tcp_tmp_pcb->next) { \
|
||||||
|
LWIP_ASSERT("TCP_REG: already registered\n", tcp_tmp_pcb != (npcb)); \
|
||||||
|
} \
|
||||||
|
LWIP_ASSERT("TCP_REG: pcb->state != CLOSED", ((pcbs) == &tcp_bound_pcbs) || ((npcb)->state != CLOSED)); \
|
||||||
|
(npcb)->next = *(pcbs); \
|
||||||
|
LWIP_ASSERT("TCP_REG: npcb->next != npcb", (npcb)->next != (npcb)); \
|
||||||
|
*(pcbs) = (npcb); \
|
||||||
|
LWIP_ASSERT("TCP_RMV: tcp_pcbs sane", tcp_pcbs_sane()); \
|
||||||
|
tcp_timer_needed(); \
|
||||||
|
} while(0)
|
||||||
|
#define TCP_RMV(pcbs, npcb) do { \
|
||||||
|
LWIP_ASSERT("TCP_RMV: pcbs != NULL", *(pcbs) != NULL); \
|
||||||
|
LWIP_DEBUGF(TCP_DEBUG, ("TCP_RMV: removing %p from %p\n", (npcb), *(pcbs))); \
|
||||||
|
if(*(pcbs) == (npcb)) { \
|
||||||
|
*(pcbs) = (*pcbs)->next; \
|
||||||
|
} else for(tcp_tmp_pcb = *(pcbs); tcp_tmp_pcb != NULL; tcp_tmp_pcb = tcp_tmp_pcb->next) { \
|
||||||
|
if(tcp_tmp_pcb->next == (npcb)) { \
|
||||||
|
tcp_tmp_pcb->next = (npcb)->next; \
|
||||||
|
break; \
|
||||||
|
} \
|
||||||
|
} \
|
||||||
|
(npcb)->next = NULL; \
|
||||||
|
LWIP_ASSERT("TCP_RMV: tcp_pcbs sane", tcp_pcbs_sane()); \
|
||||||
|
LWIP_DEBUGF(TCP_DEBUG, ("TCP_RMV: removed %p from %p\n", (npcb), *(pcbs))); \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
|
#else /* LWIP_DEBUG */
|
||||||
|
|
||||||
|
#define TCP_REG(pcbs, npcb) \
|
||||||
|
do { \
|
||||||
|
(npcb)->next = *pcbs; \
|
||||||
|
*(pcbs) = (npcb); \
|
||||||
|
tcp_timer_needed(); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define TCP_RMV(pcbs, npcb) \
|
||||||
|
do { \
|
||||||
|
if(*(pcbs) == (npcb)) { \
|
||||||
|
(*(pcbs)) = (*pcbs)->next; \
|
||||||
|
} \
|
||||||
|
else { \
|
||||||
|
for(tcp_tmp_pcb = *pcbs; \
|
||||||
|
tcp_tmp_pcb != NULL; \
|
||||||
|
tcp_tmp_pcb = tcp_tmp_pcb->next) { \
|
||||||
|
if(tcp_tmp_pcb->next == (npcb)) { \
|
||||||
|
tcp_tmp_pcb->next = (npcb)->next; \
|
||||||
|
break; \
|
||||||
|
} \
|
||||||
|
} \
|
||||||
|
} \
|
||||||
|
(npcb)->next = NULL; \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
|
#endif /* LWIP_DEBUG */
|
||||||
|
|
||||||
|
|
||||||
|
/* Internal functions: */
|
||||||
|
struct tcp_pcb *tcp_pcb_copy(struct tcp_pcb *pcb)ICACHE_FLASH_ATTR;
|
||||||
|
void tcp_pcb_purge(struct tcp_pcb *pcb)ICACHE_FLASH_ATTR;
|
||||||
|
void tcp_pcb_remove(struct tcp_pcb **pcblist, struct tcp_pcb *pcb)ICACHE_FLASH_ATTR;
|
||||||
|
|
||||||
|
void tcp_segs_free(struct tcp_seg *seg)ICACHE_FLASH_ATTR;
|
||||||
|
void tcp_seg_free(struct tcp_seg *seg)ICACHE_FLASH_ATTR;
|
||||||
|
struct tcp_seg *tcp_seg_copy(struct tcp_seg *seg)ICACHE_FLASH_ATTR;
|
||||||
|
|
||||||
|
#define tcp_ack(pcb) \
|
||||||
|
do { \
|
||||||
|
if((pcb)->flags & TF_ACK_DELAY) { \
|
||||||
|
(pcb)->flags &= ~TF_ACK_DELAY; \
|
||||||
|
(pcb)->flags |= TF_ACK_NOW; \
|
||||||
|
} \
|
||||||
|
else { \
|
||||||
|
(pcb)->flags |= TF_ACK_DELAY; \
|
||||||
|
} \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define tcp_ack_now(pcb) \
|
||||||
|
do { \
|
||||||
|
(pcb)->flags |= TF_ACK_NOW; \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
err_t tcp_send_fin(struct tcp_pcb *pcb)ICACHE_FLASH_ATTR;
|
||||||
|
err_t tcp_enqueue_flags(struct tcp_pcb *pcb, u8_t flags)ICACHE_FLASH_ATTR;
|
||||||
|
|
||||||
|
void tcp_rexmit_seg(struct tcp_pcb *pcb, struct tcp_seg *seg)ICACHE_FLASH_ATTR;
|
||||||
|
|
||||||
|
void tcp_rst(u32_t seqno, u32_t ackno,
|
||||||
|
ip_addr_t *local_ip, ip_addr_t *remote_ip,
|
||||||
|
u16_t local_port, u16_t remote_port)ICACHE_FLASH_ATTR;
|
||||||
|
|
||||||
|
u32_t tcp_next_iss(void)ICACHE_FLASH_ATTR;
|
||||||
|
|
||||||
|
void tcp_keepalive(struct tcp_pcb *pcb)ICACHE_FLASH_ATTR;
|
||||||
|
void tcp_zero_window_probe(struct tcp_pcb *pcb)ICACHE_FLASH_ATTR;
|
||||||
|
|
||||||
|
#if TCP_CALCULATE_EFF_SEND_MSS
|
||||||
|
u16_t tcp_eff_send_mss(u16_t sendmss, ip_addr_t *addr)ICACHE_FLASH_ATTR;
|
||||||
|
#endif /* TCP_CALCULATE_EFF_SEND_MSS */
|
||||||
|
|
||||||
|
#if LWIP_CALLBACK_API
|
||||||
|
err_t tcp_recv_null(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t err)ICACHE_FLASH_ATTR;
|
||||||
|
#endif /* LWIP_CALLBACK_API */
|
||||||
|
|
||||||
|
#if TCP_DEBUG || TCP_INPUT_DEBUG || TCP_OUTPUT_DEBUG
|
||||||
|
void tcp_debug_print(struct tcp_hdr *tcphdr)ICACHE_FLASH_ATTR;
|
||||||
|
void tcp_debug_print_flags(u8_t flags)ICACHE_FLASH_ATTR;
|
||||||
|
void tcp_debug_print_state(enum tcp_state s)ICACHE_FLASH_ATTR;
|
||||||
|
void tcp_debug_print_pcbs(void)ICACHE_FLASH_ATTR;
|
||||||
|
s16_t tcp_pcbs_sane(void)ICACHE_FLASH_ATTR;
|
||||||
|
#else
|
||||||
|
# define tcp_debug_print(tcphdr)
|
||||||
|
# define tcp_debug_print_flags(flags)
|
||||||
|
# define tcp_debug_print_state(s)
|
||||||
|
# define tcp_debug_print_pcbs()
|
||||||
|
# define tcp_pcbs_sane() 1
|
||||||
|
#endif /* TCP_DEBUG */
|
||||||
|
|
||||||
|
/** External function (implemented in timers.c), called when TCP detects
|
||||||
|
* that a timer is needed (i.e. active- or time-wait-pcb found). */
|
||||||
|
void tcp_timer_needed(void)ICACHE_FLASH_ATTR;
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* LWIP_TCP */
|
||||||
|
|
||||||
|
#endif /* __LWIP_TCP_H__ */
|
159
app/include/lwip/tcpip.h
Normal file
159
app/include/lwip/tcpip.h
Normal file
@ -0,0 +1,159 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2001-2004 Swedish Institute of Computer Science.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* This file is part of the lwIP TCP/IP stack.
|
||||||
|
*
|
||||||
|
* Author: Adam Dunkels <adam@sics.se>
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#ifndef __LWIP_TCPIP_H__
|
||||||
|
#define __LWIP_TCPIP_H__
|
||||||
|
|
||||||
|
#include "lwip/opt.h"
|
||||||
|
|
||||||
|
#if !NO_SYS /* don't build if not configured for use in lwipopts.h */
|
||||||
|
|
||||||
|
#include "lwip/api_msg.h"
|
||||||
|
#include "lwip/netifapi.h"
|
||||||
|
#include "lwip/pbuf.h"
|
||||||
|
#include "lwip/api.h"
|
||||||
|
#include "lwip/sys.h"
|
||||||
|
#include "lwip/timers.h"
|
||||||
|
#include "lwip/netif.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/** Define this to something that triggers a watchdog. This is called from
|
||||||
|
* tcpip_thread after processing a message. */
|
||||||
|
#ifndef LWIP_TCPIP_THREAD_ALIVE
|
||||||
|
#define LWIP_TCPIP_THREAD_ALIVE()
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if LWIP_TCPIP_CORE_LOCKING
|
||||||
|
/** The global semaphore to lock the stack. */
|
||||||
|
extern sys_mutex_t lock_tcpip_core;
|
||||||
|
#define LOCK_TCPIP_CORE() sys_mutex_lock(&lock_tcpip_core)
|
||||||
|
#define UNLOCK_TCPIP_CORE() sys_mutex_unlock(&lock_tcpip_core)
|
||||||
|
#define TCPIP_APIMSG(m) tcpip_apimsg_lock(m)
|
||||||
|
#define TCPIP_APIMSG_ACK(m)
|
||||||
|
#define TCPIP_NETIFAPI(m) tcpip_netifapi_lock(m)
|
||||||
|
#define TCPIP_NETIFAPI_ACK(m)
|
||||||
|
#else /* LWIP_TCPIP_CORE_LOCKING */
|
||||||
|
#define LOCK_TCPIP_CORE()
|
||||||
|
#define UNLOCK_TCPIP_CORE()
|
||||||
|
#define TCPIP_APIMSG(m) tcpip_apimsg(m)
|
||||||
|
#define TCPIP_APIMSG_ACK(m) sys_sem_signal(&m->conn->op_completed)
|
||||||
|
#define TCPIP_NETIFAPI(m) tcpip_netifapi(m)
|
||||||
|
#define TCPIP_NETIFAPI_ACK(m) sys_sem_signal(&m->sem)
|
||||||
|
#endif /* LWIP_TCPIP_CORE_LOCKING */
|
||||||
|
|
||||||
|
/** Function prototype for the init_done function passed to tcpip_init */
|
||||||
|
typedef void (*tcpip_init_done_fn)(void *arg);
|
||||||
|
/** Function prototype for functions passed to tcpip_callback() */
|
||||||
|
typedef void (*tcpip_callback_fn)(void *ctx);
|
||||||
|
|
||||||
|
void tcpip_init(tcpip_init_done_fn tcpip_init_done, void *arg);
|
||||||
|
|
||||||
|
#if LWIP_NETCONN
|
||||||
|
err_t tcpip_apimsg(struct api_msg *apimsg);
|
||||||
|
#if LWIP_TCPIP_CORE_LOCKING
|
||||||
|
err_t tcpip_apimsg_lock(struct api_msg *apimsg);
|
||||||
|
#endif /* LWIP_TCPIP_CORE_LOCKING */
|
||||||
|
#endif /* LWIP_NETCONN */
|
||||||
|
|
||||||
|
err_t tcpip_input(struct pbuf *p, struct netif *inp);
|
||||||
|
|
||||||
|
#if LWIP_NETIF_API
|
||||||
|
err_t tcpip_netifapi(struct netifapi_msg *netifapimsg);
|
||||||
|
#if LWIP_TCPIP_CORE_LOCKING
|
||||||
|
err_t tcpip_netifapi_lock(struct netifapi_msg *netifapimsg);
|
||||||
|
#endif /* LWIP_TCPIP_CORE_LOCKING */
|
||||||
|
#endif /* LWIP_NETIF_API */
|
||||||
|
|
||||||
|
err_t tcpip_callback_with_block(tcpip_callback_fn function, void *ctx, u8_t block);
|
||||||
|
#define tcpip_callback(f, ctx) tcpip_callback_with_block(f, ctx, 1)
|
||||||
|
|
||||||
|
/* free pbufs or heap memory from another context without blocking */
|
||||||
|
err_t pbuf_free_callback(struct pbuf *p);
|
||||||
|
err_t mem_free_callback(void *m);
|
||||||
|
|
||||||
|
#if LWIP_TCPIP_TIMEOUT
|
||||||
|
err_t tcpip_timeout(u32_t msecs, sys_timeout_handler h, void *arg);
|
||||||
|
err_t tcpip_untimeout(sys_timeout_handler h, void *arg);
|
||||||
|
#endif /* LWIP_TCPIP_TIMEOUT */
|
||||||
|
|
||||||
|
enum tcpip_msg_type {
|
||||||
|
#if LWIP_NETCONN
|
||||||
|
TCPIP_MSG_API,
|
||||||
|
#endif /* LWIP_NETCONN */
|
||||||
|
TCPIP_MSG_INPKT,
|
||||||
|
#if LWIP_NETIF_API
|
||||||
|
TCPIP_MSG_NETIFAPI,
|
||||||
|
#endif /* LWIP_NETIF_API */
|
||||||
|
#if LWIP_TCPIP_TIMEOUT
|
||||||
|
TCPIP_MSG_TIMEOUT,
|
||||||
|
TCPIP_MSG_UNTIMEOUT,
|
||||||
|
#endif /* LWIP_TCPIP_TIMEOUT */
|
||||||
|
TCPIP_MSG_CALLBACK
|
||||||
|
};
|
||||||
|
|
||||||
|
struct tcpip_msg {
|
||||||
|
enum tcpip_msg_type type;
|
||||||
|
sys_sem_t *sem;
|
||||||
|
union {
|
||||||
|
#if LWIP_NETCONN
|
||||||
|
struct api_msg *apimsg;
|
||||||
|
#endif /* LWIP_NETCONN */
|
||||||
|
#if LWIP_NETIF_API
|
||||||
|
struct netifapi_msg *netifapimsg;
|
||||||
|
#endif /* LWIP_NETIF_API */
|
||||||
|
struct {
|
||||||
|
struct pbuf *p;
|
||||||
|
struct netif *netif;
|
||||||
|
} inp;
|
||||||
|
struct {
|
||||||
|
tcpip_callback_fn function;
|
||||||
|
void *ctx;
|
||||||
|
} cb;
|
||||||
|
#if LWIP_TCPIP_TIMEOUT
|
||||||
|
struct {
|
||||||
|
u32_t msecs;
|
||||||
|
sys_timeout_handler h;
|
||||||
|
void *arg;
|
||||||
|
} tmo;
|
||||||
|
#endif /* LWIP_TCPIP_TIMEOUT */
|
||||||
|
} msg;
|
||||||
|
};
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* !NO_SYS */
|
||||||
|
|
||||||
|
#endif /* __LWIP_TCPIP_H__ */
|
98
app/include/lwip/timers.h
Normal file
98
app/include/lwip/timers.h
Normal file
@ -0,0 +1,98 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2001-2004 Swedish Institute of Computer Science.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* This file is part of the lwIP TCP/IP stack.
|
||||||
|
*
|
||||||
|
* Author: Adam Dunkels <adam@sics.se>
|
||||||
|
* Simon Goldschmidt
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#ifndef __LWIP_TIMERS_H__
|
||||||
|
#define __LWIP_TIMERS_H__
|
||||||
|
|
||||||
|
#include "lwip/opt.h"
|
||||||
|
|
||||||
|
/* Timers are not supported when NO_SYS==1 and NO_SYS_NO_TIMERS==1 */
|
||||||
|
#define LWIP_TIMERS (!NO_SYS || (NO_SYS && !NO_SYS_NO_TIMERS))
|
||||||
|
|
||||||
|
#if LWIP_TIMERS
|
||||||
|
|
||||||
|
#include "lwip/err.h"
|
||||||
|
#include "lwip/sys.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef LWIP_DEBUG_TIMERNAMES
|
||||||
|
#ifdef LWIP_DEBUG
|
||||||
|
#define LWIP_DEBUG_TIMERNAMES SYS_DEBUG
|
||||||
|
#else /* LWIP_DEBUG */
|
||||||
|
#define LWIP_DEBUG_TIMERNAMES 0
|
||||||
|
#endif /* LWIP_DEBUG*/
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/** Function prototype for a timeout callback function. Register such a function
|
||||||
|
* using sys_timeout().
|
||||||
|
*
|
||||||
|
* @param arg Additional argument to pass to the function - set up by sys_timeout()
|
||||||
|
*/
|
||||||
|
typedef void (* sys_timeout_handler)(void *arg);
|
||||||
|
|
||||||
|
struct sys_timeo {
|
||||||
|
struct sys_timeo *next;
|
||||||
|
u32_t time;
|
||||||
|
sys_timeout_handler h;
|
||||||
|
void *arg;
|
||||||
|
#if LWIP_DEBUG_TIMERNAMES
|
||||||
|
const char* handler_name;
|
||||||
|
#endif /* LWIP_DEBUG_TIMERNAMES */
|
||||||
|
};
|
||||||
|
|
||||||
|
void sys_timeouts_init(void)ICACHE_FLASH_ATTR;
|
||||||
|
|
||||||
|
#if LWIP_DEBUG_TIMERNAMES
|
||||||
|
void sys_timeout_debug(u32_t msecs, sys_timeout_handler handler, void *arg, const char* handler_name)ICACHE_FLASH_ATTR;
|
||||||
|
#define sys_timeout(msecs, handler, arg) sys_timeout_debug(msecs, handler, arg, #handler)
|
||||||
|
#else /* LWIP_DEBUG_TIMERNAMES */
|
||||||
|
void sys_timeout(u32_t msecs, sys_timeout_handler handler, void *arg)ICACHE_FLASH_ATTR;
|
||||||
|
#endif /* LWIP_DEBUG_TIMERNAMES */
|
||||||
|
|
||||||
|
void sys_untimeout(sys_timeout_handler handler, void *arg)ICACHE_FLASH_ATTR;
|
||||||
|
#if NO_SYS
|
||||||
|
void sys_check_timeouts(void)ICACHE_FLASH_ATTR;
|
||||||
|
void sys_restart_timeouts(void)ICACHE_FLASH_ATTR;
|
||||||
|
#else /* NO_SYS */
|
||||||
|
void sys_timeouts_mbox_fetch(sys_mbox_t *mbox, void **msg);
|
||||||
|
#endif /* NO_SYS */
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* LWIP_TIMERS */
|
||||||
|
#endif /* __LWIP_TIMERS_H__ */
|
171
app/include/lwip/udp.h
Normal file
171
app/include/lwip/udp.h
Normal file
@ -0,0 +1,171 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2001-2004 Swedish Institute of Computer Science.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* This file is part of the lwIP TCP/IP stack.
|
||||||
|
*
|
||||||
|
* Author: Adam Dunkels <adam@sics.se>
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#ifndef __LWIP_UDP_H__
|
||||||
|
#define __LWIP_UDP_H__
|
||||||
|
|
||||||
|
#include "lwip/opt.h"
|
||||||
|
|
||||||
|
#if LWIP_UDP /* don't build if not configured for use in lwipopts.h */
|
||||||
|
|
||||||
|
#include "lwip/pbuf.h"
|
||||||
|
#include "lwip/netif.h"
|
||||||
|
#include "lwip/ip_addr.h"
|
||||||
|
#include "lwip/ip.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define UDP_HLEN 8
|
||||||
|
|
||||||
|
/* Fields are (of course) in network byte order. */
|
||||||
|
#ifdef PACK_STRUCT_USE_INCLUDES
|
||||||
|
# include "arch/bpstruct.h"
|
||||||
|
#endif
|
||||||
|
PACK_STRUCT_BEGIN
|
||||||
|
struct udp_hdr {
|
||||||
|
PACK_STRUCT_FIELD(u16_t src);
|
||||||
|
PACK_STRUCT_FIELD(u16_t dest); /* src/dest UDP ports */
|
||||||
|
PACK_STRUCT_FIELD(u16_t len);
|
||||||
|
PACK_STRUCT_FIELD(u16_t chksum);
|
||||||
|
} PACK_STRUCT_STRUCT;
|
||||||
|
PACK_STRUCT_END
|
||||||
|
#ifdef PACK_STRUCT_USE_INCLUDES
|
||||||
|
# include "arch/epstruct.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define UDP_FLAGS_NOCHKSUM 0x01U
|
||||||
|
#define UDP_FLAGS_UDPLITE 0x02U
|
||||||
|
#define UDP_FLAGS_CONNECTED 0x04U
|
||||||
|
#define UDP_FLAGS_MULTICAST_LOOP 0x08U
|
||||||
|
|
||||||
|
struct udp_pcb;
|
||||||
|
|
||||||
|
/** Function prototype for udp pcb receive callback functions
|
||||||
|
* addr and port are in same byte order as in the pcb
|
||||||
|
* The callback is responsible for freeing the pbuf
|
||||||
|
* if it's not used any more.
|
||||||
|
*
|
||||||
|
* ATTENTION: Be aware that 'addr' points into the pbuf 'p' so freeing this pbuf
|
||||||
|
* makes 'addr' invalid, too.
|
||||||
|
*
|
||||||
|
* @param arg user supplied argument (udp_pcb.recv_arg)
|
||||||
|
* @param pcb the udp_pcb which received data
|
||||||
|
* @param p the packet buffer that was received
|
||||||
|
* @param addr the remote IP address from which the packet was received
|
||||||
|
* @param port the remote port from which the packet was received
|
||||||
|
*/
|
||||||
|
typedef void (*udp_recv_fn)(void *arg, struct udp_pcb *pcb, struct pbuf *p,
|
||||||
|
ip_addr_t *addr, u16_t port);
|
||||||
|
|
||||||
|
|
||||||
|
struct udp_pcb {
|
||||||
|
/* Common members of all PCB types */
|
||||||
|
IP_PCB;
|
||||||
|
|
||||||
|
/* Protocol specific PCB members */
|
||||||
|
|
||||||
|
struct udp_pcb *next;
|
||||||
|
|
||||||
|
u8_t flags;
|
||||||
|
/** ports are in host byte order */
|
||||||
|
u16_t local_port, remote_port;
|
||||||
|
|
||||||
|
#if LWIP_IGMP
|
||||||
|
/** outgoing network interface for multicast packets */
|
||||||
|
ip_addr_t multicast_ip;
|
||||||
|
#endif /* LWIP_IGMP */
|
||||||
|
|
||||||
|
#if LWIP_UDPLITE
|
||||||
|
/** used for UDP_LITE only */
|
||||||
|
u16_t chksum_len_rx, chksum_len_tx;
|
||||||
|
#endif /* LWIP_UDPLITE */
|
||||||
|
|
||||||
|
/** receive callback function */
|
||||||
|
udp_recv_fn recv;
|
||||||
|
/** user-supplied argument for the recv callback */
|
||||||
|
void *recv_arg;
|
||||||
|
};
|
||||||
|
/* udp_pcbs export for exernal reference (e.g. SNMP agent) */
|
||||||
|
extern struct udp_pcb *udp_pcbs;
|
||||||
|
|
||||||
|
/* The following functions is the application layer interface to the
|
||||||
|
UDP code. */
|
||||||
|
struct udp_pcb * udp_new (void)ICACHE_FLASH_ATTR;
|
||||||
|
void udp_remove (struct udp_pcb *pcb)ICACHE_FLASH_ATTR;
|
||||||
|
err_t udp_bind (struct udp_pcb *pcb, ip_addr_t *ipaddr,
|
||||||
|
u16_t port)ICACHE_FLASH_ATTR;
|
||||||
|
err_t udp_connect (struct udp_pcb *pcb, ip_addr_t *ipaddr,
|
||||||
|
u16_t port)ICACHE_FLASH_ATTR;
|
||||||
|
void udp_disconnect (struct udp_pcb *pcb)ICACHE_FLASH_ATTR;
|
||||||
|
void udp_recv (struct udp_pcb *pcb, udp_recv_fn recv,
|
||||||
|
void *recv_arg)ICACHE_FLASH_ATTR;
|
||||||
|
err_t udp_sendto_if (struct udp_pcb *pcb, struct pbuf *p,
|
||||||
|
ip_addr_t *dst_ip, u16_t dst_port,
|
||||||
|
struct netif *netif)ICACHE_FLASH_ATTR;
|
||||||
|
err_t udp_sendto (struct udp_pcb *pcb, struct pbuf *p,
|
||||||
|
ip_addr_t *dst_ip, u16_t dst_port)ICACHE_FLASH_ATTR;
|
||||||
|
err_t udp_send (struct udp_pcb *pcb, struct pbuf *p)ICACHE_FLASH_ATTR;
|
||||||
|
|
||||||
|
#if LWIP_CHECKSUM_ON_COPY
|
||||||
|
err_t udp_sendto_if_chksum(struct udp_pcb *pcb, struct pbuf *p,
|
||||||
|
ip_addr_t *dst_ip, u16_t dst_port,
|
||||||
|
struct netif *netif, u8_t have_chksum,
|
||||||
|
u16_t chksum)ICACHE_FLASH_ATTR;
|
||||||
|
err_t udp_sendto_chksum(struct udp_pcb *pcb, struct pbuf *p,
|
||||||
|
ip_addr_t *dst_ip, u16_t dst_port,
|
||||||
|
u8_t have_chksum, u16_t chksum)ICACHE_FLASH_ATTR;
|
||||||
|
err_t udp_send_chksum(struct udp_pcb *pcb, struct pbuf *p,
|
||||||
|
u8_t have_chksum, u16_t chksum)ICACHE_FLASH_ATTR;
|
||||||
|
#endif /* LWIP_CHECKSUM_ON_COPY */
|
||||||
|
|
||||||
|
#define udp_flags(pcb) ((pcb)->flags)
|
||||||
|
#define udp_setflags(pcb, f) ((pcb)->flags = (f))
|
||||||
|
|
||||||
|
/* The following functions are the lower layer interface to UDP. */
|
||||||
|
void udp_input (struct pbuf *p, struct netif *inp)ICACHE_FLASH_ATTR;
|
||||||
|
|
||||||
|
#define udp_init() /* Compatibility define, not init needed. */
|
||||||
|
|
||||||
|
#if UDP_DEBUG
|
||||||
|
void udp_debug_print(struct udp_hdr *udphdr)ICACHE_FLASH_ATTR;
|
||||||
|
#else
|
||||||
|
#define udp_debug_print(udphdr)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* LWIP_UDP */
|
||||||
|
|
||||||
|
#endif /* __LWIP_UDP_H__ */
|
2052
app/include/lwipopts.h
Normal file
2052
app/include/lwipopts.h
Normal file
File diff suppressed because it is too large
Load Diff
81
app/include/mem_manager.h
Normal file
81
app/include/mem_manager.h
Normal file
@ -0,0 +1,81 @@
|
|||||||
|
#ifndef __MEM_MANAGER_H__
|
||||||
|
#define __MEM_MANAGER_H__
|
||||||
|
|
||||||
|
#include "c_types.h"
|
||||||
|
|
||||||
|
/*------------------------<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>------------------------*/
|
||||||
|
|
||||||
|
#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE
|
||||||
|
#ifndef IOT_SIP_MODE
|
||||||
|
//#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 0x3fffc000 - (uint32)&_heap_start ) )//fix 16000 to 24000 on 14.2.26
|
||||||
|
#else
|
||||||
|
#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 8000 ) )
|
||||||
|
#endif
|
||||||
|
#define portBYTE_ALIGNMENT 8
|
||||||
|
#define pdFALSE 0
|
||||||
|
#define pdTRUE 1
|
||||||
|
|
||||||
|
#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE
|
||||||
|
#if portBYTE_ALIGNMENT == 8
|
||||||
|
#define portBYTE_ALIGNMENT_MASK ( 0x0007 )
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if portBYTE_ALIGNMENT == 4
|
||||||
|
#define portBYTE_ALIGNMENT_MASK ( 0x0003 )
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if portBYTE_ALIGNMENT == 2
|
||||||
|
#define portBYTE_ALIGNMENT_MASK ( 0x0001 )
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if portBYTE_ALIGNMENT == 1
|
||||||
|
#define portBYTE_ALIGNMENT_MASK ( 0x0000 )
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef portBYTE_ALIGNMENT_MASK
|
||||||
|
#error "Invalid portBYTE_ALIGNMENT definition"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define configUSE_MALLOC_FAILED_HOOK 1
|
||||||
|
#define portPOINTER_SIZE_TYPE unsigned int
|
||||||
|
|
||||||
|
#define heapMINIMUM_BLOCK_SIZE ( ( size_t ) ( heapSTRUCT_SIZE * 2 ) )
|
||||||
|
|
||||||
|
//#define configADJUSTED_HEAP_SIZE ( configTOTAL_HEAP_SIZE - portBYTE_ALIGNMENT )
|
||||||
|
|
||||||
|
//static unsigned char ucHeap[ configTOTAL_HEAP_SIZE ];
|
||||||
|
static unsigned char *ucHeap;
|
||||||
|
|
||||||
|
typedef struct A_BLOCK_LINK
|
||||||
|
{
|
||||||
|
struct A_BLOCK_LINK *pxNextFreeBlock; //The next free block in the list.
|
||||||
|
size_t xBlockSize; //The size of the free block.
|
||||||
|
} xBlockLink;
|
||||||
|
|
||||||
|
static const unsigned short heapSTRUCT_SIZE = ( sizeof( xBlockLink ) + portBYTE_ALIGNMENT - ( sizeof( xBlockLink ) % portBYTE_ALIGNMENT ) );
|
||||||
|
|
||||||
|
//static const size_t xTotalHeapSize = ( ( size_t ) configADJUSTED_HEAP_SIZE ) & ( ( size_t ) ~portBYTE_ALIGNMENT_MASK );
|
||||||
|
|
||||||
|
static xBlockLink xStart, *pxEnd = NULL;
|
||||||
|
|
||||||
|
//static size_t xFreeBytesRemaining = ( ( size_t ) configADJUSTED_HEAP_SIZE ) & ( ( size_t ) ~portBYTE_ALIGNMENT_MASK );
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------------<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>-----------------------------------*/
|
||||||
|
|
||||||
|
static void prvInsertBlockIntoFreeList( xBlockLink *pxBlockToInsert ) ;//ICACHE_FLASH_ATTR;
|
||||||
|
|
||||||
|
static void prvHeapInit( void ) ;//ICACHE_FLASH_ATTR;
|
||||||
|
|
||||||
|
void vApplicationMallocFailedHook( void ) ;//ICACHE_FLASH_ATTR;
|
||||||
|
|
||||||
|
void *pvPortMalloc( size_t xWantedSize ) ;//ICACHE_FLASH_ATTR;
|
||||||
|
|
||||||
|
void vPortFree( void *pv ) ;//ICACHE_FLASH_ATTR;
|
||||||
|
|
||||||
|
size_t xPortGetFreeHeapSize( void ) ;//ICACHE_FLASH_ATTR;
|
||||||
|
|
||||||
|
void vPortInitialiseBlocks( void ) ;//ICACHE_FLASH_ATTR;
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
#endif
|
254
app/include/netif/etharp.h
Normal file
254
app/include/netif/etharp.h
Normal file
@ -0,0 +1,254 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2001-2003 Swedish Institute of Computer Science.
|
||||||
|
* Copyright (c) 2003-2004 Leon Woestenberg <leon.woestenberg@axon.tv>
|
||||||
|
* Copyright (c) 2003-2004 Axon Digital Design B.V., The Netherlands.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* This file is part of the lwIP TCP/IP stack.
|
||||||
|
*
|
||||||
|
* Author: Adam Dunkels <adam@sics.se>
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __NETIF_ETHARP_H__
|
||||||
|
#define __NETIF_ETHARP_H__
|
||||||
|
|
||||||
|
#include "lwip/opt.h"
|
||||||
|
|
||||||
|
#if LWIP_ARP || LWIP_ETHERNET /* don't build if not configured for use in lwipopts.h */
|
||||||
|
|
||||||
|
#include "lwip/pbuf.h"
|
||||||
|
#include "lwip/ip_addr.h"
|
||||||
|
#include "lwip/netif.h"
|
||||||
|
#include "lwip/ip.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef ETHARP_HWADDR_LEN
|
||||||
|
#define ETHARP_HWADDR_LEN 6
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef PACK_STRUCT_USE_INCLUDES
|
||||||
|
# include "arch/bpstruct.h"
|
||||||
|
#endif
|
||||||
|
PACK_STRUCT_BEGIN
|
||||||
|
struct eth_addr {
|
||||||
|
PACK_STRUCT_FIELD(u8_t addr[ETHARP_HWADDR_LEN]);
|
||||||
|
} PACK_STRUCT_STRUCT;
|
||||||
|
PACK_STRUCT_END
|
||||||
|
#ifdef PACK_STRUCT_USE_INCLUDES
|
||||||
|
# include "arch/epstruct.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef PACK_STRUCT_USE_INCLUDES
|
||||||
|
# include "arch/bpstruct.h"
|
||||||
|
#endif
|
||||||
|
PACK_STRUCT_BEGIN
|
||||||
|
/** Ethernet header */
|
||||||
|
struct eth_hdr {
|
||||||
|
#if ETH_PAD_SIZE
|
||||||
|
PACK_STRUCT_FIELD(u8_t padding[ETH_PAD_SIZE]);
|
||||||
|
#endif
|
||||||
|
PACK_STRUCT_FIELD(struct eth_addr dest);
|
||||||
|
PACK_STRUCT_FIELD(struct eth_addr src);
|
||||||
|
PACK_STRUCT_FIELD(u16_t type);
|
||||||
|
} PACK_STRUCT_STRUCT;
|
||||||
|
PACK_STRUCT_END
|
||||||
|
#ifdef PACK_STRUCT_USE_INCLUDES
|
||||||
|
# include "arch/epstruct.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define SIZEOF_ETH_HDR (14 + ETH_PAD_SIZE)
|
||||||
|
|
||||||
|
#if ETHARP_SUPPORT_VLAN
|
||||||
|
|
||||||
|
#ifdef PACK_STRUCT_USE_INCLUDES
|
||||||
|
# include "arch/bpstruct.h"
|
||||||
|
#endif
|
||||||
|
PACK_STRUCT_BEGIN
|
||||||
|
/** VLAN header inserted between ethernet header and payload
|
||||||
|
* if 'type' in ethernet header is ETHTYPE_VLAN.
|
||||||
|
* See IEEE802.Q */
|
||||||
|
struct eth_vlan_hdr {
|
||||||
|
PACK_STRUCT_FIELD(u16_t tpid);
|
||||||
|
PACK_STRUCT_FIELD(u16_t prio_vid);
|
||||||
|
} PACK_STRUCT_STRUCT;
|
||||||
|
PACK_STRUCT_END
|
||||||
|
#ifdef PACK_STRUCT_USE_INCLUDES
|
||||||
|
# include "arch/epstruct.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define SIZEOF_VLAN_HDR 4
|
||||||
|
#define VLAN_ID(vlan_hdr) (htons((vlan_hdr)->prio_vid) & 0xFFF)
|
||||||
|
|
||||||
|
#endif /* ETHARP_SUPPORT_VLAN */
|
||||||
|
|
||||||
|
#ifdef PACK_STRUCT_USE_INCLUDES
|
||||||
|
# include "arch/bpstruct.h"
|
||||||
|
#endif
|
||||||
|
PACK_STRUCT_BEGIN
|
||||||
|
/** the ARP message, see RFC 826 ("Packet format") */
|
||||||
|
struct etharp_hdr {
|
||||||
|
PACK_STRUCT_FIELD(u16_t hwtype);
|
||||||
|
PACK_STRUCT_FIELD(u16_t proto);
|
||||||
|
PACK_STRUCT_FIELD(u8_t hwlen);
|
||||||
|
PACK_STRUCT_FIELD(u8_t protolen);
|
||||||
|
PACK_STRUCT_FIELD(u16_t opcode);
|
||||||
|
PACK_STRUCT_FIELD(struct eth_addr shwaddr);
|
||||||
|
PACK_STRUCT_FIELD(struct ip_addr2 sipaddr);
|
||||||
|
PACK_STRUCT_FIELD(struct eth_addr dhwaddr);
|
||||||
|
PACK_STRUCT_FIELD(struct ip_addr2 dipaddr);
|
||||||
|
} PACK_STRUCT_STRUCT;
|
||||||
|
PACK_STRUCT_END
|
||||||
|
#ifdef PACK_STRUCT_USE_INCLUDES
|
||||||
|
# include "arch/epstruct.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define SIZEOF_ETHARP_HDR 28
|
||||||
|
#define SIZEOF_ETHARP_MINSIZE 46
|
||||||
|
#define SIZEOF_ETHARP_PACKET (SIZEOF_ETH_HDR + SIZEOF_ETHARP_HDR)
|
||||||
|
#define SIZEOF_ETHARP_WITHPAD (SIZEOF_ETH_HDR + SIZEOF_ETHARP_MINSIZE)
|
||||||
|
|
||||||
|
/** 5 seconds period */
|
||||||
|
#define ARP_TMR_INTERVAL 5000
|
||||||
|
|
||||||
|
#define ETHTYPE_ARP 0x0806
|
||||||
|
#define ETHTYPE_IP 0x0800
|
||||||
|
#define ETHTYPE_VLAN 0x8100
|
||||||
|
#define ETHTYPE_PPPOEDISC 0x8863 /* PPP Over Ethernet Discovery Stage */
|
||||||
|
#define ETHTYPE_PPPOE 0x8864 /* PPP Over Ethernet Session Stage */
|
||||||
|
#define ETHTYPE_PAE 0x888e
|
||||||
|
|
||||||
|
/** MEMCPY-like macro to copy to/from struct eth_addr's that are local variables
|
||||||
|
* or known to be 32-bit aligned within the protocol header. */
|
||||||
|
#ifndef ETHADDR32_COPY
|
||||||
|
#define ETHADDR32_COPY(src, dst) SMEMCPY(src, dst, ETHARP_HWADDR_LEN)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/** MEMCPY-like macro to copy to/from struct eth_addr's that are no local
|
||||||
|
* variables and known to be 16-bit aligned within the protocol header. */
|
||||||
|
#ifndef ETHADDR16_COPY
|
||||||
|
#define ETHADDR16_COPY(src, dst) SMEMCPY(src, dst, ETHARP_HWADDR_LEN)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if LWIP_ARP /* don't build if not configured for use in lwipopts.h */
|
||||||
|
|
||||||
|
/** ARP message types (opcodes) */
|
||||||
|
#define ARP_REQUEST 1
|
||||||
|
#define ARP_REPLY 2
|
||||||
|
|
||||||
|
/** Define this to 1 and define LWIP_ARP_FILTER_NETIF_FN(pbuf, netif, type)
|
||||||
|
* to a filter function that returns the correct netif when using multiple
|
||||||
|
* netifs on one hardware interface where the netif's low-level receive
|
||||||
|
* routine cannot decide for the correct netif (e.g. when mapping multiple
|
||||||
|
* IP addresses to one hardware interface).
|
||||||
|
*/
|
||||||
|
#ifndef LWIP_ARP_FILTER_NETIF
|
||||||
|
#define LWIP_ARP_FILTER_NETIF 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if ARP_QUEUEING
|
||||||
|
/** struct for queueing outgoing packets for unknown address
|
||||||
|
* defined here to be accessed by memp.h
|
||||||
|
*/
|
||||||
|
struct etharp_q_entry {
|
||||||
|
struct etharp_q_entry *next;
|
||||||
|
struct pbuf *p;
|
||||||
|
};
|
||||||
|
#endif /* ARP_QUEUEING */
|
||||||
|
|
||||||
|
#define etharp_init() /* Compatibility define, not init needed. */
|
||||||
|
void etharp_tmr(void)ICACHE_FLASH_ATTR;
|
||||||
|
s8_t etharp_find_addr(struct netif *netif, ip_addr_t *ipaddr,
|
||||||
|
struct eth_addr **eth_ret, ip_addr_t **ip_ret)ICACHE_FLASH_ATTR;
|
||||||
|
err_t etharp_output(struct netif *netif, struct pbuf *q, ip_addr_t *ipaddr)ICACHE_FLASH_ATTR;
|
||||||
|
err_t etharp_query(struct netif *netif, ip_addr_t *ipaddr, struct pbuf *q)ICACHE_FLASH_ATTR;
|
||||||
|
err_t etharp_request(struct netif *netif, ip_addr_t *ipaddr)ICACHE_FLASH_ATTR;
|
||||||
|
/** For Ethernet network interfaces, we might want to send "gratuitous ARP";
|
||||||
|
* this is an ARP packet sent by a node in order to spontaneously cause other
|
||||||
|
* nodes to update an entry in their ARP cache.
|
||||||
|
* From RFC 3220 "IP Mobility Support for IPv4" section 4.6. */
|
||||||
|
#define etharp_gratuitous(netif) etharp_request((netif), &(netif)->ip_addr)
|
||||||
|
void etharp_cleanup_netif(struct netif *netif);
|
||||||
|
|
||||||
|
#if ETHARP_SUPPORT_STATIC_ENTRIES
|
||||||
|
err_t etharp_add_static_entry(ip_addr_t *ipaddr, struct eth_addr *ethaddr)ICACHE_FLASH_ATTR;
|
||||||
|
err_t etharp_remove_static_entry(ip_addr_t *ipaddr)ICACHE_FLASH_ATTR;
|
||||||
|
#endif /* ETHARP_SUPPORT_STATIC_ENTRIES */
|
||||||
|
|
||||||
|
#if LWIP_AUTOIP
|
||||||
|
err_t etharp_raw(struct netif *netif, const struct eth_addr *ethsrc_addr,
|
||||||
|
const struct eth_addr *ethdst_addr,
|
||||||
|
const struct eth_addr *hwsrc_addr, const ip_addr_t *ipsrc_addr,
|
||||||
|
const struct eth_addr *hwdst_addr, const ip_addr_t *ipdst_addr,
|
||||||
|
const u16_t opcode)ICACHE_FLASH_ATTR;
|
||||||
|
#endif /* LWIP_AUTOIP */
|
||||||
|
|
||||||
|
#endif /* LWIP_ARP */
|
||||||
|
|
||||||
|
err_t ethernet_input(struct pbuf *p, struct netif *netif)ICACHE_FLASH_ATTR;
|
||||||
|
|
||||||
|
#define eth_addr_cmp(addr1, addr2) (memcmp((addr1)->addr, (addr2)->addr, ETHARP_HWADDR_LEN) == 0)
|
||||||
|
|
||||||
|
extern const struct eth_addr ethbroadcast, ethzero;
|
||||||
|
|
||||||
|
#endif /* LWIP_ARP || LWIP_ETHERNET */
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
/** Ethernet header */
|
||||||
|
#ifndef ETHARP_HWADDR_LEN
|
||||||
|
#define ETHARP_HWADDR_LEN 6
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
struct eth_addr {
|
||||||
|
PACK_STRUCT_FIELD(u8_t addr[ETHARP_HWADDR_LEN]);
|
||||||
|
} PACK_STRUCT_STRUCT;
|
||||||
|
|
||||||
|
|
||||||
|
struct eth_hdr {
|
||||||
|
#if ETH_PAD_SIZE
|
||||||
|
PACK_STRUCT_FIELD(u8_t padding[ETH_PAD_SIZE]);
|
||||||
|
#endif
|
||||||
|
PACK_STRUCT_FIELD(struct eth_addr dest);
|
||||||
|
PACK_STRUCT_FIELD(struct eth_addr src);
|
||||||
|
PACK_STRUCT_FIELD(u16_t type);
|
||||||
|
} PACK_STRUCT_STRUCT;
|
||||||
|
|
||||||
|
#ifdef PACK_STRUCT_USE_INCLUDES
|
||||||
|
# include "arch/epstruct.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define SIZEOF_ETH_HDR (14 + ETH_PAD_SIZE)
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* __NETIF_ARP_H__ */
|
173
app/include/netif/if_llc.h
Normal file
173
app/include/netif/if_llc.h
Normal file
@ -0,0 +1,173 @@
|
|||||||
|
/* $NetBSD: if_llc.h,v 1.12 1999/11/19 20:41:19 thorpej Exp $ */
|
||||||
|
|
||||||
|
/*-
|
||||||
|
* Copyright (c) 1988, 1993
|
||||||
|
* The Regents of the University of California. All rights reserved.
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
* 4. Neither the name of the University nor the names of its contributors
|
||||||
|
* may be used to endorse or promote products derived from this software
|
||||||
|
* without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``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 REGENTS OR CONTRIBUTORS 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.
|
||||||
|
*
|
||||||
|
* @(#)if_llc.h 8.1 (Berkeley) 6/10/93
|
||||||
|
* $FreeBSD$
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _NET_IF_LLC_H_
|
||||||
|
#define _NET_IF_LLC_H_
|
||||||
|
|
||||||
|
/*
|
||||||
|
* IEEE 802.2 Link Level Control headers, for use in conjunction with
|
||||||
|
* 802.{3,4,5} media access control methods.
|
||||||
|
*
|
||||||
|
* Headers here do not use bit fields due to shortcommings in many
|
||||||
|
* compilers.
|
||||||
|
*/
|
||||||
|
|
||||||
|
struct llc {
|
||||||
|
uint8_t llc_dsap;
|
||||||
|
uint8_t llc_ssap;
|
||||||
|
union {
|
||||||
|
struct {
|
||||||
|
uint8_t control;
|
||||||
|
uint8_t format_id;
|
||||||
|
uint8_t class;
|
||||||
|
uint8_t window_x2;
|
||||||
|
} __packed type_u;
|
||||||
|
struct {
|
||||||
|
uint8_t num_snd_x2;
|
||||||
|
uint8_t num_rcv_x2;
|
||||||
|
} __packed type_i;
|
||||||
|
struct {
|
||||||
|
uint8_t control;
|
||||||
|
uint8_t num_rcv_x2;
|
||||||
|
} __packed type_s;
|
||||||
|
struct {
|
||||||
|
uint8_t control;
|
||||||
|
/*
|
||||||
|
* We cannot put the following fields in a structure because
|
||||||
|
* the structure rounding might cause padding.
|
||||||
|
*/
|
||||||
|
uint8_t frmr_rej_pdu0;
|
||||||
|
uint8_t frmr_rej_pdu1;
|
||||||
|
uint8_t frmr_control;
|
||||||
|
uint8_t frmr_control_ext;
|
||||||
|
uint8_t frmr_cause;
|
||||||
|
} __packed type_frmr;
|
||||||
|
struct {
|
||||||
|
uint8_t control;
|
||||||
|
uint8_t org_code[3];
|
||||||
|
uint16_t ether_type;
|
||||||
|
} __packed type_snap;
|
||||||
|
struct {
|
||||||
|
uint8_t control;
|
||||||
|
uint8_t control_ext;
|
||||||
|
} __packed type_raw;
|
||||||
|
} __packed llc_un;
|
||||||
|
} __packed;
|
||||||
|
|
||||||
|
struct frmrinfo {
|
||||||
|
uint8_t frmr_rej_pdu0;
|
||||||
|
uint8_t frmr_rej_pdu1;
|
||||||
|
uint8_t frmr_control;
|
||||||
|
uint8_t frmr_control_ext;
|
||||||
|
uint8_t frmr_cause;
|
||||||
|
} __packed;
|
||||||
|
|
||||||
|
#define llc_control llc_un.type_u.control
|
||||||
|
#define llc_control_ext llc_un.type_raw.control_ext
|
||||||
|
#define llc_fid llc_un.type_u.format_id
|
||||||
|
#define llc_class llc_un.type_u.class
|
||||||
|
#define llc_window llc_un.type_u.window_x2
|
||||||
|
#define llc_frmrinfo llc_un.type_frmr.frmr_rej_pdu0
|
||||||
|
#define llc_frmr_pdu0 llc_un.type_frmr.frmr_rej_pdu0
|
||||||
|
#define llc_frmr_pdu1 llc_un.type_frmr.frmr_rej_pdu1
|
||||||
|
#define llc_frmr_control llc_un.type_frmr.frmr_control
|
||||||
|
#define llc_frmr_control_ext llc_un.type_frmr.frmr_control_ext
|
||||||
|
#define llc_frmr_cause llc_un.type_frmr.frmr_cause
|
||||||
|
#define llc_snap llc_un.type_snap
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Don't use sizeof(struct llc_un) for LLC header sizes
|
||||||
|
*/
|
||||||
|
#define LLC_ISFRAMELEN 4
|
||||||
|
#define LLC_UFRAMELEN 3
|
||||||
|
#define LLC_FRMRLEN 7
|
||||||
|
#define LLC_SNAPFRAMELEN 8
|
||||||
|
|
||||||
|
#ifdef CTASSERT
|
||||||
|
CTASSERT(sizeof (struct llc) == LLC_SNAPFRAMELEN);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Unnumbered LLC format commands
|
||||||
|
*/
|
||||||
|
#define LLC_UI 0x3
|
||||||
|
#define LLC_UI_P 0x13
|
||||||
|
#define LLC_DISC 0x43
|
||||||
|
#define LLC_DISC_P 0x53
|
||||||
|
#define LLC_UA 0x63
|
||||||
|
#define LLC_UA_P 0x73
|
||||||
|
#define LLC_TEST 0xe3
|
||||||
|
#define LLC_TEST_P 0xf3
|
||||||
|
#define LLC_FRMR 0x87
|
||||||
|
#define LLC_FRMR_P 0x97
|
||||||
|
#define LLC_DM 0x0f
|
||||||
|
#define LLC_DM_P 0x1f
|
||||||
|
#define LLC_XID 0xaf
|
||||||
|
#define LLC_XID_P 0xbf
|
||||||
|
#define LLC_SABME 0x6f
|
||||||
|
#define LLC_SABME_P 0x7f
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Supervisory LLC commands
|
||||||
|
*/
|
||||||
|
#define LLC_RR 0x01
|
||||||
|
#define LLC_RNR 0x05
|
||||||
|
#define LLC_REJ 0x09
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Info format - dummy only
|
||||||
|
*/
|
||||||
|
#define LLC_INFO 0x00
|
||||||
|
|
||||||
|
/*
|
||||||
|
* ISO PDTR 10178 contains among others
|
||||||
|
*/
|
||||||
|
#define LLC_8021D_LSAP 0x42
|
||||||
|
#define LLC_X25_LSAP 0x7e
|
||||||
|
#define LLC_SNAP_LSAP 0xaa
|
||||||
|
#define LLC_ISO_LSAP 0xfe
|
||||||
|
|
||||||
|
#define RFC1042_LEN 6
|
||||||
|
#define RFC1042 {0xAA, 0xAA, 0x03, 0x00, 0x00, 0x00}
|
||||||
|
#define ETHERNET_TUNNEL {0xAA, 0xAA, 0x03, 0x00, 0x00, 0xF8}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* copied from sys/net/ethernet.h
|
||||||
|
*/
|
||||||
|
#define ETHERTYPE_AARP 0x80F3 /* AppleTalk AARP */
|
||||||
|
#define ETHERTYPE_IPX 0x8137 /* Novell (old) NetWare IPX (ECONFIG E option) */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* _NET_IF_LLC_H_ */
|
190
app/include/netif/ppp_oe.h
Normal file
190
app/include/netif/ppp_oe.h
Normal file
@ -0,0 +1,190 @@
|
|||||||
|
/*****************************************************************************
|
||||||
|
* ppp_oe.h - PPP Over Ethernet implementation for lwIP.
|
||||||
|
*
|
||||||
|
* Copyright (c) 2006 by Marc Boucher, Services Informatiques (MBSI) inc.
|
||||||
|
*
|
||||||
|
* The authors hereby grant permission to use, copy, modify, distribute,
|
||||||
|
* and license this software and its documentation for any purpose, provided
|
||||||
|
* that existing copyright notices are retained in all copies and that this
|
||||||
|
* notice and the following disclaimer are included verbatim in any
|
||||||
|
* distributions. No written agreement, license, or royalty fee is required
|
||||||
|
* for any of the authorized uses.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS *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 CONTRIBUTORS 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.
|
||||||
|
*
|
||||||
|
******************************************************************************
|
||||||
|
* REVISION HISTORY
|
||||||
|
*
|
||||||
|
* 06-01-01 Marc Boucher <marc@mbsi.ca>
|
||||||
|
* Ported to lwIP.
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* based on NetBSD: if_pppoe.c,v 1.64 2006/01/31 23:50:15 martin Exp */
|
||||||
|
|
||||||
|
/*-
|
||||||
|
* Copyright (c) 2002 The NetBSD Foundation, Inc.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* This code is derived from software contributed to The NetBSD Foundation
|
||||||
|
* by Martin Husemann <martin@NetBSD.org>.
|
||||||
|
*
|
||||||
|
* 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. All advertising materials mentioning features or use of this software
|
||||||
|
* must display the following acknowledgement:
|
||||||
|
* This product includes software developed by the NetBSD
|
||||||
|
* Foundation, Inc. and its contributors.
|
||||||
|
* 4. Neither the name of The NetBSD Foundation nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived
|
||||||
|
* from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
|
||||||
|
* ``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 FOUNDATION OR CONTRIBUTORS
|
||||||
|
* 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 PPP_OE_H
|
||||||
|
#define PPP_OE_H
|
||||||
|
|
||||||
|
#include "lwip/opt.h"
|
||||||
|
|
||||||
|
#if PPPOE_SUPPORT > 0
|
||||||
|
|
||||||
|
#include "netif/etharp.h"
|
||||||
|
|
||||||
|
#ifdef PACK_STRUCT_USE_INCLUDES
|
||||||
|
# include "arch/bpstruct.h"
|
||||||
|
#endif
|
||||||
|
PACK_STRUCT_BEGIN
|
||||||
|
struct pppoehdr {
|
||||||
|
PACK_STRUCT_FIELD(u8_t vertype);
|
||||||
|
PACK_STRUCT_FIELD(u8_t code);
|
||||||
|
PACK_STRUCT_FIELD(u16_t session);
|
||||||
|
PACK_STRUCT_FIELD(u16_t plen);
|
||||||
|
} PACK_STRUCT_STRUCT;
|
||||||
|
PACK_STRUCT_END
|
||||||
|
#ifdef PACK_STRUCT_USE_INCLUDES
|
||||||
|
# include "arch/epstruct.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef PACK_STRUCT_USE_INCLUDES
|
||||||
|
# include "arch/bpstruct.h"
|
||||||
|
#endif
|
||||||
|
PACK_STRUCT_BEGIN
|
||||||
|
struct pppoetag {
|
||||||
|
PACK_STRUCT_FIELD(u16_t tag);
|
||||||
|
PACK_STRUCT_FIELD(u16_t len);
|
||||||
|
} PACK_STRUCT_STRUCT;
|
||||||
|
PACK_STRUCT_END
|
||||||
|
#ifdef PACK_STRUCT_USE_INCLUDES
|
||||||
|
# include "arch/epstruct.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#define PPPOE_STATE_INITIAL 0
|
||||||
|
#define PPPOE_STATE_PADI_SENT 1
|
||||||
|
#define PPPOE_STATE_PADR_SENT 2
|
||||||
|
#define PPPOE_STATE_SESSION 3
|
||||||
|
#define PPPOE_STATE_CLOSING 4
|
||||||
|
/* passive */
|
||||||
|
#define PPPOE_STATE_PADO_SENT 1
|
||||||
|
|
||||||
|
#define PPPOE_HEADERLEN sizeof(struct pppoehdr)
|
||||||
|
#define PPPOE_VERTYPE 0x11 /* VER=1, TYPE = 1 */
|
||||||
|
|
||||||
|
#define PPPOE_TAG_EOL 0x0000 /* end of list */
|
||||||
|
#define PPPOE_TAG_SNAME 0x0101 /* service name */
|
||||||
|
#define PPPOE_TAG_ACNAME 0x0102 /* access concentrator name */
|
||||||
|
#define PPPOE_TAG_HUNIQUE 0x0103 /* host unique */
|
||||||
|
#define PPPOE_TAG_ACCOOKIE 0x0104 /* AC cookie */
|
||||||
|
#define PPPOE_TAG_VENDOR 0x0105 /* vendor specific */
|
||||||
|
#define PPPOE_TAG_RELAYSID 0x0110 /* relay session id */
|
||||||
|
#define PPPOE_TAG_SNAME_ERR 0x0201 /* service name error */
|
||||||
|
#define PPPOE_TAG_ACSYS_ERR 0x0202 /* AC system error */
|
||||||
|
#define PPPOE_TAG_GENERIC_ERR 0x0203 /* gerneric error */
|
||||||
|
|
||||||
|
#define PPPOE_CODE_PADI 0x09 /* Active Discovery Initiation */
|
||||||
|
#define PPPOE_CODE_PADO 0x07 /* Active Discovery Offer */
|
||||||
|
#define PPPOE_CODE_PADR 0x19 /* Active Discovery Request */
|
||||||
|
#define PPPOE_CODE_PADS 0x65 /* Active Discovery Session confirmation */
|
||||||
|
#define PPPOE_CODE_PADT 0xA7 /* Active Discovery Terminate */
|
||||||
|
|
||||||
|
#ifndef ETHERMTU
|
||||||
|
#define ETHERMTU 1500
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* two byte PPP protocol discriminator, then IP data */
|
||||||
|
#define PPPOE_MAXMTU (ETHERMTU-PPPOE_HEADERLEN-2)
|
||||||
|
|
||||||
|
#ifndef PPPOE_MAX_AC_COOKIE_LEN
|
||||||
|
#define PPPOE_MAX_AC_COOKIE_LEN 64
|
||||||
|
#endif
|
||||||
|
|
||||||
|
struct pppoe_softc {
|
||||||
|
struct pppoe_softc *next;
|
||||||
|
struct netif *sc_ethif; /* ethernet interface we are using */
|
||||||
|
int sc_pd; /* ppp unit number */
|
||||||
|
void (*sc_linkStatusCB)(int pd, int up);
|
||||||
|
|
||||||
|
int sc_state; /* discovery phase or session connected */
|
||||||
|
struct eth_addr sc_dest; /* hardware address of concentrator */
|
||||||
|
u16_t sc_session; /* PPPoE session id */
|
||||||
|
|
||||||
|
#ifdef PPPOE_TODO
|
||||||
|
char *sc_service_name; /* if != NULL: requested name of service */
|
||||||
|
char *sc_concentrator_name; /* if != NULL: requested concentrator id */
|
||||||
|
#endif /* PPPOE_TODO */
|
||||||
|
u8_t sc_ac_cookie[PPPOE_MAX_AC_COOKIE_LEN]; /* content of AC cookie we must echo back */
|
||||||
|
size_t sc_ac_cookie_len; /* length of cookie data */
|
||||||
|
#ifdef PPPOE_SERVER
|
||||||
|
u8_t *sc_hunique; /* content of host unique we must echo back */
|
||||||
|
size_t sc_hunique_len; /* length of host unique */
|
||||||
|
#endif
|
||||||
|
int sc_padi_retried; /* number of PADI retries already done */
|
||||||
|
int sc_padr_retried; /* number of PADR retries already done */
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#define pppoe_init() /* compatibility define, no initialization needed */
|
||||||
|
|
||||||
|
err_t pppoe_create(struct netif *ethif, int pd, void (*linkStatusCB)(int pd, int up), struct pppoe_softc **scptr);
|
||||||
|
err_t pppoe_destroy(struct netif *ifp);
|
||||||
|
|
||||||
|
int pppoe_connect(struct pppoe_softc *sc);
|
||||||
|
void pppoe_disconnect(struct pppoe_softc *sc);
|
||||||
|
|
||||||
|
void pppoe_disc_input(struct netif *netif, struct pbuf *p);
|
||||||
|
void pppoe_data_input(struct netif *netif, struct pbuf *p);
|
||||||
|
|
||||||
|
err_t pppoe_xmit(struct pppoe_softc *sc, struct pbuf *pb);
|
||||||
|
|
||||||
|
/** used in ppp.c */
|
||||||
|
#define PPPOE_HDRLEN (sizeof(struct eth_hdr) + PPPOE_HEADERLEN)
|
||||||
|
|
||||||
|
#endif /* PPPOE_SUPPORT */
|
||||||
|
|
||||||
|
#endif /* PPP_OE_H */
|
25
app/include/netif/wlan_lwip_if.h
Normal file
25
app/include/netif/wlan_lwip_if.h
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2010-2011 Espressif System
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _WLAN_LWIP_IF_H_
|
||||||
|
#define _WLAN_LWIP_IF_H_
|
||||||
|
|
||||||
|
#define LWIP_IF0_PRIO 28
|
||||||
|
#define LWIP_IF1_PRIO 29
|
||||||
|
|
||||||
|
enum {
|
||||||
|
SIG_LWIP_RX = 0,
|
||||||
|
};
|
||||||
|
|
||||||
|
struct netif * eagle_lwip_if_alloc(struct ieee80211_conn *conn, const uint8 *macaddr, struct ip_info *info);
|
||||||
|
struct netif * eagle_lwip_getif(uint8 index);
|
||||||
|
|
||||||
|
#ifndef IOT_SIP_MODE
|
||||||
|
sint8 ieee80211_output_pbuf(struct netif *ifp, struct pbuf* pb);
|
||||||
|
#else
|
||||||
|
sint8 ieee80211_output_pbuf(struct ieee80211_conn *conn, esf_buf *eb);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* _WLAN_LWIP_IF_H_ */
|
12
app/include/pp/esf_buf.h
Normal file
12
app/include/pp/esf_buf.h
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
/*
|
||||||
|
* copyright (c) 2008 - 2012 Espressif System
|
||||||
|
*
|
||||||
|
* esf buffer data structure
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _ESF_BUF_H_
|
||||||
|
#define _ESF_BUF_H_
|
||||||
|
|
||||||
|
#define EP_OFFSET 36 /* see comments in pbuf.h */
|
||||||
|
|
||||||
|
#endif /* _ESF_BUF_H_ */
|
46
app/include/ssl/app/espconn_secure.h
Normal file
46
app/include/ssl/app/espconn_secure.h
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
#ifndef __ESPCONN_ENCRY_H__
|
||||||
|
#define __ESPCONN_ENCRY_H__
|
||||||
|
|
||||||
|
#include "espconn/espconn.h"
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* FunctionName : espconn_encry_connect
|
||||||
|
* Description : The function given as connection
|
||||||
|
* Parameters : espconn -- the espconn used to connect with the host
|
||||||
|
* Returns : none
|
||||||
|
*******************************************************************************/
|
||||||
|
|
||||||
|
sint8 espconn_secure_connect(struct espconn *espconn);
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* FunctionName : espconn_encry_disconnect
|
||||||
|
* Description : The function given as the disconnection
|
||||||
|
* Parameters : espconn -- the espconn used to disconnect with the host
|
||||||
|
* Returns : none
|
||||||
|
*******************************************************************************/
|
||||||
|
|
||||||
|
extern sint8 espconn_secure_disconnect(struct espconn *espconn);
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* FunctionName : espconn_encry_sent
|
||||||
|
* Description : sent data for client or server
|
||||||
|
* Parameters : espconn -- espconn to set for client or server
|
||||||
|
* psent -- data to send
|
||||||
|
* length -- length of data to send
|
||||||
|
* Returns : none
|
||||||
|
*******************************************************************************/
|
||||||
|
|
||||||
|
extern sint8 espconn_secure_sent(struct espconn *espconn, uint8 *psent, uint16 length);
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* FunctionName : espconn_secure_accept
|
||||||
|
* Description : The function given as the listen
|
||||||
|
* Parameters : espconn -- the espconn used to listen the connection
|
||||||
|
* Returns : none
|
||||||
|
*******************************************************************************/
|
||||||
|
|
||||||
|
extern sint8 espconn_secure_accept(struct espconn *espconn);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
59
app/include/ssl/app/espconn_ssl.h
Normal file
59
app/include/ssl/app/espconn_ssl.h
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
#ifndef ESPCONN_SSL_CLIENT_H
|
||||||
|
#define ESPCONN_SSL_CLIENT_H
|
||||||
|
|
||||||
|
#include "ssl/ssl_ssl.h"
|
||||||
|
#include "ssl/ssl_tls1.h"
|
||||||
|
|
||||||
|
#include "lwip/app/espconn.h"
|
||||||
|
|
||||||
|
typedef struct _ssl_msg {
|
||||||
|
SSL_CTX *ssl_ctx;
|
||||||
|
SSL *ssl;
|
||||||
|
bool quiet;
|
||||||
|
char *private_key_file;
|
||||||
|
uint8_t session_id[SSL_SESSION_ID_SIZE];
|
||||||
|
u16_t pkt_length;
|
||||||
|
} ssl_msg;
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* FunctionName : sslserver_start
|
||||||
|
* Description : Initialize the server: set up a listen PCB and bind it to
|
||||||
|
* the defined port
|
||||||
|
* Parameters : espconn -- the espconn used to build client
|
||||||
|
* Returns : none
|
||||||
|
*******************************************************************************/
|
||||||
|
|
||||||
|
extern sint8 espconn_ssl_server(struct espconn *espconn);
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* FunctionName : espconn_ssl_client
|
||||||
|
* Description : Initialize the client: set up a connect PCB and bind it to
|
||||||
|
* the defined port
|
||||||
|
* Parameters : espconn -- the espconn used to build client
|
||||||
|
* Returns : none
|
||||||
|
*******************************************************************************/
|
||||||
|
|
||||||
|
extern sint8 espconn_ssl_client(struct espconn *espconn);
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* FunctionName : espconn_ssl_write
|
||||||
|
* Description : sent data for client or server
|
||||||
|
* Parameters : void *arg -- client or server to send
|
||||||
|
* uint8* psent -- Data to send
|
||||||
|
* uint16 length -- Length of data to send
|
||||||
|
* Returns : none
|
||||||
|
*******************************************************************************/
|
||||||
|
|
||||||
|
extern void espconn_ssl_sent(void *arg, uint8 *psent, uint16 length);
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* FunctionName : espconn_ssl_disconnect
|
||||||
|
* Description : A new incoming connection has been disconnected.
|
||||||
|
* Parameters : espconn -- the espconn used to disconnect with host
|
||||||
|
* Returns : none
|
||||||
|
*******************************************************************************/
|
||||||
|
|
||||||
|
extern void espconn_ssl_disconnect(espconn_msg *pdis);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
36
app/include/ssl/cert.h
Normal file
36
app/include/ssl/cert.h
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
unsigned char default_certificate[] = {
|
||||||
|
0x30, 0x82, 0x01, 0x82, 0x30, 0x81, 0xec, 0x02, 0x09, 0x00, 0x88, 0xf2,
|
||||||
|
0x5f, 0x46, 0x12, 0x2e, 0x3d, 0x3a, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86,
|
||||||
|
0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x1c, 0x31,
|
||||||
|
0x1a, 0x30, 0x18, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x11, 0x77, 0x77,
|
||||||
|
0x77, 0x2e, 0x65, 0x73, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x66, 0x2e,
|
||||||
|
0x63, 0x6f, 0x6d, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x34, 0x30, 0x36, 0x32,
|
||||||
|
0x34, 0x31, 0x30, 0x32, 0x32, 0x33, 0x33, 0x5a, 0x17, 0x0d, 0x32, 0x38,
|
||||||
|
0x30, 0x33, 0x30, 0x32, 0x31, 0x30, 0x32, 0x32, 0x33, 0x33, 0x5a, 0x30,
|
||||||
|
0x34, 0x31, 0x12, 0x30, 0x10, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x09,
|
||||||
|
0x65, 0x73, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x66, 0x31, 0x1e, 0x30,
|
||||||
|
0x1c, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x15, 0x65, 0x73, 0x70, 0x72,
|
||||||
|
0x65, 0x73, 0x73, 0x69, 0x66, 0x20, 0x49, 0x6f, 0x54, 0x20, 0x70, 0x72,
|
||||||
|
0x6f, 0x6a, 0x65, 0x63, 0x74, 0x30, 0x5c, 0x30, 0x0d, 0x06, 0x09, 0x2a,
|
||||||
|
0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x4b,
|
||||||
|
0x00, 0x30, 0x48, 0x02, 0x41, 0x00, 0xb9, 0x83, 0x30, 0xca, 0xfb, 0xec,
|
||||||
|
0x11, 0x9e, 0x94, 0xb7, 0x89, 0xf2, 0x84, 0x2c, 0xda, 0xe1, 0x9a, 0x53,
|
||||||
|
0x3a, 0x1b, 0x6e, 0xc9, 0x85, 0x81, 0xf9, 0xa3, 0x41, 0xdb, 0xe2, 0x82,
|
||||||
|
0x3b, 0xfa, 0x80, 0x22, 0x3b, 0x81, 0x6d, 0x25, 0x73, 0x7e, 0xf6, 0x49,
|
||||||
|
0xcc, 0x69, 0x3c, 0x6c, 0xd8, 0x05, 0xfb, 0x92, 0x02, 0xcf, 0x19, 0x2a,
|
||||||
|
0x10, 0x7d, 0x69, 0x7a, 0xd8, 0x9d, 0xd3, 0xcf, 0x6c, 0xef, 0x02, 0x03,
|
||||||
|
0x01, 0x00, 0x01, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7,
|
||||||
|
0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x81, 0x81, 0x00, 0x2d, 0x63,
|
||||||
|
0x58, 0x21, 0xe3, 0x8b, 0x37, 0x0d, 0x28, 0x68, 0x11, 0x0e, 0x4d, 0xdd,
|
||||||
|
0xf3, 0xea, 0xdb, 0xec, 0xd7, 0x09, 0x47, 0x2c, 0xa1, 0xd8, 0xd1, 0x71,
|
||||||
|
0x83, 0x11, 0xb4, 0x17, 0xbc, 0x83, 0xea, 0x5a, 0xd6, 0x73, 0x02, 0x25,
|
||||||
|
0x87, 0x01, 0x76, 0xfc, 0x59, 0x1a, 0xcf, 0xd9, 0x49, 0xc9, 0xf9, 0x1f,
|
||||||
|
0x5c, 0x3b, 0x24, 0x6a, 0x5c, 0xa5, 0xca, 0xe6, 0x5d, 0x34, 0x5b, 0x5f,
|
||||||
|
0xcf, 0x56, 0x9c, 0x71, 0xd2, 0x6b, 0xdd, 0x1f, 0x15, 0xae, 0x4d, 0xf1,
|
||||||
|
0xca, 0x35, 0xc8, 0xdd, 0x93, 0x1b, 0x58, 0x1e, 0x94, 0x08, 0xcf, 0xa0,
|
||||||
|
0x20, 0xb9, 0x75, 0xa5, 0x4c, 0x77, 0xf5, 0x7f, 0xed, 0xd5, 0xcd, 0x53,
|
||||||
|
0xaa, 0x87, 0xa6, 0x3c, 0xf5, 0x72, 0xd8, 0xd2, 0xb0, 0xf7, 0x11, 0xb0,
|
||||||
|
0x0e, 0xe9, 0x41, 0xd6, 0x8e, 0xd9, 0x07, 0xf8, 0xed, 0xf8, 0x67, 0x7f,
|
||||||
|
0x28, 0x18, 0xf0, 0x1b, 0x29, 0x11
|
||||||
|
};
|
||||||
|
unsigned int default_certificate_len = 390;
|
30
app/include/ssl/private_key.h
Normal file
30
app/include/ssl/private_key.h
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
unsigned char default_private_key[] = {
|
||||||
|
0x30, 0x82, 0x01, 0x3a, 0x02, 0x01, 0x00, 0x02, 0x41, 0x00, 0xb9, 0x83,
|
||||||
|
0x30, 0xca, 0xfb, 0xec, 0x11, 0x9e, 0x94, 0xb7, 0x89, 0xf2, 0x84, 0x2c,
|
||||||
|
0xda, 0xe1, 0x9a, 0x53, 0x3a, 0x1b, 0x6e, 0xc9, 0x85, 0x81, 0xf9, 0xa3,
|
||||||
|
0x41, 0xdb, 0xe2, 0x82, 0x3b, 0xfa, 0x80, 0x22, 0x3b, 0x81, 0x6d, 0x25,
|
||||||
|
0x73, 0x7e, 0xf6, 0x49, 0xcc, 0x69, 0x3c, 0x6c, 0xd8, 0x05, 0xfb, 0x92,
|
||||||
|
0x02, 0xcf, 0x19, 0x2a, 0x10, 0x7d, 0x69, 0x7a, 0xd8, 0x9d, 0xd3, 0xcf,
|
||||||
|
0x6c, 0xef, 0x02, 0x03, 0x01, 0x00, 0x01, 0x02, 0x40, 0x1d, 0x13, 0x92,
|
||||||
|
0xf2, 0x3d, 0xca, 0x22, 0x78, 0xd8, 0x96, 0x6b, 0xe8, 0xb7, 0x0e, 0xd0,
|
||||||
|
0xbf, 0xcb, 0x90, 0x7f, 0xeb, 0x0c, 0xd2, 0x49, 0x3a, 0xb6, 0x06, 0x00,
|
||||||
|
0xac, 0x96, 0x34, 0x13, 0x72, 0x4b, 0x8c, 0xd2, 0xb9, 0x35, 0xf5, 0x64,
|
||||||
|
0x18, 0xb2, 0x47, 0x5b, 0x9f, 0xbb, 0xf2, 0x5b, 0x2f, 0x66, 0x78, 0x2d,
|
||||||
|
0x0a, 0x76, 0x44, 0xc5, 0x4f, 0xdb, 0x7d, 0x13, 0xcf, 0xa5, 0x08, 0xdc,
|
||||||
|
0x01, 0x02, 0x21, 0x00, 0xdf, 0x9a, 0x89, 0xd0, 0xef, 0x23, 0xcf, 0x12,
|
||||||
|
0xac, 0x8a, 0x63, 0x1a, 0x8c, 0xc0, 0x3f, 0xf4, 0x38, 0x52, 0x3c, 0x9f,
|
||||||
|
0x19, 0x0a, 0x37, 0xd2, 0xcb, 0x5d, 0xeb, 0xb6, 0x2a, 0x33, 0xb0, 0x91,
|
||||||
|
0x02, 0x21, 0x00, 0xd4, 0x63, 0xd9, 0x6a, 0x18, 0x5b, 0xe8, 0xa8, 0x57,
|
||||||
|
0x4d, 0xd1, 0x9a, 0xa8, 0xd7, 0xe1, 0x65, 0x75, 0xb3, 0xb9, 0x5c, 0x94,
|
||||||
|
0x14, 0xca, 0x98, 0x41, 0x47, 0x9c, 0x0a, 0x22, 0x38, 0x05, 0x7f, 0x02,
|
||||||
|
0x20, 0x6a, 0xce, 0xfd, 0xef, 0xe0, 0x9b, 0x61, 0x49, 0x91, 0x43, 0x95,
|
||||||
|
0x6d, 0x54, 0x38, 0x6d, 0x14, 0x32, 0x67, 0x0d, 0xf0, 0x0d, 0x5c, 0xf5,
|
||||||
|
0x27, 0x6a, 0xdf, 0x55, 0x3d, 0xb1, 0xd0, 0xf9, 0x11, 0x02, 0x21, 0x00,
|
||||||
|
0xba, 0x94, 0xa0, 0xf9, 0xb0, 0x3e, 0x85, 0x8b, 0xe5, 0x6e, 0x4a, 0x95,
|
||||||
|
0x88, 0x80, 0x65, 0xd5, 0x00, 0xea, 0x8b, 0x0b, 0x46, 0x57, 0x61, 0x87,
|
||||||
|
0x11, 0xc9, 0xfb, 0xcd, 0x77, 0x34, 0x29, 0xb7, 0x02, 0x20, 0x06, 0x8d,
|
||||||
|
0x41, 0x11, 0x47, 0x93, 0xcb, 0xad, 0xda, 0x5d, 0xe1, 0x9d, 0x49, 0x8d,
|
||||||
|
0xe0, 0xab, 0x48, 0xe6, 0x18, 0x28, 0x4a, 0x94, 0xae, 0xf9, 0xad, 0xc5,
|
||||||
|
0x5b, 0x0b, 0x15, 0xc6, 0x73, 0x17
|
||||||
|
};
|
||||||
|
unsigned int default_private_key_len = 318;
|
99
app/include/ssl/ssl_bigint.h
Normal file
99
app/include/ssl/ssl_bigint.h
Normal file
@ -0,0 +1,99 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2007, Cameron Rich
|
||||||
|
*
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* * Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
* * 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.
|
||||||
|
* * Neither the name of the axTLS project nor the names of its contributors
|
||||||
|
* may be used to endorse or promote products derived from this software
|
||||||
|
* without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
* "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 COPYRIGHT OWNER OR
|
||||||
|
* CONTRIBUTORS 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 BIGINT_HEADER
|
||||||
|
#define BIGINT_HEADER
|
||||||
|
|
||||||
|
#include "ssl/ssl_crypto.h"
|
||||||
|
|
||||||
|
BI_CTX *bi_initialize(void);
|
||||||
|
void bi_terminate(BI_CTX *ctx);
|
||||||
|
void bi_permanent(bigint *bi);
|
||||||
|
void bi_depermanent(bigint *bi);
|
||||||
|
void bi_clear_cache(BI_CTX *ctx);
|
||||||
|
void bi_free(BI_CTX *ctx, bigint *bi);
|
||||||
|
bigint *bi_copy(bigint *bi);
|
||||||
|
bigint *bi_clone(BI_CTX *ctx, const bigint *bi);
|
||||||
|
void bi_export(BI_CTX *ctx, bigint *bi, uint8_t *data, int size);
|
||||||
|
bigint *bi_import(BI_CTX *ctx, const uint8_t *data, int len);
|
||||||
|
bigint *int_to_bi(BI_CTX *ctx, comp i);
|
||||||
|
|
||||||
|
/* the functions that actually do something interesting */
|
||||||
|
bigint *bi_add(BI_CTX *ctx, bigint *bia, bigint *bib);
|
||||||
|
bigint *bi_subtract(BI_CTX *ctx, bigint *bia,
|
||||||
|
bigint *bib, int *is_negative);
|
||||||
|
bigint *bi_divide(BI_CTX *ctx, bigint *bia, bigint *bim, int is_mod);
|
||||||
|
bigint *bi_multiply(BI_CTX *ctx, bigint *bia, bigint *bib);
|
||||||
|
bigint *bi_mod_power(BI_CTX *ctx, bigint *bi, bigint *biexp);
|
||||||
|
bigint *bi_mod_power2(BI_CTX *ctx, bigint *bi, bigint *bim, bigint *biexp);
|
||||||
|
int bi_compare(bigint *bia, bigint *bib);
|
||||||
|
void bi_set_mod(BI_CTX *ctx, bigint *bim, int mod_offset);
|
||||||
|
void bi_free_mod(BI_CTX *ctx, int mod_offset);
|
||||||
|
|
||||||
|
#ifdef CONFIG_SSL_FULL_MODE
|
||||||
|
void bi_print(const char *label, bigint *bi);
|
||||||
|
bigint *bi_str_import(BI_CTX *ctx, const char *data);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @def bi_mod
|
||||||
|
* Find the residue of B. bi_set_mod() must be called before hand.
|
||||||
|
*/
|
||||||
|
#define bi_mod(A, B) bi_divide(A, B, ctx->bi_mod[ctx->mod_offset], 1)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* bi_residue() is technically the same as bi_mod(), but it uses the
|
||||||
|
* appropriate reduction technique (which is bi_mod() when doing classical
|
||||||
|
* reduction).
|
||||||
|
*/
|
||||||
|
#if defined(CONFIG_BIGINT_MONTGOMERY)
|
||||||
|
#define bi_residue(A, B) bi_mont(A, B)
|
||||||
|
bigint *bi_mont(BI_CTX *ctx, bigint *bixy);
|
||||||
|
#elif defined(CONFIG_BIGINT_BARRETT)
|
||||||
|
#define bi_residue(A, B) bi_barrett(A, B)
|
||||||
|
bigint *bi_barrett(BI_CTX *ctx, bigint *bi);
|
||||||
|
#else /* if defined(CONFIG_BIGINT_CLASSICAL) */
|
||||||
|
#define bi_residue(A, B) bi_mod(A, B)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef CONFIG_BIGINT_SQUARE
|
||||||
|
bigint *bi_square(BI_CTX *ctx, bigint *bi);
|
||||||
|
#else
|
||||||
|
#define bi_square(A, B) bi_multiply(A, bi_copy(B), B)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef CONFIG_BIGINT_CRT
|
||||||
|
bigint *bi_crt(BI_CTX *ctx, bigint *bi,
|
||||||
|
bigint *dP, bigint *dQ,
|
||||||
|
bigint *p, bigint *q,
|
||||||
|
bigint *qInv);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
131
app/include/ssl/ssl_bigint_impl.h
Normal file
131
app/include/ssl/ssl_bigint_impl.h
Normal file
@ -0,0 +1,131 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2007, Cameron Rich
|
||||||
|
*
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* * Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
* * 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.
|
||||||
|
* * Neither the name of the axTLS project nor the names of its contributors
|
||||||
|
* may be used to endorse or promote products derived from this software
|
||||||
|
* without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
* "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 COPYRIGHT OWNER OR
|
||||||
|
* CONTRIBUTORS 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 BIGINT_IMPL_HEADER
|
||||||
|
#define BIGINT_IMPL_HEADER
|
||||||
|
|
||||||
|
/* Maintain a number of precomputed variables when doing reduction */
|
||||||
|
#define BIGINT_M_OFFSET 0 /**< Normal modulo offset. */
|
||||||
|
#ifdef CONFIG_BIGINT_CRT
|
||||||
|
#define BIGINT_P_OFFSET 1 /**< p modulo offset. */
|
||||||
|
#define BIGINT_Q_OFFSET 2 /**< q module offset. */
|
||||||
|
#define BIGINT_NUM_MODS 3 /**< The number of modulus constants used. */
|
||||||
|
#else
|
||||||
|
#define BIGINT_NUM_MODS 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Architecture specific functions for big ints */
|
||||||
|
#if defined(CONFIG_INTEGER_8BIT)
|
||||||
|
#define COMP_RADIX 256U /**< Max component + 1 */
|
||||||
|
#define COMP_MAX 0xFFFFU/**< (Max dbl comp -1) */
|
||||||
|
#define COMP_BIT_SIZE 8 /**< Number of bits in a component. */
|
||||||
|
#define COMP_BYTE_SIZE 1 /**< Number of bytes in a component. */
|
||||||
|
#define COMP_NUM_NIBBLES 2 /**< Used For diagnostics only. */
|
||||||
|
typedef uint8_t comp; /**< A single precision component. */
|
||||||
|
typedef uint16_t long_comp; /**< A double precision component. */
|
||||||
|
typedef int16_t slong_comp; /**< A signed double precision component. */
|
||||||
|
#elif defined(CONFIG_INTEGER_16BIT)
|
||||||
|
#define COMP_RADIX 65536U /**< Max component + 1 */
|
||||||
|
#define COMP_MAX 0xFFFFFFFFU/**< (Max dbl comp -1) */
|
||||||
|
#define COMP_BIT_SIZE 16 /**< Number of bits in a component. */
|
||||||
|
#define COMP_BYTE_SIZE 2 /**< Number of bytes in a component. */
|
||||||
|
#define COMP_NUM_NIBBLES 4 /**< Used For diagnostics only. */
|
||||||
|
typedef uint16_t comp; /**< A single precision component. */
|
||||||
|
typedef uint32_t long_comp; /**< A double precision component. */
|
||||||
|
typedef int32_t slong_comp; /**< A signed double precision component. */
|
||||||
|
#else /* regular 32 bit */
|
||||||
|
#ifdef WIN32
|
||||||
|
#define COMP_RADIX 4294967296i64
|
||||||
|
#define COMP_MAX 0xFFFFFFFFFFFFFFFFui64
|
||||||
|
#else
|
||||||
|
#define COMP_RADIX 4294967296ULL /**< Max component + 1 */
|
||||||
|
#define COMP_MAX 0xFFFFFFFFFFFFFFFFULL/**< (Max dbl comp -1) */
|
||||||
|
#endif
|
||||||
|
#define COMP_BIT_SIZE 32 /**< Number of bits in a component. */
|
||||||
|
#define COMP_BYTE_SIZE 4 /**< Number of bytes in a component. */
|
||||||
|
#define COMP_NUM_NIBBLES 8 /**< Used For diagnostics only. */
|
||||||
|
typedef uint32_t comp; /**< A single precision component. */
|
||||||
|
typedef uint64_t long_comp; /**< A double precision component. */
|
||||||
|
typedef sint64_t slong_comp; /**< A signed double precision component. */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @struct _bigint
|
||||||
|
* @brief A big integer basic object
|
||||||
|
*/
|
||||||
|
struct _bigint
|
||||||
|
{
|
||||||
|
struct _bigint* next; /**< The next bigint in the cache. */
|
||||||
|
short size; /**< The number of components in this bigint. */
|
||||||
|
short max_comps; /**< The heapsize allocated for this bigint */
|
||||||
|
int refs; /**< An internal reference count. */
|
||||||
|
comp* comps; /**< A ptr to the actual component data */
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct _bigint bigint; /**< An alias for _bigint */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Maintains the state of the cache, and a number of variables used in
|
||||||
|
* reduction.
|
||||||
|
*/
|
||||||
|
typedef struct /**< A big integer "session" context. */
|
||||||
|
{
|
||||||
|
bigint *active_list; /**< Bigints currently used. */
|
||||||
|
bigint *free_list; /**< Bigints not used. */
|
||||||
|
bigint *bi_radix; /**< The radix used. */
|
||||||
|
bigint *bi_mod[BIGINT_NUM_MODS]; /**< modulus */
|
||||||
|
|
||||||
|
#if defined(CONFIG_BIGINT_MONTGOMERY)
|
||||||
|
bigint *bi_RR_mod_m[BIGINT_NUM_MODS]; /**< R^2 mod m */
|
||||||
|
bigint *bi_R_mod_m[BIGINT_NUM_MODS]; /**< R mod m */
|
||||||
|
comp N0_dash[BIGINT_NUM_MODS];
|
||||||
|
#elif defined(CONFIG_BIGINT_BARRETT)
|
||||||
|
bigint *bi_mu[BIGINT_NUM_MODS]; /**< Storage for mu */
|
||||||
|
#endif
|
||||||
|
bigint *bi_normalised_mod[BIGINT_NUM_MODS]; /**< Normalised mod storage. */
|
||||||
|
bigint **g; /**< Used by sliding-window. */
|
||||||
|
int window; /**< The size of the sliding window */
|
||||||
|
int active_count; /**< Number of active bigints. */
|
||||||
|
int free_count; /**< Number of free bigints. */
|
||||||
|
|
||||||
|
#ifdef CONFIG_BIGINT_MONTGOMERY
|
||||||
|
uint8_t use_classical; /**< Use classical reduction. */
|
||||||
|
#endif
|
||||||
|
uint8_t mod_offset; /**< The mod offset we are using */
|
||||||
|
} BI_CTX;
|
||||||
|
|
||||||
|
#ifndef WIN32
|
||||||
|
#define max(a,b) ((a)>(b)?(a):(b)) /**< Find the maximum of 2 numbers. */
|
||||||
|
#define min(a,b) ((a)<(b)?(a):(b)) /**< Find the minimum of 2 numbers. */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define PERMANENT 0x7FFF55AA /**< A magic number for permanents. */
|
||||||
|
|
||||||
|
#endif
|
43
app/include/ssl/ssl_cert.h
Normal file
43
app/include/ssl/ssl_cert.h
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
unsigned char default_certificate[] = {
|
||||||
|
0x30, 0x82, 0x01, 0xd7, 0x30, 0x82, 0x01, 0x40, 0x02, 0x09, 0x00, 0xab,
|
||||||
|
0x08, 0x18, 0xa7, 0x03, 0x07, 0x27, 0xfd, 0x30, 0x0d, 0x06, 0x09, 0x2a,
|
||||||
|
0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x34,
|
||||||
|
0x31, 0x32, 0x30, 0x30, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x29, 0x61,
|
||||||
|
0x78, 0x54, 0x4c, 0x53, 0x20, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74,
|
||||||
|
0x20, 0x44, 0x6f, 0x64, 0x67, 0x79, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69,
|
||||||
|
0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f,
|
||||||
|
0x72, 0x69, 0x74, 0x79, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x30, 0x31, 0x32,
|
||||||
|
0x32, 0x36, 0x32, 0x32, 0x33, 0x33, 0x33, 0x39, 0x5a, 0x17, 0x0d, 0x32,
|
||||||
|
0x34, 0x30, 0x39, 0x30, 0x33, 0x32, 0x32, 0x33, 0x33, 0x33, 0x39, 0x5a,
|
||||||
|
0x30, 0x2c, 0x31, 0x16, 0x30, 0x14, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13,
|
||||||
|
0x0d, 0x61, 0x78, 0x54, 0x4c, 0x53, 0x20, 0x50, 0x72, 0x6f, 0x6a, 0x65,
|
||||||
|
0x63, 0x74, 0x31, 0x12, 0x30, 0x10, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13,
|
||||||
|
0x09, 0x31, 0x32, 0x37, 0x2e, 0x30, 0x2e, 0x30, 0x2e, 0x31, 0x30, 0x81,
|
||||||
|
0x9f, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01,
|
||||||
|
0x01, 0x01, 0x05, 0x00, 0x03, 0x81, 0x8d, 0x00, 0x30, 0x81, 0x89, 0x02,
|
||||||
|
0x81, 0x81, 0x00, 0xcd, 0xfd, 0x89, 0x48, 0xbe, 0x36, 0xb9, 0x95, 0x76,
|
||||||
|
0xd4, 0x13, 0x30, 0x0e, 0xbf, 0xb2, 0xed, 0x67, 0x0a, 0xc0, 0x16, 0x3f,
|
||||||
|
0x51, 0x09, 0x9d, 0x29, 0x2f, 0xb2, 0x6d, 0x3f, 0x3e, 0x6c, 0x2f, 0x90,
|
||||||
|
0x80, 0xa1, 0x71, 0xdf, 0xbe, 0x38, 0xc5, 0xcb, 0xa9, 0x9a, 0x40, 0x14,
|
||||||
|
0x90, 0x0a, 0xf9, 0xb7, 0x07, 0x0b, 0xe1, 0xda, 0xe7, 0x09, 0xbf, 0x0d,
|
||||||
|
0x57, 0x41, 0x86, 0x60, 0xa1, 0xc1, 0x27, 0x91, 0x5b, 0x0a, 0x98, 0x46,
|
||||||
|
0x1b, 0xf6, 0xa2, 0x84, 0xf8, 0x65, 0xc7, 0xce, 0x2d, 0x96, 0x17, 0xaa,
|
||||||
|
0x91, 0xf8, 0x61, 0x04, 0x50, 0x70, 0xeb, 0xb4, 0x43, 0xb7, 0xdc, 0x9a,
|
||||||
|
0xcc, 0x31, 0x01, 0x14, 0xd4, 0xcd, 0xcc, 0xc2, 0x37, 0x6d, 0x69, 0x82,
|
||||||
|
0xd6, 0xc6, 0xc4, 0xbe, 0xf2, 0x34, 0xa5, 0xc9, 0xa6, 0x19, 0x53, 0x32,
|
||||||
|
0x7a, 0x86, 0x0e, 0x91, 0x82, 0x0f, 0xa1, 0x42, 0x54, 0xaa, 0x01, 0x02,
|
||||||
|
0x03, 0x01, 0x00, 0x01, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86,
|
||||||
|
0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x81, 0x81, 0x00, 0x40,
|
||||||
|
0xb4, 0x94, 0x9a, 0xa8, 0x89, 0x72, 0x1d, 0x07, 0xe5, 0xb3, 0x6b, 0x88,
|
||||||
|
0x21, 0xc2, 0x38, 0x36, 0x9e, 0x7a, 0x8c, 0x49, 0x48, 0x68, 0x0c, 0x06,
|
||||||
|
0xe8, 0xdb, 0x1f, 0x4e, 0x05, 0xe6, 0x31, 0xe3, 0xfd, 0xe6, 0x0d, 0x6b,
|
||||||
|
0xd8, 0x13, 0x17, 0xe0, 0x2d, 0x0d, 0xb8, 0x7e, 0xcb, 0x20, 0x6c, 0xa8,
|
||||||
|
0x73, 0xa7, 0xfd, 0xe3, 0xa7, 0xfa, 0xf3, 0x02, 0x60, 0x78, 0x1f, 0x13,
|
||||||
|
0x40, 0x45, 0xee, 0x75, 0xf5, 0x10, 0xfd, 0x8f, 0x68, 0x74, 0xd4, 0xac,
|
||||||
|
0xae, 0x04, 0x09, 0x55, 0x2c, 0xdb, 0xd8, 0x07, 0x07, 0x65, 0x69, 0x27,
|
||||||
|
0x6e, 0xbf, 0x5e, 0x61, 0x40, 0x56, 0x8b, 0xd7, 0x33, 0x3b, 0xff, 0x6e,
|
||||||
|
0x53, 0x7e, 0x9d, 0x3f, 0xc0, 0x40, 0x3a, 0xab, 0xa0, 0x50, 0x4e, 0x80,
|
||||||
|
0x47, 0x46, 0x0d, 0x1e, 0xdb, 0x4c, 0xf1, 0x1b, 0x5d, 0x3c, 0x2a, 0x54,
|
||||||
|
0xa7, 0x4d, 0xfa, 0x7b, 0x72, 0x66, 0xc5
|
||||||
|
};
|
||||||
|
unsigned int default_certificate_len = 475;
|
127
app/include/ssl/ssl_config.h
Normal file
127
app/include/ssl/ssl_config.h
Normal file
@ -0,0 +1,127 @@
|
|||||||
|
/*
|
||||||
|
* Automatically generated header file: don't edit
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define HAVE_DOT_CONFIG 1
|
||||||
|
#undef CONFIG_PLATFORM_LINUX
|
||||||
|
#define CONFIG_PLATFORM_CYGWIN 1
|
||||||
|
#undef CONFIG_PLATFORM_WIN32
|
||||||
|
|
||||||
|
/*
|
||||||
|
* General Configuration
|
||||||
|
*/
|
||||||
|
#define PREFIX "/usr/local"
|
||||||
|
#define CONFIG_DEBUG 1
|
||||||
|
#undef CONFIG_STRIP_UNWANTED_SECTIONS
|
||||||
|
#undef CONFIG_VISUAL_STUDIO_7_0
|
||||||
|
#undef CONFIG_VISUAL_STUDIO_8_0
|
||||||
|
#undef CONFIG_VISUAL_STUDIO_10_0
|
||||||
|
#define CONFIG_VISUAL_STUDIO_7_0_BASE ""
|
||||||
|
#define CONFIG_VISUAL_STUDIO_8_0_BASE ""
|
||||||
|
#define CONFIG_VISUAL_STUDIO_10_0_BASE ""
|
||||||
|
#define CONFIG_EXTRA_CFLAGS_OPTIONS ""
|
||||||
|
#define CONFIG_EXTRA_LDFLAGS_OPTIONS ""
|
||||||
|
|
||||||
|
/*
|
||||||
|
* SSL Library
|
||||||
|
*/
|
||||||
|
#undef CONFIG_SSL_SERVER_ONLY
|
||||||
|
#undef CONFIG_SSL_CERT_VERIFICATION
|
||||||
|
#undef CONFIG_SSL_ENABLE_CLIENT
|
||||||
|
#define CONFIG_SSL_FULL_MODE 1
|
||||||
|
#undef CONFIG_SSL_SKELETON_MODE
|
||||||
|
#undef CONFIG_SSL_PROT_LOW
|
||||||
|
#define CONFIG_SSL_PROT_MEDIUM 1
|
||||||
|
#undef CONFIG_SSL_PROT_HIGH
|
||||||
|
#define CONFIG_SSL_USE_DEFAULT_KEY
|
||||||
|
#define CONFIG_SSL_PRIVATE_KEY_LOCATION ""
|
||||||
|
#define CONFIG_SSL_PRIVATE_KEY_PASSWORD ""
|
||||||
|
#define CONFIG_SSL_X509_CERT_LOCATION ""
|
||||||
|
#undef CONFIG_SSL_GENERATE_X509_CERT
|
||||||
|
#define CONFIG_SSL_X509_COMMON_NAME ""
|
||||||
|
#define CONFIG_SSL_X509_ORGANIZATION_NAME ""
|
||||||
|
#define CONFIG_SSL_X509_ORGANIZATION_UNIT_NAME ""
|
||||||
|
#undef CONFIG_SSL_ENABLE_V23_HANDSHAKE
|
||||||
|
#define CONFIG_SSL_HAS_PEM 1
|
||||||
|
#undef CONFIG_SSL_USE_PKCS12
|
||||||
|
#define CONFIG_SSL_EXPIRY_TIME 24
|
||||||
|
#define CONFIG_X509_MAX_CA_CERTS 150
|
||||||
|
#define CONFIG_SSL_MAX_CERTS 3
|
||||||
|
#undef CONFIG_SSL_CTX_MUTEXING
|
||||||
|
//#define CONFIG_USE_DEV_URANDOM 1
|
||||||
|
#undef CONFIG_WIN32_USE_CRYPTO_LIB
|
||||||
|
#undef CONFIG_OPENSSL_COMPATIBLE
|
||||||
|
#undef CONFIG_PERFORMANCE_TESTING
|
||||||
|
#define CONFIG_SSL_TEST 1
|
||||||
|
#undef CONFIG_AXTLSWRAP
|
||||||
|
#define CONFIG_AXHTTPD 1
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Axhttpd Configuration
|
||||||
|
*/
|
||||||
|
#undef CONFIG_HTTP_STATIC_BUILD
|
||||||
|
#define CONFIG_HTTP_PORT 80
|
||||||
|
#define CONFIG_HTTP_HTTPS_PORT 443
|
||||||
|
#define CONFIG_HTTP_SESSION_CACHE_SIZE 5
|
||||||
|
#define CONFIG_HTTP_WEBROOT "../www"
|
||||||
|
#define CONFIG_HTTP_TIMEOUT 300
|
||||||
|
|
||||||
|
/*
|
||||||
|
* CGI
|
||||||
|
*/
|
||||||
|
#undef CONFIG_HTTP_HAS_CGI
|
||||||
|
#define CONFIG_HTTP_CGI_EXTENSIONS ".lua,.lp,.php"
|
||||||
|
#define CONFIG_HTTP_ENABLE_LUA 1
|
||||||
|
#define CONFIG_HTTP_LUA_PREFIX "/usr"
|
||||||
|
#undef CONFIG_HTTP_BUILD_LUA
|
||||||
|
#define CONFIG_HTTP_CGI_LAUNCHER "/usr/bin/cgi"
|
||||||
|
#define CONFIG_HTTP_DIRECTORIES 1
|
||||||
|
#define CONFIG_HTTP_HAS_AUTHORIZATION 1
|
||||||
|
#undef CONFIG_HTTP_HAS_IPV6
|
||||||
|
#undef CONFIG_HTTP_ENABLE_DIFFERENT_USER
|
||||||
|
#define CONFIG_HTTP_USER ""
|
||||||
|
#define CONFIG_HTTP_VERBOSE 0
|
||||||
|
#undef CONFIG_HTTP_IS_DAEMON
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Language Bindings
|
||||||
|
*/
|
||||||
|
#undef CONFIG_BINDINGS
|
||||||
|
#undef CONFIG_CSHARP_BINDINGS
|
||||||
|
#undef CONFIG_VBNET_BINDINGS
|
||||||
|
#define CONFIG_DOT_NET_FRAMEWORK_BASE ""
|
||||||
|
#undef CONFIG_JAVA_BINDINGS
|
||||||
|
#define CONFIG_JAVA_HOME ""
|
||||||
|
#undef CONFIG_PERL_BINDINGS
|
||||||
|
#define CONFIG_PERL_CORE ""
|
||||||
|
#define CONFIG_PERL_LIB ""
|
||||||
|
#undef CONFIG_LUA_BINDINGS
|
||||||
|
#define CONFIG_LUA_CORE ""
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Samples
|
||||||
|
*/
|
||||||
|
#define CONFIG_SAMPLES 1
|
||||||
|
#define CONFIG_C_SAMPLES 1
|
||||||
|
#undef CONFIG_CSHARP_SAMPLES
|
||||||
|
#undef CONFIG_VBNET_SAMPLES
|
||||||
|
#undef CONFIG_JAVA_SAMPLES
|
||||||
|
#undef CONFIG_PERL_SAMPLES
|
||||||
|
#undef CONFIG_LUA_SAMPLES
|
||||||
|
|
||||||
|
/*
|
||||||
|
* BigInt Options
|
||||||
|
*/
|
||||||
|
#undef CONFIG_BIGINT_CLASSICAL
|
||||||
|
#undef CONFIG_BIGINT_MONTGOMERY
|
||||||
|
#define CONFIG_BIGINT_BARRETT 1
|
||||||
|
#define CONFIG_BIGINT_CRT 1
|
||||||
|
#undef CONFIG_BIGINT_KARATSUBA
|
||||||
|
#define MUL_KARATSUBA_THRESH
|
||||||
|
#define SQU_KARATSUBA_THRESH
|
||||||
|
#define CONFIG_BIGINT_SLIDING_WINDOW 1
|
||||||
|
#define CONFIG_BIGINT_SQUARE 1
|
||||||
|
#define CONFIG_BIGINT_CHECK_ON 1
|
||||||
|
#define CONFIG_INTEGER_32BIT 1
|
||||||
|
#undef CONFIG_INTEGER_16BIT
|
||||||
|
#undef CONFIG_INTEGER_8BIT
|
230
app/include/ssl/ssl_crypto.h
Normal file
230
app/include/ssl/ssl_crypto.h
Normal file
@ -0,0 +1,230 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2007, Cameron Rich
|
||||||
|
*
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* * Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
* * 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.
|
||||||
|
* * Neither the name of the axTLS project nor the names of its contributors
|
||||||
|
* may be used to endorse or promote products derived from this software
|
||||||
|
* without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
* "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 COPYRIGHT OWNER OR
|
||||||
|
* CONTRIBUTORS 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @file crypto.h
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef HEADER_CRYPTO_H
|
||||||
|
#define HEADER_CRYPTO_H
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "ssl/ssl_config.h"
|
||||||
|
#include "ssl/ssl_bigint_impl.h"
|
||||||
|
#include "ssl/ssl_bigint.h"
|
||||||
|
|
||||||
|
#ifndef STDCALL
|
||||||
|
#define STDCALL
|
||||||
|
#endif
|
||||||
|
#ifndef EXP_FUNC
|
||||||
|
#define EXP_FUNC
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* enable features based on a 'super-set' capbaility. */
|
||||||
|
#if defined(CONFIG_SSL_FULL_MODE)
|
||||||
|
#define CONFIG_SSL_ENABLE_CLIENT
|
||||||
|
#define CONFIG_SSL_CERT_VERIFICATION
|
||||||
|
#elif defined(CONFIG_SSL_ENABLE_CLIENT)
|
||||||
|
#define CONFIG_SSL_CERT_VERIFICATION
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**************************************************************************
|
||||||
|
* AES declarations
|
||||||
|
**************************************************************************/
|
||||||
|
|
||||||
|
#define AES_MAXROUNDS 14
|
||||||
|
#define AES_BLOCKSIZE 16
|
||||||
|
#define AES_IV_SIZE 16
|
||||||
|
|
||||||
|
typedef struct aes_key_st
|
||||||
|
{
|
||||||
|
uint16_t rounds;
|
||||||
|
uint16_t key_size;
|
||||||
|
uint32_t ks[(AES_MAXROUNDS+1)*8];
|
||||||
|
uint8_t iv[AES_IV_SIZE];
|
||||||
|
} AES_CTX;
|
||||||
|
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
AES_MODE_128,
|
||||||
|
AES_MODE_256
|
||||||
|
} AES_MODE;
|
||||||
|
|
||||||
|
void AES_set_key(AES_CTX *ctx, const uint8_t *key,
|
||||||
|
const uint8_t *iv, AES_MODE mode);
|
||||||
|
void AES_cbc_encrypt(AES_CTX *ctx, const uint8_t *msg,
|
||||||
|
uint8_t *out, int length);
|
||||||
|
void AES_cbc_decrypt(AES_CTX *ks, const uint8_t *in, uint8_t *out, int length);
|
||||||
|
void AES_convert_key(AES_CTX *ctx);
|
||||||
|
|
||||||
|
/**************************************************************************
|
||||||
|
* RC4 declarations
|
||||||
|
**************************************************************************/
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
uint8_t x, y, m[256];
|
||||||
|
} RC4_CTX;
|
||||||
|
|
||||||
|
void RC4_setup(RC4_CTX *s, const uint8_t *key, int length);
|
||||||
|
void RC4_crypt(RC4_CTX *s, const uint8_t *msg, uint8_t *data, int length);
|
||||||
|
|
||||||
|
/**************************************************************************
|
||||||
|
* SHA1 declarations
|
||||||
|
**************************************************************************/
|
||||||
|
|
||||||
|
#define SHA1_SIZE 20
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This structure will hold context information for the SHA-1
|
||||||
|
* hashing operation
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
uint32_t Intermediate_Hash[SHA1_SIZE/4]; /* Message Digest */
|
||||||
|
uint32_t Length_Low; /* Message length in bits */
|
||||||
|
uint32_t Length_High; /* Message length in bits */
|
||||||
|
uint16_t Message_Block_Index; /* Index into message block array */
|
||||||
|
uint8_t Message_Block[64]; /* 512-bit message blocks */
|
||||||
|
} SHA1_CTX;
|
||||||
|
|
||||||
|
void SHA1_Init(SHA1_CTX *);
|
||||||
|
void SHA1_Update(SHA1_CTX *, const uint8_t * msg, int len);
|
||||||
|
void SHA1_Final(uint8_t *digest, SHA1_CTX *);
|
||||||
|
|
||||||
|
/**************************************************************************
|
||||||
|
* MD2 declarations
|
||||||
|
**************************************************************************/
|
||||||
|
|
||||||
|
#define MD2_SIZE 16
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
unsigned char cksum[16]; /* checksum of the data block */
|
||||||
|
unsigned char state[48]; /* intermediate digest state */
|
||||||
|
unsigned char buffer[16]; /* data block being processed */
|
||||||
|
int left; /* amount of data in buffer */
|
||||||
|
} MD2_CTX;
|
||||||
|
|
||||||
|
EXP_FUNC void STDCALL MD2_Init(MD2_CTX *ctx);
|
||||||
|
EXP_FUNC void STDCALL MD2_Update(MD2_CTX *ctx, const uint8_t *input, int ilen);
|
||||||
|
EXP_FUNC void STDCALL MD2_Final(uint8_t *digest, MD2_CTX *ctx);
|
||||||
|
|
||||||
|
/**************************************************************************
|
||||||
|
* MD5 declarations
|
||||||
|
**************************************************************************/
|
||||||
|
|
||||||
|
#define MD5_SIZE 16
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
uint32_t state[4]; /* state (ABCD) */
|
||||||
|
uint32_t count[2]; /* number of bits, modulo 2^64 (lsb first) */
|
||||||
|
uint8_t buffer[64]; /* input buffer */
|
||||||
|
} MD5_CTX;
|
||||||
|
|
||||||
|
EXP_FUNC void STDCALL MD5_Init(MD5_CTX *);
|
||||||
|
EXP_FUNC void STDCALL MD5_Update(MD5_CTX *, const uint8_t *msg, int len);
|
||||||
|
EXP_FUNC void STDCALL MD5_Final(uint8_t *digest, MD5_CTX *);
|
||||||
|
|
||||||
|
/**************************************************************************
|
||||||
|
* HMAC declarations
|
||||||
|
**************************************************************************/
|
||||||
|
void ssl_hmac_md5(const uint8_t *msg, int length, const uint8_t *key,
|
||||||
|
int key_len, uint8_t *digest);// fix hmac_md5 to ssl_hmac_md5, discriminate ieee80211
|
||||||
|
void ssl_hmac_sha1(const uint8_t *msg, int length, const uint8_t *key,
|
||||||
|
int key_len, uint8_t *digest);// fix hmac_md5 to ssl_hmac_sha1, discriminate ieee80211
|
||||||
|
|
||||||
|
/**************************************************************************
|
||||||
|
* RSA declarations
|
||||||
|
**************************************************************************/
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
bigint *m; /* modulus */
|
||||||
|
bigint *e; /* public exponent */
|
||||||
|
bigint *d; /* private exponent */
|
||||||
|
#ifdef CONFIG_BIGINT_CRT
|
||||||
|
bigint *p; /* p as in m = pq */
|
||||||
|
bigint *q; /* q as in m = pq */
|
||||||
|
bigint *dP; /* d mod (p-1) */
|
||||||
|
bigint *dQ; /* d mod (q-1) */
|
||||||
|
bigint *qInv; /* q^-1 mod p */
|
||||||
|
#endif
|
||||||
|
int num_octets;
|
||||||
|
BI_CTX *bi_ctx;
|
||||||
|
} RSA_CTX;
|
||||||
|
|
||||||
|
void RSA_priv_key_new(RSA_CTX **rsa_ctx,
|
||||||
|
const uint8_t *modulus, int mod_len,
|
||||||
|
const uint8_t *pub_exp, int pub_len,
|
||||||
|
const uint8_t *priv_exp, int priv_len
|
||||||
|
#ifdef CONFIG_BIGINT_CRT
|
||||||
|
, const uint8_t *p, int p_len,
|
||||||
|
const uint8_t *q, int q_len,
|
||||||
|
const uint8_t *dP, int dP_len,
|
||||||
|
const uint8_t *dQ, int dQ_len,
|
||||||
|
const uint8_t *qInv, int qInv_len
|
||||||
|
#endif
|
||||||
|
);
|
||||||
|
void RSA_pub_key_new(RSA_CTX **rsa_ctx,
|
||||||
|
const uint8_t *modulus, int mod_len,
|
||||||
|
const uint8_t *pub_exp, int pub_len);
|
||||||
|
void RSA_free(RSA_CTX *ctx);
|
||||||
|
int RSA_decrypt(const RSA_CTX *ctx, const uint8_t *in_data, uint8_t *out_data,
|
||||||
|
int is_decryption);
|
||||||
|
bigint *RSA_private(const RSA_CTX *c, bigint *bi_msg);
|
||||||
|
#if defined(CONFIG_SSL_CERT_VERIFICATION) || defined(CONFIG_SSL_GENERATE_X509_CERT)
|
||||||
|
bigint *RSA_sign_verify(BI_CTX *ctx, const uint8_t *sig, int sig_len,
|
||||||
|
bigint *modulus, bigint *pub_exp);
|
||||||
|
bigint *RSA_public(const RSA_CTX * c, bigint *bi_msg);
|
||||||
|
int RSA_encrypt(const RSA_CTX *ctx, const uint8_t *in_data, uint16_t in_len,
|
||||||
|
uint8_t *out_data, int is_signing);
|
||||||
|
void RSA_print(const RSA_CTX *ctx);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**************************************************************************
|
||||||
|
* RNG declarations
|
||||||
|
**************************************************************************/
|
||||||
|
EXP_FUNC void STDCALL RNG_initialize(void);
|
||||||
|
EXP_FUNC void STDCALL RNG_custom_init(const uint8_t *seed_buf, int size);
|
||||||
|
EXP_FUNC void STDCALL RNG_terminate(void);
|
||||||
|
EXP_FUNC void STDCALL get_random(int num_rand_bytes, uint8_t *rand_data);
|
||||||
|
void get_random_NZ(int num_rand_bytes, uint8_t *rand_data);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
172
app/include/ssl/ssl_crypto_misc.h
Normal file
172
app/include/ssl/ssl_crypto_misc.h
Normal file
@ -0,0 +1,172 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2007, Cameron Rich
|
||||||
|
*
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* * Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
* * 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.
|
||||||
|
* * Neither the name of the axTLS project nor the names of its contributors
|
||||||
|
* may be used to endorse or promote products derived from this software
|
||||||
|
* without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
* "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 COPYRIGHT OWNER OR
|
||||||
|
* CONTRIBUTORS 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @file crypto_misc.h
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef HEADER_CRYPTO_MISC_H
|
||||||
|
#define HEADER_CRYPTO_MISC_H
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "ssl/ssl_crypto.h"
|
||||||
|
#include "ssl/ssl_bigint.h"
|
||||||
|
|
||||||
|
/**************************************************************************
|
||||||
|
* X509 declarations
|
||||||
|
**************************************************************************/
|
||||||
|
#define X509_OK 0
|
||||||
|
#define X509_NOT_OK -1
|
||||||
|
#define X509_VFY_ERROR_NO_TRUSTED_CERT -2
|
||||||
|
#define X509_VFY_ERROR_BAD_SIGNATURE -3
|
||||||
|
#define X509_VFY_ERROR_NOT_YET_VALID -4
|
||||||
|
#define X509_VFY_ERROR_EXPIRED -5
|
||||||
|
#define X509_VFY_ERROR_SELF_SIGNED -6
|
||||||
|
#define X509_VFY_ERROR_INVALID_CHAIN -7
|
||||||
|
#define X509_VFY_ERROR_UNSUPPORTED_DIGEST -8
|
||||||
|
#define X509_INVALID_PRIV_KEY -9
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The Distinguished Name
|
||||||
|
*/
|
||||||
|
#define X509_NUM_DN_TYPES 3
|
||||||
|
#define X509_COMMON_NAME 0
|
||||||
|
#define X509_ORGANIZATION 1
|
||||||
|
#define X509_ORGANIZATIONAL_UNIT 2
|
||||||
|
|
||||||
|
struct _x509_ctx
|
||||||
|
{
|
||||||
|
char *ca_cert_dn[X509_NUM_DN_TYPES];
|
||||||
|
char *cert_dn[X509_NUM_DN_TYPES];
|
||||||
|
char **subject_alt_dnsnames;
|
||||||
|
time_t not_before;
|
||||||
|
time_t not_after;
|
||||||
|
uint8_t *signature;
|
||||||
|
uint16_t sig_len;
|
||||||
|
uint8_t sig_type;
|
||||||
|
RSA_CTX *rsa_ctx;
|
||||||
|
bigint *digest;
|
||||||
|
struct _x509_ctx *next;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct _x509_ctx X509_CTX;
|
||||||
|
|
||||||
|
#ifdef CONFIG_SSL_CERT_VERIFICATION
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
X509_CTX *cert[CONFIG_X509_MAX_CA_CERTS];
|
||||||
|
} CA_CERT_CTX;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
int x509_new(const uint8_t *cert, int *len, X509_CTX **ctx);
|
||||||
|
void x509_free(X509_CTX *x509_ctx);
|
||||||
|
#ifdef CONFIG_SSL_CERT_VERIFICATION
|
||||||
|
int x509_verify(const CA_CERT_CTX *ca_cert_ctx, const X509_CTX *cert);
|
||||||
|
#endif
|
||||||
|
#ifdef CONFIG_SSL_FULL_MODE
|
||||||
|
void x509_print(const X509_CTX *cert, CA_CERT_CTX *ca_cert_ctx);
|
||||||
|
const char * x509_display_error(int error);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**************************************************************************
|
||||||
|
* ASN1 declarations
|
||||||
|
**************************************************************************/
|
||||||
|
#define ASN1_INTEGER 0x02
|
||||||
|
#define ASN1_BIT_STRING 0x03
|
||||||
|
#define ASN1_OCTET_STRING 0x04
|
||||||
|
#define ASN1_NULL 0x05
|
||||||
|
#define ASN1_PRINTABLE_STR2 0x0C
|
||||||
|
#define ASN1_OID 0x06
|
||||||
|
#define ASN1_PRINTABLE_STR2 0x0C
|
||||||
|
#define ASN1_PRINTABLE_STR 0x13
|
||||||
|
#define ASN1_TELETEX_STR 0x14
|
||||||
|
#define ASN1_IA5_STR 0x16
|
||||||
|
#define ASN1_UTC_TIME 0x17
|
||||||
|
#define ASN1_UNICODE_STR 0x1e
|
||||||
|
#define ASN1_SEQUENCE 0x30
|
||||||
|
#define ASN1_CONTEXT_DNSNAME 0x82
|
||||||
|
#define ASN1_SET 0x31
|
||||||
|
#define ASN1_V3_DATA 0xa3
|
||||||
|
#define ASN1_IMPLICIT_TAG 0x80
|
||||||
|
#define ASN1_CONTEXT_DNSNAME 0x82
|
||||||
|
#define ASN1_EXPLICIT_TAG 0xa0
|
||||||
|
#define ASN1_V3_DATA 0xa3
|
||||||
|
|
||||||
|
#define SIG_TYPE_MD2 0x02
|
||||||
|
#define SIG_TYPE_MD5 0x04
|
||||||
|
#define SIG_TYPE_SHA1 0x05
|
||||||
|
|
||||||
|
int get_asn1_length(const uint8_t *buf, int *offset);
|
||||||
|
int asn1_get_private_key(const uint8_t *buf, int len, RSA_CTX **rsa_ctx);
|
||||||
|
int asn1_next_obj(const uint8_t *buf, int *offset, int obj_type);
|
||||||
|
int asn1_skip_obj(const uint8_t *buf, int *offset, int obj_type);
|
||||||
|
int asn1_get_int(const uint8_t *buf, int *offset, uint8_t **object);
|
||||||
|
int asn1_version(const uint8_t *cert, int *offset, X509_CTX *x509_ctx);
|
||||||
|
int asn1_validity(const uint8_t *cert, int *offset, X509_CTX *x509_ctx);
|
||||||
|
int asn1_name(const uint8_t *cert, int *offset, char *dn[]);
|
||||||
|
int asn1_public_key(const uint8_t *cert, int *offset, X509_CTX *x509_ctx);
|
||||||
|
#ifdef CONFIG_SSL_CERT_VERIFICATION
|
||||||
|
int asn1_signature(const uint8_t *cert, int *offset, X509_CTX *x509_ctx);
|
||||||
|
int asn1_find_subjectaltname(const uint8_t* cert, int offset);
|
||||||
|
int asn1_compare_dn(char * const dn1[], char * const dn2[]);
|
||||||
|
#endif /* CONFIG_SSL_CERT_VERIFICATION */
|
||||||
|
int asn1_signature_type(const uint8_t *cert,
|
||||||
|
int *offset, X509_CTX *x509_ctx);
|
||||||
|
|
||||||
|
/**************************************************************************
|
||||||
|
* MISC declarations
|
||||||
|
**************************************************************************/
|
||||||
|
#define SALT_SIZE 8
|
||||||
|
|
||||||
|
extern const char * const unsupported_str;
|
||||||
|
|
||||||
|
typedef void (*crypt_func)(void *, const uint8_t *, uint8_t *, int);
|
||||||
|
typedef void (*hmac_func)(const uint8_t *msg, int length, const uint8_t *key,
|
||||||
|
int key_len, uint8_t *digest);
|
||||||
|
|
||||||
|
int get_file(const char *filename, uint8_t **buf);
|
||||||
|
|
||||||
|
#if defined(CONFIG_SSL_FULL_MODE) || defined(WIN32) || defined(CONFIG_DEBUG)
|
||||||
|
EXP_FUNC void STDCALL print_blob(const char *format, const uint8_t *data, int size, ...);
|
||||||
|
#else
|
||||||
|
#define print_blob(...)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
EXP_FUNC int STDCALL base64_decode(const char *in, int len,
|
||||||
|
uint8_t *out, int *outlen);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
67
app/include/ssl/ssl_os_int.h
Normal file
67
app/include/ssl/ssl_os_int.h
Normal file
@ -0,0 +1,67 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2012, Cameron Rich
|
||||||
|
*
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* * Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
* * 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.
|
||||||
|
* * Neither the name of the axTLS project nor the names of its contributors
|
||||||
|
* may be used to endorse or promote products derived from this software
|
||||||
|
* without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
* "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 COPYRIGHT OWNER OR
|
||||||
|
* CONTRIBUTORS 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @file os_int.h
|
||||||
|
*
|
||||||
|
* Ensure a consistent bit size
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef HEADER_OS_INT_H
|
||||||
|
#define HEADER_OS_INT_H
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(WIN32)
|
||||||
|
typedef UINT8 uint8_t;
|
||||||
|
typedef INT8 int8_t;
|
||||||
|
typedef UINT16 uint16_t;
|
||||||
|
typedef INT16 int16_t;
|
||||||
|
typedef UINT32 uint32_t;
|
||||||
|
typedef INT32 int32_t;
|
||||||
|
typedef UINT64 uint64_t;
|
||||||
|
typedef INT64 int64_t;
|
||||||
|
#else /* Not Win32 */
|
||||||
|
|
||||||
|
#ifdef CONFIG_PLATFORM_SOLARIS
|
||||||
|
#include <inttypes.h>
|
||||||
|
#else
|
||||||
|
//#include <stdint.h>
|
||||||
|
#endif /* Not Solaris */
|
||||||
|
|
||||||
|
#endif /* Not Win32 */
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
74
app/include/ssl/ssl_os_port.h
Normal file
74
app/include/ssl/ssl_os_port.h
Normal file
@ -0,0 +1,74 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2007, Cameron Rich
|
||||||
|
*
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* * Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
* * 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.
|
||||||
|
* * Neither the name of the axTLS project nor the names of its contributors
|
||||||
|
* may be used to endorse or promote products derived from this software
|
||||||
|
* without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
* "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 COPYRIGHT OWNER OR
|
||||||
|
* CONTRIBUTORS 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @file os_port.h
|
||||||
|
*
|
||||||
|
* Some stuff to minimise the differences between windows and linux/unix
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef HEADER_OS_PORT_H
|
||||||
|
#define HEADER_OS_PORT_H
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//#include "../crypto/os_int.h"
|
||||||
|
#include "c_types.h"
|
||||||
|
#include "osapi.h"
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
#define ssl_printf(fmt, args...) os_printf(fmt,## args)
|
||||||
|
#else
|
||||||
|
#define ssl_printf(fmt, args...)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define STDCALL
|
||||||
|
#define EXP_FUNC
|
||||||
|
|
||||||
|
struct timeval {
|
||||||
|
long tv_sec; /* seconds */
|
||||||
|
long tv_usec; /* and microseconds */
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Mutexing definitions */
|
||||||
|
|
||||||
|
#define SSL_CTX_MUTEX_INIT(A)
|
||||||
|
#define SSL_CTX_MUTEX_DESTROY(A)
|
||||||
|
#define SSL_CTX_LOCK(A)
|
||||||
|
#define SSL_CTX_UNLOCK(A)
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
54
app/include/ssl/ssl_private_key.h
Normal file
54
app/include/ssl/ssl_private_key.h
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
unsigned char default_private_key[] = {
|
||||||
|
0x30, 0x82, 0x02, 0x5d, 0x02, 0x01, 0x00, 0x02, 0x81, 0x81, 0x00, 0xcd,
|
||||||
|
0xfd, 0x89, 0x48, 0xbe, 0x36, 0xb9, 0x95, 0x76, 0xd4, 0x13, 0x30, 0x0e,
|
||||||
|
0xbf, 0xb2, 0xed, 0x67, 0x0a, 0xc0, 0x16, 0x3f, 0x51, 0x09, 0x9d, 0x29,
|
||||||
|
0x2f, 0xb2, 0x6d, 0x3f, 0x3e, 0x6c, 0x2f, 0x90, 0x80, 0xa1, 0x71, 0xdf,
|
||||||
|
0xbe, 0x38, 0xc5, 0xcb, 0xa9, 0x9a, 0x40, 0x14, 0x90, 0x0a, 0xf9, 0xb7,
|
||||||
|
0x07, 0x0b, 0xe1, 0xda, 0xe7, 0x09, 0xbf, 0x0d, 0x57, 0x41, 0x86, 0x60,
|
||||||
|
0xa1, 0xc1, 0x27, 0x91, 0x5b, 0x0a, 0x98, 0x46, 0x1b, 0xf6, 0xa2, 0x84,
|
||||||
|
0xf8, 0x65, 0xc7, 0xce, 0x2d, 0x96, 0x17, 0xaa, 0x91, 0xf8, 0x61, 0x04,
|
||||||
|
0x50, 0x70, 0xeb, 0xb4, 0x43, 0xb7, 0xdc, 0x9a, 0xcc, 0x31, 0x01, 0x14,
|
||||||
|
0xd4, 0xcd, 0xcc, 0xc2, 0x37, 0x6d, 0x69, 0x82, 0xd6, 0xc6, 0xc4, 0xbe,
|
||||||
|
0xf2, 0x34, 0xa5, 0xc9, 0xa6, 0x19, 0x53, 0x32, 0x7a, 0x86, 0x0e, 0x91,
|
||||||
|
0x82, 0x0f, 0xa1, 0x42, 0x54, 0xaa, 0x01, 0x02, 0x03, 0x01, 0x00, 0x01,
|
||||||
|
0x02, 0x81, 0x81, 0x00, 0x95, 0xaa, 0x6e, 0x11, 0xf5, 0x6a, 0x8b, 0xa2,
|
||||||
|
0xc6, 0x48, 0xc6, 0x7c, 0x37, 0x6b, 0x1f, 0x55, 0x10, 0x76, 0x26, 0x24,
|
||||||
|
0xc3, 0xf2, 0x5c, 0x5a, 0xdd, 0x2e, 0xf3, 0xa4, 0x1e, 0xbc, 0x7b, 0x1c,
|
||||||
|
0x80, 0x10, 0x85, 0xbc, 0xd8, 0x45, 0x3c, 0xb8, 0xb2, 0x06, 0x53, 0xb5,
|
||||||
|
0xd5, 0x7a, 0xe7, 0x0e, 0x92, 0xe6, 0x42, 0xc2, 0xe2, 0x2a, 0xd5, 0xd1,
|
||||||
|
0x03, 0x9f, 0x6f, 0x53, 0x74, 0x68, 0x72, 0x8e, 0xbf, 0x03, 0xbb, 0xab,
|
||||||
|
0xbd, 0xa1, 0xf9, 0x81, 0x7d, 0x12, 0xd4, 0x9d, 0xb6, 0xae, 0x4c, 0xad,
|
||||||
|
0xca, 0xa8, 0xc9, 0x80, 0x8d, 0x0d, 0xd5, 0xd0, 0xa1, 0xbf, 0xec, 0x60,
|
||||||
|
0x48, 0x49, 0xed, 0x97, 0x0f, 0x5e, 0xed, 0xfc, 0x39, 0x15, 0x96, 0x9e,
|
||||||
|
0x5d, 0xe2, 0xb4, 0x5d, 0x2e, 0x04, 0xdc, 0x08, 0xa2, 0x65, 0x29, 0x2d,
|
||||||
|
0x37, 0xfb, 0x62, 0x90, 0x1b, 0x7b, 0xe5, 0x3a, 0x58, 0x05, 0x55, 0xc1,
|
||||||
|
0x02, 0x41, 0x00, 0xfc, 0x69, 0x28, 0xc9, 0xa8, 0xc4, 0x5c, 0xe3, 0xd0,
|
||||||
|
0x5e, 0xaa, 0xda, 0xde, 0x87, 0x74, 0xdb, 0xcb, 0x40, 0x78, 0x8e, 0x1d,
|
||||||
|
0x12, 0x96, 0x16, 0x61, 0x3f, 0xb3, 0x3e, 0xa3, 0x0d, 0xdc, 0x49, 0xa5,
|
||||||
|
0x25, 0x87, 0xc5, 0x97, 0x85, 0x9d, 0xbb, 0xb4, 0xf0, 0x44, 0xfd, 0x6c,
|
||||||
|
0xe8, 0xd2, 0x8c, 0xec, 0x33, 0x81, 0x46, 0x1e, 0x10, 0x12, 0x33, 0x16,
|
||||||
|
0x95, 0x00, 0x4f, 0x75, 0xb4, 0xe5, 0x79, 0x02, 0x41, 0x00, 0xd0, 0xeb,
|
||||||
|
0x65, 0x07, 0x10, 0x3b, 0xd9, 0x03, 0xeb, 0xdc, 0x6f, 0x4b, 0x8f, 0xc3,
|
||||||
|
0x87, 0xce, 0x76, 0xd6, 0xc5, 0x14, 0x21, 0x4e, 0xe7, 0x4f, 0x1b, 0xe8,
|
||||||
|
0x05, 0xf8, 0x84, 0x1a, 0xe0, 0xc5, 0xd6, 0xe3, 0x08, 0xb3, 0x54, 0x57,
|
||||||
|
0x02, 0x1f, 0xd4, 0xd9, 0xfb, 0xff, 0x40, 0xb1, 0x56, 0x1c, 0x60, 0xf7,
|
||||||
|
0xac, 0x91, 0xf3, 0xd3, 0xc6, 0x7f, 0x84, 0xfd, 0x84, 0x9d, 0xea, 0x26,
|
||||||
|
0xee, 0xc9, 0x02, 0x41, 0x00, 0xa6, 0xcf, 0x1c, 0x6c, 0x81, 0x03, 0x1c,
|
||||||
|
0x5c, 0x56, 0x05, 0x6a, 0x26, 0x70, 0xef, 0xd6, 0x13, 0xb7, 0x74, 0x28,
|
||||||
|
0xf7, 0xca, 0x50, 0xd1, 0x2d, 0x83, 0x21, 0x64, 0xe4, 0xdd, 0x3f, 0x38,
|
||||||
|
0xb8, 0xd6, 0xd2, 0x41, 0xb3, 0x1c, 0x9a, 0xea, 0x0d, 0xf5, 0xda, 0xdf,
|
||||||
|
0xcd, 0x17, 0x9f, 0x9a, 0x1e, 0x15, 0xaf, 0x48, 0x1c, 0xbd, 0x9b, 0x63,
|
||||||
|
0x5b, 0xad, 0xed, 0xd4, 0xa1, 0xae, 0xa9, 0x59, 0x09, 0x02, 0x40, 0x4e,
|
||||||
|
0x08, 0xce, 0xa8, 0x8f, 0xc0, 0xba, 0xf3, 0x83, 0x02, 0xc8, 0x33, 0x62,
|
||||||
|
0x14, 0x77, 0xc2, 0x7f, 0x93, 0x02, 0xf3, 0xdc, 0xe9, 0x1a, 0xee, 0xea,
|
||||||
|
0x8e, 0x84, 0xc4, 0x69, 0x9b, 0x9c, 0x7f, 0x69, 0x1f, 0x4e, 0x1d, 0xa5,
|
||||||
|
0x90, 0x06, 0x44, 0x1b, 0x7d, 0xfc, 0x69, 0x40, 0x21, 0xbc, 0xf7, 0x46,
|
||||||
|
0xa4, 0xdc, 0x39, 0x7b, 0xe8, 0x8b, 0x49, 0x10, 0x44, 0x9d, 0x67, 0x5a,
|
||||||
|
0x91, 0x86, 0x39, 0x02, 0x40, 0x41, 0x2c, 0x4e, 0xfe, 0xd9, 0x90, 0x89,
|
||||||
|
0x00, 0x5c, 0x94, 0x0a, 0x4a, 0x7e, 0x1b, 0x1a, 0x80, 0x06, 0x01, 0x37,
|
||||||
|
0xda, 0x50, 0x61, 0x9d, 0x9c, 0xfe, 0x25, 0x7f, 0xd8, 0xd4, 0xc4, 0x9e,
|
||||||
|
0x81, 0xf2, 0x0c, 0x1e, 0x38, 0x21, 0x1e, 0x90, 0x3f, 0xd4, 0xba, 0x6c,
|
||||||
|
0x53, 0xcb, 0xf0, 0x77, 0x79, 0x9b, 0xf1, 0xfa, 0x3f, 0x81, 0xdc, 0xf3,
|
||||||
|
0x21, 0x02, 0x6d, 0xb7, 0x95, 0xc3, 0x2e, 0xce, 0xd5
|
||||||
|
};
|
||||||
|
unsigned int default_private_key_len = 609;
|
503
app/include/ssl/ssl_ssl.h
Normal file
503
app/include/ssl/ssl_ssl.h
Normal file
@ -0,0 +1,503 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2007, Cameron Rich
|
||||||
|
*
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* * Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
* * 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.
|
||||||
|
* * Neither the name of the axTLS project nor the names of its contributors
|
||||||
|
* may be used to endorse or promote products derived from this software
|
||||||
|
* without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
* "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 COPYRIGHT OWNER OR
|
||||||
|
* CONTRIBUTORS 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @mainpage axTLS API
|
||||||
|
*
|
||||||
|
* @image html axolotl.jpg
|
||||||
|
*
|
||||||
|
* The axTLS library has features such as:
|
||||||
|
* - The TLSv1 SSL client/server protocol
|
||||||
|
* - No requirement to use any openssl libraries.
|
||||||
|
* - A choice between AES block (128/256 bit) and RC4 (128 bit) stream ciphers.
|
||||||
|
* - RSA encryption/decryption with variable sized keys (up to 4096 bits).
|
||||||
|
* - Certificate chaining and peer authentication.
|
||||||
|
* - Session resumption, session renegotiation.
|
||||||
|
* - ASN.1, X.509, PKCS#8, PKCS#12 keys/certificates with DER/PEM encoding.
|
||||||
|
* - Highly configurable compile time options.
|
||||||
|
* - Portable across many platforms (written in ANSI C), and has language
|
||||||
|
* bindings in C, C#, VB.NET, Java, Perl and Lua.
|
||||||
|
* - Partial openssl API compatibility (via a wrapper).
|
||||||
|
* - A very small footprint (around 50-60kB for the library in 'server-only'
|
||||||
|
* mode).
|
||||||
|
* - No dependencies on sockets - can use serial connections for example.
|
||||||
|
* - A very simple API - ~ 20 functions/methods.
|
||||||
|
*
|
||||||
|
* A list of these functions/methods are described below.
|
||||||
|
*
|
||||||
|
* @ref c_api
|
||||||
|
*
|
||||||
|
* @ref bigint_api
|
||||||
|
*
|
||||||
|
* @ref csharp_api
|
||||||
|
*
|
||||||
|
* @ref java_api
|
||||||
|
*/
|
||||||
|
#ifndef HEADER_SSL_H
|
||||||
|
#define HEADER_SSL_H
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//#include <time.h>
|
||||||
|
typedef long time_t;
|
||||||
|
|
||||||
|
/* need to predefine before ssl_lib.h gets to it */
|
||||||
|
#define SSL_SESSION_ID_SIZE 32
|
||||||
|
|
||||||
|
#include "ssl/ssl_tls1.h"
|
||||||
|
|
||||||
|
/* The optional parameters that can be given to the client/server SSL engine */
|
||||||
|
#define SSL_CLIENT_AUTHENTICATION 0x00010000
|
||||||
|
#define SSL_SERVER_VERIFY_LATER 0x00020000
|
||||||
|
#define SSL_NO_DEFAULT_KEY 0x00040000
|
||||||
|
#define SSL_DISPLAY_STATES 0x00080000
|
||||||
|
#define SSL_DISPLAY_BYTES 0x00100000
|
||||||
|
#define SSL_DISPLAY_CERTS 0x00200000
|
||||||
|
#define SSL_DISPLAY_RSA 0x00400000
|
||||||
|
#define SSL_CONNECT_IN_PARTS 0x00800000
|
||||||
|
|
||||||
|
/* errors that can be generated */
|
||||||
|
#define SSL_OK 0
|
||||||
|
#define SSL_NOT_OK -1
|
||||||
|
#define SSL_ERROR_DEAD -2
|
||||||
|
#define SSL_CLOSE_NOTIFY -3
|
||||||
|
#define SSL_ERROR_CONN_LOST -256
|
||||||
|
#define SSL_ERROR_SOCK_SETUP_FAILURE -258
|
||||||
|
#define SSL_ERROR_INVALID_HANDSHAKE -260
|
||||||
|
#define SSL_ERROR_INVALID_PROT_MSG -261
|
||||||
|
#define SSL_ERROR_INVALID_HMAC -262
|
||||||
|
#define SSL_ERROR_INVALID_VERSION -263
|
||||||
|
#define SSL_ERROR_INVALID_SESSION -265
|
||||||
|
#define SSL_ERROR_NO_CIPHER -266
|
||||||
|
#define SSL_ERROR_BAD_CERTIFICATE -268
|
||||||
|
#define SSL_ERROR_INVALID_KEY -269
|
||||||
|
#define SSL_ERROR_FINISHED_INVALID -271
|
||||||
|
#define SSL_ERROR_NO_CERT_DEFINED -272
|
||||||
|
#define SSL_ERROR_NO_CLIENT_RENOG -273
|
||||||
|
#define SSL_ERROR_NOT_SUPPORTED -274
|
||||||
|
#define SSL_X509_OFFSET -512
|
||||||
|
#define SSL_X509_ERROR(A) (SSL_X509_OFFSET+A)
|
||||||
|
|
||||||
|
/* alert types that are recognized */
|
||||||
|
#define SSL_ALERT_TYPE_WARNING 1
|
||||||
|
#define SLL_ALERT_TYPE_FATAL 2
|
||||||
|
|
||||||
|
/* these are all the alerts that are recognized */
|
||||||
|
#define SSL_ALERT_CLOSE_NOTIFY 0
|
||||||
|
#define SSL_ALERT_UNEXPECTED_MESSAGE 10
|
||||||
|
#define SSL_ALERT_BAD_RECORD_MAC 20
|
||||||
|
#define SSL_ALERT_HANDSHAKE_FAILURE 40
|
||||||
|
#define SSL_ALERT_BAD_CERTIFICATE 42
|
||||||
|
#define SSL_ALERT_ILLEGAL_PARAMETER 47
|
||||||
|
#define SSL_ALERT_DECODE_ERROR 50
|
||||||
|
#define SSL_ALERT_DECRYPT_ERROR 51
|
||||||
|
#define SSL_ALERT_INVALID_VERSION 70
|
||||||
|
#define SSL_ALERT_NO_RENEGOTIATION 100
|
||||||
|
|
||||||
|
/* The ciphers that are supported */
|
||||||
|
#define SSL_AES128_SHA 0x2f
|
||||||
|
#define SSL_AES256_SHA 0x35
|
||||||
|
#define SSL_RC4_128_SHA 0x05
|
||||||
|
#define SSL_RC4_128_MD5 0x04
|
||||||
|
|
||||||
|
/* build mode ids' */
|
||||||
|
#define SSL_BUILD_SKELETON_MODE 0x01
|
||||||
|
#define SSL_BUILD_SERVER_ONLY 0x02
|
||||||
|
#define SSL_BUILD_ENABLE_VERIFICATION 0x03
|
||||||
|
#define SSL_BUILD_ENABLE_CLIENT 0x04
|
||||||
|
#define SSL_BUILD_FULL_MODE 0x05
|
||||||
|
|
||||||
|
/* offsets to retrieve configuration information */
|
||||||
|
#define SSL_BUILD_MODE 0
|
||||||
|
#define SSL_MAX_CERT_CFG_OFFSET 1
|
||||||
|
#define SSL_MAX_CA_CERT_CFG_OFFSET 2
|
||||||
|
#define SSL_HAS_PEM 3
|
||||||
|
|
||||||
|
/* default session sizes */
|
||||||
|
#define SSL_DEFAULT_SVR_SESS 1 //modify 5->1 by lhan
|
||||||
|
#define SSL_DEFAULT_CLNT_SESS 1
|
||||||
|
|
||||||
|
/* X.509/X.520 distinguished name types */
|
||||||
|
#define SSL_X509_CERT_COMMON_NAME 0
|
||||||
|
#define SSL_X509_CERT_ORGANIZATION 1
|
||||||
|
#define SSL_X509_CERT_ORGANIZATIONAL_NAME 2
|
||||||
|
#define SSL_X509_CA_CERT_COMMON_NAME 3
|
||||||
|
#define SSL_X509_CA_CERT_ORGANIZATION 4
|
||||||
|
#define SSL_X509_CA_CERT_ORGANIZATIONAL_NAME 5
|
||||||
|
|
||||||
|
/* SSL object loader types */
|
||||||
|
#define SSL_OBJ_X509_CERT 1
|
||||||
|
#define SSL_OBJ_X509_CACERT 2
|
||||||
|
#define SSL_OBJ_RSA_KEY 3
|
||||||
|
#define SSL_OBJ_PKCS8 4
|
||||||
|
#define SSL_OBJ_PKCS12 5
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @defgroup c_api Standard C API
|
||||||
|
* @brief The standard interface in C.
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Establish a new client/server context.
|
||||||
|
*
|
||||||
|
* This function is called before any client/server SSL connections are made.
|
||||||
|
*
|
||||||
|
* Each new connection will use the this context's private key and
|
||||||
|
* certificate chain. If a different certificate chain is required, then a
|
||||||
|
* different context needs to be be used.
|
||||||
|
*
|
||||||
|
* There are two threading models supported - a single thread with one
|
||||||
|
* SSL_CTX can support any number of SSL connections - and multiple threads can
|
||||||
|
* support one SSL_CTX object each (the default). But if a single SSL_CTX
|
||||||
|
* object uses many SSL objects in individual threads, then the
|
||||||
|
* CONFIG_SSL_CTX_MUTEXING option needs to be configured.
|
||||||
|
*
|
||||||
|
* @param options [in] Any particular options. At present the options
|
||||||
|
* supported are:
|
||||||
|
* - SSL_SERVER_VERIFY_LATER (client only): Don't stop a handshake if the server
|
||||||
|
* authentication fails. The certificate can be authenticated later with a
|
||||||
|
* call to ssl_verify_cert().
|
||||||
|
* - SSL_CLIENT_AUTHENTICATION (server only): Enforce client authentication
|
||||||
|
* i.e. each handshake will include a "certificate request" message from the
|
||||||
|
* server. Only available if verification has been enabled.
|
||||||
|
* - SSL_DISPLAY_BYTES (full mode build only): Display the byte sequences
|
||||||
|
* during the handshake.
|
||||||
|
* - SSL_DISPLAY_STATES (full mode build only): Display the state changes
|
||||||
|
* during the handshake.
|
||||||
|
* - SSL_DISPLAY_CERTS (full mode build only): Display the certificates that
|
||||||
|
* are passed during a handshake.
|
||||||
|
* - SSL_DISPLAY_RSA (full mode build only): Display the RSA key details that
|
||||||
|
* are passed during a handshake.
|
||||||
|
* - SSL_CONNECT_IN_PARTS (client only): To use a non-blocking version of
|
||||||
|
* ssl_client_new().
|
||||||
|
* @param num_sessions [in] The number of sessions to be used for session
|
||||||
|
* caching. If this value is 0, then there is no session caching. This option
|
||||||
|
* is not used in skeleton mode.
|
||||||
|
* @return A client/server context.
|
||||||
|
*/
|
||||||
|
EXP_FUNC SSL_CTX * STDCALL ssl_ctx_new(uint32_t options, int num_sessions);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Remove a client/server context.
|
||||||
|
*
|
||||||
|
* Frees any used resources used by this context. Each connection will be
|
||||||
|
* sent a "Close Notify" alert (if possible).
|
||||||
|
* @param ssl_ctx [in] The client/server context.
|
||||||
|
*/
|
||||||
|
EXP_FUNC void STDCALL ssl_ctx_free(SSL_CTX *ssl_ctx);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief (server only) Establish a new SSL connection to an SSL client.
|
||||||
|
*
|
||||||
|
* It is up to the application to establish the logical connection (whether it
|
||||||
|
* is a socket, serial connection etc).
|
||||||
|
* @param ssl_ctx [in] The server context.
|
||||||
|
* @param client_fd [in] The client's file descriptor.
|
||||||
|
* @return An SSL object reference.
|
||||||
|
*/
|
||||||
|
//EXP_FUNC SSL * STDCALL ssl_server_new(SSL_CTX *ssl_ctx, int client_fd);
|
||||||
|
|
||||||
|
EXP_FUNC SSL *STDCALL sslserver_new(SSL_CTX *ssl_ctx, struct tcp_pcb* client_pcb);
|
||||||
|
/**
|
||||||
|
* @brief (client only) Establish a new SSL connection to an SSL server.
|
||||||
|
*
|
||||||
|
* It is up to the application to establish the initial logical connection
|
||||||
|
* (whether it is a socket, serial connection etc).
|
||||||
|
*
|
||||||
|
* This is a normally a blocking call - it will finish when the handshake is
|
||||||
|
* complete (or has failed). To use in non-blocking mode, set
|
||||||
|
* SSL_CONNECT_IN_PARTS in ssl_ctx_new().
|
||||||
|
* @param ssl_ctx [in] The client context.
|
||||||
|
* @param client_fd [in] The client's file descriptor.
|
||||||
|
* @param session_id [in] A 32 byte session id for session resumption. This
|
||||||
|
* can be null if no session resumption is being used or required. This option
|
||||||
|
* is not used in skeleton mode.
|
||||||
|
* @param sess_id_size The size of the session id (max 32)
|
||||||
|
* @return An SSL object reference. Use ssl_handshake_status() to check
|
||||||
|
* if a handshake succeeded.
|
||||||
|
*/
|
||||||
|
//EXP_FUNC SSL * STDCALL ssl_client_new(SSL_CTX *ssl_ctx, int client_fd, const uint8_t *session_id, uint8_t sess_id_size);
|
||||||
|
|
||||||
|
EXP_FUNC SSL *STDCALL SSLClient_new(SSL_CTX *ssl_ctx, struct tcp_pcb *SslClient_pcb, const
|
||||||
|
uint8_t *session_id, uint8_t sess_id_size);
|
||||||
|
/**
|
||||||
|
* @brief Free any used resources on this connection.
|
||||||
|
|
||||||
|
* A "Close Notify" message is sent on this connection (if possible). It is up
|
||||||
|
* to the application to close the socket or file descriptor.
|
||||||
|
* @param ssl [in] The ssl object reference.
|
||||||
|
*/
|
||||||
|
EXP_FUNC void STDCALL ssl_free(SSL *ssl);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Read the SSL data stream.
|
||||||
|
* If the socket is non-blocking and data is blocked then SSO_OK will be
|
||||||
|
* returned.
|
||||||
|
* @param ssl [in] An SSL object reference.
|
||||||
|
* @param in_data [out] If the read was successful, a pointer to the read
|
||||||
|
* buffer will be here. Do NOT ever free this memory as this buffer is used in
|
||||||
|
* sucessive calls. If the call was unsuccessful, this value will be null.
|
||||||
|
* @return The number of decrypted bytes:
|
||||||
|
* - if > 0, then the handshaking is complete and we are returning the number
|
||||||
|
* of decrypted bytes.
|
||||||
|
* - SSL_OK if the handshaking stage is successful (but not yet complete).
|
||||||
|
* - < 0 if an error.
|
||||||
|
* @see ssl.h for the error code list.
|
||||||
|
* @note Use in_data before doing any successive ssl calls.
|
||||||
|
*/
|
||||||
|
EXP_FUNC int STDCALL ssl_read(SSL *ssl, uint8_t **in_data);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Write to the SSL data stream.
|
||||||
|
* if the socket is non-blocking and data is blocked then a check is made
|
||||||
|
* to ensure that all data is sent (i.e. blocked mode is forced).
|
||||||
|
* @param ssl [in] An SSL obect reference.
|
||||||
|
* @param out_data [in] The data to be written
|
||||||
|
* @param out_len [in] The number of bytes to be written.
|
||||||
|
* @return The number of bytes sent, or if < 0 if an error.
|
||||||
|
* @see ssl.h for the error code list.
|
||||||
|
*/
|
||||||
|
EXP_FUNC int STDCALL ssl_write(SSL *ssl, const uint8_t *out_data, int out_len);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Find an ssl object based on a file descriptor.
|
||||||
|
*
|
||||||
|
* Goes through the list of SSL objects maintained in a client/server context
|
||||||
|
* to look for a file descriptor match.
|
||||||
|
* @param ssl_ctx [in] The client/server context.
|
||||||
|
* @param client_fd [in] The file descriptor.
|
||||||
|
* @return A reference to the SSL object. Returns null if the object could not
|
||||||
|
* be found.
|
||||||
|
*/
|
||||||
|
EXP_FUNC SSL * STDCALL ssl_find(SSL_CTX *ssl_ctx, int client_fd);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Get the session id for a handshake.
|
||||||
|
*
|
||||||
|
* This will be a 32 byte sequence and is available after the first
|
||||||
|
* handshaking messages are sent.
|
||||||
|
* @param ssl [in] An SSL object reference.
|
||||||
|
* @return The session id as a 32 byte sequence.
|
||||||
|
* @note A SSLv23 handshake may have only 16 valid bytes.
|
||||||
|
*/
|
||||||
|
EXP_FUNC const uint8_t * STDCALL ssl_get_session_id(const SSL *ssl);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Get the session id size for a handshake.
|
||||||
|
*
|
||||||
|
* This will normally be 32 but could be 0 (no session id) or something else.
|
||||||
|
* @param ssl [in] An SSL object reference.
|
||||||
|
* @return The size of the session id.
|
||||||
|
*/
|
||||||
|
EXP_FUNC uint8_t STDCALL ssl_get_session_id_size(const SSL *ssl);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Return the cipher id (in the SSL form).
|
||||||
|
* @param ssl [in] An SSL object reference.
|
||||||
|
* @return The cipher id. This will be one of the following:
|
||||||
|
* - SSL_AES128_SHA (0x2f)
|
||||||
|
* - SSL_AES256_SHA (0x35)
|
||||||
|
* - SSL_RC4_128_SHA (0x05)
|
||||||
|
* - SSL_RC4_128_MD5 (0x04)
|
||||||
|
*/
|
||||||
|
EXP_FUNC uint8_t STDCALL ssl_get_cipher_id(const SSL *ssl);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Return the status of the handshake.
|
||||||
|
* @param ssl [in] An SSL object reference.
|
||||||
|
* @return SSL_OK if the handshake is complete and ok.
|
||||||
|
* @see ssl.h for the error code list.
|
||||||
|
*/
|
||||||
|
EXP_FUNC int STDCALL ssl_handshake_status(const SSL *ssl);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Retrieve various parameters about the axTLS engine.
|
||||||
|
* @param offset [in] The configuration offset. It will be one of the following:
|
||||||
|
* - SSL_BUILD_MODE The build mode. This will be one of the following:
|
||||||
|
* - SSL_BUILD_SERVER_ONLY (basic server mode)
|
||||||
|
* - SSL_BUILD_ENABLE_VERIFICATION (server can do client authentication)
|
||||||
|
* - SSL_BUILD_ENABLE_CLIENT (client/server capabilties)
|
||||||
|
* - SSL_BUILD_FULL_MODE (client/server with diagnostics)
|
||||||
|
* - SSL_BUILD_SKELETON_MODE (skeleton mode)
|
||||||
|
* - SSL_MAX_CERT_CFG_OFFSET The maximum number of certificates allowed.
|
||||||
|
* - SSL_MAX_CA_CERT_CFG_OFFSET The maximum number of CA certificates allowed.
|
||||||
|
* - SSL_HAS_PEM 1 if supported
|
||||||
|
* @return The value of the requested parameter.
|
||||||
|
*/
|
||||||
|
EXP_FUNC int STDCALL ssl_get_config(int offset);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Display why the handshake failed.
|
||||||
|
*
|
||||||
|
* This call is only useful in a 'full mode' build. The output is to stdout.
|
||||||
|
* @param error_code [in] An error code.
|
||||||
|
* @see ssl.h for the error code list.
|
||||||
|
*/
|
||||||
|
//EXP_FUNC void STDCALL ssl_display_error(int error_code);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Authenticate a received certificate.
|
||||||
|
*
|
||||||
|
* This call is usually made by a client after a handshake is complete and the
|
||||||
|
* context is in SSL_SERVER_VERIFY_LATER mode.
|
||||||
|
* @param ssl [in] An SSL object reference.
|
||||||
|
* @return SSL_OK if the certificate is verified.
|
||||||
|
*/
|
||||||
|
EXP_FUNC int STDCALL ssl_verify_cert(const SSL *ssl);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Retrieve an X.509 distinguished name component.
|
||||||
|
*
|
||||||
|
* When a handshake is complete and a certificate has been exchanged, then the
|
||||||
|
* details of the remote certificate can be retrieved.
|
||||||
|
*
|
||||||
|
* This will usually be used by a client to check that the server's common
|
||||||
|
* name matches the URL.
|
||||||
|
*
|
||||||
|
* @param ssl [in] An SSL object reference.
|
||||||
|
* @param component [in] one of:
|
||||||
|
* - SSL_X509_CERT_COMMON_NAME
|
||||||
|
* - SSL_X509_CERT_ORGANIZATION
|
||||||
|
* - SSL_X509_CERT_ORGANIZATIONAL_NAME
|
||||||
|
* - SSL_X509_CA_CERT_COMMON_NAME
|
||||||
|
* - SSL_X509_CA_CERT_ORGANIZATION
|
||||||
|
* - SSL_X509_CA_CERT_ORGANIZATIONAL_NAME
|
||||||
|
* @return The appropriate string (or null if not defined)
|
||||||
|
* @note Verification build mode must be enabled.
|
||||||
|
*/
|
||||||
|
EXP_FUNC const char * STDCALL ssl_get_cert_dn(const SSL *ssl, int component);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Retrieve a Subject Alternative DNSName
|
||||||
|
*
|
||||||
|
* When a handshake is complete and a certificate has been exchanged, then the
|
||||||
|
* details of the remote certificate can be retrieved.
|
||||||
|
*
|
||||||
|
* This will usually be used by a client to check that the server's DNS
|
||||||
|
* name matches the URL.
|
||||||
|
*
|
||||||
|
* @param ssl [in] An SSL object reference.
|
||||||
|
* @param dnsindex [in] The index of the DNS name to retrieve.
|
||||||
|
* @return The appropriate string (or null if not defined)
|
||||||
|
* @note Verification build mode must be enabled.
|
||||||
|
*/
|
||||||
|
EXP_FUNC const char * STDCALL ssl_get_cert_subject_alt_dnsname(const SSL *ssl, int dnsindex);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Force the client to perform its handshake again.
|
||||||
|
*
|
||||||
|
* For a client this involves sending another "client hello" message.
|
||||||
|
* For the server is means sending a "hello request" message.
|
||||||
|
*
|
||||||
|
* This is a blocking call on the client (until the handshake completes).
|
||||||
|
*
|
||||||
|
* @param ssl [in] An SSL object reference.
|
||||||
|
* @return SSL_OK if renegotiation instantiation was ok
|
||||||
|
*/
|
||||||
|
EXP_FUNC int STDCALL ssl_renegotiate(SSL *ssl);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Process a file that is in binary DER or ASCII PEM format.
|
||||||
|
*
|
||||||
|
* These are temporary objects that are used to load private keys,
|
||||||
|
* certificates etc into memory.
|
||||||
|
* @param ssl_ctx [in] The client/server context.
|
||||||
|
* @param obj_type [in] The format of the file. Can be one of:
|
||||||
|
* - SSL_OBJ_X509_CERT (no password required)
|
||||||
|
* - SSL_OBJ_X509_CACERT (no password required)
|
||||||
|
* - SSL_OBJ_RSA_KEY (AES128/AES256 PEM encryption supported)
|
||||||
|
* - SSL_OBJ_PKCS8 (RC4-128 encrypted data supported)
|
||||||
|
* - SSL_OBJ_PKCS12 (RC4-128 encrypted data supported)
|
||||||
|
*
|
||||||
|
* PEM files are automatically detected (if supported). The object type is
|
||||||
|
* also detected, and so is not relevant for these types of files.
|
||||||
|
* @param filename [in] The location of a file in DER/PEM format.
|
||||||
|
* @param password [in] The password used. Can be null if not required.
|
||||||
|
* @return SSL_OK if all ok
|
||||||
|
* @note Not available in skeleton build mode.
|
||||||
|
*/
|
||||||
|
EXP_FUNC int STDCALL ssl_obj_load(SSL_CTX *ssl_ctx, int obj_type, const char *filename, const char *password);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Process binary data.
|
||||||
|
*
|
||||||
|
* These are temporary objects that are used to load private keys,
|
||||||
|
* certificates etc into memory.
|
||||||
|
* @param ssl_ctx [in] The client/server context.
|
||||||
|
* @param obj_type [in] The format of the memory data.
|
||||||
|
* @param data [in] The binary data to be loaded.
|
||||||
|
* @param len [in] The amount of data to be loaded.
|
||||||
|
* @param password [in] The password used. Can be null if not required.
|
||||||
|
* @return SSL_OK if all ok
|
||||||
|
* @see ssl_obj_load for more details on obj_type.
|
||||||
|
*/
|
||||||
|
EXP_FUNC int STDCALL ssl_obj_memory_load(SSL_CTX *ssl_ctx, int obj_type, const uint8_t *data, int len, const char *password);
|
||||||
|
|
||||||
|
#ifdef CONFIG_SSL_GENERATE_X509_CERT
|
||||||
|
/**
|
||||||
|
* @brief Create an X.509 certificate.
|
||||||
|
*
|
||||||
|
* This certificate is a self-signed v1 cert with a fixed start/stop validity
|
||||||
|
* times. It is signed with an internal private key in ssl_ctx.
|
||||||
|
*
|
||||||
|
* @param ssl_ctx [in] The client/server context.
|
||||||
|
* @param options [in] Not used yet.
|
||||||
|
* @param dn [in] An array of distinguished name strings. The array is defined
|
||||||
|
* by:
|
||||||
|
* - SSL_X509_CERT_COMMON_NAME (0)
|
||||||
|
* - If SSL_X509_CERT_COMMON_NAME is empty or not defined, then the
|
||||||
|
* hostname will be used.
|
||||||
|
* - SSL_X509_CERT_ORGANIZATION (1)
|
||||||
|
* - If SSL_X509_CERT_ORGANIZATION is empty or not defined, then $USERNAME
|
||||||
|
* will be used.
|
||||||
|
* - SSL_X509_CERT_ORGANIZATIONAL_NAME (2)
|
||||||
|
* - SSL_X509_CERT_ORGANIZATIONAL_NAME is optional.
|
||||||
|
* @param cert_data [out] The certificate as a sequence of bytes.
|
||||||
|
* @return < 0 if an error, or the size of the certificate in bytes.
|
||||||
|
* @note cert_data must be freed when there is no more need for it.
|
||||||
|
*/
|
||||||
|
EXP_FUNC int STDCALL ssl_x509_create(SSL_CTX *ssl_ctx, uint32_t options, const char * dn[], uint8_t **cert_data);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Return the axTLS library version as a string.
|
||||||
|
*/
|
||||||
|
EXP_FUNC const char * STDCALL ssl_version(void);
|
||||||
|
|
||||||
|
/** @} */
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
302
app/include/ssl/ssl_tls1.h
Normal file
302
app/include/ssl/ssl_tls1.h
Normal file
@ -0,0 +1,302 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2007, Cameron Rich
|
||||||
|
*
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* * Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
* * 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.
|
||||||
|
* * Neither the name of the axTLS project nor the names of its contributors
|
||||||
|
* may be used to endorse or promote products derived from this software
|
||||||
|
* without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
* "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 COPYRIGHT OWNER OR
|
||||||
|
* CONTRIBUTORS 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @file tls1.h
|
||||||
|
*
|
||||||
|
* @brief The definitions for the TLS library.
|
||||||
|
*/
|
||||||
|
#ifndef HEADER_SSL_LIB_H
|
||||||
|
#define HEADER_SSL_LIB_H
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "c_types.h"
|
||||||
|
#include "ssl/ssl_version.h"
|
||||||
|
#include "ssl/ssl_config.h"
|
||||||
|
//#include "../crypto/os_int.h"
|
||||||
|
#include "ssl/ssl_crypto.h"
|
||||||
|
#include "ssl/ssl_crypto_misc.h"
|
||||||
|
#include "lwip/tcp.h"
|
||||||
|
|
||||||
|
#define SSL_PROTOCOL_MIN_VERSION 0x31 /* TLS v1.0 */
|
||||||
|
#define SSL_PROTOCOL_MINOR_VERSION 0x02 /* TLS v1.1 */
|
||||||
|
#define SSL_PROTOCOL_VERSION_MAX 0x32 /* TLS v1.1 */
|
||||||
|
#define SSL_PROTOCOL_VERSION1_1 0x32 /* TLS v1.1 */
|
||||||
|
#define SSL_RANDOM_SIZE 32
|
||||||
|
#define SSL_SECRET_SIZE 48
|
||||||
|
#define SSL_FINISHED_HASH_SIZE 12
|
||||||
|
#define SSL_RECORD_SIZE 5
|
||||||
|
#define SSL_SERVER_READ 0
|
||||||
|
#define SSL_SERVER_WRITE 1
|
||||||
|
#define SSL_CLIENT_READ 2
|
||||||
|
#define SSL_CLIENT_WRITE 3
|
||||||
|
#define SSL_HS_HDR_SIZE 4
|
||||||
|
|
||||||
|
/* the flags we use while establishing a connection */
|
||||||
|
#define SSL_NEED_RECORD 0x0001
|
||||||
|
#define SSL_TX_ENCRYPTED 0x0002
|
||||||
|
#define SSL_RX_ENCRYPTED 0x0004
|
||||||
|
#define SSL_SESSION_RESUME 0x0008
|
||||||
|
#define SSL_IS_CLIENT 0x0010
|
||||||
|
#define SSL_HAS_CERT_REQ 0x0020
|
||||||
|
#define SSL_SENT_CLOSE_NOTIFY 0x0040
|
||||||
|
|
||||||
|
/* some macros to muck around with flag bits */
|
||||||
|
#define SET_SSL_FLAG(A) (ssl->flag |= A)
|
||||||
|
#define CLR_SSL_FLAG(A) (ssl->flag &= ~A)
|
||||||
|
#define IS_SET_SSL_FLAG(A) (ssl->flag & A)
|
||||||
|
|
||||||
|
#define MAX_KEY_BYTE_SIZE 512 /* for a 4096 bit key */
|
||||||
|
#define RT_MAX_PLAIN_LENGTH 4096
|
||||||
|
#define RT_EXTRA 1024
|
||||||
|
#define BM_RECORD_OFFSET 5
|
||||||
|
|
||||||
|
#ifdef CONFIG_SSL_SKELETON_MODE
|
||||||
|
#define NUM_PROTOCOLS 1
|
||||||
|
#else
|
||||||
|
#define NUM_PROTOCOLS 4
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define PARANOIA_CHECK(A, B) if (A < B) { \
|
||||||
|
ret = SSL_ERROR_INVALID_HANDSHAKE; goto error; }
|
||||||
|
|
||||||
|
/* protocol types */
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
PT_CHANGE_CIPHER_SPEC = 20,
|
||||||
|
PT_ALERT_PROTOCOL,
|
||||||
|
PT_HANDSHAKE_PROTOCOL,
|
||||||
|
PT_APP_PROTOCOL_DATA
|
||||||
|
};
|
||||||
|
|
||||||
|
/* handshaking types */
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
HS_HELLO_REQUEST,
|
||||||
|
HS_CLIENT_HELLO,
|
||||||
|
HS_SERVER_HELLO,
|
||||||
|
HS_CERTIFICATE = 11,
|
||||||
|
HS_SERVER_KEY_XCHG,
|
||||||
|
HS_CERT_REQ,
|
||||||
|
HS_SERVER_HELLO_DONE,
|
||||||
|
HS_CERT_VERIFY,
|
||||||
|
HS_CLIENT_KEY_XCHG,
|
||||||
|
HS_FINISHED = 20
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
uint8_t cipher;
|
||||||
|
uint8_t key_size;
|
||||||
|
uint8_t iv_size;
|
||||||
|
uint8_t key_block_size;
|
||||||
|
uint8_t padding_size;
|
||||||
|
uint8_t digest_size;
|
||||||
|
hmac_func hmac;
|
||||||
|
crypt_func encrypt;
|
||||||
|
crypt_func decrypt;
|
||||||
|
} cipher_info_t;
|
||||||
|
|
||||||
|
struct _SSLObjLoader
|
||||||
|
{
|
||||||
|
uint8_t *buf;
|
||||||
|
int len;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct _SSLObjLoader SSLObjLoader;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
time_t conn_time;
|
||||||
|
uint8_t session_id[SSL_SESSION_ID_SIZE];
|
||||||
|
uint8_t master_secret[SSL_SECRET_SIZE];
|
||||||
|
} SSL_SESSION;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
uint8_t *buf;
|
||||||
|
int size;
|
||||||
|
} SSL_CERT;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
MD5_CTX md5_ctx;
|
||||||
|
SHA1_CTX sha1_ctx;
|
||||||
|
uint8_t final_finish_mac[SSL_FINISHED_HASH_SIZE];
|
||||||
|
uint8_t *key_block;
|
||||||
|
uint8_t master_secret[SSL_SECRET_SIZE];
|
||||||
|
uint8_t client_random[SSL_RANDOM_SIZE]; /* client's random sequence */
|
||||||
|
uint8_t server_random[SSL_RANDOM_SIZE]; /* server's random sequence */
|
||||||
|
uint16_t bm_proc_index;
|
||||||
|
} DISPOSABLE_CTX;
|
||||||
|
|
||||||
|
struct _SSL
|
||||||
|
{
|
||||||
|
uint32_t flag;
|
||||||
|
uint16_t need_bytes;
|
||||||
|
uint16_t got_bytes;
|
||||||
|
uint8_t record_type;
|
||||||
|
uint8_t cipher;
|
||||||
|
uint8_t sess_id_size;
|
||||||
|
uint8_t version;
|
||||||
|
uint8_t client_version;
|
||||||
|
sint16_t next_state;
|
||||||
|
sint16_t hs_status;
|
||||||
|
DISPOSABLE_CTX *dc; /* temporary data which we'll get rid of soon */
|
||||||
|
//int client_fd;
|
||||||
|
struct tcp_pcb *SslClient_pcb;//add by ives 12.12.2013
|
||||||
|
struct pbuf *ssl_pbuf;//add by ives 12.12.2013
|
||||||
|
const cipher_info_t *cipher_info;
|
||||||
|
void *encrypt_ctx;
|
||||||
|
void *decrypt_ctx;
|
||||||
|
uint8_t bm_all_data[RT_MAX_PLAIN_LENGTH+RT_EXTRA];
|
||||||
|
uint8_t *bm_data;
|
||||||
|
uint16_t bm_index;
|
||||||
|
uint16_t bm_read_index;
|
||||||
|
struct _SSL *next; /* doubly linked list */
|
||||||
|
struct _SSL *prev;
|
||||||
|
struct _SSL_CTX *ssl_ctx; /* back reference to a clnt/svr ctx */
|
||||||
|
#ifndef CONFIG_SSL_SKELETON_MODE
|
||||||
|
uint16_t session_index;
|
||||||
|
SSL_SESSION *session;
|
||||||
|
#endif
|
||||||
|
#ifdef CONFIG_SSL_CERT_VERIFICATION
|
||||||
|
X509_CTX *x509_ctx;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
uint8_t session_id[SSL_SESSION_ID_SIZE];
|
||||||
|
uint8_t client_mac[SHA1_SIZE]; /* for HMAC verification */
|
||||||
|
uint8_t server_mac[SHA1_SIZE]; /* for HMAC verification */
|
||||||
|
uint8_t read_sequence[8]; /* 64 bit sequence number */
|
||||||
|
uint8_t write_sequence[8]; /* 64 bit sequence number */
|
||||||
|
uint8_t hmac_header[SSL_RECORD_SIZE]; /* rx hmac */
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct _SSL SSL;
|
||||||
|
|
||||||
|
struct _SSL_CTX
|
||||||
|
{
|
||||||
|
uint32_t options;
|
||||||
|
uint8_t chain_length;
|
||||||
|
RSA_CTX *rsa_ctx;
|
||||||
|
#ifdef CONFIG_SSL_CERT_VERIFICATION
|
||||||
|
CA_CERT_CTX *ca_cert_ctx;
|
||||||
|
#endif
|
||||||
|
SSL *head;
|
||||||
|
SSL *tail;
|
||||||
|
SSL_CERT certs[CONFIG_SSL_MAX_CERTS];
|
||||||
|
#ifndef CONFIG_SSL_SKELETON_MODE
|
||||||
|
uint16_t num_sessions;
|
||||||
|
SSL_SESSION **ssl_sessions;
|
||||||
|
#endif
|
||||||
|
#ifdef CONFIG_SSL_CTX_MUTEXING
|
||||||
|
SSL_CTX_MUTEX_TYPE mutex;
|
||||||
|
#endif
|
||||||
|
#ifdef CONFIG_OPENSSL_COMPATIBLE
|
||||||
|
void *bonus_attr;
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct _SSL_CTX SSL_CTX;
|
||||||
|
|
||||||
|
/* backwards compatibility */
|
||||||
|
typedef struct _SSL_CTX SSLCTX;
|
||||||
|
|
||||||
|
extern const uint8_t ssl_prot_prefs[NUM_PROTOCOLS];
|
||||||
|
|
||||||
|
SSL *ssl_new(SSL_CTX *ssl_ctx, int client_fd);
|
||||||
|
SSL *ssl_new_context(SSL_CTX *ssl_ctx, struct tcp_pcb *SslClient_pcb);
|
||||||
|
void disposable_new(SSL *ssl);
|
||||||
|
void disposable_free(SSL *ssl);
|
||||||
|
int send_packet(SSL *ssl, uint8_t protocol,
|
||||||
|
const uint8_t *in, int length);
|
||||||
|
int do_svr_handshake(SSL *ssl, int handshake_type, uint8_t *buf, int hs_len);
|
||||||
|
int do_clnt_handshake(SSL *ssl, int handshake_type, uint8_t *buf, int hs_len);
|
||||||
|
int process_finished(SSL *ssl, uint8_t *buf, int hs_len);
|
||||||
|
int process_sslv23_client_hello(SSL *ssl);
|
||||||
|
int send_alert(SSL *ssl, int error_code);
|
||||||
|
int send_finished(SSL *ssl);
|
||||||
|
int send_certificate(SSL *ssl);
|
||||||
|
int basic_read(SSL *ssl, uint8_t **in_data);
|
||||||
|
int send_change_cipher_spec(SSL *ssl);
|
||||||
|
void finished_digest(SSL *ssl, const char *label, uint8_t *digest);
|
||||||
|
void generate_master_secret(SSL *ssl, const uint8_t *premaster_secret);
|
||||||
|
void add_packet(SSL *ssl, const uint8_t *pkt, int len);
|
||||||
|
int add_cert(SSL_CTX *ssl_ctx, const uint8_t *buf, int len);
|
||||||
|
int add_private_key(SSL_CTX *ssl_ctx, SSLObjLoader *ssl_obj);
|
||||||
|
void ssl_obj_free(SSLObjLoader *ssl_obj);
|
||||||
|
int pkcs8_decode(SSL_CTX *ssl_ctx, SSLObjLoader *ssl_obj, const char *password);
|
||||||
|
int pkcs12_decode(SSL_CTX *ssl_ctx, SSLObjLoader *ssl_obj, const char *password);
|
||||||
|
int load_key_certs(SSL_CTX *ssl_ctx);
|
||||||
|
#ifdef CONFIG_SSL_CERT_VERIFICATION
|
||||||
|
int add_cert_auth(SSL_CTX *ssl_ctx, const uint8_t *buf, int len);
|
||||||
|
void remove_ca_certs(CA_CERT_CTX *ca_cert_ctx);
|
||||||
|
#endif
|
||||||
|
#ifdef CONFIG_SSL_ENABLE_CLIENT
|
||||||
|
int do_client_connect(SSL *ssl);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef CONFIG_SSL_FULL_MODE
|
||||||
|
//void DISPLAY_STATE(SSL *ssl, int is_send, uint8_t state, int not_ok);
|
||||||
|
//void DISPLAY_BYTES(SSL *ssl, const char *format,
|
||||||
|
// const uint8_t *data, int size, ...);
|
||||||
|
//void DISPLAY_CERT(SSL *ssl, const X509_CTX *x509_ctx);
|
||||||
|
//void DISPLAY_RSA(SSL *ssl, const RSA_CTX *rsa_ctx);
|
||||||
|
//void DISPLAY_ALERT(SSL *ssl, int alert);
|
||||||
|
#else
|
||||||
|
#define DISPLAY_STATE(A,B,C,D)
|
||||||
|
#define DISPLAY_CERT(A,B)
|
||||||
|
#define DISPLAY_RSA(A,B)
|
||||||
|
#define DISPLAY_ALERT(A, B)
|
||||||
|
#ifdef WIN32
|
||||||
|
void DISPLAY_BYTES(SSL *ssl, const char *format,/* win32 has no variadic macros */
|
||||||
|
const uint8_t *data, int size, ...);
|
||||||
|
#else
|
||||||
|
#define DISPLAY_BYTES(A,B,C,D,...)
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef CONFIG_SSL_CERT_VERIFICATION
|
||||||
|
int process_certificate(SSL *ssl, X509_CTX **x509_ctx);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
SSL_SESSION *ssl_session_update(int max_sessions,
|
||||||
|
SSL_SESSION *ssl_sessions[], SSL *ssl,
|
||||||
|
const uint8_t *session_id);
|
||||||
|
void kill_ssl_session(SSL_SESSION **ssl_sessions, SSL *ssl);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
1
app/include/ssl/ssl_version.h
Normal file
1
app/include/ssl/ssl_version.h
Normal file
@ -0,0 +1 @@
|
|||||||
|
#define AXTLS_VERSION "1.4.9"
|
71
app/include/user_config.h
Normal file
71
app/include/user_config.h
Normal file
@ -0,0 +1,71 @@
|
|||||||
|
#ifndef __USER_CONFIG_H__
|
||||||
|
#define __USER_CONFIG_H__
|
||||||
|
|
||||||
|
#define NODE_VERSION "NodeMcu 0.9.4"
|
||||||
|
#define BUILD_DATE "build 20141222"
|
||||||
|
#define FLASH_512K
|
||||||
|
// #define FLASH_1M
|
||||||
|
// #define FLASH_2M
|
||||||
|
// #define FLASH_4M
|
||||||
|
// #define DEVELOP_VERSION
|
||||||
|
#define FULL_VERSION_FOR_USER
|
||||||
|
|
||||||
|
#ifdef DEVELOP_VERSION
|
||||||
|
#define NODE_DEBUG
|
||||||
|
#endif /* DEVELOP_VERSION */
|
||||||
|
|
||||||
|
#define NODE_ERROR
|
||||||
|
|
||||||
|
#ifdef NODE_DEBUG
|
||||||
|
#define NODE_DBG c_printf
|
||||||
|
#else
|
||||||
|
#define NODE_DBG
|
||||||
|
#endif /* NODE_DEBUG */
|
||||||
|
|
||||||
|
#ifdef NODE_ERROR
|
||||||
|
#define NODE_ERR c_printf
|
||||||
|
#else
|
||||||
|
#define NODE_ERR
|
||||||
|
#endif /* NODE_ERROR */
|
||||||
|
|
||||||
|
#define CLIENT_SSL_ENABLE
|
||||||
|
#define GPIO_INTERRUPT_ENABLE
|
||||||
|
|
||||||
|
// #define BUILD_WOFS 1
|
||||||
|
#define BUILD_SPIFFS 1
|
||||||
|
|
||||||
|
#define LUA_USE_MODULES
|
||||||
|
#ifdef LUA_USE_MODULES
|
||||||
|
#define LUA_USE_MODULES_NODE
|
||||||
|
#define LUA_USE_MODULES_FILE
|
||||||
|
#define LUA_USE_MODULES_GPIO
|
||||||
|
#define LUA_USE_MODULES_WIFI
|
||||||
|
#define LUA_USE_MODULES_NET
|
||||||
|
#define LUA_USE_MODULES_PWM
|
||||||
|
#define LUA_USE_MODULES_I2C
|
||||||
|
#define LUA_USE_MODULES_TMR
|
||||||
|
#define LUA_USE_MODULES_ADC
|
||||||
|
#define LUA_USE_MODULES_UART
|
||||||
|
#define LUA_USE_MODULES_OW
|
||||||
|
#define LUA_USE_MODULES_BIT
|
||||||
|
#endif /* LUA_USE_MODULES */
|
||||||
|
|
||||||
|
#define LUA_NUMBER_INTEGRAL
|
||||||
|
|
||||||
|
#define LUA_OPTRAM
|
||||||
|
#ifdef LUA_OPTRAM
|
||||||
|
#define LUA_OPTIMIZE_MEMORY 2
|
||||||
|
#else
|
||||||
|
#define LUA_OPTIMIZE_MEMORY 0
|
||||||
|
#endif /* LUA_OPTRAM */
|
||||||
|
|
||||||
|
#define READLINE_INTERVAL 80
|
||||||
|
#define KEY_SHORT_MS 200
|
||||||
|
#define KEY_LONG_MS 3000
|
||||||
|
#define KEY_SHORT_COUNT (KEY_SHORT_MS / READLINE_INTERVAL)
|
||||||
|
#define KEY_LONG_COUNT (KEY_LONG_MS / READLINE_INTERVAL)
|
||||||
|
|
||||||
|
#define LED_HIGH_COUNT_DEFAULT 10
|
||||||
|
#define LED_LOW_COUNT_DEFAULT 0
|
||||||
|
|
||||||
|
#endif /* __USER_CONFIG_H__ */
|
46
app/json/Makefile
Normal file
46
app/json/Makefile
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
|
||||||
|
#############################################################
|
||||||
|
# Required variables for each makefile
|
||||||
|
# Discard this section from all parent makefiles
|
||||||
|
# Expected variables (with automatic defaults):
|
||||||
|
# CSRCS (all "C" files in the dir)
|
||||||
|
# SUBDIRS (all subdirs with a Makefile)
|
||||||
|
# GEN_LIBS - list of libs to be generated ()
|
||||||
|
# GEN_IMAGES - list of images to be generated ()
|
||||||
|
# COMPONENTS_xxx - a list of libs/objs in the form
|
||||||
|
# subdir/lib to be extracted and rolled up into
|
||||||
|
# a generated lib/image xxx.a ()
|
||||||
|
#
|
||||||
|
ifndef PDIR
|
||||||
|
|
||||||
|
GEN_LIBS = libjson.a
|
||||||
|
|
||||||
|
endif
|
||||||
|
|
||||||
|
|
||||||
|
#############################################################
|
||||||
|
# Configuration i.e. compile options etc.
|
||||||
|
# Target specific stuff (defines etc.) goes in here!
|
||||||
|
# Generally values applying to a tree are captured in the
|
||||||
|
# makefile at its root level - these are then overridden
|
||||||
|
# for a subtree within the makefile rooted therein
|
||||||
|
#
|
||||||
|
#DEFINES +=
|
||||||
|
|
||||||
|
#############################################################
|
||||||
|
# Recursion Magic - Don't touch this!!
|
||||||
|
#
|
||||||
|
# Each subtree potentially has an include directory
|
||||||
|
# corresponding to the common APIs applicable to modules
|
||||||
|
# rooted at that subtree. Accordingly, the INCLUDE PATH
|
||||||
|
# of a module can only contain the include directories up
|
||||||
|
# its parent path, and not its siblings
|
||||||
|
#
|
||||||
|
# Required for each makefile to inherit from the parent
|
||||||
|
#
|
||||||
|
|
||||||
|
INCLUDES := $(INCLUDES) -I $(PDIR)include
|
||||||
|
INCLUDES += -I ./
|
||||||
|
PDIR := ../$(PDIR)
|
||||||
|
sinclude $(PDIR)Makefile
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user