summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Williams <dcbw@redhat.com>2007-08-08 16:40:47 +0000
committerDan Williams <dcbw@redhat.com>2007-08-08 16:40:47 +0000
commit9030e5ac6ababa7e46334c987cad9263862b6dfb (patch)
tree245757df80dbc2cfa7f32bd9cf0ec44581cf0388
parente2297aef24a17dc9b17198ae60c92b346d08f63a (diff)
downloadNetworkManager-9030e5ac6ababa7e46334c987cad9263862b6dfb.tar.gz
2007-08-08 Dan Williams <dcbw@redhat.com>
* src/nm-device-802-11-wireless.[ch] - (nm_device_802_11_wireless_get_frequency): reenable * src/nm-device-802-11-mesh-olpc.c - MPP functionality will only be activated on channels 1, 6, 11 - Increased DHCP timeout from 15 seconds to 20 seconds * src/dhcp-manager/nm-dhcp-manager.c - Spawn dhclient with a lease file, and remove that lease file after dhclient exists. Makes DHCP faster because it doesn't have to do the initial REQUEST state, and we don't expect the machines to be as stationary. - Cancelling a DHCP transaction is now synchronous. There isn't any locking, and the cancel can happen from different threads but that shouldn't happen. * src/nm-device.c src/nm-device-802-11-mesh-olpc.c - Updates for synchronous cancel git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/branches/nm-0-6-olpc@2657 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
-rw-r--r--ChangeLog22
-rw-r--r--src/dhcp-manager/nm-dhcp-manager.c133
-rw-r--r--src/dhcp-manager/nm-dhcp-manager.h13
-rw-r--r--src/nm-device-802-11-mesh-olpc.c26
-rw-r--r--src/nm-device-802-11-wireless.c4
-rw-r--r--src/nm-device-802-11-wireless.h2
-rw-r--r--src/nm-device.c5
7 files changed, 107 insertions, 98 deletions
diff --git a/ChangeLog b/ChangeLog
index 2357b0fa92..3e91769738 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,25 @@
+2007-08-08 Dan Williams <dcbw@redhat.com>
+
+ * src/nm-device-802-11-wireless.[ch]
+ - (nm_device_802_11_wireless_get_frequency): reenable
+
+ * src/nm-device-802-11-mesh-olpc.c
+ - MPP functionality will only be activated on channels 1, 6, 11
+ - Increased DHCP timeout from 15 seconds to 20 seconds
+
+ * src/dhcp-manager/nm-dhcp-manager.c
+ - Spawn dhclient with a lease file, and remove that lease file
+ after dhclient exists. Makes DHCP faster because it doesn't
+ have to do the initial REQUEST state, and we don't expect the
+ machines to be as stationary.
+ - Cancelling a DHCP transaction is now synchronous. There isn't
+ any locking, and the cancel can happen from different threads
+ but that shouldn't happen.
+
+ * src/nm-device.c
+ src/nm-device-802-11-mesh-olpc.c
+ - Updates for synchronous cancel
+
2007-07-31 Dan Williams <dcbw@redhat.com>
* src/nm-device-802-11-wireless.c
diff --git a/src/dhcp-manager/nm-dhcp-manager.c b/src/dhcp-manager/nm-dhcp-manager.c
index c807582cfe..f56dcaf95f 100644
--- a/src/dhcp-manager/nm-dhcp-manager.c
+++ b/src/dhcp-manager/nm-dhcp-manager.c
@@ -49,7 +49,6 @@ typedef struct {
guchar state;
GPid dhclient_pid;
GSource * timeout_source;
- GSource * cancel_source;
GSource * watch_source;
NMDHCPManager * manager;
GHashTable * options;
@@ -82,13 +81,23 @@ static char *
get_pidfile_for_iface (const char * iface)
{
return g_strdup_printf ("%s/%s-%s.%s",
- NM_DHCP_MANAGER_PID_DIR,
+ NM_DHCP_MANAGER_RUN_DIR,
NM_DHCP_MANAGER_PID_FILENAME,
iface,
NM_DHCP_MANAGER_PID_FILE_EXT);
}
+static char *
+get_leasefile_for_iface (const char * iface)
+{
+ return g_strdup_printf ("%s/%s-%s.%s",
+ NM_DHCP_MANAGER_RUN_DIR,
+ NM_DHCP_MANAGER_LEASE_FILENAME,
+ iface,
+ NM_DHCP_MANAGER_LEASE_FILE_EXT);
+}
+
NMDHCPManager *
nm_dhcp_manager_get (NMData * data)
{
@@ -177,17 +186,6 @@ nm_info ("%s: %s():%d cleared timeout source %p", device->iface, __func__, __LIN
}
static void
-nm_dhcp_device_cancel_cleanup (NMDHCPDevice * device)
-{
- if (!device->cancel_source)
- return;
-nm_info ("%s(): cleaning up cancel source %p\n", __func__, device->cancel_source);
- g_source_destroy (device->cancel_source);
- g_source_unref (device->cancel_source);
- device->cancel_source = NULL;
-}
-
-static void
nm_dhcp_device_watch_cleanup (NMDHCPDevice * device)
{
if (!device->watch_source)
@@ -202,8 +200,6 @@ nm_dhcp_device_destroy (NMDHCPDevice *device)
{
nm_info ("%s(): calling timeout_cleanup\n", __func__);
nm_dhcp_device_timeout_cleanup (device);
-nm_info ("%s(): calling cancel_cleanup\n", __func__);
- nm_dhcp_device_cancel_cleanup (device);
nm_dhcp_device_watch_cleanup (device);
g_hash_table_remove_all (device->options);
g_free (device->iface);
@@ -457,9 +453,9 @@ nm_dhcp_manager_handle_timeout (gpointer user_data)
nm_info ("Device '%s' DHCP transaction took too long (>%ds), stopping it.",
device->iface, NM_DHCP_TIMEOUT);
- g_signal_emit (G_OBJECT (device->manager), signals[TIMEOUT], 0, device->iface);
+ nm_dhcp_manager_cancel_transaction (device->manager, device->iface);
- nm_dhcp_manager_cancel_transaction (device->manager, device->iface, FALSE);
+ g_signal_emit (G_OBJECT (device->manager), signals[TIMEOUT], 0, device->iface);
return FALSE;
}
@@ -555,6 +551,7 @@ dhclient_run (NMDHCPDevice *device, gchar *xtra_arg)
GPid pid;
GError * error = NULL;
char * pidfile = NULL;
+ char * leasefile = NULL;
gboolean success = FALSE;
NMDHCPManagerPrivate * priv;
@@ -577,6 +574,12 @@ dhclient_run (NMDHCPDevice *device, gchar *xtra_arg)
goto out;
}
+ leasefile = get_leasefile_for_iface (device->iface);
+ if (!leasefile) {
+ nm_warning ("%s: not enough memory for dhclient options.", device->iface);
+ goto out;
+ }
+
// FIXME: look for existing pidfile and kill dhclient
dhclient_argv = g_ptr_array_new ();
@@ -594,6 +597,9 @@ dhclient_run (NMDHCPDevice *device, gchar *xtra_arg)
g_ptr_array_add (dhclient_argv, (gpointer) "-pf"); /* Set pid file */
g_ptr_array_add (dhclient_argv, (gpointer) pidfile);
+ g_ptr_array_add (dhclient_argv, (gpointer) "-lf"); /* Set lease file */
+ g_ptr_array_add (dhclient_argv, (gpointer) leasefile);
+
g_ptr_array_add (dhclient_argv, (gpointer) device->iface);
g_ptr_array_add (dhclient_argv, NULL);
@@ -618,6 +624,7 @@ dhclient_run (NMDHCPDevice *device, gchar *xtra_arg)
success = TRUE;
out:
+ g_free (leasefile);
g_free (pidfile);
g_ptr_array_free (dhclient_argv, TRUE);
return success;
@@ -670,20 +677,38 @@ nm_dhcp_manager_cancel_transaction_real (NMDHCPDevice *device, gboolean blocking
{
int i = 20; /* 4 seconds */
char * pidfile;
+ char * leasefile;
+nm_info ("%s(): enter, pid %d\n", __func__, device->dhclient_pid);
if (!device->dhclient_pid)
+{
+nm_info ("%s(): returning, zero pid %d\n", __func__, device->dhclient_pid);
return;
+}
+nm_info ("%s(): kill -TERM-ing pid %d\n", __func__, device->dhclient_pid);
kill (device->dhclient_pid, SIGTERM);
/* Yes, the state has to reach DHC_END. */
+nm_info ("%s(): waiting for %d to exit\n", __func__, device->dhclient_pid);
while (blocking && i-- > 0) {
gint child_status;
- if (waitpid (device->dhclient_pid, &child_status, WNOHANG) > 0)
+ int ret;
+ ret = waitpid (device->dhclient_pid, &child_status, WNOHANG);
+ if (ret > 0) {
break;
+ } else if (ret == -1) {
+ /* Child already exited */
+ if (errno == ECHILD)
+ break;
+ /* Otherwise, force kill the process */
+ i = 0;
+ break;
+ }
g_usleep (G_USEC_PER_SEC / 5);
}
+nm_info ("%s(): i was %d after wait pid %d\n", __func__, i, device->dhclient_pid);
if (i <= 0) {
nm_warning ("%s: dhclient pid %d didn't exit, will kill it.",
device->iface, device->dhclient_pid);
@@ -693,19 +718,29 @@ nm_dhcp_manager_cancel_transaction_real (NMDHCPDevice *device, gboolean blocking
device->iface,
device->dhclient_pid);
+ device->dhclient_pid = 0;
+ device->state = DHC_END;
+
/* Clean up the pidfile if it got left around */
pidfile = get_pidfile_for_iface (device->iface);
if (pidfile) {
remove (pidfile);
g_free (pidfile);
}
- device->dhclient_pid = 0;
- device->state = DHC_END;
+
+ /* Clean up the leasefile if it got left around */
+ leasefile = get_leasefile_for_iface (device->iface);
+ if (leasefile) {
+ remove (leasefile);
+ g_free (leasefile);
+ }
nm_dhcp_device_watch_cleanup (device);
nm_info ("%s(): calling timeout_cleanup\n", __func__);
nm_dhcp_device_timeout_cleanup (device);
g_hash_table_remove_all (device->options);
+
+nm_info ("%s(): exit\n", __func__);
}
@@ -717,8 +752,7 @@ nm_info ("%s(): calling timeout_cleanup\n", __func__);
*/
void
nm_dhcp_manager_cancel_transaction (NMDHCPManager *manager,
- const char *iface,
- gboolean blocking)
+ const char *iface)
{
NMDHCPDevice *device;
NMDHCPManagerPrivate *priv;
@@ -733,62 +767,7 @@ nm_dhcp_manager_cancel_transaction (NMDHCPManager *manager,
if (!device || !device->dhclient_pid)
return;
- nm_dhcp_manager_cancel_transaction_real (device, blocking);
-}
-
-
-static gboolean
-handle_request_cancel (gpointer user_data)
-{
- NMDHCPDevice *device = (NMDHCPDevice *) user_data;
-
-nm_info ("%s: %s() started with cancel source %p...\n", device->iface, __func__, device->cancel_source);
nm_dhcp_manager_cancel_transaction_real (device, TRUE);
-nm_info ("%s: %s() calling cancel_cleanup for cancel source %p\n", device->iface, __func__, device->cancel_source);
- nm_dhcp_device_cancel_cleanup (device);
-nm_info ("%s: %s() done with cancel source %p.\n", device->iface, __func__, device->cancel_source);
- return FALSE;
-}
-
-
-/*
- * nm_dhcp_manager_request_cancel_transaction
- *
- * Request that any in-progress transaction be canceled.
- *
- */
-void
-nm_dhcp_manager_request_cancel_transaction (NMDHCPManager *manager,
- const char *iface,
- gboolean blocking)
-{
- NMDHCPDevice *device;
- NMDHCPManagerPrivate *priv;
-
- g_return_if_fail (NM_IS_DHCP_MANAGER (manager));
- g_return_if_fail (iface != NULL);
-
- priv = NM_DHCP_MANAGER_GET_PRIVATE (manager);
-
- device = (NMDHCPDevice *) g_hash_table_lookup (priv->devices, iface);
-
- if (!device || !device->dhclient_pid)
- return;
-
- if (!device->cancel_source) {
- device->cancel_source = g_idle_source_new ();
-nm_info ("%s(): created cancel source %p\n", __func__, device->cancel_source);
- g_source_set_priority (device->cancel_source, G_PRIORITY_HIGH_IDLE);
- g_source_set_callback (device->cancel_source,
- handle_request_cancel,
- device,
- NULL);
- g_source_attach (device->cancel_source,
- priv->data->main_context);
- }
-
- while (blocking && device->cancel_source)
- g_usleep (G_USEC_PER_SEC / 10);
}
diff --git a/src/dhcp-manager/nm-dhcp-manager.h b/src/dhcp-manager/nm-dhcp-manager.h
index 1c002bae2d..7af8c3c2b0 100644
--- a/src/dhcp-manager/nm-dhcp-manager.h
+++ b/src/dhcp-manager/nm-dhcp-manager.h
@@ -32,10 +32,14 @@
#define NM_IS_DHCP_MANAGER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), NM_TYPE_DHCP_MANAGER))
#define NM_DHCP_MANAGER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NM_TYPE_DHCP_MANAGER, NMDHCPManagerClass))
-#define NM_DHCP_MANAGER_PID_DIR "/var/run"
+#define NM_DHCP_MANAGER_RUN_DIR "/var/run"
+
#define NM_DHCP_MANAGER_PID_FILENAME "dhclient"
#define NM_DHCP_MANAGER_PID_FILE_EXT "pid"
+#define NM_DHCP_MANAGER_LEASE_FILENAME "dhclient"
+#define NM_DHCP_MANAGER_LEASE_FILE_EXT "lease"
+
#define DHCP_CALLOUT_INTERFACE "org.freedesktop.nm_dhcp_client"
typedef enum {
@@ -78,15 +82,10 @@ gboolean nm_dhcp_manager_begin_transaction (NMDHCPManager *manager,
const char *iface,
guint32 timeout);
void nm_dhcp_manager_cancel_transaction (NMDHCPManager *manager,
- const char *iface,
- gboolean blocking);
+ const char *iface);
NMIP4Config * nm_dhcp_manager_get_ip4_config (NMDHCPManager *manager, const char *iface);
NMDHCPState nm_dhcp_manager_get_state_for_device (NMDHCPManager *manager, const char *iface);
gboolean nm_dhcp_manager_process_signal (NMDHCPManager *manager, DBusMessage *message);
-void nm_dhcp_manager_request_cancel_transaction (NMDHCPManager *manager,
- const char *iface,
- gboolean blocking);
-
#endif /* NM_DHCP_MANAGER_H */
diff --git a/src/nm-device-802-11-mesh-olpc.c b/src/nm-device-802-11-mesh-olpc.c
index 0b770be387..f3f3e8976a 100644
--- a/src/nm-device-802-11-mesh-olpc.c
+++ b/src/nm-device-802-11-mesh-olpc.c
@@ -48,7 +48,7 @@
#define IPV4LL_HOSTMASK 0x0000FFFFL
#define IPV4LL_BROADCAST 0xA9FEFFFFL
-#define MESH_DHCP_TIMEOUT 15 /* in seconds */
+#define MESH_DHCP_TIMEOUT 20 /* in seconds */
#define ETC_DHCLIENT_CONF_PATH SYSCONFDIR"/dhclient.conf"
#define MESH_STEP_FILE SYSCONFDIR"/NetworkManager/mesh-start"
@@ -176,7 +176,7 @@ struct _NMDevice80211MeshOLPCPrivate
* 2. Try last successful AP connection
* a. if success then CONNECTED/DONE
*
- * 3. For each channel in [1...14]
+ * 3. For each channel in [1, 6, 11]
* a. try DHCP
* b. if DHCP times out, try next channel
* c. if DHCP response includes a link-local IP address,
@@ -798,9 +798,8 @@ real_deactivate_quickly (NMDevice *dev)
if (nm_device_get_use_dhcp (dev)) {
nm_info ("%s: will stop DHCP", nm_device_get_iface (dev));
- nm_dhcp_manager_request_cancel_transaction (dhcp_mgr,
- nm_device_get_iface (dev),
- FALSE);
+ nm_dhcp_manager_cancel_transaction (dhcp_mgr,
+ nm_device_get_iface (dev));
}
/* Remove any dhclient.conf file we may have created for mshX */
@@ -1211,6 +1210,7 @@ mpp_device_activated_cb (GObject * obj,
NMDevice80211MeshOLPC * self = NM_DEVICE_802_11_MESH_OLPC (user_data);
NMDevice * primary_dev = NM_DEVICE (obj);
const char * iface;
+ double freq;
g_return_if_fail (self != NULL);
g_return_if_fail (primary_dev != NULL);
@@ -1218,6 +1218,15 @@ mpp_device_activated_cb (GObject * obj,
if (self->priv->mpp.primary)
mpp_cleanup (self);
+ /* Only do MPP stuff on 1, 6, 11 */
+ if (nm_device_is_802_11_wireless (primary_dev)) {
+ freq = nm_device_802_11_wireless_get_frequency (NM_DEVICE_802_11_WIRELESS (primary_dev));
+ freq /= 1000000;
+ if ((freq != 2412) && (freq != 2437) && (freq != 2462))
+ goto out;
+ nm_info ("%s: primary dev freq = %f", nm_device_get_iface (primary_dev), freq);
+ }
+
self->priv->mpp.primary = primary_dev;
g_object_ref (self->priv->mpp.primary);
@@ -1496,7 +1505,7 @@ get_next_channel (NMDevice80211MeshOLPC * self)
inc = 5;
break;
case MESH_S3_XO_MPP:
- inc = 1;
+ inc = 5;
break;
default:
nm_info ("%s: %s():%d unhandled step %d",
@@ -1953,9 +1962,8 @@ real_act_stage4_get_ip4_config (NMDevice *dev,
/* Kill dhclient; we don't need it anymore after MPP discovery here
* because we're ignoring the returned lease.
*/
- nm_dhcp_manager_request_cancel_transaction (dhcp_manager,
- nm_device_get_iface (NM_DEVICE (self)),
- TRUE);
+ nm_dhcp_manager_cancel_transaction (dhcp_manager,
+ nm_device_get_iface (NM_DEVICE (self)));
if (ret != NM_ACT_STAGE_RETURN_SUCCESS)
goto out;
break;
diff --git a/src/nm-device-802-11-wireless.c b/src/nm-device-802-11-wireless.c
index 2f987cfdd4..b98254cdc0 100644
--- a/src/nm-device-802-11-wireless.c
+++ b/src/nm-device-802-11-wireless.c
@@ -1469,14 +1469,13 @@ nm_device_802_11_wireless_set_essid (NMDevice80211Wireless *self,
}
-#if 0
/*
* nm_device_get_frequency
*
* For wireless devices, get the frequency we broadcast/receive on.
*
*/
-static double
+double
nm_device_802_11_wireless_get_frequency (NMDevice80211Wireless *self)
{
NMSock * sk;
@@ -1509,6 +1508,7 @@ nm_device_802_11_wireless_get_frequency (NMDevice80211Wireless *self)
return freq;
}
+#if 0
/*
* nm_device_set_frequency
*
diff --git a/src/nm-device-802-11-wireless.h b/src/nm-device-802-11-wireless.h
index ff85891d95..1c480f6e72 100644
--- a/src/nm-device-802-11-wireless.h
+++ b/src/nm-device-802-11-wireless.h
@@ -126,6 +126,8 @@ void nm_device_802_11_wireless_register_scan_approval_hook (NMDevice80211Wireles
NMScanApprovalHook hook,
gpointer user_data);
+double nm_device_802_11_wireless_get_frequency (NMDevice80211Wireless *self);
+
G_END_DECLS
#endif /* NM_DEVICE_802_11_WIRELESS_H */
diff --git a/src/nm-device.c b/src/nm-device.c
index 8d91814311..93801f6897 100644
--- a/src/nm-device.c
+++ b/src/nm-device.c
@@ -1513,9 +1513,8 @@ nm_device_deactivate_quickly (NMDevice *self)
if (nm_device_get_use_dhcp (self)) {
nm_info ("%s: will stop DHCP", nm_device_get_iface (self));
- nm_dhcp_manager_request_cancel_transaction (NM_DEVICE_GET_PRIVATE (self)->dhcp_manager,
- nm_device_get_iface (self),
- FALSE);
+ nm_dhcp_manager_cancel_transaction (NM_DEVICE_GET_PRIVATE (self)->dhcp_manager,
+ nm_device_get_iface (self));
}
/* Tear down an existing activation request, which may not have happened