8989TAP_OBJ: =$(NETDEV_OBJ )
9090TAP_PIE_OBJ: =$(NETDEV_PIE_OBJ )
9191
92+ # Optional TFTP module. Default to off to match config.h
93+ # (WOLFIP_ENABLE_TFTP == 0); set WOLFIP_ENABLE_TFTP=1 on the command
94+ # line to compile and link the TFTP client/server objects.
95+ WOLFIP_ENABLE_TFTP ?= 0
96+ ifeq ($(WOLFIP_ENABLE_TFTP ) ,1)
97+ WOLFIP_TFTP_SRC: =$(wildcard src/tftp/* .c)
98+ WOLFIP_TFTP_OBJ: =$(patsubst src/% .c,build/% .o,$(WOLFIP_TFTP_SRC ) )
99+ WOLFIP_TFTP_PIE_OBJ: =$(patsubst src/% .c,build/pie/% .o,$(WOLFIP_TFTP_SRC ) )
100+ CFLAGS+=-DWOLFIP_ENABLE_TFTP =1
101+ else
102+ WOLFIP_TFTP_SRC: =
103+ WOLFIP_TFTP_OBJ: =
104+ WOLFIP_TFTP_PIE_OBJ: =
105+ endif
106+
92107ifeq ($(UNAME_S ) ,Darwin)
93108 BEGIN_GROUP: =
94109 END_GROUP: =
@@ -135,12 +150,15 @@ CPPCHECK_FLAGS=--enable=warning,performance,portability,missingInclude \
135150 --error-exitcode=1 --xml --xml-version=2
136151
137152OBJ =build/wolfip.o \
153+ $(WOLFIP_TFTP_OBJ ) \
138154 $(TAP_OBJ )
139155
140156IPFILTER_OBJ =build/ipfilter/wolfip.o \
157+ $(WOLFIP_TFTP_OBJ ) \
141158 $(TAP_OBJ )
142159
143160ESP_OBJ =build/esp/wolfip.o \
161+ $(WOLFIP_TFTP_OBJ ) \
144162 $(TAP_OBJ )
145163
146164HAVE_WOLFSSL: =$(shell printf "#include <wolfssl/options.h>\nint main(void) {return 0;}\n" | $(CC ) $(CFLAGS ) -x c - -c -o /dev/null 2>/dev/null && echo 1)
@@ -185,6 +203,7 @@ libtcpip.a: $(OBJ)
185203
186204libwolfip.so:CFLAGS+ =-fPIC
187205libwolfip.so : build/pie/port/posix/bsd_socket.o build/pie/wolfip.o \
206+ $(WOLFIP_TFTP_PIE_OBJ ) \
188207 $(TAP_PIE_OBJ )
189208 @mkdir -p ` dirname $@ ` || true
190209 @echo " [LD] $@ "
@@ -257,6 +276,39 @@ build/test-dns: $(OBJ) build/test/test_dhcp_dns.o
257276 @echo " [LD] $@ "
258277 @$(CC ) $(CFLAGS ) -o $@ $(BEGIN_GROUP ) $(^ ) $(LDFLAGS ) $(END_GROUP )
259278
279+ # Bidirectional TFTP interop test against tftpd-hpa / tftp-hpa.
280+ # Forces WOLFIP_ENABLE_TFTP=1 and uses a single-session server so the
281+ # default UDP socket pool can hold both the listen and the transfer
282+ # socket without raising MAX_UDPSOCKETS.
283+ build/tftp-interop/wolfip.o : src/wolfip.c
284+ @mkdir -p ` dirname $@ ` || true
285+ @echo " [CC] $< (tftp-interop)"
286+ @$(CC ) $(CFLAGS ) -DWOLFIP_ENABLE_TFTP=1 -c $< -o $@
287+
288+ build/tftp-interop/wolftftp.o : src/tftp/wolftftp.c
289+ @mkdir -p ` dirname $@ ` || true
290+ @echo " [CC] $< (tftp-interop)"
291+ @$(CC ) $(CFLAGS ) -DWOLFIP_ENABLE_TFTP=1 -DWOLFTFTP_SERVER_MAX_SESSIONS=1 \
292+ -c $< -o $@
293+
294+ build/test/test_tftp_interop.o : src/test/test_tftp_interop.c
295+ @mkdir -p ` dirname $@ ` || true
296+ @echo " [CC] $<"
297+ @$(CC ) $(CFLAGS ) -DWOLFIP_ENABLE_TFTP=1 -DWOLFTFTP_SERVER_MAX_SESSIONS=1 \
298+ -c $< -o $@
299+
300+ build/test-tftp-interop : build/tftp-interop/wolfip.o \
301+ build/tftp-interop/wolftftp.o $(TAP_OBJ ) \
302+ build/test/test_tftp_interop.o
303+ @echo " [LD] $@ "
304+ @$(CC ) $(CFLAGS ) -o $@ $(BEGIN_GROUP ) $(^ ) $(LDFLAGS ) $(END_GROUP )
305+
306+ .PHONY : tftp-interop-test
307+ tftp-interop-test : build/test-tftp-interop
308+ @echo " [RUN] $< (requires root, tftpd-hpa and tftp-hpa)"
309+ @sudo -n true > /dev/null 2>&1 || { echo " tftp-interop-test needs to run as root (sudo)" ; exit 1; }
310+ @sudo ./build/test-tftp-interop all
311+
260312build/tcpecho : $(OBJ ) build/port/posix/bsd_socket.o build/test/tcp_echo.o
261313 @echo " [LD] $@ "
262314 @$(CC ) $(CFLAGS ) -o $@ $(BEGIN_GROUP ) $(^ ) $(LDFLAGS ) $(END_GROUP )
@@ -321,7 +373,7 @@ build/esp-server: $(ESP_OBJ) build/port/posix/bsd_socket.o build/test/esp_server
321373 @echo " [LD] $@ "
322374 @$(CC ) $(CFLAGS ) $(ESP_CFLAGS ) $(LDFLAGS ) -o $@ $(BEGIN_GROUP ) $(^ ) -lwolfssl $(END_GROUP )
323375
324- build/test-wolfssl-forwarding : build/test/test_wolfssl_forwarding.o build/test/wolfip_forwarding.o $(TAP_OBJ ) build/port/wolfssl_io.o build/certs/server_key.o build/certs/ca_cert.o build/certs/server_cert.o
376+ build/test-wolfssl-forwarding : build/test/test_wolfssl_forwarding.o build/test/wolfip_forwarding.o $(WOLFIP_TFTP_OBJ ) $( TAP_OBJ ) build/port/wolfssl_io.o build/certs/server_key.o build/certs/ca_cert.o build/certs/server_cert.o
325377 @echo " [LD] $@ "
326378 @$(CC ) $(CFLAGS ) -o $@ $(BEGIN_GROUP ) $(^ ) $(LDFLAGS ) -lwolfssl $(END_GROUP )
327379
@@ -333,7 +385,7 @@ build/test/wolfip_forwarding.o: src/wolfip.c
333385 @$(CC ) $(CFLAGS ) -DWOLFIP_MAX_INTERFACES=2 -DWOLFIP_ENABLE_FORWARDING=1 -c $< -o $@
334386
335387build/test/test_ttl_expired.o : CFLAGS+=-DWOLFIP_MAX_INTERFACES=2 -DWOLFIP_ENABLE_FORWARDING=1
336- build/test-ttl-expired : build/test/test_ttl_expired.o build/test/wolfip_forwarding.o
388+ build/test-ttl-expired : build/test/test_ttl_expired.o build/test/wolfip_forwarding.o $( WOLFIP_TFTP_OBJ )
337389 @echo " [LD] $@ "
338390 @$(CC ) $(CFLAGS ) -o $@ $(BEGIN_GROUP ) $(^ ) $(LDFLAGS ) $(END_GROUP )
339391
@@ -386,7 +438,8 @@ UNIT_TEST_SRCS:=src/test/unit/unit.c \
386438 src/test/unit/unit_tests_tcp_ack.c \
387439 src/test/unit/unit_tests_tcp_flow.c \
388440 src/test/unit/unit_tests_proto.c \
389- src/test/unit/unit_tests_multicast.c
441+ src/test/unit/unit_tests_multicast.c \
442+ src/test/unit/unit_tests_tftp.c
390443
391444unit : build/test/unit
392445
@@ -486,27 +539,40 @@ $(COV_MCAST_UNIT): $(COV_MCAST_UNIT_O)
486539cov : unit $(COV_UNIT )
487540 @echo " [RUN] unit (coverage)"
488541 @rm -f $(COV_DIR ) /* .gcda
542+ @rm -f $(COV_DIR ) /unit-multicast $(COV_DIR ) /unit-multicast.o \
543+ $(COV_DIR ) /unit-multicast.gcno $(COV_DIR ) /unit-multicast.gcda
489544 @$(COV_UNIT )
490545 @echo " [COV] gcovr html"
491546 @mkdir -p build/coverage
492- @gcovr -r . --exclude " src/test/unit/.*" --html-details -o build/coverage/index.html
547+ @gcovr -r . --exclude " src/test/unit/.*" \
548+ --gcov-ignore-errors=no_working_dir_found \
549+ --merge-mode-functions=merge-use-line-min \
550+ --html-details -o build/coverage/index.html
493551 @$(OPEN_CMD ) build/coverage/index.html
494552
495553autocov : unit $(COV_UNIT )
496554 @echo " [RUN] unit (coverage)"
497555 @rm -f $(COV_DIR ) /* .gcda
556+ @rm -f $(COV_DIR ) /unit-multicast $(COV_DIR ) /unit-multicast.o \
557+ $(COV_DIR ) /unit-multicast.gcno $(COV_DIR ) /unit-multicast.gcda
498558 @$(COV_UNIT )
499559 @echo " [COV] gcovr html"
500560 @mkdir -p build/coverage
501- @gcovr -r . --exclude " src/test/unit/.*" --html-details -o build/coverage/index.html
561+ @gcovr -r . --exclude " src/test/unit/.*" \
562+ --gcov-ignore-errors=no_working_dir_found \
563+ --merge-mode-functions=merge-use-line-min \
564+ --html-details -o build/coverage/index.html
502565
503566autocov-multicast : unit-multicast $(COV_MCAST_UNIT )
504567 @echo " [RUN] unit multicast (coverage)"
505568 @rm -f $(COV_DIR ) /* .gcda
506569 @$(COV_MCAST_UNIT )
507570 @echo " [COV] gcovr multicast html"
508571 @mkdir -p build/coverage
509- @gcovr -r . --exclude " src/test/unit/.*" --html-details -o build/coverage/multicast.html
572+ @gcovr -r . --exclude " src/test/unit/.*" \
573+ --gcov-ignore-errors=no_working_dir_found \
574+ --merge-mode-functions=merge-use-line-min \
575+ --html-details -o build/coverage/multicast.html
510576
511577# Install dynamic library to re-link linux applications
512578#
0 commit comments