gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[GNUnet-SVN] r32526 - in gnunet/src: dht include


From: gnunet
Subject: [GNUnet-SVN] r32526 - in gnunet/src: dht include
Date: Wed, 5 Mar 2014 15:25:16 +0100

Author: supriti
Date: 2014-03-05 15:25:16 +0100 (Wed, 05 Mar 2014)
New Revision: 32526

Modified:
   gnunet/src/dht/gnunet-service-xdht.c
   gnunet/src/dht/gnunet-service-xdht_neighbours.c
   gnunet/src/dht/gnunet-service-xdht_neighbours.h
   gnunet/src/include/gnunet_protocols.h
Log:
- Adding self to trail_peer_list
- Adding functions to handle concurrent node joins.
- Modified but incomplete find_successor logic. 
- Added new message types for concurrent node joins.


Modified: gnunet/src/dht/gnunet-service-xdht.c
===================================================================
--- gnunet/src/dht/gnunet-service-xdht.c        2014-03-05 13:21:23 UTC (rev 
32525)
+++ gnunet/src/dht/gnunet-service-xdht.c        2014-03-05 14:25:16 UTC (rev 
32526)
@@ -192,6 +192,14 @@
 {
   int ret;
 
+  /* FIXME:
+   Here add a new field threshold to set user defined threshold
+   on routing table size and trail length. Pass the thr1 and thr2 
+   to neighbours_init and in neighbours file, in function where we
+   are adding a new entry into our routing table and trail length, 
+   check the threshold values. After conducting experiments, try to 
+   find the correct threshold to have a balance between attack tolerance 
+   and performance.*/
   ret =
       (GNUNET_OK ==
        GNUNET_SERVICE_run (argc, argv, "dht", GNUNET_SERVICE_OPTION_NONE, &run,

Modified: gnunet/src/dht/gnunet-service-xdht_neighbours.c
===================================================================
--- gnunet/src/dht/gnunet-service-xdht_neighbours.c     2014-03-05 13:21:23 UTC 
(rev 32525)
+++ gnunet/src/dht/gnunet-service-xdht_neighbours.c     2014-03-05 14:25:16 UTC 
(rev 32526)
@@ -50,6 +50,8 @@
 
 
 /* FIXME:
+ *SUPU: Lets assume that while adding entries in the multipeermap
+     we are adding it in sorted way. 
  1. Add content and route replication later. 
  *2. Algorithm to shorten the trail length - one possible solution could be
  * when we are in trail seutp result part. each peer in the trail check if any 
of
@@ -62,13 +64,19 @@
  * generate random value does not look smart in 
send_find_finger_trail_message. 
  * 5. Need to store the interval in finger and friend table which will be used
  * to find the correct successor.
+ * 6. Need to add a new task, fix fingers. For node join/leave, we need to 
+ * upgrade our finger table periodically. So, we should call fix_fingers 
+ * and change our finger table. 
+ * 7. Should we look for fingers one by one in send_find_finger_trail_setup
+ * 8. Change the message is gnunet_protocols.h 
  */
 
 
 /**
  * Maximum possible fingers of a peer.
+ * FIXME: Should it be 64 as we are doing all the operation on 64 bit numbers 
now? 
  */
-#define MAX_FINGERS 256
+#define MAX_FINGERS 64
 
 /**
  * Maximum allowed number of pending messages per friend peer.
@@ -263,8 +271,10 @@
   FRIEND ,
   
   /* Finger */
-  FINGER
+  FINGER ,
 
+  /* My own identity */
+  MY_ID        
 };
 
 /**
@@ -284,15 +294,20 @@
   struct GNUNET_PeerIdentity source_peer;
 
   /**
+   * As we are not sending any hello messages to this destination
+   * finger, we are only searching for it, we can just send 64 bit. 
    * Finger id to which we want to set up the trail to. 
+   *
+  struct GNUNET_PeerIdentity destination_finger; */
+
+  /**
+   * Finger id to which we want to set up the trail to. 
    */
-  struct GNUNET_PeerIdentity destination_finger;
-
-  /* FIXME: Temporary field to handle current_destination properly.
-   If flag = 0, then this message's current_destination is a friend.
-   If flag = 1, then the message's current destination is a finger. */
-  //int flag;
+  uint64_t destination_finger;
   
+  /**
+   * If the message is forwarded to finger or friend. 
+   */
   enum current_destination_type current_destination_type;
   
   /**
@@ -431,17 +446,26 @@
   unsigned int pending_count;
 
   /**
-   * FIXME:
-   * 1. We need some mechanism to check the interval of values for which
-   * a peer is responsible. If we can somehow maintain the peer id of 
-   * next peer in the friend map, then we will be able to check. Or else
-   * we iterate over friend map twice will results in O(n^2) complexity. 
-   * So, the tradeoff is between space and run time complexity.  
-   * Peer id of next friend in friend peermap in 64 bit format.  
+   * Start of interval friend[i].start
    */
+  uint64_t interval_start;
+  
+  /**
+   * Start of interval friend[i+1].start
+   */
   uint64_t interval_end;
-
+  
   /**
+   * Successor of this finger.
+   */
+  struct GNUNET_PeerIdentity successor_identity;
+  
+  /**
+   * Predecessor of this finger.
+   */
+  struct GNUNET_PeerIdentity predecessor_identity;
+  
+  /**
    * Head of pending messages to be sent to this peer.
    */
  struct P2PPendingMessage *head;
@@ -461,43 +485,73 @@
 
 
 /**
+ * FIXME: Should we use another PeerIdentity which is smaller
+ * than 256 bits while storing. 
+ * SUPU
+ * finger_identity is the actual finger that we were looking for.
+ * successor is the peer id which is our finger in place of finger_identity
+ * that we were actually looking for. It may happen that finger_identity
+ * was not in the network and we found the successor closest to that
+ * finger_identity.
+ * Predcessor is needed in case of node join/fail. 
  * Entry in finger_peermap.
  */
 struct FingerInfo
 {
   /**
-   * What is the identity of the finger peer?
+   * Index in finger_peermap.
    */
-  struct GNUNET_PeerIdentity id;
+  unsigned int index;
   
   /**
-   * Start of the interval of keys for which this finger is responsible.
+   * Finger identity.
    */
-  unsigned int interval_start;
-
+  struct GNUNET_PeerIdentity finger_identity;
+  
   /**
-   * End of the interval of keys for which this finger is responsible.
+   * Start of interval finger[i].start 
    */
-  unsigned int interval_end;
-
+  uint64_t interval_start;
+  
   /**
-   * List of peers in the trail. 
+   * Start of interval finger[i+1].start 
    */
-  const struct GNUNET_PeerIdentity *trail_peer_list;
+  uint64_t interval_end;
   
   /**
-   * Finger index. 
+   * Successor of this finger.
    */
-  unsigned int finger_index;
+  struct GNUNET_PeerIdentity successor_identity;
+  
+  /**
+   * Predecessor of this finger.
+   */
+  struct GNUNET_PeerIdentity predecessor_identity;
+  
+  /**
+   * List of peers in the trail.
+   */
+  const struct GNUNET_PeerIdentity *trail_peer_list;
 };
 
-
 /**
  * Task that sends FIND FINGER TRAIL requests.
  */
 static GNUNET_SCHEDULER_TaskIdentifier find_finger_trail_task;
 
 /**
+ * FIXME: As we should check for our immediate successor
+ * in case of node join/fail, the immediate successor will change. 
+ * Hence we define a process which will be scheduled in regular interval.
+ * But you should schedule this process once you have found your successor.
+ * so, in finger_table_add_entry, when finger_peermap is size 1 then start
+ * this task, and periodically call it within it self like 
find_finger_trail_setup
+ * 
+ * Task that periodically checks for the immediate successor. 
+ */
+static GNUNET_SCHEDULER_TaskIdentifier verify_immediate_successor;
+
+/**
  * Identity of this peer.
  */
 static struct GNUNET_PeerIdentity my_identity;
@@ -640,12 +694,10 @@
 
 /**
  * SUPU:
- * 1. trail_length is already incremented in the calling function
- * i.e. in send_find_finger_trail, we send trail_length = 1, and then we 
- * add the peer.
- * 2. in handle_dht_p2p_trail_setup, we send trail_length = trail_length+1; 
- * and we already have added the id of current_destination in our peer_list so
- * we need not to do anything else. 
+ * We add the next destination i.e. friend to which we are sending the packet
+ * to our peer list in the calling function and we also increment trail_length
+ * in calling function i.e. send_find_finger_trail and 
handle_dht_p2p_trail_setup.
+ * Here we only copy the whole trail into our peer_list. 
  * Setup the trail message and forward it to a friend. 
  * @param source_peer Peer which wants to set up the trail to one of its 
finger.
  * @param destination_finger Peer to which we want to set up the trail to.
@@ -655,7 +707,7 @@
  */
 void
 GDS_NEIGHBOURS_handle_trail_setup(struct GNUNET_PeerIdentity *source_peer,
-                                  struct GNUNET_PeerIdentity 
*destination_finger,
+                                  uint64_t *destination_finger,
                                   struct FriendInfo *current_destination,
                                   unsigned int trail_length,
                                   struct GNUNET_PeerIdentity *trail_peer_list)
@@ -687,24 +739,15 @@
   pending->msg = &tsm->header;
   tsm->header.size = htons (msize);
   tsm->header.type = htons (GNUNET_MESSAGE_TYPE_DHT_P2P_TRAIL_SETUP);
-  memcpy(&(tsm->destination_finger), destination_finger, sizeof (struct 
GNUNET_PeerIdentity));
+  memcpy(&(tsm->destination_finger), destination_finger, sizeof (uint64_t)); 
//FIXME: Is this copy correct?
   memcpy(&(tsm->source_peer), source_peer, sizeof (struct 
GNUNET_PeerIdentity));
   memcpy(&(tsm->current_destination),&(current_destination->id), sizeof 
(struct GNUNET_PeerIdentity));
   tsm->current_destination_type = htonl(FRIEND); 
   tsm->trail_length = htonl(trail_length); 
   peer_list = GNUNET_malloc (sizeof (struct GNUNET_PeerIdentity) * 
trail_length); 
   peer_list = (struct GNUNET_PeerIdentity *) &tsm[1];
+  memcpy(peer_list, trail_peer_list, trail_length * sizeof(struct 
GNUNET_PeerIdentity));
   
-  if(NULL == trail_peer_list)
-  {
-   /* FIXME: Shift this logic to send_find_finger_trail_message. */
-   memcpy(peer_list, &(current_destination->id), sizeof(struct 
GNUNET_PeerIdentity)); 
-  }
-  else
-  {
-   memcpy(peer_list, trail_peer_list, trail_length * sizeof(struct 
GNUNET_PeerIdentity));
-  }
-  
   GNUNET_CONTAINER_DLL_insert_tail (current_destination->head, 
current_destination->tail, pending);
   current_destination->pending_count++;
   process_friend_queue (current_destination);
@@ -799,6 +842,13 @@
                            struct GNUNET_CONTAINER_BloomFilter *peer_bf)
 {
 
+  /*
+   1. take the key, get the 64 bit value of the key.
+   2. call find_successor to get the successor of the key.
+   3. successor can be either a friend or finger.
+   4. update the field in get message to reflect if its a friend or finger 
table
+   5. add the put message to pending message and send it. 
+   */
 }
 
 /**FIXME: Old implementation just to remove error.
@@ -834,40 +884,16 @@
                            const void *data, size_t data_size)
 {
 
+   /*
+   1. take the key, get the 64 bit value of the key.
+   2. call find_successor to get the successor of the key.
+   3. successor can be either a friend or finger.
+   4. update the field in put message to reflect if its a friend or finger 
table
+   5. add the put message to pending message and send it. 
+   */
 }
 
 
-/**FIXME: Old implementation just to remove error.
- * Handle a reply (route to origin).  Only forwards the reply back to
- * other peers waiting for it.  Does not do local caching or
- * forwarding to local clients.
- *
- * @param target neighbour that should receive the block (if still connected)
- * @param type type of the block
- * @param expiration_time when does the content expire
- * @param key key for the content
- * @param put_path_length number of entries in put_path
- * @param put_path peers the original PUT traversed (if tracked)
- * @param get_path_length number of entries in put_path
- * @param get_path peers this reply has traversed so far (if tracked)
- * @param data payload of the reply
- * @param data_size number of bytes in data
- */
-void
-GDS_NEIGHBOURS_handle_reply (const struct GNUNET_PeerIdentity *target,
-                             enum GNUNET_BLOCK_Type type,
-                             struct GNUNET_TIME_Absolute expiration_time,
-                             const struct GNUNET_HashCode * key,
-                             unsigned int put_path_length,
-                             const struct GNUNET_PeerIdentity *put_path,
-                             unsigned int get_path_length,
-                             const struct GNUNET_PeerIdentity *get_path,
-                             const void *data, size_t data_size)
-{
-    
-}
-
-
 /**
  * Randomly choose one of your friends from the friends_peer map
  * @return Friend
@@ -916,26 +942,20 @@
  * search for trail to that finger. 
  * @return finger_identity 
  */
-static
-struct GNUNET_PeerIdentity *
+static uint64_t *
 compute_finger_identity()
 {
-  struct GNUNET_PeerIdentity *finger_identity;  
+  uint64_t *my_id64 ;
+  uint64_t *finger_identity64;
   
-  finger_identity = GNUNET_malloc(sizeof(struct GNUNET_PeerIdentity));
-  finger_identity = 
GNUNET_CRYPTO_compute_finger_identity(&my_identity,current_finger_index );
+  my_id64 = GNUNET_malloc (sizeof (uint64_t));
+  finger_identity64 = GNUNET_malloc (sizeof (uint64_t));
   
-  current_finger_index = (current_finger_index+1) % MAX_FINGERS;
- 
-  /* Check if you already have an entry in finger_peermap for this finger_id.
-     If yes then again look for a new finger_id.
-     FIXME: Should we return NULL here? 
-  if(NULL != GNUNET_CONTAINER_multipeermap_get(finger_peermap,finger_peer_id))
-  {
-    finger_peer_id = compute_finger_identity();
-  }*/
+  memcpy(my_id64, &(my_identity.public_key.q_y), sizeof (uint64_t));
+  *finger_identity64 = fmod ((*my_id64 + pow (2,current_finger_index)),( (pow 
(2,MAX_FINGERS))));
+  current_finger_index = current_finger_index + 1;
   
-  return finger_identity;
+  return finger_identity64;
 }
 
 
@@ -949,8 +969,7 @@
  * @param me my own identity
  * @return peer identity of immediate predecessor.
  */
-static
-struct GNUNET_PeerIdentity *
+static uint64_t *
 find_immediate_predecessor()
 {
   /* Using your own peer identity, calculate your predecessor
@@ -959,13 +978,51 @@
    * If we already have a trail to our predecessor then send NULL and 
    * calling function should be able to handle that case.
   */
-  return NULL;
+  /* FIXME: O could be a valid peer id, return something else. */
+  return 0;
 }
 
 
 /**
+ * Periodically verify your own immediate successor and 
+ * tell your successor about yourself. 
+ * 
+ * @param cls closure for this task
+ * @param tc the context under which the task is running
+ */
+static void
+stabilize(void *cls,
+          const struct GNUNET_SCHEDULER_TaskContext *tc )
+{
+  /* 
+   * FIXME:
+   * Should we have a new message type
+   * 1. like who is your predecessor.
+   * 2. notify
+   In this function
+   1. ask your immediate successor ( its stored in your finger table with 
+   field that notes that its immediate successor) who is its predecessor.
+   2. Then after getting the reply, check if its you.
+   3. If not then update the new successor and your successor
+   and notify the new successor that you are its new predecessor.
+   */
+  struct GNUNET_TIME_Relative next_send_time;
+
+  next_send_time.rel_value_us =
+      DHT_MINIMUM_FIND_FINGER_TRAIL_INTERVAL.rel_value_us +
+      GNUNET_CRYPTO_random_u64 (GNUNET_CRYPTO_QUALITY_WEAK,
+                                
DHT_MAXIMUM_FIND_FINGER_TRAIL_INTERVAL.rel_value_us /
+                                (current_finger_index + 1));
+ 
+  verify_immediate_successor =
+      GNUNET_SCHEDULER_add_delayed (next_send_time, &stabilize,
+                                    NULL);
+}
+
+
+/**
  * Task to send a find finger trail message. We attempt to find trail
- * to our finger in the network.
+ * to our finger and successor in the network.
  *
  * @param cls closure for this task
  * @param tc the context under which the task is running
@@ -974,10 +1031,11 @@
 send_find_finger_trail_message (void *cls,
                         const struct GNUNET_SCHEDULER_TaskContext *tc)
 {
-  struct GNUNET_PeerIdentity *finger_identity;
   struct FriendInfo *friend;
   struct GNUNET_TIME_Relative next_send_time;
-
+  uint64_t *finger_identity; /* FIXME: Better variable name */ 
+  struct GNUNET_PeerIdentity *peer_list;
+  
   /* We already have found trail to each of our possible fingers in the 
network. */
   if (GNUNET_CONTAINER_multipeermap_size (finger_peermap) == MAX_FINGERS)
   {
@@ -986,6 +1044,7 @@
      * predecessor when there is a node failure/join. It may happen before.
      * Think of a better strategy to decide when to call this function. 
      * We can find trail to our immediate predecessor in the network.
+     * I think its better to call this after we have trail to our successor 
set up.
      */  
     finger_identity = find_immediate_predecessor();  
     
@@ -997,8 +1056,6 @@
   }
   else
   {
-    /* Find the finger_peer_id for which we want to setup the trail */
-    finger_identity = GNUNET_malloc (sizeof (struct GNUNET_PeerIdentity));
     finger_identity = compute_finger_identity();
    
     if(finger_identity == NULL)
@@ -1012,8 +1069,14 @@
  
   /* We found a friend.*/
   if(NULL != friend)
-  {
-    
GDS_NEIGHBOURS_handle_trail_setup(&my_identity,finger_identity,friend,1,NULL);
+  { 
+    /* SUPU: Verify if its correct or not.  */
+    unsigned int trail_length = 2;
+    peer_list = GNUNET_malloc (sizeof (struct GNUNET_PeerIdentity) * 
trail_length);
+    memcpy(&peer_list[0], &(my_identity), sizeof (struct 
GNUNET_PeerIdentity)); 
+    memcpy(&peer_list[1], &(friend->id), sizeof (struct GNUNET_PeerIdentity)); 
+    GDS_NEIGHBOURS_handle_trail_setup(&my_identity, finger_identity, 
+                                      friend, trail_length, peer_list);
   }
   
   /* FIXME: Should we be using current_finger_index to generate random 
interval.*/
@@ -1061,14 +1124,19 @@
   GNUNET_STATISTICS_update (GDS_stats, gettext_noop ("# peers connected"), 1,
                             GNUNET_NO);
 
+  /* FIXME: Whenever you add an entry into your finger peermap,
+   first add everything in sorted way and interval field should also
+   be updated. */
   ret = GNUNET_new (struct FriendInfo);
   ret->id = *peer;
 
+  
   GNUNET_assert (GNUNET_OK ==
                  GNUNET_CONTAINER_multipeermap_put (friend_peermap,
                                                     peer, ret,
                                                     
GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY));
 
+  
   /* got a first connection, good time to start with FIND FINGER TRAIL 
requests... */
   if (1 == GNUNET_CONTAINER_multipeermap_size (friend_peermap))
     find_finger_trail_task = GNUNET_SCHEDULER_add_now 
(&send_find_finger_trail_message, NULL);
@@ -1133,15 +1201,12 @@
                     const struct GNUNET_MessageHeader *message)
 {
     /**
-     1. Search the friend,finger and check your own id to find the closest
-     * predecessor the given key. --> find_predecessor()
-     2. If self then datache_store
-     3. If friend, then add to peer queue 
-     4. If finger, then add to the peer queue of the first hop.
-     * in put message also maintain a field current_destination and use
-     * same logic as trail setup to understand if you are just part of trail
-     * to reach to a particular peer or you are endpoint of trail or just a 
friend.
-     * 
+    1. Check if destination is friend or finger.
+    2. If finger then get the next hop from routing table and 
+     * call GDS_NEGIHBOURS_handle_get.
+    3. If friend then call find_successor to get the next hop and again
+     * call GDS_NEIGHBOURS_handle_get to send to chosen hop.
+     4. If you are the destination then do datacache_store.
      */
   return 0;
 }
@@ -1160,138 +1225,134 @@
 handle_dht_p2p_get (void *cls, const struct GNUNET_PeerIdentity *peer,
                     const struct GNUNET_MessageHeader *message)
 {
+  /**
+    1. Check if destination is friend or finger.
+    2. If finger then get the next hop from routing table and 
+     * call GDS_NEGIHBOURS_handle_get.
+    3. If friend then call find_successor to get the next hop and again
+     * call GDS_NEIGHBOURS_handle_get to send to chosen hop.
+     4. If you are the destination then send the data back to source peer
+   * Assuming we have trail setup we can
+   * either store the whole trail or again do the search process..
+     */
   return 0;
 }
 
 
 /**
- * Core handler for p2p result messages.
- *
- * @param cls closure
- * @param message message
- * @param peer peer identity this notification is about
- * @return #GNUNET_YES (do not cut p2p connection)
- */
-static int
-handle_dht_p2p_result (void *cls, const struct GNUNET_PeerIdentity *peer,
-                       const struct GNUNET_MessageHeader *message)
-{
-  return 0;
-}
-
-
-/**
- * FIXME:
- * 1. Where do we use mod MAX_FINGERS? 
- * 2. You are not using mod when searching for the closest successor of a 
finger. 
- * 3. * 6. When I change the logic for find_successor, then I need to compare 
the interval
- * of two fingers. for that do I need to maintain a finger index and calculate 
- * the interval? 
- * @param destination 
- * @param flag Set the value of flag to 0, if next_hop = friend/1 if next_hop 
= finger. 
- * @param current_destination We should set this field to finger id/friend id 
chosen to be next_hop.
+ * FIXME: Use some optimal way to do the operations.
+ * FIXME: Check if this function can be used as such for put/get
+ * 1.assumption that when ever we insert a value into friend or
+ * finger map, we sort it and also update the interval correctly,
+ * 2. all the comparison are done on 64 bit values. so in last part when 
+ * you compare finger , friend and your own identity then also you need to 
+ * have the values in 64 bit format and get the correct successor. 
+ * At this point the algorithm does not look very smart. 
+ * Finds successor of the identifier 
+ * @param id Identifier for which we are trying to find the successor
  * @return 
  */
 static struct GNUNET_PeerIdentity *
-find_successor(struct GNUNET_PeerIdentity *destination,
+find_successor(uint64_t id, 
                struct GNUNET_PeerIdentity *current_destination,
                enum current_destination_type *type)
 {
-  /*
-   * 1. Compare your identity with destination identity.
-   * 2. Iterate over friend_map to find the peer identity with identity >= 
destination 
-   * 3. Iterate over finger_map to find the peer identity with identity >= 
destination
-   * 4. Compare id,friend and finger to select one which is the least and 
still >= destination.
-   * 5. If friend/my_identity then flag = 0
-   * 6. If finger, then flag = 1.
-   * 7. Set the current_destination value with chosen friend/finger/my_identity
-   * 8. If finger, then search in your own finger table send the next hop to 
reach that finger.  
-   */
-  unsigned int friend_index;
-  unsigned int finger_index;
+  /* 1. Iterate over friend map and find the closest peer.
+     2. Iterate over finger map and find the closest peer.
+     3. Sort my_identity, friend successor and finger successor.
+     4. Choose the closest peer among the three. 
+  */
   struct GNUNET_CONTAINER_MultiPeerMapIterator *friend_iter;
   struct GNUNET_CONTAINER_MultiPeerMapIterator *finger_iter;
-  struct GNUNET_PeerIdentity key_ret;
   struct FriendInfo *friend;
   struct FingerInfo *finger;
-  struct GNUNET_PeerIdentity *current_successor;
+  struct GNUNET_PeerIdentity key_ret;
+  unsigned int finger_index;
+  unsigned int friend_index;
+  struct FriendInfo *successor_friend;
+  struct FingerInfo *successor_finger;
+  uint64_t friend_id;
+  uint64_t finger_id;
+  uint64_t my_id;
   
-  /* FIXME: Temporary field used to understand if we got a friend or finger
-     as next successor. find something better. */
-  int successor;
-  int finger_peer = 0;
-  int friend_peer = 1;  
-  int me = 2;
+  successor_friend = GNUNET_malloc (sizeof (struct FriendInfo ));
+  successor_finger = GNUNET_malloc (sizeof (struct FingerInfo ));
   
-  current_successor = GNUNET_malloc (sizeof (struct GNUNET_PeerIdentity));
-  
-  /* initialize current_successor with your own identity. */
-  memcpy(current_successor,&my_identity,sizeof(struct GNUNET_PeerIdentity));
-  successor = me;
-  
+  /* Iterate over friend map. */
   friend_iter = GNUNET_CONTAINER_multipeermap_iterator_create 
(friend_peermap); 
-  
-  /*iterate over friend map till you reach a peer id such that destination <= 
peer id */
   for (friend_index = 0; friend_index < GNUNET_CONTAINER_multipeermap_size 
(friend_peermap); friend_index++)
   {
+    /* SUPU: check if you are using iterator_next correctly */
     if(GNUNET_YES == 
GNUNET_CONTAINER_multipeermap_iterator_next(friend_iter,&key_ret,(const void 
**)&friend)) 
     {
-      if(0 > GNUNET_CRYPTO_cmp_peer_identity(&friend->id,destination) ||
-        (0 == GNUNET_CRYPTO_cmp_peer_identity(&friend->id,destination)))
+      if(((friend->interval_start <= id) && (id < friend->interval_end))
+         || (((friend->interval_start) > (friend->interval_end)) 
+             && ((friend->interval_start <= id) && (id < 
friend->interval_end))))
       {
-        /* If yes then check if finger <= current_successor */
-        if(0 < GNUNET_CRYPTO_cmp_peer_identity(&friend->id,current_successor) 
||
-          (0 == 
GNUNET_CRYPTO_cmp_peer_identity(&friend->id,current_successor)))
-        {
-          memcpy(current_successor,friend,sizeof(struct GNUNET_PeerIdentity));
-          successor = friend_peer;
-        }
-      }   
+        /* SUPU: Here I am copying friend into successor_friend as when among 
+         three ids i.e. friend, finger and my_id, one is chosen then I should
+         be able to identify which one was chosen. */
+        memcpy(successor_friend, friend, sizeof (struct FriendInfo)); 
+        break; /*FIXME: Will it come out of outer for loop */
+      }
     }
   }
   
-
   finger_iter = GNUNET_CONTAINER_multipeermap_iterator_create 
(finger_peermap);  
   /* iterate over finger map till you reach a peer id such that destination <= 
peer id */ 
   for (finger_index = 0; finger_index < GNUNET_CONTAINER_multipeermap_size 
(finger_peermap); finger_index++)
   {
     if(GNUNET_YES == 
GNUNET_CONTAINER_multipeermap_iterator_next(finger_iter,&key_ret,(const void 
**)&finger)) 
     {
-      if(0 > GNUNET_CRYPTO_cmp_peer_identity(&finger->id,destination) ||
-         (0 == GNUNET_CRYPTO_cmp_peer_identity(&finger->id,destination)))
+      if(((finger->interval_start <= id) && (id < finger->interval_end))
+         || (((finger->interval_start) > (finger->interval_end)) 
+             && ((finger->interval_start <= id) && (id < 
finger->interval_end))))
       {
-        /* If yes then check if finger <= current_friend_successor */ 
-        if(0 < GNUNET_CRYPTO_cmp_peer_identity(&finger->id,current_successor) 
-        || (0 == 
GNUNET_CRYPTO_cmp_peer_identity(&finger->id,current_successor)))
-        {
-          memcpy(current_successor,finger,sizeof(struct GNUNET_PeerIdentity));
-          successor = finger_peer;
-        } 
-      } 
+        memcpy(successor_finger, finger, sizeof (struct FingerInfo)); 
+        break; /*FIXME: Will it come out of outer for loop */
+      }
     }
-  }  
+  }
   
-  memcpy(current_destination,current_successor,sizeof(struct 
GNUNET_PeerIdentity));
+  /* Here you have two values from friend and finger map. 
+     Now sort the my_identity, friend and finger and
+     choose the closest peer. Also update the closest successor type
+     correctly to finger/friend/me. and update the current_destination value. 
*/
+  memcpy (&my_id, &(my_identity.public_key.q_y), sizeof (uint64_t));
+  memcpy (&friend_id, (successor_friend->id.public_key.q_y), sizeof 
(uint64_t));
+  memcpy (&finger_id, (successor_finger->finger_identity.public_key.q_y), 
sizeof (uint64_t));
   
-  if(successor == finger_peer)
-  { 
-    *type = FINGER;
-  }
-  else
-  {
-    /* The successor is either my_identity or friend. */ 
-    *type = FRIEND;
-  }
-  
-  return current_successor;
+  /* if finger_id is selected, then set type = FINGER, current_destination = 
finger
+   and next_hop = first peer in trail list. 
+   if friend id is selected, then set type = FRIEND, current_destination = 
friend
+   and return friend. */
+  /* You need some function to compare which three of them is successor to 
+   id that we are looking for. 
+   1. Sort three of them.
+   2. Set up the new interval.
+   3. Check in which interval id lies. 
+   * You should set the type proprly. Need to add a new type to handle
+   * my_idenity.
+   This is very suboptimal.
+   Once you found the correct successor you should just return the 
+   correct PeerIdentity.
+   so basic logic is:
+   lets say that 
+   my_id = 3 [3,5)
+   friend_id = 5 [5,7)
+   finger_id = 7 [7,3)
+   and we are looking for 1.  */
+  return &(successor_friend->id); /* FIXME: remove this, added just to remove 
+                            * warning */
 }
 
 
 /**
+ * Handle a P2PTrailSetupMessage. 
  * @param cls closure
  * @param message message
  * @param peer peer identity this notification is about
- * @return #GNUNET_YES 
+ * @return GNUNET_OK on success, GNUNET_SYSERR on error
  */
 static int
 handle_dht_p2p_trail_setup(void *cls, const struct GNUNET_PeerIdentity *peer,
@@ -1300,13 +1361,13 @@
   struct PeerTrailSetupMessage *trail_setup; 
   struct GNUNET_PeerIdentity *next_hop; 
   struct FriendInfo *target_friend;
-  struct FriendInfo *new_target_friend;
   size_t msize;
   uint32_t trail_length;
   enum current_destination_type peer_type;
   struct GNUNET_PeerIdentity *trail_peer_list; 
   uint32_t current_trail_index;
   struct GNUNET_PeerIdentity *next_peer;
+
   
   /* parse and validate message. */
   msize = ntohs (message->size);
@@ -1328,7 +1389,7 @@
        GNUNET_SERVER_MAX_MESSAGE_SIZE / sizeof (struct GNUNET_PeerIdentity)))
   {
     GNUNET_break_op (0);
-    return GNUNET_YES;
+    return GNUNET_YES; /*TODO: Why do we send GNUNET_YES here? */
   }
  
   
@@ -1343,17 +1404,19 @@
   {
     if(0 == 
(GNUNET_CRYPTO_cmp_peer_identity(&(trail_setup->current_destination),&my_identity)))
     {
-      next_hop = 
find_successor(&(trail_setup->destination_finger),&(trail_setup->current_destination),&(peer_type));
+      next_hop = 
find_successor((trail_setup->destination_finger),&(trail_setup->current_destination),&(peer_type));
     }
     else
-      return GNUNET_SYSERR;
+      return GNUNET_SYSERR; /*TODO: Should we handle this case differently? */
   }
-  else
+  else if(peer_type == FINGER)
   {
     if(0 != 
(GNUNET_CRYPTO_cmp_peer_identity(&(trail_setup->current_destination),&my_identity)))
     {
-      /* I am part of trail. */
-      next_hop = 
GDS_ROUTING_search(&(trail_setup->source_peer),&(trail_setup->destination_finger));
+      /* I am part of trail. 
+       SUPU: So, I should ask for next hop to reach the current_destination 
which is the finger
+       for which this packet has been sent. */
+      next_hop = 
GDS_ROUTING_search(&(trail_setup->source_peer),&(trail_setup->current_destination));
       
       /*TODO: 
        call find_successor and compare the two peer ids 
@@ -1361,49 +1424,54 @@
     } 
     else
     {
-      /* I am the current_destination finger */
-      next_hop = 
find_successor(&(trail_setup->destination_finger),&(trail_setup->current_destination),&(peer_type));
+      /* I am the current_destination finger
+       FIXME: Why are we sending current_destination to find_successor. 
+       In this case, is it safe to assume current_Destination = my_identity.
+       I guess we are sending current_destination so that we update it with new
+       current_destination, if could either me, friend or finger.*/
+      next_hop = 
find_successor((trail_setup->destination_finger),&(trail_setup->current_destination),&(peer_type));
     }
   }
-  
-  target_friend = GNUNET_CONTAINER_multipeermap_get (friend_peermap, next_hop);
-  
-  /* Add yourself to list of peers that trail setup message have traversed so 
far
-   and increment trail length. */
-  struct GNUNET_PeerIdentity *peer_list;
-  peer_list = GNUNET_malloc (sizeof (struct GNUNET_PeerIdentity) * 
(trail_length + 1));
-  memcpy(peer_list, trail_peer_list, trail_length * sizeof (struct 
GNUNET_PeerIdentity));
-  memcpy(&peer_list[trail_length], next_hop, sizeof (struct 
GNUNET_PeerIdentity));
-  trail_length++;
-  
-  /* Check if you are next hop, if yes then you have reached the final 
destination. */ 
-  if(0 == (GNUNET_CRYPTO_cmp_peer_identity(next_hop,&my_identity)))
+   
+  /* If you are the next hop */
+  if(peer_type == MY_ID)
   {
-    /* FIXME: Trail length should be const. */ 
-    if(trail_length >= 1)
-    {
+    /* FIXME: Verify if its allowed here to definer peer_list and define it
+       again in the next block below? */
+      struct GNUNET_PeerIdentity *peer_list;
+      peer_list = GNUNET_malloc (sizeof (struct GNUNET_PeerIdentity) * 
(trail_length));
+      memcpy(peer_list, trail_peer_list, trail_length * sizeof (struct 
GNUNET_PeerIdentity));
       current_trail_index = trail_length - 2;
       next_peer = GNUNET_malloc (sizeof (struct GNUNET_PeerIdentity)); 
//FIXME: Do we need to allocate the memory?
       memcpy(next_peer, &peer_list[current_trail_index], sizeof (struct 
GNUNET_PeerIdentity));
       
-      new_target_friend = GNUNET_CONTAINER_multipeermap_get (friend_peermap, 
next_peer);
+      target_friend = GNUNET_CONTAINER_multipeermap_get (friend_peermap, 
next_peer);
      
       /* FIXME: It does not find a friend. Could be possible error in 
find_successor 
        function. Change the logic in find_successor and change it again. */
-      /*if(GNUNET_NO == 
GNUNET_CONTAINER_multipeermap_contains(friend_peermap,new_target_friend))
-      {
-      
-        return GNUNET_SYSERR;
-      }
-      */
+   
+      /* FIXME: Here as destination_finger is 64 bit instead of struct
+       GNUNET_PeerIdentity, but you need destination_peer id. If you calling 
the 
+       function handle_Trail_setup_result from here, it means you are the
+       destination. So, you can send your own identity. */
       GDS_NEIGHBOURS_handle_trail_setup_result(&(trail_setup->source_peer),
-                                             
&(trail_setup->destination_finger),
-                                             new_target_friend, trail_length,
-                                             peer_list,current_trail_index);
-    }
+                                               &(my_identity),
+                                               target_friend, trail_length,
+                                               peer_list,current_trail_index);
+  
     return GNUNET_YES;
   }
   
+  /* Add next_hop to list of peers that trail setup message have traversed so 
far
+   and increment trail length. */
+  struct GNUNET_PeerIdentity *peer_list;
+  peer_list = GNUNET_malloc (sizeof (struct GNUNET_PeerIdentity) * 
(trail_length + 1));
+  memcpy(peer_list, trail_peer_list, trail_length * sizeof (struct 
GNUNET_PeerIdentity));
+  memcpy(&peer_list[trail_length], next_hop, sizeof (struct 
GNUNET_PeerIdentity));
+  trail_length++;
+  
+  target_friend = GNUNET_CONTAINER_multipeermap_get (friend_peermap, next_hop);
+  
   if(peer_type == FINGER)
   {
     
GDS_ROUTING_add(&(trail_setup->source_peer),&(trail_setup->current_destination),next_hop);
@@ -1420,6 +1488,9 @@
 
 /**
  * FIXME : Add interval field. 
+ * When adding successor or predeccsor, update a field to
+ * specify that this entry is not a finger but immediate
+ * successor or predeccesor. 
  * Add an entry in finger table. 
  * @param finger Finger to be added to finger table
  * @param peer_list peers this request has traversed so far
@@ -1432,9 +1503,20 @@
 {
   struct FingerInfo *finger_entry;
   finger_entry = GNUNET_malloc(sizeof(struct GNUNET_PeerIdentity));
-  memcpy(&(finger_entry->id), finger, sizeof(struct GNUNET_PeerIdentity));
+  memcpy(&(finger_entry->finger_identity), finger, sizeof(struct 
GNUNET_PeerIdentity));
   memcpy(&(finger_entry->trail_peer_list), peer_list, sizeof(struct 
GNUNET_PeerIdentity)
                                                       * trail_length);
+  /*FIXME: When you add an entry into your finger table, then 
+   you should add it in sorted way. Also, once sorted update the finger table 
+   entry. As we will be using sorting and updating the interval in finger and 
friend 
+   table and also in find_successor, we need this functionality see if you can 
+   define a common function which can be used in all the three functions. 
+   Also, you should then insert that entry into your finger_peermap.
+   It seems to be too much of complexity but I need a working copy but i will
+   ask bart first. */
+  
+  if (1 == GNUNET_CONTAINER_multipeermap_size (finger_peermap))
+    verify_immediate_successor = GNUNET_SCHEDULER_add_now (&stabilize, NULL);
 }
 
 
@@ -1443,7 +1525,7 @@
  * @param cls closure
  * @param message message
  * @param peer peer identity this notification is about
- * @return #GNUNET_YES 
+ * @return GNUNET_OK on success, GNUNET_SYSERR on error
  */
 static int
 handle_dht_p2p_trail_setup_result(void *cls, const struct GNUNET_PeerIdentity 
*peer,
@@ -1507,6 +1589,61 @@
 
 
 /**
+ * Core handle for p2p verify successor messages.
+ * @return GNUNET_OK on success, GNUNET_SYSERR on error
+ */
+static int
+handle_dht_p2p_verify_successor()
+{
+  /*
+   * In this function you have received the message verify successor,
+   * Now, either you are the destination or just part of the trail.
+   * As we already know the whole path find out the next destination
+   * and pass the packet forward.
+   * If you are the final destination, check who is your predecessor.  
+   * and send your predecessor back to calling function. 
+   * FIXME: Should we have a different handler function for it. 
+   */
+  return GNUNET_YES;
+}
+
+/**
+ * Core handle for p2p notify successor messages.
+ * @return GNUNET_OK on success, GNUNET_SYSERR on error
+ */
+static int
+handle_dht_p2p_notify_successor()
+{
+  /*
+   * So, if you are the destination you should update your
+   * predecessor field with peer id of source peer of this message.
+   * If you are not the destination peer, then just check your routing
+   * table and pass on the message. 
+   */
+  return GNUNET_YES;
+}
+
+/**
+ * Core handle for p2p verify successor result messages.
+ * @return GNUNET_OK on success, GNUNET_SYSERR on error
+ */
+static int
+handle_dht_p2p_verify_successor_result()
+{
+  /*
+   * In this function you have received the message verify successor result,
+   If you are not the destination, just pass this message forward
+   * if you are destination,
+   * then check if immediate predecessor of this peer is you or someone else.
+   * If its you, then don't do anything.
+   * If its some one else, then call notify method to let your new successor
+   * know that you are its predecessor. 
+   */
+  return GNUNET_YES;
+}
+
+
+/**
  * Initialize neighbours subsystem.
  * @return GNUNET_OK on success, GNUNET_SYSERR on error
  */
@@ -1516,13 +1653,15 @@
   static struct GNUNET_CORE_MessageHandler core_handlers[] = {
     {&handle_dht_p2p_get, GNUNET_MESSAGE_TYPE_DHT_P2P_GET, 0},
     {&handle_dht_p2p_put, GNUNET_MESSAGE_TYPE_DHT_P2P_PUT, 0},
-    {&handle_dht_p2p_result, GNUNET_MESSAGE_TYPE_DHT_P2P_RESULT, 0},
     {&handle_dht_p2p_trail_setup, GNUNET_MESSAGE_TYPE_DHT_P2P_TRAIL_SETUP, 0},
     {&handle_dht_p2p_trail_setup_result, 
GNUNET_MESSAGE_TYPE_DHT_P2P_TRAIL_SETUP_RESULT, 0},
+    {&handle_dht_p2p_verify_successor, 
GNUNET_MESSAGE_TYPE_DHT_P2P_VERIFY_SUCCESSOR, 0},
+    {&handle_dht_p2p_notify_successor, 
GNUNET_MESSAGE_TYPE_DHT_P2P_NOTIFY_SUCCESSOR, 0},
+    {&handle_dht_p2p_verify_successor_result, 
GNUNET_MESSAGE_TYPE_DHT_P2P_VERIFY_SUCCESSOR_RESULT, 0},
     {NULL, 0, 0}
   };
 
-  /*ASK: What is ATS? Why do we need it? */
+  /*TODO: What is ATS? Why do we need it? */
   atsAPI = GNUNET_ATS_performance_init (GDS_cfg, NULL, NULL);
   core_api =
     GNUNET_CORE_connect (GDS_cfg, NULL, &core_init, &handle_core_connect,
@@ -1532,7 +1671,7 @@
     return GNUNET_SYSERR;
 
   friend_peermap = GNUNET_CONTAINER_multipeermap_create (256, GNUNET_NO);
-  finger_peermap = GNUNET_CONTAINER_multipeermap_create (256, GNUNET_NO);
+  finger_peermap = GNUNET_CONTAINER_multipeermap_create (MAX_FINGERS, 
GNUNET_NO); 
  
   return GNUNET_OK;
 }
@@ -1567,6 +1706,15 @@
     GNUNET_SCHEDULER_cancel (find_finger_trail_task);
     find_finger_trail_task = GNUNET_SCHEDULER_NO_TASK;
   }
+  
+  /* FIXME: fix_fingers will also be a task like this.
+     Add it later. */
+  if (GNUNET_SCHEDULER_NO_TASK != verify_immediate_successor)
+  {
+    GNUNET_SCHEDULER_cancel (verify_immediate_successor);
+    verify_immediate_successor = GNUNET_SCHEDULER_NO_TASK;
+  }
+  
 }
 
 

Modified: gnunet/src/dht/gnunet-service-xdht_neighbours.h
===================================================================
--- gnunet/src/dht/gnunet-service-xdht_neighbours.h     2014-03-05 13:21:23 UTC 
(rev 32525)
+++ gnunet/src/dht/gnunet-service-xdht_neighbours.h     2014-03-05 14:25:16 UTC 
(rev 32526)
@@ -92,35 +92,6 @@
 
 
 /**
- * Handle a reply (route to origin).  Only forwards the reply back to
- * other peers waiting for it.  Does not do local caching or
- * forwarding to local clients.
- *
- * @param target neighbour that should receive the block (if still connected)
- * @param type type of the block
- * @param expiration_time when does the content expire
- * @param key key for the content
- * @param put_path_length number of entries in put_path
- * @param put_path peers the original PUT traversed (if tracked)
- * @param get_path_length number of entries in put_path
- * @param get_path peers this reply has traversed so far (if tracked)
- * @param data payload of the reply
- * @param data_size number of bytes in data
- */
-void
-GDS_NEIGHBOURS_handle_reply (const struct GNUNET_PeerIdentity *target,
-                             enum GNUNET_BLOCK_Type type,
-                             struct GNUNET_TIME_Absolute expiration_time,
-                             const struct GNUNET_HashCode * key,
-                             unsigned int put_path_length,
-                             const struct GNUNET_PeerIdentity *put_path,
-                             unsigned int get_path_length,
-                             const struct GNUNET_PeerIdentity *get_path,
-                             const void *data, size_t data_size);
-
-
-
-/**
  * Initialize neighbours subsystem.
  *
  * @return GNUNET_OK on success, GNUNET_SYSERR on error

Modified: gnunet/src/include/gnunet_protocols.h
===================================================================
--- gnunet/src/include/gnunet_protocols.h       2014-03-05 13:21:23 UTC (rev 
32525)
+++ gnunet/src/include/gnunet_protocols.h       2014-03-05 14:25:16 UTC (rev 
32526)
@@ -616,6 +616,20 @@
  */
 #define GNUNET_MESSAGE_TYPE_DHT_P2P_TRAIL_SETUP_RESULT         158
 
+/**
+ * Verify if your immediate successor is still your immediate successor.
+ */
+#define GNUNET_MESSAGE_TYPE_DHT_P2P_VERIFY_SUCCESSOR           159
+
+/**
+ * Notify your new immediate successor that you are its new predecessor. 
+ */
+#define GNUNET_MESSAGE_TYPE_DHT_P2P_NOTIFY_SUCCESSOR           160
+
+/**
+ * Message which contains the immediate predecessor of requested successor
+ */
+#define GNUNET_MESSAGE_TYPE_DHT_P2P_VERIFY_SUCCESSOR_RESULT    161
 
/*******************************************************************************
  * HOSTLIST message types
  
******************************************************************************/




reply via email to

[Prev in Thread] Current Thread [Next in Thread]