Commit 5f154096 authored by Dan Williams's avatar Dan Williams

libnm-util: add INFERRABLE flag and remove CANDIDATE

INFERRABLE means the opposite of CANDIDATE; a property which NetworkManager
can read ("infer") from the system or the kernel when generating
connections.  CANDIDATE isn't a great name and thus dies.
parent 5f32b858
......@@ -451,10 +451,6 @@ nm_connection_compare (NMConnection *a,
if (!a || !b)
return FALSE;
/* CANDIDATE flag also implies FUZZY */
if (flags & NM_SETTING_COMPARE_FLAG_CANDIDATE)
flags |= NM_SETTING_COMPARE_FLAG_FUZZY;
/* A / B: ensure all settings in A match corresponding ones in B */
g_hash_table_iter_init (&iter, NM_CONNECTION_GET_PRIVATE (a)->settings);
while (g_hash_table_iter_next (&iter, NULL, (gpointer) &src)) {
......
......@@ -284,7 +284,7 @@ nm_setting_bluetooth_class_init (NMSettingBluetoothClass *setting_class)
"Bluetooth address",
"The Bluetooth address of the device",
DBUS_TYPE_G_UCHAR_ARRAY,
G_PARAM_READWRITE));
G_PARAM_READWRITE | NM_SETTING_PARAM_INFERRABLE));
/**
* NMSettingBluetooth:type:
......@@ -301,5 +301,5 @@ nm_setting_bluetooth_class_init (NMSettingBluetoothClass *setting_class)
"'" NM_SETTING_BLUETOOTH_TYPE_PANU "' for "
"Personal Area Networking connections.",
NULL,
G_PARAM_READWRITE));
G_PARAM_READWRITE | NM_SETTING_PARAM_INFERRABLE));
}
......@@ -802,7 +802,7 @@ nm_setting_bond_class_init (NMSettingBondClass *setting_class)
"InterfaceName",
"The name of the virtual in-kernel bonding network interface",
NULL,
G_PARAM_READWRITE));
G_PARAM_READWRITE | NM_SETTING_PARAM_INFERRABLE));
/**
* NMSettingBond:options:
......@@ -820,5 +820,5 @@ nm_setting_bond_class_init (NMSettingBondClass *setting_class)
"strings. Option names must contain only "
"alphanumeric characters (ie, [a-zA-Z0-9]).",
DBUS_TYPE_G_MAP_OF_STRING,
G_PARAM_READWRITE));
G_PARAM_READWRITE | NM_SETTING_PARAM_INFERRABLE));
}
......@@ -269,7 +269,7 @@ nm_setting_bridge_port_class_init (NMSettingBridgePortClass *setting_class)
"Priority",
"The Spanning Tree Protocol (STP) priority of this bridge port",
0, BR_MAX_PORT_PRIORITY, BR_DEF_PRIORITY,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
G_PARAM_READWRITE | G_PARAM_CONSTRUCT | NM_SETTING_PARAM_INFERRABLE));
/**
* NMSettingBridgePort:path-cost:
......@@ -285,7 +285,7 @@ nm_setting_bridge_port_class_init (NMSettingBridgePortClass *setting_class)
"The Spanning Tree Protocol (STP) port cost for "
"destinations via this port.",
0, BR_MAX_PATH_COST, 100,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
G_PARAM_READWRITE | G_PARAM_CONSTRUCT | NM_SETTING_PARAM_INFERRABLE));
/**
* NMSettingBridgePort:hairpin-mode:
......@@ -303,6 +303,5 @@ nm_setting_bridge_port_class_init (NMSettingBridgePortClass *setting_class)
"port, which allows frames to be sent back out "
"through the port the frame was received on.",
FALSE,
G_PARAM_READWRITE));
G_PARAM_READWRITE | NM_SETTING_PARAM_INFERRABLE));
}
......@@ -434,7 +434,7 @@ nm_setting_bridge_class_init (NMSettingBridgeClass *setting_class)
"InterfaceName",
"The name of the virtual in-kernel bridging network interface",
NULL,
G_PARAM_READWRITE));
G_PARAM_READWRITE | NM_SETTING_PARAM_INFERRABLE));
/**
* NMSettingBridge:stp:
......@@ -450,7 +450,7 @@ nm_setting_bridge_class_init (NMSettingBridgeClass *setting_class)
"Controls whether Spanning Tree Protocol (STP) "
"is enabled for this bridge.",
TRUE,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
G_PARAM_READWRITE | G_PARAM_CONSTRUCT | NM_SETTING_PARAM_INFERRABLE));
/**
* NMSettingBridge:priority:
......@@ -470,7 +470,7 @@ nm_setting_bridge_class_init (NMSettingBridgeClass *setting_class)
"lowest priority bridge will be elected the root "
"bridge.",
0, G_MAXUINT16, 0x80,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
G_PARAM_READWRITE | G_PARAM_CONSTRUCT | NM_SETTING_PARAM_INFERRABLE));
/**
* NMSettingBridge:forward-delay:
......@@ -486,7 +486,7 @@ nm_setting_bridge_class_init (NMSettingBridgeClass *setting_class)
"The Spanning Tree Protocol (STP) forwarding "
"delay, in seconds.",
0, BR_MAX_FORWARD_DELAY, 15,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
G_PARAM_READWRITE | G_PARAM_CONSTRUCT | NM_SETTING_PARAM_INFERRABLE));
/**
* NMSettingBridge:hello-time:
......@@ -502,7 +502,7 @@ nm_setting_bridge_class_init (NMSettingBridgeClass *setting_class)
"The Spanning Tree Protocol (STP) hello time, in "
"seconds.",
0, BR_MAX_HELLO_TIME, 2,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
G_PARAM_READWRITE | G_PARAM_CONSTRUCT | NM_SETTING_PARAM_INFERRABLE));
/**
* NMSettingBridge:max-age:
......@@ -518,7 +518,7 @@ nm_setting_bridge_class_init (NMSettingBridgeClass *setting_class)
"The Spanning Tree Protocol (STP) maximum message "
"age, in seconds.",
0, BR_MAX_MAX_AGE, 20,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
G_PARAM_READWRITE | G_PARAM_CONSTRUCT | NM_SETTING_PARAM_INFERRABLE));
/**
* NMSettingBridge:ageing-time:
......@@ -533,6 +533,6 @@ nm_setting_bridge_class_init (NMSettingBridgeClass *setting_class)
"AgeingTime",
"The ethernet MAC address aging time, in seconds.",
0, BR_MAX_AGEING_TIME, 300,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
G_PARAM_READWRITE | G_PARAM_CONSTRUCT | NM_SETTING_PARAM_INFERRABLE));
}
......@@ -1099,7 +1099,7 @@ nm_setting_connection_class_init (NMSettingConnectionClass *setting_class)
"reordered the connection may be applied to the wrong "
"interface.",
NULL,
G_PARAM_READWRITE));
G_PARAM_READWRITE | NM_SETTING_PARAM_INFERRABLE));
/**
* NMSettingConnection:type:
......@@ -1121,7 +1121,7 @@ nm_setting_connection_class_init (NMSettingConnectionClass *setting_class)
"otherwise, should contain the setting name of that "
"setting type (ie, 'vpn' or 'bridge', etc).",
NULL,
G_PARAM_READWRITE));
G_PARAM_READWRITE | NM_SETTING_PARAM_INFERRABLE));
/**
* NMSettingConnection:permissions:
......@@ -1251,7 +1251,7 @@ nm_setting_connection_class_init (NMSettingConnectionClass *setting_class)
"Interface name of the master device or UUID of "
"the master connection",
NULL,
G_PARAM_READWRITE | NM_SETTING_PARAM_FUZZY_IGNORE));
G_PARAM_READWRITE | NM_SETTING_PARAM_FUZZY_IGNORE | NM_SETTING_PARAM_INFERRABLE));
/**
* NMSettingConnection:slave-type:
......@@ -1267,7 +1267,7 @@ nm_setting_connection_class_init (NMSettingConnectionClass *setting_class)
"this connection is (ie, 'bond') or NULL if this "
"connection is not a slave.",
NULL,
G_PARAM_READWRITE | NM_SETTING_PARAM_FUZZY_IGNORE));
G_PARAM_READWRITE | NM_SETTING_PARAM_FUZZY_IGNORE | NM_SETTING_PARAM_INFERRABLE));
/**
* NMSettingConnection:secondaries:
......
......@@ -367,7 +367,7 @@ nm_setting_infiniband_class_init (NMSettingInfinibandClass *setting_class)
"This property does not change the MAC address "
"of the device (i.e. MAC spoofing).",
DBUS_TYPE_G_UCHAR_ARRAY,
G_PARAM_READWRITE));
G_PARAM_READWRITE | NM_SETTING_PARAM_INFERRABLE));
/**
* NMSettingInfiniband:mtu:
......@@ -397,7 +397,7 @@ nm_setting_infiniband_class_init (NMSettingInfinibandClass *setting_class)
"Transport Mode",
"The IPoIB transport mode. Either 'datagram' or 'connected'.",
NULL,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
G_PARAM_READWRITE | G_PARAM_CONSTRUCT | NM_SETTING_PARAM_INFERRABLE));
/**
* NMSettingInfiniband:p-key:
......@@ -414,7 +414,7 @@ nm_setting_infiniband_class_init (NMSettingInfinibandClass *setting_class)
"The InfiniBand P_Key. Either -1 for the "
"default, or a 16-bit unsigned integer.",
-1, 0xFFFF, -1,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
G_PARAM_READWRITE | G_PARAM_CONSTRUCT | NM_SETTING_PARAM_INFERRABLE));
/**
* NMSettingInfiniband:parent:
......@@ -430,6 +430,6 @@ nm_setting_infiniband_class_init (NMSettingInfinibandClass *setting_class)
"Parent",
"The interface name of the parent device, or NULL",
NULL,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
G_PARAM_READWRITE | G_PARAM_CONSTRUCT | NM_SETTING_PARAM_INFERRABLE));
}
......@@ -1027,7 +1027,7 @@ nm_setting_ip4_config_class_init (NMSettingIP4ConfigClass *setting_class)
"connection. 'disabled' means IPv4 will not be "
"used on this connection. This property must be set.",
NULL,
G_PARAM_READWRITE));
G_PARAM_READWRITE | NM_SETTING_PARAM_INFERRABLE));
/**
* NMSettingIP4Config:dns:
......@@ -1107,7 +1107,7 @@ nm_setting_ip4_config_class_init (NMSettingIP4ConfigClass *setting_class)
"'disabled' methods as addressing is either "
"automatic or disabled with these methods.",
DBUS_TYPE_G_ARRAY_OF_ARRAY_OF_UINT,
G_PARAM_READWRITE));
G_PARAM_READWRITE | NM_SETTING_PARAM_INFERRABLE));
/**
* NMSettingIP4Config:routes:
......@@ -1138,7 +1138,7 @@ nm_setting_ip4_config_class_init (NMSettingIP4ConfigClass *setting_class)
"'shared', 'link-local', or 'disabled', methods "
"as there is no upstream network.",
DBUS_TYPE_G_ARRAY_OF_ARRAY_OF_UINT,
G_PARAM_READWRITE));
G_PARAM_READWRITE | NM_SETTING_PARAM_INFERRABLE));
/**
* NMSettingIP4Config:ignore-auto-routes:
......@@ -1231,7 +1231,7 @@ nm_setting_ip4_config_class_init (NMSettingIP4ConfigClass *setting_class)
"the specified name will be sent to the DHCP server "
"when acquiring a lease.",
NULL,
G_PARAM_READWRITE));
G_PARAM_READWRITE | NM_SETTING_PARAM_INFERRABLE));
/**
* NMSettingIP4Config:never-default:
......@@ -1247,7 +1247,7 @@ nm_setting_ip4_config_class_init (NMSettingIP4ConfigClass *setting_class)
"IPv4 connection, meaning it will never be assigned "
"the default route by NetworkManager.",
FALSE,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
G_PARAM_READWRITE | G_PARAM_CONSTRUCT | NM_SETTING_PARAM_INFERRABLE));
/**
* NMSettingIP4Config:may-fail:
......@@ -1272,7 +1272,7 @@ nm_setting_ip4_config_class_init (NMSettingIP4ConfigClass *setting_class)
"configuration to succeed if IPv4 configuration "
"fails but IPv6 configuration completes successfully.",
TRUE,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
G_PARAM_READWRITE | G_PARAM_CONSTRUCT | NM_SETTING_PARAM_INFERRABLE));
}
......
......@@ -924,7 +924,7 @@ nm_setting_ip6_config_class_init (NMSettingIP6ConfigClass *setting_class)
"property must be set. Note: the 'shared' method "
"is not yet supported.",
NULL,
G_PARAM_READWRITE));
G_PARAM_READWRITE | NM_SETTING_PARAM_INFERRABLE));
/**
* NMSettingIP6Config:dhcp-hostname:
......@@ -1028,7 +1028,7 @@ nm_setting_ip6_config_class_init (NMSettingIP6ConfigClass *setting_class)
"as the interface is automatically assigned an "
"address with these methods.",
DBUS_TYPE_G_ARRAY_OF_IP6_ADDRESS,
G_PARAM_READWRITE));
G_PARAM_READWRITE | NM_SETTING_PARAM_INFERRABLE));
/**
* NMSettingIP6Config:routes:
......@@ -1059,7 +1059,7 @@ nm_setting_ip6_config_class_init (NMSettingIP6ConfigClass *setting_class)
"used with the 'shared' or 'link-local' methods "
"because there is no upstream network.",
DBUS_TYPE_G_ARRAY_OF_IP6_ROUTE,
G_PARAM_READWRITE));
G_PARAM_READWRITE | NM_SETTING_PARAM_INFERRABLE));
/**
* NMSettingIP6Config:ignore-auto-routes:
......@@ -1167,7 +1167,7 @@ nm_setting_ip6_config_class_init (NMSettingIP6ConfigClass *setting_class)
NM_SETTING_IP6_CONFIG_PRIVACY_UNKNOWN,
NM_SETTING_IP6_CONFIG_PRIVACY_PREFER_TEMP_ADDR,
NM_SETTING_IP6_CONFIG_PRIVACY_UNKNOWN,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
G_PARAM_READWRITE | G_PARAM_CONSTRUCT | NM_SETTING_PARAM_INFERRABLE));
}
/********************************************************************/
......
......@@ -248,7 +248,7 @@ nm_setting_olpc_mesh_class_init (NMSettingOlpcMeshClass *setting_class)
"SSID",
"SSID of the mesh network to join.",
DBUS_TYPE_G_UCHAR_ARRAY,
G_PARAM_READWRITE));
G_PARAM_READWRITE | NM_SETTING_PARAM_INFERRABLE));
/**
* NMSettingOlpcMesh:channel:
......@@ -261,7 +261,7 @@ nm_setting_olpc_mesh_class_init (NMSettingOlpcMeshClass *setting_class)
"Channel",
"Channel on which the mesh network to join is located.",
0, G_MAXUINT32, 0,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
G_PARAM_READWRITE | G_PARAM_CONSTRUCT | NM_SETTING_PARAM_INFERRABLE));
/**
* NMSettingOlpcMesh:dhcp-anycast-address:
......
......@@ -38,13 +38,26 @@ GType _nm_setting_lookup_setting_type (const char *name);
GType _nm_setting_lookup_setting_type_by_quark (GQuark error_quark);
gint _nm_setting_compare_priority (gconstpointer a, gconstpointer b);
/* NM_SETTING_COMPARE_FLAG_CANDIDATE: check a whether a device-generated connection
* can be meaningfully replaced by a configured connection. With this flag
* the matching function is asymetric and only takes into account properties
* mandated by the candidate configured connection. It is for internal use by
* NetworkManager.
/* NM_SETTING_COMPARE_FLAG_INFERRABLE: check whether a device-generated
* connection can be replaced by a already-defined connection. This flag only
* takes into account properties marked with the %NM_SETTING_PARAM_INFERRABLE
* flag.
*/
#define NM_SETTING_COMPARE_FLAG_CANDIDATE 0x80000000
#define NM_SETTING_COMPARE_FLAG_INFERRABLE 0x80000000
/* The property of the #NMSetting should be considered during comparisons that
* use the %NM_SETTING_COMPARE_FLAG_INFERRABLE flag. Properties that don't have
* this flag, are ignored when doing an infrerrable comparison. This flag should
* be set on all properties that are read from the kernel or the system when a
* connection is generated. eg, IP addresses/routes can be read from the
* kernel, but the 'autoconnect' property cannot, so
* %NM_SETTING_IP4_CONFIG_ADDRESSES gets the INFERRABLE flag, but
* %NM_SETTING_CONNECTION_AUTOCONNECT would not.
*
* This flag should not be used with properties where the default cannot be
* read separately from the current value, like MTU or wired duplex mode.
*/
#define NM_SETTING_PARAM_INFERRABLE (1 << (4 + G_PARAM_USER_SHIFT))
/* Ensure the setting's GType is registered at library load time */
#define NM_SETTING_REGISTER_TYPE(x) \
......
......@@ -179,5 +179,5 @@ nm_setting_team_port_class_init (NMSettingTeamPortClass *setting_class)
"teamd. If not specified, the dafault configuration is used. "
"See man teamd.conf for the format details.",
NULL,
G_PARAM_READWRITE));
G_PARAM_READWRITE | NM_SETTING_PARAM_INFERRABLE));
}
......@@ -238,7 +238,7 @@ nm_setting_team_class_init (NMSettingTeamClass *setting_class)
"InterfaceName",
"The name of the virtual in-kernel team network interface",
NULL,
G_PARAM_READWRITE));
G_PARAM_READWRITE | NM_SETTING_PARAM_INFERRABLE));
/**
* NMSettingTeam:config:
......@@ -259,5 +259,5 @@ nm_setting_team_class_init (NMSettingTeamClass *setting_class)
"teamd. If not specified, the default configuration is used. "
"See man teamd.conf for the format details.",
NULL,
G_PARAM_READWRITE));
G_PARAM_READWRITE | NM_SETTING_PARAM_INFERRABLE));
}
......@@ -696,7 +696,7 @@ nm_setting_vlan_class_init (NMSettingVlanClass *setting_class)
"the 'parent' property or by the 'mac-address' "
"property of a 'wired' setting.",
NULL,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
G_PARAM_READWRITE | G_PARAM_CONSTRUCT | NM_SETTING_PARAM_INFERRABLE));
/**
* NMSettingVlan:parent:
......@@ -716,7 +716,7 @@ nm_setting_vlan_class_init (NMSettingVlanClass *setting_class)
"not specified, the connection must contain a "
"'wired' setting with a 'mac-address' property.",
NULL,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
G_PARAM_READWRITE | G_PARAM_CONSTRUCT | NM_SETTING_PARAM_INFERRABLE));
/**
* NMSettingVlan:id:
......@@ -731,7 +731,7 @@ nm_setting_vlan_class_init (NMSettingVlanClass *setting_class)
"The VLAN indentifier the interface created by "
"this connection should be assigned.",
0, 4095, 0,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
G_PARAM_READWRITE | G_PARAM_CONSTRUCT | NM_SETTING_PARAM_INFERRABLE));
/**
* NMSettingVlan:flags:
......@@ -750,7 +750,7 @@ nm_setting_vlan_class_init (NMSettingVlanClass *setting_class)
"of the interface to its master device's operating "
"state (0x04).",
0, G_MAXUINT32, 0,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
G_PARAM_READWRITE | G_PARAM_CONSTRUCT | NM_SETTING_PARAM_INFERRABLE));
/**
* NMSettingVlan:ingress-priority-map:
......@@ -769,7 +769,7 @@ nm_setting_vlan_class_init (NMSettingVlanClass *setting_class)
"format 'from:to' where both 'from' and "
"'to' are unsigned integers, ie '7:3'.",
DBUS_TYPE_G_LIST_OF_STRING,
G_PARAM_READWRITE));
G_PARAM_READWRITE | NM_SETTING_PARAM_INFERRABLE));
/**
* NMSettingVlan:egress-priority-map:
......@@ -788,5 +788,5 @@ nm_setting_vlan_class_init (NMSettingVlanClass *setting_class)
"format 'from:to' where both 'from' and "
"'to' are unsigned integers, ie '7:3'.",
DBUS_TYPE_G_LIST_OF_STRING,
G_PARAM_READWRITE));
G_PARAM_READWRITE | NM_SETTING_PARAM_INFERRABLE));
}
......@@ -897,7 +897,7 @@ nm_setting_wired_class_init (NMSettingWiredClass *setting_class)
"This property does not change the MAC address "
"of the device (i.e. MAC spoofing).",
DBUS_TYPE_G_UCHAR_ARRAY,
G_PARAM_READWRITE));
G_PARAM_READWRITE | NM_SETTING_PARAM_INFERRABLE));
/**
* NMSettingWired:cloned-mac-address:
......@@ -913,7 +913,7 @@ nm_setting_wired_class_init (NMSettingWiredClass *setting_class)
"this MAC address instead of its permanent MAC address. "
"This is known as MAC cloning or spoofing.",
DBUS_TYPE_G_UCHAR_ARRAY,
G_PARAM_READWRITE));
G_PARAM_READWRITE | NM_SETTING_PARAM_INFERRABLE));
/**
* NMSettingWired:mac-address-blacklist:
......@@ -974,7 +974,7 @@ nm_setting_wired_class_init (NMSettingWiredClass *setting_class)
"string may only be composed of hexadecimal "
"characters and the period (.) character.",
DBUS_TYPE_G_ARRAY_OF_STRING,
G_PARAM_READWRITE));
G_PARAM_READWRITE | NM_SETTING_PARAM_INFERRABLE));
/**
* NMSettingWired:s390-nettype:
......@@ -990,7 +990,7 @@ nm_setting_wired_class_init (NMSettingWiredClass *setting_class)
"'ctc', representing the different types of virtual "
"network devices available on s390 systems.",
NULL,
G_PARAM_READWRITE));
G_PARAM_READWRITE | NM_SETTING_PARAM_INFERRABLE));
/**
* NMSettingWired:s390-options:
......@@ -1009,6 +1009,6 @@ nm_setting_wired_class_init (NMSettingWiredClass *setting_class)
"strings. Allowed keys include 'portno', "
"'layer2', 'portname', 'protocol', among others.",
DBUS_TYPE_G_MAP_OF_STRING,
G_PARAM_READWRITE));
G_PARAM_READWRITE | NM_SETTING_PARAM_INFERRABLE));
}
......@@ -569,6 +569,9 @@ nm_setting_compare (NMSetting *a,
&& (prop_spec->flags & (NM_SETTING_PARAM_FUZZY_IGNORE | NM_SETTING_PARAM_SECRET)))
continue;
if ((flags & NM_SETTING_COMPARE_FLAG_INFERRABLE) && !(prop_spec->flags & NM_SETTING_PARAM_INFERRABLE))
continue;
if ( (flags & NM_SETTING_COMPARE_FLAG_IGNORE_SECRETS)
&& (prop_spec->flags & NM_SETTING_PARAM_SECRET))
continue;
......@@ -591,6 +594,9 @@ should_compare_prop (NMSetting *setting,
&& (prop_flags & (NM_SETTING_PARAM_FUZZY_IGNORE | NM_SETTING_PARAM_SECRET)))
return FALSE;
if ((comp_flags & NM_SETTING_COMPARE_FLAG_INFERRABLE) && !(prop_flags & NM_SETTING_PARAM_INFERRABLE))
return FALSE;
if (prop_flags & NM_SETTING_PARAM_SECRET) {
NMSettingSecretFlags secret_flags = NM_SETTING_SECRET_FLAG_NONE;
......
......@@ -78,6 +78,9 @@ GQuark nm_setting_error_quark (void);
*/
#define NM_SETTING_PARAM_FUZZY_IGNORE (1 << (3 + G_PARAM_USER_SHIFT))
/* Note: all non-glib GParamFlags bits are reserved by NetworkManager */
#define NM_SETTING_NAME "name"
/**
......
......@@ -28,6 +28,7 @@
#include "nm-test-helpers.h"
#include <nm-utils.h>
#include "nm-setting-private.h"
#include "nm-setting-connection.h"
#include "nm-setting-vpn.h"
#include "nm-setting-gsm.h"
......@@ -1062,7 +1063,7 @@ test_connection_compare_key_only_in_a (void)
b = nm_connection_duplicate (a);
s_con = (NMSettingConnection *) nm_connection_get_setting (b, NM_TYPE_SETTING_CONNECTION);
g_assert (s_con);
g_object_set (s_con, NM_SETTING_CONNECTION_TIMESTAMP, (gulong) 0, NULL);
g_object_set (s_con, NM_SETTING_CONNECTION_TIMESTAMP, (guint64) 0, NULL);
g_assert (!nm_connection_compare (a, b, NM_SETTING_COMPARE_FLAG_EXACT));
g_object_unref (a);
......@@ -1092,7 +1093,7 @@ test_connection_compare_key_only_in_b (void)
b = nm_connection_duplicate (a);
s_con = (NMSettingConnection *) nm_connection_get_setting (b, NM_TYPE_SETTING_CONNECTION);
g_assert (s_con);
g_object_set (s_con, NM_SETTING_CONNECTION_TIMESTAMP, (gulong) 0, NULL);
g_object_set (s_con, NM_SETTING_CONNECTION_TIMESTAMP, (guint64) 0, NULL);
g_assert (!nm_connection_compare (a, b, NM_SETTING_COMPARE_FLAG_EXACT));
g_object_unref (a);
......@@ -1320,6 +1321,65 @@ test_connection_diff_no_secrets (void)
g_object_unref (b);
}
static void
test_connection_diff_inferrable (void)
{
NMConnection *a, *b;
GHashTable *out_diffs = NULL;
gboolean same;
NMSettingConnection *s_con;
NMSettingWired *s_wired;
NMSettingIP4Config *s_ip4;
char *uuid;
const DiffSetting settings[] = {
{ NM_SETTING_CONNECTION_SETTING_NAME, {
{ NM_SETTING_CONNECTION_INTERFACE_NAME, NM_SETTING_DIFF_RESULT_IN_A },
{ NULL, NM_SETTING_DIFF_RESULT_UNKNOWN },
} },
};
a = new_test_connection ();
b = nm_connection_duplicate (a);
/* Change the UUID, wired MTU, and set ignore-auto-dns */
s_con = nm_connection_get_setting_connection (a);
g_assert (s_con);
uuid = nm_utils_uuid_generate ();
g_object_set (G_OBJECT (s_con),
NM_SETTING_CONNECTION_UUID, uuid,
NM_SETTING_CONNECTION_ID, "really neat connection",
NULL);
g_free (uuid);
s_wired = nm_connection_get_setting_wired (a);
g_assert (s_wired);
g_object_set (G_OBJECT (s_wired), NM_SETTING_WIRED_MTU, 300, NULL);
s_ip4 = nm_connection_get_setting_ip4_config (a);
g_assert (s_ip4);
g_object_set (G_OBJECT (s_ip4), NM_SETTING_IP4_CONFIG_IGNORE_AUTO_DNS, TRUE, NULL);
/* Make sure the diff returns no results as secrets are ignored */
same = nm_connection_diff (a, b, NM_SETTING_COMPARE_FLAG_INFERRABLE, &out_diffs);
g_assert (same == TRUE);
g_assert (out_diffs == NULL);
/* And change a INFERRABLE property to ensure that it shows up in the diff results */
g_object_set (G_OBJECT (s_con), NM_SETTING_CONNECTION_INTERFACE_NAME, "usb0", NULL);
/* Make sure the diff returns no results as secrets are ignored */
same = nm_connection_diff (a, b, NM_SETTING_COMPARE_FLAG_INFERRABLE, &out_diffs);
g_assert (same == FALSE);
g_assert (out_diffs != NULL);
g_assert (g_hash_table_size (out_diffs) > 0);
ensure_diffs (out_diffs, settings, ARRAY_LEN (settings));
g_hash_table_destroy (out_diffs);
g_object_unref (a);
g_object_unref (b);
}
static void
add_generic_settings (NMConnection *connection, const char *ctype)
{
......@@ -2150,6 +2210,7 @@ int main (int argc, char **argv)
test_connection_diff_same ();
test_connection_diff_different ();
test_connection_diff_no_secrets ();
test_connection_diff_inferrable ();
test_connection_good_base_types ();
test_connection_bad_base_types ();
......
......@@ -1755,7 +1755,7 @@ get_existing_connection (NMManager *manager, NMDevice *device)
for (iter = connections; iter; iter = iter->next) {
NMConnection *candidate = NM_CONNECTION (iter->data);
if (nm_connection_compare (connection, candidate, NM_SETTING_COMPARE_FLAG_CANDIDATE)) {
if (nm_connection_compare (connection, candidate, NM_SETTING_COMPARE_FLAG_INFERRABLE)) {
nm_log_info (LOGD_DEVICE, "(%s): found matching connection '%s'",
nm_device_get_iface (device),
nm_connection_get_id (candidate));
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment