This adds support for continuously scanning. Also it alows to specify
the scan inteval and the pruning time at runtime.

Signed-off-by: Daniel Wagner <w...@monom.org>
---
The idea behind this patch is to be able to recognize AP a bit faster then
the standard algorithm in NM. I'm not completely sure where this continuously
scaning code should go. Propably all that should be handled by wpa_supplicant?

If you don't like this patch, no problem with me. In case you like it I guess
some more work is needed. For example I really don't know how you get those
interesting tab-space indentions. :) 

 include/NetworkManager.h         |    8 ++
 introspection/nm-device-wifi.xml |   16 +++
 libnm-glib/nm-device-wifi.c      |  203 ++++++++++++++++++++++++++++++++++++++
 libnm-glib/nm-device-wifi.h      |   12 +++
 src/nm-device-wifi.c             |  164 ++++++++++++++++++++++++++-----
 src/nm-device-wifi.h             |    3 +
 6 files changed, 380 insertions(+), 26 deletions(-)

diff --git a/include/NetworkManager.h b/include/NetworkManager.h
index d61a89c..380d896 100644
--- a/include/NetworkManager.h
+++ b/include/NetworkManager.h
@@ -141,6 +141,14 @@ typedef enum {
        NM_802_11_MODE_INFRA
 } NM80211Mode;
 
+/*
+ * 802.11 Scan mode behaviour
+ *
+ */
+typedef enum {
+       NM_802_11_SCAN_MODE_DEFAULT = 0,
+       NM_802_11_SCAN_MODE_CONTINUOUSLY, 
+} NM80211ScanMode;
 
 /*
  * Device states
diff --git a/introspection/nm-device-wifi.xml b/introspection/nm-device-wifi.xml
index 21ace0a..55d4135 100644
--- a/introspection/nm-device-wifi.xml
+++ b/introspection/nm-device-wifi.xml
@@ -41,6 +41,22 @@
       </tp:docstring>
     </property>
 
+    <property name="WirelessScanMode" type="u" access="readwrite">
+      <tp:docstring>
+       Scan mode.
+      </tp:docstring>
+    </property>
+    <property name="WirelessScanInterval" type="u" access="readwrite">
+      <tp:docstring>
+       Scan interval value in seconds.
+      </tp:docstring>
+    </property>
+    <property name="WirelessScanPrune" type="u" access="readwrite">
+      <tp:docstring>
+       Scan prune value in seconds.
+      </tp:docstring>
+    </property>
+
     <signal name="PropertiesChanged">
         <arg name="properties" type="a{sv}" tp:type="String_Variant_Map">
             <tp:docstring>
diff --git a/libnm-glib/nm-device-wifi.c b/libnm-glib/nm-device-wifi.c
index 1729c8a..dde76d1 100644
--- a/libnm-glib/nm-device-wifi.c
+++ b/libnm-glib/nm-device-wifi.c
@@ -51,6 +51,9 @@ typedef struct {
        gboolean null_active_ap;
        guint32 wireless_caps;
        GPtrArray *aps;
+       guint scan_mode;
+       guint scan_interval;      /* seconds */
+       guint scan_prune;         /* seconds */
 
        gboolean wireless_enabled;
 } NMDeviceWifiPrivate;
@@ -62,6 +65,9 @@ enum {
        PROP_BITRATE,
        PROP_ACTIVE_ACCESS_POINT,
        PROP_WIRELESS_CAPABILITIES,
+       PROP_WIRELESS_SCAN_MODE,
+       PROP_WIRELESS_SCAN_INTERVAL,
+       PROP_WIRELESS_SCAN_PRUNE,
 
        LAST_PROP
 };
@@ -71,6 +77,9 @@ enum {
 #define DBUS_PROP_BITRATE "Bitrate"
 #define DBUS_PROP_ACTIVE_ACCESS_POINT "ActiveAccessPoint"
 #define DBUS_PROP_WIRELESS_CAPABILITIES "WirelessCapabilities"
+#define DBUS_PROP_WIRELESS_SCAN_MODE "WirelessScanMode"
+#define DBUS_PROP_WIRELESS_SCAN_INTERVAL "WirelessScanInterval"
+#define DBUS_PROP_WIRELESS_SCAN_PRUNE "WirelessScanPrune"
 
 enum {
        ACCESS_POINT_ADDED,
@@ -218,6 +227,138 @@ nm_device_wifi_get_capabilities (NMDeviceWifi *device)
 }
 
 /**
+ * nm_device_wifi_get_scan_mode:
+ * @device: a #NMDeviceWifi
+ *
+ * Gets the wireless scan mode of the #NMDeviceWifi.
+ *
+ * Returns: the wireless scan mode
+ **/
+guint32
+nm_device_wifi_get_scan_mode (NMDeviceWifi *device)
+{
+       NMDeviceWifiPrivate *priv;
+
+       g_return_val_if_fail (NM_IS_DEVICE_WIFI (device), 0);
+
+       priv = NM_DEVICE_WIFI_GET_PRIVATE (device);
+       priv->scan_mode = _nm_object_get_uint_property (NM_OBJECT (device),
+                                                                               
                        NM_DBUS_INTERFACE_DEVICE_WIRELESS,
+                                                                               
                        DBUS_PROP_WIRELESS_SCAN_MODE);
+       return priv->scan_mode;
+}
+
+/**
+ * nm_device_wifi_get_scan_interval:
+ * @device: a #NMDeviceWifi
+ *
+ * Gets the wireless scan interval of the #NMDeviceWifi.
+ *
+ * Returns: the wireless scan interval
+ **/
+guint32
+nm_device_wifi_get_scan_interval (NMDeviceWifi *device)
+{
+       NMDeviceWifiPrivate *priv;
+
+       g_return_val_if_fail (NM_IS_DEVICE_WIFI (device), 0);
+
+       priv = NM_DEVICE_WIFI_GET_PRIVATE (device);
+       priv->scan_interval = _nm_object_get_uint_property (NM_OBJECT (device),
+                                                                               
                                NM_DBUS_INTERFACE_DEVICE_WIRELESS,
+                                                                               
                                DBUS_PROP_WIRELESS_SCAN_INTERVAL);
+       return priv->scan_interval;
+}
+
+/**
+ * nm_device_wifi_get_scan_prune:
+ * @device: a #NMDeviceWifi
+ *
+ * Gets the wireless scan prune of the #NMDeviceWifi.
+ *
+ * Returns: the wireless scan prune
+ **/
+guint32
+nm_device_wifi_get_scan_prune (NMDeviceWifi *device)
+{
+       NMDeviceWifiPrivate *priv;
+
+       g_return_val_if_fail (NM_IS_DEVICE_WIFI (device), 0);
+
+       priv = NM_DEVICE_WIFI_GET_PRIVATE (device);
+       priv->scan_prune = _nm_object_get_uint_property (NM_OBJECT (device),
+                                                                               
                         NM_DBUS_INTERFACE_DEVICE_WIRELESS,
+                                                                               
                         DBUS_PROP_WIRELESS_SCAN_PRUNE);
+       return priv->scan_prune;
+}
+
+/**
+ * nm_device_wifi_set_scan_interval:
+ * @device: a #NMDeviceWifi
+ *
+ * Sets the wireless scan interval of the #NMDeviceWifi.
+ **/
+void nm_device_wifi_set_scan_interval (NMDeviceWifi *device, const GValue 
*value)
+{
+       NMDeviceWifiPrivate *priv;
+       GValue val = {0,};
+       g_return_if_fail (NM_IS_DEVICE_WIFI (device));
+       priv = NM_DEVICE_WIFI_GET_PRIVATE (device);
+
+       priv->scan_interval = g_value_get_uint(value);
+
+       g_value_copy (value, &val);
+       _nm_object_set_property (NM_OBJECT(device),
+                                                        
NM_DBUS_INTERFACE_DEVICE_WIRELESS,
+                                                        
DBUS_PROP_WIRELESS_SCAN_INTERVAL,
+                                                        &val);
+}
+
+/**
+ * nm_device_wifi_set_scan_mode:
+ * @device: a #NMDeviceWifi
+ *
+ * Sets the wireless scan mode of the #NMDeviceWifi.
+ **/
+void nm_device_wifi_set_scan_mode (NMDeviceWifi *device, const GValue *value)
+{
+       NMDeviceWifiPrivate *priv;
+       GValue val = {0,};
+       g_return_if_fail (NM_IS_DEVICE_WIFI (device));
+       priv = NM_DEVICE_WIFI_GET_PRIVATE (device);
+
+       priv->scan_interval = g_value_get_uint(value);
+
+       g_value_copy (value, &val);
+       _nm_object_set_property (NM_OBJECT(device),
+                                                        
NM_DBUS_INTERFACE_DEVICE_WIRELESS,
+                                                        
DBUS_PROP_WIRELESS_SCAN_MODE,
+                                                        &val);
+}
+
+/**
+ * nm_device_wifi_set_scan_prune:
+ * @device: a #NMDeviceWifi
+ *
+ * Sets the wireless scan prune of the #NMDeviceWifi.
+ **/
+void nm_device_wifi_set_scan_prune (NMDeviceWifi *device, const GValue *value)
+{
+       NMDeviceWifiPrivate *priv;
+       GValue val = {0,};
+       g_return_if_fail (NM_IS_DEVICE_WIFI (device));
+       priv = NM_DEVICE_WIFI_GET_PRIVATE (device);
+
+       priv->scan_prune = g_value_get_uint(value);
+
+       g_value_copy (value, &val);
+       _nm_object_set_property (NM_OBJECT(device),
+                                                        
NM_DBUS_INTERFACE_DEVICE_WIRELESS,
+                                                        
DBUS_PROP_WIRELESS_SCAN_PRUNE,
+                                                        &val);
+}
+
+/**
  * nm_device_wifi_get_active_access_point:
  * @device: a #NMDeviceWifi
  *
@@ -476,6 +617,25 @@ get_property (GObject *object,
        case PROP_WIRELESS_CAPABILITIES:
                g_value_set_uint (value, nm_device_wifi_get_capabilities 
(self));
                break;
+       case PROP_WIRELESS_SCAN_INTERVAL:
+               g_value_set_uint (value, nm_device_wifi_get_scan_interval 
(self));
+               break;
+       default:
+               G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+               break;
+       }
+}
+
+static void
+set_property (GObject *object, guint prop_id,
+                         const GValue *value, GParamSpec *pspec)
+{
+       NMDeviceWifi *self = NM_DEVICE_WIFI (object);
+
+       switch (prop_id) {
+       case PROP_WIRELESS_SCAN_INTERVAL:
+               nm_device_wifi_set_scan_interval (self, value);
+               break;
        default:
                G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
                break;
@@ -559,6 +719,9 @@ register_for_property_changed (NMDeviceWifi *device)
                { NM_DEVICE_WIFI_BITRATE,             
_nm_object_demarshal_generic, &priv->rate },
                { NM_DEVICE_WIFI_ACTIVE_ACCESS_POINT, demarshal_active_ap,      
   &priv->active_ap },
                { NM_DEVICE_WIFI_CAPABILITIES,        
_nm_object_demarshal_generic, &priv->wireless_caps },
+               { NM_DEVICE_WIFI_SCAN_MODE,           
_nm_object_demarshal_generic, &priv->scan_mode },
+               { NM_DEVICE_WIFI_SCAN_INTERVAL,       
_nm_object_demarshal_generic, &priv->scan_interval },
+               { NM_DEVICE_WIFI_SCAN_PRUNE,          
_nm_object_demarshal_generic, &priv->scan_prune },
                { NULL },
        };
 
@@ -651,6 +814,7 @@ nm_device_wifi_class_init (NMDeviceWifiClass *device_class)
        /* virtual methods */
        object_class->constructor = constructor;
        object_class->get_property = get_property;
+       object_class->set_property = set_property;
        object_class->dispose = dispose;
        object_class->finalize = finalize;
 
@@ -721,6 +885,45 @@ nm_device_wifi_class_init (NMDeviceWifiClass *device_class)
                                    0, G_MAXUINT32, 0,
                                    G_PARAM_READABLE));
 
+       /**
+        * NMDeviceWifi:wireless-scan-mode:
+        *
+        * The wireless scan mode
+        **/
+       g_object_class_install_property
+               (object_class, PROP_WIRELESS_SCAN_MODE,
+                g_param_spec_uint (NM_DEVICE_WIFI_SCAN_MODE,
+                                                       "Wireless Scan Mode",
+                                                       "Wireless Scan Mode",
+                                                       0, G_MAXUINT32, 0,
+                                                       G_PARAM_READWRITE));
+
+       /**
+        * NMDeviceWifi:wireless-scan-interval:
+        *
+        * The wireless scan interval
+        **/
+       g_object_class_install_property
+               (object_class, PROP_WIRELESS_SCAN_INTERVAL,
+                g_param_spec_uint (NM_DEVICE_WIFI_SCAN_INTERVAL,
+                                           "Wireless Scan Interval",
+                                           "Wireless Scan Interval",
+                                           0, G_MAXUINT32, 0,
+                                           G_PARAM_READWRITE));
+
+       /**
+        * NMDeviceWifi:wireless-scan-prune:
+        *
+        * The wireless scan prune
+        **/
+       g_object_class_install_property
+               (object_class, PROP_WIRELESS_SCAN_PRUNE,
+                g_param_spec_uint (NM_DEVICE_WIFI_SCAN_PRUNE,
+                                           "Wireless Scan Prune",
+                                           "Wireless Scan Prunde",
+                                           0, G_MAXUINT32, 0,
+                                           G_PARAM_READWRITE));
+
        /* signals */
 
        /**
diff --git a/libnm-glib/nm-device-wifi.h b/libnm-glib/nm-device-wifi.h
index 69e6dd7..0b23a43 100644
--- a/libnm-glib/nm-device-wifi.h
+++ b/libnm-glib/nm-device-wifi.h
@@ -41,6 +41,9 @@ G_BEGIN_DECLS
 #define NM_DEVICE_WIFI_BITRATE             "bitrate"
 #define NM_DEVICE_WIFI_ACTIVE_ACCESS_POINT "active-access-point"
 #define NM_DEVICE_WIFI_CAPABILITIES        "wireless-capabilities"
+#define NM_DEVICE_WIFI_SCAN_MODE           "wireless-scan-mode"
+#define NM_DEVICE_WIFI_SCAN_INTERVAL       "wireless-scan-interval"
+#define NM_DEVICE_WIFI_SCAN_PRUNE          "wireless-scan-prune"
 
 typedef struct {
        NMDevice parent;
@@ -62,6 +65,15 @@ const char *    nm_device_wifi_get_hw_address           
(NMDeviceWifi *device);
 NM80211Mode     nm_device_wifi_get_mode                 (NMDeviceWifi *device);
 guint32         nm_device_wifi_get_bitrate              (NMDeviceWifi *device);
 guint32         nm_device_wifi_get_capabilities         (NMDeviceWifi *device);
+guint32         nm_device_wifi_get_scan_mode            (NMDeviceWifi *device);
+guint32         nm_device_wifi_get_scan_interval        (NMDeviceWifi *device);
+guint32         nm_device_wifi_get_scan_prune           (NMDeviceWifi *device);
+void            nm_device_wifi_set_scan_mode            (NMDeviceWifi *device, 
+                                                                               
                                 const GValue *value);
+void            nm_device_wifi_set_scan_interval        (NMDeviceWifi *device, 
+                                                                               
                                 const GValue *value);
+void            nm_device_wifi_set_scan_prune           (NMDeviceWifi *device, 
+                                                                               
                                 const GValue *value);
 NMAccessPoint * nm_device_wifi_get_active_access_point  (NMDeviceWifi *device);
 
 NMAccessPoint * nm_device_wifi_get_access_point_by_path (NMDeviceWifi *device,
diff --git a/src/nm-device-wifi.c b/src/nm-device-wifi.c
index d7cc2f3..f1ff9b8 100644
--- a/src/nm-device-wifi.c
+++ b/src/nm-device-wifi.c
@@ -64,6 +64,8 @@ static gboolean impl_device_get_access_points (NMDeviceWifi 
*device,
 #define SCAN_INTERVAL_MIN 0
 #define SCAN_INTERVAL_STEP 20
 #define SCAN_INTERVAL_MAX 120
+#define SCAN_PRUNE (SCAN_INTERVAL_MAX * 3)
+#define SCAN_MODE NM_802_11_SCAN_MODE_DEFAULT
 
 #define WIRELESS_SECRETS_TRIES "wireless-secrets-tries"
 
@@ -80,6 +82,9 @@ enum {
        PROP_BITRATE,
        PROP_ACTIVE_ACCESS_POINT,
        PROP_CAPABILITIES,
+       PROP_WIRELESS_SCAN_MODE,
+       PROP_WIRELESS_SCAN_INTERVAL,
+       PROP_WIRELESS_SCAN_PRUNE,
 
        LAST_PROP
 };
@@ -155,8 +160,10 @@ struct _NMDeviceWifiPrivate
        
        gboolean                        scanning;
        glong                   scheduled_scan_time;
-       guint8                  scan_interval; /* seconds */
        guint               pending_scan_id;
+       NM80211ScanMode scan_mode;
+       guint                   scan_interval;      /* seconds */
+       guint           scan_prune;         /* seconds */
 
        Supplicant      supplicant;
 
@@ -221,6 +228,10 @@ static void supplicant_mgr_state_cb (NMSupplicantInterface 
* iface,
 static guint32 nm_device_wifi_get_bitrate (NMDeviceWifi *self);
 
 
+static gboolean nm_device_wifi_set_scan_mode(NMDeviceWifi *self, 
NM80211ScanMode mode);
+static gboolean nm_device_wifi_set_scan_interval(NMDeviceWifi *self, guint 
ival);
+static gboolean nm_device_wifi_set_scan_prune(NMDeviceWifi *self, guint prune);
+
 static GQuark
 nm_wifi_error_quark (void)
 {
@@ -686,8 +697,11 @@ supplicant_interface_release (NMDeviceWifi *self)
 
        cancel_pending_scan (self);
 
-       /* Reset the scan interval to be pretty frequent when disconnected */
-       priv->scan_interval = SCAN_INTERVAL_MIN + SCAN_INTERVAL_STEP;
+       if (priv->scan_mode == NM_802_11_SCAN_MODE_DEFAULT) {
+               /* Reset the scan interval to be pretty frequent when 
disconnected */
+               priv->scan_interval = SCAN_INTERVAL_MIN + SCAN_INTERVAL_STEP;
+               priv->scan_prune = SCAN_PRUNE;
+       }
 
        remove_supplicant_interface_error_handler (self);
 
@@ -1711,33 +1725,38 @@ schedule_scan (NMDeviceWifi *self, gboolean backoff)
        }
 
        if (!priv->pending_scan_id) {
-               guint factor = 2;
+               if (priv->scan_mode == NM_802_11_SCAN_MODE_DEFAULT) {
+                       guint factor = 2;
 
-               if (    nm_device_is_activating (NM_DEVICE (self))
-                   || (nm_device_get_state (NM_DEVICE (self)) == 
NM_DEVICE_STATE_ACTIVATED))
-                       factor = 1;
+                       if (    nm_device_is_activating (NM_DEVICE (self))
+                                       || (nm_device_get_state (NM_DEVICE 
(self)) == NM_DEVICE_STATE_ACTIVATED))
+                               factor = 1;
 
-               priv->pending_scan_id = g_timeout_add (priv->scan_interval * 
1000,
-                                                                               
           request_wireless_scan,
-                                                                               
           self);
+                       priv->pending_scan_id = g_timeout_add 
(priv->scan_interval * 1000,
+                                                                               
                   request_wireless_scan,
+                                                                               
                   self);
 
-               priv->scheduled_scan_time = now.tv_sec + priv->scan_interval;
-               if (backoff && (priv->scan_interval < (SCAN_INTERVAL_MAX / 
factor))) {
+                       priv->scheduled_scan_time = now.tv_sec + 
priv->scan_interval;
+                       if (backoff && (priv->scan_interval < 
(SCAN_INTERVAL_MAX / factor))) {
                                priv->scan_interval += (SCAN_INTERVAL_STEP / 
factor);
                                /* Ensure the scan interval will never be less 
than 20s... */
                                priv->scan_interval = MAX(priv->scan_interval, 
SCAN_INTERVAL_MIN + SCAN_INTERVAL_STEP);
                                /* ... or more than 120s */
                                priv->scan_interval = MIN(priv->scan_interval, 
SCAN_INTERVAL_MAX);
-               } else if (!backoff && (priv->scan_interval == 0)) {
-                       /* Invalid combination; would cause continual 
rescheduling of
-                        * the scan and hog CPU.  Reset to something minimally 
sane.
-                        */
-                       priv->scan_interval = 5;
+                       } else if (!backoff && (priv->scan_interval == 0)) {
+                               /* Invalid combination; would cause continual 
rescheduling of
+                                * the scan and hog CPU.  Reset to something 
minimally sane.
+                                */
+                               priv->scan_interval = 5;
+                       }
+               } else if (priv->scan_mode == NM_802_11_SCAN_MODE_CONTINUOUSLY) 
{
+                       priv->pending_scan_id = g_timeout_add 
(priv->scan_interval * 1000,
+                                                                               
                   request_wireless_scan,
+                                                                               
                   self);
                }
        }
 }
 
-
 static void
 cancel_pending_scan (NMDeviceWifi *self)
 {
@@ -1931,7 +1950,6 @@ cull_scan_list (NMDeviceWifi *self)
                NMAccessPoint * ap = NM_AP (elt->data);
                const glong     ap_time = nm_ap_get_last_seen (ap);
                gboolean        keep = FALSE;
-               const guint     prune_interval_s = SCAN_INTERVAL_MAX * 3;
 
                /* Don't ever prune the AP we're currently associated with */
                if (cur_ap_path && !strcmp (cur_ap_path, nm_ap_get_dbus_path 
(ap)))
@@ -1939,7 +1957,7 @@ cull_scan_list (NMDeviceWifi *self)
                if (nm_ap_get_fake (ap))
                        keep = TRUE;
 
-               if (!keep && (ap_time + prune_interval_s < cur_time.tv_sec))
+               if (!keep && (ap_time + priv->scan_prune < cur_time.tv_sec))
                        outdated_list = g_slist_append (outdated_list, ap);
        }
 
@@ -2197,11 +2215,17 @@ supplicant_iface_state_cb_handler (gpointer user_data)
                 nm_supplicant_interface_state_to_string (task->new_state));
 
        if (task->new_state == NM_SUPPLICANT_INTERFACE_STATE_READY) {
-               priv->scan_interval = SCAN_INTERVAL_MIN;
+               if (priv->scan_mode == NM_802_11_SCAN_MODE_DEFAULT) {
+                       priv->scan_interval = SCAN_INTERVAL_MIN;
+                       priv->scan_prune = SCAN_PRUNE;
 
-               /* Request a scan to get latest results */
-               cancel_pending_scan (self);
-               request_wireless_scan (self);
+                       /* Request a scan to get latest results */
+                       cancel_pending_scan (self);
+                       request_wireless_scan (self);
+               } else if (priv->scan_mode == NM_802_11_SCAN_MODE_CONTINUOUSLY) 
{
+                       priv->scan_interval = SCAN_INTERVAL_MIN;
+                       priv->scan_prune = priv->scan_interval * 3;
+               }
        } else if (task->new_state == NM_SUPPLICANT_INTERFACE_STATE_DOWN) {
                cleanup_association_attempt (self, FALSE);
                supplicant_interface_release (self);
@@ -3089,8 +3113,11 @@ activation_success_handler (NMDevice *dev)
 done:
        periodic_update (self);
 
-       /* Reset scan interval to something reasonable */
-       priv->scan_interval = SCAN_INTERVAL_MIN + (SCAN_INTERVAL_STEP * 2);
+       if (priv->scan_mode == NM_802_11_SCAN_MODE_DEFAULT) {
+               /* Reset scan interval to something reasonable */
+               priv->scan_interval = SCAN_INTERVAL_MIN + (SCAN_INTERVAL_STEP * 
2);
+               priv->scan_prune = SCAN_PRUNE;
+       }
 }
 
 
@@ -3228,6 +3255,15 @@ get_property (GObject *object, guint prop_id,
        case PROP_CAPABILITIES:
                g_value_set_uint (value, priv->capabilities);
                break;
+       case PROP_WIRELESS_SCAN_MODE:
+               g_value_set_uint(value, priv->scan_mode);
+               break;
+       case PROP_WIRELESS_SCAN_INTERVAL:
+               g_value_set_uint(value, priv->scan_interval);
+               break;
+       case PROP_WIRELESS_SCAN_PRUNE:
+               g_value_set_uint(value, priv->scan_prune);
+               break;
        case PROP_ACTIVE_ACCESS_POINT:
                if (priv->current_ap)
                        g_value_set_boxed (value, nm_ap_get_dbus_path 
(priv->current_ap));
@@ -3241,6 +3277,28 @@ get_property (GObject *object, guint prop_id,
 }
 
 static void
+set_property (GObject *object, guint prop_id,
+                         const GValue *value, GParamSpec *pspec)
+{
+       NMDeviceWifi *device = NM_DEVICE_WIFI (object);
+
+       switch (prop_id) {
+       case PROP_WIRELESS_SCAN_MODE:
+               nm_device_wifi_set_scan_mode(device, g_value_get_uint(value));
+               break;
+       case PROP_WIRELESS_SCAN_INTERVAL:
+               nm_device_wifi_set_scan_interval(device, 
g_value_get_uint(value));
+               break;
+       case PROP_WIRELESS_SCAN_PRUNE:
+               nm_device_wifi_set_scan_prune(device, g_value_get_uint(value));
+               break;
+       default:
+               G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+               break;
+       }
+}
+
+static void
 nm_device_wifi_class_init (NMDeviceWifiClass *klass)
 {
        GObjectClass *object_class = G_OBJECT_CLASS (klass);
@@ -3250,6 +3308,7 @@ nm_device_wifi_class_init (NMDeviceWifiClass *klass)
 
        object_class->constructor = constructor;
        object_class->get_property = get_property;
+       object_class->set_property = set_property;
        object_class->dispose = nm_device_wifi_dispose;
 
        parent_class->get_type_capabilities = real_get_type_capabilities;
@@ -3310,6 +3369,27 @@ nm_device_wifi_class_init (NMDeviceWifiClass *klass)
                                                        "Wireless Capabilities",
                                                        0, G_MAXUINT32, 
NM_WIFI_DEVICE_CAP_NONE,
                                                        G_PARAM_READABLE));
+       g_object_class_install_property
+               (object_class, PROP_WIRELESS_SCAN_MODE,
+                g_param_spec_uint (NM_DEVICE_WIFI_SCAN_MODE,
+                                                  "WirelessScanMode",
+                                                  "Scan mode",
+                                                  0, G_MAXUINT32, SCAN_MODE,
+                                                  G_PARAM_READABLE | 
G_PARAM_WRITABLE));
+       g_object_class_install_property
+               (object_class, PROP_WIRELESS_SCAN_INTERVAL,
+                g_param_spec_uint (NM_DEVICE_WIFI_SCAN_INTERVAL,
+                                                  "WirelessScanInterval",
+                                                  "Scan interval",
+                                                  0, G_MAXUINT32, 0,
+                                                  G_PARAM_READABLE | 
G_PARAM_WRITABLE));
+       g_object_class_install_property
+               (object_class, PROP_WIRELESS_SCAN_PRUNE,
+                g_param_spec_uint (NM_DEVICE_WIFI_SCAN_PRUNE,
+                                                  "WirelessScanPrune",
+                                                  "Scan prune",
+                                                  0, G_MAXUINT32, 0,
+                                                  G_PARAM_READABLE | 
G_PARAM_WRITABLE));
 
        /* Signals */
        signals[ACCESS_POINT_ADDED] =
@@ -3535,3 +3615,35 @@ nm_device_wifi_set_enabled (NMDeviceWifi *self, gboolean 
enabled)
        }
 }
 
+gboolean 
+nm_device_wifi_set_scan_mode(NMDeviceWifi *self, NM80211ScanMode mode)
+{
+       NMDeviceWifiPrivate *priv;
+
+       priv = NM_DEVICE_WIFI_GET_PRIVATE (self);
+       priv->scan_mode = mode;
+       schedule_scan(self, TRUE);
+       return TRUE;
+}
+
+gboolean 
+nm_device_wifi_set_scan_interval(NMDeviceWifi *self, guint ival)
+{
+       NMDeviceWifiPrivate *priv;
+
+       priv = NM_DEVICE_WIFI_GET_PRIVATE (self);
+       priv->scan_interval = ival;
+       schedule_scan(self, TRUE);
+       return TRUE;
+}
+
+gboolean 
+nm_device_wifi_set_scan_prune(NMDeviceWifi *self, guint prune)
+{
+       NMDeviceWifiPrivate *priv;
+
+       priv = NM_DEVICE_WIFI_GET_PRIVATE (self);
+       priv->scan_prune = prune;
+       return TRUE;
+}
+
diff --git a/src/nm-device-wifi.h b/src/nm-device-wifi.h
index 1e885cb..0d240f9 100644
--- a/src/nm-device-wifi.h
+++ b/src/nm-device-wifi.h
@@ -47,6 +47,9 @@ G_BEGIN_DECLS
 #define NM_DEVICE_WIFI_BITRATE "bitrate"
 #define NM_DEVICE_WIFI_ACTIVE_ACCESS_POINT "active-access-point"
 #define NM_DEVICE_WIFI_CAPABILITIES "wireless-capabilities"
+#define NM_DEVICE_WIFI_SCAN_MODE "wireless-scan-mode"
+#define NM_DEVICE_WIFI_SCAN_INTERVAL "wireless-scan-interval"
+#define NM_DEVICE_WIFI_SCAN_PRUNE "wireless-scan-prune"
 
 #ifndef NM_DEVICE_WIFI_DEFINED
 #define NM_DEVICE_WIFI_DEFINED
-- 
1.6.0.2.GIT

_______________________________________________
NetworkManager-list mailing list
NetworkManager-list@gnome.org
http://mail.gnome.org/mailman/listinfo/networkmanager-list

Reply via email to