Lines Matching +full:drv +full:- +full:2
2 * WPA Supplicant - Windows/NDIS driver interface
3 * Copyright (c) 2004-2007, Jouni Malinen <j@w1.fi>
41 int wpa_driver_register_event_cb(struct wpa_driver_ndis_data *drv);
47 static void wpa_driver_ndis_poll(void *drv);
49 static int wpa_driver_ndis_adapter_init(struct wpa_driver_ndis_data *drv);
50 static int wpa_driver_ndis_adapter_open(struct wpa_driver_ndis_data *drv);
51 static void wpa_driver_ndis_adapter_close(struct wpa_driver_ndis_data *drv);
161 UCHAR Reserved[2];
262 Ndis802_11StatusType_PMKID_CandidateList = 2,
306 #define Ndis802_11StatusType_PMKID_CandidateList 2
359 dot11_BSS_type_independent = 2,
368 dot11_scan_type_passive = 2,
451 static int ndis_get_oid(struct wpa_driver_ndis_data *drv, unsigned int oid, in ndis_get_oid() argument
463 return -1; in ndis_get_oid()
464 o->Oid = oid; in ndis_get_oid()
466 o->ptcDeviceName = drv->adapter_name; in ndis_get_oid()
468 if (!DeviceIoControl(drv->ndisuio, IOCTL_NDISUIO_QUERY_OID_VALUE, in ndis_get_oid()
474 return -1; in ndis_get_oid()
476 hdrlen = sizeof(NDISUIO_QUERY_OID) - sizeof(o->Data); in ndis_get_oid()
481 return -1; in ndis_get_oid()
483 written -= hdrlen; in ndis_get_oid()
488 return -1; in ndis_get_oid()
490 os_memcpy(data, o->Data, written); in ndis_get_oid()
501 return -1; in ndis_get_oid()
503 o->Oid = oid; in ndis_get_oid()
504 o->Length = len; in ndis_get_oid()
506 if (!PacketRequest(drv->adapter, FALSE, o)) { in ndis_get_oid()
510 return -1; in ndis_get_oid()
512 if (o->Length > len) { in ndis_get_oid()
514 __func__, oid, (unsigned int) o->Length, len); in ndis_get_oid()
516 return -1; in ndis_get_oid()
518 os_memcpy(data, o->Data, o->Length); in ndis_get_oid()
519 ret = o->Length; in ndis_get_oid()
526 static int ndis_set_oid(struct wpa_driver_ndis_data *drv, unsigned int oid, in ndis_set_oid() argument
539 reallen = buflen - sizeof(o->Data); in ndis_set_oid()
542 return -1; in ndis_set_oid()
543 o->Oid = oid; in ndis_set_oid()
545 o->ptcDeviceName = drv->adapter_name; in ndis_set_oid()
548 os_memcpy(o->Data, data, len); in ndis_set_oid()
549 if (!DeviceIoControl(drv->ndisuio, IOCTL_NDISUIO_SET_OID_VALUE, in ndis_set_oid()
554 return -1; in ndis_set_oid()
568 return -1; in ndis_set_oid()
570 o->Oid = oid; in ndis_set_oid()
571 o->Length = len; in ndis_set_oid()
573 os_memcpy(o->Data, data, len); in ndis_set_oid()
575 if (!PacketRequest(drv->adapter, TRUE, o)) { in ndis_set_oid()
579 return -1; in ndis_set_oid()
587 static int ndis_set_auth_mode(struct wpa_driver_ndis_data *drv, int mode) in ndis_set_auth_mode() argument
590 if (ndis_set_oid(drv, OID_802_11_AUTHENTICATION_MODE, in ndis_set_auth_mode()
595 return -1; in ndis_set_auth_mode()
601 static int ndis_get_auth_mode(struct wpa_driver_ndis_data *drv) in ndis_get_auth_mode() argument
605 res = ndis_get_oid(drv, OID_802_11_AUTHENTICATION_MODE, in ndis_get_auth_mode()
610 return -1; in ndis_get_auth_mode()
616 static int ndis_set_encr_status(struct wpa_driver_ndis_data *drv, int encr) in ndis_set_encr_status() argument
619 if (ndis_set_oid(drv, OID_802_11_ENCRYPTION_STATUS, in ndis_set_encr_status()
623 return -1; in ndis_set_encr_status()
629 static int ndis_get_encr_status(struct wpa_driver_ndis_data *drv) in ndis_get_encr_status() argument
633 res = ndis_get_oid(drv, OID_802_11_ENCRYPTION_STATUS, in ndis_get_encr_status()
638 return -1; in ndis_get_encr_status()
646 struct wpa_driver_ndis_data *drv = priv; in wpa_driver_ndis_get_bssid() local
648 if (drv->wired) { in wpa_driver_ndis_get_bssid()
657 return ndis_get_oid(drv, OID_802_11_BSSID, (char *) bssid, ETH_ALEN) < in wpa_driver_ndis_get_bssid()
658 0 ? -1 : 0; in wpa_driver_ndis_get_bssid()
664 struct wpa_driver_ndis_data *drv = priv; in wpa_driver_ndis_get_ssid() local
668 res = ndis_get_oid(drv, OID_802_11_SSID, (char *) &buf, sizeof(buf)); in wpa_driver_ndis_get_ssid()
671 if (drv->wired) { in wpa_driver_ndis_get_ssid()
676 return -1; in wpa_driver_ndis_get_ssid()
683 static int wpa_driver_ndis_set_ssid(struct wpa_driver_ndis_data *drv, in wpa_driver_ndis_set_ssid() argument
696 drv->radio_enabled = 1; in wpa_driver_ndis_set_ssid()
697 return ndis_set_oid(drv, OID_802_11_SSID, (char *) &buf, sizeof(buf)); in wpa_driver_ndis_set_ssid()
703 static int wpa_driver_ndis_radio_off(struct wpa_driver_ndis_data *drv) in wpa_driver_ndis_radio_off() argument
705 drv->radio_enabled = 0; in wpa_driver_ndis_radio_off()
706 return ndis_set_oid(drv, OID_802_11_DISASSOCIATE, " ", 4); in wpa_driver_ndis_radio_off()
711 static int wpa_driver_ndis_disconnect(struct wpa_driver_ndis_data *drv) in wpa_driver_ndis_disconnect() argument
717 return wpa_driver_ndis_set_ssid(drv, (u8 *) ssid, SSID_MAX_LEN); in wpa_driver_ndis_disconnect()
724 struct wpa_driver_ndis_data *drv = priv; in wpa_driver_ndis_deauthenticate() local
725 return wpa_driver_ndis_disconnect(drv); in wpa_driver_ndis_deauthenticate()
731 wpa_printf(MSG_DEBUG, "Scan timeout - try to get results"); in wpa_driver_ndis_scan_timeout()
737 struct wpa_driver_ndis_data *drv, in wpa_driver_ndis_scan_native80211() argument
747 res = ndis_set_oid(drv, OID_DOT11_SCAN_REQUEST, (char *) &req, in wpa_driver_ndis_scan_native80211()
749 eloop_cancel_timeout(wpa_driver_ndis_scan_timeout, drv, drv->ctx); in wpa_driver_ndis_scan_native80211()
750 eloop_register_timeout(7, 0, wpa_driver_ndis_scan_timeout, drv, in wpa_driver_ndis_scan_native80211()
751 drv->ctx); in wpa_driver_ndis_scan_native80211()
759 struct wpa_driver_ndis_data *drv = priv; in wpa_driver_ndis_scan() local
762 if (drv->native80211) in wpa_driver_ndis_scan()
763 return wpa_driver_ndis_scan_native80211(drv, params); in wpa_driver_ndis_scan()
765 if (!drv->radio_enabled) { in wpa_driver_ndis_scan()
768 if (wpa_driver_ndis_disconnect(drv) < 0) { in wpa_driver_ndis_scan()
771 drv->radio_enabled = 1; in wpa_driver_ndis_scan()
774 res = ndis_set_oid(drv, OID_802_11_BSSID_LIST_SCAN, " ", 4); in wpa_driver_ndis_scan()
775 eloop_cancel_timeout(wpa_driver_ndis_scan_timeout, drv, drv->ctx); in wpa_driver_ndis_scan()
776 eloop_register_timeout(7, 0, wpa_driver_ndis_scan_timeout, drv, in wpa_driver_ndis_scan()
777 drv->ctx); in wpa_driver_ndis_scan()
784 return get_ie((const u8 *) (res + 1), res->ie_len, ie); in wpa_scan_get_ie()
797 if (ssid->SsidLength == 0 || ssid->SsidLength > SSID_MAX_LEN) in wpa_driver_ndis_add_scan_ssid()
800 nr = os_realloc(r, sizeof(*r) + r->ie_len + 2 + ssid->SsidLength); in wpa_driver_ndis_add_scan_ssid()
804 pos = ((u8 *) (nr + 1)) + nr->ie_len; in wpa_driver_ndis_add_scan_ssid()
806 *pos++ = ssid->SsidLength; in wpa_driver_ndis_add_scan_ssid()
807 os_memcpy(pos, ssid->Ssid, ssid->SsidLength); in wpa_driver_ndis_add_scan_ssid()
808 nr->ie_len += 2 + ssid->SsidLength; in wpa_driver_ndis_add_scan_ssid()
816 struct wpa_driver_ndis_data *drv = priv; in wpa_driver_ndis_get_scan_results() local
828 len = ndis_get_oid(drv, OID_802_11_BSSID_LIST, (char *) b, blen); in wpa_driver_ndis_get_scan_results()
834 count = b->NumberOfItems; in wpa_driver_ndis_get_scan_results()
841 results->res = os_calloc(count, sizeof(struct wpa_scan_res *)); in wpa_driver_ndis_get_scan_results()
842 if (results->res == NULL) { in wpa_driver_ndis_get_scan_results()
848 pos = (char *) &b->Bssid[0]; in wpa_driver_ndis_get_scan_results()
853 if (bss->IELength < sizeof(NDIS_802_11_FIXED_IEs)) { in wpa_driver_ndis_get_scan_results()
855 (int) bss->IELength); in wpa_driver_ndis_get_scan_results()
858 if (((char *) bss->IEs) + bss->IELength > (char *) b + blen) { in wpa_driver_ndis_get_scan_results()
867 MAC2STR(bss->MacAddress), in wpa_driver_ndis_get_scan_results()
868 (int) bss->IELength); in wpa_driver_ndis_get_scan_results()
872 r = os_zalloc(sizeof(*r) + bss->IELength - in wpa_driver_ndis_get_scan_results()
877 os_memcpy(r->bssid, bss->MacAddress, ETH_ALEN); in wpa_driver_ndis_get_scan_results()
878 r->level = (int) bss->Rssi; in wpa_driver_ndis_get_scan_results()
879 r->freq = bss->Configuration.DSConfig / 1000; in wpa_driver_ndis_get_scan_results()
880 fixed = (NDIS_802_11_FIXED_IEs *) bss->IEs; in wpa_driver_ndis_get_scan_results()
881 r->beacon_int = WPA_GET_LE16((u8 *) &fixed->BeaconInterval); in wpa_driver_ndis_get_scan_results()
882 r->caps = WPA_GET_LE16((u8 *) &fixed->Capabilities); in wpa_driver_ndis_get_scan_results()
883 r->tsf = WPA_GET_LE64(fixed->Timestamp); in wpa_driver_ndis_get_scan_results()
884 os_memcpy(r + 1, bss->IEs + sizeof(NDIS_802_11_FIXED_IEs), in wpa_driver_ndis_get_scan_results()
885 bss->IELength - sizeof(NDIS_802_11_FIXED_IEs)); in wpa_driver_ndis_get_scan_results()
886 r->ie_len = bss->IELength - sizeof(NDIS_802_11_FIXED_IEs); in wpa_driver_ndis_get_scan_results()
887 r = wpa_driver_ndis_add_scan_ssid(r, &bss->Ssid); in wpa_driver_ndis_get_scan_results()
889 results->res[results->num++] = r; in wpa_driver_ndis_get_scan_results()
891 pos += bss->Length; in wpa_driver_ndis_get_scan_results()
902 static int wpa_driver_ndis_remove_key(struct wpa_driver_ndis_data *drv, in wpa_driver_ndis_remove_key() argument
918 res = ndis_set_oid(drv, OID_802_11_REMOVE_KEY, (char *) &rkey, in wpa_driver_ndis_remove_key()
922 res2 = ndis_set_oid(drv, OID_802_11_REMOVE_WEP, in wpa_driver_ndis_remove_key()
928 return -1; in wpa_driver_ndis_remove_key()
933 static int wpa_driver_ndis_add_wep(struct wpa_driver_ndis_data *drv, in wpa_driver_ndis_add_wep() argument
944 return -1; in wpa_driver_ndis_add_wep()
945 wep->Length = len; in wpa_driver_ndis_add_wep()
946 wep->KeyIndex = key_idx; in wpa_driver_ndis_add_wep()
948 wep->KeyIndex |= 1 << 31; in wpa_driver_ndis_add_wep()
951 wep->KeyIndex |= 1 << 30; in wpa_driver_ndis_add_wep()
953 wep->KeyLength = key_len; in wpa_driver_ndis_add_wep()
954 os_memcpy(wep->KeyMaterial, key, key_len); in wpa_driver_ndis_add_wep()
958 res = ndis_set_oid(drv, OID_802_11_ADD_WEP, (char *) wep, len); in wpa_driver_ndis_add_wep()
972 struct wpa_driver_ndis_data *drv = priv; in wpa_driver_ndis_set_key() local
981 if (wpa_driver_ndis_get_bssid(drv, bssid) < 0) in wpa_driver_ndis_set_key()
990 return wpa_driver_ndis_remove_key(drv, key_idx, addr, bssid, in wpa_driver_ndis_set_key()
995 return wpa_driver_ndis_add_wep(drv, pairwise, key_idx, set_tx, in wpa_driver_ndis_set_key()
1003 return -1; in wpa_driver_ndis_set_key()
1005 nkey->Length = len; in wpa_driver_ndis_set_key()
1006 nkey->KeyIndex = key_idx; in wpa_driver_ndis_set_key()
1008 nkey->KeyIndex |= 1 << 31; in wpa_driver_ndis_set_key()
1010 nkey->KeyIndex |= 1 << 30; in wpa_driver_ndis_set_key()
1012 nkey->KeyIndex |= 1 << 29; in wpa_driver_ndis_set_key()
1013 nkey->KeyLength = key_len; in wpa_driver_ndis_set_key()
1014 os_memcpy(nkey->BSSID, bssid, ETH_ALEN); in wpa_driver_ndis_set_key()
1017 nkey->KeyRSC |= (ULONGLONG) seq[i] << (i * 8); in wpa_driver_ndis_set_key()
1020 os_memcpy(nkey->KeyMaterial, key, 16); in wpa_driver_ndis_set_key()
1021 os_memcpy(nkey->KeyMaterial + 16, key + 24, 8); in wpa_driver_ndis_set_key()
1022 os_memcpy(nkey->KeyMaterial + 24, key + 16, 8); in wpa_driver_ndis_set_key()
1024 os_memcpy(nkey->KeyMaterial, key, key_len); in wpa_driver_ndis_set_key()
1029 res = ndis_set_oid(drv, OID_802_11_ADD_KEY, (char *) nkey, len); in wpa_driver_ndis_set_key()
1040 return wpa_driver_ndis_set_key(params->ifname, priv, in wpa_driver_ndis_set_key_wrapper()
1041 params->alg, params->addr, in wpa_driver_ndis_set_key_wrapper()
1042 params->key_idx, params->set_tx, in wpa_driver_ndis_set_key_wrapper()
1043 params->seq, params->seq_len, in wpa_driver_ndis_set_key_wrapper()
1044 params->key, params->key_len); in wpa_driver_ndis_set_key_wrapper()
1052 struct wpa_driver_ndis_data *drv = priv; in wpa_driver_ndis_associate() local
1056 drv->mode = params->mode; in wpa_driver_ndis_associate()
1060 if (params->mode == IEEE80211_MODE_IBSS) { in wpa_driver_ndis_associate()
1064 eloop_cancel_timeout(wpa_driver_ndis_poll_timeout, drv, NULL); in wpa_driver_ndis_associate()
1066 drv, NULL); in wpa_driver_ndis_associate()
1069 if (ndis_set_oid(drv, OID_802_11_INFRASTRUCTURE_MODE, in wpa_driver_ndis_associate()
1077 if (params->key_mgmt_suite == WPA_KEY_MGMT_NONE || in wpa_driver_ndis_associate()
1078 params->key_mgmt_suite == WPA_KEY_MGMT_IEEE8021X_NO_WPA) { in wpa_driver_ndis_associate()
1079 /* Re-set WEP keys if static WEP configuration is used. */ in wpa_driver_ndis_associate()
1082 if (!params->wep_key[i]) in wpa_driver_ndis_associate()
1084 wpa_printf(MSG_DEBUG, "NDIS: Re-setting static WEP " in wpa_driver_ndis_associate()
1086 wpa_driver_ndis_set_key(drv->ifname, drv, WPA_ALG_WEP, in wpa_driver_ndis_associate()
1088 i == params->wep_tx_keyidx, in wpa_driver_ndis_associate()
1089 NULL, 0, params->wep_key[i], in wpa_driver_ndis_associate()
1090 params->wep_key_len[i]); in wpa_driver_ndis_associate()
1094 if (params->wpa_ie == NULL || params->wpa_ie_len == 0) { in wpa_driver_ndis_associate()
1095 if (params->auth_alg & WPA_AUTH_ALG_SHARED) { in wpa_driver_ndis_associate()
1096 if (params->auth_alg & WPA_AUTH_ALG_OPEN) in wpa_driver_ndis_associate()
1103 } else if (params->wpa_ie[0] == WLAN_EID_RSN) { in wpa_driver_ndis_associate()
1105 if (params->key_mgmt_suite == WPA_KEY_MGMT_PSK) in wpa_driver_ndis_associate()
1110 } else if (params->key_mgmt_suite == WPA_KEY_MGMT_WPS) { in wpa_driver_ndis_associate()
1113 if (params->wps == WPS_MODE_PRIVACY) { in wpa_driver_ndis_associate()
1124 wpa_driver_ndis_set_key(drv->ifname, drv, WPA_ALG_WEP, in wpa_driver_ndis_associate()
1132 if (params->key_mgmt_suite == WPA_KEY_MGMT_WPA_NONE) in wpa_driver_ndis_associate()
1134 else if (params->key_mgmt_suite == WPA_KEY_MGMT_PSK) in wpa_driver_ndis_associate()
1140 switch (params->pairwise_suite) { in wpa_driver_ndis_associate()
1153 if (params->wps == WPS_MODE_PRIVACY) { in wpa_driver_ndis_associate()
1158 if (params->group_suite == WPA_CIPHER_CCMP) in wpa_driver_ndis_associate()
1160 else if (params->group_suite == WPA_CIPHER_TKIP) in wpa_driver_ndis_associate()
1167 if (params->wps == WPS_MODE_PRIVACY) { in wpa_driver_ndis_associate()
1176 if (ndis_set_oid(drv, OID_802_11_PRIVACY_FILTER, in wpa_driver_ndis_associate()
1184 ndis_set_auth_mode(drv, auth_mode); in wpa_driver_ndis_associate()
1185 ndis_set_encr_status(drv, encr); in wpa_driver_ndis_associate()
1187 if (params->bssid) { in wpa_driver_ndis_associate()
1188 ndis_set_oid(drv, OID_802_11_BSSID, (char *) params->bssid, in wpa_driver_ndis_associate()
1190 drv->oid_bssid_set = 1; in wpa_driver_ndis_associate()
1191 } else if (drv->oid_bssid_set) { in wpa_driver_ndis_associate()
1192 ndis_set_oid(drv, OID_802_11_BSSID, "\xff\xff\xff\xff\xff\xff", in wpa_driver_ndis_associate()
1194 drv->oid_bssid_set = 0; in wpa_driver_ndis_associate()
1197 return wpa_driver_ndis_set_ssid(drv, params->ssid, params->ssid_len); in wpa_driver_ndis_associate()
1201 static int wpa_driver_ndis_set_pmkid(struct wpa_driver_ndis_data *drv) in wpa_driver_ndis_set_pmkid() argument
1208 entry = drv->pmkid; in wpa_driver_ndis_set_pmkid()
1211 if (count >= drv->no_of_pmkid) in wpa_driver_ndis_set_pmkid()
1213 entry = entry->next; in wpa_driver_ndis_set_pmkid()
1218 return -1; in wpa_driver_ndis_set_pmkid()
1220 p->Length = len; in wpa_driver_ndis_set_pmkid()
1221 p->BSSIDInfoCount = count; in wpa_driver_ndis_set_pmkid()
1222 entry = drv->pmkid; in wpa_driver_ndis_set_pmkid()
1224 os_memcpy(&p->BSSIDInfo[i].BSSID, entry->bssid, ETH_ALEN); in wpa_driver_ndis_set_pmkid()
1225 os_memcpy(&p->BSSIDInfo[i].PMKID, entry->pmkid, 16); in wpa_driver_ndis_set_pmkid()
1226 entry = entry->next; in wpa_driver_ndis_set_pmkid()
1229 ret = ndis_set_oid(drv, OID_802_11_PMKID, (char *) p, len); in wpa_driver_ndis_set_pmkid()
1238 struct wpa_driver_ndis_data *drv = priv; in wpa_driver_ndis_add_pmkid() local
1240 const u8 *bssid = params->bssid; in wpa_driver_ndis_add_pmkid()
1241 const u8 *pmkid = params->pmkid; in wpa_driver_ndis_add_pmkid()
1244 return -1; in wpa_driver_ndis_add_pmkid()
1245 if (drv->no_of_pmkid == 0) in wpa_driver_ndis_add_pmkid()
1249 entry = drv->pmkid; in wpa_driver_ndis_add_pmkid()
1251 if (ether_addr_equal(entry->bssid, bssid)) in wpa_driver_ndis_add_pmkid()
1254 entry = entry->next; in wpa_driver_ndis_add_pmkid()
1260 os_memcpy(entry->pmkid, pmkid, 16); in wpa_driver_ndis_add_pmkid()
1262 prev->next = entry->next; in wpa_driver_ndis_add_pmkid()
1263 entry->next = drv->pmkid; in wpa_driver_ndis_add_pmkid()
1264 drv->pmkid = entry; in wpa_driver_ndis_add_pmkid()
1269 os_memcpy(entry->bssid, bssid, ETH_ALEN); in wpa_driver_ndis_add_pmkid()
1270 os_memcpy(entry->pmkid, pmkid, 16); in wpa_driver_ndis_add_pmkid()
1271 entry->next = drv->pmkid; in wpa_driver_ndis_add_pmkid()
1272 drv->pmkid = entry; in wpa_driver_ndis_add_pmkid()
1276 return wpa_driver_ndis_set_pmkid(drv); in wpa_driver_ndis_add_pmkid()
1283 struct wpa_driver_ndis_data *drv = priv; in wpa_driver_ndis_remove_pmkid() local
1285 const u8 *bssid = params->bssid; in wpa_driver_ndis_remove_pmkid()
1286 const u8 *pmkid = params->pmkid; in wpa_driver_ndis_remove_pmkid()
1289 return -1; in wpa_driver_ndis_remove_pmkid()
1290 if (drv->no_of_pmkid == 0) in wpa_driver_ndis_remove_pmkid()
1293 entry = drv->pmkid; in wpa_driver_ndis_remove_pmkid()
1296 if (ether_addr_equal(entry->bssid, bssid) && in wpa_driver_ndis_remove_pmkid()
1297 os_memcmp(entry->pmkid, pmkid, 16) == 0) { in wpa_driver_ndis_remove_pmkid()
1299 prev->next = entry->next; in wpa_driver_ndis_remove_pmkid()
1301 drv->pmkid = entry->next; in wpa_driver_ndis_remove_pmkid()
1306 entry = entry->next; in wpa_driver_ndis_remove_pmkid()
1308 return wpa_driver_ndis_set_pmkid(drv); in wpa_driver_ndis_remove_pmkid()
1314 struct wpa_driver_ndis_data *drv = priv; in wpa_driver_ndis_flush_pmkid() local
1319 if (drv->no_of_pmkid == 0) in wpa_driver_ndis_flush_pmkid()
1322 pmkid = drv->pmkid; in wpa_driver_ndis_flush_pmkid()
1323 drv->pmkid = NULL; in wpa_driver_ndis_flush_pmkid()
1326 pmkid = pmkid->next; in wpa_driver_ndis_flush_pmkid()
1334 prev_authmode = ndis_get_auth_mode(drv); in wpa_driver_ndis_flush_pmkid()
1336 ndis_set_auth_mode(drv, Ndis802_11AuthModeWPA2); in wpa_driver_ndis_flush_pmkid()
1343 ret = ndis_set_oid(drv, OID_802_11_PMKID, (char *) &p, 8); in wpa_driver_ndis_flush_pmkid()
1346 ndis_set_auth_mode(drv, prev_authmode); in wpa_driver_ndis_flush_pmkid()
1352 static int wpa_driver_ndis_get_associnfo(struct wpa_driver_ndis_data *drv) in wpa_driver_ndis_get_associnfo() argument
1361 len = ndis_get_oid(drv, OID_802_11_ASSOCIATION_INFORMATION, buf, in wpa_driver_ndis_get_associnfo()
1366 return -1; in wpa_driver_ndis_get_associnfo()
1375 len = ndis_get_oid(drv, OID_802_11_ASSOCIATION_INFORMATION, in wpa_driver_ndis_get_associnfo()
1377 if (len < -1) { in wpa_driver_ndis_get_associnfo()
1378 wpa_printf(MSG_DEBUG, "NDIS: re-reading association " in wpa_driver_ndis_get_associnfo()
1380 return -1; in wpa_driver_ndis_get_associnfo()
1384 " information length %d (re-read)", len); in wpa_driver_ndis_get_associnfo()
1393 return -1; in wpa_driver_ndis_get_associnfo()
1398 ai->AvailableRequestFixedIEs, ai->AvailableResponseFixedIEs, in wpa_driver_ndis_get_associnfo()
1399 (int) ai->OffsetRequestIEs, (int) ai->OffsetResponseIEs, in wpa_driver_ndis_get_associnfo()
1400 (int) ai->RequestIELength, (int) ai->ResponseIELength); in wpa_driver_ndis_get_associnfo()
1402 if (ai->OffsetRequestIEs + ai->RequestIELength > (unsigned) len || in wpa_driver_ndis_get_associnfo()
1403 ai->OffsetResponseIEs + ai->ResponseIELength > (unsigned) len) { in wpa_driver_ndis_get_associnfo()
1404 wpa_printf(MSG_DEBUG, "NDIS: association information - " in wpa_driver_ndis_get_associnfo()
1406 return -1; in wpa_driver_ndis_get_associnfo()
1410 (u8 *) buf + ai->OffsetRequestIEs, ai->RequestIELength); in wpa_driver_ndis_get_associnfo()
1412 (u8 *) buf + ai->OffsetResponseIEs, ai->ResponseIELength); in wpa_driver_ndis_get_associnfo()
1415 data.assoc_info.req_ies = (u8 *) buf + ai->OffsetRequestIEs; in wpa_driver_ndis_get_associnfo()
1416 data.assoc_info.req_ies_len = ai->RequestIELength; in wpa_driver_ndis_get_associnfo()
1417 data.assoc_info.resp_ies = (u8 *) buf + ai->OffsetResponseIEs; in wpa_driver_ndis_get_associnfo()
1418 data.assoc_info.resp_ies_len = ai->ResponseIELength; in wpa_driver_ndis_get_associnfo()
1424 len = ndis_get_oid(drv, OID_802_11_BSSID_LIST, (char *) b, blen); in wpa_driver_ndis_get_associnfo()
1432 (unsigned int) b->NumberOfItems); in wpa_driver_ndis_get_associnfo()
1434 pos = (char *) &b->Bssid[0]; in wpa_driver_ndis_get_associnfo()
1435 for (i = 0; i < b->NumberOfItems; i++) { in wpa_driver_ndis_get_associnfo()
1437 if (ether_addr_equal(drv->bssid, bss->MacAddress) && in wpa_driver_ndis_get_associnfo()
1438 bss->IELength > sizeof(NDIS_802_11_FIXED_IEs)) { in wpa_driver_ndis_get_associnfo()
1440 ((u8 *) bss->IEs) + in wpa_driver_ndis_get_associnfo()
1443 bss->IELength - sizeof(NDIS_802_11_FIXED_IEs); in wpa_driver_ndis_get_associnfo()
1449 pos += bss->Length; in wpa_driver_ndis_get_associnfo()
1455 wpa_supplicant_event(drv->ctx, EVENT_ASSOCINFO, &data); in wpa_driver_ndis_get_associnfo()
1465 struct wpa_driver_ndis_data *drv = eloop_ctx; in wpa_driver_ndis_poll_timeout() local
1469 if (drv->wired) in wpa_driver_ndis_poll_timeout()
1472 if (wpa_driver_ndis_get_bssid(drv, bssid)) { in wpa_driver_ndis_poll_timeout()
1474 if (!is_zero_ether_addr(drv->bssid)) { in wpa_driver_ndis_poll_timeout()
1475 os_memset(drv->bssid, 0, ETH_ALEN); in wpa_driver_ndis_poll_timeout()
1476 wpa_supplicant_event(drv->ctx, EVENT_DISASSOC, NULL); in wpa_driver_ndis_poll_timeout()
1480 if (!ether_addr_equal(drv->bssid, bssid)) { in wpa_driver_ndis_poll_timeout()
1481 os_memcpy(drv->bssid, bssid, ETH_ALEN); in wpa_driver_ndis_poll_timeout()
1482 wpa_driver_ndis_get_associnfo(drv); in wpa_driver_ndis_poll_timeout()
1483 wpa_supplicant_event(drv->ctx, EVENT_ASSOC, NULL); in wpa_driver_ndis_poll_timeout()
1493 poll = drv->mode == IEEE80211_MODE_IBSS; in wpa_driver_ndis_poll_timeout()
1502 drv, NULL); in wpa_driver_ndis_poll_timeout()
1509 struct wpa_driver_ndis_data *drv = priv; in wpa_driver_ndis_poll() local
1510 eloop_cancel_timeout(wpa_driver_ndis_poll_timeout, drv, NULL); in wpa_driver_ndis_poll()
1511 wpa_driver_ndis_poll_timeout(drv, NULL); in wpa_driver_ndis_poll()
1517 void wpa_driver_ndis_event_connect(struct wpa_driver_ndis_data *drv) in wpa_driver_ndis_event_connect() argument
1520 if (wpa_driver_ndis_get_bssid(drv, drv->bssid) == 0) { in wpa_driver_ndis_event_connect()
1521 wpa_driver_ndis_get_associnfo(drv); in wpa_driver_ndis_event_connect()
1522 wpa_supplicant_event(drv->ctx, EVENT_ASSOC, NULL); in wpa_driver_ndis_event_connect()
1529 void wpa_driver_ndis_event_disconnect(struct wpa_driver_ndis_data *drv) in wpa_driver_ndis_event_disconnect() argument
1532 os_memset(drv->bssid, 0, ETH_ALEN); in wpa_driver_ndis_event_disconnect()
1533 wpa_supplicant_event(drv->ctx, EVENT_DISASSOC, NULL); in wpa_driver_ndis_event_disconnect()
1537 static void wpa_driver_ndis_event_auth(struct wpa_driver_ndis_data *drv, in wpa_driver_ndis_event_auth() argument
1553 MAC2STR(req->Bssid), (int) req->Flags); in wpa_driver_ndis_event_auth()
1555 if ((req->Flags & NDIS_802_11_AUTH_REQUEST_PAIRWISE_ERROR) == in wpa_driver_ndis_event_auth()
1558 else if ((req->Flags & NDIS_802_11_AUTH_REQUEST_GROUP_ERROR) == in wpa_driver_ndis_event_auth()
1565 wpa_supplicant_event(drv->ctx, EVENT_MICHAEL_MIC_FAILURE, in wpa_driver_ndis_event_auth()
1571 static void wpa_driver_ndis_event_pmkid(struct wpa_driver_ndis_data *drv, in wpa_driver_ndis_event_pmkid() argument
1584 wpa_printf(MSG_DEBUG, "NDIS: PMKID Candidate List Event - Version %d " in wpa_driver_ndis_event_pmkid()
1586 (int) pmkid->Version, (int) pmkid->NumCandidates); in wpa_driver_ndis_event_pmkid()
1588 if (pmkid->Version != 1) { in wpa_driver_ndis_event_pmkid()
1590 "Version %d", (int) pmkid->Version); in wpa_driver_ndis_event_pmkid()
1594 if (data_len < 8 + pmkid->NumCandidates * sizeof(PMKID_CANDIDATE)) { in wpa_driver_ndis_event_pmkid()
1600 for (i = 0; i < pmkid->NumCandidates; i++) { in wpa_driver_ndis_event_pmkid()
1601 PMKID_CANDIDATE *p = &pmkid->CandidateList[i]; in wpa_driver_ndis_event_pmkid()
1603 i, MAC2STR(p->BSSID), (int) p->Flags); in wpa_driver_ndis_event_pmkid()
1604 os_memcpy(event.pmkid_candidate.bssid, p->BSSID, ETH_ALEN); in wpa_driver_ndis_event_pmkid()
1607 p->Flags & NDIS_802_11_PMKID_CANDIDATE_PREAUTH_ENABLED; in wpa_driver_ndis_event_pmkid()
1608 wpa_supplicant_event(drv->ctx, EVENT_PMKID_CANDIDATE, in wpa_driver_ndis_event_pmkid()
1616 void wpa_driver_ndis_event_media_specific(struct wpa_driver_ndis_data *drv, in wpa_driver_ndis_event_media_specific() argument
1629 data_len -= sizeof(status); in wpa_driver_ndis_event_media_specific()
1631 switch (status->StatusType) { in wpa_driver_ndis_event_media_specific()
1633 wpa_driver_ndis_event_auth(drv, data, data_len); in wpa_driver_ndis_event_media_specific()
1636 wpa_driver_ndis_event_pmkid(drv, data, data_len); in wpa_driver_ndis_event_media_specific()
1640 (int) status->StatusType); in wpa_driver_ndis_event_media_specific()
1647 void wpa_driver_ndis_event_adapter_arrival(struct wpa_driver_ndis_data *drv) in wpa_driver_ndis_event_adapter_arrival() argument
1655 /* Re-open Packet32/NDISUIO connection */ in wpa_driver_ndis_event_adapter_arrival()
1656 wpa_driver_ndis_adapter_close(drv); in wpa_driver_ndis_event_adapter_arrival()
1657 if (wpa_driver_ndis_adapter_init(drv) < 0 || in wpa_driver_ndis_event_adapter_arrival()
1658 wpa_driver_ndis_adapter_open(drv) < 0) { in wpa_driver_ndis_event_adapter_arrival()
1659 wpa_printf(MSG_DEBUG, "NDIS: Driver re-initialization " in wpa_driver_ndis_event_adapter_arrival()
1663 wpa_printf(MSG_DEBUG, "NDIS: Driver re-initialized"); in wpa_driver_ndis_event_adapter_arrival()
1669 os_strlcpy(event.interface_status.ifname, drv->ifname, in wpa_driver_ndis_event_adapter_arrival()
1672 wpa_supplicant_event(drv->ctx, EVENT_INTERFACE_STATUS, &event); in wpa_driver_ndis_event_adapter_arrival()
1677 void wpa_driver_ndis_event_adapter_removal(struct wpa_driver_ndis_data *drv) in wpa_driver_ndis_event_adapter_removal() argument
1683 os_strlcpy(event.interface_status.ifname, drv->ifname, in wpa_driver_ndis_event_adapter_removal()
1686 wpa_supplicant_event(drv->ctx, EVENT_INTERFACE_STATUS, &event); in wpa_driver_ndis_event_adapter_removal()
1691 wpa_driver_ndis_get_wpa_capability(struct wpa_driver_ndis_data *drv) in wpa_driver_ndis_get_wpa_capability() argument
1695 if (ndis_set_auth_mode(drv, Ndis802_11AuthModeWPA) == 0 && in wpa_driver_ndis_get_wpa_capability()
1696 ndis_get_auth_mode(drv) == Ndis802_11AuthModeWPA) { in wpa_driver_ndis_get_wpa_capability()
1698 drv->capa.key_mgmt |= WPA_DRIVER_CAPA_KEY_MGMT_WPA; in wpa_driver_ndis_get_wpa_capability()
1701 if (ndis_set_auth_mode(drv, Ndis802_11AuthModeWPAPSK) == 0 && in wpa_driver_ndis_get_wpa_capability()
1702 ndis_get_auth_mode(drv) == Ndis802_11AuthModeWPAPSK) { in wpa_driver_ndis_get_wpa_capability()
1703 wpa_printf(MSG_DEBUG, "NDIS: WPA-PSK key management " in wpa_driver_ndis_get_wpa_capability()
1705 drv->capa.key_mgmt |= WPA_DRIVER_CAPA_KEY_MGMT_WPA_PSK; in wpa_driver_ndis_get_wpa_capability()
1708 if (ndis_set_encr_status(drv, Ndis802_11Encryption3Enabled) == 0 && in wpa_driver_ndis_get_wpa_capability()
1709 ndis_get_encr_status(drv) == Ndis802_11Encryption3KeyAbsent) { in wpa_driver_ndis_get_wpa_capability()
1711 drv->capa.enc |= WPA_DRIVER_CAPA_ENC_CCMP; in wpa_driver_ndis_get_wpa_capability()
1714 if (ndis_set_encr_status(drv, Ndis802_11Encryption2Enabled) == 0 && in wpa_driver_ndis_get_wpa_capability()
1715 ndis_get_encr_status(drv) == Ndis802_11Encryption2KeyAbsent) { in wpa_driver_ndis_get_wpa_capability()
1717 drv->capa.enc |= WPA_DRIVER_CAPA_ENC_TKIP; in wpa_driver_ndis_get_wpa_capability()
1720 if (ndis_set_encr_status(drv, Ndis802_11Encryption1Enabled) == 0 && in wpa_driver_ndis_get_wpa_capability()
1721 ndis_get_encr_status(drv) == Ndis802_11Encryption1KeyAbsent) { in wpa_driver_ndis_get_wpa_capability()
1723 drv->capa.enc |= WPA_DRIVER_CAPA_ENC_WEP40 | in wpa_driver_ndis_get_wpa_capability()
1727 if (ndis_set_auth_mode(drv, Ndis802_11AuthModeShared) == 0 && in wpa_driver_ndis_get_wpa_capability()
1728 ndis_get_auth_mode(drv) == Ndis802_11AuthModeShared) { in wpa_driver_ndis_get_wpa_capability()
1729 drv->capa.auth |= WPA_DRIVER_AUTH_SHARED; in wpa_driver_ndis_get_wpa_capability()
1732 if (ndis_set_auth_mode(drv, Ndis802_11AuthModeOpen) == 0 && in wpa_driver_ndis_get_wpa_capability()
1733 ndis_get_auth_mode(drv) == Ndis802_11AuthModeOpen) { in wpa_driver_ndis_get_wpa_capability()
1734 drv->capa.auth |= WPA_DRIVER_AUTH_OPEN; in wpa_driver_ndis_get_wpa_capability()
1737 ndis_set_encr_status(drv, Ndis802_11EncryptionDisabled); in wpa_driver_ndis_get_wpa_capability()
1742 if (drv->capa.key_mgmt & WPA_DRIVER_CAPA_KEY_MGMT_WPA && in wpa_driver_ndis_get_wpa_capability()
1743 drv->capa.enc & (WPA_DRIVER_CAPA_ENC_TKIP | in wpa_driver_ndis_get_wpa_capability()
1746 drv->has_capability = 1; in wpa_driver_ndis_get_wpa_capability()
1753 drv->capa.key_mgmt, drv->capa.enc, drv->capa.auth); in wpa_driver_ndis_get_wpa_capability()
1757 static void wpa_driver_ndis_get_capability(struct wpa_driver_ndis_data *drv) in wpa_driver_ndis_get_capability() argument
1764 drv->capa.flags = WPA_DRIVER_FLAGS_DRIVER_IE; in wpa_driver_ndis_get_capability()
1766 len = ndis_get_oid(drv, OID_802_11_CAPABILITY, buf, sizeof(buf)); in wpa_driver_ndis_get_capability()
1768 wpa_driver_ndis_get_wpa_capability(drv); in wpa_driver_ndis_get_capability()
1774 if (len < sizeof(*c) || c->Version != 2) { in wpa_driver_ndis_get_capability()
1779 wpa_printf(MSG_DEBUG, "NDIS: Driver supports OID_802_11_CAPABILITY - " in wpa_driver_ndis_get_capability()
1781 (int) c->NoOfPMKIDs, in wpa_driver_ndis_get_capability()
1782 (int) c->NoOfAuthEncryptPairsSupported); in wpa_driver_ndis_get_capability()
1783 drv->has_capability = 1; in wpa_driver_ndis_get_capability()
1784 drv->no_of_pmkid = c->NoOfPMKIDs; in wpa_driver_ndis_get_capability()
1785 for (i = 0; i < c->NoOfAuthEncryptPairsSupported; i++) { in wpa_driver_ndis_get_capability()
1787 ae = &c->AuthenticationEncryptionSupported[i]; in wpa_driver_ndis_get_capability()
1793 wpa_printf(MSG_MSGDUMP, "NDIS: %lu - auth %d encr %d", in wpa_driver_ndis_get_capability()
1794 i, (int) ae->AuthModeSupported, in wpa_driver_ndis_get_capability()
1795 (int) ae->EncryptStatusSupported); in wpa_driver_ndis_get_capability()
1796 switch (ae->AuthModeSupported) { in wpa_driver_ndis_get_capability()
1798 drv->capa.auth |= WPA_DRIVER_AUTH_OPEN; in wpa_driver_ndis_get_capability()
1801 drv->capa.auth |= WPA_DRIVER_AUTH_SHARED; in wpa_driver_ndis_get_capability()
1804 drv->capa.key_mgmt |= WPA_DRIVER_CAPA_KEY_MGMT_WPA; in wpa_driver_ndis_get_capability()
1807 drv->capa.key_mgmt |= WPA_DRIVER_CAPA_KEY_MGMT_WPA_PSK; in wpa_driver_ndis_get_capability()
1810 drv->capa.key_mgmt |= WPA_DRIVER_CAPA_KEY_MGMT_WPA2; in wpa_driver_ndis_get_capability()
1813 drv->capa.key_mgmt |= in wpa_driver_ndis_get_capability()
1817 drv->capa.key_mgmt |= in wpa_driver_ndis_get_capability()
1823 switch (ae->EncryptStatusSupported) { in wpa_driver_ndis_get_capability()
1825 drv->capa.enc |= WPA_DRIVER_CAPA_ENC_WEP40; in wpa_driver_ndis_get_capability()
1826 drv->capa.enc |= WPA_DRIVER_CAPA_ENC_WEP104; in wpa_driver_ndis_get_capability()
1829 drv->capa.enc |= WPA_DRIVER_CAPA_ENC_TKIP; in wpa_driver_ndis_get_capability()
1832 drv->capa.enc |= WPA_DRIVER_CAPA_ENC_CCMP; in wpa_driver_ndis_get_capability()
1841 drv->capa.key_mgmt, drv->capa.enc, drv->capa.auth); in wpa_driver_ndis_get_capability()
1847 struct wpa_driver_ndis_data *drv = priv; in wpa_driver_ndis_get_capa() local
1848 if (!drv->has_capability) in wpa_driver_ndis_get_capa()
1849 return -1; in wpa_driver_ndis_get_capa()
1850 os_memcpy(capa, &drv->capa, sizeof(*capa)); in wpa_driver_ndis_get_capa()
1857 struct wpa_driver_ndis_data *drv = priv; in wpa_driver_ndis_get_ifname() local
1858 return drv->ifname; in wpa_driver_ndis_get_ifname()
1864 struct wpa_driver_ndis_data *drv = priv; in wpa_driver_ndis_get_mac_addr() local
1865 return drv->own_addr; in wpa_driver_ndis_get_mac_addr()
1875 struct wpa_driver_ndis_data *drv = eloop_data; in ndisuio_notification_receive() local
1880 if (!ReadMsgQueue(drv->event_queue, buf, NDISUIO_MSG_SIZE, &len, 0, in ndisuio_notification_receive()
1895 (int) len, hdr->dwNotificationType); in ndisuio_notification_receive()
1897 switch (hdr->dwNotificationType) { in ndisuio_notification_receive()
1901 wpa_driver_ndis_event_adapter_arrival(drv); in ndisuio_notification_receive()
1907 wpa_driver_ndis_event_adapter_removal(drv); in ndisuio_notification_receive()
1912 SetEvent(drv->connected_event); in ndisuio_notification_receive()
1913 wpa_driver_ndis_event_connect(drv); in ndisuio_notification_receive()
1916 ResetEvent(drv->connected_event); in ndisuio_notification_receive()
1918 wpa_driver_ndis_event_disconnect(drv); in ndisuio_notification_receive()
1924 drv, hdr->pvStatusBuffer, hdr->uiStatusBufferSize); in ndisuio_notification_receive()
1927 drv, ((const u8 *) hdr) + hdr->uiOffsetToStatusBuffer, in ndisuio_notification_receive()
1928 (size_t) hdr->uiStatusBufferSize); in ndisuio_notification_receive()
1933 hdr->dwNotificationType); in ndisuio_notification_receive()
1939 static void ndisuio_notification_deinit(struct wpa_driver_ndis_data *drv) in ndisuio_notification_deinit() argument
1944 req.hMsgQueue = drv->event_queue; in ndisuio_notification_deinit()
1947 if (!DeviceIoControl(drv->ndisuio, IOCTL_NDISUIO_REQUEST_NOTIFICATION, in ndisuio_notification_deinit()
1954 if (!DeviceIoControl(drv->ndisuio, IOCTL_NDISUIO_CANCEL_NOTIFICATION, in ndisuio_notification_deinit()
1961 if (drv->event_queue) { in ndisuio_notification_deinit()
1962 eloop_unregister_event(drv->event_queue, in ndisuio_notification_deinit()
1963 sizeof(drv->event_queue)); in ndisuio_notification_deinit()
1964 CloseHandle(drv->event_queue); in ndisuio_notification_deinit()
1965 drv->event_queue = NULL; in ndisuio_notification_deinit()
1968 if (drv->connected_event) { in ndisuio_notification_deinit()
1969 CloseHandle(drv->connected_event); in ndisuio_notification_deinit()
1970 drv->connected_event = NULL; in ndisuio_notification_deinit()
1975 static int ndisuio_notification_init(struct wpa_driver_ndis_data *drv) in ndisuio_notification_init() argument
1980 drv->connected_event = in ndisuio_notification_init()
1982 if (drv->connected_event == NULL) { in ndisuio_notification_init()
1986 return -1; in ndisuio_notification_init()
1995 drv->event_queue = CreateMsgQueue(NULL, &opt); in ndisuio_notification_init()
1996 if (drv->event_queue == NULL) { in ndisuio_notification_init()
2000 ndisuio_notification_deinit(drv); in ndisuio_notification_init()
2001 return -1; in ndisuio_notification_init()
2005 req.hMsgQueue = drv->event_queue; in ndisuio_notification_init()
2017 if (!DeviceIoControl(drv->ndisuio, IOCTL_NDISUIO_REQUEST_NOTIFICATION, in ndisuio_notification_init()
2022 ndisuio_notification_deinit(drv); in ndisuio_notification_init()
2023 return -1; in ndisuio_notification_init()
2026 eloop_register_event(drv->event_queue, sizeof(drv->event_queue), in ndisuio_notification_init()
2027 ndisuio_notification_receive, drv, NULL); in ndisuio_notification_init()
2034 static int wpa_driver_ndis_get_names(struct wpa_driver_ndis_data *drv) in wpa_driver_ndis_get_names() argument
2047 return -1; in wpa_driver_ndis_get_names()
2051 b->BindingIndex = i; in wpa_driver_ndis_get_names()
2052 if (!DeviceIoControl(drv->ndisuio, IOCTL_NDISUIO_QUERY_BINDING, in wpa_driver_ndis_get_names()
2063 pos = (WCHAR *) ((char *) b + b->DeviceNameOffset); in wpa_driver_ndis_get_names()
2064 len = b->DeviceNameLength; in wpa_driver_ndis_get_names()
2066 len = sizeof(name) - 1; in wpa_driver_ndis_get_names()
2071 pos = (WCHAR *) ((char *) b + b->DeviceDescrOffset); in wpa_driver_ndis_get_names()
2072 len = b->DeviceDescrLength; in wpa_driver_ndis_get_names()
2074 len = sizeof(desc) - 1; in wpa_driver_ndis_get_names()
2079 wpa_printf(MSG_DEBUG, "NDIS: %d - %s - %s", i, name, desc); in wpa_driver_ndis_get_names()
2081 if (os_strstr(name, drv->ifname)) { in wpa_driver_ndis_get_names()
2087 if (os_strncmp(desc, drv->ifname, os_strlen(drv->ifname)) == 0) in wpa_driver_ndis_get_names()
2098 drv->ifname); in wpa_driver_ndis_get_names()
2100 return -1; in wpa_driver_ndis_get_names()
2103 os_strlcpy(drv->ifname, in wpa_driver_ndis_get_names()
2105 sizeof(drv->ifname)); in wpa_driver_ndis_get_names()
2107 drv->adapter_name = wpa_strdup_tchar(drv->ifname); in wpa_driver_ndis_get_names()
2108 if (drv->adapter_name == NULL) { in wpa_driver_ndis_get_names()
2112 return -1; in wpa_driver_ndis_get_names()
2116 dpos = os_strstr(desc, " - "); in wpa_driver_ndis_get_names()
2118 dlen = dpos - desc; in wpa_driver_ndis_get_names()
2121 drv->adapter_desc = os_malloc(dlen + 1); in wpa_driver_ndis_get_names()
2122 if (drv->adapter_desc) { in wpa_driver_ndis_get_names()
2123 os_memcpy(drv->adapter_desc, desc, dlen); in wpa_driver_ndis_get_names()
2124 drv->adapter_desc[dlen] = '\0'; in wpa_driver_ndis_get_names()
2127 if (drv->adapter_desc == NULL) in wpa_driver_ndis_get_names()
2128 return -1; in wpa_driver_ndis_get_names()
2131 drv->adapter_desc); in wpa_driver_ndis_get_names()
2151 return -1; in wpa_driver_ndis_get_names()
2158 return -1; in wpa_driver_ndis_get_names()
2166 return -1; in wpa_driver_ndis_get_names()
2170 if (names[0] && names[1] == '\0' && names[2] && names[3] == '\0') { in wpa_driver_ndis_get_names()
2177 pos2[2] == '\0' && pos2[3] == '\0') { in wpa_driver_ndis_get_names()
2182 pos2 += 2; in wpa_driver_ndis_get_names()
2184 os_memcpy(pos + 2, names, pos - names); in wpa_driver_ndis_get_names()
2185 pos += 2; in wpa_driver_ndis_get_names()
2196 return -1; in wpa_driver_ndis_get_names()
2203 return -1; in wpa_driver_ndis_get_names()
2220 return -1; in wpa_driver_ndis_get_names()
2228 return -1; in wpa_driver_ndis_get_names()
2250 return -1; in wpa_driver_ndis_get_names()
2253 found_name = found_desc = -1; in wpa_driver_ndis_get_names()
2255 wpa_printf(MSG_DEBUG, "NDIS: %d - %s - %s", in wpa_driver_ndis_get_names()
2257 if (found_name == -1 && os_strstr(name[i], drv->ifname)) in wpa_driver_ndis_get_names()
2259 if (found_desc == -1 && in wpa_driver_ndis_get_names()
2260 os_strncmp(desc[i], drv->ifname, os_strlen(drv->ifname)) == in wpa_driver_ndis_get_names()
2270 os_strlcpy(drv->ifname, in wpa_driver_ndis_get_names()
2273 sizeof(drv->ifname)); in wpa_driver_ndis_get_names()
2278 drv->ifname); in wpa_driver_ndis_get_names()
2280 return -1; in wpa_driver_ndis_get_names()
2286 dlen = pos - desc[i]; in wpa_driver_ndis_get_names()
2287 pos--; in wpa_driver_ndis_get_names()
2289 dlen--; in wpa_driver_ndis_get_names()
2293 drv->adapter_desc = os_malloc(dlen + 1); in wpa_driver_ndis_get_names()
2294 if (drv->adapter_desc) { in wpa_driver_ndis_get_names()
2295 os_memcpy(drv->adapter_desc, desc[i], dlen); in wpa_driver_ndis_get_names()
2296 drv->adapter_desc[dlen] = '\0'; in wpa_driver_ndis_get_names()
2299 if (drv->adapter_desc == NULL) in wpa_driver_ndis_get_names()
2300 return -1; in wpa_driver_ndis_get_names()
2303 drv->adapter_desc); in wpa_driver_ndis_get_names()
2343 u8 pad[2]; /* why is this needed? */
2369 static int wpa_driver_ndis_rebind_adapter(struct wpa_driver_ndis_data *drv) in wpa_driver_ndis_rebind_adapter() argument
2375 len = _tcslen(drv->adapter_name); in wpa_driver_ndis_rebind_adapter()
2377 return -1; in wpa_driver_ndis_rebind_adapter()
2384 return -1; in wpa_driver_ndis_rebind_adapter()
2388 memcpy(multi, drv->adapter_name, len * sizeof(TCHAR)); in wpa_driver_ndis_rebind_adapter()
2400 return -1; in wpa_driver_ndis_rebind_adapter()
2413 static int wpa_driver_ndis_set_wzc(struct wpa_driver_ndis_data *drv, in wpa_driver_ndis_set_wzc() argument
2428 wpa_printf(MSG_DEBUG, "NDIS: Failed to re-enable WZC " in wpa_driver_ndis_set_wzc()
2429 "- ActivateDeviceEx failed: %d", in wpa_driver_ndis_set_wzc()
2431 return -1; in wpa_driver_ndis_set_wzc()
2434 wpa_printf(MSG_DEBUG, "NDIS: WZC re-enabled"); in wpa_driver_ndis_set_wzc()
2435 return wpa_driver_ndis_rebind_adapter(drv); in wpa_driver_ndis_set_wzc()
2451 return -1; in wpa_driver_ndis_set_wzc()
2460 "WZC - assuming it is not running."); in wpa_driver_ndis_set_wzc()
2462 return -1; in wpa_driver_ndis_set_wzc()
2492 /* Found WZC - get handle to it. */ in wpa_driver_ndis_set_wzc()
2500 return -1; in wpa_driver_ndis_set_wzc()
2509 return -1; in wpa_driver_ndis_set_wzc()
2513 drv->wzc_disabled = 1; in wpa_driver_ndis_set_wzc()
2514 return wpa_driver_ndis_rebind_adapter(drv); in wpa_driver_ndis_set_wzc()
2526 int ret = -1, j; in wpa_driver_ndis_set_wzc()
2537 "- WZC probably not running", in wpa_driver_ndis_set_wzc()
2539 return -1; in wpa_driver_ndis_set_wzc()
2580 guid[sizeof(guid) - 1] = '\0'; in wpa_driver_ndis_set_wzc()
2583 if (os_strstr(drv->ifname, guid) == NULL) in wpa_driver_ndis_set_wzc()
2600 intf.dwCtlFlags = -1; in wpa_driver_ndis_set_wzc()
2615 if (intf.dwCtlFlags == -1) { in wpa_driver_ndis_set_wzc()
2617 "again - could not disable WZC"); in wpa_driver_ndis_set_wzc()
2638 wpa_printf(MSG_DEBUG, "NDIS: Re-enabled WZC for this " in wpa_driver_ndis_set_wzc()
2640 drv->wzc_disabled = 0; in wpa_driver_ndis_set_wzc()
2659 drv->wzc_disabled = 1; in wpa_driver_ndis_set_wzc()
2677 static int wpa_driver_ndis_set_wzc(struct wpa_driver_ndis_data *drv, in wpa_driver_ndis_set_wzc() argument
2701 static int wpa_driver_ndis_adapter_init(struct wpa_driver_ndis_data *drv) in wpa_driver_ndis_adapter_init() argument
2708 drv->ndisuio = CreateFile(NDISUIO_DEVICE_NAME, in wpa_driver_ndis_adapter_init()
2713 if (drv->ndisuio == INVALID_HANDLE_VALUE) { in wpa_driver_ndis_adapter_init()
2716 return -1; in wpa_driver_ndis_adapter_init()
2718 driver_ndis_ndisuio_handle = drv->ndisuio; in wpa_driver_ndis_adapter_init()
2721 if (!DeviceIoControl(drv->ndisuio, IOCTL_NDISUIO_BIND_WAIT, NULL, 0, in wpa_driver_ndis_adapter_init()
2725 CloseHandle(drv->ndisuio); in wpa_driver_ndis_adapter_init()
2726 drv->ndisuio = INVALID_HANDLE_VALUE; in wpa_driver_ndis_adapter_init()
2727 return -1; in wpa_driver_ndis_adapter_init()
2738 static int wpa_driver_ndis_adapter_open(struct wpa_driver_ndis_data *drv) in wpa_driver_ndis_adapter_open() argument
2752 len = pos + os_strlen(drv->ifname); in wpa_driver_ndis_adapter_open()
2754 return -1; in wpa_driver_ndis_adapter_open()
2758 ifname[i] = (WCHAR) drv->ifname[i - pos]; in wpa_driver_ndis_adapter_open()
2761 if (!DeviceIoControl(drv->ndisuio, IOCTL_NDISUIO_OPEN_DEVICE, in wpa_driver_ndis_adapter_open()
2768 CloseHandle(drv->ndisuio); in wpa_driver_ndis_adapter_open()
2769 drv->ndisuio = INVALID_HANDLE_VALUE; in wpa_driver_ndis_adapter_open()
2770 return -1; in wpa_driver_ndis_adapter_open()
2778 os_snprintf(ifname, sizeof(ifname), "\\Device\\NPF_%s", drv->ifname); in wpa_driver_ndis_adapter_open()
2779 drv->adapter = PacketOpenAdapter(ifname); in wpa_driver_ndis_adapter_open()
2780 if (drv->adapter == NULL) { in wpa_driver_ndis_adapter_open()
2783 return -1; in wpa_driver_ndis_adapter_open()
2790 static void wpa_driver_ndis_adapter_close(struct wpa_driver_ndis_data *drv) in wpa_driver_ndis_adapter_close() argument
2794 if (drv->ndisuio != INVALID_HANDLE_VALUE) in wpa_driver_ndis_adapter_close()
2795 CloseHandle(drv->ndisuio); in wpa_driver_ndis_adapter_close()
2797 if (drv->adapter) in wpa_driver_ndis_adapter_close()
2798 PacketCloseAdapter(drv->adapter); in wpa_driver_ndis_adapter_close()
2803 static int ndis_add_multicast(struct wpa_driver_ndis_data *drv) in ndis_add_multicast() argument
2805 if (ndis_set_oid(drv, OID_802_3_MULTICAST_LIST, in ndis_add_multicast()
2809 return -1; in ndis_add_multicast()
2818 struct wpa_driver_ndis_data *drv; in wpa_driver_ndis_init() local
2822 drv = os_zalloc(sizeof(*drv)); in wpa_driver_ndis_init()
2823 if (drv == NULL) in wpa_driver_ndis_init()
2825 drv->ctx = ctx; in wpa_driver_ndis_init()
2836 os_strlcpy(drv->ifname, ifname, sizeof(drv->ifname)); in wpa_driver_ndis_init()
2838 if (wpa_driver_ndis_adapter_init(drv) < 0) { in wpa_driver_ndis_init()
2839 os_free(drv); in wpa_driver_ndis_init()
2843 if (wpa_driver_ndis_get_names(drv) < 0) { in wpa_driver_ndis_init()
2844 wpa_driver_ndis_adapter_close(drv); in wpa_driver_ndis_init()
2845 os_free(drv); in wpa_driver_ndis_init()
2849 wpa_driver_ndis_set_wzc(drv, 0); in wpa_driver_ndis_init()
2851 if (wpa_driver_ndis_adapter_open(drv) < 0) { in wpa_driver_ndis_init()
2852 wpa_driver_ndis_adapter_close(drv); in wpa_driver_ndis_init()
2853 os_free(drv); in wpa_driver_ndis_init()
2857 if (ndis_get_oid(drv, OID_802_3_CURRENT_ADDRESS, in wpa_driver_ndis_init()
2858 (char *) drv->own_addr, ETH_ALEN) < 0) { in wpa_driver_ndis_init()
2861 wpa_driver_ndis_adapter_close(drv); in wpa_driver_ndis_init()
2862 os_free(drv); in wpa_driver_ndis_init()
2865 wpa_driver_ndis_get_capability(drv); in wpa_driver_ndis_init()
2869 drv->capa.key_mgmt_iftype[i] = drv->capa.key_mgmt; in wpa_driver_ndis_init()
2874 wpa_driver_ndis_flush_pmkid(drv); in wpa_driver_ndis_init()
2877 * Disconnect to make sure that driver re-associates if it was in wpa_driver_ndis_init()
2880 wpa_driver_ndis_disconnect(drv); in wpa_driver_ndis_init()
2882 eloop_register_timeout(1, 0, wpa_driver_ndis_poll_timeout, drv, NULL); in wpa_driver_ndis_init()
2885 drv->events = ndis_events_init(&drv->events_pipe, &drv->event_avail, in wpa_driver_ndis_init()
2886 drv->ifname, drv->adapter_desc); in wpa_driver_ndis_init()
2887 if (drv->events == NULL) { in wpa_driver_ndis_init()
2888 wpa_driver_ndis_deinit(drv); in wpa_driver_ndis_init()
2891 eloop_register_event(drv->event_avail, sizeof(drv->event_avail), in wpa_driver_ndis_init()
2892 wpa_driver_ndis_event_pipe_cb, drv, NULL); in wpa_driver_ndis_init()
2896 if (ndisuio_notification_init(drv) < 0) { in wpa_driver_ndis_init()
2897 wpa_driver_ndis_deinit(drv); in wpa_driver_ndis_init()
2902 /* Set mode here in case card was configured for ad-hoc mode in wpa_driver_ndis_init()
2905 if (ndis_set_oid(drv, OID_802_11_INFRASTRUCTURE_MODE, in wpa_driver_ndis_init()
2914 res = ndis_get_oid(drv, OID_DOT11_CURRENT_OPERATION_MODE, buf, in wpa_driver_ndis_init()
2920 drv->native80211 = 1; in wpa_driver_ndis_init()
2921 } else if (!drv->has_capability || drv->capa.enc == 0) { in wpa_driver_ndis_init()
2927 "any wireless capabilities - assume it is " in wpa_driver_ndis_init()
2929 drv->wired = 1; in wpa_driver_ndis_init()
2930 drv->capa.flags |= WPA_DRIVER_FLAGS_WIRED; in wpa_driver_ndis_init()
2931 drv->has_capability = 1; in wpa_driver_ndis_init()
2932 ndis_add_multicast(drv); in wpa_driver_ndis_init()
2936 return drv; in wpa_driver_ndis_init()
2942 struct wpa_driver_ndis_data *drv = priv; in wpa_driver_ndis_deinit() local
2945 if (drv->events) { in wpa_driver_ndis_deinit()
2946 eloop_unregister_event(drv->event_avail, in wpa_driver_ndis_deinit()
2947 sizeof(drv->event_avail)); in wpa_driver_ndis_deinit()
2948 ndis_events_deinit(drv->events); in wpa_driver_ndis_deinit()
2953 ndisuio_notification_deinit(drv); in wpa_driver_ndis_deinit()
2956 eloop_cancel_timeout(wpa_driver_ndis_scan_timeout, drv, drv->ctx); in wpa_driver_ndis_deinit()
2957 eloop_cancel_timeout(wpa_driver_ndis_poll_timeout, drv, NULL); in wpa_driver_ndis_deinit()
2958 wpa_driver_ndis_flush_pmkid(drv); in wpa_driver_ndis_deinit()
2959 wpa_driver_ndis_disconnect(drv); in wpa_driver_ndis_deinit()
2960 if (wpa_driver_ndis_radio_off(drv) < 0) { in wpa_driver_ndis_deinit()
2965 wpa_driver_ndis_adapter_close(drv); in wpa_driver_ndis_deinit()
2967 if (drv->wzc_disabled) in wpa_driver_ndis_deinit()
2968 wpa_driver_ndis_set_wzc(drv, 1); in wpa_driver_ndis_deinit()
2971 os_free(drv->adapter_name); in wpa_driver_ndis_deinit()
2973 os_free(drv->adapter_desc); in wpa_driver_ndis_deinit()
2974 os_free(drv); in wpa_driver_ndis_deinit()
3022 b->BindingIndex = i; in wpa_driver_ndis_get_interfaces()
3034 pos = (WCHAR *) ((char *) b + b->DeviceNameOffset); in wpa_driver_ndis_get_interfaces()
3035 len = b->DeviceNameLength; in wpa_driver_ndis_get_interfaces()
3037 len = sizeof(name) - 1; in wpa_driver_ndis_get_interfaces()
3042 pos = (WCHAR *) ((char *) b + b->DeviceDescrOffset); in wpa_driver_ndis_get_interfaces()
3043 len = b->DeviceDescrLength; in wpa_driver_ndis_get_interfaces()
3045 len = sizeof(desc) - 1; in wpa_driver_ndis_get_interfaces()
3050 wpa_printf(MSG_DEBUG, "NDIS: %d - %s - %s", i, name, desc); in wpa_driver_ndis_get_interfaces()
3055 niface->drv_name = "ndis"; in wpa_driver_ndis_get_interfaces()
3057 niface->ifname = os_strdup(name + 8); in wpa_driver_ndis_get_interfaces()
3059 niface->ifname = os_strdup(name); in wpa_driver_ndis_get_interfaces()
3060 if (niface->ifname == NULL) { in wpa_driver_ndis_get_interfaces()
3064 niface->desc = os_strdup(desc); in wpa_driver_ndis_get_interfaces()
3065 niface->next = iface; in wpa_driver_ndis_get_interfaces()
3105 if (names[0] && names[1] == '\0' && names[2] && names[3] == '\0') { in wpa_driver_ndis_get_interfaces()
3112 pos2[2] == '\0' && pos2[3] == '\0') { in wpa_driver_ndis_get_interfaces()
3117 pos2 += 2; in wpa_driver_ndis_get_interfaces()
3119 os_memcpy(pos + 2, names, pos - names); in wpa_driver_ndis_get_interfaces()
3120 pos += 2; in wpa_driver_ndis_get_interfaces()
3192 niface->drv_name = "ndis"; in wpa_driver_ndis_get_interfaces()
3194 niface->ifname = os_strdup(name[i] + 12); in wpa_driver_ndis_get_interfaces()
3196 niface->ifname = os_strdup(name[i]); in wpa_driver_ndis_get_interfaces()
3197 if (niface->ifname == NULL) { in wpa_driver_ndis_get_interfaces()
3201 niface->desc = os_strdup(desc[i]); in wpa_driver_ndis_get_interfaces()
3202 niface->next = iface; in wpa_driver_ndis_get_interfaces()