From owner-p4-projects@FreeBSD.ORG Tue Jan 2 07:26:33 2007 Return-Path: X-Original-To: p4-projects@freebsd.org Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 22C8416A40F; Tue, 2 Jan 2007 07:26:33 +0000 (UTC) X-Original-To: perforce@freebsd.org Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id A2B5216A403 for ; Tue, 2 Jan 2007 07:26:32 +0000 (UTC) (envelope-from kmacy@freebsd.org) Received: from repoman.freebsd.org (repoman.freebsd.org [69.147.83.41]) by mx1.freebsd.org (Postfix) with ESMTP id 873FF13C442 for ; Tue, 2 Jan 2007 07:26:32 +0000 (UTC) (envelope-from kmacy@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.13.6/8.13.6) with ESMTP id l027QWIx056038 for ; Tue, 2 Jan 2007 07:26:32 GMT (envelope-from kmacy@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.13.6/8.13.4/Submit) id l027QWfQ056035 for perforce@freebsd.org; Tue, 2 Jan 2007 07:26:32 GMT (envelope-from kmacy@freebsd.org) Date: Tue, 2 Jan 2007 07:26:32 GMT Message-Id: <200701020726.l027QWfQ056035@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to kmacy@freebsd.org using -f From: Kip Macy To: Perforce Change Reviews Cc: Subject: PERFORCE change 112415 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 02 Jan 2007 07:26:33 -0000 http://perforce.freebsd.org/chv.cgi?CH=112415 Change 112415 by kmacy@kmacy_serendipity:sam_wifi on 2007/01/02 07:26:15 remove the added ioctls for initiating and querying scan results - we new pass that back to the 802.11 stack when we're notified by the firmware not everything is formatted in the way the 802.11 layer expects it, but this a workable first cut Affected files ... .. //depot/projects/wifi/sys/dev/wi/if_wi.c#25 edit Differences ... ==== //depot/projects/wifi/sys/dev/wi/if_wi.c#25 (text+ko) ==== @@ -1335,57 +1335,17 @@ static int wi_ioctl_get(struct ifnet *ifp, u_long cmd, caddr_t data) { - int error, i, len; + int error; struct wi_softc *sc; struct ieee80211req *ireq; struct ieee80211com *ic; - struct wi_apinfo *ap; - struct ieee80211req_scan_result *sr, *bsr; - char *cp; - uint16_t *bssid; + + sc = ifp->if_softc; ic = &sc->sc_ic; ireq = (struct ieee80211req *) data; switch (ireq->i_type) { - case IEEE80211_IOC_SCAN_RESULTS: - sr = bsr = malloc(ireq->i_len, M_DEVBUF, M_NOWAIT | M_ZERO); - if (sr == NULL) { - error = ENOMEM; - break; - } - len = 0; - for (i = 0; i < sc->sc_naps; i++) { - ap = &sc->sc_aps[i]; - if (len + sizeof(*sr) + ap->namelen > ireq->i_len) - break; - bssid = (uint16_t *)&ap->bssid; - /* Lucent firmware will return empty records */ - if (bssid[0] == 0 && bssid[1] == 0 && bssid[2] == 0) - break; - - sr->isr_rssi = ap->signal; - sr->isr_freq = ieee80211_ieee2mhz(ap->channel, - IEEE80211_CHAN_B); - sr->isr_intval = ap->interval; - sr->isr_rates[0] = ap->rate; - sr->isr_nrates = 1; - sr->isr_ssid_len = ap->namelen; - sr->isr_ie_len = 0; - sr->isr_capinfo = ap->capinfo; /* XXX */ - sr->isr_noise = ap->noise; /* XXX */ - bcopy(ap->bssid, sr->isr_bssid, sizeof(sr->isr_bssid)); - cp = (char *)sr + sizeof(*sr); - bcopy(ap->name, cp, sr->isr_ssid_len); - cp += sr->isr_ssid_len; - sr->isr_len = roundup(sizeof(*sr) + sr->isr_ssid_len, - sizeof(uint32_t)); - len += sr->isr_len; - } - ireq->i_len = len; - error = copyout(bsr, ireq->i_data, len); - free(bsr, M_DEVBUF); - break; case IEEE80211_IOC_STATIONNAME: ireq->i_len = sc->sc_nodelen + 1; error = copyout(sc->sc_nodename, ireq->i_data, @@ -1418,11 +1378,6 @@ sc = ifp->if_softc; ireq = (struct ieee80211req *) data; switch (ireq->i_type) { - case IEEE80211_IOC_SCAN_REQ: - WI_LOCK(sc); - error = wi_scan_ap(sc, 0x3fff, 0x000f); - WI_UNLOCK(sc); - break; case IEEE80211_IOC_STATIONNAME: if (ireq->i_val != 0 || ireq->i_len > IEEE80211_NWID_LEN) { @@ -1962,8 +1917,9 @@ case WI_INFO_SCAN_RESULTS: case WI_INFO_HOST_SCAN_RESULTS: wi_scan_result(sc, fid, le16toh(ltbuf[0])); + ieee80211_notify_scan_done(ic); break; - + default: DPRINTF(("wi_info_intr: got fid %x type %x len %d\n", fid, le16toh(ltbuf[1]), le16toh(ltbuf[0]))); @@ -3079,6 +3035,16 @@ struct wi_scan_header ws_hdr; /* Prism2 header */ struct wi_scan_data_p2 ws_dat; /* Prism2 scantable*/ struct wi_apinfo *ap; + struct ieee80211_scanparams sp; + struct ieee80211_frame wh; + static long rstamp; + struct ieee80211com *ic; + uint8_t ssid[2+IEEE80211_NWID_LEN]; + + printf("wi_scan_result\n"); + ic = &sc->sc_ic; + rstamp++; + memset(&sp, 0, sizeof(sp)); off = sizeof(u_int16_t) * 2; memset(&ws_hdr, 0, sizeof(ws_hdr)); @@ -3108,25 +3074,44 @@ /* Read Data */ ap = sc->sc_aps; memset(&ws_dat, 0, sizeof(ws_dat)); + for (i = 0; i < naps; i++, ap++) { + uint8_t rates[2]; + uint16_t *bssid; wi_read_bap(sc, fid, off, &ws_dat, (sizeof(ws_dat) < szbuf ? sizeof(ws_dat) : szbuf)); DPRINTF2(("wi_scan_result: #%d: off %d bssid %s\n", i, off, ether_sprintf(ws_dat.wi_bssid))); + off += szbuf; - ap->scanreason = le16toh(ws_hdr.wi_reason); + ap->scanreason = le16toh(ws_hdr.wi_reason); memcpy(ap->bssid, ws_dat.wi_bssid, sizeof(ap->bssid)); - ap->channel = le16toh(ws_dat.wi_chid); + + bssid = (uint16_t *)&ap->bssid; + if (bssid[0] == 0 && bssid[1] == 0 && bssid[2] == 0) + break; + + memcpy(wh.i_addr2, ws_dat.wi_bssid, sizeof(ap->bssid)); + memcpy(wh.i_addr3, ws_dat.wi_bssid, sizeof(ap->bssid)); + sp.chan = ap->channel = le16toh(ws_dat.wi_chid); ap->signal = le16toh(ws_dat.wi_signal); ap->noise = le16toh(ws_dat.wi_noise); ap->quality = ap->signal - ap->noise; - ap->capinfo = le16toh(ws_dat.wi_capinfo); + sp.capinfo = ap->capinfo = le16toh(ws_dat.wi_capinfo); ap->interval = le16toh(ws_dat.wi_interval); - ap->rate = le16toh(ws_dat.wi_rate); + rates[0] = ap->rate = le16toh(ws_dat.wi_rate); + rates[1] = 0; ap->namelen = le16toh(ws_dat.wi_namelen); if (ap->namelen > sizeof(ap->name)) ap->namelen = sizeof(ap->name); memcpy(ap->name, ws_dat.wi_name, ap->namelen); + sp.ssid = (uint8_t *)&ssid[0]; + memcpy(sp.ssid + 2, ap->name, ap->namelen); + sp.ssid[1] = ap->namelen; + sp.rates = &rates[0]; + sp.tstamp = (uint8_t *)&rstamp; + printf("calling add_scan \n"); + ieee80211_add_scan(ic, &sp, &wh, 0, ap->signal, ap->noise, rstamp); } done: /* Done scanning */