static void wpa_driver_madwifi_deinit(void *priv) { struct wpa_driver_madwifi_data *drv = priv; if (wpa_driver_madwifi_set_wpa_ie(drv, NULL, 0) < 0) { wpa_printf(MSG_DEBUG, "%s: failed to clear WPA IE", __FUNCTION__); } if (set80211param(drv, IEEE80211_PARAM_ROAMING, 0, 1) < 0) { wpa_printf(MSG_DEBUG, "%s: failed to enable driver-based " "roaming", __FUNCTION__); } if (set80211param(drv, IEEE80211_PARAM_PRIVACY, 0, 1) < 0) { wpa_printf(MSG_DEBUG, "%s: failed to disable forced Privacy " "flag", __FUNCTION__); } if (set80211param(drv, IEEE80211_PARAM_WPA, 0, 1) < 0) { wpa_printf(MSG_DEBUG, "%s: failed to disable WPA", __FUNCTION__); } wpa_driver_wext_deinit(drv->wext); close(drv->sock); os_free(drv); }
static int wpa_driver_madwifi_associate(void *priv, struct wpa_driver_associate_params *params) { struct wpa_driver_madwifi_data *drv = priv; struct ieee80211req_mlme mlme; int ret = 0, privacy = 1; wpa_printf(MSG_DEBUG, "%s", __FUNCTION__); /* * NB: Don't need to set the freq or cipher-related state as * this is implied by the bssid which is used to locate * the scanned node state which holds it. The ssid is * needed to disambiguate an AP that broadcasts multiple * ssid's but uses the same bssid. */ /* XXX error handling is wrong but unclear what to do... */ if (wpa_driver_madwifi_set_wpa_ie(drv, params->wpa_ie, params->wpa_ie_len) < 0) ret = -1; if (params->pairwise_suite == CIPHER_NONE && params->group_suite == CIPHER_NONE && params->key_mgmt_suite == KEY_MGMT_NONE && params->wpa_ie_len == 0) privacy = 0; if (set80211param(drv, IEEE80211_PARAM_PRIVACY, privacy, 1) < 0) ret = -1; if (params->bssid == NULL) { /* ap_scan=2 mode - driver takes care of AP selection and * roaming */ /* FIX: this does not seem to work; would probably need to * change something in the driver */ if (set80211param(drv, IEEE80211_PARAM_ROAMING, 0, 1) < 0) ret = -1; } if (wpa_driver_wext_set_ssid(drv->wext, params->ssid, params->ssid_len) < 0) ret = -1; if (params->bssid) { if (set80211param(drv, IEEE80211_PARAM_ROAMING, 2, 1) < 0) ret = -1; memset(&mlme, 0, sizeof(mlme)); mlme.im_op = IEEE80211_MLME_ASSOC; memcpy(mlme.im_macaddr, params->bssid, IEEE80211_ADDR_LEN); if (set80211priv(drv, IEEE80211_IOCTL_SETMLME, &mlme, sizeof(mlme), 1) < 0) ret = -1; } return ret; }
static int wpa_driver_madwifi_set_wpa(void *priv, int enabled) { struct wpa_driver_madwifi_data *drv = priv; int ret = 0; wpa_printf(MSG_DEBUG, "%s: enabled=%d", __FUNCTION__, enabled); if (!enabled && wpa_driver_madwifi_set_wpa_ie(drv, NULL, 0) < 0) ret = -1; if (set80211param(drv, IEEE80211_PARAM_ROAMING, enabled ? 2 : 0, 1) < 0) ret = -1; if (set80211param(drv, IEEE80211_PARAM_PRIVACY, enabled, 1) < 0) ret = -1; if (set80211param(drv, IEEE80211_PARAM_WPA, enabled ? 3 : 0, 1) < 0) ret = -1; return ret; }