From 984f1197d28560346e5cf4951ac9d6bbef08053e Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Sun, 22 Jan 2017 17:28:45 +0100 Subject: [PATCH] initialize new path fully before trying to attach it --- src/cadet/gnunet-service-cadet-new_paths.c | 90 ++++++++++++++-------- 1 file changed, 59 insertions(+), 31 deletions(-) diff --git a/src/cadet/gnunet-service-cadet-new_paths.c b/src/cadet/gnunet-service-cadet-new_paths.c index 39658d4e8..c9fdbcb3a 100644 --- a/src/cadet/gnunet-service-cadet-new_paths.c +++ b/src/cadet/gnunet-service-cadet-new_paths.c @@ -25,7 +25,6 @@ * * TODO: * - path desirability score calculations are not done - * (and will be tricky to have during path changes) */ #include "platform.h" #include "gnunet-service-cadet-new_connection.h" @@ -359,11 +358,30 @@ extend_path (struct CadetPeerPath *path, struct GNUNET_CONTAINER_HeapNode *hn; int i; + /* Expand path */ + GNUNET_array_grow (path->entries, + path->entries_length, + old_len + num_peers); + for (i=num_peers-1;i >= 0;i--) + { + struct CadetPeerPathEntry *entry = GNUNET_new (struct CadetPeerPathEntry); + + path->entries[old_len + i] = entry; + entry->peer = peers[i]; + entry->path = path; + GCP_path_entry_add (entry->peer, + entry, + old_len + i); + } + /* If we extend an existing path, detach it from the old owner and re-attach to the new one */ hn = NULL; for (i=num_peers-1;i>=0;i--) { + struct CadetPeerPathEntry *entry = path->entries[old_len + i]; + + path->entries_length = old_len + i + 1; /* FIXME: note that path->desirability is used, but not yet updated here! */ hn = GCP_attach_path (peers[i], path, @@ -371,27 +389,25 @@ extend_path (struct CadetPeerPath *path, GNUNET_YES); if (NULL != hn) break; + GCP_path_entry_remove (entry->peer, + entry, + old_len + i); + GNUNET_free (entry); + path->entries[old_len + i] = NULL; } if (NULL == hn) - return; /* none of the peers is interested in this path */ + { + /* none of the peers is interested in this path; + shrink path back */ + GNUNET_array_grow (path->entries, + path->entries_length, + old_len); + return; + } GCP_detach_path (path->entries[old_len-1]->peer, path, path->hn); path->hn = hn; - GNUNET_array_grow (path->entries, - path->entries_length, - old_len + i); - for (;i >= 0;i--) - { - struct CadetPeerPathEntry *entry = GNUNET_new (struct CadetPeerPathEntry); - - path->entries[old_len + i] = entry; - entry->peer = peers[i]; - entry->path = path; - GCP_path_entry_add (entry->peer, - entry, - old_len + i); - } LOG (GNUNET_ERROR_TYPE_DEBUG, "Extended path %s\n", GCPP_2s (path)); @@ -471,11 +487,27 @@ GCPP_try_path_from_dht (const struct GNUNET_PeerIdentity *get_path, /* No match at all, create completely new path */ path = GNUNET_new (struct CadetPeerPath); + path->entries_length = get_path_length + put_path_length; + path->entries = GNUNET_new_array (path->entries_length, + struct CadetPeerPathEntry *); + for (i=path->entries_length-1;i>=0;i--) + { + struct CadetPeerPathEntry *entry = GNUNET_new (struct CadetPeerPathEntry); + + path->entries[i] = entry; + entry->peer = cpath[i]; + entry->path = path; + GCP_path_entry_add (entry->peer, + entry, + i); + } - /* First, try to attach it */ + /* Finally, try to attach it */ hn = NULL; for (i=get_path_length + put_path_length-1;i>=0;i--) { + struct CadetPeerPathEntry *entry = path->entries[i]; + path->entries_length = i + 1; /* FIXME: note that path->desirability is used, but not yet initialized here! */ hn = GCP_attach_path (cpath[i], @@ -484,30 +516,26 @@ GCPP_try_path_from_dht (const struct GNUNET_PeerIdentity *get_path, GNUNET_NO); if (NULL != hn) break; + GCP_path_entry_remove (entry->peer, + entry, + i); + GNUNET_free (entry); + path->entries[i] = NULL; } if (NULL == hn) { /* None of the peers on the path care about it. */ LOG (GNUNET_ERROR_TYPE_DEBUG, "Path discovered from DHT is not interesting to us\n"); + GNUNET_free (path->entries); GNUNET_free (path); return; } path->hn = hn; - path->entries_length = i + 1; - path->entries = GNUNET_new_array (path->entries_length, - struct CadetPeerPathEntry *); - for (;i>=0;i--) - { - struct CadetPeerPathEntry *entry = GNUNET_new (struct CadetPeerPathEntry); - - path->entries[i] = entry; - entry->peer = cpath[i]; - entry->path = path; - GCP_path_entry_add (entry->peer, - entry, - i); - } + /* Shrink path to actual useful length */ + GNUNET_array_grow (path->entries, + path->entries_length, + i); LOG (GNUNET_ERROR_TYPE_DEBUG, "Created new path %s based on information from DHT\n", GCPP_2s (path)); -- 2.25.1