summaryrefslogtreecommitdiff
path: root/sys/dev/ic/bwfm.c
diff options
context:
space:
mode:
authorPatrick Wildt <patrick@cvs.openbsd.org>2019-11-09 20:53:56 +0000
committerPatrick Wildt <patrick@cvs.openbsd.org>2019-11-09 20:53:56 +0000
commit32a75d434e1c74ac776c4cd21757ddbdd1834d44 (patch)
treed0711acfa2c14d4690cce66b9122cf5ce1345a8a /sys/dev/ic/bwfm.c
parentecdd943bee81f3d63ec4d1ffc1b36dbf72cd0dbf (diff)
Add support for active scan to bwfm(4). So far we only have done
passive scans, which works well enough as long as you don't use hidden networks. Even without hidden networks, using an active scan seems to be quicker and feels like it works better. ok stsp@
Diffstat (limited to 'sys/dev/ic/bwfm.c')
-rw-r--r--sys/dev/ic/bwfm.c35
1 files changed, 26 insertions, 9 deletions
diff --git a/sys/dev/ic/bwfm.c b/sys/dev/ic/bwfm.c
index 66cfd1e989d..43097a6f4db 100644
--- a/sys/dev/ic/bwfm.c
+++ b/sys/dev/ic/bwfm.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: bwfm.c,v 1.66 2019/10/28 12:26:46 patrick Exp $ */
+/* $OpenBSD: bwfm.c,v 1.67 2019/11/09 20:53:55 patrick Exp $ */
/*
* Copyright (c) 2010-2016 Broadcom Corporation
* Copyright (c) 2016,2017 Patrick Wildt <patrick@blueri.se>
@@ -1957,15 +1957,24 @@ bwfm_hostap(struct bwfm_softc *sc)
void
bwfm_scan(struct bwfm_softc *sc)
{
+ struct ieee80211com *ic = &sc->sc_ic;
struct bwfm_escan_params *params;
- uint32_t nssid = 0, nchannel = 0;
- size_t params_size;
+ uint32_t nssid = 0, nchan = 0;
+ size_t params_size, chan_size, ssid_size;
+ struct bwfm_ssid *ssid;
+
+ if (ic->ic_flags & IEEE80211_F_ASCAN &&
+ ic->ic_des_esslen && ic->ic_des_esslen < BWFM_MAX_SSID_LEN)
+ nssid = 1;
- params_size = sizeof(*params);
- params_size += sizeof(uint32_t) * ((nchannel + 1) / 2);
- params_size += sizeof(struct bwfm_ssid) * nssid;
+ chan_size = roundup(nchan * sizeof(uint16_t), sizeof(uint32_t));
+ ssid_size = sizeof(struct bwfm_ssid) * nssid;
+ params_size = sizeof(*params) + chan_size + ssid_size;
params = malloc(params_size, M_TEMP, M_WAITOK | M_ZERO);
+ ssid = (struct bwfm_ssid *)
+ (((uint8_t *)params) + sizeof(*params) + chan_size);
+
memset(params->scan_params.bssid, 0xff,
sizeof(params->scan_params.bssid));
params->scan_params.bss_type = 2;
@@ -1978,6 +1987,17 @@ bwfm_scan(struct bwfm_softc *sc)
params->action = htole16(WL_ESCAN_ACTION_START);
params->sync_id = htole16(0x1234);
+ if (ic->ic_flags & IEEE80211_F_ASCAN &&
+ ic->ic_des_esslen && ic->ic_des_esslen < BWFM_MAX_SSID_LEN) {
+ params->scan_params.scan_type = BWFM_SCANTYPE_ACTIVE;
+ ssid->len = htole32(ic->ic_des_esslen);
+ memcpy(ssid->ssid, ic->ic_des_essid, ic->ic_des_esslen);
+ }
+
+ params->scan_params.channel_num = htole32(
+ nssid << BWFM_CHANNUM_NSSID_SHIFT |
+ nchan << BWFM_CHANNUM_NCHAN_SHIFT);
+
#if 0
/* Scan a specific channel */
params->scan_params.channel_list[0] = htole16(
@@ -1986,9 +2006,6 @@ bwfm_scan(struct bwfm_softc *sc)
(2 & 0x3) << 10 |
(2 & 0x3) << 12
);
- params->scan_params.channel_num = htole32(
- (1 & 0xffff) << 0
- );
#endif
bwfm_fwvar_var_set_data(sc, "escan", params, params_size);