diff options
author | Sree Harsha Totakura <totakura@in.tum.de> | 2013-09-12 10:09:21 +0000 |
---|---|---|
committer | Sree Harsha Totakura <totakura@in.tum.de> | 2013-09-12 10:09:21 +0000 |
commit | 5e386faf4368257a99b4b6cfb34e2b7afa1248f0 (patch) | |
tree | 87db3546b0d8738cc1bfc18b04446e9ff008e149 /src/testbed/testbed_api_topology.c | |
parent | 4b113550b06da869e7351c8f36437226874fd20a (diff) | |
download | gnunet-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.c | 27 |
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 = |