📄 driver_madwifi.c
字号:
return set80211priv(drv, IEEE80211_IOCTL_SETKEY, &wk, sizeof(wk), 1);}static intwpa_driver_madwifi_set_countermeasures(void *priv, int enabled){ struct wpa_driver_madwifi_data *drv = priv; wpa_printf(MSG_DEBUG, "%s: enabled=%d", __FUNCTION__, enabled); return set80211param(drv, IEEE80211_PARAM_COUNTERMEASURES, enabled, 1);}static intwpa_driver_madwifi_set_drop_unencrypted(void *priv, int enabled){ struct wpa_driver_madwifi_data *drv = priv; wpa_printf(MSG_DEBUG, "%s: enabled=%d", __FUNCTION__, enabled); return set80211param(drv, IEEE80211_PARAM_DROPUNENCRYPTED, enabled, 1);}static intwpa_driver_madwifi_deauthenticate(void *priv, const u8 *addr, int reason_code){ struct wpa_driver_madwifi_data *drv = priv; struct ieee80211req_mlme mlme; wpa_printf(MSG_DEBUG, "%s", __FUNCTION__); mlme.im_op = IEEE80211_MLME_DEAUTH; mlme.im_reason = reason_code; os_memcpy(mlme.im_macaddr, addr, IEEE80211_ADDR_LEN); return set80211priv(drv, IEEE80211_IOCTL_SETMLME, &mlme, sizeof(mlme), 1);}static intwpa_driver_madwifi_disassociate(void *priv, const u8 *addr, int reason_code){ struct wpa_driver_madwifi_data *drv = priv; struct ieee80211req_mlme mlme; wpa_printf(MSG_DEBUG, "%s", __FUNCTION__); mlme.im_op = IEEE80211_MLME_DISASSOC; mlme.im_reason = reason_code; os_memcpy(mlme.im_macaddr, addr, IEEE80211_ADDR_LEN); return set80211priv(drv, IEEE80211_IOCTL_SETMLME, &mlme, sizeof(mlme), 1);}static intwpa_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->wpa_ie_len && set80211param(drv, IEEE80211_PARAM_WPA, params->wpa_ie[0] == WLAN_EID_RSN ? 2 : 1, 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; } else { if (set80211param(drv, IEEE80211_PARAM_ROAMING, 2, 1) < 0) ret = -1; if (wpa_driver_wext_set_ssid(drv->wext, params->ssid, params->ssid_len) < 0) ret = -1; os_memset(&mlme, 0, sizeof(mlme)); mlme.im_op = IEEE80211_MLME_ASSOC; os_memcpy(mlme.im_macaddr, params->bssid, IEEE80211_ADDR_LEN); if (set80211priv(drv, IEEE80211_IOCTL_SETMLME, &mlme, sizeof(mlme), 1) < 0) { wpa_printf(MSG_DEBUG, "%s: SETMLME[ASSOC] failed", __func__); ret = -1; } } return ret;}static intwpa_driver_madwifi_set_auth_alg(void *priv, int auth_alg){ struct wpa_driver_madwifi_data *drv = priv; int authmode; if ((auth_alg & AUTH_ALG_OPEN_SYSTEM) && (auth_alg & AUTH_ALG_SHARED_KEY)) authmode = IEEE80211_AUTH_AUTO; else if (auth_alg & AUTH_ALG_SHARED_KEY) authmode = IEEE80211_AUTH_SHARED; else authmode = IEEE80211_AUTH_OPEN; return set80211param(drv, IEEE80211_PARAM_AUTHMODE, authmode, 1);}static intwpa_driver_madwifi_scan(void *priv, const u8 *ssid, size_t ssid_len){ struct wpa_driver_madwifi_data *drv = priv; struct iwreq iwr; int ret = 0; os_memset(&iwr, 0, sizeof(iwr)); os_strlcpy(iwr.ifr_name, drv->ifname, IFNAMSIZ); /* set desired ssid before scan */ /* FIX: scan should not break the current association, so using * set_ssid may not be the best way of doing this.. */ if (wpa_driver_wext_set_ssid(drv->wext, ssid, ssid_len) < 0) ret = -1; if (ioctl(drv->sock, SIOCSIWSCAN, &iwr) < 0) { perror("ioctl[SIOCSIWSCAN]"); ret = -1; } /* * madwifi delivers a scan complete event so no need to poll, but * register a backup timeout anyway to make sure that we recover even * if the driver does not send this event for any reason. This timeout * will only be used if the event is not delivered (event handler will * cancel the timeout). */ eloop_cancel_timeout(wpa_driver_wext_scan_timeout, drv->wext, drv->ctx); eloop_register_timeout(30, 0, wpa_driver_wext_scan_timeout, drv->wext, drv->ctx); return ret;}static int wpa_driver_madwifi_get_bssid(void *priv, u8 *bssid){ struct wpa_driver_madwifi_data *drv = priv; return wpa_driver_wext_get_bssid(drv->wext, bssid);}static int wpa_driver_madwifi_get_ssid(void *priv, u8 *ssid){ struct wpa_driver_madwifi_data *drv = priv; return wpa_driver_wext_get_ssid(drv->wext, ssid);}static struct wpa_scan_results *wpa_driver_madwifi_get_scan_results(void *priv){ struct wpa_driver_madwifi_data *drv = priv; return wpa_driver_wext_get_scan_results(drv->wext);}static int wpa_driver_madwifi_set_operstate(void *priv, int state){ struct wpa_driver_madwifi_data *drv = priv; return wpa_driver_wext_set_operstate(drv->wext, state);}static void * wpa_driver_madwifi_init(void *ctx, const char *ifname){ struct wpa_driver_madwifi_data *drv; drv = os_zalloc(sizeof(*drv)); if (drv == NULL) return NULL; drv->wext = wpa_driver_wext_init(ctx, ifname); if (drv->wext == NULL) goto fail; drv->ctx = ctx; os_strlcpy(drv->ifname, ifname, sizeof(drv->ifname)); drv->sock = socket(PF_INET, SOCK_DGRAM, 0); if (drv->sock < 0) goto fail2; if (set80211param(drv, IEEE80211_PARAM_ROAMING, 2, 1) < 0) { wpa_printf(MSG_DEBUG, "%s: failed to set wpa_supplicant-based " "roaming", __FUNCTION__); goto fail3; } if (set80211param(drv, IEEE80211_PARAM_WPA, 3, 1) < 0) { wpa_printf(MSG_DEBUG, "%s: failed to enable WPA support", __FUNCTION__); goto fail3; } return drv;fail3: close(drv->sock);fail2: wpa_driver_wext_deinit(drv->wext);fail: os_free(drv); return NULL;}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);}const struct wpa_driver_ops wpa_driver_madwifi_ops = { .name = "madwifi", .desc = "MADWIFI 802.11 support (Atheros, etc.)", .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, .set_drop_unencrypted = wpa_driver_madwifi_set_drop_unencrypted, .scan = wpa_driver_madwifi_scan, .get_scan_results2 = wpa_driver_madwifi_get_scan_results, .deauthenticate = wpa_driver_madwifi_deauthenticate, .disassociate = wpa_driver_madwifi_disassociate, .associate = wpa_driver_madwifi_associate, .set_auth_alg = wpa_driver_madwifi_set_auth_alg, .set_operstate = wpa_driver_madwifi_set_operstate,};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -