165
static int wpa_driver_broadcom_set_key(void *priv, wpa_alg alg,
165
static int wpa_driver_broadcom_set_key(const char *ifname, void *priv,
166
167
const u8 *addr, int key_idx, int set_tx,
167
168
const u8 *seq, size_t seq_len,
168
169
const u8 *key, size_t key_len)
256
258
wpa_printf(MSG_DEBUG, "BROADCOM: ASSOC MESSAGE (left: %d)",
259
data.assoc_info.resp_ies = os_malloc(left);
260
if (data.assoc_info.resp_ies == NULL)
261
resp_ies = os_malloc(left);
262
if (resp_ies == NULL)
262
os_memcpy(data.assoc_info.resp_ies,
263
buf + WL_WPA_HEADER_LEN, left);
264
os_memcpy(resp_ies, buf + WL_WPA_HEADER_LEN, left);
265
data.assoc_info.resp_ies = resp_ies;
264
266
data.assoc_info.resp_ies_len = left;
265
wpa_hexdump(MSG_MSGDUMP, "BROADCOM: copying %d bytes "
267
data.assoc_info.resp_ies, left);
269
/* data.assoc_info.req_ies = NULL; */
270
/* data.assoc_info.req_ies_len = 0; */
272
wpa_supplicant_event(ctx, EVENT_ASSOCINFO, &data);
273
wpa_supplicant_event(ctx, EVENT_ASSOC, NULL);
269
wpa_supplicant_event(ctx, EVENT_ASSOC, &data);
275
272
case WLC_DISASSOC_MSG:
276
273
wpa_printf(MSG_DEBUG, "BROADCOM: DISASSOC MESSAGE");
355
352
static void wpa_driver_broadcom_deinit(void *priv)
357
354
struct wpa_driver_broadcom_data *drv = priv;
355
wpa_driver_broadcom_set_wpa(drv, 0);
358
356
eloop_cancel_timeout(wpa_driver_broadcom_scan_timeout, drv, drv->ctx);
359
357
eloop_unregister_read_sock(drv->event_sock);
360
358
close(drv->event_sock);
380
378
struct wpa_driver_broadcom_data *drv = priv;
381
379
/* SET_EAP_RESTRICT, SET_WEP_RESTRICT */
382
int restrict = (enabled ? 1 : 0);
380
int _restrict = (enabled ? 1 : 0);
384
382
if (broadcom_ioctl(drv, WLC_SET_WEP_RESTRICT,
385
&restrict, sizeof(restrict)) < 0 ||
383
&_restrict, sizeof(_restrict)) < 0 ||
386
384
broadcom_ioctl(drv, WLC_SET_EAP_RESTRICT,
387
&restrict, sizeof(restrict)) < 0)
385
&_restrict, sizeof(_restrict)) < 0)
397
395
wpa_supplicant_event(timeout_ctx, EVENT_SCAN_RESULTS, NULL);
400
static int wpa_driver_broadcom_scan(void *priv, const u8 *ssid,
398
static int wpa_driver_broadcom_scan(void *priv,
399
struct wpa_driver_scan_params *params)
403
401
struct wpa_driver_broadcom_data *drv = priv;
404
402
wlc_ssid_t wst = { 0, "" };
403
const u8 *ssid = params->ssids[0].ssid;
404
size_t ssid_len = params->ssids[0].ssid_len;
406
406
if (ssid && ssid_len > 0 && ssid_len <= sizeof(wst.SSID)) {
407
407
wst.SSID_len = ssid_len;
431
431
/* u16 version; */
432
432
} __attribute__ ((packed));
435
wpa_driver_broadcom_get_scan_results(void *priv,
436
struct wpa_scan_result *results,
434
static struct wpa_scan_results *
435
wpa_driver_broadcom_get_scan_results(void *priv)
439
437
struct wpa_driver_broadcom_data *drv = priv;
441
439
wl_scan_results_t *wsr;
442
440
wl_bss_info_t *wbi;
442
struct wpa_scan_results *res;
445
444
buf = os_malloc(WLC_IOCTL_MAXLEN);
449
448
wsr = (wl_scan_results_t *) buf;
455
454
if (broadcom_ioctl(drv, WLC_SCAN_RESULTS, buf, WLC_IOCTL_MAXLEN) < 0) {
460
os_memset(results, 0, max_size * sizeof(struct wpa_scan_result));
459
res = os_zalloc(sizeof(*res));
465
res->res = os_zalloc(wsr->count * sizeof(struct wpa_scan_res *));
466
if (res->res == NULL) {
462
472
for (ap_num = 0, wbi = wsr->bss_info; ap_num < wsr->count; ++ap_num) {
464
struct bss_ie_hdr *ie;
466
os_memcpy(results[ap_num].bssid, &wbi->BSSID, ETH_ALEN);
467
os_memcpy(results[ap_num].ssid, wbi->SSID, wbi->SSID_len);
468
results[ap_num].ssid_len = wbi->SSID_len;
469
results[ap_num].freq = frequency_list[wbi->channel - 1];
473
struct wpa_scan_res *r;
474
r = os_malloc(sizeof(*r) + wbi->ie_length);
477
res->res[res->num++] = r;
479
os_memcpy(r->bssid, &wbi->BSSID, ETH_ALEN);
480
r->freq = frequency_list[wbi->channel - 1];
471
wpa_hexdump(MSG_MSGDUMP, "BROADCOM: AP IEs",
472
(u8 *) wbi + sizeof(*wbi), wbi->ie_length);
473
ie = (struct bss_ie_hdr *) ((u8 *) wbi + sizeof(*wbi));
474
for (left = wbi->ie_length; left > 0;
475
left -= (ie->len + 2), ie = (struct bss_ie_hdr *)
476
((u8 *) ie + 2 + ie->len)) {
477
wpa_printf(MSG_MSGDUMP, "BROADCOM: IE: id:%x, len:%d",
478
ie->elem_id, ie->len);
480
wpa_printf(MSG_MSGDUMP,
481
"BROADCOM: oui:%02x%02x%02x",
482
ie->oui[0], ie->oui[1], ie->oui[2]);
483
if (ie->elem_id != 0xdd ||
485
os_memcmp(ie->oui, WPA_OUI, 3) != 0)
487
os_memcpy(results[ap_num].wpa_ie, ie, ie->len + 2);
488
results[ap_num].wpa_ie_len = ie->len + 2;
482
os_memcpy(r + 1, wbi + 1, wbi->ie_length);
483
r->ie_len = wbi->ie_length;
492
485
wbi = (wl_bss_info_t *) ((u8 *) wbi + wbi->length);
518
511
struct wpa_driver_broadcom_data *drv = priv;
519
return broadcom_ioctl(drv, WLC_DISASSOC, 0, 0);
512
return broadcom_ioctl(drv, WLC_DISASSOC, NULL, 0);
528
ret = wpa_driver_broadcom_set_drop_unencrypted(
529
drv, params->drop_unencrypted);
534
531
s.SSID_len = params->ssid_len;
535
532
os_memcpy(s.SSID, params->ssid, params->ssid_len);
590
587
.desc = "Broadcom wl.o driver",
591
588
.get_bssid = wpa_driver_broadcom_get_bssid,
592
589
.get_ssid = wpa_driver_broadcom_get_ssid,
593
.set_wpa = wpa_driver_broadcom_set_wpa,
594
590
.set_key = wpa_driver_broadcom_set_key,
595
591
.init = wpa_driver_broadcom_init,
596
592
.deinit = wpa_driver_broadcom_deinit,
597
593
.set_countermeasures = wpa_driver_broadcom_set_countermeasures,
598
.set_drop_unencrypted = wpa_driver_broadcom_set_drop_unencrypted,
599
.scan = wpa_driver_broadcom_scan,
600
.get_scan_results = wpa_driver_broadcom_get_scan_results,
594
.scan2 = wpa_driver_broadcom_scan,
595
.get_scan_results2 = wpa_driver_broadcom_get_scan_results,
601
596
.deauthenticate = wpa_driver_broadcom_deauthenticate,
602
597
.disassociate = wpa_driver_broadcom_disassociate,
603
598
.associate = wpa_driver_broadcom_associate,