Please note: This project is no longer active. The website is kept online for historic purposes only.
If you´re looking for a Linux driver for your Atheros WLAN device, you should continue here .

Ticket #275: active-scan-20060305.patch

File active-scan-20060305.patch, 2.7 kB (added by anonymous, 14 years ago)
  • madwifi-ng/net80211/ieee80211_wireless.c

    old new  
    4747#include <linux/netdevice.h> 
    4848#include <linux/utsname.h> 
    4949#include <linux/if_arp.h>               /* XXX for ARPHRD_ETHER */ 
     50#include <linux/delay.h> 
    5051#include <net/iw_handler.h> 
    5152 
    5253#if WIRELESS_EXT < 14 
     
    116117        iq->level = iq->noise + iq->qual; 
    117118        iq->updated = IW_QUAL_ALL_UPDATED; 
    118119} 
     120 
     121static void 
     122preempt_scan(struct net_device *dev, int max_grace, int max_wait) 
     123{ 
     124        struct ieee80211vap *vap = dev->priv; 
     125        struct ieee80211com *ic = vap->iv_ic; 
     126        int total_delay = 0; 
     127        int cancelled = 0, ready = 0; 
     128        while (!ready && total_delay < max_grace + max_wait) { 
     129          if ((ic->ic_flags & IEEE80211_F_SCAN) == 0) { 
     130            ready = 1; 
     131          } else { 
     132            if (!cancelled && total_delay > max_grace) { 
     133              /*  
     134                 Cancel any existing active scan, so that any new parameters 
     135                 in this scan ioctl (or the defaults) can be honored, then 
     136                 wait around a while to see if the scan cancels properly. 
     137              */ 
     138              IEEE80211_DPRINTF(vap, IEEE80211_MSG_SCAN, 
     139                                "%s: cancel pending scan request\n", __func__); 
     140              (void) ieee80211_cancel_scan(vap); 
     141              cancelled = 1; 
     142            } 
     143            mdelay (10); 
     144            total_delay += 10; 
     145          } 
     146        } 
     147        if (!ready) { 
     148          IEEE80211_DPRINTF(vap, IEEE80211_MSG_SCAN,  
     149                            "%s: Timeout cancelling current scan.\n",  
     150                            __func__);  
     151        } 
     152} 
    119153         
    120154static struct iw_statistics * 
    121155ieee80211_iw_getstats(struct net_device *dev) 
     
    13581392        /* XXX always manual... */ 
    13591393        IEEE80211_DPRINTF(vap, IEEE80211_MSG_SCAN, 
    13601394                "%s: active scan request\n", __func__); 
     1395        preempt_scan(dev, 100, 100); 
     1396#if WIRELESS_EXT > 17 
     1397        if (data && (data->flags & IW_SCAN_THIS_ESSID)) { 
     1398                struct iw_scan_req req; 
     1399                struct ieee80211_scan_ssid ssid; 
     1400                int copyLength; 
     1401                IEEE80211_DPRINTF(vap, IEEE80211_MSG_SCAN, 
     1402                        "%s: SCAN_THIS_ESSID requested\n", __func__); 
     1403                if (data->length > sizeof req) { 
     1404                        copyLength = sizeof req; 
     1405                } else { 
     1406                        copyLength = data->length; 
     1407                } 
     1408                memset(&req, 0, sizeof req); 
     1409                if (copy_from_user(&req, data->pointer, copyLength)) 
     1410                        return -EFAULT; 
     1411                memcpy(&ssid.ssid, req.essid, sizeof ssid.ssid); 
     1412                ssid.len = req.essid_len; 
     1413                IEEE80211_DPRINTF(vap, IEEE80211_MSG_SCAN, 
     1414                                  "%s: requesting scan of essid '%s'\n", __func__, ssid.ssid); 
     1415                (void) ieee80211_start_scan(vap, 
     1416                        IEEE80211_SCAN_ACTIVE | 
     1417                        IEEE80211_SCAN_NOPICK | 
     1418                        IEEE80211_SCAN_ONCE, IEEE80211_SCAN_FOREVER, 
     1419                        1, &ssid); 
     1420                return 0; 
     1421        } 
     1422#endif            
    13611423        (void) ieee80211_start_scan(vap, IEEE80211_SCAN_ACTIVE | 
    13621424                IEEE80211_SCAN_NOPICK | IEEE80211_SCAN_ONCE, 
    13631425                IEEE80211_SCAN_FOREVER,