-#ifdef WEXT_COMPAT
-static int wpa_driver_nl80211_set_gen_ie(void *priv, const u8 *ie,
- size_t ie_len)
-{
- struct wpa_driver_nl80211_data *drv = priv;
- struct iwreq iwr;
- int ret = 0;
-
- if (drv->capa.flags & WPA_DRIVER_FLAGS_SME)
- return 0;
- os_memset(&iwr, 0, sizeof(iwr));
- os_strlcpy(iwr.ifr_name, drv->ifname, IFNAMSIZ);
- iwr.u.data.pointer = (caddr_t) ie;
- iwr.u.data.length = ie_len;
-
- if (ioctl(drv->ioctl_sock, SIOCSIWGENIE, &iwr) < 0) {
- perror("ioctl[SIOCSIWGENIE]");
- ret = -1;
- }
-
- return ret;
-}
-
-
-static int wpa_driver_nl80211_cipher2wext(int cipher)
-{
- switch (cipher) {
- case CIPHER_NONE:
- return IW_AUTH_CIPHER_NONE;
- case CIPHER_WEP40:
- return IW_AUTH_CIPHER_WEP40;
- case CIPHER_TKIP:
- return IW_AUTH_CIPHER_TKIP;
- case CIPHER_CCMP:
- return IW_AUTH_CIPHER_CCMP;
- case CIPHER_WEP104:
- return IW_AUTH_CIPHER_WEP104;
- default:
- return 0;
- }
-}
-
-
-static int wpa_driver_nl80211_keymgmt2wext(int keymgmt)
-{
- switch (keymgmt) {
- case KEY_MGMT_802_1X:
- case KEY_MGMT_802_1X_NO_WPA:
- return IW_AUTH_KEY_MGMT_802_1X;
- case KEY_MGMT_PSK:
- return IW_AUTH_KEY_MGMT_PSK;
- default:
- return 0;
- }
-}
-
-
-static int
-wpa_driver_nl80211_auth_alg_fallback(struct wpa_driver_nl80211_data *drv,
- struct wpa_driver_associate_params *params)
-{
- struct iwreq iwr;
- int ret = 0;
-
- wpa_printf(MSG_DEBUG, "WEXT: Driver did not support "
- "SIOCSIWAUTH for AUTH_ALG, trying SIOCSIWENCODE");
-
- os_memset(&iwr, 0, sizeof(iwr));
- os_strlcpy(iwr.ifr_name, drv->ifname, IFNAMSIZ);
- /* Just changing mode, not actual keys */
- iwr.u.encoding.flags = 0;
- iwr.u.encoding.pointer = (caddr_t) NULL;
- iwr.u.encoding.length = 0;
-
- /*
- * Note: IW_ENCODE_{OPEN,RESTRICTED} can be interpreted to mean two
- * different things. Here they are used to indicate Open System vs.
- * Shared Key authentication algorithm. However, some drivers may use
- * them to select between open/restricted WEP encrypted (open = allow
- * both unencrypted and encrypted frames; restricted = only allow
- * encrypted frames).
- */
-
- if (!drv->use_crypt) {
- iwr.u.encoding.flags |= IW_ENCODE_DISABLED;
- } else {
- if (params->auth_alg & AUTH_ALG_OPEN_SYSTEM)
- iwr.u.encoding.flags |= IW_ENCODE_OPEN;
- if (params->auth_alg & AUTH_ALG_SHARED_KEY)
- iwr.u.encoding.flags |= IW_ENCODE_RESTRICTED;
- }
-
- if (ioctl(drv->ioctl_sock, SIOCSIWENCODE, &iwr) < 0) {
- perror("ioctl[SIOCSIWENCODE]");
- ret = -1;
- }
-
- return ret;
-}
-
-
-static int wpa_driver_nl80211_set_auth_alg(struct wpa_driver_nl80211_data *drv,
- int auth_alg)
-{
- int algs = 0, res;
-
- if (auth_alg & AUTH_ALG_OPEN_SYSTEM)
- algs |= IW_AUTH_ALG_OPEN_SYSTEM;
- if (auth_alg & AUTH_ALG_SHARED_KEY)
- algs |= IW_AUTH_ALG_SHARED_KEY;
- if (auth_alg & AUTH_ALG_LEAP)
- algs |= IW_AUTH_ALG_LEAP;
- if (algs == 0) {
- /* at least one algorithm should be set */
- algs = IW_AUTH_ALG_OPEN_SYSTEM;
- }
-
- res = wpa_driver_nl80211_set_auth_param(drv, IW_AUTH_80211_AUTH_ALG,
- algs);
- drv->auth_alg_fallback = res == -2;
- return res;
-}
-
-
-static int wpa_driver_nl80211_associate_wext(
- void *priv, struct wpa_driver_associate_params *params)
-{
- struct wpa_driver_nl80211_data *drv = priv;
- int ret = 0;
- int allow_unencrypted_eapol;
- int value;
-
- wpa_printf(MSG_DEBUG, "%s", __FUNCTION__);
-
- wpa_driver_nl80211_set_mode(drv, params->mode);
- wpa_driver_nl80211_set_auth_alg(drv, params->auth_alg);
-
- /*
- * If the driver did not support SIOCSIWAUTH, fallback to
- * SIOCSIWENCODE here.
- */
- if (drv->auth_alg_fallback &&
- wpa_driver_nl80211_auth_alg_fallback(drv, params) < 0)
- ret = -1;
-
- if (!params->bssid &&
- wpa_driver_nl80211_set_bssid(drv, NULL) < 0)
- ret = -1;
-
- /* TODO: should consider getting wpa version and cipher/key_mgmt suites
- * from configuration, not from here, where only the selected suite is
- * available */
- if (wpa_driver_nl80211_set_gen_ie(drv, params->wpa_ie, params->wpa_ie_len)
- < 0)
- ret = -1;
- if (params->wpa_ie == NULL || params->wpa_ie_len == 0)
- value = IW_AUTH_WPA_VERSION_DISABLED;
- else if (params->wpa_ie[0] == WLAN_EID_RSN)
- value = IW_AUTH_WPA_VERSION_WPA2;
- else
- value = IW_AUTH_WPA_VERSION_WPA;
- if (wpa_driver_nl80211_set_auth_param(drv,
- IW_AUTH_WPA_VERSION, value) < 0)
- ret = -1;
- value = wpa_driver_nl80211_cipher2wext(params->pairwise_suite);
- if (wpa_driver_nl80211_set_auth_param(drv,
- IW_AUTH_CIPHER_PAIRWISE, value) < 0)
- ret = -1;
- value = wpa_driver_nl80211_cipher2wext(params->group_suite);
- if (wpa_driver_nl80211_set_auth_param(drv,
- IW_AUTH_CIPHER_GROUP, value) < 0)
- ret = -1;
- value = wpa_driver_nl80211_keymgmt2wext(params->key_mgmt_suite);
- if (wpa_driver_nl80211_set_auth_param(drv,
- IW_AUTH_KEY_MGMT, value) < 0)
- ret = -1;
- value = params->key_mgmt_suite != KEY_MGMT_NONE ||
- params->pairwise_suite != CIPHER_NONE ||
- params->group_suite != CIPHER_NONE ||
- params->wpa_ie_len;
- if (wpa_driver_nl80211_set_auth_param(drv,
- IW_AUTH_PRIVACY_INVOKED, value) < 0)
- ret = -1;
-
- /* Allow unencrypted EAPOL messages even if pairwise keys are set when
- * not using WPA. IEEE 802.1X specifies that these frames are not
- * encrypted, but WPA encrypts them when pairwise keys are in use. */
- if (params->key_mgmt_suite == KEY_MGMT_802_1X ||
- params->key_mgmt_suite == KEY_MGMT_PSK)
- allow_unencrypted_eapol = 0;
- else
- allow_unencrypted_eapol = 1;
-
- if (wpa_driver_nl80211_set_auth_param(drv,
- IW_AUTH_RX_UNENCRYPTED_EAPOL,
- allow_unencrypted_eapol) < 0)
- ret = -1;
- if (params->freq && wpa_driver_nl80211_set_freq(drv, params->freq) < 0)
- ret = -1;
- if (wpa_driver_nl80211_set_ssid(drv, params->ssid, params->ssid_len) < 0)
- ret = -1;
- if (params->bssid &&
- wpa_driver_nl80211_set_bssid(drv, params->bssid) < 0)
- ret = -1;
-
- return ret;
-}
-#endif /* WEXT_COMPAT */
-
-