summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Williams <dcbw@redhat.com>2008-01-18 15:25:05 +0000
committerDan Williams <dcbw@redhat.com>2008-01-18 15:25:05 +0000
commitaff4fccc0d76f62055efdb34088c50629456435c (patch)
tree4c44680ca3eda716925e852fb44d469cfad79207
parent4f462b0591da8da8d87f53d505086c1da944558b (diff)
downloadNetworkManager-nm-0-6-olpc.tar.gz
2008-01-18 Dan Williams <dcbw@redhat.com>nm-0-6-olpc
* src/nm-device.c src/nm-device.h - (nm_device_deactivate_quickly, nm_device_deactivate): both get a new argument 'force', which is used to indicate to subclasses that any persistent device state should be completely cleared, becasue the device is not intended to be usable after deactivation. Should be set to TRUE for cases like disabling wireless and NM shutdown. * src/nm-dbus-nm.c - (nm_dbus_nm_set_active_device): fix for nm_device_deactivate() changes - (nm_dbus_nm_set_wireless_enabled): set TX power on when enabling, set TX power off when disabling. - (nm_dbus_nm_sleep, nm_dbus_nm_wake): return success/fail value to callers over D-Bus * src/NetworkManagerPolicy.c - (nm_policy_activation_failed, nm_policy_deactivate, nm_policy_device_change_check, nm_policy_device_activate): fix for nm_device_deactivate() changes * src/NetworkManager.c - (nm_create_device_and_add_to_list): fix for nm_device_deactivate() changes * src/nm-device-802-11-wireless.c src/nm-device-802-11-wireless.h - (real_init): ensure wireless TX power is on - (nm_device_802_11_wireless_set_tx_power_on): new function; control wireless TX power * src/nm-device-802-11-mesh-olpc.c - (real_init): ensure wireless TX power is on - (real_deactivate_quickly): for forced deactivations (wireless disabled, etc) reset the mesh state machine so that upon enabling wireless, the mesh device starts at the beginning looking for a school server instead of where it stopped prior to disabling wireless git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/branches/nm-0-6-olpc@3246 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
-rw-r--r--ChangeLog39
-rw-r--r--src/NetworkManager.c2
-rw-r--r--src/NetworkManagerPolicy.c8
-rw-r--r--src/nm-dbus-nm.c66
-rw-r--r--src/nm-device-802-11-mesh-olpc.c20
-rw-r--r--src/nm-device-802-11-wireless.c55
-rw-r--r--src/nm-device-802-11-wireless.h2
-rw-r--r--src/nm-device.c10
-rw-r--r--src/nm-device.h6
9 files changed, 169 insertions, 39 deletions
diff --git a/ChangeLog b/ChangeLog
index a2559c18ff..0cf26442e3 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,42 @@
+2008-01-18 Dan Williams <dcbw@redhat.com>
+
+ * src/nm-device.c
+ src/nm-device.h
+ - (nm_device_deactivate_quickly, nm_device_deactivate): both get a new
+ argument 'force', which is used to indicate to subclasses that any
+ persistent device state should be completely cleared, becasue the
+ device is not intended to be usable after deactivation. Should be
+ set to TRUE for cases like disabling wireless and NM shutdown.
+
+ * src/nm-dbus-nm.c
+ - (nm_dbus_nm_set_active_device): fix for nm_device_deactivate() changes
+ - (nm_dbus_nm_set_wireless_enabled): set TX power on when enabling,
+ set TX power off when disabling.
+ - (nm_dbus_nm_sleep, nm_dbus_nm_wake): return success/fail value to
+ callers over D-Bus
+
+ * src/NetworkManagerPolicy.c
+ - (nm_policy_activation_failed, nm_policy_deactivate,
+ nm_policy_device_change_check, nm_policy_device_activate): fix for
+ nm_device_deactivate() changes
+
+ * src/NetworkManager.c
+ - (nm_create_device_and_add_to_list): fix for nm_device_deactivate()
+ changes
+
+ * src/nm-device-802-11-wireless.c
+ src/nm-device-802-11-wireless.h
+ - (real_init): ensure wireless TX power is on
+ - (nm_device_802_11_wireless_set_tx_power_on): new function; control
+ wireless TX power
+
+ * src/nm-device-802-11-mesh-olpc.c
+ - (real_init): ensure wireless TX power is on
+ - (real_deactivate_quickly): for forced deactivations (wireless disabled,
+ etc) reset the mesh state machine so that upon enabling wireless,
+ the mesh device starts at the beginning looking for a school server
+ instead of where it stopped prior to disabling wireless
+
2008-01-09 Dan Williams <dcbw@redhat.com>
* src/NetworkManagerPolicy.c
diff --git a/src/NetworkManager.c b/src/NetworkManager.c
index ef0e62a575..354f73f055 100644
--- a/src/NetworkManager.c
+++ b/src/NetworkManager.c
@@ -322,7 +322,7 @@ NMDevice * nm_create_device_and_add_to_list (NMData *data, const char *udi, cons
}
data->dev_list = g_slist_append (data->dev_list, dev);
- nm_device_deactivate (dev);
+ nm_device_deactivate (dev, TRUE);
/* Notify other devices of the new device */
for (elt = data->dev_list; elt; elt = g_slist_next (elt)) {
diff --git a/src/NetworkManagerPolicy.c b/src/NetworkManagerPolicy.c
index 995f3eed8d..4cda5bd94b 100644
--- a/src/NetworkManagerPolicy.c
+++ b/src/NetworkManagerPolicy.c
@@ -155,7 +155,7 @@ static gboolean nm_policy_activation_failed (NMActRequest *req)
nm_info ("Activation (%s) failed.", nm_device_get_iface (dev));
nm_dbus_schedule_device_status_change_signal (data, dev, ap, DEVICE_ACTIVATION_FAILED);
- nm_device_deactivate (dev);
+ nm_device_deactivate (dev, FALSE);
nm_schedule_state_change_signal_broadcast (data);
nm_policy_schedule_device_change_check (data);
@@ -205,7 +205,7 @@ static gboolean nm_policy_deactivate (gpointer user_data)
data = nm_device_get_app_data (dev);
g_assert (data);
- nm_device_deactivate (dev);
+ nm_device_deactivate (dev, FALSE);
g_object_unref (dev);
nm_schedule_state_change_signal_broadcast (data);
@@ -449,7 +449,7 @@ nm_policy_device_change_check (NMData *data)
{
/* Terminate current connection */
nm_info ("SWITCH: terminating current connection '%s' because it's no longer valid.", nm_device_get_iface (old_dev));
- nm_device_deactivate (old_dev);
+ nm_device_deactivate (old_dev, FALSE);
do_switch = TRUE;
}
else if (old_dev && new_dev)
@@ -596,7 +596,7 @@ static gboolean nm_policy_device_activation (NMActRequest *req)
g_assert (data);
if ((old_dev = nm_get_active_device (data)))
- nm_device_deactivate (old_dev);
+ nm_device_deactivate (old_dev, FALSE);
new_dev = nm_act_request_get_dev (req);
diff --git a/src/nm-dbus-nm.c b/src/nm-dbus-nm.c
index c3555c0ea4..06694d6259 100644
--- a/src/nm-dbus-nm.c
+++ b/src/nm-dbus-nm.c
@@ -351,7 +351,7 @@ static DBusMessage *nm_dbus_nm_set_active_device (DBusConnection *connection, DB
mesh_step == G_MAXUINT32 ? -1 : mesh_step);
}
- nm_device_deactivate (dev);
+ nm_device_deactivate (dev, FALSE);
nm_schedule_state_change_signal_broadcast (data->data);
req = nm_act_request_new (data->data, dev, ap, TRUE);
@@ -539,40 +539,50 @@ static DBusMessage *nm_dbus_nm_remove_test_device (DBusConnection *connection, D
static DBusMessage *nm_dbus_nm_set_wireless_enabled (DBusConnection *connection, DBusMessage *message, NMDbusCBData *data)
{
- gboolean enabled = FALSE;
- DBusError err;
- NMData *app_data;
+ gboolean enabled = FALSE;
+ DBusError err;
+ NMData *app_data;
+ GSList *elt;
+ DBusMessage *reply;
+ gboolean success = FALSE;
g_return_val_if_fail (data && data->data && connection && message, NULL);
dbus_error_init (&err);
if (!dbus_message_get_args (message, &err, DBUS_TYPE_BOOLEAN, &enabled, DBUS_TYPE_INVALID))
- return NULL;
+ goto out;
app_data = data->data;
app_data->wireless_enabled = enabled;
- if (!enabled)
- {
- GSList *elt;
-
- /* Physically down all wireless devices */
- nm_lock_mutex (app_data->dev_list_mutex, __FUNCTION__);
- for (elt = app_data->dev_list; elt; elt = g_slist_next (elt))
- {
- NMDevice *dev = (NMDevice *)(elt->data);
- if (nm_device_is_802_11_wireless (dev) || nm_device_is_802_11_mesh_olpc (dev))
- {
- nm_device_deactivate (dev);
+ nm_lock_mutex (app_data->dev_list_mutex, __FUNCTION__);
+ for (elt = app_data->dev_list; elt; elt = g_slist_next (elt)) {
+ NMDevice *dev = (NMDevice *)(elt->data);
+ if ( nm_device_is_802_11_wireless (dev)
+ || nm_device_is_802_11_mesh_olpc (dev)) {
+
+ if (enabled) {
+ nm_info ("%s: (%s) setting TX power ON", __func__, nm_device_get_iface (dev));
+ nm_device_802_11_wireless_set_tx_power_on (dev, TRUE);
+ } else {
+ nm_device_deactivate (dev, TRUE);
nm_device_bring_down (dev);
+ nm_info ("%s: (%s) setting TX power OFF", __func__, nm_device_get_iface (dev));
+ nm_device_802_11_wireless_set_tx_power_on (dev, FALSE);
}
}
- nm_unlock_mutex (app_data->dev_list_mutex, __FUNCTION__);
}
+ nm_unlock_mutex (app_data->dev_list_mutex, __FUNCTION__);
nm_policy_schedule_device_change_check (data->data);
+ success = TRUE;
- return NULL;
+out:
+ reply = dbus_message_new_method_return (message);
+ if (reply)
+ dbus_message_append_args (reply, DBUS_TYPE_BOOLEAN, &success, DBUS_TYPE_INVALID);
+
+ return reply;
}
static DBusMessage *nm_dbus_nm_get_wireless_enabled (DBusConnection *connection, DBusMessage *message, NMDbusCBData *data)
@@ -590,6 +600,8 @@ static DBusMessage *nm_dbus_nm_get_wireless_enabled (DBusConnection *connection,
static DBusMessage *nm_dbus_nm_sleep (DBusConnection *connection, DBusMessage *message, NMDbusCBData *data)
{
NMData *app_data;
+ DBusMessage *reply = NULL;
+ gboolean success = TRUE;
g_return_val_if_fail (data && data->data && connection && message, NULL);
@@ -633,7 +645,7 @@ static DBusMessage *nm_dbus_nm_sleep (DBusConnection *connection, DBusMessage *m
{
NMDevice *dev = (NMDevice *)(elt->data);
nm_device_set_removed (dev, TRUE);
- nm_device_deactivate_quickly (dev);
+ nm_device_deactivate_quickly (dev, TRUE);
nm_system_device_set_up_down (dev, FALSE);
}
nm_unlock_mutex (app_data->dev_list_mutex, __FUNCTION__);
@@ -644,7 +656,11 @@ static DBusMessage *nm_dbus_nm_sleep (DBusConnection *connection, DBusMessage *m
nm_unlock_mutex (app_data->dialup_list_mutex, __FUNCTION__);
}
- return NULL;
+ reply = dbus_message_new_method_return (message);
+ if (reply)
+ dbus_message_append_args (reply, DBUS_TYPE_BOOLEAN, &success, DBUS_TYPE_INVALID);
+
+ return reply;
}
static DBusMessage *nm_dbus_nm_wake (DBusConnection *connection, DBusMessage *message, NMDbusCBData *data)
@@ -652,6 +668,8 @@ static DBusMessage *nm_dbus_nm_wake (DBusConnection *connection, DBusMessage *me
NMData *app_data;
DBusMessageIter iter;
gboolean enable_networking = FALSE;
+ DBusMessage *reply = NULL;
+ gboolean success = TRUE;
g_return_val_if_fail (data && data->data && connection && message, NULL);
@@ -694,7 +712,11 @@ static DBusMessage *nm_dbus_nm_wake (DBusConnection *connection, DBusMessage *me
nm_policy_schedule_device_change_check (data->data);
}
- return NULL;
+ reply = dbus_message_new_method_return (message);
+ if (reply)
+ dbus_message_append_args (reply, DBUS_TYPE_BOOLEAN, &success, DBUS_TYPE_INVALID);
+
+ return reply;
}
static DBusMessage *nm_dbus_nm_get_state (DBusConnection *connection, DBusMessage *message, NMDbusCBData *data)
diff --git a/src/nm-device-802-11-mesh-olpc.c b/src/nm-device-802-11-mesh-olpc.c
index 1606818613..7c0808a775 100644
--- a/src/nm-device-802-11-mesh-olpc.c
+++ b/src/nm-device-802-11-mesh-olpc.c
@@ -64,7 +64,6 @@ static void mpp_device_deactivated_cb (GObject *obj, gpointer user_data);
static void mpp_cleanup (NMDevice80211MeshOLPC *self);
static gboolean aipd_exec (NMDevice80211MeshOLPC *self);
static gboolean aipd_monitor_start (NMDevice80211MeshOLPC *self);
-static void real_deactivate_quickly (NMDevice *dev);
static void assoc_timeout_cleanup (NMDevice80211MeshOLPC * self);
static gboolean is_mpp_active (NMDevice80211MeshOLPC *self);
static gboolean mpp_autoip_start (NMDevice80211MeshOLPC *self);
@@ -426,6 +425,8 @@ real_init (NMDevice *dev)
iface = nm_device_get_iface (dev);
+ nm_device_802_11_wireless_set_tx_power_on (dev, TRUE);
+
success = g_file_get_contents (MESH_STEP_FILE,
&contents,
NULL,
@@ -871,7 +872,7 @@ real_notify_device_removed (NMDevice *dev,
}
static void
-real_deactivate_quickly (NMDevice *dev)
+real_deactivate_quickly (NMDevice *dev, gboolean force)
{
NMDevice80211MeshOLPC * self = NM_DEVICE_802_11_MESH_OLPC (dev);
NMDHCPManager * dhcp_mgr = nm_dhcp_manager_get (NULL);
@@ -888,6 +889,19 @@ real_deactivate_quickly (NMDevice *dev)
/* Remove any dhclient.conf file we may have created for mshX */
remove (ETC_DHCLIENT_CONF_PATH);
+
+ /* If this is a forced device deactivation, reset everything and start
+ * the mesh discovery process all over.
+ */
+ if (force) {
+ self->priv->step = self->priv->default_first_step;
+ if (self->priv->default_first_step == MESH_S4_P2P_MESH)
+ self->priv->channel = 1;
+ else
+ self->priv->channel = get_random_channel ();
+ self->priv->chans_tried = 0;
+ self->priv->channel_locked = FALSE;
+ }
}
@@ -1734,7 +1748,7 @@ nm_info ("%s: failing activation", __func__);
nm_device_get_iface (NM_DEVICE (self)),
self->priv->channel);
self->priv->channel = next_chan;
- real_deactivate_quickly (NM_DEVICE (self));
+ real_deactivate_quickly (NM_DEVICE (self), FALSE);
nm_device_activate_schedule_stage2_device_config (req);
}
}
diff --git a/src/nm-device-802-11-wireless.c b/src/nm-device-802-11-wireless.c
index 87dc15de93..98aa598ad0 100644
--- a/src/nm-device-802-11-wireless.c
+++ b/src/nm-device-802-11-wireless.c
@@ -32,6 +32,7 @@
#include "nm-device.h"
#include "nm-device-802-11-wireless.h"
+#include "nm-device-802-11-mesh-olpc.h"
#include "nm-device-private.h"
#include "NetworkManagerAPList.h"
#include "NetworkManagerDbus.h"
@@ -416,6 +417,8 @@ real_init (NMDevice *dev)
nm_device_802_11_wireless_set_scan_interval (app_data, self, NM_WIRELESS_SCAN_INTERVAL_ACTIVE);
nm_device_802_11_wireless_set_mode (self, IW_MODE_INFRA);
+nm_info ("%s: setting TX power on", nm_device_get_iface (dev));
+ nm_device_802_11_wireless_set_tx_power_on (dev, TRUE);
/* Non-scanning devices show the entire allowed AP list as their
* available networks.
@@ -650,7 +653,7 @@ real_start (NMDevice *dev)
}
static void
-real_deactivate_quickly (NMDevice *dev)
+real_deactivate_quickly (NMDevice *dev, gboolean force)
{
NMDevice80211Wireless * self = NM_DEVICE_802_11_WIRELESS (dev);
@@ -1139,6 +1142,56 @@ nm_device_802_11_wireless_is_scanning (NMDevice80211Wireless *self)
return self->priv->scanning;
}
+/*
+ * nm_device_set_tx_power_on
+ *
+ * Control TX power of the device
+ *
+ */
+gboolean
+nm_device_802_11_wireless_set_tx_power_on (NMDevice *self, gboolean on)
+{
+ NMSock * sk;
+ gboolean success = FALSE;
+ const char * iface;
+ struct iwreq wrq;
+
+ g_return_val_if_fail (self != NULL, FALSE);
+
+ if (!nm_device_is_802_11_wireless (self) && !nm_device_is_802_11_mesh_olpc (self))
+ return FALSE;
+
+ iface = nm_device_get_iface (NM_DEVICE (self));
+ sk = nm_dev_sock_open (NM_DEVICE (self), DEV_WIRELESS, __func__, NULL);
+ if (!sk) {
+ nm_warning ("%s: couldn't open socket to device", iface);
+ return FALSE;
+ }
+
+#ifdef IOCTL_DEBUG
+ nm_info ("%s: About to SET IWTXPOW.", iface);
+#endif
+
+ memset (&wrq, 0, sizeof (wrq));
+ wrq.u.txpower.fixed = on ? 0 : 1;
+ wrq.u.txpower.disabled = on ? 0 : 1;
+ wrq.u.txpower.flags = IW_TXPOW_DBM;
+
+ if (iw_set_ext (nm_dev_sock_get_fd (sk), iface, SIOCSIWTXPOW, &wrq) == 0) {
+ success = TRUE;
+ nm_info ("%s: set TX power %s", iface, on ? "on" : "off");
+ } else {
+ nm_warning ("%s: error setting TX power %s: (%d) %s",
+ iface,
+ on ? "on" : "off",
+ errno,
+ strerror (errno));
+ }
+ nm_dev_sock_close (sk);
+
+ return success;
+}
+
/*
* nm_device_get_mode
diff --git a/src/nm-device-802-11-wireless.h b/src/nm-device-802-11-wireless.h
index 1c480f6e72..4871039e10 100644
--- a/src/nm-device-802-11-wireless.h
+++ b/src/nm-device-802-11-wireless.h
@@ -128,6 +128,8 @@ void nm_device_802_11_wireless_register_scan_approval_hook (NMDevice80211Wireles
double nm_device_802_11_wireless_get_frequency (NMDevice80211Wireless *self);
+gboolean nm_device_802_11_wireless_set_tx_power_on (NMDevice *self, gboolean on);
+
G_END_DECLS
#endif /* NM_DEVICE_802_11_WIRELESS_H */
diff --git a/src/nm-device.c b/src/nm-device.c
index 93801f6897..1cbcbde1ff 100644
--- a/src/nm-device.c
+++ b/src/nm-device.c
@@ -331,7 +331,7 @@ nm_device_stop (NMDevice *self)
{
g_return_if_fail (self != NULL);
- nm_device_deactivate (self);
+ nm_device_deactivate (self, TRUE);
nm_device_bring_down (self);
if (self->priv->loop)
@@ -1493,7 +1493,7 @@ nm_device_activation_cancel (NMDevice *self)
*
*/
gboolean
-nm_device_deactivate_quickly (NMDevice *self)
+nm_device_deactivate_quickly (NMDevice *self, gboolean force)
{
NMData * app_data;
NMActRequest * act_request;
@@ -1528,7 +1528,7 @@ nm_device_deactivate_quickly (NMDevice *self)
/* Call device type-specific deactivation */
if (NM_DEVICE_GET_CLASS (self)->deactivate_quickly)
- NM_DEVICE_GET_CLASS (self)->deactivate_quickly (self);
+ NM_DEVICE_GET_CLASS (self)->deactivate_quickly (self, force);
g_signal_emit (G_OBJECT (self), nm_device_signals[DEACTIVATED], 0);
@@ -1542,7 +1542,7 @@ nm_device_deactivate_quickly (NMDevice *self)
*
*/
void
-nm_device_deactivate (NMDevice *self)
+nm_device_deactivate (NMDevice *self, gboolean force)
{
NMData * app_data;
NMIP4Config * config;
@@ -1552,7 +1552,7 @@ nm_device_deactivate (NMDevice *self)
nm_info ("Deactivating device %s.", nm_device_get_iface (self));
- nm_device_deactivate_quickly (self);
+ nm_device_deactivate_quickly (self, force);
app_data = self->priv->app_data;
diff --git a/src/nm-device.h b/src/nm-device.h
index aa623623c9..eac21d9764 100644
--- a/src/nm-device.h
+++ b/src/nm-device.h
@@ -103,7 +103,7 @@ struct _NMDeviceClass
NMIP4Config **config);
void (* deactivate) (NMDevice *self);
- void (* deactivate_quickly) (NMDevice *self);
+ void (* deactivate_quickly) (NMDevice *self, gboolean force);
void (* activation_failure_handler) (NMDevice *self,
struct NMActRequest *req);
@@ -204,8 +204,8 @@ void nm_device_activate_schedule_stage2_device_config (struct NMActRequest *r
void nm_device_activate_schedule_stage4_ip_config_get (struct NMActRequest *req);
void nm_device_activate_schedule_stage4_ip_config_timeout (struct NMActRequest *req);
void nm_device_activate_schedule_stage5_ip_config_commit (struct NMActRequest *req);
-void nm_device_deactivate (NMDevice *dev);
-gboolean nm_device_deactivate_quickly (NMDevice *dev);
+void nm_device_deactivate (NMDevice *dev, gboolean force);
+gboolean nm_device_deactivate_quickly (NMDevice *dev, gboolean force);
gboolean nm_device_is_activating (NMDevice *dev);
void nm_device_activation_cancel (NMDevice *dev);
gboolean nm_device_activation_should_cancel (NMDevice *self);