diff --git a/src/NetworkManagerUtils.c b/src/NetworkManagerUtils.c index 9db609a1d..ecc9b6093 100644 --- a/src/NetworkManagerUtils.c +++ b/src/NetworkManagerUtils.c @@ -649,23 +649,21 @@ nm_utils_read_resolv_conf_nameservers (const char *rc_contents) return nameservers; } -static NMConnection * -check_possible_match (NMConnection *orig, - NMConnection *candidate, - GHashTable *settings) +static gboolean +check_ip6_method_link_local_auto (NMConnection *orig, + NMConnection *candidate, + GHashTable *settings) { GHashTable *props; const char *orig_ip6_method, *candidate_ip6_method; NMSettingIP6Config *candidate_ip6; - g_return_val_if_fail (settings != NULL, NULL); - props = g_hash_table_lookup (settings, NM_SETTING_IP6_CONFIG_SETTING_NAME); if ( !props || (g_hash_table_size (props) != 1) || !g_hash_table_lookup (props, NM_SETTING_IP6_CONFIG_METHOD)) { /* For now 'method' is the only difference we handle here */ - return NULL; + return FALSE; } /* If the original connection is 'link-local' and the candidate is both 'auto' @@ -681,9 +679,22 @@ check_possible_match (NMConnection *orig, if ( strcmp (orig_ip6_method, NM_SETTING_IP6_CONFIG_METHOD_LINK_LOCAL) == 0 && strcmp (candidate_ip6_method, NM_SETTING_IP6_CONFIG_METHOD_AUTO) == 0 && (!candidate_ip6 || nm_setting_ip6_config_get_may_fail (candidate_ip6))) { - return candidate; + return TRUE; } + return FALSE; +} + +static NMConnection * +check_possible_match (NMConnection *orig, + NMConnection *candidate, + GHashTable *settings) +{ + g_return_val_if_fail (settings != NULL, NULL); + + if (check_ip6_method_link_local_auto (orig, candidate, settings)) + return candidate; + return NULL; } diff --git a/src/tests/test-general.c b/src/tests/test-general.c index 3fd7115cb..9fbefa2b7 100644 --- a/src/tests/test-general.c +++ b/src/tests/test-general.c @@ -23,6 +23,7 @@ #include #include "NetworkManagerUtils.h" +#include "nm-utils.h" static void @@ -132,6 +133,113 @@ test_nm_utils_ip6_address_clear_host_address (void) /*******************************************/ +static NMConnection * +_match_connection_new (void) +{ + NMConnection *connection; + NMSettingConnection *s_con; + NMSettingWired *s_wired; + NMSettingIP4Config *s_ip4; + NMSettingIP6Config *s_ip6; + char *uuid; + + connection = nm_connection_new (); + + s_con = (NMSettingConnection *) nm_setting_connection_new (); + nm_connection_add_setting (connection, (NMSetting *) s_con); + uuid = nm_utils_uuid_generate (); + g_object_set (G_OBJECT (s_con), + NM_SETTING_CONNECTION_ID, "blahblah", + NM_SETTING_CONNECTION_UUID, uuid, + NM_SETTING_CONNECTION_TYPE, NM_SETTING_WIRED_SETTING_NAME, + NM_SETTING_CONNECTION_AUTOCONNECT, FALSE, + NULL); + g_free (uuid); + + s_wired = (NMSettingWired *) nm_setting_wired_new (); + nm_connection_add_setting (connection, (NMSetting *) s_wired); + + s_ip4 = (NMSettingIP4Config *) nm_setting_ip4_config_new (); + nm_connection_add_setting (connection, (NMSetting *) s_ip4); + g_object_set (G_OBJECT (s_ip4), + NM_SETTING_IP4_CONFIG_METHOD, NM_SETTING_IP4_CONFIG_METHOD_AUTO, + NULL); + + s_ip6 = (NMSettingIP6Config *) nm_setting_ip6_config_new (); + nm_connection_add_setting (connection, (NMSetting *) s_ip6); + g_object_set (G_OBJECT (s_ip6), + NM_SETTING_IP6_CONFIG_METHOD, NM_SETTING_IP6_CONFIG_METHOD_AUTO, + NULL); + + return connection; +} + +static void +test_connection_match_basic (void) +{ + NMConnection *orig, *copy, *matched; + GSList *connections = NULL; + NMSettingIP4Config *s_ip4; + + orig = _match_connection_new (); + copy = nm_connection_duplicate (orig); + connections = g_slist_append (connections, copy); + + matched = nm_utils_match_connection (connections, orig, NULL, NULL); + g_assert (matched == copy); + + /* Now change a material property like IPv4 method and ensure matching fails */ + s_ip4 = nm_connection_get_setting_ip4_config (orig); + g_assert (s_ip4); + g_object_set (G_OBJECT (s_ip4), + NM_SETTING_IP4_CONFIG_METHOD, NM_SETTING_IP4_CONFIG_METHOD_LINK_LOCAL, + NULL); + matched = nm_utils_match_connection (connections, orig, NULL, NULL); + g_assert (matched == NULL); + + g_slist_free (connections); + g_object_unref (orig); + g_object_unref (copy); +} + +static void +test_connection_match_ip6_method (void) +{ + NMConnection *orig, *copy, *matched; + GSList *connections = NULL; + NMSettingIP6Config *s_ip6; + + orig = _match_connection_new (); + copy = nm_connection_duplicate (orig); + connections = g_slist_append (connections, copy); + + /* Check that if the original connection is IPv6 method=link-local, and the + * candidate is both method=auto and may-faily=true, that the candidate is + * matched. + */ + s_ip6 = nm_connection_get_setting_ip6_config (orig); + g_assert (s_ip6); + g_object_set (G_OBJECT (s_ip6), + NM_SETTING_IP6_CONFIG_METHOD, NM_SETTING_IP6_CONFIG_METHOD_LINK_LOCAL, + NULL); + + s_ip6 = nm_connection_get_setting_ip6_config (copy); + g_assert (s_ip6); + g_object_set (G_OBJECT (s_ip6), + NM_SETTING_IP6_CONFIG_METHOD, NM_SETTING_IP6_CONFIG_METHOD_AUTO, + NM_SETTING_IP6_CONFIG_MAY_FAIL, TRUE, + NULL); + + matched = nm_utils_match_connection (connections, orig, NULL, NULL); + g_assert (matched == copy); + + g_slist_free (connections); + g_object_unref (orig); + g_object_unref (copy); +} + +/*******************************************/ + int main (int argc, char **argv) { @@ -142,6 +250,9 @@ main (int argc, char **argv) g_test_add_func ("/general/nm_utils_ascii_str_to_int64", test_nm_utils_ascii_str_to_int64); g_test_add_func ("/general/nm_utils_ip6_address_clear_host_address", test_nm_utils_ip6_address_clear_host_address); + g_test_add_func ("/general/connection-match/basic", test_connection_match_basic); + g_test_add_func ("/general/connection-match/ip6-method", test_connection_match_ip6_method); + return g_test_run (); }