diff options
Diffstat (limited to 'packages/networkmanager/files/avoid_frequent_scan.patch')
-rw-r--r-- | packages/networkmanager/files/avoid_frequent_scan.patch | 226 |
1 files changed, 226 insertions, 0 deletions
diff --git a/packages/networkmanager/files/avoid_frequent_scan.patch b/packages/networkmanager/files/avoid_frequent_scan.patch new file mode 100644 index 0000000000..43f84f7674 --- /dev/null +++ b/packages/networkmanager/files/avoid_frequent_scan.patch @@ -0,0 +1,226 @@ +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 + |