Skip to content

Commit 4a033db

Browse files
committed
freeBSD + Darwin port of examples and tests
1 parent 700f7fd commit 4a033db

File tree

19 files changed

+1009
-130
lines changed

19 files changed

+1009
-130
lines changed

.github/workflows/freebsd.yml

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
name: FreeBSD interop tests
2+
3+
on:
4+
push:
5+
branches: [ 'master', 'main', 'release/**' ]
6+
pull_request:
7+
branches: [ '*' ]
8+
9+
jobs:
10+
freebsd_test:
11+
runs-on: ubuntu-latest
12+
13+
steps:
14+
- uses: actions/checkout@v4
15+
- name: Build and run tests on FreeBSD
16+
id: test
17+
uses: vmactions/freebsd-vm@v1
18+
with:
19+
copyback: false
20+
usesh: true
21+
prepare: |
22+
set -ex
23+
env IGNORE_OSVERSION=yes pkg update -f
24+
env IGNORE_OSVERSION=yes pkg install -y gmake gcc wolfssl check vim
25+
kldload if_tap || true
26+
sysctl net.link.tap.up_on_open=1 || true
27+
run: |
28+
set -ex
29+
cd "${GITHUB_WORKSPACE:-/root/work/github/workspace}"
30+
gmake build/test-evloop build/test-wolfssl build/test-ttl-expired unit
31+
./build/test/unit
32+
./build/test-evloop
33+
./build/test-wolfssl
34+
./build/test-ttl-expired

.github/workflows/linux.yml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,3 +44,15 @@ jobs:
4444
run: |
4545
./build/test-ttl-expired
4646
47+
- name: Install check
48+
run: |
49+
sudo apt-get install -y check
50+
51+
- name: Build unit tests
52+
run: |
53+
make unit
54+
55+
- name: Run unit tests
56+
run: |
57+
build/test/unit
58+

.github/workflows/macos.yml

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
name: macOS interop tests
2+
3+
on:
4+
push:
5+
branches: [ 'master', 'main', 'release/**' ]
6+
pull_request:
7+
branches: [ '*' ]
8+
9+
jobs:
10+
macos_test:
11+
runs-on: macos-latest
12+
13+
steps:
14+
- uses: actions/checkout@v4
15+
with:
16+
submodules: true
17+
18+
- name: Install dependencies
19+
run: |
20+
brew update
21+
brew install make wolfssl check
22+
23+
- name: Build tests
24+
run: |
25+
PATH="/opt/homebrew/opt/make/libexec/gnubin:$PATH" \
26+
gmake build/test-evloop build/test-wolfssl build/test-ttl-expired unit
27+
28+
- name: Run event loop test
29+
run: |
30+
sudo PATH="/opt/homebrew/opt/make/libexec/gnubin:$PATH" ./build/test-evloop
31+
timeout-minutes: 3
32+
33+
- name: Run wolfSSL interop test
34+
run: |
35+
sudo PATH="/opt/homebrew/opt/make/libexec/gnubin:$PATH" ./build/test-wolfssl
36+
timeout-minutes: 3
37+
38+
- name: Run unit tests
39+
run: |
40+
./build/test/unit
41+
timeout-minutes: 2
42+
43+
- name: Run TTL expired test
44+
run: |
45+
./build/test-ttl-expired
46+
timeout-minutes: 1

.github/workflows/units.yml

Lines changed: 0 additions & 32 deletions
This file was deleted.

Makefile

Lines changed: 119 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,79 @@ CFLAGS:=-Wall -Werror -Wextra -I. -D_GNU_SOURCE
33
CFLAGS+=-g -ggdb -Wdeclaration-after-statement
44
LDFLAGS+=-pthread
55

6+
UNAME_S:=$(shell uname -s)
7+
UNAME_M:=$(shell uname -m)
8+
UNAME_LC:=$(shell echo $(UNAME_S) | tr 'A-Z' 'a-z')
9+
ifeq ($(UNAME_S),FreeBSD)
10+
CFLAGS+=-I/usr/local/include
11+
LDFLAGS+=-L/usr/local/lib
12+
endif
13+
ifeq ($(UNAME_S),Darwin)
14+
BREW_PREFIX?=$(shell brew --prefix 2>/dev/null)
15+
ifeq ($(filter command\ line environment,$(origin BREW_PREFIX)),)
16+
ifeq ($(UNAME_M),arm64)
17+
ARM_BREW_PREFIX:=$(shell /opt/homebrew/bin/brew --prefix 2>/dev/null)
18+
ifneq ($(ARM_BREW_PREFIX),)
19+
BREW_PREFIX:=$(ARM_BREW_PREFIX)
20+
endif
21+
endif
22+
endif
23+
ifeq ($(BREW_PREFIX),)
24+
BREW_PREFIX:=/opt/homebrew
25+
endif
26+
27+
WOLFSSL_PREFIX?=$(shell brew --prefix wolfssl 2>/dev/null)
28+
ifeq ($(filter command\ line environment,$(origin WOLFSSL_PREFIX)),)
29+
ifeq ($(UNAME_M),arm64)
30+
ARM_WOLFSSL_PREFIX:=$(shell /opt/homebrew/bin/brew --prefix wolfssl 2>/dev/null)
31+
ifneq ($(ARM_WOLFSSL_PREFIX),)
32+
WOLFSSL_PREFIX:=$(ARM_WOLFSSL_PREFIX)
33+
endif
34+
endif
35+
endif
36+
ifneq ($(WOLFSSL_PREFIX),)
37+
CFLAGS+=-I$(WOLFSSL_PREFIX)/include
38+
LDFLAGS+=-L$(WOLFSSL_PREFIX)/lib
39+
endif
40+
CHECK_PREFIX?=$(shell brew --prefix check 2>/dev/null)
41+
ifeq ($(filter command\ line environment,$(origin CHECK_PREFIX)),)
42+
ifeq ($(UNAME_M),arm64)
43+
ARM_CHECK_PREFIX:=$(shell /opt/homebrew/bin/brew --prefix check 2>/dev/null)
44+
ifneq ($(ARM_CHECK_PREFIX),)
45+
CHECK_PREFIX:=$(ARM_CHECK_PREFIX)
46+
endif
47+
endif
48+
endif
49+
ifeq ($(CHECK_PREFIX),)
50+
CHECK_PREFIX:=$(BREW_PREFIX)
51+
endif
52+
ifneq ($(CHECK_PREFIX),)
53+
UNIT_CFLAGS+=-I$(CHECK_PREFIX)/include
54+
UNIT_LDFLAGS+=-L$(CHECK_PREFIX)/lib
55+
endif
56+
endif
57+
TAP_SRC:=src/port/posix/tap_$(UNAME_LC).c
58+
ifeq ($(wildcard $(TAP_SRC)),)
59+
TAP_SRC:=src/port/posix/tap_linux.c
60+
endif
61+
TAP_OBJ:=$(patsubst src/%.c,build/%.o,$(TAP_SRC))
62+
TAP_PIE_OBJ:=$(patsubst src/%.c,build/pie/%.o,$(TAP_SRC))
63+
64+
ifeq ($(UNAME_S),Darwin)
65+
BEGIN_GROUP:=
66+
END_GROUP:=
67+
else
68+
BEGIN_GROUP:=-Wl,--start-group
69+
END_GROUP:=-Wl,--end-group
70+
endif
71+
72+
CHECK_PKG_CFLAGS:=$(shell pkg-config --cflags check 2>/dev/null)
73+
CHECK_PKG_LIBS:=$(shell pkg-config --libs check 2>/dev/null)
74+
75+
ifneq ($(CHECK_PKG_CFLAGS),)
76+
UNIT_CFLAGS+=$(CHECK_PKG_CFLAGS)
77+
endif
78+
679
CPPCHECK=cppcheck
780
CPPCHECK_FLAGS=--enable=warning,performance,portability,missingInclude \
881
--suppress=missingIncludeSystem \
@@ -21,11 +94,27 @@ CPPCHECK_FLAGS=--enable=warning,performance,portability,missingInclude \
2194
--error-exitcode=1 --xml --xml-version=2
2295

2396
OBJ=build/wolfip.o \
24-
build/port/posix/linux_tap.o
97+
$(TAP_OBJ)
98+
99+
HAVE_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)
100+
101+
# Require wolfSSL unless the requested goals are wolfSSL-independent (unit/cppcheck/clean).
102+
REQ_WOLFSSL_GOALS:=$(filter-out unit cppcheck clean,$(MAKECMDGOALS))
103+
ifeq ($(strip $(MAKECMDGOALS)),)
104+
ifeq ($(HAVE_WOLFSSL),)
105+
$(warning wolfSSL headers not found. Skipping wolfSSL-dependent targets)
106+
endif
107+
else
108+
ifneq ($(REQ_WOLFSSL_GOALS),)
109+
ifeq ($(HAVE_WOLFSSL),)
110+
$(error wolfSSL headers not found. Please install wolfSSL or adjust include paths)
111+
endif
112+
endif
113+
endif
25114

26115
EXE=build/tcpecho build/tcp_netcat_poll build/tcp_netcat_select \
27116
build/test-evloop build/test-dns build/test-wolfssl-forwarding \
28-
build/test-ttl-expired build/test-wolfssl
117+
build/test-ttl-expired build/test-wolfssl build/test-httpd
29118
LIB=libwolfip.so
30119

31120
PREFIX=/usr/local
@@ -44,10 +133,10 @@ libtcpip.a: $(OBJ)
44133

45134
libwolfip.so:CFLAGS+=-fPIC
46135
libwolfip.so: build/pie/port/posix/bsd_socket.o build/pie/wolfip.o \
47-
build/pie/port/posix/linux_tap.o
136+
$(TAP_PIE_OBJ)
48137
@mkdir -p `dirname $@` || true
49138
@echo "[LD] $@"
50-
@$(CC) $(CFLAGS) $(LDFLAGS) -shared -o $@ -Wl,--start-group $(^) -Wl,--end-group
139+
@$(CC) $(CFLAGS) $(LDFLAGS) -shared -o $@ $(BEGIN_GROUP) $(^) $(END_GROUP)
51140

52141

53142
clean:
@@ -61,40 +150,50 @@ asan:LDFLAGS+=-static-libasan
61150

62151
# Test
63152

64-
unit:LDFLAGS+=-lcheck -lm -lpthread -lrt -ldl -lsubunit
65-
build/test-evloop: $(OBJ) build/test/test_linux_eventloop.o
153+
ifeq ($(CHECK_PKG_LIBS),)
154+
UNIT_LIBS=-lcheck -lm -lpthread -lrt -ldl -lsubunit
155+
ifeq ($(UNAME_S),Darwin)
156+
UNIT_LIBS=-lcheck -lm -lpthread
157+
else ifeq ($(UNAME_S),FreeBSD)
158+
UNIT_LIBS=-lcheck -lm -lpthread
159+
endif
160+
else
161+
UNIT_LIBS=$(CHECK_PKG_LIBS)
162+
endif
163+
164+
unit:LDFLAGS+=$(UNIT_LIBS)
165+
build/test-evloop: $(OBJ) build/test/test_eventloop.o
66166
@echo "[LD] $@"
67-
@$(CC) $(CFLAGS) $(LDFLAGS) -o $@ -Wl,--start-group $(^) -Wl,--end-group
167+
@$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $(BEGIN_GROUP) $(^) $(END_GROUP)
68168

69-
build/test-dns: $(OBJ) build/test/test_linux_dhcp_dns.o
169+
build/test-dns: $(OBJ) build/test/test_dhcp_dns.o
70170
@echo "[LD] $@"
71-
@$(CC) $(CFLAGS) $(LDFLAGS) -o $@ -Wl,--start-group $(^) -Wl,--end-group
171+
@$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $(BEGIN_GROUP) $(^) $(END_GROUP)
72172

73173
build/tcpecho: $(OBJ) build/port/posix/bsd_socket.o build/test/tcp_echo.o
74174
@echo "[LD] $@"
75-
@$(CC) $(CFLAGS) $(LDFLAGS) -o $@ -Wl,--start-group $(^) -Wl,--end-group
175+
@$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $(BEGIN_GROUP) $(^) $(END_GROUP)
76176

77177
build/tcp_netcat_poll: $(OBJ) build/port/posix/bsd_socket.o build/test/tcp_netcat_poll.o
78178
@echo "[LD] $@"
79-
@$(CC) $(CFLAGS) $(LDFLAGS) -o $@ -Wl,--start-group $(^) -Wl,--end-group
179+
@$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $(BEGIN_GROUP) $(^) $(END_GROUP)
80180

81181
build/tcp_netcat_select: $(OBJ) build/port/posix/bsd_socket.o build/test/tcp_netcat_select.o
82182
@echo "[LD] $@"
83-
@$(CC) $(CFLAGS) $(LDFLAGS) -o $@ -Wl,--start-group $(^) -Wl,--end-group
183+
@$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $(BEGIN_GROUP) $(^) $(END_GROUP)
84184

85185

86186
build/test-wolfssl:CFLAGS+=-Wno-cpp -DWOLFSSL_DEBUG -DWOLFSSL_WOLFIP
87187
build/test-httpd:CFLAGS+=-Wno-cpp -DWOLFSSL_DEBUG -DWOLFSSL_WOLFIP -Isrc/http
88188
build/test-wolfssl-forwarding:CFLAGS+=-Wno-cpp -DWOLFSSL_DEBUG -DWOLFSSL_WOLFIP -DWOLFIP_MAX_INTERFACES=2 -DWOLFIP_ENABLE_FORWARDING=1
89189

90-
91190
build/test-wolfssl: $(OBJ) build/test/test_native_wolfssl.o build/port/wolfssl_io.o build/certs/server_key.o build/certs/ca_cert.o build/certs/server_cert.o
92191
@echo "[LD] $@"
93-
@$(CC) $(CFLAGS) $(LDFLAGS) -o $@ -Wl,--start-group $(^) -lwolfssl -Wl,--end-group
192+
@$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $(BEGIN_GROUP) $(^) -lwolfssl $(END_GROUP)
94193

95-
build/test-wolfssl-forwarding: build/test/test_wolfssl_forwarding.o build/test/wolfip_forwarding.o build/port/posix/linux_tap.o build/port/wolfssl_io.o build/certs/server_key.o build/certs/ca_cert.o build/certs/server_cert.o
194+
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
96195
@echo "[LD] $@"
97-
@$(CC) $(CFLAGS) $(LDFLAGS) -o $@ -Wl,--start-group $(^) -lwolfssl -Wl,--end-group
196+
@$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $(BEGIN_GROUP) $(^) -lwolfssl $(END_GROUP)
98197

99198
build/test/test_wolfssl_forwarding.o: CFLAGS+=-DWOLFIP_MAX_INTERFACES=2 -DWOLFIP_ENABLE_FORWARDING=1
100199

@@ -106,11 +205,11 @@ build/test/wolfip_forwarding.o: src/wolfip.c
106205
build/test/test_ttl_expired.o: CFLAGS+=-DWOLFIP_MAX_INTERFACES=2 -DWOLFIP_ENABLE_FORWARDING=1
107206
build/test-ttl-expired: build/test/test_ttl_expired.o build/test/wolfip_forwarding.o
108207
@echo "[LD] $@"
109-
@$(CC) $(CFLAGS) $(LDFLAGS) -o $@ -Wl,--start-group $(^) -Wl,--end-group
208+
@$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $(BEGIN_GROUP) $(^) $(END_GROUP)
110209

111210
build/test-httpd: $(OBJ) build/test/test_httpd.o build/port/wolfssl_io.o build/certs/server_key.o build/certs/server_cert.o build/http/httpd.o
112211
@echo "[LD] $@"
113-
@$(CC) $(CFLAGS) $(LDFLAGS) -o $@ -Wl,--start-group $(^) -lwolfssl -Wl,--end-group
212+
@$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $(BEGIN_GROUP) $(^) -lwolfssl $(END_GROUP)
114213

115214
build/%.o: src/%.c
116215
@mkdir -p `dirname $@` || true
@@ -154,9 +253,9 @@ unit: build/test/unit
154253
build/test/unit:
155254
@mkdir -p build/test/
156255
@echo "[CC] unit.c"
157-
@$(CC) $(CFLAGS) -c src/test/unit/unit.c -o build/test/unit.o
256+
@$(CC) $(CFLAGS) $(UNIT_CFLAGS) -c src/test/unit/unit.c -o build/test/unit.o
158257
@echo "[LD] $@"
159-
@$(CC) -o build/test/unit build/test/unit.o $(LDFLAGS)
258+
@$(CC) build/test/unit.o -o build/test/unit $(UNIT_LDFLAGS) $(LDFLAGS)
160259

161260
# Install dynamic library to re-link linux applications
162261
#

config.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,6 @@
2929

3030
/* Linux test configuration */
3131
#define WOLFIP_IP "10.10.10.2"
32-
#define LINUX_IP "10.10.10.1"
32+
#define HOST_STACK_IP "10.10.10.1"
3333

3434
#endif

src/port/posix/bsd_socket.c

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -532,8 +532,8 @@ int poll(struct pollfd *fds, nfds_t nfds, int timeout) {
532532

533533

534534
/* Catch-all function to initialize a new tap device as the network interface.
535-
* This is defined in port/linux.c
536-
* */
535+
* Implemented in port/posix/tap_*.c
536+
*/
537537
extern int tap_init(struct wolfIP_ll_dev *dev, const char *name, uint32_t host_ip);
538538

539539
void *wolfIP_sock_posix_ip_loop(void *arg) {
@@ -552,12 +552,12 @@ void *wolfIP_sock_posix_ip_loop(void *arg) {
552552
}
553553

554554
void __attribute__((constructor)) init_wolfip_posix() {
555-
struct in_addr linux_ip;
555+
struct in_addr host_stack_ip;
556556
struct wolfIP_ll_dev *tapdev;
557557
pthread_t wolfIP_thread;
558558
if (IPSTACK)
559559
return;
560-
inet_aton(LINUX_IP, &linux_ip);
560+
inet_aton(HOST_STACK_IP, &host_stack_ip);
561561
swap_socketcall(socket, "socket");
562562
swap_socketcall(bind, "bind");
563563
swap_socketcall(listen, "listen");
@@ -581,14 +581,13 @@ void __attribute__((constructor)) init_wolfip_posix() {
581581
pthread_mutex_init(&wolfIP_mutex, NULL);
582582
wolfIP_init_static(&IPSTACK);
583583
tapdev = wolfIP_getdev(IPSTACK);
584-
if (tap_init(tapdev, "wtcp0", linux_ip.s_addr) < 0) {
584+
if (tap_init(tapdev, "wtcp0", host_stack_ip.s_addr) < 0) {
585585
perror("tap init");
586586
}
587587
wolfIP_ipconfig_set(IPSTACK, atoip4(WOLFIP_IP), atoip4("255.255.255.0"),
588-
atoip4(LINUX_IP));
588+
atoip4(HOST_STACK_IP));
589589
printf("IP: manually configured - %s\n", WOLFIP_IP);
590590
sleep(1);
591591
pthread_create(&wolfIP_thread, NULL, wolfIP_sock_posix_ip_loop, IPSTACK);
592592
in_the_stack = 0;
593593
}
594-

0 commit comments

Comments
 (0)