Preallocate some space to return the scan results, some drivers do not properly

pass back the desired buffer length. This fixes scanning with the Marvell
88W8335 and BCM4328 wireless cards.

PR:		kern/118370
Submitted by:	Weongyo Jeong
Tested by:	Ed Schouten
This commit is contained in:
Andrew Thompson 2007-12-07 10:37:25 +00:00
parent ca16b7ddc8
commit 30d9c7698a
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=174401

View File

@ -2514,13 +2514,20 @@ ndis_get_assoc(sc, assoc)
return(ENOENT);
}
len = 4;
error = ndis_get_info(sc, OID_802_11_BSSID_LIST, NULL, &len);
if (error != ENOSPC)
len = 65536;
len = sizeof(uint32_t) + (sizeof(ndis_wlan_bssid_ex) * 16);
bl = malloc(len, M_TEMP, M_NOWAIT | M_ZERO);
if (bl == NULL)
return (ENOMEM);
bl = malloc(len, M_TEMP, M_NOWAIT|M_ZERO);
error = ndis_get_info(sc, OID_802_11_BSSID_LIST, bl, &len);
if (error == ENOSPC) {
free(bl, M_TEMP);
bl = malloc(len, M_TEMP, M_NOWAIT | M_ZERO);
if (bl == NULL)
return (ENOMEM);
error = ndis_get_info(sc, OID_802_11_BSSID_LIST, bl, &len);
}
if (error) {
free(bl, M_TEMP);
device_printf(sc->ndis_dev, "bssid_list failed\n");
@ -3279,13 +3286,22 @@ ndis_scan_results(struct ndis_softc *sc)
uint8_t rates[2+IEEE80211_RATE_MAXSIZE];
uint8_t *frm, *efrm;
len = 0;
noise = -96;
error = ndis_get_info(sc, OID_802_11_BSSID_LIST, NULL, &len);
if (error != ENOSPC)
len = 65536;
len = sizeof(uint32_t) + (sizeof(ndis_wlan_bssid_ex) * 16);
bl = malloc(len, M_DEVBUF, M_NOWAIT | M_ZERO);
if (bl == NULL)
return;
error = ndis_get_info(sc, OID_802_11_BSSID_LIST, bl, &len);
if (error == ENOSPC) {
free(bl, M_DEVBUF);
bl = malloc(len, M_DEVBUF, M_NOWAIT | M_ZERO);
if (bl == NULL)
return;
error = ndis_get_info(sc, OID_802_11_BSSID_LIST, bl, &len);
}
if (error) {
DPRINTF(("%s: failed to read\n", __func__));
free(bl, M_DEVBUF);