diff options
author | Thomas Haller <thaller@redhat.com> | 2019-03-21 11:30:21 +0100 |
---|---|---|
committer | Thomas Haller <thaller@redhat.com> | 2019-03-24 09:21:14 +0100 |
commit | 9d2a15514aef28fe57331b98dc6ce109da17978b (patch) | |
tree | 7ed46e6b62135076cfcdc6b6bbb4f63c59adbeea | |
parent | 265864952df4cfc260332d66e5c25addd348b8bb (diff) | |
download | NetworkManager-9d2a15514aef28fe57331b98dc6ce109da17978b.tar.gz |
libnm/team: add function to compare list of link-watchers
-rw-r--r-- | libnm-core/nm-core-internal.h | 2 | ||||
-rw-r--r-- | libnm-core/nm-setting-team-port.c | 27 | ||||
-rw-r--r-- | libnm-core/nm-setting-team.c | 56 |
3 files changed, 44 insertions, 41 deletions
diff --git a/libnm-core/nm-core-internal.h b/libnm-core/nm-core-internal.h index c60b42c6dc..cf2be4a24d 100644 --- a/libnm-core/nm-core-internal.h +++ b/libnm-core/nm-core-internal.h @@ -537,6 +537,8 @@ gboolean _nm_utils_inet6_is_token (const struct in6_addr *in6addr); /*****************************************************************************/ +gboolean _nm_team_link_watchers_equal (GPtrArray *a, GPtrArray *b, gboolean ignore_order); + gboolean _nm_utils_team_config_equal (const char *conf1, const char *conf2, gboolean port); GValue *_nm_utils_team_config_get (const char *conf, const char *key, diff --git a/libnm-core/nm-setting-team-port.c b/libnm-core/nm-setting-team-port.c index 1db8f22a66..b2c57ffa94 100644 --- a/libnm-core/nm-setting-team-port.c +++ b/libnm-core/nm-setting-team-port.c @@ -396,31 +396,18 @@ compare_property (const NMSettInfoSetting *sett_info, { NMSettingTeamPortPrivate *a_priv; NMSettingTeamPortPrivate *b_priv; - guint i, j; if (nm_streq (sett_info->property_infos[property_idx].name, NM_SETTING_TEAM_PORT_LINK_WATCHERS)) { if (NM_FLAGS_HAS (flags, NM_SETTING_COMPARE_FLAG_INFERRABLE)) return NM_TERNARY_DEFAULT; - - if (other) { - a_priv = NM_SETTING_TEAM_PORT_GET_PRIVATE (setting); - b_priv = NM_SETTING_TEAM_PORT_GET_PRIVATE (other); - - if (a_priv->link_watchers->len != b_priv->link_watchers->len) - return FALSE; - for (i = 0; i < a_priv->link_watchers->len; i++) { - for (j = 0; j < b_priv->link_watchers->len; j++) { - if (nm_team_link_watcher_equal (a_priv->link_watchers->pdata[i], - b_priv->link_watchers->pdata[j])) { - break; - } - } - if (j == b_priv->link_watchers->len) - return FALSE; - } - } - return TRUE; + if (!other) + return TRUE; + a_priv = NM_SETTING_TEAM_PORT_GET_PRIVATE (setting); + b_priv = NM_SETTING_TEAM_PORT_GET_PRIVATE (other); + return _nm_team_link_watchers_equal (a_priv->link_watchers, + b_priv->link_watchers, + TRUE); } if (nm_streq (sett_info->property_infos[property_idx].name, NM_SETTING_TEAM_PORT_CONFIG)) { diff --git a/libnm-core/nm-setting-team.c b/libnm-core/nm-setting-team.c index a8d6f6a183..f50747f179 100644 --- a/libnm-core/nm-setting-team.c +++ b/libnm-core/nm-setting-team.c @@ -396,6 +396,34 @@ nm_team_link_watcher_equal (NMTeamLinkWatcher *watcher, NMTeamLinkWatcher *other return TRUE; } +gboolean +_nm_team_link_watchers_equal (GPtrArray *a, GPtrArray *b, gboolean ignore_order) +{ + guint i, j; + + if (a->len != b->len) + return FALSE; + if (ignore_order) { + /* FIXME: comparing this way is O(n^2). Don't do that, instead + * add nm_team_link_watcher_cmp(), sort both lists, and + * compare step by step. */ + for (i = 0; i < a->len; i++) { + for (j = 0; j < b->len; j++) { + if (nm_team_link_watcher_equal (a->pdata[i], b->pdata[j])) + break; + } + if (j == b->len) + return FALSE; + } + } else { + for (i = 0; i < a->len; i++) { + if (!nm_team_link_watcher_equal (a->pdata[i], b->pdata[i])) + return FALSE; + } + } + return TRUE; +} + /** * nm_team_link_watcher_dup: * @watcher: the #NMTeamLinkWatcher @@ -1289,31 +1317,17 @@ compare_property (const NMSettInfoSetting *sett_info, NMSettingCompareFlags flags) { NMSettingTeamPrivate *a_priv, *b_priv; - guint i, j; if (nm_streq (sett_info->property_infos[property_idx].name, NM_SETTING_TEAM_LINK_WATCHERS)) { - if (NM_FLAGS_HAS (flags, NM_SETTING_COMPARE_FLAG_INFERRABLE)) return NM_TERNARY_DEFAULT; - - if (other) { - a_priv = NM_SETTING_TEAM_GET_PRIVATE (setting); - b_priv = NM_SETTING_TEAM_GET_PRIVATE (other); - - if (a_priv->link_watchers->len != b_priv->link_watchers->len) - return FALSE; - for (i = 0; i < a_priv->link_watchers->len; i++) { - for (j = 0; j < b_priv->link_watchers->len; j++) { - if (nm_team_link_watcher_equal (a_priv->link_watchers->pdata[i], - b_priv->link_watchers->pdata[j])) { - break; - } - } - if (j == b_priv->link_watchers->len) - return FALSE; - } - } - return TRUE; + if (!other) + return TRUE; + a_priv = NM_SETTING_TEAM_GET_PRIVATE (setting); + b_priv = NM_SETTING_TEAM_GET_PRIVATE (other); + return _nm_team_link_watchers_equal (a_priv->link_watchers, + b_priv->link_watchers, + TRUE); } if (nm_streq (sett_info->property_infos[property_idx].name, NM_SETTING_TEAM_CONFIG)) { |