[iwmgmt] Make iwlist preserve existing associations, and be non-active
authorJoshua Oreman <oremanj@xenon.get-linux.org>
Fri, 19 Jun 2009 19:34:08 +0000 (12:34 -0700)
committerJoshua Oreman <oremanj@xenon.get-linux.org>
Fri, 19 Jun 2009 19:34:08 +0000 (12:34 -0700)
If the 802.11 device is already open, iwlist will record its channel
before starting and switch back to that channel after the scan.

Active broadcast scanning simply doesn't work as well as passive, in my
experience. It's also difficult to see whether we can legally do it when
using an existing association, so remove it.

src/include/usr/iwmgmt.h
src/usr/iwmgmt.c

index f7becff..8a52f03 100644 (file)
@@ -12,7 +12,7 @@ FILE_LICENCE ( GPL2_OR_LATER );
 struct net80211_device;
 
 extern void iwstat ( struct net80211_device *dev );
-extern int iwlist ( struct net80211_device *dev, int active );
+extern int iwlist ( struct net80211_device *dev );
 extern void iwassoc ( struct net80211_device *dev );
 
 #endif /* _USR_IWMGMT_H */
index a603fbb..1676285 100644 (file)
@@ -106,7 +106,7 @@ static const char *auth_types[] = {
  * @v dev      802.11 device
  * @v active   Whether to use active scanning
  */
-int iwlist ( struct net80211_device *dev, int active ) {
+int iwlist ( struct net80211_device *dev ) {
        struct net80211_probe_ctx *ctx;
        struct list_head *networks;
        struct net80211_wlan *wlan;
@@ -114,10 +114,7 @@ int iwlist ( struct net80211_device *dev, int active ) {
        int rc;
        unsigned i;
        int was_opened = dev->netdev->state & NETDEV_OPEN;
-       int bands = dev->hw->bands;
-
-       if ( active )
-               bands &= NET80211_BAND_2GHZ;
+       int was_channel = dev->channels[dev->channel].channel_nr;
 
        if ( ! was_opened ) {
                dev->state |= NET80211_NO_ASSOC;
@@ -131,11 +128,13 @@ int iwlist ( struct net80211_device *dev, int active ) {
                goto err_close_netdev;
        }
 
-       rc = net80211_prepare_probe ( dev, dev->hw->bands, active );
-       if ( rc < 0 )
-               goto err_close_netdev;
+       if ( ! was_opened ) {
+               rc = net80211_prepare_probe ( dev, dev->hw->bands, 0 );
+               if ( rc < 0 )
+                       goto err_close_netdev;
+       }
 
-       ctx = net80211_probe_start ( dev, "", active );
+       ctx = net80211_probe_start ( dev, "", 0 );
        if ( ! ctx ) {
                rc = -ENOMEM;
                goto err_close_netdev;
@@ -151,6 +150,8 @@ int iwlist ( struct net80211_device *dev, int active ) {
                goto err_free_networks;
        }
 
+       rc = 0;
+
        printf ( "Networks on %s:\n\n", dev->netdev->name );
 
        /* Output format:
@@ -194,22 +195,20 @@ int iwlist ( struct net80211_device *dev, int active ) {
        }
        printf ( "\n" );
 
+ err_free_networks:
        net80211_free_wlanlist ( networks );
 
+ err_close_netdev:
        if ( ! was_opened ) {
                dev->state &= ~NET80211_NO_ASSOC;
                netdev_close ( dev->netdev );
+       } else {
+               net80211_change_channel ( dev, was_channel );
        }
 
-       return 0;
+       if ( ! rc )
+               return 0;
 
- err_free_networks:
-       net80211_free_wlanlist ( networks );
- err_close_netdev:
-       if ( ! was_opened ) {
-               dev->state &= ~NET80211_NO_ASSOC;
-               netdev_close ( dev->netdev );
-       }
  err:
        printf ( "Scanning for networks on %s: %s\n",
                 dev->netdev->name, strerror ( rc ) );