Skip to content

Commit 5f12cc6

Browse files
committed
Start rewriting tool.
1 parent 7f11d69 commit 5f12cc6

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

71 files changed

+3754
-2336
lines changed

.github/workflows/build.yml

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,12 @@ jobs:
2323
run: sudo apt install -y libconfig-dev
2424
- name: Install LLVM
2525
run: sudo apt install -y llvm
26+
- name: Install LibXDP Depedencies
27+
run: sudo apt install -y libpcap-dev m4 gcc-multilib linux-tools-$(uname -r)
28+
- name: Build LibXDP.
29+
run: make libxdp
30+
- name: Install LibXDP.
31+
run: sudo make libxdp_install
2632
- name: Make project
2733
run: make
2834
- name: Install project
@@ -31,4 +37,4 @@ jobs:
3137
uses: actions/upload-artifact@master
3238
with:
3339
name: build-output
34-
path: build/xdpfwd
40+
path: build/loader/xdpfwd

.github/workflows/run.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ on:
88

99
jobs:
1010
reuse_build:
11-
uses: gamemann/XDP-Forwarding/.github/workflows/build.yml@master
11+
uses: gamemann/XDP-Forward/.github/workflows/build.yml@master
1212
run:
1313
needs: reuse_build
1414
runs-on: ubuntu-latest
@@ -27,5 +27,5 @@ jobs:
2727
run: ls -la
2828
- name: Add execute permissions to executable file
2929
run: sudo chmod +x ./xdpfwd
30-
- name: Run XDP FWD with help menu
31-
run: sudo ./xdpfwd -h
30+
- name: Run XDP FW with help menu
31+
run: sudo ./xdpfwd -h

.gitignore

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,6 @@
1-
build/
1+
.vscode/
2+
xdpfwd
3+
*.s
4+
*.conf
5+
*.log
6+
*.asm

.gitmodules

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1-
[submodule "libbpf"]
2-
path = libbpf
3-
url = https://github.com/libbpf/libbpf
1+
2+
[submodule "modules/xdp-tools"]
3+
path = modules/xdp-tools
4+
url = https://github.com/xdp-project/xdp-tools

LICENSE.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
MIT License
22

3-
Copyright (c) 2022 Christian Deacon
3+
Copyright (c) 2025 Christian Deacon
44

55
Permission is hereby granted, free of charge, to any person obtaining a copy
66
of this software and associated documentation files (the "Software"), to deal

Makefile

Lines changed: 204 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -1,76 +1,211 @@
11
CC = clang
2-
LLC = llc
32

4-
BUILD_DIR := build
5-
SRC_DIR := src
6-
LIBBPF_DIR := libbpf
3+
LIBXDP_STATIC ?= 1
4+
5+
# Top-level directories.
6+
BUILD_DIR = build
7+
SRC_DIR = src
8+
MODULES_DIR = modules
9+
10+
# Common directories.
11+
COMMON_DIR = $(SRC_DIR)/common
12+
ETC_DIR = /etc/xdpfwd
13+
14+
# Project source directories.
15+
LOADER_DIR = $(SRC_DIR)/loader
16+
XDP_DIR = $(SRC_DIR)/xdp
17+
18+
RULE_ADD_DIR = $(SRC_DIR)/rule_add
19+
RULE_DEL_DIR = $(SRC_DIR)/rule_del
20+
21+
# Additional build directories.
22+
BUILD_LOADER_DIR = $(BUILD_DIR)/loader
23+
BUILD_XDP_DIR = $(BUILD_DIR)/xdp
24+
BUILD_RULE_ADD_DIR = $(BUILD_DIR)/rule_add
25+
BUILD_RULE_DEL_DIR = $(BUILD_DIR)/rule_del
26+
27+
# XDP Tools directories.
28+
XDP_TOOLS_DIR = $(MODULES_DIR)/xdp-tools
29+
XDP_TOOLS_HEADERS = $(XDP_TOOLS_DIR)/headers
30+
31+
# LibXDP and LibBPF directories.
32+
LIBXDP_DIR = $(XDP_TOOLS_DIR)/lib/libxdp
33+
LIBBPF_DIR = $(XDP_TOOLS_DIR)/lib/libbpf
734

835
LIBBPF_SRC = $(LIBBPF_DIR)/src
936

10-
LIBBPF_OBJS = $(LIBBPF_SRC)/staticobjs/bpf_prog_linfo.o $(LIBBPF_SRC)/staticobjs/bpf.o $(LIBBPF_SRC)/staticobjs/btf_dump.o
11-
LIBBPF_OBJS += $(LIBBPF_SRC)/staticobjs/btf.o $(LIBBPF_SRC)/staticobjs/hashmap.o $(LIBBPF_SRC)/staticobjs/libbpf_errno.o
12-
LIBBPF_OBJS += $(LIBBPF_SRC)/staticobjs/libbpf_probes.o $(LIBBPF_SRC)/staticobjs/libbpf.o $(LIBBPF_SRC)/staticobjs/netlink.o
13-
LIBBPF_OBJS += $(LIBBPF_SRC)/staticobjs/nlattr.o $(LIBBPF_SRC)/staticobjs/str_error.o
14-
LIBBPF_OBJS += $(LIBBPF_SRC)/staticobjs/xsk.o
15-
16-
LOADER_SRC := xdpfwd.c
17-
LOADER_OUT := xdpfwd
18-
LOADER_FLAGS := -lelf -lz -lconfig
19-
20-
ADD_SRC := xdpfwd-add.c
21-
ADD_OUT := xdpfwd-add
22-
23-
DEL_SRC := xdpfwd-del.c
24-
DEL_OUT := xdpfwd-del
25-
26-
CMD_LINE_SRC := cmdline.c
27-
CMD_LINE_OUT := cmdline.o
28-
29-
CONFIG_SRC := config.c
30-
CONFIG_OUT := config.o
31-
32-
UTILS_SRC := utils.c
33-
UTILS_OUT := utils.o
34-
35-
XDP_PROG_SRC := xdp_prog.c
36-
XDP_PROG_LL := xdp_prog.ll
37-
XDP_PROG_OUT := xdp_prog.o
38-
39-
GLOBAL_OBJS := $(BUILD_DIR)/$(CONFIG_OUT) $(BUILD_DIR)/$(CMD_LINE_OUT) $(BUILD_DIR)/$(UTILS_OUT)
40-
GLOBAL_FLAGS := -O2
41-
42-
all: utils common loader xdp_add xdp_del xdp_prog
43-
mk_build:
44-
mkdir -p build/
45-
loader: libbpf mk_build common utils
46-
$(CC) -I$(LIBBPF_SRC) $(LOADER_FLAGS) $(GLOBAL_FLAGS) -o $(BUILD_DIR)/$(LOADER_OUT) $(LIBBPF_OBJS) $(GLOBAL_OBJS) $(SRC_DIR)/$(LOADER_SRC)
47-
xdp_add: libbpf mk_build common utils
48-
$(CC) -I$(LIBBPF_SRC) $(LOADER_FLAGS) $(GLOBAL_FLAGS) -o $(BUILD_DIR)/$(ADD_OUT) $(LIBBPF_OBJS) $(GLOBAL_OBJS) $(SRC_DIR)/$(ADD_SRC)
49-
xdp_del: libbpf mk_build common utils
50-
$(CC) -I$(LIBBPF_SRC) $(LOADER_FLAGS) $(GLOBAL_FLAGS) -o $(BUILD_DIR)/$(DEL_OUT) $(LIBBPF_OBJS) $(GLOBAL_OBJS) $(SRC_DIR)/$(DEL_SRC)
51-
xdp_prog: mk_build
52-
$(CC) -I$(LIBBPF_SRC) -D__BPF__ -Wall -Wextra $(GLOBAL_FLAGS) -emit-llvm -c -o $(BUILD_DIR)/$(XDP_PROG_LL) $(SRC_DIR)/$(XDP_PROG_SRC)
53-
$(LLC) -march=bpf -filetype=obj -o $(BUILD_DIR)/$(XDP_PROG_OUT) $(BUILD_DIR)/$(XDP_PROG_LL)
54-
libbpf:
55-
$(MAKE) -j $(nproc) -C $(LIBBPF_SRC)
56-
common: mk_build
57-
$(CC) $(GLOBAL_FLAGS) -c -o $(BUILD_DIR)/$(CMD_LINE_OUT) $(SRC_DIR)/$(CMD_LINE_SRC)
58-
$(CC) $(GLOBAL_FLAGS) -c -o $(BUILD_DIR)/$(CONFIG_OUT) $(SRC_DIR)/$(CONFIG_SRC)
59-
utils: libbpf mk_build
60-
$(CC) -I$(LIBBPF_SRC) $(GLOBAL_FLAGS) -c -o $(BUILD_DIR)/$(UTILS_OUT) $(SRC_DIR)/$(UTILS_SRC)
61-
clean:
62-
$(MAKE) -j $(nproc) -C $(LIBBPF_SRC) clean
63-
rm -f $(BUILD_DIR)/*.o $(BUILD_DIR)/*.ll
64-
rm -f $(BUILD_DIR)/$(LOADER_OUT)
65-
rm -f $(BUILD_DIR)/$(ADD_OUT)
66-
rm -f $(BUILD_DIR)/$(DEL_OUT)
37+
# LibBPF objects.
38+
LIBBPF_OBJS = $(addprefix $(LIBBPF_SRC)/staticobjs/, $(notdir $(wildcard $(LIBBPF_SRC)/staticobjs/*.o)))
39+
40+
# LibXDP objects.
41+
# To Do: Figure out why static objects produces errors relating to unreferenced functions with dispatcher.
42+
# Note: Not sure why shared objects are acting like static objects here where we can link while building and then don't require them at runtime, etc.
43+
LIBXDP_OBJS = $(addprefix $(LIBXDP_DIR)/sharedobjs/, $(notdir $(wildcard $(LIBXDP_DIR)/sharedobjs/*.o)))
44+
45+
# Loader directories.
46+
LOADER_SRC = prog.c
47+
LOADER_OUT = xdpfw
48+
49+
LOADER_UTILS_DIR = $(LOADER_DIR)/utils
50+
51+
# Loader utils.
52+
LOADER_UTILS_CONFIG_SRC = config.c
53+
LOADER_UTILS_CONFIG_OBJ = config.o
54+
55+
LOADER_UTILS_CLI_SRC = cli.c
56+
LOADER_UTILS_CLI_OBJ = cli.o
57+
58+
LOADER_UTILS_XDP_SRC = xdp.c
59+
LOADER_UTILS_XDP_OBJ = xdp.o
60+
61+
LOADER_UTILS_LOGGING_SRC = logging.c
62+
LOADER_UTILS_LOGGING_OBJ = logging.o
63+
64+
LOADER_UTILS_STATS_SRC = stats.c
65+
LOADER_UTILS_STATS_OBJ = stats.o
66+
67+
LOADER_UTILS_HELPERS_SRC = helpers.c
68+
LOADER_UTILS_HELPERS_OBJ = helpers.o
69+
70+
# Loader objects.
71+
LOADER_OBJS = $(BUILD_LOADER_DIR)/$(LOADER_UTILS_CONFIG_OBJ) $(BUILD_LOADER_DIR)/$(LOADER_UTILS_CLI_OBJ) $(BUILD_LOADER_DIR)/$(LOADER_UTILS_XDP_OBJ) $(BUILD_LOADER_DIR)/$(LOADER_UTILS_LOGGING_OBJ) $(BUILD_LOADER_DIR)/$(LOADER_UTILS_STATS_OBJ) $(BUILD_LOADER_DIR)/$(LOADER_UTILS_HELPERS_OBJ)
72+
73+
ifeq ($(LIBXDP_STATIC), 1)
74+
LOADER_OBJS := $(LIBBPF_OBJS) $(LIBXDP_OBJS) $(LOADER_OBJS)
75+
endif
76+
77+
# XDP directories.
78+
XDP_SRC = prog.c
79+
XDP_OBJ = xdp_prog.o
80+
81+
# Rule common.
82+
RULE_OBJS = $(BUILD_LOADER_DIR)/$(LOADER_UTILS_CONFIG_OBJ) $(BUILD_LOADER_DIR)/$(LOADER_UTILS_XDP_OBJ) $(BUILD_LOADER_DIR)/$(LOADER_UTILS_LOGGING_OBJ) $(BUILD_LOADER_DIR)/$(LOADER_UTILS_HELPERS_OBJ)
83+
84+
ifeq ($(LIBXDP_STATIC), 1)
85+
RULE_OBJS := $(LIBBPF_OBJS) $(LIBXDP_OBJS) $(RULE_OBJS)
86+
endif
87+
88+
# Rule add.
89+
RULE_ADD_SRC = prog.c
90+
RULE_ADD_OUT = xdpfw-add
91+
92+
RULE_ADD_UTILS_DIR = $(RULE_ADD_DIR)/utils
93+
94+
# Rule add utils.
95+
RULE_ADD_UTILS_CLI_SRC = cli.c
96+
RULE_ADD_UTILS_CLI_OBJ = cli.o
97+
98+
RULE_ADD_OBJS = $(BUILD_RULE_ADD_DIR)/$(RULE_ADD_UTILS_CLI_OBJ)
99+
100+
# Rule delete.
101+
RULE_DEL_SRC = prog.c
102+
RULE_DEL_OUT = xdpfw-del
103+
104+
RULE_DEL_UTILS_DIR = $(RULE_DEL_DIR)/utils
105+
106+
# Rule delete utils.
107+
RULE_DEL_UTILS_CLI_SRC = cli.c
108+
RULE_DEL_UTILS_CLI_OBJ = cli.o
109+
110+
RULE_DEL_OBJS = $(BUILD_RULE_DEL_DIR)/$(RULE_DEL_UTILS_CLI_OBJ)
111+
112+
# Includes.
113+
INCS = -I $(SRC_DIR) -I /usr/include -I /usr/local/include
114+
115+
ifeq ($(LIBXDP_STATIC), 1)
116+
INCS += -I $(XDP_TOOLS_HEADERS) -I $(LIBBPF_SRC)
117+
endif
118+
119+
# Flags.
120+
FLAGS = -O2 -g
121+
FLAGS_LOADER = -lconfig -lelf -lz
122+
123+
ifeq ($(LIBXDP_STATIC), 1)
124+
FLAGS += -D__LIBXDP_STATIC__
125+
else
126+
FLAGS_LOADER += -lbpf -lxdp
127+
endif
128+
129+
# All chains.
130+
all: loader xdp rule_add rule_del
131+
132+
# Loader program.
133+
loader: loader_utils
134+
$(CC) $(INCS) $(FLAGS) $(FLAGS_LOADER) -o $(BUILD_LOADER_DIR)/$(LOADER_OUT) $(LOADER_OBJS) $(LOADER_DIR)/$(LOADER_SRC)
135+
136+
loader_utils: loader_utils_config loader_utils_cli loader_utils_helpers loader_utils_xdp loader_utils_logging loader_utils_stats
137+
138+
loader_utils_config:
139+
$(CC) $(INCS) $(FLAGS) -c -o $(BUILD_LOADER_DIR)/$(LOADER_UTILS_CONFIG_OBJ) $(LOADER_UTILS_DIR)/$(LOADER_UTILS_CONFIG_SRC)
140+
141+
loader_utils_cli:
142+
$(CC) $(INCS) $(FLAGS) -c -o $(BUILD_LOADER_DIR)/$(LOADER_UTILS_CLI_OBJ) $(LOADER_UTILS_DIR)/$(LOADER_UTILS_CLI_SRC)
143+
144+
loader_utils_xdp:
145+
$(CC) $(INCS) $(FLAGS) -c -o $(BUILD_LOADER_DIR)/$(LOADER_UTILS_XDP_OBJ) $(LOADER_UTILS_DIR)/$(LOADER_UTILS_XDP_SRC)
146+
147+
loader_utils_logging:
148+
$(CC) $(INCS) $(FLAGS) -c -o $(BUILD_LOADER_DIR)/$(LOADER_UTILS_LOGGING_OBJ) $(LOADER_UTILS_DIR)/$(LOADER_UTILS_LOGGING_SRC)
149+
150+
loader_utils_stats:
151+
$(CC) $(INCS) $(FLAGS) -c -o $(BUILD_LOADER_DIR)/$(LOADER_UTILS_STATS_OBJ) $(LOADER_UTILS_DIR)/$(LOADER_UTILS_STATS_SRC)
152+
153+
loader_utils_helpers:
154+
$(CC) $(INCS) $(FLAGS) -c -o $(BUILD_LOADER_DIR)/$(LOADER_UTILS_HELPERS_OBJ) $(LOADER_UTILS_DIR)/$(LOADER_UTILS_HELPERS_SRC)
155+
156+
# XDP program.
157+
xdp:
158+
$(CC) $(INCS) $(FLAGS) -target bpf -c -o $(BUILD_XDP_DIR)/$(XDP_OBJ) $(XDP_DIR)/$(XDP_SRC)
159+
160+
# Rule add.
161+
rule_add: loader_utils rule_add_utils
162+
$(CC) $(INCS) $(FLAGS) $(FLAGS_LOADER) -o $(BUILD_RULE_ADD_DIR)/$(RULE_ADD_OUT) $(RULE_OBJS) $(RULE_ADD_OBJS) $(RULE_ADD_DIR)/$(RULE_ADD_SRC)
163+
164+
rule_add_utils: rule_add_utils_cli
165+
166+
rule_add_utils_cli:
167+
$(CC) $(INCS) $(FLAGS) -c -o $(BUILD_RULE_ADD_DIR)/$(RULE_ADD_UTILS_CLI_OBJ) $(RULE_ADD_UTILS_DIR)/$(RULE_ADD_UTILS_CLI_SRC)
168+
169+
# Rule delete.
170+
rule_del: loader_utils rule_del_utils
171+
$(CC) $(INCS) $(FLAGS) $(FLAGS_LOADER) -o $(BUILD_RULE_DEL_DIR)/$(RULE_DEL_OUT) $(RULE_OBJS) $(RULE_DEL_OBJS) $(RULE_DEL_DIR)/$(RULE_DEL_SRC)
172+
173+
rule_del_utils: rule_del_utils_cli
174+
175+
rule_del_utils_cli:
176+
$(CC) $(INCS) $(FLAGS) -c -o $(BUILD_RULE_DEL_DIR)/$(RULE_DEL_UTILS_CLI_OBJ) $(RULE_DEL_UTILS_DIR)/$(RULE_DEL_UTILS_CLI_SRC)
177+
178+
# LibXDP chain. We need to install objects here since our program relies on installed object files and such.
179+
libxdp:
180+
$(MAKE) -C $(XDP_TOOLS_DIR) libxdp
181+
182+
libxdp_install:
183+
$(MAKE) -C $(LIBBPF_SRC) install
184+
$(MAKE) -C $(LIBXDP_DIR) install
185+
186+
libxdp_clean:
187+
$(MAKE) -C $(XDP_TOOLS_DIR) clean
188+
$(MAKE) -C $(LIBBPF_SRC) clean
189+
67190
install:
68-
mkdir -p /etc/xdpfwd
69-
cp -n xdpfwd.conf.example /etc/xdpfwd/xdpfwd.conf
70-
cp $(BUILD_DIR)/$(XDP_PROG_OUT) /etc/xdpfwd/$(XDP_PROG_OUT)
71-
cp $(BUILD_DIR)/$(LOADER_OUT) /usr/bin/$(LOADER_OUT)
72-
cp $(BUILD_DIR)/$(ADD_OUT) /usr/bin/$(ADD_OUT)
73-
cp $(BUILD_DIR)/$(DEL_OUT) /usr/bin/$(DEL_OUT)
74-
cp -n xdpfwd.service /etc/systemd/system/
75-
.PHONY: libbpf
191+
mkdir -p $(ETC_DIR)
192+
193+
cp -n xdpfwd.conf.example $(ETC_DIR)/xdpfwd.conf
194+
195+
cp -n other/xdpfwd.service /etc/systemd/system/
196+
197+
cp -f $(BUILD_LOADER_DIR)/$(LOADER_OUT) /usr/bin
198+
cp -f $(BUILD_RULE_ADD_DIR)/$(RULE_ADD_OUT) /usr/bin
199+
cp -f $(BUILD_RULE_DEL_DIR)/$(RULE_DEL_OUT) /usr/bin
200+
201+
cp -f $(BUILD_XDP_DIR)/$(XDP_OBJ) $(ETC_DIR)
202+
203+
clean:
204+
find $(BUILD_DIR) -type f ! -name ".*" -exec rm -f {} +
205+
find $(BUILD_LOADER_DIR) -type f ! -name ".*" -exec rm -f {} +
206+
find $(BUILD_XDP_DIR) -type f ! -name ".*" -exec rm -f {} +
207+
find $(BUILD_RULE_ADD_DIR) -type f ! -name ".*" -exec rm -f {} +
208+
find $(BUILD_RULE_DEL_DIR) -type f ! -name ".*" -exec rm -f {} +
209+
210+
.PHONY: all libxdp
76211
.DEFAULT: all

build/.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
*
2+
!.gitignore
3+
!*/

build/loader/.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
*
2+
!.gitignore

build/rule_add/.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
*
2+
!.gitignore

build/rule_del/.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
*
2+
!.gitignore

0 commit comments

Comments
 (0)