1
1
CC = clang
2
- LLC = llc
3
2
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
7
34
8
35
LIBBPF_SRC = $(LIBBPF_DIR ) /src
9
36
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
+
67
190
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
76
211
.DEFAULT : all
0 commit comments