1# Copyright (C) 2006-2014 OpenWrt.org
2#
3# This is free software, licensed under the GNU General Public License v2.
4# See /LICENSE for more information.
5#
6
7include $(TOPDIR)/rules.mk
8
9PKG_NAME:=hostapd
10PKG_VERSION:=2016-06-15
11PKG_RELEASE:=2
12PKG_REV:=31d3692fe5d56c05753ed4a70c7943979e1d29e7
13
14PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
15PKG_SOURCE_URL:=git://w1.fi/srv/git/hostap.git
16PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
17PKG_SOURCE_VERSION:=$(PKG_REV)
18PKG_SOURCE_PROTO:=git
19# PKG_MIRROR_MD5SUM:=4e7c1f97edd7514535056fce54ae053a
20
21PKG_MAINTAINER:=Felix Fietkau <nbd@nbd.name>
22PKG_LICENSE:=BSD-3-Clause
23
24PKG_BUILD_PARALLEL:=1
25
26PKG_CONFIG_DEPENDS:= \
27	CONFIG_WPA_SUPPLICANT_NO_TIMESTAMP_CHECK \
28	CONFIG_PACKAGE_kmod-ath9k \
29	CONFIG_PACKAGE_kmod-cfg80211 \
30	CONFIG_PACKAGE_hostapd \
31	CONFIG_PACKAGE_hostapd-mini \
32	CONFIG_PACKAGE_kmod-hostap \
33	CONFIG_WPA_RFKILL_SUPPORT \
34	CONFIG_DRIVER_WEXT_SUPPORT \
35	CONFIG_DRIVER_11N_SUPPORT
36
37LOCAL_TYPE=$(strip \
38		$(if $(findstring wpad,$(BUILD_VARIANT)),wpad, \
39		$(if $(findstring supplicant,$(BUILD_VARIANT)),supplicant, \
40		hostapd \
41	)))
42LOCAL_VARIANT=$(patsubst wpad-%,%,$(patsubst supplicant-%,%,$(BUILD_VARIANT)))
43CONFIG_VARIANT:=$(LOCAL_VARIANT)
44ifeq ($(LOCAL_VARIANT),mesh)
45  CONFIG_VARIANT:=full
46endif
47
48ifeq ($(LOCAL_TYPE),supplicant)
49  ifeq ($(LOCAL_VARIANT),full)
50    PKG_CONFIG_DEPENDS += \
51		CONFIG_WPA_SUPPLICANT_INTERNAL \
52		CONFIG_WPA_SUPPLICANT_OPENSSL
53  endif
54endif
55
56PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(BUILD_VARIANT)/$(PKG_NAME)-$(PKG_VERSION)
57
58include $(INCLUDE_DIR)/package.mk
59
60STAMP_CONFIGURED:=$(STAMP_CONFIGURED)_$(CONFIG_WPA_MSG_MIN_PRIORITY)
61
62ifneq ($(CONFIG_DRIVER_11N_SUPPORT),)
63  HOSTAPD_IEEE80211N:=y
64endif
65
66DRIVER_MAKEOPTS= \
67	CONFIG_ACS=$(CONFIG_PACKAGE_kmod-cfg80211) \
68	CONFIG_DRIVER_NL80211=$(CONFIG_PACKAGE_kmod-cfg80211) \
69	CONFIG_DRIVER_HOSTAP=$(CONFIG_PACKAGE_kmod-hostap) \
70	CONFIG_IEEE80211N=$(HOSTAPD_IEEE80211N) \
71	CONFIG_DRIVER_WEXT=$(CONFIG_DRIVER_WEXT_SUPPORT) \
72
73ifeq ($(LOCAL_VARIANT),full)
74  DRIVER_MAKEOPTS += CONFIG_IEEE80211W=$(CONFIG_DRIVER_11W_SUPPORT)
75endif
76
77ifneq ($(LOCAL_TYPE),hostapd)
78  ifdef CONFIG_WPA_SUPPLICANT_OPENSSL
79    ifeq ($(LOCAL_VARIANT),full)
80      DRIVER_MAKEOPTS += CONFIG_TLS=openssl
81      TARGET_LDFLAGS += -lcrypto -lssl
82    endif
83  endif
84  ifeq ($(LOCAL_VARIANT),mesh)
85    DRIVER_MAKEOPTS += CONFIG_TLS=openssl CONFIG_AP=y CONFIG_SAE=y CONFIG_MESH=y
86    TARGET_LDFLAGS += -lcrypto -lssl
87  endif
88  ifdef CONFIG_WPA_SUPPLICANT_NO_TIMESTAMP_CHECK
89    TARGET_CFLAGS += -DNO_TIMESTAMP_CHECK
90  endif
91  ifdef CONFIG_WPA_RFKILL_SUPPORT
92    DRIVER_MAKEOPTS += NEED_RFKILL=y
93  endif
94  DRIVER_MAKEOPTS += \
95	CONFIG_DRIVER_ROBOSWITCH=$(CONFIG_PACKAGE_kmod-switch)
96endif
97
98ifdef CONFIG_USE_GLIBC
99  TARGET_LDFLAGS += -lrt
100  TARGET_LDFLAGS_C += -lrt
101endif
102
103DRV_DEPENDS:=+PACKAGE_kmod-cfg80211:libnl-tiny
104
105define Package/hostapd/Default
106  SECTION:=net
107  CATEGORY:=Network
108  TITLE:=IEEE 802.1x Authenticator
109  URL:=http://hostap.epitest.fi/
110  DEPENDS:=$(DRV_DEPENDS) +hostapd-common +libubus
111endef
112
113define Package/hostapd
114$(call Package/hostapd/Default)
115  TITLE+= (full)
116  VARIANT:=full
117  CONFLICTS:=wpad wpad-mini wpad-mesh
118endef
119
120define Package/hostapd/description
121 This package contains a full featured IEEE 802.1x/WPA/EAP/RADIUS
122 Authenticator.
123endef
124
125define Package/hostapd-mini
126$(call Package/hostapd/Default)
127  TITLE+= (WPA-PSK only)
128  VARIANT:=mini
129  CONFLICTS:=wpad wpad-mini wpad-mesh
130endef
131
132define Package/hostapd-mini/description
133 This package contains a minimal IEEE 802.1x/WPA Authenticator (WPA-PSK only).
134endef
135
136define Package/hostapd-utils
137  $(call Package/hostapd/Default)
138  TITLE+= (utils)
139  DEPENDS:=@PACKAGE_hostapd||PACKAGE_hostapd-mini||PACKAGE_wpad||PACKAGE_wpad-mesh||PACKAGE_wpad-mini
140endef
141
142define Package/hostapd-utils/description
143 This package contains a command line utility to control the
144 IEEE 802.1x/WPA/EAP/RADIUS Authenticator.
145endef
146
147define Package/wpad/Default
148  SECTION:=net
149  CATEGORY:=Network
150  TITLE:=IEEE 802.1x Authenticator/Supplicant
151  DEPENDS:=$(DRV_DEPENDS) +hostapd-common +libubus
152  URL:=http://hostap.epitest.fi/
153endef
154
155define Package/wpad
156$(call Package/wpad/Default)
157  TITLE+= (full)
158  DEPENDS+=+WPA_SUPPLICANT_OPENSSL:libopenssl
159  VARIANT:=wpad-full
160endef
161
162define Package/wpad/description
163 This package contains a full featured IEEE 802.1x/WPA/EAP/RADIUS
164 Authenticator and Supplicant
165endef
166
167define Package/wpad-mini
168$(call Package/wpad/Default)
169  TITLE+= (WPA-PSK only)
170  VARIANT:=wpad-mini
171endef
172
173define Package/wpad-mini/description
174 This package contains a minimal IEEE 802.1x/WPA Authenticator and Supplicant (WPA-PSK only).
175endef
176
177define Package/wpad-mesh
178$(call Package/wpad/Default)
179  TITLE+= (with 802.11s mesh and SAE support)
180  DEPENDS:=$(DRV_DEPENDS) +libubus +PACKAGE_wpad-mesh:libopenssl @(!TARGET_uml||BROKEN)
181  VARIANT:=wpad-mesh
182endef
183
184define Package/wpad-mesh/description
185 This package contains a minimal IEEE 802.1x/WPA Authenticator and Supplicant (with 802.11s mesh and SAE support).
186endef
187
188define Package/wpa-supplicant
189  SECTION:=net
190  CATEGORY:=Network
191  TITLE:=WPA Supplicant
192  URL:=http://hostap.epitest.fi/wpa_supplicant/
193  DEPENDS:=$(DRV_DEPENDS) +WPA_SUPPLICANT_OPENSSL:libopenssl
194  CONFLICTS:=wpad wpad-mini wpad-mesh
195  VARIANT:=supplicant-full
196endef
197
198define Package/wpa-supplicant/Description
199  WPA Supplicant
200endef
201
202define Package/wpa-supplicant/config
203	source "$(SOURCE)/Config.in"
204endef
205
206define Package/wpa-supplicant-p2p
207  $(Package/wpa-supplicant)
208  TITLE:=WPA Supplicant (with Wi-Fi P2P support)
209  DEPENDS:=$(DRV_DEPENDS)
210  CONFLICTS:=wpad wpad-mini wpad-mesh
211  VARIANT:=supplicant-p2p
212endef
213
214define Package/wpa-supplicant-p2p/Description
215  WPA Supplicant (with Wi-Fi P2P support)
216endef
217
218define Package/wpa-supplicant-mesh
219  $(Package/wpa-supplicant)
220  TITLE:=WPA Supplicant (with 802.11s and SAE)
221  DEPENDS:=$(DRV_DEPENDS) @(!TARGET_uml||BROKEN)
222  CONFLICTS:=wpad wpad-mesh wpad-mesh
223  VARIANT:=supplicant-mesh
224endef
225
226define Package/wpa-supplicant-mesh/Description
227  WPA Supplicant (variant with 802.11s and SAE support)
228endef
229
230define Package/wpa-supplicant-mini
231  $(Package/wpa-supplicant)
232  TITLE:=WPA Supplicant (minimal version)
233  DEPENDS:=$(DRV_DEPENDS)
234  CONFLICTS:=wpad wpad-mini wpad-mesh
235  VARIANT:=supplicant-mini
236endef
237
238define Package/wpa-supplicant-mini/Description
239  WPA Supplicant (minimal version)
240endef
241
242define Package/wpa-cli
243  SECTION:=net
244  CATEGORY:=Network
245  DEPENDS:=@PACKAGE_wpa-supplicant||PACKAGE_wpa-supplicant-p2p||PACKAGE_wpad-mini||PACKAGE_wpad||PACKAGE_wpad-mesh
246  TITLE:=WPA Supplicant command line interface
247endef
248
249define Package/wpa-cli/Description
250  WPA Supplicant control utility
251endef
252
253define Package/hostapd-common
254  TITLE:=hostapd/wpa_supplicant common support files
255  SECTION:=net
256  CATEGORY:=Network
257endef
258
259define Package/hostapd-common-old
260  TITLE:=hostapd/wpa_supplicant common support files (legacy drivers)
261  SECTION:=net
262  CATEGORY:=Network
263endef
264
265define Package/eapol-test
266  TITLE:=802.1x authentication test utility
267  SECTION:=net
268  CATEGORY:=Network
269  VARIANT:=supplicant-full
270  DEPENDS:=$(DRV_DEPENDS)
271endef
272
273
274ifneq ($(wildcard $(PKG_BUILD_DIR)/.config_*),$(subst .configured_,.config_,$(STAMP_CONFIGURED)))
275  define Build/Configure/rebuild
276	$(FIND) $(PKG_BUILD_DIR) -name \*.o -or -name \*.a | $(XARGS) rm -f
277	rm -f $(PKG_BUILD_DIR)/hostapd/hostapd
278	rm -f $(PKG_BUILD_DIR)/wpa_supplicant/wpa_supplicant
279	rm -f $(PKG_BUILD_DIR)/.config_*
280	touch $(subst .configured_,.config_,$(STAMP_CONFIGURED))
281  endef
282endif
283
284define Build/Configure
285	$(Build/Configure/rebuild)
286	$(if $(wildcard ./files/hostapd-$(CONFIG_VARIANT).config), \
287		$(CP) ./files/hostapd-$(CONFIG_VARIANT).config $(PKG_BUILD_DIR)/hostapd/.config \
288	)
289	$(CP) ./files/wpa_supplicant-$(CONFIG_VARIANT).config $(PKG_BUILD_DIR)/wpa_supplicant/.config
290endef
291
292TARGET_CPPFLAGS := \
293	-I$(STAGING_DIR)/usr/include/libnl-tiny \
294	-I$(PKG_BUILD_DIR)/src/crypto \
295	$(TARGET_CPPFLAGS) \
296	-DCONFIG_LIBNL20 \
297	-D_GNU_SOURCE \
298	$(if $(CONFIG_WPA_MSG_MIN_PRIORITY),-DCONFIG_MSG_MIN_PRIORITY=$(CONFIG_WPA_MSG_MIN_PRIORITY))
299
300TARGET_CFLAGS += -ffunction-sections -fdata-sections
301TARGET_LDFLAGS += -Wl,--gc-sections
302ifeq ($(findstring supplicant,$(BUILD_VARIANT)),)
303  TARGET_LDFLAGS += -lubox -lubus
304endif
305
306ifdef CONFIG_PACKAGE_kmod-cfg80211
307  TARGET_LDFLAGS += -lm -lnl-tiny
308endif
309
310define Build/RunMake
311	CFLAGS="$(TARGET_CPPFLAGS) $(TARGET_CFLAGS)" \
312	$(MAKE) $(PKG_JOBS) -C $(PKG_BUILD_DIR)/$(1) \
313		$(TARGET_CONFIGURE_OPTS) \
314		$(DRIVER_MAKEOPTS) \
315		LIBS="$(TARGET_LDFLAGS)" \
316		LIBS_c="$(TARGET_LDFLAGS_C)" \
317		BCHECK= \
318		$(2)
319endef
320
321define Build/Compile/wpad
322	echo ` \
323		$(call Build/RunMake,hostapd,-s MULTICALL=1 dump_cflags); \
324		$(call Build/RunMake,wpa_supplicant,-s MULTICALL=1 dump_cflags) | \
325		sed -e 's,-n ,,g' -e 's^$(TARGET_CFLAGS)^^' \
326	` > $(PKG_BUILD_DIR)/.cflags
327	+$(call Build/RunMake,hostapd, \
328		CFLAGS="$$$$(cat $(PKG_BUILD_DIR)/.cflags)" \
329		MULTICALL=1 \
330		hostapd_cli hostapd_multi.a \
331	)
332	+$(call Build/RunMake,wpa_supplicant, \
333		CFLAGS="$$$$(cat $(PKG_BUILD_DIR)/.cflags)" \
334		MULTICALL=1 \
335		wpa_cli wpa_supplicant_multi.a \
336	)
337	$(TARGET_CC) -o $(PKG_BUILD_DIR)/wpad \
338		$(TARGET_CFLAGS) \
339		./files/multicall.c \
340		$(PKG_BUILD_DIR)/hostapd/hostapd_multi.a \
341		$(PKG_BUILD_DIR)/wpa_supplicant/wpa_supplicant_multi.a \
342		$(TARGET_LDFLAGS)
343endef
344
345define Build/Compile/hostapd
346	$(call Build/RunMake,hostapd, \
347		hostapd hostapd_cli \
348	)
349endef
350
351define Build/Compile/supplicant
352	$(call Build/RunMake,wpa_supplicant, \
353		wpa_cli wpa_supplicant \
354	)
355endef
356
357define Build/Compile/supplicant-full
358	$(call Build/RunMake,wpa_supplicant, \
359		eapol_test \
360	)
361endef
362
363define Build/Compile
364	$(Build/Compile/$(LOCAL_TYPE))
365	$(Build/Compile/$(BUILD_VARIANT))
366endef
367
368define Install/hostapd
369	$(INSTALL_DIR) $(1)/usr/sbin
370endef
371
372define Install/supplicant
373	$(INSTALL_DIR) $(1)/usr/sbin
374endef
375
376define Package/hostapd-common/install
377	$(INSTALL_DIR) $(1)/lib/netifd
378	$(INSTALL_DATA) ./files/netifd.sh $(1)/lib/netifd/hostapd.sh
379endef
380
381define Package/hostapd-common-old/install
382	$(INSTALL_DIR) $(1)/lib/wifi
383	$(INSTALL_DATA) ./files/hostapd.sh $(1)/lib/wifi/hostapd.sh
384	$(INSTALL_DATA) ./files/wpa_supplicant.sh $(1)/lib/wifi/wpa_supplicant.sh
385endef
386
387define Package/hostapd/install
388	$(call Install/hostapd,$(1))
389	$(INSTALL_BIN) $(PKG_BUILD_DIR)/hostapd/hostapd $(1)/usr/sbin/
390endef
391Package/hostapd-mini/install = $(Package/hostapd/install)
392
393ifneq ($(LOCAL_TYPE),supplicant)
394  define Package/hostapd-utils/install
395	$(INSTALL_DIR) $(1)/usr/sbin $(1)/etc/rc.button
396	$(INSTALL_BIN) $(PKG_BUILD_DIR)/hostapd/hostapd_cli $(1)/usr/sbin/
397	$(INSTALL_BIN) ./files/wps-hotplug.sh $(1)/etc/rc.button/wps
398  endef
399endif
400
401define Package/wpad/install
402	$(call Install/hostapd,$(1))
403	$(call Install/supplicant,$(1))
404	$(INSTALL_BIN) $(PKG_BUILD_DIR)/wpad $(1)/usr/sbin/
405	$(LN) wpad $(1)/usr/sbin/hostapd
406	$(LN) wpad $(1)/usr/sbin/wpa_supplicant
407endef
408Package/wpad-mini/install = $(Package/wpad/install)
409Package/wpad-mesh/install = $(Package/wpad/install)
410
411define Package/wpa-supplicant/install
412	$(call Install/supplicant,$(1))
413	$(INSTALL_BIN) $(PKG_BUILD_DIR)/wpa_supplicant/wpa_supplicant $(1)/usr/sbin/
414endef
415Package/wpa-supplicant-mini/install = $(Package/wpa-supplicant/install)
416Package/wpa-supplicant-p2p/install = $(Package/wpa-supplicant/install)
417
418ifneq ($(LOCAL_TYPE),hostapd)
419  define Package/wpa-cli/install
420	$(INSTALL_DIR) $(1)/usr/sbin
421	$(CP) $(PKG_BUILD_DIR)/wpa_supplicant/wpa_cli $(1)/usr/sbin/
422  endef
423endif
424
425ifeq ($(BUILD_VARIANT),supplicant-full)
426  define Package/eapol-test/install
427	$(INSTALL_DIR) $(1)/usr/sbin
428	$(CP) $(PKG_BUILD_DIR)/wpa_supplicant/eapol_test $(1)/usr/sbin/
429  endef
430endif
431
432$(eval $(call BuildPackage,hostapd))
433$(eval $(call BuildPackage,hostapd-mini))
434$(eval $(call BuildPackage,wpad))
435$(eval $(call BuildPackage,wpad-mesh))
436$(eval $(call BuildPackage,wpad-mini))
437$(eval $(call BuildPackage,wpa-supplicant))
438$(eval $(call BuildPackage,wpa-supplicant-mesh))
439$(eval $(call BuildPackage,wpa-supplicant-mini))
440$(eval $(call BuildPackage,wpa-supplicant-p2p))
441$(eval $(call BuildPackage,wpa-cli))
442$(eval $(call BuildPackage,hostapd-utils))
443$(eval $(call BuildPackage,hostapd-common))
444$(eval $(call BuildPackage,hostapd-common-old))
445$(eval $(call BuildPackage,eapol-test))
446