1526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt/* 2526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * WPA Supplicant - driver interaction with MADWIFI 802.11 driver 3526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * Copyright (c) 2004, Sam Leffler <sam@errno.com> 4526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * Copyright (c) 2004-2005, Jouni Malinen <j@w1.fi> 5526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * 6526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * This program is free software; you can redistribute it and/or modify 7526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * it under the terms of the GNU General Public License version 2 as 8526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * published by the Free Software Foundation. 9526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * 10526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * Alternatively, this software may be distributed under the terms of BSD 11526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * license. 12526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * 13526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * See README and COPYING for more details. 14dde787cc314cd04caa4ea5f031cc8a02495ca513Dmitry Shmidt * 15dde787cc314cd04caa4ea5f031cc8a02495ca513Dmitry Shmidt * Please note that madwifi supports WPA configuration via Linux wireless 16dde787cc314cd04caa4ea5f031cc8a02495ca513Dmitry Shmidt * extensions and if the kernel includes support for this, driver_wext.c should 17dde787cc314cd04caa4ea5f031cc8a02495ca513Dmitry Shmidt * be used instead of this driver wrapper. 18526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt */ 19526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 20526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#include "includes.h" 21526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#include <sys/ioctl.h> 22526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 23526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#include "common.h" 24526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#include "driver.h" 25526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#include "driver_wext.h" 26526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#include "eloop.h" 27526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#include "ieee802_11_defs.h" 28526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#include "wireless_copy.h" 29526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 30526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt/* 31526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * Avoid conflicts with wpa_supplicant definitions by undefining a definition. 32526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt */ 33526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#undef WME_OUI_TYPE 34526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 35526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#include <include/compat.h> 36526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#include <net80211/ieee80211.h> 37526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#ifdef WME_NUM_AC 38526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt/* Assume this is built against BSD branch of madwifi driver. */ 39526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#define MADWIFI_BSD 40526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#include <net80211/_ieee80211.h> 41526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#endif /* WME_NUM_AC */ 42526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#include <net80211/ieee80211_crypto.h> 43526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#include <net80211/ieee80211_ioctl.h> 44526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 45526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 46526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#ifdef IEEE80211_IOCTL_SETWMMPARAMS 47526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt/* Assume this is built against madwifi-ng */ 48526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#define MADWIFI_NG 49526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#endif /* IEEE80211_IOCTL_SETWMMPARAMS */ 50526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 51526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstruct wpa_driver_madwifi_data { 52526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt void *wext; /* private data for driver_wext */ 53526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt void *ctx; 54526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt char ifname[IFNAMSIZ + 1]; 55526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt int sock; 56526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}; 57526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 58526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic int 59526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtset80211priv(struct wpa_driver_madwifi_data *drv, int op, void *data, int len, 60526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt int show_err) 61526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{ 62526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt struct iwreq iwr; 63526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 64526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt os_memset(&iwr, 0, sizeof(iwr)); 65526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt os_strlcpy(iwr.ifr_name, drv->ifname, IFNAMSIZ); 66526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (len < IFNAMSIZ && 67526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt op != IEEE80211_IOCTL_SET_APPIEBUF) { 68526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt /* 69526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * Argument data fits inline; put it there. 70526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt */ 71526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt os_memcpy(iwr.u.name, data, len); 72526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } else { 73526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt /* 74526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * Argument data too big for inline transfer; setup a 75526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * parameter block instead; the kernel will transfer 76526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * the data for the driver. 77526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt */ 78526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt iwr.u.data.pointer = data; 79526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt iwr.u.data.length = len; 80526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 81526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 82526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (ioctl(drv->sock, op, &iwr) < 0) { 83526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (show_err) { 84526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#ifdef MADWIFI_NG 85526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt int first = IEEE80211_IOCTL_SETPARAM; 86526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt int last = IEEE80211_IOCTL_KICKMAC; 87526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt static const char *opnames[] = { 88526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt "ioctl[IEEE80211_IOCTL_SETPARAM]", 89526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt "ioctl[IEEE80211_IOCTL_GETPARAM]", 90526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt "ioctl[IEEE80211_IOCTL_SETMODE]", 91526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt "ioctl[IEEE80211_IOCTL_GETMODE]", 92526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt "ioctl[IEEE80211_IOCTL_SETWMMPARAMS]", 93526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt "ioctl[IEEE80211_IOCTL_GETWMMPARAMS]", 94526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt "ioctl[IEEE80211_IOCTL_SETCHANLIST]", 95526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt "ioctl[IEEE80211_IOCTL_GETCHANLIST]", 96526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt "ioctl[IEEE80211_IOCTL_CHANSWITCH]", 97526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt NULL, 98526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt "ioctl[IEEE80211_IOCTL_SET_APPIEBUF]", 99526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt "ioctl[IEEE80211_IOCTL_GETSCANRESULTS]", 100526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt NULL, 101526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt "ioctl[IEEE80211_IOCTL_GETCHANINFO]", 102526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt "ioctl[IEEE80211_IOCTL_SETOPTIE]", 103526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt "ioctl[IEEE80211_IOCTL_GETOPTIE]", 104526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt "ioctl[IEEE80211_IOCTL_SETMLME]", 105526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt NULL, 106526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt "ioctl[IEEE80211_IOCTL_SETKEY]", 107526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt NULL, 108526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt "ioctl[IEEE80211_IOCTL_DELKEY]", 109526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt NULL, 110526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt "ioctl[IEEE80211_IOCTL_ADDMAC]", 111526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt NULL, 112526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt "ioctl[IEEE80211_IOCTL_DELMAC]", 113526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt NULL, 114526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt "ioctl[IEEE80211_IOCTL_WDSMAC]", 115526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt NULL, 116526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt "ioctl[IEEE80211_IOCTL_WDSDELMAC]", 117526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt NULL, 118526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt "ioctl[IEEE80211_IOCTL_KICKMAC]", 119526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt }; 120526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#else /* MADWIFI_NG */ 121526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt int first = IEEE80211_IOCTL_SETPARAM; 122526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt int last = IEEE80211_IOCTL_CHANLIST; 123526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt static const char *opnames[] = { 124526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt "ioctl[IEEE80211_IOCTL_SETPARAM]", 125526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt "ioctl[IEEE80211_IOCTL_GETPARAM]", 126526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt "ioctl[IEEE80211_IOCTL_SETKEY]", 127526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt "ioctl[IEEE80211_IOCTL_GETKEY]", 128526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt "ioctl[IEEE80211_IOCTL_DELKEY]", 129526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt NULL, 130526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt "ioctl[IEEE80211_IOCTL_SETMLME]", 131526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt NULL, 132526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt "ioctl[IEEE80211_IOCTL_SETOPTIE]", 133526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt "ioctl[IEEE80211_IOCTL_GETOPTIE]", 134526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt "ioctl[IEEE80211_IOCTL_ADDMAC]", 135526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt NULL, 136526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt "ioctl[IEEE80211_IOCTL_DELMAC]", 137526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt NULL, 138526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt "ioctl[IEEE80211_IOCTL_CHANLIST]", 139526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt }; 140526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#endif /* MADWIFI_NG */ 141526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt int idx = op - first; 142526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (first <= op && op <= last && 143526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt idx < (int) (sizeof(opnames) / sizeof(opnames[0])) 144526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt && opnames[idx]) 145526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt perror(opnames[idx]); 146526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt else 147526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt perror("ioctl[unknown???]"); 148526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 149526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return -1; 150526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 151526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return 0; 152526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt} 153526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 154526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic int 155526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtset80211param(struct wpa_driver_madwifi_data *drv, int op, int arg, 156526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt int show_err) 157526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{ 158526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt struct iwreq iwr; 159526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 160526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt os_memset(&iwr, 0, sizeof(iwr)); 161526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt os_strlcpy(iwr.ifr_name, drv->ifname, IFNAMSIZ); 162526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt iwr.u.mode = op; 163526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt os_memcpy(iwr.u.name+sizeof(u32), &arg, sizeof(arg)); 164526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 165526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (ioctl(drv->sock, IEEE80211_IOCTL_SETPARAM, &iwr) < 0) { 166526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (show_err) 167526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt perror("ioctl[IEEE80211_IOCTL_SETPARAM]"); 168526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return -1; 169526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 170526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return 0; 171526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt} 172526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 173526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic int 174526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtwpa_driver_madwifi_set_wpa_ie(struct wpa_driver_madwifi_data *drv, 175526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt const u8 *wpa_ie, size_t wpa_ie_len) 176526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{ 177526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt struct iwreq iwr; 178526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 179526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt os_memset(&iwr, 0, sizeof(iwr)); 180526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt os_strlcpy(iwr.ifr_name, drv->ifname, IFNAMSIZ); 181526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt /* NB: SETOPTIE is not fixed-size so must not be inlined */ 182526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt iwr.u.data.pointer = (void *) wpa_ie; 183526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt iwr.u.data.length = wpa_ie_len; 184526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 185526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (ioctl(drv->sock, IEEE80211_IOCTL_SETOPTIE, &iwr) < 0) { 186526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt perror("ioctl[IEEE80211_IOCTL_SETOPTIE]"); 187526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return -1; 188526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 189526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return 0; 190526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt} 191526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 192526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic int 193526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtwpa_driver_madwifi_del_key(struct wpa_driver_madwifi_data *drv, int key_idx, 194526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt const u8 *addr) 195526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{ 196526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt struct ieee80211req_del_key wk; 197526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 198526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_printf(MSG_DEBUG, "%s: keyidx=%d", __FUNCTION__, key_idx); 199526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt os_memset(&wk, 0, sizeof(wk)); 200526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wk.idk_keyix = key_idx; 201526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (addr != NULL) 202526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt os_memcpy(wk.idk_macaddr, addr, IEEE80211_ADDR_LEN); 203526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 204526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return set80211priv(drv, IEEE80211_IOCTL_DELKEY, &wk, sizeof(wk), 1); 205526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt} 206526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 207526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic int 208526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtwpa_driver_madwifi_set_key(void *priv, wpa_alg alg, 209526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt const u8 *addr, int key_idx, int set_tx, 210526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt const u8 *seq, size_t seq_len, 211526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt const u8 *key, size_t key_len) 212526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{ 213526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt struct wpa_driver_madwifi_data *drv = priv; 214526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt struct ieee80211req_key wk; 215526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt char *alg_name; 216526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt u_int8_t cipher; 217526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 218526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (alg == WPA_ALG_NONE) 219526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return wpa_driver_madwifi_del_key(drv, key_idx, addr); 220526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 221526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt switch (alg) { 222526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt case WPA_ALG_WEP: 223526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (addr == NULL || os_memcmp(addr, "\xff\xff\xff\xff\xff\xff", 224526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ETH_ALEN) == 0) { 225526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt /* 226526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * madwifi did not seem to like static WEP key 227526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * configuration with IEEE80211_IOCTL_SETKEY, so use 228526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * Linux wireless extensions ioctl for this. 229526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt */ 230526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return wpa_driver_wext_set_key(drv->wext, alg, addr, 231526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt key_idx, set_tx, 232526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt seq, seq_len, 233526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt key, key_len); 234526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 235526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt alg_name = "WEP"; 236526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt cipher = IEEE80211_CIPHER_WEP; 237526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt break; 238526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt case WPA_ALG_TKIP: 239526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt alg_name = "TKIP"; 240526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt cipher = IEEE80211_CIPHER_TKIP; 241526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt break; 242526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt case WPA_ALG_CCMP: 243526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt alg_name = "CCMP"; 244526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt cipher = IEEE80211_CIPHER_AES_CCM; 245526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt break; 246526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt default: 247526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_printf(MSG_DEBUG, "%s: unknown/unsupported algorithm %d", 248526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt __FUNCTION__, alg); 249526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return -1; 250526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 251526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 252526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_printf(MSG_DEBUG, "%s: alg=%s key_idx=%d set_tx=%d seq_len=%lu " 253526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt "key_len=%lu", __FUNCTION__, alg_name, key_idx, set_tx, 254526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt (unsigned long) seq_len, (unsigned long) key_len); 255526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 256526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (seq_len > sizeof(u_int64_t)) { 257526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_printf(MSG_DEBUG, "%s: seq_len %lu too big", 258526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt __FUNCTION__, (unsigned long) seq_len); 259526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return -2; 260526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 261526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (key_len > sizeof(wk.ik_keydata)) { 262526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_printf(MSG_DEBUG, "%s: key length %lu too big", 263526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt __FUNCTION__, (unsigned long) key_len); 264526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return -3; 265526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 266526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 267526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt os_memset(&wk, 0, sizeof(wk)); 268526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wk.ik_type = cipher; 269526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wk.ik_flags = IEEE80211_KEY_RECV; 270526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (addr == NULL || 271526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt os_memcmp(addr, "\xff\xff\xff\xff\xff\xff", ETH_ALEN) == 0) 272526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wk.ik_flags |= IEEE80211_KEY_GROUP; 273526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (set_tx) { 274526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wk.ik_flags |= IEEE80211_KEY_XMIT | IEEE80211_KEY_DEFAULT; 275526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt os_memcpy(wk.ik_macaddr, addr, IEEE80211_ADDR_LEN); 276526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } else 277526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt os_memset(wk.ik_macaddr, 0, IEEE80211_ADDR_LEN); 278526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wk.ik_keyix = key_idx; 279526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wk.ik_keylen = key_len; 280526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#ifdef WORDS_BIGENDIAN 281526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#define WPA_KEY_RSC_LEN 8 282526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt { 283526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt size_t i; 284526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt u8 tmp[WPA_KEY_RSC_LEN]; 285526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt os_memset(tmp, 0, sizeof(tmp)); 286526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt for (i = 0; i < seq_len; i++) 287526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt tmp[WPA_KEY_RSC_LEN - i - 1] = seq[i]; 288526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt os_memcpy(&wk.ik_keyrsc, tmp, WPA_KEY_RSC_LEN); 289526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 290526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#else /* WORDS_BIGENDIAN */ 291526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt os_memcpy(&wk.ik_keyrsc, seq, seq_len); 292526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#endif /* WORDS_BIGENDIAN */ 293526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt os_memcpy(wk.ik_keydata, key, key_len); 294526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 295526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return set80211priv(drv, IEEE80211_IOCTL_SETKEY, &wk, sizeof(wk), 1); 296526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt} 297526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 298526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic int 299526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtwpa_driver_madwifi_set_countermeasures(void *priv, int enabled) 300526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{ 301526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt struct wpa_driver_madwifi_data *drv = priv; 302526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_printf(MSG_DEBUG, "%s: enabled=%d", __FUNCTION__, enabled); 303526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return set80211param(drv, IEEE80211_PARAM_COUNTERMEASURES, enabled, 1); 304526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt} 305526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 306526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 307526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic int 308526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtwpa_driver_madwifi_set_drop_unencrypted(void *priv, int enabled) 309526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{ 310526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt struct wpa_driver_madwifi_data *drv = priv; 311526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_printf(MSG_DEBUG, "%s: enabled=%d", __FUNCTION__, enabled); 312526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return set80211param(drv, IEEE80211_PARAM_DROPUNENCRYPTED, enabled, 1); 313526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt} 314526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 315526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic int 316526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtwpa_driver_madwifi_deauthenticate(void *priv, const u8 *addr, int reason_code) 317526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{ 318526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt struct wpa_driver_madwifi_data *drv = priv; 319526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt struct ieee80211req_mlme mlme; 320526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 321526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_printf(MSG_DEBUG, "%s", __FUNCTION__); 322526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt mlme.im_op = IEEE80211_MLME_DEAUTH; 323526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt mlme.im_reason = reason_code; 324526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt os_memcpy(mlme.im_macaddr, addr, IEEE80211_ADDR_LEN); 325526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return set80211priv(drv, IEEE80211_IOCTL_SETMLME, &mlme, sizeof(mlme), 1); 326526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt} 327526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 328526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic int 329526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtwpa_driver_madwifi_disassociate(void *priv, const u8 *addr, int reason_code) 330526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{ 331526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt struct wpa_driver_madwifi_data *drv = priv; 332526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt struct ieee80211req_mlme mlme; 333526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 334526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_printf(MSG_DEBUG, "%s", __FUNCTION__); 335526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt mlme.im_op = IEEE80211_MLME_DISASSOC; 336526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt mlme.im_reason = reason_code; 337526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt os_memcpy(mlme.im_macaddr, addr, IEEE80211_ADDR_LEN); 338526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return set80211priv(drv, IEEE80211_IOCTL_SETMLME, &mlme, sizeof(mlme), 1); 339526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt} 340526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 341526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic int 342526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtwpa_driver_madwifi_associate(void *priv, 343526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt struct wpa_driver_associate_params *params) 344526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{ 345526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt struct wpa_driver_madwifi_data *drv = priv; 346526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt struct ieee80211req_mlme mlme; 347526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt int ret = 0, privacy = 1; 348526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 349526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_printf(MSG_DEBUG, "%s", __FUNCTION__); 350526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 351526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt /* 352526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * NB: Don't need to set the freq or cipher-related state as 353526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * this is implied by the bssid which is used to locate 354526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * the scanned node state which holds it. The ssid is 355526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * needed to disambiguate an AP that broadcasts multiple 356526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * ssid's but uses the same bssid. 357526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt */ 358526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt /* XXX error handling is wrong but unclear what to do... */ 359526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (wpa_driver_madwifi_set_wpa_ie(drv, params->wpa_ie, 360526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt params->wpa_ie_len) < 0) 361526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ret = -1; 362526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 363526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (params->pairwise_suite == CIPHER_NONE && 364526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt params->group_suite == CIPHER_NONE && 365526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt params->key_mgmt_suite == KEY_MGMT_NONE && 366526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt params->wpa_ie_len == 0) 367526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt privacy = 0; 368526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 369526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (set80211param(drv, IEEE80211_PARAM_PRIVACY, privacy, 1) < 0) 370526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ret = -1; 371526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 372526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (params->wpa_ie_len && 373526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt set80211param(drv, IEEE80211_PARAM_WPA, 374526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt params->wpa_ie[0] == WLAN_EID_RSN ? 2 : 1, 1) < 0) 375526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ret = -1; 376526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 377526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (params->bssid == NULL) { 378526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt /* ap_scan=2 mode - driver takes care of AP selection and 379526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * roaming */ 380526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt /* FIX: this does not seem to work; would probably need to 381526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * change something in the driver */ 382526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (set80211param(drv, IEEE80211_PARAM_ROAMING, 0, 1) < 0) 383526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ret = -1; 384526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 385526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (wpa_driver_wext_set_ssid(drv->wext, params->ssid, 386526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt params->ssid_len) < 0) 387526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ret = -1; 388526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } else { 389526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (set80211param(drv, IEEE80211_PARAM_ROAMING, 2, 1) < 0) 390526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ret = -1; 391526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (wpa_driver_wext_set_ssid(drv->wext, params->ssid, 392526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt params->ssid_len) < 0) 393526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ret = -1; 394526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt os_memset(&mlme, 0, sizeof(mlme)); 395526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt mlme.im_op = IEEE80211_MLME_ASSOC; 396526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt os_memcpy(mlme.im_macaddr, params->bssid, IEEE80211_ADDR_LEN); 397526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (set80211priv(drv, IEEE80211_IOCTL_SETMLME, &mlme, 398526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt sizeof(mlme), 1) < 0) { 399526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_printf(MSG_DEBUG, "%s: SETMLME[ASSOC] failed", 400526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt __func__); 401526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ret = -1; 402526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 403526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 404526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 405526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return ret; 406526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt} 407526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 408526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic int 409526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtwpa_driver_madwifi_set_auth_alg(void *priv, int auth_alg) 410526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{ 411526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt struct wpa_driver_madwifi_data *drv = priv; 412526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt int authmode; 413526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 414526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if ((auth_alg & AUTH_ALG_OPEN_SYSTEM) && 415526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt (auth_alg & AUTH_ALG_SHARED_KEY)) 416526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt authmode = IEEE80211_AUTH_AUTO; 417526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt else if (auth_alg & AUTH_ALG_SHARED_KEY) 418526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt authmode = IEEE80211_AUTH_SHARED; 419526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt else 420526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt authmode = IEEE80211_AUTH_OPEN; 421526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 422526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return set80211param(drv, IEEE80211_PARAM_AUTHMODE, authmode, 1); 423526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt} 424526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 425526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic int 426526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtwpa_driver_madwifi_scan(void *priv, const u8 *ssid, size_t ssid_len) 427526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{ 428526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt struct wpa_driver_madwifi_data *drv = priv; 429526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt struct iwreq iwr; 430526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt int ret = 0; 431526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 432526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt os_memset(&iwr, 0, sizeof(iwr)); 433526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt os_strlcpy(iwr.ifr_name, drv->ifname, IFNAMSIZ); 434526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 435526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt /* set desired ssid before scan */ 436526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt /* FIX: scan should not break the current association, so using 437526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * set_ssid may not be the best way of doing this.. */ 438526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (wpa_driver_wext_set_ssid(drv->wext, ssid, ssid_len) < 0) 439526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ret = -1; 440526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 441526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (ioctl(drv->sock, SIOCSIWSCAN, &iwr) < 0) { 442526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt perror("ioctl[SIOCSIWSCAN]"); 443526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ret = -1; 444526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 445526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 446526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt /* 447526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * madwifi delivers a scan complete event so no need to poll, but 448526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * register a backup timeout anyway to make sure that we recover even 449526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * if the driver does not send this event for any reason. This timeout 450526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * will only be used if the event is not delivered (event handler will 451526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * cancel the timeout). 452526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt */ 453526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt eloop_cancel_timeout(wpa_driver_wext_scan_timeout, drv->wext, 454526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt drv->ctx); 455526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt eloop_register_timeout(30, 0, wpa_driver_wext_scan_timeout, drv->wext, 456526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt drv->ctx); 457526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 458526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return ret; 459526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt} 460526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 461526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic int wpa_driver_madwifi_get_bssid(void *priv, u8 *bssid) 462526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{ 463526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt struct wpa_driver_madwifi_data *drv = priv; 464526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return wpa_driver_wext_get_bssid(drv->wext, bssid); 465526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt} 466526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 467526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 468526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic int wpa_driver_madwifi_get_ssid(void *priv, u8 *ssid) 469526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{ 470526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt struct wpa_driver_madwifi_data *drv = priv; 471526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return wpa_driver_wext_get_ssid(drv->wext, ssid); 472526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt} 473526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 474526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 475526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic struct wpa_scan_results * 476526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtwpa_driver_madwifi_get_scan_results(void *priv) 477526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{ 478526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt struct wpa_driver_madwifi_data *drv = priv; 479526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return wpa_driver_wext_get_scan_results(drv->wext); 480526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt} 481526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 482526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 483526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic int wpa_driver_madwifi_set_operstate(void *priv, int state) 484526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{ 485526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt struct wpa_driver_madwifi_data *drv = priv; 486526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return wpa_driver_wext_set_operstate(drv->wext, state); 487526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt} 488526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 489526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 490526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic int wpa_driver_madwifi_set_probe_req_ie(void *priv, const u8 *ies, 491526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt size_t ies_len) 492526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{ 493526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt struct ieee80211req_getset_appiebuf *probe_req_ie; 494526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt int ret; 495526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 496526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt probe_req_ie = os_malloc(sizeof(*probe_req_ie) + ies_len); 497526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (probe_req_ie == NULL) 498526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return -1; 499526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 500526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt probe_req_ie->app_frmtype = IEEE80211_APPIE_FRAME_PROBE_REQ; 501526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt probe_req_ie->app_buflen = ies_len; 502526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt os_memcpy(probe_req_ie->app_buf, ies, ies_len); 503526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 504526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ret = set80211priv(priv, IEEE80211_IOCTL_SET_APPIEBUF, probe_req_ie, 505526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt sizeof(struct ieee80211req_getset_appiebuf) + 506526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ies_len, 1); 507526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 508526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt os_free(probe_req_ie); 509526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 510526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return ret; 511526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt} 512526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 513526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 514526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic void * wpa_driver_madwifi_init(void *ctx, const char *ifname) 515526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{ 516526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt struct wpa_driver_madwifi_data *drv; 517526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 518526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt drv = os_zalloc(sizeof(*drv)); 519526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (drv == NULL) 520526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return NULL; 521526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt drv->wext = wpa_driver_wext_init(ctx, ifname); 522526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (drv->wext == NULL) 523526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt goto fail; 524526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 525526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt drv->ctx = ctx; 526526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt os_strlcpy(drv->ifname, ifname, sizeof(drv->ifname)); 527526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt drv->sock = socket(PF_INET, SOCK_DGRAM, 0); 528526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (drv->sock < 0) 529526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt goto fail2; 530526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 531526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (set80211param(drv, IEEE80211_PARAM_ROAMING, 2, 1) < 0) { 532526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_printf(MSG_DEBUG, "%s: failed to set wpa_supplicant-based " 533526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt "roaming", __FUNCTION__); 534526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt goto fail3; 535526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 536526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 537526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (set80211param(drv, IEEE80211_PARAM_WPA, 3, 1) < 0) { 538526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_printf(MSG_DEBUG, "%s: failed to enable WPA support", 539526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt __FUNCTION__); 540526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt goto fail3; 541526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 542526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 543526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return drv; 544526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 545526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtfail3: 546526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt close(drv->sock); 547526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtfail2: 548526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_driver_wext_deinit(drv->wext); 549526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtfail: 550526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt os_free(drv); 551526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return NULL; 552526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt} 553526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 554526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 555526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic void wpa_driver_madwifi_deinit(void *priv) 556526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{ 557526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt struct wpa_driver_madwifi_data *drv = priv; 558526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 559526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (wpa_driver_madwifi_set_wpa_ie(drv, NULL, 0) < 0) { 560526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_printf(MSG_DEBUG, "%s: failed to clear WPA IE", 561526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt __FUNCTION__); 562526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 563526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (set80211param(drv, IEEE80211_PARAM_ROAMING, 0, 1) < 0) { 564526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_printf(MSG_DEBUG, "%s: failed to enable driver-based " 565526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt "roaming", __FUNCTION__); 566526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 567526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (set80211param(drv, IEEE80211_PARAM_PRIVACY, 0, 1) < 0) { 568526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_printf(MSG_DEBUG, "%s: failed to disable forced Privacy " 569526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt "flag", __FUNCTION__); 570526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 571526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (set80211param(drv, IEEE80211_PARAM_WPA, 0, 1) < 0) { 572526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_printf(MSG_DEBUG, "%s: failed to disable WPA", 573526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt __FUNCTION__); 574526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 575526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 576526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_driver_wext_deinit(drv->wext); 577526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 578526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt close(drv->sock); 579526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt os_free(drv); 580526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt} 581526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 582526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 583526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtconst struct wpa_driver_ops wpa_driver_madwifi_ops = { 584526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt .name = "madwifi", 585526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt .desc = "MADWIFI 802.11 support (Atheros, etc.)", 586526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt .get_bssid = wpa_driver_madwifi_get_bssid, 587526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt .get_ssid = wpa_driver_madwifi_get_ssid, 588526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt .set_key = wpa_driver_madwifi_set_key, 589526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt .init = wpa_driver_madwifi_init, 590526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt .deinit = wpa_driver_madwifi_deinit, 591526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt .set_countermeasures = wpa_driver_madwifi_set_countermeasures, 592526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt .set_drop_unencrypted = wpa_driver_madwifi_set_drop_unencrypted, 593526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt .scan = wpa_driver_madwifi_scan, 594526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt .get_scan_results2 = wpa_driver_madwifi_get_scan_results, 595526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt .deauthenticate = wpa_driver_madwifi_deauthenticate, 596526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt .disassociate = wpa_driver_madwifi_disassociate, 597526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt .associate = wpa_driver_madwifi_associate, 598526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt .set_auth_alg = wpa_driver_madwifi_set_auth_alg, 599526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt .set_operstate = wpa_driver_madwifi_set_operstate, 600526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt .set_probe_req_ie = wpa_driver_madwifi_set_probe_req_ie, 601526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}; 602