diff options
author | Thomas Haller <thaller@redhat.com> | 2015-05-03 10:47:41 +0200 |
---|---|---|
committer | Thomas Haller <thaller@redhat.com> | 2015-06-17 10:53:55 +0200 |
commit | 619f660a3e1728a823add757e53b093c76869fc9 (patch) | |
tree | f698c3d2311e99889cbc8ccb0f07a11ed2e8741a /src | |
parent | 4c49d78f4949c1bcbc2107ee42700f28d333633a (diff) | |
download | NetworkManager-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.c | 5 | ||||
-rw-r--r-- | src/platform/nm-linux-platform.c | 3 | ||||
-rw-r--r-- | src/platform/nm-platform.c | 9 | ||||
-rw-r--r-- | src/platform/nm-platform.h | 20 | ||||
-rw-r--r-- | src/platform/tests/test-route.c | 7 | ||||
-rw-r--r-- | src/tests/test-route-manager.c | 9 |
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), }, }; |