summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/main.c1
-rw-r--r--src/routing.c17
-rw-r--r--src/routing.h1
3 files changed, 19 insertions, 0 deletions
diff --git a/src/main.c b/src/main.c
index 11e39bd..f0be10a 100644
--- a/src/main.c
+++ b/src/main.c
@@ -158,6 +158,7 @@ int main(int argc, char** argv) {
} else {
routing_setid(&myID);
routing_reset_expire(time(NULL) + PROTO_UNCTM);
+ routing_rebuild_table();
}
dht.self = myID;
diff --git a/src/routing.c b/src/routing.c
index 02b2f03..3ef418f 100644
--- a/src/routing.c
+++ b/src/routing.c
@@ -80,6 +80,23 @@ void routing_update_metrics() {
}
}
+void routing_rebuild_table() {
+ struct entry table_swap[RT_SIZE];
+ memcpy(table_swap, pTable->table, sizeof(pTable->table));
+ routing_flush();
+
+ for(size_t i = 0; i < RT_SIZE; i++) {
+ if(!table_swap[i].set) continue;
+
+ struct entry *entry;
+ if(routing_offer(&table_swap[i].id, &entry)) {
+ *entry = table_swap[i];
+ } else {
+ dbg("Dropping a client since we already have enough in that bucket");
+ }
+ }
+}
+
void routing_flush() {
memset(pTable->table, 0, sizeof(pTable->table));
}
diff --git a/src/routing.h b/src/routing.h
index 2d53b80..a6d1e84 100644
--- a/src/routing.h
+++ b/src/routing.h
@@ -39,6 +39,7 @@ extern int table_size;
void routing_init(struct nodeid* myid);
void routing_setid(struct nodeid *id);
void routing_update_metrics();
+void routing_rebuild_table();
void routing_flush();
bool routing_interested(struct nodeid* id);
bool routing_offer(struct nodeid* id, struct entry **dest);