From 221490f6b4eea24293c33f5b3fb5af422ddd11bc Mon Sep 17 00:00:00 2001
From: nbd <nbd@3c298f89-4303-0410-b956-a3cf2f4a3e73>
Date: Thu, 8 Jul 2010 18:36:22 +0000
Subject: hostapd: make rfkill support optional

git-svn-id: svn://svn.openwrt.org/openwrt/trunk@22101 3c298f89-4303-0410-b956-a3cf2f4a3e73
---
 package/hostapd/Config.in                   |   5 +
 package/hostapd/Makefile                    |   6 +-
 package/hostapd/patches/410-no_rfkill.patch | 263 ++++++++++++++++++++++++++++
 3 files changed, 272 insertions(+), 2 deletions(-)
 create mode 100644 package/hostapd/patches/410-no_rfkill.patch

diff --git a/package/hostapd/Config.in b/package/hostapd/Config.in
index 19893382a..a74cbae96 100644
--- a/package/hostapd/Config.in
+++ b/package/hostapd/Config.in
@@ -20,3 +20,8 @@ config WPA_SUPPLICANT_OPENSSL
 	select PACKAGE_libopenssl
 
 endchoice
+
+config WPA_RFKILL_SUPPORT
+	bool "Add rfkill support"
+	depends PACKAGE_wpa-supplicant || PACKAGE_wpa-supplicant-mini || PACKAGE_wpad || PACKAGE_wpad-mini
+	default n
diff --git a/package/hostapd/Makefile b/package/hostapd/Makefile
index dcbe9e53a..3e4864dcc 100644
--- a/package/hostapd/Makefile
+++ b/package/hostapd/Makefile
@@ -30,7 +30,8 @@ PKG_CONFIG_DEPENDS:= \
 	CONFIG_PACKAGE_kmod-madwifi \
 	CONFIG_PACKAGE_hostapd \
 	CONFIG_PACKAGE_hostapd-mini \
-	CONFIG_PACKAGE_kmod-hostap
+	CONFIG_PACKAGE_kmod-hostap \
+	CONFIG_WPA_RFKILL_SUPPORT
 
 LOCAL_TYPE=$(strip \
 		$(if $(findstring wpad,$(BUILD_VARIANT)),wpad, \
@@ -64,7 +65,8 @@ DRIVER_MAKEOPTS= \
 	CONFIG_DRIVER_MADWIFI=$(CONFIG_PACKAGE_kmod-madwifi) \
 	CONFIG_DRIVER_HOSTAP=$(CONFIG_PACKAGE_kmod-hostap) \
 	CONFIG_IEEE80211N=$(HOSTAPD_IEEE80211N) \
-	CONFIG_IEEE80211W=$(CONFIG_PACKAGE_kmod-ath9k)
+	CONFIG_IEEE80211W=$(CONFIG_PACKAGE_kmod-ath9k) \
+	$(if $(CONFIG_WPA_RFKILL_SUPPORT),NEED_RFKILL=y)
 
 ifneq ($(LOCAL_TYPE),hostapd)
   ifdef CONFIG_WPA_SUPPLICANT_OPENSSL
diff --git a/package/hostapd/patches/410-no_rfkill.patch b/package/hostapd/patches/410-no_rfkill.patch
new file mode 100644
index 000000000..f7e8bc057
--- /dev/null
+++ b/package/hostapd/patches/410-no_rfkill.patch
@@ -0,0 +1,263 @@
+--- a/src/drivers/driver_nl80211.c
++++ b/src/drivers/driver_nl80211.c
+@@ -75,7 +75,9 @@ struct wpa_driver_nl80211_data {
+ 	int ifindex;
+ 	int if_removed;
+ 	int if_disabled;
++#ifdef CONFIG_RFKILL
+ 	struct rfkill_data *rfkill;
++#endif
+ 	struct wpa_driver_capa capa;
+ 	int has_capability;
+ 
+@@ -1361,7 +1363,7 @@ err1:
+ 	return -1;
+ }
+ 
+-
++#ifdef CONFIG_RFKILL
+ static void wpa_driver_nl80211_rfkill_blocked(void *ctx)
+ {
+ 	wpa_printf(MSG_DEBUG, "nl80211: RFKILL blocked");
+@@ -1383,6 +1385,7 @@ static void wpa_driver_nl80211_rfkill_un
+ 	}
+ 	/* rtnetlink ifup handler will report interface as enabled */
+ }
++#endif /* CONFIG_RFKILL */
+ 
+ 
+ /**
+@@ -1396,7 +1399,9 @@ static void * wpa_driver_nl80211_init(vo
+ {
+ 	struct wpa_driver_nl80211_data *drv;
+ 	struct netlink_config *cfg;
++#ifdef CONFIG_RFKILL
+ 	struct rfkill_config *rcfg;
++#endif
+ 	struct i802_bss *bss;
+ 
+ 	drv = os_zalloc(sizeof(*drv));
+@@ -1434,6 +1439,7 @@ static void * wpa_driver_nl80211_init(vo
+ 		goto failed;
+ 	}
+ 
++#ifdef CONFIG_RFKILL
+ 	rcfg = os_zalloc(sizeof(*rcfg));
+ 	if (rcfg == NULL)
+ 		goto failed;
+@@ -1446,6 +1452,7 @@ static void * wpa_driver_nl80211_init(vo
+ 		wpa_printf(MSG_DEBUG, "nl80211: RFKILL status not available");
+ 		os_free(rcfg);
+ 	}
++#endif /* CONFIG_RFKILL */
+ 
+ 	if (wpa_driver_nl80211_finish_drv_init(drv))
+ 		goto failed;
+@@ -1453,7 +1460,9 @@ static void * wpa_driver_nl80211_init(vo
+ 	return bss;
+ 
+ failed:
++#ifdef CONFIG_RFKILL
+ 	rfkill_deinit(drv->rfkill);
++#endif
+ 	netlink_deinit(drv->netlink);
+ 	if (drv->ioctl_sock >= 0)
+ 		close(drv->ioctl_sock);
+@@ -1514,10 +1523,12 @@ static int nl80211_register_action_frame
+ }
+ 
+ 
++#ifdef CONFIG_RFKILL
+ static void wpa_driver_nl80211_send_rfkill(void *eloop_ctx, void *timeout_ctx)
+ {
+ 	wpa_supplicant_event(timeout_ctx, EVENT_INTERFACE_DISABLED, NULL);
+ }
++#endif /* CONFIG_RFKILL */
+ 
+ 
+ static int
+@@ -1536,13 +1547,16 @@ wpa_driver_nl80211_finish_drv_init(struc
+ 		}
+ 
+ 		if (linux_set_iface_flags(drv->ioctl_sock, bss->ifname, 1)) {
++#ifdef CONFIG_RFKILL
+ 			if (rfkill_is_blocked(drv->rfkill)) {
+ 				wpa_printf(MSG_DEBUG, "nl80211: Could not yet enable "
+ 					   "interface '%s' due to rfkill",
+ 					   bss->ifname);
+ 				drv->if_disabled = 1;
+ 				send_rfkill_event = 1;
+-			} else {
++			} else
++#endif
++			{
+ 				wpa_printf(MSG_ERROR, "nl80211: Could not set "
+ 					   "interface '%s' UP", bss->ifname);
+ 				return -1;
+@@ -1567,8 +1581,10 @@ wpa_driver_nl80211_finish_drv_init(struc
+ 	}
+ 
+ 	if (send_rfkill_event) {
++#ifdef CONFIG_RFKILL
+ 		eloop_register_timeout(0, 0, wpa_driver_nl80211_send_rfkill,
+ 				       drv, drv->ctx);
++#endif
+ 	}
+ 
+ 	return 0;
+@@ -1647,7 +1663,9 @@ static void wpa_driver_nl80211_deinit(vo
+ 
+ 	netlink_send_oper_ifla(drv->netlink, drv->ifindex, 0, IF_OPER_UP);
+ 	netlink_deinit(drv->netlink);
++#ifdef CONFIG_RFKILL
+ 	rfkill_deinit(drv->rfkill);
++#endif
+ 
+ 	eloop_cancel_timeout(wpa_driver_nl80211_scan_timeout, drv, drv->ctx);
+ 
+--- a/src/drivers/driver_wext.c
++++ b/src/drivers/driver_wext.c
+@@ -700,7 +700,7 @@ static void wpa_driver_wext_event_rtm_de
+ 	}
+ }
+ 
+-
++#ifdef CONFIG_RFKILL
+ static void wpa_driver_wext_rfkill_blocked(void *ctx)
+ {
+ 	wpa_printf(MSG_DEBUG, "WEXT: RFKILL blocked");
+@@ -722,7 +722,7 @@ static void wpa_driver_wext_rfkill_unblo
+ 	}
+ 	/* rtnetlink ifup handler will report interface as enabled */
+ }
+-
++#endif /* CONFIG_RFKILL */
+ 
+ /**
+  * wpa_driver_wext_init - Initialize WE driver interface
+@@ -735,7 +735,9 @@ void * wpa_driver_wext_init(void *ctx, c
+ {
+ 	struct wpa_driver_wext_data *drv;
+ 	struct netlink_config *cfg;
++#ifdef CONFIG_RFKILL
+ 	struct rfkill_config *rcfg;
++#endif
+ 	char path[128];
+ 	struct stat buf;
+ 
+@@ -769,6 +771,7 @@ void * wpa_driver_wext_init(void *ctx, c
+ 		goto err2;
+ 	}
+ 
++#ifdef CONFIG_RFKILL
+ 	rcfg = os_zalloc(sizeof(*rcfg));
+ 	if (rcfg == NULL)
+ 		goto err3;
+@@ -781,6 +784,7 @@ void * wpa_driver_wext_init(void *ctx, c
+ 		wpa_printf(MSG_DEBUG, "WEXT: RFKILL status not available");
+ 		os_free(rcfg);
+ 	}
++#endif /* CONFIG_RFKILL */
+ 
+ 	drv->mlme_sock = -1;
+ 
+@@ -792,7 +796,9 @@ void * wpa_driver_wext_init(void *ctx, c
+ 	return drv;
+ 
+ err3:
++#ifdef CONFIG_RFKILL
+ 	rfkill_deinit(drv->rfkill);
++#endif
+ 	netlink_deinit(drv->netlink);
+ err2:
+ 	close(drv->ioctl_sock);
+@@ -802,10 +808,12 @@ err1:
+ }
+ 
+ 
++#ifdef CONFIG_RFKILL
+ static void wpa_driver_wext_send_rfkill(void *eloop_ctx, void *timeout_ctx)
+ {
+ 	wpa_supplicant_event(timeout_ctx, EVENT_INTERFACE_DISABLED, NULL);
+ }
++#endif /* CONFIG_RFKILL */
+ 
+ 
+ static int wpa_driver_wext_finish_drv_init(struct wpa_driver_wext_data *drv)
+@@ -813,13 +821,16 @@ static int wpa_driver_wext_finish_drv_in
+ 	int send_rfkill_event = 0;
+ 
+ 	if (linux_set_iface_flags(drv->ioctl_sock, drv->ifname, 1) < 0) {
++#ifdef CONFIG_RFKILL
+ 		if (rfkill_is_blocked(drv->rfkill)) {
+ 			wpa_printf(MSG_DEBUG, "WEXT: Could not yet enable "
+ 				   "interface '%s' due to rfkill",
+ 				   drv->ifname);
+ 			drv->if_disabled = 1;
+ 			send_rfkill_event = 1;
+-		} else {
++		} else
++#endif
++		{
+ 			wpa_printf(MSG_ERROR, "WEXT: Could not set "
+ 				   "interface '%s' UP", drv->ifname);
+ 			return -1;
+@@ -867,8 +878,10 @@ static int wpa_driver_wext_finish_drv_in
+ 			       1, IF_OPER_DORMANT);
+ 
+ 	if (send_rfkill_event) {
++#ifdef CONFIG_RFKILL
+ 		eloop_register_timeout(0, 0, wpa_driver_wext_send_rfkill,
+ 				       drv, drv->ctx);
++#endif
+ 	}
+ 
+ 	return 0;
+@@ -898,7 +911,9 @@ void wpa_driver_wext_deinit(void *priv)
+ 
+ 	netlink_send_oper_ifla(drv->netlink, drv->ifindex, 0, IF_OPER_UP);
+ 	netlink_deinit(drv->netlink);
++#ifdef CONFIG_RFKILL
+ 	rfkill_deinit(drv->rfkill);
++#endif
+ 
+ 	if (drv->mlme_sock >= 0)
+ 		eloop_unregister_read_sock(drv->mlme_sock);
+--- a/src/drivers/drivers.mak
++++ b/src/drivers/drivers.mak
+@@ -31,7 +31,6 @@ NEED_SME=y
+ NEED_AP_MLME=y
+ NEED_NETLINK=y
+ NEED_LINUX_IOCTL=y
+-NEED_RFKILL=y
+ DRV_LIBS += -lnl
+ 
+ ifdef CONFIG_LIBNL20
+@@ -78,7 +77,6 @@ DRV_WPA_CFLAGS += -DCONFIG_DRIVER_WEXT
+ CONFIG_WIRELESS_EXTENSION=y
+ NEED_NETLINK=y
+ NEED_LINUX_IOCTL=y
+-NEED_RFKILL=y
+ endif
+ 
+ ifdef CONFIG_DRIVER_HERMES
+@@ -166,6 +164,7 @@ endif
+ 
+ ifdef NEED_RFKILL
+ DRV_OBJS += ../src/drivers/rfkill.o
++DRV_WPA_CFLAGS += -DCONFIG_RFKILL
+ endif
+ 
+ 
+--- a/src/drivers/driver_wext.h
++++ b/src/drivers/driver_wext.h
+@@ -27,7 +27,9 @@ struct wpa_driver_wext_data {
+ 	int ifindex2;
+ 	int if_removed;
+ 	int if_disabled;
++#ifdef CONFIG_RFKILL
+ 	struct rfkill_data *rfkill;
++#endif
+ 	u8 *assoc_req_ies;
+ 	size_t assoc_req_ies_len;
+ 	u8 *assoc_resp_ies;
-- 
cgit v1.2.3