这个问题应是断网后,再次联网前计算wpa_config_update_psk所致,这个会进行PBKDF2-SHA1 × 4096 次的运算,耗时约1.5s。如果想要省去这些时间,需要对这个函数做一下改进,当ssid的信息不变的时候,不重复计算此值。修改如下(计算前比较一下,如果信息不变不重新计算;但是第一次的计算是避免不了的,所以计算后要保存一下相关值):
ifndef CONFIG_NO_PBKDF2
/*
- Cache last PBKDF2 result. wm_wifi_connect() does remove_network all +
- add_network on every retry, which allocates a new wpa_ssid and would
- otherwise re-run 4096-iteration PBKDF2 (~1s on MCU) for the same
- SSID/passphrase. Iteration count itself cannot be reduced (IEEE 802.11i).
*/
struct wpa_psk_cache {
int valid;
size_t ssid_len;
u8 ssid[SSID_MAX_LEN];
char passphrase[64];
u8 psk[PMK_LEN];};
static struct wpa_psk_cache g_wpa_psk_cache;
endif / CONFIG_NO_PBKDF2 /
/**
- wpa_config_update_psk - Update WPA PSK based on passphrase and SSID
- @ssid: Pointer to network configuration data
*
- This function must be called to update WPA PSK when either SSID or the
- passphrase has changed for the network configuration.
*/
void wpa_config_update_psk(struct wpa_ssid *ssid)
{
ifndef CONFIG_NO_PBKDF2
if (ssid && ssid->passphrase && ssid->ssid_len <= SSID_MAX_LEN &&
g_wpa_psk_cache.valid &&
g_wpa_psk_cache.ssid_len == ssid->ssid_len &&
os_memcmp(g_wpa_psk_cache.ssid, ssid->ssid, ssid->ssid_len) == 0 &&
os_strcmp(g_wpa_psk_cache.passphrase, ssid->passphrase) == 0) {
os_memcpy(ssid->psk, g_wpa_psk_cache.psk, PMK_LEN);
ssid->psk_set = 1;
wm_log_info("wpa_config_update_psk cache hit");
wm_log_info("wpa_config_update_psk end");
return;
}
pbkdf2_sha1(ssid->passphrase, ssid->ssid, ssid->ssid_len, 4096,
ssid->psk, PMK_LEN);
wpa_hexdump_key(MSG_MSGDUMP, "PSK (from passphrase)",
ssid->psk, PMK_LEN);
ssid->psk_set = 1;
if (ssid->passphrase && ssid->ssid_len <= SSID_MAX_LEN &&
os_strlen(ssid->passphrase) < sizeof(g_wpa_psk_cache.passphrase)) {
g_wpa_psk_cache.ssid_len = ssid->ssid_len;
os_memcpy(g_wpa_psk_cache.ssid, ssid->ssid, ssid->ssid_len);
os_strlcpy(g_wpa_psk_cache.passphrase, ssid->passphrase,
sizeof(g_wpa_psk_cache.passphrase));
os_memcpy(g_wpa_psk_cache.psk, ssid->psk, PMK_LEN);
g_wpa_psk_cache.valid = 1;
}endif / CONFIG_NO_PBKDF2 /
}

问 关于iot sdk中的wifi重新连接问题