NetworkManager r3424 - in trunk: . src src/backends



Author: dcbw
Date: Tue Mar 11 22:21:25 2008
New Revision: 3424
URL: http://svn.gnome.org/viewvc/NetworkManager?rev=3424&view=rev

Log:
2008-03-11  Dan Williams  <dcbw redhat com>

	Fix address handling as a result of DHCP rebind/renew/reboot.

	* src/NetworkManagerSystem.c
		- (check_one_address): delete an address if it doesn't match a given
			one for the same interface
		- (nm_system_device_set_from_ip4_config): don't flush the default route,
			be smarter about flushing addresses (only flush ones that don't
			match the one we're about to apply)

	* src/backends/NetworkManagerDebian.c
	  src/backends/NetworkManagerSuSE.c
	  src/backends/NetworkManagerArch.c
	  src/backends/NetworkManagerSlackware.c
	  src/backends/NetworkManagerRedHat.c
	  src/backends/NetworkManagerPaldo.c
	  src/backends/NetworkManagerFrugalware.c
	  src/backends/NetworkManagerGentoo.c
		- (nm_system_delete_default_route): remove

	* src/backends/NetworkManagerGeneric.c
	  src/backends/NetworkManagerGeneric.h
		- (nm_generic_enable_loopback): fix the loopback device label
		- (nm_generic_delete_default_route): remove; no longer used



Modified:
   trunk/ChangeLog
   trunk/src/NetworkManagerSystem.c
   trunk/src/NetworkManagerSystem.h
   trunk/src/backends/NetworkManagerArch.c
   trunk/src/backends/NetworkManagerDebian.c
   trunk/src/backends/NetworkManagerFrugalware.c
   trunk/src/backends/NetworkManagerGeneric.c
   trunk/src/backends/NetworkManagerGeneric.h
   trunk/src/backends/NetworkManagerGentoo.c
   trunk/src/backends/NetworkManagerPaldo.c
   trunk/src/backends/NetworkManagerRedHat.c
   trunk/src/backends/NetworkManagerSlackware.c
   trunk/src/backends/NetworkManagerSuSE.c

Modified: trunk/src/NetworkManagerSystem.c
==============================================================================
--- trunk/src/NetworkManagerSystem.c	(original)
+++ trunk/src/NetworkManagerSystem.c	Tue Mar 11 22:21:25 2008
@@ -179,6 +179,36 @@
 }
 
 
+typedef struct {
+	const char *iface;
+	struct nl_handle *nlh;
+	struct rtnl_addr *match;
+} AddrCheckData;
+
+static void
+check_one_address (struct nl_object *object, void *user_data)
+{
+	AddrCheckData *data = (AddrCheckData *) user_data;
+	struct rtnl_addr *addr = (struct rtnl_addr *) object;
+	int err;
+
+	/* Delete addresses on this interface which don't match the one we
+	 * are about to add to it.
+	 */
+	if (nl_object_identical ((struct nl_object *) data->match, (struct nl_object *) addr))
+		return;
+	if (rtnl_addr_get_ifindex (addr) != rtnl_addr_get_ifindex (data->match))
+		return;
+	if (rtnl_addr_get_family (addr) != rtnl_addr_get_family (data->match))
+		return;
+
+	err = rtnl_addr_delete (data->nlh, addr, 0);
+	if (err < 0) {
+		nm_warning ("(%s) error %d returned from rtnl_addr_delete(): %s",
+		            data->iface, err, nl_geterror());
+	}
+}
+
 /*
  * nm_system_device_set_from_ip4_config
  *
@@ -192,8 +222,11 @@
 {
 	struct nl_handle *nlh = NULL;
 	struct rtnl_addr *addr = NULL;
+	struct nl_cache *addr_cache = NULL;
 	int len, i, err;
 	guint32 flags;
+	AddrCheckData check_data;
+	gboolean success = FALSE;
 
 	g_return_val_if_fail (iface != NULL, FALSE);
 	g_return_val_if_fail (config != NULL, FALSE);
@@ -202,23 +235,32 @@
 	if (!nlh)
 		return FALSE;
 
-	nm_system_delete_default_route ();
-	nm_system_device_flush_addresses_with_iface (iface);
-	nm_system_device_flush_routes_with_iface (iface);
-	nm_system_flush_arp_cache ();
+	addr_cache = rtnl_addr_alloc_cache (nlh);
+	if (!addr_cache)
+		goto out;
+	nl_cache_mngt_provide (addr_cache);
 
 	flags = NM_RTNL_ADDR_DEFAULT;
 	if (nm_ip4_config_get_ptp_address (config))
 		flags |= NM_RTNL_ADDR_PTP_ADDR;
 
-	if ((addr = nm_ip4_config_to_rtnl_addr (config, flags))) {
-		rtnl_addr_set_ifindex (addr, nm_netlink_iface_to_index (iface));
-
-		if ((err = rtnl_addr_add (nlh, addr, 0)) < 0)
-			nm_warning ("(%s) error %d returned from rtnl_addr_add():\n%s", iface, err, nl_geterror());
-		rtnl_addr_put (addr);
-	} else
+	addr = nm_ip4_config_to_rtnl_addr (config, flags);
+	if (!addr) {
 		nm_warning ("couldn't create rtnl address!\n");
+		goto out;
+	}
+	rtnl_addr_set_ifindex (addr, nm_netlink_iface_to_index (iface));
+
+	memset (&check_data, 0, sizeof (check_data));
+	check_data.iface = iface;
+	check_data.nlh = nlh;
+	check_data.match = addr;
+
+	/* Remove all addresses except the one we're about to add */
+	nl_cache_foreach (addr_cache, check_one_address, &check_data);
+
+	if ((err = rtnl_addr_add (nlh, addr, 0)) < 0)
+		nm_warning ("(%s) error %d returned from rtnl_addr_add():\n%s", iface, err, nl_geterror());
 
 	sleep (1);
 
@@ -234,7 +276,14 @@
 	if (nm_ip4_config_get_mtu (config))
 		nm_system_device_set_mtu (iface, nm_ip4_config_get_mtu (config));
 
-	return TRUE;
+	success = TRUE;
+
+out:
+	if (addr)
+		rtnl_addr_put (addr);
+	if (addr_cache)
+		nl_cache_free (addr_cache);
+	return success;
 }
 
 

Modified: trunk/src/NetworkManagerSystem.h
==============================================================================
--- trunk/src/NetworkManagerSystem.h	(original)
+++ trunk/src/NetworkManagerSystem.h	Tue Mar 11 22:21:25 2008
@@ -49,7 +49,6 @@
 
 void			nm_system_enable_loopback				(void);
 void			nm_system_flush_loopback_routes			(void);
-void			nm_system_delete_default_route			(void);
 void			nm_system_flush_arp_cache				(void);
 void			nm_system_kill_all_dhcp_daemons			(void);
 void			nm_system_update_dns					(void);

Modified: trunk/src/backends/NetworkManagerArch.c
==============================================================================
--- trunk/src/backends/NetworkManagerArch.c	(original)
+++ trunk/src/backends/NetworkManagerArch.c	Tue Mar 11 22:21:25 2008
@@ -272,18 +272,6 @@
 
 
 /*
- * nm_system_delete_default_route
- *
- * Remove the old default route in preparation for a new one
- *
- */
-void nm_system_delete_default_route (void)
-{
-	nm_generic_delete_default_route ();
-}
-
-
-/*
  * nm_system_flush_arp_cache
  *
  * Flush all entries in the arp cache.

Modified: trunk/src/backends/NetworkManagerDebian.c
==============================================================================
--- trunk/src/backends/NetworkManagerDebian.c	(original)
+++ trunk/src/backends/NetworkManagerDebian.c	Tue Mar 11 22:21:25 2008
@@ -150,18 +150,6 @@
 
 
 /*
- * nm_system_delete_default_route
- *
- * Remove the old default route in preparation for a new one
- *
- */
-void nm_system_delete_default_route (void)
-{
-	nm_generic_delete_default_route ();
-}
-
-
-/*
  * nm_system_flush_arp_cache
  *
  * Flush all entries in the arp cache.

Modified: trunk/src/backends/NetworkManagerFrugalware.c
==============================================================================
--- trunk/src/backends/NetworkManagerFrugalware.c	(original)
+++ trunk/src/backends/NetworkManagerFrugalware.c	Tue Mar 11 22:21:25 2008
@@ -142,18 +142,6 @@
 
 
 /*
- * nm_system_delete_default_route
- *
- * Remove the old default route in preparation for a new one
- *
- */
-void nm_system_delete_default_route (void)
-{
-	nm_spawn_process ("/usr/sbin/ip route del default");
-}
-
-
-/*
  * nm_system_kill_all_dhcp_daemons
  *
  * Kill all DHCP daemons currently running, done at startup.

Modified: trunk/src/backends/NetworkManagerGeneric.c
==============================================================================
--- trunk/src/backends/NetworkManagerGeneric.c	(original)
+++ trunk/src/backends/NetworkManagerGeneric.c	Tue Mar 11 22:21:25 2008
@@ -173,7 +173,7 @@
 void nm_generic_enable_loopback (void)
 {
 	nm_spawn_process (IP_BINARY_PATH" link set dev lo up");
-	nm_spawn_process (IP_BINARY_PATH" addr add 127.0.0.1/8 brd 127.255.255.255 dev lo scope host label loopback");
+	nm_spawn_process (IP_BINARY_PATH" addr add 127.0.0.1/8 brd 127.255.255.255 dev lo scope host label lo");
 }
 
 
@@ -191,18 +191,6 @@
 
 
 /*
- * nm_generic_delete_default_route
- *
- * Remove the old default route in preparation for a new one
- *
- */
-void nm_generic_delete_default_route (void)
-{
-	nm_spawn_process (IP_BINARY_PATH" route del default");
-}
-
-
-/*
  * nm_generic_flush_arp_cache
  *
  * Flush all entries in the arp cache.

Modified: trunk/src/backends/NetworkManagerGeneric.h
==============================================================================
--- trunk/src/backends/NetworkManagerGeneric.h	(original)
+++ trunk/src/backends/NetworkManagerGeneric.h	Tue Mar 11 22:21:25 2008
@@ -48,7 +48,6 @@
 
 void			nm_generic_enable_loopback				(void);
 void			nm_generic_flush_loopback_routes			(void);
-void			nm_generic_delete_default_route			(void);
 void			nm_generic_flush_arp_cache				(void);
 void			nm_generic_kill_all_dhcp_daemons			(void);
 void			nm_generic_update_dns					(void);

Modified: trunk/src/backends/NetworkManagerGentoo.c
==============================================================================
--- trunk/src/backends/NetworkManagerGentoo.c	(original)
+++ trunk/src/backends/NetworkManagerGentoo.c	Tue Mar 11 22:21:25 2008
@@ -161,17 +161,6 @@
 }
 
 /*
- * nm_system_delete_default_route
- *
- * Remove the old default route in preparation for a new one
- *
- */
-void nm_system_delete_default_route (void)
-{
-	nm_generic_delete_default_route ();
-}
-
-/*
  * nm_system_flush_arp_cache
  *
  * Flush all entries in the arp cache.

Modified: trunk/src/backends/NetworkManagerPaldo.c
==============================================================================
--- trunk/src/backends/NetworkManagerPaldo.c	(original)
+++ trunk/src/backends/NetworkManagerPaldo.c	Tue Mar 11 22:21:25 2008
@@ -165,18 +165,6 @@
 
 
 /*
- * nm_system_delete_default_route
- *
- * Remove the old default route in preparation for a new one
- *
- */
-void nm_system_delete_default_route (void)
-{
-	nm_generic_delete_default_route ();
-}
-
-
-/*
  * nm_system_flush_arp_cache
  *
  * Flush all entries in the arp cache.

Modified: trunk/src/backends/NetworkManagerRedHat.c
==============================================================================
--- trunk/src/backends/NetworkManagerRedHat.c	(original)
+++ trunk/src/backends/NetworkManagerRedHat.c	Tue Mar 11 22:21:25 2008
@@ -175,18 +175,6 @@
 
 
 /*
- * nm_system_delete_default_route
- *
- * Remove the old default route in preparation for a new one
- *
- */
-void nm_system_delete_default_route (void)
-{
-	nm_generic_delete_default_route ();
-}
-
-
-/*
  * nm_system_flush_arp_cache
  *
  * Flush all entries in the arp cache.

Modified: trunk/src/backends/NetworkManagerSlackware.c
==============================================================================
--- trunk/src/backends/NetworkManagerSlackware.c	(original)
+++ trunk/src/backends/NetworkManagerSlackware.c	Tue Mar 11 22:21:25 2008
@@ -149,18 +149,6 @@
 
 
 /*
- * nm_system_delete_default_route
- *
- * Remove the old default route in preparation for a new one
- *
- */
-void nm_system_delete_default_route (void)
-{
-	nm_generic_delete_default_route ();
-}
-
-
-/*
  * nm_system_kill_all_dhcp_daemons
  *
  * Kill all DHCP daemons currently running, done at startup.

Modified: trunk/src/backends/NetworkManagerSuSE.c
==============================================================================
--- trunk/src/backends/NetworkManagerSuSE.c	(original)
+++ trunk/src/backends/NetworkManagerSuSE.c	Tue Mar 11 22:21:25 2008
@@ -169,18 +169,6 @@
 
 
 /*
- * nm_system_delete_default_route
- *
- * Remove the old default route in preparation for a new one
- *
- */
-void nm_system_delete_default_route (void)
-{
-	nm_generic_delete_default_route ();
-}
-
-
-/*
  * nm_system_flush_arp_cache
  *
  * Flush all entries in the arp cache.



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]