- fix handle for tunnel queueing during KX
[oweals/gnunet.git] / src / mesh / gnunet-service-mesh_tunnel.c
1 /*
2      This file is part of GNUnet.
3      (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 #include "platform.h"
22 #include "gnunet_util_lib.h"
23
24 #include "gnunet_signatures.h"
25 #include "gnunet_statistics_service.h"
26
27 #include "mesh_protocol.h"
28 #include "mesh_path.h"
29
30 #include "gnunet-service-mesh_tunnel.h"
31 #include "gnunet-service-mesh_connection.h"
32 #include "gnunet-service-mesh_channel.h"
33 #include "gnunet-service-mesh_peer.h"
34
35 #define LOG(level, ...) GNUNET_log_from(level,"mesh-tun",__VA_ARGS__)
36
37 #define REKEY_WAIT GNUNET_TIME_relative_multiply(GNUNET_TIME_UNIT_SECONDS, 5)
38
39 /******************************************************************************/
40 /********************************   STRUCTS  **********************************/
41 /******************************************************************************/
42
43 struct MeshTChannel
44 {
45   struct MeshTChannel *next;
46   struct MeshTChannel *prev;
47   struct MeshChannel *ch;
48 };
49
50 struct MeshTConnection
51 {
52   struct MeshTConnection *next;
53   struct MeshTConnection *prev;
54   struct MeshConnection *c;
55 };
56
57 /**
58  * Structure used during a Key eXchange.
59  */
60 struct MeshTunnelKXCtx
61 {
62   /**
63    * Decryption ("their") old key, for decrypting traffic sent by the
64    * other end before the key exchange started.
65    */
66   struct GNUNET_CRYPTO_SymmetricSessionKey d_key_old;
67
68   /**
69    * Challenge to send in a ping and expect in the pong.
70    */
71   uint32_t challenge;
72 };
73
74 /**
75  * Struct containing all information regarding a tunnel to a peer.
76  */
77 struct MeshTunnel3
78 {
79     /**
80      * Endpoint of the tunnel.
81      */
82   struct MeshPeer *peer;
83
84     /**
85      * State of the tunnel connectivity.
86      */
87   enum MeshTunnel3CState cstate;
88
89   /**
90    * State of the tunnel encryption.
91    */
92   enum MeshTunnel3EState estate;
93
94   /**
95    * Key eXchange context.
96    */
97   struct MeshTunnelKXCtx *kx_ctx;
98
99   /**
100    * Encryption ("our") key.
101    */
102   struct GNUNET_CRYPTO_SymmetricSessionKey e_key;
103
104   /**
105    * Decryption ("their") key.
106    */
107   struct GNUNET_CRYPTO_SymmetricSessionKey d_key;
108
109   /**
110    * Task to start the rekey process.
111    */
112   GNUNET_SCHEDULER_TaskIdentifier rekey_task;
113
114   /**
115    * Paths that are actively used to reach the destination peer.
116    */
117   struct MeshTConnection *connection_head;
118   struct MeshTConnection *connection_tail;
119
120   /**
121    * Next connection number.
122    */
123   uint32_t next_cid;
124
125   /**
126    * Channels inside this tunnel.
127    */
128   struct MeshTChannel *channel_head;
129   struct MeshTChannel *channel_tail;
130
131   /**
132    * Channel ID for the next created channel.
133    */
134   MESH_ChannelNumber next_chid;
135
136   /**
137    * Destroy flag: if true, destroy on last message.
138    */
139   int destroy;
140
141   /**
142    * Queued messages, to transmit once tunnel gets connected.
143    */
144   struct MeshTunnelDelayed *tq_head;
145   struct MeshTunnelDelayed *tq_tail;
146 };
147
148
149 /**
150  * Struct used to save messages in a non-ready tunnel to send once connected.
151  */
152 struct MeshTunnelDelayed
153 {
154   /**
155    * DLL
156    */
157   struct MeshTunnelDelayed *next;
158   struct MeshTunnelDelayed *prev;
159
160   /**
161    * Tunnel.
162    */
163   struct MeshTunnel3 *t;
164
165   /**
166    * Channel.
167    */
168   struct MeshChannel *ch;
169
170   /**
171    * Message to send.
172    */
173   /* struct GNUNET_MessageHeader *msg; */
174 };
175
176
177 /**
178  * Handle for messages queued but not yet sent.
179  */
180 struct MeshTunnel3Queue
181 {
182   /**
183    * Connection queue handle, to cancel if necessary.
184    */
185   struct MeshConnectionQueue *q;
186
187   /**
188    * Handle in case message hasn't been given to a connection yet.
189    */
190   struct MeshTunnelDelayed *tq;
191
192   /**
193    * Continuation to call once sent.
194    */
195   GMT_sent cont;
196
197   /**
198    * Closure for @c cont.
199    */
200   void *cont_cls;
201 };
202
203
204 /******************************************************************************/
205 /*******************************   GLOBALS  ***********************************/
206 /******************************************************************************/
207
208 /**
209  * Global handle to the statistics service.
210  */
211 extern struct GNUNET_STATISTICS_Handle *stats;
212
213 /**
214  * Local peer own ID (memory efficient handle).
215  */
216 extern GNUNET_PEER_Id myid;
217
218 /**
219  * Local peer own ID (full value).
220  */
221 extern struct GNUNET_PeerIdentity my_full_id;
222
223
224 /**
225  * Set of all tunnels, in order to trigger a new exchange on rekey.
226  * Indexed by peer's ID.
227  */
228 static struct GNUNET_CONTAINER_MultiPeerMap *tunnels;
229
230 /**
231  * Default TTL for payload packets.
232  */
233 static unsigned long long default_ttl;
234
235 /**
236  * Own private key.
237  */
238 const static struct GNUNET_CRYPTO_EddsaPrivateKey *my_private_key;
239
240 /**
241  * Own ephemeral private key.
242  */
243 static struct GNUNET_CRYPTO_EcdhePrivateKey *my_ephemeral_key;
244
245 /**
246  * Cached message used to perform a key exchange.
247  */
248 static struct GNUNET_MESH_KX_Ephemeral kx_msg;
249
250 /**
251  * Task to generate a new ephemeral key.
252  */
253 static GNUNET_SCHEDULER_TaskIdentifier rekey_task;
254
255 /**
256  * Rekey period.
257  */
258 static struct GNUNET_TIME_Relative rekey_period;
259
260 /******************************************************************************/
261 /********************************   STATIC  ***********************************/
262 /******************************************************************************/
263
264 /**
265  * Get string description for tunnel connectivity state.
266  *
267  * @param cs Tunnel state.
268  *
269  * @return String representation.
270  */
271 static const char *
272 cstate2s (enum MeshTunnel3CState cs)
273 {
274   static char buf[128];
275
276   switch (cs)
277   {
278     case MESH_TUNNEL3_NEW:
279       return "MESH_TUNNEL3_NEW";
280     case MESH_TUNNEL3_SEARCHING:
281       return "MESH_TUNNEL3_SEARCHING";
282     case MESH_TUNNEL3_WAITING:
283       return "MESH_TUNNEL3_WAITING";
284     case MESH_TUNNEL3_READY:
285       return "MESH_TUNNEL3_READY";
286
287     default:
288       sprintf (buf, "%u (UNKNOWN STATE)", cs);
289       return buf;
290   }
291   return "";
292 }
293
294
295 /**
296  * Get string description for tunnel encryption state.
297  *
298  * @param es Tunnel state.
299  *
300  * @return String representation.
301  */
302 static const char *
303 estate2s (enum MeshTunnel3EState es)
304 {
305   static char buf[128];
306
307   switch (es)
308   {
309     case MESH_TUNNEL3_KEY_UNINITIALIZED:
310       return "MESH_TUNNEL3_KEY_UNINITIALIZED";
311     case MESH_TUNNEL3_KEY_SENT:
312       return "MESH_TUNNEL3_KEY_SENT";
313     case MESH_TUNNEL3_KEY_PING:
314       return "MESH_TUNNEL3_KEY_PING";
315     case MESH_TUNNEL3_KEY_OK:
316       return "MESH_TUNNEL3_KEY_OK";
317
318     default:
319       sprintf (buf, "%u (UNKNOWN STATE)", es);
320       return buf;
321   }
322   return "";
323 }
324
325
326 /**
327  * @brief Check if tunnel is ready to send traffic.
328  *
329  * Tunnel must be connected and with encryption correctly set up.
330  *
331  * @param t Tunnel to check.
332  *
333  * @return #GNUNET_YES if ready, #GNUNET_NO otherwise
334  */
335 static int
336 is_ready (struct MeshTunnel3 *t)
337 {
338   return (MESH_TUNNEL3_READY == t->cstate
339           && MESH_TUNNEL3_KEY_OK == t->estate)
340          || GMT_is_loopback (t);
341 }
342
343
344 /**
345  * Ephemeral key message purpose size.
346  *
347  * @return Size of the part of the ephemeral key message that must be signed.
348  */
349 size_t
350 ephemeral_purpose_size (void)
351 {
352   return sizeof (struct GNUNET_CRYPTO_EccSignaturePurpose) +
353          sizeof (struct GNUNET_TIME_AbsoluteNBO) +
354          sizeof (struct GNUNET_TIME_AbsoluteNBO) +
355          sizeof (struct GNUNET_CRYPTO_EcdhePublicKey) +
356          sizeof (struct GNUNET_PeerIdentity);
357 }
358
359
360 /**
361  * Size of the encrypted part of a ping message.
362  *
363  * @return Size of the encrypted part of a ping message.
364  */
365 size_t
366 ping_encryption_size (void)
367 {
368   return sizeof (struct GNUNET_PeerIdentity) + sizeof (uint32_t);
369 }
370
371
372 /**
373  * Get the channel's buffer. ONLY FOR NON-LOOPBACK CHANNELS!!
374  *
375  * @param tch Tunnel's channel handle.
376  *
377  * @return Amount of messages the channel can still buffer towards the client.
378  */
379 static unsigned int
380 get_channel_buffer (const struct MeshTChannel *tch)
381 {
382   int fwd;
383
384   /* If channel is outgoing, is origin in the FWD direction and fwd is YES */
385   fwd = GMCH_is_origin (tch->ch, GNUNET_YES);
386
387   return GMCH_get_buffer (tch->ch, fwd);
388 }
389
390
391 /**
392  * Get the channel's allowance status.
393  *
394  * @param tch Tunnel's channel handle.
395  *
396  * @return #GNUNET_YES if we allowed the client to send data to us.
397  */
398 static int
399 get_channel_allowed (const struct MeshTChannel *tch)
400 {
401   int fwd;
402
403   /* If channel is outgoing, is origin in the FWD direction and fwd is YES */
404   fwd = GMCH_is_origin (tch->ch, GNUNET_YES);
405
406   return GMCH_get_allowed (tch->ch, fwd);
407 }
408
409
410 /**
411  * Get the connection's buffer.
412  *
413  * @param tc Tunnel's connection handle.
414  *
415  * @return Amount of messages the connection can still buffer.
416  */
417 static unsigned int
418 get_connection_buffer (const struct MeshTConnection *tc)
419 {
420   int fwd;
421
422   /* If connection is outgoing, is origin in the FWD direction and fwd is YES */
423   fwd = GMC_is_origin (tc->c, GNUNET_YES);
424
425   return GMC_get_buffer (tc->c, fwd);
426 }
427
428
429 /**
430  * Get the connection's allowance.
431  *
432  * @param tc Tunnel's connection handle.
433  *
434  * @return Amount of messages we have allowed the next peer to send us.
435  */
436 static unsigned int
437 get_connection_allowed (const struct MeshTConnection *tc)
438 {
439   int fwd;
440
441   /* If connection is outgoing, is origin in the FWD direction and fwd is YES */
442   fwd = GMC_is_origin (tc->c, GNUNET_YES);
443
444   return GMC_get_allowed (tc->c, fwd);
445 }
446
447
448 /**
449  * Check that a ephemeral key message s well formed and correctly signed.
450  *
451  * @param t Tunnel on which the message came.
452  * @param msg The ephemeral key message.
453  *
454  * @return GNUNET_OK if message is fine, GNUNET_SYSERR otherwise.
455  */
456 int
457 check_ephemeral (struct MeshTunnel3 *t,
458                  const struct GNUNET_MESH_KX_Ephemeral *msg)
459 {
460   /* Check message size */
461   if (ntohs (msg->header.size) != sizeof (struct GNUNET_MESH_KX_Ephemeral))
462     return GNUNET_SYSERR;
463
464   /* Check signature size */
465   if (ntohl (msg->purpose.size) != ephemeral_purpose_size ())
466     return GNUNET_SYSERR;
467
468   /* Check origin */
469   if (0 != memcmp (&msg->origin_identity,
470                    GMP_get_id (t->peer),
471                    sizeof (struct GNUNET_PeerIdentity)))
472     return GNUNET_SYSERR;
473
474   /* Check signature */
475   if (GNUNET_OK !=
476       GNUNET_CRYPTO_eddsa_verify (GNUNET_SIGNATURE_PURPOSE_MESH_KX,
477                                   &msg->purpose,
478                                   &msg->signature,
479                                   &msg->origin_identity.public_key))
480     return GNUNET_SYSERR;
481
482   return GNUNET_OK;
483 }
484
485
486 /**
487  * Encrypt data with the tunnel key.
488  *
489  * @param t Tunnel whose key to use.
490  * @param dst Destination for the encrypted data.
491  * @param src Source of the plaintext. Can overlap with @c dst.
492  * @param size Size of the plaintext.
493  * @param iv Initialization Vector to use.
494  */
495 static int
496 t_encrypt (struct MeshTunnel3 *t,
497            void *dst, const void *src,
498            size_t size, uint32_t iv)
499 {
500   struct GNUNET_CRYPTO_SymmetricInitializationVector siv;
501
502   GNUNET_CRYPTO_symmetric_derive_iv (&siv, &t->e_key, &iv, sizeof (uint32_t), NULL);
503   return GNUNET_CRYPTO_symmetric_encrypt (src, size, &t->e_key, &siv, dst);
504 }
505
506
507 /**
508  * Decrypt data with the tunnel key.
509  *
510  * @param t Tunnel whose key to use.
511  * @param dst Destination for the plaintext.
512  * @param src Source of the encrypted data. Can overlap with @c dst.
513  * @param size Size of the encrypted data.
514  * @param iv Initialization Vector to use.
515  */
516 static int
517 t_decrypt (struct MeshTunnel3 *t,
518            void *dst, const void *src,
519            size_t size, uint32_t iv)
520 {
521   struct GNUNET_CRYPTO_SymmetricInitializationVector siv;
522
523   GNUNET_CRYPTO_symmetric_derive_iv (&siv, &t->d_key, &iv, sizeof (uint32_t), NULL);
524   return GNUNET_CRYPTO_symmetric_decrypt (src, size, &t->d_key, &siv, dst);
525 }
526
527
528 /**
529  * Create key material by doing ECDH on the local and remote ephemeral keys.
530  *
531  * @param key_material Where to store the key material.
532  * @param ephemeral_key Peer's public ephemeral key.
533  */
534 void
535 derive_key_material (struct GNUNET_HashCode *key_material,
536                      const struct GNUNET_CRYPTO_EcdhePublicKey *ephemeral_key)
537 {
538   if (GNUNET_OK !=
539       GNUNET_CRYPTO_ecc_ecdh (my_ephemeral_key,
540                               ephemeral_key,
541                               key_material))
542   {
543     GNUNET_break (0);
544   }
545 }
546
547 /**
548  * Create a symmetic key from the identities of both ends and the key material
549  * from ECDH.
550  *
551  * @param key Destination for the generated key.
552  * @param sender ID of the peer that will encrypt with @c key.
553  * @param receiver ID of the peer that will decrypt with @c key.
554  * @param key_material Hash created with ECDH with the ephemeral keys.
555  */
556 void
557 derive_symmertic (struct GNUNET_CRYPTO_SymmetricSessionKey *key,
558                   const struct GNUNET_PeerIdentity *sender,
559                   const struct GNUNET_PeerIdentity *receiver,
560                   const struct GNUNET_HashCode *key_material)
561 {
562   const char salt[] = "MESH kx salt";
563
564   GNUNET_CRYPTO_kdf (key, sizeof (struct GNUNET_CRYPTO_SymmetricSessionKey),
565                      salt, sizeof (salt),
566                      key_material, sizeof (struct GNUNET_HashCode),
567                      sender, sizeof (struct GNUNET_PeerIdentity),
568                      receiver, sizeof (struct GNUNET_PeerIdentity),
569                      NULL);
570 }
571
572 /**
573  * Pick a connection on which send the next data message.
574  *
575  * @param t Tunnel on which to send the message.
576  *
577  * @return The connection on which to send the next message.
578  */
579 static struct MeshConnection *
580 tunnel_get_connection (struct MeshTunnel3 *t)
581 {
582   struct MeshTConnection *iter;
583   struct MeshConnection *best;
584   unsigned int qn;
585   unsigned int lowest_q;
586
587   LOG (GNUNET_ERROR_TYPE_DEBUG, "tunnel_get_connection %s\n", GMP_2s (t->peer));
588   best = NULL;
589   lowest_q = UINT_MAX;
590   for (iter = t->connection_head; NULL != iter; iter = iter->next)
591   {
592     LOG (GNUNET_ERROR_TYPE_DEBUG, "  connection %s: %u\n",
593          GMC_2s (iter->c), GMC_get_state (iter->c));
594     if (MESH_CONNECTION_READY == GMC_get_state (iter->c))
595     {
596       qn = GMC_get_qn (iter->c, GMC_is_origin (iter->c, GNUNET_YES));
597       LOG (GNUNET_ERROR_TYPE_DEBUG, "    q_n %u, \n", qn);
598       if (qn < lowest_q)
599       {
600         best = iter->c;
601         lowest_q = qn;
602       }
603     }
604   }
605   LOG (GNUNET_ERROR_TYPE_DEBUG, " selected: connection %s\n", GMC_2s (best));
606   return best;
607 }
608
609
610
611 /**
612  * Delete a queued message: most probably channel was destroyed before the
613  * tunnel's key exchange had a chance to finish.
614  *
615  * @param tq Queue handle.
616  */
617 static void
618 unqueue_data (struct MeshTunnelDelayed *tq)
619 {
620   GNUNET_CONTAINER_DLL_remove (tq->t->tq_head, tq->t->tq_tail, tq);
621   GNUNET_free (tq);
622 }
623
624
625 /**
626  * Send all cached messages that we can, tunnel is online.
627  *
628  * @param t Tunnel that holds the messages. Cannot be loopback.
629  */
630 static void
631 send_queued_data (struct MeshTunnel3 *t)
632 {
633   struct MeshTunnelDelayed *tq;
634   struct MeshTunnelDelayed *next;
635   unsigned int room;
636
637   LOG (GNUNET_ERROR_TYPE_DEBUG,
638        "GMT_send_queued_data on tunnel %s\n",
639        GMT_2s (t));
640
641   if (GMT_is_loopback (t))
642   {
643     GNUNET_break (0);
644     return;
645   }
646
647   if (GNUNET_NO == is_ready (t))
648   {
649     LOG (GNUNET_ERROR_TYPE_DEBUG, "  not ready yet: %s/%s\n",
650          estate2s (t->estate), cstate2s (t->cstate));
651     return;
652   }
653
654   room = GMT_get_connections_buffer (t);
655   LOG (GNUNET_ERROR_TYPE_DEBUG, "  buffer space: %u\n", room);
656   LOG (GNUNET_ERROR_TYPE_DEBUG, "  tq head: %p\n", t->tq_head);
657   for (tq = t->tq_head; NULL != tq && room > 0; tq = next)
658   {
659     LOG (GNUNET_ERROR_TYPE_DEBUG, " data on channel %s\n", GMCH_2s (tq->ch));
660     next = tq->next;
661     room--;
662     GMCH_send_prebuilt_message ((struct GNUNET_MessageHeader *) &tq[1],
663                                 tq->ch, GMCH_is_origin (tq->ch, GNUNET_YES),
664                                 NULL);
665     unqueue_data (tq);
666   }
667   LOG (GNUNET_ERROR_TYPE_DEBUG,
668        "GMT_send_queued_data end\n",
669        GMP_2s (t->peer));
670 }
671
672
673 /**
674  * Cache a message to be sent once tunnel is online.
675  *
676  * @param t Tunnel to hold the message.
677  * @param ch Channel the message is about.
678  * @param msg Message itself (copy will be made).
679  */
680 static struct MeshTunnelDelayed *
681 queue_data (struct MeshTunnel3 *t,
682             struct MeshChannel *ch,
683             const struct GNUNET_MessageHeader *msg)
684 {
685   struct MeshTunnelDelayed *tq;
686   uint16_t size = ntohs (msg->size);
687
688   LOG (GNUNET_ERROR_TYPE_DEBUG, "queue data on Tunnel %s\n", GMT_2s (t));
689
690   if (GNUNET_YES == is_ready (t))
691   {
692     GNUNET_break (0);
693     return NULL;
694   }
695
696   tq = GNUNET_malloc (sizeof (struct MeshTunnelDelayed) + size);
697
698   tq->ch = ch;
699   tq->t = t;
700   memcpy (&tq[1], msg, size);
701   GNUNET_CONTAINER_DLL_insert_tail (t->tq_head, t->tq_tail, tq);
702   return tq;
703 }
704
705
706
707 /**
708  * Sends key exchange message on a tunnel, choosing the best connection.
709  * Should not be called on loopback tunnels.
710  *
711  * @param t Tunnel on which this message is transmitted.
712  * @param message Message to send. Function modifies it.
713  */
714 static void
715 send_kx (struct MeshTunnel3 *t,
716          const struct GNUNET_MessageHeader *message)
717 {
718   struct MeshConnection *c;
719   struct GNUNET_MESH_KX *msg;
720   size_t size = ntohs (message->size);
721   char cbuf[sizeof (struct GNUNET_MESH_KX) + size];
722   uint16_t type;
723   int fwd;
724
725   LOG (GNUNET_ERROR_TYPE_DEBUG, "GMT KX on Tunnel %s\n", GMT_2s (t));
726
727   /* Avoid loopback. */
728   if (GMT_is_loopback (t))
729   {
730     LOG (GNUNET_ERROR_TYPE_DEBUG, "  loopback!\n");
731     GNUNET_break (0);
732     return;
733   }
734
735   /* Must have a connection. */
736   if (NULL == t->connection_head)
737   {
738     GNUNET_break (0);
739     return;
740   }
741
742   msg = (struct GNUNET_MESH_KX *) cbuf;
743   msg->header.type = htons (GNUNET_MESSAGE_TYPE_MESH_KX);
744   msg->header.size = htons (sizeof (struct GNUNET_MESH_KX) + size);
745   c = tunnel_get_connection (t);
746   if (NULL == c)
747   {
748     GNUNET_break (GNUNET_YES == t->destroy);
749     return;
750   }
751   type = ntohs (message->type);
752   switch (type)
753   {
754     case GNUNET_MESSAGE_TYPE_MESH_KX_EPHEMERAL:
755     case GNUNET_MESSAGE_TYPE_MESH_KX_PING:
756     case GNUNET_MESSAGE_TYPE_MESH_KX_PONG:
757       msg->reserved = htonl (0);
758       memcpy (&msg[1], message, size);
759       break;
760     default:
761       LOG (GNUNET_ERROR_TYPE_DEBUG, "unkown type %s\n",
762            GM_m2s (type));
763       GNUNET_break (0);
764   }
765
766   fwd = GMC_is_origin (t->connection_head->c, GNUNET_YES);
767   /* TODO save handle and cancel in case of a unneeded retransmission */
768   GMC_send_prebuilt_message (&msg->header, c, fwd, GNUNET_YES, NULL, NULL);
769 }
770
771
772 /**
773  * Send the ephemeral key on a tunnel.
774  *
775  * @param t Tunnel on which to send the key.
776  */
777 static void
778 send_ephemeral (struct MeshTunnel3 *t)
779 {
780   LOG (GNUNET_ERROR_TYPE_DEBUG, "%s()\n", __FUNCTION__);
781
782   kx_msg.sender_status = htonl (t->estate);
783   send_kx (t, &kx_msg.header);
784 }
785
786 /**
787  * Send a ping message on a tunnel.
788  *
789  * @param t Tunnel on which to send the ping.
790  */
791 static void
792 send_ping (struct MeshTunnel3 *t)
793 {
794   struct GNUNET_MESH_KX_Ping msg;
795
796   LOG (GNUNET_ERROR_TYPE_DEBUG, "%s()\n", __FUNCTION__);
797   msg.header.size = htons (sizeof (msg));
798   msg.header.type = htons (GNUNET_MESSAGE_TYPE_MESH_KX_PING);
799   msg.iv = GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_NONCE, UINT32_MAX);
800   msg.target = *GMP_get_id (t->peer);
801   msg.nonce = t->kx_ctx->challenge;
802
803   LOG (GNUNET_ERROR_TYPE_DEBUG, "  sending %u\n", msg.nonce);
804   LOG (GNUNET_ERROR_TYPE_DEBUG, "  towards %s\n", GNUNET_i2s (&msg.target));
805   t_encrypt (t, &msg.target, &msg.target, ping_encryption_size(), msg.iv);
806   LOG (GNUNET_ERROR_TYPE_DEBUG, "  e sending %u\n", msg.nonce);
807   LOG (GNUNET_ERROR_TYPE_DEBUG, "  e towards %s\n", GNUNET_i2s (&msg.target));
808
809   send_kx (t, &msg.header);
810 }
811
812
813 /**
814  * Send a pong message on a tunnel.
815  *
816  * @param t Tunnel on which to send the pong.
817  * @param challenge Value sent in the ping that we have to send back.
818  */
819 static void
820 send_pong (struct MeshTunnel3 *t, uint32_t challenge)
821 {
822   struct GNUNET_MESH_KX_Pong msg;
823
824   LOG (GNUNET_ERROR_TYPE_DEBUG, "%s()\n", __FUNCTION__);
825   msg.header.size = htons (sizeof (msg));
826   msg.header.type = htons (GNUNET_MESSAGE_TYPE_MESH_KX_PONG);
827   msg.iv = GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_NONCE, UINT32_MAX);
828   msg.nonce = challenge;
829   LOG (GNUNET_ERROR_TYPE_DEBUG, "  sending %u\n", msg.nonce);
830   t_encrypt (t, &msg.nonce, &msg.nonce, sizeof (msg.nonce), msg.iv);
831   LOG (GNUNET_ERROR_TYPE_DEBUG, "  e sending %u\n", msg.nonce);
832
833   send_kx (t, &msg.header);
834 }
835
836
837 /**
838  * Initiate a rekey with the remote peer.
839  *
840  * @param cls Closure (tunnel).
841  * @param tc TaskContext.
842  */
843 static void
844 rekey_tunnel (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
845 {
846   struct MeshTunnel3 *t = cls;
847
848   t->rekey_task = GNUNET_SCHEDULER_NO_TASK;
849
850   LOG (GNUNET_ERROR_TYPE_DEBUG, "Re-key Tunnel\n");
851   if (NULL != tc && 0 != (GNUNET_SCHEDULER_REASON_SHUTDOWN & tc->reason))
852     return;
853
854   if (NULL == t->kx_ctx)
855   {
856     LOG (GNUNET_ERROR_TYPE_DEBUG, "  new kx ctx\n");
857     t->kx_ctx = GNUNET_new (struct MeshTunnelKXCtx);
858     t->kx_ctx->challenge = GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_NONCE,
859                                                      UINT32_MAX);
860     t->kx_ctx->d_key_old = t->d_key;
861   }
862   send_ephemeral (t);
863   switch (t->estate)
864   {
865     case MESH_TUNNEL3_KEY_UNINITIALIZED:
866       t->estate = MESH_TUNNEL3_KEY_SENT;
867       break;
868     case MESH_TUNNEL3_KEY_SENT:
869       break;
870     case MESH_TUNNEL3_KEY_PING:
871     case MESH_TUNNEL3_KEY_OK:
872       send_ping (t);
873       t->estate = MESH_TUNNEL3_KEY_PING;
874       break;
875     default:
876       LOG (GNUNET_ERROR_TYPE_DEBUG, "Unexpected state %u\n", t->estate);
877   }
878
879   LOG (GNUNET_ERROR_TYPE_DEBUG, "  next call in %s\n",
880        GNUNET_STRINGS_relative_time_to_string (REKEY_WAIT, GNUNET_YES));
881   t->rekey_task = GNUNET_SCHEDULER_add_delayed (REKEY_WAIT, &rekey_tunnel, t);
882 }
883
884
885 /**
886  * Out ephemeral key has changed, create new session key on all tunnels.
887  *
888  * @param cls Closure (size of the hashmap).
889  * @param key Current public key.
890  * @param value Value in the hash map (tunnel).
891  *
892  * @return #GNUNET_YES, so we should continue to iterate,
893  */
894 static int
895 rekey_iterator (void *cls,
896                 const struct GNUNET_PeerIdentity *key,
897                 void *value)
898 {
899   struct MeshTunnel3 *t = value;
900   struct GNUNET_TIME_Relative delay;
901   long n = (long) cls;
902   uint32_t r;
903
904   if (GNUNET_SCHEDULER_NO_TASK != t->rekey_task)
905     return GNUNET_YES;
906
907   r = GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_WEAK, (uint32_t) n * 100);
908   delay = GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_MILLISECONDS, r);
909   t->rekey_task = GNUNET_SCHEDULER_add_delayed (delay, &rekey_tunnel, t);
910
911   return GNUNET_YES;
912 }
913
914
915 /**
916  * Create a new ephemeral key and key message, schedule next rekeying.
917  *
918  * @param cls Closure (unused).
919  * @param tc TaskContext.
920  */
921 static void
922 rekey (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
923 {
924   struct GNUNET_TIME_Absolute time;
925   long n;
926
927   rekey_task = GNUNET_SCHEDULER_NO_TASK;
928
929   if (0 != (GNUNET_SCHEDULER_REASON_SHUTDOWN & tc->reason))
930     return;
931
932   GNUNET_free_non_null (my_ephemeral_key);
933   my_ephemeral_key = GNUNET_CRYPTO_ecdhe_key_create ();
934
935   time = GNUNET_TIME_absolute_get ();
936   kx_msg.creation_time = GNUNET_TIME_absolute_hton (time);
937   time = GNUNET_TIME_absolute_add (time, rekey_period);
938   time = GNUNET_TIME_absolute_add (time, GNUNET_TIME_UNIT_MINUTES);
939   kx_msg.expiration_time = GNUNET_TIME_absolute_hton (time);
940   GNUNET_CRYPTO_ecdhe_key_get_public (my_ephemeral_key, &kx_msg.ephemeral_key);
941
942   GNUNET_assert (GNUNET_OK ==
943                  GNUNET_CRYPTO_eddsa_sign (my_private_key,
944                                            &kx_msg.purpose,
945                                            &kx_msg.signature));
946
947   n = (long) GNUNET_CONTAINER_multipeermap_size (tunnels);
948   GNUNET_CONTAINER_multipeermap_iterate (tunnels, &rekey_iterator, (void *) n);
949
950   rekey_task = GNUNET_SCHEDULER_add_delayed (rekey_period, &rekey, NULL);
951 }
952
953
954 /**
955  * Called only on shutdown, destroy every tunnel.
956  *
957  * @param cls Closure (unused).
958  * @param key Current public key.
959  * @param value Value in the hash map (tunnel).
960  *
961  * @return #GNUNET_YES, so we should continue to iterate,
962  */
963 static int
964 destroy_iterator (void *cls,
965                 const struct GNUNET_PeerIdentity *key,
966                 void *value)
967 {
968   struct MeshTunnel3 *t = value;
969
970   GMT_destroy (t);
971   return GNUNET_YES;
972 }
973
974
975 /**
976  * Demultiplex data per channel and call appropriate channel handler.
977  *
978  * @param t Tunnel on which the data came.
979  * @param msg Data message.
980  * @param fwd Is this message fwd? This only is meaningful in loopback channels.
981  *            #GNUNET_YES if message is FWD on the respective channel (loopback)
982  *            #GNUNET_NO if message is BCK on the respective channel (loopback)
983  *            #GNUNET_SYSERR if message on a one-ended channel (remote)
984  */
985 static void
986 handle_data (struct MeshTunnel3 *t,
987              const struct GNUNET_MESH_Data *msg,
988              int fwd)
989 {
990   struct MeshChannel *ch;
991   size_t size;
992
993   /* Check size */
994   size = ntohs (msg->header.size);
995   if (size <
996       sizeof (struct GNUNET_MESH_Data) +
997       sizeof (struct GNUNET_MessageHeader))
998   {
999     GNUNET_break (0);
1000     return;
1001   }
1002   LOG (GNUNET_ERROR_TYPE_DEBUG, " payload of type %s\n",
1003               GM_m2s (ntohs (msg[1].header.type)));
1004
1005   /* Check channel */
1006   ch = GMT_get_channel (t, ntohl (msg->chid));
1007   if (NULL == ch)
1008   {
1009     GNUNET_STATISTICS_update (stats, "# data on unknown channel",
1010                               1, GNUNET_NO);
1011     LOG (GNUNET_ERROR_TYPE_DEBUG, "WARNING channel %u unknown\n",
1012          ntohl (msg->chid));
1013     return;
1014   }
1015
1016   GMCH_handle_data (ch, msg, fwd);
1017 }
1018
1019
1020 /**
1021  * Demultiplex data ACKs per channel and update appropriate channel buffer info.
1022  *
1023  * @param t Tunnel on which the DATA ACK came.
1024  * @param msg DATA ACK message.
1025  * @param fwd Is this message fwd? This only is meaningful in loopback channels.
1026  *            #GNUNET_YES if message is FWD on the respective channel (loopback)
1027  *            #GNUNET_NO if message is BCK on the respective channel (loopback)
1028  *            #GNUNET_SYSERR if message on a one-ended channel (remote)
1029  */
1030 static void
1031 handle_data_ack (struct MeshTunnel3 *t,
1032                  const struct GNUNET_MESH_DataACK *msg,
1033                  int fwd)
1034 {
1035   struct MeshChannel *ch;
1036   size_t size;
1037
1038   /* Check size */
1039   size = ntohs (msg->header.size);
1040   if (size != sizeof (struct GNUNET_MESH_DataACK))
1041   {
1042     GNUNET_break (0);
1043     return;
1044   }
1045
1046   /* Check channel */
1047   ch = GMT_get_channel (t, ntohl (msg->chid));
1048   if (NULL == ch)
1049   {
1050     GNUNET_STATISTICS_update (stats, "# data ack on unknown channel",
1051                               1, GNUNET_NO);
1052     LOG (GNUNET_ERROR_TYPE_DEBUG, "WARNING channel %u unknown\n",
1053          ntohl (msg->chid));
1054     return;
1055   }
1056
1057   GMCH_handle_data_ack (ch, msg, fwd);
1058 }
1059
1060
1061 /**
1062  * Handle channel create.
1063  *
1064  * @param t Tunnel on which the data came.
1065  * @param msg Data message.
1066  */
1067 static void
1068 handle_ch_create (struct MeshTunnel3 *t,
1069                   const struct GNUNET_MESH_ChannelCreate *msg)
1070 {
1071   struct MeshChannel *ch;
1072   size_t size;
1073
1074   /* Check size */
1075   size = ntohs (msg->header.size);
1076   if (size != sizeof (struct GNUNET_MESH_ChannelCreate))
1077   {
1078     GNUNET_break (0);
1079     return;
1080   }
1081
1082   /* Check channel */
1083   ch = GMT_get_channel (t, ntohl (msg->chid));
1084   if (NULL != ch && ! GMT_is_loopback (t))
1085   {
1086     /* Probably a retransmission, safe to ignore */
1087     LOG (GNUNET_ERROR_TYPE_DEBUG, "   already exists...\n");
1088   }
1089   else
1090   {
1091     ch = GMCH_handle_create (t, msg);
1092   }
1093   if (NULL != ch)
1094     GMT_add_channel (t, ch);
1095 }
1096
1097
1098
1099 /**
1100  * Handle channel NACK: check correctness and call channel handler for NACKs.
1101  *
1102  * @param t Tunnel on which the NACK came.
1103  * @param msg NACK message.
1104  */
1105 static void
1106 handle_ch_nack (struct MeshTunnel3 *t,
1107                 const struct GNUNET_MESH_ChannelManage *msg)
1108 {
1109   struct MeshChannel *ch;
1110   size_t size;
1111
1112   /* Check size */
1113   size = ntohs (msg->header.size);
1114   if (size != sizeof (struct GNUNET_MESH_ChannelManage))
1115   {
1116     GNUNET_break (0);
1117     return;
1118   }
1119
1120   /* Check channel */
1121   ch = GMT_get_channel (t, ntohl (msg->chid));
1122   if (NULL == ch)
1123   {
1124     GNUNET_STATISTICS_update (stats, "# channel NACK on unknown channel",
1125                               1, GNUNET_NO);
1126     LOG (GNUNET_ERROR_TYPE_DEBUG, "WARNING channel %u unknown\n",
1127          ntohl (msg->chid));
1128     return;
1129   }
1130
1131   GMCH_handle_nack (ch);
1132 }
1133
1134
1135 /**
1136  * Handle a CHANNEL ACK (SYNACK/ACK).
1137  *
1138  * @param t Tunnel on which the CHANNEL ACK came.
1139  * @param msg CHANNEL ACK message.
1140  * @param fwd Is this message fwd? This only is meaningful in loopback channels.
1141  *            #GNUNET_YES if message is FWD on the respective channel (loopback)
1142  *            #GNUNET_NO if message is BCK on the respective channel (loopback)
1143  *            #GNUNET_SYSERR if message on a one-ended channel (remote)
1144  */
1145 static void
1146 handle_ch_ack (struct MeshTunnel3 *t,
1147                const struct GNUNET_MESH_ChannelManage *msg,
1148                int fwd)
1149 {
1150   struct MeshChannel *ch;
1151   size_t size;
1152
1153   /* Check size */
1154   size = ntohs (msg->header.size);
1155   if (size != sizeof (struct GNUNET_MESH_ChannelManage))
1156   {
1157     GNUNET_break (0);
1158     return;
1159   }
1160
1161   /* Check channel */
1162   ch = GMT_get_channel (t, ntohl (msg->chid));
1163   if (NULL == ch)
1164   {
1165     GNUNET_STATISTICS_update (stats, "# channel ack on unknown channel",
1166                               1, GNUNET_NO);
1167     LOG (GNUNET_ERROR_TYPE_DEBUG, "WARNING channel %u unknown\n",
1168          ntohl (msg->chid));
1169     return;
1170   }
1171
1172   GMCH_handle_ack (ch, msg, fwd);
1173 }
1174
1175
1176
1177 /**
1178  * Handle a channel destruction message.
1179  *
1180  * @param t Tunnel on which the message came.
1181  * @param msg Channel destroy message.
1182  * @param fwd Is this message fwd? This only is meaningful in loopback channels.
1183  *            #GNUNET_YES if message is FWD on the respective channel (loopback)
1184  *            #GNUNET_NO if message is BCK on the respective channel (loopback)
1185  *            #GNUNET_SYSERR if message on a one-ended channel (remote)
1186  */
1187 static void
1188 handle_ch_destroy (struct MeshTunnel3 *t,
1189                    const struct GNUNET_MESH_ChannelManage *msg,
1190                    int fwd)
1191 {
1192   struct MeshChannel *ch;
1193   size_t size;
1194
1195   /* Check size */
1196   size = ntohs (msg->header.size);
1197   if (size != sizeof (struct GNUNET_MESH_ChannelManage))
1198   {
1199     GNUNET_break (0);
1200     return;
1201   }
1202
1203   /* Check channel */
1204   ch = GMT_get_channel (t, ntohl (msg->chid));
1205   if (NULL == ch)
1206   {
1207     /* Probably a retransmission, safe to ignore */
1208     return;
1209   }
1210
1211   GMCH_handle_destroy (ch, msg, fwd);
1212 }
1213
1214
1215 /**
1216  * The peer's ephemeral key has changed: update the symmetrical keys.
1217  *
1218  * @param t Tunnel this message came on.
1219  * @param msg Key eXchange message.
1220  */
1221 static void
1222 handle_ephemeral (struct MeshTunnel3 *t,
1223                   const struct GNUNET_MESH_KX_Ephemeral *msg)
1224 {
1225   struct GNUNET_HashCode km;
1226   LOG (GNUNET_ERROR_TYPE_DEBUG, "  ephemeral key message\n");
1227
1228   if (GNUNET_OK != check_ephemeral (t, msg))
1229   {
1230     GNUNET_break_op (0);
1231     return;
1232   }
1233   derive_key_material (&km, &msg->ephemeral_key);
1234   LOG (GNUNET_ERROR_TYPE_DEBUG, "  km is %s\n", GNUNET_h2s (&km));
1235   derive_symmertic (&t->e_key, &my_full_id, GMP_get_id (t->peer), &km);
1236   derive_symmertic (&t->d_key, GMP_get_id (t->peer), &my_full_id, &km);
1237   if (MESH_TUNNEL3_KEY_SENT == t->estate)
1238   {
1239     LOG (GNUNET_ERROR_TYPE_DEBUG, "  our key was sent, send ping\n");
1240     send_ping (t);
1241     t->estate = MESH_TUNNEL3_KEY_PING;
1242   }
1243 }
1244
1245
1246 /**
1247  * Peer wants to check our symmetrical keys by sending an encrypted challenge.
1248  * Answer with by retransmitting the challenge with the "opposite" key.
1249  *
1250  * @param t Tunnel this message came on.
1251  * @param msg Key eXchange Ping message.
1252  */
1253 static void
1254 handle_ping (struct MeshTunnel3 *t,
1255              const struct GNUNET_MESH_KX_Ping *msg)
1256 {
1257   struct GNUNET_MESH_KX_Ping res;
1258
1259   if (ntohs (msg->header.size) != sizeof (res))
1260   {
1261     GNUNET_break_op (0);
1262     return;
1263   }
1264
1265   LOG (GNUNET_ERROR_TYPE_DEBUG, "  ping message\n");
1266   t_decrypt (t, &res.target, &msg->target, ping_encryption_size (), msg->iv);
1267   if (0 != memcmp (&my_full_id, &res.target, sizeof (my_full_id)))
1268   {
1269     GNUNET_break_op (0);
1270     LOG (GNUNET_ERROR_TYPE_DEBUG, "  e got %u\n", msg->nonce);
1271     LOG (GNUNET_ERROR_TYPE_DEBUG, "  e towards %s\n", GNUNET_i2s (&msg->target));
1272     LOG (GNUNET_ERROR_TYPE_DEBUG, "  got %u\n", res.nonce);
1273     LOG (GNUNET_ERROR_TYPE_DEBUG, "  towards %s\n", GNUNET_i2s (&res.target));
1274     return;
1275   }
1276
1277   send_pong (t, res.nonce);
1278 }
1279
1280
1281 /**
1282  * Peer has answer to our challenge.
1283  * If answer is successful, consider the key exchange finished and clean
1284  * up all related state.
1285  *
1286  * @param t Tunnel this message came on.
1287  * @param msg Key eXchange Pong message.
1288  */
1289 static void
1290 handle_pong (struct MeshTunnel3 *t,
1291              const struct GNUNET_MESH_KX_Pong *msg)
1292 {
1293   uint32_t challenge;
1294
1295   LOG (GNUNET_ERROR_TYPE_DEBUG, "PONG received\n");
1296   if (GNUNET_SCHEDULER_NO_TASK == t->rekey_task)
1297   {
1298     GNUNET_break_op (0);
1299     return;
1300   }
1301   t_decrypt (t, &challenge, &msg->nonce, sizeof (uint32_t), msg->iv);
1302
1303   if (challenge != t->kx_ctx->challenge)
1304   {
1305     LOG (GNUNET_ERROR_TYPE_DEBUG,
1306          "Wrong PONG challenge: %u (e: %u). Expected: %u.\n",
1307          challenge, msg->nonce, t->kx_ctx->challenge);
1308     GNUNET_break_op (0);
1309     return;
1310   }
1311   GNUNET_SCHEDULER_cancel (t->rekey_task);
1312   t->rekey_task = GNUNET_SCHEDULER_NO_TASK;
1313   GNUNET_free (t->kx_ctx);
1314   t->kx_ctx = NULL;
1315   GMT_change_estate (t, MESH_TUNNEL3_KEY_OK);
1316 }
1317
1318
1319 /**
1320  * Demultiplex by message type and call appropriate handler for a message
1321  * towards a channel of a local tunnel.
1322  *
1323  * @param t Tunnel this message came on.
1324  * @param msgh Message header.
1325  * @param fwd Is this message fwd? This only is meaningful in loopback channels.
1326  *            #GNUNET_YES if message is FWD on the respective channel (loopback)
1327  *            #GNUNET_NO if message is BCK on the respective channel (loopback)
1328  *            #GNUNET_SYSERR if message on a one-ended channel (remote)
1329  */
1330 static void
1331 handle_decrypted (struct MeshTunnel3 *t,
1332                   const struct GNUNET_MessageHeader *msgh,
1333                   int fwd)
1334 {
1335   uint16_t type;
1336
1337   type = ntohs (msgh->type);
1338   LOG (GNUNET_ERROR_TYPE_DEBUG,
1339        "Got a %s message!\n",
1340        GM_m2s (type));
1341
1342   switch (type)
1343   {
1344     case GNUNET_MESSAGE_TYPE_MESH_DATA:
1345       /* Don't send hop ACK, wait for client to ACK */
1346       handle_data (t, (struct GNUNET_MESH_Data *) msgh, fwd);
1347       break;
1348
1349     case GNUNET_MESSAGE_TYPE_MESH_DATA_ACK:
1350       handle_data_ack (t, (struct GNUNET_MESH_DataACK *) msgh, fwd);
1351       break;
1352
1353     case GNUNET_MESSAGE_TYPE_MESH_CHANNEL_CREATE:
1354       handle_ch_create (t,
1355                         (struct GNUNET_MESH_ChannelCreate *) msgh);
1356       break;
1357
1358     case GNUNET_MESSAGE_TYPE_MESH_CHANNEL_NACK:
1359       handle_ch_nack (t,
1360                       (struct GNUNET_MESH_ChannelManage *) msgh);
1361       break;
1362
1363     case GNUNET_MESSAGE_TYPE_MESH_CHANNEL_ACK:
1364       handle_ch_ack (t,
1365                      (struct GNUNET_MESH_ChannelManage *) msgh,
1366                      fwd);
1367       break;
1368
1369     case GNUNET_MESSAGE_TYPE_MESH_CHANNEL_DESTROY:
1370       handle_ch_destroy (t,
1371                          (struct GNUNET_MESH_ChannelManage *) msgh,
1372                          fwd);
1373       break;
1374
1375     default:
1376       GNUNET_break_op (0);
1377       LOG (GNUNET_ERROR_TYPE_DEBUG,
1378            "end-to-end message not known (%u)\n",
1379            ntohs (msgh->type));
1380   }
1381 }
1382
1383 /******************************************************************************/
1384 /********************************    API    ***********************************/
1385 /******************************************************************************/
1386
1387 /**
1388  * Decrypt and demultiplex by message type. Call appropriate handler
1389  * for every message.
1390  *
1391  * @param t Tunnel this message came on.
1392  * @param msg Encrypted message.
1393  */
1394 void
1395 GMT_handle_encrypted (struct MeshTunnel3 *t,
1396                       const struct GNUNET_MESH_Encrypted *msg)
1397 {
1398   size_t size = ntohs (msg->header.size);
1399   size_t payload_size = size - sizeof (struct GNUNET_MESH_Encrypted);
1400   size_t decrypted_size;
1401   char cbuf [payload_size];
1402   struct GNUNET_MessageHeader *msgh;
1403   unsigned int off;
1404
1405   decrypted_size = t_decrypt (t, cbuf, &msg[1], payload_size, msg->iv);
1406   off = 0;
1407   while (off < decrypted_size)
1408   {
1409     msgh = (struct GNUNET_MessageHeader *) &cbuf[off];
1410     handle_decrypted (t, msgh, GNUNET_SYSERR);
1411     off += ntohs (msgh->size);
1412   }
1413 }
1414
1415
1416 /**
1417  * Demultiplex an encapsulated KX message by message type.
1418  *
1419  * @param t Tunnel on which the message came.
1420  * @param message Payload of KX message.
1421  */
1422 void
1423 GMT_handle_kx (struct MeshTunnel3 *t,
1424                const struct GNUNET_MessageHeader *message)
1425 {
1426   uint16_t type;
1427
1428   type = ntohs (message->type);
1429   LOG (GNUNET_ERROR_TYPE_DEBUG, "kx message received\n", type);
1430   switch (type)
1431   {
1432     case GNUNET_MESSAGE_TYPE_MESH_KX_EPHEMERAL:
1433       handle_ephemeral (t, (struct GNUNET_MESH_KX_Ephemeral *) message);
1434       break;
1435
1436     case GNUNET_MESSAGE_TYPE_MESH_KX_PING:
1437       handle_ping (t, (struct GNUNET_MESH_KX_Ping *) message);
1438       break;
1439
1440     case GNUNET_MESSAGE_TYPE_MESH_KX_PONG:
1441       handle_pong (t, (struct GNUNET_MESH_KX_Pong *) message);
1442       break;
1443
1444     default:
1445       GNUNET_break_op (0);
1446       LOG (GNUNET_ERROR_TYPE_DEBUG, "kx message not known (%u)\n", type);
1447   }
1448 }
1449
1450
1451 /**
1452  * Initialize the tunnel subsystem.
1453  *
1454  * @param c Configuration handle.
1455  * @param key ECC private key, to derive all other keys and do crypto.
1456  */
1457 void
1458 GMT_init (const struct GNUNET_CONFIGURATION_Handle *c,
1459           const struct GNUNET_CRYPTO_EddsaPrivateKey *key)
1460 {
1461   LOG (GNUNET_ERROR_TYPE_DEBUG, "init\n");
1462   if (GNUNET_OK !=
1463       GNUNET_CONFIGURATION_get_value_number (c, "MESH", "DEFAULT_TTL",
1464                                              &default_ttl))
1465   {
1466     GNUNET_log_config_invalid (GNUNET_ERROR_TYPE_WARNING,
1467                                "MESH", "DEFAULT_TTL", "USING DEFAULT");
1468     default_ttl = 64;
1469   }
1470   if (GNUNET_OK !=
1471       GNUNET_CONFIGURATION_get_value_time (c, "MESH", "REKEY_PERIOD",
1472                                            &rekey_period))
1473   {
1474     rekey_period = GNUNET_TIME_UNIT_DAYS;
1475   }
1476
1477   my_private_key = key;
1478   kx_msg.header.size = htons (sizeof (kx_msg));
1479   kx_msg.header.type = htons (GNUNET_MESSAGE_TYPE_MESH_KX_EPHEMERAL);
1480   kx_msg.purpose.purpose = htonl (GNUNET_SIGNATURE_PURPOSE_MESH_KX);
1481   kx_msg.purpose.size = htonl (ephemeral_purpose_size ());
1482   kx_msg.origin_identity = my_full_id;
1483   rekey_task = GNUNET_SCHEDULER_add_now (&rekey, NULL);
1484
1485   tunnels = GNUNET_CONTAINER_multipeermap_create (128, GNUNET_YES);
1486 }
1487
1488
1489 /**
1490  * Shut down the tunnel subsystem.
1491  */
1492 void
1493 GMT_shutdown (void)
1494 {
1495   if (GNUNET_SCHEDULER_NO_TASK != rekey_task)
1496   {
1497     GNUNET_SCHEDULER_cancel (rekey_task);
1498     rekey_task = GNUNET_SCHEDULER_NO_TASK;
1499   }
1500   GNUNET_CONTAINER_multipeermap_iterate (tunnels, &destroy_iterator, NULL);
1501   GNUNET_CONTAINER_multipeermap_destroy (tunnels);
1502 }
1503
1504
1505 /**
1506  * Create a tunnel.
1507  *
1508  * @param destination Peer this tunnel is towards.
1509  */
1510 struct MeshTunnel3 *
1511 GMT_new (struct MeshPeer *destination)
1512 {
1513   struct MeshTunnel3 *t;
1514
1515   t = GNUNET_new (struct MeshTunnel3);
1516   t->next_chid = 0;
1517   t->peer = destination;
1518
1519   if (GNUNET_OK !=
1520       GNUNET_CONTAINER_multipeermap_put (tunnels, GMP_get_id (destination), t,
1521                                          GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST))
1522   {
1523     GNUNET_break (0);
1524     GNUNET_free (t);
1525     return NULL;
1526   }
1527   return t;
1528 }
1529
1530
1531 /**
1532  * Change the tunnel's connection state.
1533  *
1534  * @param t Tunnel whose connection state to change.
1535  * @param cstate New connection state.
1536  */
1537 void
1538 GMT_change_cstate (struct MeshTunnel3* t, enum MeshTunnel3CState cstate)
1539 {
1540   if (NULL == t)
1541     return;
1542   LOG (GNUNET_ERROR_TYPE_DEBUG,
1543               "Tunnel %s cstate was %s\n",
1544               GMP_2s (t->peer), cstate2s (t->cstate));
1545   LOG (GNUNET_ERROR_TYPE_DEBUG,
1546               "Tunnel %s cstate is now %s\n",
1547               GMP_2s (t->peer), cstate2s (cstate));
1548   if (myid != GMP_get_short_id (t->peer) &&
1549       MESH_TUNNEL3_READY != t->cstate &&
1550       MESH_TUNNEL3_READY == cstate)
1551   {
1552     t->cstate = cstate;
1553     if (MESH_TUNNEL3_KEY_OK == t->estate)
1554     {
1555       LOG (GNUNET_ERROR_TYPE_DEBUG, "  triggered send queued data\n");
1556       send_queued_data (t);
1557     }
1558     else if (MESH_TUNNEL3_KEY_UNINITIALIZED == t->estate)
1559     {
1560       LOG (GNUNET_ERROR_TYPE_DEBUG, "  triggered rekey\n");
1561       rekey_tunnel (t, NULL);
1562     }
1563   }
1564   t->cstate = cstate;
1565
1566   if (MESH_TUNNEL3_READY == cstate && 3 <= GMT_count_connections (t))
1567   {
1568     GMP_stop_search (t->peer);
1569   }
1570 }
1571
1572 /**
1573  * Change the tunnel encryption state.
1574  *
1575  * @param t Tunnel whose encryption state to change.
1576  * @param state New encryption state.
1577  */
1578 void
1579 GMT_change_estate (struct MeshTunnel3* t, enum MeshTunnel3EState state)
1580 {
1581   if (NULL == t)
1582     return;
1583   LOG (GNUNET_ERROR_TYPE_DEBUG,
1584        "Tunnel %s estate was %s\n",
1585        GMP_2s (t->peer), estate2s (t->estate));
1586   LOG (GNUNET_ERROR_TYPE_DEBUG,
1587        "Tunnel %s estate is now %s\n",
1588        GMP_2s (t->peer), estate2s (state));
1589   if (myid != GMP_get_short_id (t->peer) &&
1590       MESH_TUNNEL3_KEY_OK != t->estate && MESH_TUNNEL3_KEY_OK == state)
1591   {
1592     t->estate = state;
1593     send_queued_data (t);
1594     return;
1595   }
1596   t->estate = state;
1597 }
1598
1599
1600 /**
1601  * Add a connection to a tunnel.
1602  *
1603  * @param t Tunnel.
1604  * @param c Connection.
1605  */
1606 void
1607 GMT_add_connection (struct MeshTunnel3 *t, struct MeshConnection *c)
1608 {
1609   struct MeshTConnection *aux;
1610
1611   GNUNET_assert (NULL != c);
1612
1613   for (aux = t->connection_head; aux != NULL; aux = aux->next)
1614     if (aux->c == c)
1615       return;
1616
1617   aux = GNUNET_new (struct MeshTConnection);
1618   aux->c = c;
1619   GNUNET_CONTAINER_DLL_insert_tail (t->connection_head, t->connection_tail, aux);
1620 }
1621
1622
1623 /**
1624  * Remove a connection from a tunnel.
1625  *
1626  * @param t Tunnel.
1627  * @param c Connection.
1628  */
1629 void
1630 GMT_remove_connection (struct MeshTunnel3 *t, struct MeshConnection *c)
1631 {
1632   struct MeshTConnection *aux;
1633
1634   for (aux = t->connection_head; aux != NULL; aux = aux->next)
1635     if (aux->c == c)
1636     {
1637       GNUNET_CONTAINER_DLL_remove (t->connection_head, t->connection_tail, aux);
1638       GNUNET_free (aux);
1639       return;
1640     }
1641 }
1642
1643
1644 /**
1645  * Add a channel to a tunnel.
1646  *
1647  * @param t Tunnel.
1648  * @param ch Channel.
1649  */
1650 void
1651 GMT_add_channel (struct MeshTunnel3 *t, struct MeshChannel *ch)
1652 {
1653   struct MeshTChannel *aux;
1654
1655   GNUNET_assert (NULL != ch);
1656
1657   LOG (GNUNET_ERROR_TYPE_DEBUG, "Adding channel %p to tunnel %p\n", ch, t);
1658
1659   for (aux = t->channel_head; aux != NULL; aux = aux->next)
1660   {
1661     LOG (GNUNET_ERROR_TYPE_DEBUG, "  already there %p\n", aux->ch);
1662     if (aux->ch == ch)
1663       return;
1664   }
1665
1666   aux = GNUNET_new (struct MeshTChannel);
1667   aux->ch = ch;
1668   LOG (GNUNET_ERROR_TYPE_DEBUG, " adding %p to %p\n", aux, t->channel_head);
1669   GNUNET_CONTAINER_DLL_insert_tail (t->channel_head, t->channel_tail, aux);
1670
1671   if (GNUNET_YES == t->destroy)
1672   {
1673     t->destroy = GNUNET_NO;
1674     LOG (GNUNET_ERROR_TYPE_DEBUG, " undo destroy!\n");
1675   }
1676 }
1677
1678
1679 /**
1680  * Remove a channel from a tunnel.
1681  *
1682  * @param t Tunnel.
1683  * @param ch Channel.
1684  */
1685 void
1686 GMT_remove_channel (struct MeshTunnel3 *t, struct MeshChannel *ch)
1687 {
1688   struct MeshTChannel *aux;
1689
1690   LOG (GNUNET_ERROR_TYPE_DEBUG, "Removing channel %p from tunnel %p\n", ch, t);
1691   for (aux = t->channel_head; aux != NULL; aux = aux->next)
1692   {
1693     if (aux->ch == ch)
1694     {
1695       LOG (GNUNET_ERROR_TYPE_DEBUG, " found! %s\n", GMCH_2s (ch));
1696       GNUNET_CONTAINER_DLL_remove (t->channel_head, t->channel_tail, aux);
1697       GNUNET_free (aux);
1698       return;
1699     }
1700   }
1701 }
1702
1703
1704 /**
1705  * Search for a channel by global ID.
1706  *
1707  * @param t Tunnel containing the channel.
1708  * @param chid Public channel number.
1709  *
1710  * @return channel handler, NULL if doesn't exist
1711  */
1712 struct MeshChannel *
1713 GMT_get_channel (struct MeshTunnel3 *t, MESH_ChannelNumber chid)
1714 {
1715   struct MeshTChannel *iter;
1716
1717   if (NULL == t)
1718     return NULL;
1719
1720   for (iter = t->channel_head; NULL != iter; iter = iter->next)
1721   {
1722     if (GMCH_get_id (iter->ch) == chid)
1723       break;
1724   }
1725
1726   return NULL == iter ? NULL : iter->ch;
1727 }
1728
1729
1730 /**
1731  * Tunnel is empty: destroy it.
1732  *
1733  * Notifies all connections about the destruction.
1734  *
1735  * @param t Tunnel to destroy.
1736  */
1737 void
1738 GMT_destroy_empty (struct MeshTunnel3 *t)
1739 {
1740   struct MeshTConnection *iter;
1741
1742   LOG (GNUNET_ERROR_TYPE_DEBUG, "Tunnel empty: destroying scheduled\n");
1743   for (iter = t->connection_head; NULL != iter; iter = iter->next)
1744   {
1745     GMC_send_destroy (iter->c);
1746   }
1747
1748   t->cstate = MESH_TUNNEL3_NEW;
1749   t->destroy = GNUNET_YES;
1750 }
1751
1752
1753 /**
1754  * Destroy tunnel if empty (no more channels).
1755  *
1756  * @param t Tunnel to destroy if empty.
1757  */
1758 void
1759 GMT_destroy_if_empty (struct MeshTunnel3 *t)
1760 {
1761   if (1 < GMT_count_channels (t))
1762     return;
1763
1764   GMT_destroy_empty (t);
1765 }
1766
1767
1768 /**
1769  * Destroy the tunnel.
1770  *
1771  * This function does not generate any warning traffic to clients or peers.
1772  *
1773  * Tasks:
1774  * Cancel messages belonging to this tunnel queued to neighbors.
1775  * Free any allocated resources linked to the tunnel.
1776  *
1777  * @param t The tunnel to destroy.
1778  */
1779 void
1780 GMT_destroy (struct MeshTunnel3 *t)
1781 {
1782   struct MeshTConnection *iter_c;
1783   struct MeshTConnection *next_c;
1784   struct MeshTChannel *iter_ch;
1785   struct MeshTChannel *next_ch;
1786
1787   if (NULL == t)
1788     return;
1789
1790   LOG (GNUNET_ERROR_TYPE_DEBUG, "destroying tunnel %s\n", GMP_2s (t->peer));
1791
1792   GNUNET_break (GNUNET_YES ==
1793                 GNUNET_CONTAINER_multipeermap_remove (tunnels,
1794                                                       GMP_get_id (t->peer), t));
1795
1796   for (iter_c = t->connection_head; NULL != iter_c; iter_c = next_c)
1797   {
1798     next_c = iter_c->next;
1799     GMC_destroy (iter_c->c);
1800   }
1801   for (iter_ch = t->channel_head; NULL != iter_ch; iter_ch = next_ch)
1802   {
1803     next_ch = iter_ch->next;
1804     GMCH_destroy (iter_ch->ch);
1805     /* Should only happen on shutdown, but it's ok. */
1806   }
1807
1808   GNUNET_STATISTICS_update (stats, "# tunnels", -1, GNUNET_NO);
1809   GMP_set_tunnel (t->peer, NULL);
1810
1811   if (GNUNET_SCHEDULER_NO_TASK != t->rekey_task)
1812     GNUNET_SCHEDULER_cancel (t->rekey_task);
1813
1814   GNUNET_free (t);
1815 }
1816
1817
1818 /**
1819  * @brief Use the given path for the tunnel.
1820  * Update the next and prev hops (and RCs).
1821  * (Re)start the path refresh in case the tunnel is locally owned.
1822  *
1823  * @param t Tunnel to update.
1824  * @param p Path to use.
1825  *
1826  * @return Connection created.
1827  */
1828 struct MeshConnection *
1829 GMT_use_path (struct MeshTunnel3 *t, struct MeshPeerPath *p)
1830 {
1831   struct MeshConnection *c;
1832   struct GNUNET_HashCode cid;
1833   unsigned int own_pos;
1834
1835   if (NULL == t || NULL == p)
1836   {
1837     GNUNET_break (0);
1838     return NULL;
1839   }
1840
1841   for (own_pos = 0; own_pos < p->length; own_pos++)
1842   {
1843     if (p->peers[own_pos] == myid)
1844       break;
1845   }
1846   if (own_pos > p->length - 1)
1847   {
1848     GNUNET_break (0);
1849     return NULL;
1850   }
1851
1852   GNUNET_CRYPTO_hash_create_random (GNUNET_CRYPTO_QUALITY_NONCE, &cid);
1853   c = GMC_new (&cid, t, p, own_pos);
1854   if (NULL == c)
1855   {
1856     /* Path was flawed */
1857     return NULL;
1858   }
1859   GMT_add_connection (t, c);
1860   return c;
1861 }
1862
1863
1864 /**
1865  * Count established (ready) connections of a tunnel.
1866  *
1867  * @param t Tunnel on which to count.
1868  *
1869  * @return Number of connections.
1870  */
1871 unsigned int
1872 GMT_count_connections (struct MeshTunnel3 *t)
1873 {
1874   struct MeshTConnection *iter;
1875   unsigned int count;
1876
1877   for (count = 0, iter = t->connection_head;
1878        NULL != iter;
1879        iter = iter->next, count++);
1880
1881   return count;
1882 }
1883
1884 /**
1885  * Count channels of a tunnel.
1886  *
1887  * @param t Tunnel on which to count.
1888  *
1889  * @return Number of channels.
1890  */
1891 unsigned int
1892 GMT_count_channels (struct MeshTunnel3 *t)
1893 {
1894   struct MeshTChannel *iter;
1895   unsigned int count;
1896
1897   for (count = 0, iter = t->channel_head;
1898        NULL != iter;
1899        iter = iter->next, count++) /* skip */;
1900
1901   return count;
1902 }
1903
1904
1905 /**
1906  * Get the connectivity state of a tunnel.
1907  *
1908  * @param t Tunnel.
1909  *
1910  * @return Tunnel's connectivity state.
1911  */
1912 enum MeshTunnel3CState
1913 GMT_get_cstate (struct MeshTunnel3 *t)
1914 {
1915   if (NULL == t)
1916   {
1917     GNUNET_break (0);
1918     return (enum MeshTunnel3CState) -1;
1919   }
1920   return t->cstate;
1921 }
1922
1923
1924 /**
1925  * Get the maximum buffer space for a tunnel towards a local client.
1926  *
1927  * @param t Tunnel.
1928  *
1929  * @return Biggest buffer space offered by any channel in the tunnel.
1930  */
1931 unsigned int
1932 GMT_get_channels_buffer (struct MeshTunnel3 *t)
1933 {
1934   struct MeshTChannel *iter;
1935   unsigned int buffer;
1936   unsigned int ch_buf;
1937
1938   if (NULL == t->channel_head)
1939   {
1940     /* Probably getting buffer for a channel create/handshake. */
1941     return 64;
1942   }
1943
1944   buffer = 0;
1945   for (iter = t->channel_head; NULL != iter; iter = iter->next)
1946   {
1947     ch_buf = get_channel_buffer (iter);
1948     if (ch_buf > buffer)
1949       buffer = ch_buf;
1950   }
1951   return buffer;
1952 }
1953
1954
1955 /**
1956  * Get the total buffer space for a tunnel for P2P traffic.
1957  *
1958  * @param t Tunnel.
1959  *
1960  * @return Buffer space offered by all connections in the tunnel.
1961  */
1962 unsigned int
1963 GMT_get_connections_buffer (struct MeshTunnel3 *t)
1964 {
1965   struct MeshTConnection *iter;
1966   unsigned int buffer;
1967
1968   buffer = 0;
1969   for (iter = t->connection_head; NULL != iter; iter = iter->next)
1970   {
1971     if (GMC_get_state (iter->c) != MESH_CONNECTION_READY)
1972     {
1973       iter = iter->next;
1974       continue;
1975     }
1976     buffer += get_connection_buffer (iter);
1977   }
1978
1979   return buffer;
1980 }
1981
1982
1983 /**
1984  * Get the tunnel's destination.
1985  *
1986  * @param t Tunnel.
1987  *
1988  * @return ID of the destination peer.
1989  */
1990 const struct GNUNET_PeerIdentity *
1991 GMT_get_destination (struct MeshTunnel3 *t)
1992 {
1993   return GMP_get_id (t->peer);
1994 }
1995
1996
1997 /**
1998  * Get the tunnel's next free global channel ID.
1999  *
2000  * @param t Tunnel.
2001  *
2002  * @return GID of a channel free to use.
2003  */
2004 MESH_ChannelNumber
2005 GMT_get_next_chid (struct MeshTunnel3 *t)
2006 {
2007   MESH_ChannelNumber chid;
2008   MESH_ChannelNumber mask;
2009   int result;
2010
2011   /* Set bit 30 depending on the ID relationship. Bit 31 is always 0 for GID.
2012    * If our ID is bigger or loopback tunnel, start at 0, bit 30 = 0
2013    * If peer's ID is bigger, start at 0x4... bit 30 = 1
2014    */
2015   result = GNUNET_CRYPTO_cmp_peer_identity (&my_full_id, GMP_get_id (t->peer));
2016   if (0 > result)
2017     mask = 0x4000000;
2018   else
2019     mask = 0x0;
2020
2021   while (NULL != GMT_get_channel (t, t->next_chid))
2022   {
2023     LOG (GNUNET_ERROR_TYPE_DEBUG, "Channel %u exists...\n", t->next_chid);
2024     t->next_chid = (t->next_chid + 1) & ~GNUNET_MESH_LOCAL_CHANNEL_ID_CLI;
2025     t->next_chid |= mask;
2026   }
2027   chid = t->next_chid;
2028   t->next_chid = (t->next_chid + 1) & ~GNUNET_MESH_LOCAL_CHANNEL_ID_CLI;
2029   t->next_chid |= mask;
2030
2031   return chid;
2032 }
2033
2034
2035 /**
2036  * Send ACK on one or more channels due to buffer in connections.
2037  *
2038  * @param t Channel which has some free buffer space.
2039  */
2040 void
2041 GMT_unchoke_channels (struct MeshTunnel3 *t)
2042 {
2043   struct MeshTChannel *iter;
2044   unsigned int buffer;
2045   unsigned int channels = GMT_count_channels (t);
2046   unsigned int choked_n;
2047   struct MeshChannel *choked[channels];
2048
2049   LOG (GNUNET_ERROR_TYPE_DEBUG, "GMT_unchoke_channels on %s\n", GMT_2s (t));
2050   LOG (GNUNET_ERROR_TYPE_DEBUG, " head: %p\n", t->channel_head);
2051   if (NULL != t->channel_head)
2052     LOG (GNUNET_ERROR_TYPE_DEBUG, " head ch: %p\n", t->channel_head->ch);
2053
2054   /* Get buffer space */
2055   buffer = GMT_get_connections_buffer (t);
2056   if (0 == buffer)
2057   {
2058     return;
2059   }
2060
2061   /* Count and remember choked channels */
2062   choked_n = 0;
2063   for (iter = t->channel_head; NULL != iter; iter = iter->next)
2064   {
2065     if (GNUNET_NO == get_channel_allowed (iter))
2066     {
2067       choked[choked_n++] = iter->ch;
2068     }
2069   }
2070
2071   /* Unchoke random channels */
2072   while (0 < buffer && 0 < choked_n)
2073   {
2074     unsigned int r = GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_WEAK,
2075                                                choked_n);
2076     GMCH_allow_client (choked[r], GMCH_is_origin (choked[r], GNUNET_YES));
2077     choked_n--;
2078     buffer--;
2079     choked[r] = choked[choked_n];
2080   }
2081 }
2082
2083
2084 /**
2085  * Send ACK on one or more connections due to buffer space to the client.
2086  *
2087  * Iterates all connections of the tunnel and sends ACKs appropriately.
2088  *
2089  * @param t Tunnel.
2090  */
2091 void
2092 GMT_send_connection_acks (struct MeshTunnel3 *t)
2093 {
2094   struct MeshTConnection *iter;
2095   uint32_t allowed;
2096   uint32_t to_allow;
2097   uint32_t allow_per_connection;
2098   unsigned int cs;
2099   unsigned int buffer;
2100
2101   LOG (GNUNET_ERROR_TYPE_DEBUG,
2102        "Tunnel send connection ACKs on %s\n",
2103        GMT_2s (t));
2104
2105   if (NULL == t)
2106   {
2107     GNUNET_break (0);
2108     return;
2109   }
2110
2111   buffer = GMT_get_channels_buffer (t);
2112
2113   /* Count connections, how many messages are already allowed */
2114   cs = GMT_count_connections (t);
2115   for (allowed = 0, iter = t->connection_head; NULL != iter; iter = iter->next)
2116   {
2117     allowed += get_connection_allowed (iter);
2118   }
2119
2120   /* Make sure there is no overflow */
2121   if (allowed > buffer)
2122   {
2123     return;
2124   }
2125
2126   /* Authorize connections to send more data */
2127   to_allow = buffer; /* - allowed; */
2128
2129   for (iter = t->connection_head; NULL != iter && to_allow > 0; iter = iter->next)
2130   {
2131     allow_per_connection = to_allow/cs;
2132     to_allow -= allow_per_connection;
2133     cs--;
2134     if (get_connection_allowed (iter) > 64 / 3)
2135     {
2136       continue;
2137     }
2138     GMC_allow (iter->c, buffer, GMC_is_origin (iter->c, GNUNET_YES));
2139   }
2140
2141   GNUNET_break (to_allow == 0);
2142 }
2143
2144
2145 /**
2146  * Callback called when a queued message is sent.
2147  *
2148  * Calculates the average time and connection packet tracking.
2149  *
2150  * @param cls Closure (TunnelQueue handle).
2151  * @param c Connection this message was on.
2152  * @param q Connection queue handle (unused).
2153  * @param type Type of message sent.
2154  * @param fwd Was this a FWD going message?
2155  * @param size Size of the message.
2156  */
2157 static void
2158 message_sent (void *cls,
2159               struct MeshConnection *c,
2160               struct MeshConnectionQueue *q,
2161               uint16_t type, int fwd, size_t size)
2162 {
2163   struct MeshTunnel3Queue *qt = cls;
2164
2165   GNUNET_assert (NULL != qt->cont);
2166   qt->cont (qt->cont_cls, GMC_get_tunnel (c), qt, type, size);
2167   GNUNET_free (qt);
2168 }
2169
2170
2171 /**
2172  * Cancel a previously sent message while it's in the queue.
2173  *
2174  * ONLY can be called before the continuation given to the send function
2175  * is called. Once the continuation is called, the message is no longer in the
2176  * queue.
2177  *
2178  * @param q Handle to the queue.
2179  */
2180 void
2181 GMT_cancel (struct MeshTunnel3Queue *q)
2182 {
2183   if (NULL != q->q)
2184   {
2185     GMC_cancel (q->q);
2186     /* message_sent() will be called and free q */
2187   }
2188   else if (NULL != q->tq)
2189   {
2190     unqueue_data (q->tq);
2191   }
2192   else
2193   {
2194     GNUNET_break (0);
2195   }
2196 }
2197
2198
2199 /**
2200  * Sends an already built message on a tunnel, encrypting it and
2201  * choosing the best connection.
2202  *
2203  * @param message Message to send. Function modifies it.
2204  * @param t Tunnel on which this message is transmitted.
2205  * @param ch Channel on which this message is transmitted.
2206  * @param force Force the tunnel to take the message (buffer overfill).
2207  * @param cont Continuation to call once message is really sent.
2208  * @param cont_cls Closure for @c cont.
2209  *
2210  * @return Handle to cancel message. NULL if @c cont is NULL.
2211  */
2212 struct MeshTunnel3Queue *
2213 GMT_send_prebuilt_message (const struct GNUNET_MessageHeader *message,
2214                            struct MeshTunnel3 *t, struct MeshChannel *ch,
2215                            int force,
2216                            GMT_sent cont, void *cont_cls)
2217 {
2218   struct MeshTunnel3Queue *q;
2219   struct MeshConnection *c;
2220   struct GNUNET_MESH_Encrypted *msg;
2221   size_t size = ntohs (message->size);
2222   size_t encrypted_size;
2223   char cbuf[sizeof (struct GNUNET_MESH_Encrypted) + size];
2224   uint32_t iv;
2225   uint16_t type;
2226   int fwd;
2227
2228   LOG (GNUNET_ERROR_TYPE_DEBUG, "GMT Send on Tunnel %s\n", GMT_2s (t));
2229
2230   if (GNUNET_NO == is_ready (t))
2231   {
2232     q = GNUNET_new (struct MeshTunnel3Queue);
2233     q->tq = queue_data (t, ch, message);
2234     return q;
2235   }
2236
2237   GNUNET_assert (GNUNET_NO == GMT_is_loopback (t));
2238
2239   iv = GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_NONCE, UINT32_MAX);
2240   msg = (struct GNUNET_MESH_Encrypted *) cbuf;
2241   msg->header.type = htons (GNUNET_MESSAGE_TYPE_MESH_ENCRYPTED);
2242   msg->iv = iv;
2243   encrypted_size = t_encrypt (t, &msg[1], message, size, iv);
2244   msg->header.size = htons (sizeof (struct GNUNET_MESH_Encrypted) + encrypted_size);
2245   c = tunnel_get_connection (t);
2246   if (NULL == c)
2247   {
2248     GNUNET_break (GNUNET_YES == t->destroy);
2249     return NULL;
2250   }
2251   type = ntohs (message->type);
2252   switch (type)
2253   {
2254     case GNUNET_MESSAGE_TYPE_MESH_DATA:
2255     case GNUNET_MESSAGE_TYPE_MESH_DATA_ACK:
2256     case GNUNET_MESSAGE_TYPE_MESH_CHANNEL_CREATE:
2257     case GNUNET_MESSAGE_TYPE_MESH_CHANNEL_DESTROY:
2258     case GNUNET_MESSAGE_TYPE_MESH_CHANNEL_ACK:
2259       msg->cid = *GMC_get_id (c);
2260       msg->ttl = htonl (default_ttl);
2261       break;
2262     default:
2263       LOG (GNUNET_ERROR_TYPE_DEBUG, "unkown type %s\n",
2264            GM_m2s (type));
2265       GNUNET_break (0);
2266   }
2267
2268   fwd = GMC_is_origin (c, GNUNET_YES);
2269
2270   if (NULL == cont)
2271   {
2272     (void) GMC_send_prebuilt_message (&msg->header, c, fwd, force, NULL, NULL);
2273     return NULL;
2274   }
2275   q = GNUNET_new (struct MeshTunnel3Queue); /* FIXME valgrind: leak*/
2276   q->q = GMC_send_prebuilt_message (&msg->header, c, fwd, force,
2277                                     &message_sent, q);
2278   q->cont = cont;
2279   q->cont_cls = cont_cls;
2280
2281   return q;
2282 }
2283
2284 /**
2285  * Is the tunnel directed towards the local peer?
2286  *
2287  * @param t Tunnel.
2288  *
2289  * @return #GNUNET_YES if it is loopback.
2290  */
2291 int
2292 GMT_is_loopback (const struct MeshTunnel3 *t)
2293 {
2294   return (myid == GMP_get_short_id (t->peer));
2295 }
2296
2297
2298 /**
2299  * Is the tunnel this path already?
2300  *
2301  * @param t Tunnel.
2302  * @param p Path.
2303  *
2304  * @return #GNUNET_YES a connection uses this path.
2305  */
2306 int
2307 GMT_is_path_used (const struct MeshTunnel3 *t, const struct MeshPeerPath *p)
2308 {
2309   struct MeshTConnection *iter;
2310
2311   for (iter = t->connection_head; NULL != iter; iter = iter->next)
2312     if (GMC_get_path (iter->c) == p)
2313       return GNUNET_YES;
2314
2315   return GNUNET_NO;
2316 }
2317
2318
2319 /**
2320  * Get a cost of a path for a tunnel considering existing connections.
2321  *
2322  * @param t Tunnel.
2323  * @param path Candidate path.
2324  *
2325  * @return Cost of the path (path length + number of overlapping nodes)
2326  */
2327 unsigned int
2328 GMT_get_path_cost (const struct MeshTunnel3 *t,
2329                    const struct MeshPeerPath *path)
2330 {
2331   struct MeshTConnection *iter;
2332   const struct MeshPeerPath *aux;
2333   unsigned int overlap;
2334   unsigned int i;
2335   unsigned int j;
2336
2337   if (NULL == path)
2338     return 0;
2339
2340   overlap = 0;
2341   GNUNET_assert (NULL != t);
2342
2343   for (i = 0; i < path->length; i++)
2344   {
2345     for (iter = t->connection_head; NULL != iter; iter = iter->next)
2346     {
2347       aux = GMC_get_path (iter->c);
2348       if (NULL == aux)
2349         continue;
2350
2351       for (j = 0; j < aux->length; j++)
2352       {
2353         if (path->peers[i] == aux->peers[j])
2354         {
2355           overlap++;
2356           break;
2357         }
2358       }
2359     }
2360   }
2361   return (path->length + overlap) * (path->score * -1);
2362 }
2363
2364
2365 /**
2366  * Get the static string for the peer this tunnel is directed.
2367  *
2368  * @param t Tunnel.
2369  *
2370  * @return Static string the destination peer's ID.
2371  */
2372 const char *
2373 GMT_2s (const struct MeshTunnel3 *t)
2374 {
2375   if (NULL == t)
2376     return "(NULL)";
2377
2378   return GMP_2s (t->peer);
2379 }