Remove obsoleted get_scan_results() driver_ops

This has now been replaced with get_scan_results2() in every
in-tree driver.
This commit is contained in:
Jouni Malinen 2009-11-23 21:33:37 +02:00 committed by Jouni Malinen
parent c2e8d0a092
commit ec8d20187d
6 changed files with 61 additions and 265 deletions

View file

@ -68,57 +68,6 @@ struct hostapd_hw_modes {
#define IEEE80211_CAP_IBSS 0x0002 #define IEEE80211_CAP_IBSS 0x0002
#define IEEE80211_CAP_PRIVACY 0x0010 #define IEEE80211_CAP_PRIVACY 0x0010
#define SSID_MAX_WPA_IE_LEN 40
/**
* struct wpa_scan_result - Scan results (old structure)
* @bssid: BSSID
* @ssid: SSID
* @ssid_len: length of the ssid
* @wpa_ie: WPA IE
* @wpa_ie_len: length of the wpa_ie
* @rsn_ie: RSN IE
* @rsn_ie_len: length of the RSN IE
* @freq: frequency of the channel in MHz (e.g., 2412 = channel 1)
* @caps: capability information field in host byte order
* @qual: signal quality
* @noise: noise level
* @level: signal level
* @maxrate: maximum supported rate
* @mdie_present: Whether MDIE was included in Beacon/ProbeRsp frame
* @mdie: Mobility domain identifier IE (IEEE 802.11r MDIE) (starting from
* IE type field)
* @tsf: Timestamp
*
* This structure is used as a generic format for scan results from the
* driver. Each driver interface implementation is responsible for converting
* the driver or OS specific scan results into this format.
*
* This structure is the old data structure used for scan results. It is
* obsoleted by the new struct wpa_scan_res structure and the old version is
* only included for backwards compatibility with existing driver wrapper
* implementations. New implementations are encouraged to implement for struct
* wpa_scan_res. The old structure will be removed at some point.
*/
struct wpa_scan_result {
u8 bssid[ETH_ALEN];
u8 ssid[32];
size_t ssid_len;
u8 wpa_ie[SSID_MAX_WPA_IE_LEN];
size_t wpa_ie_len;
u8 rsn_ie[SSID_MAX_WPA_IE_LEN];
size_t rsn_ie_len;
int freq;
u16 caps;
int qual;
int noise;
int level;
int maxrate;
int mdie_present;
u8 mdie[5];
u64 tsf;
};
#define WPA_SCAN_QUAL_INVALID BIT(0) #define WPA_SCAN_QUAL_INVALID BIT(0)
#define WPA_SCAN_NOISE_INVALID BIT(1) #define WPA_SCAN_NOISE_INVALID BIT(1)
#define WPA_SCAN_LEVEL_INVALID BIT(2) #define WPA_SCAN_LEVEL_INVALID BIT(2)
@ -674,26 +623,6 @@ struct wpa_driver_ops {
*/ */
int (*set_countermeasures)(void *priv, int enabled); int (*set_countermeasures)(void *priv, int enabled);
/**
* get_scan_results - Fetch the latest scan results (old version)
* @priv: private driver interface data
* @results: pointer to buffer for scan results
* @max_size: maximum number of entries (buffer size)
*
* Returns: Number of scan result entries used on success, -1 on
* failure
*
* If scan results include more than max_size BSSes, max_size will be
* returned and the remaining entries will not be included in the
* buffer.
*
* This function is deprecated. New driver wrapper implementations
* should implement support for get_scan_results2().
*/
int (*get_scan_results)(void *priv,
struct wpa_scan_result *results,
size_t max_size);
/** /**
* deauthenticate - Request driver to deauthenticate * deauthenticate - Request driver to deauthenticate
* @priv: private driver interface data * @priv: private driver interface data

View file

@ -436,20 +436,19 @@ struct bss_ie_hdr {
/* u16 version; */ /* u16 version; */
} __attribute__ ((packed)); } __attribute__ ((packed));
static int static struct wpa_scan_results *
wpa_driver_broadcom_get_scan_results(void *priv, wpa_driver_broadcom_get_scan_results(void *priv)
struct wpa_scan_result *results,
size_t max_size)
{ {
struct wpa_driver_broadcom_data *drv = priv; struct wpa_driver_broadcom_data *drv = priv;
char *buf; char *buf;
wl_scan_results_t *wsr; wl_scan_results_t *wsr;
wl_bss_info_t *wbi; wl_bss_info_t *wbi;
size_t ap_num; size_t ap_num;
struct wpa_scan_results *res;
buf = os_malloc(WLC_IOCTL_MAXLEN); buf = os_malloc(WLC_IOCTL_MAXLEN);
if (buf == NULL) if (buf == NULL)
return -1; return NULL;
wsr = (wl_scan_results_t *) buf; wsr = (wl_scan_results_t *) buf;
@ -459,40 +458,34 @@ wpa_driver_broadcom_get_scan_results(void *priv,
if (broadcom_ioctl(drv, WLC_SCAN_RESULTS, buf, WLC_IOCTL_MAXLEN) < 0) { if (broadcom_ioctl(drv, WLC_SCAN_RESULTS, buf, WLC_IOCTL_MAXLEN) < 0) {
os_free(buf); os_free(buf);
return -1; return NULL;
} }
os_memset(results, 0, max_size * sizeof(struct wpa_scan_result)); res = os_zalloc(sizeof(*res));
if (res == NULL) {
os_free(buf);
return NULL;
}
res->res = os_zalloc(wsr->count * sizeof(struct wpa_scan_res *));
if (res->res == NULL) {
os_free(res);
os_free(buf);
return NULL;
}
for (ap_num = 0, wbi = wsr->bss_info; ap_num < wsr->count; ++ap_num) { for (ap_num = 0, wbi = wsr->bss_info; ap_num < wsr->count; ++ap_num) {
int left; struct wpa_scan_res *r;
struct bss_ie_hdr *ie; r = os_malloc(sizeof(*r) + wbi->ie_length);
if (r == NULL)
os_memcpy(results[ap_num].bssid, &wbi->BSSID, ETH_ALEN);
os_memcpy(results[ap_num].ssid, wbi->SSID, wbi->SSID_len);
results[ap_num].ssid_len = wbi->SSID_len;
results[ap_num].freq = frequency_list[wbi->channel - 1];
/* get ie's */
wpa_hexdump(MSG_MSGDUMP, "BROADCOM: AP IEs",
(u8 *) wbi + sizeof(*wbi), wbi->ie_length);
ie = (struct bss_ie_hdr *) ((u8 *) wbi + sizeof(*wbi));
for (left = wbi->ie_length; left > 0;
left -= (ie->len + 2), ie = (struct bss_ie_hdr *)
((u8 *) ie + 2 + ie->len)) {
wpa_printf(MSG_MSGDUMP, "BROADCOM: IE: id:%x, len:%d",
ie->elem_id, ie->len);
if (ie->len >= 3)
wpa_printf(MSG_MSGDUMP,
"BROADCOM: oui:%02x%02x%02x",
ie->oui[0], ie->oui[1], ie->oui[2]);
if (ie->elem_id != 0xdd ||
ie->len < 6 ||
os_memcmp(ie->oui, WPA_OUI, 3) != 0)
continue;
os_memcpy(results[ap_num].wpa_ie, ie, ie->len + 2);
results[ap_num].wpa_ie_len = ie->len + 2;
break; break;
} res->res[res->num++] = r;
os_memcpy(r->bssid, &wbi->BSSID, ETH_ALEN);
r->freq = frequency_list[wbi->channel - 1];
/* get ie's */
os_memcpy(r + 1, wbi + 1, wbi->ie_length);
r->ie_len = wbi->ie_length;
wbi = (wl_bss_info_t *) ((u8 *) wbi + wbi->length); wbi = (wl_bss_info_t *) ((u8 *) wbi + wbi->length);
} }
@ -502,8 +495,8 @@ wpa_driver_broadcom_get_scan_results(void *priv,
wsr->buflen, (unsigned long) ap_num); wsr->buflen, (unsigned long) ap_num);
os_free(buf); os_free(buf);
return ap_num; return res;
} }
static int wpa_driver_broadcom_deauthenticate(void *priv, const u8 *addr, static int wpa_driver_broadcom_deauthenticate(void *priv, const u8 *addr,
int reason_code) int reason_code)
@ -604,7 +597,7 @@ const struct wpa_driver_ops wpa_driver_broadcom_ops = {
.deinit = wpa_driver_broadcom_deinit, .deinit = wpa_driver_broadcom_deinit,
.set_countermeasures = wpa_driver_broadcom_set_countermeasures, .set_countermeasures = wpa_driver_broadcom_set_countermeasures,
.scan2 = wpa_driver_broadcom_scan, .scan2 = wpa_driver_broadcom_scan,
.get_scan_results = wpa_driver_broadcom_get_scan_results, .get_scan_results2 = wpa_driver_broadcom_get_scan_results,
.deauthenticate = wpa_driver_broadcom_deauthenticate, .deauthenticate = wpa_driver_broadcom_deauthenticate,
.disassociate = wpa_driver_broadcom_disassociate, .disassociate = wpa_driver_broadcom_disassociate,
.associate = wpa_driver_broadcom_associate, .associate = wpa_driver_broadcom_associate,

View file

@ -3175,7 +3175,6 @@ const struct wpa_driver_ops wpa_driver_ndis_ops = {
wpa_driver_ndis_deinit, wpa_driver_ndis_deinit,
NULL /* set_param */, NULL /* set_param */,
NULL /* set_countermeasures */, NULL /* set_countermeasures */,
NULL /* get_scan_results */,
wpa_driver_ndis_deauthenticate, wpa_driver_ndis_deauthenticate,
wpa_driver_ndis_disassociate, wpa_driver_ndis_disassociate,
wpa_driver_ndis_associate, wpa_driver_ndis_associate,

View file

@ -1067,10 +1067,8 @@ static int wpa_driver_ralink_scan(void *priv,
return ret; return ret;
} }
static int static struct wpa_scan_results *
wpa_driver_ralink_get_scan_results(void *priv, wpa_driver_ralink_get_scan_results(void *priv)
struct wpa_scan_result *results,
size_t max_size)
{ {
struct wpa_driver_ralink_data *drv = priv; struct wpa_driver_ralink_data *drv = priv;
UCHAR *buf = NULL; UCHAR *buf = NULL;
@ -1080,9 +1078,10 @@ wpa_driver_ralink_get_scan_results(void *priv,
int rv = 0; int rv = 0;
size_t ap_num; size_t ap_num;
u8 *pos, *end; u8 *pos, *end;
struct wpa_scan_results *res;
if (drv->g_driver_down == 1) if (drv->g_driver_down == 1)
return -1; return NULL;
wpa_printf(MSG_DEBUG, "%s", __FUNCTION__); wpa_printf(MSG_DEBUG, "%s", __FUNCTION__);
if (drv->we_version_compiled >= 17) { if (drv->we_version_compiled >= 17) {
@ -1093,7 +1092,7 @@ wpa_driver_ralink_get_scan_results(void *priv,
iwr.u.data.length = 4096; iwr.u.data.length = 4096;
} }
if (buf == NULL) if (buf == NULL)
return -1; return NULL;
wsr = (NDIS_802_11_BSSID_LIST_EX *) buf; wsr = (NDIS_802_11_BSSID_LIST_EX *) buf;
@ -1105,22 +1104,33 @@ wpa_driver_ralink_get_scan_results(void *priv,
if ((rv = ioctl(drv->ioctl_sock, RT_PRIV_IOCTL, &iwr)) < 0) { if ((rv = ioctl(drv->ioctl_sock, RT_PRIV_IOCTL, &iwr)) < 0) {
wpa_printf(MSG_DEBUG, "ioctl fail: rv = %d", rv); wpa_printf(MSG_DEBUG, "ioctl fail: rv = %d", rv);
os_free(buf); os_free(buf);
return -1; return NULL;
} }
os_memset(results, 0, max_size * sizeof(struct wpa_scan_result)); res = os_zalloc(sizeof(*res));
if (res == NULL) {
os_free(buf);
return NULL;
}
res->res = os_zalloc(wsr->NumberOfItems *
sizeof(struct wpa_scan_res *));
if (res->res == NULL) {
os_free(res);
os_free(buf);
return NULL;
}
for (ap_num = 0, wbi = wsr->Bssid; ap_num < wsr->NumberOfItems; for (ap_num = 0, wbi = wsr->Bssid; ap_num < wsr->NumberOfItems;
++ap_num) { ++ap_num) {
os_memcpy(results[ap_num].bssid, &wbi->MacAddress, ETH_ALEN); struct wpa_scan_res *r;
os_memcpy(results[ap_num].ssid, wbi->Ssid.Ssid, r = os_malloc(sizeof(*r) + wbi->IELength);
wbi->Ssid.SsidLength); if (r == NULL)
results[ap_num].ssid_len = wbi->Ssid.SsidLength; break;
results[ap_num].freq = (wbi->Configuration.DSConfig / 1000); res->res[res->num++] = r;
/* get ie's */ os_memcpy(r->bssid, &wbi->MacAddress, ETH_ALEN);
wpa_hexdump(MSG_DEBUG, "RALINK: AP IEs", r->freq = (wbi->Configuration.DSConfig / 1000);
(u8 *) wbi + sizeof(*wbi) - 1, wbi->IELength);
pos = (u8 *) wbi + sizeof(*wbi) - 1; pos = (u8 *) wbi + sizeof(*wbi) - 1;
end = (u8 *) wbi + sizeof(*wbi) + wbi->IELength; end = (u8 *) wbi + sizeof(*wbi) + wbi->IELength;
@ -1129,34 +1139,17 @@ wpa_driver_ralink_get_scan_results(void *priv,
break; break;
pos += sizeof(NDIS_802_11_FIXED_IEs) - 2; pos += sizeof(NDIS_802_11_FIXED_IEs) - 2;
os_memcpy(&results[ap_num].caps, pos, 2); r->caps = WPA_GET_LE16(pos);
pos += 2; pos += 2;
while (pos + 1 < end && pos + 2 + pos[1] <= end) { os_memcpy(r + 1, pos, end - pos);
u8 ielen = 2 + pos[1]; r->ie_len = end - pos;
if (ielen > SSID_MAX_WPA_IE_LEN) {
pos += ielen;
continue;
}
if (pos[0] == WLAN_EID_VENDOR_SPECIFIC &&
pos[1] >= 4 &&
os_memcmp(pos + 2, "\x00\x50\xf2\x01", 4) == 0) {
os_memcpy(results[ap_num].wpa_ie, pos, ielen);
results[ap_num].wpa_ie_len = ielen;
} else if (pos[0] == WLAN_EID_RSN) {
os_memcpy(results[ap_num].rsn_ie, pos, ielen);
results[ap_num].rsn_ie_len = ielen;
}
pos += ielen;
}
wbi = (NDIS_WLAN_BSSID_EX *) ((u8 *) wbi + wbi->Length); wbi = (NDIS_WLAN_BSSID_EX *) ((u8 *) wbi + wbi->Length);
} }
os_free(buf); os_free(buf);
return ap_num; return res;
} }
static int ralink_set_auth_mode(struct wpa_driver_ralink_data *drv, static int ralink_set_auth_mode(struct wpa_driver_ralink_data *drv,
@ -1499,7 +1492,7 @@ const struct wpa_driver_ops wpa_driver_ralink_ops = {
.deinit = wpa_driver_ralink_deinit, .deinit = wpa_driver_ralink_deinit,
.set_countermeasures = wpa_driver_ralink_set_countermeasures, .set_countermeasures = wpa_driver_ralink_set_countermeasures,
.scan2 = wpa_driver_ralink_scan, .scan2 = wpa_driver_ralink_scan,
.get_scan_results = wpa_driver_ralink_get_scan_results, .get_scan_results2 = wpa_driver_ralink_get_scan_results,
.deauthenticate = wpa_driver_ralink_deauthenticate, .deauthenticate = wpa_driver_ralink_deauthenticate,
.disassociate = wpa_driver_ralink_disassociate, .disassociate = wpa_driver_ralink_disassociate,
.associate = wpa_driver_ralink_associate, .associate = wpa_driver_ralink_associate,

View file

@ -78,17 +78,6 @@ static inline int wpa_drv_scan(struct wpa_supplicant *wpa_s,
return -1; return -1;
} }
static inline int wpa_drv_get_scan_results(struct wpa_supplicant *wpa_s,
struct wpa_scan_result *results,
size_t max_size)
{
if (wpa_s->driver->get_scan_results) {
return wpa_s->driver->get_scan_results(wpa_s->drv_priv,
results, max_size);
}
return -1;
}
static inline struct wpa_scan_results * wpa_drv_get_scan_results2( static inline struct wpa_scan_results * wpa_drv_get_scan_results2(
struct wpa_supplicant *wpa_s) struct wpa_supplicant *wpa_s)
{ {

View file

@ -1574,111 +1574,6 @@ static void notify_bss_changes(struct wpa_supplicant *wpa_s,
} }
static struct wpa_scan_results * wpa_supplicant_get_scan_results_old(
struct wpa_supplicant *wpa_s)
{
#define SCAN_AP_LIMIT 128
struct wpa_scan_result *results;
int num, i;
struct wpa_scan_results *res;
results = os_malloc(SCAN_AP_LIMIT * sizeof(struct wpa_scan_result));
if (results == NULL) {
wpa_printf(MSG_WARNING, "Failed to allocate memory for scan "
"results");
return NULL;
}
num = wpa_drv_get_scan_results(wpa_s, results, SCAN_AP_LIMIT);
wpa_printf(MSG_DEBUG, "Scan results: %d", num);
if (num < 0) {
wpa_printf(MSG_DEBUG, "Failed to get scan results");
os_free(results);
return NULL;
}
if (num > SCAN_AP_LIMIT) {
wpa_printf(MSG_INFO, "Not enough room for all APs (%d < %d)",
num, SCAN_AP_LIMIT);
num = SCAN_AP_LIMIT;
}
/* Convert old scan result data structure to the new one */
res = os_zalloc(sizeof(*res));
if (res == NULL) {
os_free(results);
return NULL;
}
res->res = os_zalloc(num * sizeof(struct wpa_scan_res *));
if (res->res == NULL) {
os_free(results);
os_free(res);
return NULL;
}
for (i = 0; i < num; i++) {
struct wpa_scan_result *bss = &results[i];
struct wpa_scan_res *r;
size_t ie_len;
u8 *pos;
ie_len = 2 + bss->ssid_len + bss->rsn_ie_len + bss->wpa_ie_len;
if (bss->maxrate)
ie_len += 3;
if (bss->mdie_present)
ie_len += 5;
r = os_zalloc(sizeof(*r) + ie_len);
if (r == NULL)
break;
os_memcpy(r->bssid, bss->bssid, ETH_ALEN);
r->freq = bss->freq;
r->caps = bss->caps;
r->qual = bss->qual;
r->noise = bss->noise;
r->level = bss->level;
r->tsf = bss->tsf;
r->ie_len = ie_len;
pos = (u8 *) (r + 1);
/* SSID IE */
*pos++ = WLAN_EID_SSID;
*pos++ = bss->ssid_len;
os_memcpy(pos, bss->ssid, bss->ssid_len);
pos += bss->ssid_len;
if (bss->maxrate) {
/* Fake Supported Rate IE to include max rate */
*pos++ = WLAN_EID_SUPP_RATES;
*pos++ = 1;
*pos++ = bss->maxrate;
}
if (bss->rsn_ie_len) {
os_memcpy(pos, bss->rsn_ie, bss->rsn_ie_len);
pos += bss->rsn_ie_len;
}
if (bss->mdie_present) {
os_memcpy(pos, bss->mdie, 5);
pos += 5;
}
if (bss->wpa_ie_len) {
os_memcpy(pos, bss->wpa_ie, bss->wpa_ie_len);
pos += bss->wpa_ie_len;
}
res->res[res->num++] = r;
}
os_free(results);
return res;
}
/** /**
* wpa_supplicant_get_scan_results - Get scan results * wpa_supplicant_get_scan_results - Get scan results
* @wpa_s: Pointer to wpa_supplicant data * @wpa_s: Pointer to wpa_supplicant data
@ -1709,8 +1604,6 @@ int wpa_supplicant_get_scan_results(struct wpa_supplicant *wpa_s)
wpa_scan_results_free(wpa_s->scan_res); wpa_scan_results_free(wpa_s->scan_res);
if (wpa_s->drv_flags & WPA_DRIVER_FLAGS_USER_SPACE_MLME) if (wpa_s->drv_flags & WPA_DRIVER_FLAGS_USER_SPACE_MLME)
wpa_s->scan_res = ieee80211_sta_get_scan_results(wpa_s); wpa_s->scan_res = ieee80211_sta_get_scan_results(wpa_s);
else if (wpa_s->driver->get_scan_results2 == NULL)
wpa_s->scan_res = wpa_supplicant_get_scan_results_old(wpa_s);
else else
wpa_s->scan_res = wpa_drv_get_scan_results2(wpa_s); wpa_s->scan_res = wpa_drv_get_scan_results2(wpa_s);
if (wpa_s->scan_res == NULL) { if (wpa_s->scan_res == NULL) {