aboutsummaryrefslogtreecommitdiff
path: root/src/dht/gnunet-service-xdht_neighbours.c
diff options
context:
space:
mode:
authorSupriti Singh <supritisingh08@gmail.com>2014-08-06 22:37:44 +0000
committerSupriti Singh <supritisingh08@gmail.com>2014-08-06 22:37:44 +0000
commitc684a9606f7bd89ca2dc876567b74fb4cfe9b118 (patch)
tree659015badbbfe6cf81c1151034588a9c3414b308 /src/dht/gnunet-service-xdht_neighbours.c
parent00239344e5b07d76ab19b842c69eaf9fef881127 (diff)
downloadgnunet-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.c64
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 */
4368static struct GNUNET_PeerIdentity * 4369static struct GNUNET_PeerIdentity *
4369check_for_duplicate_entries (const struct GNUNET_PeerIdentity *trail_1, 4370check_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 (&current_predecessor->finger_identity, 4631 if (0 == GNUNET_CRYPTO_cmp_peer_identity (&current_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 (&current_predecessor.finger_identity, 4736 if (0 != (GNUNET_CRYPTO_cmp_peer_identity (&current_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 }