]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
hostap: Remove the driver interface for the Host AP driver
authorJouni Malinen <j@w1.fi>
Thu, 2 Oct 2025 20:22:56 +0000 (23:22 +0300)
committerJouni Malinen <j@w1.fi>
Thu, 2 Oct 2025 20:30:48 +0000 (23:30 +0300)
The Host AP driver was removed from the Linux kernel two years ago and
it had been marked obsolete before (almost ten years ago). As such,
there is not really much point in maintaining any of this code in
hostapd or wpa_supplicant anymore.

Signed-off-by: Jouni Malinen <j@w1.fi>
12 files changed:
hostapd/README
hostapd/android.config
hostapd/defconfig
src/drivers/driver.h
src/drivers/driver_hostap.c [deleted file]
src/drivers/driver_hostap.h [deleted file]
src/drivers/driver_wext.c
src/drivers/drivers.c
src/drivers/drivers.mak
src/drivers/drivers.mk
wpa_supplicant/Makefile
wpa_supplicant/events.c

index 1a0248fce422c0d89997f0c410640cb2a3bd7204..2fcb5d19c20f05efd981bc9e8e0e3f505186d072 100644 (file)
@@ -69,11 +69,6 @@ Requirements
 
 Current hardware/software requirements:
 - drivers:
-       Host AP driver for Prism2/2.5/3.
-       (http://w1.fi/hostap-driver.html)
-       Please note that station firmware version needs to be 1.7.0 or newer
-       to work in WPA mode.
-
        mac80211-based drivers that support AP mode (with driver=nl80211).
        This includes drivers for Atheros (ath9k) and Broadcom (b43)
        chipsets.
@@ -125,7 +120,7 @@ use an external Authentication Server and encapsulate EAP frame in the
 frames used by that server. RADIUS is suitable for this, but IEEE
 802.1X would also allow other mechanisms.
 
-Host AP driver includes PAE functionality in the kernel driver. It
+Drivers include PAE functionality in the kernel driver. It
 is a relatively simple mechanism for denying normal frames going to
 or coming from an unauthorized port. PAE allows IEEE 802.1X related
 frames to be passed between the Supplicant and the Authenticator even
@@ -156,7 +151,7 @@ with the Authentication Server. After this is completed successfully,
 the virtual port is set to Authorized state and frames from and to the
 station are accepted.
 
-Host AP configuration for IEEE 802.1X
+hostapd configuration for IEEE 802.1X
 -------------------------------------
 
 The user space daemon has its own configuration file that can be used to
index 522de87266d5e268aa6a77b8d43d305aece3bbaf..133a8111286d6cac7b5f82a8b9dca9b5db9ab62d 100644 (file)
@@ -9,9 +9,6 @@
 # be modified from here. In most cass, these lines should use += in order not
 # to override previous values of the variables.
 
-# Driver interface for Host AP driver
-#CONFIG_DRIVER_HOSTAP=y
-
 # Driver interface for wired authenticator
 #CONFIG_DRIVER_WIRED=y
 
index 550db697bc0ad99febbb2874f383623db55769fb..7002b3a25fcbbb5b33c43e289d9a0429e690aac6 100644 (file)
@@ -9,9 +9,6 @@
 # be modified from here. In most cass, these lines should use += in order not
 # to override previous values of the variables.
 
-# Driver interface for Host AP driver
-CONFIG_DRIVER_HOSTAP=y
-
 # Driver interface for wired authenticator
 #CONFIG_DRIVER_WIRED=y
 
index d943062feb41537a6303d150a0fc8f152f61f730..fbd4a546c6a0fa195ccd319a0b43c9c2544d2e95 100644 (file)
@@ -7274,9 +7274,6 @@ extern const struct wpa_driver_ops wpa_driver_wext_ops; /* driver_wext.c */
 /* driver_nl80211.c */
 extern const struct wpa_driver_ops wpa_driver_nl80211_ops;
 #endif /* CONFIG_DRIVER_NL80211 */
-#ifdef CONFIG_DRIVER_HOSTAP
-extern const struct wpa_driver_ops wpa_driver_hostap_ops; /* driver_hostap.c */
-#endif /* CONFIG_DRIVER_HOSTAP */
 #ifdef CONFIG_DRIVER_BSD
 extern const struct wpa_driver_ops wpa_driver_bsd_ops; /* driver_bsd.c */
 #endif /* CONFIG_DRIVER_BSD */
diff --git a/src/drivers/driver_hostap.c b/src/drivers/driver_hostap.c
deleted file mode 100644 (file)
index e2c6c19..0000000
+++ /dev/null
@@ -1,1211 +0,0 @@
-/*
- * Driver interaction with Linux Host AP driver
- * Copyright (c) 2003-2005, Jouni Malinen <j@w1.fi>
- *
- * This software may be distributed under the terms of the BSD license.
- * See README for more details.
- */
-
-#include "includes.h"
-#include <sys/ioctl.h>
-
-#include "linux_wext.h"
-#include "common.h"
-#include "driver.h"
-#include "driver_wext.h"
-#include "eloop.h"
-#include "driver_hostap.h"
-
-
-#include <net/if_arp.h>
-#include <netpacket/packet.h>
-
-#include "priv_netlink.h"
-#include "netlink.h"
-#include "linux_ioctl.h"
-#include "common/ieee802_11_defs.h"
-#include "common/ieee802_11_common.h"
-
-
-/* MTU to be set for the wlan#ap device; this is mainly needed for IEEE 802.1X
- * frames that might be longer than normal default MTU and they are not
- * fragmented */
-#define HOSTAPD_MTU 2290
-
-static const u8 rfc1042_header[6] = { 0xaa, 0xaa, 0x03, 0x00, 0x00, 0x00 };
-
-struct hostap_driver_data {
-       struct hostapd_data *hapd;
-
-       char iface[IFNAMSIZ + 1];
-       int sock; /* raw packet socket for driver access */
-       int ioctl_sock; /* socket for ioctl() use */
-       struct netlink_data *netlink;
-
-       int we_version;
-
-       u8 *generic_ie;
-       size_t generic_ie_len;
-       u8 *wps_ie;
-       size_t wps_ie_len;
-};
-
-
-static int hostapd_ioctl(void *priv, struct prism2_hostapd_param *param,
-                        int len);
-static int hostap_set_iface_flags(void *priv, int dev_up);
-
-static void handle_data(struct hostap_driver_data *drv, u8 *buf, size_t len,
-                       u16 stype)
-{
-       struct ieee80211_hdr *hdr;
-       u16 fc, ethertype;
-       u8 *pos, *sa;
-       size_t left;
-       union wpa_event_data event;
-
-       if (len < sizeof(struct ieee80211_hdr))
-               return;
-
-       hdr = (struct ieee80211_hdr *) buf;
-       fc = le_to_host16(hdr->frame_control);
-
-       if ((fc & (WLAN_FC_FROMDS | WLAN_FC_TODS)) != WLAN_FC_TODS) {
-               printf("Not ToDS data frame (fc=0x%04x)\n", fc);
-               return;
-       }
-
-       sa = hdr->addr2;
-       os_memset(&event, 0, sizeof(event));
-       event.rx_from_unknown.bssid = get_hdr_bssid(hdr, len);
-       event.rx_from_unknown.addr = sa;
-       wpa_supplicant_event(drv->hapd, EVENT_RX_FROM_UNKNOWN, &event);
-
-       pos = (u8 *) (hdr + 1);
-       left = len - sizeof(*hdr);
-
-       if (left < sizeof(rfc1042_header)) {
-               printf("Too short data frame\n");
-               return;
-       }
-
-       if (memcmp(pos, rfc1042_header, sizeof(rfc1042_header)) != 0) {
-               printf("Data frame with no RFC1042 header\n");
-               return;
-       }
-       pos += sizeof(rfc1042_header);
-       left -= sizeof(rfc1042_header);
-
-       if (left < 2) {
-               printf("No ethertype in data frame\n");
-               return;
-       }
-
-       ethertype = WPA_GET_BE16(pos);
-       pos += 2;
-       left -= 2;
-       switch (ethertype) {
-       case ETH_P_PAE:
-               drv_event_eapol_rx(drv->hapd, sa, pos, left);
-               break;
-
-       default:
-               printf("Unknown ethertype 0x%04x in data frame\n", ethertype);
-               break;
-       }
-}
-
-
-static void handle_tx_callback(struct hostap_driver_data *drv, u8 *buf,
-                              size_t len, int ok)
-{
-       struct ieee80211_hdr *hdr;
-       u16 fc;
-       union wpa_event_data event;
-
-       hdr = (struct ieee80211_hdr *) buf;
-       fc = le_to_host16(hdr->frame_control);
-
-       os_memset(&event, 0, sizeof(event));
-       event.tx_status.type = WLAN_FC_GET_TYPE(fc);
-       event.tx_status.stype = WLAN_FC_GET_STYPE(fc);
-       event.tx_status.dst = hdr->addr1;
-       event.tx_status.data = buf;
-       event.tx_status.data_len = len;
-       event.tx_status.ack = ok;
-       wpa_supplicant_event(drv->hapd, EVENT_TX_STATUS, &event);
-}
-
-
-static void handle_frame(struct hostap_driver_data *drv, u8 *buf, size_t len)
-{
-       struct ieee80211_hdr *hdr;
-       u16 fc, type, stype;
-       size_t data_len = len;
-       int ver;
-       union wpa_event_data event;
-
-       /* PSPOLL is only 16 bytes, but driver does not (at least yet) pass
-        * these to user space */
-       if (len < 24) {
-               wpa_printf(MSG_MSGDUMP, "handle_frame: too short (%lu)",
-                          (unsigned long) len);
-               return;
-       }
-
-       hdr = (struct ieee80211_hdr *) buf;
-       fc = le_to_host16(hdr->frame_control);
-       type = WLAN_FC_GET_TYPE(fc);
-       stype = WLAN_FC_GET_STYPE(fc);
-
-       if (type != WLAN_FC_TYPE_MGMT || stype != WLAN_FC_STYPE_BEACON) {
-               wpa_hexdump(MSG_MSGDUMP, "Received management frame",
-                           buf, len);
-       }
-
-       ver = fc & WLAN_FC_PVER;
-
-       /* protocol version 2 is reserved for indicating ACKed frame (TX
-        * callbacks), and version 1 for indicating failed frame (no ACK, TX
-        * callbacks) */
-       if (ver == 1 || ver == 2) {
-               handle_tx_callback(drv, buf, data_len, ver == 2 ? 1 : 0);
-               return;
-       } else if (ver != 0) {
-               printf("unknown protocol version %d\n", ver);
-               return;
-       }
-
-       switch (type) {
-       case WLAN_FC_TYPE_MGMT:
-               os_memset(&event, 0, sizeof(event));
-               event.rx_mgmt.frame = buf;
-               event.rx_mgmt.frame_len = data_len;
-               wpa_supplicant_event(drv->hapd, EVENT_RX_MGMT, &event);
-               break;
-       case WLAN_FC_TYPE_CTRL:
-               wpa_printf(MSG_DEBUG, "CTRL");
-               break;
-       case WLAN_FC_TYPE_DATA:
-               wpa_printf(MSG_DEBUG, "DATA");
-               handle_data(drv, buf, data_len, stype);
-               break;
-       default:
-               wpa_printf(MSG_DEBUG, "unknown frame type %d", type);
-               break;
-       }
-}
-
-
-static void handle_read(int sock, void *eloop_ctx, void *sock_ctx)
-{
-       struct hostap_driver_data *drv = eloop_ctx;
-       int len;
-       unsigned char buf[3000];
-
-       len = recv(sock, buf, sizeof(buf), 0);
-       if (len < 0) {
-               wpa_printf(MSG_ERROR, "recv: %s", strerror(errno));
-               return;
-       }
-
-       handle_frame(drv, buf, len);
-}
-
-
-static int hostap_init_sockets(struct hostap_driver_data *drv, u8 *own_addr)
-{
-       struct ifreq ifr;
-       struct sockaddr_ll addr;
-
-       drv->sock = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL));
-       if (drv->sock < 0) {
-               wpa_printf(MSG_ERROR, "socket[PF_PACKET,SOCK_RAW]: %s",
-                          strerror(errno));
-               return -1;
-       }
-
-       if (eloop_register_read_sock(drv->sock, handle_read, drv, NULL)) {
-               wpa_printf(MSG_ERROR, "Could not register read socket");
-               return -1;
-       }
-
-        memset(&ifr, 0, sizeof(ifr));
-       if (os_snprintf(ifr.ifr_name, sizeof(ifr.ifr_name), "%sap",
-                       drv->iface) >= (int) sizeof(ifr.ifr_name)) {
-               wpa_printf(MSG_ERROR, "hostap: AP interface name truncated");
-               return -1;
-       }
-        if (ioctl(drv->sock, SIOCGIFINDEX, &ifr) != 0) {
-               wpa_printf(MSG_ERROR, "ioctl(SIOCGIFINDEX): %s",
-                          strerror(errno));
-               return -1;
-        }
-
-       if (hostap_set_iface_flags(drv, 1)) {
-               return -1;
-       }
-
-       memset(&addr, 0, sizeof(addr));
-       addr.sll_family = AF_PACKET;
-       addr.sll_ifindex = ifr.ifr_ifindex;
-       wpa_printf(MSG_DEBUG, "Opening raw packet socket for ifindex %d",
-                  addr.sll_ifindex);
-
-       if (bind(drv->sock, (struct sockaddr *) &addr, sizeof(addr)) < 0) {
-               wpa_printf(MSG_ERROR, "bind: %s", strerror(errno));
-               return -1;
-       }
-
-       return linux_get_ifhwaddr(drv->sock, drv->iface, own_addr);
-}
-
-
-static int hostap_send_mlme(void *priv, const u8 *msg, size_t len, int noack,
-                           unsigned int freq,
-                           const u16 *csa_offs, size_t csa_offs_len,
-                           int no_encrypt, unsigned int wait, int link_id)
-{
-       struct hostap_driver_data *drv = priv;
-       struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) msg;
-       int res;
-
-       /* Request TX callback */
-       hdr->frame_control |= host_to_le16(BIT(1));
-       res = send(drv->sock, msg, len, 0);
-       hdr->frame_control &= ~host_to_le16(BIT(1));
-
-       return res;
-}
-
-
-static int hostap_send_eapol(void *priv, const u8 *addr, const u8 *data,
-                            size_t data_len, int encrypt, const u8 *own_addr,
-                            u32 flags, int link_id)
-{
-       struct hostap_driver_data *drv = priv;
-       struct ieee80211_hdr *hdr;
-       size_t len;
-       u8 *pos;
-       int res;
-
-       len = sizeof(*hdr) + sizeof(rfc1042_header) + 2 + data_len;
-       hdr = os_zalloc(len);
-       if (hdr == NULL) {
-               printf("malloc() failed for hostapd_send_data(len=%lu)\n",
-                      (unsigned long) len);
-               return -1;
-       }
-
-       hdr->frame_control =
-               IEEE80211_FC(WLAN_FC_TYPE_DATA, WLAN_FC_STYPE_DATA);
-       hdr->frame_control |= host_to_le16(WLAN_FC_FROMDS);
-       if (encrypt)
-               hdr->frame_control |= host_to_le16(WLAN_FC_ISWEP);
-       memcpy(hdr->IEEE80211_DA_FROMDS, addr, ETH_ALEN);
-       memcpy(hdr->IEEE80211_BSSID_FROMDS, own_addr, ETH_ALEN);
-       memcpy(hdr->IEEE80211_SA_FROMDS, own_addr, ETH_ALEN);
-
-       pos = (u8 *) (hdr + 1);
-       memcpy(pos, rfc1042_header, sizeof(rfc1042_header));
-       pos += sizeof(rfc1042_header);
-       *((u16 *) pos) = htons(ETH_P_PAE);
-       pos += 2;
-       memcpy(pos, data, data_len);
-
-       res = hostap_send_mlme(drv, (u8 *) hdr, len, 0, 0, NULL, 0, 0, 0, -1);
-       if (res < 0) {
-               wpa_printf(MSG_ERROR, "hostap_send_eapol - packet len: %lu - "
-                          "failed: %d (%s)",
-                          (unsigned long) len, errno, strerror(errno));
-       }
-       os_free(hdr);
-
-       return res;
-}
-
-
-static int hostap_sta_set_flags(void *priv, const u8 *addr,
-                               unsigned int total_flags, unsigned int flags_or,
-                               unsigned int flags_and)
-{
-       struct hostap_driver_data *drv = priv;
-       struct prism2_hostapd_param param;
-
-       if (flags_or & WPA_STA_AUTHORIZED)
-               flags_or = BIT(5); /* WLAN_STA_AUTHORIZED */
-       if (!(flags_and & WPA_STA_AUTHORIZED))
-               flags_and = ~BIT(5);
-       else
-               flags_and = ~0;
-       memset(&param, 0, sizeof(param));
-       param.cmd = PRISM2_HOSTAPD_SET_FLAGS_STA;
-       memcpy(param.sta_addr, addr, ETH_ALEN);
-       param.u.set_flags_sta.flags_or = flags_or;
-       param.u.set_flags_sta.flags_and = flags_and;
-       return hostapd_ioctl(drv, &param, sizeof(param));
-}
-
-
-static int hostap_set_iface_flags(void *priv, int dev_up)
-{
-       struct hostap_driver_data *drv = priv;
-       struct ifreq ifr;
-       char ifname[IFNAMSIZ];
-
-       if (os_snprintf(ifname, IFNAMSIZ, "%sap", drv->iface) >= IFNAMSIZ) {
-               wpa_printf(MSG_ERROR, "hostap: AP interface name truncated");
-               return -1;
-       }
-       if (linux_set_iface_flags(drv->ioctl_sock, ifname, dev_up) < 0)
-               return -1;
-
-       if (dev_up) {
-               memset(&ifr, 0, sizeof(ifr));
-               os_strlcpy(ifr.ifr_name, ifname, IFNAMSIZ);
-               ifr.ifr_mtu = HOSTAPD_MTU;
-               if (ioctl(drv->ioctl_sock, SIOCSIFMTU, &ifr) != 0) {
-                       wpa_printf(MSG_INFO,
-                                  "Setting MTU failed - trying to survive with current value: ioctl[SIOCSIFMTU]: %s",
-                                  strerror(errno));
-               }
-       }
-
-       return 0;
-}
-
-
-static int hostapd_ioctl(void *priv, struct prism2_hostapd_param *param,
-                        int len)
-{
-       struct hostap_driver_data *drv = priv;
-       struct iwreq iwr;
-
-       memset(&iwr, 0, sizeof(iwr));
-       os_strlcpy(iwr.ifr_name, drv->iface, IFNAMSIZ);
-       iwr.u.data.pointer = (caddr_t) param;
-       iwr.u.data.length = len;
-
-       if (ioctl(drv->ioctl_sock, PRISM2_IOCTL_HOSTAPD, &iwr) < 0) {
-               wpa_printf(MSG_ERROR, "ioctl[PRISM2_IOCTL_HOSTAPD]: %s",
-                          strerror(errno));
-               return -1;
-       }
-
-       return 0;
-}
-
-
-static int wpa_driver_hostap_set_key(void *priv,
-                                    struct wpa_driver_set_key_params *params)
-{
-       struct hostap_driver_data *drv = priv;
-       struct prism2_hostapd_param *param;
-       u8 *buf;
-       size_t blen;
-       int ret = 0;
-       enum wpa_alg alg = params->alg;
-       const u8 *addr = params->addr;
-       int key_idx = params->key_idx;
-       int set_tx = params->set_tx;
-       const u8 *key = params->key;
-       size_t key_len = params->key_len;
-
-       if (params->key_flag & KEY_FLAG_NEXT)
-               return -1;
-
-       blen = sizeof(*param) + key_len;
-       buf = os_zalloc(blen);
-       if (buf == NULL)
-               return -1;
-
-       param = (struct prism2_hostapd_param *) buf;
-       param->cmd = PRISM2_SET_ENCRYPTION;
-       if (addr == NULL)
-               memset(param->sta_addr, 0xff, ETH_ALEN);
-       else
-               memcpy(param->sta_addr, addr, ETH_ALEN);
-       switch (alg) {
-       case WPA_ALG_NONE:
-               os_strlcpy((char *) param->u.crypt.alg, "NONE",
-                          HOSTAP_CRYPT_ALG_NAME_LEN);
-               break;
-       case WPA_ALG_WEP:
-               os_strlcpy((char *) param->u.crypt.alg, "WEP",
-                          HOSTAP_CRYPT_ALG_NAME_LEN);
-               break;
-       case WPA_ALG_TKIP:
-               os_strlcpy((char *) param->u.crypt.alg, "TKIP",
-                          HOSTAP_CRYPT_ALG_NAME_LEN);
-               break;
-       case WPA_ALG_CCMP:
-               os_strlcpy((char *) param->u.crypt.alg, "CCMP",
-                          HOSTAP_CRYPT_ALG_NAME_LEN);
-               break;
-       default:
-               os_free(buf);
-               return -1;
-       }
-       param->u.crypt.flags = set_tx ? HOSTAP_CRYPT_FLAG_SET_TX_KEY : 0;
-       param->u.crypt.idx = key_idx;
-       param->u.crypt.key_len = key_len;
-       memcpy((u8 *) (param + 1), key, key_len);
-
-       if (hostapd_ioctl(drv, param, blen)) {
-               printf("Failed to set encryption.\n");
-               ret = -1;
-       }
-       free(buf);
-
-       return ret;
-}
-
-
-static int hostap_get_seqnum(const char *ifname, void *priv, const u8 *addr,
-                            int idx, int link_id, u8 *seq)
-{
-       struct hostap_driver_data *drv = priv;
-       struct prism2_hostapd_param *param;
-       u8 *buf;
-       size_t blen;
-       int ret = 0;
-
-       blen = sizeof(*param) + 32;
-       buf = os_zalloc(blen);
-       if (buf == NULL)
-               return -1;
-
-       param = (struct prism2_hostapd_param *) buf;
-       param->cmd = PRISM2_GET_ENCRYPTION;
-       if (addr == NULL)
-               os_memset(param->sta_addr, 0xff, ETH_ALEN);
-       else
-               os_memcpy(param->sta_addr, addr, ETH_ALEN);
-       param->u.crypt.idx = idx;
-
-       if (hostapd_ioctl(drv, param, blen)) {
-               printf("Failed to get encryption.\n");
-               ret = -1;
-       } else {
-               os_memcpy(seq, param->u.crypt.seq, 8);
-       }
-       os_free(buf);
-
-       return ret;
-}
-
-
-static int hostap_ioctl_prism2param(void *priv, int param, int value)
-{
-       struct hostap_driver_data *drv = priv;
-       struct iwreq iwr;
-       int *i;
-
-       memset(&iwr, 0, sizeof(iwr));
-       os_strlcpy(iwr.ifr_name, drv->iface, IFNAMSIZ);
-       i = (int *) iwr.u.name;
-       *i++ = param;
-       *i++ = value;
-
-       if (ioctl(drv->ioctl_sock, PRISM2_IOCTL_PRISM2_PARAM, &iwr) < 0) {
-               wpa_printf(MSG_ERROR, "ioctl[PRISM2_IOCTL_PRISM2_PARAM]: %s",
-                          strerror(errno));
-               return -1;
-       }
-
-       return 0;
-}
-
-
-static int hostap_set_ieee8021x(void *priv, struct wpa_bss_params *params)
-{
-       struct hostap_driver_data *drv = priv;
-       int enabled = params->enabled;
-
-       /* enable kernel driver support for IEEE 802.1X */
-       if (hostap_ioctl_prism2param(drv, PRISM2_PARAM_IEEE_802_1X, enabled)) {
-               printf("Could not setup IEEE 802.1X support in kernel driver."
-                      "\n");
-               return -1;
-       }
-
-       if (!enabled)
-               return 0;
-
-       /* use host driver implementation of encryption to allow
-        * individual keys and passing plaintext EAPOL frames */
-       if (hostap_ioctl_prism2param(drv, PRISM2_PARAM_HOST_DECRYPT, 1) ||
-           hostap_ioctl_prism2param(drv, PRISM2_PARAM_HOST_ENCRYPT, 1)) {
-               printf("Could not setup host-based encryption in kernel "
-                      "driver.\n");
-               return -1;
-       }
-
-       return 0;
-}
-
-
-static int hostap_set_privacy(void *priv, int enabled)
-{
-       struct hostap_drvier_data *drv = priv;
-
-       return hostap_ioctl_prism2param(drv, PRISM2_PARAM_PRIVACY_INVOKED,
-                                       enabled);
-}
-
-
-static int hostap_set_ssid(void *priv, const u8 *buf, int len)
-{
-       struct hostap_driver_data *drv = priv;
-       struct iwreq iwr;
-
-       memset(&iwr, 0, sizeof(iwr));
-       os_strlcpy(iwr.ifr_name, drv->iface, IFNAMSIZ);
-       iwr.u.essid.flags = 1; /* SSID active */
-       iwr.u.essid.pointer = (caddr_t) buf;
-       iwr.u.essid.length = len + 1;
-
-       if (ioctl(drv->ioctl_sock, SIOCSIWESSID, &iwr) < 0) {
-               wpa_printf(MSG_ERROR, "ioctl[SIOCSIWESSID,len=%d]: %s",
-                          len, strerror(errno));
-               return -1;
-       }
-
-       return 0;
-}
-
-
-static int hostap_flush(void *priv, int link_id)
-{
-       struct hostap_driver_data *drv = priv;
-       struct prism2_hostapd_param param;
-
-       memset(&param, 0, sizeof(param));
-       param.cmd = PRISM2_HOSTAPD_FLUSH;
-       return hostapd_ioctl(drv, &param, sizeof(param));
-}
-
-
-static int hostap_read_sta_data(void *priv,
-                               struct hostap_sta_driver_data *data,
-                               const u8 *addr)
-{
-       struct hostap_driver_data *drv = priv;
-       char buf[1024], line[128], *pos;
-       FILE *f;
-       unsigned long val;
-
-       memset(data, 0, sizeof(*data));
-       snprintf(buf, sizeof(buf), "/proc/net/hostap/%s/" MACSTR,
-                drv->iface, MAC2STR(addr));
-
-       f = fopen(buf, "r");
-       if (!f)
-               return -1;
-       /* Need to read proc file with in one piece, so use large enough
-        * buffer. */
-       setbuffer(f, buf, sizeof(buf));
-
-       while (fgets(line, sizeof(line), f)) {
-               pos = strchr(line, '=');
-               if (!pos)
-                       continue;
-               *pos++ = '\0';
-               val = strtoul(pos, NULL, 10);
-               if (strcmp(line, "rx_packets") == 0)
-                       data->rx_packets = val;
-               else if (strcmp(line, "tx_packets") == 0)
-                       data->tx_packets = val;
-               else if (strcmp(line, "rx_bytes") == 0)
-                       data->rx_bytes = val;
-               else if (strcmp(line, "tx_bytes") == 0)
-                       data->tx_bytes = val;
-       }
-
-       fclose(f);
-
-       return 0;
-}
-
-
-static int hostap_sta_add(void *priv, struct hostapd_sta_add_params *params)
-{
-       struct hostap_driver_data *drv = priv;
-       struct prism2_hostapd_param param;
-       int tx_supp_rates = 0;
-       size_t i;
-
-#define WLAN_RATE_1M BIT(0)
-#define WLAN_RATE_2M BIT(1)
-#define WLAN_RATE_5M5 BIT(2)
-#define WLAN_RATE_11M BIT(3)
-
-       for (i = 0; i < params->supp_rates_len; i++) {
-               if ((params->supp_rates[i] & 0x7f) == 2)
-                       tx_supp_rates |= WLAN_RATE_1M;
-               if ((params->supp_rates[i] & 0x7f) == 4)
-                       tx_supp_rates |= WLAN_RATE_2M;
-               if ((params->supp_rates[i] & 0x7f) == 11)
-                       tx_supp_rates |= WLAN_RATE_5M5;
-               if ((params->supp_rates[i] & 0x7f) == 22)
-                       tx_supp_rates |= WLAN_RATE_11M;
-       }
-
-       memset(&param, 0, sizeof(param));
-       param.cmd = PRISM2_HOSTAPD_ADD_STA;
-       memcpy(param.sta_addr, params->addr, ETH_ALEN);
-       param.u.add_sta.aid = params->aid;
-       param.u.add_sta.capability = params->capability;
-       param.u.add_sta.tx_supp_rates = tx_supp_rates;
-       return hostapd_ioctl(drv, &param, sizeof(param));
-}
-
-
-static int hostap_sta_remove(void *priv, const u8 *addr)
-{
-       struct hostap_driver_data *drv = priv;
-       struct prism2_hostapd_param param;
-
-       hostap_sta_set_flags(drv, addr, 0, 0, ~WPA_STA_AUTHORIZED);
-
-       memset(&param, 0, sizeof(param));
-       param.cmd = PRISM2_HOSTAPD_REMOVE_STA;
-       memcpy(param.sta_addr, addr, ETH_ALEN);
-       if (hostapd_ioctl(drv, &param, sizeof(param))) {
-               printf("Could not remove station from kernel driver.\n");
-               return -1;
-       }
-       return 0;
-}
-
-
-static int hostap_get_inact_sec(void *priv, const u8 *addr)
-{
-       struct hostap_driver_data *drv = priv;
-       struct prism2_hostapd_param param;
-
-       memset(&param, 0, sizeof(param));
-       param.cmd = PRISM2_HOSTAPD_GET_INFO_STA;
-       memcpy(param.sta_addr, addr, ETH_ALEN);
-       if (hostapd_ioctl(drv, &param, sizeof(param))) {
-               return -1;
-       }
-
-       return param.u.get_info_sta.inactive_sec;
-}
-
-
-static int hostap_sta_clear_stats(void *priv, const u8 *addr)
-{
-       struct hostap_driver_data *drv = priv;
-       struct prism2_hostapd_param param;
-
-       memset(&param, 0, sizeof(param));
-       param.cmd = PRISM2_HOSTAPD_STA_CLEAR_STATS;
-       memcpy(param.sta_addr, addr, ETH_ALEN);
-       if (hostapd_ioctl(drv, &param, sizeof(param))) {
-               return -1;
-       }
-
-       return 0;
-}
-
-
-static int hostapd_ioctl_set_generic_elem(struct hostap_driver_data *drv)
-{
-       struct prism2_hostapd_param *param;
-       int res;
-       size_t blen, elem_len;
-
-       elem_len = drv->generic_ie_len + drv->wps_ie_len;
-       blen = PRISM2_HOSTAPD_GENERIC_ELEMENT_HDR_LEN + elem_len;
-       if (blen < sizeof(*param))
-               blen = sizeof(*param);
-
-       param = os_zalloc(blen);
-       if (param == NULL)
-               return -1;
-
-       param->cmd = PRISM2_HOSTAPD_SET_GENERIC_ELEMENT;
-       param->u.generic_elem.len = elem_len;
-       if (drv->generic_ie) {
-               os_memcpy(param->u.generic_elem.data, drv->generic_ie,
-                         drv->generic_ie_len);
-       }
-       if (drv->wps_ie) {
-               os_memcpy(&param->u.generic_elem.data[drv->generic_ie_len],
-                         drv->wps_ie, drv->wps_ie_len);
-       }
-       wpa_hexdump(MSG_DEBUG, "hostap: Set generic IE",
-                   param->u.generic_elem.data, elem_len);
-       res = hostapd_ioctl(drv, param, blen);
-
-       os_free(param);
-
-       return res;
-}
-
-
-static int hostap_set_generic_elem(void *priv,
-                                  const u8 *elem, size_t elem_len)
-{
-       struct hostap_driver_data *drv = priv;
-
-       os_free(drv->generic_ie);
-       drv->generic_ie = NULL;
-       drv->generic_ie_len = 0;
-       if (elem) {
-               drv->generic_ie = os_memdup(elem, elem_len);
-               if (drv->generic_ie == NULL)
-                       return -1;
-               drv->generic_ie_len = elem_len;
-       }
-
-       return hostapd_ioctl_set_generic_elem(drv);
-}
-
-
-static int hostap_set_ap_wps_ie(void *priv, const struct wpabuf *beacon,
-                               const struct wpabuf *proberesp,
-                               const struct wpabuf *assocresp)
-{
-       struct hostap_driver_data *drv = priv;
-
-       /*
-        * Host AP driver supports only one set of extra IEs, so we need to
-        * use the Probe Response IEs also for Beacon frames since they include
-        * more information.
-        */
-
-       os_free(drv->wps_ie);
-       drv->wps_ie = NULL;
-       drv->wps_ie_len = 0;
-       if (proberesp) {
-               drv->wps_ie = os_memdup(wpabuf_head(proberesp),
-                                       wpabuf_len(proberesp));
-               if (drv->wps_ie == NULL)
-                       return -1;
-               drv->wps_ie_len = wpabuf_len(proberesp);
-       }
-
-       return hostapd_ioctl_set_generic_elem(drv);
-}
-
-
-static void
-hostapd_wireless_event_wireless_custom(struct hostap_driver_data *drv,
-                                      char *custom)
-{
-       wpa_printf(MSG_DEBUG, "Custom wireless event: '%s'", custom);
-
-       if (strncmp(custom, "MLME-MICHAELMICFAILURE.indication", 33) == 0) {
-               char *pos;
-               u8 addr[ETH_ALEN];
-               pos = strstr(custom, "addr=");
-               if (pos == NULL) {
-                       wpa_printf(MSG_DEBUG,
-                                  "MLME-MICHAELMICFAILURE.indication "
-                                  "without sender address ignored");
-                       return;
-               }
-               pos += 5;
-               if (hwaddr_aton(pos, addr) == 0) {
-                       union wpa_event_data data;
-                       os_memset(&data, 0, sizeof(data));
-                       data.michael_mic_failure.unicast = 1;
-                       data.michael_mic_failure.src = addr;
-                       wpa_supplicant_event(drv->hapd,
-                                            EVENT_MICHAEL_MIC_FAILURE, &data);
-               } else {
-                       wpa_printf(MSG_DEBUG,
-                                  "MLME-MICHAELMICFAILURE.indication "
-                                  "with invalid MAC address");
-               }
-       }
-}
-
-
-static void hostapd_wireless_event_wireless(struct hostap_driver_data *drv,
-                                           char *data, unsigned int len)
-{
-       struct iw_event iwe_buf, *iwe = &iwe_buf;
-       char *pos, *end, *custom, *buf;
-
-       pos = data;
-       end = data + len;
-
-       while ((size_t) (end - pos) >= IW_EV_LCP_LEN) {
-               /* Event data may be unaligned, so make a local, aligned copy
-                * before processing. */
-               memcpy(&iwe_buf, pos, IW_EV_LCP_LEN);
-               wpa_printf(MSG_DEBUG, "Wireless event: cmd=0x%x len=%d",
-                          iwe->cmd, iwe->len);
-               if (iwe->len <= IW_EV_LCP_LEN || iwe->len > end - pos)
-                       return;
-
-               custom = pos + IW_EV_POINT_LEN;
-               if (drv->we_version > 18 &&
-                   (iwe->cmd == IWEVMICHAELMICFAILURE ||
-                    iwe->cmd == IWEVCUSTOM)) {
-                       /* WE-19 removed the pointer from struct iw_point */
-                       char *dpos = (char *) &iwe_buf.u.data.length;
-                       int dlen = dpos - (char *) &iwe_buf;
-                       memcpy(dpos, pos + IW_EV_LCP_LEN,
-                              sizeof(struct iw_event) - dlen);
-               } else {
-                       memcpy(&iwe_buf, pos, sizeof(struct iw_event));
-                       custom += IW_EV_POINT_OFF;
-               }
-
-               switch (iwe->cmd) {
-               case IWEVCUSTOM:
-                       if (iwe->u.data.length > end - custom)
-                               return;
-                       buf = malloc(iwe->u.data.length + 1);
-                       if (buf == NULL)
-                               return;
-                       memcpy(buf, custom, iwe->u.data.length);
-                       buf[iwe->u.data.length] = '\0';
-                       hostapd_wireless_event_wireless_custom(drv, buf);
-                       free(buf);
-                       break;
-               }
-
-               pos += iwe->len;
-       }
-}
-
-
-static void hostapd_wireless_event_rtm_newlink(void *ctx,
-                                              struct ifinfomsg *ifi,
-                                              u8 *buf, size_t len)
-{
-       struct hostap_driver_data *drv = ctx;
-       int attrlen, rta_len;
-       struct rtattr *attr;
-
-       /* TODO: use ifi->ifi_index to filter out wireless events from other
-        * interfaces */
-
-       attrlen = len;
-       attr = (struct rtattr *) buf;
-
-       rta_len = RTA_ALIGN(sizeof(struct rtattr));
-       while (RTA_OK(attr, attrlen)) {
-               if (attr->rta_type == IFLA_WIRELESS) {
-                       hostapd_wireless_event_wireless(
-                               drv, ((char *) attr) + rta_len,
-                               attr->rta_len - rta_len);
-               }
-               attr = RTA_NEXT(attr, attrlen);
-       }
-}
-
-
-static int hostap_get_we_version(struct hostap_driver_data *drv)
-{
-       struct iw_range *range;
-       struct iwreq iwr;
-       int minlen;
-       size_t buflen;
-
-       drv->we_version = 0;
-
-       /*
-        * Use larger buffer than struct iw_range in order to allow the
-        * structure to grow in the future.
-        */
-       buflen = sizeof(struct iw_range) + 500;
-       range = os_zalloc(buflen);
-       if (range == NULL)
-               return -1;
-
-       memset(&iwr, 0, sizeof(iwr));
-       os_strlcpy(iwr.ifr_name, drv->iface, IFNAMSIZ);
-       iwr.u.data.pointer = (caddr_t) range;
-       iwr.u.data.length = buflen;
-
-       minlen = ((char *) &range->enc_capa) - (char *) range +
-               sizeof(range->enc_capa);
-
-       if (ioctl(drv->ioctl_sock, SIOCGIWRANGE, &iwr) < 0) {
-               wpa_printf(MSG_ERROR, "ioctl[SIOCGIWRANGE]: %s",
-                          strerror(errno));
-               os_free(range);
-               return -1;
-       } else if (iwr.u.data.length >= minlen &&
-                  range->we_version_compiled >= 18) {
-               wpa_printf(MSG_DEBUG, "SIOCGIWRANGE: WE(compiled)=%d "
-                          "WE(source)=%d enc_capa=0x%x",
-                          range->we_version_compiled,
-                          range->we_version_source,
-                          range->enc_capa);
-               drv->we_version = range->we_version_compiled;
-       }
-
-       free(range);
-       return 0;
-}
-
-
-static int hostap_wireless_event_init(struct hostap_driver_data *drv)
-{
-       struct netlink_config *cfg;
-
-       hostap_get_we_version(drv);
-
-       cfg = os_zalloc(sizeof(*cfg));
-       if (cfg == NULL)
-               return -1;
-       cfg->ctx = drv;
-       cfg->newlink_cb = hostapd_wireless_event_rtm_newlink;
-       drv->netlink = netlink_init(cfg);
-       if (drv->netlink == NULL) {
-               os_free(cfg);
-               return -1;
-       }
-
-       return 0;
-}
-
-
-static void * hostap_init(struct hostapd_data *hapd,
-                         struct wpa_init_params *params)
-{
-       struct hostap_driver_data *drv;
-
-       drv = os_zalloc(sizeof(struct hostap_driver_data));
-       if (drv == NULL) {
-               printf("Could not allocate memory for hostapd driver data\n");
-               return NULL;
-       }
-
-       drv->hapd = hapd;
-       drv->ioctl_sock = drv->sock = -1;
-       memcpy(drv->iface, params->ifname, sizeof(drv->iface));
-
-       drv->ioctl_sock = socket(PF_INET, SOCK_DGRAM, 0);
-       if (drv->ioctl_sock < 0) {
-               wpa_printf(MSG_ERROR, "socket[PF_INET,SOCK_DGRAM]: %s",
-                          strerror(errno));
-               os_free(drv);
-               return NULL;
-       }
-
-       if (hostap_ioctl_prism2param(drv, PRISM2_PARAM_HOSTAPD, 1)) {
-               wpa_printf(MSG_ERROR,
-                          "Could not enable hostapd mode for interface %s",
-                          drv->iface);
-               close(drv->ioctl_sock);
-               os_free(drv);
-               return NULL;
-       }
-
-       if (hostap_init_sockets(drv, params->own_addr) ||
-           hostap_wireless_event_init(drv)) {
-               close(drv->ioctl_sock);
-               os_free(drv);
-               return NULL;
-       }
-
-       return drv;
-}
-
-
-static void hostap_driver_deinit(void *priv)
-{
-       struct hostap_driver_data *drv = priv;
-
-       netlink_deinit(drv->netlink);
-       (void) hostap_set_iface_flags(drv, 0);
-       (void) hostap_ioctl_prism2param(drv, PRISM2_PARAM_HOSTAPD, 0);
-       (void) hostap_ioctl_prism2param(drv, PRISM2_PARAM_HOSTAPD_STA, 0);
-
-       if (drv->ioctl_sock >= 0)
-               close(drv->ioctl_sock);
-
-       if (drv->sock >= 0)
-               close(drv->sock);
-
-       os_free(drv->generic_ie);
-       os_free(drv->wps_ie);
-
-       free(drv);
-}
-
-
-static int hostap_sta_deauth(void *priv, const u8 *own_addr, const u8 *addr,
-                            u16 reason, int link_id)
-{
-       struct hostap_driver_data *drv = priv;
-       struct ieee80211_mgmt mgmt;
-
-       if (is_broadcast_ether_addr(addr)) {
-               /*
-                * New Prism2.5/3 STA firmware versions seem to have issues
-                * with this broadcast deauth frame. This gets the firmware in
-                * odd state where nothing works correctly, so let's skip
-                * sending this for the hostap driver.
-                */
-               return 0;
-       }
-
-       memset(&mgmt, 0, sizeof(mgmt));
-       mgmt.frame_control = IEEE80211_FC(WLAN_FC_TYPE_MGMT,
-                                         WLAN_FC_STYPE_DEAUTH);
-       memcpy(mgmt.da, addr, ETH_ALEN);
-       memcpy(mgmt.sa, own_addr, ETH_ALEN);
-       memcpy(mgmt.bssid, own_addr, ETH_ALEN);
-       mgmt.u.deauth.reason_code = host_to_le16(reason);
-       return hostap_send_mlme(drv, (u8 *) &mgmt, IEEE80211_HDRLEN +
-                               sizeof(mgmt.u.deauth), 0, 0, NULL, 0, 0, 0, -1);
-}
-
-
-static int hostap_set_freq(void *priv, struct hostapd_freq_params *freq)
-{
-       struct hostap_driver_data *drv = priv;
-       struct iwreq iwr;
-
-       os_memset(&iwr, 0, sizeof(iwr));
-       os_strlcpy(iwr.ifr_name, drv->iface, IFNAMSIZ);
-       iwr.u.freq.m = freq->channel;
-       iwr.u.freq.e = 0;
-
-       if (ioctl(drv->ioctl_sock, SIOCSIWFREQ, &iwr) < 0) {
-               wpa_printf(MSG_ERROR, "ioctl[SIOCSIWFREQ]: %s",
-                          strerror(errno));
-               return -1;
-       }
-
-       return 0;
-}
-
-
-static int hostap_sta_disassoc(void *priv, const u8 *own_addr, const u8 *addr,
-                              u16 reason, int link_id)
-{
-       struct hostap_driver_data *drv = priv;
-       struct ieee80211_mgmt mgmt;
-
-       memset(&mgmt, 0, sizeof(mgmt));
-       mgmt.frame_control = IEEE80211_FC(WLAN_FC_TYPE_MGMT,
-                                         WLAN_FC_STYPE_DISASSOC);
-       memcpy(mgmt.da, addr, ETH_ALEN);
-       memcpy(mgmt.sa, own_addr, ETH_ALEN);
-       memcpy(mgmt.bssid, own_addr, ETH_ALEN);
-       mgmt.u.disassoc.reason_code = host_to_le16(reason);
-       return  hostap_send_mlme(drv, (u8 *) &mgmt, IEEE80211_HDRLEN +
-                                sizeof(mgmt.u.disassoc), 0, 0, NULL, 0, 0, 0,
-                                -1);
-}
-
-
-static struct hostapd_hw_modes * hostap_get_hw_feature_data(void *priv,
-                                                           u16 *num_modes,
-                                                           u16 *flags, u8 *dfs)
-{
-       struct hostapd_hw_modes *mode;
-       int i, clen, rlen;
-       const short chan2freq[14] = {
-               2412, 2417, 2422, 2427, 2432, 2437, 2442,
-               2447, 2452, 2457, 2462, 2467, 2472, 2484
-       };
-
-       mode = os_zalloc(sizeof(struct hostapd_hw_modes));
-       if (mode == NULL)
-               return NULL;
-
-       *num_modes = 1;
-       *flags = 0;
-       *dfs = 0;
-
-       mode->mode = HOSTAPD_MODE_IEEE80211B;
-       mode->num_channels = 14;
-       mode->num_rates = 4;
-
-       clen = mode->num_channels * sizeof(struct hostapd_channel_data);
-       rlen = mode->num_rates * sizeof(int);
-
-       mode->channels = os_zalloc(clen);
-       mode->rates = os_zalloc(rlen);
-       if (mode->channels == NULL || mode->rates == NULL) {
-               os_free(mode->channels);
-               os_free(mode->rates);
-               os_free(mode);
-               return NULL;
-       }
-
-       for (i = 0; i < 14; i++) {
-               mode->channels[i].chan = i + 1;
-               mode->channels[i].freq = chan2freq[i];
-               mode->channels[i].allowed_bw = HOSTAPD_CHAN_WIDTH_20;
-               /* TODO: Get allowed channel list from the driver */
-               if (i >= 11)
-                       mode->channels[i].flag = HOSTAPD_CHAN_DISABLED;
-       }
-
-       mode->rates[0] = 10;
-       mode->rates[1] = 20;
-       mode->rates[2] = 55;
-       mode->rates[3] = 110;
-
-       return mode;
-}
-
-
-static void wpa_driver_hostap_poll_client(void *priv, const u8 *own_addr,
-                                         const u8 *addr, int qos)
-{
-       struct ieee80211_hdr hdr;
-
-       os_memset(&hdr, 0, sizeof(hdr));
-
-       /*
-        * WLAN_FC_STYPE_NULLFUNC would be more appropriate,
-        * but it is apparently not retried so TX Exc events
-        * are not received for it.
-        * This is the reason the driver overrides the default
-        * handling.
-        */
-       hdr.frame_control = IEEE80211_FC(WLAN_FC_TYPE_DATA,
-                                        WLAN_FC_STYPE_DATA);
-
-       hdr.frame_control |=
-               host_to_le16(WLAN_FC_FROMDS);
-       os_memcpy(hdr.IEEE80211_DA_FROMDS, addr, ETH_ALEN);
-       os_memcpy(hdr.IEEE80211_BSSID_FROMDS, own_addr, ETH_ALEN);
-       os_memcpy(hdr.IEEE80211_SA_FROMDS, own_addr, ETH_ALEN);
-
-       hostap_send_mlme(priv, (u8 *)&hdr, sizeof(hdr), 0, 0, NULL, 0, 0, 0,
-                        -1);
-}
-
-
-const struct wpa_driver_ops wpa_driver_hostap_ops = {
-       .name = "hostap",
-       .desc = "Host AP driver (Intersil Prism2/2.5/3)",
-       .set_key = wpa_driver_hostap_set_key,
-       .hapd_init = hostap_init,
-       .hapd_deinit = hostap_driver_deinit,
-       .set_ieee8021x = hostap_set_ieee8021x,
-       .set_privacy = hostap_set_privacy,
-       .get_seqnum = hostap_get_seqnum,
-       .flush = hostap_flush,
-       .set_generic_elem = hostap_set_generic_elem,
-       .read_sta_data = hostap_read_sta_data,
-       .hapd_send_eapol = hostap_send_eapol,
-       .sta_set_flags = hostap_sta_set_flags,
-       .sta_deauth = hostap_sta_deauth,
-       .sta_disassoc = hostap_sta_disassoc,
-       .sta_remove = hostap_sta_remove,
-       .hapd_set_ssid = hostap_set_ssid,
-       .send_mlme = hostap_send_mlme,
-       .sta_add = hostap_sta_add,
-       .get_inact_sec = hostap_get_inact_sec,
-       .sta_clear_stats = hostap_sta_clear_stats,
-       .get_hw_feature_data = hostap_get_hw_feature_data,
-       .set_ap_wps_ie = hostap_set_ap_wps_ie,
-       .set_freq = hostap_set_freq,
-       .poll_client = wpa_driver_hostap_poll_client,
-};
diff --git a/src/drivers/driver_hostap.h b/src/drivers/driver_hostap.h
deleted file mode 100644 (file)
index ac0b83a..0000000
+++ /dev/null
@@ -1,208 +0,0 @@
-/*
- * Driver interaction with Linux Host AP driver
- * Copyright (c) 2002-2006, Jouni Malinen <j@w1.fi>
- *
- * This software may be distributed under the terms of the BSD license.
- * See README for more details.
- */
-
-#ifndef HOSTAP_DRIVER_H
-#define HOSTAP_DRIVER_H
-
-/* netdevice private ioctls (used, e.g., with iwpriv from user space) */
-
-/* New wireless extensions API - SET/GET convention (even ioctl numbers are
- * root only)
- */
-#define PRISM2_IOCTL_PRISM2_PARAM (SIOCIWFIRSTPRIV + 0)
-#define PRISM2_IOCTL_GET_PRISM2_PARAM (SIOCIWFIRSTPRIV + 1)
-#define PRISM2_IOCTL_WRITEMIF (SIOCIWFIRSTPRIV + 2)
-#define PRISM2_IOCTL_READMIF (SIOCIWFIRSTPRIV + 3)
-#define PRISM2_IOCTL_MONITOR (SIOCIWFIRSTPRIV + 4)
-#define PRISM2_IOCTL_RESET (SIOCIWFIRSTPRIV + 6)
-#define PRISM2_IOCTL_INQUIRE (SIOCIWFIRSTPRIV + 8)
-#define PRISM2_IOCTL_WDS_ADD (SIOCIWFIRSTPRIV + 10)
-#define PRISM2_IOCTL_WDS_DEL (SIOCIWFIRSTPRIV + 12)
-#define PRISM2_IOCTL_SET_RID_WORD (SIOCIWFIRSTPRIV + 14)
-#define PRISM2_IOCTL_MACCMD (SIOCIWFIRSTPRIV + 16)
-#define PRISM2_IOCTL_ADDMAC (SIOCIWFIRSTPRIV + 18)
-#define PRISM2_IOCTL_DELMAC (SIOCIWFIRSTPRIV + 20)
-#define PRISM2_IOCTL_KICKMAC (SIOCIWFIRSTPRIV + 22)
-
-/* following are not in SIOCGIWPRIV list; check permission in the driver code
- */
-#define PRISM2_IOCTL_DOWNLOAD (SIOCDEVPRIVATE + 13)
-#define PRISM2_IOCTL_HOSTAPD (SIOCDEVPRIVATE + 14)
-
-
-/* PRISM2_IOCTL_PRISM2_PARAM ioctl() subtypes: */
-enum {
-       /* PRISM2_PARAM_PTYPE = 1, */ /* REMOVED 2003-10-22 */
-       PRISM2_PARAM_TXRATECTRL = 2,
-       PRISM2_PARAM_BEACON_INT = 3,
-       PRISM2_PARAM_PSEUDO_IBSS = 4,
-       PRISM2_PARAM_ALC = 5,
-       /* PRISM2_PARAM_TXPOWER = 6, */ /* REMOVED 2003-10-22 */
-       PRISM2_PARAM_DUMP = 7,
-       PRISM2_PARAM_OTHER_AP_POLICY = 8,
-       PRISM2_PARAM_AP_MAX_INACTIVITY = 9,
-       PRISM2_PARAM_AP_BRIDGE_PACKETS = 10,
-       PRISM2_PARAM_DTIM_PERIOD = 11,
-       PRISM2_PARAM_AP_NULLFUNC_ACK = 12,
-       PRISM2_PARAM_MAX_WDS = 13,
-       PRISM2_PARAM_AP_AUTOM_AP_WDS = 14,
-       PRISM2_PARAM_AP_AUTH_ALGS = 15,
-       PRISM2_PARAM_MONITOR_ALLOW_FCSERR = 16,
-       PRISM2_PARAM_HOST_ENCRYPT = 17,
-       PRISM2_PARAM_HOST_DECRYPT = 18,
-       PRISM2_PARAM_HOST_ROAMING = 21,
-       PRISM2_PARAM_BCRX_STA_KEY = 22,
-       PRISM2_PARAM_IEEE_802_1X = 23,
-       PRISM2_PARAM_ANTSEL_TX = 24,
-       PRISM2_PARAM_ANTSEL_RX = 25,
-       PRISM2_PARAM_MONITOR_TYPE = 26,
-       PRISM2_PARAM_WDS_TYPE = 27,
-       PRISM2_PARAM_HOSTSCAN = 28,
-       PRISM2_PARAM_AP_SCAN = 29,
-       PRISM2_PARAM_ENH_SEC = 30,
-       PRISM2_PARAM_IO_DEBUG = 31,
-       PRISM2_PARAM_BASIC_RATES = 32,
-       PRISM2_PARAM_OPER_RATES = 33,
-       PRISM2_PARAM_HOSTAPD = 34,
-       PRISM2_PARAM_HOSTAPD_STA = 35,
-       PRISM2_PARAM_WPA = 36,
-       PRISM2_PARAM_PRIVACY_INVOKED = 37,
-       PRISM2_PARAM_TKIP_COUNTERMEASURES = 38,
-       PRISM2_PARAM_DROP_UNENCRYPTED = 39,
-       PRISM2_PARAM_SCAN_CHANNEL_MASK = 40,
-};
-
-enum { HOSTAP_ANTSEL_DO_NOT_TOUCH = 0, HOSTAP_ANTSEL_DIVERSITY = 1,
-       HOSTAP_ANTSEL_LOW = 2, HOSTAP_ANTSEL_HIGH = 3 };
-
-
-/* PRISM2_IOCTL_MACCMD ioctl() subcommands: */
-enum { AP_MAC_CMD_POLICY_OPEN = 0, AP_MAC_CMD_POLICY_ALLOW = 1,
-       AP_MAC_CMD_POLICY_DENY = 2, AP_MAC_CMD_FLUSH = 3,
-       AP_MAC_CMD_KICKALL = 4 };
-
-
-/* PRISM2_IOCTL_DOWNLOAD ioctl() dl_cmd: */
-enum {
-       PRISM2_DOWNLOAD_VOLATILE = 1 /* RAM */,
-       /* Note! Old versions of prism2_srec have a fatal error in CRC-16
-        * calculation, which will corrupt all non-volatile downloads.
-        * PRISM2_DOWNLOAD_NON_VOLATILE used to be 2, but it is now 3 to
-        * prevent use of old versions of prism2_srec for non-volatile
-        * download. */
-       PRISM2_DOWNLOAD_NON_VOLATILE = 3 /* FLASH */,
-       PRISM2_DOWNLOAD_VOLATILE_GENESIS = 4 /* RAM in Genesis mode */,
-       /* Persistent versions of volatile download commands (keep firmware
-        * data in memory and automatically re-download after hw_reset */
-       PRISM2_DOWNLOAD_VOLATILE_PERSISTENT = 5,
-       PRISM2_DOWNLOAD_VOLATILE_GENESIS_PERSISTENT = 6,
-};
-
-struct prism2_download_param {
-       u32 dl_cmd;
-       u32 start_addr;
-       u32 num_areas;
-       struct prism2_download_area {
-               u32 addr; /* wlan card address */
-               u32 len;
-               caddr_t ptr; /* pointer to data in user space */
-       } data[0];
-};
-
-#define PRISM2_MAX_DOWNLOAD_AREA_LEN 131072
-#define PRISM2_MAX_DOWNLOAD_LEN 262144
-
-
-/* PRISM2_IOCTL_HOSTAPD ioctl() cmd: */
-enum {
-       PRISM2_HOSTAPD_FLUSH = 1,
-       PRISM2_HOSTAPD_ADD_STA = 2,
-       PRISM2_HOSTAPD_REMOVE_STA = 3,
-       PRISM2_HOSTAPD_GET_INFO_STA = 4,
-       /* REMOVED: PRISM2_HOSTAPD_RESET_TXEXC_STA = 5, */
-       PRISM2_SET_ENCRYPTION = 6,
-       PRISM2_GET_ENCRYPTION = 7,
-       PRISM2_HOSTAPD_SET_FLAGS_STA = 8,
-       PRISM2_HOSTAPD_GET_RID = 9,
-       PRISM2_HOSTAPD_SET_RID = 10,
-       PRISM2_HOSTAPD_SET_ASSOC_AP_ADDR = 11,
-       PRISM2_HOSTAPD_SET_GENERIC_ELEMENT = 12,
-       PRISM2_HOSTAPD_MLME = 13,
-       PRISM2_HOSTAPD_SCAN_REQ = 14,
-       PRISM2_HOSTAPD_STA_CLEAR_STATS = 15,
-};
-
-#define PRISM2_HOSTAPD_MAX_BUF_SIZE 1024
-#define PRISM2_HOSTAPD_RID_HDR_LEN \
-((size_t) (&((struct prism2_hostapd_param *) 0)->u.rid.data))
-#define PRISM2_HOSTAPD_GENERIC_ELEMENT_HDR_LEN \
-((size_t) (&((struct prism2_hostapd_param *) 0)->u.generic_elem.data))
-
-/* Maximum length for algorithm names (-1 for nul termination) used in ioctl()
- */
-#define HOSTAP_CRYPT_ALG_NAME_LEN 16
-
-
-struct prism2_hostapd_param {
-       u32 cmd;
-       u8 sta_addr[ETH_ALEN];
-       union {
-               struct {
-                       u16 aid;
-                       u16 capability;
-                       u8 tx_supp_rates;
-               } add_sta;
-               struct {
-                       u32 inactive_sec;
-               } get_info_sta;
-               struct {
-                       u8 alg[HOSTAP_CRYPT_ALG_NAME_LEN];
-                       u32 flags;
-                       u32 err;
-                       u8 idx;
-                       u8 seq[8]; /* sequence counter (set: RX, get: TX) */
-                       u16 key_len;
-                       u8 key[0];
-               } crypt;
-               struct {
-                       u32 flags_and;
-                       u32 flags_or;
-               } set_flags_sta;
-               struct {
-                       u16 rid;
-                       u16 len;
-                       u8 data[0];
-               } rid;
-               struct {
-                       u8 len;
-                       u8 data[0];
-               } generic_elem;
-               struct {
-#define MLME_STA_DEAUTH 0
-#define MLME_STA_DISASSOC 1
-                       u16 cmd;
-                       u16 reason_code;
-               } mlme;
-               struct {
-                       u8 ssid_len;
-                       u8 ssid[SSID_MAX_LEN];
-               } scan_req;
-       } u;
-};
-
-#define HOSTAP_CRYPT_FLAG_SET_TX_KEY BIT(0)
-#define HOSTAP_CRYPT_FLAG_PERMANENT BIT(1)
-
-#define HOSTAP_CRYPT_ERR_UNKNOWN_ALG 2
-#define HOSTAP_CRYPT_ERR_UNKNOWN_ADDR 3
-#define HOSTAP_CRYPT_ERR_CRYPT_INIT_FAILED 4
-#define HOSTAP_CRYPT_ERR_KEY_SET_FAILED 5
-#define HOSTAP_CRYPT_ERR_TX_KEY_SET_FAILED 6
-#define HOSTAP_CRYPT_ERR_CARD_CONF_FAILED 7
-
-#endif /* HOSTAP_DRIVER_H */
index c34c13b804e549c5a3fb5b03ff17fd7da766cf13..189408d7168c13d42f280136aeed163881c01611 100644 (file)
@@ -239,7 +239,8 @@ wpa_driver_wext_event_wireless_custom(void *ctx, char *custom)
                   custom);
 
        os_memset(&data, 0, sizeof(data));
-       /* Host AP driver */
+       /* Originally from the Host AP driver, but used by other drivers as well
+        */
        if (os_strncmp(custom, "MLME-MICHAELMICFAILURE.indication", 33) == 0) {
                data.michael_mic_failure.unicast =
                        os_strstr(custom, " unicast ") != NULL;
@@ -865,107 +866,6 @@ static void wpa_driver_wext_send_rfkill(void *eloop_ctx, void *timeout_ctx)
 }
 
 
-static int wext_hostap_ifname(struct wpa_driver_wext_data *drv,
-                             const char *ifname)
-{
-       char buf[200], *res;
-       int type, ret;
-       FILE *f;
-
-       if (strcmp(ifname, ".") == 0 || strcmp(ifname, "..") == 0)
-               return -1;
-
-       ret = snprintf(buf, sizeof(buf), "/sys/class/net/%s/device/net/%s/type",
-                      drv->ifname, ifname);
-       if (os_snprintf_error(sizeof(buf), ret))
-               return -1;
-
-       f = fopen(buf, "r");
-       if (!f)
-               return -1;
-       res = fgets(buf, sizeof(buf), f);
-       fclose(f);
-
-       type = res ? atoi(res) : -1;
-       wpa_printf(MSG_DEBUG, "WEXT: hostap ifname %s type %d", ifname, type);
-
-       if (type == ARPHRD_IEEE80211) {
-               wpa_printf(MSG_DEBUG,
-                          "WEXT: Found hostap driver wifi# interface (%s)",
-                          ifname);
-               wpa_driver_wext_alternative_ifindex(drv, ifname);
-               return 0;
-       }
-       return -1;
-}
-
-
-static int wext_add_hostap(struct wpa_driver_wext_data *drv)
-{
-       char buf[200];
-       int n;
-       struct dirent **names;
-       int ret = -1;
-
-       snprintf(buf, sizeof(buf), "/sys/class/net/%s/device/net", drv->ifname);
-       n = scandir(buf, &names, NULL, alphasort);
-       if (n < 0)
-               return -1;
-
-       while (n--) {
-               if (ret < 0 && wext_hostap_ifname(drv, names[n]->d_name) == 0)
-                       ret = 0;
-               free(names[n]);
-       }
-       free(names);
-
-       return ret;
-}
-
-
-static void wext_check_hostap(struct wpa_driver_wext_data *drv)
-{
-       char path[200], buf[200], *pos;
-       ssize_t res;
-
-       /*
-        * Host AP driver may use both wlan# and wifi# interface in wireless
-        * events. Since some of the versions included WE-18 support, let's add
-        * the alternative ifindex also from driver_wext.c for the time being.
-        * This may be removed at some point once it is believed that old
-        * versions of the driver are not in use anymore. However, it looks like
-        * the wifi# interface is still used in the current kernel tree, so it
-        * may not really be possible to remove this before the Host AP driver
-        * gets removed from the kernel.
-        */
-
-       /* First, try to see if driver information is available from sysfs */
-       snprintf(path, sizeof(path), "/sys/class/net/%s/device/driver",
-                drv->ifname);
-       res = readlink(path, buf, sizeof(buf) - 1);
-       if (res > 0) {
-               buf[res] = '\0';
-               pos = strrchr(buf, '/');
-               if (pos)
-                       pos++;
-               else
-                       pos = buf;
-               wpa_printf(MSG_DEBUG, "WEXT: Driver: %s", pos);
-               if (os_strncmp(pos, "hostap", 6) == 0 &&
-                   wext_add_hostap(drv) == 0)
-                       return;
-       }
-
-       /* Second, use the old design with hardcoded ifname */
-       if (os_strncmp(drv->ifname, "wlan", 4) == 0) {
-               char ifname2[IFNAMSIZ + 1];
-               os_strlcpy(ifname2, drv->ifname, sizeof(ifname2));
-               os_memcpy(ifname2, "wifi", 4);
-               wpa_driver_wext_alternative_ifindex(drv, ifname2);
-       }
-}
-
-
 static int wpa_driver_wext_finish_drv_init(struct wpa_driver_wext_data *drv)
 {
        int send_rfkill_event = 0;
@@ -1011,8 +911,6 @@ static int wpa_driver_wext_finish_drv_init(struct wpa_driver_wext_data *drv)
 
        drv->ifindex = if_nametoindex(drv->ifname);
 
-       wext_check_hostap(drv);
-
        netlink_send_oper_ifla(drv->netlink, drv->ifindex,
                               1, IF_OPER_DORMANT);
 
index e95df6ddb20aac6a88361361d16e5a9db37efb5d..fc20c8ad08bc150108250f070db1c1801a4159a0 100644 (file)
@@ -19,9 +19,6 @@ const struct wpa_driver_ops *const wpa_drivers[] =
 #ifdef CONFIG_DRIVER_WEXT
        &wpa_driver_wext_ops,
 #endif /* CONFIG_DRIVER_WEXT */
-#ifdef CONFIG_DRIVER_HOSTAP
-       &wpa_driver_hostap_ops,
-#endif /* CONFIG_DRIVER_HOSTAP */
 #ifdef CONFIG_DRIVER_BSD
        &wpa_driver_bsd_ops,
 #endif /* CONFIG_DRIVER_BSD */
index a03d4a0345119dc3a834611a1c792a0ef3047fa1..e796fbd41e561db571346be787c5142e387d2829 100644 (file)
@@ -84,15 +84,6 @@ endif
 
 ##### PURE AP DRIVERS
 
-ifdef CONFIG_DRIVER_HOSTAP
-DRV_AP_CFLAGS += -DCONFIG_DRIVER_HOSTAP
-DRV_AP_OBJS += ../src/drivers/driver_hostap.o
-CONFIG_WIRELESS_EXTENSION=y
-NEED_AP_MLME=y
-NEED_NETLINK=y
-NEED_LINUX_IOCTL=y
-endif
-
 ifdef CONFIG_DRIVER_ATHEROS
 DRV_AP_CFLAGS += -DCONFIG_DRIVER_ATHEROS
 DRV_AP_OBJS += ../src/drivers/driver_atheros.o
index 10eab6a92e17762727ea53e3326b6b7e9a36c26a..97b063a3cadb8f8da1a6fc101f4c1747031009f0 100644 (file)
@@ -78,15 +78,6 @@ endif
 
 ##### PURE AP DRIVERS
 
-ifdef CONFIG_DRIVER_HOSTAP
-DRV_AP_CFLAGS += -DCONFIG_DRIVER_HOSTAP
-DRV_AP_OBJS += src/drivers/driver_hostap.c
-CONFIG_WIRELESS_EXTENSION=y
-NEED_AP_MLME=y
-NEED_NETLINK=y
-NEED_LINUX_IOCTL=y
-endif
-
 ifdef CONFIG_DRIVER_ATHEROS
 DRV_AP_CFLAGS += -DCONFIG_DRIVER_ATHEROS
 DRV_AP_OBJS += src/drivers/driver_atheros.c
index fd7d7a0bd00446a3c598347240fcd7b81856bf76..96299841deb8de1abf973c8bb8fbfd28586fba26 100644 (file)
@@ -72,7 +72,7 @@ mkconfig:
                echo '.config exists - did not replace it'; \
                exit 1; \
        fi
-       echo CONFIG_DRIVER_HOSTAP=y >> .config
+       echo CONFIG_DRIVER_NL80211=y >> .config
        echo CONFIG_DRIVER_WEXT=y >> .config
 
 $(DESTDIR)$(BINDIR)/%: %
index 3c47cd34503245c19daf0054df28f019bdcffead..883f0e7c858c7010fcea3926204414867a36c39a 100644 (file)
@@ -4637,15 +4637,6 @@ static void wpa_supplicant_event_disassoc(struct wpa_supplicant *wpa_s,
 {
        const u8 *bssid;
 
-       if (wpa_s->key_mgmt == WPA_KEY_MGMT_WPA_NONE) {
-               /*
-                * At least Host AP driver and a Prism3 card seemed to be
-                * generating streams of disconnected events when configuring
-                * IBSS for WPA-None. Ignore them for now.
-                */
-               return;
-       }
-
        bssid = wpa_s->bssid;
        if (is_zero_ether_addr(bssid))
                bssid = wpa_s->pending_bssid;
@@ -4693,17 +4684,6 @@ static void wpa_supplicant_event_disassoc_finish(struct wpa_supplicant *wpa_s,
        struct wpa_ssid *fast_reconnect_ssid = NULL;
        struct wpa_bss *curr = NULL;
 
-       if (wpa_s->key_mgmt == WPA_KEY_MGMT_WPA_NONE) {
-               /*
-                * At least Host AP driver and a Prism3 card seemed to be
-                * generating streams of disconnected events when configuring
-                * IBSS for WPA-None. Ignore them for now.
-                */
-               wpa_dbg(wpa_s, MSG_DEBUG, "Disconnect event - ignore in "
-                       "IBSS/WPA-None mode");
-               return;
-       }
-
        if (!wpa_s->disconnected && wpa_s->wpa_state >= WPA_AUTHENTICATING &&
            reason_code == WLAN_REASON_DISASSOC_DUE_TO_INACTIVITY &&
            locally_generated)