summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2014-08-29 09:40:15 +0200
committerThomas Haller <thaller@redhat.com>2014-10-12 22:31:39 +0200
commitb27e3a378371540b7f729522f44cf4452511a722 (patch)
tree9c9fb718acbe2f80858db868271c60aae1a8de15
parent14bd6830d5fc8f0bf79039e4b5d971e398f81f50 (diff)
downloadNetworkManager-b27e3a378371540b7f729522f44cf4452511a722.tar.gz
core: add nm_ipX_config_get_default_route() functions
Add functions nm_ip4_config_get_default_route() and nm_ip6_config_get_default_route() to search for a default route in NMIP4Config and NMIP6Config. Signed-off-by: Thomas Haller <thaller@redhat.com>
-rw-r--r--src/nm-ip4-config.c26
-rw-r--r--src/nm-ip4-config.h1
-rw-r--r--src/nm-ip6-config.c27
-rw-r--r--src/nm-ip6-config.h1
4 files changed, 55 insertions, 0 deletions
diff --git a/src/nm-ip4-config.c b/src/nm-ip4-config.c
index a3e85aa259..1e1ca1e85c 100644
--- a/src/nm-ip4-config.c
+++ b/src/nm-ip4-config.c
@@ -1191,6 +1191,32 @@ nm_ip4_config_get_route (const NMIP4Config *config, guint i)
}
const NMPlatformIP4Route *
+nm_ip4_config_get_default_route (const NMIP4Config *config)
+{
+ NMIP4ConfigPrivate *priv = NM_IP4_CONFIG_GET_PRIVATE (config);
+ NMPlatformIP4Route *default_route = NULL;
+ int i;
+
+ for (i = 0; i < priv->routes->len; i++ ) {
+ NMPlatformIP4Route *item = &g_array_index (priv->routes, NMPlatformIP4Route, i);
+
+ if (!NM_PLATFORM_IP_ROUTE_IS_DEFAULT (item))
+ continue;
+
+ /* there might be more then one default routes. Choose the best one. */
+ if (!default_route)
+ default_route = item;
+ else if (item->metric < default_route->metric)
+ default_route = item;
+ else if ( item->metric == default_route->metric
+ && !item->gateway && default_route->gateway)
+ default_route = item;
+ }
+
+ return default_route;
+}
+
+const NMPlatformIP4Route *
nm_ip4_config_get_direct_route_for_host (const NMIP4Config *config, guint32 host)
{
NMIP4ConfigPrivate *priv = NM_IP4_CONFIG_GET_PRIVATE (config);
diff --git a/src/nm-ip4-config.h b/src/nm-ip4-config.h
index be5a30d01b..39955efb3b 100644
--- a/src/nm-ip4-config.h
+++ b/src/nm-ip4-config.h
@@ -92,6 +92,7 @@ void nm_ip4_config_del_route (NMIP4Config *config, guint i);
guint32 nm_ip4_config_get_num_routes (const NMIP4Config *config);
const NMPlatformIP4Route *nm_ip4_config_get_route (const NMIP4Config *config, guint32 i);
+const NMPlatformIP4Route *nm_ip4_config_get_default_route (const NMIP4Config *config);
const NMPlatformIP4Route *nm_ip4_config_get_direct_route_for_host (const NMIP4Config *config, guint32 host);
/* Nameservers */
diff --git a/src/nm-ip6-config.c b/src/nm-ip6-config.c
index 135c2f6fef..2d89681300 100644
--- a/src/nm-ip6-config.c
+++ b/src/nm-ip6-config.c
@@ -1198,6 +1198,33 @@ nm_ip6_config_get_route (const NMIP6Config *config, guint i)
}
const NMPlatformIP6Route *
+nm_ip6_config_get_default_route (const NMIP6Config *config)
+{
+ NMIP6ConfigPrivate *priv = NM_IP6_CONFIG_GET_PRIVATE (config);
+ NMPlatformIP6Route *default_route = NULL;
+ int i;
+
+ for (i = 0; i < priv->routes->len; i++ ) {
+ NMPlatformIP6Route *item = &g_array_index (priv->routes, NMPlatformIP6Route, i);
+
+ if (!NM_PLATFORM_IP_ROUTE_IS_DEFAULT (item))
+ continue;
+
+ /* there might be more then one default routes. Choose the best one. */
+ if (!default_route)
+ default_route = item;
+ else if (nm_utils_ip6_route_metric_normalize (item->metric) < nm_utils_ip6_route_metric_normalize (default_route->metric))
+ default_route = item;
+ else if ( nm_utils_ip6_route_metric_normalize (item->metric) == nm_utils_ip6_route_metric_normalize (default_route->metric)
+ && IN6_IS_ADDR_UNSPECIFIED (&item->gateway)
+ && !IN6_IS_ADDR_UNSPECIFIED (&default_route->gateway))
+ default_route = item;
+ }
+
+ return default_route;
+}
+
+const NMPlatformIP6Route *
nm_ip6_config_get_direct_route_for_host (const NMIP6Config *config, const struct in6_addr *host)
{
NMIP6ConfigPrivate *priv = NM_IP6_CONFIG_GET_PRIVATE (config);
diff --git a/src/nm-ip6-config.h b/src/nm-ip6-config.h
index 7abf57a779..94fad5ed12 100644
--- a/src/nm-ip6-config.h
+++ b/src/nm-ip6-config.h
@@ -93,6 +93,7 @@ void nm_ip6_config_del_route (NMIP6Config *config, guint i);
guint32 nm_ip6_config_get_num_routes (const NMIP6Config *config);
const NMPlatformIP6Route *nm_ip6_config_get_route (const NMIP6Config *config, guint32 i);
+const NMPlatformIP6Route *nm_ip6_config_get_default_route (const NMIP6Config *config);
const NMPlatformIP6Route *nm_ip6_config_get_direct_route_for_host (const NMIP6Config *config, const struct in6_addr *host);
/* Nameservers */