int set_tx, const u8 *seq, size_t seq_len,
const u8 *key, size_t key_len)
{
- if (hapd->driver == NULL || hapd->driver->hapd_set_key == NULL)
+ if (hapd->driver == NULL || hapd->driver->set_key == NULL)
return 0;
- return hapd->driver->hapd_set_key(ifname, hapd->drv_priv, alg, addr,
- key_idx, set_tx, seq, seq_len, key,
- key_len);
+ return hapd->driver->set_key(ifname, hapd->drv_priv, alg, addr,
+ key_idx, set_tx, seq, seq_len, key,
+ key_len);
}
static inline int
#ifndef DRIVER_H
#define DRIVER_H
-#define WPA_SUPPLICANT_DRIVER_VERSION 3
+#define WPA_SUPPLICANT_DRIVER_VERSION 4
#include "defs.h"
/**
* set_key - Configure encryption key
+ * @ifname: Interface name (for multi-SSID/VLAN support)
* @priv: private driver interface data
* @alg: encryption algorithm (%WPA_ALG_NONE, %WPA_ALG_WEP,
* %WPA_ALG_TKIP, %WPA_ALG_CCMP, %WPA_ALG_IGTK, %WPA_ALG_PMK);
* in driver_*.c set_key() implementation, see driver_ndis.c for an
* example on how this can be done.
*/
- int (*set_key)(void *priv, wpa_alg alg, const u8 *addr,
- int key_idx, int set_tx, const u8 *seq, size_t seq_len,
+ int (*set_key)(const char *ifname, void *priv, 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);
/**
*/
int (*set_privacy)(const char *ifname, void *priv, int enabled);
- int (*hapd_set_key)(const char *ifname, void *priv, 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);
int (*get_seqnum)(const char *ifname, void *priv, const u8 *addr,
int idx, u8 *seq);
int (*get_seqnum_igtk)(const char *ifname, void *priv, const u8 *addr,
.deinit = madwifi_deinit,
.set_ieee8021x = madwifi_set_ieee8021x,
.set_privacy = madwifi_set_privacy,
- .hapd_set_key = madwifi_set_key,
+ .set_key = madwifi_set_key,
.get_seqnum = madwifi_get_seqnum,
.flush = madwifi_flush,
.set_generic_elem = madwifi_set_opt_ie,
}
-static int wpa_driver_atmel_set_key(void *priv, wpa_alg alg,
- const u8 *addr, int key_idx,
+static int wpa_driver_atmel_set_key(const char *ifname, void *priv,
+ 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)
{
return 0;
}
-static int wpa_driver_broadcom_set_key(void *priv, wpa_alg alg,
+static int wpa_driver_broadcom_set_key(const char *ifname, void *priv,
+ 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)
.hapd_deinit = bsd_deinit,
.set_ieee8021x = bsd_set_ieee8021x,
.set_privacy = bsd_set_privacy,
- .hapd_set_key = bsd_set_key,
+ .set_key = bsd_set_key,
.get_seqnum = bsd_get_seqnum,
.flush = bsd_flush,
.set_generic_elem = bsd_set_opt_ie,
}
static int
-wpa_driver_bsd_set_key(void *priv, wpa_alg alg,
+wpa_driver_bsd_set_key(const char *ifname, void *priv, wpa_alg alg,
const unsigned char *addr, int key_idx, int set_tx,
const u8 *seq, size_t seq_len,
const u8 *key, size_t key_len)
}
-static int hostap_set_key(const char *ifname, void *priv, 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)
+static int wpa_driver_hostap_set_key(const char *ifname, void *priv,
+ 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 hostap_driver_data *drv = priv;
struct prism2_hostapd_param *param;
}
-static int wpa_driver_hostap_set_key(void *priv, wpa_alg alg,
- const u8 *addr, int key_idx,
+static int wpa_driver_hostap_set_key(const char *ifname, void *priv,
+ 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)
{
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,
#ifdef HOSTAPD
.hapd_init = hostap_init,
.hapd_deinit = hostap_driver_deinit,
.set_ieee8021x = hostap_set_ieee8021x,
.set_privacy = hostap_set_privacy,
- .hapd_set_key = hostap_set_key,
.get_seqnum = hostap_get_seqnum,
.flush = hostap_flush,
.set_generic_elem = hostap_set_generic_elem,
.get_bssid = wpa_driver_hostap_get_bssid,
.get_ssid = wpa_driver_hostap_get_ssid,
.set_wpa = wpa_driver_hostap_set_wpa,
- .set_key = wpa_driver_hostap_set_key,
.set_countermeasures = wpa_driver_hostap_set_countermeasures,
.set_drop_unencrypted = wpa_driver_hostap_set_drop_unencrypted,
.scan = wpa_driver_hostap_scan,
}
-static int wpa_driver_ipw_set_key(void *priv, 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)
+static int wpa_driver_ipw_set_key(const char *ifname, void *priv, 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;
}
static int
-madwifi_set_key(const char *ifname, void *priv, 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)
+wpa_driver_madwifi_set_key(const char *ifname, void *priv, 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 madwifi_driver_data *drv = priv;
struct ieee80211req_key wk;
}
static int
-wpa_driver_madwifi_set_key(void *priv, wpa_alg alg,
+wpa_driver_madwifi_set_key(const char *ifname, void *priv, 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)
* configuration with IEEE80211_IOCTL_SETKEY, so use
* Linux wireless extensions ioctl for this.
*/
- return wpa_driver_wext_set_key(drv->wext, alg, addr,
- key_idx, set_tx,
+ return wpa_driver_wext_set_key(ifname, drv->wext, alg,
+ addr, key_idx, set_tx,
seq, seq_len,
key, key_len);
}
const struct wpa_driver_ops wpa_driver_madwifi_ops = {
.name = "madwifi",
.desc = "MADWIFI 802.11 support (Atheros, etc.)",
+ .set_key = wpa_driver_madwifi_set_key,
#ifdef HOSTAPD
.hapd_init = madwifi_init,
.hapd_deinit = madwifi_deinit,
.set_ieee8021x = madwifi_set_ieee8021x,
.set_privacy = madwifi_set_privacy,
- .hapd_set_key = madwifi_set_key,
.get_seqnum = madwifi_get_seqnum,
.flush = madwifi_flush,
.set_generic_elem = madwifi_set_opt_ie,
#else /* HOSTAPD */
.get_bssid = wpa_driver_madwifi_get_bssid,
.get_ssid = wpa_driver_madwifi_get_ssid,
- .set_key = wpa_driver_madwifi_set_key,
.init = wpa_driver_madwifi_init,
.deinit = wpa_driver_madwifi_deinit,
.set_countermeasures = wpa_driver_madwifi_set_countermeasures,
}
-static int wpa_driver_ndis_set_key(void *priv, wpa_alg alg, const u8 *addr,
- int key_idx, int set_tx,
+static int wpa_driver_ndis_set_key(const char *ifname, void *priv, 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)
{
continue;
wpa_printf(MSG_DEBUG, "NDIS: Re-setting static WEP "
"key %d", i);
- wpa_driver_ndis_set_key(drv, WPA_ALG_WEP, bcast, i,
+ wpa_driver_ndis_set_key(drv->ifname, drv, WPA_ALG_WEP,
+ bcast, i,
i == params->wep_tx_keyidx,
NULL, 0, params->wep_key[i],
params->wep_key_len[i]);
NULL /* hapd_deinit */,
NULL /* set_ieee8021x */,
NULL /* set_privacy */,
- NULL /* hapd_set_key */,
NULL /* get_seqnum */,
NULL /* get_seqnum_igtk */,
NULL /* flush */,
return ret;
}
-static int wpa_ndiswrapper_set_key(void *priv, wpa_alg alg, const u8 *addr,
- int key_idx, int set_tx,
+static int wpa_ndiswrapper_set_key(const char *ifname, void *priv, 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)
{
* 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(drv->wext, alg, addr, key_idx, set_tx,
- seq, seq_len, key, key_len);
+ wpa_driver_wext_set_key(ifname, drv->wext, alg, addr, key_idx,
+ set_tx, seq, seq_len, key, key_len);
}
return ret;
}
-static int nl_set_encr(int ifindex, struct wpa_driver_nl80211_data *drv,
- 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)
+static int wpa_driver_nl80211_set_key(const char *ifname, void *priv,
+ 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_nl80211_data *drv = priv;
+ int ifindex = if_nametoindex(ifname);
struct nl_msg *msg;
int ret;
}
-static int wpa_driver_nl80211_set_key(void *priv, 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_nl80211_data *drv = priv;
- return nl_set_encr(drv->ifindex, drv, alg, addr, key_idx, set_tx, seq,
- seq_len, key, key_len);
-}
-
-
static int wpa_driver_nl80211_mlme(struct wpa_driver_nl80211_data *drv,
const u8 *addr, int cmd, u16 reason_code)
{
for (i = 0; i < 4; i++) {
if (!params->wep_key[i])
continue;
- wpa_driver_nl80211_set_key(drv, WPA_ALG_WEP, NULL, i,
+ wpa_driver_nl80211_set_key(drv->ifname, drv, WPA_ALG_WEP, NULL,
+ i,
i == params->wep_tx_keyidx, NULL, 0,
params->wep_key[i],
params->wep_key_len[i]);
}
-static int i802_set_key(const char *iface, void *priv, 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_nl80211_data *drv = priv;
- return nl_set_encr(if_nametoindex(iface), drv, alg, addr, key_idx,
- set_tx, seq, seq_len, key, key_len);
-}
-
-
static inline int min_int(int a, int b)
{
if (a < b)
#ifdef HOSTAPD
.hapd_init = i802_init,
.hapd_deinit = i802_deinit,
- .hapd_set_key = i802_set_key,
.get_seqnum = i802_get_seqnum,
.flush = i802_flush,
.read_sta_data = i802_read_sta_data,
}
-static int prism54_set_key(const char *ifname, void *priv, 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)
+static int wpa_driver_prism54_set_key(const char *ifname, void *priv,
+ 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 prism54_driver_data *drv = priv;
pimdev_hdr *hdr;
}
-static int wpa_driver_prism54_set_key(void *priv, wpa_alg alg,
+static int wpa_driver_prism54_set_key(const char *ifname, void *priv,
+ 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)
const struct wpa_driver_ops wpa_driver_prism54_ops = {
.name = "prism54",
.desc = "Prism54.org driver (Intersil Prism GT/Duette/Indigo)",
+ .set_key = wpa_driver_prism54_set_key,
#ifdef HOSTAPD
.hapd_init = prism54_driver_init,
.hapd_deinit = prism54_driver_deinit,
/* .set_ieee8021x = prism54_init_1x, */
.set_privacy = prism54_set_privacy_invoked,
- .hapd_set_key = prism54_set_key,
.get_seqnum = prism54_get_seqnum,
.flush = prism54_flush,
.set_generic_elem = prism54_set_generic_elem,
.get_bssid = wpa_driver_prism54_get_bssid,
.get_ssid = wpa_driver_prism54_get_ssid,
.set_wpa = wpa_driver_prism54_set_wpa,
- .set_key = wpa_driver_prism54_set_key,
.set_countermeasures = wpa_driver_prism54_set_countermeasures,
.set_drop_unencrypted = wpa_driver_prism54_set_drop_unencrypted,
.scan = wpa_driver_prism54_scan,
}
-static int wpa_driver_privsep_set_key(void *priv, 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)
+static int wpa_driver_privsep_set_key(const char *ifname, void *priv,
+ 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_privsep_data *drv = priv;
struct privsep_cmd_set_key cmd;
return res;
}
-static int wpa_driver_ralink_set_key(void *priv, wpa_alg alg, const u8 *addr,
+static int wpa_driver_ralink_set_key(const char *ifname, void *priv,
+ 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)
}
-static int test_driver_set_key(const char *iface, void *priv, 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)
-{
- wpa_printf(MSG_DEBUG, "%s(iface=%s alg=%d idx=%d set_tx=%d)",
- __func__, iface, alg, key_idx, set_tx);
- if (addr)
- wpa_printf(MSG_DEBUG, " addr=" MACSTR, MAC2STR(addr));
- if (key)
- wpa_hexdump_key(MSG_DEBUG, " key", key, key_len);
- return 0;
-}
-
-
static int test_driver_set_sta_vlan(void *priv, const u8 *addr,
const char *ifname, int vlan_id)
{
}
-static int wpa_driver_test_set_key(void *priv, wpa_alg alg, const u8 *addr,
- int key_idx, int set_tx,
+static int wpa_driver_test_set_key(const char *ifname, void *priv, 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)
{
- wpa_printf(MSG_DEBUG, "%s: priv=%p alg=%d key_idx=%d set_tx=%d",
- __func__, priv, alg, key_idx, set_tx);
- if (addr) {
+ wpa_printf(MSG_DEBUG, "%s: ifname=%s priv=%p alg=%d key_idx=%d "
+ "set_tx=%d",
+ __func__, ifname, priv, alg, key_idx, set_tx);
+ if (addr)
wpa_printf(MSG_DEBUG, " addr=" MACSTR, MAC2STR(addr));
- }
- if (seq) {
+ if (seq)
wpa_hexdump(MSG_DEBUG, " seq", seq, seq_len);
- }
- if (key) {
- wpa_hexdump(MSG_DEBUG, " key", key, key_len);
- }
+ if (key)
+ wpa_hexdump_key(MSG_DEBUG, " key", key, key_len);
return 0;
}
.valid_bss_mask = test_driver_valid_bss_mask,
.hapd_set_ssid = test_driver_set_ssid,
.set_privacy = test_driver_set_privacy,
- .hapd_set_key = test_driver_set_key,
.set_sta_vlan = test_driver_set_sta_vlan,
.sta_add = test_driver_sta_add,
.send_ether = test_driver_send_ether,
* This function uses SIOCSIWENCODEEXT by default, but tries to use
* SIOCSIWENCODE if the extended ioctl fails when configuring a WEP key.
*/
-int wpa_driver_wext_set_key(void *priv, wpa_alg alg,
+int wpa_driver_wext_set_key(const char *ifname, void *priv, 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)
int wpa_driver_wext_set_ssid(void *priv, const u8 *ssid, size_t ssid_len);
int wpa_driver_wext_set_freq(void *priv, int freq);
int wpa_driver_wext_set_mode(void *priv, int mode);
-int wpa_driver_wext_set_key(void *priv, wpa_alg alg,
+int wpa_driver_wext_set_key(const char *ifname, void *priv, 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);
{
if (wpa_s->driver->set_key) {
wpa_s->keys_cleared = 0;
- return wpa_s->driver->set_key(wpa_s->drv_priv, alg, addr,
- key_idx, set_tx, seq, seq_len,
- key, key_len);
+ return wpa_s->driver->set_key(wpa_s->ifname, wpa_s->drv_priv,
+ alg, addr, key_idx, set_tx,
+ seq, seq_len, key, key_len);
}
return -1;
}