Remove obsolete drivers wrappers: atmel, ndiswrapper, ipw, hermes

There is no real reason to maintain these in the current development
branch anymore. If someone really needs support for the obsolete
driver interfaces, these can be found in older wpa_supplicant
branches.

driver_atmel.c
- vendor-specific interface for ATMEL AT76C5XXx cards
- for some old out-of-tree driver; not for the upstream atmel*
  drivers

driver_ndiswrapper.c
- vendor-specific interface for an out-of-tree driver
- ndiswrapper should work with driver_wext.c, too

driver_ipw.c
- vendor-specific interface for old ipw2100/2200 driver
- the upstream driver works with driver_wext.c (and does not work
  with the old interface)

driver_hermes.c
- vendor driver that was not even included in the main wpa_supplicant
  releases
This commit is contained in:
Jouni Malinen 2011-01-30 21:29:25 +02:00
parent f1bed4a70d
commit df077c6262
7 changed files with 1 additions and 1458 deletions

View File

@ -1,500 +0,0 @@
/*
* WPA Supplicant - Driver interaction with Atmel Wireless LAN drivers
* Copyright (c) 2000-2005, ATMEL Corporation
* Copyright (c) 2004-2007, Jouni Malinen <j@w1.fi>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
* Alternatively, this software may be distributed under the terms of BSD
* license.
*
* See README and COPYING for more details.
*/
/******************************************************************************
Copyright 2000-2001 ATMEL Corporation.
WPA Supplicant - driver interaction with Atmel Wireless lan drivers.
This is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Atmel wireless lan drivers; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
******************************************************************************/
/*
* Alternatively, this software may be distributed under the terms of BSD
* license.
*/
#include "includes.h"
#include <sys/ioctl.h>
#include "wireless_copy.h"
#include "common.h"
#include "driver.h"
#include "driver_wext.h"
struct wpa_driver_atmel_data {
void *wext; /* private data for driver_wext */
void *ctx;
char ifname[IFNAMSIZ + 1];
int sock;
};
#define ATMEL_WPA_IOCTL (SIOCIWFIRSTPRIV + 2)
#define ATMEL_WPA_IOCTL_PARAM (SIOCIWFIRSTPRIV + 3)
#define ATMEL_WPA_IOCTL_GET_PARAM (SIOCIWFIRSTPRIV + 4)
/* ATMEL_WPA_IOCTL ioctl() cmd: */
enum {
SET_WPA_ENCRYPTION = 1,
SET_CIPHER_SUITES = 2,
MLME_STA_DEAUTH = 3,
MLME_STA_DISASSOC = 4
};
/* ATMEL_WPA_IOCTL_PARAM ioctl() cmd: */
enum {
ATMEL_PARAM_WPA = 1,
ATMEL_PARAM_PRIVACY_INVOKED = 2,
ATMEL_PARAM_WPA_TYPE = 3
};
#define MAX_KEY_LENGTH 40
struct atmel_param{
unsigned char sta_addr[6];
int cmd;
u8 alg;
u8 key_idx;
u8 set_tx;
u8 seq[8];
u8 seq_len;
u16 key_len;
u8 key[MAX_KEY_LENGTH];
struct{
int reason_code;
u8 state;
}mlme;
u8 pairwise_suite;
u8 group_suite;
u8 key_mgmt_suite;
};
static int atmel_ioctl(struct wpa_driver_atmel_data *drv,
struct atmel_param *param,
int len, int show_err)
{
struct iwreq iwr;
os_memset(&iwr, 0, sizeof(iwr));
os_strlcpy(iwr.ifr_name, drv->ifname, IFNAMSIZ);
iwr.u.data.pointer = (caddr_t) param;
iwr.u.data.length = len;
if (ioctl(drv->sock, ATMEL_WPA_IOCTL, &iwr) < 0) {
int ret;
ret = errno;
if (show_err)
perror("ioctl[ATMEL_WPA_IOCTL]");
return ret;
}
return 0;
}
static int atmel2param(struct wpa_driver_atmel_data *drv, int param, int value)
{
struct iwreq iwr;
int *i, ret = 0;
os_memset(&iwr, 0, sizeof(iwr));
os_strlcpy(iwr.ifr_name, drv->ifname, IFNAMSIZ);
i = (int *) iwr.u.name;
*i++ = param;
*i++ = value;
if (ioctl(drv->sock, ATMEL_WPA_IOCTL_PARAM, &iwr) < 0) {
perror("ioctl[ATMEL_WPA_IOCTL_PARAM]");
ret = -1;
}
return ret;
}
#if 0
static int wpa_driver_atmel_set_wpa_ie(struct wpa_driver_atmel_data *drv,
const char *wpa_ie, size_t wpa_ie_len)
{
struct atmel_param *param;
int res;
size_t blen = ATMEL_GENERIC_ELEMENT_HDR_LEN + wpa_ie_len;
if (blen < sizeof(*param))
blen = sizeof(*param);
param = os_zalloc(blen);
if (param == NULL)
return -1;
param->cmd = ATMEL_SET_GENERIC_ELEMENT;
param->u.generic_elem.len = wpa_ie_len;
os_memcpy(param->u.generic_elem.data, wpa_ie, wpa_ie_len);
res = atmel_ioctl(drv, param, blen, 1);
os_free(param);
return res;
}
#endif
static int wpa_driver_atmel_set_wpa(void *priv, int enabled)
{
struct wpa_driver_atmel_data *drv = priv;
int ret = 0;
printf("wpa_driver_atmel_set_wpa %s\n", drv->ifname);
wpa_printf(MSG_DEBUG, "%s: enabled=%d", __FUNCTION__, enabled);
#if 0
if (!enabled && wpa_driver_atmel_set_wpa_ie(drv, NULL, 0) < 0)
ret = -1;
#endif
if (atmel2param(drv, ATMEL_PARAM_PRIVACY_INVOKED, enabled) < 0)
ret = -1;
if (atmel2param(drv, ATMEL_PARAM_WPA, enabled) < 0)
ret = -1;
return ret;
}
static int wpa_driver_atmel_set_key(const char *ifname, void *priv,
enum wpa_alg alg, const u8 *addr,
int key_idx, int set_tx,
const u8 *seq, size_t seq_len,
const u8 *key, size_t key_len)
{
struct wpa_driver_atmel_data *drv = priv;
int ret = 0;
struct atmel_param *param;
u8 *buf;
u8 alg_type;
size_t blen;
char *alg_name;
switch (alg) {
case WPA_ALG_NONE:
alg_name = "none";
alg_type = 0;
break;
case WPA_ALG_WEP:
alg_name = "WEP";
alg_type = 1;
break;
case WPA_ALG_TKIP:
alg_name = "TKIP";
alg_type = 2;
break;
case WPA_ALG_CCMP:
alg_name = "CCMP";
alg_type = 3;
break;
default:
return -1;
}
wpa_printf(MSG_DEBUG, "%s: alg=%s key_idx=%d set_tx=%d seq_len=%lu "
"key_len=%lu", __FUNCTION__, alg_name, key_idx, set_tx,
(unsigned long) seq_len, (unsigned long) key_len);
if (seq_len > 8)
return -2;
blen = sizeof(*param) + key_len;
buf = os_zalloc(blen);
if (buf == NULL)
return -1;
param = (struct atmel_param *) buf;
param->cmd = SET_WPA_ENCRYPTION;
if (addr == NULL)
os_memset(param->sta_addr, 0xff, ETH_ALEN);
else
os_memcpy(param->sta_addr, addr, ETH_ALEN);
param->alg = alg_type;
param->key_idx = key_idx;
param->set_tx = set_tx;
if (seq)
os_memcpy(param->seq, seq, seq_len);
param->seq_len = seq_len;
param->key_len = key_len;
os_memcpy((u8 *)param->key, key, key_len);
if (atmel_ioctl(drv, param, blen, 1)) {
wpa_printf(MSG_WARNING, "Failed to set encryption.");
/* TODO: show key error*/
ret = -1;
}
os_free(buf);
return ret;
}
static int wpa_driver_atmel_set_countermeasures(void *priv,
int enabled)
{
/* FIX */
printf("wpa_driver_atmel_set_countermeasures - not yet "
"implemented\n");
return 0;
}
static int wpa_driver_atmel_mlme(void *priv, const u8 *addr, int cmd,
int reason_code)
{
struct wpa_driver_atmel_data *drv = priv;
struct atmel_param param;
int ret;
int mgmt_error = 0xaa;
os_memset(&param, 0, sizeof(param));
os_memcpy(param.sta_addr, addr, ETH_ALEN);
param.cmd = cmd;
param.mlme.reason_code = reason_code;
param.mlme.state = mgmt_error;
ret = atmel_ioctl(drv, &param, sizeof(param), 1);
return ret;
}
#if 0
static int wpa_driver_atmel_set_suites(struct wpa_driver_atmel_data *drv,
u8 pairwise_suite, u8 group_suite,
u8 key_mgmt_suite)
{
struct atmel_param param;
int ret;
os_memset(&param, 0, sizeof(param));
param.cmd = SET_CIPHER_SUITES;
param.pairwise_suite = pairwise_suite;
param.group_suite = group_suite;
param.key_mgmt_suite = key_mgmt_suite;
ret = atmel_ioctl(drv, &param, sizeof(param), 1);
return ret;
}
#endif
static int wpa_driver_atmel_deauthenticate(void *priv, const u8 *addr,
int reason_code)
{
struct wpa_driver_atmel_data *drv = priv;
printf("wpa_driver_atmel_deauthenticate\n");
wpa_printf(MSG_DEBUG, "%s", __FUNCTION__);
return wpa_driver_atmel_mlme(drv, addr, MLME_STA_DEAUTH,
reason_code);
}
static int wpa_driver_atmel_disassociate(void *priv, const u8 *addr,
int reason_code)
{
struct wpa_driver_atmel_data *drv = priv;
printf("wpa_driver_atmel_disassociate\n");
wpa_printf(MSG_DEBUG, "%s", __FUNCTION__);
return wpa_driver_atmel_mlme(drv, addr, MLME_STA_DISASSOC,
reason_code);
}
#if 0
/* Atmel driver uses specific values for each cipher suite */
static int convertSuiteToDriver(enum wpa_cipher suite)
{
u8 suite_type;
switch(suite) {
case CIPHER_NONE:
suite_type = 0;
break;
case CIPHER_WEP40:
suite_type = 1;
break;
case CIPHER_TKIP:
suite_type = 2;
break;
case CIPHER_WEP104:
suite_type = 5;
break;
case CIPHER_CCMP:
suite_type = 3;
break;
default:
suite_type = 2;
}
return suite_type;
}
#endif
static int
wpa_driver_atmel_associate(void *priv,
struct wpa_driver_associate_params *params)
{
struct wpa_driver_atmel_data *drv = priv;
int ret = 0;
#if 0
u8 pairwise_suite_driver;
u8 group_suite_driver;
u8 key_mgmt_suite_driver;
pairwise_suite_driver = convertSuiteToDriver(params->pairwise_suite);
group_suite_driver = convertSuiteToDriver(params->group_suite);
key_mgmt_suite_driver = convertSuiteToDriver(params->key_mgmt_suite);
if (wpa_driver_atmel_set_suites(drv, pairwise_suite_driver,
group_suite_driver,
key_mgmt_suite_driver) < 0){
printf("wpa_driver_atmel_set_suites.\n");
ret = -1;
}
if (wpa_driver_wext_set_freq(drv->wext, params->freq) < 0) {
printf("wpa_driver_atmel_set_freq.\n");
ret = -1;
}
#endif
if (wpa_driver_wext_set_ssid(drv->wext, params->ssid, params->ssid_len)
< 0) {
printf("FAILED : wpa_driver_atmel_set_ssid.\n");
ret = -1;
}
if (wpa_driver_wext_set_bssid(drv->wext, params->bssid) < 0) {
printf("FAILED : wpa_driver_atmel_set_bssid.\n");
ret = -1;
}
return ret;
}
static int wpa_driver_atmel_get_bssid(void *priv, u8 *bssid)
{
struct wpa_driver_atmel_data *drv = priv;
return wpa_driver_wext_get_bssid(drv->wext, bssid);
}
static int wpa_driver_atmel_get_ssid(void *priv, u8 *ssid)
{
struct wpa_driver_atmel_data *drv = priv;
return wpa_driver_wext_get_ssid(drv->wext, ssid);
}
static int wpa_driver_atmel_scan(void *priv,
struct wpa_driver_scan_params *params)
{
struct wpa_driver_atmel_data *drv = priv;
return wpa_driver_wext_scan(drv->wext, params);
}
static struct wpa_scan_results * wpa_driver_atmel_get_scan_results(void *priv)
{
struct wpa_driver_atmel_data *drv = priv;
return wpa_driver_wext_get_scan_results(drv->wext);
}
static int wpa_driver_atmel_set_operstate(void *priv, int state)
{
struct wpa_driver_atmel_data *drv = priv;
return wpa_driver_wext_set_operstate(drv->wext, state);
}
static void * wpa_driver_atmel_init(void *ctx, const char *ifname)
{
struct wpa_driver_atmel_data *drv;
drv = os_zalloc(sizeof(*drv));
if (drv == NULL)
return NULL;
drv->wext = wpa_driver_wext_init(ctx, ifname);
if (drv->wext == NULL) {
os_free(drv);
return NULL;
}
drv->ctx = ctx;
os_strlcpy(drv->ifname, ifname, sizeof(drv->ifname));
drv->sock = socket(PF_INET, SOCK_DGRAM, 0);
if (drv->sock < 0) {
wpa_driver_wext_deinit(drv->wext);
os_free(drv);
return NULL;
}
wpa_driver_atmel_set_wpa(drv, 1);
return drv;
}
static void wpa_driver_atmel_deinit(void *priv)
{
struct wpa_driver_atmel_data *drv = priv;
wpa_driver_atmel_set_wpa(drv, 0);
wpa_driver_wext_deinit(drv->wext);
close(drv->sock);
os_free(drv);
}
const struct wpa_driver_ops wpa_driver_atmel_ops = {
.name = "atmel",
.desc = "ATMEL AT76C5XXx (USB, PCMCIA)",
.get_bssid = wpa_driver_atmel_get_bssid,
.get_ssid = wpa_driver_atmel_get_ssid,
.set_key = wpa_driver_atmel_set_key,
.init = wpa_driver_atmel_init,
.deinit = wpa_driver_atmel_deinit,
.set_countermeasures = wpa_driver_atmel_set_countermeasures,
.scan2 = wpa_driver_atmel_scan,
.get_scan_results2 = wpa_driver_atmel_get_scan_results,
.deauthenticate = wpa_driver_atmel_deauthenticate,
.disassociate = wpa_driver_atmel_disassociate,
.associate = wpa_driver_atmel_associate,
.set_operstate = wpa_driver_atmel_set_operstate,
};

View File

@ -1,473 +0,0 @@
/*
* WPA Supplicant - driver interaction with Linux ipw2100/2200 drivers
* Copyright (c) 2005 Zhu Yi <yi.zhu@intel.com>
* Copyright (c) 2004 Lubomir Gelo <lgelo@cnc.sk>
* Copyright (c) 2003-2004, Jouni Malinen <j@w1.fi>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
* Alternatively, this software may be distributed under the terms of BSD
* license.
*
* See README and COPYING for more details.
*
* Please note that ipw2100/2200 drivers change to use generic Linux wireless
* extensions if the kernel includes support for WE-18 or newer (Linux 2.6.13
* or newer). driver_wext.c should be used in those cases.
*/
#include "includes.h"
#include <sys/ioctl.h>
#include "wireless_copy.h"
#include "common.h"
#include "driver.h"
#include "driver_wext.h"
struct wpa_driver_ipw_data {
void *wext; /* private data for driver_wext */
void *ctx;
char ifname[IFNAMSIZ + 1];
int sock;
};
/* following definitions must be kept in sync with ipw2100.c and ipw2200.c */
#define IPW_IOCTL_WPA_SUPPLICANT SIOCIWFIRSTPRIV+30
#define IPW_CMD_SET_WPA_PARAM 1
#define IPW_CMD_SET_WPA_IE 2
#define IPW_CMD_SET_ENCRYPTION 3
#define IPW_CMD_MLME 4
#define IPW_PARAM_WPA_ENABLED 1
#define IPW_PARAM_TKIP_COUNTERMEASURES 2
#define IPW_PARAM_DROP_UNENCRYPTED 3
#define IPW_PARAM_PRIVACY_INVOKED 4
#define IPW_PARAM_AUTH_ALGS 5
#define IPW_PARAM_IEEE_802_1X 6
#define IPW_MLME_STA_DEAUTH 1
#define IPW_MLME_STA_DISASSOC 2
#define IPW_CRYPT_ERR_UNKNOWN_ALG 2
#define IPW_CRYPT_ERR_UNKNOWN_ADDR 3
#define IPW_CRYPT_ERR_CRYPT_INIT_FAILED 4
#define IPW_CRYPT_ERR_KEY_SET_FAILED 5
#define IPW_CRYPT_ERR_TX_KEY_SET_FAILED 6
#define IPW_CRYPT_ERR_CARD_CONF_FAILED 7
#define IPW_CRYPT_ALG_NAME_LEN 16
struct ipw_param {
u32 cmd;
u8 sta_addr[ETH_ALEN];
union {
struct {
u8 name;
u32 value;
} wpa_param;
struct {
u32 len;
u8 reserved[32];
u8 data[0];
} wpa_ie;
struct{
u32 command;
u32 reason_code;
} mlme;
struct {
u8 alg[IPW_CRYPT_ALG_NAME_LEN];
u8 set_tx;
u32 err;
u8 idx;
u8 seq[8];
u16 key_len;
u8 key[0];
} crypt;
} u;
};
/* end of ipw2100.c and ipw2200.c code */
static int wpa_driver_ipw_set_auth_alg(void *priv, int auth_alg);
static int ipw_ioctl(struct wpa_driver_ipw_data *drv,
struct ipw_param *param, int len, int show_err)
{
struct iwreq iwr;
os_memset(&iwr, 0, sizeof(iwr));
os_strlcpy(iwr.ifr_name, drv->ifname, IFNAMSIZ);
iwr.u.data.pointer = (caddr_t) param;
iwr.u.data.length = len;
if (ioctl(drv->sock, IPW_IOCTL_WPA_SUPPLICANT, &iwr) < 0) {
int ret = errno;
if (show_err)
perror("ioctl[IPW_IOCTL_WPA_SUPPLICANT]");
return ret;
}
return 0;
}
static void ipw_show_set_key_error(struct ipw_param *param)
{
switch (param->u.crypt.err) {
case IPW_CRYPT_ERR_UNKNOWN_ALG:
wpa_printf(MSG_INFO, "Unknown algorithm '%s'.",
param->u.crypt.alg);
wpa_printf(MSG_INFO, "You may need to load kernel module to "
"register that algorithm.");
wpa_printf(MSG_INFO, "E.g., 'modprobe ieee80211_crypt_wep' for"
" WEP.");
break;
case IPW_CRYPT_ERR_UNKNOWN_ADDR:
wpa_printf(MSG_INFO, "Unknown address " MACSTR ".",
MAC2STR(param->sta_addr));
break;
case IPW_CRYPT_ERR_CRYPT_INIT_FAILED:
wpa_printf(MSG_INFO, "Crypt algorithm initialization failed.");
break;
case IPW_CRYPT_ERR_KEY_SET_FAILED:
wpa_printf(MSG_INFO, "Key setting failed.");
break;
case IPW_CRYPT_ERR_TX_KEY_SET_FAILED:
wpa_printf(MSG_INFO, "TX key index setting failed.");
break;
case IPW_CRYPT_ERR_CARD_CONF_FAILED:
wpa_printf(MSG_INFO, "Card configuration failed.");
break;
}
}
static int ipw_set_wpa_ie(struct wpa_driver_ipw_data *drv,
const u8 *wpa_ie, size_t wpa_ie_len)
{
struct ipw_param *param;
int ret;
size_t blen = sizeof(*param) + wpa_ie_len;
param = os_zalloc(blen);
if (param == NULL)
return -1;
param->cmd = IPW_CMD_SET_WPA_IE;
param->u.wpa_ie.len = wpa_ie_len;
os_memcpy(param->u.wpa_ie.data, wpa_ie, wpa_ie_len);
ret = ipw_ioctl(drv, param, blen, 1);
os_free(param);
return ret;
}
static int ipw_set_wpa_param(struct wpa_driver_ipw_data *drv, u8 name,
u32 value)
{
struct ipw_param param;
os_memset(&param, 0, sizeof(param));
param.cmd = IPW_CMD_SET_WPA_PARAM;
param.u.wpa_param.name = name;
param.u.wpa_param.value = value;
return ipw_ioctl(drv, &param, sizeof(param), 1);
}
static int ipw_mlme(struct wpa_driver_ipw_data *drv, const u8 *addr,
int cmd, int reason)
{
struct ipw_param param;
os_memset(&param, 0, sizeof(param));
os_memcpy(param.sta_addr, addr, ETH_ALEN);
param.cmd = IPW_CMD_MLME;
param.u.mlme.command = cmd;
param.u.mlme.reason_code = reason;
return ipw_ioctl(drv, &param, sizeof(param), 1);
}
static int wpa_driver_ipw_set_wpa(void *priv, int enabled)
{
struct wpa_driver_ipw_data *drv = priv;
int ret = 0;
wpa_printf(MSG_DEBUG, "%s: enabled=%d", __FUNCTION__, enabled);
if (!enabled && ipw_set_wpa_ie(drv, NULL, 0) < 0)
ret = -1;
if (ipw_set_wpa_param(drv, IPW_PARAM_WPA_ENABLED, enabled) < 0)
ret = -1;
return ret;
}
static int wpa_driver_ipw_set_key(const char *ifname, void *priv,
enum wpa_alg alg, const u8 *addr,
int key_idx, int set_tx,
const u8 *seq, size_t seq_len,
const u8 *key, size_t key_len)
{
struct wpa_driver_ipw_data *drv = priv;
struct ipw_param *param;
u8 *buf;
size_t blen;
int ret = 0;
char *alg_name;
switch (alg) {
case WPA_ALG_NONE:
alg_name = "none";
break;
case WPA_ALG_WEP:
alg_name = "WEP";
break;
case WPA_ALG_TKIP:
alg_name = "TKIP";
break;
case WPA_ALG_CCMP:
alg_name = "CCMP";
break;
default:
return -1;
}
wpa_printf(MSG_DEBUG, "%s: alg=%s key_idx=%d set_tx=%d seq_len=%lu "
"key_len=%lu", __FUNCTION__, alg_name, key_idx, set_tx,
(unsigned long) seq_len, (unsigned long) key_len);
if (seq_len > 8)
return -2;
blen = sizeof(*param) + key_len;
buf = os_zalloc(blen);
if (buf == NULL)
return -1;
param = (struct ipw_param *) buf;
param->cmd = IPW_CMD_SET_ENCRYPTION;
os_memset(param->sta_addr, 0xff, ETH_ALEN);
os_strlcpy((char *) param->u.crypt.alg, alg_name,
IPW_CRYPT_ALG_NAME_LEN);
param->u.crypt.set_tx = set_tx ? 1 : 0;
param->u.crypt.idx = key_idx;
if (seq)
os_memcpy(param->u.crypt.seq, seq, seq_len);
param->u.crypt.key_len = key_len;
os_memcpy((u8 *) (param + 1), key, key_len);
if (ipw_ioctl(drv, param, blen, 1)) {
wpa_printf(MSG_WARNING, "Failed to set encryption.");
ipw_show_set_key_error(param);
ret = -1;
}
os_free(buf);
return ret;
}
static int wpa_driver_ipw_set_countermeasures(void *priv, int enabled)
{
struct wpa_driver_ipw_data *drv = priv;
wpa_printf(MSG_DEBUG, "%s: enabled=%d", __FUNCTION__, enabled);
return ipw_set_wpa_param(drv, IPW_PARAM_TKIP_COUNTERMEASURES,
enabled);
}
static int wpa_driver_ipw_set_drop_unencrypted(void *priv, int enabled)
{
struct wpa_driver_ipw_data *drv = priv;
wpa_printf(MSG_DEBUG, "%s: enabled=%d", __FUNCTION__, enabled);
return ipw_set_wpa_param(drv, IPW_PARAM_DROP_UNENCRYPTED,
enabled);
}
static int wpa_driver_ipw_deauthenticate(void *priv, const u8 *addr,
int reason_code)
{
struct wpa_driver_ipw_data *drv = priv;
return ipw_mlme(drv, addr, IPW_MLME_STA_DEAUTH, reason_code);
}
static int wpa_driver_ipw_disassociate(void *priv, const u8 *addr,
int reason_code)
{
struct wpa_driver_ipw_data *drv = priv;
return ipw_mlme(drv, addr, IPW_MLME_STA_DISASSOC, reason_code);
}
static int
wpa_driver_ipw_associate(void *priv, struct wpa_driver_associate_params *params)
{
struct wpa_driver_ipw_data *drv = priv;
int ret = 0;
int unencrypted_eapol;
if (wpa_driver_ipw_set_auth_alg(drv, params->auth_alg) < 0)
ret = -1;
if (wpa_driver_ipw_set_drop_unencrypted(drv, params->drop_unencrypted)
< 0)
ret = -1;
if (ipw_set_wpa_ie(drv, params->wpa_ie, params->wpa_ie_len) < 0)
ret = -1;
if (wpa_driver_wext_set_ssid(drv->wext, params->ssid,
params->ssid_len) < 0)
ret = -1;
if (wpa_driver_wext_set_bssid(drv->wext, params->bssid) < 0)
ret = -1;
if (params->key_mgmt_suite == KEY_MGMT_802_1X ||
params->key_mgmt_suite == KEY_MGMT_PSK)
unencrypted_eapol = 0;
else
unencrypted_eapol = 1;
if (ipw_set_wpa_param(drv, IPW_PARAM_IEEE_802_1X,
unencrypted_eapol) < 0) {
wpa_printf(MSG_DEBUG, "ipw: Failed to configure "
"ieee_802_1x param");
}
return ret;
}
static int wpa_driver_ipw_set_auth_alg(void *priv, int auth_alg)
{
struct wpa_driver_ipw_data *drv = priv;
int algs = 0;
if (auth_alg & WPA_AUTH_ALG_OPEN)
algs |= 1;
if (auth_alg & WPA_AUTH_ALG_SHARED)
algs |= 2;
if (auth_alg & WPA_AUTH_ALG_LEAP)
algs |= 4;
if (algs == 0)
algs = 1; /* at least one algorithm should be set */
wpa_printf(MSG_DEBUG, "%s: auth_alg=0x%x", __FUNCTION__, algs);
return ipw_set_wpa_param(drv, IPW_PARAM_AUTH_ALGS, algs);
}
static int wpa_driver_ipw_get_bssid(void *priv, u8 *bssid)
{
struct wpa_driver_ipw_data *drv = priv;
return wpa_driver_wext_get_bssid(drv->wext, bssid);
}
static int wpa_driver_ipw_get_ssid(void *priv, u8 *ssid)
{
struct wpa_driver_ipw_data *drv = priv;
return wpa_driver_wext_get_ssid(drv->wext, ssid);
}
static int wpa_driver_ipw_scan(void *priv,
struct wpa_driver_scan_params *params)
{
struct wpa_driver_ipw_data *drv = priv;
return wpa_driver_wext_scan(drv->wext, params);
}
static struct wpa_scan_results * wpa_driver_ipw_get_scan_results(void *priv)
{
struct wpa_driver_ipw_data *drv = priv;
return wpa_driver_wext_get_scan_results(drv->wext);
}
static int wpa_driver_ipw_set_operstate(void *priv, int state)
{
struct wpa_driver_ipw_data *drv = priv;
return wpa_driver_wext_set_operstate(drv->wext, state);
}
static void * wpa_driver_ipw_init(void *ctx, const char *ifname)
{
struct wpa_driver_ipw_data *drv;
int ver;
wpa_printf(MSG_DEBUG, "%s is called", __FUNCTION__);
drv = os_zalloc(sizeof(*drv));
if (drv == NULL)
return NULL;
drv->wext = wpa_driver_wext_init(ctx, ifname);
if (drv->wext == NULL) {
os_free(drv);
return NULL;
}
ver = wpa_driver_wext_get_version(drv->wext);
if (ver >= 18) {
wpa_printf(MSG_WARNING, "Linux wireless extensions version %d "
"detected.", ver);
wpa_printf(MSG_WARNING, "ipw2x00 driver uses driver_wext "
"(-Dwext) instead of driver_ipw.");
}
drv->ctx = ctx;
os_strlcpy(drv->ifname, ifname, sizeof(drv->ifname));
drv->sock = socket(PF_INET, SOCK_DGRAM, 0);
if (drv->sock < 0) {
wpa_driver_wext_deinit(drv->wext);
os_free(drv);
return NULL;
}
wpa_driver_ipw_set_wpa(drv, 1);
return drv;
}
static void wpa_driver_ipw_deinit(void *priv)
{
struct wpa_driver_ipw_data *drv = priv;
wpa_driver_ipw_set_wpa(drv, 0);
wpa_driver_wext_deinit(drv->wext);
close(drv->sock);
os_free(drv);
}
const struct wpa_driver_ops wpa_driver_ipw_ops = {
.name = "ipw",
.desc = "Intel ipw2100/2200 driver (old; use wext with Linux 2.6.13 "
"or newer)",
.get_bssid = wpa_driver_ipw_get_bssid,
.get_ssid = wpa_driver_ipw_get_ssid,
.set_key = wpa_driver_ipw_set_key,
.set_countermeasures = wpa_driver_ipw_set_countermeasures,
.scan2 = wpa_driver_ipw_scan,
.get_scan_results2 = wpa_driver_ipw_get_scan_results,
.deauthenticate = wpa_driver_ipw_deauthenticate,
.disassociate = wpa_driver_ipw_disassociate,
.associate = wpa_driver_ipw_associate,
.init = wpa_driver_ipw_init,
.deinit = wpa_driver_ipw_deinit,
.set_operstate = wpa_driver_ipw_set_operstate,
};

View File

@ -1,378 +0,0 @@
/*
* WPA Supplicant - driver interaction with Linux ndiswrapper
* Copyright (c) 2004-2006, Giridhar Pemmasani <giri@lmc.cs.sunysb.edu>
* Copyright (c) 2004-2006, Jouni Malinen <j@w1.fi>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
* Alternatively, this software may be distributed under the terms of BSD
* license.
*
* See README and COPYING for more details.
*
* Please note that ndiswrapper supports WPA configuration via Linux wireless
* extensions and if the kernel includes support for this, driver_wext.c should
* be used instead of this driver wrapper.
*/
#include "includes.h"
#include <sys/ioctl.h>
#include "wireless_copy.h"
#include "common.h"
#include "driver.h"
#include "driver_wext.h"
struct wpa_driver_ndiswrapper_data {
void *wext; /* private data for driver_wext */
void *ctx;
char ifname[IFNAMSIZ + 1];
int sock;
};
struct wpa_key {
enum wpa_alg alg;
const u8 *addr;
int key_index;
int set_tx;
const u8 *seq;
size_t seq_len;
const u8 *key;
size_t key_len;
};
struct wpa_assoc_info {
const u8 *bssid;
const u8 *ssid;
size_t ssid_len;
int freq;
const u8 *wpa_ie;
size_t wpa_ie_len;
enum wpa_cipher pairwise_suite;
enum wpa_cipher group_suite;
enum wpa_key_mgmt key_mgmt_suite;
int auth_alg;
int mode;
};
#define PRIV_RESET SIOCIWFIRSTPRIV+0
#define WPA_SET_WPA SIOCIWFIRSTPRIV+1
#define WPA_SET_KEY SIOCIWFIRSTPRIV+2
#define WPA_ASSOCIATE SIOCIWFIRSTPRIV+3
#define WPA_DISASSOCIATE SIOCIWFIRSTPRIV+4
#define WPA_DROP_UNENCRYPTED SIOCIWFIRSTPRIV+5
#define WPA_SET_COUNTERMEASURES SIOCIWFIRSTPRIV+6
#define WPA_DEAUTHENTICATE SIOCIWFIRSTPRIV+7
#define WPA_SET_AUTH_ALG SIOCIWFIRSTPRIV+8
#define WPA_INIT SIOCIWFIRSTPRIV+9
#define WPA_DEINIT SIOCIWFIRSTPRIV+10
#define WPA_GET_CAPA SIOCIWFIRSTPRIV+11
static int wpa_ndiswrapper_set_auth_alg(void *priv, int auth_alg);
static int get_socket(void)
{
static const int families[] = {
AF_INET, AF_IPX, AF_AX25, AF_APPLETALK
};
unsigned int i;
int sock;
for (i = 0; i < sizeof(families) / sizeof(int); ++i) {
sock = socket(families[i], SOCK_DGRAM, 0);
if (sock >= 0)
return sock;
}
return -1;
}
static int iw_set_ext(struct wpa_driver_ndiswrapper_data *drv, int request,
struct iwreq *pwrq)
{
os_strlcpy(pwrq->ifr_name, drv->ifname, IFNAMSIZ);
return ioctl(drv->sock, request, pwrq);
}
static int wpa_ndiswrapper_set_wpa(void *priv, int enabled)
{
struct wpa_driver_ndiswrapper_data *drv = priv;
struct iwreq priv_req;
int ret = 0;
os_memset(&priv_req, 0, sizeof(priv_req));
priv_req.u.data.flags = enabled;
if (iw_set_ext(drv, WPA_SET_WPA, &priv_req) < 0)
ret = -1;
return ret;
}
static int wpa_ndiswrapper_set_key(const char *ifname, void *priv,
enum wpa_alg alg, const u8 *addr,
int key_idx, int set_tx,
const u8 *seq, size_t seq_len,
const u8 *key, size_t key_len)
{
struct wpa_driver_ndiswrapper_data *drv = priv;
struct wpa_key wpa_key;
int ret = 0;
struct iwreq priv_req;
os_memset(&priv_req, 0, sizeof(priv_req));
wpa_key.alg = alg;
wpa_key.addr = addr;
wpa_key.key_index = key_idx;
wpa_key.set_tx = set_tx;
wpa_key.seq = seq ? seq : (u8 *) "";
wpa_key.seq_len = seq_len;
wpa_key.key = key;
wpa_key.key_len = key_len;
priv_req.u.data.pointer = (void *)&wpa_key;
priv_req.u.data.length = sizeof(wpa_key);
if (iw_set_ext(drv, WPA_SET_KEY, &priv_req) < 0)
ret = -1;
if (alg == WPA_ALG_NONE) {
/*
* ndiswrapper did not seem to be clearing keys properly in
* some cases with WPA_SET_KEY. For example, roaming from WPA
* enabled AP to plaintext one seemed to fail since the driver
* did not associate. Try to make sure the keys are cleared so
* that plaintext APs can be used in all cases.
*/
wpa_driver_wext_set_key(ifname, drv->wext, alg, addr, key_idx,
set_tx, seq, seq_len, key, key_len);
}
return ret;
}
static int wpa_ndiswrapper_set_countermeasures(void *priv, int enabled)
{
struct wpa_driver_ndiswrapper_data *drv = priv;
int ret = 0;
struct iwreq priv_req;
os_memset(&priv_req, 0, sizeof(priv_req));
priv_req.u.param.value = enabled;
if (iw_set_ext(drv, WPA_SET_COUNTERMEASURES, &priv_req) < 0)
ret = -1;
return ret;
}
static int wpa_ndiswrapper_set_drop_unencrypted(void *priv,
int enabled)
{
struct wpa_driver_ndiswrapper_data *drv = priv;
int ret = 0;
struct iwreq priv_req;
os_memset(&priv_req, 0, sizeof(priv_req));
priv_req.u.param.value = enabled;
if (iw_set_ext(drv, WPA_DROP_UNENCRYPTED, &priv_req) < 0)
ret = -1;
return ret;
}
static int wpa_ndiswrapper_deauthenticate(void *priv, const u8 *addr,
int reason_code)
{
struct wpa_driver_ndiswrapper_data *drv = priv;
int ret = 0;
struct iwreq priv_req;
os_memset(&priv_req, 0, sizeof(priv_req));
priv_req.u.param.value = reason_code;
os_memcpy(&priv_req.u.ap_addr.sa_data, addr, ETH_ALEN);
if (iw_set_ext(drv, WPA_DEAUTHENTICATE, &priv_req) < 0)
ret = -1;
return ret;
}
static int wpa_ndiswrapper_disassociate(void *priv, const u8 *addr,
int reason_code)
{
struct wpa_driver_ndiswrapper_data *drv = priv;
int ret = 0;
struct iwreq priv_req;
os_memset(&priv_req, 0, sizeof(priv_req));
os_memcpy(&priv_req.u.ap_addr.sa_data, addr, ETH_ALEN);
if (iw_set_ext(drv, WPA_DISASSOCIATE, &priv_req) < 0)
ret = -1;
return ret;
}
static int
wpa_ndiswrapper_associate(void *priv,
struct wpa_driver_associate_params *params)
{
struct wpa_driver_ndiswrapper_data *drv = priv;
int ret = 0;
struct wpa_assoc_info wpa_assoc_info;
struct iwreq priv_req;
if (wpa_ndiswrapper_set_drop_unencrypted(drv,
params->drop_unencrypted) < 0)
ret = -1;
if (wpa_ndiswrapper_set_auth_alg(drv, params->auth_alg) < 0)
ret = -1;
os_memset(&priv_req, 0, sizeof(priv_req));
os_memset(&wpa_assoc_info, 0, sizeof(wpa_assoc_info));
wpa_assoc_info.bssid = params->bssid;
wpa_assoc_info.ssid = params->ssid;
wpa_assoc_info.ssid_len = params->ssid_len;
wpa_assoc_info.freq = params->freq;
wpa_assoc_info.wpa_ie = params->wpa_ie;
wpa_assoc_info.wpa_ie_len = params->wpa_ie_len;
wpa_assoc_info.pairwise_suite = params->pairwise_suite;
wpa_assoc_info.group_suite = params->group_suite;
wpa_assoc_info.key_mgmt_suite = params->key_mgmt_suite;
wpa_assoc_info.auth_alg = params->auth_alg;
wpa_assoc_info.mode = params->mode;
priv_req.u.data.pointer = (void *)&wpa_assoc_info;
priv_req.u.data.length = sizeof(wpa_assoc_info);
if (iw_set_ext(drv, WPA_ASSOCIATE, &priv_req) < 0)
ret = -1;
return ret;
}
static int wpa_ndiswrapper_set_auth_alg(void *priv, int auth_alg)
{
struct wpa_driver_ndiswrapper_data *drv = priv;
int ret = 0;
struct iwreq priv_req;
os_memset(&priv_req, 0, sizeof(priv_req));
priv_req.u.param.value = auth_alg;
if (iw_set_ext(drv, WPA_SET_AUTH_ALG, &priv_req) < 0)
ret = -1;
return ret;
}
static int wpa_ndiswrapper_get_bssid(void *priv, u8 *bssid)
{
struct wpa_driver_ndiswrapper_data *drv = priv;
return wpa_driver_wext_get_bssid(drv->wext, bssid);
}
static int wpa_ndiswrapper_get_ssid(void *priv, u8 *ssid)
{
struct wpa_driver_ndiswrapper_data *drv = priv;
return wpa_driver_wext_get_ssid(drv->wext, ssid);
}
static int wpa_ndiswrapper_scan(void *priv,
struct wpa_driver_scan_params *params)
{
struct wpa_driver_ndiswrapper_data *drv = priv;
return wpa_driver_wext_scan(drv->wext, params);
}
static struct wpa_scan_results * wpa_ndiswrapper_get_scan_results(void *priv)
{
struct wpa_driver_ndiswrapper_data *drv = priv;
return wpa_driver_wext_get_scan_results(drv->wext);
}
static int wpa_ndiswrapper_get_capa(void *priv, struct wpa_driver_capa *capa)
{
struct wpa_driver_ndiswrapper_data *drv = priv;
int ret = 0;
struct iwreq priv_req;
os_memset(&priv_req, 0, sizeof(priv_req));
priv_req.u.data.pointer = (void *) capa;
priv_req.u.data.length = sizeof(*capa);
if (iw_set_ext(drv, WPA_GET_CAPA, &priv_req) < 0)
ret = -1;
return ret;
}
static int wpa_ndiswrapper_set_operstate(void *priv, int state)
{
struct wpa_driver_ndiswrapper_data *drv = priv;
return wpa_driver_wext_set_operstate(drv->wext, state);
}
static void * wpa_ndiswrapper_init(void *ctx, const char *ifname)
{
struct wpa_driver_ndiswrapper_data *drv;
drv = os_zalloc(sizeof(*drv));
if (drv == NULL)
return NULL;
drv->wext = wpa_driver_wext_init(ctx, ifname);
if (drv->wext == NULL) {
os_free(drv);
return NULL;
}
drv->ctx = ctx;
os_strlcpy(drv->ifname, ifname, sizeof(drv->ifname));
drv->sock = get_socket();
if (drv->sock < 0) {
wpa_driver_wext_deinit(drv->wext);
os_free(drv);
return NULL;
}
wpa_ndiswrapper_set_wpa(drv, 1);
return drv;
}
static void wpa_ndiswrapper_deinit(void *priv)
{
struct wpa_driver_ndiswrapper_data *drv = priv;
wpa_ndiswrapper_set_wpa(drv, 0);
wpa_driver_wext_deinit(drv->wext);
close(drv->sock);
os_free(drv);
}
const struct wpa_driver_ops wpa_driver_ndiswrapper_ops = {
.name = "ndiswrapper",
.desc = "Linux ndiswrapper (deprecated; use wext)",
.set_key = wpa_ndiswrapper_set_key,
.set_countermeasures = wpa_ndiswrapper_set_countermeasures,
.deauthenticate = wpa_ndiswrapper_deauthenticate,
.disassociate = wpa_ndiswrapper_disassociate,
.associate = wpa_ndiswrapper_associate,
.get_bssid = wpa_ndiswrapper_get_bssid,
.get_ssid = wpa_ndiswrapper_get_ssid,
.scan2 = wpa_ndiswrapper_scan,
.get_scan_results2 = wpa_ndiswrapper_get_scan_results,
.init = wpa_ndiswrapper_init,
.deinit = wpa_ndiswrapper_deinit,
.get_capa = wpa_ndiswrapper_get_capa,
.set_operstate = wpa_ndiswrapper_set_operstate,
};

View File

@ -24,25 +24,12 @@ extern struct wpa_driver_ops wpa_driver_nl80211_ops; /* driver_nl80211.c */
#ifdef CONFIG_DRIVER_HOSTAP
extern struct wpa_driver_ops wpa_driver_hostap_ops; /* driver_hostap.c */
#endif /* CONFIG_DRIVER_HOSTAP */
#ifdef CONFIG_DRIVER_HERMES
extern struct wpa_driver_ops wpa_driver_hermes_ops; /* driver_hermes.c */
#endif /* CONFIG_DRIVER_HERMES */
#ifdef CONFIG_DRIVER_MADWIFI
extern struct wpa_driver_ops wpa_driver_madwifi_ops; /* driver_madwifi.c */
#endif /* CONFIG_DRIVER_MADWIFI */
#ifdef CONFIG_DRIVER_ATMEL
extern struct wpa_driver_ops wpa_driver_atmel_ops; /* driver_atmel.c */
#endif /* CONFIG_DRIVER_ATMEL */
#ifdef CONFIG_DRIVER_NDISWRAPPER
/* driver_ndiswrapper.c */
extern struct wpa_driver_ops wpa_driver_ndiswrapper_ops;
#endif /* CONFIG_DRIVER_NDISWRAPPER */
#ifdef CONFIG_DRIVER_BROADCOM
extern struct wpa_driver_ops wpa_driver_broadcom_ops; /* driver_broadcom.c */
#endif /* CONFIG_DRIVER_BROADCOM */
#ifdef CONFIG_DRIVER_IPW
extern struct wpa_driver_ops wpa_driver_ipw_ops; /* driver_ipw.c */
#endif /* CONFIG_DRIVER_IPW */
#ifdef CONFIG_DRIVER_BSD
extern struct wpa_driver_ops wpa_driver_bsd_ops; /* driver_bsd.c */
#endif /* CONFIG_DRIVER_BSD */
@ -87,24 +74,12 @@ struct wpa_driver_ops *wpa_drivers[] =
#ifdef CONFIG_DRIVER_HOSTAP
&wpa_driver_hostap_ops,
#endif /* CONFIG_DRIVER_HOSTAP */
#ifdef CONFIG_DRIVER_HERMES
&wpa_driver_hermes_ops,
#endif /* CONFIG_DRIVER_HERMES */
#ifdef CONFIG_DRIVER_MADWIFI
&wpa_driver_madwifi_ops,
#endif /* CONFIG_DRIVER_MADWIFI */
#ifdef CONFIG_DRIVER_ATMEL
&wpa_driver_atmel_ops,
#endif /* CONFIG_DRIVER_ATMEL */
#ifdef CONFIG_DRIVER_NDISWRAPPER
&wpa_driver_ndiswrapper_ops,
#endif /* CONFIG_DRIVER_NDISWRAPPER */
#ifdef CONFIG_DRIVER_BROADCOM
&wpa_driver_broadcom_ops,
#endif /* CONFIG_DRIVER_BROADCOM */
#ifdef CONFIG_DRIVER_IPW
&wpa_driver_ipw_ops,
#endif /* CONFIG_DRIVER_IPW */
#ifdef CONFIG_DRIVER_BSD
&wpa_driver_bsd_ops,
#endif /* CONFIG_DRIVER_BSD */

View File

@ -97,24 +97,6 @@ NEED_LINUX_IOCTL=y
NEED_RFKILL=y
endif
ifdef CONFIG_DRIVER_HERMES
DRV_WPA_CFLAGS += -DCONFIG_DRIVER_HERMES
DRV_WPA_OBJS += ../src/drivers/driver_hermes.o
CONFIG_WIRELESS_EXTENSION=y
endif
ifdef CONFIG_DRIVER_ATMEL
DRV_WPA_CFLAGS += -DCONFIG_DRIVER_ATMEL
DRV_WPA_OBJS += ../src/drivers/driver_atmel.o
CONFIG_WIRELESS_EXTENSION=y
endif
ifdef CONFIG_DRIVER_NDISWRAPPER
DRV_WPA_CFLAGS += -DCONFIG_DRIVER_NDISWRAPPER
DRV_WPA_OBJS += ../src/drivers/driver_ndiswrapper.o
CONFIG_WIRELESS_EXTENSION=y
endif
ifdef CONFIG_DRIVER_RALINK
DRV_WPA_CFLAGS += -DCONFIG_DRIVER_RALINK
DRV_WPA_OBJS += ../src/drivers/driver_ralink.o
@ -127,12 +109,6 @@ DRV_WPA_CFLAGS += -DCONFIG_DRIVER_BROADCOM
DRV_WPA_OBJS += ../src/drivers/driver_broadcom.o
endif
ifdef CONFIG_DRIVER_IPW
DRV_WPA_CFLAGS += -DCONFIG_DRIVER_IPW
DRV_WPA_OBJS += ../src/drivers/driver_ipw.o
CONFIG_WIRELESS_EXTENSION=y
endif
ifdef CONFIG_DRIVER_NDIS
DRV_WPA_CFLAGS += -DCONFIG_DRIVER_NDIS
DRV_WPA_OBJS += ../src/drivers/driver_ndis.o

View File

@ -147,22 +147,12 @@ Current hardware/software requirements:
Linuxant DriverLoader (http://www.linuxant.com/driverloader/)
with Windows NDIS driver for your wlan card supporting WPA.
Agere Systems Inc. Linux Driver
(http://www.agere.com/support/drivers/)
Please note that the driver interface file (driver_hermes.c) and
hardware specific include files are not included in the
wpa_supplicant distribution. You will need to copy these from the
source package of the Agere driver.
madwifi driver for cards based on Atheros chip set (ar521x)
(http://sourceforge.net/projects/madwifi/)
Please note that you will need to modify the wpa_supplicant .config
file to use the correct path for the madwifi driver root directory
(CFLAGS += -I../madwifi/wpa line in example defconfig).
ATMEL AT76C5XXx driver for USB and PCMCIA cards
(http://atmelwlandriver.sourceforge.net/).
Linux ndiswrapper (http://ndiswrapper.sourceforge.net/) with
Windows NDIS driver.
@ -181,12 +171,6 @@ Current hardware/software requirements:
not need (or even work) with the specific driver wrapper. Use -Dwext
with that driver.
Intel ipw2100 driver
(http://sourceforge.net/projects/ipw2100/)
Intel ipw2200 driver
(http://sourceforge.net/projects/ipw2200/)
In theory, any driver that supports Linux wireless extensions can be
used with IEEE 802.1X (i.e., not WPA) when using ap_scan=0 option in
configuration file.
@ -396,18 +380,13 @@ authentication algorithm (for EAP-SIM/EAP-AKA). This requires pcsc-lite
CONFIG_PCSC=y
Following options can be added to .config to select which driver
interfaces are included. Hermes driver interface needs to be downloaded
from Agere (see above).
interfaces are included.
CONFIG_DRIVER_HOSTAP=y
CONFIG_DRIVER_HERMES=y
CONFIG_DRIVER_MADWIFI=y
CONFIG_DRIVER_ATMEL=y
CONFIG_DRIVER_WEXT=y
CONFIG_DRIVER_RALINK=y
CONFIG_DRIVER_NDISWRAPPER=y
CONFIG_DRIVER_BROADCOM=y
CONFIG_DRIVER_IPW=y
CONFIG_DRIVER_BSD=y
CONFIG_DRIVER_NDIS=y
@ -415,13 +394,9 @@ Following example includes all features and driver interfaces that are
included in the wpa_supplicant package:
CONFIG_DRIVER_HOSTAP=y
CONFIG_DRIVER_HERMES=y
CONFIG_DRIVER_MADWIFI=y
CONFIG_DRIVER_ATMEL=y
CONFIG_DRIVER_WEXT=y
CONFIG_DRIVER_NDISWRAPPER=y
CONFIG_DRIVER_BROADCOM=y
CONFIG_DRIVER_IPW=y
CONFIG_DRIVER_BSD=y
CONFIG_DRIVER_NDIS=y
CONFIG_IEEE8021X_EAPOL=y
@ -516,14 +491,10 @@ options:
drivers:
hostap = Host AP driver (Intersil Prism2/2.5/3) [default]
(this can also be used with Linuxant DriverLoader)
hermes = Agere Systems Inc. driver (Hermes-I/Hermes-II)
madwifi = MADWIFI 802.11 support (Atheros, etc.) (deprecated; use wext)
atmel = ATMEL AT76C5XXx (USB, PCMCIA)
wext = Linux wireless extensions (generic)
ralink = Ralink Client driver
ndiswrapper = Linux ndiswrapper (deprecated; use wext)
broadcom = Broadcom wl.o driver
ipw = Intel ipw2100/2200 driver (old; use wext with Linux 2.6.13 or newer)
wired = wpa_supplicant wired Ethernet driver
roboswitch = wpa_supplicant Broadcom switch driver
bsd = BSD 802.11 support (Atheros, etc.)

View File

@ -267,13 +267,6 @@
</listitem>
</varlistentry>
<varlistentry>
<term>atmel</term>
<listitem>
<para>ATMEL AT76C5XXx (USB, PCMCIA).</para>
</listitem>
</varlistentry>
<varlistentry>
<term>wext</term>
<listitem>
@ -281,13 +274,6 @@
</listitem>
</varlistentry>
<varlistentry>
<term>ndiswrapper</term>
<listitem>
<para>Linux ndiswrapper.</para>
</listitem>
</varlistentry>
<varlistentry>
<term>broadcom</term>
<listitem>
@ -295,13 +281,6 @@
</listitem>
</varlistentry>
<varlistentry>
<term>ipw</term>
<listitem>
<para>Intel ipw2100/2200 driver.</para>
</listitem>
</varlistentry>
<varlistentry>
<term>wired</term>
<listitem>
@ -598,13 +577,6 @@ wpa_supplicant \
</listitem>
</varlistentry>
<varlistentry>
<term>ATMEL AT76C5XXx driver for USB and PCMCIA cards</term>
<listitem>
<para> (http://atmelwlandriver.sourceforge.net/).</para>
</listitem>
</varlistentry>
<varlistentry>
<term>Linux ndiswrapper</term>
<listitem>