2008-05-28 Dan Williams <dcbw@redhat.com>
authorDan Williams <dcbw@redhat.com>
Wed, 28 May 2008 21:49:34 +0000 (21:49 +0000)
committerDan Williams <dcbw@redhat.com>
Wed, 28 May 2008 21:49:34 +0000 (21:49 +0000)
Patch from Benoit Boissinot <bboissin+networkmanager@gmail.com>

* 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

12 files changed:
ChangeLog
src/NetworkManagerSystem.c
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

index 79759c8..8542996 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,28 @@
 2008-05-28  Dan Williams  <dcbw@redhat.com>
 
+       Patch from Benoit Boissinot <bboissin+networkmanager@gmail.com>
+
+       * 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  <dcbw@redhat.com>
+
        * libnm-util/nm-setting-wireless.c
          libnm-util/nm-setting-wireless.h
                - (set_property, get_property, nm_setting_wireless_class_init): add the
index 80acebc..2a87ca2 100644 (file)
@@ -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);
+}
+
index 315855a..977b65b 100644 (file)
@@ -68,139 +68,6 @@ void nm_system_init (void)
 }
 
 /*
- * 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
  *
  * Bring up the loopback interface
index eb49a84..e1eb329 100644 (file)
@@ -57,28 +57,6 @@ void nm_system_init (void)
 }
 
 /*
- * 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
  *
  * Bring up the loopback interface
index d72bbd2..091b3b7 100644 (file)
@@ -51,37 +51,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
  *
  * Bring up the loopback interface
index 7c1249c..2ee1339 100644 (file)
@@ -59,37 +59,6 @@ void nm_generic_init (void)
 }
 
 /*
- * 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
  *
  * Bring up the loopback interface
index e2fa18f..4157ae7 100644 (file)
@@ -55,28 +55,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
  *
  * Bring up the loopback interface
index 9e8f05d..d774736 100644 (file)
@@ -54,29 +54,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
  *
  * Bring up the loopback interface
index 7e69e4e..d4fb0a7 100644 (file)
@@ -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
  *
index 93c467a..d6bfb66 100644 (file)
@@ -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
  *
index ee4d16a..d4377d6 100644 (file)
@@ -54,28 +54,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
  *
  * Bring up the loopback interface
index 2674c92..2fe3ea0 100644 (file)
@@ -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
  *