Prevent auto scan in wireless devices



Hi all,

I noticed that wireless devices are always scanning, and this is very
bad to power consuption in embedded systems.
I would like to create a way to prevent automatic scan and just
perform it when some cliente ask for it.
Is it possible to do this? I mean, does it "brake" in some way the nm structure?

Actually, I already did this patch to 0.6.6 version, but zero lines
applied in new code :) Now i would like to create the patch and submit
to upstream.

The basic idea is just make can_scan function (src/nm-device-wifi.c)
return FALSE due to some user configurations or run flags
(--no-bg-scan). In this case, "performScan" dbus method and
"ScanPerformed" dbus signal must be created to allow clients to ask
for a scan and to notice that the scan has been performed.

I'm attaching the 0.6.6 patch, as I said before the idea is the same.

Any comments? Is it a good way to implement that?

Tks
Aloisio
Index: NetworkManager-0.6.6/src/nm-device-802-11-wireless.c
===================================================================
--- NetworkManager-0.6.6.orig/src/nm-device-802-11-wireless.c	2008-09-05 15:01:32.000000000 -0300
+++ NetworkManager-0.6.6/src/nm-device-802-11-wireless.c	2008-09-08 11:37:23.000000000 -0300
@@ -624,9 +624,12 @@
 	NMDevice80211Wireless *	self = NM_DEVICE_802_11_WIRELESS (dev);
 	GSource *				source;
 	guint				source_id;
+    NMData *                app_data;
+
+    app_data = nm_device_get_app_data (NM_DEVICE (self));
 
 	/* Start the scanning timeout for devices that can do scanning */
-	if (nm_device_get_capabilities (dev) & NM_DEVICE_CAP_WIRELESS_SCAN) {
+	if (!app_data->no_scan && nm_device_get_capabilities (dev) & NM_DEVICE_CAP_WIRELESS_SCAN) {
 		/* Stupid orinoco has problems scanning immediately after being up,
 		 * so wait a bit before triggering a scan.
 		 */
@@ -1063,9 +1066,14 @@
                                              NMWirelessScanInterval interval)
 {
 	guint8 seconds = nm_wireless_scan_interval_to_seconds (interval);
+	NMData *app_data;
 
 	g_return_if_fail (self != NULL);
 
+	app_data = nm_device_get_app_data (NM_DEVICE (self));
+	if (app_data->no_scan)
+		return;
+
 	self->priv->scan_interval = seconds;	
 
 	if (interval == NM_WIRELESS_SCAN_INTERVAL_ACTIVE && !self->priv->scanning) {
@@ -1974,9 +1982,13 @@
 scan_results_timeout (NMDevice80211Wireless *self)
 {
 	GTimeVal cur_time;
+    NMData * app_data;
 
 	g_return_val_if_fail (self != NULL, FALSE);
 
+    app_data = nm_device_get_app_data (NM_DEVICE (self));
+    g_assert (app_data);
+
 	request_and_convert_scan_results (self);
 
 	self->priv->scanning = FALSE;
@@ -1984,11 +1996,39 @@
 	g_get_current_time (&cur_time);
 	self->priv->last_scan = cur_time.tv_sec;
 
-	/* After the first successful scan back down to the ACTIVE scan interval */
-	if (self->priv->scan_interval == nm_wireless_scan_interval_to_seconds (NM_WIRELESS_SCAN_INTERVAL_INIT))
-		nm_device_802_11_wireless_set_scan_interval (self, NM_WIRELESS_SCAN_INTERVAL_ACTIVE);
-	else
-		schedule_scan (self, 0);
+    if (!app_data->no_scan)
+    {
+	    /* After the first successful scan back down to the ACTIVE scan interval */
+	    if (self->priv->scan_interval == nm_wireless_scan_interval_to_seconds (NM_WIRELESS_SCAN_INTERVAL_INIT))
+		    nm_device_802_11_wireless_set_scan_interval (self, NM_WIRELESS_SCAN_INTERVAL_ACTIVE);
+	    else
+		    schedule_scan (self, 0);
+    }
+    else
+    {
+        /* If we're in "no scan" mode, lets always signalize that we've performed a scan */
+        DBusMessage *message;
+        char        *dev_path = NULL;
+
+        if (!(dev_path = nm_dbus_get_object_path_for_device (NM_DEVICE (self))))
+            goto out;
+
+        if (!(message = dbus_message_new_signal (NM_DBUS_PATH, NM_DBUS_INTERFACE, "ScanPerformed")))
+        {
+            nm_warning ("scan_results_timeout(): Not enough memory for new dbus message!");
+            goto out;
+        }
+
+        dbus_message_append_args (message, DBUS_TYPE_OBJECT_PATH, &dev_path, DBUS_TYPE_INVALID);
+
+        if (!dbus_connection_send (app_data->dbus_connection, message, NULL))
+            nm_warning ("scan_results_timeout(): Could not raise the ScanPerformed signal!");
+
+        dbus_message_unref (message);
+
+out:
+        g_free (dev_path);
+    }
 
 	return FALSE;
 }
@@ -2134,7 +2174,7 @@
 		}
 		schedule_scan_results_timeout (self, 10);
 	}
-	return FALSE;
+	return TRUE;
 
 reschedule:
 	schedule_scan (self, 0);
@@ -2156,6 +2196,13 @@
 }
 
 
+gboolean
+nm_device_802_11_wireless_perform_scan (NMDevice80211Wireless *self)
+{
+    return nm_device_802_11_wireless_scan ((gpointer) self);
+}
+
+
 /*
  * schedule_scan
  *
Index: NetworkManager-0.6.6/src/NetworkManager.c
===================================================================
--- NetworkManager-0.6.6.orig/src/NetworkManager.c	2008-03-06 17:14:39.000000000 -0300
+++ NetworkManager-0.6.6/src/NetworkManager.c	2008-09-05 15:01:32.000000000 -0300
@@ -929,6 +929,7 @@
 	gboolean		become_daemon = FALSE;
 	gboolean		enable_test_devices = FALSE;
 	gboolean		show_usage = FALSE;
+	gboolean		no_scan = FALSE;
 	char *		owner;
 	char *		pidfile = NULL;
 	char *		user_pidfile = NULL;
@@ -951,6 +952,7 @@
 			{"pid-file", 0, 0, G_OPTION_ARG_STRING, &user_pidfile, "Specify the location of a PID file", NULL},
 			{"enable-test-devices", 0, 0, G_OPTION_ARG_NONE, &enable_test_devices, "Allow dummy devices to be created via DBUS methods [DEBUG]", NULL},
 			{"info", 0, 0, G_OPTION_ARG_NONE, &show_usage, "Show application information", NULL},
+			{"no-scan", 0, 0, G_OPTION_ARG_NONE, &no_scan, "Prevent background scan", NULL},
 			{NULL}
 		};
 		opt_ctx = g_option_context_new("");
@@ -1009,6 +1011,8 @@
 		exit (EXIT_FAILURE);
 	}
 
+    nm_data->no_scan = no_scan;
+
 	/* Create our dbus service */
 	nm_data->dbus_connection = nm_dbus_init (nm_data);
 	if (!nm_data->dbus_connection)
Index: NetworkManager-0.6.6/src/NetworkManagerMain.h
===================================================================
--- NetworkManager-0.6.6.orig/src/NetworkManagerMain.h	2008-03-06 17:14:39.000000000 -0300
+++ NetworkManager-0.6.6/src/NetworkManagerMain.h	2008-09-05 15:01:32.000000000 -0300
@@ -87,6 +87,7 @@
 	gboolean				modem_active;
 	gboolean				asleep;
 	gboolean				disconnected;
+	gboolean				no_scan;
 
 	GSList *				dialup_list;
 	GMutex *				dialup_list_mutex;
Index: NetworkManager-0.6.6/src/nm-dbus-device.c
===================================================================
--- NetworkManager-0.6.6.orig/src/nm-dbus-device.c	2008-03-06 17:14:39.000000000 -0300
+++ NetworkManager-0.6.6/src/nm-dbus-device.c	2008-09-08 15:12:43.000000000 -0300
@@ -500,6 +500,44 @@
 }
 
 
+static DBusMessage *nm_dbus_device_perform_scan (DBusConnection *connection, DBusMessage *message, NMDbusCBData *data)
+{
+    NMDevice    *dev;
+    DBusMessage *reply = NULL;
+    NMData * app_data;
+
+    g_return_val_if_fail (data && data->data && data->dev && connection && message, NULL);
+
+    dev = data->dev;
+
+    app_data = nm_device_get_app_data (NM_DEVICE (dev));
+    if (!app_data->no_scan)
+    {
+        nm_warning ("You cannot ask for a scan if you're not in 'No scan' mode");
+        reply = nm_dbus_create_error_message (message, NM_DBUS_INTERFACE, "Cannot perform scan", "You cannot ask for a scan if you're not in 'No scan' mode");
+        goto out;
+    }
+
+    if (!nm_device_is_802_11_wireless (dev))
+    {
+        reply = nm_dbus_create_error_message (message, NM_DBUS_INTERFACE, "DeviceNotWireless",
+                "Wired devices cannot scan for wireless networks.");
+        goto out;
+    }
+
+    if (nm_device_802_11_wireless_perform_scan ((NMDevice80211Wireless *) dev))
+        reply = dbus_message_new_method_return (message); /* Success */
+    else
+        reply = nm_dbus_create_error_message (message, NM_DBUS_INTERFACE, "Cannot perform scan", "The device cannot perform network scanning.");
+
+out:
+    if (!reply)
+        nm_warning ("Could not allocate dbus message.");
+
+    return reply;
+}
+
+
 /*
  * nm_dbus_device_methods_setup
  *
@@ -523,6 +561,7 @@
 	nm_dbus_method_list_add_method (list, "setLinkActive",		nm_dbus_device_set_link_active);
 	nm_dbus_method_list_add_method (list, "getCapabilities",	nm_dbus_device_get_capabilities);
 	nm_dbus_method_list_add_method (list, "getDriver",		nm_dbus_device_get_driver);
+	nm_dbus_method_list_add_method (list, "performScan",		nm_dbus_device_perform_scan);
 
 	return (list);
 }
Index: NetworkManager-0.6.6/src/nm-device-802-11-wireless.h
===================================================================
--- NetworkManager-0.6.6.orig/src/nm-device-802-11-wireless.h	2008-03-06 17:14:39.000000000 -0300
+++ NetworkManager-0.6.6/src/nm-device-802-11-wireless.h	2008-09-05 15:01:32.000000000 -0300
@@ -110,6 +110,8 @@
 
 gint8	nm_device_802_11_wireless_get_signal_strength (NMDevice80211Wireless *self);
 
+gboolean    nm_device_802_11_wireless_perform_scan (NMDevice80211Wireless *self);
+
 
 G_END_DECLS
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]