summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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);