diff --git a/Makefile b/Makefile index 2410a29..bc718f3 100644 --- a/Makefile +++ b/Makefile @@ -19,11 +19,12 @@ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA SHELL := bash - AWK := awk + Q?=@ ifeq "$(V)" "1" override undefine VERY_QUIET + Q= endif THIS_MAKEFILE := $(lastword $(MAKEFILE_LIST)) @@ -34,10 +35,17 @@ endif SRCS := wolfsentry_util.c wolfsentry_internal.c addr_families.c routes.c events.c actions.c kv.c action_builtins.c -ifndef SRC_TOP - SRC_TOP := $(shell pwd -P) +# Set PWD command based on OS - Windows uses 'pwd', others use 'pwd -P' +ifeq ($(OS),Windows_NT) + PWD := pwd + SRC_TOP := . else - SRC_TOP := $(shell cd $(SRC_TOP) && pwd -P) + PWD := pwd -P + ifndef SRC_TOP + SRC_TOP := $(shell $(PWD)) + else + SRC_TOP := $(shell cd $(SRC_TOP) && $(PWD)) + endif endif ifndef BUILD_TOP @@ -93,6 +101,17 @@ ifdef RUNTIME ifndef LWIP LWIP := 1 endif + else ifeq "$(RUNTIME)" "ThreadX-NetXDuo" + ifndef THREADX_TOP + $(error THREADX_TOP not supplied with RUNTIME=$(RUNTIME)) + endif + ifndef NETXDUO + NETXDUO := 1 + endif + RUNTIME_CFLAGS += -DTHREADX -I$(THREADX_TOP) + ifdef NEED_THREADX_TYPES + RUNTIME_CFLAGS += -DNEED_THREADX_TYPES -I$(THREADX_TYPES_TOP) + endif else $(error unrecognized runtime "$(RUNTIME)") endif @@ -110,7 +129,14 @@ ifdef LWIP SRCS += lwip/packet_filter_glue.c endif -CC_V := $(shell $(CC) -v 2>&1 | sed "s/'/'\\\\''/g") +ifdef NETXDUO + ifndef NETXDUO_TOP + NETXDUO_TOP=$(THREADX_TOP) + endif + LWIP_CFLAGS += -DWOLFSENTRY_NETXDUO -I$(NETXDUO_TOP) -D_NETINET_IN_H -DWOLFSENTRY_NO_GETPROTOBY +endif + +CC_V := $(shell $(CC) -v 2>&1 | sed "s/[\`']/'\\\\''/g") CC_IS_GCC := $(shell if [[ '$(CC_V)' =~ 'gcc version' ]]; then echo 1; else echo 0; fi) @@ -126,9 +152,9 @@ ifndef CLANG CLANG := clang endif -AS_VERSION := $(shell $(AS) --version 2>&1 | sed "s/'/'\\\\''/g") -LD_VERSION := $(shell $(LD) --version 2>&1 | sed "s/'/'\\\\''/g") -AR_VERSION := $(shell $(AR) --version 2>&1 | sed "s/'/'\\\\''/g") +AS_VERSION := $(shell $(AS) --version 2>&1 | sed "s/[\`']/'\\\\''/g") +LD_VERSION := $(shell $(LD) --version 2>&1 | sed "s/[\`']/'\\\\''/g") +AR_VERSION := $(shell $(AR) --version 2>&1 | sed "s/[\`']/'\\\\''/g") AR_IS_GNU_AR := $(shell if [[ '$(AR_VERSION)' =~ 'GNU' ]]; then echo 1; else echo 0; fi) @@ -178,7 +204,7 @@ else ifdef NO_JSON_DOM CFLAGS += -DWOLFSENTRY_NO_JSON_DOM else ifdef USER_SETTINGS_NO_JSON_DOM - NO_JSON_DOM := 1 + NO_JSON_DOM := 1 else SRCS += json/centijson_dom.c json/centijson_value.c endif @@ -191,7 +217,9 @@ endif ifdef SINGLETHREADED CFLAGS += -DWOLFSENTRY_SINGLETHREADED else - ifneq "$(RUNTIME)" "FreeRTOS-lwIP" + ifeq "$(RUNTIME)" "ThreadX-NetXDuo" + else ifeq "$(RUNTIME)" "FreeRTOS-lwIP" + else LDFLAGS += -pthread endif endif @@ -252,18 +280,18 @@ BUILD_PARAMS := (echo 'CC_V:'; echo '$(CC_V)'; echo 'SRC_TOP: $(SRC_TOP)'; echo .PHONY: force $(BUILD_TOP)/.build_params: force - @cd $(SRC_TOP) && [ -d .git ] || exit 0 && ([ -d .git/hooks ] || mkdir .git/hooks) && ([ -e .git/hooks/pre-push ] || ln -s ../../scripts/pre-push.sh .git/hooks/pre-push 2>/dev/null || exit 0) - @[ -d $(dir $@) ] || mkdir -p $(dir $@) + $(Q)cd $(SRC_TOP) && [ -d .git ] || exit 0 && ([ -d .git/hooks ] || mkdir .git/hooks) && ([ -e .git/hooks/pre-push ] || ln -s ../../scripts/pre-push.sh .git/hooks/pre-push 2>/dev/null || exit 0) + $(Q)[ -d $(dir $@) ] || mkdir -p $(dir $@) ifdef VERY_QUIET - @{ $(BUILD_PARAMS) | cmp -s - $@; } 2>/dev/null; cmp_ev=$$?; if [ $$cmp_ev != 0 ]; then $(BUILD_PARAMS) > $@; fi; exit 0 + $(Q){ $(BUILD_PARAMS) | cmp -s - $@; } 2>/dev/null; cmp_ev=$$?; if [ $$cmp_ev != 0 ]; then $(BUILD_PARAMS) > $@; fi; exit 0 else - @{ $(BUILD_PARAMS) | cmp -s - $@; } 2>/dev/null; cmp_ev=$$?; if [ $$cmp_ev = 0 ]; then echo 'Build parameters unchanged.'; else $(BUILD_PARAMS) > $@; if [ $$cmp_ev = 1 ]; then echo 'Rebuilding with changed build parameters.'; else echo 'Building fresh.'; fi; fi; exit 0 + $(Q){ $(BUILD_PARAMS) | cmp -s - $@; } 2>/dev/null; cmp_ev=$$?; if [ $$cmp_ev = 0 ]; then echo 'Build parameters unchanged.'; else $(BUILD_PARAMS) > $@; if [ $$cmp_ev = 1 ]; then echo 'Rebuilding with changed build parameters.'; else echo 'Building fresh.'; fi; fi; exit 0 endif ifndef USER_SETTINGS_FILE $(BUILD_TOP)/wolfsentry/wolfsentry_options.h: $(SRC_TOP)/scripts/build_wolfsentry_options_h.awk $(BUILD_TOP)/.build_params - @[ -d $(BUILD_TOP)/wolfsentry ] || mkdir -p $(BUILD_TOP)/wolfsentry - @echo '$(CFLAGS)' | $(AWK) -f $< > $@ + $(Q)[ -d $(BUILD_TOP)/wolfsentry ] || mkdir -p $(BUILD_TOP)/wolfsentry + $(Q)echo '$(CFLAGS)' | $(AWK) -f $< > $@ endif $(addprefix $(BUILD_TOP)/src/,$(SRCS:.c=.o)) $(addprefix $(BUILD_TOP)/src/,$(SRCS:.c=.So)): $(BUILD_TOP)/.build_params $(OPTIONS_FILE) $(SRC_TOP)/Makefile @@ -271,48 +299,31 @@ $(addprefix $(BUILD_TOP)/src/,$(SRCS:.c=.o)) $(addprefix $(BUILD_TOP)/src/,$(SRC INTERNAL_CFLAGS := -DBUILDING_LIBWOLFSENTRY -MMD $(BUILD_TOP)/src/%.o: $(SRC_TOP)/src/%.c - @[ -d $(dir $@) ] || mkdir -p $(dir $@) - @rm -f $(@:.o=.gcda) -ifeq "$(V)" "1" - $(CC) $(INTERNAL_CFLAGS) $(CFLAGS) $(VISIBILITY_CFLAGS) -MF $(@:.o=.d) -c $< -o $@ -else + $(Q)[ -d $(dir $@) ] || mkdir -p $(dir $@) + $(Q)rm -f $(@:.o=.gcda) ifndef VERY_QUIET - @echo "$(CC) ... -o $@" -endif - @$(CC) $(INTERNAL_CFLAGS) $(CFLAGS) $(VISIBILITY_CFLAGS) -MF $(@:.o=.d) -c $< -o $@ + $(Q)echo "$(CC) ... -o $@" endif + $(Q)$(CC) $(INTERNAL_CFLAGS) $(CFLAGS) $(VISIBILITY_CFLAGS) -MF $(@:.o=.d) -c $< -o $@ $(BUILD_TOP)/$(LIB_NAME): $(addprefix $(BUILD_TOP)/src/,$(SRCS:.c=.o)) -ifdef VERY_QUIET - @rm -f $@ - @$(AR) $(AR_FLAGS) $@ $+ -else - @rm -f $@ - $(AR) $(AR_FLAGS) $@ $+ -endif + $(Q)rm -f $@ + $(Q)$(AR) $(AR_FLAGS) $@ $+ # again, but to build the shared object: $(addprefix $(BUILD_TOP)/src/,$(SRCS:.c=.So)): $(BUILD_TOP)/.build_params $(SRC_TOP)/Makefile $(BUILD_TOP)/src/%.So: $(SRC_TOP)/src/%.c - @[ -d $(dir $@) ] || mkdir -p $(dir $@) - @rm -f $(@:.So=.gcda) -ifeq "$(V)" "1" - $(CC) $(INTERNAL_CFLAGS) $(CFLAGS) $(DYNAMIC_CFLAGS) $(VISIBILITY_CFLAGS) -MF $(@:.So=.Sd) -c $< -o $@ -else + $(Q)[ -d $(dir $@) ] || mkdir -p $(dir $@) + $(Q)rm -f $(@:.So=.gcda) ifndef VERY_QUIET - @echo "$(CC) ... -o $@" -endif - @$(CC) $(INTERNAL_CFLAGS) $(CFLAGS) $(DYNAMIC_CFLAGS) $(VISIBILITY_CFLAGS) -MF $(@:.So=.Sd) -c $< -o $@ + $(Q)echo "$(CC) ... -o $@" endif + $(Q)$(CC) $(INTERNAL_CFLAGS) $(CFLAGS) $(DYNAMIC_CFLAGS) $(VISIBILITY_CFLAGS) -MF $(@:.So=.Sd) -c $< -o $@ $(BUILD_TOP)/$(DYNLIB_NAME): $(addprefix $(BUILD_TOP)/src/,$(SRCS:.c=.So)) -ifdef VERY_QUIET - @$(CC) $(LD_FLAGS) $(DYNAMIC_LDFLAGS) -o $@ $+ -else - $(CC) $(LD_FLAGS) $(DYNAMIC_LDFLAGS) -o $@ $+ -endif + $(Q)$(CC) $(LD_FLAGS) $(DYNAMIC_LDFLAGS) -o $@ $+ UNITTEST_LIST := test_init test_rwlocks test_static_routes test_dynamic_rules test_user_values test_user_addr_families $(UNITTEST_LIST_EXTRAS) @@ -329,30 +340,22 @@ endif $(addprefix $(BUILD_TOP)/tests/,$(UNITTEST_LIST)): UNITTEST_GATE=-D$(shell basename '$@' | tr '[:lower:]' '[:upper:]') $(addprefix $(BUILD_TOP)/tests/,$(UNITTEST_LIST)): $(SRC_TOP)/tests/unittests.c $(BUILD_TOP)/$(LIB_NAME) $(OPTIONS_FILE) - @[ -d $(dir $@) ] || mkdir -p $(dir $@) -ifeq "$(V)" "1" - $(CC) $(CFLAGS) $(UNITTEST_GATE) $(LDFLAGS) -o $@ $(filter-out %.h,$^) -else + $(Q)[ -d $(dir $@) ] || mkdir -p $(dir $@) ifndef VERY_QUIET - @echo "$(CC) ... -o $@" -endif - @$(CC) $(CFLAGS) $(UNITTEST_GATE) $(LDFLAGS) -o $@ $(filter-out %.h,$^) + $(Q)echo "$(CC) ... -o $@" endif + $(Q)$(CC) $(CFLAGS) $(UNITTEST_GATE) $(LDFLAGS) -o $@ $(filter-out %.h,$^) UNITTEST_LIST_SHARED=test_all_shared UNITTEST_SHARED_FLAGS := $(addprefix -D,$(shell echo '$(UNITTEST_LIST)' | tr '[:lower:]' '[:upper:]')) $(TEST_JSON_CFLAGS) $(addprefix $(BUILD_TOP)/tests/,$(UNITTEST_LIST_SHARED)): $(SRC_TOP)/tests/unittests.c $(BUILD_TOP)/$(DYNLIB_NAME) $(OPTIONS_FILE) - @[ -d $(dir $@) ] || mkdir -p $(dir $@) -ifeq "$(V)" "1" - $(CC) $(CFLAGS) $(UNITTEST_SHARED_FLAGS) $(LDFLAGS) -o $@ $< $(BUILD_TOP)/$(DYNLIB_NAME) -else + $(Q)[ -d $(dir $@) ] || mkdir -p $(dir $@) ifndef VERY_QUIET - @echo "$(CC) ... -o $@" -endif - @$(CC) $(CFLAGS) $(UNITTEST_SHARED_FLAGS) $(LDFLAGS) -o $@ $< $(BUILD_TOP)/$(DYNLIB_NAME) + $(Q)echo "$(CC) ... -o $@" endif + $(Q)$(CC) $(CFLAGS) $(UNITTEST_SHARED_FLAGS) $(LDFLAGS) -o $@ $< $(BUILD_TOP)/$(DYNLIB_NAME) ifdef BUILD_DYNAMIC $(BUILD_TOP)/.tested: $(addprefix $(BUILD_TOP)/tests/,$(UNITTEST_LIST_SHARED)) @@ -364,26 +367,26 @@ test: $(BUILD_TOP)/.tested $(BUILD_TOP)/.tested: $(addprefix $(BUILD_TOP)/tests/,$(UNITTEST_LIST)) ifdef VERY_QUIET - @for test in $(basename $(UNITTEST_LIST)); do $(TEST_ENV) $(EXE_LAUNCHER) "$(BUILD_TOP)/tests/$$test" >/dev/null; exitcode=$$?; if [ $$exitcode != 0 ]; then echo "$${test} failed" 1>&2; break; fi; done; exit $$exitcode + $(Q)for test in $(basename $(UNITTEST_LIST)); do $(TEST_ENV) $(EXE_LAUNCHER) "$(BUILD_TOP)/tests/$$test" >/dev/null; exitcode=$$?; if [ $$exitcode != 0 ]; then echo "$${test} failed" 1>&2; break; fi; done; exit $$exitcode else ifeq "$(V)" "1" - @for test in $(basename $(UNITTEST_LIST)); do echo "$${test}:"; echo $(TEST_ENV) $(EXE_LAUNCHER) "$(BUILD_TOP)/tests/$$test"; $(TEST_ENV) $(EXE_LAUNCHER) "$(BUILD_TOP)/tests/$$test"; exitcode=$$?; if [ $$exitcode != 0 ]; then break; fi; echo "$${test} succeeded"; echo; done; if [ "$$exitcode" = 0 ]; then echo 'all subtests succeeded.'; else exit $$exitcode; fi + $(Q)for test in $(basename $(UNITTEST_LIST)); do echo "$${test}:"; echo $(TEST_ENV) $(EXE_LAUNCHER) "$(BUILD_TOP)/tests/$$test"; $(TEST_ENV) $(EXE_LAUNCHER) "$(BUILD_TOP)/tests/$$test"; exitcode=$$?; if [ $$exitcode != 0 ]; then break; fi; echo "$${test} succeeded"; echo; done; if [ "$$exitcode" = 0 ]; then echo 'all subtests succeeded.'; else exit $$exitcode; fi else - @for test in $(basename $(UNITTEST_LIST)); do echo -n "$${test}..."; $(TEST_ENV) $(EXE_LAUNCHER) "$(BUILD_TOP)/tests/$$test" >/dev/null; exitcode=$$?; if [ $$exitcode != 0 ]; then break; fi; echo ' succeeded'; done; if [ "$$exitcode" = 0 ]; then echo 'all subtests succeeded.'; else exit $$exitcode; fi + $(Q)for test in $(basename $(UNITTEST_LIST)); do echo -n "$${test}..."; $(TEST_ENV) $(EXE_LAUNCHER) "$(BUILD_TOP)/tests/$$test" >/dev/null; exitcode=$$?; if [ $$exitcode != 0 ]; then break; fi; echo ' succeeded'; done; if [ "$$exitcode" = 0 ]; then echo 'all subtests succeeded.'; else exit $$exitcode; fi endif endif ifdef BUILD_DYNAMIC - @for test in $(UNITTEST_LIST_SHARED); do LD_LIBRARY_PATH=$(BUILD_TOP) $(TEST_ENV) $(EXE_LAUNCHER) "$(BUILD_TOP)/tests/$$test" >/dev/null || exit $?; done + $(Q)for test in $(UNITTEST_LIST_SHARED); do LD_LIBRARY_PATH=$(BUILD_TOP) $(TEST_ENV) $(EXE_LAUNCHER) "$(BUILD_TOP)/tests/$$test" >/dev/null || exit $?; done ifndef VERY_QUIET - @echo '$(UNITTEST_LIST_SHARED) succeeded.' + $(Q)echo '$(UNITTEST_LIST_SHARED) succeeded.' endif endif - @touch $(BUILD_TOP)/.tested + $(Q)touch $(BUILD_TOP)/.tested .PHONY: retest retest: - @$(RM) -f $(BUILD_TOP)/.tested - @$(MAKE) -f $(THIS_MAKEFILE) test + $(Q)$(RM) -f $(BUILD_TOP)/.tested + $(Q)$(MAKE) -f $(THIS_MAKEFILE) test ifndef INSTALL_DIR INSTALL_DIR := /usr/local @@ -404,9 +407,9 @@ install: $(BUILD_TOP)/.tested install-untested: all install install-untested: - @mkdir -p $(INSTALL_LIBDIR) + $(Q)mkdir -p $(INSTALL_LIBDIR) install -p -m 0644 $(INSTALL_LIBS) $(INSTALL_LIBDIR) - @mkdir -p $(INSTALL_INCDIR)/wolfsentry + $(Q)mkdir -p $(INSTALL_INCDIR)/wolfsentry install -p -m 0644 $(INSTALL_HEADERS) $(INSTALL_INCDIR)/wolfsentry .PHONY: uninstall @@ -431,11 +434,11 @@ endif .PHONY: dist dist: - @if [[ ! -d "$(SRC_TOP)/.git" ]]; then echo 'dist target requires git artifacts.' 1>&2; exit 1; fi + $(Q)if [[ ! -d "$(SRC_TOP)/.git" ]]; then echo 'dist target requires git artifacts.' 1>&2; exit 1; fi ifndef VERY_QUIET - @echo "generating dist archive wolfsentry-$(VERSION).tgz" + $(Q)echo "generating dist archive wolfsentry-$(VERSION).tgz" endif - @DEST_DIR="$$PWD"; \ + $(Q)DEST_DIR="$$PWD"; \ cd $(SRC_TOP); \ if [[ "$(VERSION)" =~ -dirty$$ ]]; then \ if [[ -n "$$(git ls-files -d)" ]]; then \ @@ -449,21 +452,21 @@ endif fi dist-test: dist - @rm -rf $(BUILD_TOP)/dist-test - @mkdir -p $(BUILD_TOP)/dist-test + $(Q)rm -rf $(BUILD_TOP)/dist-test + $(Q)mkdir -p $(BUILD_TOP)/dist-test ifdef VERY_QUIET - @DEST_DIR="$$PWD" && cd $(BUILD_TOP)/dist-test && $(TAR) -xf "$${DEST_DIR}/wolfsentry-$(VERSION).tgz" && cd wolfsentry-$(VERSION) && $(MAKE) --quiet test + $(Q)DEST_DIR="$$PWD" && cd $(BUILD_TOP)/dist-test && $(TAR) -xf "$${DEST_DIR}/wolfsentry-$(VERSION).tgz" && cd wolfsentry-$(VERSION) && $(MAKE) --quiet test else - @DEST_DIR="$$PWD" && cd $(BUILD_TOP)/dist-test && $(TAR) -xf "$${DEST_DIR}/wolfsentry-$(VERSION).tgz" && cd wolfsentry-$(VERSION) && $(MAKE) test + $(Q)DEST_DIR="$$PWD" && cd $(BUILD_TOP)/dist-test && $(TAR) -xf "$${DEST_DIR}/wolfsentry-$(VERSION).tgz" && cd wolfsentry-$(VERSION) && $(MAKE) test endif dist-test-clean: - @DEST_DIR="$$PWD" && [ -d $(BUILD_TOP)/dist-test/wolfsentry-$(VERSION) ] && [ -f $${DEST_DIR}/wolfsentry-$(VERSION).tgz ] && cd $(BUILD_TOP)/dist-test && $(TAR) -tf $${DEST_DIR}/wolfsentry-$(VERSION).tgz | grep -E -v '/$$' | xargs $(RM) -f - @[ -d $(BUILD_TOP)/dist-test/wolfsentry-$(VERSION) ] && $(MAKE) $(EXTRA_MAKE_FLAGS) -f $(THIS_MAKEFILE) BUILD_TOP=$(BUILD_TOP)/dist-test/wolfsentry-$(VERSION) clean && rmdir $(BUILD_TOP)/dist-test + $(Q)DEST_DIR="$$PWD" && [ -d $(BUILD_TOP)/dist-test/wolfsentry-$(VERSION) ] && [ -f $${DEST_DIR}/wolfsentry-$(VERSION).tgz ] && cd $(BUILD_TOP)/dist-test && $(TAR) -tf $${DEST_DIR}/wolfsentry-$(VERSION).tgz | grep -E -v '/$$' | xargs $(RM) -f + $(Q)[ -d $(BUILD_TOP)/dist-test/wolfsentry-$(VERSION) ] && $(MAKE) $(EXTRA_MAKE_FLAGS) -f $(THIS_MAKEFILE) BUILD_TOP=$(BUILD_TOP)/dist-test/wolfsentry-$(VERSION) clean && rmdir $(BUILD_TOP)/dist-test CLEAN_RM_ARGS = -f $(BUILD_TOP)/.build_params $(BUILD_TOP)/wolfsentry/wolfsentry_options.h $(BUILD_TOP)/.tested $(addprefix $(BUILD_TOP)/src/,$(SRCS:.c=.o)) $(addprefix $(BUILD_TOP)/src/,$(SRCS:.c=.So)) $(addprefix $(BUILD_TOP)/src/,$(SRCS:.c=.d)) $(addprefix $(BUILD_TOP)/src/,$(SRCS:.c=.Sd)) $(addprefix $(BUILD_TOP)/src/,$(SRCS:.c=.gcno)) $(addprefix $(BUILD_TOP)/src/,$(SRCS:.c=.gcda)) $(BUILD_TOP)/$(LIB_NAME) $(BUILD_TOP)/$(DYNLIB_NAME) $(addprefix $(BUILD_TOP)/tests/,$(UNITTEST_LIST)) $(addprefix $(BUILD_TOP)/tests/,$(UNITTEST_LIST_SHARED)) $(addprefix $(BUILD_TOP)/tests/,$(addsuffix .d,$(UNITTEST_LIST))) $(addprefix $(BUILD_TOP)/tests/,$(addsuffix .d,$(UNITTEST_LIST_SHARED))) $(ANALYZER_BUILD_ARTIFACTS) -DOXYGEN_PREDEFINED := WOLFSENTRY_THREADSAFE WOLFSENTRY_PROTOCOL_NAMES WOLFSENTRY_HAVE_JSON_DOM WOLFSENTRY_ERROR_STRINGS LWIP_PACKET_FILTER_API __GNUC__=4 WOLFSENTRY_HAVE_GNU_ATOMICS WOLFSENTRY_NO_INLINE WOLFSENTRY_FOR_DOXYGEN attr_align_to(x)= +DOXYGEN_PREDEFINED := WOLFSENTRY_THREADSAFE WOLFSENTRY_PROTOCOL_NAMES WOLFSENTRY_HAVE_JSON_DOM WOLFSENTRY_ERROR_STRINGS LWIP_PACKET_FILTER_API NETXDUO_PACKET_FILTER_API __GNUC__=4 WOLFSENTRY_HAVE_GNU_ATOMICS WOLFSENTRY_NO_INLINE WOLFSENTRY_FOR_DOXYGEN attr_align_to(x)= DOXYGEN_EXPAND_AS_DEFINED := WOLFSENTRY_SOCKADDR_MEMBERS WOLFSENTRY_FLEXIBLE_ARRAY_SIZE attr_align_to DOXYGEN_EXCLUDE := wolfsentry/wolfsentry_options.h @@ -473,8 +476,8 @@ README_FOR_FULL_MANUAL_RECIPE = grep -v -E -e 'doc/[-_[:alnum:]]+\.md|ChangeLog\ .PHONY: doc-html doc-html: - @command -v doxygen >/dev/null || doxygen - @mkdir -p '$(BUILD_TOP)/doc' && \ + $(Q)command -v doxygen >/dev/null || doxygen + $(Q)mkdir -p '$(BUILD_TOP)/doc' && \ RELEASE_PER_HEADERS=$$($(PRINT_VERSION_RECIPE)) && \ cd '$(BUILD_TOP)/doc' && \ rm -rf html && \ @@ -491,13 +494,13 @@ doc-html: .PHONY: doc-html-clean doc-html-clean: - @rm -rf '$(BUILD_TOP)/doc/html' + $(Q)rm -rf '$(BUILD_TOP)/doc/html' $(BUILD_TOP)/doc/pdf/refman.pdf: $(addprefix $(SRC_TOP)/, $(filter-out %/wolfsentry_options.h,$(INSTALL_HEADERS)) ChangeLog.md README.md doc/freertos-lwip-app.md doc/json_configuration.md) - @command -v doxygen >/dev/null || doxygen - @command -v pdflatex >/dev/null || pdflatex - @command -v makeindex >/dev/null || makeindex - @mkdir -p '$(BUILD_TOP)/doc' && \ + $(Q)command -v doxygen >/dev/null || doxygen + $(Q)command -v pdflatex >/dev/null || pdflatex + $(Q)command -v makeindex >/dev/null || makeindex + $(Q)mkdir -p '$(BUILD_TOP)/doc' && \ RELEASE_PER_HEADERS=$$($(PRINT_VERSION_RECIPE)) && \ cd '$(BUILD_TOP)/doc' && \ rm -rf pdf && \ @@ -521,7 +524,7 @@ doc-pdf: $(BUILD_TOP)/doc/pdf/refman.pdf .PHONY: doc-pdf-clean doc-pdf-clean: - @rm -rf '$(BUILD_TOP)/doc/pdf' + $(Q)rm -rf '$(BUILD_TOP)/doc/pdf' doc: doc-html $(BUILD_TOP)/doc/pdf/refman.pdf @@ -529,15 +532,11 @@ doc-clean: doc-html-clean doc-pdf-clean .PHONY: clean clean: -ifeq "$(V)" "1" - rm $(CLEAN_RM_ARGS) -else - @rm $(CLEAN_RM_ARGS) -endif - @rm -rf $(addsuffix .dSYM,$(addprefix $(BUILD_TOP)/tests/,$(UNITTEST_LIST) $(UNITTEST_LIST_SHARED))) - @[[ -d "$(BUILD_TOP)/wolfsentry" && ! "$(BUILD_TOP)" -ef "$(SRC_TOP)" ]] && find $(BUILD_TOP)/{src,tests,ports,lwip,wolfsentry,examples,scripts,FreeRTOS,.github,doc} -depth -type d -print0 2>/dev/null | xargs -0 rmdir && rmdir "${BUILD_TOP}" || exit 0 + $(Q)rm $(CLEAN_RM_ARGS) + $(Q)rm -rf $(addsuffix .dSYM,$(addprefix $(BUILD_TOP)/tests/,$(UNITTEST_LIST) $(UNITTEST_LIST_SHARED))) + $(Q)[[ -d "$(BUILD_TOP)/wolfsentry" && ! "$(BUILD_TOP)" -ef "$(SRC_TOP)" ]] && find $(BUILD_TOP)/{src,tests,ports,lwip,wolfsentry,examples,scripts,FreeRTOS,.github,doc} -depth -type d -print0 2>/dev/null | xargs -0 rmdir && rmdir "${BUILD_TOP}" || exit 0 ifndef VERY_QUIET - @echo 'cleaned all targets and ephemera in $(BUILD_TOP)' + $(Q)echo 'cleaned all targets and ephemera in $(BUILD_TOP)' endif -include $(SRC_TOP)/Makefile.analyzers diff --git a/README.md b/README.md index 521bbce..5fba952 100644 --- a/README.md +++ b/README.md @@ -115,7 +115,7 @@ topic. | `DEBUG` | | Compiler debugging flag to use (default `-ggdb`) | | `OPTIM` | | The optimizer flag to use (default `-O3`) | | `HOST` | | The target host tuple, for cross-compilation (default unset, i.e. native targeting) | -| `RUNTIME` | | The target runtime ecosystem -- default unset, `FreeRTOS-lwIP` and `Linux-lwIP` are recognized | +| `RUNTIME` | | The target runtime ecosystem -- default unset, `FreeRTOS-lwIP`, `Linux-lwIP` and `ThreadX-NetXDuo` are recognized | | `C_WARNFLAGS` | | The warning flags to use (overriding the generally applicable defaults) | | `STATIC` | | Build statically linked unit tests | | `STRIPPED` | | Strip binaries of debugging symbols | diff --git a/src/json/load_config.c b/src/json/load_config.c index 4574d3a..7a03213 100644 --- a/src/json/load_config.c +++ b/src/json/load_config.c @@ -33,6 +33,8 @@ #ifdef WOLFSENTRY_LWIP #include "lwip/sockets.h" +#elif defined(WOLFSENTRY_NETXDUO) +#include "wolfsentry/wolfsentry_netxduo.h" #else #include #include @@ -1294,7 +1296,7 @@ static wolfsentry_errcode_t handle_user_value_clause(struct wolfsentry_json_proc WOLFSENTRY_ERROR_RERETURN(ret); case JSON_FALSE: ret = wolfsentry_user_value_store_bool( - JPS_WOLFSENTRY_CONTEXT_ARGS_OUT, + JPS_WOLFSENTRY_CONTEXT_ARGS_OUT, jps->cur_keyname, WOLFSENTRY_LENGTH_NULL_TERMINATED, WOLFSENTRY_KV_FALSE, @@ -1303,7 +1305,7 @@ static wolfsentry_errcode_t handle_user_value_clause(struct wolfsentry_json_proc WOLFSENTRY_ERROR_RERETURN(ret); case JSON_TRUE: ret = wolfsentry_user_value_store_bool( - JPS_WOLFSENTRY_CONTEXT_ARGS_OUT, + JPS_WOLFSENTRY_CONTEXT_ARGS_OUT, jps->cur_keyname, WOLFSENTRY_LENGTH_NULL_TERMINATED, WOLFSENTRY_KV_TRUE, @@ -1316,7 +1318,7 @@ static wolfsentry_errcode_t handle_user_value_clause(struct wolfsentry_json_proc if ((ret = convert_sint64(json_type, data, data_size, &i)) < 0) break; ret = wolfsentry_user_value_store_sint( - JPS_WOLFSENTRY_CONTEXT_ARGS_OUT, + JPS_WOLFSENTRY_CONTEXT_ARGS_OUT, jps->cur_keyname, WOLFSENTRY_LENGTH_NULL_TERMINATED, i, @@ -1327,7 +1329,7 @@ static wolfsentry_errcode_t handle_user_value_clause(struct wolfsentry_json_proc if ((ret = convert_double(json_type, data, data_size, &d)) < 0) WOLFSENTRY_ERROR_RERETURN(ret); ret = wolfsentry_user_value_store_double( - JPS_WOLFSENTRY_CONTEXT_ARGS_OUT, + JPS_WOLFSENTRY_CONTEXT_ARGS_OUT, jps->cur_keyname, WOLFSENTRY_LENGTH_NULL_TERMINATED, d, @@ -1339,7 +1341,7 @@ static wolfsentry_errcode_t handle_user_value_clause(struct wolfsentry_json_proc if (data_size >= WOLFSENTRY_KV_MAX_VALUE_BYTES) WOLFSENTRY_ERROR_RETURN(STRING_ARG_TOO_LONG); ret = wolfsentry_user_value_store_string( - JPS_WOLFSENTRY_CONTEXT_ARGS_OUT, + JPS_WOLFSENTRY_CONTEXT_ARGS_OUT, jps->cur_keyname, WOLFSENTRY_LENGTH_NULL_TERMINATED, (const char *)data, @@ -1454,7 +1456,7 @@ static wolfsentry_errcode_t handle_user_value_clause(struct wolfsentry_json_proc if ((ret = convert_sint64(json_type, data, data_size, &i)) < 0) WOLFSENTRY_ERROR_RERETURN(ret); WOLFSENTRY_ERROR_RERETURN(wolfsentry_user_value_store_sint( - JPS_WOLFSENTRY_CONTEXT_ARGS_OUT, + JPS_WOLFSENTRY_CONTEXT_ARGS_OUT, jps->o_u_c.user_value.label, jps->o_u_c.user_value.label_len, i, @@ -1465,7 +1467,7 @@ static wolfsentry_errcode_t handle_user_value_clause(struct wolfsentry_json_proc if ((ret = convert_double(json_type, data, data_size, &d)) < 0) WOLFSENTRY_ERROR_RERETURN(ret); WOLFSENTRY_ERROR_RERETURN(wolfsentry_user_value_store_double( - JPS_WOLFSENTRY_CONTEXT_ARGS_OUT, + JPS_WOLFSENTRY_CONTEXT_ARGS_OUT, jps->o_u_c.user_value.label, jps->o_u_c.user_value.label_len, d, @@ -1475,7 +1477,7 @@ static wolfsentry_errcode_t handle_user_value_clause(struct wolfsentry_json_proc if (data_size >= WOLFSENTRY_KV_MAX_VALUE_BYTES) WOLFSENTRY_ERROR_RETURN(STRING_ARG_TOO_LONG); WOLFSENTRY_ERROR_RERETURN(wolfsentry_user_value_store_string( - JPS_WOLFSENTRY_CONTEXT_ARGS_OUT, + JPS_WOLFSENTRY_CONTEXT_ARGS_OUT, jps->o_u_c.user_value.label, jps->o_u_c.user_value.label_len, (const char *)data, @@ -1486,7 +1488,7 @@ static wolfsentry_errcode_t handle_user_value_clause(struct wolfsentry_json_proc if (data_size >= WOLFSENTRY_KV_MAX_VALUE_BYTES) WOLFSENTRY_ERROR_RETURN(STRING_ARG_TOO_LONG); WOLFSENTRY_ERROR_RERETURN(wolfsentry_user_value_store_bytes_base64( - JPS_WOLFSENTRY_CONTEXT_ARGS_OUT, + JPS_WOLFSENTRY_CONTEXT_ARGS_OUT, jps->o_u_c.user_value.label, jps->o_u_c.user_value.label_len, (const char *)data, diff --git a/src/routes.c b/src/routes.c index 6a5b5d7..19d62c2 100644 --- a/src/routes.c +++ b/src/routes.c @@ -22,8 +22,6 @@ #define WOLFSENTRY_SOURCE_ID WOLFSENTRY_SOURCE_ID_ROUTES_C -#include "wolfsentry_internal.h" - #ifndef WOLFSENTRY_NO_ALLOCA #include #endif @@ -31,6 +29,8 @@ #ifdef WOLFSENTRY_LWIP #include #include +#elif defined(WOLFSENTRY_NETXDUO) +#include "wolfsentry/wolfsentry_netxduo.h" #else #include #include @@ -40,6 +40,8 @@ #include #endif +#include "wolfsentry_internal.h" + static inline int cmp_addrs_prefixful( const byte *left_addr, int left_addr_len, diff --git a/src/wolfsentry_util.c b/src/wolfsentry_util.c index ac1ed94..be01b60 100644 --- a/src/wolfsentry_util.c +++ b/src/wolfsentry_util.c @@ -1509,6 +1509,73 @@ static int freertos_sem_destroy( sem_t * sem ) #define sem_destroy freertos_sem_destroy +#elif defined(THREADX) + + #ifndef ETIMEDOUT + #define ETIMEDOUT 110 /* Connection timed out */ + #endif + + #define sem_init threadx_sem_init + static int threadx_sem_init( sem_t * sem, + int pshared, + unsigned value ) + { + (void)pshared; + if (tx_semaphore_create(sem, NULL, value) != TX_SUCCESS) { + errno = EINVAL; + WOLFSENTRY_RETURN_VALUE(-1); + } + WOLFSENTRY_RETURN_VALUE(0); + } + #define sem_post threadx_sem_post + static int threadx_sem_post( sem_t * sem ) + { + if (tx_semaphore_put(sem) != TX_SUCCESS) { + errno = EINVAL; + WOLFSENTRY_RETURN_VALUE(-1); + } + WOLFSENTRY_RETURN_VALUE(0); + } + #define sem_timedwait threadx_sem_timedwait + static int threadx_sem_timedwait( sem_t * sem, + const struct timespec * abstime ) + { + if (tx_semaphore_get(sem, (uint32_t)(TX_TICK_TIME_MS * + (abstime->tv_sec * 1000) + (abstime->tv_nsec / 1000000))) != TX_SUCCESS) { + errno = EINVAL; + WOLFSENTRY_RETURN_VALUE(-1); + } + WOLFSENTRY_RETURN_VALUE(0); + } + #define sem_wait threadx_sem_wait + static int threadx_sem_wait( sem_t * sem ) + { + if (tx_semaphore_get(sem, TX_WAIT_FOREVER) != TX_SUCCESS) { + errno = EINVAL; + WOLFSENTRY_RETURN_VALUE(-1); + } + WOLFSENTRY_RETURN_VALUE(0); + } + #define sem_trywait threadx_sem_trywait + static int threadx_sem_trywait( sem_t * sem ) + { + if (tx_semaphore_get(sem, TX_NO_WAIT) != TX_SUCCESS) { + errno = EINVAL; + WOLFSENTRY_RETURN_VALUE(-1); + } + WOLFSENTRY_RETURN_VALUE(0); + } + static int threadx_sem_destroy( sem_t * sem ) + { + if (tx_semaphore_delete(sem) != TX_SUCCESS) { + errno = EINVAL; + WOLFSENTRY_RETURN_VALUE(-1); + } + WOLFSENTRY_RETURN_VALUE(0); + } + + #define sem_destroy threadx_sem_destroy + #else #error Semaphore builtins not implemented for target -- build wolfSentry with -DWOLFSENTRY_NO_SEM_BUILTIN, and supply semaphore implementation with struct wolfsentry_host_platform_interface argument to wolfsentry_init(). @@ -2847,7 +2914,7 @@ WOLFSENTRY_API wolfsentry_errcode_t wolfsentry_lock_shared2mutex_abstimed(struct WOLFSENTRY_ERROR_RETURN(SYS_OP_FATAL); } } - } else + } else ret = sem_timedwait(&lock->sem_read2write_waiters, abs_timeout); if (ret < 0) { @@ -3317,6 +3384,19 @@ static wolfsentry_errcode_t wolfsentry_builtin_get_time(void *context, wolfsentr WOLFSENTRY_RETURN_OK; } +#elif defined(THREADX) + +static wolfsentry_errcode_t wolfsentry_builtin_get_time(void *context, wolfsentry_time_t *now) { + struct timespec ts; + uint32_t tick_count; + (void)context; + tick_count = tx_time_get(); + ts.tv_sec = (long)tick_count / TX_TICK_TIME_MS; + ts.tv_nsec = (long)(tick_count % TX_TICK_TIME_MS) * 1000000; + *now = ((wolfsentry_time_t)ts.tv_sec * (wolfsentry_time_t)1000000) + ((wolfsentry_time_t)ts.tv_nsec / (wolfsentry_time_t)1000); + WOLFSENTRY_RETURN_OK; +} + #else #include diff --git a/tests/unittests.c b/tests/unittests.c index 27e0d6a..da1b722 100644 --- a/tests/unittests.c +++ b/tests/unittests.c @@ -69,6 +69,13 @@ int lwip_inet_pton(int af, const char *src, void *dst) { #endif /* !TEST_LWIP */ +#elif defined(WOLFSENTRY_NETXDUO) + +#include "nxd_bsd.h" +/* undef OK this conflicts with the _OK macros in wolfsentry_errcodes.h */ +#undef OK + + #else /* !WOLFSENTRY_LWIP */ #include diff --git a/wolfsentry/wolfsentry.h b/wolfsentry/wolfsentry.h index 7ef3545..7dabd2a 100644 --- a/wolfsentry/wolfsentry.h +++ b/wolfsentry/wolfsentry.h @@ -85,9 +85,9 @@ typedef enum { /*! @endcond */ #endif -#include -#include -#include +#include "wolfsentry/wolfsentry_settings.h" +#include "wolfsentry/wolfsentry_af.h" +#include "wolfsentry/wolfsentry_errcodes.h" struct wolfsentry_allocator; struct wolfsentry_context; @@ -3012,7 +3012,7 @@ WOLFSENTRY_API wolfsentry_errcode_t wolfsentry_event_action_list_done( /*! @} (end wolfsentry_event) */ #ifdef WOLFSENTRY_HAVE_JSON_DOM -#include +#include "wolfsentry/centijson_dom.h" #endif /*! \addtogroup wolfsentry_kv @@ -3345,7 +3345,7 @@ WOLFSENTRY_API int wolfsentry_inet6_ntoa(const byte *addr, unsigned int addr_bit (((((len)+3)/4)*3) - ((len) > 1 ? \ ((buf)[(len)-1] == '=') : \ 0) \ - - ((len) > 2 ? ((buf)[(len)-2] == '=') : 0)) \ + - ((len) > 2 ? ((buf)[(len)-2] == '=') : 0)) /*!< \brief Given valid base64 string `buf` of length `len`, evaluates to the exact decoded length. @hideinitializer */ WOLFSENTRY_API wolfsentry_errcode_t wolfsentry_base64_decode( @@ -3362,10 +3362,18 @@ WOLFSENTRY_API wolfsentry_errcode_t wolfsentry_base64_decode( #include "wolfsentry/wolfsentry_lwip.h" #endif +#ifdef WOLFSENTRY_NETXDUO + #include "wolfsentry/wolfsentry_netxduo.h" +#endif + /* conditionally include wolfsentry_util.h last -- none of the above rely on it. */ #ifndef WOLFSENTRY_NO_UTIL_H -#include +#include "wolfsentry/wolfsentry_util.h" +#endif + +#ifdef WOLFSENTRY_HAVE_JSON_DOM +#include "wolfsentry/wolfsentry_json.h" #endif #endif /* WOLFSENTRY_H */ diff --git a/wolfsentry/wolfsentry_errcodes.h b/wolfsentry/wolfsentry_errcodes.h index 65c31b5..f65241b 100644 --- a/wolfsentry/wolfsentry_errcodes.h +++ b/wolfsentry/wolfsentry_errcodes.h @@ -39,7 +39,7 @@ #endif typedef int32_t wolfsentry_errcode_t; /*!< \brief The structured result code type for wolfSentry. It encodes a failure or success code, a source code file ID, and a line number. */ -#ifdef FREERTOS +#if defined(FREERTOS) || defined(THREADX) #define WOLFSENTRY_ERRCODE_FMT "%d" #elif defined(PRId32) #define WOLFSENTRY_ERRCODE_FMT "%" PRId32 @@ -143,7 +143,7 @@ static inline int WOLFSENTRY_ERROR_DECODE_LINE_NUMBER(wolfsentry_errcode_t x) { #define WOLFSENTRY_ERROR_ENCODE(name) WOLFSENTRY_ERROR_ENCODE_0(WOLFSENTRY_ERROR_ID_ ## name) /*!< \brief Compute a `wolfsentry_errcode_t` encoding the current source ID and line number, and the designated short-form error `name` (e.g. `INVALID_ARG`). @hideinitializer */ -#define WOLFSENTRY_SUCCESS_ENCODE(x) WOLFSENTRY_ERROR_ENCODE_0(WOLFSENTRY_SUCCESS_ID_ ## x) +#define WOLFSENTRY_SUCCESS_ENCODE(name) WOLFSENTRY_ERROR_ENCODE_0(WOLFSENTRY_SUCCESS_ID_ ## name) /*!< \brief Compute a `wolfsentry_errcode_t` encoding the current source ID and line number, and the designated short-form success `name` (e.g. `OK`). @hideinitializer */ #ifdef WOLFSENTRY_FOR_DOXYGEN @@ -337,7 +337,9 @@ WOLFSENTRY_API const char *wolfsentry_errcode_error_name(wolfsentry_errcode_t e) #if !defined(WOLFSENTRY_NO_STDIO_STREAMS) && !defined(WOLFSENTRY_NO_DIAG_MSGS) +#ifndef WOLFSENTRY_NETXDUO /* netxduo has its own errno.h */ #include +#endif #ifdef __STRICT_ANSI__ #define WOLFSENTRY_WARN(fmt,...) WOLFSENTRY_PRINTF_ERR("%s@L%d " fmt, __FILE__, __LINE__, __VA_ARGS__) diff --git a/wolfsentry/wolfsentry_netxduo.h b/wolfsentry/wolfsentry_netxduo.h new file mode 100644 index 0000000..5312af5 --- /dev/null +++ b/wolfsentry/wolfsentry_netxduo.h @@ -0,0 +1,70 @@ +/* + * wolfsentry/wolfsentry_netxduo.h + * + * Copyright (C) 2021-2025 wolfSSL Inc. + * + * This file is part of wolfSentry. + * + * wolfSentry is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * wolfSentry is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ + +#ifndef _WOLFSENTRY_NETXDUO_H +#define _WOLFSENTRY_NETXDUO_H + +#ifdef NEED_THREADX_TYPES +#include "types.h" +#endif +#include "nx_api.h" + +#ifndef AF_INET +#define AF_INET 2 /* IPv4 socket (UDP, TCP, etc) */ +#endif +#ifndef AF_INET6 +#define AF_INET6 3 /* IPv6 socket (UDP, TCP, etc) */ +#endif + +#ifndef IPPROTO_TCP +#define IPPROTO_TCP 6 /* TCP Socket */ +#endif +#ifndef IPPROTO_UDP +#define IPPROTO_UDP 17 /* TCP Socket */ +#endif +#ifndef IPPROTO_ICMP +#define IPPROTO_ICMP 1 +#endif + +#ifndef in_addr +struct nx_bsd_in_addr { + ULONG s_addr; /* Internet address (32 bits) */ +}; +#define in_addr nx_bsd_in_addr +#endif + +#ifndef in6_addr +struct nx_bsd_in6_addr { + union { + UCHAR _S6_u8[16]; + ULONG _S6_u32[4]; + } _S6_un; +}; +#define in6_addr nx_bsd_in6_addr +#endif + +#ifndef socklen_t +typedef ULONG nx_bsd_socklen_t; +#define socklen_t nx_bsd_socklen_t +#endif + +#endif /* _WOLFSENTRY_NETXDUO_H */ diff --git a/wolfsentry/wolfsentry_settings.h b/wolfsentry/wolfsentry_settings.h index 28fbeab..6670084 100644 --- a/wolfsentry/wolfsentry_settings.h +++ b/wolfsentry/wolfsentry_settings.h @@ -110,6 +110,20 @@ #endif #endif +#ifdef THREADX + #ifdef NEED_THREADX_TYPES + #include + #include + #endif + #include + + #if !defined(SIZE_T_32) && !defined(SIZE_T_64) + /* size_t is "unsigned int" by default */ + #define SIZE_T_32 + #endif +#endif + + /*! \addtogroup wolfsentry_init * @{ */ @@ -193,13 +207,13 @@ #endif #ifndef WOLFSENTRY_USE_NONPOSIX_SEMAPHORES - #if defined(__MACH__) || defined(FREERTOS) || defined(_WIN32) + #if defined(__MACH__) || defined(FREERTOS) || defined(_WIN32) || defined(THREADX) #define WOLFSENTRY_USE_NONPOSIX_SEMAPHORES #endif #endif #ifndef WOLFSENTRY_USE_NONPOSIX_THREADS - #if defined(FREERTOS) || defined(_WIN32) + #if defined(FREERTOS) || defined(_WIN32) || defined(THREADX) #define WOLFSENTRY_USE_NONPOSIX_THREADS #endif #endif @@ -543,6 +557,10 @@ typedef uint16_t wolfsentry_priority_t; #define sem_t StaticSemaphore_t +#elif defined(THREADX) + +#define sem_t TX_SEMAPHORE + #else /*! @} */ @@ -589,6 +607,8 @@ typedef uint16_t wolfsentry_priority_t; typedef pthread_t wolfsentry_thread_id_t; #elif defined(FREERTOS) typedef TaskHandle_t wolfsentry_thread_id_t; + #elif defined(THREADX) + typedef TX_THREAD* wolfsentry_thread_id_t; #else #error Must supply WOLFSENTRY_THREAD_ID_T for WOLFSENTRY_THREADSAFE on non-POSIX targets. #endif @@ -598,6 +618,8 @@ typedef uint16_t wolfsentry_priority_t; #define WOLFSENTRY_THREAD_GET_ID_HANDLER pthread_self #elif defined(FREERTOS) #define WOLFSENTRY_THREAD_GET_ID_HANDLER xTaskGetCurrentTaskHandle + #elif defined(THREADX) + #define WOLFSENTRY_THREAD_GET_ID_HANDLER tx_thread_identify #else #error Must supply WOLFSENTRY_THREAD_GET_ID_HANDLER for WOLFSENTRY_THREADSAFE on non-POSIX targets. #endif @@ -752,7 +774,8 @@ enum wolfsentry_build_flags { WOLFSENTRY_CONFIG_FLAG_LWIP = (1U << 11U), WOLFSENTRY_CONFIG_FLAG_SHORT_ENUMS = (1U << 12U), WOLFSENTRY_CONFIG_FLAG_ADDR_BITMASKS = (1U << 13U), - WOLFSENTRY_CONFIG_FLAG_MAX = WOLFSENTRY_CONFIG_FLAG_ADDR_BITMASKS, + WOLFSENTRY_CONFIG_FLAG_NETXDUO = (1U << 14U), + WOLFSENTRY_CONFIG_FLAG_MAX = WOLFSENTRY_CONFIG_FLAG_NETXDUO, WOLFSENTRY_CONFIG_FLAG_ENDIANNESS_ZERO = (0U << 31U) }; @@ -836,6 +859,12 @@ struct wolfsentry_build_settings { #define _WOLFSENTRY_CONFIG_FLAG_VALUE_LWIP 0 #endif +#ifdef WOLFSENTRY_NETXDUO + #define _WOLFSENTRY_CONFIG_FLAG_VALUE_NETXDUO WOLFSENTRY_CONFIG_FLAG_NETXDUO +#else + #define _WOLFSENTRY_CONFIG_FLAG_VALUE_NETXDUO 0 +#endif + /* with compilers that can't evaluate the below expression as a compile-time * constant, WOLFSENTRY_SHORT_ENUMS can be defined in user settings to 0 or * 1 to avoid the dependency. @@ -872,6 +901,7 @@ struct wolfsentry_build_settings { _WOLFSENTRY_CONFIG_FLAG_VALUE_HAVE_JSON_DOM | \ _WOLFSENTRY_CONFIG_FLAG_VALUE_DEBUG_CALL_TRACE | \ _WOLFSENTRY_CONFIG_FLAG_VALUE_LWIP | \ + _WOLFSENTRY_CONFIG_FLAG_VALUE_NETXDUO | \ _WOLFSENTRY_CONFIG_FLAG_VALUE_SHORT_ENUMS | \ _WOLFSENTRY_CONFIG_FLAG_VALUE_ADDR_BITMASKS) diff --git a/wolfsentry/wolfsentry_util.h b/wolfsentry/wolfsentry_util.h index 4ef4dae..ea9c9e9 100644 --- a/wolfsentry/wolfsentry_util.h +++ b/wolfsentry/wolfsentry_util.h @@ -165,13 +165,79 @@ #define WOLFSENTRY_ATOMIC_CMPXCHG(ptr, expected, desired, weak_p, success_memorder, failure_memorder) __atomic_compare_exchange_n(ptr, expected, desired, weak_p, success_memorder, failure_memorder) /*!< \brief Sets `*ptr` to `desired` and returns true iff `*ptr` has the value `*expected`, otherwise sets `*expected` to the actual value of `*ptr` and returns false. @hideinitializer */ +#elif defined(THREADX) + +/* ThreadX atomic operation implementations */ +#include "tx_api.h" + +/* ThreadX interrupt control for atomic operations */ +#define WOLFSENTRY_ATOMIC_INCREMENT(i, x) ({ \ + UINT posture = tx_interrupt_control(TX_INT_DISABLE); \ + __typeof__(i) result = (i) + (x); \ + (i) = result; \ + (void)tx_interrupt_control(posture); \ + result; \ +}) + +#define WOLFSENTRY_ATOMIC_DECREMENT(i, x) ({ \ + UINT posture = tx_interrupt_control(TX_INT_DISABLE); \ + __typeof__(i) result = (i) - (x); \ + (i) = result; \ + (void)tx_interrupt_control(posture); \ + result; \ +}) + +#define WOLFSENTRY_ATOMIC_POSTINCREMENT(i, x) ({ \ + UINT posture = tx_interrupt_control(TX_INT_DISABLE); \ + __typeof__(i) old_val = (i); \ + (i) += (x); \ + (void)tx_interrupt_control(posture); \ + old_val; \ +}) + +#define WOLFSENTRY_ATOMIC_POSTDECREMENT(i, x) ({ \ + UINT posture = tx_interrupt_control(TX_INT_DISABLE); \ + __typeof__(i) old_val = (i); \ + (i) -= (x); \ + (void)tx_interrupt_control(posture); \ + old_val; \ +}) + +#define WOLFSENTRY_ATOMIC_STORE(i, x) ({ \ + UINT posture = tx_interrupt_control(TX_INT_DISABLE); \ + (i) = (x); \ + (void)tx_interrupt_control(posture); \ + (i); \ +}) + +#define WOLFSENTRY_ATOMIC_LOAD(i) ({ \ + UINT posture = tx_interrupt_control(TX_INT_DISABLE); \ + __typeof__(i) val = (i); \ + (void)tx_interrupt_control(posture); \ + val; \ +}) + +#define WOLFSENTRY_ATOMIC_CMPXCHG(ptr, expected, desired, weak_p, success_memorder, failure_memorder) ({ \ + UINT posture = tx_interrupt_control(TX_INT_DISABLE); \ + int result = 0; \ + if (*(ptr) == *(expected)) { \ + *(ptr) = (desired); \ + result = 1; \ + } else { \ + *(expected) = *(ptr); \ + result = 0; \ + } \ + (void)tx_interrupt_control(posture); \ + result; \ +}) + #else #if !defined(WOLFSENTRY_ATOMIC_INCREMENT) || !defined(WOLFSENTRY_ATOMIC_DECREMENT) || \ !defined(WOLFSENTRY_ATOMIC_POSTINCREMENT) || !defined(WOLFSENTRY_ATOMIC_POSTDECREMENT) || \ !defined(WOLFSENTRY_ATOMIC_STORE) || !defined(WOLFSENTRY_ATOMIC_LOAD) || \ !defined(WOLFSENTRY_ATOMIC_CMPXCHG) -#error Missing required atomic implementation(s) + #error Missing required atomic implementation(s) #endif #endif /* WOLFSENTRY_HAVE_GNU_ATOMICS */