?? driver_ralink.c
字號:
ralink_set_iface_flags(drv, 0); } eloop_cancel_timeout(wpa_driver_ralink_scan_timeout, drv, drv->ctx); eloop_unregister_read_sock(drv->event_sock); close(drv->event_sock); close(drv->ioctl_sock); os_free(drv);}static void wpa_driver_ralink_scan_timeout(void *eloop_ctx, void *timeout_ctx){ struct wpa_driver_ralink_data *drv = eloop_ctx; wpa_printf(MSG_DEBUG, "%s", __FUNCTION__); wpa_printf(MSG_DEBUG, "Scan timeout - try to get results"); wpa_supplicant_event(timeout_ctx, EVENT_SCAN_RESULTS, NULL); drv->scanning_done = 1;}static int wpa_driver_ralink_scan(void *priv, const u8 *ssid, size_t ssid_len){ struct wpa_driver_ralink_data *drv = priv; struct iwreq iwr; int ret = 0; if (drv->g_driver_down == 1) return -1; wpa_printf(MSG_DEBUG, "%s", __FUNCTION__); if (ssid_len > IW_ESSID_MAX_SIZE) { wpa_printf(MSG_DEBUG, "%s: too long SSID (%lu)", __FUNCTION__, (unsigned long) ssid_len); return -1; } /* wpa_driver_ralink_set_ssid(drv, ssid, ssid_len); */ os_memset(&iwr, 0, sizeof(iwr)); os_strlcpy(iwr.ifr_name, drv->ifname, IFNAMSIZ); if (ioctl(drv->ioctl_sock, SIOCSIWSCAN, &iwr) < 0) { perror("ioctl[SIOCSIWSCAN]"); ret = -1; } /* Not all drivers generate "scan completed" wireless event, so try to * read results after a timeout. */ eloop_cancel_timeout(wpa_driver_ralink_scan_timeout, drv, drv->ctx); eloop_register_timeout(4, 0, wpa_driver_ralink_scan_timeout, drv, drv->ctx); drv->scanning_done = 0; return ret;}static intwpa_driver_ralink_get_scan_results(void *priv, struct wpa_scan_result *results, size_t max_size){ struct wpa_driver_ralink_data *drv = priv; UCHAR *buf = NULL; NDIS_802_11_BSSID_LIST_EX *wsr; NDIS_WLAN_BSSID_EX *wbi; struct iwreq iwr; int rv = 0; size_t ap_num; u8 *pos, *end; if (drv->g_driver_down == 1) return -1; wpa_printf(MSG_DEBUG, "%s", __FUNCTION__); if (drv->we_version_compiled >= 17) { buf = os_zalloc(8192); iwr.u.data.length = 8192; } else { buf = os_zalloc(4096); iwr.u.data.length = 4096; } if (buf == NULL) return -1; wsr = (NDIS_802_11_BSSID_LIST_EX *) buf; wsr->NumberOfItems = 0; os_strlcpy(iwr.ifr_name, drv->ifname, IFNAMSIZ); iwr.u.data.pointer = (void *) buf; iwr.u.data.flags = OID_802_11_BSSID_LIST; if ((rv = ioctl(drv->ioctl_sock, RT_PRIV_IOCTL, &iwr)) < 0) { wpa_printf(MSG_DEBUG, "ioctl fail: rv = %d", rv); os_free(buf); return -1; } os_memset(results, 0, max_size * sizeof(struct wpa_scan_result)); for (ap_num = 0, wbi = wsr->Bssid; ap_num < wsr->NumberOfItems; ++ap_num) { os_memcpy(results[ap_num].bssid, &wbi->MacAddress, ETH_ALEN); os_memcpy(results[ap_num].ssid, wbi->Ssid.Ssid, wbi->Ssid.SsidLength); results[ap_num].ssid_len = wbi->Ssid.SsidLength; results[ap_num].freq = (wbi->Configuration.DSConfig / 1000); /* get ie's */ wpa_hexdump(MSG_DEBUG, "RALINK: AP IEs", (u8 *) wbi + sizeof(*wbi) - 1, wbi->IELength); pos = (u8 *) wbi + sizeof(*wbi) - 1; end = (u8 *) wbi + sizeof(*wbi) + wbi->IELength; if (wbi->IELength < sizeof(NDIS_802_11_FIXED_IEs)) break; pos += sizeof(NDIS_802_11_FIXED_IEs) - 2; os_memcpy(&results[ap_num].caps, pos, 2); pos += 2; while (pos + 1 < end && pos + 2 + pos[1] <= end) { u8 ielen = 2 + pos[1]; if (ielen > SSID_MAX_WPA_IE_LEN) { pos += ielen; continue; } if (pos[0] == WLAN_EID_VENDOR_SPECIFIC && pos[1] >= 4 && os_memcmp(pos + 2, "\x00\x50\xf2\x01", 4) == 0) { os_memcpy(results[ap_num].wpa_ie, pos, ielen); results[ap_num].wpa_ie_len = ielen; } else if (pos[0] == WLAN_EID_RSN) { os_memcpy(results[ap_num].rsn_ie, pos, ielen); results[ap_num].rsn_ie_len = ielen; } pos += ielen; } wbi = (NDIS_WLAN_BSSID_EX *) ((u8 *) wbi + wbi->Length); } os_free(buf); return ap_num;}static int ralink_set_auth_mode(struct wpa_driver_ralink_data *drv, NDIS_802_11_AUTHENTICATION_MODE mode){ NDIS_802_11_AUTHENTICATION_MODE auth_mode = mode; wpa_printf(MSG_DEBUG, "%s", __FUNCTION__); if (ralink_set_oid(drv, OID_802_11_AUTHENTICATION_MODE, (char *) &auth_mode, sizeof(auth_mode)) < 0) { wpa_printf(MSG_DEBUG, "RALINK: Failed to set " "OID_802_11_AUTHENTICATION_MODE (%d)", (int) auth_mode); return -1; } return 0;}static int wpa_driver_ralink_remove_key(struct wpa_driver_ralink_data *drv, int key_idx, const u8 *addr, const u8 *bssid, int pairwise){ NDIS_802_11_REMOVE_KEY rkey; NDIS_802_11_KEY_INDEX _index; int res, res2; wpa_printf(MSG_DEBUG, "%s", __FUNCTION__); os_memset(&rkey, 0, sizeof(rkey)); rkey.Length = sizeof(rkey); rkey.KeyIndex = key_idx; if (pairwise) rkey.KeyIndex |= 1 << 30; os_memcpy(rkey.BSSID, bssid, ETH_ALEN); res = ralink_set_oid(drv, OID_802_11_REMOVE_KEY, (char *) &rkey, sizeof(rkey)); /* AlbertY@20060210 removed it */ if (0 /* !pairwise */) { res2 = ralink_set_oid(drv, OID_802_11_REMOVE_WEP, (char *) &_index, sizeof(_index)); } else res2 = 0; if (res < 0 && res2 < 0) return res; return 0;}static int wpa_driver_ralink_add_wep(struct wpa_driver_ralink_data *drv, int pairwise, int key_idx, int set_tx, const u8 *key, size_t key_len){ NDIS_802_11_WEP *wep; size_t len; int res; wpa_printf(MSG_DEBUG, "%s", __FUNCTION__); len = 12 + key_len; wep = os_zalloc(len); if (wep == NULL) return -1; wep->Length = len; wep->KeyIndex = key_idx; if (set_tx) wep->KeyIndex |= 0x80000000; wep->KeyLength = key_len; os_memcpy(wep->KeyMaterial, key, key_len); wpa_hexdump_key(MSG_MSGDUMP, "RALINK: OID_802_11_ADD_WEP", (const u8 *) wep, len); res = ralink_set_oid(drv, OID_802_11_ADD_WEP, (char *) wep, len); os_free(wep); return res;}static int wpa_driver_ralink_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_ralink_data *drv = priv; size_t len, i; NDIS_802_11_KEY *nkey; int res, pairwise; u8 bssid[ETH_ALEN]; if (drv->g_driver_down == 1) return -1; wpa_printf(MSG_DEBUG, "%s", __FUNCTION__); if (addr == NULL || os_memcmp(addr, "\xff\xff\xff\xff\xff\xff", ETH_ALEN) == 0) { /* Group Key */ pairwise = 0; wpa_driver_ralink_get_bssid(drv, bssid); } else { /* Pairwise Key */ pairwise = 1; os_memcpy(bssid, addr, ETH_ALEN); } if (alg == WPA_ALG_NONE || key_len == 0) { return wpa_driver_ralink_remove_key(drv, key_idx, addr, bssid, pairwise); } if (alg == WPA_ALG_WEP) { return wpa_driver_ralink_add_wep(drv, pairwise, key_idx, set_tx, key, key_len); } len = 12 + 6 + 6 + 8 + key_len; nkey = os_zalloc(len); if (nkey == NULL) return -1; nkey->Length = len; nkey->KeyIndex = key_idx; if (set_tx) nkey->KeyIndex |= 1 << 31; if (pairwise) nkey->KeyIndex |= 1 << 30; if (seq && seq_len) nkey->KeyIndex |= 1 << 29; nkey->KeyLength = key_len; os_memcpy(nkey->BSSID, bssid, ETH_ALEN); if (seq && seq_len) { for (i = 0; i < seq_len; i++) nkey->KeyRSC |= seq[i] << (i * 8); } if (alg == WPA_ALG_TKIP && key_len == 32) { os_memcpy(nkey->KeyMaterial, key, 16); os_memcpy(nkey->KeyMaterial + 16, key + 24, 8); os_memcpy(nkey->KeyMaterial + 24, key + 16, 8); } else { os_memcpy(nkey->KeyMaterial, key, key_len); } wpa_printf(MSG_DEBUG, "%s: alg=%d key_idx=%d set_tx=%d seq_len=%lu " "key_len=%lu", __FUNCTION__, alg, key_idx, set_tx, (unsigned long) seq_len, (unsigned long) key_len); wpa_hexdump_key(MSG_MSGDUMP, "RALINK: OID_802_11_ADD_KEY", (const u8 *) nkey, len); res = ralink_set_oid(drv, OID_802_11_ADD_KEY, (char *) nkey, len); os_free(nkey); return res;}static int wpa_driver_ralink_disassociate(void *priv, const u8 *addr, int reason_code){ struct wpa_driver_ralink_data *drv = priv; if (drv->g_driver_down == 1) return -1; wpa_printf(MSG_DEBUG, "%s", __FUNCTION__); if (ralink_set_oid(drv, OID_802_11_DISASSOCIATE, " ", 4) < 0) { wpa_printf(MSG_DEBUG, "RALINK: Failed to set " "OID_802_11_DISASSOCIATE"); } return 0;}static int wpa_driver_ralink_deauthenticate(void *priv, const u8 *addr, int reason_code){ struct wpa_driver_ralink_data *drv = priv; wpa_printf(MSG_DEBUG, "g_driver_down = %d", drv->g_driver_down); if (drv->g_driver_down == 1) return -1; wpa_printf(MSG_DEBUG, "%s", __FUNCTION__); if (ralink_get_new_driver_flag(drv) == 0) { return wpa_driver_ralink_disassociate(priv, addr, reason_code); } else { MLME_DEAUTH_REQ_STRUCT mlme; os_memset(&mlme, 0, sizeof(MLME_DEAUTH_REQ_STRUCT)); mlme.Reason = reason_code; os_memcpy(mlme.Addr, addr, MAC_ADDR_LEN); return ralink_set_oid(drv, OID_802_11_DEAUTHENTICATION, (char *) &mlme, sizeof(MLME_DEAUTH_REQ_STRUCT)); }}static intwpa_driver_ralink_associate(void *priv, struct wpa_driver_associate_params *params){ struct wpa_driver_ralink_data *drv = priv; NDIS_802_11_NETWORK_INFRASTRUCTURE mode; NDIS_802_11_AUTHENTICATION_MODE auth_mode; NDIS_802_11_WEP_STATUS encr; BOOLEAN ieee8021xMode; if (drv->g_driver_down == 1) return -1; wpa_printf(MSG_DEBUG, "%s", __FUNCTION__); if (params->mode == IEEE80211_MODE_IBSS) mode = Ndis802_11IBSS; else mode = Ndis802_11Infrastructure; if (ralink_set_oid(drv, OID_802_11_INFRASTRUCTURE_MODE, (char *) &mode, sizeof(mode)) < 0) { wpa_printf(MSG_DEBUG, "RALINK: Failed to set " "OID_802_11_INFRASTRUCTURE_MODE (%d)", (int) mode); /* Try to continue anyway */ } if (params->wpa_ie == NULL || params->wpa_ie_len == 0) { if (params->auth_alg & AUTH_ALG_SHARED_KEY) { if (params->auth_alg & AUTH_ALG_OPEN_SYSTEM) auth_mode = Ndis802_11AuthModeAutoSwitch; else auth_mode = Ndis802_11AuthModeShared; } else auth_mode = Ndis802_11AuthModeOpen; } else if (params->wpa_ie[0] == WLAN_EID_RSN) { if (params->key_mgmt_suite == KEY_MGMT_PSK) auth_mode = Ndis802_11AuthModeWPA2PSK; else auth_mode = Ndis802_11AuthModeWPA2; } else { if (params->key_mgmt_suite == KEY_MGMT_WPA_NONE) auth_mode = Ndis802_11AuthModeWPANone; else if (params->key_mgmt_suite == KEY_MGMT_PSK) auth_mode = Ndis802_11AuthModeWPAPSK; else auth_mode = Ndis802_11AuthModeWPA; } switch (params->pairwise_suite) { case CIPHER_CCMP: encr = Ndis802_11Encryption3Enabled; break; case CIPHER_TKIP: encr = Ndis802_11Encryption2Enabled; break; case CIPHER_WEP40: case CIPHER_WEP104: encr = Ndis802_11Encryption1Enabled; break; case CIPHER_NONE: if (params->group_suite == CIPHER_CCMP) encr = Ndis802_11Encryption3Enabled; else if (params->group_suite == CIPHER_TKIP) encr = Ndis802_11Encryption2Enabled; else encr = Ndis802_11EncryptionDisabled; break; default: encr = Ndis802_11EncryptionDisabled; break; } ralink_set_auth_mode(drv, auth_mode); /* notify driver that IEEE8021x mode is enabled */ if (params->key_mgmt_suite == KEY_MGMT_802_1X_NO_WPA) ieee8021xMode = TRUE; else ieee8021xMode = FALSE; if (ralink_set_oid(drv, OID_802_11_SET_IEEE8021X, (char *) &ieee8021xMode, sizeof(BOOLEAN)) < 0) { wpa_printf(MSG_DEBUG, "RALINK: Failed to set " "OID_802_11_SET_IEEE8021X(%d)", (int) ieee8021xMode); } if (ralink_set_oid(drv, OID_802_11_WEP_STATUS, (char *) &encr, sizeof(encr)) < 0) { wpa_printf(MSG_DEBUG, "RALINK: Failed to set " "OID_802_11_WEP_STATUS(%d)", (int) encr); } if ((ieee8021xMode == FALSE) && (encr == Ndis802_11Encryption1Enabled)) { /* static WEP */ int enabled = 0; if (ralink_set_oid(drv, OID_802_11_DROP_UNENCRYPTED, (char *) &enabled, sizeof(enabled)) < 0) { wpa_printf(MSG_DEBUG, "RALINK: Failed to set " "OID_802_11_DROP_UNENCRYPTED(%d)", (int) encr); } } return wpa_driver_ralink_set_ssid(drv, params->ssid, params->ssid_len);}static intwpa_driver_ralink_set_countermeasures(void *priv, int enabled){ struct wpa_driver_ralink_data *drv = priv; if (drv->g_driver_down == 1) return -1; wpa_printf(MSG_DEBUG, "%s: enabled=%d", __FUNCTION__, enabled); return ralink_set_oid(drv, OID_SET_COUNTERMEASURES, (char *) &enabled, sizeof(int));}const struct wpa_driver_ops wpa_driver_ralink_ops = { .name = "ralink", .desc = "Ralink Wireless Client driver", .get_bssid = wpa_driver_ralink_get_bssid, .get_ssid = wpa_driver_ralink_get_ssid, .set_key = wpa_driver_ralink_set_key, .init = wpa_driver_ralink_init, .deinit = wpa_driver_ralink_deinit, .set_countermeasures = wpa_driver_ralink_set_countermeasures, .scan = wpa_driver_ralink_scan, .get_scan_results = wpa_driver_ralink_get_scan_results, .deauthenticate = wpa_driver_ralink_deauthenticate, .disassociate = wpa_driver_ralink_disassociate, .associate = wpa_driver_ralink_associate, .add_pmkid = wpa_driver_ralink_add_pmkid, .remove_pmkid = wpa_driver_ralink_remove_pmkid, .flush_pmkid = wpa_driver_ralink_flush_pmkid,};
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -