diff options
author | Supriti Singh <supritisingh08@gmail.com> | 2014-08-06 22:37:44 +0000 |
---|---|---|
committer | Supriti Singh <supritisingh08@gmail.com> | 2014-08-06 22:37:44 +0000 |
commit | c684a9606f7bd89ca2dc876567b74fb4cfe9b118 (patch) | |
tree | 659015badbbfe6cf81c1151034588a9c3414b308 /src/dht/gnunet-service-xdht_neighbours.c | |
parent | 00239344e5b07d76ab19b842c69eaf9fef881127 (diff) | |
download | gnunet-c684a9606f7bd89ca2dc876567b74fb4cfe9b118.tar.gz gnunet-c684a9606f7bd89ca2dc876567b74fb4cfe9b118.zip |
X-Vine:Fixes
Diffstat (limited to 'src/dht/gnunet-service-xdht_neighbours.c')
-rw-r--r-- | src/dht/gnunet-service-xdht_neighbours.c | 64 |
1 files changed, 43 insertions, 21 deletions
diff --git a/src/dht/gnunet-service-xdht_neighbours.c b/src/dht/gnunet-service-xdht_neighbours.c index 77389d1b3..3f280134e 100644 --- a/src/dht/gnunet-service-xdht_neighbours.c +++ b/src/dht/gnunet-service-xdht_neighbours.c | |||
@@ -4358,12 +4358,13 @@ get_shortest_trail (struct FingerInfo *finger, | |||
4358 | /** | 4358 | /** |
4359 | * Check if trail_1 and trail_2 have any common element. If yes then join | 4359 | * Check if trail_1 and trail_2 have any common element. If yes then join |
4360 | * them at common element. trail_1 always preceeds trail_2 in joined trail. | 4360 | * them at common element. trail_1 always preceeds trail_2 in joined trail. |
4361 | * @param trail_1 | 4361 | * @param trail_1 Trail from source to me, NOT including endpoints. |
4362 | * @param trail_1_len | 4362 | * @param trail_1_len Total number of peers @a trail_1 |
4363 | * @param trail_2 | 4363 | * @param trail_2 Trail from me to current predecessor, NOT including endpoints. |
4364 | * @param trail_2_len | 4364 | * @param trail_2_len Total number of peers @a trail_2 |
4365 | * @param joined_trail_len | 4365 | * @param joined_trail_len Total number of peers in combined trail of trail_1 |
4366 | * @return | 4366 | * trail_2. |
4367 | * @return Joined trail. | ||
4367 | */ | 4368 | */ |
4368 | static struct GNUNET_PeerIdentity * | 4369 | static struct GNUNET_PeerIdentity * |
4369 | check_for_duplicate_entries (const struct GNUNET_PeerIdentity *trail_1, | 4370 | check_for_duplicate_entries (const struct GNUNET_PeerIdentity *trail_1, |
@@ -4458,13 +4459,14 @@ get_trail_src_to_curr_pred (struct GNUNET_PeerIdentity source_peer, | |||
4458 | trail_me_to_curr_pred = get_shortest_trail (current_predecessor, | 4459 | trail_me_to_curr_pred = get_shortest_trail (current_predecessor, |
4459 | &trail_me_to_curr_pred_length); | 4460 | &trail_me_to_curr_pred_length); |
4460 | 4461 | ||
4462 | /* If there is only on element in the trail, and that element is source.*/ | ||
4461 | if ((trail_me_to_curr_pred_length == 1) && | 4463 | if ((trail_me_to_curr_pred_length == 1) && |
4462 | (0 == GNUNET_CRYPTO_cmp_peer_identity (&source_peer, | 4464 | (0 == GNUNET_CRYPTO_cmp_peer_identity (&source_peer, |
4463 | &trail_me_to_curr_pred[0]))) | 4465 | &trail_me_to_curr_pred[0]))) |
4464 | { | 4466 | { |
4465 | *trail_src_to_curr_pred_length = 0; | 4467 | *trail_src_to_curr_pred_length = 0; |
4466 | GNUNET_free_non_null(trail_me_to_curr_pred); | 4468 | GNUNET_free_non_null(trail_me_to_curr_pred); |
4467 | return NULL; | 4469 | return NULL; |
4468 | } | 4470 | } |
4469 | 4471 | ||
4470 | /* Check if trail_me_to_curr_pred contains source. */ | 4472 | /* Check if trail_me_to_curr_pred contains source. */ |
@@ -4476,6 +4478,7 @@ get_trail_src_to_curr_pred (struct GNUNET_PeerIdentity source_peer, | |||
4476 | &trail_me_to_curr_pred[i])) | 4478 | &trail_me_to_curr_pred[i])) |
4477 | continue; | 4479 | continue; |
4478 | 4480 | ||
4481 | /* Source is NOT part of trail. */ | ||
4479 | i = i+1; | 4482 | i = i+1; |
4480 | 4483 | ||
4481 | /* Source is the last element in the trail to reach to my pred. | 4484 | /* Source is the last element in the trail to reach to my pred. |
@@ -4486,7 +4489,6 @@ get_trail_src_to_curr_pred (struct GNUNET_PeerIdentity source_peer, | |||
4486 | return NULL; | 4489 | return NULL; |
4487 | } | 4490 | } |
4488 | 4491 | ||
4489 | |||
4490 | *trail_src_to_curr_pred_length = trail_me_to_curr_pred_length - i; | 4492 | *trail_src_to_curr_pred_length = trail_me_to_curr_pred_length - i; |
4491 | trail_src_to_curr_pred = GNUNET_malloc (sizeof (struct GNUNET_PeerIdentity)* | 4493 | trail_src_to_curr_pred = GNUNET_malloc (sizeof (struct GNUNET_PeerIdentity)* |
4492 | *trail_src_to_curr_pred_length); | 4494 | *trail_src_to_curr_pred_length); |
@@ -4497,6 +4499,21 @@ get_trail_src_to_curr_pred (struct GNUNET_PeerIdentity source_peer, | |||
4497 | GNUNET_free_non_null(trail_me_to_curr_pred); | 4499 | GNUNET_free_non_null(trail_me_to_curr_pred); |
4498 | return trail_src_to_curr_pred; | 4500 | return trail_src_to_curr_pred; |
4499 | } | 4501 | } |
4502 | /* Is first element source? Then exclude first element and copy rest of the | ||
4503 | trail. */ | ||
4504 | if(0 == GNUNET_CRYPTO_cmp_peer_identity (&source_peer, | ||
4505 | &trail_me_to_curr_pred[0])) | ||
4506 | { | ||
4507 | *trail_src_to_curr_pred_length = trail_me_to_curr_pred_length - 1; | ||
4508 | trail_src_to_curr_pred = GNUNET_malloc(sizeof(struct GNUNET_PeerIdentity)* | ||
4509 | *trail_src_to_curr_pred_length); | ||
4510 | unsigned int j; | ||
4511 | for(j=0; j < *trail_src_to_curr_pred_length;j++) | ||
4512 | { | ||
4513 | trail_src_to_curr_pred[j] = trail_me_to_curr_pred[j+1]; | ||
4514 | } | ||
4515 | return trail_src_to_curr_pred; | ||
4516 | } | ||
4500 | } | 4517 | } |
4501 | 4518 | ||
4502 | unsigned int len; | 4519 | unsigned int len; |
@@ -4504,7 +4521,7 @@ get_trail_src_to_curr_pred (struct GNUNET_PeerIdentity source_peer, | |||
4504 | trail_src_to_me_len, | 4521 | trail_src_to_me_len, |
4505 | trail_me_to_curr_pred, | 4522 | trail_me_to_curr_pred, |
4506 | trail_me_to_curr_pred_length, | 4523 | trail_me_to_curr_pred_length, |
4507 | &len); | 4524 | &len); |
4508 | *trail_src_to_curr_pred_length = len; | 4525 | *trail_src_to_curr_pred_length = len; |
4509 | GNUNET_free_non_null(trail_me_to_curr_pred); | 4526 | GNUNET_free_non_null(trail_me_to_curr_pred); |
4510 | return trail_src_to_curr_pred; | 4527 | return trail_src_to_curr_pred; |
@@ -4547,6 +4564,9 @@ update_predecessor (struct GNUNET_PeerIdentity finger, | |||
4547 | { | 4564 | { |
4548 | /* Invert the trail to get the trail from me to finger, NOT including the | 4565 | /* Invert the trail to get the trail from me to finger, NOT including the |
4549 | endpoints.*/ | 4566 | endpoints.*/ |
4567 | GNUNET_assert(NULL != GNUNET_CONTAINER_multipeermap_get(friend_peermap, | ||
4568 | &trail[trail_length-1])); | ||
4569 | |||
4550 | trail_to_new_predecessor = invert_trail (trail, trail_length); | 4570 | trail_to_new_predecessor = invert_trail (trail, trail_length); |
4551 | 4571 | ||
4552 | /* Add an entry in your routing table. */ | 4572 | /* Add an entry in your routing table. */ |
@@ -4607,9 +4627,7 @@ compare_and_update_predecessor (struct GNUNET_PeerIdentity finger, | |||
4607 | update_predecessor (finger, trail, trail_length); | 4627 | update_predecessor (finger, trail, trail_length); |
4608 | return; | 4628 | return; |
4609 | } | 4629 | } |
4610 | /* FIXME: Here we should first call find_successor and get a locally known | 4630 | |
4611 | predecessor. If locally known predecessor is closest then current or finger, | ||
4612 | add that as predecessor. */ | ||
4613 | if (0 == GNUNET_CRYPTO_cmp_peer_identity (¤t_predecessor->finger_identity, | 4631 | if (0 == GNUNET_CRYPTO_cmp_peer_identity (¤t_predecessor->finger_identity, |
4614 | &finger)) | 4632 | &finger)) |
4615 | { | 4633 | { |
@@ -4713,6 +4731,7 @@ handle_dht_p2p_verify_successor(void *cls, | |||
4713 | compare_and_update_predecessor (source_peer, trail, trail_length); | 4731 | compare_and_update_predecessor (source_peer, trail, trail_length); |
4714 | current_predecessor = finger_table[PREDECESSOR_FINGER_ID]; | 4732 | current_predecessor = finger_table[PREDECESSOR_FINGER_ID]; |
4715 | unsigned int flag = 0; | 4733 | unsigned int flag = 0; |
4734 | |||
4716 | /* Is source of this message NOT my predecessor. */ | 4735 | /* Is source of this message NOT my predecessor. */ |
4717 | if (0 != (GNUNET_CRYPTO_cmp_peer_identity (¤t_predecessor.finger_identity, | 4736 | if (0 != (GNUNET_CRYPTO_cmp_peer_identity (¤t_predecessor.finger_identity, |
4718 | &source_peer))) | 4737 | &source_peer))) |
@@ -4736,28 +4755,30 @@ handle_dht_p2p_verify_successor(void *cls, | |||
4736 | trail_src_to_curr_pred[k] = trail[k]; | 4755 | trail_src_to_curr_pred[k] = trail[k]; |
4737 | k++; | 4756 | k++; |
4738 | } | 4757 | } |
4758 | break; | ||
4739 | } | 4759 | } |
4740 | 4760 | ||
4741 | if(0 == flag) | 4761 | if(0 == flag) |
4742 | { | 4762 | { |
4743 | trail_src_to_curr_pred = get_trail_src_to_curr_pred (source_peer, | 4763 | trail_src_to_curr_pred = |
4744 | trail, | 4764 | get_trail_src_to_curr_pred (source_peer, |
4745 | trail_length, | 4765 | trail, |
4746 | &trail_src_to_curr_pred_len); | 4766 | trail_length, |
4767 | &trail_src_to_curr_pred_len); | ||
4747 | } | 4768 | } |
4748 | } | 4769 | } |
4749 | else | 4770 | else |
4750 | { | 4771 | { |
4751 | trail_src_to_curr_pred_len = trail_length; | 4772 | trail_src_to_curr_pred_len = trail_length; |
4752 | int i; | 4773 | unsigned int i; |
4753 | 4774 | ||
4754 | trail_src_to_curr_pred = GNUNET_malloc (sizeof(struct GNUNET_PeerIdentity) | 4775 | trail_src_to_curr_pred = |
4755 | *trail_src_to_curr_pred_len); | 4776 | GNUNET_malloc (sizeof(struct GNUNET_PeerIdentity) |
4777 | *trail_src_to_curr_pred_len); | ||
4756 | for(i = 0; i < trail_src_to_curr_pred_len; i++) | 4778 | for(i = 0; i < trail_src_to_curr_pred_len; i++) |
4757 | { | 4779 | { |
4758 | trail_src_to_curr_pred[i] = trail[i]; | 4780 | trail_src_to_curr_pred[i] = trail[i]; |
4759 | } | 4781 | } |
4760 | |||
4761 | } | 4782 | } |
4762 | 4783 | ||
4763 | GNUNET_assert (NULL != | 4784 | GNUNET_assert (NULL != |
@@ -4942,7 +4963,7 @@ compare_and_update_successor (struct GNUNET_PeerIdentity curr_succ, | |||
4942 | GNUNET_assert (NULL != | 4963 | GNUNET_assert (NULL != |
4943 | (target_friend = | 4964 | (target_friend = |
4944 | GNUNET_CONTAINER_multipeermap_get (friend_peermap, | 4965 | GNUNET_CONTAINER_multipeermap_get (friend_peermap, |
4945 | &probable_successor))); | 4966 | &probable_successor))); |
4946 | } | 4967 | } |
4947 | 4968 | ||
4948 | add_new_finger (probable_successor, trail_me_to_probable_succ, | 4969 | add_new_finger (probable_successor, trail_me_to_probable_succ, |
@@ -5093,6 +5114,7 @@ handle_dht_p2p_notify_new_successor(void *cls, | |||
5093 | peer)); | 5114 | peer)); |
5094 | else | 5115 | else |
5095 | GNUNET_assert(0 == GNUNET_CRYPTO_cmp_peer_identity(&source, peer)); | 5116 | GNUNET_assert(0 == GNUNET_CRYPTO_cmp_peer_identity(&source, peer)); |
5117 | |||
5096 | compare_and_update_predecessor (source, trail, trail_length); | 5118 | compare_and_update_predecessor (source, trail, trail_length); |
5097 | return GNUNET_OK; | 5119 | return GNUNET_OK; |
5098 | } | 5120 | } |