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 <masashi.honma at gmail.com>
This commit is contained in:
parent
45ac5793fc
commit
30c371e8a5
3 changed files with 21 additions and 4 deletions
|
@ -87,6 +87,16 @@ struct p2p_go_neg_results {
|
||||||
*/
|
*/
|
||||||
size_t ssid_len;
|
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)
|
* passphrase - WPA2-Personal passphrase for the group (GO only)
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -174,15 +174,15 @@ static int wpa_supplicant_conf_ap(struct wpa_supplicant *wpa_s,
|
||||||
bss->wpa = ssid->proto;
|
bss->wpa = ssid->proto;
|
||||||
bss->wpa_key_mgmt = ssid->key_mgmt;
|
bss->wpa_key_mgmt = ssid->key_mgmt;
|
||||||
bss->wpa_pairwise = ssid->pairwise_cipher;
|
bss->wpa_pairwise = ssid->pairwise_cipher;
|
||||||
if (ssid->passphrase) {
|
if (ssid->psk_set) {
|
||||||
bss->ssid.wpa_passphrase = os_strdup(ssid->passphrase);
|
|
||||||
} else if (ssid->psk_set) {
|
|
||||||
os_free(bss->ssid.wpa_psk);
|
os_free(bss->ssid.wpa_psk);
|
||||||
bss->ssid.wpa_psk = os_zalloc(sizeof(struct hostapd_wpa_psk));
|
bss->ssid.wpa_psk = os_zalloc(sizeof(struct hostapd_wpa_psk));
|
||||||
if (bss->ssid.wpa_psk == NULL)
|
if (bss->ssid.wpa_psk == NULL)
|
||||||
return -1;
|
return -1;
|
||||||
os_memcpy(bss->ssid.wpa_psk->psk, ssid->psk, PMK_LEN);
|
os_memcpy(bss->ssid.wpa_psk->psk, ssid->psk, PMK_LEN);
|
||||||
bss->ssid.wpa_psk->group = 1;
|
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] ||
|
} else if (ssid->wep_key_len[0] || ssid->wep_key_len[1] ||
|
||||||
ssid->wep_key_len[2] || ssid->wep_key_len[3]) {
|
ssid->wep_key_len[2] || ssid->wep_key_len[3]) {
|
||||||
struct hostapd_wep_keys *wep = &bss->ssid.wep;
|
struct hostapd_wep_keys *wep = &bss->ssid.wep;
|
||||||
|
|
|
@ -888,6 +888,10 @@ static void wpas_start_wps_go(struct wpa_supplicant *wpa_s,
|
||||||
wpa_config_remove_network(wpa_s->conf, ssid->id);
|
wpa_config_remove_network(wpa_s->conf, ssid->id);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
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);
|
wpa_config_update_psk(ssid);
|
||||||
ssid->ap_max_inactivity = wpa_s->parent->conf->p2p_go_max_inactivity;
|
ssid->ap_max_inactivity = wpa_s->parent->conf->p2p_go_max_inactivity;
|
||||||
|
|
||||||
|
@ -4117,6 +4121,9 @@ int wpas_p2p_group_add_persistent(struct wpa_supplicant *wpa_s,
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
params.role_go = 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 ||
|
if (ssid->passphrase == NULL ||
|
||||||
os_strlen(ssid->passphrase) >= sizeof(params.passphrase)) {
|
os_strlen(ssid->passphrase) >= sizeof(params.passphrase)) {
|
||||||
wpa_printf(MSG_DEBUG, "P2P: Invalid passphrase in persistent "
|
wpa_printf(MSG_DEBUG, "P2P: Invalid passphrase in persistent "
|
||||||
|
|
Loading…
Reference in a new issue