hostapd: make rfkill support optional
authorFelix Fietkau <nbd@openwrt.org>
Thu, 8 Jul 2010 18:36:22 +0000 (18:36 +0000)
committerFelix Fietkau <nbd@openwrt.org>
Thu, 8 Jul 2010 18:36:22 +0000 (18:36 +0000)
SVN-Revision: 22101

package/hostapd/Config.in
package/hostapd/Makefile
package/hostapd/patches/410-no_rfkill.patch [new file with mode: 0644]

index 19893382a1a13868f4375dc32a23df223c3e904a..a74cbae966f1d9ac5c26d1e9935d9c6eb1d823c3 100644 (file)
@@ -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
index dcbe9e53a678684726dbfba9e2e6d5a67cd3337e..3e4864dcc06d9b7989eac5c9e8467717836e0dbb 100644 (file)
@@ -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 (file)
index 0000000..f7e8bc0
--- /dev/null
@@ -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;