platform: extend NMIPConfigSource to preserve the rtm_protocol field

For addresses (NMPlatformIPAddress) the @addr_source field is ignored
on a platform level. That is, all addresses inside the platform cache
have this value set to NM_IP_CONFIG_SOURCE_KERNEL. Maybe, for that reason,
the source should not be a part of the NMPlatformIPAddress structure, but
it is convenient for users to piggy back the source inside the platform
address structure.

For routes, the source is stored in NMPlatformIPRoute's @rt_source
field. When adding a route to kernel, we set the @rtm_protocol of the
route depending on the source. However, we want to map different source
values to the same protocol value.

On the other hand, when kernel sends us a route that gets put inside
the cache, we must preserve the protocol value and must not map
different protocol values to the same source.
The reason is, that a user can add two routes that only differ by
@rtm_protocol. In that sense, the @rtm_protocol fields is part of the
unique ID of a kernel route, and thus different values must map to
different sources.

Fix this, by extending the range of NMIPConfigSource to contain
a range of protocol fields.
This commit is contained in:
Thomas Haller
2016-04-11 17:35:29 +02:00
parent e26fcce0f8
commit 4c2410bc92
9 changed files with 195 additions and 90 deletions

View File

@@ -54,10 +54,20 @@ typedef struct _NMLldpListener NMLldpListener;
typedef enum {
/* In priority order; higher number == higher priority */
NM_IP_CONFIG_SOURCE_UNKNOWN,
/* routes from platform with protocol RTPROT_KERNEL. */
NM_IP_CONFIG_SOURCE_RTPROT_KERNEL,
NM_IP_CONFIG_SOURCE_UNKNOWN = 0,
/* for routes, the source is mapped to the uint8 field rtm_protocol.
* Reserve the range [1,0x100] for native RTPROT values. */
NM_IP_CONFIG_SOURCE_RTPROT_UNSPEC = 1 + 0,
NM_IP_CONFIG_SOURCE_RTPROT_REDIRECT = 1 + 1,
NM_IP_CONFIG_SOURCE_RTPROT_KERNEL = 1 + 2,
NM_IP_CONFIG_SOURCE_RTPROT_BOOT = 1 + 3,
NM_IP_CONFIG_SOURCE_RTPROT_STATIC = 1 + 4,
NM_IP_CONFIG_SOURCE_RTPROT_RA = 1 + 9,
NM_IP_CONFIG_SOURCE_RTPROT_DHCP = 1 + 16,
_NM_IP_CONFIG_SOURCE_RTPROT_LAST = 1 + 0xFF,
NM_IP_CONFIG_SOURCE_KERNEL,
NM_IP_CONFIG_SOURCE_SHARED,
@@ -70,6 +80,12 @@ typedef enum {
NM_IP_CONFIG_SOURCE_USER,
} NMIPConfigSource;
inline static gboolean
NM_IS_IP_CONFIG_SOURCE_RTPROT (NMIPConfigSource source)
{
return source > NM_IP_CONFIG_SOURCE_UNKNOWN && source <= _NM_IP_CONFIG_SOURCE_RTPROT_LAST;
}
/* platform */
typedef struct _NMPlatform NMPlatform;
typedef struct _NMPlatformIP4Address NMPlatformIP4Address;

View File

@@ -31,6 +31,7 @@
#include "nm-utils.h"
#include "nm-core-utils.h"
#include "nm-platform-utils.h"
#include "nmp-object.h"
#include "nm-test-utils.h"
@@ -1208,7 +1209,7 @@ ip4_route_add (NMPlatform *platform, int ifindex, NMIPConfigSource source,
memset (&route, 0, sizeof (route));
route.ifindex = ifindex;
route.rt_source = source;
route.rt_source = nmp_utils_ip_config_source_round_trip_rtprot (source);
route.network = nm_utils_ip4_address_clear_host_address (network, plen);
route.plen = plen;
route.gateway = gateway;
@@ -1273,7 +1274,7 @@ ip6_route_add (NMPlatform *platform, int ifindex, NMIPConfigSource source,
memset (&route, 0, sizeof (route));
route.ifindex = ifindex;
route.rt_source = source;
route.rt_source = nmp_utils_ip_config_source_round_trip_rtprot (source);
nm_utils_ip6_address_clear_host_address (&route.network, &network, plen);
route.plen = plen;
route.gateway = gateway;

View File

@@ -2245,7 +2245,7 @@ _nl_msg_new_route (int nlmsg_type,
.rtm_family = family,
.rtm_tos = 0,
.rtm_table = RT_TABLE_MAIN, /* omit setting RTA_TABLE attribute */
.rtm_protocol = nmp_utils_ip_config_source_to_rtprot (source),
.rtm_protocol = nmp_utils_ip_config_source_coerce_to_rtprot (source),
.rtm_scope = scope,
.rtm_type = RTN_UNICAST,
.rtm_flags = 0,

View File

@@ -433,14 +433,38 @@ nmp_utils_device_exists (const char *name)
return g_file_test (sysdir, G_FILE_TEST_EXISTS);
}
guint
nmp_utils_ip_config_source_to_rtprot (NMIPConfigSource source)
NMIPConfigSource
nmp_utils_ip_config_source_from_rtprot (guint8 rtprot)
{
switch (source) {
case NM_IP_CONFIG_SOURCE_UNKNOWN:
return ((int) rtprot) + 1;
}
NMIPConfigSource
nmp_utils_ip_config_source_round_trip_rtprot (NMIPConfigSource source)
{
/* when adding a route to kernel for a give @source, the resulting route
* will be put into the cache with a source of NM_IP_CONFIG_SOURCE_RTPROT_*.
* This function returns that. */
return nmp_utils_ip_config_source_from_rtprot (nmp_utils_ip_config_source_coerce_to_rtprot (source));
}
guint8
nmp_utils_ip_config_source_coerce_to_rtprot (NMIPConfigSource source)
{
/* when adding a route to kernel, we coerce the @source field
* to rtm_protocol. This is not lossless as we map different
* source values to the same RTPROT uint8 value. */
if (source <= NM_IP_CONFIG_SOURCE_UNKNOWN)
return RTPROT_UNSPEC;
if (source <= _NM_IP_CONFIG_SOURCE_RTPROT_LAST) {
nm_assert (NM_IS_IP_CONFIG_SOURCE_RTPROT (source));
return source - 1;
} else
nm_assert (!NM_IS_IP_CONFIG_SOURCE_RTPROT (source));
switch (source) {
case NM_IP_CONFIG_SOURCE_KERNEL:
case NM_IP_CONFIG_SOURCE_RTPROT_KERNEL:
return RTPROT_KERNEL;
case NM_IP_CONFIG_SOURCE_DHCP:
return RTPROT_DHCP;
@@ -453,18 +477,32 @@ nmp_utils_ip_config_source_to_rtprot (NMIPConfigSource source)
}
NMIPConfigSource
nmp_utils_ip_config_source_from_rtprot (guint rtprot)
nmp_utils_ip_config_source_coerce_from_rtprot (NMIPConfigSource source)
{
switch (rtprot) {
case RTPROT_UNSPEC:
/* When we receive a route from kernel and put it into the platform cache,
* we preserve the protocol field by converting it to a NMIPConfigSource
* via nmp_utils_ip_config_source_from_rtprot().
*
* However, that is not the inverse of nmp_utils_ip_config_source_coerce_to_rtprot().
* Instead, to go back to the original value, you need another step:
* nmp_utils_ip_config_source_coerce_from_rtprot (nmp_utils_ip_config_source_from_rtprot (rtprot)).
*
* This might partly restore the original source value, but of course that
* is not really possible because nmp_utils_ip_config_source_coerce_to_rtprot()
* is not injective.
* */
switch (source) {
case NM_IP_CONFIG_SOURCE_RTPROT_UNSPEC:
return NM_IP_CONFIG_SOURCE_UNKNOWN;
case RTPROT_KERNEL:
return NM_IP_CONFIG_SOURCE_RTPROT_KERNEL;
case RTPROT_REDIRECT:
case NM_IP_CONFIG_SOURCE_RTPROT_KERNEL:
case NM_IP_CONFIG_SOURCE_RTPROT_REDIRECT:
return NM_IP_CONFIG_SOURCE_KERNEL;
case RTPROT_RA:
case NM_IP_CONFIG_SOURCE_RTPROT_RA:
return NM_IP_CONFIG_SOURCE_RDISC;
case RTPROT_DHCP:
case NM_IP_CONFIG_SOURCE_RTPROT_DHCP:
return NM_IP_CONFIG_SOURCE_DHCP;
default:
@@ -472,17 +510,50 @@ nmp_utils_ip_config_source_from_rtprot (guint rtprot)
}
}
NM_UTILS_ENUM2STR_DEFINE (nmp_utils_ip_config_source_to_string, NMIPConfigSource,
NM_UTILS_ENUM2STR (NM_IP_CONFIG_SOURCE_UNKNOWN, "unknown"),
NM_UTILS_ENUM2STR (NM_IP_CONFIG_SOURCE_RTPROT_KERNEL, "rtprot-kernel"),
NM_UTILS_ENUM2STR (NM_IP_CONFIG_SOURCE_KERNEL, "kernel"),
NM_UTILS_ENUM2STR (NM_IP_CONFIG_SOURCE_SHARED, "shared"),
NM_UTILS_ENUM2STR (NM_IP_CONFIG_SOURCE_IP4LL, "ipv4ll"),
NM_UTILS_ENUM2STR (NM_IP_CONFIG_SOURCE_PPP, "ppp"),
NM_UTILS_ENUM2STR (NM_IP_CONFIG_SOURCE_WWAN, "wwan"),
NM_UTILS_ENUM2STR (NM_IP_CONFIG_SOURCE_VPN, "vpn"),
NM_UTILS_ENUM2STR (NM_IP_CONFIG_SOURCE_DHCP, "dhcp"),
NM_UTILS_ENUM2STR (NM_IP_CONFIG_SOURCE_RDISC, "rdisc"),
NM_UTILS_ENUM2STR (NM_IP_CONFIG_SOURCE_USER, "user"),
);
const char *
nmp_utils_ip_config_source_to_string (NMIPConfigSource source, char *buf, gsize len)
{
const char *s = NULL;
nm_utils_to_string_buffer_init (&buf, &len); \
if (!len)
return buf;
switch (source) {
case NM_IP_CONFIG_SOURCE_UNKNOWN: s = "unknown"; break;
case NM_IP_CONFIG_SOURCE_RTPROT_UNSPEC: s = "rt-unspec"; break;
case NM_IP_CONFIG_SOURCE_RTPROT_REDIRECT: s = "rt-redirect"; break;
case NM_IP_CONFIG_SOURCE_RTPROT_KERNEL: s = "rt-kernel"; break;
case NM_IP_CONFIG_SOURCE_RTPROT_BOOT: s = "rt-boot"; break;
case NM_IP_CONFIG_SOURCE_RTPROT_STATIC: s = "rt-static"; break;
case NM_IP_CONFIG_SOURCE_RTPROT_DHCP: s = "rt-dhcp"; break;
case NM_IP_CONFIG_SOURCE_RTPROT_RA: s = "rt-ra"; break;
case NM_IP_CONFIG_SOURCE_KERNEL: s = "kernel"; break;
case NM_IP_CONFIG_SOURCE_SHARED: s = "shared"; break;
case NM_IP_CONFIG_SOURCE_IP4LL: s = "ipv4ll"; break;
case NM_IP_CONFIG_SOURCE_PPP: s = "ppp"; break;
case NM_IP_CONFIG_SOURCE_WWAN: s = "wwan"; break;
case NM_IP_CONFIG_SOURCE_VPN: s = "vpn"; break;
case NM_IP_CONFIG_SOURCE_DHCP: s = "dhcp"; break;
case NM_IP_CONFIG_SOURCE_RDISC: s = "rdisc"; break;
case NM_IP_CONFIG_SOURCE_USER: s = "user"; break;
default:
break;
}
if (source >= 1 && source <= 0x100) {
if (s)
g_snprintf (buf, len, "%s", s);
else
g_snprintf (buf, len, "rt-%d", ((int) source) - 1);
} else {
if (s)
g_strlcpy (buf, s, len);
else
g_snprintf (buf, len, "(%d)", source);
}
return buf;
}

View File

@@ -54,8 +54,10 @@ const char *nmp_utils_udev_get_driver (GUdevDevice *device);
gboolean nmp_utils_device_exists (const char *name);
guint nmp_utils_ip_config_source_to_rtprot (NMIPConfigSource source);
NMIPConfigSource nmp_utils_ip_config_source_from_rtprot (guint rtprot);
const char * nmp_utils_ip_config_source_to_string (NMIPConfigSource source, char *buf, gsize len);
NMIPConfigSource nmp_utils_ip_config_source_from_rtprot (guint8 rtprot);
guint8 nmp_utils_ip_config_source_coerce_to_rtprot (NMIPConfigSource source);
NMIPConfigSource nmp_utils_ip_config_source_coerce_from_rtprot (NMIPConfigSource source);
NMIPConfigSource nmp_utils_ip_config_source_round_trip_rtprot (NMIPConfigSource source);
const char * nmp_utils_ip_config_source_to_string (NMIPConfigSource source, char *buf, gsize len);
#endif /* __NM_PLATFORM_UTILS_H__ */

View File

@@ -303,7 +303,13 @@ typedef union {
#define __NMPlatformIPRoute_COMMON \
__NMPlatformObject_COMMON; \
\
/* The NMIPConfigSource. For routes that we receive from cache this corresponds
* to the rtm_protocol field (and is one of the NM_IP_CONFIG_SOURCE_RTPROT_* values).
* When adding a route, the source will be coerced to the protocol using
* nmp_utils_ip_config_source_coerce_to_rtprot(). */ \
NMIPConfigSource rt_source; \
\
guint8 plen; \
\
/* the route has rtm_flags set to RTM_F_CLONED. Such a route

View File

@@ -23,9 +23,9 @@
#include <linux/rtnetlink.h>
#include "nm-core-utils.h"
#include "test-common.h"
#include "nm-platform-utils.h"
#include "nm-test-utils.h"
#include "test-common.h"
#define DEVICE_NAME "nm-test-device"
@@ -178,7 +178,7 @@ test_ip4_route (void)
/* Test route listing */
routes = nm_platform_ip4_route_get_all (NM_PLATFORM_GET, ifindex, NM_PLATFORM_GET_ROUTE_FLAGS_WITH_DEFAULT | NM_PLATFORM_GET_ROUTE_FLAGS_WITH_NON_DEFAULT);
memset (rts, 0, sizeof (rts));
rts[0].rt_source = NM_IP_CONFIG_SOURCE_USER;
rts[0].rt_source = nmp_utils_ip_config_source_round_trip_rtprot (NM_IP_CONFIG_SOURCE_USER);
rts[0].network = gateway;
rts[0].plen = 32;
rts[0].ifindex = ifindex;
@@ -186,7 +186,7 @@ test_ip4_route (void)
rts[0].metric = metric;
rts[0].mss = mss;
rts[0].scope_inv = nm_platform_route_scope_inv (RT_SCOPE_LINK);
rts[1].rt_source = NM_IP_CONFIG_SOURCE_USER;
rts[1].rt_source = nmp_utils_ip_config_source_round_trip_rtprot (NM_IP_CONFIG_SOURCE_USER);
rts[1].network = network;
rts[1].plen = plen;
rts[1].ifindex = ifindex;
@@ -194,7 +194,7 @@ test_ip4_route (void)
rts[1].metric = metric;
rts[1].mss = mss;
rts[1].scope_inv = nm_platform_route_scope_inv (RT_SCOPE_UNIVERSE);
rts[2].rt_source = NM_IP_CONFIG_SOURCE_USER;
rts[2].rt_source = nmp_utils_ip_config_source_round_trip_rtprot (NM_IP_CONFIG_SOURCE_USER);
rts[2].network = 0;
rts[2].plen = 0;
rts[2].ifindex = ifindex;
@@ -265,21 +265,21 @@ test_ip6_route (void)
/* Test route listing */
routes = nm_platform_ip6_route_get_all (NM_PLATFORM_GET, ifindex, NM_PLATFORM_GET_ROUTE_FLAGS_WITH_DEFAULT | NM_PLATFORM_GET_ROUTE_FLAGS_WITH_NON_DEFAULT);
memset (rts, 0, sizeof (rts));
rts[0].rt_source = NM_IP_CONFIG_SOURCE_USER;
rts[0].rt_source = nmp_utils_ip_config_source_round_trip_rtprot (NM_IP_CONFIG_SOURCE_USER);
rts[0].network = gateway;
rts[0].plen = 128;
rts[0].ifindex = ifindex;
rts[0].gateway = in6addr_any;
rts[0].metric = nm_utils_ip6_route_metric_normalize (metric);
rts[0].mss = mss;
rts[1].rt_source = NM_IP_CONFIG_SOURCE_USER;
rts[1].rt_source = nmp_utils_ip_config_source_round_trip_rtprot (NM_IP_CONFIG_SOURCE_USER);
rts[1].network = network;
rts[1].plen = plen;
rts[1].ifindex = ifindex;
rts[1].gateway = gateway;
rts[1].metric = nm_utils_ip6_route_metric_normalize (metric);
rts[1].mss = mss;
rts[2].rt_source = NM_IP_CONFIG_SOURCE_USER;
rts[2].rt_source = nmp_utils_ip_config_source_round_trip_rtprot (NM_IP_CONFIG_SOURCE_USER);
rts[2].network = in6addr_any;
rts[2].plen = 0;
rts[2].ifindex = ifindex;

View File

@@ -52,6 +52,7 @@ test_ip6_config_LDADD = \
test_route_manager_fake_CPPFLAGS = \
$(AM_CPPFLAGS) \
$(GUDEV_CFLAGS) \
-I$(top_srcdir)/src/platform/tests \
-DSETUP=nm_fake_platform_setup \
-DKERNEL_HACKS=0
@@ -69,6 +70,7 @@ test_route_manager_linux_SOURCES = \
test_route_manager_linux_CPPFLAGS = \
$(AM_CPPFLAGS) \
$(GUDEV_CFLAGS) \
-I$(top_srcdir)/src/platform/tests \
-DSETUP=nm_linux_platform_setup \
-DKERNEL_HACKS=1

View File

@@ -23,12 +23,11 @@
#include <arpa/inet.h>
#include <linux/rtnetlink.h>
#include "test-common.h"
#include "nm-platform.h"
#include "nm-platform-utils.h"
#include "nm-route-manager.h"
#include "nm-test-utils.h"
#include "test-common.h"
typedef struct {
int ifindex0, ifindex1;
@@ -45,7 +44,7 @@ setup_dev0_ip4 (int ifindex, guint mss_of_first_route, guint32 metric_of_second_
route.ifindex = ifindex;
route.mss = 0;
route.rt_source = NM_IP_CONFIG_SOURCE_USER;
route.rt_source = nmp_utils_ip_config_source_round_trip_rtprot (NM_IP_CONFIG_SOURCE_USER);
inet_pton (AF_INET, "6.6.6.0", &route.network);
route.plen = 24;
route.gateway = INADDR_ANY;
@@ -53,7 +52,7 @@ setup_dev0_ip4 (int ifindex, guint mss_of_first_route, guint32 metric_of_second_
route.mss = mss_of_first_route;
g_array_append_val (routes, route);
route.rt_source = NM_IP_CONFIG_SOURCE_USER;
route.rt_source = nmp_utils_ip_config_source_round_trip_rtprot (NM_IP_CONFIG_SOURCE_USER);
inet_pton (AF_INET, "7.0.0.0", &route.network);
route.plen = 8;
inet_pton (AF_INET, "6.6.6.1", &route.gateway);
@@ -87,21 +86,21 @@ setup_dev1_ip4 (int ifindex)
route.mss))
g_assert_not_reached ();
route.rt_source = NM_IP_CONFIG_SOURCE_USER;
route.rt_source = nmp_utils_ip_config_source_round_trip_rtprot (NM_IP_CONFIG_SOURCE_USER);
inet_pton (AF_INET, "6.6.6.0", &route.network);
route.plen = 24;
route.gateway = INADDR_ANY;
route.metric = 20;
g_array_append_val (routes, route);
route.rt_source = NM_IP_CONFIG_SOURCE_USER;
route.rt_source = nmp_utils_ip_config_source_round_trip_rtprot (NM_IP_CONFIG_SOURCE_USER);
inet_pton (AF_INET, "7.0.0.0", &route.network);
route.plen = 8;
route.gateway = INADDR_ANY;
route.metric = 22;
g_array_append_val (routes, route);
route.rt_source = NM_IP_CONFIG_SOURCE_USER;
route.rt_source = nmp_utils_ip_config_source_round_trip_rtprot (NM_IP_CONFIG_SOURCE_USER);
inet_pton (AF_INET, "8.0.0.0", &route.network);
route.plen = 8;
inet_pton (AF_INET, "6.6.6.2", &route.gateway);
@@ -121,14 +120,14 @@ update_dev0_ip4 (int ifindex)
route.ifindex = ifindex;
route.mss = 0;
route.rt_source = NM_IP_CONFIG_SOURCE_USER;
route.rt_source = nmp_utils_ip_config_source_round_trip_rtprot (NM_IP_CONFIG_SOURCE_USER);
inet_pton (AF_INET, "6.6.6.0", &route.network);
route.plen = 24;
route.gateway = INADDR_ANY;
route.metric = 20;
g_array_append_val (routes, route);
route.rt_source = NM_IP_CONFIG_SOURCE_USER;
route.rt_source = nmp_utils_ip_config_source_round_trip_rtprot (NM_IP_CONFIG_SOURCE_USER);
inet_pton (AF_INET, "7.0.0.0", &route.network);
route.plen = 8;
route.gateway = INADDR_ANY;
@@ -163,7 +162,7 @@ test_ip4 (test_fixture *fixture, gconstpointer user_data)
NMPlatformIP4Route state1[] = {
{
.rt_source = NM_IP_CONFIG_SOURCE_USER,
.rt_source = nmp_utils_ip_config_source_round_trip_rtprot (NM_IP_CONFIG_SOURCE_USER),
.network = nmtst_inet4_from_string ("6.6.6.0"),
.plen = 24,
.ifindex = fixture->ifindex0,
@@ -173,7 +172,7 @@ test_ip4 (test_fixture *fixture, gconstpointer user_data)
.scope_inv = nm_platform_route_scope_inv (RT_SCOPE_LINK),
},
{
.rt_source = NM_IP_CONFIG_SOURCE_USER,
.rt_source = nmp_utils_ip_config_source_round_trip_rtprot (NM_IP_CONFIG_SOURCE_USER),
.network = nmtst_inet4_from_string ("7.0.0.0"),
.plen = 8,
.ifindex = fixture->ifindex0,
@@ -183,7 +182,7 @@ test_ip4 (test_fixture *fixture, gconstpointer user_data)
.scope_inv = nm_platform_route_scope_inv (RT_SCOPE_UNIVERSE),
},
{
.rt_source = NM_IP_CONFIG_SOURCE_USER,
.rt_source = nmp_utils_ip_config_source_round_trip_rtprot (NM_IP_CONFIG_SOURCE_USER),
.network = nmtst_inet4_from_string ("7.0.0.0"),
.plen = 8,
.ifindex = fixture->ifindex1,
@@ -193,7 +192,7 @@ test_ip4 (test_fixture *fixture, gconstpointer user_data)
.scope_inv = nm_platform_route_scope_inv (RT_SCOPE_LINK),
},
{
.rt_source = NM_IP_CONFIG_SOURCE_USER,
.rt_source = nmp_utils_ip_config_source_round_trip_rtprot (NM_IP_CONFIG_SOURCE_USER),
.network = nmtst_inet4_from_string ("6.6.6.0"),
.plen = 24,
.ifindex = fixture->ifindex1,
@@ -203,7 +202,7 @@ test_ip4 (test_fixture *fixture, gconstpointer user_data)
.scope_inv = nm_platform_route_scope_inv (RT_SCOPE_LINK),
},
{
.rt_source = NM_IP_CONFIG_SOURCE_USER,
.rt_source = nmp_utils_ip_config_source_round_trip_rtprot (NM_IP_CONFIG_SOURCE_USER),
.network = nmtst_inet4_from_string ("8.0.0.0"),
.plen = 8,
.ifindex = fixture->ifindex1,
@@ -216,7 +215,7 @@ test_ip4 (test_fixture *fixture, gconstpointer user_data)
NMPlatformIP4Route state2[] = {
{
.rt_source = NM_IP_CONFIG_SOURCE_USER,
.rt_source = nmp_utils_ip_config_source_round_trip_rtprot (NM_IP_CONFIG_SOURCE_USER),
.network = nmtst_inet4_from_string ("6.6.6.0"),
.plen = 24,
.ifindex = fixture->ifindex0,
@@ -226,7 +225,7 @@ test_ip4 (test_fixture *fixture, gconstpointer user_data)
.scope_inv = nm_platform_route_scope_inv (RT_SCOPE_LINK),
},
{
.rt_source = NM_IP_CONFIG_SOURCE_USER,
.rt_source = nmp_utils_ip_config_source_round_trip_rtprot (NM_IP_CONFIG_SOURCE_USER),
.network = nmtst_inet4_from_string ("7.0.0.0"),
.plen = 8,
.ifindex = fixture->ifindex0,
@@ -236,7 +235,7 @@ test_ip4 (test_fixture *fixture, gconstpointer user_data)
.scope_inv = nm_platform_route_scope_inv (RT_SCOPE_LINK),
},
{
.rt_source = NM_IP_CONFIG_SOURCE_USER,
.rt_source = nmp_utils_ip_config_source_round_trip_rtprot (NM_IP_CONFIG_SOURCE_USER),
.network = nmtst_inet4_from_string ("7.0.0.0"),
.plen = 8,
.ifindex = fixture->ifindex1,
@@ -246,7 +245,7 @@ test_ip4 (test_fixture *fixture, gconstpointer user_data)
.scope_inv = nm_platform_route_scope_inv (RT_SCOPE_LINK),
},
{
.rt_source = NM_IP_CONFIG_SOURCE_USER,
.rt_source = nmp_utils_ip_config_source_round_trip_rtprot (NM_IP_CONFIG_SOURCE_USER),
.network = nmtst_inet4_from_string ("6.6.6.0"),
.plen = 24,
.ifindex = fixture->ifindex1,
@@ -256,7 +255,7 @@ test_ip4 (test_fixture *fixture, gconstpointer user_data)
.scope_inv = nm_platform_route_scope_inv (RT_SCOPE_LINK),
},
{
.rt_source = NM_IP_CONFIG_SOURCE_USER,
.rt_source = nmp_utils_ip_config_source_round_trip_rtprot (NM_IP_CONFIG_SOURCE_USER),
.network = nmtst_inet4_from_string ("8.0.0.0"),
.plen = 8,
.ifindex = fixture->ifindex1,
@@ -269,7 +268,7 @@ test_ip4 (test_fixture *fixture, gconstpointer user_data)
NMPlatformIP4Route state3[] = {
{
.rt_source = NM_IP_CONFIG_SOURCE_USER,
.rt_source = nmp_utils_ip_config_source_round_trip_rtprot (NM_IP_CONFIG_SOURCE_USER),
.network = nmtst_inet4_from_string ("7.0.0.0"),
.plen = 8,
.ifindex = fixture->ifindex1,
@@ -279,7 +278,7 @@ test_ip4 (test_fixture *fixture, gconstpointer user_data)
.scope_inv = nm_platform_route_scope_inv (RT_SCOPE_LINK),
},
{
.rt_source = NM_IP_CONFIG_SOURCE_USER,
.rt_source = nmp_utils_ip_config_source_round_trip_rtprot (NM_IP_CONFIG_SOURCE_USER),
.network = nmtst_inet4_from_string ("6.6.6.0"),
.plen = 24,
.ifindex = fixture->ifindex1,
@@ -289,7 +288,7 @@ test_ip4 (test_fixture *fixture, gconstpointer user_data)
.scope_inv = nm_platform_route_scope_inv (RT_SCOPE_LINK),
},
{
.rt_source = NM_IP_CONFIG_SOURCE_USER,
.rt_source = nmp_utils_ip_config_source_round_trip_rtprot (NM_IP_CONFIG_SOURCE_USER),
.network = nmtst_inet4_from_string ("8.0.0.0"),
.plen = 8,
.ifindex = fixture->ifindex1,
@@ -299,7 +298,7 @@ test_ip4 (test_fixture *fixture, gconstpointer user_data)
.scope_inv = nm_platform_route_scope_inv (RT_SCOPE_UNIVERSE),
},
{
.rt_source = NM_IP_CONFIG_SOURCE_USER,
.rt_source = nmp_utils_ip_config_source_round_trip_rtprot (NM_IP_CONFIG_SOURCE_USER),
.network = nmtst_inet4_from_string ("6.6.6.0"),
.plen = 24,
.ifindex = fixture->ifindex1,
@@ -542,7 +541,7 @@ test_ip6 (test_fixture *fixture, gconstpointer user_data)
NMPlatformIP6Route state1[] = {
{
.rt_source = NM_IP_CONFIG_SOURCE_USER,
.rt_source = nmp_utils_ip_config_source_round_trip_rtprot (NM_IP_CONFIG_SOURCE_USER),
.network = *nmtst_inet6_from_string ("2001:db8:8086::"),
.plen = 48,
.ifindex = fixture->ifindex0,
@@ -551,7 +550,7 @@ test_ip6 (test_fixture *fixture, gconstpointer user_data)
.mss = 0,
},
{
.rt_source = NM_IP_CONFIG_SOURCE_USER,
.rt_source = nmp_utils_ip_config_source_round_trip_rtprot (NM_IP_CONFIG_SOURCE_USER),
.network = *nmtst_inet6_from_string ("2001:db8:1337::"),
.plen = 48,
.ifindex = fixture->ifindex0,
@@ -560,7 +559,7 @@ test_ip6 (test_fixture *fixture, gconstpointer user_data)
.mss = 0,
},
{
.rt_source = NM_IP_CONFIG_SOURCE_USER,
.rt_source = nmp_utils_ip_config_source_round_trip_rtprot (NM_IP_CONFIG_SOURCE_USER),
.network = *nmtst_inet6_from_string ("2001:db8:abad:c0de::"),
.plen = 64,
.ifindex = fixture->ifindex0,
@@ -569,7 +568,7 @@ test_ip6 (test_fixture *fixture, gconstpointer user_data)
.mss = 0,
},
{
.rt_source = NM_IP_CONFIG_SOURCE_USER,
.rt_source = nmp_utils_ip_config_source_round_trip_rtprot (NM_IP_CONFIG_SOURCE_USER),
.network = *nmtst_inet6_from_string ("2001:db8:abad:c0de::"),
.plen = 64,
.ifindex = fixture->ifindex1,
@@ -578,7 +577,7 @@ test_ip6 (test_fixture *fixture, gconstpointer user_data)
.mss = 0,
},
{
.rt_source = NM_IP_CONFIG_SOURCE_USER,
.rt_source = nmp_utils_ip_config_source_round_trip_rtprot (NM_IP_CONFIG_SOURCE_USER),
.network = *nmtst_inet6_from_string ("2001:db8:1337::"),
.plen = 48,
.ifindex = fixture->ifindex1,
@@ -587,7 +586,7 @@ test_ip6 (test_fixture *fixture, gconstpointer user_data)
.mss = 0,
},
{
.rt_source = NM_IP_CONFIG_SOURCE_USER,
.rt_source = nmp_utils_ip_config_source_round_trip_rtprot (NM_IP_CONFIG_SOURCE_USER),
.network = *nmtst_inet6_from_string ("2001:db8:8086::"),
.plen = 48,
.ifindex = fixture->ifindex1,
@@ -596,7 +595,7 @@ test_ip6 (test_fixture *fixture, gconstpointer user_data)
.mss = 0,
},
{
.rt_source = NM_IP_CONFIG_SOURCE_USER,
.rt_source = nmp_utils_ip_config_source_round_trip_rtprot (NM_IP_CONFIG_SOURCE_USER),
.network = *nmtst_inet6_from_string ("2001:db8:d34d::"),
.plen = 64,
.ifindex = fixture->ifindex1,
@@ -608,7 +607,7 @@ test_ip6 (test_fixture *fixture, gconstpointer user_data)
NMPlatformIP6Route state2[] = {
{
.rt_source = NM_IP_CONFIG_SOURCE_USER,
.rt_source = nmp_utils_ip_config_source_round_trip_rtprot (NM_IP_CONFIG_SOURCE_USER),
.network = *nmtst_inet6_from_string ("2001:db8:8086::"),
.plen = 48,
.ifindex = fixture->ifindex0,
@@ -617,7 +616,7 @@ test_ip6 (test_fixture *fixture, gconstpointer user_data)
.mss = 0,
},
{
.rt_source = NM_IP_CONFIG_SOURCE_USER,
.rt_source = nmp_utils_ip_config_source_round_trip_rtprot (NM_IP_CONFIG_SOURCE_USER),
.network = *nmtst_inet6_from_string ("2001:db8:1337::"),
.plen = 48,
.ifindex = fixture->ifindex0,
@@ -626,7 +625,7 @@ test_ip6 (test_fixture *fixture, gconstpointer user_data)
.mss = 0,
},
{
.rt_source = NM_IP_CONFIG_SOURCE_USER,
.rt_source = nmp_utils_ip_config_source_round_trip_rtprot (NM_IP_CONFIG_SOURCE_USER),
.network = *nmtst_inet6_from_string ("2001:db8:abad:c0de::"),
.plen = 64,
.ifindex = fixture->ifindex0,
@@ -635,7 +634,7 @@ test_ip6 (test_fixture *fixture, gconstpointer user_data)
.mss = 0,
},
{
.rt_source = NM_IP_CONFIG_SOURCE_USER,
.rt_source = nmp_utils_ip_config_source_round_trip_rtprot (NM_IP_CONFIG_SOURCE_USER),
.network = *nmtst_inet6_from_string ("2001:db8:abad:c0de::"),
.plen = 64,
.ifindex = fixture->ifindex1,
@@ -644,7 +643,7 @@ test_ip6 (test_fixture *fixture, gconstpointer user_data)
.mss = 0,
},
{
.rt_source = NM_IP_CONFIG_SOURCE_USER,
.rt_source = nmp_utils_ip_config_source_round_trip_rtprot (NM_IP_CONFIG_SOURCE_USER),
.network = *nmtst_inet6_from_string ("2001:db8:1337::"),
.plen = 48,
.ifindex = fixture->ifindex1,
@@ -653,7 +652,7 @@ test_ip6 (test_fixture *fixture, gconstpointer user_data)
.mss = 0,
},
{
.rt_source = NM_IP_CONFIG_SOURCE_USER,
.rt_source = nmp_utils_ip_config_source_round_trip_rtprot (NM_IP_CONFIG_SOURCE_USER),
.network = *nmtst_inet6_from_string ("2001:db8:8086::"),
.plen = 48,
.ifindex = fixture->ifindex1,
@@ -662,7 +661,7 @@ test_ip6 (test_fixture *fixture, gconstpointer user_data)
.mss = 0,
},
{
.rt_source = NM_IP_CONFIG_SOURCE_USER,
.rt_source = nmp_utils_ip_config_source_round_trip_rtprot (NM_IP_CONFIG_SOURCE_USER),
.network = *nmtst_inet6_from_string ("2001:db8:d34d::"),
.plen = 64,
.ifindex = fixture->ifindex1,
@@ -674,7 +673,7 @@ test_ip6 (test_fixture *fixture, gconstpointer user_data)
NMPlatformIP6Route state3[] = {
{
.rt_source = NM_IP_CONFIG_SOURCE_USER,
.rt_source = nmp_utils_ip_config_source_round_trip_rtprot (NM_IP_CONFIG_SOURCE_USER),
.network = *nmtst_inet6_from_string ("2001:db8:abad:c0de::"),
.plen = 64,
.ifindex = fixture->ifindex1,
@@ -683,7 +682,7 @@ test_ip6 (test_fixture *fixture, gconstpointer user_data)
.mss = 0,
},
{
.rt_source = NM_IP_CONFIG_SOURCE_USER,
.rt_source = nmp_utils_ip_config_source_round_trip_rtprot (NM_IP_CONFIG_SOURCE_USER),
.network = *nmtst_inet6_from_string ("2001:db8:8086::"),
.plen = 48,
.ifindex = fixture->ifindex1,
@@ -692,7 +691,7 @@ test_ip6 (test_fixture *fixture, gconstpointer user_data)
.mss = 0,
},
{
.rt_source = NM_IP_CONFIG_SOURCE_USER,
.rt_source = nmp_utils_ip_config_source_round_trip_rtprot (NM_IP_CONFIG_SOURCE_USER),
.network = *nmtst_inet6_from_string ("2001:db8:1337::"),
.plen = 48,
.ifindex = fixture->ifindex1,
@@ -701,7 +700,7 @@ test_ip6 (test_fixture *fixture, gconstpointer user_data)
.mss = 0,
},
{
.rt_source = NM_IP_CONFIG_SOURCE_USER,
.rt_source = nmp_utils_ip_config_source_round_trip_rtprot (NM_IP_CONFIG_SOURCE_USER),
.network = *nmtst_inet6_from_string ("2001:db8:1337::"),
.plen = 48,
.ifindex = fixture->ifindex1,
@@ -710,7 +709,7 @@ test_ip6 (test_fixture *fixture, gconstpointer user_data)
.mss = 0,
},
{
.rt_source = NM_IP_CONFIG_SOURCE_USER,
.rt_source = nmp_utils_ip_config_source_round_trip_rtprot (NM_IP_CONFIG_SOURCE_USER),
.network = *nmtst_inet6_from_string ("2001:db8:8086::"),
.plen = 48,
.ifindex = fixture->ifindex1,
@@ -719,7 +718,7 @@ test_ip6 (test_fixture *fixture, gconstpointer user_data)
.mss = 0,
},
{
.rt_source = NM_IP_CONFIG_SOURCE_USER,
.rt_source = nmp_utils_ip_config_source_round_trip_rtprot (NM_IP_CONFIG_SOURCE_USER),
.network = *nmtst_inet6_from_string ("2001:db8:d34d::"),
.plen = 64,
.ifindex = fixture->ifindex1,
@@ -787,6 +786,7 @@ static void
_assert_route_check (const NMPlatformVTableRoute *vtable, gboolean has, const NMPlatformIPXRoute *route)
{
const NMPlatformIPXRoute *r;
NMPlatformIPXRoute c;
g_assert (route);
@@ -800,11 +800,18 @@ _assert_route_check (const NMPlatformVTableRoute *vtable, gboolean has, const NM
} else {
char buf[sizeof (_nm_utils_to_string_buffer)];
if (!r || vtable->route_cmp (route, r) != 0)
if (r) {
if (vtable->is_ip4)
c.r4 = route->r4;
else
c.r6 = route->r6;
c.rx.rt_source = nmp_utils_ip_config_source_round_trip_rtprot (c.rx.rt_source);
}
if (!r || vtable->route_cmp (r, &c) != 0) {
g_error ("Invalid route. Expect %s, has %s",
vtable->route_to_string (route, NULL, 0),
vtable->route_to_string (&c, NULL, 0),
vtable->route_to_string (r, buf, sizeof (buf)));
g_assert (r);
}
}
}