diff --git a/src/core/nm-l3-config-data.c b/src/core/nm-l3-config-data.c index 0b2804fa72..13a84d51f0 100644 --- a/src/core/nm-l3-config-data.c +++ b/src/core/nm-l3-config-data.c @@ -2604,15 +2604,15 @@ nm_l3_config_data_cmp_full(const NML3ConfigData *a, const NMPObject *def_route_a = a->best_default_route_x[IS_IPv4]; const NMPObject *def_route_b = b->best_default_route_x[IS_IPv4]; - if (def_route_a != def_route_b) { - if (NM_FLAGS_HAS(flags, NM_L3_CONFIG_CMP_FLAGS_ROUTES)) { - NM_CMP_RETURN( - nmp_object_cmp_full(def_route_a, - def_route_b, - NM_FLAGS_HAS(flags, NM_L3_CONFIG_CMP_FLAGS_IFINDEX) - ? NMP_OBJECT_CMP_FLAGS_NONE - : NMP_OBJECT_CMP_FLAGS_IGNORE_IFINDEX)); - } else if (NM_FLAGS_HAS(flags, NM_L3_CONFIG_CMP_FLAGS_ROUTES_ID)) { + if (NM_FLAGS_HAS(flags, NM_L3_CONFIG_CMP_FLAGS_ROUTES)) { + NM_CMP_RETURN(nmp_object_cmp_full(def_route_a, + def_route_b, + NM_FLAGS_HAS(flags, NM_L3_CONFIG_CMP_FLAGS_IFINDEX) + ? NMP_OBJECT_CMP_FLAGS_NONE + : NMP_OBJECT_CMP_FLAGS_IGNORE_IFINDEX)); + } else if (NM_FLAGS_HAS(flags, NM_L3_CONFIG_CMP_FLAGS_ROUTES_ID)) { + NM_CMP_DIRECT(!!def_route_a, !!def_route_b); + if (def_route_a && def_route_b) { if (NM_FLAGS_HAS(flags, NM_L3_CONFIG_CMP_FLAGS_IFINDEX)) { NM_CMP_DIRECT(def_route_a->obj_with_ifindex.ifindex, def_route_b->obj_with_ifindex.ifindex); diff --git a/src/core/tests/test-core.c b/src/core/tests/test-core.c index cb09ac3862..51f4d4ab1c 100644 --- a/src/core/tests/test-core.c +++ b/src/core/tests/test-core.c @@ -20,6 +20,7 @@ #include "dns/nm-dns-manager.h" #include "nm-connectivity.h" #include "nm-firewall-utils.h" +#include "nm-l3-config-data.h" #include "nm-test-utils-core.h" @@ -2823,6 +2824,51 @@ test_icmp6_checksum(void) /*****************************************************************************/ +static void +test_l3_config_data_cmp_default_routes(void) +{ + nm_auto_unref_dedup_multi_index NMDedupMultiIndex *multi_idx = nm_dedup_multi_index_new(); + nm_auto_unref_l3cd_init NML3ConfigData *a = NULL; + nm_auto_unref_l3cd_init NML3ConfigData *b = NULL; + const int IFINDEX = 1; + + a = nm_l3_config_data_new(multi_idx, IFINDEX, NM_IP_CONFIG_SOURCE_USER); + nm_l3_config_data_add_route_4( + a, + NM_PLATFORM_IP4_ROUTE_INIT(.ifindex = IFINDEX, + .network = 0, + .plen = 0, + .gateway = nmtst_inet4_from_string("192.168.1.1"), + .metric = 100)); + + b = nm_l3_config_data_new(multi_idx, IFINDEX, NM_IP_CONFIG_SOURCE_USER); + nm_l3_config_data_add_route_4( + b, + NM_PLATFORM_IP4_ROUTE_INIT(.ifindex = IFINDEX, + .network = 0, + .plen = 0, + .gateway = nmtst_inet4_from_string("192.168.1.1"), + .metric = 100, + .table_coerced = nm_platform_route_table_coerce(100))); + + nm_l3_config_data_seal(a); + nm_l3_config_data_seal(b); + + g_assert(nm_l3_config_data_get_best_default_route(a, AF_INET)); + g_assert(!nm_l3_config_data_get_best_default_route(b, AF_INET)); + + g_assert_cmpint(nm_l3_config_data_cmp_full(a, b, NM_L3_CONFIG_CMP_FLAGS_ROUTES_ID), !=, 0); + g_assert_cmpint(nm_l3_config_data_cmp_full(b, a, NM_L3_CONFIG_CMP_FLAGS_ROUTES_ID), !=, 0); + + g_assert_cmpint(nm_l3_config_data_cmp_full(b, a, NM_L3_CONFIG_CMP_FLAGS_ADDRESSES), ==, 0); + g_assert_cmpint(nm_l3_config_data_cmp_full(b, a, NM_L3_CONFIG_CMP_FLAGS_ADDRESSES), ==, 0); + + g_assert_cmpint(nm_l3_config_data_cmp_full(a, a, NM_L3_CONFIG_CMP_FLAGS_ALL), ==, 0); + g_assert_cmpint(nm_l3_config_data_cmp_full(b, b, NM_L3_CONFIG_CMP_FLAGS_ALL), ==, 0); +} + +/*****************************************************************************/ + NMTST_DEFINE(); int @@ -2901,5 +2947,8 @@ main(int argc, char **argv) g_test_add_func("/core/general/test_icmp6_checksum", test_icmp6_checksum); + g_test_add_func("/core/general/test_l3_config_data_cmp_default_routes", + test_l3_config_data_cmp_default_routes); + return g_test_run(); }