wm_cui
wm_cui
这家伙很懒, 什么也没写!

注册于 3 周前

回答
1
文章
0
关注者
0

这个问题应是断网后, 再次联网前计算 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 /

}

发布
问题