- store peer's permanent key in ax
[oweals/gnunet.git] / src / cadet / gnunet-service-cadet_peer.c
1 /*
2      This file is part of GNUnet.
3      Copyright (C) 2013 Christian Grothoff (and other contributing authors)
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., 59 Temple Place - Suite 330,
18      Boston, MA 02111-1307, USA.
19 */
20
21
22 #include "platform.h"
23 #include "gnunet_util_lib.h"
24
25 #include "gnunet_signatures.h"
26
27 #include "gnunet_transport_service.h"
28 #include "gnunet_core_service.h"
29 #include "gnunet_statistics_service.h"
30
31 #include "cadet_protocol.h"
32
33 #include "gnunet-service-cadet_peer.h"
34 #include "gnunet-service-cadet_dht.h"
35 #include "gnunet-service-cadet_connection.h"
36 #include "gnunet-service-cadet_tunnel.h"
37 #include "cadet_path.h"
38
39 #define LOG(level, ...) GNUNET_log_from (level,"cadet-p2p",__VA_ARGS__)
40 #define LOG2(level, ...) GNUNET_log_from_nocheck(level,"cadet-p2p",__VA_ARGS__)
41
42
43 /******************************************************************************/
44 /********************************   STRUCTS  **********************************/
45 /******************************************************************************/
46
47 /**
48  * Struct containing info about a queued transmission to this peer
49  */
50 struct CadetPeerQueue
51 {
52     /**
53       * DLL next
54       */
55   struct CadetPeerQueue *next;
56
57     /**
58       * DLL previous
59       */
60   struct CadetPeerQueue *prev;
61
62     /**
63      * Peer this transmission is directed to.
64      */
65   struct CadetPeer *peer;
66
67     /**
68      * Connection this message belongs to.
69      */
70   struct CadetConnection *c;
71
72     /**
73      * Is FWD in c?
74      */
75   int fwd;
76
77     /**
78      * Pointer to info stucture used as cls.
79      */
80   void *cls;
81
82   /**
83    * Type of message
84    */
85   uint16_t type;
86
87   /**
88    * Type of message
89    */
90   uint16_t payload_type;
91
92   /**
93    * Type of message
94    */
95   uint32_t payload_id;
96
97   /**
98      * Size of the message
99      */
100   size_t size;
101
102     /**
103      * Set when this message starts waiting for CORE.
104      */
105   struct GNUNET_TIME_Absolute start_waiting;
106
107     /**
108      * Function to call on sending.
109      */
110   GCP_sent callback;
111
112     /**
113      * Closure for callback.
114      */
115   void *callback_cls;
116 };
117
118 /**
119  * Struct containing all information regarding a given peer
120  */
121 struct CadetPeer
122 {
123     /**
124      * ID of the peer
125      */
126   GNUNET_PEER_Id id;
127
128     /**
129      * Axolotl permanent public key.
130      */
131   struct GNUNET_CRYPTO_EcdhePublicKey ax_key;
132
133     /**
134      * Last time we heard from this peer
135      */
136   struct GNUNET_TIME_Absolute last_contact;
137
138     /**
139      * Paths to reach the peer, ordered by ascending hop count
140      */
141   struct CadetPeerPath *path_head;
142
143     /**
144      * Paths to reach the peer, ordered by ascending hop count
145      */
146   struct CadetPeerPath *path_tail;
147
148     /**
149      * Handle to stop the DHT search for paths to this peer
150      */
151   struct GCD_search_handle *search_h;
152
153   /**
154    * Handle to stop the DHT search for paths to this peer
155    */
156   struct GNUNET_SCHEDULER_Task *search_delayed;
157
158     /**
159      * Tunnel to this peer, if any.
160      */
161   struct CadetTunnel *tunnel;
162
163     /**
164      * Connections that go through this peer, indexed by tid;
165      */
166   struct GNUNET_CONTAINER_MultiHashMap *connections;
167
168     /**
169      * Handle for queued transmissions
170      */
171   struct GNUNET_CORE_TransmitHandle *core_transmit;
172
173   /**
174    * Timestamp
175    */
176   struct GNUNET_TIME_Absolute tmt_time;
177
178   /**
179    * Transmission queue to core DLL head
180    */
181   struct CadetPeerQueue *queue_head;
182
183   /**
184    * Transmission queue to core DLL tail
185    */
186   struct CadetPeerQueue *queue_tail;
187
188   /**
189    * How many messages are in the queue to this peer.
190    */
191   unsigned int queue_n;
192
193   /**
194    * Hello message.
195    */
196   struct GNUNET_HELLO_Message* hello;
197 };
198
199
200 /******************************************************************************/
201 /*******************************   GLOBALS  ***********************************/
202 /******************************************************************************/
203
204 /**
205  * Global handle to the statistics service.
206  */
207 extern struct GNUNET_STATISTICS_Handle *stats;
208
209 /**
210  * Local peer own ID (full value).
211  */
212 extern struct GNUNET_PeerIdentity my_full_id;
213
214 /**
215  * Local peer own ID (short)
216  */
217 extern GNUNET_PEER_Id myid;
218
219 /**
220  * Peers known, indexed by PeerIdentity (CadetPeer).
221  */
222 static struct GNUNET_CONTAINER_MultiPeerMap *peers;
223
224 /**
225  * How many peers do we want to remember?
226  */
227 static unsigned long long max_peers;
228
229 /**
230  * Percentage of messages that will be dropped (for test purposes only).
231  */
232 static unsigned long long drop_percent;
233
234 /**
235  * Handle to communicate with core.
236  */
237 static struct GNUNET_CORE_Handle *core_handle;
238
239 /**
240  * Handle to try to start new connections.
241  */
242 static struct GNUNET_TRANSPORT_Handle *transport_handle;
243
244
245 /******************************************************************************/
246 /*****************************     DEBUG      *********************************/
247 /******************************************************************************/
248
249 /**
250  * Log all kinds of info about the queueing status of a peer.
251  *
252  * @param p Peer whose queue to show.
253  * @param level Error level to use for logging.
254  */
255 static void
256 queue_debug (const struct CadetPeer *p, enum GNUNET_ErrorType level)
257 {
258   struct CadetPeerQueue *q;
259   int do_log;
260
261   do_log = GNUNET_get_log_call_status (level & (~GNUNET_ERROR_TYPE_BULK),
262                                        "cadet-p2p",
263                                        __FILE__, __FUNCTION__, __LINE__);
264   if (0 == do_log)
265     return;
266
267   LOG2 (level, "QQQ Message queue towards %s\n", GCP_2s (p));
268   LOG2 (level, "QQQ  queue length: %u\n", p->queue_n);
269   LOG2 (level, "QQQ  core tmt rdy: %p\n", p->core_transmit);
270
271   for (q = p->queue_head; NULL != q; q = q->next)
272   {
273     LOG2 (level, "QQQ  - %s %s on %s\n",
274          GC_m2s (q->type), GC_f2s (q->fwd), GCC_2s (q->c));
275     LOG2 (level, "QQQ    payload %s, %u\n",
276          GC_m2s (q->payload_type), q->payload_id);
277     LOG2 (level, "QQQ    size: %u bytes\n", q->size);
278   }
279
280   LOG2 (level, "QQQ End queue towards %s\n", GCP_2s (p));
281 }
282
283
284 /**
285  * Log all kinds of info about a peer.
286  *
287  * @param peer Peer.
288  */
289 void
290 GCP_debug (const struct CadetPeer *p, enum GNUNET_ErrorType level)
291 {
292   struct CadetPeerPath *path;
293   unsigned int conns;
294   int do_log;
295
296   do_log = GNUNET_get_log_call_status (level & (~GNUNET_ERROR_TYPE_BULK),
297                                        "cadet-p2p",
298                                        __FILE__, __FUNCTION__, __LINE__);
299   if (0 == do_log)
300     return;
301
302   if (NULL == p)
303   {
304     LOG2 (level, "PPP DEBUG PEER NULL\n");
305     return;
306   }
307
308   LOG2 (level, "PPP DEBUG PEER %s\n", GCP_2s (p));
309   LOG2 (level, "PPP last contact %s\n",
310        GNUNET_STRINGS_absolute_time_to_string (p->last_contact));
311   for (path = p->path_head; NULL != path; path = path->next)
312   {
313     char *s;
314
315     s = path_2s (path);
316     LOG2 (level, "PPP path: %s\n", s);
317     GNUNET_free (s);
318   }
319
320   LOG2 (level, "PPP core transmit handle %p\n", p->core_transmit);
321   LOG2 (level, "PPP DHT GET handle %p\n", p->search_h);
322   if (NULL != p->connections)
323     conns = GNUNET_CONTAINER_multihashmap_size (p->connections);
324   else
325     conns = 0;
326   LOG2 (level, "PPP # connections over link to peer: %u\n", conns);
327   queue_debug (p, level);
328   LOG2 (level, "PPP DEBUG END\n");
329 }
330
331
332 /******************************************************************************/
333 /*****************************  CORE HELPERS  *********************************/
334 /******************************************************************************/
335
336
337 /**
338  * Iterator to notify all connections of a broken link. Mark connections
339  * to destroy after all traffic has been sent.
340  *
341  * @param cls Closure (peer disconnected).
342  * @param key Current key code (peer id).
343  * @param value Value in the hash map (connection).
344  *
345  * @return #GNUNET_YES to continue to iterate.
346  */
347 static int
348 notify_broken (void *cls,
349                const struct GNUNET_HashCode *key,
350                void *value)
351 {
352   struct CadetPeer *peer = cls;
353   struct CadetConnection *c = value;
354
355   LOG (GNUNET_ERROR_TYPE_DEBUG, "  notifying %s due to %s\n",
356        GCC_2s (c), GCP_2s (peer));
357   GCC_notify_broken (c, peer);
358
359   return GNUNET_YES;
360 }
361
362
363 /**
364  * Remove the direct path to the peer.
365  *
366  * @param peer Peer to remove the direct path from.
367  *
368  */
369 static struct CadetPeerPath *
370 pop_direct_path (struct CadetPeer *peer)
371 {
372   struct CadetPeerPath *iter;
373
374   for (iter = peer->path_head; NULL != iter; iter = iter->next)
375   {
376     if (2 >= iter->length)
377     {
378       GNUNET_CONTAINER_DLL_remove (peer->path_head, peer->path_tail, iter);
379       return iter;
380     }
381   }
382   return NULL;
383 }
384
385
386 /******************************************************************************/
387 /***************************** CORE CALLBACKS *********************************/
388 /******************************************************************************/
389
390 /**
391  * Method called whenever a given peer connects.
392  *
393  * @param cls closure
394  * @param peer peer identity this notification is about
395  */
396 static void
397 core_connect (void *cls, const struct GNUNET_PeerIdentity *peer)
398 {
399   struct CadetPeer *mp;
400   struct CadetPeerPath *path;
401   char own_id[16];
402
403   strncpy (own_id, GNUNET_i2s (&my_full_id), 15);
404   mp = GCP_get (peer);
405   if (myid == mp->id)
406   {
407     LOG (GNUNET_ERROR_TYPE_INFO, "CONNECTED %s (self)\n", own_id);
408     path = path_new (1);
409   }
410   else
411   {
412     LOG (GNUNET_ERROR_TYPE_INFO, "CONNECTED %s <= %s\n",
413          own_id, GNUNET_i2s (peer));
414     path = path_new (2);
415     path->peers[1] = mp->id;
416     GNUNET_PEER_change_rc (mp->id, 1);
417     GNUNET_STATISTICS_update (stats, "# peers", 1, GNUNET_NO);
418   }
419   path->peers[0] = myid;
420   GNUNET_PEER_change_rc (myid, 1);
421   GCP_add_path (mp, path, GNUNET_YES);
422
423   mp->connections = GNUNET_CONTAINER_multihashmap_create (32, GNUNET_YES);
424
425   if (NULL != GCP_get_tunnel (mp) &&
426       0 > GNUNET_CRYPTO_cmp_peer_identity (&my_full_id, peer))
427   {
428     GCP_connect (mp);
429   }
430
431   return;
432 }
433
434
435 /**
436  * Method called whenever a peer disconnects.
437  *
438  * @param cls closure
439  * @param peer peer identity this notification is about
440  */
441 static void
442 core_disconnect (void *cls, const struct GNUNET_PeerIdentity *peer)
443 {
444   struct CadetPeer *p;
445   struct CadetPeerPath *direct_path;
446   char own_id[16];
447
448   strncpy (own_id, GNUNET_i2s (&my_full_id), 15);
449   p = GNUNET_CONTAINER_multipeermap_get (peers, peer);
450   if (NULL == p)
451   {
452     GNUNET_break (0);
453     return;
454   }
455   if (myid == p->id)
456     LOG (GNUNET_ERROR_TYPE_INFO, "DISCONNECTED %s (self)\n", own_id);
457   else
458     LOG (GNUNET_ERROR_TYPE_INFO, "DISCONNECTED %s <= %s\n",
459          own_id, GNUNET_i2s (peer));
460   direct_path = pop_direct_path (p);
461   GNUNET_CONTAINER_multihashmap_iterate (p->connections, &notify_broken, p);
462   GNUNET_CONTAINER_multihashmap_destroy (p->connections);
463   p->connections = NULL;
464   if (NULL != p->core_transmit)
465     {
466       GNUNET_CORE_notify_transmit_ready_cancel (p->core_transmit);
467       p->core_transmit = NULL;
468       p->tmt_time.abs_value_us = 0;
469     }
470   GNUNET_STATISTICS_update (stats, "# peers", -1, GNUNET_NO);
471
472   path_destroy (direct_path);
473   return;
474 }
475
476
477 /**
478  * Functions to handle messages from core
479  */
480 static struct GNUNET_CORE_MessageHandler core_handlers[] = {
481   {&GCC_handle_create, GNUNET_MESSAGE_TYPE_CADET_CONNECTION_CREATE, 0},
482   {&GCC_handle_confirm, GNUNET_MESSAGE_TYPE_CADET_CONNECTION_ACK,
483     sizeof (struct GNUNET_CADET_ConnectionACK)},
484   {&GCC_handle_broken, GNUNET_MESSAGE_TYPE_CADET_CONNECTION_BROKEN,
485     sizeof (struct GNUNET_CADET_ConnectionBroken)},
486   {&GCC_handle_destroy, GNUNET_MESSAGE_TYPE_CADET_CONNECTION_DESTROY,
487     sizeof (struct GNUNET_CADET_ConnectionDestroy)},
488   {&GCC_handle_ack, GNUNET_MESSAGE_TYPE_CADET_ACK,
489     sizeof (struct GNUNET_CADET_ACK)},
490   {&GCC_handle_poll, GNUNET_MESSAGE_TYPE_CADET_POLL,
491     sizeof (struct GNUNET_CADET_Poll)},
492   {&GCC_handle_kx, GNUNET_MESSAGE_TYPE_CADET_KX, 0},
493   {&GCC_handle_encrypted, GNUNET_MESSAGE_TYPE_CADET_ENCRYPTED, 0}
494 };
495
496
497 /**
498  * To be called on core init/fail.
499  *
500  * @param cls Closure (config)
501  * @param identity the public identity of this peer
502  */
503 static void
504 core_init (void *cls,
505            const struct GNUNET_PeerIdentity *identity)
506 {
507   const struct GNUNET_CONFIGURATION_Handle *c = cls;
508   static int i = 0;
509
510   LOG (GNUNET_ERROR_TYPE_DEBUG, "Core init\n");
511   if (0 != memcmp (identity, &my_full_id, sizeof (my_full_id)))
512   {
513     LOG (GNUNET_ERROR_TYPE_ERROR, _("Wrong CORE service\n"));
514     LOG (GNUNET_ERROR_TYPE_ERROR, " core id %s\n", GNUNET_i2s (identity));
515     LOG (GNUNET_ERROR_TYPE_ERROR, " my id %s\n", GNUNET_i2s (&my_full_id));
516     GNUNET_CORE_disconnect (core_handle);
517     core_handle = GNUNET_CORE_connect (c, /* Main configuration */
518                                        NULL,      /* Closure passed to CADET functions */
519                                        &core_init,        /* Call core_init once connected */
520                                        &core_connect,     /* Handle connects */
521                                        &core_disconnect,  /* remove peers on disconnects */
522                                        NULL,      /* Don't notify about all incoming messages */
523                                        GNUNET_NO, /* For header only in notification */
524                                        NULL,      /* Don't notify about all outbound messages */
525                                        GNUNET_NO, /* For header-only out notification */
526                                        core_handlers);    /* Register these handlers */
527     if (10 < i++)
528       GNUNET_assert (0);
529   }
530   GML_start ();
531   return;
532 }
533
534
535 /**
536   * Core callback to write a pre-constructed data packet to core buffer
537   *
538   * @param cls Closure (CadetTransmissionDescriptor with data in "data" member).
539   * @param size Number of bytes available in buf.
540   * @param buf Where the to write the message.
541   *
542   * @return number of bytes written to buf
543   */
544 static size_t
545 send_core_data_raw (void *cls, size_t size, void *buf)
546 {
547   struct GNUNET_MessageHeader *msg = cls;
548   size_t total_size;
549
550   GNUNET_assert (NULL != msg);
551   total_size = ntohs (msg->size);
552
553   if (total_size > size)
554   {
555     GNUNET_break (0);
556     return 0;
557   }
558   memcpy (buf, msg, total_size);
559   GNUNET_free (cls);
560   return total_size;
561 }
562
563
564 /**
565  * Function to send a create connection message to a peer.
566  *
567  * @param c Connection to create.
568  * @param size number of bytes available in buf
569  * @param buf where the callee should write the message
570  * @return number of bytes written to buf
571  */
572 static size_t
573 send_core_connection_create (struct CadetConnection *c, size_t size, void *buf)
574 {
575   struct GNUNET_CADET_ConnectionCreate *msg;
576   struct GNUNET_PeerIdentity *peer_ptr;
577   const struct CadetPeerPath *p = GCC_get_path (c);
578   size_t size_needed;
579   int i;
580
581   if (NULL == p)
582     return 0;
583
584   LOG (GNUNET_ERROR_TYPE_DEBUG, "Sending CONNECTION CREATE...\n");
585   size_needed =
586       sizeof (struct GNUNET_CADET_ConnectionCreate) +
587       p->length * sizeof (struct GNUNET_PeerIdentity);
588
589   if (size < size_needed || NULL == buf)
590   {
591     GNUNET_break (0);
592     return 0;
593   }
594   msg = (struct GNUNET_CADET_ConnectionCreate *) buf;
595   msg->header.size = htons (size_needed);
596   msg->header.type = htons (GNUNET_MESSAGE_TYPE_CADET_CONNECTION_CREATE);
597   msg->cid = *GCC_get_id (c);
598
599   peer_ptr = (struct GNUNET_PeerIdentity *) &msg[1];
600   for (i = 0; i < p->length; i++)
601   {
602     GNUNET_PEER_resolve (p->peers[i], peer_ptr++);
603   }
604
605   LOG (GNUNET_ERROR_TYPE_DEBUG,
606        "CONNECTION CREATE (%u bytes long) sent!\n",
607        size_needed);
608   return size_needed;
609 }
610
611
612 /**
613  * Creates a path ack message in buf and frees all unused resources.
614  *
615  * @param c Connection to send an ACK on.
616  * @param size number of bytes available in buf
617  * @param buf where the callee should write the message
618  *
619  * @return number of bytes written to buf
620  */
621 static size_t
622 send_core_connection_ack (struct CadetConnection *c, size_t size, void *buf)
623 {
624   struct GNUNET_CADET_ConnectionACK *msg = buf;
625
626   LOG (GNUNET_ERROR_TYPE_DEBUG, "Sending CONNECTION ACK...\n");
627   if (sizeof (struct GNUNET_CADET_ConnectionACK) > size)
628   {
629     GNUNET_break (0);
630     return 0;
631   }
632   msg->header.size = htons (sizeof (struct GNUNET_CADET_ConnectionACK));
633   msg->header.type = htons (GNUNET_MESSAGE_TYPE_CADET_CONNECTION_ACK);
634   msg->cid = *GCC_get_id (c);
635
636   LOG (GNUNET_ERROR_TYPE_DEBUG, "CONNECTION ACK sent!\n");
637   return sizeof (struct GNUNET_CADET_ConnectionACK);
638 }
639
640
641 /******************************************************************************/
642 /********************************   STATIC  ***********************************/
643 /******************************************************************************/
644
645
646 /**
647  * Get priority for a queued message.
648  *
649  * @param q Queued message
650  *
651  * @return CORE priority to use.
652  */
653 static enum GNUNET_CORE_Priority
654 get_priority (struct CadetPeerQueue *q)
655 {
656   enum GNUNET_CORE_Priority low;
657   enum GNUNET_CORE_Priority high;
658
659   if (NULL == q)
660   {
661     GNUNET_break (0);
662     return GNUNET_CORE_PRIO_BACKGROUND;
663   }
664
665   /* Relayed traffic has lower priority, our own traffic has higher */
666   if (NULL == q->c || GNUNET_NO == GCC_is_origin (q->c, q->fwd))
667   {
668     low = GNUNET_CORE_PRIO_BEST_EFFORT;
669     high = GNUNET_CORE_PRIO_URGENT;
670   }
671   else
672   {
673     low = GNUNET_CORE_PRIO_URGENT;
674     high = GNUNET_CORE_PRIO_CRITICAL_CONTROL;
675   }
676
677   /* Bulky payload has lower priority, control traffic has higher. */
678   if (GNUNET_MESSAGE_TYPE_CADET_ENCRYPTED == q->type)
679     return low;
680   else
681     return high;
682 }
683
684
685 /**
686  * Iterator over tunnel hash map entries to destroy the tunnel during shutdown.
687  *
688  * @param cls closure
689  * @param key current key code
690  * @param value value in the hash map
691  * @return #GNUNET_YES if we should continue to iterate,
692  *         #GNUNET_NO if not.
693  */
694 static int
695 shutdown_tunnel (void *cls,
696                  const struct GNUNET_PeerIdentity *key,
697                  void *value)
698 {
699   struct CadetPeer *p = value;
700   struct CadetTunnel *t = p->tunnel;
701
702   if (NULL != t)
703     GCT_destroy (t);
704   return GNUNET_YES;
705 }
706
707
708
709 /**
710  * Check if peer is searching for a path (either active or delayed search).
711  *
712  * @param peer Peer to check
713  *
714  * @return GNUNET_YES if there is a search active.
715  *         GNUNET_NO otherwise.
716  */
717 static int
718 is_searching (const struct CadetPeer *peer)
719 {
720   return (NULL == peer->search_h && NULL == peer->search_delayed) ?
721          GNUNET_NO : GNUNET_YES;
722 }
723
724
725 /**
726  * @brief Start a search for a peer.
727  *
728  * @param cls Closure (Peer to search for).
729  * @param tc Task context.
730  */
731 static void
732 delayed_search (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
733 {
734   struct CadetPeer *peer = cls;
735
736   peer->search_delayed = NULL;
737
738   if (0 != (GNUNET_SCHEDULER_REASON_SHUTDOWN & tc->reason))
739     return;
740
741   GCP_start_search (peer);
742 }
743
744
745 /**
746  * Destroy the peer_info and free any allocated resources linked to it
747  *
748  * @param peer The peer_info to destroy.
749  *
750  * @return GNUNET_OK on success
751  */
752 static int
753 peer_destroy (struct CadetPeer *peer)
754 {
755   struct GNUNET_PeerIdentity id;
756   struct CadetPeerPath *p;
757   struct CadetPeerPath *nextp;
758
759   GNUNET_PEER_resolve (peer->id, &id);
760   GNUNET_PEER_change_rc (peer->id, -1);
761
762   LOG (GNUNET_ERROR_TYPE_WARNING, "destroying peer %s\n", GNUNET_i2s (&id));
763
764   if (GNUNET_YES !=
765     GNUNET_CONTAINER_multipeermap_remove (peers, &id, peer))
766   {
767     GNUNET_break (0);
768     LOG (GNUNET_ERROR_TYPE_WARNING, " not in peermap!!\n");
769   }
770   GCP_stop_search (peer);
771   p = peer->path_head;
772   while (NULL != p)
773   {
774     nextp = p->next;
775     GNUNET_CONTAINER_DLL_remove (peer->path_head, peer->path_tail, p);
776     path_destroy (p);
777     p = nextp;
778   }
779   GCT_destroy_empty (peer->tunnel);
780   GNUNET_free (peer);
781   return GNUNET_OK;
782 }
783
784
785 /**
786  * Returns if peer is used (has a tunnel or is neighbor).
787  *
788  * @param peer Peer to check.
789  *
790  * @return #GNUNET_YES if peer is in use.
791  */
792 static int
793 peer_is_used (struct CadetPeer *peer)
794 {
795   struct CadetPeerPath *p;
796
797   if (NULL != peer->tunnel)
798     return GNUNET_YES;
799
800   for (p = peer->path_head; NULL != p; p = p->next)
801   {
802     if (p->length < 3)
803       return GNUNET_YES;
804   }
805     return GNUNET_NO;
806 }
807
808
809 /**
810  * Iterator over all the peers to get the oldest timestamp.
811  *
812  * @param cls Closure (unsued).
813  * @param key ID of the peer.
814  * @param value Peer_Info of the peer.
815  */
816 static int
817 peer_get_oldest (void *cls,
818                  const struct GNUNET_PeerIdentity *key,
819                  void *value)
820 {
821   struct CadetPeer *p = value;
822   struct GNUNET_TIME_Absolute *abs = cls;
823
824   /* Don't count active peers */
825   if (GNUNET_YES == peer_is_used (p))
826     return GNUNET_YES;
827
828   if (abs->abs_value_us < p->last_contact.abs_value_us)
829     abs->abs_value_us = p->last_contact.abs_value_us;
830
831   return GNUNET_YES;
832 }
833
834
835 /**
836  * Iterator over all the peers to remove the oldest entry.
837  *
838  * @param cls Closure (unsued).
839  * @param key ID of the peer.
840  * @param value Peer_Info of the peer.
841  */
842 static int
843 peer_timeout (void *cls,
844               const struct GNUNET_PeerIdentity *key,
845               void *value)
846 {
847   struct CadetPeer *p = value;
848   struct GNUNET_TIME_Absolute *abs = cls;
849
850   LOG (GNUNET_ERROR_TYPE_WARNING,
851        "peer %s timeout\n", GNUNET_i2s (key));
852
853   if (p->last_contact.abs_value_us == abs->abs_value_us &&
854       GNUNET_NO == peer_is_used (p))
855   {
856     peer_destroy (p);
857     return GNUNET_NO;
858   }
859     return GNUNET_YES;
860 }
861
862
863 /**
864  * Delete oldest unused peer.
865  */
866 static void
867 peer_delete_oldest (void)
868 {
869   struct GNUNET_TIME_Absolute abs;
870
871   abs = GNUNET_TIME_UNIT_FOREVER_ABS;
872
873   GNUNET_CONTAINER_multipeermap_iterate (peers,
874                                          &peer_get_oldest,
875                                          &abs);
876   GNUNET_CONTAINER_multipeermap_iterate (peers,
877                                          &peer_timeout,
878                                          &abs);
879 }
880
881
882 /**
883  * Choose the best (yet unused) path towards a peer,
884  * considering the tunnel properties.
885  *
886  * @param peer The destination peer.
887  *
888  * @return Best current known path towards the peer, if any.
889  */
890 static struct CadetPeerPath *
891 peer_get_best_path (const struct CadetPeer *peer)
892 {
893   struct CadetPeerPath *best_p;
894   struct CadetPeerPath *p;
895   unsigned int best_cost;
896   unsigned int cost;
897
898   best_cost = UINT_MAX;
899   best_p = NULL;
900   for (p = peer->path_head; NULL != p; p = p->next)
901   {
902     if (GNUNET_NO == path_is_valid (p))
903       continue; /* Don't use invalid paths. */
904     if (GNUNET_YES == GCT_is_path_used (peer->tunnel, p))
905       continue; /* If path is already in use, skip it. */
906
907     if ((cost = GCT_get_path_cost (peer->tunnel, p)) < best_cost)
908     {
909       best_cost = cost;
910       best_p = p;
911     }
912   }
913   return best_p;
914 }
915
916
917 /**
918  * Is this queue element sendable?
919  *
920  * - All management traffic is always sendable.
921  * - For payload traffic, check the connection flow control.
922  *
923  * @param q Queue element to inspect.
924  *
925  * @return #GNUNET_YES if it is sendable, #GNUNET_NO otherwise.
926  */
927 static int
928 queue_is_sendable (struct CadetPeerQueue *q)
929 {
930   /* Is PID-independent? */
931   switch (q->type)
932   {
933     case GNUNET_MESSAGE_TYPE_CADET_ACK:
934     case GNUNET_MESSAGE_TYPE_CADET_POLL:
935     case GNUNET_MESSAGE_TYPE_CADET_KX:
936     case GNUNET_MESSAGE_TYPE_CADET_CONNECTION_CREATE:
937     case GNUNET_MESSAGE_TYPE_CADET_CONNECTION_ACK:
938     case GNUNET_MESSAGE_TYPE_CADET_CONNECTION_DESTROY:
939     case GNUNET_MESSAGE_TYPE_CADET_CONNECTION_BROKEN:
940       return GNUNET_YES;
941
942     case GNUNET_MESSAGE_TYPE_CADET_ENCRYPTED:
943     case GNUNET_MESSAGE_TYPE_CADET_AX:
944       break;
945
946     default:
947       GNUNET_break (0);
948   }
949
950   return GCC_is_sendable (q->c, q->fwd);
951 }
952
953
954 /**
955  * Get first sendable message.
956  *
957  * @param peer The destination peer.
958  *
959  * @return First transmittable message, if any. Otherwise, NULL.
960  */
961 static struct CadetPeerQueue *
962 peer_get_first_message (const struct CadetPeer *peer)
963 {
964   struct CadetPeerQueue *q;
965
966   for (q = peer->queue_head; NULL != q; q = q->next)
967   {
968     LOG (GNUNET_ERROR_TYPE_DEBUG, "Checking q:%p on c:%s\n", q, GCC_2s (q->c));
969     if (queue_is_sendable (q))
970       return q;
971   }
972
973   return NULL;
974 }
975
976
977 /**
978  * Function to process paths received for a new peer addition. The recorded
979  * paths form the initial tunnel, which can be optimized later.
980  * Called on each result obtained for the DHT search.
981  *
982  * @param cls closure
983  * @param path
984  */
985 static void
986 search_handler (void *cls, const struct CadetPeerPath *path)
987 {
988   struct CadetPeer *peer = cls;
989   unsigned int connection_count;
990
991   GCP_add_path_to_all (path, GNUNET_NO);
992
993   /* Count connections */
994   connection_count = GCT_count_connections (peer->tunnel);
995
996   /* If we already have our minimum (or more) connections, it's enough */
997   if (CONNECTIONS_PER_TUNNEL <= connection_count)
998     return;
999
1000   if (CADET_TUNNEL_SEARCHING == GCT_get_cstate (peer->tunnel))
1001   {
1002     LOG (GNUNET_ERROR_TYPE_DEBUG, " ... connect!\n");
1003     GCP_connect (peer);
1004   }
1005   return;
1006 }
1007
1008
1009 /**
1010  * Adjust core requested size to accomodate an ACK.
1011  *
1012  * @param message_size Requested size.
1013  *
1014  * @return Size enough to fit @c message_size and an ACK.
1015  */
1016 static size_t
1017 get_core_size (size_t message_size)
1018 {
1019   return message_size + sizeof (struct GNUNET_CADET_ACK);
1020 }
1021
1022
1023 /**
1024  * Fill a core buffer with the appropriate data for the queued message.
1025  *
1026  * @param queue Queue element for the message.
1027  * @param buf Core buffer to fill.
1028  * @param size Size remaining in @c buf.
1029  * @param[out] pid In case its an encrypted payload, set payload.
1030  *
1031  * @return Bytes written to @c buf.
1032  */
1033 static size_t
1034 fill_buf (struct CadetPeerQueue *queue, void *buf, size_t size, uint32_t *pid)
1035 {
1036   struct CadetConnection *c = queue->c;
1037   size_t msg_size;
1038
1039   switch (queue->type)
1040   {
1041     case GNUNET_MESSAGE_TYPE_CADET_ENCRYPTED:
1042       *pid = GCC_get_pid (queue->c, queue->fwd);
1043       LOG (GNUNET_ERROR_TYPE_DEBUG, "  otr payload ID %u\n", *pid);
1044       msg_size = send_core_data_raw (queue->cls, size, buf);
1045       ((struct GNUNET_CADET_Encrypted *) buf)->pid = htonl (*pid);
1046       break;
1047     case GNUNET_MESSAGE_TYPE_CADET_AX:
1048       *pid = GCC_get_pid (queue->c, queue->fwd);
1049       LOG (GNUNET_ERROR_TYPE_DEBUG, "  ax payload ID %u\n", *pid);
1050       msg_size = send_core_data_raw (queue->cls, size, buf);
1051       ((struct GNUNET_CADET_AX *) buf)->pid = htonl (*pid);
1052       break;
1053     case GNUNET_MESSAGE_TYPE_CADET_CONNECTION_DESTROY:
1054     case GNUNET_MESSAGE_TYPE_CADET_CONNECTION_BROKEN:
1055     case GNUNET_MESSAGE_TYPE_CADET_KX:
1056     case GNUNET_MESSAGE_TYPE_CADET_ACK:
1057     case GNUNET_MESSAGE_TYPE_CADET_POLL:
1058       LOG (GNUNET_ERROR_TYPE_DEBUG, "  raw %s\n", GC_m2s (queue->type));
1059       msg_size = send_core_data_raw (queue->cls, size, buf);
1060       break;
1061     case GNUNET_MESSAGE_TYPE_CADET_CONNECTION_CREATE:
1062       LOG (GNUNET_ERROR_TYPE_DEBUG, "  path create\n");
1063       if (GCC_is_origin (c, GNUNET_YES))
1064         msg_size = send_core_connection_create (c, size, buf);
1065       else
1066         msg_size = send_core_data_raw (queue->cls, size, buf);
1067       break;
1068     case GNUNET_MESSAGE_TYPE_CADET_CONNECTION_ACK:
1069       LOG (GNUNET_ERROR_TYPE_DEBUG, "  path ack\n");
1070       if (GCC_is_origin (c, GNUNET_NO) ||
1071           GCC_is_origin (c, GNUNET_YES))
1072       {
1073         msg_size = send_core_connection_ack (c, size, buf);
1074       }
1075       else
1076       {
1077         msg_size = send_core_data_raw (queue->cls, size, buf);
1078       }
1079       break;
1080     case GNUNET_MESSAGE_TYPE_CADET_DATA:
1081     case GNUNET_MESSAGE_TYPE_CADET_CHANNEL_CREATE:
1082     case GNUNET_MESSAGE_TYPE_CADET_CHANNEL_DESTROY:
1083       /* This should be encapsulted */
1084       msg_size = 0;
1085       GNUNET_assert (0);
1086       break;
1087     default:
1088       GNUNET_break (0);
1089       LOG (GNUNET_ERROR_TYPE_WARNING, "  type unknown: %u\n", queue->type);
1090       msg_size = 0;
1091   }
1092
1093   GNUNET_assert (size >= msg_size);
1094
1095   return msg_size;
1096 }
1097
1098
1099 /**
1100  * Core callback to write a queued packet to core buffer
1101  *
1102  * @param cls Closure (peer info).
1103  * @param size Number of bytes available in buf.
1104  * @param buf Where the to write the message.
1105  *
1106  * @return number of bytes written to buf
1107  */
1108 static size_t
1109 queue_send (void *cls, size_t size, void *buf)
1110 {
1111   struct CadetPeer *peer = cls;
1112   struct CadetConnection *c;
1113   struct CadetPeerQueue *queue;
1114   struct GNUNET_TIME_Relative core_wait_time;
1115   const struct GNUNET_PeerIdentity *dst_id;
1116   size_t msg_size;
1117   size_t total_size;
1118   size_t rest;
1119   char *dst;
1120   uint32_t pid;
1121
1122   LOG (GNUNET_ERROR_TYPE_DEBUG, "\n");
1123   LOG (GNUNET_ERROR_TYPE_DEBUG, "\n");
1124   LOG (GNUNET_ERROR_TYPE_DEBUG, "Queue send towards %s (max %u)\n",
1125        GCP_2s (peer), size);
1126
1127   /* Sanity checking */
1128   if (NULL == buf || 0 == size)
1129   {
1130     LOG (GNUNET_ERROR_TYPE_DEBUG, "Buffer size 0.\n");
1131     peer->tmt_time.abs_value_us = 0;
1132     peer->core_transmit = NULL;
1133     return 0;
1134   }
1135
1136   /* Init */
1137   rest = size;
1138   total_size = 0;
1139   dst = (char *) buf;
1140   pid = 0;
1141   peer->core_transmit = NULL;
1142   queue = peer_get_first_message (peer);
1143   if (NULL == queue)
1144   {
1145     GNUNET_break (0); /* Core tmt_rdy should've been canceled */
1146     peer->tmt_time.abs_value_us = 0;
1147     return 0;
1148   }
1149   core_wait_time = GNUNET_TIME_absolute_get_duration (peer->tmt_time);
1150   LOG (GNUNET_ERROR_TYPE_DEBUG, " core wait time %s\n",
1151        GNUNET_STRINGS_relative_time_to_string (core_wait_time, GNUNET_NO));
1152   peer->tmt_time.abs_value_us = 0;
1153
1154   /* Copy all possible messages to the core buffer */
1155   while (NULL != queue && rest >= queue->size)
1156   {
1157     c = queue->c;
1158
1159     LOG (GNUNET_ERROR_TYPE_DEBUG, "  on connection %s %s\n",
1160          GCC_2s (c), GC_f2s(queue->fwd));
1161     LOG (GNUNET_ERROR_TYPE_DEBUG, "  size %u ok (%u/%u)\n",
1162          queue->size, total_size, size);
1163
1164     msg_size = fill_buf (queue, (void *) dst, size, &pid);
1165
1166     if (0 < drop_percent &&
1167         GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_WEAK, 101) < drop_percent)
1168     {
1169       LOG (GNUNET_ERROR_TYPE_WARNING, "DD %s (%s %u) on connection %s %s\n",
1170            GC_m2s (queue->type), GC_m2s (queue->payload_type),
1171            queue->payload_id, GCC_2s (c), GC_f2s (queue->fwd));
1172       msg_size = 0;
1173     }
1174     else
1175     {
1176       LOG (GNUNET_ERROR_TYPE_INFO,
1177            "snd %s (%s %4u) on connection %s (%p) %s (size %u)\n",
1178            GC_m2s (queue->type), GC_m2s (queue->payload_type),
1179            queue->payload_id, GCC_2s (c), c, GC_f2s (queue->fwd), msg_size);
1180     }
1181     total_size += msg_size;
1182     rest -= msg_size;
1183     dst = &dst[msg_size];
1184     msg_size = 0;
1185
1186     /* Free queue, but cls was freed by send_core_* in fill_buf. */
1187     (void) GCP_queue_destroy (queue, GNUNET_NO, GNUNET_YES, pid);
1188
1189     /* Next! */
1190     queue = peer_get_first_message (peer);
1191   }
1192
1193   /* If more data in queue, send next */
1194   if (NULL != queue)
1195   {
1196     LOG (GNUNET_ERROR_TYPE_DEBUG, "  more data! (%u)\n", queue->size);
1197     if (NULL == peer->core_transmit)
1198     {
1199       dst_id = GNUNET_PEER_resolve2 (peer->id);
1200       peer->core_transmit =
1201           GNUNET_CORE_notify_transmit_ready (core_handle,
1202                                              GNUNET_NO, get_priority (queue),
1203                                              GNUNET_TIME_UNIT_FOREVER_REL,
1204                                              dst_id,
1205                                              get_core_size (queue->size),
1206                                              &queue_send,
1207                                              peer);
1208       peer->tmt_time = GNUNET_TIME_absolute_get ();
1209       queue->start_waiting = GNUNET_TIME_absolute_get ();
1210     }
1211     else
1212     {
1213       LOG (GNUNET_ERROR_TYPE_DEBUG, "*   tmt rdy called somewhere else\n");
1214     }
1215 //     GCC_start_poll (); FIXME needed?
1216   }
1217   else
1218   {
1219 //     GCC_stop_poll(); FIXME needed?
1220   }
1221
1222   LOG (GNUNET_ERROR_TYPE_DEBUG, "  return %d\n", total_size);
1223   queue_debug (peer, GNUNET_ERROR_TYPE_DEBUG);
1224
1225   return total_size;
1226 }
1227
1228
1229 /******************************************************************************/
1230 /********************************    API    ***********************************/
1231 /******************************************************************************/
1232
1233
1234 /**
1235  * Free a transmission that was already queued with all resources
1236  * associated to the request.
1237  *
1238  * If connection was marked to be destroyed, and this was the last queued
1239  * message on it, the connection will be free'd as a result.
1240  *
1241  * @param queue Queue handler to cancel.
1242  * @param clear_cls Is it necessary to free associated cls?
1243  * @param sent Was it really sent? (Could have been canceled)
1244  * @param pid PID, if relevant (was sent and was a payload message).
1245  *
1246  * @return #GNUNET_YES if connection was destroyed as a result,
1247  *         #GNUNET_NO otherwise.
1248  */
1249 int
1250 GCP_queue_destroy (struct CadetPeerQueue *queue, int clear_cls,
1251                    int sent, uint32_t pid)
1252 {
1253   struct CadetPeer *peer;
1254   int connection_destroyed;
1255
1256   peer = queue->peer;
1257   LOG (GNUNET_ERROR_TYPE_DEBUG, "queue destroy %s\n", GC_m2s (queue->type));
1258   if (GNUNET_YES == clear_cls)
1259   {
1260     LOG (GNUNET_ERROR_TYPE_DEBUG, " free cls\n");
1261     switch (queue->type)
1262     {
1263       case GNUNET_MESSAGE_TYPE_CADET_CONNECTION_DESTROY:
1264         LOG (GNUNET_ERROR_TYPE_INFO, "destroying a DESTROY message\n");
1265         /* fall through */
1266       case GNUNET_MESSAGE_TYPE_CADET_CONNECTION_ACK:
1267       case GNUNET_MESSAGE_TYPE_CADET_CONNECTION_CREATE:
1268       case GNUNET_MESSAGE_TYPE_CADET_CONNECTION_BROKEN:
1269       case GNUNET_MESSAGE_TYPE_CADET_KX:
1270       case GNUNET_MESSAGE_TYPE_CADET_ENCRYPTED:
1271       case GNUNET_MESSAGE_TYPE_CADET_ACK:
1272       case GNUNET_MESSAGE_TYPE_CADET_POLL:
1273         GNUNET_free_non_null (queue->cls);
1274         break;
1275
1276       default:
1277         GNUNET_break (0);
1278         LOG (GNUNET_ERROR_TYPE_ERROR, " type %s unknown!\n",
1279              GC_m2s (queue->type));
1280     }
1281   }
1282   GNUNET_CONTAINER_DLL_remove (peer->queue_head, peer->queue_tail, queue);
1283
1284   if (queue->type != GNUNET_MESSAGE_TYPE_CADET_ACK &&
1285       queue->type != GNUNET_MESSAGE_TYPE_CADET_POLL)
1286   {
1287     peer->queue_n--;
1288   }
1289
1290   if (NULL != queue->callback)
1291   {
1292     struct GNUNET_TIME_Relative wait_time;
1293
1294     wait_time = GNUNET_TIME_absolute_get_duration (queue->start_waiting);
1295     LOG (GNUNET_ERROR_TYPE_DEBUG, " calling callback, time elapsed %s\n",
1296          GNUNET_STRINGS_relative_time_to_string (wait_time, GNUNET_NO));
1297     connection_destroyed = queue->callback (queue->callback_cls,
1298                                             queue->c, sent, queue->type, pid,
1299                                             queue->fwd, queue->size,
1300                                             wait_time);
1301   }
1302   else
1303   {
1304     connection_destroyed = GNUNET_NO;
1305   }
1306
1307   if (NULL == peer_get_first_message (peer) && NULL != peer->core_transmit)
1308   {
1309     GNUNET_CORE_notify_transmit_ready_cancel (peer->core_transmit);
1310     peer->core_transmit = NULL;
1311     peer->tmt_time.abs_value_us = 0;
1312   }
1313
1314   GNUNET_free (queue);
1315   return connection_destroyed;
1316 }
1317
1318
1319 /**
1320  * @brief Queue and pass message to core when possible.
1321  *
1322  * @param peer Peer towards which to queue the message.
1323  * @param cls Closure (@c type dependant). It will be used by queue_send to
1324  *            build the message to be sent if not already prebuilt.
1325  * @param type Type of the message, 0 for a raw message.
1326  * @param size Size of the message.
1327  * @param c Connection this message belongs to (can be NULL).
1328  * @param fwd Is this a message going root->dest? (FWD ACK are NOT FWD!)
1329  * @param cont Continuation to be called once CORE has taken the message.
1330  * @param cont_cls Closure for @c cont.
1331  *
1332  * @return Handle to cancel the message before it is sent. Once cont is called
1333  *         message has been sent and therefore the handle is no longer valid.
1334  */
1335 struct CadetPeerQueue *
1336 GCP_queue_add (struct CadetPeer *peer, void *cls, uint16_t type,
1337                uint16_t payload_type, uint32_t payload_id, size_t size,
1338                struct CadetConnection *c, int fwd,
1339                GCP_sent cont, void *cont_cls)
1340 {
1341   struct CadetPeerQueue *q;
1342   int error_level;
1343   int priority;
1344   int call_core;
1345
1346   if (NULL == c && GNUNET_MESSAGE_TYPE_CADET_CONNECTION_BROKEN != type)
1347     error_level = GNUNET_ERROR_TYPE_ERROR;
1348   else
1349     error_level = GNUNET_ERROR_TYPE_INFO;
1350   LOG (error_level,
1351        "que %s (%s %4u) on connection %s (%p) %s towards %s (size %u)\n",
1352        GC_m2s (type), GC_m2s (payload_type), payload_id,
1353        GCC_2s (c), c, GC_f2s (fwd), GCP_2s (peer), size);
1354
1355   if (error_level == GNUNET_ERROR_TYPE_ERROR)
1356     GNUNET_assert (0);
1357   if (NULL == peer->connections)
1358   {
1359     /* We are not connected to this peer, ignore request. */
1360     LOG (GNUNET_ERROR_TYPE_WARNING, "%s not a neighbor\n", GCP_2s (peer));
1361     GNUNET_STATISTICS_update (stats, "# messages dropped due to wrong hop", 1,
1362                               GNUNET_NO);
1363     return NULL;
1364   }
1365
1366   priority = 0;
1367
1368   if (GNUNET_MESSAGE_TYPE_CADET_POLL == type ||
1369       GNUNET_MESSAGE_TYPE_CADET_ACK == type)
1370   {
1371     priority = 100;
1372   }
1373
1374   LOG (GNUNET_ERROR_TYPE_DEBUG, "priority %d\n", priority);
1375
1376   call_core = (NULL == c || type == GNUNET_MESSAGE_TYPE_CADET_KX) ?
1377                GNUNET_YES : GCC_is_sendable (c, fwd);
1378   q = GNUNET_new (struct CadetPeerQueue);
1379   q->cls = cls;
1380   q->type = type;
1381   q->payload_type = payload_type;
1382   q->payload_id = payload_id;
1383   q->size = size;
1384   q->peer = peer;
1385   q->c = c;
1386   q->fwd = fwd;
1387   q->callback = cont;
1388   q->callback_cls = cont_cls;
1389   if (100 > priority)
1390   {
1391     GNUNET_CONTAINER_DLL_insert_tail (peer->queue_head, peer->queue_tail, q);
1392     peer->queue_n++;
1393   }
1394   else
1395   {
1396     GNUNET_CONTAINER_DLL_insert (peer->queue_head, peer->queue_tail, q);
1397     call_core = GNUNET_YES;
1398   }
1399
1400   q->start_waiting = GNUNET_TIME_absolute_get ();
1401   if (NULL == peer->core_transmit && GNUNET_YES == call_core)
1402   {
1403     LOG (GNUNET_ERROR_TYPE_DEBUG,
1404          "calling core tmt rdy towards %s for %u bytes\n",
1405          GCP_2s (peer), size);
1406     peer->core_transmit =
1407         GNUNET_CORE_notify_transmit_ready (core_handle,
1408                                            GNUNET_NO, get_priority (q),
1409                                            GNUNET_TIME_UNIT_FOREVER_REL,
1410                                            GNUNET_PEER_resolve2 (peer->id),
1411                                            get_core_size (size),
1412                                            &queue_send, peer);
1413     peer->tmt_time = GNUNET_TIME_absolute_get ();
1414   }
1415   else if (GNUNET_NO == call_core)
1416   {
1417     LOG (GNUNET_ERROR_TYPE_DEBUG, "core tmt rdy towards %s not needed\n",
1418          GCP_2s (peer));
1419
1420   }
1421   else
1422   {
1423     struct GNUNET_TIME_Relative elapsed;
1424     elapsed = GNUNET_TIME_absolute_get_duration (peer->tmt_time);
1425     LOG (GNUNET_ERROR_TYPE_DEBUG, "core tmt rdy towards %s already called %s\n",
1426          GCP_2s (peer),
1427          GNUNET_STRINGS_relative_time_to_string (elapsed, GNUNET_NO));
1428
1429   }
1430   queue_debug (peer, GNUNET_ERROR_TYPE_DEBUG);
1431   return q;
1432 }
1433
1434
1435 /**
1436  * Cancel all queued messages to a peer that belong to a certain connection.
1437  *
1438  * @param peer Peer towards whom to cancel.
1439  * @param c Connection whose queued messages to cancel. Might be destroyed by
1440  *          the sent continuation call.
1441  */
1442 void
1443 GCP_queue_cancel (struct CadetPeer *peer, struct CadetConnection *c)
1444 {
1445   struct CadetPeerQueue *q;
1446   struct CadetPeerQueue *next;
1447   struct CadetPeerQueue *prev;
1448   int connection_destroyed;
1449
1450   connection_destroyed = GNUNET_NO;
1451   for (q = peer->queue_head; NULL != q; q = next)
1452   {
1453     prev = q->prev;
1454     if (q->c == c)
1455     {
1456       LOG (GNUNET_ERROR_TYPE_DEBUG, "GMP queue cancel %s\n", GC_m2s (q->type));
1457       GNUNET_break (GNUNET_NO == connection_destroyed);
1458       if (GNUNET_MESSAGE_TYPE_CADET_CONNECTION_DESTROY == q->type)
1459       {
1460         q->c = NULL;
1461       }
1462       else
1463       {
1464         connection_destroyed = GCP_queue_destroy (q, GNUNET_YES, GNUNET_NO, 0);
1465       }
1466
1467       /* Get next from prev, q->next might be already freed:
1468        * queue destroy -> callback -> GCC_destroy -> cancel_queues -> here
1469        */
1470       if (NULL == prev)
1471         next = peer->queue_head;
1472       else
1473         next = prev->next;
1474     }
1475     else
1476     {
1477       next = q->next;
1478     }
1479   }
1480
1481   if (NULL == peer->queue_head && NULL != peer->core_transmit)
1482   {
1483     GNUNET_CORE_notify_transmit_ready_cancel (peer->core_transmit);
1484     peer->core_transmit = NULL;
1485     peer->tmt_time.abs_value_us = 0;
1486   }
1487 }
1488
1489
1490 /**
1491  * Get the first transmittable message for a connection.
1492  *
1493  * @param peer Neighboring peer.
1494  * @param c Connection.
1495  *
1496  * @return First transmittable message.
1497  */
1498 static struct CadetPeerQueue *
1499 connection_get_first_message (struct CadetPeer *peer, struct CadetConnection *c)
1500 {
1501   struct CadetPeerQueue *q;
1502
1503   for (q = peer->queue_head; NULL != q; q = q->next)
1504   {
1505     if (q->c != c)
1506       continue;
1507     if (queue_is_sendable (q))
1508     {
1509       LOG (GNUNET_ERROR_TYPE_DEBUG, "  sendable!!\n");
1510       return q;
1511     }
1512     LOG (GNUNET_ERROR_TYPE_DEBUG, "  not sendable\n");
1513   }
1514
1515   return NULL;
1516 }
1517
1518
1519 /**
1520  * Get the first message for a connection and unqueue it.
1521  *
1522  * Only tunnel (or higher) level messages are unqueued. Connection specific
1523  * messages are silently destroyed upon encounter.
1524  *
1525  * @param peer Neighboring peer.
1526  * @param c Connection.
1527  * @param destroyed[in/out] Was the connection destroyed (prev/as a result)?.
1528  *                          Can NOT be NULL.
1529  *
1530  * @return First message for this connection.
1531  */
1532 struct GNUNET_MessageHeader *
1533 GCP_connection_pop (struct CadetPeer *peer,
1534                     struct CadetConnection *c,
1535                     int *destroyed)
1536 {
1537   struct CadetPeerQueue *q;
1538   struct CadetPeerQueue *next;
1539   struct GNUNET_MessageHeader *msg;
1540   int dest;
1541
1542   GNUNET_assert (NULL != destroyed);
1543   LOG (GNUNET_ERROR_TYPE_DEBUG, "connection_pop on connection %p\n", c);
1544   for (q = peer->queue_head; NULL != q; q = next)
1545   {
1546     next = q->next;
1547     if (q->c != c)
1548       continue;
1549     LOG (GNUNET_ERROR_TYPE_DEBUG, " - queued: %s (%s %u), callback: %p\n",
1550          GC_m2s (q->type), GC_m2s (q->payload_type), q->payload_id,
1551          q->callback);
1552     switch (q->type)
1553     {
1554       case GNUNET_MESSAGE_TYPE_CADET_CONNECTION_CREATE:
1555       case GNUNET_MESSAGE_TYPE_CADET_CONNECTION_ACK:
1556       case GNUNET_MESSAGE_TYPE_CADET_CONNECTION_DESTROY:
1557       case GNUNET_MESSAGE_TYPE_CADET_CONNECTION_BROKEN:
1558       case GNUNET_MESSAGE_TYPE_CADET_ACK:
1559       case GNUNET_MESSAGE_TYPE_CADET_POLL:
1560         dest = GCP_queue_destroy (q, GNUNET_YES, GNUNET_NO, 0);
1561         if (GNUNET_YES == dest)
1562         {
1563           GNUNET_break (GNUNET_NO == *destroyed);
1564           *destroyed = GNUNET_YES;
1565         }
1566         continue;
1567
1568       case GNUNET_MESSAGE_TYPE_CADET_KX:
1569       case GNUNET_MESSAGE_TYPE_CADET_ENCRYPTED:
1570         msg = (struct GNUNET_MessageHeader *) q->cls;
1571         dest = GCP_queue_destroy (q, GNUNET_NO, GNUNET_NO, 0);
1572         if (GNUNET_YES == dest)
1573         {
1574           GNUNET_break (GNUNET_NO == *destroyed);
1575           *destroyed = GNUNET_YES;
1576         }
1577         return msg;
1578
1579       default:
1580         GNUNET_break (0);
1581         LOG (GNUNET_ERROR_TYPE_DEBUG, "Unknown message %s\n", GC_m2s (q->type));
1582     }
1583   }
1584
1585   return NULL;
1586 }
1587
1588 /**
1589  * Unlock a possibly locked queue for a connection.
1590  *
1591  * If there is a message that can be sent on this connection, call core for it.
1592  * Otherwise (if core transmit is already called or there is no sendable
1593  * message) do nothing.
1594  *
1595  * @param peer Peer who keeps the queue.
1596  * @param c Connection whose messages to unlock.
1597  */
1598 void
1599 GCP_queue_unlock (struct CadetPeer *peer, struct CadetConnection *c)
1600 {
1601   struct CadetPeerQueue *q;
1602   size_t size;
1603
1604   if (NULL != peer->core_transmit)
1605   {
1606     LOG (GNUNET_ERROR_TYPE_DEBUG, "  already unlocked!\n");
1607     return; /* Already unlocked */
1608   }
1609
1610   q = connection_get_first_message (peer, c);
1611   if (NULL == q)
1612   {
1613     LOG (GNUNET_ERROR_TYPE_DEBUG, "  queue empty!\n");
1614     return; /* Nothing to transmit */
1615   }
1616
1617   size = q->size;
1618   peer->core_transmit =
1619       GNUNET_CORE_notify_transmit_ready (core_handle,
1620                                          GNUNET_NO, get_priority (q),
1621                                          GNUNET_TIME_UNIT_FOREVER_REL,
1622                                          GNUNET_PEER_resolve2 (peer->id),
1623                                          get_core_size (size),
1624                                          &queue_send,
1625                                          peer);
1626   peer->tmt_time = GNUNET_TIME_absolute_get ();
1627 }
1628
1629
1630 /**
1631  * Initialize the peer subsystem.
1632  *
1633  * @param c Configuration.
1634  */
1635 void
1636 GCP_init (const struct GNUNET_CONFIGURATION_Handle *c)
1637 {
1638   LOG (GNUNET_ERROR_TYPE_DEBUG, "init\n");
1639   peers = GNUNET_CONTAINER_multipeermap_create (128, GNUNET_NO);
1640   if (GNUNET_OK !=
1641       GNUNET_CONFIGURATION_get_value_number (c, "CADET", "MAX_PEERS",
1642                                              &max_peers))
1643   {
1644     GNUNET_log_config_invalid (GNUNET_ERROR_TYPE_WARNING,
1645                                "CADET", "MAX_PEERS", "USING DEFAULT");
1646     max_peers = 1000;
1647   }
1648
1649   if (GNUNET_OK !=
1650       GNUNET_CONFIGURATION_get_value_number (c, "CADET", "DROP_PERCENT",
1651                                              &drop_percent))
1652   {
1653     drop_percent = 0;
1654   }
1655   else
1656   {
1657     LOG (GNUNET_ERROR_TYPE_WARNING, "**************************************\n");
1658     LOG (GNUNET_ERROR_TYPE_WARNING, "Cadet is running with DROP enabled.\n");
1659     LOG (GNUNET_ERROR_TYPE_WARNING, "This is NOT a good idea!\n");
1660     LOG (GNUNET_ERROR_TYPE_WARNING, "Remove DROP_PERCENT from config file.\n");
1661     LOG (GNUNET_ERROR_TYPE_WARNING, "**************************************\n");
1662   }
1663
1664   core_handle = GNUNET_CORE_connect (c, /* Main configuration */
1665                                      NULL,      /* Closure passed to CADET functions */
1666                                      &core_init,        /* Call core_init once connected */
1667                                      &core_connect,     /* Handle connects */
1668                                      &core_disconnect,  /* remove peers on disconnects */
1669                                      NULL,      /* Don't notify about all incoming messages */
1670                                      GNUNET_NO, /* For header only in notification */
1671                                      NULL,      /* Don't notify about all outbound messages */
1672                                      GNUNET_NO, /* For header-only out notification */
1673                                      core_handlers);    /* Register these handlers */
1674   if (GNUNET_YES !=
1675       GNUNET_CONFIGURATION_get_value_yesno (c, "CADET", "DISABLE_TRY_CONNECT"))
1676   {
1677     transport_handle = GNUNET_TRANSPORT_connect (c, &my_full_id, NULL, /* cls */
1678                                                  /* Notify callbacks */
1679                                                  NULL, NULL, NULL);
1680   }
1681   else
1682   {
1683     LOG (GNUNET_ERROR_TYPE_WARNING, "**************************************\n");
1684     LOG (GNUNET_ERROR_TYPE_WARNING, "*  DISABLE TRYING CONNECT in config  *\n");
1685     LOG (GNUNET_ERROR_TYPE_WARNING, "*  Use this only for test purposes.  *\n");
1686     LOG (GNUNET_ERROR_TYPE_WARNING, "**************************************\n");
1687     transport_handle = NULL;
1688   }
1689
1690
1691
1692   if (NULL == core_handle)
1693   {
1694     GNUNET_break (0);
1695     GNUNET_SCHEDULER_shutdown ();
1696     return;
1697   }
1698
1699 }
1700
1701
1702 /**
1703  * Shut down the peer subsystem.
1704  */
1705 void
1706 GCP_shutdown (void)
1707 {
1708   GNUNET_CONTAINER_multipeermap_iterate (peers, &shutdown_tunnel, NULL);
1709
1710   if (core_handle != NULL)
1711   {
1712     GNUNET_CORE_disconnect (core_handle);
1713     core_handle = NULL;
1714   }
1715   if (transport_handle != NULL)
1716   {
1717     GNUNET_TRANSPORT_disconnect (transport_handle);
1718     transport_handle = NULL;
1719   }
1720   GNUNET_PEER_change_rc (myid, -1);
1721 }
1722
1723
1724 /**
1725  * Retrieve the CadetPeer stucture associated with the peer, create one
1726  * and insert it in the appropriate structures if the peer is not known yet.
1727  *
1728  * @param peer_id Full identity of the peer.
1729  *
1730  * @return Existing or newly created peer structure.
1731  */
1732 struct CadetPeer *
1733 GCP_get (const struct GNUNET_PeerIdentity *peer_id)
1734 {
1735   struct CadetPeer *peer;
1736
1737   peer = GNUNET_CONTAINER_multipeermap_get (peers, peer_id);
1738   if (NULL == peer)
1739   {
1740     peer = GNUNET_new (struct CadetPeer);
1741     if (GNUNET_CONTAINER_multipeermap_size (peers) > max_peers)
1742     {
1743       peer_delete_oldest ();
1744     }
1745         GNUNET_CONTAINER_multipeermap_put (peers, peer_id, peer,
1746                                            GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST);
1747         peer->id = GNUNET_PEER_intern (peer_id);
1748   }
1749   peer->last_contact = GNUNET_TIME_absolute_get ();
1750
1751   return peer;
1752 }
1753
1754
1755 /**
1756  * Retrieve the CadetPeer stucture associated with the peer, create one
1757  * and insert it in the appropriate structures if the peer is not known yet.
1758  *
1759  * @param peer Short identity of the peer.
1760  *
1761  * @return Existing or newly created peer structure.
1762  */
1763 struct CadetPeer *
1764 GCP_get_short (const GNUNET_PEER_Id peer)
1765 {
1766   return GCP_get (GNUNET_PEER_resolve2 (peer));
1767 }
1768
1769
1770 /**
1771  * Try to connect to a peer on transport level.
1772  *
1773  * @param cls Closure (peer).
1774  * @param tc TaskContext.
1775  */
1776 static void
1777 try_connect (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
1778 {
1779   struct CadetPeer *peer = cls;
1780
1781   if (0 != (GNUNET_SCHEDULER_REASON_SHUTDOWN & tc->reason))
1782     return;
1783
1784   GNUNET_TRANSPORT_try_connect (transport_handle,
1785                                 GNUNET_PEER_resolve2 (peer->id), NULL, NULL);
1786 }
1787
1788
1789 /**
1790  * Try to establish a new connection to this peer (in its tunnel).
1791  * If the peer doesn't have any path to it yet, try to get one.
1792  * If the peer already has some path, send a CREATE CONNECTION towards it.
1793  *
1794  * @param peer Peer to connect to.
1795  */
1796 void
1797 GCP_connect (struct CadetPeer *peer)
1798 {
1799   struct CadetTunnel *t;
1800   struct CadetPeerPath *p;
1801   struct CadetConnection *c;
1802   int rerun_search;
1803
1804   LOG (GNUNET_ERROR_TYPE_DEBUG, "peer_connect towards %s\n", GCP_2s (peer));
1805
1806   /* If we have a current hello, try to connect using it. */
1807   GCP_try_connect (peer);
1808
1809   t = peer->tunnel;
1810   c = NULL;
1811   rerun_search = GNUNET_NO;
1812
1813   if (NULL != peer->path_head)
1814   {
1815     LOG (GNUNET_ERROR_TYPE_DEBUG, "  some path exists\n");
1816     p = peer_get_best_path (peer);
1817     if (NULL != p)
1818     {
1819       char *s;
1820
1821       s = path_2s (p);
1822       LOG (GNUNET_ERROR_TYPE_DEBUG, "  path to use: %s\n", s);
1823       GNUNET_free (s);
1824
1825       c = GCT_use_path (t, p);
1826       if (NULL == c)
1827       {
1828         /* This case can happen when the path includes a first hop that is
1829          * not yet known to be connected.
1830          *
1831          * This happens quite often during testing when running cadet
1832          * under valgrind: core connect notifications come very late and the
1833          * DHT result has already come and created a valid path.
1834          * In this case, the peer->connections hashmap will be NULL and
1835          * tunnel_use_path will not be able to create a connection from that
1836          * path.
1837          *
1838          * Re-running the DHT GET should give core time to callback.
1839          *
1840          * GCT_use_path -> GCC_new -> register_neighbors takes care of
1841          * updating statistics about this issue.
1842          */
1843         rerun_search = GNUNET_YES;
1844       }
1845       else
1846       {
1847         GCC_send_create (c);
1848         return;
1849       }
1850     }
1851     else
1852     {
1853       LOG (GNUNET_ERROR_TYPE_DEBUG, "  but is NULL, all paths are in use\n");
1854     }
1855   }
1856
1857   if (GNUNET_YES == rerun_search)
1858   {
1859     struct GNUNET_TIME_Relative delay;
1860
1861     GCP_stop_search (peer);
1862     delay = GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_MILLISECONDS, 100);
1863     peer->search_delayed = GNUNET_SCHEDULER_add_delayed (delay, &delayed_search,
1864                                                          peer);
1865     return;
1866   }
1867
1868   if (GNUNET_NO == is_searching (peer))
1869     GCP_start_search (peer);
1870 }
1871
1872
1873 /**
1874  * Chech whether there is a direct (core level)  connection to peer.
1875  *
1876  * @param peer Peer to check.
1877  *
1878  * @return #GNUNET_YES if there is a direct connection.
1879  */
1880 int
1881 GCP_is_neighbor (const struct CadetPeer *peer)
1882 {
1883   struct CadetPeerPath *path;
1884
1885   if (NULL == peer->connections)
1886     return GNUNET_NO;
1887
1888   for (path = peer->path_head; NULL != path; path = path->next)
1889   {
1890     if (3 > path->length)
1891       return GNUNET_YES;
1892   }
1893
1894   /* Is not a neighbor but connections is not NULL, probably disconnecting */
1895   return GNUNET_NO;
1896 }
1897
1898
1899 /**
1900  * Create and initialize a new tunnel towards a peer, in case it has none.
1901  * In case the peer already has a tunnel, nothing is done.
1902  *
1903  * Does not generate any traffic, just creates the local data structures.
1904  *
1905  * @param peer Peer towards which to create the tunnel.
1906  */
1907 void
1908 GCP_add_tunnel (struct CadetPeer *peer)
1909 {
1910   if (NULL != peer->tunnel)
1911     return;
1912   peer->tunnel = GCT_new (peer);
1913 }
1914
1915
1916 /**
1917  * Add a connection to a neighboring peer.
1918  *
1919  * Store that the peer is the first hop of the connection in one
1920  * direction and that on peer disconnect the connection must be
1921  * notified and destroyed, for it will no longer be valid.
1922  *
1923  * @param peer Peer to add connection to.
1924  * @param c Connection to add.
1925  *
1926  * @return GNUNET_OK on success.
1927  */
1928 int
1929 GCP_add_connection (struct CadetPeer *peer,
1930                     struct CadetConnection *c)
1931 {
1932   int result;
1933   LOG (GNUNET_ERROR_TYPE_DEBUG, "adding connection %s\n", GCC_2s (c));
1934   LOG (GNUNET_ERROR_TYPE_DEBUG, "to peer %s\n", GCP_2s (peer));
1935
1936   if (NULL == peer->connections)
1937   {
1938     GNUNET_break (0);
1939     LOG (GNUNET_ERROR_TYPE_DEBUG,
1940          "Peer %s is not a neighbor!\n",
1941          GCP_2s (peer));
1942     return GNUNET_SYSERR;
1943   }
1944   LOG (GNUNET_ERROR_TYPE_DEBUG,
1945        "peer %s ok, has %u connections.\n",
1946        GCP_2s (peer), GNUNET_CONTAINER_multihashmap_size (peer->connections));
1947   result = GNUNET_CONTAINER_multihashmap_put (peer->connections,
1948                                               GCC_get_h (c),
1949                                               c,
1950                                               GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST);
1951   LOG (GNUNET_ERROR_TYPE_DEBUG,
1952        " now has %u connections.\n",
1953        GNUNET_CONTAINER_multihashmap_size (peer->connections));
1954   LOG (GNUNET_ERROR_TYPE_DEBUG, "result %u\n", result);
1955
1956   return result;
1957 }
1958
1959
1960 /**
1961  * Add the path to the peer and update the path used to reach it in case this
1962  * is the shortest.
1963  *
1964  * @param peer Destination peer to add the path to.
1965  * @param path New path to add. Last peer must be the peer in arg 1.
1966  *             Path will be either used of freed if already known.
1967  * @param trusted Do we trust that this path is real?
1968  *
1969  * @return path if path was taken, pointer to existing duplicate if exists
1970  *         NULL on error.
1971  */
1972 struct CadetPeerPath *
1973 GCP_add_path (struct CadetPeer *peer, struct CadetPeerPath *path,
1974               int trusted)
1975 {
1976   struct CadetPeerPath *aux;
1977   unsigned int l;
1978   unsigned int l2;
1979
1980   LOG (GNUNET_ERROR_TYPE_DEBUG, "adding path [%u] to peer %s\n",
1981        path->length, GCP_2s (peer));
1982
1983   if (NULL == peer || NULL == path
1984       || path->peers[path->length - 1] != peer->id)
1985   {
1986     GNUNET_break (0);
1987     path_destroy (path);
1988     return NULL;
1989   }
1990
1991   for (l = 1; l < path->length; l++)
1992   {
1993     if (path->peers[l] == myid)
1994     {
1995       LOG (GNUNET_ERROR_TYPE_DEBUG, " shortening path by %u\n", l);
1996       for (l2 = 0; l2 < path->length - l; l2++)
1997       {
1998         path->peers[l2] = path->peers[l + l2];
1999       }
2000       path->length -= l;
2001       l = 1;
2002       path->peers = GNUNET_realloc (path->peers,
2003                                     path->length * sizeof (GNUNET_PEER_Id));
2004     }
2005   }
2006
2007   LOG (GNUNET_ERROR_TYPE_DEBUG, " final length: %u\n", path->length);
2008
2009   if (2 >= path->length && GNUNET_NO == trusted)
2010   {
2011     /* Only allow CORE to tell us about direct paths */
2012     path_destroy (path);
2013     return NULL;
2014   }
2015
2016   l = path_get_length (path);
2017   if (0 == l)
2018   {
2019     path_destroy (path);
2020     return NULL;
2021   }
2022
2023   GNUNET_assert (peer->id == path->peers[path->length - 1]);
2024   for (aux = peer->path_head; aux != NULL; aux = aux->next)
2025   {
2026     l2 = path_get_length (aux);
2027     if (l2 > l)
2028     {
2029       LOG (GNUNET_ERROR_TYPE_DEBUG, "  added\n");
2030       GNUNET_CONTAINER_DLL_insert_before (peer->path_head,
2031                                           peer->path_tail, aux, path);
2032       goto finish;
2033     }
2034     else
2035     {
2036       if (l2 == l && memcmp (path->peers, aux->peers, l) == 0)
2037       {
2038         LOG (GNUNET_ERROR_TYPE_DEBUG, "  already known\n");
2039         path_destroy (path);
2040         return aux;
2041       }
2042     }
2043   }
2044   GNUNET_CONTAINER_DLL_insert_tail (peer->path_head, peer->path_tail,
2045                                     path);
2046   LOG (GNUNET_ERROR_TYPE_DEBUG, "  added last\n");
2047
2048 finish:
2049   if (NULL != peer->tunnel
2050       && CONNECTIONS_PER_TUNNEL < GCT_count_connections (peer->tunnel))
2051   {
2052     GCP_connect (peer);
2053   }
2054   return path;
2055 }
2056
2057
2058 /**
2059  * Add the path to the origin peer and update the path used to reach it in case
2060  * this is the shortest.
2061  * The path is given in peer_info -> destination, therefore we turn the path
2062  * upside down first.
2063  *
2064  * @param peer Peer to add the path to, being the origin of the path.
2065  * @param path New path to add after being inversed.
2066  *             Path will be either used or freed.
2067  * @param trusted Do we trust that this path is real?
2068  *
2069  * @return path if path was taken, pointer to existing duplicate if exists
2070  *         NULL on error.
2071  */
2072 struct CadetPeerPath *
2073 GCP_add_path_to_origin (struct CadetPeer *peer,
2074                         struct CadetPeerPath *path,
2075                         int trusted)
2076 {
2077   if (NULL == path)
2078     return NULL;
2079   path_invert (path);
2080   return GCP_add_path (peer, path, trusted);
2081 }
2082
2083
2084 /**
2085  * Adds a path to the info of all the peers in the path
2086  *
2087  * @param p Path to process.
2088  * @param confirmed Whether we know if the path works or not.
2089  */
2090 void
2091 GCP_add_path_to_all (const struct CadetPeerPath *p, int confirmed)
2092 {
2093   unsigned int i;
2094
2095   /* TODO: invert and add */
2096   for (i = 0; i < p->length && p->peers[i] != myid; i++) /* skip'em */ ;
2097   for (i++; i < p->length; i++)
2098   {
2099     struct CadetPeer *aux;
2100     struct CadetPeerPath *copy;
2101
2102     aux = GCP_get_short (p->peers[i]);
2103     copy = path_duplicate (p);
2104     copy->length = i + 1;
2105     GCP_add_path (aux, copy, p->length < 3 ? GNUNET_NO : confirmed);
2106   }
2107 }
2108
2109
2110 /**
2111  * Remove any path to the peer that has the extact same peers as the one given.
2112  *
2113  * @param peer Peer to remove the path from.
2114  * @param path Path to remove. Is always destroyed .
2115  */
2116 void
2117 GCP_remove_path (struct CadetPeer *peer, struct CadetPeerPath *path)
2118 {
2119   struct CadetPeerPath *iter;
2120   struct CadetPeerPath *next;
2121
2122   GNUNET_assert (myid == path->peers[0]);
2123   GNUNET_assert (peer->id == path->peers[path->length - 1]);
2124
2125   LOG (GNUNET_ERROR_TYPE_INFO, "Removing path %p (%u) from %s\n",
2126        path, path->length, GCP_2s (peer));
2127
2128   for (iter = peer->path_head; NULL != iter; iter = next)
2129   {
2130     next = iter->next;
2131     if (0 == path_cmp (path, iter))
2132     {
2133       GNUNET_CONTAINER_DLL_remove (peer->path_head, peer->path_tail, iter);
2134       if (iter != path)
2135         path_destroy (iter);
2136     }
2137   }
2138   path_destroy (path);
2139 }
2140
2141
2142 /**
2143  * Remove a connection from a neighboring peer.
2144  *
2145  * @param peer Peer to remove connection from.
2146  * @param c Connection to remove.
2147  *
2148  * @return GNUNET_OK on success.
2149  */
2150 int
2151 GCP_remove_connection (struct CadetPeer *peer,
2152                        const struct CadetConnection *c)
2153 {
2154   LOG (GNUNET_ERROR_TYPE_DEBUG, "removing connection %s\n", GCC_2s (c));
2155   LOG (GNUNET_ERROR_TYPE_DEBUG, "from peer %s\n", GCP_2s (peer));
2156
2157   if (NULL == peer || NULL == peer->connections)
2158   {
2159     LOG (GNUNET_ERROR_TYPE_DEBUG,
2160          "Peer %s is not a neighbor!\n",
2161          GCP_2s (peer));
2162     return GNUNET_SYSERR;
2163   }
2164   LOG (GNUNET_ERROR_TYPE_DEBUG,
2165        "peer %s ok, has %u connections.\n",
2166        GCP_2s (peer), GNUNET_CONTAINER_multihashmap_size (peer->connections));
2167
2168   return GNUNET_CONTAINER_multihashmap_remove (peer->connections,
2169                                                GCC_get_h (c),
2170                                                c);
2171 }
2172
2173 /**
2174  * Start the DHT search for new paths towards the peer: we don't have
2175  * enough good connections.
2176  *
2177  * @param peer Destination peer.
2178  */
2179 void
2180 GCP_start_search (struct CadetPeer *peer)
2181 {
2182   const struct GNUNET_PeerIdentity *id;
2183   struct CadetTunnel *t = peer->tunnel;
2184
2185   if (NULL != peer->search_h)
2186   {
2187     GNUNET_break (0);
2188     return;
2189   }
2190
2191   if (NULL != peer->search_delayed)
2192     GCP_stop_search (peer);
2193
2194   id = GNUNET_PEER_resolve2 (peer->id);
2195   peer->search_h = GCD_search (id, &search_handler, peer);
2196
2197   if (NULL == t)
2198   {
2199     /* Why would we search for a peer with no tunnel towards it? */
2200     GNUNET_break (0);
2201     return;
2202   }
2203
2204   if (CADET_TUNNEL_NEW == GCT_get_cstate (t)
2205       || 0 == GCT_count_any_connections (t))
2206   {
2207     GCT_change_cstate (t, CADET_TUNNEL_SEARCHING);
2208   }
2209 }
2210
2211
2212 /**
2213  * Stop the DHT search for new paths towards the peer: we already have
2214  * enough good connections.
2215  *
2216  * @param peer Destination peer.
2217  */
2218 void
2219 GCP_stop_search (struct CadetPeer *peer)
2220 {
2221   if (NULL != peer->search_h)
2222   {
2223     GCD_search_stop (peer->search_h);
2224     peer->search_h = NULL;
2225   }
2226   if (NULL != peer->search_delayed)
2227   {
2228     GNUNET_SCHEDULER_cancel (peer->search_delayed);
2229     peer->search_delayed = NULL;
2230   }
2231 }
2232
2233
2234 /**
2235  * Get the Full ID of a peer.
2236  *
2237  * @param peer Peer to get from.
2238  *
2239  * @return Full ID of peer.
2240  */
2241 const struct GNUNET_PeerIdentity *
2242 GCP_get_id (const struct CadetPeer *peer)
2243 {
2244   return GNUNET_PEER_resolve2 (peer->id);
2245 }
2246
2247
2248 /**
2249  * Get the Short ID of a peer.
2250  *
2251  * @param peer Peer to get from.
2252  *
2253  * @return Short ID of peer.
2254  */
2255 GNUNET_PEER_Id
2256 GCP_get_short_id (const struct CadetPeer *peer)
2257 {
2258   return peer->id;
2259 }
2260
2261
2262 /**
2263  * Set tunnel.
2264  *
2265  * If tunnel is NULL and there was a search active, stop it, as it's useless.
2266  *
2267  * @param peer Peer.
2268  * @param t Tunnel.
2269  */
2270 void
2271 GCP_set_tunnel (struct CadetPeer *peer, struct CadetTunnel *t)
2272 {
2273   peer->tunnel = t;
2274   if (NULL == t && GNUNET_YES == is_searching (peer))
2275   {
2276     GCP_stop_search (peer);
2277   }
2278 }
2279
2280
2281 /**
2282  * Get the tunnel towards a peer.
2283  *
2284  * @param peer Peer to get from.
2285  *
2286  * @return Tunnel towards peer.
2287  */
2288 struct CadetTunnel *
2289 GCP_get_tunnel (const struct CadetPeer *peer)
2290 {
2291   return peer->tunnel;
2292 }
2293
2294
2295 /**
2296  * Set the hello message.
2297  *
2298  * @param peer Peer whose message to set.
2299  * @param hello Hello message.
2300  */
2301 void
2302 GCP_set_hello (struct CadetPeer *peer, const struct GNUNET_HELLO_Message *hello)
2303 {
2304   struct GNUNET_HELLO_Message *old;
2305   size_t size;
2306
2307   LOG (GNUNET_ERROR_TYPE_DEBUG, "set hello for %s\n", GCP_2s (peer));
2308   if (NULL == hello)
2309     return;
2310
2311   old = GCP_get_hello (peer);
2312   if (NULL == old)
2313   {
2314     size = GNUNET_HELLO_size (hello);
2315     LOG (GNUNET_ERROR_TYPE_DEBUG, " new (%u bytes)\n", size);
2316     peer->hello = GNUNET_malloc (size);
2317     memcpy (peer->hello, hello, size);
2318   }
2319   else
2320   {
2321     peer->hello = GNUNET_HELLO_merge (old, hello);
2322     LOG (GNUNET_ERROR_TYPE_DEBUG, " merge into %p (%u bytes)\n",
2323          peer->hello, GNUNET_HELLO_size (hello));
2324     GNUNET_free (old);
2325   }
2326 }
2327
2328
2329 /**
2330  * Get the hello message.
2331  *
2332  * @param peer Peer whose message to get.
2333  *
2334  * @return Hello message.
2335  */
2336 struct GNUNET_HELLO_Message *
2337 GCP_get_hello (struct CadetPeer *peer)
2338 {
2339   struct GNUNET_TIME_Absolute expiration;
2340   struct GNUNET_TIME_Relative remaining;
2341
2342   if (NULL == peer->hello)
2343     return NULL;
2344
2345   expiration = GNUNET_HELLO_get_last_expiration (peer->hello);
2346   remaining = GNUNET_TIME_absolute_get_remaining (expiration);
2347   if (0 == remaining.rel_value_us)
2348   {
2349     LOG (GNUNET_ERROR_TYPE_DEBUG, " get - hello expired on %s\n",
2350          GNUNET_STRINGS_absolute_time_to_string (expiration));
2351     GNUNET_free (peer->hello);
2352     peer->hello = NULL;
2353   }
2354   return peer->hello;
2355 }
2356
2357
2358 /**
2359  * Try to connect to a peer on TRANSPORT level.
2360  *
2361  * @param peer Peer to whom to connect.
2362  */
2363 void
2364 GCP_try_connect (struct CadetPeer *peer)
2365 {
2366   struct GNUNET_HELLO_Message *hello;
2367   struct GNUNET_MessageHeader *mh;
2368
2369   if (NULL == transport_handle)
2370     return;
2371
2372   hello = GCP_get_hello (peer);
2373   if (NULL == hello)
2374     return;
2375
2376   mh = GNUNET_HELLO_get_header (hello);
2377   GNUNET_TRANSPORT_offer_hello (transport_handle, mh, try_connect, peer);
2378 }
2379
2380
2381 /**
2382  * Check if the given ECDH key is correct for the peer.
2383  *
2384  * This function caches the results if the key has been previoulsy checked,
2385  * otherwise checks that the key is signed with the peer's ID (EdDSA key).
2386  *
2387  * TODO: save the cached public key to permanent storage / peerinfo.
2388  *
2389  * @param peer Peer whose key to check.
2390  * @param key ECDH key to check.
2391  * @param purpose Purpose of the signature (followed by the key).
2392  * @param sig Signature with the peer's EdDSA key (PeerID).
2393  */
2394 int
2395 GCP_check_key (struct CadetPeer *peer,
2396                const struct GNUNET_CRYPTO_EcdhePublicKey *key,
2397                const struct GNUNET_CRYPTO_EccSignaturePurpose *purpose,
2398                const struct GNUNET_CRYPTO_EddsaSignature *sig)
2399 {
2400   struct GNUNET_CRYPTO_EddsaPublicKey *pub;
2401   int verified;
2402
2403   /* Is it the same as the cached key? */
2404   if (0 == memcmp (&peer->ax_key, key, sizeof (*key)))
2405     return GNUNET_OK;
2406
2407   /* New key, verify. */
2408   pub = (struct GNUNET_CRYPTO_EddsaPublicKey *) GCP_get_id (peer);
2409   verified = GNUNET_CRYPTO_eddsa_verify (GNUNET_SIGNATURE_PURPOSE_CADET_AXKX,
2410                                          purpose, sig, pub);
2411
2412   if (GNUNET_OK != verified)
2413     return GNUNET_SYSERR;
2414
2415   /* Cache key for later. */
2416   peer->ax_key = *key;
2417   return GNUNET_OK;
2418 }
2419
2420
2421 /**
2422  * Notify a peer that a link between two other peers is broken. If any path
2423  * used that link, eliminate it.
2424  *
2425  * @param peer Peer affected by the change.
2426  * @param peer1 Peer whose link is broken.
2427  * @param peer2 Peer whose link is broken.
2428  */
2429 void
2430 GCP_notify_broken_link (struct CadetPeer *peer,
2431                         struct GNUNET_PeerIdentity *peer1,
2432                         struct GNUNET_PeerIdentity *peer2)
2433 {
2434   struct CadetPeerPath *iter;
2435   struct CadetPeerPath *next;
2436   unsigned int i;
2437   GNUNET_PEER_Id p1;
2438   GNUNET_PEER_Id p2;
2439
2440   p1 = GNUNET_PEER_search (peer1);
2441   p2 = GNUNET_PEER_search (peer2);
2442
2443   LOG (GNUNET_ERROR_TYPE_DEBUG, "Link %u-%u broken\n", p1, p2);
2444   if (0 == p1 || 0 == p2)
2445   {
2446     /* We don't even know them */
2447     return;
2448   }
2449
2450   for (iter = peer->path_head; NULL != iter; iter = next)
2451   {
2452     next = iter->next;
2453     for (i = 0; i < iter->length - 1; i++)
2454     {
2455       if ((iter->peers[i] == p1 && iter->peers[i + 1] == p2)
2456           || (iter->peers[i] == p2 && iter->peers[i + 1] == p1))
2457       {
2458         char *s;
2459
2460         s = path_2s (iter);
2461         LOG (GNUNET_ERROR_TYPE_DEBUG, " - invalidating %s\n", s);
2462         GNUNET_free (s);
2463
2464         path_invalidate (iter);
2465       }
2466     }
2467   }
2468 }
2469
2470
2471 /**
2472  * Count the number of known paths toward the peer.
2473  *
2474  * @param peer Peer to get path info.
2475  *
2476  * @return Number of known paths.
2477  */
2478 unsigned int
2479 GCP_count_paths (const struct CadetPeer *peer)
2480 {
2481   struct CadetPeerPath *iter;
2482   unsigned int i;
2483
2484   for (iter = peer->path_head, i = 0; NULL != iter; iter = iter->next)
2485     i++;
2486
2487   return i;
2488 }
2489
2490
2491 /**
2492  * Iterate all known peers.
2493  *
2494  * @param iter Iterator.
2495  * @param cls Closure for @c iter.
2496  */
2497 void
2498 GCP_iterate_all (GNUNET_CONTAINER_PeerMapIterator iter, void *cls)
2499 {
2500   GNUNET_CONTAINER_multipeermap_iterate (peers, iter, cls);
2501 }
2502
2503
2504 /**
2505  * Get the static string for a peer ID.
2506  *
2507  * @param peer Peer.
2508  *
2509  * @return Static string for it's ID.
2510  */
2511 const char *
2512 GCP_2s (const struct CadetPeer *peer)
2513 {
2514   if (NULL == peer)
2515     return "(NULL)";
2516   return GNUNET_i2s (GNUNET_PEER_resolve2 (peer->id));
2517 }