2008-04-25 Dan Williams <dcbw@redhat.com>
authorDan Williams <dcbw@redhat.com>
Fri, 25 Apr 2008 19:30:05 +0000 (19:30 +0000)
committerDan Williams <dcbw@redhat.com>
Fri, 25 Apr 2008 19:30:05 +0000 (19:30 +0000)
Patch from Benoit Boissinot <bboissin+networkmanager@gmail.com>

* src/NetworkManagerSystem.c
- (nm_system_device_replace_default_ip4_route): new function; a libnl
implementation of nm_system_device_replace_default_route()

* src/NetworkManagerPolicy.c
- (update_default_route): use nm_system_device_replace_default_ip4_route()

* src/backends/NetworkManagerArch.c
  src/backends/NetworkManagerDebian.c
  src/backends/NetworkManagerFrugalware.c
  src/backends/NetworkManagerGeneric.c
  src/backends/NetworkManagerGeneric.h
  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_replace_default_route): remove

git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@3597 4912f4e0-d625-0410-9fb7-b9a5a253dbdc

15 files changed:
ChangeLog
src/NetworkManagerPolicy.c
src/NetworkManagerSystem.c
src/NetworkManagerSystem.h
src/backends/NetworkManagerArch.c
src/backends/NetworkManagerDebian.c
src/backends/NetworkManagerFrugalware.c
src/backends/NetworkManagerGeneric.c
src/backends/NetworkManagerGeneric.h
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 7dff54b..6449b74 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -3,6 +3,30 @@
        Patch from Benoit Boissinot <bboissin+networkmanager@gmail.com>
 
        * src/NetworkManagerSystem.c
+               - (nm_system_device_replace_default_ip4_route): new function; a libnl
+                       implementation of nm_system_device_replace_default_route()
+
+       * src/NetworkManagerPolicy.c
+               - (update_default_route): use nm_system_device_replace_default_ip4_route()
+
+       * src/backends/NetworkManagerArch.c
+         src/backends/NetworkManagerDebian.c
+         src/backends/NetworkManagerFrugalware.c
+         src/backends/NetworkManagerGeneric.c
+         src/backends/NetworkManagerGeneric.h
+         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_replace_default_route): remove
+
+2008-04-25  Dan Williams  <dcbw@redhat.com>
+
+       Patch from Benoit Boissinot <bboissin+networkmanager@gmail.com>
+
+       * src/NetworkManagerSystem.c
                - (validate_ip4_route): remove; use nl_addr_parse() instead
                - (nm_system_device_add_ip4_route_via_device_with_iface): new function,
                        replace nm_system_device_add_route_via_device_with_iface() in the
index a22b976..e77ef06 100644 (file)
@@ -83,12 +83,12 @@ update_default_route (NMPolicy *policy, NMDevice *new)
           a serial device with ppp interface, so route all the traffic to it. */
        ip_iface = nm_device_get_ip_iface (new);
        if (strcmp (ip_iface, nm_device_get_iface (new))) {
-               nm_system_device_replace_default_route (ip_iface, 0, 0);
+               nm_system_device_replace_default_ip4_route (ip_iface, 0, 0);
        } else {
                NMIP4Config *config;
 
                config = nm_device_get_ip4_config (new);
-               nm_system_device_replace_default_route (ip_iface, nm_ip4_config_get_gateway (config),
+               nm_system_device_replace_default_ip4_route (ip_iface, nm_ip4_config_get_gateway (config),
                                                        nm_ip4_config_get_mss (config));
        }
 }
index d59644a..46c8005 100644 (file)
@@ -347,7 +347,7 @@ nm_system_vpn_device_set_from_ip4_config (NMDevice *active_device,
        nm_system_device_flush_ip4_routes_with_iface (iface);
 
        if (g_slist_length (routes) == 0) {
-               nm_system_device_replace_default_route (iface, 0, 0);
+               nm_system_device_replace_default_ip4_route (iface, 0, 0);
        } else {
                GSList *iter;
 
@@ -496,8 +496,61 @@ void nm_system_device_add_ip4_route_via_device_with_iface (const char *iface, co
        nl_addr_put (dst);
 
        err = rtnl_route_add (nlh, route, 0);
-       if (err)
-               nm_warning ("rtnl_route_add() returned error %s (%d)", strerror (err), err);
+       if (err) {
+               nm_warning ("rtnl_route_add() returned error %s (%d)\n%s",
+                           strerror (err), err, nl_geterror());
+       }
+
+out:
+       rtnl_route_put (route);
+}
+
+/*
+ * nm_system_replace_default_ip4_route
+ *
+ * Replace default IPv4 route with one via the current device
+ *
+ */
+void
+nm_system_device_replace_default_ip4_route (const char *iface, guint32 gw, guint32 mss)
+{
+       struct rtnl_route * route;
+       struct nl_handle  * nlh;
+       struct nl_addr    * gw_addr;
+       int iface_idx, err;
+
+       nlh = nm_netlink_get_default_handle ();
+       g_return_if_fail (nlh != NULL);
+
+       route = rtnl_route_alloc();
+       g_return_if_fail (route != NULL);
+
+       rtnl_route_set_scope (route, RT_SCOPE_UNIVERSE);
+
+       iface_idx = nm_netlink_iface_to_index (iface);
+       if (iface_idx < 0)
+               goto out;
+       rtnl_route_set_oif (route, iface_idx);
+
+       /* Build up gateway address; a gateway of 0 (used in e.g. PPP links) means
+        * that all packets should be sent to the gateway since it's a point-to-point
+        * link and has no broadcast segment really.
+        */
+       if (!(gw_addr = nl_addr_build (AF_INET, &gw, sizeof (gw))))
+               goto out;
+       rtnl_route_set_gateway (route, gw_addr);
+       nl_addr_put (gw_addr);
+
+       if (mss > 0) {
+               if (rtnl_route_set_metric (route, RTAX_ADVMSS, mss) < 0)
+                       goto out;
+       }
+
+       err = rtnl_route_add (nlh, route, NLM_F_REPLACE);
+       if (err) {
+               nm_warning ("rtnl_route_add() returned error %s (%d)\n%s",
+                           strerror (err), err, nl_geterror());
+       }
 
 out:
        rtnl_route_put (route);
index de2495b..ceae29b 100644 (file)
@@ -38,7 +38,7 @@ gboolean              nm_system_device_has_active_routes                      (NMDevice *dev);
 void                   nm_system_device_flush_ip4_routes                               (NMDevice *dev);
 void                   nm_system_device_flush_ip4_routes_with_iface    (const char *iface);
 
-void                   nm_system_device_replace_default_route      (const char *iface,
+void                   nm_system_device_replace_default_ip4_route   (const char *iface,
                                                              guint32 gw,
                                                              guint32 mss);
 
index 93bb13e..5f55ecb 100644 (file)
@@ -68,20 +68,6 @@ void nm_system_init (void)
 }
 
 /*
- * nm_system_device_replace_default_route
- *
- * Add default route to the given device
- *
- */
-void
-nm_system_device_replace_default_route (const char *iface,
-                                        guint32 gw,
-                                        guint32 mss)
-{
-       nm_generic_device_replace_default_route (iface, gw, mss);
-}
-
-/*
  * nm_system_device_flush_ip4_addresses
  *
  * Flush all network addresses associated with a network device
index 547c50a..0a7bd86 100644 (file)
@@ -57,20 +57,6 @@ void nm_system_init (void)
 }
 
 /*
- * nm_system_device_replace_default_route
- *
- * Add default route to the given device
- *
- */
-void
-nm_system_device_replace_default_route (const char *iface,
-                                        guint32 gw,
-                                        guint32 mss)
-{
-       nm_generic_device_replace_default_route (iface, gw, mss);
-}
-
-/*
  * nm_system_device_flush_ip4_addresses
  *
  * Flush all network addresses associated with a network device
index 5e747c7..f11dc1e 100644 (file)
@@ -179,21 +179,6 @@ void nm_system_restart_mdns_responder (void)
 }
 
 /*
- * nm_system_device_replace_default_route
- *
- * Add default route to the given device
- *
- */
-void
-nm_system_device_replace_default_route (const char *iface,
-                                        guint32 gw,
-                                        guint32 mss)
-{
-       nm_generic_device_replace_default_route (iface, gw, mss);
-}
-
-/*
  * nm_system_flush_loopback_routes
  *
  * Flush all routes associated with the loopback device, because it
index 4f66cdf..ba0ebc4 100644 (file)
@@ -52,39 +52,6 @@ void nm_generic_init (void)
 }
 
 /*
- * nm_generic_replace_default_route
- *
- * Replace default route with one via the current device
- *
- */
-void
-nm_generic_device_replace_default_route (const char *iface, guint32 gw, guint32 mss)
-{
-       char *buf, *addr_str = NULL, *mss_str = NULL;
-
-       g_return_if_fail (iface != NULL);
-
-       if (gw > 0) {
-               struct in_addr addr = { .s_addr = gw };
-               char buf2[INET_ADDRSTRLEN + 1];
-
-               memset (buf2, 0, sizeof (buf2));
-               inet_ntop (AF_INET, &addr, buf2, INET_ADDRSTRLEN);      
-               addr_str = g_strdup_printf ("via %s", buf2);
-       }
-
-       if (mss > 0)
-               mss_str = g_strdup_printf ("advmss %d", mss);
-
-       buf = g_strdup_printf (IP_BINARY_PATH" route replace default %s %s dev %s",
-                              addr_str ? addr_str : "",
-                              mss_str ? mss_str : "",
-                              iface);
-       nm_spawn_process (buf);
-       g_free (buf);
-}
-
-/*
  * nm_generic_device_flush_ip4_addresses
  *
  * Flush all network addresses associated with a network device
index 76af35c..c5db46d 100644 (file)
@@ -39,8 +39,6 @@ gboolean              nm_generic_device_has_active_routes                     (NMDevice *dev);
 void                   nm_generic_device_flush_ip4_routes                              (NMDevice *dev);
 void                   nm_generic_device_flush_ip4_routes_with_iface   (const char *iface);
 
-void            nm_generic_device_replace_default_route (const char *iface, guint32 gw, guint32 mss);
-
 void                   nm_generic_device_flush_ip4_addresses                   (NMDevice *dev);
 void                   nm_generic_device_flush_ip4_addresses_with_iface        (const char *iface);
 
index e475fee..c7ec84a 100644 (file)
@@ -220,20 +220,6 @@ void nm_system_restart_mdns_responder (void)
 }
 
 /*
- * nm_system_device_replace_default_route
- *
- * Add default route to the given device
- *
- */
-void
-nm_system_device_replace_default_route (const char *iface,
-                                        guint32 gw,
-                                        guint32 mss)
-{
-       nm_generic_device_replace_default_route (iface, gw, mss);
-}
-/*
  * nm_system_activate_nis
  *
  * set up the nis domain and write a yp.conf
index c5ccb5c..e521f1d 100644 (file)
@@ -76,21 +76,6 @@ void nm_system_device_flush_ip4_routes_with_iface (const char *iface)
        nm_generic_device_flush_ip4_routes_with_iface (iface);
 }
 
-
-/*
- * nm_system_device_replace_default_route
- *
- * Add default route to the given device
- *
- */
-void
-nm_system_device_replace_default_route (const char *iface,
-               guint32 gw,
-               guint32 mss)
-{
-       nm_generic_device_replace_default_route (iface, gw, mss);
-}
-
 /*
  * nm_system_device_has_active_routes
  *
index 292c985..ba704d4 100644 (file)
@@ -77,21 +77,6 @@ void nm_system_device_flush_ip4_routes_with_iface (const char *iface)
        nm_generic_device_flush_ip4_routes_with_iface (iface);
 }
 
-
-/*
- * nm_system_device_replace_default_route
- *
- * Add default route to the given device
- *
- */
-void
-nm_system_device_replace_default_route (const char *iface,
-                                        guint32 gw,
-                                        guint32 mss)
-{
-       nm_generic_device_replace_default_route (iface, gw, mss);
-}
-
 /*
  * nm_system_device_has_active_routes
  *
index 8367649..1356e40 100644 (file)
@@ -74,21 +74,6 @@ void nm_system_device_flush_ip4_routes_with_iface (const char *iface)
        nm_generic_device_flush_ip4_routes_with_iface (iface);
 }
 
-
-/*
- * nm_system_device_replace_default_route
- *
- * Add default route to the given device
- *
- */
-void
-nm_system_device_replace_default_route (const char *iface,
-                                        guint32 gw,
-                                        guint32 mss)
-{
-       nm_generic_device_replace_default_route (iface, gw, mss);
-}
-
 /*
  * nm_system_device_has_active_routes
  *
index afb5c26..1cf4405 100644 (file)
@@ -158,22 +158,6 @@ void nm_system_restart_mdns_responder (void)
 {
 }
 
-
-/*
- * nm_system_device_replace_default_route
- *
- * Add default route to the given device
- *
- */
-void
-nm_system_device_replace_default_route (const char *iface,
-                                        guint32 gw,
-                                        guint32 mss)
-{
-       nm_generic_device_replace_default_route (iface, gw, mss);
-}
 /*
  * nm_system_flush_loopback_routes
  *
index 46075e8..effc785 100644 (file)
@@ -83,21 +83,6 @@ void nm_system_device_flush_ip4_routes_with_iface (const char *iface)
        nm_generic_device_flush_ip4_routes_with_iface (iface);
 }
 
-
-/*
- * nm_system_device_replace_default_route
- *
- * Add default route to the given device
- *
- */
-void
-nm_system_device_replace_default_route (const char *iface,
-                                        guint32 gw,
-                                        guint32 mss)
-{
-       nm_generic_device_replace_default_route (iface, gw, mss);
-}
-
 /*
  * nm_system_device_has_active_routes
  *