summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorDan Williams <dcbw@redhat.com>2008-03-11 22:21:25 +0000
committerDan Williams <dcbw@redhat.com>2008-03-11 22:21:25 +0000
commit5663f3ba4056c19e8e72f2254e9b68ce8ade3d0a (patch)
treecd679420bd49b42c0504e15cfb66031fd7e572d0 /src
parent7009f91036e2be5b4e48ec437bce0186ff84f622 (diff)
downloadNetworkManager-5663f3ba4056c19e8e72f2254e9b68ce8ade3d0a.tar.gz
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 git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@3424 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
Diffstat (limited to 'src')
-rw-r--r--src/NetworkManagerSystem.c73
-rw-r--r--src/NetworkManagerSystem.h1
-rw-r--r--src/backends/NetworkManagerArch.c12
-rw-r--r--src/backends/NetworkManagerDebian.c12
-rw-r--r--src/backends/NetworkManagerFrugalware.c12
-rw-r--r--src/backends/NetworkManagerGeneric.c14
-rw-r--r--src/backends/NetworkManagerGeneric.h1
-rw-r--r--src/backends/NetworkManagerGentoo.c11
-rw-r--r--src/backends/NetworkManagerPaldo.c12
-rw-r--r--src/backends/NetworkManagerRedHat.c12
-rw-r--r--src/backends/NetworkManagerSlackware.c12
-rw-r--r--src/backends/NetworkManagerSuSE.c12
12 files changed, 62 insertions, 122 deletions
diff --git a/src/NetworkManagerSystem.c b/src/NetworkManagerSystem.c
index 603cd73ade..e6d156fc78 100644
--- a/src/NetworkManagerSystem.c
+++ b/src/NetworkManagerSystem.c
@@ -179,6 +179,36 @@ out:
}
+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 @@ nm_system_device_set_from_ip4_config (const char *iface,
{
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 @@ nm_system_device_set_from_ip4_config (const char *iface,
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 @@ nm_system_device_set_from_ip4_config (const char *iface,
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;
}
diff --git a/src/NetworkManagerSystem.h b/src/NetworkManagerSystem.h
index aa21795160..54ebf281cb 100644
--- a/src/NetworkManagerSystem.h
+++ b/src/NetworkManagerSystem.h
@@ -49,7 +49,6 @@ void nm_system_device_flush_addresses_with_iface (const char *iface);
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);
diff --git a/src/backends/NetworkManagerArch.c b/src/backends/NetworkManagerArch.c
index e8550f59df..92027809f9 100644
--- a/src/backends/NetworkManagerArch.c
+++ b/src/backends/NetworkManagerArch.c
@@ -272,18 +272,6 @@ void nm_system_flush_loopback_routes (void)
/*
- * 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.
diff --git a/src/backends/NetworkManagerDebian.c b/src/backends/NetworkManagerDebian.c
index a9acbe8cfe..8eb33553f8 100644
--- a/src/backends/NetworkManagerDebian.c
+++ b/src/backends/NetworkManagerDebian.c
@@ -150,18 +150,6 @@ void nm_system_flush_loopback_routes (void)
/*
- * 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.
diff --git a/src/backends/NetworkManagerFrugalware.c b/src/backends/NetworkManagerFrugalware.c
index 78d245690a..9342eacc37 100644
--- a/src/backends/NetworkManagerFrugalware.c
+++ b/src/backends/NetworkManagerFrugalware.c
@@ -142,18 +142,6 @@ void nm_system_enable_loopback (void)
/*
- * 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.
diff --git a/src/backends/NetworkManagerGeneric.c b/src/backends/NetworkManagerGeneric.c
index 50dd60f038..9d0d7fc265 100644
--- a/src/backends/NetworkManagerGeneric.c
+++ b/src/backends/NetworkManagerGeneric.c
@@ -173,7 +173,7 @@ void nm_generic_device_flush_addresses_with_iface (const char *iface)
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 @@ void nm_generic_flush_loopback_routes (void)
/*
- * 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.
diff --git a/src/backends/NetworkManagerGeneric.h b/src/backends/NetworkManagerGeneric.h
index f69b08c673..14c89d02ff 100644
--- a/src/backends/NetworkManagerGeneric.h
+++ b/src/backends/NetworkManagerGeneric.h
@@ -48,7 +48,6 @@ void nm_generic_device_flush_addresses_with_iface (const char *iface);
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);
diff --git a/src/backends/NetworkManagerGentoo.c b/src/backends/NetworkManagerGentoo.c
index 944bb8c575..23124add85 100644
--- a/src/backends/NetworkManagerGentoo.c
+++ b/src/backends/NetworkManagerGentoo.c
@@ -161,17 +161,6 @@ void nm_system_flush_loopback_routes (void)
}
/*
- * 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.
diff --git a/src/backends/NetworkManagerPaldo.c b/src/backends/NetworkManagerPaldo.c
index 9e457df449..f2507882cf 100644
--- a/src/backends/NetworkManagerPaldo.c
+++ b/src/backends/NetworkManagerPaldo.c
@@ -165,18 +165,6 @@ void nm_system_flush_loopback_routes (void)
/*
- * 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.
diff --git a/src/backends/NetworkManagerRedHat.c b/src/backends/NetworkManagerRedHat.c
index 7e3ce249da..ab4ce22204 100644
--- a/src/backends/NetworkManagerRedHat.c
+++ b/src/backends/NetworkManagerRedHat.c
@@ -175,18 +175,6 @@ void nm_system_flush_loopback_routes (void)
/*
- * 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.
diff --git a/src/backends/NetworkManagerSlackware.c b/src/backends/NetworkManagerSlackware.c
index 599534d6f4..18229ae120 100644
--- a/src/backends/NetworkManagerSlackware.c
+++ b/src/backends/NetworkManagerSlackware.c
@@ -149,18 +149,6 @@ void nm_system_enable_loopback (void)
/*
- * 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.
diff --git a/src/backends/NetworkManagerSuSE.c b/src/backends/NetworkManagerSuSE.c
index eeefb66c7c..5fb0fd78ab 100644
--- a/src/backends/NetworkManagerSuSE.c
+++ b/src/backends/NetworkManagerSuSE.c
@@ -169,18 +169,6 @@ void nm_system_flush_loopback_routes (void)
/*
- * 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.