diff options
author | Thomas Haller <thaller@redhat.com> | 2016-03-16 13:50:09 +0100 |
---|---|---|
committer | Thomas Haller <thaller@redhat.com> | 2016-03-17 15:00:49 +0100 |
commit | 191e5ae8a76f998a13ab91e5cf9d273ad1f05a7f (patch) | |
tree | 60e6f549742ca685d350c82b8ea29e733b5825e0 | |
parent | 121e790bdacd361ece33cbfce469e3821b626563 (diff) | |
download | NetworkManager-191e5ae8a76f998a13ab91e5cf9d273ad1f05a7f.tar.gz |
lldp: ensure stable order of variants in LLDP neighbor list
-rw-r--r-- | src/devices/nm-lldp-listener.c | 38 |
1 files changed, 24 insertions, 14 deletions
diff --git a/src/devices/nm-lldp-listener.c b/src/devices/nm-lldp-listener.c index 8f0ed0615c..d398e64a95 100644 --- a/src/devices/nm-lldp-listener.c +++ b/src/devices/nm-lldp-listener.c @@ -202,15 +202,26 @@ lldp_neighbor_id_hash (gconstpointer ptr) return hash; } -static gboolean -lldp_neighbor_id_equal (gconstpointer a, gconstpointer b) +static int +lldp_neighbor_id_cmp (gconstpointer a, gconstpointer b) { const LldpNeighbor *x = a, *y = b; + int c; + + if (x->chassis_id_type != y->chassis_id_type) + return x->chassis_id_type < y->chassis_id_type ? -1 : 1; + if (x->port_id_type != y->port_id_type) + return x->port_id_type < y->port_id_type ? -1 : 1; + c = g_strcmp0 (x->chassis_id, y->chassis_id); + if (c == 0) + c = g_strcmp0 (x->port_id, y->port_id); + return c < 0 ? -1 : (c > 0 ? 1 : 0); +} - return x->chassis_id_type == y->chassis_id_type && - x->port_id_type == y->port_id_type && - !g_strcmp0 (x->chassis_id, y->chassis_id) && - !g_strcmp0 (x->port_id, y->port_id); +static gboolean +lldp_neighbor_id_equal (gconstpointer a, gconstpointer b) +{ + return lldp_neighbor_id_cmp (a, b) == 0; } static void @@ -745,10 +756,9 @@ nm_lldp_listener_is_running (NMLldpListener *self) GVariant * nm_lldp_listener_get_neighbors (NMLldpListener *self) { - GVariantBuilder array_builder; - GHashTableIter iter; NMLldpListenerPrivate *priv; - LldpNeighbor *neigh; + GVariantBuilder array_builder; + GList *neighbors, *iter; g_return_val_if_fail (NM_IS_LLDP_LISTENER (self), FALSE); @@ -756,11 +766,11 @@ nm_lldp_listener_get_neighbors (NMLldpListener *self) if (!priv->variant) { g_variant_builder_init (&array_builder, G_VARIANT_TYPE ("aa{sv}")); - g_hash_table_iter_init (&iter, priv->lldp_neighbors); - - while (g_hash_table_iter_next (&iter, NULL, (gpointer *) &neigh)) - g_variant_builder_add_value (&array_builder, lldp_neighbor_to_variant (neigh)); - + neighbors = g_hash_table_get_keys (priv->lldp_neighbors); + neighbors = g_list_sort (neighbors, lldp_neighbor_id_cmp); + for (iter = neighbors; iter; iter = iter->next) + g_variant_builder_add_value (&array_builder, lldp_neighbor_to_variant (iter->data)); + g_list_free (neighbors); priv->variant = g_variant_ref_sink (g_variant_builder_end (&array_builder)); } return priv->variant; |