Home | History | Annotate | Download | only in wpa_supplicant

Lines Matching refs:bss

2  * BSS table
19 #include "bss.h"
38 static void wpa_bss_remove(struct wpa_supplicant *wpa_s, struct wpa_bss *bss)
40 dl_list_del(&bss->list);
41 dl_list_del(&bss->list_id);
43 wpa_dbg(wpa_s, MSG_DEBUG, "BSS: Remove id %u BSSID " MACSTR
44 " SSID '%s'", bss->id, MAC2STR(bss->bssid),
45 wpa_ssid_txt(bss->ssid, bss->ssid_len));
46 wpas_notify_bss_removed(wpa_s, bss->bssid, bss->id);
48 wpabuf_free(bss->anqp_venue_name);
49 wpabuf_free(bss->anqp_network_auth_type);
50 wpabuf_free(bss->anqp_roaming_consortium);
51 wpabuf_free(bss->anqp_ip_addr_type_availability);
52 wpabuf_free(bss->anqp_nai_realm);
53 wpabuf_free(bss->anqp_3gpp);
54 wpabuf_free(bss->anqp_domain_name);
56 os_free(bss);
63 struct wpa_bss *bss;
64 dl_list_for_each(bss, &wpa_s->bss, struct wpa_bss, list) {
65 if (os_memcmp(bss->bssid, bssid, ETH_ALEN) == 0 &&
66 bss->ssid_len == ssid_len &&
67 os_memcmp(bss->ssid, ssid, ssid_len) == 0)
68 return bss;
99 static int wpa_bss_known(struct wpa_supplicant *wpa_s, struct wpa_bss *bss)
106 if (ssid->ssid_len == bss->ssid_len &&
107 os_memcmp(ssid->ssid, bss->ssid, ssid->ssid_len) == 0)
117 struct wpa_bss *bss;
119 dl_list_for_each(bss, &wpa_s->bss, struct wpa_bss, list) {
120 if (!wpa_bss_known(wpa_s, bss)) {
121 wpa_bss_remove(wpa_s, bss);
143 wpa_bss_remove(wpa_s, dl_list_first(&wpa_s->bss,
152 struct wpa_bss *bss;
154 bss = os_zalloc(sizeof(*bss) + res->ie_len + res->beacon_ie_len);
155 if (bss == NULL)
157 bss->id = wpa_s->bss_next_id++;
158 bss->last_update_idx = wpa_s->bss_update_idx;
159 wpa_bss_copy_res(bss, res);
160 os_memcpy(bss->ssid, ssid, ssid_len);
161 bss->ssid_len = ssid_len;
162 bss->ie_len = res->ie_len;
163 bss->beacon_ie_len = res->beacon_ie_len;
164 os_memcpy(bss + 1, res + 1, res->ie_len + res->beacon_ie_len);
166 dl_list_add_tail(&wpa_s->bss, &bss->list);
167 dl_list_add_tail(&wpa_s->bss_id, &bss->list_id);
169 wpa_dbg(wpa_s, MSG_DEBUG, "BSS: Add new id %u BSSID " MACSTR
171 bss->id, MAC2STR(bss->bssid), wpa_ssid_txt(ssid, ssid_len));
172 wpas_notify_bss_added(wpa_s, bss->bssid, bss->id);
205 wpa_printf(MSG_DEBUG, "bss: %s: cannot compare IEs", __func__);
275 const struct wpa_bss *bss)
278 wpas_notify_bss_freq_changed(wpa_s, bss->id);
281 wpas_notify_bss_signal_changed(wpa_s, bss->id);
284 wpas_notify_bss_privacy_changed(wpa_s, bss->id);
287 wpas_notify_bss_mode_changed(wpa_s, bss->id);
290 wpas_notify_bss_wpaie_changed(wpa_s, bss->id);
293 wpas_notify_bss_rsnie_changed(wpa_s, bss->id);
296 wpas_notify_bss_wps_changed(wpa_s, bss->id);
299 wpas_notify_bss_ies_changed(wpa_s, bss->id);
302 wpas_notify_bss_rates_changed(wpa_s, bss->id);
306 static void wpa_bss_update(struct wpa_supplicant *wpa_s, struct wpa_bss *bss,
311 changes = wpa_bss_compare_res(bss, res);
312 bss->scan_miss_count = 0;
313 bss->last_update_idx = wpa_s->bss_update_idx;
314 wpa_bss_copy_res(bss, res);
316 dl_list_del(&bss->list);
317 if (bss->ie_len + bss->beacon_ie_len >=
319 os_memcpy(bss + 1, res + 1, res->ie_len + res->beacon_ie_len);
320 bss->ie_len = res->ie_len;
321 bss->beacon_ie_len = res->beacon_ie_len;
324 struct dl_list *prev = bss->list_id.prev;
325 dl_list_del(&bss->list_id);
326 nbss = os_realloc(bss, sizeof(*bss) + res->ie_len +
329 bss = nbss;
330 os_memcpy(bss + 1, res + 1,
332 bss->ie_len = res->ie_len;
333 bss->beacon_ie_len = res->beacon_ie_len;
335 dl_list_add(prev, &bss->list_id);
337 dl_list_add_tail(&wpa_s->bss, &bss->list);
339 notify_bss_changes(wpa_s, changes, bss);
343 static int wpa_bss_in_use(struct wpa_supplicant *wpa_s, struct wpa_bss *bss)
345 return bss == wpa_s->current_bss ||
346 os_memcmp(bss->bssid, wpa_s->bssid, ETH_ALEN) == 0 ||
347 os_memcmp(bss->bssid, wpa_s->pending_bssid, ETH_ALEN) == 0;
354 wpa_dbg(wpa_s, MSG_DEBUG, "BSS: Start scan result update %u",
363 struct wpa_bss *bss;
367 wpa_dbg(wpa_s, MSG_DEBUG, "BSS: No SSID IE included for "
372 wpa_dbg(wpa_s, MSG_DEBUG, "BSS: Too long SSID IE included for "
384 bss = wpa_bss_get(wpa_s, res->bssid, ssid + 2, ssid[1]);
385 if (bss == NULL)
388 wpa_bss_update(wpa_s, bss, res);
392 static int wpa_bss_included_in_scan(const struct wpa_bss *bss,
404 if (bss->freq == info->freqs[i]) {
418 (s->ssid_len == bss->ssid_len &&
419 os_memcmp(s->ssid, bss->ssid, bss->ssid_len) ==
436 struct wpa_bss *bss, *n;
441 dl_list_for_each_safe(bss, n, &wpa_s->bss, struct wpa_bss, list) {
442 if (wpa_bss_in_use(wpa_s, bss))
444 if (!wpa_bss_included_in_scan(bss, info))
446 if (bss->last_update_idx < wpa_s->bss_update_idx)
447 bss->scan_miss_count++;
448 if (bss->scan_miss_count >=
450 wpa_dbg(wpa_s, MSG_DEBUG, "BSS: Expire BSS %u due to "
451 "no match in scan", bss->id);
452 wpa_bss_remove(wpa_s, bss);
460 struct wpa_bss *bss, *n;
463 if (dl_list_empty(&wpa_s->bss))
469 dl_list_for_each_safe(bss, n, &wpa_s->bss, struct wpa_bss, list) {
470 if (wpa_bss_in_use(wpa_s, bss))
473 if (os_time_before(&bss->last_update, &t)) {
474 wpa_dbg(wpa_s, MSG_DEBUG, "BSS: Expire BSS %u due to "
475 "age", bss->id);
476 wpa_bss_remove(wpa_s, bss);
495 dl_list_init(&wpa_s->bss);
505 struct wpa_bss *bss, *n;
507 if (wpa_s->bss.next == NULL)
508 return; /* BSS table not yet initialized */
510 dl_list_for_each_safe(bss, n, &wpa_s->bss, struct wpa_bss, list) {
511 if (wpa_bss_in_use(wpa_s, bss))
513 wpa_bss_remove(wpa_s, bss);
528 struct wpa_bss *bss;
529 dl_list_for_each_reverse(bss, &wpa_s->bss, struct wpa_bss, list) {
530 if (os_memcmp(bss->bssid, bssid, ETH_ALEN) == 0)
531 return bss;
541 struct wpa_bss *bss;
542 dl_list_for_each_reverse(bss, &wpa_s->bss, struct wpa_bss, list) {
544 if (p2p_parse_dev_addr((const u8 *) (bss + 1), bss->ie_len,
547 return bss;
556 struct wpa_bss *bss;
557 dl_list_for_each(bss, &wpa_s->bss, struct wpa_bss, list) {
558 if (bss->id == id)
559 return bss;
565 const u8 * wpa_bss_get_ie(const struct wpa_bss *bss, u8 ie)
569 pos = (const u8 *) (bss + 1);
570 end = pos + bss->ie_len;
584 const u8 * wpa_bss_get_vendor_ie(const struct wpa_bss *bss, u32 vendor_type)
588 pos = (const u8 *) (bss + 1);
589 end = pos + bss->ie_len;
604 struct wpabuf * wpa_bss_get_vendor_ie_multi(const struct wpa_bss *bss,
610 buf = wpabuf_alloc(bss->ie_len);
614 pos = (const u8 *) (bss + 1);
615 end = pos + bss->ie_len;
635 int wpa_bss_get_max_rate(const struct wpa_bss *bss)
641 ie = wpa_bss_get_ie(bss, WLAN_EID_SUPP_RATES);
647 ie = wpa_bss_get_ie(bss, WLAN_EID_EXT_SUPP_RATES);
657 int wpa_bss_get_bit_rates(const struct wpa_bss *bss, u8 **rates)
664 ie = wpa_bss_get_ie(bss, WLAN_EID_SUPP_RATES);
665 ie2 = wpa_bss_get_ie(bss, WLAN_EID_EXT_SUPP_RATES);