Fix BSS RANGE command for no exact id match cases

The RANGE=N1-N2 command did not return any entries in some cases where
N1 does not match with any BSS entry. Fix this by allow entries to be
fetched even without knowing the exact id values.

Signed-hostap: Jouni Malinen <jouni@qca.qualcomm.com>
This commit is contained in:
Amar Singhal 2013-02-07 12:27:52 +02:00 committed by Jouni Malinen
parent cc03d0fef3
commit 9f42d49c55
3 changed files with 36 additions and 4 deletions

View file

@ -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

View file

@ -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,

View file

@ -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);