continue to fix extract result
[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 %u",
3313           GNUNET_i2s (&my_identity),
3314           GNUNET_h2s (&trail->trail_id),
3315           __LINE__);
3316     GNUNET_break(0);
3317     return;
3318   }
3319   trail_length = trail->trail_length;
3320   if (trail_length > 0)
3321   {
3322      /* Copy the trail into peer list. */
3323     struct GNUNET_PeerIdentity peer_list[trail_length];
3324     element = trail->trail_head;
3325     for(i = 0; i < trail_length; i++)
3326     {
3327       peer_list[i] = element->peer;
3328       element = element->next;
3329     }
3330     GNUNET_assert (NULL != (target_friend =
3331                             GNUNET_CONTAINER_multipeermap_get (friend_peermap,
3332                                                                &peer_list[0])));
3333     GDS_NEIGHBOURS_send_verify_successor_message (my_identity,
3334                                                   successor->finger_identity,
3335                                                   trail_id, peer_list, trail_length,
3336                                                   target_friend);
3337   }
3338   else
3339   {
3340     GNUNET_assert (NULL != (target_friend =
3341                             GNUNET_CONTAINER_multipeermap_get (friend_peermap,
3342                                                                &successor->finger_identity)));
3343     GDS_NEIGHBOURS_send_verify_successor_message (my_identity,
3344                                                   successor->finger_identity,
3345                                                   trail_id, NULL, 0,
3346                                                   target_friend);
3347   }
3348 }
3349
3350
3351 /**
3352  * FIXME: should this be a periodic task, incrementing the search finger index?
3353  * Update the current search finger index.
3354  * @a finger_identity
3355  * @a finger_table_index
3356  */
3357 static void
3358 update_current_search_finger_index (unsigned int finger_table_index)
3359 {
3360   struct FingerInfo *successor;
3361
3362   /* FIXME correct this: only move current index periodically */
3363   if (finger_table_index != current_search_finger_index)
3364     return;
3365
3366   successor = &finger_table[0];
3367   GNUNET_assert (GNUNET_YES == successor->is_present);
3368
3369   /* We were looking for immediate successor.  */
3370   if (0 == current_search_finger_index)
3371   {
3372     current_search_finger_index = PREDECESSOR_FINGER_ID;
3373     if (0 != GNUNET_CRYPTO_cmp_peer_identity (&my_identity, &successor->finger_identity))
3374     {
3375       if (NULL == send_verify_successor_task)
3376       {
3377         send_verify_successor_task =
3378                 GNUNET_SCHEDULER_add_now (&send_verify_successor_message, NULL);
3379       }
3380     }
3381     return;
3382   }
3383
3384   current_search_finger_index = current_search_finger_index - 1;
3385   return;
3386 }
3387
3388
3389 /**
3390  * Get the least significant bit set in val.
3391  *
3392  * @param val Value
3393  * @return Position of first bit set, 65 in case of error.
3394  */
3395 static unsigned int
3396 find_set_bit (uint64_t val)
3397 {
3398   uint64_t i;
3399   unsigned int pos;
3400
3401   i = 1;
3402   pos = 0;
3403
3404   while (!(i & val))
3405   {
3406     i = i << 1;
3407     pos++;
3408     if (pos > 63)
3409     {
3410       GNUNET_break (0);
3411       return 65;
3412     }
3413   }
3414
3415   if (val/i != 1)
3416     return 65; /* Some other bit was set to 1 as well. */
3417
3418   return pos;
3419 }
3420
3421
3422 /**
3423  * Calculate finger_table_index from initial 64 bit finger identity value that
3424  * we send in trail setup message.
3425  * @param ultimate_destination_finger_value Value that we calculated from our
3426  *                                          identity and finger_table_index.
3427  * @param is_predecessor Is the entry for predecessor or not?
3428  * @return finger_table_index Value between 0 <= finger_table_index <= 64
3429  *         finger_table_index > PREDECESSOR_FINGER_ID, if error occurs.
3430  */
3431 static unsigned int
3432 get_finger_table_index (uint64_t ultimate_destination_finger_value,
3433                         unsigned int is_predecessor)
3434 {
3435   uint64_t my_id64;
3436   uint64_t diff;
3437   unsigned int finger_table_index;
3438
3439   memcpy (&my_id64, &my_identity, sizeof (uint64_t));
3440   my_id64 = GNUNET_ntohll (my_id64);
3441
3442   /* Is this a predecessor finger? */
3443   if (1 == is_predecessor)
3444   {
3445     diff =  my_id64 - ultimate_destination_finger_value;
3446     if (1 == diff)
3447       finger_table_index = PREDECESSOR_FINGER_ID;
3448     else
3449       finger_table_index = PREDECESSOR_FINGER_ID + 1; //error value
3450
3451   }
3452   else
3453   {
3454     diff = ultimate_destination_finger_value - my_id64;
3455     finger_table_index = find_set_bit (diff);
3456   }
3457   return finger_table_index;
3458 }
3459
3460
3461 /**
3462  * Remove finger and its associated data structures from finger table.
3463  * @param existing_finger Finger to be removed which is in finger table.
3464  * @param finger_table_index Index in finger table where @a existing_finger
3465  *                           is stored.
3466  */
3467 static void
3468 remove_existing_finger (struct FingerInfo *existing_finger,
3469                         unsigned int finger_table_index)
3470 {
3471   GNUNET_assert (GNUNET_YES == existing_finger->is_present);
3472
3473   /* If I am my own finger, then we have no trails. */
3474   if (0 == GNUNET_CRYPTO_cmp_peer_identity (&existing_finger->finger_identity,
3475                                             &my_identity))
3476   {
3477     existing_finger->is_present = GNUNET_NO;
3478     memset ((void *)&finger_table[finger_table_index], 0,
3479             sizeof (finger_table[finger_table_index]));
3480     return;
3481   }
3482
3483   /* For all other fingers, send trail teardown across all the trails to reach
3484    finger, and free the finger. */
3485   send_all_finger_trails_teardown (existing_finger);
3486   free_finger (existing_finger, finger_table_index);
3487 }
3488
3489
3490 /**
3491  * Check if there is already an entry in finger_table at finger_table_index.
3492  * We get the finger_table_index from 64bit finger value we got from the network.
3493  * -- If yes, then select the closest finger.
3494  *   -- If new and existing finger are same, then check if you can store more
3495  *      trails.
3496  *      -- If yes then add trail, else keep the best trails to reach to the
3497  *         finger.
3498  *   -- If the new finger is closest, remove the existing entry, send trail
3499  *      teardown message across all the trails to reach the existing entry.
3500  *      Add the new finger.
3501  *  -- If new and existing finger are different, and existing finger is closest
3502  *     then do nothing.
3503  * -- Update current_search_finger_index.
3504  * @param finger_identity Peer Identity of new finger
3505  * @param finger_trail Trail to reach the new finger
3506  * @param finger_trail_length Total number of peers in @a new_finger_trail.
3507  * @param is_predecessor Is this entry for predecessor in finger_table?
3508  * @param finger_value 64 bit value of finger identity that we got from network.
3509  * @param finger_trail_id Unique identifier of @finger_trail.
3510  */
3511 static void
3512 finger_table_add (struct GNUNET_PeerIdentity finger_identity,
3513                   const struct GNUNET_PeerIdentity *finger_trail,
3514                   unsigned int finger_trail_length,
3515                   unsigned int is_predecessor,
3516                   uint64_t finger_value,
3517                   struct GNUNET_HashCode finger_trail_id)
3518 {
3519   struct FingerInfo *existing_finger;
3520   struct GNUNET_PeerIdentity closest_peer;
3521   struct FingerInfo *successor;
3522   unsigned int finger_table_index;
3523
3524   /* Get the finger_table_index corresponding to finger_value we got from network.*/
3525   finger_table_index = get_finger_table_index (finger_value, is_predecessor);
3526
3527   /* Invalid finger_table_index. */
3528   if ((finger_table_index > PREDECESSOR_FINGER_ID))
3529   {
3530     GNUNET_break_op (0);
3531     return;
3532   }
3533
3534   /* Check if  new entry is same as successor. */
3535   if ((0 != finger_table_index) &&
3536       (PREDECESSOR_FINGER_ID != finger_table_index))
3537   {
3538     successor = &finger_table[0];
3539     if (GNUNET_NO == successor->is_present)
3540     {
3541       GNUNET_break (0); //ASSERTION FAILS HERE. FIXME
3542       return;
3543     }
3544     if (0 == GNUNET_CRYPTO_cmp_peer_identity (&finger_identity,
3545                                               &successor->finger_identity))
3546     {
3547       if (0 == fingers_round_count)
3548       {
3549          find_finger_trail_task_next_send_time =
3550               GNUNET_TIME_STD_BACKOFF(find_finger_trail_task_next_send_time);
3551       }
3552       else
3553         fingers_round_count--;
3554       current_search_finger_index = 0;
3555       GNUNET_STATISTICS_update (GDS_stats,
3556                                 gettext_noop
3557                                 ("# FINGERS_COUNT"), (int64_t) total_fingers_found,
3558                                 GNUNET_NO);
3559       total_fingers_found  = 0;
3560       return;
3561     }
3562
3563     struct FingerInfo prev_finger;
3564     prev_finger = finger_table[finger_table_index - 1];
3565     if (0 == GNUNET_CRYPTO_cmp_peer_identity (&finger_identity,
3566                                               &prev_finger.finger_identity))
3567     {
3568        current_search_finger_index--;
3569        return;
3570     }
3571   }
3572
3573   total_fingers_found++;
3574   existing_finger = &finger_table[finger_table_index];
3575
3576   /* No entry present in finger_table for given finger map index. */
3577   if (GNUNET_NO == existing_finger->is_present)
3578   {
3579      /* Shorten the trail if possible. */
3580     add_new_finger (finger_identity, finger_trail,
3581                     finger_trail_length,
3582                     finger_trail_id, finger_table_index);
3583     update_current_search_finger_index (finger_table_index);
3584     return;
3585   }
3586
3587   /* If existing entry and finger identity are not same. */
3588   if (0 != GNUNET_CRYPTO_cmp_peer_identity (&(existing_finger->finger_identity),
3589                                             &finger_identity))
3590   {
3591     closest_peer = select_closest_peer (&existing_finger->finger_identity,
3592                                         &finger_identity,
3593                                         finger_value,
3594                                         is_predecessor);
3595
3596     /* If the new finger is the closest peer. */
3597     if (0 == GNUNET_CRYPTO_cmp_peer_identity (&finger_identity, &closest_peer))
3598     {
3599       remove_existing_finger (existing_finger, finger_table_index);
3600       add_new_finger (finger_identity, finger_trail, finger_trail_length,
3601                       finger_trail_id, finger_table_index);
3602     }
3603     else
3604     {
3605       /* Existing finger is the closest one. We need to send trail teardown
3606          across the trail setup in routing table of all the peers. */
3607       if (0 != GNUNET_CRYPTO_cmp_peer_identity (&finger_identity, &my_identity))
3608       {
3609         if (finger_trail_length > 0)
3610           GDS_NEIGHBOURS_send_trail_teardown (&finger_trail_id,
3611                                               GDS_ROUTING_SRC_TO_DEST,
3612                                               &finger_trail[0]);
3613         else
3614           GDS_NEIGHBOURS_send_trail_teardown (&finger_trail_id,
3615                                               GDS_ROUTING_SRC_TO_DEST,
3616                                               &finger_identity);
3617       }
3618     }
3619   }
3620   else
3621   {
3622     /* If both new and existing entry are same as my_identity, then do nothing. */
3623     if (0 == GNUNET_CRYPTO_cmp_peer_identity (&(existing_finger->finger_identity),
3624                                               &my_identity))
3625     {
3626       return;
3627     }
3628
3629     /* If there is space to store more trails. */
3630     if (existing_finger->trails_count < MAXIMUM_TRAILS_PER_FINGER)
3631         add_new_trail (existing_finger, finger_trail,
3632                        finger_trail_length, finger_trail_id);
3633     else
3634         select_and_replace_trail (existing_finger, finger_trail,
3635                                   finger_trail_length, finger_trail_id);
3636   }
3637   update_current_search_finger_index (finger_table_index);
3638   return;
3639 }
3640
3641
3642 /**
3643  * Core handler for P2P put messages.
3644  * @param cls closure
3645  * @param peer sender of the request
3646  * @param message message
3647  * @return #GNUNET_OK to keep the connection open,
3648  *         #GNUNET_SYSERR to close it (signal serious error)
3649  */
3650 static int
3651 handle_dht_p2p_put (void *cls, const struct GNUNET_PeerIdentity *peer,
3652                     const struct GNUNET_MessageHeader *message)
3653 {
3654   struct PeerPutMessage *put;
3655   struct GNUNET_PeerIdentity *put_path;
3656   struct GNUNET_PeerIdentity current_best_known_dest;
3657   struct GNUNET_PeerIdentity best_known_dest;
3658   struct GNUNET_HashCode received_intermediate_trail_id;
3659   struct GNUNET_HashCode intermediate_trail_id;
3660   struct GNUNET_PeerIdentity next_hop;
3661   struct GNUNET_PeerIdentity *next_routing_hop;
3662   enum GNUNET_DHT_RouteOption options;
3663   struct GNUNET_HashCode test_key;
3664   void *payload;
3665   size_t msize;
3666   uint32_t putlen;
3667   uint32_t hop_count;
3668   size_t payload_size;
3669   uint64_t key_value;
3670
3671   msize = ntohs (message->size);
3672   if (msize < sizeof (struct PeerPutMessage))
3673   {
3674     GNUNET_break_op (0);
3675     return GNUNET_OK;
3676   }
3677
3678   put = (struct PeerPutMessage *) message;
3679   putlen = ntohl (put->put_path_length);
3680   if ((msize <
3681        sizeof (struct PeerPutMessage) +
3682        putlen * sizeof (struct GNUNET_PeerIdentity)) ||
3683       (putlen >
3684        GNUNET_CONSTANTS_MAX_ENCRYPTED_MESSAGE_SIZE / sizeof (struct GNUNET_PeerIdentity)))
3685   {
3686     GNUNET_break_op (0);
3687     return GNUNET_OK;
3688   }
3689 #if ENABLE_MALICIOUS
3690   if(1 == act_malicious)
3691   {
3692     DEBUG("\n I AM MALICIOUS PUT_REQUEST_DROPPED for key = %ss",GNUNET_h2s(&put->key));
3693     return GNUNET_OK;
3694   }
3695 #endif
3696   GNUNET_STATISTICS_update (GDS_stats,
3697                             gettext_noop
3698                             ("# Bytes received from other peers"), (int64_t) msize,
3699                             GNUNET_NO);
3700
3701   current_best_known_dest = put->best_known_destination;
3702   put_path = (struct GNUNET_PeerIdentity *) &put[1];
3703   payload = &put_path[putlen];
3704   options = ntohl (put->options);
3705   received_intermediate_trail_id = put->intermediate_trail_id;
3706   hop_count = ntohl(put->hop_count);
3707   payload_size = msize - (sizeof (struct PeerPutMessage) +
3708                           putlen * sizeof (struct GNUNET_PeerIdentity));
3709   hop_count++;
3710   switch (GNUNET_BLOCK_get_key (GDS_block_context, ntohl (put->block_type),
3711                                 payload, payload_size, &test_key))
3712   {
3713     case GNUNET_YES:
3714       if (0 != memcmp (&test_key, &put->key, sizeof (struct GNUNET_HashCode)))
3715       {
3716         char *put_s = GNUNET_strdup (GNUNET_h2s_full (&put->key));
3717         GNUNET_break_op (0);
3718         GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
3719                     "PUT with key `%s' for block with key %s\n",
3720                      put_s, GNUNET_h2s_full (&test_key));
3721         GNUNET_free (put_s);
3722         return GNUNET_OK;
3723       }
3724     break;
3725     case GNUNET_NO:
3726       GNUNET_break_op (0);
3727       return GNUNET_OK;
3728     case GNUNET_SYSERR:
3729       /* cannot verify, good luck */
3730       break;
3731   }
3732
3733    if (ntohl (put->block_type) == GNUNET_BLOCK_TYPE_REGEX) /* FIXME: do for all tpyes */
3734   {
3735     switch (GNUNET_BLOCK_evaluate (GDS_block_context,
3736                                    ntohl (put->block_type),
3737                                    GNUNET_BLOCK_EO_NONE,
3738                                    NULL,    /* query */
3739                                    NULL, 0, /* bloom filer */
3740                                    NULL, 0, /* xquery */
3741                                    payload, payload_size))
3742     {
3743     case GNUNET_BLOCK_EVALUATION_OK_MORE:
3744     case GNUNET_BLOCK_EVALUATION_OK_LAST:
3745       break;
3746
3747     case GNUNET_BLOCK_EVALUATION_OK_DUPLICATE:
3748     case GNUNET_BLOCK_EVALUATION_RESULT_INVALID:
3749     case GNUNET_BLOCK_EVALUATION_RESULT_IRRELEVANT:
3750     case GNUNET_BLOCK_EVALUATION_REQUEST_VALID:
3751     case GNUNET_BLOCK_EVALUATION_REQUEST_INVALID:
3752     case GNUNET_BLOCK_EVALUATION_TYPE_NOT_SUPPORTED:
3753     default:
3754       GNUNET_break_op (0);
3755       return GNUNET_OK;
3756     }
3757   }
3758
3759   /* Check if you are already a part of put path. */
3760   unsigned int i;
3761   for (i = 0; i < putlen; i++)
3762   {
3763     if(0 == GNUNET_CRYPTO_cmp_peer_identity (&my_identity, &put_path[i]))
3764     {
3765       putlen = i;
3766       break;
3767     }
3768   }
3769
3770   /* Add yourself to the list. */
3771   struct GNUNET_PeerIdentity pp[putlen + 1];
3772   //if (0 != (options & GNUNET_DHT_RO_RECORD_ROUTE))
3773   if (1)
3774   {
3775     memcpy (pp, put_path, putlen * sizeof (struct GNUNET_PeerIdentity));
3776     pp[putlen] = my_identity;
3777     putlen++;
3778   }
3779   else
3780     putlen = 0;
3781
3782   memcpy (&key_value, &(put->key), sizeof (uint64_t));
3783   struct Closest_Peer successor;
3784   key_value = GNUNET_ntohll (key_value);
3785   successor = find_local_best_known_next_hop (key_value,
3786                                               GDS_FINGER_TYPE_NON_PREDECESSOR);
3787   next_hop = successor.next_hop;
3788   intermediate_trail_id = successor.trail_id;
3789   best_known_dest = successor.best_known_destination;
3790
3791   if (0 != (GNUNET_CRYPTO_cmp_peer_identity (&current_best_known_dest, &my_identity)))
3792   {
3793     next_routing_hop = GDS_ROUTING_get_next_hop (received_intermediate_trail_id,
3794                                                  GDS_ROUTING_SRC_TO_DEST);
3795     if (NULL != next_routing_hop)
3796     {
3797       next_hop = *next_routing_hop;
3798       intermediate_trail_id = received_intermediate_trail_id;
3799       best_known_dest = current_best_known_dest;
3800     }
3801   }
3802
3803   GDS_CLIENTS_process_put (options,
3804                            ntohl (put->block_type),
3805                            hop_count,
3806                            ntohl (put->desired_replication_level),
3807                            putlen, pp,
3808                            GNUNET_TIME_absolute_ntoh (put->expiration_time),
3809                            &put->key,
3810                            payload,
3811                            payload_size);
3812
3813   /* I am the final destination */
3814   if (0 == GNUNET_CRYPTO_cmp_peer_identity (&my_identity, &best_known_dest))
3815   {
3816     DEBUG("\n PUT_REQUEST_SUCCESSFUL for key = %s",GNUNET_h2s(&put->key));
3817     GDS_DATACACHE_handle_put (GNUNET_TIME_absolute_ntoh (put->expiration_time),
3818                               &(put->key),putlen, pp, ntohl (put->block_type),
3819                               payload_size, payload);
3820   }
3821   else
3822   {
3823 #if ENABLE_MALICIOUS
3824   if (0 != GNUNET_CRYPTO_cmp_peer_identity (&successor.best_known_destination,
3825                                             &successor.next_hop))
3826   {
3827     struct FingerInfo *next_hop_finger;
3828     unsigned int i;
3829
3830     next_hop_finger = &finger_table[successor.finger_table_index];
3831     for (i = 0; i < next_hop_finger->trails_count; i++)
3832     {
3833       if (GNUNET_YES == next_hop_finger->trail_list[i].is_present)
3834       {
3835         if(0 == next_hop_finger->trail_list[i].trail_length)
3836         {
3837           GDS_NEIGHBOURS_send_put (&put->key,
3838                                   ntohl (put->block_type),ntohl (put->options),
3839                                   ntohl (put->desired_replication_level),
3840                                   best_known_dest, intermediate_trail_id, &next_hop,
3841                                   hop_count, putlen, pp,
3842                                   GNUNET_TIME_absolute_ntoh (put->expiration_time),
3843                                   payload, payload_size);
3844           return GNUNET_OK;
3845         }
3846         next_hop = next_hop_finger->trail_list[i].trail_head->peer;
3847         GDS_NEIGHBOURS_send_put (&put->key,
3848                                  ntohl (put->block_type),ntohl (put->options),
3849                                  ntohl (put->desired_replication_level),
3850                                  best_known_dest,
3851                                  next_hop_finger->trail_list[i].trail_id,
3852                                  &next_hop, hop_count, putlen, pp,
3853                                  GNUNET_TIME_absolute_ntoh (put->expiration_time),
3854                                  payload, payload_size);
3855        }
3856     }
3857     return GNUNET_OK;
3858   }
3859 #endif
3860   GDS_NEIGHBOURS_send_put (&put->key,
3861                            ntohl (put->block_type),ntohl (put->options),
3862                            ntohl (put->desired_replication_level),
3863                            best_known_dest, intermediate_trail_id, &next_hop,
3864                            hop_count, putlen, pp,
3865                            GNUNET_TIME_absolute_ntoh (put->expiration_time),
3866                            payload, payload_size);
3867    }
3868   return GNUNET_OK;
3869 }
3870
3871
3872 /**
3873  * FIXME: Check for loop in the request. If you already are part of get path,
3874  * then you need to reset the get path length.
3875  * Core handler for p2p get requests.
3876  *
3877  * @param cls closure
3878  * @param peer sender of the request
3879  * @param message message
3880  * @return #GNUNET_OK to keep the connection open,
3881  *         #GNUNET_SYSERR to close it (signal serious error)
3882  */
3883 static int
3884 handle_dht_p2p_get (void *cls, const struct GNUNET_PeerIdentity *peer,
3885                     const struct GNUNET_MessageHeader *message)
3886 {
3887   const struct PeerGetMessage *get;
3888   const struct GNUNET_PeerIdentity *get_path;
3889   struct GNUNET_PeerIdentity best_known_dest;
3890   struct GNUNET_PeerIdentity current_best_known_dest;
3891   struct GNUNET_HashCode intermediate_trail_id;
3892   struct GNUNET_HashCode received_intermediate_trail_id;
3893   struct Closest_Peer successor;
3894   struct GNUNET_PeerIdentity next_hop;
3895   struct GNUNET_PeerIdentity *next_routing_hop;
3896   uint32_t get_length;
3897   uint64_t key_value;
3898   uint32_t hop_count;
3899   size_t msize;
3900
3901   msize = ntohs (message->size);
3902   if (msize < sizeof (struct PeerGetMessage))
3903   {
3904     GNUNET_break_op (0);
3905     return GNUNET_YES;
3906   }
3907
3908   get = (const struct PeerGetMessage *)message;
3909   get_length = ntohl (get->get_path_length);
3910   if ((msize <
3911        sizeof (struct PeerGetMessage) +
3912        get_length * sizeof (struct GNUNET_PeerIdentity)) ||
3913        (get_length >
3914         GNUNET_CONSTANTS_MAX_ENCRYPTED_MESSAGE_SIZE / sizeof (struct GNUNET_PeerIdentity)))
3915   {
3916     GNUNET_break_op (0);
3917     return GNUNET_YES;
3918   }
3919
3920 #if ENABLE_MALICIOUS
3921   if(1 == act_malicious)
3922   {
3923     DEBUG("I am malicious,GET_REQUEST_DROPPED for key = %s. \n",GNUNET_h2s(&get->key));
3924     return GNUNET_OK;
3925   }
3926 #endif
3927   current_best_known_dest = get->best_known_destination;
3928   received_intermediate_trail_id = get->intermediate_trail_id;
3929   get_path = (const struct GNUNET_PeerIdentity *)&get[1];
3930   hop_count = get->hop_count;
3931   hop_count++;
3932
3933
3934   GNUNET_STATISTICS_update (GDS_stats,
3935                             gettext_noop
3936                             ("# Bytes received from other peers"), msize,
3937                             GNUNET_NO);
3938
3939   memcpy (&key_value, &(get->key), sizeof (uint64_t));
3940   key_value = GNUNET_ntohll (key_value);
3941
3942   /* Check if you are already a part of get path. */
3943   unsigned int i;
3944   for (i = 0; i < get_length; i++)
3945   {
3946     if (0 == GNUNET_CRYPTO_cmp_peer_identity (&my_identity, &get_path[i]))
3947     {
3948       get_length = i;
3949       break;
3950     }
3951   }
3952
3953   /* Add yourself in the get path. */
3954   struct GNUNET_PeerIdentity gp[get_length + 1];
3955   memcpy (gp, get_path, get_length * sizeof (struct GNUNET_PeerIdentity));
3956   gp[get_length] = my_identity;
3957   get_length = get_length + 1;
3958   GDS_CLIENTS_process_get (get->options, get->block_type, hop_count,
3959                            get->desired_replication_level, get->get_path_length,
3960                            gp, &get->key);
3961
3962
3963   successor = find_local_best_known_next_hop (key_value,
3964                                                 GDS_FINGER_TYPE_NON_PREDECESSOR);
3965   next_hop = successor.next_hop;
3966   best_known_dest = successor.best_known_destination;
3967   intermediate_trail_id = successor.trail_id;
3968   /* I am not the final destination. I am part of trail to reach final dest. */
3969   if (0 != (GNUNET_CRYPTO_cmp_peer_identity (&current_best_known_dest, &my_identity)))
3970   {
3971     next_routing_hop = GDS_ROUTING_get_next_hop (received_intermediate_trail_id,
3972                                                   GDS_ROUTING_SRC_TO_DEST);
3973     if (NULL != next_routing_hop)
3974     {
3975       next_hop = *next_routing_hop;
3976       best_known_dest = current_best_known_dest;
3977       intermediate_trail_id = received_intermediate_trail_id;
3978     }
3979   }
3980
3981   /* I am the final destination. */
3982   if (0 == GNUNET_CRYPTO_cmp_peer_identity(&my_identity, &best_known_dest))
3983   {
3984     if (1 == get_length)
3985     {
3986       DEBUG("\n GET_REQUEST DONE for key = %s",GNUNET_h2s(&get->key));
3987       GDS_DATACACHE_handle_get (&(get->key),(get->block_type), NULL, 0,
3988                                 NULL, 0, 1, &my_identity, NULL,&my_identity);
3989     }
3990     else
3991     {
3992       GDS_DATACACHE_handle_get (&(get->key),(get->block_type), NULL, 0, NULL, 0,
3993                                 get_length, gp, &gp[get_length - 2],
3994                                 &my_identity);
3995     }
3996   }
3997   else
3998   {
3999
4000 #if ENABLE_MALICIOUS
4001   if (0 != GNUNET_CRYPTO_cmp_peer_identity (&successor.best_known_destination,
4002                                             &successor.next_hop))
4003   {
4004     struct FingerInfo *next_hop_finger;
4005     unsigned int i;
4006
4007     next_hop_finger = &finger_table[successor.finger_table_index];
4008     for (i = 0; i < next_hop_finger->trails_count; i++)
4009     {
4010       if(0 == next_hop_finger->trail_list[i].trail_length)
4011       {
4012         GDS_NEIGHBOURS_send_get (&(get->key), get->block_type, get->options,
4013                                 get->desired_replication_level, best_known_dest,
4014                                 intermediate_trail_id, &next_hop, hop_count,
4015                                 get_length, gp);
4016         return GNUNET_OK;
4017       }
4018       if (GNUNET_YES == next_hop_finger->trail_list[i].is_present)
4019       {
4020         next_hop = next_hop_finger->trail_list[i].trail_head->peer;
4021         GDS_NEIGHBOURS_send_get (&(get->key), get->block_type, get->options,
4022                                  get->desired_replication_level, best_known_dest,
4023                                  next_hop_finger->trail_list[i].trail_id,
4024                                  &next_hop, hop_count,
4025                                  get_length, gp);
4026        }
4027     }
4028     return GNUNET_OK;
4029   }
4030 #endif
4031     GDS_NEIGHBOURS_send_get (&(get->key), get->block_type, get->options,
4032                              get->desired_replication_level, best_known_dest,
4033                              intermediate_trail_id, &next_hop, hop_count,
4034                              get_length, gp);
4035   }
4036   return GNUNET_YES;
4037 }
4038
4039
4040 /**
4041  * Core handler for get result
4042  * @param cls closure
4043  * @param peer sender of the request
4044  * @param message message
4045  * @return #GNUNET_OK to keep the connection open,
4046  *         #GNUNET_SYSERR to close it (signal serious error)
4047  */
4048 static int
4049 handle_dht_p2p_get_result (void *cls, const struct GNUNET_PeerIdentity *peer,
4050                            const struct GNUNET_MessageHeader *message)
4051 {
4052   const struct PeerGetResultMessage *get_result;
4053   const struct GNUNET_PeerIdentity *get_path;
4054   const struct GNUNET_PeerIdentity *put_path;
4055   const void *payload;
4056   size_t payload_size;
4057   size_t msize;
4058   unsigned int getlen;
4059   unsigned int putlen;
4060   int current_path_index;
4061
4062   msize = ntohs (message->size);
4063   if (msize < sizeof (struct PeerGetResultMessage))
4064   {
4065     GNUNET_break_op (0);
4066     return GNUNET_YES;
4067   }
4068
4069   get_result = (const struct PeerGetResultMessage *)message;
4070   getlen = ntohl (get_result->get_path_length);
4071   putlen = ntohl (get_result->put_path_length);
4072
4073   if ((msize <
4074        sizeof (struct PeerGetResultMessage) +
4075        getlen * sizeof (struct GNUNET_PeerIdentity) +
4076        putlen * sizeof (struct GNUNET_PeerIdentity)) ||
4077       (getlen >
4078        GNUNET_CONSTANTS_MAX_ENCRYPTED_MESSAGE_SIZE / sizeof (struct GNUNET_PeerIdentity) ||
4079       (putlen >
4080          GNUNET_CONSTANTS_MAX_ENCRYPTED_MESSAGE_SIZE / sizeof (struct GNUNET_PeerIdentity))))
4081   {
4082     GNUNET_break_op (0);
4083     return GNUNET_YES;
4084   }
4085   DEBUG("GET_RESULT  FOR DATA_SIZE = %lu\n",msize);
4086   GNUNET_STATISTICS_update (GDS_stats,
4087                             gettext_noop
4088                             ("# Bytes received from other peers"), msize,
4089                             GNUNET_NO);
4090
4091   put_path = (const struct GNUNET_PeerIdentity *) &get_result[1];
4092   get_path = &put_path[putlen];
4093   payload = (const void *) &get_path[getlen];
4094   payload_size = msize - (sizeof (struct PeerGetResultMessage) +
4095                          (getlen + putlen) * sizeof (struct GNUNET_PeerIdentity));
4096
4097   if (0 == (GNUNET_CRYPTO_cmp_peer_identity (&my_identity, &(get_path[0]))))
4098   {
4099     GDS_CLIENTS_handle_reply (GNUNET_TIME_absolute_ntoh (get_result->expiration_time),
4100                               &(get_result->key),
4101                               getlen, get_path, putlen,
4102                               put_path, get_result->type, payload_size, payload);
4103     return GNUNET_YES;
4104   }
4105   else
4106   {
4107     current_path_index = search_my_index (get_path, getlen);
4108     if (-1 == current_path_index )
4109     {
4110       DEBUG ("No entry found in get path.\n");
4111       GNUNET_break (0);
4112       return GNUNET_SYSERR;
4113     }
4114     if((getlen + 1) == current_path_index)
4115     {
4116       DEBUG("Present twice in get path. Not allowed. \n");
4117       GNUNET_break (0);
4118       return GNUNET_SYSERR;
4119     }
4120     GDS_NEIGHBOURS_send_get_result (&(get_result->key), get_result->type,
4121                                     &get_path[current_path_index - 1],
4122                                     &(get_result->querying_peer), putlen, put_path,
4123                                     getlen, get_path,
4124                                     GNUNET_TIME_absolute_ntoh (get_result->expiration_time),
4125                                     payload, payload_size);
4126     return GNUNET_YES;
4127   }
4128   return GNUNET_SYSERR;
4129 }
4130
4131
4132 /**
4133  * Find the next hop to pass trail setup message. First find the local best known
4134  * hop from your own identity, friends and finger. If you were part of trail,
4135  * then get the next hop from routing table. Compare next_hop from routing table
4136  * and local best known hop, and return the closest one to final_dest_finger_val
4137  * @param final_dest_finger_val 64 bit value of finger identity
4138  * @param intermediate_trail_id If you are part of trail to reach to some other
4139  *                              finger, then it is the trail id to reach to
4140  *                              that finger, else set to 0.
4141  * @param is_predecessor Are we looking for closest successor or predecessor.
4142  * @param source Source of trail setup message.
4143  * @param current_dest In case you are part of trail, then finger to which
4144  *                     we should forward the message. Else my own identity
4145  * @return Closest Peer for @a final_dest_finger_val
4146  */
4147 static struct Closest_Peer
4148 get_local_best_known_next_hop (uint64_t final_dest_finger_val,
4149                                struct GNUNET_HashCode intermediate_trail_id,
4150                                unsigned int is_predecessor,
4151                                struct GNUNET_PeerIdentity source,
4152                                struct GNUNET_PeerIdentity *current_dest)
4153 {
4154   struct Closest_Peer peer;
4155
4156   peer = find_local_best_known_next_hop (final_dest_finger_val, is_predecessor);
4157
4158   /* Am I just a part of a trail towards a finger (current_destination)? */
4159   if (0 != GNUNET_CRYPTO_cmp_peer_identity (&my_identity, current_dest) &&
4160       0 != GNUNET_CRYPTO_cmp_peer_identity (&peer.best_known_destination,
4161                                             current_dest))
4162   {
4163     struct GNUNET_PeerIdentity closest_peer;
4164
4165     /* Select best successor among one found locally and current_destination
4166      * that we got from network.*/
4167     closest_peer = select_closest_peer (&peer.best_known_destination,
4168                                         current_dest,
4169                                         final_dest_finger_val,
4170                                         is_predecessor);
4171
4172     /* Is current dest (end point of the trail of which I am a part) closest_peer? */
4173     if (0 == GNUNET_CRYPTO_cmp_peer_identity (current_dest, &closest_peer))
4174     {
4175       struct GNUNET_PeerIdentity *next_hop;
4176
4177       next_hop = GDS_ROUTING_get_next_hop (intermediate_trail_id,
4178                                            GDS_ROUTING_SRC_TO_DEST);
4179       /* next_hop NULL is a valid case. This intermediate trail id is set by
4180        some other finger, and while this trail setup is in progress, that other
4181        peer might have found a better trail ,and send trail teardown message
4182        across the network. In case we got the trail teardown message first,
4183        then next_hop will be NULL. A possible solution could be to keep track
4184        * of all removed trail id, and be sure that there is no other reason . */
4185       if(NULL != next_hop)
4186       {
4187          peer.next_hop = *next_hop;
4188          peer.best_known_destination =  *current_dest;
4189          peer.trail_id = intermediate_trail_id;
4190       }
4191     }
4192   }
4193   return peer;
4194 }
4195
4196
4197 /*
4198  * Core handle for PeerTrailSetupMessage.
4199  * @param cls closure
4200  * @param message message
4201  * @param peer peer identity this notification is about
4202  * @return #GNUNET_OK on success, #GNUNET_SYSERR on error
4203  */
4204 static int
4205 handle_dht_p2p_trail_setup (void *cls, const struct GNUNET_PeerIdentity *peer,
4206                             const struct GNUNET_MessageHeader *message)
4207 {
4208   const struct PeerTrailSetupMessage *trail_setup;
4209   const struct GNUNET_PeerIdentity *trail_peer_list;
4210   struct GNUNET_PeerIdentity current_dest;
4211   struct FriendInfo *target_friend;
4212   struct GNUNET_PeerIdentity source;
4213   struct GNUNET_HashCode intermediate_trail_id;
4214   struct GNUNET_HashCode trail_id;
4215   unsigned int is_predecessor;
4216   uint32_t trail_length;
4217   uint64_t final_dest_finger_val;
4218   int i;
4219   size_t msize;
4220
4221   msize = ntohs (message->size);
4222   if (msize < sizeof (struct PeerTrailSetupMessage))
4223   {
4224     GNUNET_break_op (0);
4225     return GNUNET_SYSERR;
4226   }
4227
4228   trail_setup = (const struct PeerTrailSetupMessage *) message;
4229   if ((msize - sizeof (struct PeerTrailSetupMessage)) %
4230       sizeof (struct GNUNET_PeerIdentity) != 0)
4231   {
4232     GNUNET_break_op (0);
4233     return GNUNET_OK;
4234   }
4235   trail_length = (msize - sizeof (struct PeerTrailSetupMessage))/
4236                   sizeof (struct GNUNET_PeerIdentity);
4237
4238   GNUNET_STATISTICS_update (GDS_stats,
4239                             gettext_noop
4240                             ("# Bytes received from other peers"), msize,
4241                             GNUNET_NO);
4242
4243   trail_peer_list = (const struct GNUNET_PeerIdentity *)&trail_setup[1];
4244   current_dest = trail_setup->best_known_destination;
4245   trail_id = trail_setup->trail_id;
4246   final_dest_finger_val =
4247           GNUNET_ntohll (trail_setup->final_destination_finger_value);
4248   source = trail_setup->source_peer;
4249   is_predecessor = ntohl (trail_setup->is_predecessor);
4250   intermediate_trail_id = trail_setup->intermediate_trail_id;
4251
4252   /* Did the friend insert its ID in the trail list? */
4253   if (trail_length > 0 &&
4254       0 != memcmp (&trail_peer_list[trail_length-1], peer, sizeof (struct GNUNET_PeerIdentity)))
4255   {
4256     GNUNET_break_op (0);
4257     return GNUNET_SYSERR;
4258   }
4259
4260    /* If I was the source and got the message back, then set trail length to 0.*/
4261   if (0 == GNUNET_CRYPTO_cmp_peer_identity(&my_identity, &source))
4262   {
4263     trail_length = 0;
4264   }
4265
4266   /* Check if you are present in the trail seen so far? */
4267   for (i = 0; i < trail_length ; i++)
4268   {
4269     if(0 == GNUNET_CRYPTO_cmp_peer_identity(&trail_peer_list[i],&my_identity))
4270     {
4271       /* We will add ourself later in code, if NOT destination. */
4272       trail_length = i;
4273       break;
4274     }
4275   }
4276
4277   /* Is my routing table full?  */
4278   if (GNUNET_YES == GDS_ROUTING_threshold_reached())
4279   {
4280     if (trail_length > 0)
4281       target_friend =
4282                    GNUNET_CONTAINER_multipeermap_get (friend_peermap,
4283                                                       &trail_peer_list[trail_length - 1]);
4284     else
4285       target_friend =
4286                    GNUNET_CONTAINER_multipeermap_get (friend_peermap,
4287                                                       &source);
4288     if(NULL == target_friend)
4289     {
4290       DEBUG ("\n friend not found");
4291       GNUNET_break(0);
4292       return GNUNET_OK;
4293     }
4294     GDS_NEIGHBOURS_send_trail_rejection (source, final_dest_finger_val,
4295                                          my_identity, is_predecessor,
4296                                          trail_peer_list, trail_length,
4297                                          trail_id, target_friend,
4298                                          CONGESTION_TIMEOUT);
4299     return GNUNET_OK;
4300   }
4301
4302   /* Get the next hop to forward the trail setup request. */
4303   struct Closest_Peer next_peer =
4304           get_local_best_known_next_hop (final_dest_finger_val,
4305                                          intermediate_trail_id,
4306                                          is_predecessor,
4307                                          source,
4308                                          &current_dest);
4309
4310   /* Am I the final destination? */
4311   if (0 == (GNUNET_CRYPTO_cmp_peer_identity (&next_peer.best_known_destination,
4312                                              &my_identity)))
4313   {
4314     if(0 == GNUNET_CRYPTO_cmp_peer_identity (&source, &my_identity))
4315     {
4316       finger_table_add (my_identity, NULL, 0, is_predecessor,
4317                         final_dest_finger_val, trail_id);
4318       return GNUNET_OK;
4319     }
4320
4321     if (trail_length > 0)
4322       target_friend =
4323               GNUNET_CONTAINER_multipeermap_get (friend_peermap,
4324                                                  &trail_peer_list[trail_length-1]);
4325     else
4326       target_friend =
4327               GNUNET_CONTAINER_multipeermap_get (friend_peermap, &source);
4328     if (NULL == target_friend)
4329     {
4330       GNUNET_break_op (0);
4331       return GNUNET_SYSERR;
4332     }
4333     GDS_ROUTING_add (trail_id, target_friend->id, my_identity);
4334     GDS_NEIGHBOURS_send_trail_setup_result (source,
4335                                             my_identity,
4336                                             target_friend, trail_length,
4337                                             trail_peer_list,
4338                                             is_predecessor,
4339                                             final_dest_finger_val,trail_id);
4340   }
4341   else /* I'm not the final destination. */
4342   {
4343     target_friend = GNUNET_CONTAINER_multipeermap_get (friend_peermap,
4344                                                        &next_peer.next_hop);
4345     if(NULL == target_friend)
4346     {
4347       DEBUG ("\n target friend not found for peer = %s", GNUNET_i2s(&next_peer.next_hop));
4348       GNUNET_break (0);
4349       return GNUNET_OK;
4350     }
4351     if (0 != GNUNET_CRYPTO_cmp_peer_identity(&my_identity, &source))
4352     {
4353       /* Add yourself to list of peers. */
4354       struct GNUNET_PeerIdentity peer_list[trail_length + 1];
4355
4356       memcpy (peer_list, trail_peer_list,
4357               trail_length * sizeof (struct GNUNET_PeerIdentity));
4358       peer_list[trail_length] = my_identity;
4359       GDS_NEIGHBOURS_send_trail_setup (source,
4360                                        final_dest_finger_val,
4361                                        next_peer.best_known_destination,
4362                                        target_friend, trail_length + 1, peer_list,
4363                                        is_predecessor, trail_id,
4364                                        next_peer.trail_id);
4365     }
4366     else
4367         GDS_NEIGHBOURS_send_trail_setup (source,
4368                                          final_dest_finger_val,
4369                                          next_peer.best_known_destination,
4370                                          target_friend, 0, NULL,
4371                                          is_predecessor, trail_id,
4372                                          next_peer.trail_id);
4373   }
4374   return GNUNET_OK;
4375 }
4376
4377
4378 /**
4379  * Core handle for p2p trail setup result messages.
4380  * @param closure
4381  * @param message message
4382  * @param peer sender of this message.
4383  * @return #GNUNET_OK on success, #GNUNET_SYSERR on error
4384  */
4385 static int
4386 handle_dht_p2p_trail_setup_result(void *cls, const struct GNUNET_PeerIdentity *peer,
4387                                   const struct GNUNET_MessageHeader *message)
4388 {
4389   const struct PeerTrailSetupResultMessage *trail_result;
4390   const struct GNUNET_PeerIdentity *trail_peer_list;
4391   struct GNUNET_PeerIdentity next_hop;
4392   struct FriendInfo *target_friend;
4393   struct GNUNET_PeerIdentity querying_peer;
4394   struct GNUNET_PeerIdentity finger_identity;
4395   uint32_t trail_length;
4396   uint64_t ulitmate_destination_finger_value;
4397   uint32_t is_predecessor;
4398   struct GNUNET_HashCode trail_id;
4399   int my_index;
4400   size_t msize;
4401
4402   msize = ntohs (message->size);
4403   if (msize < sizeof (struct PeerTrailSetupResultMessage))
4404   {
4405     GNUNET_break_op (0);
4406     return GNUNET_YES;
4407   }
4408
4409   trail_result = (const struct PeerTrailSetupResultMessage *) message;
4410   if ((msize - sizeof (struct PeerTrailSetupResultMessage)) %
4411       sizeof (struct GNUNET_PeerIdentity) != 0)
4412   {
4413     GNUNET_break_op (0);
4414     return GNUNET_OK;
4415   }
4416   trail_length = (msize - sizeof (struct PeerTrailSetupResultMessage))/
4417                   sizeof (struct GNUNET_PeerIdentity);
4418
4419   GNUNET_STATISTICS_update (GDS_stats,
4420                             gettext_noop
4421                             ("# Bytes received from other peers"), msize,
4422                             GNUNET_NO);
4423
4424   is_predecessor = ntohl (trail_result->is_predecessor);
4425   querying_peer = trail_result->querying_peer;
4426   finger_identity = trail_result->finger_identity;
4427   trail_id = trail_result->trail_id;
4428   trail_peer_list = (const struct GNUNET_PeerIdentity *) &trail_result[1];
4429   ulitmate_destination_finger_value =
4430           GNUNET_ntohll (trail_result->ulitmate_destination_finger_value);
4431
4432   /* Am I the one who initiated the query? */
4433   if (0 == (GNUNET_CRYPTO_cmp_peer_identity (&querying_peer, &my_identity)))
4434   {
4435     /* Check that you got the message from the correct peer. */
4436     if (trail_length > 0)
4437     {
4438       GNUNET_assert(0 == GNUNET_CRYPTO_cmp_peer_identity (&trail_peer_list[0],
4439                                                           peer));
4440     }
4441     else
4442     {
4443       GNUNET_assert(0 == GNUNET_CRYPTO_cmp_peer_identity (&finger_identity,
4444                                                           peer));
4445     }
4446     GDS_ROUTING_add (trail_id, my_identity, *peer);
4447     finger_table_add (finger_identity, trail_peer_list, trail_length,
4448                       is_predecessor, ulitmate_destination_finger_value, trail_id);
4449     return GNUNET_YES;
4450   }
4451
4452   /* Get my location in the trail. */
4453   my_index = search_my_index (trail_peer_list, trail_length);
4454   if (-1 == my_index)
4455   {
4456     DEBUG ("Not found in trail\n");
4457     GNUNET_break_op(0);
4458     return GNUNET_SYSERR;
4459   }
4460   //TODO; return -2.
4461   if ((trail_length + 1) == my_index)
4462   {
4463     DEBUG ("Found twice in trail.\n");
4464     GNUNET_break_op(0);
4465     return GNUNET_SYSERR;
4466   }
4467
4468   //TODO; Refactor code here and above to check if sender peer is correct
4469   if (my_index == 0)
4470   {
4471     if(trail_length > 1)
4472       GNUNET_assert(0 == GNUNET_CRYPTO_cmp_peer_identity (&trail_peer_list[1],
4473                                                           peer));
4474     else
4475       GNUNET_assert(0 == GNUNET_CRYPTO_cmp_peer_identity (&finger_identity,
4476                                                           peer));
4477     next_hop = trail_result->querying_peer;
4478   }
4479   else
4480   {
4481     if(my_index == trail_length - 1)
4482     {
4483       GNUNET_assert(0 ==
4484                     GNUNET_CRYPTO_cmp_peer_identity (&finger_identity,
4485                                                      peer));
4486     }
4487     else
4488       GNUNET_assert(0 ==
4489                     GNUNET_CRYPTO_cmp_peer_identity (&trail_peer_list[my_index + 1],
4490                                                       peer));
4491     next_hop = trail_peer_list[my_index - 1];
4492   }
4493
4494   target_friend = GNUNET_CONTAINER_multipeermap_get (friend_peermap, &next_hop);
4495   if (NULL == target_friend)
4496   {
4497     GNUNET_break_op (0);
4498     return GNUNET_SYSERR;
4499   }
4500   GDS_ROUTING_add (trail_id, next_hop, *peer);
4501   GDS_NEIGHBOURS_send_trail_setup_result (querying_peer, finger_identity,
4502                                           target_friend, trail_length, trail_peer_list,
4503                                           is_predecessor,
4504                                           ulitmate_destination_finger_value,
4505                                           trail_id);
4506   return GNUNET_OK;
4507 }
4508
4509
4510 /**
4511  * Invert the trail.
4512  * @param trail Trail to be inverted
4513  * @param trail_length Total number of peers in the trail.
4514  * @return Updated trail
4515  */
4516 static struct GNUNET_PeerIdentity *
4517 invert_trail (const struct GNUNET_PeerIdentity *trail,
4518               unsigned int trail_length)
4519 {
4520   int i;
4521   int j;
4522   struct GNUNET_PeerIdentity *inverted_trail;
4523
4524   inverted_trail = GNUNET_malloc (sizeof(struct GNUNET_PeerIdentity) *
4525                                   trail_length);
4526   i = 0;
4527   j = trail_length - 1;
4528   while (i < trail_length)
4529   {
4530     inverted_trail[i] = trail[j];
4531     i++;
4532     j--;
4533   }
4534
4535   GNUNET_assert(NULL != GNUNET_CONTAINER_multipeermap_get(friend_peermap,
4536                                                           &inverted_trail[0]));
4537   return inverted_trail;
4538 }
4539
4540
4541 /**
4542  * Return the shortest trail among all the trails to reach to finger from me.
4543  * @param finger Finger
4544  * @param shortest_trail_length[out] Trail length of shortest trail from me
4545  *                                   to @a finger
4546  * @return Shortest trail.
4547  */
4548 static struct GNUNET_PeerIdentity *
4549 get_shortest_trail (struct FingerInfo *finger,
4550                     unsigned int *trail_length)
4551 {
4552   struct Trail *trail;
4553   unsigned int flag = 0;
4554   unsigned int shortest_trail_index = 0;
4555   int shortest_trail_length = -1;
4556   struct Trail_Element *trail_element;
4557   struct GNUNET_PeerIdentity *trail_list;
4558   unsigned int i;
4559
4560   /* Get the shortest trail to reach to current successor. */
4561   for (i = 0; i < finger->trails_count; i++)
4562   {
4563     trail = &finger->trail_list[i];
4564
4565     if (0 == flag)
4566     {
4567       shortest_trail_index = i;
4568       shortest_trail_length = trail->trail_length;
4569       flag = 1;
4570       continue;
4571     }
4572
4573     if (shortest_trail_length > trail->trail_length)
4574     {
4575       shortest_trail_index = i;
4576       shortest_trail_length = trail->trail_length;
4577     }
4578     continue;
4579   }
4580
4581   /* Copy the shortest trail and return. */
4582   trail = &finger->trail_list[shortest_trail_index];
4583   trail_element = trail->trail_head;
4584
4585   trail_list = GNUNET_malloc (sizeof(struct GNUNET_PeerIdentity)*
4586                               shortest_trail_length);
4587
4588   for(i = 0; i < shortest_trail_length; i++,trail_element = trail_element->next)
4589   {
4590     trail_list[i] = trail_element->peer;
4591   }
4592
4593   GNUNET_assert(shortest_trail_length != -1);
4594
4595   *trail_length = shortest_trail_length;
4596   return trail_list;
4597 }
4598
4599
4600 /**
4601  * Check if trail_1 and trail_2 have any common element. If yes then join
4602  * them at common element. trail_1 always preceeds trail_2 in joined trail.
4603  * @param trail_1 Trail from source to me, NOT including endpoints.
4604  * @param trail_1_len Total number of peers @a trail_1
4605  * @param trail_2 Trail from me to current predecessor, NOT including endpoints.
4606  * @param trail_2_len Total number of peers @a trail_2
4607  * @param joined_trail_len Total number of peers in combined trail of trail_1
4608  *                          trail_2.
4609  * @return Joined trail.
4610  */
4611 static struct GNUNET_PeerIdentity *
4612 check_for_duplicate_entries (const struct GNUNET_PeerIdentity *trail_1,
4613                              unsigned int trail_1_len,
4614                              struct GNUNET_PeerIdentity *trail_2,
4615                              unsigned int trail_2_len,
4616                              unsigned int *joined_trail_len)
4617 {
4618   struct GNUNET_PeerIdentity *joined_trail;
4619   unsigned int i;
4620   unsigned int j;
4621   unsigned int k;
4622
4623   for (i = 0; i < trail_1_len; i++)
4624   {
4625     for (j = 0; j < trail_2_len; j++)
4626     {
4627       if(0 != GNUNET_CRYPTO_cmp_peer_identity (&trail_1[i],&trail_2[j]))
4628         continue;
4629
4630       *joined_trail_len = i + (trail_2_len - j);
4631       joined_trail = GNUNET_malloc (*joined_trail_len *
4632                                     sizeof(struct GNUNET_PeerIdentity));
4633
4634
4635       /* Copy all the elements from 0 to i into joined_trail. */
4636       for(k = 0; k < ( i+1); k++)
4637       {
4638         joined_trail[k] = trail_1[k];
4639       }
4640
4641       /* Increment j as entry stored is same as entry stored at i*/
4642       j = j+1;
4643
4644       /* Copy all the elements from j to trail_2_len-1 to joined trail.*/
4645       while(k <= (*joined_trail_len - 1))
4646       {
4647         joined_trail[k] = trail_2[j];
4648         j++;
4649         k++;
4650       }
4651
4652       return joined_trail;
4653     }
4654   }
4655
4656   /* Here you should join the  trails. */
4657   *joined_trail_len = trail_1_len + trail_2_len + 1;
4658   joined_trail = GNUNET_malloc (*joined_trail_len *
4659                                 sizeof(struct GNUNET_PeerIdentity));
4660
4661
4662   for(i = 0; i < trail_1_len;i++)
4663   {
4664     joined_trail[i] = trail_1[i];
4665   }
4666
4667   joined_trail[i] = my_identity;
4668   i++;
4669
4670   for (j = 0; i < *joined_trail_len; i++,j++)
4671   {
4672     joined_trail[i] = trail_2[j];
4673   }
4674
4675   return joined_trail;
4676 }
4677
4678
4679 /**
4680  * Return the trail from source to my current predecessor. Check if source
4681  * is already part of the this trail, if yes then return the shorten trail.
4682  * @param current_trail Trail from source to me, NOT including the endpoints.
4683  * @param current_trail_length Number of peers in @a current_trail.
4684  * @param trail_src_to_curr_pred_length[out] Number of peers in trail from
4685  *                                           source to my predecessor, NOT including
4686  *                                           the endpoints.
4687  * @return Trail from source to my predecessor.
4688  */
4689 static struct GNUNET_PeerIdentity *
4690 get_trail_src_to_curr_pred (struct GNUNET_PeerIdentity source_peer,
4691                             const struct GNUNET_PeerIdentity *trail_src_to_me,
4692                             unsigned int trail_src_to_me_len,
4693                             unsigned int *trail_src_to_curr_pred_length)
4694 {
4695   struct GNUNET_PeerIdentity *trail_me_to_curr_pred;
4696   struct GNUNET_PeerIdentity *trail_src_to_curr_pred;
4697   unsigned int trail_me_to_curr_pred_length;
4698   struct FingerInfo *current_predecessor;
4699   int i;
4700   unsigned int j;
4701   unsigned int len;
4702
4703   current_predecessor = &finger_table[PREDECESSOR_FINGER_ID];
4704
4705   /* Check if trail_src_to_me contains current_predecessor. */
4706   for (i = 0; i < trail_src_to_me_len; i++)
4707   {
4708     if (0 != GNUNET_CRYPTO_cmp_peer_identity(&trail_src_to_me[i],
4709                                              &current_predecessor->finger_identity))
4710       continue;
4711
4712
4713     *trail_src_to_curr_pred_length = i;
4714
4715     if(0 == i)
4716       return NULL;
4717
4718      trail_src_to_curr_pred = GNUNET_malloc (*trail_src_to_curr_pred_length *
4719                                               sizeof(struct GNUNET_PeerIdentity));
4720      for (j = 0; j < i; j++)
4721        trail_src_to_curr_pred[j] = trail_src_to_me[j];
4722      return trail_src_to_curr_pred;
4723   }
4724
4725
4726   trail_me_to_curr_pred = get_shortest_trail (current_predecessor,
4727                                               &trail_me_to_curr_pred_length);
4728
4729   /* Check if trail contains the source_peer. */
4730   for (i = trail_me_to_curr_pred_length - 1; i >= 0; i--)
4731   {
4732     if (0 != GNUNET_CRYPTO_cmp_peer_identity (&source_peer,
4733                                               &trail_me_to_curr_pred[i]))
4734       continue;
4735
4736     /* Source is NOT part of trail. */
4737     i++;
4738
4739     /* Source is the last element in the trail to reach to my pred.
4740        Source is direct friend of the pred. */
4741     if (trail_me_to_curr_pred_length == i)
4742     {
4743       *trail_src_to_curr_pred_length = 0;
4744       GNUNET_free_non_null (trail_me_to_curr_pred);
4745       return NULL;
4746     }
4747
4748     *trail_src_to_curr_pred_length = trail_me_to_curr_pred_length - i;
4749     trail_src_to_curr_pred = GNUNET_malloc (sizeof (struct GNUNET_PeerIdentity)*
4750                                             *trail_src_to_curr_pred_length);
4751
4752     for (j = 0; j < *trail_src_to_curr_pred_length; i++,j++)
4753       trail_src_to_curr_pred[j] = trail_me_to_curr_pred[i];
4754     GNUNET_free_non_null (trail_me_to_curr_pred);
4755     return trail_src_to_curr_pred;
4756   }
4757
4758   trail_src_to_curr_pred = check_for_duplicate_entries (trail_src_to_me,
4759                                                         trail_src_to_me_len,
4760                                                         trail_me_to_curr_pred,
4761                                                         trail_me_to_curr_pred_length,
4762                                                         &len);
4763   *trail_src_to_curr_pred_length = len;
4764   GNUNET_free_non_null(trail_me_to_curr_pred);
4765   return trail_src_to_curr_pred;
4766 }
4767
4768
4769 /**
4770  * Add finger as your predecessor. To add, first generate a new trail id, invert
4771  * the trail to get the trail from me to finger, add an entry in your routing
4772  * table, send add trail message to peers which are part of trail from me to
4773  * finger and add finger in finger table.
4774  * @param finger
4775  * @param trail
4776  * @param trail_length
4777  */
4778 static void
4779 update_predecessor (struct GNUNET_PeerIdentity finger,
4780                     struct GNUNET_PeerIdentity *trail,
4781                     unsigned int trail_length)
4782 {
4783   struct GNUNET_HashCode trail_to_new_predecessor_id;
4784   struct GNUNET_PeerIdentity *trail_to_new_predecessor;
4785   struct FriendInfo *target_friend;
4786
4787   /* Generate trail id for trail from me to new predecessor = finger. */
4788   GNUNET_CRYPTO_random_block (GNUNET_CRYPTO_QUALITY_STRONG,
4789                               &trail_to_new_predecessor_id,
4790                               sizeof (trail_to_new_predecessor_id));
4791
4792   if (0 == trail_length)
4793   {
4794     trail_to_new_predecessor = NULL;
4795     GDS_ROUTING_add (trail_to_new_predecessor_id, my_identity, finger);
4796     target_friend = GNUNET_CONTAINER_multipeermap_get (friend_peermap, &finger);
4797     if (NULL == target_friend)
4798     {
4799       GNUNET_break (0);
4800       return;
4801     }
4802   }
4803   else
4804   {
4805     /* Invert the trail to get the trail from me to finger, NOT including the
4806        endpoints.*/
4807     GNUNET_assert(NULL != GNUNET_CONTAINER_multipeermap_get(friend_peermap,
4808                                                             &trail[trail_length-1]));
4809     trail_to_new_predecessor = invert_trail (trail, trail_length);
4810
4811     /* Add an entry in your routing table. */
4812     GDS_ROUTING_add (trail_to_new_predecessor_id,
4813                      my_identity,
4814                      trail_to_new_predecessor[0]);
4815
4816     GNUNET_assert (NULL != (target_friend =
4817                    GNUNET_CONTAINER_multipeermap_get (friend_peermap,
4818                                                       &trail_to_new_predecessor[0])));
4819   }
4820
4821   /* Add entry in routing table of all peers that are part of trail from me
4822      to finger, including finger. */
4823   GDS_NEIGHBOURS_send_add_trail (my_identity,
4824                                  finger,
4825                                  trail_to_new_predecessor_id,
4826                                  trail_to_new_predecessor,
4827                                  trail_length,
4828                                  target_friend);
4829
4830   add_new_finger (finger, trail_to_new_predecessor, trail_length,
4831                   trail_to_new_predecessor_id, PREDECESSOR_FINGER_ID);
4832   GNUNET_free_non_null(trail_to_new_predecessor);
4833 }
4834
4835
4836 /*
4837  * Check if you already have a predecessor. If not then add finger as your
4838  * predecessor. If you have predecessor, then compare two peer identites.
4839  * If finger is correct predecessor, then remove the old entry, add finger in
4840  * finger table and send add_trail message to add the trail in the routing
4841  * table of all peers which are part of trail to reach from me to finger.
4842  * @param finger New peer which may be our predecessor.
4843  * @param trail List of peers to reach from @finger to me.
4844  * @param trail_length Total number of peer in @a trail.
4845  */
4846 static void
4847 compare_and_update_predecessor (struct GNUNET_PeerIdentity finger,
4848                                 struct GNUNET_PeerIdentity *trail,
4849                                 unsigned int trail_length)
4850 {
4851   struct FingerInfo *current_predecessor;
4852   struct GNUNET_PeerIdentity closest_peer;
4853   uint64_t predecessor_value;
4854   unsigned int is_predecessor = 1;
4855
4856   current_predecessor = &finger_table[PREDECESSOR_FINGER_ID];
4857   GNUNET_assert (0 != GNUNET_CRYPTO_cmp_peer_identity (&finger, &my_identity));
4858
4859   /* No predecessor. Add finger as your predecessor. */
4860   if (GNUNET_NO == current_predecessor->is_present)
4861   {
4862     update_predecessor (finger, trail, trail_length);
4863     return;
4864   }
4865
4866   if (0 == GNUNET_CRYPTO_cmp_peer_identity (&current_predecessor->finger_identity,
4867                                             &finger))
4868   {
4869     return;
4870   }
4871
4872   predecessor_value = compute_finger_identity_value (PREDECESSOR_FINGER_ID);
4873   closest_peer = select_closest_peer (&finger,
4874                                       &current_predecessor->finger_identity,
4875                                       predecessor_value, is_predecessor);
4876
4877   /* Finger is the closest predecessor. Remove the existing one and add the new
4878      one. */
4879   if (0 == GNUNET_CRYPTO_cmp_peer_identity(&closest_peer, &finger))
4880   {
4881     remove_existing_finger (current_predecessor, PREDECESSOR_FINGER_ID);
4882     update_predecessor (finger, trail, trail_length);
4883     return;
4884   }
4885   return;
4886 }
4887
4888
4889 /*
4890  * Core handle for p2p verify successor messages.
4891  * @param cls closure
4892  * @param message message
4893  * @param peer peer identity this notification is about
4894  * @return #GNUNET_OK on success, #GNUNET_SYSERR on error
4895  */
4896 static int
4897 handle_dht_p2p_verify_successor(void *cls,
4898                                 const struct GNUNET_PeerIdentity *peer,
4899                                 const struct GNUNET_MessageHeader *message)
4900 {
4901   const struct PeerVerifySuccessorMessage *vsm;
4902   struct GNUNET_HashCode trail_id;
4903   struct GNUNET_PeerIdentity successor;
4904   struct GNUNET_PeerIdentity source_peer;
4905   struct GNUNET_PeerIdentity *trail;
4906   struct GNUNET_PeerIdentity *next_hop;
4907   struct FingerInfo current_predecessor;
4908   struct FriendInfo *target_friend;
4909   unsigned int trail_src_to_curr_pred_len = 0;
4910   struct GNUNET_PeerIdentity *trail_src_to_curr_pred;
4911   unsigned int trail_length;
4912   size_t msize;
4913
4914   msize = ntohs (message->size);
4915
4916   if (msize < sizeof (struct PeerVerifySuccessorMessage))
4917   {
4918     GNUNET_break_op (0);
4919     return GNUNET_YES;
4920   }
4921
4922   vsm = (const struct PeerVerifySuccessorMessage *) message;
4923   trail_length = (msize - sizeof (struct PeerVerifySuccessorMessage))/
4924                   sizeof (struct GNUNET_PeerIdentity);
4925   if ((msize - sizeof (struct PeerVerifySuccessorMessage)) %
4926       sizeof (struct GNUNET_PeerIdentity) != 0)
4927   {
4928     GNUNET_break_op (0);
4929     return GNUNET_OK;
4930   }
4931
4932   GNUNET_STATISTICS_update (GDS_stats,
4933                             gettext_noop
4934                             ("# Bytes received from other peers"), msize,
4935                             GNUNET_NO);
4936
4937   trail_id = vsm->trail_id;
4938   source_peer = vsm->source_peer;
4939   successor = vsm->successor;
4940   trail = (struct GNUNET_PeerIdentity *)&vsm[1];
4941
4942   /* I am NOT the successor of source_peer. Pass the message to next_hop on
4943    * the trail. */
4944   if(0 != (GNUNET_CRYPTO_cmp_peer_identity (&successor, &my_identity)))
4945   {
4946     next_hop = GDS_ROUTING_get_next_hop (trail_id, GDS_ROUTING_SRC_TO_DEST);
4947     if (NULL == next_hop)
4948     {
4949       return GNUNET_OK;
4950     }
4951
4952     target_friend = GNUNET_CONTAINER_multipeermap_get (friend_peermap, next_hop);
4953
4954     if(NULL == target_friend)
4955     {
4956       GNUNET_break_op(0);
4957       return GNUNET_OK;
4958     }
4959     GDS_NEIGHBOURS_send_verify_successor_message (source_peer, successor,
4960                                                   trail_id, trail, trail_length,
4961                                                   target_friend);
4962     return GNUNET_OK;
4963   }
4964
4965   /* I am the destination of this message. */
4966
4967   /* Check if the source_peer could be our predecessor and if yes then update
4968    * it.  */
4969   compare_and_update_predecessor (source_peer, trail, trail_length);
4970   current_predecessor = finger_table[PREDECESSOR_FINGER_ID];
4971
4972   /* Is source of this message NOT my predecessor. */
4973   if (0 != (GNUNET_CRYPTO_cmp_peer_identity (&current_predecessor.finger_identity,
4974                                              &source_peer)))
4975   {
4976     trail_src_to_curr_pred =
4977               get_trail_src_to_curr_pred (source_peer,
4978                                           trail,
4979                                           trail_length,
4980                                           &trail_src_to_curr_pred_len);
4981   }
4982   else
4983   {
4984     trail_src_to_curr_pred_len = trail_length;
4985     unsigned int i;
4986
4987     trail_src_to_curr_pred =
4988             GNUNET_malloc (sizeof(struct GNUNET_PeerIdentity)
4989                            *trail_src_to_curr_pred_len);
4990     for(i = 0; i < trail_src_to_curr_pred_len; i++)
4991     {
4992       trail_src_to_curr_pred[i] = trail[i];
4993     }
4994   }
4995
4996   GNUNET_assert (NULL !=
4997                 (target_friend =
4998                  GNUNET_CONTAINER_multipeermap_get (friend_peermap, peer)));
4999   GDS_NEIGHBOURS_send_verify_successor_result (source_peer, my_identity,
5000                                                current_predecessor.finger_identity,
5001                                                trail_id, trail_src_to_curr_pred,
5002                                                trail_src_to_curr_pred_len,
5003                                                GDS_ROUTING_DEST_TO_SRC,
5004                                                target_friend);
5005   GNUNET_free_non_null(trail_src_to_curr_pred);
5006   return GNUNET_OK;
5007 }
5008
5009
5010 /**
5011  * If the trail from me to my probable successor contains a friend not
5012  * at index 0, then we can shorten the trail.
5013  * @param probable_successor Peer which is our probable successor
5014  * @param trail_me_to_probable_successor Peers in path from me to my probable
5015  *                                       successor, NOT including the endpoints.
5016  * @param trail_me_to_probable_successor_len Total number of peers in
5017  *                                           @a trail_me_to_probable_succesor.
5018  * @return Updated trail, if any friend found.
5019  *         Else the trail_me_to_probable_successor.
5020  */
5021 struct GNUNET_PeerIdentity *
5022 check_trail_me_to_probable_succ (struct GNUNET_PeerIdentity probable_successor,
5023                                  const struct GNUNET_PeerIdentity *trail_me_to_probable_successor,
5024                                  unsigned int trail_me_to_probable_successor_len,
5025                                  unsigned int *trail_to_new_successor_length)
5026 {
5027   unsigned int i;
5028   unsigned int j;
5029   struct GNUNET_PeerIdentity *trail_to_new_successor;
5030
5031   /* Probable successor is  a friend */
5032   if (NULL != GNUNET_CONTAINER_multipeermap_get (friend_peermap,
5033                                                  &probable_successor))
5034   {
5035     trail_to_new_successor = NULL;
5036     *trail_to_new_successor_length = 0;
5037     return trail_to_new_successor;
5038   }
5039
5040   /* Is there any friend of yours in this trail. */
5041   if(trail_me_to_probable_successor_len > 1)
5042   {
5043     for (i = trail_me_to_probable_successor_len - 1; i > 0; i--)
5044     {
5045       if (NULL == GNUNET_CONTAINER_multipeermap_get (friend_peermap,
5046                                                      &trail_me_to_probable_successor[i]))
5047         continue;
5048
5049       *trail_to_new_successor_length = (trail_me_to_probable_successor_len - i);
5050       trail_to_new_successor = GNUNET_malloc (sizeof(struct GNUNET_PeerIdentity)*
5051                                                 *trail_to_new_successor_length);
5052
5053
5054       for(j = 0; j < *trail_to_new_successor_length; i++,j++)
5055       {
5056         trail_to_new_successor[j] = trail_me_to_probable_successor[i];
5057       }
5058
5059       return trail_to_new_successor;
5060     }
5061   }
5062
5063   *trail_to_new_successor_length = trail_me_to_probable_successor_len;
5064   return (struct GNUNET_PeerIdentity*)trail_me_to_probable_successor;
5065 }
5066
5067 // TODO: Move up
5068 struct SendNotifyContext
5069 {
5070   struct GNUNET_PeerIdentity source_peer;
5071   struct GNUNET_PeerIdentity successor;
5072   struct GNUNET_PeerIdentity *successor_trail;
5073   unsigned int successor_trail_length;
5074   struct GNUNET_HashCode succesor_trail_id;
5075   struct FriendInfo *target_friend;
5076   unsigned int num_retries_scheduled;
5077 };
5078
5079
5080 void
5081 send_notify_new_successor (void *cls);
5082
5083
5084 /**
5085  * Check if the peer which sent us verify successor result message is still ours
5086  * successor or not. If not, then compare existing successor and probable successor.
5087  * In case probable successor is the correct successor, remove the existing
5088  * successor. Add probable successor as new successor. Send notify new successor
5089  * message to new successor.
5090  * @param curr_succ Peer to which we sent the verify successor message. It may
5091  * or may not be our real current successor, as we may have few iterations of
5092  * find finger trail task.
5093  * @param probable_successor Peer which should be our successor accroding to @a
5094  *                           curr_succ
5095  * @param trail List of peers to reach from me to @a probable successor, NOT including
5096  *              endpoints.
5097  * @param trail_length Total number of peers in @a trail.
5098  */
5099 static void
5100 compare_and_update_successor (struct GNUNET_PeerIdentity curr_succ,
5101                               struct GNUNET_PeerIdentity probable_successor,
5102                               const struct GNUNET_PeerIdentity *trail,
5103                               unsigned int trail_length)
5104 {
5105   struct FingerInfo *current_successor;
5106   struct GNUNET_PeerIdentity closest_peer;
5107   struct GNUNET_HashCode trail_id;
5108   struct GNUNET_PeerIdentity *trail_me_to_probable_succ;
5109   struct FriendInfo *target_friend;
5110   unsigned int trail_me_to_probable_succ_len;
5111   unsigned int is_predecessor = 0;
5112   uint64_t successor_value;
5113
5114   current_successor = &finger_table[0];
5115   successor_value = compute_finger_identity_value(0);
5116
5117   /* If probable successor is same as current_successor, do nothing. */
5118   if(0 == GNUNET_CRYPTO_cmp_peer_identity (&probable_successor,
5119                                            &current_successor->finger_identity))
5120   {
5121     if ((NULL != GDS_stats))
5122     {
5123       char *my_id_str;
5124       uint64_t succ;
5125       char *key;
5126       uint64_t my_id;
5127       memcpy (&my_id, &my_identity, sizeof(uint64_t));
5128       my_id_str = GNUNET_strdup (GNUNET_i2s_full (&my_identity));
5129       memcpy(&succ, &current_successor->finger_identity, sizeof(uint64_t));
5130       succ = GNUNET_ntohll(succ);
5131       GNUNET_asprintf (&key, "XDHT:%s:", my_id_str);
5132       GNUNET_free (my_id_str);
5133
5134       GNUNET_STATISTICS_set (GDS_stats, key, succ, 0);
5135       GNUNET_free (key);
5136     }
5137     if (send_verify_successor_task == NULL)
5138       send_verify_successor_task =
5139               GNUNET_SCHEDULER_add_delayed(verify_successor_next_send_time,
5140                                            &send_verify_successor_message,
5141                                            NULL);
5142     return;
5143   }
5144   closest_peer = select_closest_peer (&probable_successor,
5145                                       &current_successor->finger_identity,
5146                                       successor_value, is_predecessor);
5147
5148   /* If the current_successor in the finger table is closest, then do nothing. */
5149   if (0 == GNUNET_CRYPTO_cmp_peer_identity (&closest_peer ,
5150                                             &current_successor->finger_identity))
5151   {
5152     //FIXME: Is this a good place to return the stats.
5153     if ((NULL != GDS_stats))
5154     {
5155       char *my_id_str;
5156       uint64_t succ;
5157       char *key;
5158
5159       my_id_str = GNUNET_strdup (GNUNET_i2s_full (&my_identity));
5160       memcpy(&succ, &current_successor->finger_identity, sizeof(uint64_t));
5161       GNUNET_asprintf (&key, "XDHT:%s:", my_id_str);
5162       GNUNET_free (my_id_str);
5163       GNUNET_STATISTICS_set (GDS_stats, key, succ, 0);
5164       GNUNET_free (key);
5165     }
5166
5167     if(0 == successor_times)
5168     {
5169 //      successor_times = 3;
5170       verify_successor_next_send_time =
5171               GNUNET_TIME_STD_BACKOFF (verify_successor_next_send_time);
5172     }
5173     else
5174       successor_times--;
5175
5176
5177     if (send_verify_successor_task == NULL)
5178       send_verify_successor_task =
5179               GNUNET_SCHEDULER_add_delayed(verify_successor_next_send_time,
5180                                            &send_verify_successor_message,
5181                                            NULL);
5182     return;
5183   }
5184
5185   /* Probable successor is the closest peer.*/
5186   if(trail_length > 0)
5187   {
5188     GNUNET_assert(NULL != GNUNET_CONTAINER_multipeermap_get(friend_peermap,
5189                                                             &trail[0]));
5190   }
5191   else
5192   {
5193     GNUNET_assert(NULL != GNUNET_CONTAINER_multipeermap_get(friend_peermap,
5194                                                             &probable_successor));
5195   }
5196
5197   trail_me_to_probable_succ_len = 0;
5198   trail_me_to_probable_succ =
5199           check_trail_me_to_probable_succ (probable_successor,
5200                                            trail, trail_length,
5201                                            &trail_me_to_probable_succ_len);
5202
5203   /* Remove the existing successor. */
5204   remove_existing_finger (current_successor, 0);
5205    /* Generate a new trail id to reach to your new successor. */
5206   GNUNET_CRYPTO_random_block (GNUNET_CRYPTO_QUALITY_STRONG,
5207                               &trail_id, sizeof (trail_id));
5208
5209   if (trail_me_to_probable_succ_len > 0)
5210   {
5211     GDS_ROUTING_add (trail_id, my_identity, trail_me_to_probable_succ[0]);
5212     GNUNET_assert (NULL !=
5213                   (target_friend =
5214                       GNUNET_CONTAINER_multipeermap_get (friend_peermap,
5215                                                         &trail_me_to_probable_succ[0])));
5216   }
5217   else
5218   {
5219     GDS_ROUTING_add (trail_id, my_identity, probable_successor);
5220     GNUNET_assert (NULL !=
5221                   (target_friend =
5222                    GNUNET_CONTAINER_multipeermap_get (friend_peermap,
5223                                                       &probable_successor)));
5224   }
5225
5226   add_new_finger (probable_successor, trail_me_to_probable_succ,
5227                   trail_me_to_probable_succ_len, trail_id, 0);
5228
5229   struct SendNotifyContext *notify_ctx;
5230
5231   notify_ctx = GNUNET_new(struct SendNotifyContext);
5232
5233   notify_ctx->source_peer = my_identity;
5234   notify_ctx->successor = probable_successor;
5235   notify_ctx->successor_trail =
5236           GNUNET_malloc(sizeof(struct GNUNET_PeerIdentity) * trail_me_to_probable_succ_len);
5237   memcpy(notify_ctx->successor_trail, trail_me_to_probable_succ,
5238          sizeof(struct GNUNET_PeerIdentity) * trail_me_to_probable_succ_len);
5239   notify_ctx->successor_trail_length = trail_me_to_probable_succ_len;
5240   notify_ctx->succesor_trail_id = trail_id;
5241   notify_ctx->target_friend = target_friend;
5242   notify_ctx->num_retries_scheduled = 0;
5243   GNUNET_free_non_null (trail_me_to_probable_succ);
5244
5245   // TODO: Check if we should verify before schedule if already scheduled.
5246   GNUNET_SCHEDULER_add_now(&send_notify_new_successor, (void*)notify_ctx);
5247 }
5248
5249
5250
5251 void
5252 send_notify_new_successor (void *cls)
5253 {
5254   struct SendNotifyContext *ctx = cls;
5255
5256   GDS_NEIGHBOURS_send_notify_new_successor (ctx->source_peer,
5257                                             ctx->successor,
5258                                             ctx->successor_trail,
5259                                             ctx->successor_trail_length,
5260                                             ctx->succesor_trail_id,
5261                                             ctx->target_friend);
5262
5263   if (0 == ctx->num_retries_scheduled &&
5264           send_notify_new_successor_retry_task != NULL)
5265   {
5266     // Result from previous notify successos hasn't arrived, so the retry task
5267     // hasn't been cancelled! Already a new notify successor must be called.
5268     // We will cancel the retry request.
5269     struct SendNotifyContext *old_notify_ctx;
5270     old_notify_ctx = GNUNET_SCHEDULER_cancel(send_notify_new_successor_retry_task);
5271     GNUNET_free (old_notify_ctx->successor_trail);
5272     GNUNET_free (old_notify_ctx);
5273     send_notify_new_successor_retry_task = NULL;
5274   }
5275
5276   ctx->num_retries_scheduled++;
5277   send_notify_new_successor_retry_task = GNUNET_SCHEDULER_add_delayed(notify_successor_retry_time,
5278                                                                       &send_notify_new_successor,
5279                                                                       cls);
5280 }
5281
5282 /*
5283  * Core handle for p2p verify successor result messages.
5284  * @param cls closure
5285  * @param message message
5286  * @param peer peer identity this notification is about
5287  * @return #GNUNET_OK on success, #GNUNET_SYSERR on error
5288  */
5289 static int
5290 handle_dht_p2p_verify_successor_result(void *cls,
5291                                        const struct GNUNET_PeerIdentity *peer,
5292                                        const struct GNUNET_MessageHeader *message)
5293 {
5294   const struct PeerVerifySuccessorResultMessage *vsrm;
5295   enum GDS_ROUTING_trail_direction trail_direction;
5296   struct GNUNET_PeerIdentity querying_peer;
5297   struct GNUNET_HashCode trail_id;
5298   struct GNUNET_PeerIdentity *next_hop;
5299   struct FriendInfo *target_friend;
5300   struct GNUNET_PeerIdentity probable_successor;
5301   struct GNUNET_PeerIdentity current_successor;
5302   const struct GNUNET_PeerIdentity *trail;
5303   unsigned int trail_length;
5304   size_t msize;
5305
5306   msize = ntohs (message->size);
5307   if (msize < sizeof (struct PeerVerifySuccessorResultMessage))
5308   {
5309     GNUNET_break_op (0);
5310     return GNUNET_YES;
5311   }
5312
5313   vsrm = (const struct PeerVerifySuccessorResultMessage *) message;
5314   if ((msize - sizeof (struct PeerVerifySuccessorResultMessage)) %
5315       sizeof (struct GNUNET_PeerIdentity) != 0)
5316   {
5317     GNUNET_break_op (0);
5318     return GNUNET_OK;
5319   }
5320   trail_length = (msize - sizeof (struct PeerVerifySuccessorResultMessage))/
5321                       sizeof (struct GNUNET_PeerIdentity);
5322
5323   GNUNET_STATISTICS_update (GDS_stats,
5324                             gettext_noop
5325                             ("# Bytes received from other peers"), msize,
5326                             GNUNET_NO);
5327
5328   trail = (const struct GNUNET_PeerIdentity *) &vsrm[1];
5329   querying_peer = vsrm->querying_peer;
5330   trail_direction = ntohl (vsrm->trail_direction);
5331   trail_id = vsrm->trail_id;
5332   probable_successor = vsrm->probable_successor;
5333   current_successor = vsrm->current_successor;
5334
5335   /* I am the querying_peer. */
5336   if(0 == (GNUNET_CRYPTO_cmp_peer_identity (&querying_peer, &my_identity)))
5337   {
5338     /* Cancel Retry Task */
5339     if (NULL != send_verify_successor_retry_task)
5340     {
5341       struct VerifySuccessorContext *ctx;
5342       ctx = GNUNET_SCHEDULER_cancel(send_verify_successor_retry_task);
5343       GNUNET_free(ctx);
5344       send_verify_successor_retry_task = NULL;
5345     }
5346     compare_and_update_successor (current_successor,
5347                                   probable_successor, trail, trail_length);
5348     return GNUNET_OK;
5349   }
5350
5351   /*If you are not the querying peer then pass on the message */
5352   if(NULL == (next_hop =
5353               GDS_ROUTING_get_next_hop (trail_id, trail_direction)))
5354   {
5355     /* Here it may happen that source peer has found a new successor, and removed
5356      the trail, Hence no entry found in the routing table. Fail silently.*/
5357     DEBUG (" NO ENTRY FOUND IN %s ROUTING TABLE for trail id %s, line %u",
5358            GNUNET_i2s (&my_identity),
5359            GNUNET_h2s (&trail_id),
5360            __LINE__);
5361     GNUNET_break_op(0);
5362     return GNUNET_OK;
5363   }
5364   if (NULL == (target_friend =
5365                  GNUNET_CONTAINER_multipeermap_get (friend_peermap, next_hop)))
5366   {
5367     GNUNET_break_op(0);
5368     return GNUNET_OK;
5369   }
5370   GDS_NEIGHBOURS_send_verify_successor_result (querying_peer,
5371                                                vsrm->current_successor,
5372                                                probable_successor, trail_id,
5373                                                trail,
5374                                                trail_length,
5375                                                trail_direction, target_friend);
5376   return GNUNET_OK;
5377 }
5378
5379
5380 /*
5381  * Core handle for p2p notify new successor messages.
5382  * @param cls closure
5383  * @param message message
5384  * @param peer peer identity this notification is about
5385  * @return #GNUNET_OK on success, #GNUNET_SYSERR on error
5386  */
5387 static int
5388 handle_dht_p2p_notify_new_successor(void *cls,
5389                                     const struct GNUNET_PeerIdentity *peer,
5390                                     const struct GNUNET_MessageHeader *message)
5391 {
5392   const struct PeerNotifyNewSuccessorMessage *nsm;
5393   struct GNUNET_PeerIdentity *trail;
5394   struct GNUNET_PeerIdentity source;
5395   struct GNUNET_PeerIdentity new_successor;
5396   struct GNUNET_HashCode trail_id;
5397   struct GNUNET_PeerIdentity next_hop;
5398   struct FriendInfo *target_friend;
5399   int my_index;
5400   size_t msize;
5401   uint32_t trail_length;
5402
5403   msize = ntohs (message->size);
5404   if (msize < sizeof (struct PeerNotifyNewSuccessorMessage))
5405   {
5406     GNUNET_break_op (0);
5407     return GNUNET_YES;
5408   }
5409   nsm = (const struct PeerNotifyNewSuccessorMessage *) message;
5410   if ((msize - sizeof (struct PeerNotifyNewSuccessorMessage)) %
5411       sizeof (struct GNUNET_PeerIdentity) != 0)
5412   {
5413     GNUNET_break_op (0);
5414     return GNUNET_OK;
5415   }
5416   trail_length = (msize - sizeof (struct PeerNotifyNewSuccessorMessage))/
5417                   sizeof (struct GNUNET_PeerIdentity);
5418   GNUNET_STATISTICS_update (GDS_stats,
5419                             gettext_noop
5420                             ("# Bytes received from other peers"), msize,
5421                             GNUNET_NO);
5422
5423   trail = (struct GNUNET_PeerIdentity *) &nsm[1];
5424   source  = nsm->source_peer;
5425   new_successor = nsm->new_successor;
5426   trail_id = nsm->trail_id;
5427
5428   /* I am the new_successor to source_peer. */
5429   if ( 0 == GNUNET_CRYPTO_cmp_peer_identity (&my_identity, &new_successor))
5430   {
5431     if(trail_length > 0)
5432       GNUNET_assert(0 == GNUNET_CRYPTO_cmp_peer_identity(&trail[trail_length - 1],
5433                                                           peer));
5434     else
5435       GNUNET_assert(0 == GNUNET_CRYPTO_cmp_peer_identity(&source, peer));
5436
5437     compare_and_update_predecessor (source, trail, trail_length);
5438     target_friend = GNUNET_CONTAINER_multipeermap_get (friend_peermap, peer);
5439     GNUNET_assert (NULL != target_friend);
5440     GDS_NEIGHBOURS_send_notify_succcessor_confirmation (trail_id,
5441                                                         GDS_ROUTING_DEST_TO_SRC,
5442                                                         target_friend);
5443     return GNUNET_OK;
5444   }
5445
5446   GNUNET_assert(trail_length > 0);
5447   /* I am part of trail to reach to successor. */
5448   my_index = search_my_index (trail, trail_length);
5449   if (-1 == my_index)
5450   {
5451     DEBUG ("No entry found in trail\n");
5452     GNUNET_break_op (0);
5453     return GNUNET_SYSERR;
5454   }
5455   if((trail_length + 1) == my_index)
5456   {
5457     DEBUG ("Found twice in trail.\n");
5458     GNUNET_break_op (0);
5459     return GNUNET_SYSERR;
5460   }
5461   if ((trail_length-1) == my_index)
5462     next_hop = new_successor;
5463   else
5464     next_hop = trail[my_index + 1];
5465
5466   GDS_ROUTING_add(trail_id, *peer, next_hop);
5467   target_friend =
5468                  GNUNET_CONTAINER_multipeermap_get (friend_peermap, &next_hop);
5469   if (NULL == target_friend)
5470   {
5471     GNUNET_break(0);
5472     return GNUNET_OK;
5473   }
5474   GDS_NEIGHBOURS_send_notify_new_successor (source, new_successor, trail,
5475                                             trail_length,
5476                                             trail_id, target_friend);
5477   return GNUNET_OK;
5478
5479 }
5480
5481
5482 /**
5483  * Core handler for P2P notify successor message
5484  * @param cls closure
5485  * @param message message
5486  * @param peer peer identity this notification is about
5487  * @return #GNUNET_OK on success, #GNUNET_SYSERR on error
5488  */
5489 static int
5490 handle_dht_p2p_notify_succ_confirmation (void *cls,
5491                                          const struct GNUNET_PeerIdentity *peer,
5492                                          const struct GNUNET_MessageHeader *message)
5493 {
5494   const struct PeerNotifyConfirmationMessage *notify_confirmation;
5495   enum GDS_ROUTING_trail_direction trail_direction;
5496   struct GNUNET_HashCode trail_id;
5497   struct FriendInfo *target_friend;
5498   struct GNUNET_PeerIdentity *next_hop;
5499   size_t msize;
5500
5501   msize = ntohs (message->size);
5502
5503   if (msize != sizeof (struct PeerNotifyConfirmationMessage))
5504   {
5505     GNUNET_break_op (0);
5506     return GNUNET_OK;
5507   }
5508   GNUNET_STATISTICS_update (GDS_stats,
5509                             gettext_noop
5510                             ("# Bytes received from other peers"), msize,
5511                             GNUNET_NO);
5512
5513   notify_confirmation = (const struct PeerNotifyConfirmationMessage *) message;
5514   trail_direction = ntohl (notify_confirmation->trail_direction);
5515   trail_id = notify_confirmation->trail_id;
5516
5517   next_hop = GDS_ROUTING_get_next_hop (trail_id, trail_direction);
5518   if (NULL == next_hop)
5519   {
5520     /* The source of notify new successor, might have found even a better
5521      successor. In that case it send a trail teardown message, and hence,
5522      the next hop is NULL. */
5523     //Fixme: Add some print to confirm the above theory.
5524     return GNUNET_OK;
5525   }
5526
5527   /* I peer which sent the notify successor message to the successor. */
5528   if (0 == GNUNET_CRYPTO_cmp_peer_identity (next_hop, &my_identity))
5529   {
5530    /*
5531     * Schedule another round of verify sucessor with your current successor
5532     * which may or may not be source of this message. This message is used
5533     * only to ensure that we have a path setup to reach to our successor.
5534     */
5535
5536     // TODO: cancel schedule of notify_successor_retry_task
5537     if (send_notify_new_successor_retry_task != NULL)
5538     {
5539       struct SendNotifyContext *notify_ctx;
5540       notify_ctx = GNUNET_SCHEDULER_cancel(send_notify_new_successor_retry_task);
5541       GNUNET_free (notify_ctx->successor_trail);
5542       GNUNET_free (notify_ctx);
5543       send_notify_new_successor_retry_task = NULL;
5544     }
5545     if (send_verify_successor_task == NULL)
5546     {
5547       verify_successor_next_send_time.rel_value_us =
5548       DHT_SEND_VERIFY_SUCCESSOR_INTERVAL.rel_value_us +
5549       GNUNET_CRYPTO_random_u64 (GNUNET_CRYPTO_QUALITY_WEAK,
5550                                 DHT_SEND_VERIFY_SUCCESSOR_INTERVAL.rel_value_us);
5551       send_verify_successor_task =
5552               GNUNET_SCHEDULER_add_delayed(verify_successor_next_send_time,
5553                                            &send_verify_successor_message,
5554                                            NULL);
5555     }
5556   }
5557   else
5558   {
5559     target_friend = GNUNET_CONTAINER_multipeermap_get (friend_peermap, next_hop);
5560     if (NULL == target_friend)
5561     {
5562       DEBUG ("\n friend not found, line number = %d",__LINE__);
5563       return GNUNET_SYSERR;
5564     }
5565     GDS_NEIGHBOURS_send_notify_succcessor_confirmation  (trail_id,
5566                                                         GDS_ROUTING_DEST_TO_SRC,
5567                                                         target_friend);
5568   }
5569   return GNUNET_OK;
5570 }
5571
5572
5573 /**
5574  * Core handler for P2P trail rejection message
5575  * @param cls closure
5576  * @param message message
5577  * @param peer peer identity this notification is about
5578  * @return #GNUNET_OK on success, #GNUNET_SYSERR on error
5579  */
5580 static int
5581 handle_dht_p2p_trail_setup_rejection (void *cls,
5582                                       const struct GNUNET_PeerIdentity *peer,
5583                                       const struct GNUNET_MessageHeader *message)
5584 {
5585   const struct PeerTrailRejectionMessage *trail_rejection;
5586   unsigned int trail_length;
5587   const struct GNUNET_PeerIdentity *trail_peer_list;
5588   struct FriendInfo *target_friend;
5589   struct GNUNET_TIME_Relative congestion_timeout;
5590   struct GNUNET_HashCode trail_id;
5591   struct GNUNET_PeerIdentity next_peer;
5592   struct GNUNET_PeerIdentity source;
5593   uint64_t ultimate_destination_finger_value;
5594   unsigned int is_predecessor;
5595   size_t msize;
5596
5597   msize = ntohs (message->size);
5598   if (msize < sizeof (struct PeerTrailRejectionMessage))
5599   {
5600     GNUNET_break_op (0);
5601     return GNUNET_YES;
5602   }
5603   trail_rejection = (const struct PeerTrailRejectionMessage *) message;
5604   if ((msize - sizeof (struct PeerTrailRejectionMessage)) %
5605       sizeof (struct GNUNET_PeerIdentity) != 0)
5606   {
5607     GNUNET_break_op (0);
5608     return GNUNET_OK;
5609   }
5610   trail_length = (msize - sizeof (struct PeerTrailRejectionMessage))/
5611                   sizeof (struct GNUNET_PeerIdentity);
5612   GNUNET_STATISTICS_update (GDS_stats,
5613                             gettext_noop
5614                             ("# Bytes received from other peers"), msize,
5615                             GNUNET_NO);
5616
5617   trail_peer_list = (const struct GNUNET_PeerIdentity *)&trail_rejection[1];
5618   is_predecessor = ntohl (trail_rejection->is_predecessor);
5619   congestion_timeout = trail_rejection->congestion_time;
5620   source = trail_rejection->source_peer;
5621   trail_id = trail_rejection->trail_id;
5622   ultimate_destination_finger_value =
5623           GNUNET_ntohll (trail_rejection->ultimate_destination_finger_value);
5624   /* First set the congestion time of the friend that sent you this message. */
5625   target_friend = GNUNET_CONTAINER_multipeermap_get (friend_peermap, peer);
5626   if (NULL == target_friend)
5627   {
5628     DEBUG ("\nLINE = %d ,No friend found.",__LINE__);
5629     GNUNET_break(0);
5630     return GNUNET_OK;
5631   }
5632   target_friend->congestion_timestamp =
5633           GNUNET_TIME_absolute_add (GNUNET_TIME_absolute_get(),
5634                                     congestion_timeout);
5635
5636   /* I am the source peer which wants to setup the trail. Do nothing.
5637    * send_find_finger_trail_task is scheduled periodically.*/
5638   if(0 == (GNUNET_CRYPTO_cmp_peer_identity (&my_identity, &source)))
5639     return GNUNET_OK;
5640
5641   /* If I am congested then pass this message to peer before me in trail. */
5642   if(GNUNET_YES == GDS_ROUTING_threshold_reached())
5643   {
5644     /* First remove yourself from the trail. */
5645     unsigned int new_trail_length = trail_length - 1;
5646     struct GNUNET_PeerIdentity trail[new_trail_length];
5647
5648     memcpy (trail, trail_peer_list, new_trail_length * sizeof(struct GNUNET_PeerIdentity));
5649     if (0 == trail_length)
5650       next_peer = source;
5651     else
5652       next_peer = trail[new_trail_length-1];
5653
5654     target_friend =
5655                    GNUNET_CONTAINER_multipeermap_get (friend_peermap, &next_peer);
5656     if (NULL == target_friend)
5657     {
5658       DEBUG ("\nLINE = %d ,No friend found.",__LINE__);
5659       GNUNET_break(0);
5660       return GNUNET_OK;
5661     }
5662     GDS_NEIGHBOURS_send_trail_rejection (source,
5663                                          ultimate_destination_finger_value,
5664                                          my_identity, is_predecessor,
5665                                          trail, new_trail_length, trail_id,
5666                                          target_friend, CONGESTION_TIMEOUT);
5667     return GNUNET_OK;
5668   }
5669
5670   struct Closest_Peer successor;
5671   successor = find_local_best_known_next_hop (ultimate_destination_finger_value, is_predecessor);
5672
5673   /* Am I the final destination? */
5674   if (0 == (GNUNET_CRYPTO_cmp_peer_identity (&successor.best_known_destination,
5675                                              &my_identity)))
5676   {
5677      /*Here you are already part of trail. Copy the trail removing yourself. */
5678     unsigned int new_trail_length = trail_length - 1;
5679     struct GNUNET_PeerIdentity trail[new_trail_length];
5680
5681     memcpy (trail, trail_peer_list, new_trail_length * sizeof(struct GNUNET_PeerIdentity));
5682
5683     if (0 == new_trail_length)
5684       next_peer = source;
5685     else
5686     {
5687       next_peer = trail[new_trail_length-1];
5688     }
5689     target_friend =
5690                    GNUNET_CONTAINER_multipeermap_get (friend_peermap, &next_peer);
5691
5692     if (NULL == target_friend)
5693     {
5694       DEBUG ("\nLINE = %d ,No friend found.",__LINE__);
5695       GNUNET_break(0);
5696       return GNUNET_OK;
5697     }
5698     GDS_NEIGHBOURS_send_trail_setup_result (source,
5699                                             my_identity,
5700                                             target_friend, new_trail_length,
5701                                             trail,
5702                                             is_predecessor,
5703                                             ultimate_destination_finger_value,
5704                                             trail_id);
5705   }
5706   else
5707   {
5708     /* Here I was already part of trail. So no need to add. */
5709     target_friend =
5710                    GNUNET_CONTAINER_multipeermap_get (friend_peermap,
5711                                                       &successor.next_hop);
5712     if (NULL == target_friend)
5713     {
5714       DEBUG ("\nLINE = %d ,No friend found.",__LINE__);
5715       GNUNET_break(0);
5716       return GNUNET_OK;
5717     }
5718
5719     GDS_NEIGHBOURS_send_trail_setup (source,
5720                                      ultimate_destination_finger_value,
5721                                      successor.best_known_destination,
5722                                      target_friend, trail_length, trail_peer_list,
5723                                      is_predecessor, trail_id,
5724                                      successor.trail_id);
5725   }
5726   return GNUNET_OK;
5727 }
5728
5729
5730 /**
5731  * Core handler for trail teardown message.
5732  * @param cls closure
5733  * @param message message
5734  * @param peer sender of this messsage.
5735  * @return #GNUNET_OK on success, #GNUNET_SYSERR on error
5736  */
5737 static int
5738 handle_dht_p2p_trail_teardown (void *cls, const struct GNUNET_PeerIdentity *peer,
5739                                const struct GNUNET_MessageHeader *message)
5740 {
5741   const struct PeerTrailTearDownMessage *trail_teardown;
5742   enum GDS_ROUTING_trail_direction trail_direction;
5743   struct GNUNET_HashCode trail_id;
5744   struct GNUNET_PeerIdentity *next_hop;
5745   size_t msize;
5746
5747   msize = ntohs (message->size);
5748
5749   /* Here we pass only the trail id. */
5750   if (msize != sizeof (struct PeerTrailTearDownMessage))
5751   {
5752     GNUNET_break_op (0);
5753     return GNUNET_OK;
5754   }
5755
5756   GNUNET_STATISTICS_update (GDS_stats,
5757                             gettext_noop
5758                             ("# Bytes received from other peers"), msize,
5759                             GNUNET_NO);
5760
5761   trail_teardown = (const struct PeerTrailTearDownMessage *) message;
5762   trail_direction = ntohl (trail_teardown->trail_direction);
5763   trail_id = trail_teardown->trail_id;
5764
5765   /* Check if peer is the real peer from which we should get this message.*/
5766   /* Get the prev_hop for this trail by getting the next hop in opposite direction. */
5767 #if 0
5768   GNUNET_assert (NULL != (prev_hop =
5769                  GDS_ROUTING_get_next_hop (trail_id, !trail_direction)));
5770   if (0 != GNUNET_CRYPTO_cmp_peer_identity (prev_hop, peer))
5771   {
5772     GNUNET_break (0);
5773     return GNUNET_SYSERR;
5774   }
5775 #endif
5776
5777   next_hop = GDS_ROUTING_get_next_hop (trail_id, trail_direction);
5778   if (NULL == next_hop)
5779   {
5780     DEBUG(" NO ENTRY FOUND IN %s ROUTING TABLE for trail id %s, line %u",
5781           GNUNET_i2s (&my_identity),
5782           GNUNET_h2s(&trail_id),
5783           __LINE__);
5784     GNUNET_break (0);
5785     return GNUNET_SYSERR;
5786   }
5787
5788   /* I am the next hop, which means I am the final destination. */
5789   if (0 == GNUNET_CRYPTO_cmp_peer_identity (next_hop, &my_identity))
5790   {
5791     GNUNET_assert (GNUNET_YES == GDS_ROUTING_remove_trail (trail_id));
5792     return GNUNET_OK;
5793   }
5794   else
5795   {
5796     /* If not final destination, then send a trail teardown message to next hop.*/
5797     GNUNET_assert (NULL != GNUNET_CONTAINER_multipeermap_get (friend_peermap, next_hop));
5798     GNUNET_assert (GNUNET_YES == GDS_ROUTING_remove_trail (trail_id));
5799     GDS_NEIGHBOURS_send_trail_teardown (&trail_id, trail_direction, next_hop);
5800   }
5801
5802   return GNUNET_OK;
5803 }
5804
5805
5806 /**
5807  * Core handle for p2p add trail message.
5808  * @param cls closure
5809  * @param message message
5810  * @param peer peer identity this notification is about
5811  * @return #GNUNET_OK on success, #GNUNET_SYSERR on error
5812  */
5813 static int
5814 handle_dht_p2p_add_trail (void *cls, const struct GNUNET_PeerIdentity *peer,
5815                           const struct GNUNET_MessageHeader *message)
5816 {
5817   const struct PeerAddTrailMessage *add_trail;
5818   const struct GNUNET_PeerIdentity *trail;
5819   struct GNUNET_HashCode trail_id;
5820   struct GNUNET_PeerIdentity destination_peer;
5821   struct GNUNET_PeerIdentity source_peer;
5822   struct GNUNET_PeerIdentity next_hop;
5823   unsigned int trail_length;
5824   unsigned int my_index;
5825   size_t msize;
5826
5827   msize = ntohs (message->size);
5828   /* In this message we pass the whole trail from source to destination as we
5829    * are adding that trail.*/
5830   //FIXME: failed when run with 1000 pears. check why.
5831   if (msize < sizeof (struct PeerAddTrailMessage))
5832   {
5833     GNUNET_break_op (0);
5834     return GNUNET_OK;
5835   }
5836
5837   add_trail = (const struct PeerAddTrailMessage *) message;
5838   trail_length = (msize - sizeof (struct PeerAddTrailMessage))/
5839                   sizeof (struct GNUNET_PeerIdentity);
5840   if ((msize - sizeof (struct PeerAddTrailMessage)) %
5841       sizeof (struct GNUNET_PeerIdentity) != 0)
5842   {
5843     GNUNET_break_op (0);
5844     return GNUNET_OK;
5845   }
5846
5847   GNUNET_STATISTICS_update (GDS_stats,
5848                             gettext_noop
5849                             ("# Bytes received from other peers"), msize,
5850                             GNUNET_NO);
5851
5852   trail = (const struct GNUNET_PeerIdentity *)&add_trail[1];
5853   destination_peer = add_trail->destination_peer;
5854   source_peer = add_trail->source_peer;
5855   trail_id = add_trail->trail_id;
5856
5857   /* I am not the destination of the trail. */
5858   if (0 != GNUNET_CRYPTO_cmp_peer_identity (&my_identity, &destination_peer))
5859   {
5860     struct FriendInfo *target_friend;
5861
5862     /* Get my location in the trail. */
5863     my_index = search_my_index (trail, trail_length);
5864     if (-1 == my_index)
5865     {
5866       GNUNET_break_op (0);
5867       return GNUNET_SYSERR;
5868     }
5869     if((trail_length + 1) == my_index)
5870     {
5871       DEBUG ("Found twice in trail.\n");
5872       GNUNET_break_op (0);
5873       return GNUNET_SYSERR;
5874     }
5875     if ((trail_length - 1) == my_index)
5876     {
5877       next_hop = destination_peer;
5878     }
5879     else
5880     {
5881       next_hop = trail[my_index + 1];
5882     }
5883     /* Add in your routing table. */
5884     GNUNET_assert (GNUNET_OK == GDS_ROUTING_add (trail_id, *peer, next_hop));
5885     //GNUNET_assert (GNUNET_OK == GDS_ROUTING_add (trail_id, next_hop, *peer));
5886     GNUNET_assert (NULL !=
5887                   (target_friend =
5888                    GNUNET_CONTAINER_multipeermap_get (friend_peermap, &next_hop)));
5889     GDS_NEIGHBOURS_send_add_trail (source_peer, destination_peer, trail_id,
5890                                    trail, trail_length, target_friend);
5891     return GNUNET_OK;
5892   }
5893   /* I am the destination. Add an entry in routing table. */
5894   GNUNET_assert (GNUNET_OK == GDS_ROUTING_add (trail_id, *peer, my_identity));
5895   return GNUNET_OK;
5896 }
5897
5898
5899 /**
5900  * Free the finger trail in which the first friend to reach to a finger is
5901  * disconnected_friend. Also remove entry from routing table for that particular
5902  * trail id.
5903  * @param disconnected_friend PeerIdentity of friend which got disconnected
5904  * @param remove_finger Finger whose trail we need to check if it has
5905  *                      disconnected_friend as the first hop.
5906  * @return Total number of trails in which disconnected_friend was the first
5907  *         hop.
5908  */
5909 static int
5910 remove_matching_trails (const struct GNUNET_PeerIdentity *disconnected_friend,
5911                         struct FingerInfo *finger)
5912 {
5913   struct GNUNET_PeerIdentity *next_hop;
5914   struct FriendInfo *remove_friend;
5915   struct Trail *current_trail;
5916   unsigned int matching_trails_count = 0;
5917   int i;
5918
5919   /* Iterate over all the trails of finger. */
5920   for (i = 0; i < finger->trails_count; i++)
5921   {
5922     current_trail = &finger->trail_list[i];
5923     if (GNUNET_NO == current_trail->is_present)
5924       continue;
5925
5926     /* First friend to reach to finger is disconnected_peer. */
5927     if (0 == GNUNET_CRYPTO_cmp_peer_identity (&current_trail->trail_head->peer,
5928                                               disconnected_friend))
5929     {
5930       remove_friend =
5931                      GNUNET_CONTAINER_multipeermap_get (friend_peermap,
5932                                                         disconnected_friend);
5933       GNUNET_assert (NULL != remove_friend);
5934       next_hop = GDS_ROUTING_get_next_hop (current_trail->trail_id,
5935                                            GDS_ROUTING_SRC_TO_DEST);
5936
5937       /* Here it may happen that as all the peers got disconnected, the entry in
5938        routing table for that particular trail has been removed, because the
5939        previously disconnected peer was either a next hop or prev hop of that
5940        peer. */
5941       if (NULL != next_hop)
5942       {
5943         GNUNET_assert (0 == (GNUNET_CRYPTO_cmp_peer_identity (disconnected_friend,
5944                                                               next_hop)));
5945         GNUNET_assert (GNUNET_YES == GDS_ROUTING_remove_trail (current_trail->trail_id));
5946       }
5947       matching_trails_count++;
5948       free_trail (current_trail);
5949       current_trail->is_present = GNUNET_NO;
5950     }
5951   }
5952   return matching_trails_count;
5953 }
5954
5955
5956 /**
5957  * Iterate over finger_table entries.
5958  * 0. Ignore finger which is my_identity or if no valid entry present at
5959  *    that finger index.
5960  * 1. If disconnected_friend is a finger, then remove the routing entry from
5961       your own table. Free the trail.
5962  * 2. Check if disconnected_friend is the first friend in the trail to reach to a finger.
5963  *   2.1 Remove all the trails and entry from routing table in which disconnected
5964  *       friend is the first friend in the trail. If disconnected_friend is the
5965  *       first friend in all the trails to reach finger, then remove the finger.
5966  * @param disconnected_friend Peer identity of friend which got disconnected.
5967  */
5968 static void
5969 remove_matching_fingers (const struct GNUNET_PeerIdentity *disconnected_peer)
5970 {
5971   struct FingerInfo *current_finger;
5972   int removed_trails_count;
5973   int i;
5974
5975   /* Iterate over finger table entries. */
5976   for (i = 0; i < MAX_FINGERS; i++)
5977   {
5978     current_finger = &finger_table[i];
5979
5980     /* No finger stored at this trail index or I am the finger. */
5981     if ((GNUNET_NO == current_finger->is_present) ||
5982         (0 == GNUNET_CRYPTO_cmp_peer_identity (&current_finger->finger_identity,
5983                                                &my_identity)))
5984       continue;
5985
5986     /* Is disconnected_peer a finger? */
5987     if (0 == GNUNET_CRYPTO_cmp_peer_identity (disconnected_peer,
5988                                               &current_finger->finger_identity))
5989     {
5990       remove_existing_finger (current_finger, i);
5991     }
5992
5993     /* If finger is a friend but not disconnected_friend, then continue. */
5994     if (NULL != GNUNET_CONTAINER_multipeermap_get (friend_peermap,
5995                                                    &current_finger->finger_identity))
5996       continue;
5997
5998     /* Iterate over the list of trails to reach remove_finger. Check if
5999      * disconnected_friend is the first friend in any of the trail. */
6000     removed_trails_count = remove_matching_trails (disconnected_peer,
6001                                                    current_finger);
6002     current_finger->trails_count =
6003             current_finger->trails_count - removed_trails_count;
6004     if (0 == current_finger->trails_count)
6005     {
6006       current_finger->is_present = GNUNET_NO;
6007       memset ((void *)&finger_table[i], 0, sizeof (finger_table[i]));
6008     }
6009   }
6010 }
6011
6012
6013 /**
6014  * Method called whenever a peer disconnects.
6015  *
6016  * @param cls closure
6017  * @param peer peer identity this notification is about
6018  */
6019 static void
6020 handle_core_disconnect (void *cls,
6021                                           const struct GNUNET_PeerIdentity *peer)
6022 {
6023   struct FriendInfo *remove_friend;
6024   struct P2PPendingMessage *pos;
6025   unsigned int discarded;
6026
6027   /* If disconnected to own identity, then return. */
6028   if (0 == memcmp (&my_identity, peer, sizeof (struct GNUNET_PeerIdentity)))
6029     return;
6030
6031   if(NULL == (remove_friend =
6032                  GNUNET_CONTAINER_multipeermap_get (friend_peermap, peer)))
6033   {
6034     DEBUG("\n friend already disconnected.");
6035     return;
6036   }
6037
6038   remove_matching_fingers (peer);
6039   GNUNET_assert (GNUNET_SYSERR != GDS_ROUTING_remove_trail_by_peer (peer));
6040   GNUNET_assert (GNUNET_YES ==
6041                  GNUNET_CONTAINER_multipeermap_remove (friend_peermap,
6042                                                        peer,
6043                                                        remove_friend));
6044
6045   /* Remove all the messages queued in pending list of this peer is discarded.*/
6046   if (remove_friend->th != NULL)
6047   {
6048     GNUNET_CORE_notify_transmit_ready_cancel(remove_friend->th);
6049     remove_friend->th = NULL;
6050   }
6051
6052   discarded = 0;
6053   while (NULL != (pos = remove_friend->head))
6054   {
6055     GNUNET_CONTAINER_DLL_remove (remove_friend->head, remove_friend->tail, pos);
6056     discarded++;
6057     GNUNET_free (pos);
6058   }
6059
6060   GNUNET_STATISTICS_update (GDS_stats,
6061                             gettext_noop
6062                             ("# Queued messages discarded (peer disconnected)"),
6063                             discarded, GNUNET_NO);
6064   //GNUNET_free (remove_friend);
6065
6066   if (0 != GNUNET_CONTAINER_multipeermap_size (friend_peermap))
6067     return;
6068
6069   if (NULL != find_finger_trail_task)
6070   {
6071       GNUNET_SCHEDULER_cancel (find_finger_trail_task);
6072       find_finger_trail_task = NULL;
6073   }
6074   else
6075     GNUNET_break (0);
6076 }
6077
6078
6079 /**
6080  * Method called whenever a peer connects.
6081  *
6082  * @param cls closure
6083  * @param peer_identity peer identity this notification is about
6084  */
6085 static void
6086 handle_core_connect (void *cls, const struct GNUNET_PeerIdentity *peer_identity)
6087 {
6088   struct FriendInfo *friend;
6089
6090   /* Check for connect to self message */
6091   if (0 == memcmp (&my_identity, peer_identity, sizeof (struct GNUNET_PeerIdentity)))
6092     return;
6093
6094   /* If peer already exists in our friend_peermap, then exit. */
6095   if (GNUNET_YES == GNUNET_CONTAINER_multipeermap_contains (friend_peermap,
6096                                                             peer_identity))
6097   {
6098     GNUNET_break (0);
6099     return;
6100   }
6101
6102   friend = GNUNET_new (struct FriendInfo);
6103   friend->id = *peer_identity;
6104
6105   GNUNET_assert (GNUNET_OK ==
6106                  GNUNET_CONTAINER_multipeermap_put (friend_peermap,
6107                                                     peer_identity, friend,
6108                                                     GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY));
6109
6110   /* FIXME: now we are not making a distinction between fingers which are friends
6111    * also.But later, we should add a congestion timestamp on the friend, so that it is
6112    * selected after some time out. This is to ensure that both peers have added
6113    * each other as their friend. */
6114   /* Got a first connection, good time to start with FIND FINGER TRAIL requests...*/
6115   if (NULL == find_finger_trail_task)
6116   {
6117     find_finger_trail_task = GNUNET_SCHEDULER_add_now (&send_find_finger_trail_message, NULL);
6118   }
6119 }
6120
6121
6122 /**
6123  * To be called on core init/fail.
6124  *
6125  * @param cls service closure
6126  * @param identity the public identity of this peer
6127  */
6128 static void
6129 core_init (void *cls,
6130            const struct GNUNET_PeerIdentity *identity)
6131 {
6132   my_identity = *identity;
6133 }
6134
6135
6136 /**
6137  * Initialize finger table entries.
6138  */
6139 static void
6140 finger_table_init ()
6141 {
6142   memset (&finger_table, 0, sizeof (finger_table));
6143 }
6144
6145
6146 /**
6147  * Initialize neighbours subsystem.
6148  * @return #GNUNET_OK on success, #GNUNET_SYSERR on error
6149  */
6150 int
6151 GDS_NEIGHBOURS_init (void)
6152 {
6153   static struct GNUNET_CORE_MessageHandler core_handlers[] = {
6154     {&handle_dht_p2p_put, GNUNET_MESSAGE_TYPE_XDHT_P2P_PUT, 0},
6155     {&handle_dht_p2p_get, GNUNET_MESSAGE_TYPE_XDHT_P2P_GET, 0},
6156     {&handle_dht_p2p_get_result, GNUNET_MESSAGE_TYPE_XDHT_P2P_GET_RESULT, 0},
6157     {&handle_dht_p2p_trail_setup, GNUNET_MESSAGE_TYPE_XDHT_P2P_TRAIL_SETUP, 0},
6158     {&handle_dht_p2p_trail_setup_result, GNUNET_MESSAGE_TYPE_XDHT_P2P_TRAIL_SETUP_RESULT, 0},
6159     {&handle_dht_p2p_verify_successor, GNUNET_MESSAGE_TYPE_XDHT_P2P_VERIFY_SUCCESSOR, 0},
6160     {&handle_dht_p2p_verify_successor_result, GNUNET_MESSAGE_TYPE_XDHT_P2P_VERIFY_SUCCESSOR_RESULT, 0},
6161     {&handle_dht_p2p_notify_new_successor, GNUNET_MESSAGE_TYPE_XDHT_P2P_NOTIFY_NEW_SUCCESSOR, 0},
6162     {&handle_dht_p2p_trail_setup_rejection, GNUNET_MESSAGE_TYPE_XDHT_P2P_TRAIL_SETUP_REJECTION, 0},
6163     {&handle_dht_p2p_trail_teardown, GNUNET_MESSAGE_TYPE_XDHT_P2P_TRAIL_TEARDOWN,
6164                                      sizeof (struct PeerTrailTearDownMessage)},
6165     {&handle_dht_p2p_add_trail, GNUNET_MESSAGE_TYPE_XDHT_P2P_ADD_TRAIL, 0},
6166     {&handle_dht_p2p_notify_succ_confirmation, GNUNET_MESSAGE_TYPE_XDHT_P2P_NOTIFY_SUCCESSOR_CONFIRMATION,
6167                                       sizeof (struct PeerNotifyConfirmationMessage)},
6168     {NULL, 0, 0}
6169   };
6170
6171 #if ENABLE_MALICIOUS
6172   act_malicious = 0;
6173 #endif
6174
6175   core_api =
6176     GNUNET_CORE_connect (GDS_cfg, NULL, &core_init, &handle_core_connect,
6177                          &handle_core_disconnect, NULL, GNUNET_NO, NULL,
6178                          GNUNET_NO, core_handlers);
6179
6180   if (NULL == core_api)
6181     return GNUNET_SYSERR;
6182
6183   //TODO: check size of this peer map?
6184   friend_peermap = GNUNET_CONTAINER_multipeermap_create (256, GNUNET_NO);
6185   finger_table_init ();
6186   successor_times = 10;
6187   fingers_round_count = 5;
6188   find_finger_trail_task_next_send_time.rel_value_us =
6189       DHT_FIND_FINGER_TRAIL_INTERVAL.rel_value_us +
6190       GNUNET_CRYPTO_random_u64 (GNUNET_CRYPTO_QUALITY_WEAK,
6191                                 DHT_FIND_FINGER_TRAIL_INTERVAL.rel_value_us);
6192
6193   verify_successor_next_send_time.rel_value_us =
6194       DHT_SEND_VERIFY_SUCCESSOR_INTERVAL.rel_value_us +
6195       GNUNET_CRYPTO_random_u64 (GNUNET_CRYPTO_QUALITY_WEAK,
6196                                 DHT_SEND_VERIFY_SUCCESSOR_INTERVAL.rel_value_us);
6197
6198   verify_successor_retry_time.rel_value_us =
6199       DHT_SEND_VERIFY_SUCCESSOR_RETRY_INTERVAL.rel_value_us +
6200       GNUNET_CRYPTO_random_u64 (GNUNET_CRYPTO_QUALITY_WEAK,
6201                                 DHT_SEND_VERIFY_SUCCESSOR_RETRY_INTERVAL.rel_value_us);
6202
6203   notify_successor_retry_time.rel_value_us =
6204       DHT_SEND_NOTIFY_SUCCESSOR_RETRY_INTERVAL.rel_value_us +
6205       GNUNET_CRYPTO_random_u64 (GNUNET_CRYPTO_QUALITY_WEAK,
6206                                 DHT_SEND_NOTIFY_SUCCESSOR_RETRY_INTERVAL.rel_value_us);
6207
6208
6209   return GNUNET_OK;
6210 }
6211
6212
6213 /**
6214  * Free the memory held up by trails of a finger.
6215  */
6216 static void
6217 delete_finger_table_entries()
6218 {
6219   unsigned int i;
6220   unsigned int j;
6221
6222   for(i = 0; i < MAX_FINGERS; i++)
6223   {
6224     if(GNUNET_YES == finger_table[i].is_present)
6225     {
6226       for(j = 0; j < finger_table[i].trails_count; j++)
6227         free_trail(&finger_table[i].trail_list[j]);
6228     }
6229   }
6230 }
6231
6232
6233 /**
6234  * Shutdown neighbours subsystem.
6235  */
6236 void
6237 GDS_NEIGHBOURS_done (void)
6238 {
6239   if (NULL == core_api)
6240     return;
6241
6242   GNUNET_CORE_disconnect (core_api);
6243   core_api = NULL;
6244
6245   delete_finger_table_entries();
6246   GNUNET_assert (0 == GNUNET_CONTAINER_multipeermap_size (friend_peermap));
6247   GNUNET_CONTAINER_multipeermap_destroy (friend_peermap);
6248   friend_peermap = NULL;
6249
6250   if (NULL != find_finger_trail_task)
6251   {
6252     GNUNET_SCHEDULER_cancel (find_finger_trail_task);
6253     find_finger_trail_task = NULL;
6254   }
6255
6256   if (NULL != send_verify_successor_task)
6257   {
6258     GNUNET_SCHEDULER_cancel (send_verify_successor_task);
6259     send_verify_successor_task = NULL;
6260   }
6261
6262   if (NULL != send_verify_successor_retry_task)
6263   {
6264     struct VerifySuccessorContext *ctx;
6265     ctx = GNUNET_SCHEDULER_cancel (send_verify_successor_retry_task);
6266     GNUNET_free(ctx);
6267     send_verify_successor_retry_task = NULL;
6268   }
6269
6270   if (send_notify_new_successor_retry_task != NULL)
6271   {
6272     struct SendNotifyContext *notify_ctx;
6273     notify_ctx = GNUNET_SCHEDULER_cancel(send_notify_new_successor_retry_task);
6274     GNUNET_free (notify_ctx->successor_trail);
6275     GNUNET_free (notify_ctx);
6276     send_notify_new_successor_retry_task = NULL;
6277   }
6278 }
6279
6280
6281 /**
6282  * Get my identity
6283  *
6284  * @return my identity
6285  */
6286 struct GNUNET_PeerIdentity
6287 GDS_NEIGHBOURS_get_my_id (void)
6288 {
6289   return my_identity;
6290 }
6291
6292 /* end of gnunet-service-xdht_neighbours.c */