diff --git a/wpa_supplicant/bss.c b/wpa_supplicant/bss.c index 87b7db89a..9dc0be24d 100644 --- a/wpa_supplicant/bss.c +++ b/wpa_supplicant/bss.c @@ -864,6 +864,29 @@ struct wpa_bss * wpa_bss_get_id(struct wpa_supplicant *wpa_s, unsigned int id) } +/** + * wpa_bss_get_id_range - Fetch a BSS table entry based on identifier range + * @wpa_s: Pointer to wpa_supplicant data + * @idf: Smallest allowed identifier assigned for the entry + * @idf: Largest allowed identifier assigned for the entry + * Returns: Pointer to the BSS entry or %NULL if not found + * + * This function is similar to wpa_bss_get_id() but allows a BSS entry with the + * smallest id value to be fetched within the specified range without the + * caller having to know the exact id. + */ +struct wpa_bss * wpa_bss_get_id_range(struct wpa_supplicant *wpa_s, + unsigned int idf, unsigned int idl) +{ + struct wpa_bss *bss; + dl_list_for_each(bss, &wpa_s->bss_id, struct wpa_bss, list_id) { + if (bss->id >= idf && bss->id <= idl) + return bss; + } + return NULL; +} + + /** * wpa_bss_get_ie - Fetch a specified information element from a BSS entry * @bss: BSS table entry diff --git a/wpa_supplicant/bss.h b/wpa_supplicant/bss.h index 01f6c59d2..ab2c47e3c 100644 --- a/wpa_supplicant/bss.h +++ b/wpa_supplicant/bss.h @@ -111,6 +111,8 @@ struct wpa_bss * wpa_bss_get_bssid(struct wpa_supplicant *wpa_s, struct wpa_bss * wpa_bss_get_p2p_dev_addr(struct wpa_supplicant *wpa_s, const u8 *dev_addr); struct wpa_bss * wpa_bss_get_id(struct wpa_supplicant *wpa_s, unsigned int id); +struct wpa_bss * wpa_bss_get_id_range(struct wpa_supplicant *wpa_s, + unsigned int idf, unsigned int idl); const u8 * wpa_bss_get_ie(const struct wpa_bss *bss, u8 ie); const u8 * wpa_bss_get_vendor_ie(const struct wpa_bss *bss, u32 vendor_type); struct wpabuf * wpa_bss_get_vendor_ie_multi(const struct wpa_bss *bss, diff --git a/wpa_supplicant/ctrl_iface.c b/wpa_supplicant/ctrl_iface.c index 10c21f6e4..4e5e169e2 100644 --- a/wpa_supplicant/ctrl_iface.c +++ b/wpa_supplicant/ctrl_iface.c @@ -3148,10 +3148,17 @@ static int wpa_supplicant_ctrl_iface_bss(struct wpa_supplicant *wpa_s, return 0; } - id1 = atoi(cmd + 6); - bss = wpa_bss_get_id(wpa_s, id1); - id2 = atoi(ctmp + 1); - if (id2 == 0) + if (*(cmd + 6) == '-') + id1 = 0; + else + id1 = atoi(cmd + 6); + ctmp++; + if (*ctmp >= '0' && *ctmp <= '9') + id2 = atoi(ctmp); + else + id2 = (unsigned int) -1; + bss = wpa_bss_get_id_range(wpa_s, id1, id2); + if (id2 == (unsigned int) -1) bsslast = dl_list_last(&wpa_s->bss_id, struct wpa_bss, list_id);