1AUTOMAKE_OPTIONS = subdir-objects
2
3SUBDIRS = . testutils tests benchmarks
4
5# DATA_DIR is the directory where to put default CSV files and the DHCPv6
6# server ID file (i.e. the file where the server finds its DUID at startup).
7dhcp_data_dir = @localstatedir@/db/@PACKAGE@
8kea_lfc_location = @prefix@/sbin/kea-lfc
9
10AM_CPPFLAGS = -I$(top_builddir)/src/lib -I$(top_srcdir)/src/lib
11AM_CPPFLAGS += -DDHCP_DATA_DIR="\"$(dhcp_data_dir)\""
12AM_CPPFLAGS += -DTOP_BUILDDIR="\"$(top_builddir)\""
13# Set location of the kea-lfc binary.
14AM_CPPFLAGS += -DKEA_LFC_EXECUTABLE="\"$(kea_lfc_location)\""
15AM_CPPFLAGS += $(BOOST_INCLUDES)
16if HAVE_MYSQL
17AM_CPPFLAGS += $(MYSQL_CPPFLAGS)
18endif
19if HAVE_PGSQL
20AM_CPPFLAGS += $(PGSQL_CPPFLAGS)
21endif
22if HAVE_CQL
23AM_CPPFLAGS += $(CQL_CPPFLAGS)
24endif
25
26AM_CXXFLAGS = $(KEA_CXXFLAGS)
27
28# The files in the subfolder must be explicitly specified here so
29# as they are copied to the distribution. The other option would
30# be to specify a whole 'parsers' folder here but that would also
31# copy all other files, e.g. gitignore, .git etc.
32# Whenever new file is added to the parsers folder, it must be
33# added here.
34EXTRA_DIST =
35EXTRA_DIST += parsers/client_class_def_parser.cc
36EXTRA_DIST += parsers/client_class_def_parser.h
37EXTRA_DIST += parsers/dhcp_parsers.cc
38EXTRA_DIST += parsers/dhcp_parsers.h
39EXTRA_DIST += parsers/expiration_config_parser.cc
40EXTRA_DIST += parsers/expiration_config_parser.h
41EXTRA_DIST += parsers/host_reservation_parser.cc
42EXTRA_DIST += parsers/host_reservation_parser.h
43EXTRA_DIST += parsers/host_reservations_list_parser.h
44EXTRA_DIST += parsers/ifaces_config_parser.cc
45EXTRA_DIST += parsers/ifaces_config_parser.h
46EXTRA_DIST += parsers/multi_threading_config_parser.cc
47EXTRA_DIST += parsers/multi_threading_config_parser.h
48EXTRA_DIST += parsers/option_data_parser.h
49EXTRA_DIST += parsers/sanity_checks_parser.cc
50EXTRA_DIST += parsers/sanity_checks_parser.h
51EXTRA_DIST += parsers/simple_parser4.cc
52EXTRA_DIST += parsers/simple_parser4.h
53EXTRA_DIST += parsers/simple_parser6.cc
54EXTRA_DIST += parsers/simple_parser6.h
55EXTRA_DIST += parsers/dhcp_queue_control_parser.cc
56EXTRA_DIST += parsers/dhcp_queue_control_parser.h
57
58# Devel guide diagrams
59EXTRA_DIST += images/pgsql_host_data_source.svg
60
61CLEANFILES = *.gcno *.gcda
62# Remove CSV files created by the CSVLeaseFile6 and CSVLeaseFile4 unit tests.
63CLEANFILES += *.csv
64
65lib_LTLIBRARIES = libkea-dhcpsrv.la
66libkea_dhcpsrv_la_SOURCES  =
67libkea_dhcpsrv_la_SOURCES += alloc_engine.cc alloc_engine.h
68libkea_dhcpsrv_la_SOURCES += alloc_engine_log.cc alloc_engine_log.h
69libkea_dhcpsrv_la_SOURCES += alloc_engine_messages.h alloc_engine_messages.cc
70libkea_dhcpsrv_la_SOURCES += base_host_data_source.h
71libkea_dhcpsrv_la_SOURCES += cache_host_data_source.h
72libkea_dhcpsrv_la_SOURCES += callout_handle_store.h
73libkea_dhcpsrv_la_SOURCES += cb_ctl_dhcp.h
74libkea_dhcpsrv_la_SOURCES += cb_ctl_dhcp4.cc cb_ctl_dhcp4.h
75libkea_dhcpsrv_la_SOURCES += cb_ctl_dhcp6.cc cb_ctl_dhcp6.h
76libkea_dhcpsrv_la_SOURCES += cfg_4o6.cc cfg_4o6.h
77libkea_dhcpsrv_la_SOURCES += cfg_consistency.cc cfg_consistency.h
78libkea_dhcpsrv_la_SOURCES += cfg_db_access.cc cfg_db_access.h
79libkea_dhcpsrv_la_SOURCES += cfg_duid.cc cfg_duid.h
80libkea_dhcpsrv_la_SOURCES += cfg_hosts.cc cfg_hosts.h
81libkea_dhcpsrv_la_SOURCES += cfg_hosts_util.cc cfg_hosts_util.h
82libkea_dhcpsrv_la_SOURCES += cfg_iface.cc cfg_iface.h
83libkea_dhcpsrv_la_SOURCES += cfg_expiration.cc cfg_expiration.h
84libkea_dhcpsrv_la_SOURCES += cfg_host_operations.cc cfg_host_operations.h
85libkea_dhcpsrv_la_SOURCES += cfg_option.cc cfg_option.h
86libkea_dhcpsrv_la_SOURCES += cfg_option_def.cc cfg_option_def.h
87libkea_dhcpsrv_la_SOURCES += cfg_rsoo.cc cfg_rsoo.h
88libkea_dhcpsrv_la_SOURCES += cfg_shared_networks.cc cfg_shared_networks.h
89libkea_dhcpsrv_la_SOURCES += cfg_subnets4.cc cfg_subnets4.h
90libkea_dhcpsrv_la_SOURCES += cfg_subnets6.cc cfg_subnets6.h
91libkea_dhcpsrv_la_SOURCES += cfg_mac_source.cc cfg_mac_source.h
92libkea_dhcpsrv_la_SOURCES += cfg_multi_threading.cc cfg_multi_threading.h
93libkea_dhcpsrv_la_SOURCES += cfgmgr.cc cfgmgr.h
94libkea_dhcpsrv_la_SOURCES += client_class_def.cc client_class_def.h
95libkea_dhcpsrv_la_SOURCES += config_backend_dhcp4.h
96libkea_dhcpsrv_la_SOURCES += config_backend_pool_dhcp4.cc config_backend_pool_dhcp4.h
97libkea_dhcpsrv_la_SOURCES += config_backend_dhcp4_mgr.cc config_backend_dhcp4_mgr.h
98libkea_dhcpsrv_la_SOURCES += config_backend_dhcp6.h
99libkea_dhcpsrv_la_SOURCES += config_backend_pool_dhcp6.cc config_backend_pool_dhcp6.h
100libkea_dhcpsrv_la_SOURCES += config_backend_dhcp6_mgr.cc config_backend_dhcp6_mgr.h
101libkea_dhcpsrv_la_SOURCES += csv_lease_file4.cc csv_lease_file4.h
102libkea_dhcpsrv_la_SOURCES += csv_lease_file6.cc csv_lease_file6.h
103libkea_dhcpsrv_la_SOURCES += d2_client_cfg.cc d2_client_cfg.h
104libkea_dhcpsrv_la_SOURCES += d2_client_mgr.cc d2_client_mgr.h
105libkea_dhcpsrv_la_SOURCES += db_type.h
106libkea_dhcpsrv_la_SOURCES += dhcp4o6_ipc.cc dhcp4o6_ipc.h
107libkea_dhcpsrv_la_SOURCES += dhcpsrv_exceptions.h
108libkea_dhcpsrv_la_SOURCES += dhcpsrv_log.cc dhcpsrv_log.h
109libkea_dhcpsrv_la_SOURCES += dhcpsrv_messages.h dhcpsrv_messages.cc
110libkea_dhcpsrv_la_SOURCES += free_lease_queue.h free_lease_queue.cc
111libkea_dhcpsrv_la_SOURCES += host.cc host.h
112libkea_dhcpsrv_la_SOURCES += host_container.h
113libkea_dhcpsrv_la_SOURCES += host_data_source_factory.cc host_data_source_factory.h
114libkea_dhcpsrv_la_SOURCES += host_mgr.cc host_mgr.h
115libkea_dhcpsrv_la_SOURCES += hosts_log.cc hosts_log.h
116libkea_dhcpsrv_la_SOURCES += hosts_messages.h hosts_messages.cc
117libkea_dhcpsrv_la_SOURCES += ip_range.h ip_range.cc
118libkea_dhcpsrv_la_SOURCES += ip_range_permutation.h ip_range_permutation.cc
119libkea_dhcpsrv_la_SOURCES += key_from_key.h
120libkea_dhcpsrv_la_SOURCES += lease.cc lease.h
121libkea_dhcpsrv_la_SOURCES += lease_file_loader.h
122libkea_dhcpsrv_la_SOURCES += lease_file_stats.h
123libkea_dhcpsrv_la_SOURCES += lease_mgr.cc lease_mgr.h
124libkea_dhcpsrv_la_SOURCES += lease_mgr_factory.cc lease_mgr_factory.h
125libkea_dhcpsrv_la_SOURCES += memfile_lease_mgr.cc memfile_lease_mgr.h
126libkea_dhcpsrv_la_SOURCES += memfile_lease_storage.h
127
128if HAVE_MYSQL
129libkea_dhcpsrv_la_SOURCES += mysql_lease_mgr.cc mysql_lease_mgr.h
130libkea_dhcpsrv_la_SOURCES += mysql_host_data_source.cc mysql_host_data_source.h
131endif
132
133libkea_dhcpsrv_la_SOURCES += ncr_generator.cc ncr_generator.h
134libkea_dhcpsrv_la_SOURCES += network.cc network.h
135libkea_dhcpsrv_la_SOURCES += network_state.cc network_state.h
136
137if HAVE_PGSQL
138libkea_dhcpsrv_la_SOURCES += pgsql_host_data_source.cc pgsql_host_data_source.h
139libkea_dhcpsrv_la_SOURCES += pgsql_lease_mgr.cc pgsql_lease_mgr.h
140endif
141
142if HAVE_CQL
143libkea_dhcpsrv_la_SOURCES += cql_host_data_source.cc cql_host_data_source.h
144libkea_dhcpsrv_la_SOURCES += cql_lease_mgr.cc cql_lease_mgr.h
145endif
146
147libkea_dhcpsrv_la_SOURCES += pool.cc pool.h
148libkea_dhcpsrv_la_SOURCES += resource_handler.cc resource_handler.h
149libkea_dhcpsrv_la_SOURCES += sanity_checker.cc sanity_checker.h
150libkea_dhcpsrv_la_SOURCES += shared_network.cc shared_network.h
151libkea_dhcpsrv_la_SOURCES += srv_config.cc srv_config.h
152libkea_dhcpsrv_la_SOURCES += subnet.cc subnet.h
153libkea_dhcpsrv_la_SOURCES += subnet_id.h
154libkea_dhcpsrv_la_SOURCES += subnet_selector.h
155libkea_dhcpsrv_la_SOURCES += timer_mgr.cc timer_mgr.h
156libkea_dhcpsrv_la_SOURCES += triplet.h
157libkea_dhcpsrv_la_SOURCES += utils.h
158libkea_dhcpsrv_la_SOURCES += writable_host_data_source.h
159
160# Configuration parsers
161libkea_dhcpsrv_la_SOURCES += parsers/base_network_parser.cc
162libkea_dhcpsrv_la_SOURCES += parsers/base_network_parser.h
163libkea_dhcpsrv_la_SOURCES += parsers/client_class_def_parser.cc
164libkea_dhcpsrv_la_SOURCES += parsers/client_class_def_parser.h
165libkea_dhcpsrv_la_SOURCES += parsers/dhcp_parsers.cc
166libkea_dhcpsrv_la_SOURCES += parsers/dhcp_parsers.h
167libkea_dhcpsrv_la_SOURCES += parsers/duid_config_parser.cc
168libkea_dhcpsrv_la_SOURCES += parsers/duid_config_parser.h
169libkea_dhcpsrv_la_SOURCES += parsers/expiration_config_parser.cc
170libkea_dhcpsrv_la_SOURCES += parsers/expiration_config_parser.h
171libkea_dhcpsrv_la_SOURCES += parsers/host_reservation_parser.cc
172libkea_dhcpsrv_la_SOURCES += parsers/host_reservation_parser.h
173libkea_dhcpsrv_la_SOURCES += parsers/host_reservations_list_parser.h
174libkea_dhcpsrv_la_SOURCES += parsers/ifaces_config_parser.cc
175libkea_dhcpsrv_la_SOURCES += parsers/ifaces_config_parser.h
176libkea_dhcpsrv_la_SOURCES += parsers/multi_threading_config_parser.cc
177libkea_dhcpsrv_la_SOURCES += parsers/multi_threading_config_parser.h
178libkea_dhcpsrv_la_SOURCES += parsers/option_data_parser.cc
179libkea_dhcpsrv_la_SOURCES += parsers/option_data_parser.h
180libkea_dhcpsrv_la_SOURCES += parsers/dhcp_queue_control_parser.cc
181libkea_dhcpsrv_la_SOURCES += parsers/dhcp_queue_control_parser.h
182libkea_dhcpsrv_la_SOURCES += parsers/sanity_checks_parser.cc
183libkea_dhcpsrv_la_SOURCES += parsers/sanity_checks_parser.h
184libkea_dhcpsrv_la_SOURCES += parsers/shared_network_parser.cc
185libkea_dhcpsrv_la_SOURCES += parsers/shared_network_parser.h
186libkea_dhcpsrv_la_SOURCES += parsers/shared_networks_list_parser.h
187libkea_dhcpsrv_la_SOURCES += parsers/simple_parser4.cc
188libkea_dhcpsrv_la_SOURCES += parsers/simple_parser4.h
189libkea_dhcpsrv_la_SOURCES += parsers/simple_parser6.cc
190libkea_dhcpsrv_la_SOURCES += parsers/simple_parser6.h
191
192if ENABLE_AFL
193libkea_dhcpsrv_la_SOURCES += fuzz.cc fuzz.h
194libkea_dhcpsrv_la_SOURCES += fuzz_log.cc fuzz_log.h
195libkea_dhcpsrv_la_SOURCES += fuzz_messages.cc fuzz_messages.h
196endif
197
198libkea_dhcpsrv_la_CXXFLAGS = $(AM_CXXFLAGS)
199libkea_dhcpsrv_la_CPPFLAGS = $(AM_CPPFLAGS)
200libkea_dhcpsrv_la_LIBADD  = $(top_builddir)/src/lib/eval/libkea-eval.la
201libkea_dhcpsrv_la_LIBADD  += $(top_builddir)/src/lib/dhcp_ddns/libkea-dhcp_ddns.la
202libkea_dhcpsrv_la_LIBADD  += $(top_builddir)/src/lib/process/libkea-process.la
203libkea_dhcpsrv_la_LIBADD  += $(top_builddir)/src/lib/stats/libkea-stats.la
204libkea_dhcpsrv_la_LIBADD  += $(top_builddir)/src/lib/config/libkea-cfgclient.la
205libkea_dhcpsrv_la_LIBADD  += $(top_builddir)/src/lib/http/libkea-http.la
206libkea_dhcpsrv_la_LIBADD  += $(top_builddir)/src/lib/dhcp/libkea-dhcp++.la
207
208if HAVE_MYSQL
209libkea_dhcpsrv_la_LIBADD  += $(top_builddir)/src/lib/mysql/libkea-mysql.la
210endif
211if HAVE_PGSQL
212libkea_dhcpsrv_la_LIBADD  += $(top_builddir)/src/lib/pgsql/libkea-pgsql.la
213endif
214if HAVE_CQL
215libkea_dhcpsrv_la_LIBADD  += $(top_builddir)/src/lib/cql/libkea-cql.la
216endif
217
218libkea_dhcpsrv_la_LIBADD  += $(top_builddir)/src/lib/database/libkea-database.la
219libkea_dhcpsrv_la_LIBADD  += $(top_builddir)/src/lib/asiolink/libkea-asiolink.la
220libkea_dhcpsrv_la_LIBADD  += $(top_builddir)/src/lib/cc/libkea-cc.la
221libkea_dhcpsrv_la_LIBADD  += $(top_builddir)/src/lib/dns/libkea-dns++.la
222libkea_dhcpsrv_la_LIBADD  += $(top_builddir)/src/lib/cryptolink/libkea-cryptolink.la
223libkea_dhcpsrv_la_LIBADD  += $(top_builddir)/src/lib/hooks/libkea-hooks.la
224libkea_dhcpsrv_la_LIBADD  += $(top_builddir)/src/lib/log/libkea-log.la
225libkea_dhcpsrv_la_LIBADD  += $(top_builddir)/src/lib/util/libkea-util.la
226libkea_dhcpsrv_la_LIBADD  += $(top_builddir)/src/lib/exceptions/libkea-exceptions.la
227libkea_dhcpsrv_la_LIBADD  += $(LOG4CPLUS_LIBS) $(CRYPTO_LIBS) $(BOOST_LIBS)
228
229libkea_dhcpsrv_la_LDFLAGS  = -no-undefined -version-info 50:0:0
230libkea_dhcpsrv_la_LDFLAGS += $(CRYPTO_LDFLAGS)
231if HAVE_MYSQL
232libkea_dhcpsrv_la_LDFLAGS += $(MYSQL_LIBS)
233endif
234if HAVE_PGSQL
235libkea_dhcpsrv_la_LDFLAGS += $(PGSQL_LIBS)
236endif
237if HAVE_CQL
238libkea_dhcpsrv_la_LDFLAGS += $(CQL_LIBS)
239endif
240
241# The message file should be in the distribution
242EXTRA_DIST += alloc_engine_messages.mes
243EXTRA_DIST += dhcpsrv_messages.mes
244EXTRA_DIST += hosts_messages.mes
245EXTRA_DIST += fuzz_messages.mes
246
247# If we want to get rid of all generated messages files, we need to use
248# make maintainer-clean. The proper way to introduce custom commands for
249# that operation is to define maintainer-clean-local target. However,
250# make maintainer-clean also removes Makefile, so running configure script
251# is required.  To make it easy to rebuild messages without going through
252# reconfigure, a new target messages-clean has been added.
253maintainer-clean-local:
254	rm -f alloc_engine_messages.h alloc_engine_messages.cc
255	rm -f dhcpsrv_messages.h dhcpsrv_messages.cc
256	rm -f hosts_messages.h hosts_messages.cc
257	rm -f fuzz_messages.h fuzz_messages.cc
258
259# To regenerate messages files, one can do:
260#
261# make messages-clean
262# make messages
263#
264# This is needed only when a .mes file is modified.
265messages-clean: maintainer-clean-local
266
267if GENERATE_MESSAGES
268
269# Define rule to build logging source files from message file
270messages: alloc_engine_messages.h alloc_engine_messages.cc \
271	  dhcpsrv_messages.h dhcpsrv_messages.cc \
272	  hosts_messages.h hosts_messages.cc \
273	  fuzz_messages.h fuzz_messages.cc
274	@echo Message files regenerated
275
276alloc_engine_messages.h alloc_engine_messages.cc: alloc_engine_messages.mes
277	$(top_builddir)/src/lib/log/compiler/kea-msg-compiler $(top_srcdir)/src/lib/dhcpsrv/alloc_engine_messages.mes
278
279dhcpsrv_messages.h dhcpsrv_messages.cc: dhcpsrv_messages.mes
280	$(top_builddir)/src/lib/log/compiler/kea-msg-compiler $(top_srcdir)/src/lib/dhcpsrv/dhcpsrv_messages.mes
281
282hosts_messages.h hosts_messages.cc: hosts_messages.mes
283	$(top_builddir)/src/lib/log/compiler/kea-msg-compiler $(top_srcdir)/src/lib/dhcpsrv/hosts_messages.mes
284
285fuzz_messages.h fuzz_messages.cc: fuzz_messages.mes
286	$(top_builddir)/src/lib/log/compiler/kea-msg-compiler $(top_srcdir)/src/lib/dhcpsrv/fuzz_messages.mes
287
288else
289
290messages: alloc_engine_messages.h alloc_engine_messages.cc \
291	  dhcpsrv_messages.h dhcpsrv_messages.cc \
292	  hosts_messages.h hosts_messages.cc \
293	  fuzz_messages.h fuzz_messages.cc
294	@echo Messages generation disabled. Configure with --enable-generate-messages to enable it.
295
296endif
297
298# Distribute backend documentation
299# Database schema creation script moved to src/bin/admin
300EXTRA_DIST += database_backends.dox libdhcpsrv.dox
301
302# Specify the headers for copying into the installation directory tree.
303libkea_dhcpsrv_includedir = $(pkgincludedir)/dhcpsrv
304libkea_dhcpsrv_include_HEADERS = \
305	alloc_engine.h \
306	alloc_engine_log.h \
307	alloc_engine_messages.h \
308	base_host_data_source.h \
309	cache_host_data_source.h \
310	callout_handle_store.h \
311	cb_ctl_dhcp.h \
312	cb_ctl_dhcp4.h \
313	cb_ctl_dhcp6.h \
314	cfg_4o6.h \
315	cfg_consistency.h \
316	cfg_db_access.h \
317	cfg_duid.h \
318	cfg_expiration.h \
319	cfg_host_operations.h \
320	cfg_hosts.h \
321	cfg_hosts_util.h \
322	cfg_iface.h \
323	cfg_mac_source.h \
324	cfg_multi_threading.h \
325	cfg_option.h \
326	cfg_option_def.h \
327	cfg_rsoo.h \
328	cfg_shared_networks.h \
329	cfg_subnets4.h \
330	cfg_subnets6.h \
331	cfgmgr.h \
332	client_class_def.h \
333	config_backend_dhcp4.h \
334	config_backend_dhcp6.h \
335	config_backend_dhcp4_mgr.h \
336	config_backend_dhcp6_mgr.h \
337	config_backend_pool_dhcp4.h \
338	config_backend_pool_dhcp6.h \
339	csv_lease_file4.h \
340	csv_lease_file6.h \
341	dhcpsrv_exceptions.h \
342	dhcpsrv_messages.h \
343	d2_client_cfg.h \
344	d2_client_mgr.h \
345	db_type.h \
346	dhcp4o6_ipc.h \
347	dhcpsrv_log.h \
348	free_lease_queue.h \
349	host.h \
350	host_container.h \
351	host_data_source_factory.h \
352	hosts_messages.h \
353	host_mgr.h \
354	hosts_log.h \
355	ip_range.h \
356	ip_range_permutation.h \
357	key_from_key.h \
358	lease.h \
359	lease_file_loader.h \
360	lease_file_stats.h \
361	lease_mgr.h \
362	lease_mgr_factory.h \
363	memfile_lease_mgr.h \
364	memfile_lease_storage.h \
365	ncr_generator.h \
366	network.h \
367	network_state.h \
368	pool.h \
369	resource_handler.h \
370	sanity_checker.h \
371	shared_network.h \
372	srv_config.h \
373	subnet.h \
374	subnet_id.h \
375	subnet_selector.h \
376	timer_mgr.h \
377	triplet.h \
378	utils.h \
379	writable_host_data_source.h
380
381if HAVE_CQL
382libkea_dhcpsrv_include_HEADERS += \
383	cql_host_data_source.h \
384	cql_lease_mgr.h
385endif
386
387if HAVE_MYSQL
388libkea_dhcpsrv_include_HEADERS += \
389	mysql_host_data_source.h \
390	mysql_lease_mgr.h
391endif
392
393if HAVE_PGSQL
394libkea_dhcpsrv_include_HEADERS += \
395	pgsql_host_data_source.h \
396	pgsql_lease_mgr.h
397endif
398
399# Specify parsers' headers for copying into installation directory tree.
400libkea_dhcpsrv_parsers_includedir = $(pkgincludedir)/dhcpsrv/parsers
401libkea_dhcpsrv_parsers_include_HEADERS = \
402	parsers/base_network_parser.h \
403	parsers/client_class_def_parser.h \
404	parsers/dhcp_parsers.h \
405	parsers/duid_config_parser.h \
406	parsers/expiration_config_parser.h \
407	parsers/host_reservation_parser.h \
408	parsers/host_reservations_list_parser.h \
409	parsers/ifaces_config_parser.h \
410	parsers/multi_threading_config_parser.h \
411	parsers/option_data_parser.h \
412	parsers/dhcp_queue_control_parser.h \
413	parsers/sanity_checks_parser.h \
414	parsers/shared_network_parser.h \
415	parsers/shared_networks_list_parser.h \
416	parsers/simple_parser4.h \
417	parsers/simple_parser6.h
418
419install-data-local:
420	$(mkinstalldirs) $(DESTDIR)$(dhcp_data_dir)
421