diff options
author | Dan Williams <dcbw@redhat.com> | 2008-03-11 22:21:25 +0000 |
---|---|---|
committer | Dan Williams <dcbw@redhat.com> | 2008-03-11 22:21:25 +0000 |
commit | 5663f3ba4056c19e8e72f2254e9b68ce8ade3d0a (patch) | |
tree | cd679420bd49b42c0504e15cfb66031fd7e572d0 /src | |
parent | 7009f91036e2be5b4e48ec437bce0186ff84f622 (diff) | |
download | NetworkManager-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.c | 73 | ||||
-rw-r--r-- | src/NetworkManagerSystem.h | 1 | ||||
-rw-r--r-- | src/backends/NetworkManagerArch.c | 12 | ||||
-rw-r--r-- | src/backends/NetworkManagerDebian.c | 12 | ||||
-rw-r--r-- | src/backends/NetworkManagerFrugalware.c | 12 | ||||
-rw-r--r-- | src/backends/NetworkManagerGeneric.c | 14 | ||||
-rw-r--r-- | src/backends/NetworkManagerGeneric.h | 1 | ||||
-rw-r--r-- | src/backends/NetworkManagerGentoo.c | 11 | ||||
-rw-r--r-- | src/backends/NetworkManagerPaldo.c | 12 | ||||
-rw-r--r-- | src/backends/NetworkManagerRedHat.c | 12 | ||||
-rw-r--r-- | src/backends/NetworkManagerSlackware.c | 12 | ||||
-rw-r--r-- | src/backends/NetworkManagerSuSE.c | 12 |
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. |