summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2015-05-03 10:47:41 +0200
committerThomas Haller <thaller@redhat.com>2015-06-17 10:53:55 +0200
commit619f660a3e1728a823add757e53b093c76869fc9 (patch)
treef698c3d2311e99889cbc8ccb0f07a11ed2e8741a /src
parent4c49d78f4949c1bcbc2107ee42700f28d333633a (diff)
downloadNetworkManager-619f660a3e1728a823add757e53b093c76869fc9.tar.gz
platform: add scope parameter to NMPlatformIP4Route
Cache the scope as part of the NMPlatformIP4Route and no longer read it from libnl object when needed. Later there will be no more libnl objects around, and we need to scope when deleting an IPv4 route.
Diffstat (limited to 'src')
-rw-r--r--src/platform/nm-fake-platform.c5
-rw-r--r--src/platform/nm-linux-platform.c3
-rw-r--r--src/platform/nm-platform.c9
-rw-r--r--src/platform/nm-platform.h20
-rw-r--r--src/platform/tests/test-route.c7
-rw-r--r--src/tests/test-route-manager.c9
6 files changed, 48 insertions, 5 deletions
diff --git a/src/platform/nm-fake-platform.c b/src/platform/nm-fake-platform.c
index d5843a1edf..479e2fbf5c 100644
--- a/src/platform/nm-fake-platform.c
+++ b/src/platform/nm-fake-platform.c
@@ -24,6 +24,7 @@
#include <unistd.h>
#include <netinet/icmp6.h>
#include <netinet/in.h>
+#include <linux/rtnetlink.h>
#include "gsystem-local-alloc.h"
#include "NetworkManagerUtils.h"
@@ -1196,6 +1197,9 @@ ip4_route_add (NMPlatform *platform, int ifindex, NMIPConfigSource source,
NMFakePlatformPrivate *priv = NM_FAKE_PLATFORM_GET_PRIVATE (platform);
NMPlatformIP4Route route;
guint i;
+ guint8 scope;
+
+ scope = gateway == 0 ? RT_SCOPE_LINK : RT_SCOPE_UNIVERSE;
memset (&route, 0, sizeof (route));
route.source = NM_IP_CONFIG_SOURCE_KERNEL;
@@ -1206,6 +1210,7 @@ ip4_route_add (NMPlatform *platform, int ifindex, NMIPConfigSource source,
route.gateway = gateway;
route.metric = metric;
route.mss = mss;
+ route.scope_inv = nm_platform_route_scope_inv (scope);
if (gateway) {
for (i = 0; i < priv->ip4_routes->len; i++) {
diff --git a/src/platform/nm-linux-platform.c b/src/platform/nm-linux-platform.c
index cc7a5b75cb..1b547d97a8 100644
--- a/src/platform/nm-linux-platform.c
+++ b/src/platform/nm-linux-platform.c
@@ -1305,6 +1305,7 @@ init_ip4_route (NMPlatformIP4Route *route, struct rtnl_route *rtnlroute)
route->metric = rtnl_route_get_priority (rtnlroute);
rtnl_route_get_metric (rtnlroute, RTAX_ADVMSS, &route->mss);
route->source = rtprot_to_source (rtnl_route_get_protocol (rtnlroute));
+ route->scope_inv = nm_platform_route_scope_inv (rtnl_route_get_scope (rtnlroute));
return TRUE;
}
@@ -3684,7 +3685,7 @@ build_rtnl_addr (NMPlatform *platform,
/* Tighten scope (IPv4 only) */
if (family == AF_INET && ip4_is_link_local (addr))
- rtnl_addr_set_scope (rtnladdr, rtnl_str2scope ("link"));
+ rtnl_addr_set_scope (rtnladdr, RT_SCOPE_LINK);
/* IPv4 Broadcast address */
if (family == AF_INET) {
diff --git a/src/platform/nm-platform.c b/src/platform/nm-platform.c
index 7439b1ef42..c873b6aa48 100644
--- a/src/platform/nm-platform.c
+++ b/src/platform/nm-platform.c
@@ -27,6 +27,7 @@
#include <arpa/inet.h>
#include <string.h>
#include <netlink/route/addr.h>
+#include <netlink/route/rtnl.h>
#include "gsystem-local-alloc.h"
#include "NetworkManagerUtils.h"
@@ -2646,6 +2647,7 @@ nm_platform_ip4_route_to_string (const NMPlatformIP4Route *route)
{
char s_network[INET_ADDRSTRLEN], s_gateway[INET_ADDRSTRLEN];
char str_dev[TO_STRING_DEV_BUF_SIZE];
+ char str_scope[30];
g_return_val_if_fail (route, "(unknown)");
@@ -2654,11 +2656,13 @@ nm_platform_ip4_route_to_string (const NMPlatformIP4Route *route)
_to_string_dev (NULL, route->ifindex, str_dev, sizeof (str_dev));
- g_snprintf (to_string_buffer, sizeof (to_string_buffer), "%s/%d via %s%s metric %"G_GUINT32_FORMAT" mss %"G_GUINT32_FORMAT" src %s",
+ g_snprintf (to_string_buffer, sizeof (to_string_buffer), "%s/%d via %s%s metric %"G_GUINT32_FORMAT" mss %"G_GUINT32_FORMAT" src %s%s%s",
s_network, route->plen, s_gateway,
str_dev,
route->metric, route->mss,
- source_to_string (route->source));
+ source_to_string (route->source),
+ route->scope_inv ? " scope " : "",
+ route->scope_inv ? (rtnl_scope2str (nm_platform_route_scope_inv (route->scope_inv), str_scope, sizeof (str_scope))) : "");
return to_string_buffer;
}
@@ -2812,6 +2816,7 @@ nm_platform_ip4_route_cmp (const NMPlatformIP4Route *a, const NMPlatformIP4Route
_CMP_FIELD (a, b, gateway);
_CMP_FIELD (a, b, metric);
_CMP_FIELD (a, b, mss);
+ _CMP_FIELD (a, b, scope_inv);
return 0;
}
diff --git a/src/platform/nm-platform.h b/src/platform/nm-platform.h
index a4482d2458..3e3aafb5db 100644
--- a/src/platform/nm-platform.h
+++ b/src/platform/nm-platform.h
@@ -237,6 +237,10 @@ struct _NMPlatformIP4Route {
__NMPlatformIPRoute_COMMON;
in_addr_t network;
in_addr_t gateway;
+
+ /* The bitwise inverse of the route scope. It is inverted so that the
+ * default value (RT_SCOPE_NOWHERE) is nul. */
+ guint8 scope_inv;
};
G_STATIC_ASSERT (G_STRUCT_OFFSET (NMPlatformIPRoute, network_ptr) == G_STRUCT_OFFSET (NMPlatformIP4Route, network));
@@ -529,6 +533,22 @@ NMPlatform *nm_platform_try_get (void);
/******************************************************************/
+/**
+ * nm_platform_route_scope_inv:
+ * @scope: the route scope, either its original value, or its inverse.
+ *
+ * This function is useful, because the constants such as RT_SCOPE_NOWHERE
+ * are 'int', so ~scope also gives an 'int'. This function gets the type
+ * casts to guint8 right.
+ *
+ * Returns: the bitwise inverse of the route scope.
+ * */
+static inline guint8
+nm_platform_route_scope_inv (guint8 scope)
+{
+ return (guint8) ~scope;
+}
+
const char *nm_link_type_to_string (NMLinkType link_type);
void nm_platform_set_error (NMPlatform *self, NMPlatformError error);
diff --git a/src/platform/tests/test-route.c b/src/platform/tests/test-route.c
index 70bd1a1040..fd86719958 100644
--- a/src/platform/tests/test-route.c
+++ b/src/platform/tests/test-route.c
@@ -1,5 +1,7 @@
#include "config.h"
+#include <linux/rtnetlink.h>
+
#include "test-common.h"
#include "nm-test-utils.h"
#include "NetworkManagerUtils.h"
@@ -177,6 +179,7 @@ test_ip4_route (void)
rts[0].gateway = INADDR_ANY;
rts[0].metric = metric;
rts[0].mss = mss;
+ rts[0].scope_inv = nm_platform_route_scope_inv (RT_SCOPE_LINK);
rts[1].source = NM_IP_CONFIG_SOURCE_USER;
rts[1].network = network;
rts[1].plen = plen;
@@ -184,6 +187,7 @@ test_ip4_route (void)
rts[1].gateway = gateway;
rts[1].metric = metric;
rts[1].mss = mss;
+ rts[1].scope_inv = nm_platform_route_scope_inv (RT_SCOPE_UNIVERSE);
rts[2].source = NM_IP_CONFIG_SOURCE_USER;
rts[2].network = 0;
rts[2].plen = 0;
@@ -191,8 +195,8 @@ test_ip4_route (void)
rts[2].gateway = gateway;
rts[2].metric = metric;
rts[2].mss = mss;
+ rts[2].scope_inv = nm_platform_route_scope_inv (RT_SCOPE_UNIVERSE);
g_assert_cmpint (routes->len, ==, 3);
- g_assert (!memcmp (routes->data, rts, sizeof (rts)));
nmtst_platform_ip4_routes_equal ((NMPlatformIP4Route *) routes->data, rts, routes->len, TRUE);
g_array_unref (routes);
@@ -288,7 +292,6 @@ test_ip6_route (void)
rts[2].metric = nm_utils_ip6_route_metric_normalize (metric);
rts[2].mss = mss;
g_assert_cmpint (routes->len, ==, 3);
- g_assert (!memcmp (routes->data, rts, sizeof (rts)));
nmtst_platform_ip6_routes_equal ((NMPlatformIP6Route *) routes->data, rts, routes->len, TRUE);
g_array_unref (routes);
diff --git a/src/tests/test-route-manager.c b/src/tests/test-route-manager.c
index c7b60e68e0..5b1c5f9d5a 100644
--- a/src/tests/test-route-manager.c
+++ b/src/tests/test-route-manager.c
@@ -22,6 +22,7 @@
#include <glib.h>
#include <arpa/inet.h>
+#include <linux/rtnetlink.h>
#include "test-common.h"
@@ -168,6 +169,7 @@ test_ip4 (test_fixture *fixture, gconstpointer user_data)
.gateway = INADDR_ANY,
.metric = 20,
.mss = 1000,
+ .scope_inv = nm_platform_route_scope_inv (RT_SCOPE_LINK),
},
{
.source = NM_IP_CONFIG_SOURCE_USER,
@@ -177,6 +179,7 @@ test_ip4 (test_fixture *fixture, gconstpointer user_data)
.gateway = nmtst_inet4_from_string ("6.6.6.1"),
.metric = 21021,
.mss = 0,
+ .scope_inv = nm_platform_route_scope_inv (RT_SCOPE_UNIVERSE),
},
{
.source = NM_IP_CONFIG_SOURCE_USER,
@@ -186,6 +189,7 @@ test_ip4 (test_fixture *fixture, gconstpointer user_data)
.gateway = INADDR_ANY,
.metric = 22,
.mss = 0,
+ .scope_inv = nm_platform_route_scope_inv (RT_SCOPE_LINK),
},
};
@@ -198,6 +202,7 @@ test_ip4 (test_fixture *fixture, gconstpointer user_data)
.gateway = INADDR_ANY,
.metric = 20,
.mss = 0,
+ .scope_inv = nm_platform_route_scope_inv (RT_SCOPE_LINK),
},
{
.source = NM_IP_CONFIG_SOURCE_USER,
@@ -207,6 +212,7 @@ test_ip4 (test_fixture *fixture, gconstpointer user_data)
.gateway = INADDR_ANY,
.metric = 21,
.mss = 0,
+ .scope_inv = nm_platform_route_scope_inv (RT_SCOPE_LINK),
},
{
.source = NM_IP_CONFIG_SOURCE_USER,
@@ -216,6 +222,7 @@ test_ip4 (test_fixture *fixture, gconstpointer user_data)
.gateway = INADDR_ANY,
.metric = 22,
.mss = 0,
+ .scope_inv = nm_platform_route_scope_inv (RT_SCOPE_LINK),
},
};
@@ -228,6 +235,7 @@ test_ip4 (test_fixture *fixture, gconstpointer user_data)
.gateway = INADDR_ANY,
.metric = 22,
.mss = 0,
+ .scope_inv = nm_platform_route_scope_inv (RT_SCOPE_LINK),
},
{
.source = NM_IP_CONFIG_SOURCE_USER,
@@ -237,6 +245,7 @@ test_ip4 (test_fixture *fixture, gconstpointer user_data)
.gateway = INADDR_ANY,
.metric = 20,
.mss = 0,
+ .scope_inv = nm_platform_route_scope_inv (RT_SCOPE_LINK),
},
};