From 30c371e8a54c3b1bece6366ff0666da15d63e45e Mon Sep 17 00:00:00 2001 From: Masashi Honma Date: Sun, 11 Nov 2012 11:39:24 +0200 Subject: [PATCH] P2P: Reduce redundant PSK generation for GO The PSK generation done by pbkdf2_sha1() is one of the longest CPU time users according to our profiling from boot to GO started. So I have reduced some steps. I could boot a GO by this command sequence. ------------- add_net set_network 0 ssid '"DIRECT-XX"' set_network 0 psk '"123456789012345678901234567890123456789012345678901234567890123"' set_network 0 proto RSN set_network 0 key_mgmt WPA-PSK set_network 0 pairwise CCMP set_network 0 auth_alg OPEN set_network 0 mode 3 set_network 0 disabled 2 p2p_group_add persistent=0 freq=2412 ------------- By this sequence, pbkdf2_sha1() was called three times and the function calculates the same value each time. Reduce number of calls to pbkdf2_sha1() from 3 to 1 by caching the previous result. Signed-hostap: Masashi Honma --- src/p2p/p2p.h | 10 ++++++++++ wpa_supplicant/ap.c | 6 +++--- wpa_supplicant/p2p_supplicant.c | 9 ++++++++- 3 files changed, 21 insertions(+), 4 deletions(-) diff --git a/src/p2p/p2p.h b/src/p2p/p2p.h index 4d40a9f..767ce85 100644 --- a/src/p2p/p2p.h +++ b/src/p2p/p2p.h @@ -88,6 +88,16 @@ struct p2p_go_neg_results { size_t ssid_len; /** + * psk - WPA pre-shared key (256 bits) (GO only) + */ + u8 psk[32]; + + /** + * psk_set - Whether PSK field is configured (GO only) + */ + int psk_set; + + /** * passphrase - WPA2-Personal passphrase for the group (GO only) */ char passphrase[64]; diff --git a/wpa_supplicant/ap.c b/wpa_supplicant/ap.c index 088f57d..e261ef9 100644 --- a/wpa_supplicant/ap.c +++ b/wpa_supplicant/ap.c @@ -174,15 +174,15 @@ static int wpa_supplicant_conf_ap(struct wpa_supplicant *wpa_s, bss->wpa = ssid->proto; bss->wpa_key_mgmt = ssid->key_mgmt; bss->wpa_pairwise = ssid->pairwise_cipher; - if (ssid->passphrase) { - bss->ssid.wpa_passphrase = os_strdup(ssid->passphrase); - } else if (ssid->psk_set) { + if (ssid->psk_set) { os_free(bss->ssid.wpa_psk); bss->ssid.wpa_psk = os_zalloc(sizeof(struct hostapd_wpa_psk)); if (bss->ssid.wpa_psk == NULL) return -1; os_memcpy(bss->ssid.wpa_psk->psk, ssid->psk, PMK_LEN); bss->ssid.wpa_psk->group = 1; + } else if (ssid->passphrase) { + bss->ssid.wpa_passphrase = os_strdup(ssid->passphrase); } else if (ssid->wep_key_len[0] || ssid->wep_key_len[1] || ssid->wep_key_len[2] || ssid->wep_key_len[3]) { struct hostapd_wep_keys *wep = &bss->ssid.wep; diff --git a/wpa_supplicant/p2p_supplicant.c b/wpa_supplicant/p2p_supplicant.c index cf90fbd..78b0d20 100644 --- a/wpa_supplicant/p2p_supplicant.c +++ b/wpa_supplicant/p2p_supplicant.c @@ -888,7 +888,11 @@ static void wpas_start_wps_go(struct wpa_supplicant *wpa_s, wpa_config_remove_network(wpa_s->conf, ssid->id); return; } - wpa_config_update_psk(ssid); + ssid->psk_set = params->psk_set; + if (ssid->psk_set) + os_memcpy(ssid->psk, params->psk, sizeof(ssid->psk)); + else + wpa_config_update_psk(ssid); ssid->ap_max_inactivity = wpa_s->parent->conf->p2p_go_max_inactivity; wpa_s->ap_configured_cb = p2p_go_configured; @@ -4117,6 +4121,9 @@ int wpas_p2p_group_add_persistent(struct wpa_supplicant *wpa_s, return -1; params.role_go = 1; + params.psk_set = ssid->psk_set; + if (params.psk_set) + os_memcpy(params.psk, ssid->psk, sizeof(params.psk)); if (ssid->passphrase == NULL || os_strlen(ssid->passphrase) >= sizeof(params.passphrase)) { wpa_printf(MSG_DEBUG, "P2P: Invalid passphrase in persistent " -- 2.1.4