Lines Matching refs:bss
38 static void wpa_bss_set_hessid(struct wpa_bss *bss) in wpa_bss_set_hessid() argument
41 const u8 *ie = wpa_bss_get_ie(bss, WLAN_EID_INTERWORKING); in wpa_bss_set_hessid()
43 os_memset(bss->hessid, 0, ETH_ALEN); in wpa_bss_set_hessid()
47 os_memcpy(bss->hessid, ie + 3, ETH_ALEN); in wpa_bss_set_hessid()
49 os_memcpy(bss->hessid, ie + 5, ETH_ALEN); in wpa_bss_set_hessid()
116 int wpa_bss_anqp_unshare_alloc(struct wpa_bss *bss) in wpa_bss_anqp_unshare_alloc() argument
120 if (bss->anqp && bss->anqp->users > 1) { in wpa_bss_anqp_unshare_alloc()
122 anqp = wpa_bss_anqp_clone(bss->anqp); in wpa_bss_anqp_unshare_alloc()
126 bss->anqp->users--; in wpa_bss_anqp_unshare_alloc()
127 bss->anqp = anqp; in wpa_bss_anqp_unshare_alloc()
131 if (bss->anqp) in wpa_bss_anqp_unshare_alloc()
135 bss->anqp = wpa_bss_anqp_alloc(); in wpa_bss_anqp_unshare_alloc()
136 return bss->anqp ? 0 : -1; in wpa_bss_anqp_unshare_alloc()
175 static void wpa_bss_remove(struct wpa_supplicant *wpa_s, struct wpa_bss *bss, in wpa_bss_remove() argument
181 if (wpa_s->last_scan_res[i] == bss) { in wpa_bss_remove()
191 dl_list_del(&bss->list); in wpa_bss_remove()
192 dl_list_del(&bss->list_id); in wpa_bss_remove()
195 " SSID '%s' due to %s", bss->id, MAC2STR(bss->bssid), in wpa_bss_remove()
196 wpa_ssid_txt(bss->ssid, bss->ssid_len), reason); in wpa_bss_remove()
197 wpas_notify_bss_removed(wpa_s, bss->bssid, bss->id); in wpa_bss_remove()
198 wpa_bss_anqp_free(bss->anqp); in wpa_bss_remove()
199 os_free(bss); in wpa_bss_remove()
214 struct wpa_bss *bss; in wpa_bss_get() local
217 dl_list_for_each(bss, &wpa_s->bss, struct wpa_bss, list) { in wpa_bss_get()
218 if (os_memcmp(bss->bssid, bssid, ETH_ALEN) == 0 && in wpa_bss_get()
219 bss->ssid_len == ssid_len && in wpa_bss_get()
220 os_memcmp(bss->ssid, ssid, ssid_len) == 0) in wpa_bss_get()
221 return bss; in wpa_bss_get()
262 static int wpa_bss_known(struct wpa_supplicant *wpa_s, struct wpa_bss *bss) in wpa_bss_known() argument
269 if (ssid->ssid_len == bss->ssid_len && in wpa_bss_known()
270 os_memcmp(ssid->ssid, bss->ssid, ssid->ssid_len) == 0) in wpa_bss_known()
278 static int wpa_bss_in_use(struct wpa_supplicant *wpa_s, struct wpa_bss *bss) in wpa_bss_in_use() argument
280 return bss == wpa_s->current_bss || in wpa_bss_in_use()
281 os_memcmp(bss->bssid, wpa_s->bssid, ETH_ALEN) == 0 || in wpa_bss_in_use()
282 os_memcmp(bss->bssid, wpa_s->pending_bssid, ETH_ALEN) == 0; in wpa_bss_in_use()
288 struct wpa_bss *bss; in wpa_bss_remove_oldest_unknown() local
290 dl_list_for_each(bss, &wpa_s->bss, struct wpa_bss, list) { in wpa_bss_remove_oldest_unknown()
291 if (!wpa_bss_known(wpa_s, bss)) { in wpa_bss_remove_oldest_unknown()
292 wpa_bss_remove(wpa_s, bss, __func__); in wpa_bss_remove_oldest_unknown()
303 struct wpa_bss *bss; in wpa_bss_remove_oldest() local
315 dl_list_for_each(bss, &wpa_s->bss, struct wpa_bss, list) { in wpa_bss_remove_oldest()
316 if (!wpa_bss_in_use(wpa_s, bss)) { in wpa_bss_remove_oldest()
317 wpa_bss_remove(wpa_s, bss, __func__); in wpa_bss_remove_oldest()
331 struct wpa_bss *bss; in wpa_bss_add() local
333 bss = os_zalloc(sizeof(*bss) + res->ie_len + res->beacon_ie_len); in wpa_bss_add()
334 if (bss == NULL) in wpa_bss_add()
336 bss->id = wpa_s->bss_next_id++; in wpa_bss_add()
337 bss->last_update_idx = wpa_s->bss_update_idx; in wpa_bss_add()
338 wpa_bss_copy_res(bss, res, fetch_time); in wpa_bss_add()
339 os_memcpy(bss->ssid, ssid, ssid_len); in wpa_bss_add()
340 bss->ssid_len = ssid_len; in wpa_bss_add()
341 bss->ie_len = res->ie_len; in wpa_bss_add()
342 bss->beacon_ie_len = res->beacon_ie_len; in wpa_bss_add()
343 os_memcpy(bss + 1, res + 1, res->ie_len + res->beacon_ie_len); in wpa_bss_add()
344 wpa_bss_set_hessid(bss); in wpa_bss_add()
346 dl_list_add_tail(&wpa_s->bss, &bss->list); in wpa_bss_add()
347 dl_list_add_tail(&wpa_s->bss_id, &bss->list_id); in wpa_bss_add()
351 bss->id, MAC2STR(bss->bssid), wpa_ssid_txt(ssid, ssid_len)); in wpa_bss_add()
352 wpas_notify_bss_added(wpa_s, bss->bssid, bss->id); in wpa_bss_add()
360 return bss; in wpa_bss_add()
461 const struct wpa_bss *bss) in notify_bss_changes() argument
464 wpas_notify_bss_freq_changed(wpa_s, bss->id); in notify_bss_changes()
467 wpas_notify_bss_signal_changed(wpa_s, bss->id); in notify_bss_changes()
470 wpas_notify_bss_privacy_changed(wpa_s, bss->id); in notify_bss_changes()
473 wpas_notify_bss_mode_changed(wpa_s, bss->id); in notify_bss_changes()
476 wpas_notify_bss_wpaie_changed(wpa_s, bss->id); in notify_bss_changes()
479 wpas_notify_bss_rsnie_changed(wpa_s, bss->id); in notify_bss_changes()
482 wpas_notify_bss_wps_changed(wpa_s, bss->id); in notify_bss_changes()
485 wpas_notify_bss_ies_changed(wpa_s, bss->id); in notify_bss_changes()
488 wpas_notify_bss_rates_changed(wpa_s, bss->id); in notify_bss_changes()
493 wpa_bss_update(struct wpa_supplicant *wpa_s, struct wpa_bss *bss, in wpa_bss_update() argument
498 changes = wpa_bss_compare_res(bss, res); in wpa_bss_update()
499 bss->scan_miss_count = 0; in wpa_bss_update()
500 bss->last_update_idx = wpa_s->bss_update_idx; in wpa_bss_update()
501 wpa_bss_copy_res(bss, res, fetch_time); in wpa_bss_update()
503 dl_list_del(&bss->list); in wpa_bss_update()
504 if (bss->ie_len + bss->beacon_ie_len >= in wpa_bss_update()
506 os_memcpy(bss + 1, res + 1, res->ie_len + res->beacon_ie_len); in wpa_bss_update()
507 bss->ie_len = res->ie_len; in wpa_bss_update()
508 bss->beacon_ie_len = res->beacon_ie_len; in wpa_bss_update()
511 struct dl_list *prev = bss->list_id.prev; in wpa_bss_update()
512 dl_list_del(&bss->list_id); in wpa_bss_update()
513 nbss = os_realloc(bss, sizeof(*bss) + res->ie_len + in wpa_bss_update()
518 if (wpa_s->last_scan_res[i] == bss) { in wpa_bss_update()
523 if (wpa_s->current_bss == bss) in wpa_bss_update()
525 bss = nbss; in wpa_bss_update()
526 os_memcpy(bss + 1, res + 1, in wpa_bss_update()
528 bss->ie_len = res->ie_len; in wpa_bss_update()
529 bss->beacon_ie_len = res->beacon_ie_len; in wpa_bss_update()
531 dl_list_add(prev, &bss->list_id); in wpa_bss_update()
534 wpa_bss_set_hessid(bss); in wpa_bss_update()
535 dl_list_add_tail(&wpa_s->bss, &bss->list); in wpa_bss_update()
537 notify_bss_changes(wpa_s, changes, bss); in wpa_bss_update()
539 return bss; in wpa_bss_update()
576 struct wpa_bss *bss; in wpa_bss_update_scan_res() local
624 bss = wpa_bss_get(wpa_s, res->bssid, ssid + 2, ssid[1]); in wpa_bss_update_scan_res()
625 if (bss == NULL) in wpa_bss_update_scan_res()
626 bss = wpa_bss_add(wpa_s, ssid + 2, ssid[1], res, fetch_time); in wpa_bss_update_scan_res()
628 bss = wpa_bss_update(wpa_s, bss, res, fetch_time); in wpa_bss_update_scan_res()
630 if (bss == NULL) in wpa_bss_update_scan_res()
647 wpa_s->last_scan_res[wpa_s->last_scan_res_used++] = bss; in wpa_bss_update_scan_res()
651 static int wpa_bss_included_in_scan(const struct wpa_bss *bss, in wpa_bss_included_in_scan() argument
663 if (bss->freq == info->freqs[i]) { in wpa_bss_included_in_scan()
677 (s->ssid_len == bss->ssid_len && in wpa_bss_included_in_scan()
678 os_memcmp(s->ssid, bss->ssid, bss->ssid_len) == in wpa_bss_included_in_scan()
705 struct wpa_bss *bss, *n; in wpa_bss_update_end() local
727 dl_list_for_each_safe(bss, n, &wpa_s->bss, struct wpa_bss, list) { in wpa_bss_update_end()
728 if (wpa_bss_in_use(wpa_s, bss)) in wpa_bss_update_end()
730 if (!wpa_bss_included_in_scan(bss, info)) in wpa_bss_update_end()
732 if (bss->last_update_idx < wpa_s->bss_update_idx) in wpa_bss_update_end()
733 bss->scan_miss_count++; in wpa_bss_update_end()
734 if (bss->scan_miss_count >= in wpa_bss_update_end()
736 wpa_bss_remove(wpa_s, bss, "no match in scan"); in wpa_bss_update_end()
756 struct wpa_bss *bss, *n; in wpa_bss_flush_by_age() local
759 if (dl_list_empty(&wpa_s->bss)) in wpa_bss_flush_by_age()
765 dl_list_for_each_safe(bss, n, &wpa_s->bss, struct wpa_bss, list) { in wpa_bss_flush_by_age()
766 if (wpa_bss_in_use(wpa_s, bss)) in wpa_bss_flush_by_age()
769 if (os_time_before(&bss->last_update, &t)) { in wpa_bss_flush_by_age()
770 wpa_bss_remove(wpa_s, bss, __func__); in wpa_bss_flush_by_age()
797 dl_list_init(&wpa_s->bss); in wpa_bss_init()
811 struct wpa_bss *bss, *n; in wpa_bss_flush() local
813 if (wpa_s->bss.next == NULL) in wpa_bss_flush()
816 dl_list_for_each_safe(bss, n, &wpa_s->bss, struct wpa_bss, list) { in wpa_bss_flush()
817 if (wpa_bss_in_use(wpa_s, bss)) in wpa_bss_flush()
819 wpa_bss_remove(wpa_s, bss, __func__); in wpa_bss_flush()
844 struct wpa_bss *bss; in wpa_bss_get_bssid() local
847 dl_list_for_each_reverse(bss, &wpa_s->bss, struct wpa_bss, list) { in wpa_bss_get_bssid()
848 if (os_memcmp(bss->bssid, bssid, ETH_ALEN) == 0) in wpa_bss_get_bssid()
849 return bss; in wpa_bss_get_bssid()
869 struct wpa_bss *bss, *found = NULL; in wpa_bss_get_bssid_latest() local
872 dl_list_for_each_reverse(bss, &wpa_s->bss, struct wpa_bss, list) { in wpa_bss_get_bssid_latest()
873 if (os_memcmp(bss->bssid, bssid, ETH_ALEN) != 0) in wpa_bss_get_bssid_latest()
876 os_time_before(&found->last_update, &bss->last_update)) in wpa_bss_get_bssid_latest()
877 found = bss; in wpa_bss_get_bssid_latest()
893 struct wpa_bss *bss; in wpa_bss_get_p2p_dev_addr() local
894 dl_list_for_each_reverse(bss, &wpa_s->bss, struct wpa_bss, list) { in wpa_bss_get_p2p_dev_addr()
896 if (p2p_parse_dev_addr((const u8 *) (bss + 1), bss->ie_len, in wpa_bss_get_p2p_dev_addr()
899 return bss; in wpa_bss_get_p2p_dev_addr()
914 struct wpa_bss *bss; in wpa_bss_get_id() local
915 dl_list_for_each(bss, &wpa_s->bss, struct wpa_bss, list) { in wpa_bss_get_id()
916 if (bss->id == id) in wpa_bss_get_id()
917 return bss; in wpa_bss_get_id()
937 struct wpa_bss *bss; in wpa_bss_get_id_range() local
938 dl_list_for_each(bss, &wpa_s->bss_id, struct wpa_bss, list_id) { in wpa_bss_get_id_range()
939 if (bss->id >= idf && bss->id <= idl) in wpa_bss_get_id_range()
940 return bss; in wpa_bss_get_id_range()
955 const u8 * wpa_bss_get_ie(const struct wpa_bss *bss, u8 ie) in wpa_bss_get_ie() argument
959 pos = (const u8 *) (bss + 1); in wpa_bss_get_ie()
960 end = pos + bss->ie_len; in wpa_bss_get_ie()
983 const u8 * wpa_bss_get_vendor_ie(const struct wpa_bss *bss, u32 vendor_type) in wpa_bss_get_vendor_ie() argument
987 pos = (const u8 *) (bss + 1); in wpa_bss_get_vendor_ie()
988 end = pos + bss->ie_len; in wpa_bss_get_vendor_ie()
1013 struct wpabuf * wpa_bss_get_vendor_ie_multi(const struct wpa_bss *bss, in wpa_bss_get_vendor_ie_multi() argument
1019 buf = wpabuf_alloc(bss->ie_len); in wpa_bss_get_vendor_ie_multi()
1023 pos = (const u8 *) (bss + 1); in wpa_bss_get_vendor_ie_multi()
1024 end = pos + bss->ie_len; in wpa_bss_get_vendor_ie_multi()
1057 struct wpabuf * wpa_bss_get_vendor_ie_multi_beacon(const struct wpa_bss *bss, in wpa_bss_get_vendor_ie_multi_beacon() argument
1063 buf = wpabuf_alloc(bss->beacon_ie_len); in wpa_bss_get_vendor_ie_multi_beacon()
1067 pos = (const u8 *) (bss + 1); in wpa_bss_get_vendor_ie_multi_beacon()
1068 pos += bss->ie_len; in wpa_bss_get_vendor_ie_multi_beacon()
1069 end = pos + bss->beacon_ie_len; in wpa_bss_get_vendor_ie_multi_beacon()
1094 int wpa_bss_get_max_rate(const struct wpa_bss *bss) in wpa_bss_get_max_rate() argument
1100 ie = wpa_bss_get_ie(bss, WLAN_EID_SUPP_RATES); in wpa_bss_get_max_rate()
1106 ie = wpa_bss_get_ie(bss, WLAN_EID_EXT_SUPP_RATES); in wpa_bss_get_max_rate()
1125 int wpa_bss_get_bit_rates(const struct wpa_bss *bss, u8 **rates) in wpa_bss_get_bit_rates() argument
1132 ie = wpa_bss_get_ie(bss, WLAN_EID_SUPP_RATES); in wpa_bss_get_bit_rates()
1133 ie2 = wpa_bss_get_ie(bss, WLAN_EID_EXT_SUPP_RATES); in wpa_bss_get_bit_rates()