Updated through tag hostap_2_5 from git://w1.fi/hostap.git
[mech_eap.git] / libeap / src / drivers / driver_ndis.c
index 5bfd613..669f1b8 100644 (file)
@@ -2,14 +2,8 @@
  * WPA Supplicant - Windows/NDIS driver interface
  * Copyright (c) 2004-2007, Jouni Malinen <j@w1.fi>
  *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- * Alternatively, this software may be distributed under the terms of BSD
- * license.
- *
- * See README and COPYING for more details.
+ * This software may be distributed under the terms of the BSD license.
+ * See README for more details.
  */
 
 #ifdef __CYGWIN__
@@ -715,11 +709,11 @@ static int wpa_driver_ndis_radio_off(struct wpa_driver_ndis_data *drv)
 /* Disconnect by setting SSID to random (i.e., likely not used). */
 static int wpa_driver_ndis_disconnect(struct wpa_driver_ndis_data *drv)
 {
-       char ssid[32];
+       char ssid[SSID_MAX_LEN];
        int i;
-       for (i = 0; i < 32; i++)
+       for (i = 0; i < SSID_MAX_LEN; i++)
                ssid[i] = rand() & 0xff;
-       return wpa_driver_ndis_set_ssid(drv, (u8 *) ssid, 32);
+       return wpa_driver_ndis_set_ssid(drv, (u8 *) ssid, SSID_MAX_LEN);
 }
 
 
@@ -731,14 +725,6 @@ static int wpa_driver_ndis_deauthenticate(void *priv, const u8 *addr,
 }
 
 
-static int wpa_driver_ndis_disassociate(void *priv, const u8 *addr,
-                                       int reason_code)
-{
-       struct wpa_driver_ndis_data *drv = priv;
-       return wpa_driver_ndis_disconnect(drv);
-}
-
-
 static void wpa_driver_ndis_scan_timeout(void *eloop_ctx, void *timeout_ctx)
 {
        wpa_printf(MSG_DEBUG, "Scan timeout - try to get results");
@@ -820,7 +806,7 @@ static struct wpa_scan_res * wpa_driver_ndis_add_scan_ssid(
        if (wpa_scan_get_ie(r, WLAN_EID_SSID))
                return r; /* SSID IE already present */
 
-       if (ssid->SsidLength == 0 || ssid->SsidLength > 32)
+       if (ssid->SsidLength == 0 || ssid->SsidLength > SSID_MAX_LEN)
                return r; /* No valid SSID inside scan data */
 
        nr = os_realloc(r, sizeof(*r) + r->ie_len + 2 + ssid->SsidLength);
@@ -864,7 +850,7 @@ static struct wpa_scan_results * wpa_driver_ndis_get_scan_results(void *priv)
                os_free(b);
                return NULL;
        }
-       results->res = os_zalloc(count * sizeof(struct wpa_scan_res *));
+       results->res = os_calloc(count, sizeof(struct wpa_scan_res *));
        if (results->res == NULL) {
                os_free(results);
                os_free(b);
@@ -1001,8 +987,7 @@ static int wpa_driver_ndis_set_key(const char *ifname, void *priv,
        int res, pairwise;
        u8 bssid[ETH_ALEN];
 
-       if (addr == NULL || os_memcmp(addr, "\xff\xff\xff\xff\xff\xff",
-                                     ETH_ALEN) == 0) {
+       if (addr == NULL || is_broadcast_ether_addr(addr)) {
                /* Group Key */
                pairwise = 0;
                if (wpa_driver_ndis_get_bssid(drv, bssid) < 0)
@@ -1089,8 +1074,8 @@ wpa_driver_ndis_associate(void *priv,
                /* Try to continue anyway */
        }
 
-       if (params->key_mgmt_suite == KEY_MGMT_NONE ||
-           params->key_mgmt_suite == KEY_MGMT_802_1X_NO_WPA) {
+       if (params->key_mgmt_suite == WPA_KEY_MGMT_NONE ||
+           params->key_mgmt_suite == WPA_KEY_MGMT_IEEE8021X_NO_WPA) {
                /* Re-set WEP keys if static WEP configuration is used. */
                int i;
                for (i = 0; i < 4; i++) {
@@ -1117,12 +1102,12 @@ wpa_driver_ndis_associate(void *priv,
                priv_mode = Ndis802_11PrivFilterAcceptAll;
        } else if (params->wpa_ie[0] == WLAN_EID_RSN) {
                priv_mode = Ndis802_11PrivFilter8021xWEP;
-               if (params->key_mgmt_suite == KEY_MGMT_PSK)
+               if (params->key_mgmt_suite == WPA_KEY_MGMT_PSK)
                        auth_mode = Ndis802_11AuthModeWPA2PSK;
                else
                        auth_mode = Ndis802_11AuthModeWPA2;
 #ifdef CONFIG_WPS
-       } else if (params->key_mgmt_suite == KEY_MGMT_WPS) {
+       } else if (params->key_mgmt_suite == WPA_KEY_MGMT_WPS) {
                auth_mode = Ndis802_11AuthModeOpen;
                priv_mode = Ndis802_11PrivFilterAcceptAll;
                if (params->wps == WPS_MODE_PRIVACY) {
@@ -1144,35 +1129,35 @@ wpa_driver_ndis_associate(void *priv,
 #endif /* CONFIG_WPS */
        } else {
                priv_mode = Ndis802_11PrivFilter8021xWEP;
-               if (params->key_mgmt_suite == KEY_MGMT_WPA_NONE)
+               if (params->key_mgmt_suite == WPA_KEY_MGMT_WPA_NONE)
                        auth_mode = Ndis802_11AuthModeWPANone;
-               else if (params->key_mgmt_suite == KEY_MGMT_PSK)
+               else if (params->key_mgmt_suite == WPA_KEY_MGMT_PSK)
                        auth_mode = Ndis802_11AuthModeWPAPSK;
                else
                        auth_mode = Ndis802_11AuthModeWPA;
        }
 
        switch (params->pairwise_suite) {
-       case CIPHER_CCMP:
+       case WPA_CIPHER_CCMP:
                encr = Ndis802_11Encryption3Enabled;
                break;
-       case CIPHER_TKIP:
+       case WPA_CIPHER_TKIP:
                encr = Ndis802_11Encryption2Enabled;
                break;
-       case CIPHER_WEP40:
-       case CIPHER_WEP104:
+       case WPA_CIPHER_WEP40:
+       case WPA_CIPHER_WEP104:
                encr = Ndis802_11Encryption1Enabled;
                break;
-       case CIPHER_NONE:
+       case WPA_CIPHER_NONE:
 #ifdef CONFIG_WPS
                if (params->wps == WPS_MODE_PRIVACY) {
                        encr = Ndis802_11Encryption1Enabled;
                        break;
                }
 #endif /* CONFIG_WPS */
-               if (params->group_suite == CIPHER_CCMP)
+               if (params->group_suite == WPA_CIPHER_CCMP)
                        encr = Ndis802_11Encryption3Enabled;
-               else if (params->group_suite == CIPHER_TKIP)
+               else if (params->group_suite == WPA_CIPHER_TKIP)
                        encr = Ndis802_11Encryption2Enabled;
                else
                        encr = Ndis802_11EncryptionDisabled;
@@ -2125,14 +2110,8 @@ static int wpa_driver_ndis_get_names(struct wpa_driver_ndis_data *drv)
                dlen = dpos - desc;
        else
                dlen = os_strlen(desc);
-       drv->adapter_desc = os_malloc(dlen + 1);
-       if (drv->adapter_desc) {
-               os_memcpy(drv->adapter_desc, desc, dlen);
-               drv->adapter_desc[dlen] = '\0';
-       }
-
+       drv->adapter_desc = dup_binstr(desc, dlen);
        os_free(b);
-
        if (drv->adapter_desc == NULL)
                return -1;
 
@@ -2299,14 +2278,8 @@ static int wpa_driver_ndis_get_names(struct wpa_driver_ndis_data *drv)
        } else {
                dlen = os_strlen(desc[i]);
        }
-       drv->adapter_desc = os_malloc(dlen + 1);
-       if (drv->adapter_desc) {
-               os_memcpy(drv->adapter_desc, desc[i], dlen);
-               drv->adapter_desc[dlen] = '\0';
-       }
-
+       drv->adapter_desc = dup_binstr(desc[i], dlen);
        os_free(names);
-
        if (drv->adapter_desc == NULL)
                return -1;
 
@@ -3214,100 +3187,32 @@ wpa_driver_ndis_get_interfaces(void *global_priv)
 }
 
 
-const struct wpa_driver_ops wpa_driver_ndis_ops = {
-       "ndis",
-       "Windows NDIS driver",
-       wpa_driver_ndis_get_bssid,
-       wpa_driver_ndis_get_ssid,
-       wpa_driver_ndis_set_key,
-       wpa_driver_ndis_init,
-       wpa_driver_ndis_deinit,
-       NULL /* set_param */,
-       NULL /* set_countermeasures */,
-       wpa_driver_ndis_deauthenticate,
-       wpa_driver_ndis_disassociate,
-       wpa_driver_ndis_associate,
-       wpa_driver_ndis_add_pmkid,
-       wpa_driver_ndis_remove_pmkid,
-       wpa_driver_ndis_flush_pmkid,
-       wpa_driver_ndis_get_capa,
-       wpa_driver_ndis_poll,
-       wpa_driver_ndis_get_ifname,
-       wpa_driver_ndis_get_mac_addr,
-       NULL /* send_eapol */,
-       NULL /* set_operstate */,
-       NULL /* mlme_setprotection */,
-       NULL /* get_hw_feature_data */,
-       NULL /* set_channel */,
-       NULL /* set_ssid */,
-       NULL /* set_bssid */,
-       NULL /* send_mlme */,
-       NULL /* mlme_add_sta */,
-       NULL /* mlme_remove_sta */,
-       NULL /* update_ft_ies */,
-       NULL /* send_ft_action */,
-       wpa_driver_ndis_get_scan_results,
-       NULL /* set_country */,
-       NULL /* global_init */,
-       NULL /* global_deinit */,
-       NULL /* init2 */,
-       wpa_driver_ndis_get_interfaces,
-       wpa_driver_ndis_scan,
-       NULL /* authenticate */,
-       NULL /* set_beacon */,
-       NULL /* hapd_init */,
-       NULL /* hapd_deinit */,
-       NULL /* set_ieee8021x */,
-       NULL /* set_privacy */,
-       NULL /* get_seqnum */,
-       NULL /* flush */,
-       NULL /* set_generic_elem */,
-       NULL /* read_sta_data */,
-       NULL /* hapd_send_eapol */,
-       NULL /* sta_deauth */,
-       NULL /* sta_disassoc */,
-       NULL /* sta_remove */,
-       NULL /* hapd_get_ssid */,
-       NULL /* hapd_set_ssid */,
-       NULL /* hapd_set_countermeasures */,
-       NULL /* sta_add */,
-       NULL /* get_inact_sec */,
-       NULL /* sta_clear_stats */,
-       NULL /* set_freq */,
-       NULL /* set_rts */,
-       NULL /* set_frag */,
-       NULL /* sta_set_flags */,
-       NULL /* set_rate_sets */,
-       NULL /* set_cts_protect */,
-       NULL /* set_preamble */,
-       NULL /* set_short_slot_time */,
-       NULL /* set_tx_queue_params */,
-       NULL /* valid_bss_mask */,
-       NULL /* if_add */,
-       NULL /* if_remove */,
-       NULL /* set_sta_vlan */,
-       NULL /* commit */,
-       NULL /* send_ether */,
-       NULL /* set_radius_acl_auth */,
-       NULL /* set_radius_acl_expire */,
-       NULL /* set_ht_params */,
-       NULL /* set_ap_wps_ie */,
-       NULL /* set_supp_port */,
-       NULL /* set_wds_sta */,
-       NULL /* send_action */,
-       NULL /* remain_on_channel */,
-       NULL /* cancel_remain_on_channel */,
-       NULL /* probe_req_report */,
-       NULL /* disable_11b_rates */,
-       NULL /* deinit_ap */,
-       NULL /* suspend */,
-       NULL /* resume */,
-       NULL /* signal_monitor */,
-       NULL /* send_frame */,
-       NULL /* shared_freq */,
-       NULL /* get_noa */,
-       NULL /* set_noa */,
-       NULL /* set_p2p_powersave */,
-       NULL /* ampdu */,
-       NULL /* set_intra_bss */
-};
+static const char *ndis_drv_name = "ndis";
+static const char *ndis_drv_desc = "Windows NDIS driver";
+
+struct wpa_driver_ops wpa_driver_ndis_ops;
+
+void driver_ndis_init_ops(void)
+{
+       os_memset(&wpa_driver_ndis_ops, 0, sizeof(wpa_driver_ndis_ops));
+       wpa_driver_ndis_ops.name = ndis_drv_name;
+       wpa_driver_ndis_ops.desc = ndis_drv_desc;
+       wpa_driver_ndis_ops.get_bssid = wpa_driver_ndis_get_bssid;
+       wpa_driver_ndis_ops.get_ssid = wpa_driver_ndis_get_ssid;
+       wpa_driver_ndis_ops.set_key = wpa_driver_ndis_set_key;
+       wpa_driver_ndis_ops.init = wpa_driver_ndis_init;
+       wpa_driver_ndis_ops.deinit = wpa_driver_ndis_deinit;
+       wpa_driver_ndis_ops.deauthenticate = wpa_driver_ndis_deauthenticate;
+       wpa_driver_ndis_ops.associate = wpa_driver_ndis_associate;
+       wpa_driver_ndis_ops.add_pmkid = wpa_driver_ndis_add_pmkid;
+       wpa_driver_ndis_ops.remove_pmkid = wpa_driver_ndis_remove_pmkid;
+       wpa_driver_ndis_ops.flush_pmkid = wpa_driver_ndis_flush_pmkid;
+       wpa_driver_ndis_ops.get_capa = wpa_driver_ndis_get_capa;
+       wpa_driver_ndis_ops.poll = wpa_driver_ndis_poll;
+       wpa_driver_ndis_ops.get_ifname = wpa_driver_ndis_get_ifname;
+       wpa_driver_ndis_ops.get_mac_addr = wpa_driver_ndis_get_mac_addr;
+       wpa_driver_ndis_ops.get_scan_results2 =
+               wpa_driver_ndis_get_scan_results;
+       wpa_driver_ndis_ops.get_interfaces = wpa_driver_ndis_get_interfaces;
+       wpa_driver_ndis_ops.scan2 = wpa_driver_ndis_scan;
+}