2005-02-09 Dan Williams <dcbw@redhat.com>

* Clean up usage of GSList objects and looping through their members
	* Clean up DHCP rebind/renew timeouts, hopefully they will work correctly
		now.
	* Fix problem where even if scanning was turned off, card would still
		cycle through frequencies.


git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@423 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
This commit is contained in:
Dan Williams
2005-02-10 04:39:40 +00:00
parent 943aaff0a8
commit a88c6427ef
7 changed files with 92 additions and 93 deletions

View File

@@ -1,3 +1,11 @@
2005-02-09 Dan Williams <dcbw@redhat.com>
* Clean up usage of GSList objects and looping through their members
* Clean up DHCP rebind/renew timeouts, hopefully they will work correctly
now.
* Fix problem where even if scanning was turned off, card would still
cycle through frequencies.
2005-02-08 Dan Williams <dcbw@redhat.com> 2005-02-08 Dan Williams <dcbw@redhat.com>
* panel-applet/NMWirelessApplet.c * panel-applet/NMWirelessApplet.c

View File

@@ -158,8 +158,6 @@ NMDevice * nm_create_device_and_add_to_list (NMData *data, const char *udi, cons
*/ */
void nm_remove_device_from_list (NMData *data, const char *udi) void nm_remove_device_from_list (NMData *data, const char *udi)
{ {
GSList *element;
g_return_if_fail (data != NULL); g_return_if_fail (data != NULL);
g_return_if_fail (udi != NULL); g_return_if_fail (udi != NULL);
@@ -168,10 +166,10 @@ void nm_remove_device_from_list (NMData *data, const char *udi)
*/ */
if (nm_try_acquire_mutex (data->dev_list_mutex, __FUNCTION__)) if (nm_try_acquire_mutex (data->dev_list_mutex, __FUNCTION__))
{ {
element = data->dev_list; GSList *elt;
while (element) for (elt = data->dev_list; elt; elt = g_slist_next (elt))
{ {
NMDevice *dev = (NMDevice *)(element->data); NMDevice *dev = (NMDevice *)(elt->data);
if (dev && (nm_null_safe_strcmp (nm_device_get_udi (dev), udi) == 0)) if (dev && (nm_null_safe_strcmp (nm_device_get_udi (dev), udi) == 0))
{ {
@@ -187,14 +185,13 @@ void nm_remove_device_from_list (NMData *data, const char *udi)
nm_device_unref (dev); nm_device_unref (dev);
/* Remove the device entry from the device list and free its data */ /* Remove the device entry from the device list and free its data */
data->dev_list = g_slist_remove_link (data->dev_list, element); data->dev_list = g_slist_remove_link (data->dev_list, elt);
nm_device_unref (element->data); nm_device_unref (elt->data);
g_slist_free (element); g_slist_free (elt);
nm_policy_schedule_state_update (data); nm_policy_schedule_state_update (data);
nm_dbus_signal_device_status_change (data->dbus_connection, dev, DEVICE_LIST_CHANGE); nm_dbus_signal_device_status_change (data->dbus_connection, dev, DEVICE_LIST_CHANGE);
break; break;
} }
element = g_slist_next (element);
} }
nm_unlock_mutex (data->dev_list_mutex, __FUNCTION__); nm_unlock_mutex (data->dev_list_mutex, __FUNCTION__);
} else syslog( LOG_ERR, "nm_remove_device_from_list() could not acquire device list mutex." ); } else syslog( LOG_ERR, "nm_remove_device_from_list() could not acquire device list mutex." );
@@ -426,7 +423,6 @@ void nm_schedule_status_signal_broadcast (NMData *data)
gboolean nm_link_state_monitor (gpointer user_data) gboolean nm_link_state_monitor (gpointer user_data)
{ {
NMData *data = (NMData *)user_data; NMData *data = (NMData *)user_data;
GSList *element;
g_return_val_if_fail (data != NULL, TRUE); g_return_val_if_fail (data != NULL, TRUE);
@@ -435,10 +431,10 @@ gboolean nm_link_state_monitor (gpointer user_data)
*/ */
if (nm_try_acquire_mutex (data->dev_list_mutex, __FUNCTION__)) if (nm_try_acquire_mutex (data->dev_list_mutex, __FUNCTION__))
{ {
element = data->dev_list; GSList *elt;
while (element) for (elt = data->dev_list; elt; elt = g_slist_next (elt))
{ {
NMDevice *dev = (NMDevice *)(element->data); NMDevice *dev = (NMDevice *)(elt->data);
if (dev) if (dev)
{ {
@@ -455,11 +451,6 @@ gboolean nm_link_state_monitor (gpointer user_data)
*/ */
nm_device_update_best_ap (dev); nm_device_update_best_ap (dev);
} }
/* Check if the device's IP address has changed
* (ie dhcp lease renew/address change)
*/
nm_device_update_ip4_address (dev);
} }
else else
{ {
@@ -474,8 +465,6 @@ gboolean nm_link_state_monitor (gpointer user_data)
nm_system_device_flush_addresses (dev); nm_system_device_flush_addresses (dev);
} }
} }
element = g_slist_next (element);
} }
nm_unlock_mutex (data->dev_list_mutex, __FUNCTION__); nm_unlock_mutex (data->dev_list_mutex, __FUNCTION__);
@@ -610,8 +599,8 @@ static gboolean sigterm_pipe_handler (GIOChannel *src, GIOCondition condition, g
{ {
NMData *data = user_data; NMData *data = user_data;
syslog (LOG_NOTICE, "Caught terminiation signal"); syslog (LOG_NOTICE, "Caught terminiation signal");
if (data->active_device && nm_device_is_activating (data->active_device)) if (data->active_device)
nm_device_activation_cancel (data->active_device); nm_device_deactivate (data->active_device, FALSE);
g_main_loop_quit (data->main_loop); g_main_loop_quit (data->main_loop);
return FALSE; return FALSE;
} }

View File

@@ -546,16 +546,14 @@ void nm_ap_set_user_created (NMAccessPoint *ap, gboolean user_created)
GSList *nm_ap_get_user_addresses (const NMAccessPoint *ap) GSList *nm_ap_get_user_addresses (const NMAccessPoint *ap)
{ {
GSList *new = NULL; GSList *new = NULL;
GSList *elem = NULL; GSList *elt = NULL;
g_return_val_if_fail (ap != NULL, NULL); g_return_val_if_fail (ap != NULL, NULL);
elem = ap->user_addresses; for (elt = ap->user_addresses; elt; elt = g_slist_next (elt))
while (elem)
{ {
if (elem->data) if (elt->data)
new = g_slist_append (new, g_strdup (elem->data)); new = g_slist_append (new, g_strdup (elt->data));
elem = g_slist_next (elem);
} }
/* Return a _deep__copy_ of the address list */ /* Return a _deep__copy_ of the address list */
@@ -564,27 +562,23 @@ GSList *nm_ap_get_user_addresses (const NMAccessPoint *ap)
void nm_ap_set_user_addresses (NMAccessPoint *ap, GSList *list) void nm_ap_set_user_addresses (NMAccessPoint *ap, GSList *list)
{ {
GSList *elem = NULL; GSList *elt = NULL;
GSList *new = NULL; GSList *new = NULL;
g_return_if_fail (ap != NULL); g_return_if_fail (ap != NULL);
/* Free existing list */ /* Free existing list */
elem = ap->user_addresses; for (elt = ap->user_addresses; elt; elt = g_slist_next (elt))
while (elem)
{ {
if (elem->data) if (elt->data)
g_free (elem->data); g_free (elt->data);
elem = g_slist_next (elem);
} }
/* Copy new list and set as our own */ /* Copy new list and set as our own */
elem = list; for (elt = list; elt; elt = g_slist_next (elt))
while (elem)
{ {
if (elem->data) if (elt->data)
new = g_slist_append (new, g_strdup (elem->data)); new = g_slist_append (new, g_strdup (elt->data));
elem = g_slist_next (elem);
} }
ap->user_addresses = new; ap->user_addresses = new;

View File

@@ -164,7 +164,7 @@ void nm_ap_list_append_ap (NMAccessPointList *list, NMAccessPoint *ap)
*/ */
void nm_ap_list_remove_ap (NMAccessPointList *list, NMAccessPoint *ap) void nm_ap_list_remove_ap (NMAccessPointList *list, NMAccessPoint *ap)
{ {
GSList *element = NULL; GSList *elt = NULL;
g_return_if_fail (list != NULL); g_return_if_fail (list != NULL);
g_return_if_fail (ap != NULL); g_return_if_fail (ap != NULL);
@@ -175,19 +175,17 @@ void nm_ap_list_remove_ap (NMAccessPointList *list, NMAccessPoint *ap)
return; return;
} }
element = list->ap_list; for (elt = list->ap_list; elt; elt = g_slist_next (elt))
while (element)
{ {
NMAccessPoint *list_ap = (NMAccessPoint *)(element->data); NMAccessPoint *list_ap = (NMAccessPoint *)(elt->data);
if (list_ap == ap) if (list_ap == ap)
{ {
list->ap_list = g_slist_remove_link (list->ap_list, element); list->ap_list = g_slist_remove_link (list->ap_list, elt);
nm_ap_unref (list_ap); nm_ap_unref (list_ap);
g_slist_free (element); g_slist_free (elt);
break; break;
} }
element = g_slist_next (element);
} }
nm_ap_list_unlock (list); nm_ap_list_unlock (list);
} }
@@ -262,18 +260,17 @@ NMAccessPoint *nm_ap_list_get_ap_by_address (NMAccessPointList *list, const stru
if (!success && (user_addrs = nm_ap_get_user_addresses (ap))) if (!success && (user_addrs = nm_ap_get_user_addresses (ap)))
{ {
char char_addr[20]; char char_addr[20];
GSList *elem = user_addrs; GSList *elt;
memset (&char_addr[0], 0, 20); memset (&char_addr[0], 0, 20);
ether_ntoa_r (addr, &char_addr[0]); ether_ntoa_r (addr, &char_addr[0]);
while (elem) for (elt = user_addrs; elt; elt = g_slist_next (elt))
{ {
if (elem->data && !strcmp (elem->data, &char_addr[0])) if (elt->data && !strcmp (elt->data, &char_addr[0]))
{ {
success = TRUE; success = TRUE;
break; break;
} }
elem = g_slist_next (elem);
} }
g_slist_foreach (user_addrs, (GFunc)g_free, NULL); g_slist_foreach (user_addrs, (GFunc)g_free, NULL);

View File

@@ -349,6 +349,9 @@ gboolean nm_device_dhcp_rebind (gpointer user_data)
nm_system_device_flush_addresses (dev); nm_system_device_flush_addresses (dev);
nm_device_update_ip4_address (dev); nm_device_update_ip4_address (dev);
nm_policy_schedule_state_update (dev->app_data); nm_policy_schedule_state_update (dev->app_data);
dhcp_interface_free (dev->dhcp_iface);
dev->dhcp_iface = NULL;
return (FALSE); return (FALSE);
} }
else else
@@ -357,9 +360,6 @@ gboolean nm_device_dhcp_rebind (gpointer user_data)
nm_device_dhcp_setup_timeouts (dev); nm_device_dhcp_setup_timeouts (dev);
} }
dhcp_interface_free (dev->dhcp_iface);
dev->dhcp_iface = NULL;
/* Always return false to remove ourselves, since we just /* Always return false to remove ourselves, since we just
* set up another timeout above. * set up another timeout above.
*/ */

View File

@@ -101,12 +101,12 @@ static NMDevice *nm_dbus_get_device_from_object_path (NMData *data, const char *
/* Iterate over device list */ /* Iterate over device list */
if (nm_try_acquire_mutex (data->dev_list_mutex, __FUNCTION__)) if (nm_try_acquire_mutex (data->dev_list_mutex, __FUNCTION__))
{ {
GSList *element = data->dev_list; GSList *elt;
char compare_path[100]; char compare_path[100];
while (element) for (elt = data->dev_list; elt; elt = g_slist_next (elt))
{ {
if ((dev = (NMDevice *)(element->data))) if ((dev = (NMDevice *)(elt->data)))
{ {
snprintf (compare_path, 100, "%s/%s", NM_DBUS_PATH_DEVICES, nm_device_get_iface (dev)); snprintf (compare_path, 100, "%s/%s", NM_DBUS_PATH_DEVICES, nm_device_get_iface (dev));
/* Compare against our constructed path, but ignore any trailing elements */ /* Compare against our constructed path, but ignore any trailing elements */
@@ -114,7 +114,6 @@ static NMDevice *nm_dbus_get_device_from_object_path (NMData *data, const char *
break; break;
dev = NULL; dev = NULL;
} }
element = g_slist_next (element);
} }
nm_unlock_mutex (data->dev_list_mutex, __FUNCTION__); nm_unlock_mutex (data->dev_list_mutex, __FUNCTION__);
} }

View File

@@ -131,22 +131,19 @@ static gboolean nm_device_supports_wireless_scan (NMDevice *dev)
NMDevice *nm_get_device_by_udi (NMData *data, const char *udi) NMDevice *nm_get_device_by_udi (NMData *data, const char *udi)
{ {
NMDevice *dev = NULL; NMDevice *dev = NULL;
GSList *element; GSList *elt;
g_return_val_if_fail (data != NULL, NULL); g_return_val_if_fail (data != NULL, NULL);
g_return_val_if_fail (udi != NULL, NULL); g_return_val_if_fail (udi != NULL, NULL);
element = data->dev_list; for (elt = data->dev_list; elt; elt = g_slist_next (elt))
while (element)
{ {
dev = (NMDevice *)(element->data); dev = (NMDevice *)(elt->data);
if (dev) if (dev)
{ {
if (nm_null_safe_strcmp (nm_device_get_udi (dev), udi) == 0) if (nm_null_safe_strcmp (nm_device_get_udi (dev), udi) == 0)
break; break;
} }
element = g_slist_next (element);
} }
return (dev); return (dev);
@@ -166,15 +163,14 @@ NMDevice *nm_get_device_by_iface (NMData *data, const char *iface)
{ {
NMDevice *iter_dev = NULL; NMDevice *iter_dev = NULL;
NMDevice *found_dev = NULL; NMDevice *found_dev = NULL;
GSList *element; GSList *elt;
g_return_val_if_fail (data != NULL, NULL); g_return_val_if_fail (data != NULL, NULL);
g_return_val_if_fail (iface != NULL, NULL); g_return_val_if_fail (iface != NULL, NULL);
element = data->dev_list; for (elt = data->dev_list; elt; elt = g_slist_next (elt))
while (element)
{ {
iter_dev = (NMDevice *)(element->data); iter_dev = (NMDevice *)(elt->data);
if (iter_dev) if (iter_dev)
{ {
if (nm_null_safe_strcmp (nm_device_get_iface (iter_dev), iface) == 0) if (nm_null_safe_strcmp (nm_device_get_iface (iter_dev), iface) == 0)
@@ -183,8 +179,6 @@ NMDevice *nm_get_device_by_iface (NMData *data, const char *iface)
break; break;
} }
} }
element = g_slist_next (element);
} }
return (found_dev); return (found_dev);
@@ -390,6 +384,13 @@ gboolean nm_device_unref (NMDevice *dev)
g_mutex_free (dev->options.wireless.best_ap_mutex); g_mutex_free (dev->options.wireless.best_ap_mutex);
} }
/* Get rid of DHCP state data */
if (dev->dhcp_iface)
{
dhcp_interface_free (dev->dhcp_iface);
dev->dhcp_iface = NULL;
}
g_free (dev->udi); g_free (dev->udi);
g_free (dev->iface); g_free (dev->iface);
memset (dev, 0, sizeof (NMDevice)); memset (dev, 0, sizeof (NMDevice));
@@ -440,13 +441,23 @@ static gpointer nm_device_worker (gpointer user_data)
g_source_remove (dev->rebind_timeout); g_source_remove (dev->rebind_timeout);
} }
/* Remove any DHCP timeouts that might have been running */
if (dev->renew_timeout)
{
g_source_remove (dev->renew_timeout);
dev->renew_timeout = 0;
}
if (dev->rebind_timeout)
{
g_source_remove (dev->rebind_timeout);
dev->rebind_timeout = 0;
}
g_main_loop_unref (dev->loop); g_main_loop_unref (dev->loop);
g_main_context_unref (dev->context); g_main_context_unref (dev->context);
dev->loop = NULL; dev->loop = NULL;
dev->context = NULL; dev->context = NULL;
dev->renew_timeout = 0;
dev->rebind_timeout = 0;
dev->worker_done = TRUE; dev->worker_done = TRUE;
nm_device_unref (dev); nm_device_unref (dev);
@@ -2133,6 +2144,9 @@ get_ap:
*/ */
nm_device_set_essid (dev, nm_ap_get_essid (best_ap)); nm_device_set_essid (dev, nm_ap_get_essid (best_ap));
/* We grab the scan mutex so that scanning cannot screw up our link detection, since
* a scan can change most any attribute on the card for a period of time.
*/
nm_device_set_now_scanning (dev, FALSE); nm_device_set_now_scanning (dev, FALSE);
nm_lock_mutex (dev->options.wireless.scan_mutex, __FUNCTION__); nm_lock_mutex (dev->options.wireless.scan_mutex, __FUNCTION__);
@@ -2140,7 +2154,7 @@ get_ap:
{ {
/* Some Cisco cards (340/350 PCMCIA) don't return non-broadcasting APs /* Some Cisco cards (340/350 PCMCIA) don't return non-broadcasting APs
* in their scan results, so we can't know beforehand whether or not the * in their scan results, so we can't know beforehand whether or not the
* AP was encrypted. So we have to update their encryption status on the fly. * AP was encrypted. We have to update their encryption status on the fly.
*/ */
if (nm_ap_get_encrypted (best_ap) || nm_ap_is_enc_key_valid (best_ap)) if (nm_ap_get_encrypted (best_ap) || nm_ap_is_enc_key_valid (best_ap))
{ {
@@ -2413,19 +2427,9 @@ static gboolean nm_device_activate (gpointer user_data)
else else
syslog (LOG_DEBUG, "Activation (%s) IP configuration/DHCP unsuccessful! Ending activation...\n", nm_device_get_iface (dev)); syslog (LOG_DEBUG, "Activation (%s) IP configuration/DHCP unsuccessful! Ending activation...\n", nm_device_get_iface (dev));
/* Setup DHCP timeouts if we need to renew/rebind at any point */
if (nm_device_config_get_use_dhcp (dev) && dev->dhcp_iface)
nm_device_dhcp_setup_timeouts (dev);
finished = TRUE; finished = TRUE;
out: out:
if (dev->dhcp_iface)
{
dhcp_interface_free (dev->dhcp_iface);
dev->dhcp_iface = NULL;
}
syslog (LOG_DEBUG, "Activation (%s) ended.\n", nm_device_get_iface (dev)); syslog (LOG_DEBUG, "Activation (%s) ended.\n", nm_device_get_iface (dev));
dev->activating = FALSE; dev->activating = FALSE;
dev->quit_activation = FALSE; dev->quit_activation = FALSE;
@@ -2516,10 +2520,22 @@ gboolean nm_device_deactivate (NMDevice *dev, gboolean just_added)
if (nm_device_get_driver_support_level (dev) == NM_DRIVER_UNSUPPORTED) if (nm_device_get_driver_support_level (dev) == NM_DRIVER_UNSUPPORTED)
return (TRUE); return (TRUE);
/* Remove any DHCP timeouts we may have had running */
if (dev->renew_timeout > 0)
{
g_source_remove (dev->renew_timeout);
dev->renew_timeout = 0;
}
if (dev->rebind_timeout > 0)
{
g_source_remove (dev->rebind_timeout);
dev->rebind_timeout = 0;
}
/* Take out any entries in the routing table and any IP address the device had. */ /* Take out any entries in the routing table and any IP address the device had. */
nm_system_device_flush_routes (dev); nm_system_device_flush_routes (dev);
nm_system_device_flush_addresses (dev); nm_system_device_flush_addresses (dev);
dev->ip4_address = 0; nm_device_update_ip4_address (dev);
if (!just_added && (dev == dev->app_data->active_device)) if (!just_added && (dev == dev->app_data->active_device))
nm_dbus_signal_device_status_change (dev->app_data->dbus_connection, dev, DEVICE_NO_LONGER_ACTIVE); nm_dbus_signal_device_status_change (dev->app_data->dbus_connection, dev, DEVICE_NO_LONGER_ACTIVE);
@@ -3260,15 +3276,14 @@ static gboolean nm_device_wireless_process_scan_results (gpointer user_data)
/* Devices that don't support scanning have their pseudo-scanning done in /* Devices that don't support scanning have their pseudo-scanning done in
* the main thread anyway. * the main thread anyway.
*/ */
if (!nm_device_supports_wireless_scan (dev)) if (!nm_device_get_supports_wireless_scan (dev))
{ {
nm_device_do_pseudo_scan (dev); nm_device_do_pseudo_scan (dev);
return FALSE; return FALSE;
} }
/* Translate iwlib scan results to NM access point list */ /* Translate iwlib scan results to NM access point list */
tmp_ap = results->scan_head.result; for (tmp_ap = results->scan_head.result; tmp_ap; tmp_ap = tmp_ap->next)
while (tmp_ap)
{ {
/* We need at least an ESSID or a MAC address for each access point */ /* We need at least an ESSID or a MAC address for each access point */
if (tmp_ap->b.has_essid || tmp_ap->has_ap_addr) if (tmp_ap->b.has_essid || tmp_ap->has_ap_addr)
@@ -3344,7 +3359,6 @@ static gboolean nm_device_wireless_process_scan_results (gpointer user_data)
} }
nm_ap_unref (nm_ap); nm_ap_unref (nm_ap);
} }
tmp_ap = tmp_ap->next;
} }
/* If we detected any blank-ESSID access points (ie don't broadcast their ESSID), then try to /* If we detected any blank-ESSID access points (ie don't broadcast their ESSID), then try to
@@ -3362,7 +3376,7 @@ static gboolean nm_device_wireless_process_scan_results (gpointer user_data)
{ {
NMAccessPoint *outdated_ap; NMAccessPoint *outdated_ap;
GSList *outdated_list = NULL; GSList *outdated_list = NULL;
GSList *elem; GSList *elt;
NMAccessPoint *best_ap = nm_device_get_best_ap (dev); NMAccessPoint *best_ap = nm_device_get_best_ap (dev);
while ((outdated_ap = nm_ap_list_iter_next (iter))) while ((outdated_ap = nm_ap_list_iter_next (iter)))
@@ -3393,16 +3407,14 @@ static gboolean nm_device_wireless_process_scan_results (gpointer user_data)
/* Ok, now remove outdated ones. We have to do it after the lock /* Ok, now remove outdated ones. We have to do it after the lock
* because nm_ap_list_remove_ap() locks the list too. * because nm_ap_list_remove_ap() locks the list too.
*/ */
elem = outdated_list; for (elt = outdated_list; elt; elt = g_slist_next (elt))
while (elem)
{ {
if ((outdated_ap = (NMAccessPoint *)(elem->data))) if ((outdated_ap = (NMAccessPoint *)(elt->data)))
{ {
nm_dbus_signal_wireless_network_change (dev->app_data->dbus_connection, dev, outdated_ap, TRUE); nm_dbus_signal_wireless_network_change (dev->app_data->dbus_connection, dev, outdated_ap, TRUE);
nm_ap_list_remove_ap (nm_device_ap_list_get (dev), outdated_ap); nm_ap_list_remove_ap (nm_device_ap_list_get (dev), outdated_ap);
list_changed = TRUE; list_changed = TRUE;
} }
elem = g_slist_next (elem);
} }
g_slist_free (outdated_list); g_slist_free (outdated_list);
} }
@@ -3433,7 +3445,7 @@ static gboolean nm_device_wireless_scan (gpointer user_data)
g_return_val_if_fail (dev->app_data != NULL, FALSE); g_return_val_if_fail (dev->app_data != NULL, FALSE);
/* We don't scan on test devices or devices that don't have scanning support */ /* We don't scan on test devices or devices that don't have scanning support */
if (dev->test_device || !nm_device_supports_wireless_scan (dev)) if (dev->test_device || !nm_device_get_supports_wireless_scan (dev))
return FALSE; return FALSE;
/* Just reschedule ourselves if scanning or all wireless is disabled */ /* Just reschedule ourselves if scanning or all wireless is disabled */