P2P: Support GCMP as part of 60 GHz support
authorAhmad Masri <qca_amasri@qca.qualcomm.com>
Sun, 26 Oct 2014 12:04:29 +0000 (12:04 +0000)
committerJouni Malinen <j@w1.fi>
Mon, 27 Oct 2014 15:15:09 +0000 (17:15 +0200)
Signed-off-by: Jouni Malinen <jouni@qca.qualcomm.com>
src/ap/wps_hostapd.c
wpa_supplicant/ap.c
wpa_supplicant/p2p_supplicant.c
wpa_supplicant/wps_supplicant.c

index 6f16f50..c4d7194 100644 (file)
@@ -1049,7 +1049,7 @@ int hostapd_init_wps(struct hostapd_data *hapd,
                if (conf->wpa_key_mgmt & WPA_KEY_MGMT_IEEE8021X)
                        wps->auth_types |= WPS_AUTH_WPA2;
 
-               if (conf->rsn_pairwise & WPA_CIPHER_CCMP)
+               if (conf->rsn_pairwise & (WPA_CIPHER_CCMP | WPA_CIPHER_GCMP))
                        wps->encr_types |= WPS_ENCR_AES;
                if (conf->rsn_pairwise & WPA_CIPHER_TKIP)
                        wps->encr_types |= WPS_ENCR_TKIP;
index ec6e868..02ea609 100644 (file)
@@ -317,7 +317,8 @@ static int wpa_supplicant_conf_ap(struct wpa_supplicant *wpa_s,
            bss->ssid.security_policy != SECURITY_PLAINTEXT)
                goto no_wps;
        if (bss->ssid.security_policy == SECURITY_WPA_PSK &&
-           (!(bss->rsn_pairwise & WPA_CIPHER_CCMP) || !(bss->wpa & 2)))
+           (!(bss->rsn_pairwise & (WPA_CIPHER_CCMP | WPA_CIPHER_GCMP)) ||
+            !(bss->wpa & 2)))
                goto no_wps; /* WPS2 does not allow WPA/TKIP-only
                              * configuration */
        bss->eap_server = 1;
index 6271425..7d8a9c5 100644 (file)
@@ -1462,6 +1462,15 @@ static void wpas_start_wps_go(struct wpa_supplicant *wpa_s,
        ssid->key_mgmt = WPA_KEY_MGMT_PSK;
        ssid->proto = WPA_PROTO_RSN;
        ssid->pairwise_cipher = WPA_CIPHER_CCMP;
+       ssid->group_cipher = WPA_CIPHER_CCMP;
+       if (params->freq > 56160) {
+               /*
+                * Enable GCMP instead of CCMP as pairwise_cipher and
+                * group_cipher in 60 GHz.
+                */
+               ssid->pairwise_cipher = WPA_CIPHER_GCMP;
+               ssid->group_cipher = WPA_CIPHER_GCMP;
+       }
        if (os_strlen(params->passphrase) > 0) {
                ssid->passphrase = os_strdup(params->passphrase);
                if (ssid->passphrase == NULL) {
index 40a5c69..40f235f 100644 (file)
@@ -286,7 +286,9 @@ static void wpas_wps_remove_dup_network(struct wpa_supplicant *wpa_s,
                /* compare security parameters */
                if (ssid->auth_alg != new_ssid->auth_alg ||
                    ssid->key_mgmt != new_ssid->key_mgmt ||
-                   ssid->group_cipher != new_ssid->group_cipher)
+                   (ssid->group_cipher != new_ssid->group_cipher &&
+                    !(ssid->group_cipher & new_ssid->group_cipher &
+                      WPA_CIPHER_CCMP)))
                        continue;
 
                /*
@@ -471,6 +473,11 @@ static int wpa_supplicant_wps_cred(void *ctx,
                break;
        case WPS_ENCR_AES:
                ssid->pairwise_cipher = WPA_CIPHER_CCMP;
+               if (wpa_s->drv_capa_known &&
+                   (wpa_s->drv_enc & WPA_DRIVER_CAPA_ENC_GCMP)) {
+                       ssid->pairwise_cipher |= WPA_CIPHER_GCMP;
+                       ssid->group_cipher |= WPA_CIPHER_GCMP;
+               }
                break;
        }