aboutsummaryrefslogtreecommitdiff
path: root/src/testbed/testbed_api_topology.c
diff options
context:
space:
mode:
authorSree Harsha Totakura <totakura@in.tum.de>2013-09-12 10:09:21 +0000
committerSree Harsha Totakura <totakura@in.tum.de>2013-09-12 10:09:21 +0000
commit5e386faf4368257a99b4b6cfb34e2b7afa1248f0 (patch)
tree87db3546b0d8738cc1bfc18b04446e9ff008e149 /src/testbed/testbed_api_topology.c
parent4b113550b06da869e7351c8f36437226874fd20a (diff)
downloadgnunet-5e386faf4368257a99b4b6cfb34e2b7afa1248f0.tar.gz
gnunet-5e386faf4368257a99b4b6cfb34e2b7afa1248f0.zip
- capping node degree in scale free topology
Diffstat (limited to 'src/testbed/testbed_api_topology.c')
-rw-r--r--src/testbed/testbed_api_topology.c27
1 files changed, 19 insertions, 8 deletions
diff --git a/src/testbed/testbed_api_topology.c b/src/testbed/testbed_api_topology.c
index 374e42ad4..a6dd51fd2 100644
--- a/src/testbed/testbed_api_topology.c
+++ b/src/testbed/testbed_api_topology.c
@@ -599,6 +599,8 @@ gen_scale_free (struct TopologyContext *tc, uint16_t cap, uint8_t m)
599 unsigned int cnt; 599 unsigned int cnt;
600 unsigned int cnt2; 600 unsigned int cnt2;
601 unsigned int peer; 601 unsigned int peer;
602 unsigned int random_peer;
603 unsigned int *deg;
602 unsigned int *etab; 604 unsigned int *etab;
603 unsigned int *used; 605 unsigned int *used;
604 unsigned int links; 606 unsigned int links;
@@ -609,35 +611,44 @@ gen_scale_free (struct TopologyContext *tc, uint16_t cap, uint8_t m)
609 tc->link_array = GNUNET_malloc_large (sizeof (struct OverlayLink) * 611 tc->link_array = GNUNET_malloc_large (sizeof (struct OverlayLink) *
610 tc->link_array_size); 612 tc->link_array_size);
611 etab = GNUNET_malloc_large (sizeof (unsigned int) * 2 * tc->link_array_size); 613 etab = GNUNET_malloc_large (sizeof (unsigned int) * 2 * tc->link_array_size);
612 614 deg = GNUNET_malloc (sizeof (unsigned int) * tc->num_peers);
613 used = GNUNET_malloc (sizeof (unsigned int) * m); 615 used = GNUNET_malloc (sizeof (unsigned int) * m);
614 616 /* start by connecting peer 1 to peer 0 */
615 make_link (&tc->link_array[0], 0, 1, tc); /* Initially connect peer 1 to peer 0 */ 617 make_link (&tc->link_array[0], 0, 1, tc);
618 deg[0]++;
619 deg[1]++;
616 etab[2 * links] = 0; 620 etab[2 * links] = 0;
617 etab[(2 * links) + 1] = 1; 621 etab[(2 * links) + 1] = 1;
618 links = 1; 622 links = 1;
619 for (peer = 2; peer < tc->num_peers; peer++) 623 for (peer = 2; peer < tc->num_peers; peer++)
620 { 624 {
625 if (cap < deg[peer])
626 continue;
621 for (cnt = 0; cnt < GNUNET_MIN (peer, m); cnt++) 627 for (cnt = 0; cnt < GNUNET_MIN (peer, m); cnt++)
622 { 628 {
623 redo: 629 redo:
624 random = GNUNET_CRYPTO_random_u64 (GNUNET_CRYPTO_QUALITY_WEAK, (2 * links) 630 random = GNUNET_CRYPTO_random_u64 (GNUNET_CRYPTO_QUALITY_WEAK, (2 * links));
625 + cnt); 631 random_peer = etab[random];
632 if (cap < deg[random_peer])
633 goto redo;
626 for (cnt2 = 0; cnt2 < cnt; cnt2++) 634 for (cnt2 = 0; cnt2 < cnt; cnt2++)
627 if (etab[random] == used[cnt2]) 635 if (random_peer == used[cnt2])
628 goto redo; 636 goto redo;
629 make_link (&tc->link_array[links + cnt], etab[random], peer, tc); 637 make_link (&tc->link_array[links + cnt], etab[random], peer, tc);
630 etab[(2 * links) + cnt] = etab[random]; 638 deg[random_peer]++;
631 used[cnt] = etab[random]; 639 deg[peer]++;
640 used[cnt] = random_peer;
632 } 641 }
633 for (cnt = 0; cnt < GNUNET_MIN (peer, m); cnt++) 642 for (cnt = 0; cnt < GNUNET_MIN (peer, m); cnt++)
634 { 643 {
644 etab[(2 * links) + cnt] = used[cnt];
635 etab[(2 * links) + cnt + 1] = peer; 645 etab[(2 * links) + cnt + 1] = peer;
636 } 646 }
637 links += GNUNET_MIN (peer, m); 647 links += GNUNET_MIN (peer, m);
638 } 648 }
639 GNUNET_free (etab); 649 GNUNET_free (etab);
640 GNUNET_free (used); 650 GNUNET_free (used);
651 GNUNET_free (deg);
641 GNUNET_assert (links <= tc->link_array_size); 652 GNUNET_assert (links <= tc->link_array_size);
642 tc->link_array_size = links; 653 tc->link_array_size = links;
643 tc->link_array = 654 tc->link_array =