add -w option to gnunet-config
[oweals/gnunet.git] / src / dht / gnunet-service-xdht_neighbours.c
1 /*
2      This file is part of GNUnet.
3      Copyright (C) 2009-2014 GNUnet e.V.
4
5      GNUnet is free software; you can redistribute it and/or modify
6      it under the terms of the GNU General Public License as published
7      by the Free Software Foundation; either version 3, or (at your
8      option) any later version.
9
10      GNUnet is distributed in the hope that it will be useful, but
11      WITHOUT ANY WARRANTY; without even the implied warranty of
12      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13      General Public License for more details.
14
15      You should have received a copy of the GNU General Public License
16      along with GNUnet; see the file COPYING.  If not, write to the
17      Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18      Boston, MA 02110-1301, USA.
19 */
20
21 /**
22  * @file dht/gnunet-service-xdht_neighbours.c
23  * @brief GNUnet DHT service's finger and friend table management code
24  * @author Supriti Singh
25  */
26
27 #include "platform.h"
28 #include "gnunet_util_lib.h"
29 #include "gnunet_block_lib.h"
30 #include "gnunet_hello_lib.h"
31 #include "gnunet_constants.h"
32 #include "gnunet_protocols.h"
33 #include "gnunet_ats_service.h"
34 #include "gnunet_core_service.h"
35 #include "gnunet_datacache_lib.h"
36 #include "gnunet_transport_service.h"
37 #include "gnunet_dht_service.h"
38 #include "gnunet_statistics_service.h"
39 #include "gnunet-service-xdht.h"
40 #include "gnunet-service-xdht_clients.h"
41 #include "gnunet-service-xdht_datacache.h"
42 #include "gnunet-service-xdht_neighbours.h"
43 #include "gnunet-service-xdht_routing.h"
44 #include "dht.h"
45
46 /**
47  * TODO:
48  * 1. In X-Vine paper, there is no policy defined for replicating the data to
49  * recover in case of peer failure. We can do it in Chord way. In R5N, the key
50  * is hashed and then data is stored according to the key value generated after
51  * hashing.
52  */
53
54 #define DEBUG(...)                                           \
55   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, __VA_ARGS__)
56
57 /**
58  * Maximum possible fingers (including predecessor) of a peer
59  */
60 #define MAX_FINGERS 65
61
62 /**
63  * Maximum allowed number of pending messages per friend peer.
64  */
65 #define MAXIMUM_PENDING_PER_FRIEND 64
66
67 /**
68  * How long to wait before sending another find finger trail request
69  */
70 #define DHT_FIND_FINGER_TRAIL_INTERVAL GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 2)
71
72 /**
73  * How long to wait before sending another verify successor message.
74  */
75 #define DHT_SEND_VERIFY_SUCCESSOR_INTERVAL GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 2)
76
77 /**
78  * How long to wait before sending another verify successor message.
79  */
80 #define DHT_SEND_VERIFY_SUCCESSOR_RETRY_INTERVAL GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 30)
81
82 /**
83  * How long to wait before retrying notify successor.
84  */
85 #define DHT_SEND_NOTIFY_SUCCESSOR_RETRY_INTERVAL GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 30)
86
87 /**
88  * How long at most to wait for transmission of a request to a friend ?
89  */
90 #define PENDING_MESSAGE_TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_MINUTES, 2)
91
92 /**
93  * Duration for which I may remain congested.
94  * Note: Its a static value. In future, a peer may do some analysis and calculate
95  * congestion_timeout based on 'some' parameters.
96  */
97 #define CONGESTION_TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_MINUTES, 2)
98
99 /**
100  * In case we don't hear back from the current successor, then we can start
101  * verify successor.
102  */
103 #define WAIT_NOTIFY_CONFIRMATION GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_MILLISECONDS, 200)
104
105 /**
106  * Maximum number of trails allowed to go through a friend.
107  */
108 #define TRAILS_THROUGH_FRIEND_THRESHOLD 64
109
110 /**
111  * Maximum number of trails stored per finger.
112  */
113 #define MAXIMUM_TRAILS_PER_FINGER 4
114
115 /**
116  * Finger map index for predecessor entry in finger table.
117  */
118 #define PREDECESSOR_FINGER_ID 64
119
120 /**
121  * FIXME: Its use only at 3 places check if you can remove it.
122  * To check if a finger is predecessor or not.
123  */
124 enum GDS_NEIGHBOURS_finger_type
125 {
126   GDS_FINGER_TYPE_PREDECESSOR = 1,
127   GDS_FINGER_TYPE_NON_PREDECESSOR = 0
128 };
129
130 GNUNET_NETWORK_STRUCT_BEGIN
131
132 /**
133  * P2P PUT message
134  */
135 struct PeerPutMessage
136 {
137   /**
138    * Type: #GNUNET_MESSAGE_TYPE_XDHT_P2P_PUT
139    */
140   struct GNUNET_MessageHeader header;
141
142   /**
143    * Processing options
144    */
145   uint32_t options GNUNET_PACKED;
146
147   /**
148    * Content type.
149    */
150   uint32_t block_type GNUNET_PACKED;
151
152   /**
153    * Hop count
154    */
155   uint32_t hop_count GNUNET_PACKED;
156
157   /**
158    * Replication level for this message
159    * In the current implementation, this value is not used.
160    */
161   uint32_t desired_replication_level GNUNET_PACKED;
162
163   /**
164    * Length of the PUT path that follows (if tracked).
165    */
166   uint32_t put_path_length GNUNET_PACKED;
167
168   /**
169    * Best known destination (could be my friend or finger) which should
170    * get this message next.
171    */
172   struct GNUNET_PeerIdentity best_known_destination;
173
174   /**
175    * In case best_known_destination is a finger, then trail to reach
176    * to that finger. Else its default value is 0.
177    */
178   struct GNUNET_HashCode intermediate_trail_id;
179
180   /**
181    * When does the content expire?
182    */
183   struct GNUNET_TIME_AbsoluteNBO expiration_time;
184
185   /**
186    * The key to store the value under.
187    */
188   struct GNUNET_HashCode key GNUNET_PACKED;
189
190   /* put path (if tracked) */
191
192   /* Payload */
193
194 };
195
196 /**
197  * P2P GET message
198  */
199 struct PeerGetMessage
200 {
201   /**
202    * Type: #GNUNET_MESSAGE_TYPE_XDHT_P2P_GET
203    */
204   struct GNUNET_MessageHeader header;
205
206   /**
207    * Processing options
208    */
209   uint32_t options GNUNET_PACKED;
210
211   /**
212    * Desired content type.
213    */
214   uint32_t block_type GNUNET_PACKED;
215
216   /**
217    * Hop count
218    */
219   uint32_t hop_count GNUNET_PACKED;
220
221   /**
222    * Desired replication level for this request.
223    * In the current implementation, this value is not used.
224    */
225   uint32_t desired_replication_level GNUNET_PACKED;
226
227   /**
228    * Total number of peers in get path.
229    */
230   unsigned int get_path_length;
231
232   /**
233    * Best known destination (could be my friend or finger) which should
234    * get this message next.
235    */
236   struct GNUNET_PeerIdentity best_known_destination;
237
238   /**
239    * In case best_known_destination is a finger, then trail to reach
240    * to that finger. Else its default value is 0.
241    */
242   struct GNUNET_HashCode intermediate_trail_id;
243
244   /**
245    * The key we are looking for.
246    */
247   struct GNUNET_HashCode key;
248
249   /* Get path. */
250   /* struct GNUNET_PeerIdentity[]*/
251 };
252
253 /**
254  * P2P Result message
255  */
256 struct PeerGetResultMessage
257 {
258   /**
259    * Type: #GNUNET_MESSAGE_TYPE_XDHT_P2P_GET_RESULT
260    */
261   struct GNUNET_MessageHeader header;
262
263   /**
264    * The type for the data.
265    */
266   uint32_t type GNUNET_PACKED;
267
268   /**
269    * Number of peers recorded in the outgoing path from source to the
270    * stored location of this message.
271    */
272   uint32_t put_path_length GNUNET_PACKED;
273
274   /**
275    * Length of the GET path that follows (if tracked).
276    */
277   uint32_t get_path_length GNUNET_PACKED;
278
279   /**
280    * Peer which queried for get and should get the result.
281    */
282   struct GNUNET_PeerIdentity querying_peer;
283
284   /**
285    * When does the content expire?
286    */
287   struct GNUNET_TIME_AbsoluteNBO expiration_time;
288
289   /**
290    * The key of the corresponding GET request.
291    */
292   struct GNUNET_HashCode key;
293
294   /* put path (if tracked) */
295
296   /* get path (if tracked) */
297
298   /* Payload */
299
300 };
301
302 /**
303  * P2P Trail setup message
304  */
305 struct PeerTrailSetupMessage
306 {
307   /**
308    * Type: #GNUNET_MESSAGE_TYPE_XDHT_P2P_TRAIL_SETUP
309    */
310   struct GNUNET_MessageHeader header;
311
312   /**
313    * Is source_peer trying to setup the trail to a predecessor or any finger.
314    */
315   uint32_t is_predecessor;
316
317   /**
318    * Peer closest to this value will be our finger.
319    */
320   uint64_t final_destination_finger_value;
321
322   /**
323    * Source peer which wants to setup the trail to one of its finger.
324    */
325   struct GNUNET_PeerIdentity source_peer;
326
327   /**
328    * Best known destination (could be my friend or finger) which should
329    * get this message next.
330    *
331    * FIXME: this could be removed if we include trail_source / trail_dest
332    * in the routing table. This way we save 32 bytes of bandwidth by using
333    * extra 8 bytes of memory (2 * sizeof (GNUNET_PEER_ID))
334    */
335   struct GNUNET_PeerIdentity best_known_destination;
336
337   /**
338    * In case best_known_destination is a finger, then trail id of trail to
339    * reach to this finger.
340    */
341   struct GNUNET_HashCode intermediate_trail_id;
342
343   /**
344    * Trail id for trail which we are trying to setup.
345    */
346   struct GNUNET_HashCode trail_id;
347
348   /* List of peers which are part of trail setup so far.
349    * Trail does NOT include source_peer and peer which will be closest to
350    * ultimate_destination_finger_value.
351    * struct GNUNET_PeerIdentity trail[]
352    */
353 };
354
355 /**
356   * P2P Trail Setup Result message
357  */
358 struct PeerTrailSetupResultMessage
359 {
360
361   /**
362    * Type: #GNUNET_MESSAGE_TYPE_XDHT_P2P_TRAIL_SETUP_RESULT
363    */
364   struct GNUNET_MessageHeader header;
365
366   /**
367    * Finger to which we have found the path.
368    */
369   struct GNUNET_PeerIdentity finger_identity;
370
371   /**
372    * Peer which started trail_setup to find trail to finger_identity
373    */
374   struct GNUNET_PeerIdentity querying_peer;
375
376   /**
377    * Is the trail setup to querying_peer's predecessor or finger?
378    */
379   uint32_t is_predecessor;
380
381   /**
382    * Value to which finger_identity is the closest peer.
383    */
384   uint64_t ulitmate_destination_finger_value;
385
386   /**
387    * Identifier of the trail from querying peer to finger_identity, NOT
388    * including both endpoints.
389    */
390   struct GNUNET_HashCode trail_id;
391
392   /* List of peers which are part of the trail from querying peer to
393    * finger_identity, NOT including both endpoints.
394    * struct GNUNET_PeerIdentity trail[]
395    */
396 };
397
398 /**
399  * P2P Verify Successor Message.
400  */
401 struct PeerVerifySuccessorMessage
402 {
403   /**
404    * Type: #GNUNET_MESSAGE_TYPE_XDHT_P2P_VERIFY_SUCCESSOR
405    */
406   struct GNUNET_MessageHeader header;
407
408   /**
409    * Peer which wants to verify its successor.
410    */
411   struct GNUNET_PeerIdentity source_peer;
412
413   /**
414    * Source Peer's current successor.
415    */
416   struct GNUNET_PeerIdentity successor;
417
418   /**
419    * Identifier of trail to reach from source_peer to successor.
420    */
421   struct GNUNET_HashCode trail_id;
422
423   /* List of the peers which are part of trail to reach  from source_peer
424    * to successor, NOT including them
425    * struct GNUNET_PeerIdentity trail[]
426    */
427 };
428
429 /**
430  * P2P Verify Successor Result Message
431  */
432 struct PeerVerifySuccessorResultMessage
433 {
434   /**
435    * Type: #GNUNET_MESSAGE_TYPE_XDHT_P2P_VERIFY_SUCCESSOR_RESULT
436    */
437   struct GNUNET_MessageHeader header;
438
439   /**
440    * Peer which sent the request to verify its successor.
441    */
442   struct GNUNET_PeerIdentity querying_peer;
443
444   /**
445    * Successor to which PeerVerifySuccessorMessage was sent.
446    */
447   struct GNUNET_PeerIdentity current_successor;
448
449   /**
450    * Current Predecessor of source_successor. It can be same as querying peer
451    * or different. In case it is different then it can be querying_peer's
452    * probable successor.
453    */
454   struct GNUNET_PeerIdentity probable_successor;
455
456   /**
457    * Trail identifier of trail from querying_peer to current_successor.
458    */
459   struct GNUNET_HashCode trail_id;
460
461   /**
462    * Direction in which we are looking at the trail.
463    */
464   uint32_t trail_direction;
465
466   /* In case probable_successor != querying_peer, then trail to reach from
467    * querying_peer to probable_successor, NOT including end points.
468    * struct GNUNET_PeerIdentity trail[]
469    */
470 };
471
472 /**
473  * P2P Notify New Successor Message.
474  */
475 struct PeerNotifyNewSuccessorMessage
476 {
477   /**
478    * Type: #GNUNET_MESSAGE_TYPE_XDHT_P2P_NOTIFY_NEW_SUCCESSOR
479    */
480   struct GNUNET_MessageHeader header;
481
482   /**
483    * Peer which wants to notify its new successor.
484    */
485   struct GNUNET_PeerIdentity source_peer;
486
487   /**
488    * New successor of source_peer.
489    */
490   struct GNUNET_PeerIdentity new_successor;
491
492   /**
493    * Unique identifier of the trail from source_peer to new_successor,
494    * NOT including the endpoints.
495    */
496   struct GNUNET_HashCode trail_id;
497
498   /* List of peers in trail from source_peer to new_successor,
499    * NOT including the endpoints.
500    * struct GNUNET_PeerIdentity trail[]
501    */
502 };
503
504 /**
505  * P2P Notify Successor Confirmation message.
506  */
507 struct PeerNotifyConfirmationMessage
508 {
509    /**
510    * Type: #GNUNET_MESSAGE_TYPE_XDHT_P2P_TRAIL_TEARDOWN
511    */
512   struct GNUNET_MessageHeader header;
513
514   /**
515    * Unique identifier of the trail.
516    */
517   struct GNUNET_HashCode trail_id;
518
519   /**
520    * Direction of trail.
521    */
522   uint32_t trail_direction;
523 };
524
525
526 /**
527  * P2P Trail Tear Down message.
528  */
529 struct PeerTrailTearDownMessage
530 {
531   /**
532    * Type: #GNUNET_MESSAGE_TYPE_XDHT_P2P_TRAIL_TEARDOWN
533    */
534   struct GNUNET_MessageHeader header;
535
536   /**
537    * Unique identifier of the trail.
538    */
539   struct GNUNET_HashCode trail_id;
540
541   /**
542    * Direction of trail.
543    */
544   uint32_t trail_direction;
545 };
546
547
548 /**
549  * P2P Trail Rejection Message.
550  */
551 struct PeerTrailRejectionMessage
552 {
553   /**
554    * Type: #GNUNET_MESSAGE_TYPE_XDHT_P2P_TRAIL_SETUP_REJECTION
555    */
556   struct GNUNET_MessageHeader header;
557
558   /**
559    * Peer which wants to set up the trail.
560    */
561   struct GNUNET_PeerIdentity source_peer;
562
563   /**
564    * Peer which sent trail rejection message as it it congested.
565    */
566   struct GNUNET_PeerIdentity congested_peer;
567
568   /**
569    * Peer identity closest to this value will be finger of
570    * source_peer.
571    */
572   uint64_t ultimate_destination_finger_value;
573
574   /**
575    * Is source_peer trying to setup the trail to its predecessor or finger.
576    */
577   uint32_t is_predecessor;
578
579   /**
580    * Identifier for the trail that source peer is trying to setup.
581    */
582   struct GNUNET_HashCode trail_id;
583
584   /**
585    * Relative time for which congested_peer will remain congested.
586    */
587   struct GNUNET_TIME_Relative congestion_time;
588
589   /* Trail_list from source_peer to peer which sent the message for trail setup
590    * to congested peer. This trail does NOT include source_peer.
591    struct GNUNET_PeerIdnetity trail[]*/
592 };
593
594 /**
595  * P2P Add Trail Message.
596  */
597 struct PeerAddTrailMessage
598 {
599   /**
600    * Type: #GNUNET_MESSAGE_TYPE_XDHT_P2P_ADD_TRAIL
601    */
602   struct GNUNET_MessageHeader header;
603
604   /**
605    * Source of the routing trail.
606    */
607   struct GNUNET_PeerIdentity source_peer;
608
609   /**
610    * Destination of the routing trail.
611    */
612   struct GNUNET_PeerIdentity destination_peer;
613
614   /**
615    * Unique identifier of the trail from source_peer to destination_peer,
616    * NOT including the endpoints.
617    */
618   struct GNUNET_HashCode trail_id;
619
620   /* Trail from source peer to destination peer, NOT including them.
621    * struct GNUNET_PeerIdentity trail[]
622    */
623 };
624
625
626 GNUNET_NETWORK_STRUCT_END
627
628 /**
629  * Linked list of messages to send to a particular other peer.
630  */
631 struct P2PPendingMessage
632 {
633   /**
634    * Pointer to next item in the list
635    */
636   struct P2PPendingMessage *next;
637
638   /**
639    * Pointer to previous item in the list
640    */
641   struct P2PPendingMessage *prev;
642
643   /**
644    * Message importance level.  FIXME: used? useful?
645    */
646   unsigned int importance;
647
648   /**
649    * When does this message time out?
650    */
651   struct GNUNET_TIME_Absolute timeout;
652
653   /**
654    * Actual message to be sent, allocated at the end of the struct:
655    * // msg = (cast) &pm[1];
656    * // memcpy (&pm[1], data, len);
657    */
658   const struct GNUNET_MessageHeader *msg;
659
660 };
661
662 /**
663  *  Entry in friend_peermap.
664  */
665 struct FriendInfo
666 {
667   /**
668    * Friend Identity
669    */
670   struct GNUNET_PeerIdentity id;
671
672   /**
673    * Number of trails for which this friend is the first hop or if the friend
674    * is finger.
675    */
676   unsigned int trails_count;
677
678   /**
679    * Count of outstanding messages for this friend.
680    */
681   unsigned int pending_count;
682
683   /**
684    * In case not 0, then amount of time for which this friend is congested.
685    */
686   struct GNUNET_TIME_Absolute congestion_timestamp;
687
688
689   // TODO : Change name of head and tail to pending_messages_list_head and so.
690   /**
691    * Head of pending messages to be sent to this friend.
692    */
693   struct P2PPendingMessage *head;
694
695   /**
696    * Tail of pending messages to be sent to this friend.
697    */
698   struct P2PPendingMessage *tail;
699
700   /**
701    * Core handle for sending messages to this friend.
702    */
703   struct GNUNET_CORE_TransmitHandle *th;
704
705 };
706
707 /**
708  * An individual element of the trail to reach to a finger.
709  */
710 struct Trail_Element
711 {
712   /**
713     * Pointer to next item in the list
714     */
715   struct Trail_Element *next;
716
717   /**
718     * Pointer to prev item in the list
719     */
720   struct Trail_Element *prev;
721
722   /**
723    * An element in this trail.
724    */
725   struct GNUNET_PeerIdentity peer;
726 };
727
728 /**
729  * Information about an individual trail.
730  */
731 struct Trail
732 {
733   /**
734    * Head of trail.
735    */
736   struct Trail_Element *trail_head;
737
738   /**
739    * Tail of trail.
740    */
741   struct Trail_Element *trail_tail;
742
743   /**
744    * Unique identifier of this trail.
745    */
746   struct GNUNET_HashCode trail_id;
747
748   /**
749    * Length of trail pointed
750    */
751   unsigned int trail_length;
752
753   /**
754    * Is there a valid trail entry.
755    */
756   unsigned int is_present;
757 };
758
759 /**
760  * An entry in finger_table
761  */
762 struct FingerInfo
763 {
764   /**
765    * Finger identity.
766    */
767   struct GNUNET_PeerIdentity finger_identity;
768
769   /**
770    * In case not 0, this amount is time to wait for notify successor message.
771    * Used ONLY for successor. NOT for any other finger.
772    */
773   struct GNUNET_TIME_Absolute wait_notify_confirmation;
774
775   /**
776    * Is any finger stored at this finger index.
777    */
778   unsigned int is_present;
779
780   /**
781    * Index in finger peer map
782    */
783   uint32_t finger_table_index;
784
785   /**
786    * Number of trails setup so far for this finger.
787    * Should not cross MAXIMUM_TRAILS_PER_FINGER.
788    */
789   uint32_t trails_count;
790
791   /**
792    * Array of trails to reach to this finger.
793    */
794   struct Trail trail_list[MAXIMUM_TRAILS_PER_FINGER];
795 };
796
797
798 /**
799  * Stores information about the peer which is closest to destination_finger_value.
800  * 'closest' can be either successor or predecessor depending on is_predecessor
801  * flag.
802  */
803 struct Closest_Peer
804 {
805   /**
806    * Destination finger value.
807    */
808   uint64_t destination_finger_value;
809
810   /**
811    * Is finger_value a predecessor or any other finger.
812    */
813   unsigned int is_predecessor;
814
815   /**
816    * Trail id to reach to peer.
817    * In case peer is my identity or friend, it is set to 0.
818    */
819   struct GNUNET_HashCode trail_id;
820
821   /**
822    * Next destination. In case of friend and my_identity , it is same as next_hop
823    * In case of finger it is finger identity.
824    */
825   struct GNUNET_PeerIdentity best_known_destination;
826
827   /**
828    * In case best_known_destination is a finger, then first friend in the trail
829    * to reach to it. In other case, same as best_known_destination.
830    */
831   struct GNUNET_PeerIdentity next_hop;
832
833   /**
834    * In case finger is the next hop, it contains a valid finger table index
835    * at which the finger is stored. Else, It contains 65, which is out of range
836    * of finger table index.
837    */
838   unsigned int finger_table_index;
839 };
840
841 /**
842  * Context for send_verify_successor_task.
843  */
844 struct VerifySuccessorContext
845 {
846   /**
847    * Number of times this has been scheduled.
848    */
849   unsigned int num_retries_scheduled;
850 };
851
852 /**
853  * Task that sends FIND FINGER TRAIL requests. This task is started when we have
854  * get our first friend.
855  */
856 static struct GNUNET_SCHEDULER_Task * find_finger_trail_task;
857
858 /**
859  * Task that sends verify successor message. This task is started when we get
860  * our successor for the first time.
861  */
862 static struct GNUNET_SCHEDULER_Task * send_verify_successor_task;
863
864 /**
865  * Task that sends verify successor message. This task is started when we get
866  * our successor for the first time.
867  */
868 static struct GNUNET_SCHEDULER_Task * send_verify_successor_retry_task;
869
870 /**
871  * Task that sends verify successor message. This task is started when we get
872  * our successor for the first time.
873  */
874 static struct GNUNET_SCHEDULER_Task * send_notify_new_successor_retry_task;
875
876 /**
877  * Identity of this peer.
878  */
879 static struct GNUNET_PeerIdentity my_identity;
880
881 /**
882  * Peer map of all the friends of a peer
883  */
884 static struct GNUNET_CONTAINER_MultiPeerMap *friend_peermap;
885
886 /**
887  * Array of all the fingers.
888  */
889 static struct FingerInfo finger_table [MAX_FINGERS];
890
891 /**
892  * Handle to CORE.
893  */
894 static struct GNUNET_CORE_Handle *core_api;
895
896 /**
897  * Handle for the statistics service.
898  */
899 //extern struct GNUNET_STATISTICS_Handle *GDS_stats;
900
901 /**
902  * The current finger index that we have want to find trail to. We start the
903  * search with value = 0, i.e. successor  and then go to PREDCESSOR_FINGER_ID
904  * and decrement it. For any index 63 <= index < 0, if finger is same as successor,
905  * we reset this index to 0.
906  */
907 static unsigned int current_search_finger_index;
908
909 /**
910  * Time duration to schedule find finger trail task.
911  */
912 static struct GNUNET_TIME_Relative find_finger_trail_task_next_send_time;
913
914 /**
915  * Time duration to schedule verify successor task.
916  */
917 static struct GNUNET_TIME_Relative verify_successor_next_send_time;
918
919 /**
920  * Time duration to send verify successor again, if result was not received in time.
921  */
922 static struct GNUNET_TIME_Relative verify_successor_retry_time;
923
924 /**
925  * Time duration to retry send_notify_successor.
926  */
927 static struct GNUNET_TIME_Relative notify_successor_retry_time;
928
929 /**
930  * Are we waiting for confirmation from our new successor that it got the
931  * message
932  */
933 //static unsigned int waiting_for_notify_confirmation;
934
935 /* Below variables are used only for testing, and statistics collection. */
936 /**
937  * Should we store our topology predecessor and successor IDs into statistics?
938  */
939 unsigned int track_topology;
940
941 /**
942  * Should I be a malicious peer and drop the PUT/GET packets?
943  * if 0 then NOT malicious.
944  */
945 unsigned int act_malicious;
946
947 /**
948  * Count of fingers found. Ideally we should have O(logn) fingers for a
949  * stable network.
950  */
951 static unsigned int total_fingers_found;
952
953 /**
954  * Number of times we found the same successor.
955  */
956 static unsigned int successor_times;
957
958 /**
959  * Number of rounds for which we should search for finger.
960  */
961 static unsigned int fingers_round_count;
962 /**
963  * Called when core is ready to send a message we asked for
964  * out to the destination.
965  *
966  * @param cls the 'struct FriendInfo' of the target friend
967  * @param size number of bytes available in buf
968  * @param buf where the callee should write the message
969  * @return number of bytes written to buf
970  */
971 static size_t
972 core_transmit_notify (void *cls, size_t size, void *buf)
973 {
974   struct FriendInfo *peer = cls;
975   char *cbuf = buf;
976   struct P2PPendingMessage *pending;
977   size_t off;
978   size_t msize;
979
980   peer->th = NULL;
981   while ( (NULL != (pending = peer->head)) &&
982           (0 == GNUNET_TIME_absolute_get_remaining (pending->timeout).rel_value_us) )
983   {
984     GNUNET_STATISTICS_update (GDS_stats,
985                               gettext_noop
986                               ("# Messages dropped (CORE timeout)"),
987                               1,
988                               GNUNET_NO);
989     peer->pending_count--;
990     GNUNET_CONTAINER_DLL_remove (peer->head,
991                                  peer->tail,
992                                  pending);
993     GNUNET_free (pending);
994   }
995   if (NULL == pending)
996   {
997     /* no messages pending */
998     return 0;
999   }
1000   if (NULL == buf)
1001   {
1002     peer->th =
1003         GNUNET_CORE_notify_transmit_ready (core_api, GNUNET_NO,
1004                                            GNUNET_CORE_PRIO_BEST_EFFORT,
1005                                            GNUNET_TIME_absolute_get_remaining
1006                                            (pending->timeout), &peer->id,
1007                                            ntohs (pending->msg->size),
1008                                            &core_transmit_notify, peer);
1009     GNUNET_break (NULL != peer->th);
1010     return 0;
1011   }
1012   off = 0;
1013   while ((NULL != (pending = peer->head)) &&
1014          (size - off >= (msize = ntohs (pending->msg->size))))
1015   {
1016     GNUNET_STATISTICS_update (GDS_stats,
1017                               gettext_noop
1018                               ("# Bytes transmitted to other peers"),
1019                               msize,
1020                               GNUNET_NO);
1021     memcpy (&cbuf[off], pending->msg, msize);
1022     off += msize;
1023     peer->pending_count--;
1024     GNUNET_CONTAINER_DLL_remove (peer->head, peer->tail, pending);
1025     GNUNET_free (pending);
1026   }
1027   if (peer->head != NULL)
1028   {
1029     peer->th =
1030         GNUNET_CORE_notify_transmit_ready (core_api, GNUNET_NO,
1031                                            GNUNET_CORE_PRIO_BEST_EFFORT,
1032                                            GNUNET_TIME_absolute_get_remaining
1033                                            (pending->timeout), &peer->id, msize,
1034                                            &core_transmit_notify, peer);
1035     GNUNET_break (NULL != peer->th);
1036   }
1037   return off;
1038 }
1039
1040
1041 /**
1042  * Transmit all messages in the friend's message queue.
1043  *
1044  * @param peer message queue to process
1045  */
1046 static void
1047 process_friend_queue (struct FriendInfo *peer)
1048 {
1049   struct P2PPendingMessage *pending;
1050
1051   if (NULL == (pending = peer->head))
1052   {
1053     return;
1054   }
1055   if (NULL != peer->th)
1056   {
1057     return;
1058   }
1059
1060   peer->th =
1061       GNUNET_CORE_notify_transmit_ready (core_api, GNUNET_NO,
1062                                          pending->importance,
1063                                          GNUNET_TIME_absolute_get_remaining
1064                                          (pending->timeout), &peer->id,
1065                                          ntohs (pending->msg->size),
1066                                          &core_transmit_notify, peer);
1067   GNUNET_break (NULL != peer->th);
1068 }
1069
1070
1071 #if ENABLE_MALICIOUS
1072 /**
1073  * Set the ENABLE_MALICIOUS value to malicious.
1074  * @param malicious
1075  */
1076 int
1077 GDS_NEIGHBOURS_act_malicious (unsigned int malicious)
1078 {
1079   act_malicious = malicious;
1080   return GNUNET_OK;
1081 }
1082 #endif
1083
1084 /**
1085  * Construct a trail setup message and forward it to target_friend
1086  * @param source_peer Peer which wants to setup the trail
1087  * @param ultimate_destination_finger_value Peer identity closest to this value
1088  *                                          will be finger to @a source_peer
1089  * @param best_known_destination Best known destination (could be finger or friend)
1090  *                               which should get this message. In case it is
1091  *                               friend, then it is same as target_friend
1092  * @param target_friend Friend to which message is forwarded now.
1093  * @param trail_length Total number of peers in trail setup so far.
1094  * @param trail_peer_list Trail setup so far
1095  * @param is_predecessor Is @a source_peer looking for trail to a predecessor or not.
1096  * @param trail_id Unique identifier for the trail we are trying to setup.
1097  * @param intermediate_trail_id Trail id of intermediate trail to reach to
1098  *                              best_known_destination when its a finger. If not
1099  *                              used then set to 0.
1100  */
1101 void
1102 GDS_NEIGHBOURS_send_trail_setup (struct GNUNET_PeerIdentity source_peer,
1103                                  uint64_t ultimate_destination_finger_value,
1104                                  struct GNUNET_PeerIdentity best_known_destination,
1105                                  struct FriendInfo *target_friend,
1106                                  unsigned int trail_length,
1107                                  const struct GNUNET_PeerIdentity *trail_peer_list,
1108                                  unsigned int is_predecessor,
1109                                  struct GNUNET_HashCode trail_id,
1110                                  struct GNUNET_HashCode intermediate_trail_id)
1111 {
1112   struct P2PPendingMessage *pending;
1113   struct PeerTrailSetupMessage *tsm;
1114   struct GNUNET_PeerIdentity *peer_list;
1115   size_t msize;
1116
1117   msize = sizeof (struct PeerTrailSetupMessage) +
1118           (trail_length * sizeof (struct GNUNET_PeerIdentity));
1119
1120   if (msize >= GNUNET_CONSTANTS_MAX_ENCRYPTED_MESSAGE_SIZE)
1121   {
1122     GNUNET_break (0);
1123     return;
1124   }
1125
1126   if (target_friend->pending_count >= MAXIMUM_PENDING_PER_FRIEND)
1127   {
1128     GNUNET_STATISTICS_update (GDS_stats, gettext_noop ("# P2P messages dropped due to full queue"),
1129                                 1, GNUNET_NO);
1130   }
1131   pending = GNUNET_malloc (sizeof (struct P2PPendingMessage) + msize);
1132   pending->timeout = GNUNET_TIME_relative_to_absolute (PENDING_MESSAGE_TIMEOUT);
1133   tsm = (struct PeerTrailSetupMessage *) &pending[1];
1134   pending->msg = &(tsm->header);
1135   tsm->header.size = htons (msize);
1136   tsm->header.type = htons (GNUNET_MESSAGE_TYPE_XDHT_P2P_TRAIL_SETUP);
1137   tsm->final_destination_finger_value = GNUNET_htonll (ultimate_destination_finger_value);
1138   tsm->source_peer = source_peer;
1139   tsm->best_known_destination = best_known_destination;
1140   tsm->is_predecessor = htonl (is_predecessor);
1141   tsm->trail_id = trail_id;
1142   tsm->intermediate_trail_id = intermediate_trail_id;
1143
1144   if (trail_length > 0)
1145   {
1146     peer_list = (struct GNUNET_PeerIdentity *) &tsm[1];
1147     memcpy (peer_list, trail_peer_list, trail_length * sizeof(struct GNUNET_PeerIdentity));
1148   }
1149
1150   GNUNET_CONTAINER_DLL_insert_tail (target_friend->head, target_friend->tail, pending);
1151   target_friend->pending_count++;
1152   process_friend_queue (target_friend);
1153 }
1154
1155
1156 /**
1157  * Construct a trail setup result message and forward it to target friend.
1158  * @param querying_peer Peer which sent the trail setup request and should get
1159  *                      the result back.
1160  * @param Finger Peer to which the trail has been setup to.
1161  * @param target_friend Friend to which this message should be forwarded.
1162  * @param trail_length Numbers of peers in the trail.
1163  * @param trail_peer_list Peers which are part of the trail from
1164  *                        querying_peer to Finger, NOT including them.
1165  * @param is_predecessor Is @a Finger predecessor to @a querying_peer ?
1166  * @param ultimate_destination_finger_value Value to which @a finger is the closest
1167  *                                          peer.
1168  * @param trail_id Unique identifier of the trail.
1169  */
1170 void
1171 GDS_NEIGHBOURS_send_trail_setup_result (struct GNUNET_PeerIdentity querying_peer,
1172                                         struct GNUNET_PeerIdentity finger,
1173                                         struct FriendInfo *target_friend,
1174                                         unsigned int trail_length,
1175                                         const struct GNUNET_PeerIdentity *trail_peer_list,
1176                                         unsigned int is_predecessor,
1177                                         uint64_t ultimate_destination_finger_value,
1178                                         struct GNUNET_HashCode trail_id)
1179 {
1180   struct P2PPendingMessage *pending;
1181   struct PeerTrailSetupResultMessage *tsrm;
1182   struct GNUNET_PeerIdentity *peer_list;
1183   size_t msize;
1184
1185   msize = sizeof (struct PeerTrailSetupResultMessage) +
1186           (trail_length * sizeof (struct GNUNET_PeerIdentity));
1187
1188   if (msize >= GNUNET_CONSTANTS_MAX_ENCRYPTED_MESSAGE_SIZE)
1189   {
1190     GNUNET_break (0);
1191     return;
1192   }
1193
1194   if (target_friend->pending_count >= MAXIMUM_PENDING_PER_FRIEND)
1195   {
1196     GNUNET_STATISTICS_update (GDS_stats,
1197                               gettext_noop ("# P2P messages dropped due to full queue"),
1198                               1, GNUNET_NO);
1199   }
1200
1201   pending = GNUNET_malloc (sizeof (struct P2PPendingMessage) + msize);
1202   pending->importance = 0;
1203   pending->timeout = GNUNET_TIME_relative_to_absolute (PENDING_MESSAGE_TIMEOUT);
1204   tsrm = (struct PeerTrailSetupResultMessage *) &pending[1];
1205   pending->msg = &tsrm->header;
1206   tsrm->header.size = htons (msize);
1207   tsrm->header.type = htons (GNUNET_MESSAGE_TYPE_XDHT_P2P_TRAIL_SETUP_RESULT);
1208   tsrm->querying_peer = querying_peer;
1209   tsrm->finger_identity = finger;
1210   tsrm->is_predecessor = htonl (is_predecessor);
1211   tsrm->trail_id = trail_id;
1212   tsrm->ulitmate_destination_finger_value =
1213           GNUNET_htonll (ultimate_destination_finger_value);
1214   peer_list = (struct GNUNET_PeerIdentity *) &tsrm[1];
1215   memcpy (peer_list, trail_peer_list, trail_length * sizeof (struct GNUNET_PeerIdentity));
1216
1217   /* Send the message to chosen friend. */
1218   GNUNET_CONTAINER_DLL_insert_tail (target_friend->head, target_friend->tail, pending);
1219   target_friend->pending_count++;
1220   process_friend_queue (target_friend);
1221 }
1222
1223 /**
1224  * Send notify successor confirmation message.
1225  * @param trail_id Unique Identifier of the trail.
1226  * @param trail_direction Destination to Source.
1227  * @param target_friend Friend to get this message next.
1228  */
1229 void
1230 GDS_NEIGHBOURS_send_notify_succcessor_confirmation (struct GNUNET_HashCode trail_id,
1231                                                     unsigned int trail_direction,
1232                                                      struct FriendInfo *target_friend)
1233 {
1234   struct PeerNotifyConfirmationMessage *ncm;
1235   struct P2PPendingMessage *pending;
1236   size_t msize;
1237
1238   msize = sizeof (struct PeerNotifyConfirmationMessage);
1239   if (msize >= GNUNET_CONSTANTS_MAX_ENCRYPTED_MESSAGE_SIZE)
1240   {
1241     GNUNET_break (0);
1242     return;
1243   }
1244
1245   if (target_friend->pending_count >= MAXIMUM_PENDING_PER_FRIEND)
1246   {
1247     GNUNET_STATISTICS_update (GDS_stats, gettext_noop ("# P2P messages dropped due to full queue"),
1248                                 1, GNUNET_NO);
1249   }
1250
1251   pending = GNUNET_malloc (sizeof (struct P2PPendingMessage) + msize);
1252   pending->importance = 0;    /* FIXME */
1253   pending->timeout = GNUNET_TIME_relative_to_absolute (PENDING_MESSAGE_TIMEOUT);
1254   ncm = (struct PeerNotifyConfirmationMessage *) &pending[1];
1255   pending->msg = &ncm->header;
1256   ncm->header.size = htons (msize);
1257   ncm->header.type = htons (GNUNET_MESSAGE_TYPE_XDHT_P2P_NOTIFY_SUCCESSOR_CONFIRMATION);
1258   ncm->trail_id = trail_id;
1259   ncm->trail_direction = htonl (trail_direction);
1260
1261   /* Send the message to chosen friend. */
1262   GNUNET_CONTAINER_DLL_insert_tail (target_friend->head, target_friend->tail, pending);
1263   target_friend->pending_count++;
1264   process_friend_queue (target_friend);
1265 }
1266
1267
1268 /**
1269  * Send trail rejection message to target friend
1270  * @param source_peer Peer which is trying to setup the trail.
1271  * @param ultimate_destination_finger_value Peer closest to this value will be
1272  *                                          @a source_peer's finger
1273  * @param congested_peer Peer which sent this message as it is congested.
1274  * @param is_predecessor Is source_peer looking for trail to a predecessor or not.
1275  * @param trail_peer_list Trails seen so far in trail setup before getting rejected
1276  *                        by congested_peer. This does NOT include @a source_peer
1277  *                        and congested_peer.
1278  * @param trail_length Total number of peers in trail_peer_list, NOT including
1279  *                     @a source_peer and @a congested_peer
1280  * @param trail_id Unique identifier of this trail.
1281  * @param congestion_timeout Duration given by congested peer as an estimate of
1282  *                           how long it may remain congested.
1283  */
1284 void
1285 GDS_NEIGHBOURS_send_trail_rejection (struct GNUNET_PeerIdentity source_peer,
1286                                      uint64_t ultimate_destination_finger_value,
1287                                      struct GNUNET_PeerIdentity congested_peer,
1288                                      unsigned int is_predecessor,
1289                                      const struct GNUNET_PeerIdentity *trail_peer_list,
1290                                      unsigned int trail_length,
1291                                      struct GNUNET_HashCode trail_id,
1292                                      struct FriendInfo *target_friend,
1293                                      const struct GNUNET_TIME_Relative congestion_timeout)
1294 {
1295   struct PeerTrailRejectionMessage *trm;
1296   struct P2PPendingMessage *pending;
1297   struct GNUNET_PeerIdentity *peer_list;
1298   size_t msize;
1299
1300   msize = sizeof (struct PeerTrailRejectionMessage) +
1301           (trail_length * sizeof (struct GNUNET_PeerIdentity));
1302
1303   if (msize >= GNUNET_CONSTANTS_MAX_ENCRYPTED_MESSAGE_SIZE)
1304   {
1305     GNUNET_break (0);
1306     return;
1307   }
1308
1309   if (target_friend->pending_count >= MAXIMUM_PENDING_PER_FRIEND)
1310   {
1311     GNUNET_STATISTICS_update (GDS_stats, gettext_noop ("# P2P messages dropped due to full queue"),
1312                                 1, GNUNET_NO);
1313   }
1314
1315   pending = GNUNET_malloc (sizeof (struct P2PPendingMessage) + msize);
1316   pending->importance = 0;
1317   pending->timeout = GNUNET_TIME_relative_to_absolute (PENDING_MESSAGE_TIMEOUT);
1318   trm = (struct PeerTrailRejectionMessage *)&pending[1];
1319   pending->msg = &trm->header;
1320   trm->header.size = htons (msize);
1321   trm->header.type = htons (GNUNET_MESSAGE_TYPE_XDHT_P2P_TRAIL_SETUP_REJECTION);
1322   trm->source_peer = source_peer;
1323   trm->congested_peer = congested_peer;
1324   trm->congestion_time = congestion_timeout;
1325   trm->is_predecessor = htonl (is_predecessor);
1326   trm->trail_id = trail_id;
1327   trm->ultimate_destination_finger_value =
1328           GNUNET_htonll (ultimate_destination_finger_value);
1329
1330   peer_list = (struct GNUNET_PeerIdentity *) &trm[1];
1331   if (trail_length > 0)
1332   {
1333     memcpy (peer_list, trail_peer_list, trail_length * sizeof (struct GNUNET_PeerIdentity));
1334   }
1335
1336   /* Send the message to chosen friend. */
1337   GNUNET_CONTAINER_DLL_insert_tail (target_friend->head, target_friend->tail, pending);
1338   target_friend->pending_count++;
1339   process_friend_queue (target_friend);
1340 }
1341
1342
1343 /**
1344  * Construct a verify successor message and forward it to target_friend.
1345  * @param source_peer Peer which wants to verify its successor.
1346  * @param successor Peer which is @a source_peer's current successor.
1347  * @param trail_id Unique Identifier of trail from @a source_peer to @a successor,
1348  *                 NOT including them.
1349  * @param trail List of peers which are part of trail to reach from @a source_peer
1350  *              to @a successor, NOT including them.
1351  * @param trail_length Total number of peers in @a trail.
1352  * @param target_friend Next friend to get this message.
1353  */
1354 void
1355 GDS_NEIGHBOURS_send_verify_successor_message (struct GNUNET_PeerIdentity source_peer,
1356                                               struct GNUNET_PeerIdentity successor,
1357                                               struct GNUNET_HashCode trail_id,
1358                                               struct GNUNET_PeerIdentity *trail,
1359                                               unsigned int trail_length,
1360                                               struct FriendInfo *target_friend)
1361 {
1362   struct PeerVerifySuccessorMessage *vsm;
1363   struct P2PPendingMessage *pending;
1364   struct GNUNET_PeerIdentity *peer_list;
1365   size_t msize;
1366
1367   msize = sizeof (struct PeerVerifySuccessorMessage) +
1368          (trail_length * sizeof (struct GNUNET_PeerIdentity));
1369
1370   if (msize >= GNUNET_CONSTANTS_MAX_ENCRYPTED_MESSAGE_SIZE)
1371   {
1372     GNUNET_break (0);
1373     return;
1374   }
1375
1376   if (target_friend->pending_count >= MAXIMUM_PENDING_PER_FRIEND)
1377   {
1378     GNUNET_STATISTICS_update (GDS_stats, gettext_noop ("# P2P messages dropped due to full queue"),
1379                                 1, GNUNET_NO);
1380   }
1381
1382   pending = GNUNET_malloc (sizeof (struct P2PPendingMessage) + msize);
1383   pending->importance = 0;    /* FIXME */
1384   pending->timeout = GNUNET_TIME_relative_to_absolute (PENDING_MESSAGE_TIMEOUT);
1385   vsm = (struct PeerVerifySuccessorMessage *) &pending[1];
1386   pending->msg = &vsm->header;
1387   vsm->header.size = htons (msize);
1388   vsm->header.type = htons (GNUNET_MESSAGE_TYPE_XDHT_P2P_VERIFY_SUCCESSOR);
1389   vsm->source_peer = source_peer;
1390   vsm->successor = successor;
1391   vsm->trail_id = trail_id;
1392   peer_list = (struct GNUNET_PeerIdentity *) &vsm[1];
1393   memcpy (peer_list, trail, trail_length * sizeof (struct GNUNET_PeerIdentity));
1394
1395   /* Send the message to chosen friend. */
1396   GNUNET_CONTAINER_DLL_insert_tail (target_friend->head, target_friend->tail, pending);
1397   target_friend->pending_count++;
1398   process_friend_queue (target_friend);
1399 }
1400
1401
1402 /**
1403  * FIXME: In every function we pass target friend except for this one.
1404  * so, either change everything or this one. also, should se just store
1405  * the pointer to friend in routing table rather than gnunet_peeridentity.
1406  * if yes then we should keep friend info in.h  andmake lot of changes.
1407  * Construct a trail teardown message and forward it to target friend.
1408  *
1409  * @param trail_id Unique identifier of the trail.
1410  * @param trail_direction Direction of trail.
1411  * @param target_friend Friend to get this message.
1412  */
1413 void
1414 GDS_NEIGHBOURS_send_trail_teardown (const struct GNUNET_HashCode *trail_id,
1415                                     unsigned int trail_direction,
1416                                     const struct GNUNET_PeerIdentity *peer)
1417 {
1418   struct PeerTrailTearDownMessage *ttdm;
1419   struct P2PPendingMessage *pending;
1420   struct FriendInfo *target_friend;
1421   size_t msize;
1422
1423   msize = sizeof (struct PeerTrailTearDownMessage);
1424   if (msize >= GNUNET_CONSTANTS_MAX_ENCRYPTED_MESSAGE_SIZE)
1425   {
1426     GNUNET_break (0);
1427     return;
1428   }
1429
1430   if (NULL == (target_friend =
1431                GNUNET_CONTAINER_multipeermap_get (friend_peermap, peer)))
1432   {
1433     /* FIXME: In what case friend can be null. ?*/
1434     GNUNET_break (0);
1435     return;
1436   }
1437
1438   if (target_friend->pending_count >= MAXIMUM_PENDING_PER_FRIEND)
1439   {
1440     GNUNET_STATISTICS_update (GDS_stats, gettext_noop ("# P2P messages dropped due to full queue"),
1441                                 1, GNUNET_NO);
1442   }
1443
1444   pending = GNUNET_malloc (sizeof (struct P2PPendingMessage) + msize);
1445   pending->importance = 0;    /* FIXME */
1446   pending->timeout = GNUNET_TIME_relative_to_absolute (PENDING_MESSAGE_TIMEOUT);
1447   ttdm = (struct PeerTrailTearDownMessage *) &pending[1];
1448   pending->msg = &ttdm->header;
1449   ttdm->header.size = htons (msize);
1450   ttdm->header.type = htons (GNUNET_MESSAGE_TYPE_XDHT_P2P_TRAIL_TEARDOWN);
1451   ttdm->trail_id = *trail_id;
1452   ttdm->trail_direction = htonl (trail_direction);
1453
1454   /* Send the message to chosen friend. */
1455   GNUNET_CONTAINER_DLL_insert_tail (target_friend->head, target_friend->tail, pending);
1456   target_friend->pending_count++;
1457   process_friend_queue (target_friend);
1458 }
1459
1460
1461 /**
1462  * Construct a verify successor result message and send it to target_friend
1463  * @param querying_peer Peer which sent the verify successor message.
1464  * @param source_successor Current_successor of @a querying_peer.
1465  * @param current_predecessor Current predecessor of @a successor. Could be same
1466  *                            or different from @a querying_peer.
1467  * @param trail_id Unique identifier of the trail from @a querying_peer to
1468  *                 @a successor, NOT including them.
1469  * @param trail List of peers which are part of trail from @a querying_peer to
1470  *                 @a successor, NOT including them.
1471  * @param trail_length Total number of peers in @a trail
1472  * @param trail_direction Direction in which we are sending the message. In this
1473  *                        case we are sending result from @a successor to @a querying_peer.
1474  * @param target_friend Next friend to get this message.
1475  */
1476 void
1477 GDS_NEIGHBOURS_send_verify_successor_result (struct GNUNET_PeerIdentity querying_peer,
1478                                              struct GNUNET_PeerIdentity current_successor,
1479                                              struct GNUNET_PeerIdentity probable_successor,
1480                                              struct GNUNET_HashCode trail_id,
1481                                              const struct GNUNET_PeerIdentity *trail,
1482                                              unsigned int trail_length,
1483                                              enum GDS_ROUTING_trail_direction trail_direction,
1484                                              struct FriendInfo *target_friend)
1485 {
1486   struct PeerVerifySuccessorResultMessage *vsmr;
1487   struct P2PPendingMessage *pending;
1488   struct GNUNET_PeerIdentity *peer_list;
1489   size_t msize;
1490
1491   msize = sizeof (struct PeerVerifySuccessorResultMessage) +
1492           (trail_length * sizeof(struct GNUNET_PeerIdentity));
1493
1494   if (msize >= GNUNET_CONSTANTS_MAX_ENCRYPTED_MESSAGE_SIZE)
1495   {
1496     GNUNET_break (0);
1497     return;
1498   }
1499
1500   if (target_friend->pending_count >= MAXIMUM_PENDING_PER_FRIEND)
1501   {
1502     GNUNET_STATISTICS_update (GDS_stats, gettext_noop ("# P2P messages dropped due to full queue"),
1503                                 1, GNUNET_NO);
1504   }
1505
1506   pending = GNUNET_malloc (sizeof (struct P2PPendingMessage) + msize);
1507   pending->importance = 0;    /* FIXME */
1508   pending->timeout = GNUNET_TIME_relative_to_absolute (PENDING_MESSAGE_TIMEOUT);
1509   vsmr = (struct PeerVerifySuccessorResultMessage *) &pending[1];
1510   pending->msg = &vsmr->header;
1511   vsmr->header.size = htons (msize);
1512   vsmr->header.type = htons (GNUNET_MESSAGE_TYPE_XDHT_P2P_VERIFY_SUCCESSOR_RESULT);
1513   vsmr->querying_peer = querying_peer;
1514   vsmr->current_successor = current_successor;
1515   vsmr->probable_successor = probable_successor;
1516   vsmr->trail_direction = htonl (trail_direction);
1517   vsmr->trail_id = trail_id;
1518   peer_list = (struct GNUNET_PeerIdentity *) &vsmr[1];
1519   memcpy (peer_list, trail, trail_length * sizeof (struct GNUNET_PeerIdentity));
1520
1521    /* Send the message to chosen friend. */
1522   GNUNET_CONTAINER_DLL_insert_tail (target_friend->head, target_friend->tail, pending);
1523   target_friend->pending_count++;
1524   process_friend_queue (target_friend);
1525 }
1526
1527
1528 /**
1529  * Construct a notify new successor message and send it to target_friend
1530  * @param source_peer Peer which wants to notify to its new successor that it
1531  *                    could be its predecessor.
1532  * @param successor New successor of @a source_peer
1533  * @param successor_trail List of peers in Trail to reach from
1534  *                            @a source_peer to @a new_successor, NOT including
1535  *                            the endpoints.
1536  * @param successor_trail_length Total number of peers in @a new_successor_trail.
1537  * @param successor_trail_id Unique identifier of @a new_successor_trail.
1538  * @param target_friend Next friend to get this message.
1539  */
1540 void
1541 GDS_NEIGHBOURS_send_notify_new_successor (struct GNUNET_PeerIdentity source_peer,
1542                                           struct GNUNET_PeerIdentity successor,
1543                                           const struct GNUNET_PeerIdentity *successor_trail,
1544                                           unsigned int successor_trail_length,
1545                                           struct GNUNET_HashCode succesor_trail_id,
1546                                           struct FriendInfo *target_friend)
1547 {
1548   struct PeerNotifyNewSuccessorMessage *nsm;
1549   struct P2PPendingMessage *pending;
1550   struct GNUNET_PeerIdentity *peer_list;
1551   size_t msize;
1552
1553   msize = sizeof (struct PeerNotifyNewSuccessorMessage) +
1554           (successor_trail_length * sizeof(struct GNUNET_PeerIdentity));
1555
1556   if (msize >= GNUNET_CONSTANTS_MAX_ENCRYPTED_MESSAGE_SIZE)
1557   {
1558     GNUNET_break (0);
1559     return;
1560   }
1561
1562   if (target_friend->pending_count >= MAXIMUM_PENDING_PER_FRIEND)
1563   {
1564     GNUNET_STATISTICS_update (GDS_stats, gettext_noop ("# P2P messages dropped due to full queue"),
1565                                 1, GNUNET_NO);
1566   }
1567
1568   pending = GNUNET_malloc (sizeof (struct P2PPendingMessage) + msize);
1569   pending->importance = 0;    /* FIXME */
1570   pending->timeout = GNUNET_TIME_relative_to_absolute (PENDING_MESSAGE_TIMEOUT);
1571   nsm = (struct PeerNotifyNewSuccessorMessage *) &pending[1];
1572   pending->msg = &nsm->header;
1573   nsm->header.size = htons (msize);
1574   nsm->header.type = htons (GNUNET_MESSAGE_TYPE_XDHT_P2P_NOTIFY_NEW_SUCCESSOR);
1575   nsm->new_successor = successor;
1576   nsm->source_peer = source_peer;
1577   nsm->trail_id = succesor_trail_id;
1578   peer_list = (struct GNUNET_PeerIdentity *) &nsm[1];
1579   memcpy (peer_list, successor_trail,
1580           successor_trail_length * sizeof (struct GNUNET_PeerIdentity));
1581
1582    /* Send the message to chosen friend. */
1583   GNUNET_CONTAINER_DLL_insert_tail (target_friend->head, target_friend->tail, pending);
1584   target_friend->pending_count++;
1585   process_friend_queue (target_friend);
1586 }
1587
1588
1589 /**
1590  * Construct an add_trail message and send it to target_friend
1591  * @param source_peer Source of the trail.
1592  * @param destination_peer Destination of the trail.
1593  * @param trail_id Unique identifier of the trail from
1594  *                 @a source_peer to @a destination_peer, NOT including the endpoints.
1595  * @param trail List of peers in Trail from @a source_peer to @a destination_peer,
1596  *              NOT including the endpoints.
1597  * @param trail_length Total number of peers in @a trail.
1598  * @param target_friend Next friend to get this message.
1599  */
1600 void
1601 GDS_NEIGHBOURS_send_add_trail (struct GNUNET_PeerIdentity source_peer,
1602                                struct GNUNET_PeerIdentity destination_peer,
1603                                struct GNUNET_HashCode trail_id,
1604                                const struct GNUNET_PeerIdentity *trail,
1605                                unsigned int trail_length,
1606                                struct FriendInfo *target_friend)
1607 {
1608   struct PeerAddTrailMessage *adm;
1609   struct GNUNET_PeerIdentity *peer_list;
1610   struct P2PPendingMessage *pending;
1611   size_t msize;
1612
1613   msize = sizeof (struct PeerAddTrailMessage) +
1614           (trail_length * sizeof(struct GNUNET_PeerIdentity));
1615
1616   if (msize >= GNUNET_CONSTANTS_MAX_ENCRYPTED_MESSAGE_SIZE)
1617   {
1618     GNUNET_break (0);
1619     return;
1620   }
1621
1622   if (target_friend->pending_count >= MAXIMUM_PENDING_PER_FRIEND)
1623   {
1624     GNUNET_STATISTICS_update (GDS_stats, gettext_noop ("# P2P messages dropped due to full queue"),
1625                                 1, GNUNET_NO);
1626   }
1627
1628   pending = GNUNET_malloc (sizeof (struct P2PPendingMessage) + msize);
1629   pending->importance = 0;    /* FIXME */
1630   pending->timeout = GNUNET_TIME_relative_to_absolute (PENDING_MESSAGE_TIMEOUT);
1631   adm = (struct PeerAddTrailMessage *) &pending[1];
1632   pending->msg = &adm->header;
1633   adm->header.size = htons (msize);
1634   adm->header.type = htons (GNUNET_MESSAGE_TYPE_XDHT_P2P_ADD_TRAIL);
1635   adm->source_peer = source_peer;
1636   adm->destination_peer = destination_peer;
1637   adm->trail_id = trail_id;
1638   peer_list = (struct GNUNET_PeerIdentity *)&adm[1];
1639   memcpy (peer_list, trail, sizeof (struct GNUNET_PeerIdentity) * trail_length);
1640
1641   /* Send the message to chosen friend. */
1642   GNUNET_CONTAINER_DLL_insert_tail (target_friend->head, target_friend->tail, pending);
1643   target_friend->pending_count++;
1644   process_friend_queue (target_friend);
1645
1646 }
1647
1648
1649 /**
1650  * Search my location in trail. In case I am present more than once in the
1651  * trail (can happen during trail setup), then return my lowest index.
1652  * @param trail List of peers
1653  * @return my_index if found
1654  *         trail_length + 1 if an entry is present twice, It is an error.
1655  *         -1 if no entry found.
1656  */
1657 static int
1658 search_my_index (const struct GNUNET_PeerIdentity *trail,
1659                  int trail_length)
1660 {
1661   int i;
1662   int index_seen = trail_length + 1;
1663   int flag = 0;
1664
1665   for (i = 0; i < trail_length; i++)
1666   {
1667     if (0 == GNUNET_CRYPTO_cmp_peer_identity (&my_identity, &trail[i]))
1668     {
1669       flag = 1;
1670       if(index_seen == (trail_length + 1))
1671         index_seen = i;
1672       else
1673       {
1674         DEBUG("Entry is present twice in trail. Its not allowed\n");
1675       }
1676       break;
1677     }
1678   }
1679
1680   if (1 == flag)
1681     return index_seen;
1682   else
1683     return -1;
1684 }
1685
1686
1687 /**
1688  * Check if the friend is congested or have reached maximum number of trails
1689  * it can be part of of.
1690  * @param friend Friend to be checked.
1691  * @return #GNUNET_NO if friend is not congested or have not crossed threshold.
1692  *         #GNUNET_YES if friend is either congested or have crossed threshold
1693  */
1694 static int
1695 is_friend_congested (struct FriendInfo *friend)
1696 {
1697   if (( friend->trails_count < TRAILS_THROUGH_FRIEND_THRESHOLD) &&
1698       ((0 == GNUNET_TIME_absolute_get_remaining
1699              (friend->congestion_timestamp).rel_value_us)))
1700     return GNUNET_NO;
1701   else
1702     return GNUNET_YES;
1703 }
1704
1705
1706 /**
1707  * Select closest finger to value.
1708  * @param peer1 First peer
1709  * @param peer2 Second peer
1710  * @param value Value to be compare
1711  * @return Closest peer
1712  */
1713 static struct GNUNET_PeerIdentity
1714 select_closest_finger (const struct GNUNET_PeerIdentity *peer1,
1715                        const struct GNUNET_PeerIdentity *peer2,
1716                        uint64_t value)
1717 {
1718   uint64_t peer1_value;
1719   uint64_t peer2_value;
1720
1721   memcpy (&peer1_value, peer1, sizeof (uint64_t));
1722   memcpy (&peer2_value, peer2, sizeof (uint64_t));
1723   peer1_value = GNUNET_ntohll (peer1_value);
1724   peer2_value = GNUNET_ntohll (peer2_value);
1725
1726   if (peer1_value == value)
1727   {
1728     return *peer1;
1729   }
1730
1731   if (peer2_value == value)
1732   {
1733     return *peer2;
1734   }
1735
1736   if (value < peer1_value && peer1_value < peer2_value)
1737   {
1738     return *peer1;
1739   }
1740   else if (value < peer2_value && peer2_value < peer1_value)
1741   {
1742     return *peer2;
1743   }
1744   else if (peer1_value < value && value < peer2_value)
1745   {
1746     return *peer2;
1747   }
1748   else if (peer2_value < value && value < peer1_value)
1749   {
1750     return *peer1;
1751   }
1752   else if (peer1_value < peer2_value && peer2_value < value)
1753   {
1754     return *peer1;
1755   }
1756   else  // if (peer2_value < peer1_value && peer1_value < value)
1757   {
1758     return *peer2;
1759   }
1760 }
1761
1762
1763 /**
1764  * Select closest predecessor to value.
1765  * @param peer1 First peer
1766  * @param peer2 Second peer
1767  * @param value Value to be compare
1768  * @return Peer which precedes value in the network.
1769  */
1770 static struct GNUNET_PeerIdentity
1771 select_closest_predecessor (const struct GNUNET_PeerIdentity *peer1,
1772                             const struct GNUNET_PeerIdentity *peer2,
1773                             uint64_t value)
1774 {
1775   uint64_t peer1_value;
1776   uint64_t peer2_value;
1777
1778   memcpy (&peer1_value, peer1, sizeof (uint64_t));
1779   memcpy (&peer2_value, peer2, sizeof (uint64_t));
1780   peer1_value = GNUNET_ntohll (peer1_value);
1781   peer2_value = GNUNET_ntohll (peer2_value);
1782
1783    if (peer1_value == value)
1784   {
1785     return *peer1;
1786   }
1787
1788   if (peer2_value == value)
1789   {
1790     return *peer2;
1791   }
1792
1793   if (value < peer1_value && peer1_value < peer2_value)
1794   {
1795     return *peer2;
1796   }
1797   else if (value < peer2_value && peer2_value < peer1_value)
1798   {
1799     return *peer1;
1800   }
1801   else if (peer1_value < value && value < peer2_value)
1802   {
1803     return *peer1;
1804   }
1805   else if (peer2_value < value && value < peer1_value)
1806   {
1807     return *peer2;
1808   }
1809   else if (peer1_value < peer2_value && peer2_value < value)
1810   {
1811     return *peer2;
1812   }
1813   else  // if (peer2_value < peer1_value && peer1_value < value)
1814   {
1815     return *peer1;
1816   }
1817 }
1818
1819 #if 0
1820 /**
1821  *
1822  *
1823  */
1824 void
1825 test_print_trail (struct GNUNET_PeerIdentity *trail,
1826                   unsigned int trail_length)
1827 {
1828   struct GNUNET_PeerIdentity print_peer;
1829   int i;
1830
1831   FPRINTF (stderr,_("\nSUPU %s, %s, %d,trail_length = %d"),
1832   __FILE__, __func__,__LINE__,trail_length);
1833   for (i =0 ; i< trail_length; i++)
1834   {
1835     print_peer = trail[i];
1836     FPRINTF (stderr,_("\nSUPU %s, %s, %d,trail[%d]=%s"),
1837             __FILE__, __func__,__LINE__,i,GNUNET_i2s(&print_peer));
1838   }
1839 }
1840 #endif
1841
1842 #if 0
1843 /**
1844  * This is a test function to print all the entries of friend table.
1845  */
1846 static void
1847 test_friend_peermap_print ()
1848 {
1849   struct FriendInfo *friend;
1850   struct GNUNET_CONTAINER_MultiPeerMapIterator *friend_iter;
1851   struct GNUNET_PeerIdentity print_peer;
1852   struct GNUNET_PeerIdentity key_ret;
1853   int i;
1854
1855   print_peer = my_identity;
1856   FPRINTF (stderr,_("\nSUPU************  FRIEND_PEERMAP of %s"),GNUNET_i2s(&print_peer));
1857   friend_iter = GNUNET_CONTAINER_multipeermap_iterator_create (friend_peermap);
1858
1859   for (i = 0; i < GNUNET_CONTAINER_multipeermap_size (friend_peermap); i++)
1860   {
1861     if(GNUNET_YES == GNUNET_CONTAINER_multipeermap_iterator_next (friend_iter,
1862                                                                   &key_ret,
1863                                                                   (const void **)&friend))
1864     {
1865       memcpy (&print_peer, &key_ret, sizeof (struct GNUNET_PeerIdentity));
1866       FPRINTF (stderr,_("\nSUPU %s, %s, %d, friend = %s, friend->trails_count = %d"),
1867               __FILE__, __func__,__LINE__, GNUNET_i2s(&print_peer), friend->trails_count);
1868     }
1869   }
1870 }
1871 #endif
1872
1873 #if 0
1874 /**
1875  * This is a test function, to print all the entries of finger table.
1876  */
1877 static void
1878 test_finger_table_print()
1879 {
1880   struct FingerInfo *finger;
1881   struct GNUNET_PeerIdentity print_peer;
1882   //struct Trail *trail;
1883   int i;
1884   //int j;
1885   //int k;
1886   print_peer = my_identity;
1887   FPRINTF (stderr,_("\nSUPU************  FINGER_TABLE of %s"),GNUNET_i2s(&print_peer));
1888   for (i = 0; i < MAX_FINGERS; i++)
1889   {
1890     finger = &finger_table[i];
1891
1892     if (GNUNET_NO == finger->is_present)
1893       continue;
1894
1895     print_peer = finger->finger_identity;
1896     FPRINTF (stderr,_("\nSUPU %s, %s, %d, finger_table[%d] = %s, trails_count = %d"),
1897             __FILE__, __func__,__LINE__,i,GNUNET_i2s (&print_peer), finger->trails_count);
1898
1899 #if 0
1900     for (j = 0; j < finger->trails_count; j++)
1901     {
1902       trail = &finger->trail_list[j];
1903       FPRINTF (stderr,_("\nSUPU %s, %s, %d, trail_id[%d]=%s"),__FILE__, __func__,__LINE__,j, GNUNET_h2s(&trail->trail_id));
1904       struct Trail_Element *element;
1905       element = trail->trail_head;
1906       for (k = 0; k < trail->trail_length; k++)
1907       {
1908         print_peer = element->peer;
1909         FPRINTF (stderr,_("\nSUPU %s, %s, %d,trail[%d] = %s "),__FILE__, __func__,__LINE__,k, GNUNET_i2s(&print_peer));
1910         element = element->next;
1911       }
1912     }
1913     #endif
1914   }
1915 }
1916 #endif
1917
1918 /**
1919  * Select the closest peer among two peers (which should not be same)
1920  * with respect to value and finger_table_index
1921  * NOTE: peer1 != peer2
1922  * @param peer1 First peer
1923  * @param peer2 Second peer
1924  * @param value Value relative to which we find the closest
1925  * @param is_predecessor Is value a predecessor or any other finger.
1926  * @return Closest peer among two peers.
1927  */
1928 static struct GNUNET_PeerIdentity
1929 select_closest_peer (const struct GNUNET_PeerIdentity *peer1,
1930                      const struct GNUNET_PeerIdentity *peer2,
1931                      uint64_t value,
1932                      unsigned int is_predecessor)
1933 {
1934   /* This check is here to ensure that calling function never sends
1935       same peer value in peer1 and peer2. Remove it later. */
1936   GNUNET_assert(0 != GNUNET_CRYPTO_cmp_peer_identity (peer1, peer2));
1937   if (1 == is_predecessor)
1938     return select_closest_predecessor (peer1, peer2, value);
1939
1940   // TODO: Change name to something like select_closest_successor!!
1941   return select_closest_finger (peer1, peer2, value);
1942 }
1943
1944
1945 /**
1946  * Iterate over the list of all the trails of a finger. In case the first
1947  * friend to reach the finger has reached trail threshold or is congested,
1948  * then don't select it. In case there multiple available good trails to reach
1949  * to Finger, choose the one with shortest trail length.
1950  * Note: We use length as parameter. But we can use any other suitable parameter
1951  * also.
1952  * @param finger Finger Finger whose trail we have to select.
1953  * @return Trail Selected Trail.
1954  */
1955 static struct Trail *
1956 select_finger_trail (struct FingerInfo *finger)
1957 {
1958   struct FriendInfo *friend;
1959   struct Trail *current_finger_trail;
1960   struct Trail *best_trail = NULL;
1961   unsigned int i;
1962
1963   GNUNET_assert (finger->trails_count > 0);
1964   for (i = 0; i < finger->trails_count; i++)
1965   {
1966     current_finger_trail = &finger->trail_list[i];
1967
1968     /* No trail stored at this index. */
1969     if (GNUNET_NO == current_finger_trail->is_present)
1970       continue;
1971
1972     GNUNET_assert (NULL !=
1973                   (friend =
1974                    GNUNET_CONTAINER_multipeermap_get (friend_peermap,
1975                                                       &current_finger_trail->trail_head->peer)));
1976
1977     /* First friend to reach trail is not free. */
1978     if (GNUNET_YES == is_friend_congested (friend))
1979       continue;
1980
1981     if (NULL == best_trail ||
1982         best_trail->trail_length > current_finger_trail->trail_length)
1983     {
1984       best_trail = current_finger_trail;
1985     }
1986   }
1987
1988   return best_trail;
1989 }
1990
1991
1992 /**
1993  * Compare FINGER entry with current successor. If finger's first friend of all
1994  * its trail is not congested and  has not crossed trail threshold, then check
1995  * if finger peer identity is closer to final_destination_finger_value than
1996  * current_successor. If yes then update current_successor.
1997  * @param current_successor[in/out]
1998  * @return
1999  */
2000 static void
2001 compare_finger_and_current_closest_peer (struct Closest_Peer *current_closest_peer)
2002 {
2003   struct FingerInfo *finger;
2004   struct GNUNET_PeerIdentity closest_peer;
2005   struct Trail *finger_trail;
2006   int i;
2007
2008   /* Iterate over finger table. */
2009   for (i = 0; i < MAX_FINGERS; i++)
2010   {
2011     finger = &finger_table[i];
2012
2013     if (GNUNET_NO == finger->is_present)
2014       continue;
2015
2016     if (0 == GNUNET_CRYPTO_cmp_peer_identity (&finger->finger_identity,
2017                                               &current_closest_peer->best_known_destination))
2018       continue;
2019
2020     /* If I am my own finger, then ignore this finger. */
2021     if (0 == GNUNET_CRYPTO_cmp_peer_identity (&finger->finger_identity,
2022                                               &my_identity))
2023       continue;
2024
2025    /* If finger is a friend, we have already checked it in previous function. */
2026     if (NULL != (GNUNET_CONTAINER_multipeermap_get (friend_peermap,
2027                                                     &finger->finger_identity)))
2028     {
2029       continue;
2030     }
2031
2032     closest_peer = select_closest_peer (&finger->finger_identity,
2033                                         &current_closest_peer->best_known_destination,
2034                                         current_closest_peer->destination_finger_value,
2035                                         current_closest_peer->is_predecessor);
2036
2037     if (0 == GNUNET_CRYPTO_cmp_peer_identity(&finger->finger_identity, &closest_peer))
2038     {
2039       /* Choose one of the trail to reach to finger. */
2040       finger_trail = select_finger_trail (finger);
2041
2042       /* In case no trail found, ignore this finger. */
2043       if (NULL == finger_trail)
2044         continue;
2045
2046       current_closest_peer->best_known_destination = closest_peer;
2047       current_closest_peer->next_hop = finger_trail->trail_head->peer;
2048       current_closest_peer->trail_id = finger_trail->trail_id;
2049       current_closest_peer->finger_table_index = i;
2050     }
2051     continue;
2052   }
2053 }
2054
2055
2056 /**
2057  * Compare friend entry with current successor.
2058  * If friend identity and current_successor is same, then do nothing.
2059  * If friend is not congested and has not crossed trail threshold, then check
2060  * if friend peer identity is closer to final_destination_finger_value than
2061  * current_successor. If yes then update current_successor.
2062  * @param cls closure
2063  * @param key current public key
2064  * @param value struct Closest_Peer
2065  * @return #GNUNET_YES if we should continue to iterate,
2066  *         #GNUNET_NO if not.
2067  */
2068 static int
2069 compare_friend_and_current_closest_peer (void *cls,
2070                                          const struct GNUNET_PeerIdentity *key,
2071                                          void *value)
2072 {
2073   struct FriendInfo *friend = value;
2074   struct Closest_Peer *current_closest_peer = cls;
2075   struct GNUNET_PeerIdentity closest_peer;
2076
2077   /* Friend is either congested or has crossed threshold. */
2078   if (GNUNET_YES == is_friend_congested (friend))
2079     return GNUNET_YES;
2080
2081   /* If current_closest_peer and friend identity are same, then do nothing.*/
2082   if (0 == GNUNET_CRYPTO_cmp_peer_identity (&friend->id,
2083                                             &current_closest_peer->best_known_destination))
2084   {
2085     GNUNET_break (0);
2086     return GNUNET_YES;
2087   }
2088
2089   closest_peer = select_closest_peer (&friend->id,
2090                                       &current_closest_peer->best_known_destination,
2091                                       current_closest_peer->destination_finger_value,
2092                                       current_closest_peer->is_predecessor);
2093
2094   /* Is friend the closest successor? */
2095   if (0 == GNUNET_CRYPTO_cmp_peer_identity(&friend->id, &closest_peer))
2096   {
2097     current_closest_peer->best_known_destination = friend->id;
2098     current_closest_peer->next_hop = friend->id;
2099   }
2100
2101   return GNUNET_YES;
2102 }
2103
2104
2105 /**
2106  * Initialize current_successor to my_identity.
2107  * @param my_identity My peer identity
2108  * @return Updated closest_peer
2109  */
2110 static struct Closest_Peer
2111 init_closest_peer (struct GNUNET_PeerIdentity my_identity,
2112                         uint64_t destination_finger_value,
2113                         unsigned int is_predecessor)
2114 {
2115   struct Closest_Peer current_closest_peer;
2116
2117   memset (&current_closest_peer.trail_id, 0, sizeof(struct GNUNET_HashCode));
2118   current_closest_peer.destination_finger_value = destination_finger_value;
2119   current_closest_peer.is_predecessor = is_predecessor;
2120   current_closest_peer.next_hop = my_identity;
2121   current_closest_peer.best_known_destination = my_identity;
2122   current_closest_peer.finger_table_index = 65; //65 is a for non valid finger table index.
2123   return current_closest_peer;
2124 }
2125
2126
2127 /**
2128  * Find locally best known peer, among your own identity, friend and finger list,
2129  * which is closest to given destination_finger_value.
2130  *
2131  * NOTE: In case a friend is also a finger, then it is always chosen as friend
2132  * not a finger.
2133  * @param destination_finger_value Peer closest to this value will be the next destination.
2134  * @param is_predecessor Are we looking for predecessor or finger?
2135  * @return Closest_Peer that contains all the relevant field to reach to
2136  *                      @a destination_finger_value
2137  */
2138 static struct Closest_Peer
2139 find_local_best_known_next_hop (uint64_t destination_finger_value,
2140                                 unsigned int is_predecessor)
2141 {
2142   struct Closest_Peer current_closest_peer;
2143
2144    /* Initialize current_successor to my_identity. */
2145   current_closest_peer = init_closest_peer (my_identity,
2146                                             destination_finger_value,
2147                                             is_predecessor);
2148
2149   /* Compare each friend entry with current_successor and update current_successor
2150    * with friend if its closest. */
2151   GNUNET_assert
2152           (GNUNET_SYSERR !=
2153            GNUNET_CONTAINER_multipeermap_iterate (friend_peermap,
2154                                                   &compare_friend_and_current_closest_peer,
2155                                                   &current_closest_peer));
2156
2157   /* Compare each finger entry with current_successor and update current_successor
2158    * with finger if its closest. */
2159   compare_finger_and_current_closest_peer (&current_closest_peer);
2160   return current_closest_peer;
2161 }
2162
2163
2164 /**
2165  * Construct a Put message and send it to target_peer.
2166  * @param key Key for the content
2167  * @param block_type Type of the block
2168  * @param options Routing options
2169  * @param desired_replication_level Desired replication count
2170  * @param best_known_dest Peer to which this message should reach eventually,
2171  *                        as it is best known destination to me.
2172  * @param intermediate_trail_id Trail id in case
2173  * @param target_peer Peer to which this message will be forwarded.
2174  * @param hop_count Number of hops traversed so far.
2175  * @param put_path_length Total number of peers in @a put_path
2176  * @param put_path Number of peers traversed so far
2177  * @param expiration_time When does the content expire
2178  * @param data Content to store
2179  * @param data_size Size of content @a data in bytes
2180  */
2181 void
2182 GDS_NEIGHBOURS_send_put (const struct GNUNET_HashCode *key,
2183                          enum GNUNET_BLOCK_Type block_type,
2184                          enum GNUNET_DHT_RouteOption options,
2185                          uint32_t desired_replication_level,
2186                          struct GNUNET_PeerIdentity best_known_dest,
2187                          struct GNUNET_HashCode intermediate_trail_id,
2188                          struct GNUNET_PeerIdentity *target_peer,
2189                          uint32_t hop_count,
2190                          uint32_t put_path_length,
2191                          struct GNUNET_PeerIdentity *put_path,
2192                          struct GNUNET_TIME_Absolute expiration_time,
2193                          const void *data, size_t data_size)
2194 {
2195   struct PeerPutMessage *ppm;
2196   struct P2PPendingMessage *pending;
2197   struct FriendInfo *target_friend;
2198   struct GNUNET_PeerIdentity *pp;
2199   size_t msize;
2200
2201   msize = put_path_length * sizeof (struct GNUNET_PeerIdentity) + data_size +
2202           sizeof (struct PeerPutMessage);
2203   if (msize >= GNUNET_CONSTANTS_MAX_ENCRYPTED_MESSAGE_SIZE)
2204   {
2205     put_path_length = 0;
2206     msize = data_size + sizeof (struct PeerPutMessage);
2207   }
2208
2209   if (msize >= GNUNET_CONSTANTS_MAX_ENCRYPTED_MESSAGE_SIZE)
2210   {
2211     DEBUG("msize = %lu\n",msize);
2212     GNUNET_break (0);
2213     return;
2214   }
2215
2216   GNUNET_assert (NULL !=
2217                  (target_friend =
2218                   GNUNET_CONTAINER_multipeermap_get (friend_peermap, target_peer)));
2219   pending = GNUNET_malloc (sizeof (struct P2PPendingMessage) + msize);
2220   pending->timeout = expiration_time;
2221   ppm = (struct PeerPutMessage *) &pending[1];
2222   pending->msg = &ppm->header;
2223   ppm->header.size = htons (msize);
2224   ppm->header.type = htons (GNUNET_MESSAGE_TYPE_XDHT_P2P_PUT);
2225   ppm->options = htonl (options);
2226   ppm->block_type = htonl (block_type);
2227   ppm->hop_count = htonl (hop_count + 1);
2228   ppm->desired_replication_level = htonl (desired_replication_level);
2229   ppm->expiration_time = GNUNET_TIME_absolute_hton (expiration_time);
2230   ppm->best_known_destination = best_known_dest;
2231   ppm->intermediate_trail_id = intermediate_trail_id;
2232   ppm->key = *key;
2233   pp = (struct GNUNET_PeerIdentity *) &ppm[1];
2234   ppm->put_path_length = htonl (put_path_length);
2235   if(put_path_length > 0)
2236   {
2237     memcpy (pp, put_path,
2238             sizeof (struct GNUNET_PeerIdentity) * put_path_length);
2239   }
2240   memcpy (&pp[put_path_length], data, data_size);
2241   GNUNET_assert (NULL != target_friend);
2242   GNUNET_CONTAINER_DLL_insert_tail (target_friend->head, target_friend->tail, pending);
2243   target_friend->pending_count++;
2244   process_friend_queue (target_friend);
2245 }
2246
2247
2248 /**
2249  * Handle the put request from the client.
2250  * @param key Key for the content
2251  * @param block_type Type of the block
2252  * @param options Routing options
2253  * @param desired_replication_level Desired replication count
2254  * @param expiration_time When does the content expire
2255  * @param data Content to store
2256  * @param data_size Size of content @a data in bytes
2257  */
2258 void
2259 GDS_NEIGHBOURS_handle_put (const struct GNUNET_HashCode *key,
2260                            enum GNUNET_BLOCK_Type block_type,
2261                            enum GNUNET_DHT_RouteOption options,
2262                            uint32_t desired_replication_level,
2263                            struct GNUNET_TIME_Absolute expiration_time,
2264                            const void *data, size_t data_size)
2265 {
2266   struct GNUNET_PeerIdentity best_known_dest;
2267   struct GNUNET_HashCode intermediate_trail_id;
2268   struct GNUNET_PeerIdentity next_hop;
2269   uint64_t key_value;
2270   struct Closest_Peer successor;
2271
2272   memcpy (&key_value, key, sizeof (uint64_t));
2273   key_value = GNUNET_ntohll (key_value);
2274   successor = find_local_best_known_next_hop (key_value,
2275                                               GDS_FINGER_TYPE_NON_PREDECESSOR);
2276   best_known_dest = successor.best_known_destination;
2277   next_hop = successor.next_hop;
2278   intermediate_trail_id = successor.trail_id;
2279
2280   if (0 == GNUNET_CRYPTO_cmp_peer_identity (&best_known_dest, &my_identity))
2281   {
2282     DEBUG("\n PUT_REQUEST_SUCCESSFUL for key = %s",GNUNET_h2s(key));
2283     /* I am the destination. */
2284     GDS_DATACACHE_handle_put (expiration_time, key, 0, NULL,
2285                               block_type,data_size,data);
2286     GDS_CLIENTS_process_put (options, block_type, 0,
2287                              ntohl (desired_replication_level),
2288                              1, &my_identity, expiration_time, //FIXME: GNUNETnthoh something on expiration time.
2289                              key, data, data_size);
2290     return;
2291   }
2292   /* In case we are sending the request to  a finger, then send across all of its
2293    trail.*/
2294 #if ENABLE_MALICIOUS
2295   if (0 != GNUNET_CRYPTO_cmp_peer_identity (&successor.best_known_destination,
2296                                             &successor.next_hop))
2297   {
2298     struct FingerInfo *next_hop_finger;
2299     unsigned int i;
2300
2301     next_hop_finger = &finger_table[successor.finger_table_index];
2302     for (i = 0; i < next_hop_finger->trails_count; i++)
2303     {
2304       if (GNUNET_YES == next_hop_finger->trail_list[i].is_present)
2305       {
2306         if(0 == next_hop_finger->trail_list[i].trail_length)
2307         {
2308            GDS_NEIGHBOURS_send_put (key, block_type, options, desired_replication_level,
2309                                     best_known_dest, intermediate_trail_id, &next_hop,
2310                                     0, 1, &my_identity, expiration_time,
2311                                     data, data_size);
2312            return;
2313         }
2314         next_hop = next_hop_finger->trail_list[i].trail_head->peer;
2315         GDS_NEIGHBOURS_send_put (key, block_type, options, desired_replication_level,
2316                                  best_known_dest,
2317                                  next_hop_finger->trail_list[i].trail_id,
2318                                  &next_hop, 0, 1, &my_identity,
2319                                  expiration_time,
2320                                  data, data_size);
2321        }
2322     }
2323     return;
2324   }
2325 #endif
2326  GDS_NEIGHBOURS_send_put (key, block_type, options, desired_replication_level,
2327                           best_known_dest, intermediate_trail_id, &next_hop,
2328                           0, 1, &my_identity, expiration_time,
2329                           data, data_size);
2330 }
2331
2332 /**
2333  * Construct a Get message and send it to target_peer.
2334  * @param key Key for the content
2335  * @param block_type Type of the block
2336  * @param options Routing options
2337  * @param desired_replication_level Desired replication count
2338  * @param best_known_dest Peer which should get this message. Same as target peer
2339  *                        if best_known_dest is a friend else its a finger.
2340  * @param intermediate_trail_id  Trail id to reach to @a best_known_dest
2341  *                              in case it is a finger else set to 0.
2342  * @param target_peer Peer to which this message will be forwarded.
2343  * @param hop_count Number of hops traversed so far.
2344  * @param data Content to store
2345  * @param data_size Size of content @a data in bytes
2346  * @param get_path_length Total number of peers in @a get_path
2347  * @param get_path Number of peers traversed so far
2348  */
2349 void
2350 GDS_NEIGHBOURS_send_get (const struct GNUNET_HashCode *key,
2351                          enum GNUNET_BLOCK_Type block_type,
2352                          enum GNUNET_DHT_RouteOption options,
2353                          uint32_t desired_replication_level,
2354                          struct GNUNET_PeerIdentity best_known_dest,
2355                          struct GNUNET_HashCode intermediate_trail_id,
2356                          struct GNUNET_PeerIdentity *target_peer,
2357                          uint32_t hop_count,
2358                          uint32_t get_path_length,
2359                          struct GNUNET_PeerIdentity *get_path)
2360 {
2361   struct PeerGetMessage *pgm;
2362   struct P2PPendingMessage *pending;
2363   struct FriendInfo *target_friend;
2364   struct GNUNET_PeerIdentity *gp;
2365   size_t msize;
2366
2367   msize = sizeof (struct PeerGetMessage) +
2368           (get_path_length * sizeof (struct GNUNET_PeerIdentity));
2369
2370   if (msize >= GNUNET_CONSTANTS_MAX_ENCRYPTED_MESSAGE_SIZE)
2371   {
2372     GNUNET_break (0);
2373     return;
2374   }
2375   GNUNET_assert (NULL !=
2376                  (target_friend =
2377                   GNUNET_CONTAINER_multipeermap_get (friend_peermap, target_peer)));
2378
2379   pending = GNUNET_malloc (sizeof (struct P2PPendingMessage) + msize);
2380   pending->timeout = GNUNET_TIME_relative_to_absolute (PENDING_MESSAGE_TIMEOUT);
2381   pending->importance = 0;    /* FIXME */
2382   pgm = (struct PeerGetMessage *) &pending[1];
2383   pending->msg = &pgm->header;
2384   pgm->header.size = htons (msize);
2385   pgm->header.type = htons (GNUNET_MESSAGE_TYPE_XDHT_P2P_GET);
2386   pgm->get_path_length = htonl (get_path_length);
2387   pgm->best_known_destination = best_known_dest;
2388   pgm->key = *key;
2389   pgm->intermediate_trail_id = intermediate_trail_id;
2390   pgm->hop_count = htonl (hop_count + 1);
2391   pgm->get_path_length = htonl (get_path_length);
2392   gp = (struct GNUNET_PeerIdentity *) &pgm[1];
2393   memcpy (gp, get_path,
2394           sizeof (struct GNUNET_PeerIdentity) * get_path_length);
2395   GNUNET_CONTAINER_DLL_insert_tail (target_friend->head, target_friend->tail, pending);
2396   target_friend->pending_count++;
2397   process_friend_queue (target_friend);
2398 }
2399
2400
2401 /**
2402  * Handle the get request from the client file. If I am destination do
2403  * datacache put and return. Else find the target friend and forward message
2404  * to it.
2405  * @param key Key for the content
2406  * @param block_type Type of the block
2407  * @param options Routing options
2408  * @param desired_replication_level Desired replication count
2409  */
2410 void
2411 GDS_NEIGHBOURS_handle_get(const struct GNUNET_HashCode *key,
2412                           enum GNUNET_BLOCK_Type block_type,
2413                           enum GNUNET_DHT_RouteOption options,
2414                           uint32_t desired_replication_level)
2415 {
2416   struct Closest_Peer successor;
2417   struct GNUNET_PeerIdentity best_known_dest;
2418   struct GNUNET_HashCode intermediate_trail_id;
2419   uint64_t key_value;
2420
2421   memcpy (&key_value, key, sizeof (uint64_t));
2422   key_value = GNUNET_ntohll (key_value);
2423
2424   successor = find_local_best_known_next_hop (key_value,
2425                                               GDS_FINGER_TYPE_NON_PREDECESSOR);
2426
2427   best_known_dest = successor.best_known_destination;
2428   intermediate_trail_id = successor.trail_id;
2429
2430   /* I am the destination. I have the data. */
2431   if (0 == GNUNET_CRYPTO_cmp_peer_identity (&my_identity,
2432                                             &best_known_dest))
2433   {
2434     GDS_DATACACHE_handle_get (key,block_type, NULL, 0,
2435                               NULL, 0, 1, &my_identity, NULL,&my_identity);
2436     return;
2437   }
2438
2439 #if ENABLE_MALICIOUS
2440   struct GNUNET_PeerIdentity next_hop;
2441   if (0 != GNUNET_CRYPTO_cmp_peer_identity (&successor.best_known_destination,
2442                                             &successor.next_hop))
2443   {
2444     struct FingerInfo *next_hop_finger;
2445     unsigned int i;
2446
2447     next_hop_finger = &finger_table[successor.finger_table_index];
2448     for (i = 0; i < next_hop_finger->trails_count; i++)
2449     {
2450       if (GNUNET_YES == next_hop_finger->trail_list[i].is_present)
2451       {
2452         if(0 == next_hop_finger->trail_list[i].trail_length)
2453         {
2454            GDS_NEIGHBOURS_send_get (key, block_type, options,
2455                                     desired_replication_level,
2456                                     best_known_dest,intermediate_trail_id,
2457                                     &successor.next_hop,
2458                                     0, 1, &my_identity);
2459            return;
2460         }
2461         next_hop = next_hop_finger->trail_list[i].trail_head->peer;
2462         GDS_NEIGHBOURS_send_get (key, block_type, options, desired_replication_level,
2463                                  best_known_dest,
2464                                  next_hop_finger->trail_list[i].trail_id,
2465                                  &next_hop, 0, 1, &my_identity);
2466        }
2467     }
2468     return;
2469   }
2470 #endif
2471   GDS_NEIGHBOURS_send_get (key, block_type, options, desired_replication_level,
2472                            best_known_dest,intermediate_trail_id, &successor.next_hop,
2473                            0, 1, &my_identity);
2474 }
2475
2476
2477 /**
2478  * Send the get result to requesting client.
2479  *
2480  * @param key Key of the requested data.
2481  * @param type Block type
2482  * @param target_peer Next peer to forward the message to.
2483  * @param source_peer Peer which has the data for the key.
2484  * @param put_path_length Number of peers in @a put_path
2485  * @param put_path Path taken to put the data at its stored location.
2486  * @param get_path_length Number of peers in @a get_path
2487  * @param get_path Path taken to reach to the location of the key.
2488  * @param expiration When will this result expire?
2489  * @param data Payload to store
2490  * @param data_size Size of the @a data
2491  */
2492 void
2493 GDS_NEIGHBOURS_send_get_result (const struct GNUNET_HashCode *key,
2494                                 enum GNUNET_BLOCK_Type type,
2495                                 const struct GNUNET_PeerIdentity *target_peer,
2496                                 const struct GNUNET_PeerIdentity *source_peer,
2497                                 unsigned int put_path_length,
2498                                 const struct GNUNET_PeerIdentity *put_path,
2499                                 unsigned int get_path_length,
2500                                 const struct GNUNET_PeerIdentity *get_path,
2501                                 struct GNUNET_TIME_Absolute expiration,
2502                                 const void *data, size_t data_size)
2503 {
2504   struct PeerGetResultMessage *get_result;
2505   struct GNUNET_PeerIdentity *paths;
2506   struct P2PPendingMessage *pending;
2507   struct FriendInfo *target_friend;
2508   int current_path_index;
2509   size_t msize;
2510
2511   msize = (put_path_length + get_path_length )* sizeof (struct GNUNET_PeerIdentity) +
2512           data_size +
2513           sizeof (struct PeerGetResultMessage);
2514
2515   if (msize >= GNUNET_CONSTANTS_MAX_ENCRYPTED_MESSAGE_SIZE)
2516   {
2517     put_path_length = 0;
2518     msize = msize - put_path_length * sizeof (struct GNUNET_PeerIdentity);
2519   }
2520
2521   if (msize >= GNUNET_CONSTANTS_MAX_ENCRYPTED_MESSAGE_SIZE)
2522   {
2523     GNUNET_break(0);
2524     return;
2525   }
2526   current_path_index = 0;
2527   if(get_path_length > 0)
2528   {
2529     current_path_index = search_my_index(get_path, get_path_length);
2530     if (-1 == current_path_index)
2531     {
2532       GNUNET_break (0);
2533       return;
2534     }
2535     if ((get_path_length + 1) == current_path_index)
2536     {
2537       DEBUG ("Peer found twice in get path. Not allowed \n");
2538       GNUNET_break (0);
2539       return;
2540     }
2541   }
2542   if (0 == current_path_index)
2543   {
2544     DEBUG ("GET_RESULT TO CLIENT KEY = %s, Peer = %s",GNUNET_h2s(key),GNUNET_i2s(&my_identity));
2545     GDS_CLIENTS_handle_reply (expiration, key, get_path_length,
2546                               get_path, put_path_length,
2547                               put_path, type, data_size, data);
2548     return;
2549   }
2550
2551   pending = GNUNET_malloc (sizeof (struct P2PPendingMessage) + msize);
2552   pending->timeout = GNUNET_TIME_relative_to_absolute (PENDING_MESSAGE_TIMEOUT);
2553   pending->importance = 0;
2554   get_result = (struct PeerGetResultMessage *)&pending[1];
2555   pending->msg = &get_result->header;
2556   get_result->header.size = htons (msize);
2557   get_result->header.type = htons (GNUNET_MESSAGE_TYPE_XDHT_P2P_GET_RESULT);
2558   get_result->key = *key;
2559   get_result->querying_peer = *source_peer;
2560   get_result->expiration_time = GNUNET_TIME_absolute_hton (expiration);
2561   get_result->get_path_length = htonl (get_path_length);
2562   get_result->put_path_length = htonl (put_path_length);
2563   paths = (struct GNUNET_PeerIdentity *)&get_result[1];
2564   memcpy (paths, put_path,
2565           put_path_length * sizeof (struct GNUNET_PeerIdentity));
2566   memcpy (&paths[put_path_length], get_path,
2567           get_path_length * sizeof (struct GNUNET_PeerIdentity));
2568   memcpy (&paths[put_path_length + get_path_length], data, data_size);
2569
2570   GNUNET_assert (NULL !=
2571                 (target_friend =
2572                  GNUNET_CONTAINER_multipeermap_get (friend_peermap,
2573                                                     &get_path[current_path_index - 1])));
2574   GNUNET_CONTAINER_DLL_insert_tail (target_friend->head, target_friend->tail, pending);
2575   target_friend->pending_count++;
2576   process_friend_queue (target_friend);
2577 }
2578
2579
2580 /**
2581  * Randomly choose one of your friends (which is not congested and have not crossed
2582  * trail threshold) from the friend_peermap
2583  * @return Friend Randomly chosen friend.
2584  *         NULL in case friend peermap is empty, or all the friends are either
2585  *              congested or have crossed trail threshold.
2586  */
2587 static struct FriendInfo *
2588 select_random_friend ()
2589 {
2590   unsigned int current_size;
2591   uint32_t index;
2592   unsigned int j = 0;
2593   struct GNUNET_CONTAINER_MultiPeerMapIterator *iter;
2594   struct GNUNET_PeerIdentity key_ret;
2595   struct FriendInfo *friend;
2596
2597   current_size = GNUNET_CONTAINER_multipeermap_size (friend_peermap);
2598
2599   /* No friends.*/
2600   if (0 == current_size)
2601     return NULL;
2602
2603   index = GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_WEAK, current_size);
2604   iter = GNUNET_CONTAINER_multipeermap_iterator_create (friend_peermap);
2605
2606   /* Iterate till you don't reach to index. */
2607   for (j = 0; j < index ; j++)
2608     GNUNET_assert (GNUNET_YES ==
2609                    GNUNET_CONTAINER_multipeermap_iterator_next (iter, NULL, NULL));
2610
2611   do
2612   {
2613     /* Reset the index in friend peermap to 0 as we reached to the end. */
2614     if (j == current_size)
2615     {
2616       j = 0;
2617       GNUNET_CONTAINER_multipeermap_iterator_destroy (iter);
2618       iter = GNUNET_CONTAINER_multipeermap_iterator_create (friend_peermap);
2619
2620     }
2621
2622     /* Get the friend stored at the index, j*/
2623     GNUNET_assert (GNUNET_YES ==
2624                    GNUNET_CONTAINER_multipeermap_iterator_next (iter,
2625                                                                 &key_ret,
2626                                                                 (const void **)&friend));
2627
2628     /* This friend is not congested and has not crossed trail threshold. */
2629     if ((friend->trails_count < TRAILS_THROUGH_FRIEND_THRESHOLD) &&
2630         (0 == GNUNET_TIME_absolute_get_remaining (friend->congestion_timestamp).rel_value_us))
2631     {
2632       break;
2633     }
2634     friend = NULL;
2635     j++;
2636   } while (j != index);
2637
2638   GNUNET_CONTAINER_multipeermap_iterator_destroy (iter);
2639   return friend;
2640 }
2641
2642
2643 /**
2644  * Compute 64 bit value of finger_identity corresponding to a finger index using
2645  * chord formula.
2646  * For all fingers, n.finger[i] = n + pow (2,i),
2647  * For predecessor, n.finger[PREDECESSOR_FINGER_ID] = n - 1, where
2648  * n = my_identity, i = finger_index, n.finger[i] = 64 bit finger value
2649  * @param finger_index Index corresponding to which we calculate 64 bit value.
2650  * @return 64 bit value.
2651  */
2652 static uint64_t
2653 compute_finger_identity_value (unsigned int finger_index)
2654 {
2655   uint64_t my_id64;
2656
2657   memcpy (&my_id64, &my_identity, sizeof (uint64_t));
2658   my_id64 = GNUNET_ntohll (my_id64);
2659
2660   /* Are we looking for immediate predecessor? */
2661   if (PREDECESSOR_FINGER_ID == finger_index)
2662     return (my_id64 - 1);
2663   else
2664   {
2665     uint64_t add = (uint64_t)1 << finger_index;
2666     return (my_id64 + add);
2667   }
2668 }
2669
2670
2671 /*
2672  * Choose a random friend. Calculate the next finger identity to search,from
2673  * current_search_finger_index. Start looking for the trail to reach to
2674  * finger identity through this random friend.
2675  *
2676  * @param cls closure for this task
2677  */
2678 static void
2679 send_find_finger_trail_message (void *cls)
2680 {
2681   struct FriendInfo *target_friend;
2682   struct GNUNET_HashCode trail_id;
2683   struct GNUNET_HashCode intermediate_trail_id;
2684   unsigned int is_predecessor = 0;
2685   uint64_t finger_id_value;
2686
2687   /* Schedule another send_find_finger_trail_message task. After one round of
2688    * finger search, this time is exponentially backoff. */
2689   find_finger_trail_task_next_send_time.rel_value_us =
2690       find_finger_trail_task_next_send_time.rel_value_us +
2691       GNUNET_CRYPTO_random_u64 (GNUNET_CRYPTO_QUALITY_WEAK,
2692                                 DHT_FIND_FINGER_TRAIL_INTERVAL.rel_value_us);
2693   find_finger_trail_task =
2694       GNUNET_SCHEDULER_add_delayed (find_finger_trail_task_next_send_time,
2695                                     &send_find_finger_trail_message,
2696                                     NULL);
2697
2698   /* No space in my routing table. (Source and destination peers also store entries
2699    * in their routing table).  */
2700   if (GNUNET_YES == GDS_ROUTING_threshold_reached())
2701     return;
2702
2703   target_friend = select_random_friend ();
2704   if (NULL == target_friend)
2705   {
2706     return;
2707   }
2708
2709   finger_id_value = compute_finger_identity_value (current_search_finger_index);
2710   if (PREDECESSOR_FINGER_ID == current_search_finger_index)
2711     is_predecessor = 1;
2712
2713   /* Generate a unique trail id for trail we are trying to setup. */
2714   GNUNET_CRYPTO_random_block (GNUNET_CRYPTO_QUALITY_STRONG,
2715                               &trail_id, sizeof (trail_id));
2716   memset(&intermediate_trail_id, 0, sizeof (struct GNUNET_HashCode));
2717   GDS_NEIGHBOURS_send_trail_setup (my_identity, finger_id_value,
2718                                    target_friend->id, target_friend, 0, NULL,
2719                                    is_predecessor, trail_id,
2720                                    intermediate_trail_id);
2721 }
2722
2723
2724 /**
2725  * In case there are already maximum number of possible trails to reach to a
2726  * finger, then check if the new trail's length is lesser than any of the
2727  * existing trails.
2728  * If yes then replace that old trail by new trail.
2729  *
2730  * Note: Here we are taking length as a parameter to choose the best possible
2731  * trail, but there could be other parameters also like:
2732  * 1. duration of existence of a trail - older the better.
2733  * 2. if the new trail is completely disjoint than the
2734  *    other trails, then may be choosing it is better.
2735  *
2736  * @param finger Finger
2737  * @param new_finger_trail List of peers to reach from me to @a finger, NOT
2738  *                         including the endpoints.
2739  * @param new_finger_trail_length Total number of peers in @a new_finger_trail
2740  * @param new_finger_trail_id Unique identifier of @a new_finger_trail.
2741  */
2742 static void
2743 select_and_replace_trail (struct FingerInfo *finger,
2744                           const struct GNUNET_PeerIdentity *new_trail,
2745                           unsigned int new_trail_length,
2746                           struct GNUNET_HashCode new_trail_id)
2747 {
2748   struct Trail *current_trail;
2749   unsigned int largest_trail_length;
2750   unsigned int largest_trail_index;
2751   struct Trail_Element *trail_element;
2752   struct GNUNET_PeerIdentity *next_hop;
2753   unsigned int i;
2754
2755   largest_trail_length = new_trail_length;
2756   largest_trail_index = MAXIMUM_TRAILS_PER_FINGER + 1;
2757
2758   GNUNET_assert (MAXIMUM_TRAILS_PER_FINGER == finger->trails_count);
2759
2760   for (i = 0; i < finger->trails_count; i++)
2761   {
2762     current_trail = &finger->trail_list[i];
2763     GNUNET_assert (GNUNET_YES == current_trail->is_present);
2764     if (current_trail->trail_length > largest_trail_length)
2765     {
2766       largest_trail_length = current_trail->trail_length;
2767       largest_trail_index = i;
2768     }
2769   }
2770
2771   /* New trail is not better than existing ones. Send trail teardown. */
2772   if (largest_trail_index == (MAXIMUM_TRAILS_PER_FINGER + 1))
2773   {
2774     next_hop = GDS_ROUTING_get_next_hop (new_trail_id, GDS_ROUTING_SRC_TO_DEST);
2775     GDS_ROUTING_remove_trail (new_trail_id);
2776     GDS_NEIGHBOURS_send_trail_teardown (&new_trail_id,
2777                                         GDS_ROUTING_SRC_TO_DEST,
2778                                         next_hop);
2779     return;
2780   }
2781
2782   /* Send trail teardown message across the replaced trail. */
2783   struct Trail *replace_trail = &finger->trail_list[largest_trail_index];
2784   next_hop = GDS_ROUTING_get_next_hop (replace_trail->trail_id, GDS_ROUTING_SRC_TO_DEST);
2785   GNUNET_assert (GNUNET_YES == GDS_ROUTING_remove_trail (replace_trail->trail_id));
2786   GDS_NEIGHBOURS_send_trail_teardown (&replace_trail->trail_id,
2787                                       GDS_ROUTING_SRC_TO_DEST,
2788                                       next_hop);
2789
2790   /* Free the trail. */
2791   while (NULL != (trail_element = replace_trail->trail_head))
2792   {
2793     GNUNET_CONTAINER_DLL_remove (replace_trail->trail_head,
2794                                  replace_trail->trail_tail, trail_element);
2795     GNUNET_free_non_null (trail_element);
2796   }
2797
2798   /* Add new trial at that location. */
2799   replace_trail->is_present = GNUNET_YES;
2800   replace_trail->trail_length = new_trail_length;
2801   replace_trail->trail_id = new_trail_id;
2802
2803   for (i = 0; i < new_trail_length; i++)
2804   {
2805     struct Trail_Element *element = GNUNET_new (struct Trail_Element);
2806     element->peer = new_trail[i];
2807
2808     GNUNET_CONTAINER_DLL_insert_tail (replace_trail->trail_head,
2809                                       replace_trail->trail_tail,
2810                                       element);
2811   }
2812   /* FIXME: URGENT Are we adding the trail back to the list. */
2813 }
2814
2815
2816 /**
2817  * Check if the new trail to reach to finger is unique or do we already have
2818  * such a trail present for finger.
2819  * @param existing_finger Finger identity
2820  * @param new_trail New trail to reach @a existing_finger
2821  * @param trail_length Total number of peers in new_trail.
2822  * @return #GNUNET_YES if the new trail is unique
2823  *         #GNUNET_NO if same trail is already present.
2824  */
2825 static int
2826 is_new_trail_unique (struct FingerInfo *existing_finger,
2827                      const struct GNUNET_PeerIdentity *new_trail,
2828                      unsigned int trail_length)
2829 {
2830   struct Trail *current_trail;
2831   struct Trail_Element *trail_element;
2832   int i;
2833   int j;
2834
2835   GNUNET_assert (existing_finger->trails_count > 0);
2836
2837   /* Iterate over list of trails. */
2838   for (i = 0; i < existing_finger->trails_count; i++)
2839   {
2840     current_trail = &(existing_finger->trail_list[i]);
2841     if(GNUNET_NO == current_trail->is_present)
2842       continue;
2843
2844     /* New trail and existing trail length are not same. */
2845     if (current_trail->trail_length != trail_length)
2846     {
2847       return GNUNET_YES;
2848     }
2849
2850     trail_element = current_trail->trail_head;
2851     for (j = 0; j < current_trail->trail_length; j++)
2852     {
2853       if (0 != GNUNET_CRYPTO_cmp_peer_identity (&new_trail[j],
2854                                                 &trail_element->peer))
2855       {
2856         return GNUNET_YES;
2857       }
2858       trail_element = trail_element->next;
2859     }
2860   }
2861   return GNUNET_NO;
2862 }
2863
2864 /**
2865  * FIXME; In case of multiple trails, we may have a case where a trail from in
2866  * between has been removed, then we should try to find a free slot , not simply
2867  * add a trail at then end of the list.
2868  * Add a new trail at a free slot in trail array of existing finger.
2869  * @param existing_finger Finger
2870  * @param new_finger_trail New trail from me to finger, NOT including endpoints
2871  * @param new_finger_trail_length Total number of peers in @a new_finger_trail
2872  * @param new_finger_trail_id Unique identifier of the trail.
2873  */
2874 static void
2875 add_new_trail (struct FingerInfo *existing_finger,
2876                const struct GNUNET_PeerIdentity *new_trail,
2877                unsigned int new_trail_length,
2878                struct GNUNET_HashCode new_trail_id)
2879 {
2880   struct FriendInfo *friend;
2881   struct Trail *trail;
2882   unsigned int i;
2883   int free_slot = -1;
2884
2885   if (GNUNET_NO == is_new_trail_unique (existing_finger, new_trail,
2886                                         new_trail_length))
2887     return;
2888
2889   for (i = 0; i < existing_finger->trails_count; i++)
2890   {
2891     if (GNUNET_NO == existing_finger->trail_list[i].is_present)
2892     {
2893       free_slot = i;
2894       break;
2895     }
2896   }
2897
2898   if (-1 == free_slot)
2899     free_slot = i;
2900
2901   trail = &existing_finger->trail_list[free_slot];
2902   GNUNET_assert (GNUNET_NO == trail->is_present);
2903   trail->trail_id = new_trail_id;
2904   trail->trail_length = new_trail_length;
2905   existing_finger->trails_count++;
2906   trail->is_present = GNUNET_YES;
2907   if (0 == new_trail_length)
2908   {
2909     friend = GNUNET_CONTAINER_multipeermap_get (friend_peermap,
2910                                                 &existing_finger->finger_identity);
2911   }
2912   else
2913   {
2914     friend = GNUNET_CONTAINER_multipeermap_get (friend_peermap,
2915                                                 &new_trail[0]);
2916   }
2917   GNUNET_assert (NULL != friend);
2918   friend->trails_count++;
2919   for (i = 0; i < new_trail_length; i++)
2920   {
2921     struct Trail_Element *element;
2922
2923     element = GNUNET_new (struct Trail_Element);
2924     element->peer = new_trail[i];
2925     GNUNET_CONTAINER_DLL_insert_tail (trail->trail_head,
2926                                       trail->trail_tail,
2927                                       element);
2928   }
2929
2930   existing_finger->trail_list[free_slot].trail_head = trail->trail_head;
2931   existing_finger->trail_list[free_slot].trail_tail = trail->trail_tail;
2932   existing_finger->trail_list[free_slot].trail_length = new_trail_length;
2933   existing_finger->trail_list[free_slot].trail_id = new_trail_id;
2934   existing_finger->trail_list[free_slot].is_present = GNUNET_YES;
2935 }
2936
2937
2938 #if 0
2939 /**
2940  * FIXME; In case of multiple trails, we may have a case where a trail from in
2941  * between has been removed, then we should try to find a free slot , not simply
2942  * add a trail at then end of the list.
2943  * Add a new trail at a free slot in trail array of existing finger.
2944  * @param existing_finger Finger
2945  * @param new_finger_trail New trail from me to finger, NOT including endpoints
2946  * @param new_finger_trail_length Total number of peers in @a new_finger_trail
2947  * @param new_finger_trail_id Unique identifier of the trail.
2948  */
2949 static void
2950 add_new_trail (struct FingerInfo *existing_finger,
2951                const struct GNUNET_PeerIdentity *new_trail,
2952                unsigned int new_trail_length,
2953                struct GNUNET_HashCode new_trail_id)
2954 {
2955   struct Trail *trail;
2956   struct FriendInfo *first_friend;
2957   int i;
2958   int index;
2959
2960   if (GNUNET_NO == is_new_trail_unique (existing_finger, new_trail,
2961                                         new_trail_length))
2962     return;
2963
2964   index = existing_finger->trails_count;
2965   trail = &existing_finger->trail_list[index];
2966   GNUNET_assert (GNUNET_NO == trail->is_present);
2967   trail->trail_id = new_trail_id;
2968   trail->trail_length = new_trail_length;
2969   existing_finger->trails_count++;
2970   trail->is_present = GNUNET_YES;
2971
2972   GNUNET_assert (NULL == (GNUNET_CONTAINER_multipeermap_get (friend_peermap,
2973                                                              &existing_finger->finger_identity)));
2974   /* If finger is a friend then we never call this function. */
2975   GNUNET_assert (new_trail_length > 0);
2976
2977   first_friend = GNUNET_CONTAINER_multipeermap_get (friend_peermap,
2978                                                     &new_trail[0]);
2979   first_friend->trails_count++;
2980
2981   for (i = 0; i < new_trail_length; i++)
2982   {
2983     struct Trail_Element *element;
2984
2985     element = GNUNET_new (struct Trail_Element);
2986     element->peer = new_trail[i];
2987     GNUNET_CONTAINER_DLL_insert_tail (trail->trail_head,
2988                                       trail->trail_tail,
2989                                       element);
2990   }
2991   /* Do we need to add trail head and trail tail in the trail list itearator.*/
2992   existing_finger->trail_list[index].trail_head = trail->trail_head;
2993   existing_finger->trail_list[index].trail_tail = trail->trail_tail;
2994   existing_finger->trail_list[index].trail_length = new_trail_length;
2995   existing_finger->trail_list[index].trail_id = new_trail_id;
2996   existing_finger->trail_list[index].is_present = GNUNET_YES;
2997 }
2998 #endif
2999
3000 /**
3001  * Get the next hop to send trail teardown message from routing table and
3002  * then delete the entry from routing table. Send trail teardown message for a
3003  * specific trail of a finger.
3004  * @param finger Finger whose trail is to be removed.
3005  * @param trail List of peers in trail from me to a finger, NOT including
3006  *              endpoints.
3007  */
3008 static void
3009 send_trail_teardown (struct FingerInfo *finger,
3010                      struct Trail *trail)
3011 {
3012   struct FriendInfo *friend;
3013   struct GNUNET_PeerIdentity *next_hop;
3014
3015   next_hop = GDS_ROUTING_get_next_hop (trail->trail_id,
3016                                        GDS_ROUTING_SRC_TO_DEST);
3017   if (NULL == next_hop)
3018   {
3019 //    DEBUG(" NO ENTRY FOUND IN %s ROUTING TABLE for trail id %s, line=%d,traillength = %d",
3020 //            GNUNET_i2s(&my_identity), GNUNET_h2s(&trail->trail_id), __LINE__,trail->trail_length);
3021     return;
3022   }
3023   GNUNET_assert (0 != GNUNET_CRYPTO_cmp_peer_identity (&finger->finger_identity,
3024                                                        &my_identity));
3025
3026   GNUNET_assert(GNUNET_YES == trail->is_present);
3027   if (trail->trail_length > 0)
3028   {
3029     friend = GNUNET_CONTAINER_multipeermap_get (friend_peermap,
3030                                                 &trail->trail_head->peer);
3031   }
3032   else
3033   {
3034     friend = GNUNET_CONTAINER_multipeermap_get (friend_peermap,
3035                                                 &finger->finger_identity);
3036   }
3037
3038   if(NULL == friend)
3039   {
3040     DEBUG ("\n LINE NO: = %d, Friend not found for trail id  %s of peer %s trail length = %d",
3041            __LINE__,GNUNET_h2s(&trail->trail_id), GNUNET_i2s(&my_identity),trail->trail_length);
3042     return;
3043   }
3044   if (0 != GNUNET_CRYPTO_cmp_peer_identity (next_hop, &friend->id)
3045       && (0 == trail->trail_length))
3046   {
3047      DEBUG ("\n LINE NO: = %d, Friend not found for trail id  %s of peer %s trail length = %d",
3048            __LINE__,GNUNET_h2s(&trail->trail_id), GNUNET_i2s(&my_identity),trail->trail_length);
3049     return;
3050   }
3051   GNUNET_assert (GNUNET_YES == GDS_ROUTING_remove_trail (trail->trail_id));
3052   friend->trails_count--;
3053   GDS_NEIGHBOURS_send_trail_teardown (&trail->trail_id,
3054                                       GDS_ROUTING_SRC_TO_DEST,
3055                                       &friend->id);
3056 }
3057
3058
3059 /**
3060  * Send trail teardown message across all the trails to reach to finger.
3061  * @param finger Finger whose all the trail should be freed.
3062  */
3063 static void
3064 send_all_finger_trails_teardown (struct FingerInfo *finger)
3065 {
3066   unsigned int i;
3067
3068   for (i = 0; i < finger->trails_count; i++)
3069   {
3070     struct Trail *trail;
3071
3072     trail = &finger->trail_list[i];
3073     if (GNUNET_YES == trail->is_present)
3074     {
3075       send_trail_teardown (finger, trail);
3076       trail->is_present = GNUNET_NO;
3077     }
3078   }
3079 }
3080
3081
3082 /**
3083  * Free a specific trail
3084  * @param trail List of peers to be freed.
3085  */
3086 static void
3087 free_trail (struct Trail *trail)
3088 {
3089   struct Trail_Element *trail_element;
3090
3091   while (NULL != (trail_element = trail->trail_head))
3092   {
3093     GNUNET_CONTAINER_DLL_remove (trail->trail_head,
3094                                  trail->trail_tail,
3095                                  trail_element);
3096     GNUNET_free_non_null (trail_element);
3097   }
3098   trail->trail_head = NULL;
3099   trail->trail_tail = NULL;
3100 }
3101
3102
3103 /**
3104  * Free finger and its trail.
3105  * @param finger Finger to be freed.
3106  * @param finger_table_index Index at which finger is stored.
3107  */
3108 static void
3109 free_finger (struct FingerInfo *finger, unsigned int finger_table_index)
3110 {
3111   struct Trail *trail;
3112   unsigned int i;
3113   for (i = 0; i < finger->trails_count; i++)
3114   {
3115     trail = &finger->trail_list[i];
3116     if (GNUNET_NO == trail->is_present)
3117       continue;
3118
3119     if (trail->trail_length > 0)
3120       free_trail (trail);
3121     trail->is_present = GNUNET_NO;
3122   }
3123
3124   finger->is_present = GNUNET_NO;
3125   memset ((void *)&finger_table[finger_table_index], 0, sizeof (finger_table[finger_table_index]));
3126 }
3127
3128
3129 /**
3130  * Add a new entry in finger table at finger_table_index.
3131  * In case I am my own finger, then we don't have a trail. In case of a friend,
3132  * we have a trail with unique id and '0' trail length.
3133  * In case a finger is a friend, then increment the trails count of the friend.
3134  * @param finger_identity Peer Identity of new finger
3135  * @param finger_trail Trail to reach from me to finger (excluding both end points).
3136  * @param finger_trail_length Total number of peers in @a finger_trail.
3137  * @param trail_id Unique identifier of the trail.
3138  * @param finger_table_index Index in finger table.
3139  */
3140 static void
3141 add_new_finger (struct GNUNET_PeerIdentity finger_identity,
3142                 const struct GNUNET_PeerIdentity *finger_trail,
3143                 unsigned int finger_trail_length,
3144                 struct GNUNET_HashCode trail_id,
3145                 unsigned int finger_table_index)
3146 {
3147   struct FingerInfo *new_entry;
3148   struct FriendInfo *first_trail_hop;
3149   struct Trail *trail;
3150   unsigned int i;
3151
3152   new_entry = GNUNET_new (struct FingerInfo);
3153   new_entry->finger_identity = finger_identity;
3154   new_entry->finger_table_index = finger_table_index;
3155   new_entry->is_present = GNUNET_YES;
3156
3157   /* If the new entry is my own identity. */
3158   if (0 == GNUNET_CRYPTO_cmp_peer_identity (&my_identity,
3159                                             &finger_identity))
3160   {
3161     new_entry->trails_count = 0;
3162     finger_table[finger_table_index] = *new_entry;
3163     GNUNET_free (new_entry);
3164     return;
3165   }
3166
3167   /* Finger is a friend. */
3168   if (0 == finger_trail_length)
3169   {
3170     new_entry->trail_list[0].trail_id = trail_id;
3171     new_entry->trails_count = 1;
3172     new_entry->trail_list[0].is_present = GNUNET_YES;
3173     new_entry->trail_list[0].trail_length = 0;
3174     new_entry->trail_list[0].trail_head = NULL;
3175     new_entry->trail_list[0].trail_tail = NULL;
3176     finger_table[finger_table_index] = *new_entry;
3177     GNUNET_assert (NULL !=
3178                   (first_trail_hop =
3179                        GNUNET_CONTAINER_multipeermap_get (friend_peermap,
3180                                                           &finger_identity)));
3181
3182     first_trail_hop->trails_count++;
3183     GNUNET_free (new_entry);
3184     return;
3185   }
3186
3187   GNUNET_assert (NULL !=
3188                 (first_trail_hop =
3189                        GNUNET_CONTAINER_multipeermap_get (friend_peermap,
3190                                                           &finger_trail[0])));
3191   new_entry->trails_count = 1;
3192   first_trail_hop->trails_count++;
3193   /* Copy the finger trail into trail. */
3194   trail = &new_entry->trail_list[0];
3195   for(i = 0; i < finger_trail_length; i++)
3196   {
3197     struct Trail_Element *element = GNUNET_new (struct Trail_Element);
3198
3199     element->next = NULL;
3200     element->prev = NULL;
3201     element->peer = finger_trail[i];
3202     GNUNET_CONTAINER_DLL_insert_tail (trail->trail_head,
3203                                       trail->trail_tail,
3204                                       element);
3205   }
3206
3207   /* Add trail to trail list. */
3208   trail->trail_length = finger_trail_length;
3209   trail->trail_id = trail_id;
3210   trail->is_present = GNUNET_YES;
3211   finger_table[finger_table_index] = *new_entry;
3212   GNUNET_free (new_entry);
3213 }
3214
3215
3216 /**
3217  * Periodic task to verify current successor. There can be multiple trails to reach
3218  * to successor, choose the shortest one and send verify successor message
3219  * across that trail.
3220  *
3221  * @param cls closure for this task
3222  */
3223 static void
3224 send_verify_successor_message (void *cls)
3225 {
3226   struct FriendInfo *target_friend;
3227   struct GNUNET_HashCode trail_id;
3228   struct Trail *trail;
3229   struct Trail_Element *element;
3230   unsigned int trail_length;
3231   unsigned int i = 0;
3232   struct FingerInfo *successor;
3233
3234   successor = &finger_table[0];
3235
3236   /* This task will be scheduled when the result for Verify Successor is received. */
3237   send_verify_successor_task = NULL;
3238
3239   /* When verify successor is being called for first time *for current context*
3240    * cls will be NULL. If send_verify_successor_retry_task is not NO_TASK, we
3241    * must cancel the retry task scheduled for verify_successor of previous
3242    * context.
3243    */
3244   if (NULL == cls)
3245   {
3246     /* FIXME: Here we are scheduling a new verify successor task, as we
3247      got a new successor. But a send verify successor task may be in progress.
3248      1. We need to be sure that this is indeed a new successor. As this function
3249      is called even if we add a new trail to reach t old successor.
3250      2. Assuming the new successor is different, then verify successor message
3251      * to old successor may be following stages.
3252      * --> Waiting for verify successor result. Don't wait anymore. there is
3253      *     no trail to reach from old successor to me, hence, routing
3254      *     lookup will fail.
3255      * --> Waiting for notify confirmation. again don't wait for it. notify
3256      *    confirmation will not succeded.
3257      */
3258     if (send_verify_successor_retry_task != NULL)
3259     {
3260       /* FIXME: Are we scheduling retry task as soon as we send verify message.
3261        If yes then here before making this task, first check if the message
3262        is for the same peer again. */
3263       struct VerifySuccessorContext *old_ctx =
3264           GNUNET_SCHEDULER_cancel(send_verify_successor_retry_task);
3265       /* old_ctx must not be NULL, as the retry task had been scheduled */
3266       GNUNET_assert(NULL != old_ctx);
3267       GNUNET_free(old_ctx);
3268       /* FIXME: Why don't we reset the task to NO_TASK here? */
3269     }
3270
3271     struct VerifySuccessorContext *ctx;
3272     ctx = GNUNET_new(struct VerifySuccessorContext);
3273
3274     ctx->num_retries_scheduled++;
3275     send_verify_successor_retry_task =
3276         GNUNET_SCHEDULER_add_delayed (verify_successor_retry_time,
3277                                       &send_verify_successor_message,
3278                                       ctx);
3279   }
3280   else
3281   {
3282     /* This is a retry attempt for verify_successor for a previous context */
3283     struct VerifySuccessorContext *ctx;
3284
3285     ctx = cls;
3286     ctx->num_retries_scheduled++;
3287     send_verify_successor_retry_task =
3288         GNUNET_SCHEDULER_add_delayed (verify_successor_retry_time,
3289                                       &send_verify_successor_message,
3290                                       ctx);
3291   }
3292
3293   /* Among all the trails to reach to successor, select first one which is present.*/
3294   for (i = 0; i < successor->trails_count; i++)
3295   {
3296     trail = &successor->trail_list[i];
3297     if(GNUNET_YES == trail->is_present)
3298       break;
3299   }
3300
3301   /* No valid trail found to reach to successor. */
3302   if (i == successor->trails_count)
3303     return;
3304
3305   GNUNET_assert(0 != GNUNET_CRYPTO_cmp_peer_identity (&my_identity,
3306                                                       &successor->finger_identity));
3307   /* Trail stored at this index. */
3308   GNUNET_assert (GNUNET_YES == trail->is_present);
3309   trail_id = trail->trail_id;
3310   if (NULL == GDS_ROUTING_get_next_hop(trail_id,GDS_ROUTING_SRC_TO_DEST))
3311   {
3312     DEBUG(" NO ENTRY FOUND IN %s ROUTING TABLE for trail id %s, line",
3313             GNUNET_i2s(&my_identity), GNUNET_h2s(&trail->trail_id), __LINE__);
3314     GNUNET_break(0);
3315     return;
3316   }
3317   trail_length = trail->trail_length;
3318   if (trail_length > 0)
3319   {
3320      /* Copy the trail into peer list. */
3321     struct GNUNET_PeerIdentity peer_list[trail_length];
3322     element = trail->trail_head;
3323     for(i = 0; i < trail_length; i++)
3324     {
3325       peer_list[i] = element->peer;
3326       element = element->next;
3327     }
3328     GNUNET_assert (NULL != (target_friend =
3329                             GNUNET_CONTAINER_multipeermap_get (friend_peermap,
3330                                                                &peer_list[0])));
3331     GDS_NEIGHBOURS_send_verify_successor_message (my_identity,
3332                                                   successor->finger_identity,
3333                                                   trail_id, peer_list, trail_length,
3334                                                   target_friend);
3335   }
3336   else
3337   {
3338     GNUNET_assert (NULL != (target_friend =
3339                             GNUNET_CONTAINER_multipeermap_get (friend_peermap,
3340                                                                &successor->finger_identity)));
3341     GDS_NEIGHBOURS_send_verify_successor_message (my_identity,
3342                                                   successor->finger_identity,
3343                                                   trail_id, NULL, 0,
3344                                                   target_friend);
3345   }
3346 }
3347
3348
3349 /**
3350  * FIXME: should this be a periodic task, incrementing the search finger index?
3351  * Update the current search finger index.
3352  * @a finger_identity
3353  * @a finger_table_index
3354  */
3355 static void
3356 update_current_search_finger_index (unsigned int finger_table_index)
3357 {
3358   struct FingerInfo *successor;
3359
3360   /* FIXME correct this: only move current index periodically */
3361   if (finger_table_index != current_search_finger_index)
3362     return;
3363
3364   successor = &finger_table[0];
3365   GNUNET_assert (GNUNET_YES == successor->is_present);
3366
3367   /* We were looking for immediate successor.  */
3368   if (0 == current_search_finger_index)
3369   {
3370     current_search_finger_index = PREDECESSOR_FINGER_ID;
3371     if (0 != GNUNET_CRYPTO_cmp_peer_identity (&my_identity, &successor->finger_identity))
3372     {
3373       if (NULL == send_verify_successor_task)
3374       {
3375         send_verify_successor_task =
3376                 GNUNET_SCHEDULER_add_now (&send_verify_successor_message, NULL);
3377       }
3378     }
3379     return;
3380   }
3381
3382   current_search_finger_index = current_search_finger_index - 1;
3383   return;
3384 }
3385
3386
3387 /**
3388  * Get the least significant bit set in val.
3389  *
3390  * @param val Value
3391  * @return Position of first bit set, 65 in case of error.
3392  */
3393 static unsigned int
3394 find_set_bit (uint64_t val)
3395 {
3396   uint64_t i;
3397   unsigned int pos;
3398
3399   i = 1;
3400   pos = 0;
3401
3402   while (!(i & val))
3403   {
3404     i = i << 1;
3405     pos++;
3406     if (pos > 63)
3407     {
3408       GNUNET_break (0);
3409       return 65;
3410     }
3411   }
3412
3413   if (val/i != 1)
3414     return 65; /* Some other bit was set to 1 as well. */
3415
3416   return pos;
3417 }
3418
3419
3420 /**
3421  * Calculate finger_table_index from initial 64 bit finger identity value that
3422  * we send in trail setup message.
3423  * @param ultimate_destination_finger_value Value that we calculated from our
3424  *                                          identity and finger_table_index.
3425  * @param is_predecessor Is the entry for predecessor or not?
3426  * @return finger_table_index Value between 0 <= finger_table_index <= 64
3427  *         finger_table_index > PREDECESSOR_FINGER_ID, if error occurs.
3428  */
3429 static unsigned int
3430 get_finger_table_index (uint64_t ultimate_destination_finger_value,
3431                         unsigned int is_predecessor)
3432 {
3433   uint64_t my_id64;
3434   uint64_t diff;
3435   unsigned int finger_table_index;
3436
3437   memcpy (&my_id64, &my_identity, sizeof (uint64_t));
3438   my_id64 = GNUNET_ntohll (my_id64);
3439
3440   /* Is this a predecessor finger? */
3441   if (1 == is_predecessor)
3442   {
3443     diff =  my_id64 - ultimate_destination_finger_value;
3444     if (1 == diff)
3445       finger_table_index = PREDECESSOR_FINGER_ID;
3446     else
3447       finger_table_index = PREDECESSOR_FINGER_ID + 1; //error value
3448
3449   }
3450   else
3451   {
3452     diff = ultimate_destination_finger_value - my_id64;
3453     finger_table_index = find_set_bit (diff);
3454   }
3455   return finger_table_index;
3456 }
3457
3458
3459 /**
3460  * Remove finger and its associated data structures from finger table.
3461  * @param existing_finger Finger to be removed which is in finger table.
3462  * @param finger_table_index Index in finger table where @a existing_finger
3463  *                           is stored.
3464  */
3465 static void
3466 remove_existing_finger (struct FingerInfo *existing_finger,
3467                         unsigned int finger_table_index)
3468 {
3469   GNUNET_assert (GNUNET_YES == existing_finger->is_present);
3470
3471   /* If I am my own finger, then we have no trails. */
3472   if (0 == GNUNET_CRYPTO_cmp_peer_identity (&existing_finger->finger_identity,
3473                                             &my_identity))
3474   {
3475     existing_finger->is_present = GNUNET_NO;
3476     memset ((void *)&finger_table[finger_table_index], 0,
3477             sizeof (finger_table[finger_table_index]));
3478     return;
3479   }
3480
3481   /* For all other fingers, send trail teardown across all the trails to reach
3482    finger, and free the finger. */
3483   send_all_finger_trails_teardown (existing_finger);
3484   free_finger (existing_finger, finger_table_index);
3485 }
3486
3487
3488 /**
3489  * Check if there is already an entry in finger_table at finger_table_index.
3490  * We get the finger_table_index from 64bit finger value we got from the network.
3491  * -- If yes, then select the closest finger.
3492  *   -- If new and existing finger are same, then check if you can store more
3493  *      trails.
3494  *      -- If yes then add trail, else keep the best trails to reach to the
3495  *         finger.
3496  *   -- If the new finger is closest, remove the existing entry, send trail
3497  *      teardown message across all the trails to reach the existing entry.
3498  *      Add the new finger.
3499  *  -- If new and existing finger are different, and existing finger is closest
3500  *     then do nothing.
3501  * -- Update current_search_finger_index.
3502  * @param finger_identity Peer Identity of new finger
3503  * @param finger_trail Trail to reach the new finger
3504  * @param finger_trail_length Total number of peers in @a new_finger_trail.
3505  * @param is_predecessor Is this entry for predecessor in finger_table?
3506  * @param finger_value 64 bit value of finger identity that we got from network.
3507  * @param finger_trail_id Unique identifier of @finger_trail.
3508  */
3509 static void
3510 finger_table_add (struct GNUNET_PeerIdentity finger_identity,
3511                   const struct GNUNET_PeerIdentity *finger_trail,
3512                   unsigned int finger_trail_length,
3513                   unsigned int is_predecessor,
3514                   uint64_t finger_value,
3515                   struct GNUNET_HashCode finger_trail_id)
3516 {
3517   struct FingerInfo *existing_finger;
3518   struct GNUNET_PeerIdentity closest_peer;
3519   struct FingerInfo *successor;
3520   unsigned int finger_table_index;
3521
3522   /* Get the finger_table_index corresponding to finger_value we got from network.*/
3523   finger_table_index = get_finger_table_index (finger_value, is_predecessor);
3524
3525   /* Invalid finger_table_index. */
3526   if ((finger_table_index > PREDECESSOR_FINGER_ID))
3527   {
3528     GNUNET_break_op (0);
3529     return;
3530   }
3531
3532   /* Check if  new entry is same as successor. */
3533   if ((0 != finger_table_index) &&
3534       (PREDECESSOR_FINGER_ID != finger_table_index))
3535   {
3536     successor = &finger_table[0];
3537     if (GNUNET_NO == successor->is_present)
3538     {
3539       GNUNET_break (0); //ASSERTION FAILS HERE. FIXME
3540       return;
3541     }
3542     if (0 == GNUNET_CRYPTO_cmp_peer_identity (&finger_identity,
3543                                               &successor->finger_identity))
3544     {
3545       if (0 == fingers_round_count)
3546       {
3547          find_finger_trail_task_next_send_time =
3548               GNUNET_TIME_STD_BACKOFF(find_finger_trail_task_next_send_time);
3549       }
3550       else
3551         fingers_round_count--;
3552       current_search_finger_index = 0;
3553       GNUNET_STATISTICS_update (GDS_stats,
3554                                 gettext_noop
3555                                 ("# FINGERS_COUNT"), (int64_t) total_fingers_found,
3556                                 GNUNET_NO);
3557       total_fingers_found  = 0;
3558       return;
3559     }
3560
3561     struct FingerInfo prev_finger;
3562     prev_finger = finger_table[finger_table_index - 1];
3563     if (0 == GNUNET_CRYPTO_cmp_peer_identity (&finger_identity,
3564                                               &prev_finger.finger_identity))
3565     {
3566        current_search_finger_index--;
3567        return;
3568     }
3569   }
3570
3571   total_fingers_found++;
3572   existing_finger = &finger_table[finger_table_index];
3573
3574   /* No entry present in finger_table for given finger map index. */
3575   if (GNUNET_NO == existing_finger->is_present)
3576   {
3577      /* Shorten the trail if possible. */
3578     add_new_finger (finger_identity, finger_trail,
3579                     finger_trail_length,
3580                     finger_trail_id, finger_table_index);
3581     update_current_search_finger_index (finger_table_index);
3582     return;
3583   }
3584
3585   /* If existing entry and finger identity are not same. */
3586   if (0 != GNUNET_CRYPTO_cmp_peer_identity (&(existing_finger->finger_identity),
3587                                             &finger_identity))
3588   {
3589     closest_peer = select_closest_peer (&existing_finger->finger_identity,
3590                                         &finger_identity,
3591                                         finger_value,
3592                                         is_predecessor);
3593
3594     /* If the new finger is the closest peer. */
3595     if (0 == GNUNET_CRYPTO_cmp_peer_identity (&finger_identity, &closest_peer))
3596     {
3597       remove_existing_finger (existing_finger, finger_table_index);
3598       add_new_finger (finger_identity, finger_trail, finger_trail_length,
3599                       finger_trail_id, finger_table_index);
3600     }
3601     else
3602     {
3603       /* Existing finger is the closest one. We need to send trail teardown
3604          across the trail setup in routing table of all the peers. */
3605       if (0 != GNUNET_CRYPTO_cmp_peer_identity (&finger_identity, &my_identity))
3606       {
3607         if (finger_trail_length > 0)
3608           GDS_NEIGHBOURS_send_trail_teardown (&finger_trail_id,
3609                                               GDS_ROUTING_SRC_TO_DEST,
3610                                               &finger_trail[0]);
3611         else
3612           GDS_NEIGHBOURS_send_trail_teardown (&finger_trail_id,
3613                                               GDS_ROUTING_SRC_TO_DEST,
3614                                               &finger_identity);
3615       }
3616     }
3617   }
3618   else
3619   {
3620     /* If both new and existing entry are same as my_identity, then do nothing. */
3621     if (0 == GNUNET_CRYPTO_cmp_peer_identity (&(existing_finger->finger_identity),
3622                                               &my_identity))
3623     {
3624       return;
3625     }
3626
3627     /* If there is space to store more trails. */
3628     if (existing_finger->trails_count < MAXIMUM_TRAILS_PER_FINGER)
3629         add_new_trail (existing_finger, finger_trail,
3630                        finger_trail_length, finger_trail_id);
3631     else
3632         select_and_replace_trail (existing_finger, finger_trail,
3633                                   finger_trail_length, finger_trail_id);
3634   }
3635   update_current_search_finger_index (finger_table_index);
3636   return;
3637 }
3638
3639
3640 /**
3641  * Core handler for P2P put messages.
3642  * @param cls closure
3643  * @param peer sender of the request
3644  * @param message message
3645  * @return #GNUNET_OK to keep the connection open,
3646  *         #GNUNET_SYSERR to close it (signal serious error)
3647  */
3648 static int
3649 handle_dht_p2p_put (void *cls, const struct GNUNET_PeerIdentity *peer,
3650                     const struct GNUNET_MessageHeader *message)
3651 {
3652   struct PeerPutMessage *put;
3653   struct GNUNET_PeerIdentity *put_path;
3654   struct GNUNET_PeerIdentity current_best_known_dest;
3655   struct GNUNET_PeerIdentity best_known_dest;
3656   struct GNUNET_HashCode received_intermediate_trail_id;
3657   struct GNUNET_HashCode intermediate_trail_id;
3658   struct GNUNET_PeerIdentity next_hop;
3659   struct GNUNET_PeerIdentity *next_routing_hop;
3660   enum GNUNET_DHT_RouteOption options;
3661   struct GNUNET_HashCode test_key;
3662   void *payload;
3663   size_t msize;
3664   uint32_t putlen;
3665   uint32_t hop_count;
3666   size_t payload_size;
3667   uint64_t key_value;
3668
3669   msize = ntohs (message->size);
3670   if (msize < sizeof (struct PeerPutMessage))
3671   {
3672     GNUNET_break_op (0);
3673     return GNUNET_OK;
3674   }
3675
3676   put = (struct PeerPutMessage *) message;
3677   putlen = ntohl (put->put_path_length);
3678   if ((msize <
3679        sizeof (struct PeerPutMessage) +
3680        putlen * sizeof (struct GNUNET_PeerIdentity)) ||
3681       (putlen >
3682        GNUNET_CONSTANTS_MAX_ENCRYPTED_MESSAGE_SIZE / sizeof (struct GNUNET_PeerIdentity)))
3683   {
3684     GNUNET_break_op (0);
3685     return GNUNET_OK;
3686   }
3687 #if ENABLE_MALICIOUS
3688   if(1 == act_malicious)
3689   {
3690     DEBUG("\n I AM MALICIOUS PUT_REQUEST_DROPPED for key = %ss",GNUNET_h2s(&put->key));
3691     return GNUNET_OK;
3692   }
3693 #endif
3694   GNUNET_STATISTICS_update (GDS_stats,
3695                             gettext_noop
3696                             ("# Bytes received from other peers"), (int64_t) msize,
3697                             GNUNET_NO);
3698
3699   current_best_known_dest = put->best_known_destination;
3700   put_path = (struct GNUNET_PeerIdentity *) &put[1];
3701   payload = &put_path[putlen];
3702   options = ntohl (put->options);
3703   received_intermediate_trail_id = put->intermediate_trail_id;
3704   hop_count = ntohl(put->hop_count);
3705   payload_size = msize - (sizeof (struct PeerPutMessage) +
3706                           putlen * sizeof (struct GNUNET_PeerIdentity));
3707   hop_count++;
3708   switch (GNUNET_BLOCK_get_key (GDS_block_context, ntohl (put->block_type),
3709                                 payload, payload_size, &test_key))
3710   {
3711     case GNUNET_YES:
3712       if (0 != memcmp (&test_key, &put->key, sizeof (struct GNUNET_HashCode)))
3713       {
3714         char *put_s = GNUNET_strdup (GNUNET_h2s_full (&put->key));
3715         GNUNET_break_op (0);
3716         GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
3717                     "PUT with key `%s' for block with key %s\n",
3718                      put_s, GNUNET_h2s_full (&test_key));
3719         GNUNET_free (put_s);
3720         return GNUNET_OK;
3721       }
3722     break;
3723     case GNUNET_NO:
3724       GNUNET_break_op (0);
3725       return GNUNET_OK;
3726     case GNUNET_SYSERR:
3727       /* cannot verify, good luck */
3728       break;
3729   }
3730
3731    if (ntohl (put->block_type) == GNUNET_BLOCK_TYPE_REGEX) /* FIXME: do for all tpyes */
3732   {
3733     switch (GNUNET_BLOCK_evaluate (GDS_block_context,
3734                                    ntohl (put->block_type),
3735                                    GNUNET_BLOCK_EO_NONE,
3736                                    NULL,    /* query */
3737                                    NULL, 0, /* bloom filer */
3738                                    NULL, 0, /* xquery */
3739                                    payload, payload_size))
3740     {
3741     case GNUNET_BLOCK_EVALUATION_OK_MORE:
3742     case GNUNET_BLOCK_EVALUATION_OK_LAST:
3743       break;
3744
3745     case GNUNET_BLOCK_EVALUATION_OK_DUPLICATE:
3746     case GNUNET_BLOCK_EVALUATION_RESULT_INVALID:
3747     case GNUNET_BLOCK_EVALUATION_RESULT_IRRELEVANT:
3748     case GNUNET_BLOCK_EVALUATION_REQUEST_VALID:
3749     case GNUNET_BLOCK_EVALUATION_REQUEST_INVALID:
3750     case GNUNET_BLOCK_EVALUATION_TYPE_NOT_SUPPORTED:
3751     default:
3752       GNUNET_break_op (0);
3753       return GNUNET_OK;
3754     }
3755   }
3756
3757   /* Check if you are already a part of put path. */
3758   unsigned int i;
3759   for (i = 0; i < putlen; i++)
3760   {
3761     if(0 == GNUNET_CRYPTO_cmp_peer_identity (&my_identity, &put_path[i]))
3762     {
3763       putlen = i;
3764       break;
3765     }
3766   }
3767
3768   /* Add yourself to the list. */
3769   struct GNUNET_PeerIdentity pp[putlen + 1];
3770   //if (0 != (options & GNUNET_DHT_RO_RECORD_ROUTE))
3771   if (1)
3772   {
3773     memcpy (pp, put_path, putlen * sizeof (struct GNUNET_PeerIdentity));
3774     pp[putlen] = my_identity;
3775     putlen++;
3776   }
3777   else
3778     putlen = 0;
3779
3780   memcpy (&key_value, &(put->key), sizeof (uint64_t));
3781   struct Closest_Peer successor;
3782   key_value = GNUNET_ntohll (key_value);
3783   successor = find_local_best_known_next_hop (key_value,
3784                                               GDS_FINGER_TYPE_NON_PREDECESSOR);
3785   next_hop = successor.next_hop;
3786   intermediate_trail_id = successor.trail_id;
3787   best_known_dest = successor.best_known_destination;
3788
3789   if (0 != (GNUNET_CRYPTO_cmp_peer_identity (&current_best_known_dest, &my_identity)))
3790   {
3791     next_routing_hop = GDS_ROUTING_get_next_hop (received_intermediate_trail_id,
3792                                                  GDS_ROUTING_SRC_TO_DEST);
3793     if (NULL != next_routing_hop)
3794     {
3795       next_hop = *next_routing_hop;
3796       intermediate_trail_id = received_intermediate_trail_id;
3797       best_known_dest = current_best_known_dest;
3798     }
3799   }
3800
3801   GDS_CLIENTS_process_put (options,
3802                            ntohl (put->block_type),
3803                            hop_count,
3804                            ntohl (put->desired_replication_level),
3805                            putlen, pp,
3806                            GNUNET_TIME_absolute_ntoh (put->expiration_time),
3807                            &put->key,
3808                            payload,
3809                            payload_size);
3810
3811   /* I am the final destination */
3812   if (0 == GNUNET_CRYPTO_cmp_peer_identity (&my_identity, &best_known_dest))
3813   {
3814     DEBUG("\n PUT_REQUEST_SUCCESSFUL for key = %s",GNUNET_h2s(&put->key));
3815     GDS_DATACACHE_handle_put (GNUNET_TIME_absolute_ntoh (put->expiration_time),
3816                               &(put->key),putlen, pp, ntohl (put->block_type),
3817                               payload_size, payload);
3818   }
3819   else
3820   {
3821 #if ENABLE_MALICIOUS
3822   if (0 != GNUNET_CRYPTO_cmp_peer_identity (&successor.best_known_destination,
3823                                             &successor.next_hop))
3824   {
3825     struct FingerInfo *next_hop_finger;
3826     unsigned int i;
3827
3828     next_hop_finger = &finger_table[successor.finger_table_index];
3829     for (i = 0; i < next_hop_finger->trails_count; i++)
3830     {
3831       if (GNUNET_YES == next_hop_finger->trail_list[i].is_present)
3832       {
3833         if(0 == next_hop_finger->trail_list[i].trail_length)
3834         {
3835           GDS_NEIGHBOURS_send_put (&put->key,
3836                                   ntohl (put->block_type),ntohl (put->options),
3837                                   ntohl (put->desired_replication_level),
3838                                   best_known_dest, intermediate_trail_id, &next_hop,
3839                                   hop_count, putlen, pp,
3840                                   GNUNET_TIME_absolute_ntoh (put->expiration_time),
3841                                   payload, payload_size);
3842           return GNUNET_OK;
3843         }
3844         next_hop = next_hop_finger->trail_list[i].trail_head->peer;
3845         GDS_NEIGHBOURS_send_put (&put->key,
3846                                  ntohl (put->block_type),ntohl (put->options),
3847                                  ntohl (put->desired_replication_level),
3848                                  best_known_dest,
3849                                  next_hop_finger->trail_list[i].trail_id,
3850                                  &next_hop, hop_count, putlen, pp,
3851                                  GNUNET_TIME_absolute_ntoh (put->expiration_time),
3852                                  payload, payload_size);
3853        }
3854     }
3855     return GNUNET_OK;
3856   }
3857 #endif
3858   GDS_NEIGHBOURS_send_put (&put->key,
3859                            ntohl (put->block_type),ntohl (put->options),
3860                            ntohl (put->desired_replication_level),
3861                            best_known_dest, intermediate_trail_id, &next_hop,
3862                            hop_count, putlen, pp,
3863                            GNUNET_TIME_absolute_ntoh (put->expiration_time),
3864                            payload, payload_size);
3865    }
3866   return GNUNET_OK;
3867 }
3868
3869
3870 /**
3871  * FIXME: Check for loop in the request. If you already are part of get path,
3872  * then you need to reset the get path length.
3873  * Core handler for p2p get requests.
3874  *
3875  * @param cls closure
3876  * @param peer sender of the request
3877  * @param message message
3878  * @return #GNUNET_OK to keep the connection open,
3879  *         #GNUNET_SYSERR to close it (signal serious error)
3880  */
3881 static int
3882 handle_dht_p2p_get (void *cls, const struct GNUNET_PeerIdentity *peer,
3883                     const struct GNUNET_MessageHeader *message)
3884 {
3885   const struct PeerGetMessage *get;
3886   const struct GNUNET_PeerIdentity *get_path;
3887   struct GNUNET_PeerIdentity best_known_dest;
3888   struct GNUNET_PeerIdentity current_best_known_dest;
3889   struct GNUNET_HashCode intermediate_trail_id;
3890   struct GNUNET_HashCode received_intermediate_trail_id;
3891   struct Closest_Peer successor;
3892   struct GNUNET_PeerIdentity next_hop;
3893   struct GNUNET_PeerIdentity *next_routing_hop;
3894   uint32_t get_length;
3895   uint64_t key_value;
3896   uint32_t hop_count;
3897   size_t msize;
3898
3899   msize = ntohs (message->size);
3900   if (msize < sizeof (struct PeerGetMessage))
3901   {
3902     GNUNET_break_op (0);
3903     return GNUNET_YES;
3904   }
3905
3906   get = (const struct PeerGetMessage *)message;
3907   get_length = ntohl (get->get_path_length);
3908   if ((msize <
3909        sizeof (struct PeerGetMessage) +
3910        get_length * sizeof (struct GNUNET_PeerIdentity)) ||
3911        (get_length >
3912         GNUNET_CONSTANTS_MAX_ENCRYPTED_MESSAGE_SIZE / sizeof (struct GNUNET_PeerIdentity)))
3913   {
3914     GNUNET_break_op (0);
3915     return GNUNET_YES;
3916   }
3917
3918 #if ENABLE_MALICIOUS
3919   if(1 == act_malicious)
3920   {
3921     DEBUG("I am malicious,GET_REQUEST_DROPPED for key = %s. \n",GNUNET_h2s(&get->key));
3922     return GNUNET_OK;
3923   }
3924 #endif
3925   current_best_known_dest = get->best_known_destination;
3926   received_intermediate_trail_id = get->intermediate_trail_id;
3927   get_path = (const struct GNUNET_PeerIdentity *)&get[1];
3928   hop_count = get->hop_count;
3929   hop_count++;
3930
3931
3932   GNUNET_STATISTICS_update (GDS_stats,
3933                             gettext_noop
3934                             ("# Bytes received from other peers"), msize,
3935                             GNUNET_NO);
3936
3937   memcpy (&key_value, &(get->key), sizeof (uint64_t));
3938   key_value = GNUNET_ntohll (key_value);
3939
3940   /* Check if you are already a part of get path. */
3941   unsigned int i;
3942   for (i = 0; i < get_length; i++)
3943   {
3944     if (0 == GNUNET_CRYPTO_cmp_peer_identity (&my_identity, &get_path[i]))
3945     {
3946       get_length = i;
3947       break;
3948     }
3949   }
3950
3951   /* Add yourself in the get path. */
3952   struct GNUNET_PeerIdentity gp[get_length + 1];
3953   memcpy (gp, get_path, get_length * sizeof (struct GNUNET_PeerIdentity));
3954   gp[get_length] = my_identity;
3955   get_length = get_length + 1;
3956   GDS_CLIENTS_process_get (get->options, get->block_type, hop_count,
3957                            get->desired_replication_level, get->get_path_length,
3958                            gp, &get->key);
3959
3960
3961   successor = find_local_best_known_next_hop (key_value,
3962                                                 GDS_FINGER_TYPE_NON_PREDECESSOR);
3963   next_hop = successor.next_hop;
3964   best_known_dest = successor.best_known_destination;
3965   intermediate_trail_id = successor.trail_id;
3966   /* I am not the final destination. I am part of trail to reach final dest. */
3967   if (0 != (GNUNET_CRYPTO_cmp_peer_identity (&current_best_known_dest, &my_identity)))
3968   {
3969     next_routing_hop = GDS_ROUTING_get_next_hop (received_intermediate_trail_id,
3970                                                   GDS_ROUTING_SRC_TO_DEST);
3971     if (NULL != next_routing_hop)
3972     {
3973       next_hop = *next_routing_hop;
3974       best_known_dest = current_best_known_dest;
3975       intermediate_trail_id = received_intermediate_trail_id;
3976     }
3977   }
3978
3979   /* I am the final destination. */
3980   if (0 == GNUNET_CRYPTO_cmp_peer_identity(&my_identity, &best_known_dest))
3981   {
3982     if (1 == get_length)
3983     {
3984       DEBUG("\n GET_REQUEST DONE for key = %s",GNUNET_h2s(&get->key));
3985       GDS_DATACACHE_handle_get (&(get->key),(get->block_type), NULL, 0,
3986                                 NULL, 0, 1, &my_identity, NULL,&my_identity);
3987     }
3988     else
3989     {
3990       GDS_DATACACHE_handle_get (&(get->key),(get->block_type), NULL, 0, NULL, 0,
3991                                 get_length, gp, &gp[get_length - 2],
3992                                 &my_identity);
3993     }
3994   }
3995   else
3996   {
3997
3998 #if ENABLE_MALICIOUS
3999   if (0 != GNUNET_CRYPTO_cmp_peer_identity (&successor.best_known_destination,
4000                                             &successor.next_hop))
4001   {
4002     struct FingerInfo *next_hop_finger;
4003     unsigned int i;
4004
4005     next_hop_finger = &finger_table[successor.finger_table_index];
4006     for (i = 0; i < next_hop_finger->trails_count; i++)
4007     {
4008       if(0 == next_hop_finger->trail_list[i].trail_length)
4009       {
4010         GDS_NEIGHBOURS_send_get (&(get->key), get->block_type, get->options,
4011                                 get->desired_replication_level, best_known_dest,
4012                                 intermediate_trail_id, &next_hop, hop_count,
4013                                 get_length, gp);
4014         return GNUNET_OK;
4015       }
4016       if (GNUNET_YES == next_hop_finger->trail_list[i].is_present)
4017       {
4018         next_hop = next_hop_finger->trail_list[i].trail_head->peer;
4019         GDS_NEIGHBOURS_send_get (&(get->key), get->block_type, get->options,
4020                                  get->desired_replication_level, best_known_dest,
4021                                  next_hop_finger->trail_list[i].trail_id,
4022                                  &next_hop, hop_count,
4023                                  get_length, gp);
4024        }
4025     }
4026     return GNUNET_OK;
4027   }
4028 #endif
4029     GDS_NEIGHBOURS_send_get (&(get->key), get->block_type, get->options,
4030                              get->desired_replication_level, best_known_dest,
4031                              intermediate_trail_id, &next_hop, hop_count,
4032                              get_length, gp);
4033   }
4034   return GNUNET_YES;
4035 }
4036
4037
4038 /**
4039  * Core handler for get result
4040  * @param cls closure
4041  * @param peer sender of the request
4042  * @param message message
4043  * @return #GNUNET_OK to keep the connection open,
4044  *         #GNUNET_SYSERR to close it (signal serious error)
4045  */
4046 static int
4047 handle_dht_p2p_get_result (void *cls, const struct GNUNET_PeerIdentity *peer,
4048                            const struct GNUNET_MessageHeader *message)
4049 {
4050   const struct PeerGetResultMessage *get_result;
4051   const struct GNUNET_PeerIdentity *get_path;
4052   const struct GNUNET_PeerIdentity *put_path;
4053   const void *payload;
4054   size_t payload_size;
4055   size_t msize;
4056   unsigned int getlen;
4057   unsigned int putlen;
4058   int current_path_index;
4059
4060   msize = ntohs (message->size);
4061   if (msize < sizeof (struct PeerGetResultMessage))
4062   {
4063     GNUNET_break_op (0);
4064     return GNUNET_YES;
4065   }
4066
4067   get_result = (const struct PeerGetResultMessage *)message;
4068   getlen = ntohl (get_result->get_path_length);
4069   putlen = ntohl (get_result->put_path_length);
4070
4071   if ((msize <
4072        sizeof (struct PeerGetResultMessage) +
4073        getlen * sizeof (struct GNUNET_PeerIdentity) +
4074        putlen * sizeof (struct GNUNET_PeerIdentity)) ||
4075       (getlen >
4076        GNUNET_CONSTANTS_MAX_ENCRYPTED_MESSAGE_SIZE / sizeof (struct GNUNET_PeerIdentity) ||
4077       (putlen >
4078          GNUNET_CONSTANTS_MAX_ENCRYPTED_MESSAGE_SIZE / sizeof (struct GNUNET_PeerIdentity))))
4079   {
4080     GNUNET_break_op (0);
4081     return GNUNET_YES;
4082   }
4083   DEBUG("GET_RESULT  FOR DATA_SIZE = %lu\n",msize);
4084   GNUNET_STATISTICS_update (GDS_stats,
4085                             gettext_noop
4086                             ("# Bytes received from other peers"), msize,
4087                             GNUNET_NO);
4088
4089   put_path = (const struct GNUNET_PeerIdentity *) &get_result[1];
4090   get_path = &put_path[putlen];
4091   payload = (const void *) &get_path[getlen];
4092   payload_size = msize - (sizeof (struct PeerGetResultMessage) +
4093                          (getlen + putlen) * sizeof (struct GNUNET_PeerIdentity));
4094
4095   if (0 == (GNUNET_CRYPTO_cmp_peer_identity (&my_identity, &(get_path[0]))))
4096   {
4097     GDS_CLIENTS_handle_reply (GNUNET_TIME_absolute_ntoh (get_result->expiration_time),
4098                               &(get_result->key),
4099                               getlen, get_path, putlen,
4100                               put_path, get_result->type, payload_size, payload);
4101     return GNUNET_YES;
4102   }
4103   else
4104   {
4105     current_path_index = search_my_index (get_path, getlen);
4106     if (-1 == current_path_index )
4107     {
4108       DEBUG ("No entry found in get path.\n");
4109       GNUNET_break (0);
4110       return GNUNET_SYSERR;
4111     }
4112     if((getlen + 1) == current_path_index)
4113     {
4114       DEBUG("Present twice in get path. Not allowed. \n");
4115       GNUNET_break (0);
4116       return GNUNET_SYSERR;
4117     }
4118     GDS_NEIGHBOURS_send_get_result (&(get_result->key), get_result->type,
4119                                     &get_path[current_path_index - 1],
4120                                     &(get_result->querying_peer), putlen, put_path,
4121                                     getlen, get_path,
4122                                     GNUNET_TIME_absolute_ntoh (get_result->expiration_time),
4123                                     payload, payload_size);
4124     return GNUNET_YES;
4125   }
4126   return GNUNET_SYSERR;
4127 }
4128
4129
4130 /**
4131  * Find the next hop to pass trail setup message. First find the local best known
4132  * hop from your own identity, friends and finger. If you were part of trail,
4133  * then get the next hop from routing table. Compare next_hop from routing table
4134  * and local best known hop, and return the closest one to final_dest_finger_val
4135  * @param final_dest_finger_val 64 bit value of finger identity
4136  * @param intermediate_trail_id If you are part of trail to reach to some other
4137  *                              finger, then it is the trail id to reach to
4138  *                              that finger, else set to 0.
4139  * @param is_predecessor Are we looking for closest successor or predecessor.
4140  * @param source Source of trail setup message.
4141  * @param current_dest In case you are part of trail, then finger to which
4142  *                     we should forward the message. Else my own identity
4143  * @return Closest Peer for @a final_dest_finger_val
4144  */
4145 static struct Closest_Peer
4146 get_local_best_known_next_hop (uint64_t final_dest_finger_val,
4147                                struct GNUNET_HashCode intermediate_trail_id,
4148                                unsigned int is_predecessor,
4149                                struct GNUNET_PeerIdentity source,
4150                                struct GNUNET_PeerIdentity *current_dest)
4151 {
4152   struct Closest_Peer peer;
4153
4154   peer = find_local_best_known_next_hop (final_dest_finger_val, is_predecessor);
4155
4156   /* Am I just a part of a trail towards a finger (current_destination)? */
4157   if (0 != GNUNET_CRYPTO_cmp_peer_identity (&my_identity, current_dest) &&
4158       0 != GNUNET_CRYPTO_cmp_peer_identity (&peer.best_known_destination,
4159                                             current_dest))
4160   {
4161     struct GNUNET_PeerIdentity closest_peer;
4162
4163     /* Select best successor among one found locally and current_destination
4164      * that we got from network.*/
4165     closest_peer = select_closest_peer (&peer.best_known_destination,
4166                                         current_dest,
4167                                         final_dest_finger_val,
4168                                         is_predecessor);
4169
4170     /* Is current dest (end point of the trail of which I am a part) closest_peer? */
4171     if (0 == GNUNET_CRYPTO_cmp_peer_identity (current_dest, &closest_peer))
4172     {
4173       struct GNUNET_PeerIdentity *next_hop;
4174
4175       next_hop = GDS_ROUTING_get_next_hop (intermediate_trail_id,
4176                                            GDS_ROUTING_SRC_TO_DEST);
4177       /* next_hop NULL is a valid case. This intermediate trail id is set by
4178        some other finger, and while this trail setup is in progress, that other
4179        peer might have found a better trail ,and send trail teardown message
4180        across the network. In case we got the trail teardown message first,
4181        then next_hop will be NULL. A possible solution could be to keep track
4182        * of all removed trail id, and be sure that there is no other reason . */
4183       if(NULL != next_hop)
4184       {
4185          peer.next_hop = *next_hop;
4186          peer.best_known_destination =  *current_dest;
4187          peer.trail_id = intermediate_trail_id;
4188       }
4189     }
4190   }
4191   return peer;
4192 }
4193
4194
4195 /*
4196  * Core handle for PeerTrailSetupMessage.
4197  * @param cls closure
4198  * @param message message
4199  * @param peer peer identity this notification is about
4200  * @return #GNUNET_OK on success, #GNUNET_SYSERR on error
4201  */
4202 static int
4203 handle_dht_p2p_trail_setup (void *cls, const struct GNUNET_PeerIdentity *peer,
4204                             const struct GNUNET_MessageHeader *message)
4205 {
4206   const struct PeerTrailSetupMessage *trail_setup;
4207   const struct GNUNET_PeerIdentity *trail_peer_list;
4208   struct GNUNET_PeerIdentity current_dest;
4209   struct FriendInfo *target_friend;
4210   struct GNUNET_PeerIdentity source;
4211   struct GNUNET_HashCode intermediate_trail_id;
4212   struct GNUNET_HashCode trail_id;
4213   unsigned int is_predecessor;
4214   uint32_t trail_length;
4215   uint64_t final_dest_finger_val;
4216   int i;
4217   size_t msize;
4218
4219   msize = ntohs (message->size);
4220   if (msize < sizeof (struct PeerTrailSetupMessage))
4221   {
4222     GNUNET_break_op (0);
4223     return GNUNET_SYSERR;
4224   }
4225
4226   trail_setup = (const struct PeerTrailSetupMessage *) message;
4227   if ((msize - sizeof (struct PeerTrailSetupMessage)) %
4228       sizeof (struct GNUNET_PeerIdentity) != 0)
4229   {
4230     GNUNET_break_op (0);
4231     return GNUNET_OK;
4232   }
4233   trail_length = (msize - sizeof (struct PeerTrailSetupMessage))/
4234                   sizeof (struct GNUNET_PeerIdentity);
4235
4236   GNUNET_STATISTICS_update (GDS_stats,
4237                             gettext_noop
4238                             ("# Bytes received from other peers"), msize,
4239                             GNUNET_NO);
4240
4241   trail_peer_list = (const struct GNUNET_PeerIdentity *)&trail_setup[1];
4242   current_dest = trail_setup->best_known_destination;
4243   trail_id = trail_setup->trail_id;
4244   final_dest_finger_val =
4245           GNUNET_ntohll (trail_setup->final_destination_finger_value);
4246   source = trail_setup->source_peer;
4247   is_predecessor = ntohl (trail_setup->is_predecessor);
4248   intermediate_trail_id = trail_setup->intermediate_trail_id;
4249
4250   /* Did the friend insert its ID in the trail list? */
4251   if (trail_length > 0 &&
4252       0 != memcmp (&trail_peer_list[trail_length-1], peer, sizeof (struct GNUNET_PeerIdentity)))
4253   {
4254     GNUNET_break_op (0);
4255     return GNUNET_SYSERR;
4256   }
4257
4258    /* If I was the source and got the message back, then set trail length to 0.*/
4259   if (0 == GNUNET_CRYPTO_cmp_peer_identity(&my_identity, &source))
4260   {
4261     trail_length = 0;
4262   }
4263
4264   /* Check if you are present in the trail seen so far? */
4265   for (i = 0; i < trail_length ; i++)
4266   {
4267     if(0 == GNUNET_CRYPTO_cmp_peer_identity(&trail_peer_list[i],&my_identity))
4268     {
4269       /* We will add ourself later in code, if NOT destination. */
4270       trail_length = i;
4271       break;
4272     }
4273   }
4274
4275   /* Is my routing table full?  */
4276   if (GNUNET_YES == GDS_ROUTING_threshold_reached())
4277   {
4278     if (trail_length > 0)
4279       target_friend =
4280                    GNUNET_CONTAINER_multipeermap_get (friend_peermap,
4281                                                       &trail_peer_list[trail_length - 1]);
4282     else
4283       target_friend =
4284                    GNUNET_CONTAINER_multipeermap_get (friend_peermap,
4285                                                       &source);
4286     if(NULL == target_friend)
4287     {
4288       DEBUG ("\n friend not found");
4289       GNUNET_break(0);
4290       return GNUNET_OK;
4291     }
4292     GDS_NEIGHBOURS_send_trail_rejection (source, final_dest_finger_val,
4293                                          my_identity, is_predecessor,
4294                                          trail_peer_list, trail_length,
4295                                          trail_id, target_friend,
4296                                          CONGESTION_TIMEOUT);
4297     return GNUNET_OK;
4298   }
4299
4300   /* Get the next hop to forward the trail setup request. */
4301   struct Closest_Peer next_peer =
4302           get_local_best_known_next_hop (final_dest_finger_val,
4303                                          intermediate_trail_id,
4304                                          is_predecessor,
4305                                          source,
4306                                          &current_dest);
4307
4308   /* Am I the final destination? */
4309   if (0 == (GNUNET_CRYPTO_cmp_peer_identity (&next_peer.best_known_destination,
4310                                              &my_identity)))
4311   {
4312     if(0 == GNUNET_CRYPTO_cmp_peer_identity (&source, &my_identity))
4313     {
4314       finger_table_add (my_identity, NULL, 0, is_predecessor,
4315                         final_dest_finger_val, trail_id);
4316       return GNUNET_OK;
4317     }
4318
4319     if (trail_length > 0)
4320       target_friend =
4321               GNUNET_CONTAINER_multipeermap_get (friend_peermap,
4322                                                  &trail_peer_list[trail_length-1]);
4323     else
4324       target_friend =
4325               GNUNET_CONTAINER_multipeermap_get (friend_peermap, &source);
4326     if (NULL == target_friend)
4327     {
4328       GNUNET_break_op (0);
4329       return GNUNET_SYSERR;
4330     }
4331     GDS_ROUTING_add (trail_id, target_friend->id, my_identity);
4332     GDS_NEIGHBOURS_send_trail_setup_result (source,
4333                                             my_identity,
4334                                             target_friend, trail_length,
4335                                             trail_peer_list,
4336                                             is_predecessor,
4337                                             final_dest_finger_val,trail_id);
4338   }
4339   else /* I'm not the final destination. */
4340   {
4341     target_friend = GNUNET_CONTAINER_multipeermap_get (friend_peermap,
4342                                                        &next_peer.next_hop);
4343     if(NULL == target_friend)
4344     {
4345       DEBUG ("\n target friend not found for peer = %s", GNUNET_i2s(&next_peer.next_hop));
4346       GNUNET_break (0);
4347       return GNUNET_OK;
4348     }
4349     if (0 != GNUNET_CRYPTO_cmp_peer_identity(&my_identity, &source))
4350     {
4351       /* Add yourself to list of peers. */
4352       struct GNUNET_PeerIdentity peer_list[trail_length + 1];
4353
4354       memcpy (peer_list, trail_peer_list,
4355               trail_length * sizeof (struct GNUNET_PeerIdentity));
4356       peer_list[trail_length] = my_identity;
4357       GDS_NEIGHBOURS_send_trail_setup (source,
4358                                        final_dest_finger_val,
4359                                        next_peer.best_known_destination,
4360                                        target_friend, trail_length + 1, peer_list,
4361                                        is_predecessor, trail_id,
4362                                        next_peer.trail_id);
4363     }
4364     else
4365         GDS_NEIGHBOURS_send_trail_setup (source,
4366                                          final_dest_finger_val,
4367                                          next_peer.best_known_destination,
4368                                          target_friend, 0, NULL,
4369                                          is_predecessor, trail_id,
4370                                          next_peer.trail_id);
4371   }
4372   return GNUNET_OK;
4373 }
4374
4375
4376 /**
4377  * Core handle for p2p trail setup result messages.
4378  * @param closure
4379  * @param message message
4380  * @param peer sender of this message.
4381  * @return #GNUNET_OK on success, #GNUNET_SYSERR on error
4382  */
4383 static int
4384 handle_dht_p2p_trail_setup_result(void *cls, const struct GNUNET_PeerIdentity *peer,
4385                                   const struct GNUNET_MessageHeader *message)
4386 {
4387   const struct PeerTrailSetupResultMessage *trail_result;
4388   const struct GNUNET_PeerIdentity *trail_peer_list;
4389   struct GNUNET_PeerIdentity next_hop;
4390   struct FriendInfo *target_friend;
4391   struct GNUNET_PeerIdentity querying_peer;
4392   struct GNUNET_PeerIdentity finger_identity;
4393   uint32_t trail_length;
4394   uint64_t ulitmate_destination_finger_value;
4395   uint32_t is_predecessor;
4396   struct GNUNET_HashCode trail_id;
4397   int my_index;
4398   size_t msize;
4399
4400   msize = ntohs (message->size);
4401   if (msize < sizeof (struct PeerTrailSetupResultMessage))
4402   {
4403     GNUNET_break_op (0);
4404     return GNUNET_YES;
4405   }
4406
4407   trail_result = (const struct PeerTrailSetupResultMessage *) message;
4408   if ((msize - sizeof (struct PeerTrailSetupResultMessage)) %
4409       sizeof (struct GNUNET_PeerIdentity) != 0)
4410   {
4411     GNUNET_break_op (0);
4412     return GNUNET_OK;
4413   }
4414   trail_length = (msize - sizeof (struct PeerTrailSetupResultMessage))/
4415                   sizeof (struct GNUNET_PeerIdentity);
4416
4417   GNUNET_STATISTICS_update (GDS_stats,
4418                             gettext_noop
4419                             ("# Bytes received from other peers"), msize,
4420                             GNUNET_NO);
4421
4422   is_predecessor = ntohl (trail_result->is_predecessor);
4423   querying_peer = trail_result->querying_peer;
4424   finger_identity = trail_result->finger_identity;
4425   trail_id = trail_result->trail_id;
4426   trail_peer_list = (const struct GNUNET_PeerIdentity *) &trail_result[1];
4427   ulitmate_destination_finger_value =
4428           GNUNET_ntohll (trail_result->ulitmate_destination_finger_value);
4429
4430   /* Am I the one who initiated the query? */
4431   if (0 == (GNUNET_CRYPTO_cmp_peer_identity (&querying_peer, &my_identity)))
4432   {
4433     /* Check that you got the message from the correct peer. */
4434     if (trail_length > 0)
4435     {
4436       GNUNET_assert(0 == GNUNET_CRYPTO_cmp_peer_identity (&trail_peer_list[0],
4437                                                           peer));
4438     }
4439     else
4440     {
4441       GNUNET_assert(0 == GNUNET_CRYPTO_cmp_peer_identity (&finger_identity,
4442                                                           peer));
4443     }
4444     GDS_ROUTING_add (trail_id, my_identity, *peer);
4445     finger_table_add (finger_identity, trail_peer_list, trail_length,
4446                       is_predecessor, ulitmate_destination_finger_value, trail_id);
4447     return GNUNET_YES;
4448   }
4449
4450   /* Get my location in the trail. */
4451   my_index = search_my_index (trail_peer_list, trail_length);
4452   if (-1 == my_index)
4453   {
4454     DEBUG ("Not found in trail\n");
4455     GNUNET_break_op(0);
4456     return GNUNET_SYSERR;
4457   }
4458   //TODO; return -2.
4459   if ((trail_length + 1) == my_index)
4460   {
4461     DEBUG ("Found twice in trail.\n");
4462     GNUNET_break_op(0);
4463     return GNUNET_SYSERR;
4464   }
4465
4466   //TODO; Refactor code here and above to check if sender peer is correct
4467   if (my_index == 0)
4468   {
4469     if(trail_length > 1)
4470       GNUNET_assert(0 == GNUNET_CRYPTO_cmp_peer_identity (&trail_peer_list[1],
4471                                                           peer));
4472     else
4473       GNUNET_assert(0 == GNUNET_CRYPTO_cmp_peer_identity (&finger_identity,
4474                                                           peer));
4475     next_hop = trail_result->querying_peer;
4476   }
4477   else
4478   {
4479     if(my_index == trail_length - 1)
4480     {
4481       GNUNET_assert(0 ==
4482                     GNUNET_CRYPTO_cmp_peer_identity (&finger_identity,
4483                                                      peer));
4484     }
4485     else
4486       GNUNET_assert(0 ==
4487                     GNUNET_CRYPTO_cmp_peer_identity (&trail_peer_list[my_index + 1],
4488                                                       peer));
4489     next_hop = trail_peer_list[my_index - 1];
4490   }
4491
4492   target_friend = GNUNET_CONTAINER_multipeermap_get (friend_peermap, &next_hop);
4493   if (NULL == target_friend)
4494   {
4495     GNUNET_break_op (0);
4496     return GNUNET_SYSERR;
4497   }
4498   GDS_ROUTING_add (trail_id, next_hop, *peer);
4499   GDS_NEIGHBOURS_send_trail_setup_result (querying_peer, finger_identity,
4500                                           target_friend, trail_length, trail_peer_list,
4501                                           is_predecessor,
4502                                           ulitmate_destination_finger_value,
4503                                           trail_id);
4504   return GNUNET_OK;
4505 }
4506
4507
4508 /**
4509  * Invert the trail.
4510  * @param trail Trail to be inverted
4511  * @param trail_length Total number of peers in the trail.
4512  * @return Updated trail
4513  */
4514 static struct GNUNET_PeerIdentity *
4515 invert_trail (const struct GNUNET_PeerIdentity *trail,
4516               unsigned int trail_length)
4517 {
4518   int i;
4519   int j;
4520   struct GNUNET_PeerIdentity *inverted_trail;
4521
4522   inverted_trail = GNUNET_malloc (sizeof(struct GNUNET_PeerIdentity) *
4523                                   trail_length);
4524   i = 0;
4525   j = trail_length - 1;
4526   while (i < trail_length)
4527   {
4528     inverted_trail[i] = trail[j];
4529     i++;
4530     j--;
4531   }
4532
4533   GNUNET_assert(NULL != GNUNET_CONTAINER_multipeermap_get(friend_peermap,
4534                                                           &inverted_trail[0]));
4535   return inverted_trail;
4536 }
4537
4538
4539 /**
4540  * Return the shortest trail among all the trails to reach to finger from me.
4541  * @param finger Finger
4542  * @param shortest_trail_length[out] Trail length of shortest trail from me
4543  *                                   to @a finger
4544  * @return Shortest trail.
4545  */
4546 static struct GNUNET_PeerIdentity *
4547 get_shortest_trail (struct FingerInfo *finger,
4548                     unsigned int *trail_length)
4549 {
4550   struct Trail *trail;
4551   unsigned int flag = 0;
4552   unsigned int shortest_trail_index = 0;
4553   int shortest_trail_length = -1;
4554   struct Trail_Element *trail_element;
4555   struct GNUNET_PeerIdentity *trail_list;
4556   unsigned int i;
4557
4558   /* Get the shortest trail to reach to current successor. */
4559   for (i = 0; i < finger->trails_count; i++)
4560   {
4561     trail = &finger->trail_list[i];
4562
4563     if (0 == flag)
4564     {
4565       shortest_trail_index = i;
4566       shortest_trail_length = trail->trail_length;
4567       flag = 1;
4568       continue;
4569     }
4570
4571     if (shortest_trail_length > trail->trail_length)
4572     {
4573       shortest_trail_index = i;
4574       shortest_trail_length = trail->trail_length;
4575     }
4576     continue;
4577   }
4578
4579   /* Copy the shortest trail and return. */
4580   trail = &finger->trail_list[shortest_trail_index];
4581   trail_element = trail->trail_head;
4582
4583   trail_list = GNUNET_malloc (sizeof(struct GNUNET_PeerIdentity)*
4584                               shortest_trail_length);
4585
4586   for(i = 0; i < shortest_trail_length; i++,trail_element = trail_element->next)
4587   {
4588     trail_list[i] = trail_element->peer;
4589   }
4590
4591   GNUNET_assert(shortest_trail_length != -1);
4592
4593   *trail_length = shortest_trail_length;
4594   return trail_list;
4595 }
4596
4597
4598 /**
4599  * Check if trail_1 and trail_2 have any common element. If yes then join
4600  * them at common element. trail_1 always preceeds trail_2 in joined trail.
4601  * @param trail_1 Trail from source to me, NOT including endpoints.
4602  * @param trail_1_len Total number of peers @a trail_1
4603  * @param trail_2 Trail from me to current predecessor, NOT including endpoints.
4604  * @param trail_2_len Total number of peers @a trail_2
4605  * @param joined_trail_len Total number of peers in combined trail of trail_1
4606  *                          trail_2.
4607  * @return Joined trail.
4608  */
4609 static struct GNUNET_PeerIdentity *
4610 check_for_duplicate_entries (const struct GNUNET_PeerIdentity *trail_1,
4611                              unsigned int trail_1_len,
4612                              struct GNUNET_PeerIdentity *trail_2,
4613                              unsigned int trail_2_len,
4614                              unsigned int *joined_trail_len)
4615 {
4616   struct GNUNET_PeerIdentity *joined_trail;
4617   unsigned int i;
4618   unsigned int j;
4619   unsigned int k;
4620
4621   for (i = 0; i < trail_1_len; i++)
4622   {
4623     for (j = 0; j < trail_2_len; j++)
4624     {
4625       if(0 != GNUNET_CRYPTO_cmp_peer_identity (&trail_1[i],&trail_2[j]))
4626         continue;
4627
4628       *joined_trail_len = i + (trail_2_len - j);
4629       joined_trail = GNUNET_malloc (*joined_trail_len *
4630                                     sizeof(struct GNUNET_PeerIdentity));
4631
4632
4633       /* Copy all the elements from 0 to i into joined_trail. */
4634       for(k = 0; k < ( i+1); k++)
4635       {
4636         joined_trail[k] = trail_1[k];
4637       }
4638
4639       /* Increment j as entry stored is same as entry stored at i*/
4640       j = j+1;
4641
4642       /* Copy all the elements from j to trail_2_len-1 to joined trail.*/
4643       while(k <= (*joined_trail_len - 1))
4644       {
4645         joined_trail[k] = trail_2[j];
4646         j++;
4647         k++;
4648       }
4649
4650       return joined_trail;
4651     }
4652   }
4653
4654   /* Here you should join the  trails. */
4655   *joined_trail_len = trail_1_len + trail_2_len + 1;
4656   joined_trail = GNUNET_malloc (*joined_trail_len *
4657                                 sizeof(struct GNUNET_PeerIdentity));
4658
4659
4660   for(i = 0; i < trail_1_len;i++)
4661   {
4662     joined_trail[i] = trail_1[i];
4663   }
4664
4665   joined_trail[i] = my_identity;
4666   i++;
4667
4668   for (j = 0; i < *joined_trail_len; i++,j++)
4669   {
4670     joined_trail[i] = trail_2[j];
4671   }
4672
4673   return joined_trail;
4674 }
4675
4676
4677 /**
4678  * Return the trail from source to my current predecessor. Check if source
4679  * is already part of the this trail, if yes then return the shorten trail.
4680  * @param current_trail Trail from source to me, NOT including the endpoints.
4681  * @param current_trail_length Number of peers in @a current_trail.
4682  * @param trail_src_to_curr_pred_length[out] Number of peers in trail from
4683  *                                           source to my predecessor, NOT including
4684  *                                           the endpoints.
4685  * @return Trail from source to my predecessor.
4686  */
4687 static struct GNUNET_PeerIdentity *
4688 get_trail_src_to_curr_pred (struct GNUNET_PeerIdentity source_peer,
4689                             const struct GNUNET_PeerIdentity *trail_src_to_me,
4690                             unsigned int trail_src_to_me_len,
4691                             unsigned int *trail_src_to_curr_pred_length)
4692 {
4693   struct GNUNET_PeerIdentity *trail_me_to_curr_pred;
4694   struct GNUNET_PeerIdentity *trail_src_to_curr_pred;
4695   unsigned int trail_me_to_curr_pred_length;
4696   struct FingerInfo *current_predecessor;
4697   int i;
4698   unsigned int j;
4699   unsigned int len;
4700
4701   current_predecessor = &finger_table[PREDECESSOR_FINGER_ID];
4702
4703   /* Check if trail_src_to_me contains current_predecessor. */
4704   for (i = 0; i < trail_src_to_me_len; i++)
4705   {
4706     if (0 != GNUNET_CRYPTO_cmp_peer_identity(&trail_src_to_me[i],
4707                                              &current_predecessor->finger_identity))
4708       continue;
4709
4710
4711     *trail_src_to_curr_pred_length = i;
4712
4713     if(0 == i)
4714       return NULL;
4715
4716      trail_src_to_curr_pred = GNUNET_malloc (*trail_src_to_curr_pred_length *
4717                                               sizeof(struct GNUNET_PeerIdentity));
4718      for (j = 0; j < i; j++)
4719        trail_src_to_curr_pred[j] = trail_src_to_me[j];
4720      return trail_src_to_curr_pred;
4721   }
4722
4723
4724   trail_me_to_curr_pred = get_shortest_trail (current_predecessor,
4725                                               &trail_me_to_curr_pred_length);
4726
4727   /* Check if trail contains the source_peer. */
4728   for (i = trail_me_to_curr_pred_length - 1; i >= 0; i--)
4729   {
4730     if (0 != GNUNET_CRYPTO_cmp_peer_identity (&source_peer,
4731                                               &trail_me_to_curr_pred[i]))
4732       continue;
4733
4734     /* Source is NOT part of trail. */
4735     i++;
4736
4737     /* Source is the last element in the trail to reach to my pred.
4738        Source is direct friend of the pred. */
4739     if (trail_me_to_curr_pred_length == i)
4740     {
4741       *trail_src_to_curr_pred_length = 0;
4742       GNUNET_free_non_null (trail_me_to_curr_pred);
4743       return NULL;
4744     }
4745
4746     *trail_src_to_curr_pred_length = trail_me_to_curr_pred_length - i;
4747     trail_src_to_curr_pred = GNUNET_malloc (sizeof (struct GNUNET_PeerIdentity)*
4748                                             *trail_src_to_curr_pred_length);
4749
4750     for (j = 0; j < *trail_src_to_curr_pred_length; i++,j++)
4751       trail_src_to_curr_pred[j] = trail_me_to_curr_pred[i];
4752     GNUNET_free_non_null (trail_me_to_curr_pred);
4753     return trail_src_to_curr_pred;
4754   }
4755
4756   trail_src_to_curr_pred = check_for_duplicate_entries (trail_src_to_me,
4757                                                         trail_src_to_me_len,
4758                                                         trail_me_to_curr_pred,
4759                                                         trail_me_to_curr_pred_length,
4760                                                         &len);
4761   *trail_src_to_curr_pred_length = len;
4762   GNUNET_free_non_null(trail_me_to_curr_pred);
4763   return trail_src_to_curr_pred;
4764 }
4765
4766
4767 /**
4768  * Add finger as your predecessor. To add, first generate a new trail id, invert
4769  * the trail to get the trail from me to finger, add an entry in your routing
4770  * table, send add trail message to peers which are part of trail from me to
4771  * finger and add finger in finger table.
4772  * @param finger
4773  * @param trail
4774  * @param trail_length
4775  */
4776 static void
4777 update_predecessor (struct GNUNET_PeerIdentity finger,
4778                     struct GNUNET_PeerIdentity *trail,
4779                     unsigned int trail_length)
4780 {
4781   struct GNUNET_HashCode trail_to_new_predecessor_id;
4782   struct GNUNET_PeerIdentity *trail_to_new_predecessor;
4783   struct FriendInfo *target_friend;
4784
4785   /* Generate trail id for trail from me to new predecessor = finger. */
4786   GNUNET_CRYPTO_random_block (GNUNET_CRYPTO_QUALITY_STRONG,
4787                               &trail_to_new_predecessor_id,
4788                               sizeof (trail_to_new_predecessor_id));
4789
4790   if (0 == trail_length)
4791   {
4792     trail_to_new_predecessor = NULL;
4793     GDS_ROUTING_add (trail_to_new_predecessor_id, my_identity, finger);
4794     target_friend = GNUNET_CONTAINER_multipeermap_get (friend_peermap, &finger);
4795     if (NULL == target_friend)
4796     {
4797       GNUNET_break (0);
4798       return;
4799     }
4800   }
4801   else
4802   {
4803     /* Invert the trail to get the trail from me to finger, NOT including the
4804        endpoints.*/
4805     GNUNET_assert(NULL != GNUNET_CONTAINER_multipeermap_get(friend_peermap,
4806                                                             &trail[trail_length-1]));
4807     trail_to_new_predecessor = invert_trail (trail, trail_length);
4808
4809     /* Add an entry in your routing table. */
4810     GDS_ROUTING_add (trail_to_new_predecessor_id,
4811                      my_identity,
4812                      trail_to_new_predecessor[0]);
4813
4814     GNUNET_assert (NULL != (target_friend =
4815                    GNUNET_CONTAINER_multipeermap_get (friend_peermap,
4816                                                       &trail_to_new_predecessor[0])));
4817   }
4818
4819   /* Add entry in routing table of all peers that are part of trail from me
4820      to finger, including finger. */
4821   GDS_NEIGHBOURS_send_add_trail (my_identity,
4822                                  finger,
4823                                  trail_to_new_predecessor_id,
4824                                  trail_to_new_predecessor,
4825                                  trail_length,
4826                                  target_friend);
4827
4828   add_new_finger (finger, trail_to_new_predecessor, trail_length,
4829                   trail_to_new_predecessor_id, PREDECESSOR_FINGER_ID);
4830   GNUNET_free_non_null(trail_to_new_predecessor);
4831 }
4832
4833
4834 /*
4835  * Check if you already have a predecessor. If not then add finger as your
4836  * predecessor. If you have predecessor, then compare two peer identites.
4837  * If finger is correct predecessor, then remove the old entry, add finger in
4838  * finger table and send add_trail message to add the trail in the routing
4839  * table of all peers which are part of trail to reach from me to finger.
4840  * @param finger New peer which may be our predecessor.
4841  * @param trail List of peers to reach from @finger to me.
4842  * @param trail_length Total number of peer in @a trail.
4843  */
4844 static void
4845 compare_and_update_predecessor (struct GNUNET_PeerIdentity finger,
4846                                 struct GNUNET_PeerIdentity *trail,
4847                                 unsigned int trail_length)
4848 {
4849   struct FingerInfo *current_predecessor;
4850   struct GNUNET_PeerIdentity closest_peer;
4851   uint64_t predecessor_value;
4852   unsigned int is_predecessor = 1;
4853
4854   current_predecessor = &finger_table[PREDECESSOR_FINGER_ID];
4855   GNUNET_assert (0 != GNUNET_CRYPTO_cmp_peer_identity (&finger, &my_identity));
4856
4857   /* No predecessor. Add finger as your predecessor. */
4858   if (GNUNET_NO == current_predecessor->is_present)
4859   {
4860     update_predecessor (finger, trail, trail_length);
4861     return;
4862   }
4863
4864   if (0 == GNUNET_CRYPTO_cmp_peer_identity (&current_predecessor->finger_identity,
4865                                             &finger))
4866   {
4867     return;
4868   }
4869
4870   predecessor_value = compute_finger_identity_value (PREDECESSOR_FINGER_ID);
4871   closest_peer = select_closest_peer (&finger,
4872                                       &current_predecessor->finger_identity,
4873                                       predecessor_value, is_predecessor);
4874
4875   /* Finger is the closest predecessor. Remove the existing one and add the new
4876      one. */
4877   if (0 == GNUNET_CRYPTO_cmp_peer_identity(&closest_peer, &finger))
4878   {
4879     remove_existing_finger (current_predecessor, PREDECESSOR_FINGER_ID);
4880     update_predecessor (finger, trail, trail_length);
4881     return;
4882   }
4883   return;
4884 }
4885
4886
4887 /*
4888  * Core handle for p2p verify successor messages.
4889  * @param cls closure
4890  * @param message message
4891  * @param peer peer identity this notification is about
4892  * @return #GNUNET_OK on success, #GNUNET_SYSERR on error
4893  */
4894 static int
4895 handle_dht_p2p_verify_successor(void *cls,
4896                                 const struct GNUNET_PeerIdentity *peer,
4897                                 const struct GNUNET_MessageHeader *message)
4898 {
4899   const struct PeerVerifySuccessorMessage *vsm;
4900   struct GNUNET_HashCode trail_id;
4901   struct GNUNET_PeerIdentity successor;
4902   struct GNUNET_PeerIdentity source_peer;
4903   struct GNUNET_PeerIdentity *trail;
4904   struct GNUNET_PeerIdentity *next_hop;
4905   struct FingerInfo current_predecessor;
4906   struct FriendInfo *target_friend;
4907   unsigned int trail_src_to_curr_pred_len = 0;
4908   struct GNUNET_PeerIdentity *trail_src_to_curr_pred;
4909   unsigned int trail_length;
4910   size_t msize;
4911
4912   msize = ntohs (message->size);
4913
4914   if (msize < sizeof (struct PeerVerifySuccessorMessage))
4915   {
4916     GNUNET_break_op (0);
4917     return GNUNET_YES;
4918   }
4919
4920   vsm = (const struct PeerVerifySuccessorMessage *) message;
4921   trail_length = (msize - sizeof (struct PeerVerifySuccessorMessage))/
4922                   sizeof (struct GNUNET_PeerIdentity);
4923   if ((msize - sizeof (struct PeerVerifySuccessorMessage)) %
4924       sizeof (struct GNUNET_PeerIdentity) != 0)
4925   {
4926     GNUNET_break_op (0);
4927     return GNUNET_OK;
4928   }
4929
4930   GNUNET_STATISTICS_update (GDS_stats,
4931                             gettext_noop
4932                             ("# Bytes received from other peers"), msize,
4933                             GNUNET_NO);
4934
4935   trail_id = vsm->trail_id;
4936   source_peer = vsm->source_peer;
4937   successor = vsm->successor;
4938   trail = (struct GNUNET_PeerIdentity *)&vsm[1];
4939
4940   /* I am NOT the successor of source_peer. Pass the message to next_hop on
4941    * the trail. */
4942   if(0 != (GNUNET_CRYPTO_cmp_peer_identity (&successor, &my_identity)))
4943   {
4944     next_hop = GDS_ROUTING_get_next_hop (trail_id, GDS_ROUTING_SRC_TO_DEST);
4945     if (NULL == next_hop)
4946     {
4947       return GNUNET_OK;
4948     }
4949
4950     target_friend = GNUNET_CONTAINER_multipeermap_get (friend_peermap, next_hop);
4951
4952     if(NULL == target_friend)
4953     {
4954       GNUNET_break_op(0);
4955       return GNUNET_OK;
4956     }
4957     GDS_NEIGHBOURS_send_verify_successor_message (source_peer, successor,
4958                                                   trail_id, trail, trail_length,
4959                                                   target_friend);
4960     return GNUNET_OK;
4961   }
4962
4963   /* I am the destination of this message. */
4964
4965   /* Check if the source_peer could be our predecessor and if yes then update
4966    * it.  */
4967   compare_and_update_predecessor (source_peer, trail, trail_length);
4968   current_predecessor = finger_table[PREDECESSOR_FINGER_ID];
4969
4970   /* Is source of this message NOT my predecessor. */
4971   if (0 != (GNUNET_CRYPTO_cmp_peer_identity (&current_predecessor.finger_identity,
4972                                              &source_peer)))
4973   {
4974     trail_src_to_curr_pred =
4975               get_trail_src_to_curr_pred (source_peer,
4976                                           trail,
4977                                           trail_length,
4978                                           &trail_src_to_curr_pred_len);
4979   }
4980   else
4981   {
4982     trail_src_to_curr_pred_len = trail_length;
4983     unsigned int i;
4984
4985     trail_src_to_curr_pred =
4986             GNUNET_malloc (sizeof(struct GNUNET_PeerIdentity)
4987                            *trail_src_to_curr_pred_len);
4988     for(i = 0; i < trail_src_to_curr_pred_len; i++)
4989     {
4990       trail_src_to_curr_pred[i] = trail[i];
4991     }
4992   }
4993
4994   GNUNET_assert (NULL !=
4995                 (target_friend =
4996                  GNUNET_CONTAINER_multipeermap_get (friend_peermap, peer)));
4997   GDS_NEIGHBOURS_send_verify_successor_result (source_peer, my_identity,
4998                                                current_predecessor.finger_identity,
4999                                                trail_id, trail_src_to_curr_pred,
5000                                                trail_src_to_curr_pred_len,
5001                                                GDS_ROUTING_DEST_TO_SRC,
5002                                                target_friend);
5003   GNUNET_free_non_null(trail_src_to_curr_pred);
5004   return GNUNET_OK;
5005 }
5006
5007
5008 /**
5009  * If the trail from me to my probable successor contains a friend not
5010  * at index 0, then we can shorten the trail.
5011  * @param probable_successor Peer which is our probable successor
5012  * @param trail_me_to_probable_successor Peers in path from me to my probable
5013  *                                       successor, NOT including the endpoints.
5014  * @param trail_me_to_probable_successor_len Total number of peers in
5015  *                                           @a trail_me_to_probable_succesor.
5016  * @return Updated trail, if any friend found.
5017  *         Else the trail_me_to_probable_successor.
5018  */
5019 struct GNUNET_PeerIdentity *
5020 check_trail_me_to_probable_succ (struct GNUNET_PeerIdentity probable_successor,
5021                                  const struct GNUNET_PeerIdentity *trail_me_to_probable_successor,
5022                                  unsigned int trail_me_to_probable_successor_len,
5023                                  unsigned int *trail_to_new_successor_length)
5024 {
5025   unsigned int i;
5026   unsigned int j;
5027   struct GNUNET_PeerIdentity *trail_to_new_successor;
5028
5029   /* Probable successor is  a friend */
5030   if (NULL != GNUNET_CONTAINER_multipeermap_get (friend_peermap,
5031                                                  &probable_successor))
5032   {
5033     trail_to_new_successor = NULL;
5034     *trail_to_new_successor_length = 0;
5035     return trail_to_new_successor;
5036   }
5037
5038   /* Is there any friend of yours in this trail. */
5039   if(trail_me_to_probable_successor_len > 1)
5040   {
5041     for (i = trail_me_to_probable_successor_len - 1; i > 0; i--)
5042     {
5043       if (NULL == GNUNET_CONTAINER_multipeermap_get (friend_peermap,
5044                                                      &trail_me_to_probable_successor[i]))
5045         continue;
5046
5047       *trail_to_new_successor_length = (trail_me_to_probable_successor_len - i);
5048       trail_to_new_successor = GNUNET_malloc (sizeof(struct GNUNET_PeerIdentity)*
5049                                                 *trail_to_new_successor_length);
5050
5051
5052       for(j = 0; j < *trail_to_new_successor_length; i++,j++)
5053       {
5054         trail_to_new_successor[j] = trail_me_to_probable_successor[i];
5055       }
5056
5057       return trail_to_new_successor;
5058     }
5059   }
5060
5061   *trail_to_new_successor_length = trail_me_to_probable_successor_len;
5062   return (struct GNUNET_PeerIdentity*)trail_me_to_probable_successor;
5063 }
5064
5065 // TODO: Move up
5066 struct SendNotifyContext
5067 {
5068   struct GNUNET_PeerIdentity source_peer;
5069   struct GNUNET_PeerIdentity successor;
5070   struct GNUNET_PeerIdentity *successor_trail;
5071   unsigned int successor_trail_length;
5072   struct GNUNET_HashCode succesor_trail_id;
5073   struct FriendInfo *target_friend;
5074   unsigned int num_retries_scheduled;
5075 };
5076
5077
5078 void
5079 send_notify_new_successor (void *cls);
5080
5081
5082 /**
5083  * Check if the peer which sent us verify successor result message is still ours
5084  * successor or not. If not, then compare existing successor and probable successor.
5085  * In case probable successor is the correct successor, remove the existing
5086  * successor. Add probable successor as new successor. Send notify new successor
5087  * message to new successor.
5088  * @param curr_succ Peer to which we sent the verify successor message. It may
5089  * or may not be our real current successor, as we may have few iterations of
5090  * find finger trail task.
5091  * @param probable_successor Peer which should be our successor accroding to @a
5092  *                           curr_succ
5093  * @param trail List of peers to reach from me to @a probable successor, NOT including
5094  *              endpoints.
5095  * @param trail_length Total number of peers in @a trail.
5096  */
5097 static void
5098 compare_and_update_successor (struct GNUNET_PeerIdentity curr_succ,
5099                               struct GNUNET_PeerIdentity probable_successor,
5100                               const struct GNUNET_PeerIdentity *trail,
5101                               unsigned int trail_length)
5102 {
5103   struct FingerInfo *current_successor;
5104   struct GNUNET_PeerIdentity closest_peer;
5105   struct GNUNET_HashCode trail_id;
5106   struct GNUNET_PeerIdentity *trail_me_to_probable_succ;
5107   struct FriendInfo *target_friend;
5108   unsigned int trail_me_to_probable_succ_len;
5109   unsigned int is_predecessor = 0;
5110   uint64_t successor_value;
5111
5112   current_successor = &finger_table[0];
5113   successor_value = compute_finger_identity_value(0);
5114
5115   /* If probable successor is same as current_successor, do nothing. */
5116   if(0 == GNUNET_CRYPTO_cmp_peer_identity (&probable_successor,
5117                                            &current_successor->finger_identity))
5118   {
5119     if ((NULL != GDS_stats))
5120     {
5121       char *my_id_str;
5122       uint64_t succ;
5123       char *key;
5124       uint64_t my_id;
5125       memcpy (&my_id, &my_identity, sizeof(uint64_t));
5126       my_id_str = GNUNET_strdup (GNUNET_i2s_full (&my_identity));
5127       memcpy(&succ, &current_successor->finger_identity, sizeof(uint64_t));
5128       succ = GNUNET_ntohll(succ);
5129       GNUNET_asprintf (&key, "XDHT:%s:", my_id_str);
5130       GNUNET_free (my_id_str);
5131
5132       GNUNET_STATISTICS_set (GDS_stats, key, succ, 0);
5133       GNUNET_free (key);
5134     }
5135     if (send_verify_successor_task == NULL)
5136       send_verify_successor_task =
5137               GNUNET_SCHEDULER_add_delayed(verify_successor_next_send_time,
5138                                            &send_verify_successor_message,
5139                                            NULL);
5140     return;
5141   }
5142   closest_peer = select_closest_peer (&probable_successor,
5143                                       &current_successor->finger_identity,
5144                                       successor_value, is_predecessor);
5145
5146   /* If the current_successor in the finger table is closest, then do nothing. */
5147   if (0 == GNUNET_CRYPTO_cmp_peer_identity (&closest_peer ,
5148                                             &current_successor->finger_identity))
5149   {
5150     //FIXME: Is this a good place to return the stats.
5151     if ((NULL != GDS_stats))
5152     {
5153       char *my_id_str;
5154       uint64_t succ;
5155       char *key;
5156
5157       my_id_str = GNUNET_strdup (GNUNET_i2s_full (&my_identity));
5158       memcpy(&succ, &current_successor->finger_identity, sizeof(uint64_t));
5159       GNUNET_asprintf (&key, "XDHT:%s:", my_id_str);
5160       GNUNET_free (my_id_str);
5161       GNUNET_STATISTICS_set (GDS_stats, key, succ, 0);
5162       GNUNET_free (key);
5163     }
5164
5165     if(0 == successor_times)
5166     {
5167 //      successor_times = 3;
5168       verify_successor_next_send_time =
5169               GNUNET_TIME_STD_BACKOFF (verify_successor_next_send_time);
5170     }
5171     else
5172       successor_times--;
5173
5174
5175     if (send_verify_successor_task == NULL)
5176       send_verify_successor_task =
5177               GNUNET_SCHEDULER_add_delayed(verify_successor_next_send_time,
5178                                            &send_verify_successor_message,
5179                                            NULL);
5180     return;
5181   }
5182
5183   /* Probable successor is the closest peer.*/
5184   if(trail_length > 0)
5185   {
5186     GNUNET_assert(NULL != GNUNET_CONTAINER_multipeermap_get(friend_peermap,
5187                                                             &trail[0]));
5188   }
5189   else
5190   {
5191     GNUNET_assert(NULL != GNUNET_CONTAINER_multipeermap_get(friend_peermap,
5192                                                             &probable_successor));
5193   }
5194
5195   trail_me_to_probable_succ_len = 0;
5196   trail_me_to_probable_succ =
5197           check_trail_me_to_probable_succ (probable_successor,
5198                                            trail, trail_length,
5199                                            &trail_me_to_probable_succ_len);
5200
5201   /* Remove the existing successor. */
5202   remove_existing_finger (current_successor, 0);
5203    /* Generate a new trail id to reach to your new successor. */
5204   GNUNET_CRYPTO_random_block (GNUNET_CRYPTO_QUALITY_STRONG,
5205                               &trail_id, sizeof (trail_id));
5206
5207   if (trail_me_to_probable_succ_len > 0)
5208   {
5209     GDS_ROUTING_add (trail_id, my_identity, trail_me_to_probable_succ[0]);
5210     GNUNET_assert (NULL !=
5211                   (target_friend =
5212                       GNUNET_CONTAINER_multipeermap_get (friend_peermap,
5213                                                         &trail_me_to_probable_succ[0])));
5214   }
5215   else
5216   {
5217     GDS_ROUTING_add (trail_id, my_identity, probable_successor);
5218     GNUNET_assert (NULL !=
5219                   (target_friend =
5220                    GNUNET_CONTAINER_multipeermap_get (friend_peermap,
5221                                                       &probable_successor)));
5222   }
5223
5224   add_new_finger (probable_successor, trail_me_to_probable_succ,
5225                   trail_me_to_probable_succ_len, trail_id, 0);
5226
5227   struct SendNotifyContext *notify_ctx;
5228
5229   notify_ctx = GNUNET_new(struct SendNotifyContext);
5230
5231   notify_ctx->source_peer = my_identity;
5232   notify_ctx->successor = probable_successor;
5233   notify_ctx->successor_trail =
5234           GNUNET_malloc(sizeof(struct GNUNET_PeerIdentity) * trail_me_to_probable_succ_len);
5235   memcpy(notify_ctx->successor_trail, trail_me_to_probable_succ,
5236          sizeof(struct GNUNET_PeerIdentity) * trail_me_to_probable_succ_len);
5237   notify_ctx->successor_trail_length = trail_me_to_probable_succ_len;
5238   notify_ctx->succesor_trail_id = trail_id;
5239   notify_ctx->target_friend = target_friend;
5240   notify_ctx->num_retries_scheduled = 0;
5241   GNUNET_free_non_null (trail_me_to_probable_succ);
5242
5243   // TODO: Check if we should verify before schedule if already scheduled.
5244   GNUNET_SCHEDULER_add_now(&send_notify_new_successor, (void*)notify_ctx);
5245 }
5246
5247
5248
5249 void
5250 send_notify_new_successor (void *cls)
5251 {
5252   struct SendNotifyContext *ctx = cls;
5253
5254   GDS_NEIGHBOURS_send_notify_new_successor (ctx->source_peer,
5255                                             ctx->successor,
5256                                             ctx->successor_trail,
5257                                             ctx->successor_trail_length,
5258                                             ctx->succesor_trail_id,
5259                                             ctx->target_friend);
5260
5261   if (0 == ctx->num_retries_scheduled &&
5262           send_notify_new_successor_retry_task != NULL)
5263   {
5264     // Result from previous notify successos hasn't arrived, so the retry task
5265     // hasn't been cancelled! Already a new notify successor must be called.
5266     // We will cancel the retry request.
5267     struct SendNotifyContext *old_notify_ctx;
5268     old_notify_ctx = GNUNET_SCHEDULER_cancel(send_notify_new_successor_retry_task);
5269     GNUNET_free (old_notify_ctx->successor_trail);
5270     GNUNET_free (old_notify_ctx);
5271     send_notify_new_successor_retry_task = NULL;
5272   }
5273
5274   ctx->num_retries_scheduled++;
5275   send_notify_new_successor_retry_task = GNUNET_SCHEDULER_add_delayed(notify_successor_retry_time,
5276                                                                       &send_notify_new_successor,
5277                                                                       cls);
5278 }
5279
5280 /*
5281  * Core handle for p2p verify successor result messages.
5282  * @param cls closure
5283  * @param message message
5284  * @param peer peer identity this notification is about
5285  * @return #GNUNET_OK on success, #GNUNET_SYSERR on error
5286  */
5287 static int
5288 handle_dht_p2p_verify_successor_result(void *cls,
5289                                        const struct GNUNET_PeerIdentity *peer,
5290                                        const struct GNUNET_MessageHeader *message)
5291 {
5292   const struct PeerVerifySuccessorResultMessage *vsrm;
5293   enum GDS_ROUTING_trail_direction trail_direction;
5294   struct GNUNET_PeerIdentity querying_peer;
5295   struct GNUNET_HashCode trail_id;
5296   struct GNUNET_PeerIdentity *next_hop;
5297   struct FriendInfo *target_friend;
5298   struct GNUNET_PeerIdentity probable_successor;
5299   struct GNUNET_PeerIdentity current_successor;
5300   const struct GNUNET_PeerIdentity *trail;
5301   unsigned int trail_length;
5302   size_t msize;
5303
5304   msize = ntohs (message->size);
5305   if (msize < sizeof (struct PeerVerifySuccessorResultMessage))
5306   {
5307     GNUNET_break_op (0);
5308     return GNUNET_YES;
5309   }
5310
5311   vsrm = (const struct PeerVerifySuccessorResultMessage *) message;
5312   if ((msize - sizeof (struct PeerVerifySuccessorResultMessage)) %
5313       sizeof (struct GNUNET_PeerIdentity) != 0)
5314   {
5315     GNUNET_break_op (0);
5316     return GNUNET_OK;
5317   }
5318   trail_length = (msize - sizeof (struct PeerVerifySuccessorResultMessage))/
5319                       sizeof (struct GNUNET_PeerIdentity);
5320
5321   GNUNET_STATISTICS_update (GDS_stats,
5322                             gettext_noop
5323                             ("# Bytes received from other peers"), msize,
5324                             GNUNET_NO);
5325
5326   trail = (const struct GNUNET_PeerIdentity *) &vsrm[1];
5327   querying_peer = vsrm->querying_peer;
5328   trail_direction = ntohl (vsrm->trail_direction);
5329   trail_id = vsrm->trail_id;
5330   probable_successor = vsrm->probable_successor;
5331   current_successor = vsrm->current_successor;
5332
5333   /* I am the querying_peer. */
5334   if(0 == (GNUNET_CRYPTO_cmp_peer_identity (&querying_peer, &my_identity)))
5335   {
5336     /* Cancel Retry Task */
5337     if (NULL != send_verify_successor_retry_task)
5338     {
5339       struct VerifySuccessorContext *ctx;
5340       ctx = GNUNET_SCHEDULER_cancel(send_verify_successor_retry_task);
5341       GNUNET_free(ctx);
5342       send_verify_successor_retry_task = NULL;
5343     }
5344     compare_and_update_successor (current_successor,
5345                                   probable_successor, trail, trail_length);
5346     return GNUNET_OK;
5347   }
5348
5349   /*If you are not the querying peer then pass on the message */
5350   if(NULL == (next_hop =
5351               GDS_ROUTING_get_next_hop (trail_id, trail_direction)))
5352   {
5353     /* Here it may happen that source peer has found a new successor, and removed
5354      the trail, Hence no entry found in the routing table. Fail silently.*/
5355     DEBUG(" NO ENTRY FOUND IN %s ROUTING TABLE for trail id %s, line",
5356             GNUNET_i2s(&my_identity), GNUNET_h2s(&trail_id), __LINE__);
5357     GNUNET_break_op(0);
5358     return GNUNET_OK;
5359   }
5360   if (NULL == (target_friend =
5361                  GNUNET_CONTAINER_multipeermap_get (friend_peermap, next_hop)))
5362   {
5363     GNUNET_break_op(0);
5364     return GNUNET_OK;
5365   }
5366   GDS_NEIGHBOURS_send_verify_successor_result (querying_peer,
5367                                                vsrm->current_successor,
5368                                                probable_successor, trail_id,
5369                                                trail,
5370                                                trail_length,
5371                                                trail_direction, target_friend);
5372   return GNUNET_OK;
5373 }
5374
5375
5376 /*
5377  * Core handle for p2p notify new successor messages.
5378  * @param cls closure
5379  * @param message message
5380  * @param peer peer identity this notification is about
5381  * @return #GNUNET_OK on success, #GNUNET_SYSERR on error
5382  */
5383 static int
5384 handle_dht_p2p_notify_new_successor(void *cls,
5385                                     const struct GNUNET_PeerIdentity *peer,
5386                                     const struct GNUNET_MessageHeader *message)
5387 {
5388   const struct PeerNotifyNewSuccessorMessage *nsm;
5389   struct GNUNET_PeerIdentity *trail;
5390   struct GNUNET_PeerIdentity source;
5391   struct GNUNET_PeerIdentity new_successor;
5392   struct GNUNET_HashCode trail_id;
5393   struct GNUNET_PeerIdentity next_hop;
5394   struct FriendInfo *target_friend;
5395   int my_index;
5396   size_t msize;
5397   uint32_t trail_length;
5398
5399   msize = ntohs (message->size);
5400   if (msize < sizeof (struct PeerNotifyNewSuccessorMessage))
5401   {
5402     GNUNET_break_op (0);
5403     return GNUNET_YES;
5404   }
5405   nsm = (const struct PeerNotifyNewSuccessorMessage *) message;
5406   if ((msize - sizeof (struct PeerNotifyNewSuccessorMessage)) %
5407       sizeof (struct GNUNET_PeerIdentity) != 0)
5408   {
5409     GNUNET_break_op (0);
5410     return GNUNET_OK;
5411   }
5412   trail_length = (msize - sizeof (struct PeerNotifyNewSuccessorMessage))/
5413                   sizeof (struct GNUNET_PeerIdentity);
5414   GNUNET_STATISTICS_update (GDS_stats,
5415                             gettext_noop
5416                             ("# Bytes received from other peers"), msize,
5417                             GNUNET_NO);
5418
5419   trail = (struct GNUNET_PeerIdentity *) &nsm[1];
5420   source  = nsm->source_peer;
5421   new_successor = nsm->new_successor;
5422   trail_id = nsm->trail_id;
5423
5424   /* I am the new_successor to source_peer. */
5425   if ( 0 == GNUNET_CRYPTO_cmp_peer_identity (&my_identity, &new_successor))
5426   {
5427     if(trail_length > 0)
5428       GNUNET_assert(0 == GNUNET_CRYPTO_cmp_peer_identity(&trail[trail_length - 1],
5429                                                           peer));
5430     else
5431       GNUNET_assert(0 == GNUNET_CRYPTO_cmp_peer_identity(&source, peer));
5432
5433     compare_and_update_predecessor (source, trail, trail_length);
5434     target_friend = GNUNET_CONTAINER_multipeermap_get (friend_peermap, peer);
5435     GNUNET_assert (NULL != target_friend);
5436     GDS_NEIGHBOURS_send_notify_succcessor_confirmation (trail_id,
5437                                                         GDS_ROUTING_DEST_TO_SRC,
5438                                                         target_friend);
5439     return GNUNET_OK;
5440   }
5441
5442   GNUNET_assert(trail_length > 0);
5443   /* I am part of trail to reach to successor. */
5444   my_index = search_my_index (trail, trail_length);
5445   if (-1 == my_index)
5446   {
5447     DEBUG ("No entry found in trail\n");
5448     GNUNET_break_op (0);
5449     return GNUNET_SYSERR;
5450   }
5451   if((trail_length + 1) == my_index)
5452   {
5453     DEBUG ("Found twice in trail.\n");
5454     GNUNET_break_op (0);
5455     return GNUNET_SYSERR;
5456   }
5457   if ((trail_length-1) == my_index)
5458     next_hop = new_successor;
5459   else
5460     next_hop = trail[my_index + 1];
5461
5462   GDS_ROUTING_add(trail_id, *peer, next_hop);
5463   target_friend =
5464                  GNUNET_CONTAINER_multipeermap_get (friend_peermap, &next_hop);
5465   if (NULL == target_friend)
5466   {
5467     GNUNET_break(0);
5468     return GNUNET_OK;
5469   }
5470   GDS_NEIGHBOURS_send_notify_new_successor (source, new_successor, trail,
5471                                             trail_length,
5472                                             trail_id, target_friend);
5473   return GNUNET_OK;
5474
5475 }
5476
5477
5478 /**
5479  * Core handler for P2P notify successor message
5480  * @param cls closure
5481  * @param message message
5482  * @param peer peer identity this notification is about
5483  * @return #GNUNET_OK on success, #GNUNET_SYSERR on error
5484  */
5485 static int
5486 handle_dht_p2p_notify_succ_confirmation (void *cls,
5487                                          const struct GNUNET_PeerIdentity *peer,
5488                                          const struct GNUNET_MessageHeader *message)
5489 {
5490   const struct PeerNotifyConfirmationMessage *notify_confirmation;
5491   enum GDS_ROUTING_trail_direction trail_direction;
5492   struct GNUNET_HashCode trail_id;
5493   struct FriendInfo *target_friend;
5494   struct GNUNET_PeerIdentity *next_hop;
5495   size_t msize;
5496
5497   msize = ntohs (message->size);
5498
5499   if (msize != sizeof (struct PeerNotifyConfirmationMessage))
5500   {
5501     GNUNET_break_op (0);
5502     return GNUNET_OK;
5503   }
5504   GNUNET_STATISTICS_update (GDS_stats,
5505                             gettext_noop
5506                             ("# Bytes received from other peers"), msize,
5507                             GNUNET_NO);
5508
5509   notify_confirmation = (const struct PeerNotifyConfirmationMessage *) message;
5510   trail_direction = ntohl (notify_confirmation->trail_direction);
5511   trail_id = notify_confirmation->trail_id;
5512
5513   next_hop = GDS_ROUTING_get_next_hop (trail_id, trail_direction);
5514   if (NULL == next_hop)
5515   {
5516     /* The source of notify new successor, might have found even a better
5517      successor. In that case it send a trail teardown message, and hence,
5518      the next hop is NULL. */
5519     //Fixme: Add some print to confirm the above theory.
5520     return GNUNET_OK;
5521   }
5522
5523   /* I peer which sent the notify successor message to the successor. */
5524   if (0 == GNUNET_CRYPTO_cmp_peer_identity (next_hop, &my_identity))
5525   {
5526    /*
5527     * Schedule another round of verify sucessor with your current successor
5528     * which may or may not be source of this message. This message is used
5529     * only to ensure that we have a path setup to reach to our successor.
5530     */
5531
5532     // TODO: cancel schedule of notify_successor_retry_task
5533     if (send_notify_new_successor_retry_task != NULL)
5534     {
5535       struct SendNotifyContext *notify_ctx;
5536       notify_ctx = GNUNET_SCHEDULER_cancel(send_notify_new_successor_retry_task);
5537       GNUNET_free (notify_ctx->successor_trail);
5538       GNUNET_free (notify_ctx);
5539       send_notify_new_successor_retry_task = NULL;
5540     }
5541     if (send_verify_successor_task == NULL)
5542     {
5543       verify_successor_next_send_time.rel_value_us =
5544       DHT_SEND_VERIFY_SUCCESSOR_INTERVAL.rel_value_us +
5545       GNUNET_CRYPTO_random_u64 (GNUNET_CRYPTO_QUALITY_WEAK,
5546                                 DHT_SEND_VERIFY_SUCCESSOR_INTERVAL.rel_value_us);
5547       send_verify_successor_task =
5548               GNUNET_SCHEDULER_add_delayed(verify_successor_next_send_time,
5549                                            &send_verify_successor_message,
5550                                            NULL);
5551     }
5552   }
5553   else
5554   {
5555     target_friend = GNUNET_CONTAINER_multipeermap_get (friend_peermap, next_hop);
5556     if (NULL == target_friend)
5557     {
5558       DEBUG ("\n friend not found, line number = %d",__LINE__);
5559       return GNUNET_SYSERR;
5560     }
5561     GDS_NEIGHBOURS_send_notify_succcessor_confirmation  (trail_id,
5562                                                         GDS_ROUTING_DEST_TO_SRC,
5563                                                         target_friend);
5564   }
5565   return GNUNET_OK;
5566 }
5567
5568
5569 /**
5570  * Core handler for P2P trail rejection message
5571  * @param cls closure
5572  * @param message message
5573  * @param peer peer identity this notification is about
5574  * @return #GNUNET_OK on success, #GNUNET_SYSERR on error
5575  */
5576 static int
5577 handle_dht_p2p_trail_setup_rejection (void *cls,
5578                                       const struct GNUNET_PeerIdentity *peer,
5579                                       const struct GNUNET_MessageHeader *message)
5580 {
5581   const struct PeerTrailRejectionMessage *trail_rejection;
5582   unsigned int trail_length;
5583   const struct GNUNET_PeerIdentity *trail_peer_list;
5584   struct FriendInfo *target_friend;
5585   struct GNUNET_TIME_Relative congestion_timeout;
5586   struct GNUNET_HashCode trail_id;
5587   struct GNUNET_PeerIdentity next_peer;
5588   struct GNUNET_PeerIdentity source;
5589   uint64_t ultimate_destination_finger_value;
5590   unsigned int is_predecessor;
5591   size_t msize;
5592
5593   msize = ntohs (message->size);
5594   if (msize < sizeof (struct PeerTrailRejectionMessage))
5595   {
5596     GNUNET_break_op (0);
5597     return GNUNET_YES;
5598   }
5599   trail_rejection = (const struct PeerTrailRejectionMessage *) message;
5600   if ((msize - sizeof (struct PeerTrailRejectionMessage)) %
5601       sizeof (struct GNUNET_PeerIdentity) != 0)
5602   {
5603     GNUNET_break_op (0);
5604     return GNUNET_OK;
5605   }
5606   trail_length = (msize - sizeof (struct PeerTrailRejectionMessage))/
5607                   sizeof (struct GNUNET_PeerIdentity);
5608   GNUNET_STATISTICS_update (GDS_stats,
5609                             gettext_noop
5610                             ("# Bytes received from other peers"), msize,
5611                             GNUNET_NO);
5612
5613   trail_peer_list = (const struct GNUNET_PeerIdentity *)&trail_rejection[1];
5614   is_predecessor = ntohl (trail_rejection->is_predecessor);
5615   congestion_timeout = trail_rejection->congestion_time;
5616   source = trail_rejection->source_peer;
5617   trail_id = trail_rejection->trail_id;
5618   ultimate_destination_finger_value =
5619           GNUNET_ntohll (trail_rejection->ultimate_destination_finger_value);
5620   /* First set the congestion time of the friend that sent you this message. */
5621   target_friend = GNUNET_CONTAINER_multipeermap_get (friend_peermap, peer);
5622   if (NULL == target_friend)
5623   {
5624     DEBUG ("\nLINE = %d ,No friend found.",__LINE__);
5625     GNUNET_break(0);
5626     return GNUNET_OK;
5627   }
5628   target_friend->congestion_timestamp =
5629           GNUNET_TIME_absolute_add (GNUNET_TIME_absolute_get(),
5630                                     congestion_timeout);
5631
5632   /* I am the source peer which wants to setup the trail. Do nothing.
5633    * send_find_finger_trail_task is scheduled periodically.*/
5634   if(0 == (GNUNET_CRYPTO_cmp_peer_identity (&my_identity, &source)))
5635     return GNUNET_OK;
5636
5637   /* If I am congested then pass this message to peer before me in trail. */
5638   if(GNUNET_YES == GDS_ROUTING_threshold_reached())
5639   {
5640     /* First remove yourself from the trail. */
5641     unsigned int new_trail_length = trail_length - 1;
5642     struct GNUNET_PeerIdentity trail[new_trail_length];
5643
5644     memcpy (trail, trail_peer_list, new_trail_length * sizeof(struct GNUNET_PeerIdentity));
5645     if (0 == trail_length)
5646       next_peer = source;
5647     else
5648       next_peer = trail[new_trail_length-1];
5649
5650     target_friend =
5651                    GNUNET_CONTAINER_multipeermap_get (friend_peermap, &next_peer);
5652     if (NULL == target_friend)
5653     {
5654       DEBUG ("\nLINE = %d ,No friend found.",__LINE__);
5655       GNUNET_break(0);
5656       return GNUNET_OK;
5657     }
5658     GDS_NEIGHBOURS_send_trail_rejection (source,
5659                                          ultimate_destination_finger_value,
5660                                          my_identity, is_predecessor,
5661                                          trail, new_trail_length, trail_id,
5662                                          target_friend, CONGESTION_TIMEOUT);
5663     return GNUNET_OK;
5664   }
5665
5666   struct Closest_Peer successor;
5667   successor = find_local_best_known_next_hop (ultimate_destination_finger_value, is_predecessor);
5668
5669   /* Am I the final destination? */
5670   if (0 == (GNUNET_CRYPTO_cmp_peer_identity (&successor.best_known_destination,
5671                                              &my_identity)))
5672   {
5673      /*Here you are already part of trail. Copy the trail removing yourself. */
5674     unsigned int new_trail_length = trail_length - 1;
5675     struct GNUNET_PeerIdentity trail[new_trail_length];
5676
5677     memcpy (trail, trail_peer_list, new_trail_length * sizeof(struct GNUNET_PeerIdentity));
5678
5679     if (0 == new_trail_length)
5680       next_peer = source;
5681     else
5682     {
5683       next_peer = trail[new_trail_length-1];
5684     }
5685     target_friend =
5686                    GNUNET_CONTAINER_multipeermap_get (friend_peermap, &next_peer);
5687
5688     if (NULL == target_friend)
5689     {
5690       DEBUG ("\nLINE = %d ,No friend found.",__LINE__);
5691       GNUNET_break(0);
5692       return GNUNET_OK;
5693     }
5694     GDS_NEIGHBOURS_send_trail_setup_result (source,
5695                                             my_identity,
5696                                             target_friend, new_trail_length,
5697                                             trail,
5698                                             is_predecessor,
5699                                             ultimate_destination_finger_value,
5700                                             trail_id);
5701   }
5702   else
5703   {
5704     /* Here I was already part of trail. So no need to add. */
5705     target_friend =
5706                    GNUNET_CONTAINER_multipeermap_get (friend_peermap,
5707                                                       &successor.next_hop);
5708     if (NULL == target_friend)
5709     {
5710       DEBUG ("\nLINE = %d ,No friend found.",__LINE__);
5711       GNUNET_break(0);
5712       return GNUNET_OK;
5713     }
5714
5715     GDS_NEIGHBOURS_send_trail_setup (source,
5716                                      ultimate_destination_finger_value,
5717                                      successor.best_known_destination,
5718                                      target_friend, trail_length, trail_peer_list,
5719                                      is_predecessor, trail_id,
5720                                      successor.trail_id);
5721   }
5722   return GNUNET_OK;
5723 }
5724
5725
5726 /**
5727  * Core handler for trail teardown message.
5728  * @param cls closure
5729  * @param message message
5730  * @param peer sender of this messsage.
5731  * @return #GNUNET_OK on success, #GNUNET_SYSERR on error
5732  */
5733 static int
5734 handle_dht_p2p_trail_teardown (void *cls, const struct GNUNET_PeerIdentity *peer,
5735                                const struct GNUNET_MessageHeader *message)
5736 {
5737   const struct PeerTrailTearDownMessage *trail_teardown;
5738   enum GDS_ROUTING_trail_direction trail_direction;
5739   struct GNUNET_HashCode trail_id;
5740   struct GNUNET_PeerIdentity *next_hop;
5741   size_t msize;
5742
5743   msize = ntohs (message->size);
5744
5745   /* Here we pass only the trail id. */
5746   if (msize != sizeof (struct PeerTrailTearDownMessage))
5747   {
5748     GNUNET_break_op (0);
5749     return GNUNET_OK;
5750   }
5751
5752   GNUNET_STATISTICS_update (GDS_stats,
5753                             gettext_noop
5754                             ("# Bytes received from other peers"), msize,
5755                             GNUNET_NO);
5756
5757   trail_teardown = (const struct PeerTrailTearDownMessage *) message;
5758   trail_direction = ntohl (trail_teardown->trail_direction);
5759   trail_id = trail_teardown->trail_id;
5760
5761   /* Check if peer is the real peer from which we should get this message.*/
5762   /* Get the prev_hop for this trail by getting the next hop in opposite direction. */
5763 #if 0
5764   GNUNET_assert (NULL != (prev_hop =
5765                  GDS_ROUTING_get_next_hop (trail_id, !trail_direction)));
5766   if (0 != GNUNET_CRYPTO_cmp_peer_identity (prev_hop, peer))
5767   {
5768     GNUNET_break (0);
5769     return GNUNET_SYSERR;
5770   }
5771 #endif
5772
5773   next_hop = GDS_ROUTING_get_next_hop (trail_id, trail_direction);
5774   if (NULL == next_hop)
5775   {
5776     DEBUG(" NO ENTRY FOUND IN %s ROUTING TABLE for trail id %s, line",
5777             GNUNET_i2s(&my_identity), GNUNET_h2s(&trail_id), __LINE__);
5778     GNUNET_break (0);
5779     return GNUNET_SYSERR;
5780   }
5781
5782   /* I am the next hop, which means I am the final destination. */
5783   if (0 == GNUNET_CRYPTO_cmp_peer_identity (next_hop, &my_identity))
5784   {
5785     GNUNET_assert (GNUNET_YES == GDS_ROUTING_remove_trail (trail_id));
5786     return GNUNET_OK;
5787   }
5788   else
5789   {
5790     /* If not final destination, then send a trail teardown message to next hop.*/
5791     GNUNET_assert (NULL != GNUNET_CONTAINER_multipeermap_get (friend_peermap, next_hop));
5792     GNUNET_assert (GNUNET_YES == GDS_ROUTING_remove_trail (trail_id));
5793     GDS_NEIGHBOURS_send_trail_teardown (&trail_id, trail_direction, next_hop);
5794   }
5795
5796   return GNUNET_OK;
5797 }
5798
5799
5800 /**
5801  * Core handle for p2p add trail message.
5802  * @param cls closure
5803  * @param message message
5804  * @param peer peer identity this notification is about
5805  * @return #GNUNET_OK on success, #GNUNET_SYSERR on error
5806  */
5807 static int
5808 handle_dht_p2p_add_trail (void *cls, const struct GNUNET_PeerIdentity *peer,
5809                           const struct GNUNET_MessageHeader *message)
5810 {
5811   const struct PeerAddTrailMessage *add_trail;
5812   const struct GNUNET_PeerIdentity *trail;
5813   struct GNUNET_HashCode trail_id;
5814   struct GNUNET_PeerIdentity destination_peer;
5815   struct GNUNET_PeerIdentity source_peer;
5816   struct GNUNET_PeerIdentity next_hop;
5817   unsigned int trail_length;
5818   unsigned int my_index;
5819   size_t msize;
5820
5821   msize = ntohs (message->size);
5822   /* In this message we pass the whole trail from source to destination as we
5823    * are adding that trail.*/
5824   //FIXME: failed when run with 1000 pears. check why.
5825   if (msize < sizeof (struct PeerAddTrailMessage))
5826   {
5827     GNUNET_break_op (0);
5828     return GNUNET_OK;
5829   }
5830
5831   add_trail = (const struct PeerAddTrailMessage *) message;
5832   trail_length = (msize - sizeof (struct PeerAddTrailMessage))/
5833                   sizeof (struct GNUNET_PeerIdentity);
5834   if ((msize - sizeof (struct PeerAddTrailMessage)) %
5835       sizeof (struct GNUNET_PeerIdentity) != 0)
5836   {
5837     GNUNET_break_op (0);
5838     return GNUNET_OK;
5839   }
5840
5841   GNUNET_STATISTICS_update (GDS_stats,
5842                             gettext_noop
5843                             ("# Bytes received from other peers"), msize,
5844                             GNUNET_NO);
5845
5846   trail = (const struct GNUNET_PeerIdentity *)&add_trail[1];
5847   destination_peer = add_trail->destination_peer;
5848   source_peer = add_trail->source_peer;
5849   trail_id = add_trail->trail_id;
5850
5851   /* I am not the destination of the trail. */
5852   if (0 != GNUNET_CRYPTO_cmp_peer_identity (&my_identity, &destination_peer))
5853   {
5854     struct FriendInfo *target_friend;
5855
5856     /* Get my location in the trail. */
5857     my_index = search_my_index (trail, trail_length);
5858     if (-1 == my_index)
5859     {
5860       GNUNET_break_op (0);
5861       return GNUNET_SYSERR;
5862     }
5863     if((trail_length + 1) == my_index)
5864     {
5865       DEBUG ("Found twice in trail.\n");
5866       GNUNET_break_op (0);
5867       return GNUNET_SYSERR;
5868     }
5869     if ((trail_length - 1) == my_index)
5870     {
5871       next_hop = destination_peer;
5872     }
5873     else
5874     {
5875       next_hop = trail[my_index + 1];
5876     }
5877     /* Add in your routing table. */
5878     GNUNET_assert (GNUNET_OK == GDS_ROUTING_add (trail_id, *peer, next_hop));
5879     //GNUNET_assert (GNUNET_OK == GDS_ROUTING_add (trail_id, next_hop, *peer));
5880     GNUNET_assert (NULL !=
5881                   (target_friend =
5882                    GNUNET_CONTAINER_multipeermap_get (friend_peermap, &next_hop)));
5883     GDS_NEIGHBOURS_send_add_trail (source_peer, destination_peer, trail_id,
5884                                    trail, trail_length, target_friend);
5885     return GNUNET_OK;
5886   }
5887   /* I am the destination. Add an entry in routing table. */
5888   GNUNET_assert (GNUNET_OK == GDS_ROUTING_add (trail_id, *peer, my_identity));
5889   return GNUNET_OK;
5890 }
5891
5892
5893 /**
5894  * Free the finger trail in which the first friend to reach to a finger is
5895  * disconnected_friend. Also remove entry from routing table for that particular
5896  * trail id.
5897  * @param disconnected_friend PeerIdentity of friend which got disconnected
5898  * @param remove_finger Finger whose trail we need to check if it has
5899  *                      disconnected_friend as the first hop.
5900  * @return Total number of trails in which disconnected_friend was the first
5901  *         hop.
5902  */
5903 static int
5904 remove_matching_trails (const struct GNUNET_PeerIdentity *disconnected_friend,
5905                         struct FingerInfo *finger)
5906 {
5907   struct GNUNET_PeerIdentity *next_hop;
5908   struct FriendInfo *remove_friend;
5909   struct Trail *current_trail;
5910   unsigned int matching_trails_count = 0;
5911   int i;
5912
5913   /* Iterate over all the trails of finger. */
5914   for (i = 0; i < finger->trails_count; i++)
5915   {
5916     current_trail = &finger->trail_list[i];
5917     if (GNUNET_NO == current_trail->is_present)
5918       continue;
5919
5920     /* First friend to reach to finger is disconnected_peer. */
5921     if (0 == GNUNET_CRYPTO_cmp_peer_identity (&current_trail->trail_head->peer,
5922                                               disconnected_friend))
5923     {
5924       remove_friend =
5925                      GNUNET_CONTAINER_multipeermap_get (friend_peermap,
5926                                                         disconnected_friend);
5927       GNUNET_assert (NULL != remove_friend);
5928       next_hop = GDS_ROUTING_get_next_hop (current_trail->trail_id,
5929                                            GDS_ROUTING_SRC_TO_DEST);
5930
5931       /* Here it may happen that as all the peers got disconnected, the entry in
5932        routing table for that particular trail has been removed, because the
5933        previously disconnected peer was either a next hop or prev hop of that
5934        peer. */
5935       if (NULL != next_hop)
5936       {
5937         GNUNET_assert (0 == (GNUNET_CRYPTO_cmp_peer_identity (disconnected_friend,
5938                                                               next_hop)));
5939         GNUNET_assert (GNUNET_YES == GDS_ROUTING_remove_trail (current_trail->trail_id));
5940       }
5941       matching_trails_count++;
5942       free_trail (current_trail);
5943       current_trail->is_present = GNUNET_NO;
5944     }
5945   }
5946   return matching_trails_count;
5947 }
5948
5949
5950 /**
5951  * Iterate over finger_table entries.
5952  * 0. Ignore finger which is my_identity or if no valid entry present at
5953  *    that finger index.
5954  * 1. If disconnected_friend is a finger, then remove the routing entry from
5955       your own table. Free the trail.
5956  * 2. Check if disconnected_friend is the first friend in the trail to reach to a finger.
5957  *   2.1 Remove all the trails and entry from routing table in which disconnected
5958  *       friend is the first friend in the trail. If disconnected_friend is the
5959  *       first friend in all the trails to reach finger, then remove the finger.
5960  * @param disconnected_friend Peer identity of friend which got disconnected.
5961  */
5962 static void
5963 remove_matching_fingers (const struct GNUNET_PeerIdentity *disconnected_peer)
5964 {
5965   struct FingerInfo *current_finger;
5966   int removed_trails_count;
5967   int i;
5968
5969   /* Iterate over finger table entries. */
5970   for (i = 0; i < MAX_FINGERS; i++)
5971   {
5972     current_finger = &finger_table[i];
5973
5974     /* No finger stored at this trail index or I am the finger. */
5975     if ((GNUNET_NO == current_finger->is_present) ||
5976         (0 == GNUNET_CRYPTO_cmp_peer_identity (&current_finger->finger_identity,
5977                                                &my_identity)))
5978       continue;
5979
5980     /* Is disconnected_peer a finger? */
5981     if (0 == GNUNET_CRYPTO_cmp_peer_identity (disconnected_peer,
5982                                               &current_finger->finger_identity))
5983     {
5984       remove_existing_finger (current_finger, i);
5985     }
5986
5987     /* If finger is a friend but not disconnected_friend, then continue. */
5988     if (NULL != GNUNET_CONTAINER_multipeermap_get (friend_peermap,
5989                                                    &current_finger->finger_identity))
5990       continue;
5991
5992     /* Iterate over the list of trails to reach remove_finger. Check if
5993      * disconnected_friend is the first friend in any of the trail. */
5994     removed_trails_count = remove_matching_trails (disconnected_peer,
5995                                                    current_finger);
5996     current_finger->trails_count =
5997             current_finger->trails_count - removed_trails_count;
5998     if (0 == current_finger->trails_count)
5999     {
6000       current_finger->is_present = GNUNET_NO;
6001       memset ((void *)&finger_table[i], 0, sizeof (finger_table[i]));
6002     }
6003   }
6004 }
6005
6006
6007 /**
6008  * Method called whenever a peer disconnects.
6009  *
6010  * @param cls closure
6011  * @param peer peer identity this notification is about
6012  */
6013 static void
6014 handle_core_disconnect (void *cls,
6015                                           const struct GNUNET_PeerIdentity *peer)
6016 {
6017   struct FriendInfo *remove_friend;
6018   struct P2PPendingMessage *pos;
6019   unsigned int discarded;
6020
6021   /* If disconnected to own identity, then return. */
6022   if (0 == memcmp (&my_identity, peer, sizeof (struct GNUNET_PeerIdentity)))
6023     return;
6024
6025   if(NULL == (remove_friend =
6026                  GNUNET_CONTAINER_multipeermap_get (friend_peermap, peer)))
6027   {
6028     DEBUG("\n friend already disconnected.");
6029     return;
6030   }
6031
6032   remove_matching_fingers (peer);
6033   GNUNET_assert (GNUNET_SYSERR != GDS_ROUTING_remove_trail_by_peer (peer));
6034   GNUNET_assert (GNUNET_YES ==
6035                  GNUNET_CONTAINER_multipeermap_remove (friend_peermap,
6036                                                        peer,
6037                                                        remove_friend));
6038
6039   /* Remove all the messages queued in pending list of this peer is discarded.*/
6040   if (remove_friend->th != NULL)
6041   {
6042     GNUNET_CORE_notify_transmit_ready_cancel(remove_friend->th);
6043     remove_friend->th = NULL;
6044   }
6045
6046   discarded = 0;
6047   while (NULL != (pos = remove_friend->head))
6048   {
6049     GNUNET_CONTAINER_DLL_remove (remove_friend->head, remove_friend->tail, pos);
6050     discarded++;
6051     GNUNET_free (pos);
6052   }
6053
6054   GNUNET_STATISTICS_update (GDS_stats,
6055                             gettext_noop
6056                             ("# Queued messages discarded (peer disconnected)"),
6057                             discarded, GNUNET_NO);
6058   //GNUNET_free (remove_friend);
6059
6060   if (0 != GNUNET_CONTAINER_multipeermap_size (friend_peermap))
6061     return;
6062
6063   if (NULL != find_finger_trail_task)
6064   {
6065       GNUNET_SCHEDULER_cancel (find_finger_trail_task);
6066       find_finger_trail_task = NULL;
6067   }
6068   else
6069     GNUNET_break (0);
6070 }
6071
6072
6073 /**
6074  * Method called whenever a peer connects.
6075  *
6076  * @param cls closure
6077  * @param peer_identity peer identity this notification is about
6078  */
6079 static void
6080 handle_core_connect (void *cls, const struct GNUNET_PeerIdentity *peer_identity)
6081 {
6082   struct FriendInfo *friend;
6083
6084   /* Check for connect to self message */
6085   if (0 == memcmp (&my_identity, peer_identity, sizeof (struct GNUNET_PeerIdentity)))
6086     return;
6087
6088   /* If peer already exists in our friend_peermap, then exit. */
6089   if (GNUNET_YES == GNUNET_CONTAINER_multipeermap_contains (friend_peermap,
6090                                                             peer_identity))
6091   {
6092     GNUNET_break (0);
6093     return;
6094   }
6095
6096   friend = GNUNET_new (struct FriendInfo);
6097   friend->id = *peer_identity;
6098
6099   GNUNET_assert (GNUNET_OK ==
6100                  GNUNET_CONTAINER_multipeermap_put (friend_peermap,
6101                                                     peer_identity, friend,
6102                                                     GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY));
6103
6104   /* FIXME: now we are not making a distinction between fingers which are friends
6105    * also.But later, we should add a congestion timestamp on the friend, so that it is
6106    * selected after some time out. This is to ensure that both peers have added
6107    * each other as their friend. */
6108   /* Got a first connection, good time to start with FIND FINGER TRAIL requests...*/
6109   if (NULL == find_finger_trail_task)
6110   {
6111     find_finger_trail_task = GNUNET_SCHEDULER_add_now (&send_find_finger_trail_message, NULL);
6112   }
6113 }
6114
6115
6116 /**
6117  * To be called on core init/fail.
6118  *
6119  * @param cls service closure
6120  * @param identity the public identity of this peer
6121  */
6122 static void
6123 core_init (void *cls,
6124            const struct GNUNET_PeerIdentity *identity)
6125 {
6126   my_identity = *identity;
6127 }
6128
6129
6130 /**
6131  * Initialize finger table entries.
6132  */
6133 static void
6134 finger_table_init ()
6135 {
6136   memset (&finger_table, 0, sizeof (finger_table));
6137 }
6138
6139
6140 /**
6141  * Initialize neighbours subsystem.
6142  * @return #GNUNET_OK on success, #GNUNET_SYSERR on error
6143  */
6144 int
6145 GDS_NEIGHBOURS_init (void)
6146 {
6147   static struct GNUNET_CORE_MessageHandler core_handlers[] = {
6148     {&handle_dht_p2p_put, GNUNET_MESSAGE_TYPE_XDHT_P2P_PUT, 0},
6149     {&handle_dht_p2p_get, GNUNET_MESSAGE_TYPE_XDHT_P2P_GET, 0},
6150     {&handle_dht_p2p_get_result, GNUNET_MESSAGE_TYPE_XDHT_P2P_GET_RESULT, 0},
6151     {&handle_dht_p2p_trail_setup, GNUNET_MESSAGE_TYPE_XDHT_P2P_TRAIL_SETUP, 0},
6152     {&handle_dht_p2p_trail_setup_result, GNUNET_MESSAGE_TYPE_XDHT_P2P_TRAIL_SETUP_RESULT, 0},
6153     {&handle_dht_p2p_verify_successor, GNUNET_MESSAGE_TYPE_XDHT_P2P_VERIFY_SUCCESSOR, 0},
6154     {&handle_dht_p2p_verify_successor_result, GNUNET_MESSAGE_TYPE_XDHT_P2P_VERIFY_SUCCESSOR_RESULT, 0},
6155     {&handle_dht_p2p_notify_new_successor, GNUNET_MESSAGE_TYPE_XDHT_P2P_NOTIFY_NEW_SUCCESSOR, 0},
6156     {&handle_dht_p2p_trail_setup_rejection, GNUNET_MESSAGE_TYPE_XDHT_P2P_TRAIL_SETUP_REJECTION, 0},
6157     {&handle_dht_p2p_trail_teardown, GNUNET_MESSAGE_TYPE_XDHT_P2P_TRAIL_TEARDOWN,
6158                                      sizeof (struct PeerTrailTearDownMessage)},
6159     {&handle_dht_p2p_add_trail, GNUNET_MESSAGE_TYPE_XDHT_P2P_ADD_TRAIL, 0},
6160     {&handle_dht_p2p_notify_succ_confirmation, GNUNET_MESSAGE_TYPE_XDHT_P2P_NOTIFY_SUCCESSOR_CONFIRMATION,
6161                                       sizeof (struct PeerNotifyConfirmationMessage)},
6162     {NULL, 0, 0}
6163   };
6164
6165 #if ENABLE_MALICIOUS
6166   act_malicious = 0;
6167 #endif
6168
6169   core_api =
6170     GNUNET_CORE_connect (GDS_cfg, NULL, &core_init, &handle_core_connect,
6171                          &handle_core_disconnect, NULL, GNUNET_NO, NULL,
6172                          GNUNET_NO, core_handlers);
6173
6174   if (NULL == core_api)
6175     return GNUNET_SYSERR;
6176
6177   //TODO: check size of this peer map?
6178   friend_peermap = GNUNET_CONTAINER_multipeermap_create (256, GNUNET_NO);
6179   finger_table_init ();
6180   successor_times = 10;
6181   fingers_round_count = 5;
6182   find_finger_trail_task_next_send_time.rel_value_us =
6183       DHT_FIND_FINGER_TRAIL_INTERVAL.rel_value_us +
6184       GNUNET_CRYPTO_random_u64 (GNUNET_CRYPTO_QUALITY_WEAK,
6185                                 DHT_FIND_FINGER_TRAIL_INTERVAL.rel_value_us);
6186
6187   verify_successor_next_send_time.rel_value_us =
6188       DHT_SEND_VERIFY_SUCCESSOR_INTERVAL.rel_value_us +
6189       GNUNET_CRYPTO_random_u64 (GNUNET_CRYPTO_QUALITY_WEAK,
6190                                 DHT_SEND_VERIFY_SUCCESSOR_INTERVAL.rel_value_us);
6191
6192   verify_successor_retry_time.rel_value_us =
6193       DHT_SEND_VERIFY_SUCCESSOR_RETRY_INTERVAL.rel_value_us +
6194       GNUNET_CRYPTO_random_u64 (GNUNET_CRYPTO_QUALITY_WEAK,
6195                                 DHT_SEND_VERIFY_SUCCESSOR_RETRY_INTERVAL.rel_value_us);
6196
6197   notify_successor_retry_time.rel_value_us =
6198       DHT_SEND_NOTIFY_SUCCESSOR_RETRY_INTERVAL.rel_value_us +
6199       GNUNET_CRYPTO_random_u64 (GNUNET_CRYPTO_QUALITY_WEAK,
6200                                 DHT_SEND_NOTIFY_SUCCESSOR_RETRY_INTERVAL.rel_value_us);
6201
6202
6203   return GNUNET_OK;
6204 }
6205
6206
6207 /**
6208  * Free the memory held up by trails of a finger.
6209  */
6210 static void
6211 delete_finger_table_entries()
6212 {
6213   unsigned int i;
6214   unsigned int j;
6215
6216   for(i = 0; i < MAX_FINGERS; i++)
6217   {
6218     if(GNUNET_YES == finger_table[i].is_present)
6219     {
6220       for(j = 0; j < finger_table[i].trails_count; j++)
6221         free_trail(&finger_table[i].trail_list[j]);
6222     }
6223   }
6224 }
6225
6226
6227 /**
6228  * Shutdown neighbours subsystem.
6229  */
6230 void
6231 GDS_NEIGHBOURS_done (void)
6232 {
6233   if (NULL == core_api)
6234     return;
6235
6236   GNUNET_CORE_disconnect (core_api);
6237   core_api = NULL;
6238
6239   delete_finger_table_entries();
6240   GNUNET_assert (0 == GNUNET_CONTAINER_multipeermap_size (friend_peermap));
6241   GNUNET_CONTAINER_multipeermap_destroy (friend_peermap);
6242   friend_peermap = NULL;
6243
6244   if (NULL != find_finger_trail_task)
6245   {
6246     GNUNET_SCHEDULER_cancel (find_finger_trail_task);
6247     find_finger_trail_task = NULL;
6248   }
6249
6250   if (NULL != send_verify_successor_task)
6251   {
6252     GNUNET_SCHEDULER_cancel (send_verify_successor_task);
6253     send_verify_successor_task = NULL;
6254   }
6255
6256   if (NULL != send_verify_successor_retry_task)
6257   {
6258     struct VerifySuccessorContext *ctx;
6259     ctx = GNUNET_SCHEDULER_cancel (send_verify_successor_retry_task);
6260     GNUNET_free(ctx);
6261     send_verify_successor_retry_task = NULL;
6262   }
6263
6264   if (send_notify_new_successor_retry_task != NULL)
6265   {
6266     struct SendNotifyContext *notify_ctx;
6267     notify_ctx = GNUNET_SCHEDULER_cancel(send_notify_new_successor_retry_task);
6268     GNUNET_free (notify_ctx->successor_trail);
6269     GNUNET_free (notify_ctx);
6270     send_notify_new_successor_retry_task = NULL;
6271   }
6272 }
6273
6274
6275 /**
6276  * Get my identity
6277  *
6278  * @return my identity
6279  */
6280 struct GNUNET_PeerIdentity
6281 GDS_NEIGHBOURS_get_my_id (void)
6282 {
6283   return my_identity;
6284 }
6285
6286 /* end of gnunet-service-xdht_neighbours.c */