[iwmgmt] Make iwlist preserve existing associations, and be non-active
[people/oremanj/gpxe.git] / src / usr / iwmgmt.c
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 ) );