static void bss_add_pmk(struct wlantest *wt, struct wlantest_bss *bss) { struct wlantest_passphrase *p; dl_list_for_each(p, &wt->passphrase, struct wlantest_passphrase, list) { if (!is_zero_ether_addr(p->bssid) && os_memcmp(p->bssid, bss->bssid, ETH_ALEN) != 0) continue; if (p->ssid_len && (p->ssid_len != bss->ssid_len || os_memcmp(p->ssid, bss->ssid, p->ssid_len) != 0)) continue; if (bss_add_pmk_from_passphrase(bss, p->passphrase) < 0) break; } }
static void ctrl_add_passphrase(struct wlantest *wt, int sock, u8 *cmd, size_t clen) { u8 *passphrase; size_t len; struct wlantest_passphrase *p, *pa; u8 *bssid; passphrase = attr_get(cmd, clen, WLANTEST_ATTR_PASSPHRASE, &len); if (passphrase == NULL) { u8 *wepkey; char *key; enum wlantest_ctrl_cmd res; wepkey = attr_get(cmd, clen, WLANTEST_ATTR_WEPKEY, &len); if (wepkey == NULL) { ctrl_send_simple(wt, sock, WLANTEST_CTRL_INVALID_CMD); return; } key = os_zalloc(len + 1); if (key == NULL) { ctrl_send_simple(wt, sock, WLANTEST_CTRL_FAILURE); return; } os_memcpy(key, wepkey, len); if (add_wep(wt, key) < 0) res = WLANTEST_CTRL_FAILURE; else res = WLANTEST_CTRL_SUCCESS; os_free(key); ctrl_send_simple(wt, sock, res); return; } if (len < 8 || len > 63) { ctrl_send_simple(wt, sock, WLANTEST_CTRL_INVALID_CMD); return; } p = os_zalloc(sizeof(*p)); if (p == NULL) { ctrl_send_simple(wt, sock, WLANTEST_CTRL_FAILURE); return; } os_memcpy(p->passphrase, passphrase, len); wpa_printf(MSG_INFO, "Add passphrase '%s'", p->passphrase); bssid = attr_get_macaddr(cmd, clen, WLANTEST_ATTR_BSSID); if (bssid) { os_memcpy(p->bssid, bssid, ETH_ALEN); wpa_printf(MSG_INFO, "Limit passphrase for BSSID " MACSTR, MAC2STR(p->bssid)); } dl_list_for_each(pa, &wt->passphrase, struct wlantest_passphrase, list) { if (os_strcmp(p->passphrase, pa->passphrase) == 0 && os_memcmp(p->bssid, pa->bssid, ETH_ALEN) == 0) { wpa_printf(MSG_INFO, "Passphrase was already known"); os_free(p); p = NULL; break; } } if (p) { struct wlantest_bss *bss; dl_list_add(&wt->passphrase, &p->list); dl_list_for_each(bss, &wt->bss, struct wlantest_bss, list) { if (bssid && os_memcmp(p->bssid, bss->bssid, ETH_ALEN) != 0) continue; bss_add_pmk_from_passphrase(bss, p->passphrase); } } ctrl_send_simple(wt, sock, WLANTEST_CTRL_SUCCESS); }