From 34bba77f612cae99c12c64e1db91475fb8c0defb Mon Sep 17 00:00:00 2001 From: Dan Williams Date: Wed, 28 May 2008 21:49:34 +0000 Subject: [PATCH] 2008-05-28 Dan Williams Patch from Benoit Boissinot * src/NetworkManagerSystem.c - (nm_system_device_flush_ip4_routes_with_iface): implement with libnl - (nm_system_vpn_device_set_from_ip4_config): don't flush routes here, was causing -EINVAL errors since the libnl code actually does flush the routes on VPN interfaces now * src/backends/NetworkManagerArch.c src/backends/NetworkManagerDebian.c src/backends/NetworkManagerFrugalware.c src/backends/NetworkManagerGeneric.c src/backends/NetworkManagerGentoo.c src/backends/NetworkManagerMandriva.c src/backends/NetworkManagerPaldo.c src/backends/NetworkManagerRedHat.c src/backends/NetworkManagerSlackware.c src/backends/NetworkManagerSuSE.c - (nm_system_device_flush_ip4_routes, nm_system_device_flush_ip4_routes_with_iface): remove git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@3698 4912f4e0-d625-0410-9fb7-b9a5a253dbdc --- ChangeLog | 23 ++++ src/NetworkManagerSystem.c | 78 +++++++++++++- src/backends/NetworkManagerArch.c | 133 ------------------------ src/backends/NetworkManagerDebian.c | 22 ---- src/backends/NetworkManagerFrugalware.c | 31 ------ src/backends/NetworkManagerGeneric.c | 31 ------ src/backends/NetworkManagerGentoo.c | 22 ---- src/backends/NetworkManagerMandriva.c | 23 ---- src/backends/NetworkManagerPaldo.c | 24 ----- src/backends/NetworkManagerRedHat.c | 24 ----- src/backends/NetworkManagerSlackware.c | 22 ---- src/backends/NetworkManagerSuSE.c | 24 ----- 12 files changed, 97 insertions(+), 360 deletions(-) diff --git a/ChangeLog b/ChangeLog index 79759c87f1..8542996422 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,26 @@ +2008-05-28 Dan Williams + + Patch from Benoit Boissinot + + * src/NetworkManagerSystem.c + - (nm_system_device_flush_ip4_routes_with_iface): implement with libnl + - (nm_system_vpn_device_set_from_ip4_config): don't flush routes here, + was causing -EINVAL errors since the libnl code actually does flush + the routes on VPN interfaces now + + * src/backends/NetworkManagerArch.c + src/backends/NetworkManagerDebian.c + src/backends/NetworkManagerFrugalware.c + src/backends/NetworkManagerGeneric.c + src/backends/NetworkManagerGentoo.c + src/backends/NetworkManagerMandriva.c + src/backends/NetworkManagerPaldo.c + src/backends/NetworkManagerRedHat.c + src/backends/NetworkManagerSlackware.c + src/backends/NetworkManagerSuSE.c + - (nm_system_device_flush_ip4_routes, + nm_system_device_flush_ip4_routes_with_iface): remove + 2008-05-28 Dan Williams * libnm-util/nm-setting-wireless.c diff --git a/src/NetworkManagerSystem.c b/src/NetworkManagerSystem.c index 80acebc38a..2a87ca2f43 100644 --- a/src/NetworkManagerSystem.c +++ b/src/NetworkManagerSystem.c @@ -367,10 +367,6 @@ nm_system_vpn_device_set_from_ip4_config (NMDevice *active_device, if (nm_ip4_config_get_mtu (config)) nm_system_device_set_mtu (iface, nm_ip4_config_get_mtu (config)); - sleep (1); - - nm_system_device_flush_ip4_routes_with_iface (iface); - if (g_slist_length (routes) == 0) { nm_system_device_replace_default_ip4_route (iface, 0, 0); } else { @@ -705,3 +701,77 @@ void nm_system_device_flush_ip4_addresses_with_iface (const char *iface) nl_cache_free (addr_cache); } +/* + * nm_system_device_flush_ip4_routes + * + * Flush all network addresses associated with a network device + * + */ +void nm_system_device_flush_ip4_routes (NMDevice *dev) +{ + g_return_if_fail (dev != NULL); + + nm_system_device_flush_ip4_routes_with_iface (nm_device_get_iface (dev)); +} + +typedef struct { + const char *iface; + struct nl_handle *nlh; + int iface_idx; +} RouteCheckData; + +static void +check_one_route (struct nl_object *object, void *user_data) +{ + RouteCheckData *data = (RouteCheckData *) user_data; + struct rtnl_route *route = (struct rtnl_route *) object; + int err; + + /* Delete all IPv4 routes from this interface */ + if (rtnl_route_get_oif (route) != data->iface_idx) + return; + if (rtnl_route_get_family (route) != AF_INET) + return; + + err = rtnl_route_del (data->nlh, route, 0); + if (err < 0) { + nm_warning ("(%s) error %d returned from rtnl_route_del(): %s", + data->iface, err, nl_geterror()); + } +} + +/* + * nm_system_device_flush_ip4_routes_with_iface + * + * Flush all routes associated with a network device + * + */ +void nm_system_device_flush_ip4_routes_with_iface (const char *iface) +{ + struct nl_handle *nlh = NULL; + struct nl_cache *route_cache = NULL; + int iface_idx; + RouteCheckData check_data; + + g_return_if_fail (iface != NULL); + iface_idx = nm_netlink_iface_to_index (iface); + g_return_if_fail (iface_idx >= 0); + + nlh = nm_netlink_get_default_handle (); + g_return_if_fail (nlh != NULL); + + memset (&check_data, 0, sizeof (check_data)); + check_data.iface = iface; + check_data.nlh = nlh; + check_data.iface_idx = iface_idx; + + route_cache = rtnl_route_alloc_cache (nlh); + g_return_if_fail (route_cache != NULL); + nl_cache_mngt_provide (route_cache); + + /* Remove routing table entries */ + nl_cache_foreach (route_cache, check_one_route, &check_data); + + nl_cache_free (route_cache); +} + diff --git a/src/backends/NetworkManagerArch.c b/src/backends/NetworkManagerArch.c index 315855a110..977b65bf78 100644 --- a/src/backends/NetworkManagerArch.c +++ b/src/backends/NetworkManagerArch.c @@ -67,139 +67,6 @@ void nm_system_init (void) nm_generic_init (); } -/* - * nm_system_device_flush_ip4_addresses - * - * Flush all network addresses associated with a network device - * - */ -void nm_system_device_flush_ip4_routes (NMDevice *dev) -{ - nm_generic_device_flush_ip4_routes (dev); -} - -/* - * nm_system_device_flush_ip4_routes_with_iface - * - * Flush all routes associated with a network device - * - */ -void nm_system_device_flush_ip4_routes_with_iface (const char *iface) -{ - nm_generic_device_flush_ip4_routes_with_iface (iface); -} - -/* - * nm_system_device_setup_static_ip4_config - * - * Set up the device with a particular IPv4 address/netmask/gateway. - * - * Returns: TRUE on success - * FALSE on error - * - */ -#if 0 -gboolean nm_system_device_setup_static_ip4_config (NMDevice *dev) -{ -#define IPBITS (sizeof (guint32) * 8) - struct in_addr temp_addr; - struct in_addr temp_addr2; - char *s_tmp; - char *s_tmp2; - int i; - guint32 addr; - guint32 netmask; - guint32 prefix = IPBITS; /* initialize with # bits in ipv4 address */ - guint32 broadcast; - char *buf; - int err; - const char *iface; - - g_return_val_if_fail (dev != NULL, FALSE); - g_return_val_if_fail (!nm_device_config_get_use_dhcp (dev), FALSE); - - addr = nm_device_config_get_ip4_address (dev); - netmask = nm_device_config_get_ip4_netmask (dev); - iface = nm_device_get_iface (dev); - broadcast = nm_device_config_get_ip4_broadcast (dev); - - /* get the prefix from the netmask */ - for (i = 0; i < IPBITS; i++) - { - if (!(ntohl (netmask) & ((2 << i) - 1))) - prefix--; - } - - /* Calculate the broadcast address if the user didn't specify one */ - if (!broadcast) - broadcast = ((addr & (int)netmask) | ~(int)netmask); - - /* - * Try and work out if someone else has our IP - * using RFC 2131 Duplicate Address Detection - */ - temp_addr.s_addr = addr; - buf = g_strdup_printf ("%s -q -D -c 1 -I %s %s",ARPING, - iface, inet_ntoa (temp_addr)); - if ((err = nm_spawn_process (buf))) - { - nm_warning ("Error: Duplicate address '%s' detected for " - "device '%s' \n", iface, inet_ntoa (temp_addr)); - goto error; - } - g_free (buf); - - /* set our IP address */ - temp_addr.s_addr = addr; - temp_addr2.s_addr = broadcast; - s_tmp = g_strdup (inet_ntoa (temp_addr)); - s_tmp2 = g_strdup (inet_ntoa (temp_addr2)); - buf = g_strdup_printf ("/sbin/ip addr add %s/%d brd %s dev %s label %s", - s_tmp, prefix, s_tmp2, iface, iface); - g_free (s_tmp); - g_free (s_tmp2); - if ((err = nm_spawn_process (buf))) - { - nm_warning ("Error: could not set network configuration for " - "device '%s' using command:\n '%s'", - iface, buf); - goto error; - } - g_free (buf); - - /* Alert other computers of our new address */ - temp_addr.s_addr = addr; - buf = g_strdup_printf ("%s -q -A -c 1 -I %s %s", ARPING,iface, - inet_ntoa (temp_addr)); - nm_spawn_process (buf); - g_free (buf); - g_usleep (G_USEC_PER_SEC * 2); - buf = g_strdup_printf ("%s -q -U -c 1 -I %s %s", ARPING, iface, - inet_ntoa (temp_addr)); - nm_spawn_process (buf); - g_free (buf); - - /* set the default route to be this device's gateway */ - temp_addr.s_addr = nm_device_config_get_ip4_gateway (dev); - buf = g_strdup_printf ("/sbin/ip route replace default via %s dev %s", - inet_ntoa (temp_addr), iface); - if ((err = nm_spawn_process (buf))) - { - nm_warning ("Error: could not set default route using " - "command:\n '%s'", buf); - goto error; - } - g_free (buf); - return(TRUE); - - error: - g_free (buf); - nm_system_device_flush_ip4_addresses (dev); - nm_system_device_flush_ip4_routes (dev); - return(FALSE); -} -#endif - /* * nm_system_enable_loopback * diff --git a/src/backends/NetworkManagerDebian.c b/src/backends/NetworkManagerDebian.c index eb49a842e8..e1eb329a8b 100644 --- a/src/backends/NetworkManagerDebian.c +++ b/src/backends/NetworkManagerDebian.c @@ -56,28 +56,6 @@ void nm_system_init (void) nm_generic_init (); } -/* - * nm_system_device_flush_ip4_addresses - * - * Flush all network addresses associated with a network device - * - */ -void nm_system_device_flush_ip4_routes (NMDevice *dev) -{ - nm_generic_device_flush_ip4_routes (dev); -} - -/* - * nm_system_device_flush_ip4_routes_with_iface - * - * Flush all routes associated with a network device - * - */ -void nm_system_device_flush_ip4_routes_with_iface (const char *iface) -{ - nm_generic_device_flush_ip4_routes_with_iface (iface); -} - /* * nm_system_enable_loopback * diff --git a/src/backends/NetworkManagerFrugalware.c b/src/backends/NetworkManagerFrugalware.c index d72bbd2c94..091b3b740c 100644 --- a/src/backends/NetworkManagerFrugalware.c +++ b/src/backends/NetworkManagerFrugalware.c @@ -50,37 +50,6 @@ void nm_system_init (void) { } -/* - * nm_system_device_flush_ip4_routes - * - * Flush all routes associated with a network device - * - */ -void nm_system_device_flush_ip4_routes (NMDevice *dev) -{ - g_return_if_fail (dev != NULL); - - nm_system_device_flush_ip4_routes_with_iface (nm_device_get_iface (dev)); -} - -/* - * nm_system_device_flush_ip4_routes_with_iface - * - * Flush all routes associated with a network device - * - */ -void nm_system_device_flush_ip4_routes_with_iface (const char *iface) -{ - char *buf; - - g_return_if_fail (iface != NULL); - - /* Remove routing table entries */ - buf = g_strdup_printf ("/usr/sbin/ip -4 route flush dev %s", iface); - nm_spawn_process (buf); - g_free (buf); -} - /* * nm_system_enable_loopback * diff --git a/src/backends/NetworkManagerGeneric.c b/src/backends/NetworkManagerGeneric.c index 7c1249c6fd..2ee1339333 100644 --- a/src/backends/NetworkManagerGeneric.c +++ b/src/backends/NetworkManagerGeneric.c @@ -58,37 +58,6 @@ void nm_generic_init (void) nm_system_kill_all_dhcp_daemons (); } -/* - * nm_generic_device_flush_ip4_addresses - * - * Flush all network addresses associated with a network device - * - */ -void nm_generic_device_flush_ip4_routes (NMDevice *dev) -{ - g_return_if_fail (dev != NULL); - - nm_system_device_flush_ip4_routes_with_iface (nm_device_get_iface (dev)); -} - -/* - * nm_generic_device_flush_ip4_routes_with_iface - * - * Flush all routes associated with a network device - * - */ -void nm_generic_device_flush_ip4_routes_with_iface (const char *iface) -{ - char *buf; - - g_return_if_fail (iface != NULL); - - /* Remove routing table entries */ - buf = g_strdup_printf (IP_BINARY_PATH" -4 route flush dev %s", iface); - nm_spawn_process (buf); - g_free (buf); -} - /* * nm_generic_enable_loopback * diff --git a/src/backends/NetworkManagerGentoo.c b/src/backends/NetworkManagerGentoo.c index e2fa18fbb3..4157ae7098 100644 --- a/src/backends/NetworkManagerGentoo.c +++ b/src/backends/NetworkManagerGentoo.c @@ -54,28 +54,6 @@ void nm_system_init (void) nm_generic_init (); } -/* - * nm_system_device_flush_ip4_routes - * - * Flush all routes associated with a network device - * - */ -void nm_system_device_flush_ip4_routes (NMDevice *dev) -{ - nm_generic_device_flush_ip4_routes (dev); -} - -/* - * nm_system_device_flush_ip4_routes_with_iface - * - * Flush all routes associated with a network device - * - */ -void nm_system_device_flush_ip4_routes_with_iface (const char *iface) -{ - nm_generic_device_flush_ip4_routes_with_iface (iface); -} - /* * nm_system_enable_loopback * diff --git a/src/backends/NetworkManagerMandriva.c b/src/backends/NetworkManagerMandriva.c index 9e8f05d4ce..d774736232 100644 --- a/src/backends/NetworkManagerMandriva.c +++ b/src/backends/NetworkManagerMandriva.c @@ -53,29 +53,6 @@ void nm_system_init (void) } -/* - * nm_system_device_flush_ip4_routes - * - * Flush all routes associated with a network device - * - */ -void nm_system_device_flush_ip4_routes (NMDevice *dev) -{ - nm_generic_device_flush_ip4_routes (dev); -} - - -/* - * nm_system_device_flush_ip4_routes_with_iface - * - * Flush all routes associated with a network device - * - */ -void nm_system_device_flush_ip4_routes_with_iface (const char *iface) -{ - nm_generic_device_flush_ip4_routes_with_iface (iface); -} - /* * nm_system_enable_loopback * diff --git a/src/backends/NetworkManagerPaldo.c b/src/backends/NetworkManagerPaldo.c index 7e69e4e83f..d4fb0a7bbf 100644 --- a/src/backends/NetworkManagerPaldo.c +++ b/src/backends/NetworkManagerPaldo.c @@ -53,30 +53,6 @@ void nm_system_init (void) nm_generic_init (); } - -/* - * nm_system_device_flush_ip4_routes - * - * Flush all routes associated with a network device - * - */ -void nm_system_device_flush_ip4_routes (NMDevice *dev) -{ - nm_generic_device_flush_ip4_routes (dev); -} - - -/* - * nm_system_device_flush_ip4_routes_with_iface - * - * Flush all routes associated with a network device - * - */ -void nm_system_device_flush_ip4_routes_with_iface (const char *iface) -{ - nm_generic_device_flush_ip4_routes_with_iface (iface); -} - /* * nm_system_enable_loopback * diff --git a/src/backends/NetworkManagerRedHat.c b/src/backends/NetworkManagerRedHat.c index 93c467a2d6..d6bfb6672a 100644 --- a/src/backends/NetworkManagerRedHat.c +++ b/src/backends/NetworkManagerRedHat.c @@ -50,30 +50,6 @@ void nm_system_init (void) nm_generic_init (); } - -/* - * nm_system_device_flush_ip4_routes - * - * Flush all routes associated with a network device - * - */ -void nm_system_device_flush_ip4_routes (NMDevice *dev) -{ - nm_generic_device_flush_ip4_routes (dev); -} - - -/* - * nm_system_device_flush_ip4_routes_with_iface - * - * Flush all routes associated with a network device - * - */ -void nm_system_device_flush_ip4_routes_with_iface (const char *iface) -{ - nm_generic_device_flush_ip4_routes_with_iface (iface); -} - /* * nm_system_enable_loopback * diff --git a/src/backends/NetworkManagerSlackware.c b/src/backends/NetworkManagerSlackware.c index ee4d16ad75..d4377d6df3 100644 --- a/src/backends/NetworkManagerSlackware.c +++ b/src/backends/NetworkManagerSlackware.c @@ -53,28 +53,6 @@ void nm_system_init (void) nm_generic_init (); } -/* - * nm_system_device_flush_ip4_routes - * - * Flush all routes associated with a network device - * - */ -void nm_system_device_flush_ip4_routes (NMDevice *dev) -{ - nm_generic_device_flush_ip4_routes (dev); -} - -/* - * nm_system_device_flush_ip4_routes_with_iface - * - * Flush all routes associated with a network device - * - */ -void nm_system_device_flush_ip4_routes_with_iface (const char *iface) -{ - nm_generic_device_flush_ip4_routes_with_iface (iface); -} - /* * nm_system_enable_loopback * diff --git a/src/backends/NetworkManagerSuSE.c b/src/backends/NetworkManagerSuSE.c index 2674c9245f..2fe3ea02cc 100644 --- a/src/backends/NetworkManagerSuSE.c +++ b/src/backends/NetworkManagerSuSE.c @@ -59,30 +59,6 @@ void nm_system_init (void) nm_generic_init (); } - -/* - * nm_system_device_flush_ip4_routes - * - * Flush all routes associated with a network device - * - */ -void nm_system_device_flush_ip4_routes (NMDevice *dev) -{ - nm_generic_device_flush_ip4_routes (dev); -} - - -/* - * nm_system_device_flush_ip4_routes_with_iface - * - * Flush all routes associated with a network device - * - */ -void nm_system_device_flush_ip4_routes_with_iface (const char *iface) -{ - nm_generic_device_flush_ip4_routes_with_iface (iface); -} - /* * nm_system_enable_loopback *