- clean up API
[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_enc.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, 30)
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.
86      */
87   enum MeshTunnel3State state;
88
89   /**
90    * Key eXchange context.
91    */
92   struct MeshTunnelKXCtx *kx_ctx;
93
94   /**
95    * Encryption ("our") key.
96    */
97   struct GNUNET_CRYPTO_SymmetricSessionKey e_key;
98
99   /**
100    * Decryption ("their") key.
101    */
102   struct GNUNET_CRYPTO_SymmetricSessionKey d_key;
103
104   /**
105    * Task to start the rekey process.
106    */
107   GNUNET_SCHEDULER_TaskIdentifier rekey_task;
108
109   /**
110    * Paths that are actively used to reach the destination peer.
111    */
112   struct MeshTConnection *connection_head;
113   struct MeshTConnection *connection_tail;
114
115   /**
116    * Next connection number.
117    */
118   uint32_t next_cid;
119
120   /**
121    * Channels inside this tunnel.
122    */
123   struct MeshTChannel *channel_head;
124   struct MeshTChannel *channel_tail;
125
126   /**
127    * Channel ID for the next created channel.
128    */
129   MESH_ChannelNumber next_chid;
130
131   /**
132    * Destroy flag: if true, destroy on last message.
133    */
134   int destroy;
135
136   /**
137    * Queued messages, to transmit once tunnel gets connected.
138    */
139   struct MeshTunnelQueue *tq_head;
140   struct MeshTunnelQueue *tq_tail;
141 };
142
143
144 /**
145  * Struct used to queue messages in a tunnel.
146  */
147 struct MeshTunnelQueue
148 {
149   /**
150    * DLL
151    */
152   struct MeshTunnelQueue *next;
153   struct MeshTunnelQueue *prev;
154
155   /**
156    * Channel.
157    */
158   struct MeshChannel *ch;
159
160   /**
161    * Message to send.
162    */
163   /* struct GNUNET_MessageHeader *msg; */
164 };
165
166
167 /******************************************************************************/
168 /*******************************   GLOBALS  ***********************************/
169 /******************************************************************************/
170
171 /**
172  * Global handle to the statistics service.
173  */
174 extern struct GNUNET_STATISTICS_Handle *stats;
175
176 /**
177  * Local peer own ID (memory efficient handle).
178  */
179 extern GNUNET_PEER_Id myid;
180
181 /**
182  * Local peer own ID (full value).
183  */
184 extern struct GNUNET_PeerIdentity my_full_id;
185
186
187 /**
188  * Set of all tunnels, in order to trigger a new exchange on rekey.
189  * Indexed by peer's ID.
190  */
191 static struct GNUNET_CONTAINER_MultiPeerMap *tunnels;
192
193 /**
194  * Default TTL for payload packets.
195  */
196 static unsigned long long default_ttl;
197
198 /**
199  * Own private key.
200  */
201 const static struct GNUNET_CRYPTO_EddsaPrivateKey *my_private_key;
202
203 /**
204  * Own ephemeral private key.
205  */
206 static struct GNUNET_CRYPTO_EcdhePrivateKey *my_ephemeral_key;
207
208 /**
209  * Cached message used to perform a key exchange.
210  */
211 static struct GNUNET_MESH_KX_Ephemeral kx_msg;
212
213 /**
214  * Task to generate a new ephemeral key.
215  */
216 static GNUNET_SCHEDULER_TaskIdentifier rekey_task;
217
218 /**
219  * Rekey period.
220  */
221 static struct GNUNET_TIME_Relative rekey_period;
222
223 /******************************************************************************/
224 /********************************   STATIC  ***********************************/
225 /******************************************************************************/
226
227 /**
228  * Get string description for tunnel state.
229  *
230  * @param s Tunnel state.
231  *
232  * @return String representation.
233  */
234 static const char *
235 GMT_state2s (enum MeshTunnel3State s)
236 {
237   static char buf[128];
238
239   switch (s)
240   {
241     case MESH_TUNNEL3_NEW:
242       return "MESH_TUNNEL3_NEW";
243     case MESH_TUNNEL3_SEARCHING:
244       return "MESH_TUNNEL3_SEARCHING";
245     case MESH_TUNNEL3_WAITING:
246       return "MESH_TUNNEL3_WAITING";
247     case MESH_TUNNEL3_KEY_SENT:
248       return "MESH_TUNNEL3_KEY_SENT";
249     case MESH_TUNNEL3_PING_SENT:
250       return "MESH_TUNNEL3_PING_SENT";
251     case MESH_TUNNEL3_READY:
252       return "MESH_TUNNEL3_READY";
253     case MESH_TUNNEL3_RECONNECTING:
254       return "MESH_TUNNEL3_RECONNECTING";
255     case MESH_TUNNEL3_REKEY:
256       return "MESH_TUNNEL3_REKEY";
257
258     default:
259       sprintf (buf, "%u (UNKNOWN STATE)", s);
260       return buf;
261   }
262 }
263
264
265 /**
266  * Ephemeral key message purpose size.
267  *
268  * @return Size of the part of the ephemeral key message that must be signed.
269  */
270 size_t
271 ephemeral_purpose_size (void)
272 {
273   return sizeof (struct GNUNET_CRYPTO_EccSignaturePurpose) +
274          sizeof (struct GNUNET_TIME_AbsoluteNBO) +
275          sizeof (struct GNUNET_TIME_AbsoluteNBO) +
276          sizeof (struct GNUNET_CRYPTO_EcdhePublicKey) +
277          sizeof (struct GNUNET_PeerIdentity);
278 }
279
280
281 /**
282  * Size of the encrypted part of a ping message.
283  *
284  * @return Size of the encrypted part of a ping message.
285  */
286 size_t
287 ping_encryption_size (void)
288 {
289   return sizeof (struct GNUNET_PeerIdentity) + sizeof (uint32_t);
290 }
291
292
293 /**
294  * Check that a ephemeral key message s well formed and correctly signed.
295  *
296  * @param t Tunnel on which the message came.
297  * @param msg The ephemeral key message.
298  *
299  * @return GNUNET_OK if message is fine, GNUNET_SYSERR otherwise.
300  */
301 int
302 check_ephemeral (struct MeshTunnel3 *t, 
303                  const struct GNUNET_MESH_KX_Ephemeral *msg)
304 {
305   /* Check message size */
306   if (ntohs (msg->header.size) != sizeof (struct GNUNET_MESH_KX_Ephemeral))
307     return GNUNET_SYSERR;
308
309   /* Check signature size */
310   if (ntohl (msg->purpose.size) != ephemeral_purpose_size ())
311     return GNUNET_SYSERR;
312
313   /* Check origin */
314   if (0 != memcmp (&msg->origin_identity,
315                    GMP_get_id (t->peer),
316                    sizeof (struct GNUNET_PeerIdentity)))
317     return GNUNET_SYSERR;
318
319   /* Check signature */
320   if (GNUNET_OK !=
321       GNUNET_CRYPTO_eddsa_verify (GNUNET_SIGNATURE_PURPOSE_MESH_KX,
322                                   &msg->purpose,
323                                   &msg->signature,
324                                   &msg->origin_identity.public_key))
325     return GNUNET_SYSERR;
326
327   return GNUNET_OK;
328 }
329
330
331 /**
332  * Encrypt data with the tunnel key.
333  *
334  * @param t Tunnel whose key to use.
335  * @param dst Destination for the encrypted data.
336  * @param src Source of the plaintext. Can overlap with @c dst.
337  * @param size Size of the plaintext.
338  * @param iv Initialization Vector to use.
339  */
340 static int
341 t_encrypt (struct MeshTunnel3 *t,
342            void *dst, const void *src,
343            size_t size, uint32_t iv)
344 {
345   struct GNUNET_CRYPTO_SymmetricInitializationVector siv;
346
347   GNUNET_CRYPTO_symmetric_derive_iv (&siv, &t->e_key, &iv, sizeof (uint32_t), NULL);
348   return GNUNET_CRYPTO_symmetric_encrypt (src, size, &t->e_key, &siv, dst);
349 }
350
351
352 /**
353  * Decrypt data with the tunnel key.
354  *
355  * @param t Tunnel whose key to use.
356  * @param dst Destination for the plaintext.
357  * @param src Source of the encrypted data. Can overlap with @c dst.
358  * @param size Size of the encrypted data.
359  * @param iv Initialization Vector to use.
360  */
361 static int
362 t_decrypt (struct MeshTunnel3 *t,
363            void *dst, const void *src,
364            size_t size, uint32_t iv)
365 {
366   struct GNUNET_CRYPTO_SymmetricInitializationVector siv;
367
368   GNUNET_CRYPTO_symmetric_derive_iv (&siv, &t->e_key, &iv, sizeof (uint32_t), NULL);
369   return GNUNET_CRYPTO_symmetric_decrypt (src, size, &t->d_key, &siv, dst);
370 }
371
372
373 /**
374  * Create key material by doing ECDH on the local and remote ephemeral keys.
375  *
376  * @param key_material Where to store the key material.
377  * @param ephemeral_key Peer's public ephemeral key.
378  */
379 void
380 derive_key_material (struct GNUNET_HashCode *key_material,
381                      const struct GNUNET_CRYPTO_EcdhePublicKey *ephemeral_key)
382 {
383   if (GNUNET_OK !=
384       GNUNET_CRYPTO_ecc_ecdh (my_ephemeral_key,
385                               ephemeral_key,
386                               key_material))
387   {
388     GNUNET_break (0);
389   }
390 }
391
392 /**
393  * Create a symmetic key from the identities of both ends and the key material
394  * from ECDH.
395  *
396  * @param key Destination for the generated key.
397  * @param sender ID of the peer that will encrypt with @c key.
398  * @param receiver ID of the peer that will decrypt with @c key.
399  * @param key_material Hash created with ECDH with the ephemeral keys.
400  */
401 void
402 derive_symmertic (struct GNUNET_CRYPTO_SymmetricSessionKey *key,
403                   const struct GNUNET_PeerIdentity *sender,
404                   const struct GNUNET_PeerIdentity *receiver,
405                   const struct GNUNET_HashCode *key_material)
406 {
407   const char salt[] = "MESH kx salt";
408
409   GNUNET_CRYPTO_kdf (key, sizeof (struct GNUNET_CRYPTO_SymmetricSessionKey),
410                      salt, sizeof (salt),
411                      key_material, sizeof (struct GNUNET_HashCode),
412                      sender, sizeof (struct GNUNET_PeerIdentity),
413                      receiver, sizeof (struct GNUNET_PeerIdentity),
414                      NULL);
415 }
416
417 /**
418  * Pick a connection on which send the next data message.
419  *
420  * @param t Tunnel on which to send the message.
421  *
422  * @return The connection on which to send the next message.
423  */
424 static struct MeshConnection *
425 tunnel_get_connection (struct MeshTunnel3 *t)
426 {
427   struct MeshTConnection *iter;
428   struct MeshConnection *best;
429   unsigned int qn;
430   unsigned int lowest_q;
431
432   LOG (GNUNET_ERROR_TYPE_DEBUG, "tunnel_get_connection %s\n", GMP_2s (t->peer));
433   best = NULL;
434   lowest_q = UINT_MAX;
435   for (iter = t->connection_head; NULL != iter; iter = iter->next)
436   {
437     LOG (GNUNET_ERROR_TYPE_DEBUG, "  connection %s: %u\n",
438          GNUNET_h2s (GMC_get_id (iter->c)), GMC_get_state (iter->c));
439     if (MESH_CONNECTION_READY == GMC_get_state (iter->c))
440     {
441       qn = GMC_get_qn (iter->c, GMC_is_origin (iter->c, GNUNET_YES));
442       LOG (GNUNET_ERROR_TYPE_DEBUG, "    q_n %u, \n", qn);
443       if (qn < lowest_q)
444       {
445         best = iter->c;
446         lowest_q = qn;
447       }
448     }
449   }
450   return best;
451 }
452
453
454 /**
455  * Send all cached messages that we can, tunnel is online.
456  *
457  * @param t Tunnel that holds the messages.
458  * @param fwd Is this fwd?
459  */
460 static void
461 send_queued_data (struct MeshTunnel3 *t, int fwd)
462 {
463   struct MeshTunnelQueue *tq;
464   struct MeshTunnelQueue *next;
465   unsigned int room;
466
467   LOG (GNUNET_ERROR_TYPE_DEBUG,
468               "GMT_send_queued_data on tunnel %s\n",
469               GMT_2s (t));
470
471   if (NULL == t->channel_head ||
472       GNUNET_NO == GMCH_is_origin (t->channel_head->ch, fwd))
473     return;
474
475   room = GMT_get_buffer (t, fwd);
476   LOG (GNUNET_ERROR_TYPE_DEBUG, "  buffer space: %u\n", room);
477   for (tq = t->tq_head; NULL != tq && room > 0; tq = next)
478   {
479     LOG (GNUNET_ERROR_TYPE_DEBUG, " data on channel %s\n", GMCH_2s (tq->ch));
480     next = tq->next;
481     room--;
482     GNUNET_CONTAINER_DLL_remove (t->tq_head, t->tq_tail, tq);
483     GMCH_send_prebuilt_message ((struct GNUNET_MessageHeader *) &tq[1],
484                                 tq->ch, fwd);
485
486     GNUNET_free (tq);
487   }
488   LOG (GNUNET_ERROR_TYPE_DEBUG,
489        "GMT_send_queued_data end\n",
490        GMP_2s (t->peer));
491 }
492
493
494
495
496 /**
497  * Cache a message to be sent once tunnel is online.
498  *
499  * @param t Tunnel to hold the message.
500  * @param ch Channel the message is about.
501  * @param msg Message itself (copy will be made).
502  */
503 static void
504 queue_data (struct MeshTunnel3 *t,
505             struct MeshChannel *ch,
506             const struct GNUNET_MessageHeader *msg)
507 {
508   struct MeshTunnelQueue *tq;
509   uint16_t size = ntohs (msg->size);
510
511   if (MESH_TUNNEL3_READY == t->state)
512   {
513     GNUNET_break (0);
514     return;
515   }
516
517   tq = GNUNET_malloc (sizeof (struct MeshTunnelQueue) + size);
518
519   tq->ch = ch;
520   memcpy (&tq[1], msg, size);
521   GNUNET_CONTAINER_DLL_insert_tail (t->tq_head, t->tq_tail, tq);
522 }
523
524
525
526 /**
527  * Sends key exchange message on a tunnel, choosing the best connection.
528  * Should not be called on loopback tunnels.
529  *
530  * @param t Tunnel on which this message is transmitted.
531  * @param message Message to send. Function modifies it.
532  */
533 static void
534 send_kx (struct MeshTunnel3 *t,
535          const struct GNUNET_MessageHeader *message)
536 {
537   struct MeshConnection *c;
538   struct GNUNET_MESH_KX *msg;
539   size_t size = ntohs (message->size);
540   char cbuf[sizeof (struct GNUNET_MESH_KX) + size];
541   uint16_t type;
542   int fwd;
543
544   LOG (GNUNET_ERROR_TYPE_DEBUG, "GMT KX on Tunnel %s\n", GMT_2s (t));
545
546   /* Avoid loopback. */
547   if (myid == GMP_get_short_id (t->peer))
548   {
549     LOG (GNUNET_ERROR_TYPE_DEBUG, "  loopback!\n");
550     GNUNET_break (0);
551     return;
552   }
553
554   /* Must have a connection. */
555   if (NULL == t->connection_head)
556   {
557     GNUNET_break (0);
558     return;
559   }
560
561   msg = (struct GNUNET_MESH_KX *) cbuf;
562   msg->header.type = htons (GNUNET_MESSAGE_TYPE_MESH_KX);
563   msg->header.size = htons (sizeof (struct GNUNET_MESH_KX) + size);
564   c = tunnel_get_connection (t);
565   if (NULL == c)
566   {
567     GNUNET_break (GNUNET_YES == t->destroy);
568     return;
569   }
570   type = ntohs (message->type);
571   switch (type)
572   {
573     case GNUNET_MESSAGE_TYPE_MESH_KX_EPHEMERAL:
574     case GNUNET_MESSAGE_TYPE_MESH_KX_PING:
575     case GNUNET_MESSAGE_TYPE_MESH_KX_PONG:
576       msg->cid = *GMC_get_id (c);
577       msg->reserved = htonl (0);
578       memcpy (&msg[1], message, size);
579       break;
580     default:
581       LOG (GNUNET_ERROR_TYPE_DEBUG, "unkown type %s\n",
582            GNUNET_MESH_DEBUG_M2S (type));
583       GNUNET_break (0);
584   }
585
586   fwd = GMC_is_origin (t->connection_head->c, GNUNET_YES);
587   GMC_send_prebuilt_message (&msg->header, c, fwd);
588 }
589
590
591 /**
592  * Send the ephemeral key on a tunnel.
593  *
594  * @param t Tunnel on which to send the key.
595  */
596 static void
597 send_ephemeral (struct MeshTunnel3 *t)
598 {
599   kx_msg.sender_status = htonl (t->state);
600
601   send_kx (t, &kx_msg.header);
602 }
603
604 /**
605  * Send a ping message on a tunnel.
606  *
607  * @param t Tunnel on which to send the ping.
608  */
609 static void
610 send_ping (struct MeshTunnel3 *t)
611 {
612   struct GNUNET_MESH_KX_Ping msg;
613
614   msg.header.size = htons (sizeof (msg));
615   msg.header.type = htons (GNUNET_MESSAGE_TYPE_MESH_KX_PING);
616   msg.iv = GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_NONCE, UINT32_MAX);
617   msg.target = *GMP_get_id (t->peer);
618   msg.nonce = t->kx_ctx->challenge;
619   t_encrypt (t, &msg.target, &msg.target, ping_encryption_size(), msg.iv);
620
621   send_kx (t, &msg.header);
622 }
623
624
625 /**
626  * Send a pong message on a tunnel.
627  *
628  * @param t Tunnel on which to send the pong.
629  * @param challenge Value sent in the ping that we have to send back.
630  */
631 static void
632 send_pong (struct MeshTunnel3 *t, uint32_t challenge)
633 {
634   struct GNUNET_MESH_KX_Pong msg;
635
636   msg.header.size = htons (sizeof (msg));
637   msg.header.type = htons (GNUNET_MESSAGE_TYPE_MESH_KX_PONG);
638   msg.iv = GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_NONCE, UINT32_MAX);
639   msg.nonce = challenge;
640   t_encrypt (t, &msg.nonce, &msg.nonce, sizeof (msg.nonce), msg.iv);
641
642   send_kx (t, &msg.header);
643 }
644
645
646 /**
647  * Initiate a rekey with the remote peer.
648  *
649  * @param cls Closure (tunnel).
650  * @param tc TaskContext.
651  */
652 static void
653 rekey_tunnel (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
654 {
655   struct MeshTunnel3 *t = cls;
656
657   t->rekey_task = GNUNET_SCHEDULER_NO_TASK;
658
659   if (NULL != tc && 0 != (GNUNET_SCHEDULER_REASON_SHUTDOWN & tc->reason))
660     return;
661
662   t->kx_ctx = GNUNET_new (struct MeshTunnelKXCtx);
663   t->kx_ctx->challenge = GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_NONCE,
664                                                    UINT32_MAX);
665   t->kx_ctx->d_key_old = t->d_key;
666   send_ephemeral (t);
667   if (MESH_TUNNEL3_READY == t->state)
668   {
669     send_ping (t);
670     t->state = MESH_TUNNEL3_REKEY;
671   }
672   else if (MESH_TUNNEL3_WAITING == t->state)
673   {
674     t->state = MESH_TUNNEL3_KEY_SENT;
675   }
676   else
677   {
678     LOG (GNUNET_ERROR_TYPE_DEBUG, "Unexpected state %u\n", t->state);
679   }
680
681   t->rekey_task = GNUNET_SCHEDULER_add_delayed (REKEY_WAIT, &rekey_tunnel, t);
682 }
683
684
685 /**
686  * Out ephemeral key has changed, create new session key on all tunnels.
687  *
688  * @param cls Closure (size of the hashmap).
689  * @param key Current public key.
690  * @param value Value in the hash map (tunnel).
691  *
692  * @return #GNUNET_YES, so we should continue to iterate,
693  */
694 static int
695 rekey_iterator (void *cls,
696                 const struct GNUNET_PeerIdentity *key,
697                 void *value)
698 {
699   struct MeshTunnel3 *t = value;
700   struct GNUNET_TIME_Relative delay;
701   long n = (long) cls;
702   uint32_t r;
703
704   if (GNUNET_SCHEDULER_NO_TASK != t->rekey_task)
705     return GNUNET_YES;
706
707   r = GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_WEAK, (uint32_t) n * 100);
708   delay = GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_MILLISECONDS, r);
709   t->rekey_task = GNUNET_SCHEDULER_add_delayed (delay, &rekey_tunnel, t);
710
711   return GNUNET_YES;
712 }
713
714
715 /**
716  * Create a new ephemeral key and key message, schedule next rekeying.
717  *
718  * @param cls Closure (unused).
719  * @param tc TaskContext.
720  */
721 static void
722 rekey (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
723 {
724   struct GNUNET_TIME_Absolute time;
725   long n;
726
727   rekey_task = GNUNET_SCHEDULER_NO_TASK;
728
729   if (0 != (GNUNET_SCHEDULER_REASON_SHUTDOWN & tc->reason))
730     return;
731
732   GNUNET_free_non_null (my_ephemeral_key);
733   my_ephemeral_key = GNUNET_CRYPTO_ecdhe_key_create ();
734
735   time = GNUNET_TIME_absolute_get ();
736   kx_msg.creation_time = GNUNET_TIME_absolute_hton (time);
737   time = GNUNET_TIME_absolute_add (time, rekey_period);
738   time = GNUNET_TIME_absolute_add (time, GNUNET_TIME_UNIT_MINUTES);
739   kx_msg.expiration_time = GNUNET_TIME_absolute_hton (time);
740   GNUNET_CRYPTO_ecdhe_key_get_public (my_ephemeral_key, &kx_msg.ephemeral_key);
741
742   GNUNET_assert (GNUNET_OK ==
743                  GNUNET_CRYPTO_eddsa_sign (my_private_key,
744                                            &kx_msg.purpose,
745                                            &kx_msg.signature));
746
747   n = (long) GNUNET_CONTAINER_multipeermap_size (tunnels);
748   GNUNET_CONTAINER_multipeermap_iterate (tunnels, &rekey_iterator, (void *) n);
749
750   rekey_task = GNUNET_SCHEDULER_add_delayed (rekey_period, &rekey, NULL);
751 }
752
753
754 /**
755  * Demultiplex data per channel and call appropriate channel handler.
756  *
757  * @param t Tunnel on which the data came.
758  * @param msg Data message.
759  * @param fwd Is this FWD data? (root -> dest)
760  */
761 void
762 handle_data (struct MeshTunnel3 *t,
763              const struct GNUNET_MESH_Data *msg,
764              int fwd)
765 {
766   struct MeshChannel *ch;
767   uint16_t type;
768   size_t size;
769
770   /* Check size */
771   size = ntohs (msg->header.size);
772   if (size <
773       sizeof (struct GNUNET_MESH_Data) +
774       sizeof (struct GNUNET_MessageHeader))
775   {
776     GNUNET_break (0);
777     return;
778   }
779   type = ntohs (msg->header.type);
780   LOG (GNUNET_ERROR_TYPE_DEBUG, "got a %s message\n",
781               GNUNET_MESH_DEBUG_M2S (type));
782   LOG (GNUNET_ERROR_TYPE_DEBUG, " payload of type %s\n",
783               GNUNET_MESH_DEBUG_M2S (ntohs (msg[1].header.type)));
784
785   /* Check channel */
786   ch = GMT_get_channel (t, ntohl (msg->chid));
787   if (NULL == ch)
788   {
789     GNUNET_STATISTICS_update (stats, "# data on unknown channel",
790                               1, GNUNET_NO);
791     LOG (GNUNET_ERROR_TYPE_DEBUG, "WARNING channel %u unknown\n",
792          ntohl (msg->chid));
793     return;
794   }
795
796   GMT_change_state (t, MESH_TUNNEL3_READY);
797   GMCH_handle_data (ch, msg, fwd);
798 }
799
800 void
801 handle_data_ack (struct MeshTunnel3 *t,
802                  const struct GNUNET_MESH_DataACK *msg,
803                  int fwd)
804 {
805   struct MeshChannel *ch;
806   size_t size;
807
808   /* Check size */
809   size = ntohs (msg->header.size);
810   if (size != sizeof (struct GNUNET_MESH_DataACK))
811   {
812     GNUNET_break (0);
813     return;
814   }
815
816   /* Check channel */
817   ch = GMT_get_channel (t, ntohl (msg->chid));
818   if (NULL == ch)
819   {
820     GNUNET_STATISTICS_update (stats, "# data ack on unknown channel",
821                               1, GNUNET_NO);
822     LOG (GNUNET_ERROR_TYPE_DEBUG, "WARNING channel %u unknown\n",
823          ntohl (msg->chid));
824     return;
825   }
826
827   GMCH_handle_data_ack (ch, msg, fwd);
828 }
829
830 void
831 handle_ch_create (struct MeshTunnel3 *t,
832                   const struct GNUNET_MESH_ChannelCreate *msg,
833                   int fwd)
834 {
835   struct MeshChannel *ch;
836   size_t size;
837
838   /* Check size */
839   size = ntohs (msg->header.size);
840   if (size != sizeof (struct GNUNET_MESH_ChannelCreate))
841   {
842     GNUNET_break (0);
843     return;
844   }
845
846   /* Check channel */
847   ch = GMT_get_channel (t, ntohl (msg->chid));
848   if (NULL != ch)
849   {
850     /* Probably a retransmission, safe to ignore */
851     LOG (GNUNET_ERROR_TYPE_DEBUG, "   already exists...\n");
852   }
853   else
854   {
855     ch = GMCH_handle_create (t, msg, fwd);
856   }
857   GMT_add_channel (t, ch);
858 }
859
860 void
861 handle_ch_ack (struct MeshTunnel3 *t,
862                const struct GNUNET_MESH_ChannelManage *msg,
863                int fwd)
864 {
865   struct MeshChannel *ch;
866   size_t size;
867
868   /* Check size */
869   size = ntohs (msg->header.size);
870   if (size != sizeof (struct GNUNET_MESH_ChannelManage))
871   {
872     GNUNET_break (0);
873     return;
874   }
875
876   /* Check channel */
877   ch = GMT_get_channel (t, ntohl (msg->chid));
878   if (NULL == ch)
879   {
880     GNUNET_STATISTICS_update (stats, "# channel ack on unknown channel",
881                               1, GNUNET_NO);
882     LOG (GNUNET_ERROR_TYPE_DEBUG, "WARNING channel %u unknown\n",
883          ntohl (msg->chid));
884     return;
885   }
886
887   GMCH_handle_ack (ch, msg, fwd);
888 }
889
890 void
891 handle_ch_destroy (struct MeshTunnel3 *t,
892                    const struct GNUNET_MESH_ChannelManage *msg,
893                    int fwd)
894 {
895   struct MeshChannel *ch;
896   size_t size;
897
898   /* Check size */
899   size = ntohs (msg->header.size);
900   if (size != sizeof (struct GNUNET_MESH_ChannelManage))
901   {
902     GNUNET_break (0);
903     return;
904   }
905
906   /* Check channel */
907   ch = GMT_get_channel (t, ntohl (msg->chid));
908   if (NULL == ch)
909   {
910     /* Probably a retransmission, safe to ignore */
911     return;
912   }
913
914   GMCH_handle_destroy (ch, msg, fwd);
915 }
916
917
918 /**
919  * The peer's ephemeral key has changed: update the symmetrical keys.
920  *
921  * @param t Tunnel this message came on.
922  * @param msg Key eXchange message.
923  */
924 static void
925 handle_ephemeral (struct MeshTunnel3 *t,
926                   const struct GNUNET_MESH_KX_Ephemeral *msg)
927 {
928   struct GNUNET_HashCode km;
929   LOG (GNUNET_ERROR_TYPE_DEBUG, "  ephemeral key message\n");
930
931   if (GNUNET_OK != check_ephemeral (t, msg))
932   {
933     GNUNET_break_op (0);
934     return;
935   }
936   derive_key_material (&km, &msg->ephemeral_key);
937   derive_symmertic (&t->e_key, &my_full_id, GMP_get_id (t->peer), &km);
938   derive_symmertic (&t->d_key, GMP_get_id (t->peer), &my_full_id, &km);
939   if (MESH_TUNNEL3_KEY_SENT == t->state)
940   {
941     send_ping (t);
942     t->state = MESH_TUNNEL3_PING_SENT;
943   }
944 }
945
946
947 /**
948  * Peer wants to check our symmetrical keys by sending an encrypted challenge.
949  * Answer with by retransmitting the challenge with the "opposite" key.
950  *
951  * @param t Tunnel this message came on.
952  * @param msg Key eXchange Ping message.
953  */
954 static void
955 handle_ping (struct MeshTunnel3 *t,
956              const struct GNUNET_MESH_KX_Ping *msg)
957 {
958   struct GNUNET_MESH_KX_Ping res;
959
960   LOG (GNUNET_ERROR_TYPE_DEBUG, "  ping message\n");
961   t_decrypt (t, &res.target, &msg->target, ping_encryption_size(), msg->iv);
962   if (0 != memcmp (&my_full_id, &msg->target, sizeof (my_full_id)))
963   {
964     GNUNET_break (0);
965     LOG (GNUNET_ERROR_TYPE_DEBUG, "  at %s\n", GNUNET_i2s (&my_full_id));
966     LOG (GNUNET_ERROR_TYPE_DEBUG, "  for %s\n", GNUNET_i2s (&msg->target));
967     return;
968   }
969
970   send_pong (t, res.iv);
971 }
972
973
974 /**
975  * Peer has answer to our challenge.
976  * If answer is successful, consider the key exchange finished and clean
977  * up all related state.
978  *
979  * @param t Tunnel this message came on.
980  * @param msg Key eXchange Pong message.
981  */
982 static void
983 handle_pong (struct MeshTunnel3 *t,
984              const struct GNUNET_MESH_KX_Pong *msg)
985 {
986   uint32_t challenge;
987
988   LOG (GNUNET_ERROR_TYPE_DEBUG, "PONG received\n");
989   if (GNUNET_SCHEDULER_NO_TASK == t->rekey_task)
990   {
991     GNUNET_break_op (0);
992     return;
993   }
994   t_decrypt (t, &challenge, &msg->nonce, sizeof (uint32_t), msg->iv);
995
996   if (challenge != t->kx_ctx->challenge)
997   {
998     LOG (GNUNET_ERROR_TYPE_DEBUG,
999          "Wrong PONG challenge: %u. Expected: %u.\n",
1000          challenge, t->kx_ctx->challenge);
1001     GNUNET_break_op (0);
1002     return;
1003   }
1004   GNUNET_SCHEDULER_cancel (t->rekey_task);
1005   t->rekey_task = GNUNET_SCHEDULER_NO_TASK;
1006   GNUNET_free (t->kx_ctx);
1007   t->kx_ctx = NULL;
1008   t->state = MESH_TUNNEL3_READY;
1009   send_queued_data (t, GNUNET_YES);
1010   send_queued_data (t, GNUNET_NO);
1011 }
1012
1013
1014 /**
1015  * Demultiplex by message type and call appropriate handler for a message
1016  * towards a channel of a local tunnel.
1017  *
1018  * @param t Tunnel this message came on.
1019  * @param msgh Message header.
1020  * @param fwd Is this message fwd?
1021  */
1022 static void
1023 handle_decrypted (struct MeshTunnel3 *t,
1024                   const struct GNUNET_MessageHeader *msgh,
1025                   int fwd)
1026 {
1027   uint16_t type;
1028
1029   type = ntohs (msgh->type);
1030   LOG (GNUNET_ERROR_TYPE_DEBUG,
1031        "Got a %s message!\n",
1032        GNUNET_MESH_DEBUG_M2S (type));
1033
1034   switch (type)
1035   {
1036     case GNUNET_MESSAGE_TYPE_MESH_DATA:
1037       /* Don't send hop ACK, wait for client to ACK */
1038       handle_data (t, (struct GNUNET_MESH_Data *) msgh, fwd);
1039       break;
1040
1041     case GNUNET_MESSAGE_TYPE_MESH_DATA_ACK:
1042       handle_data_ack (t, (struct GNUNET_MESH_DataACK *) msgh, fwd);
1043       break;
1044
1045     case GNUNET_MESSAGE_TYPE_MESH_CHANNEL_CREATE:
1046       handle_ch_create (t,
1047                         (struct GNUNET_MESH_ChannelCreate *) msgh,
1048                         fwd);
1049       break;
1050
1051     case GNUNET_MESSAGE_TYPE_MESH_CHANNEL_ACK:
1052       handle_ch_ack (t,
1053                      (struct GNUNET_MESH_ChannelManage *) msgh,
1054                      fwd);
1055       break;
1056
1057     case GNUNET_MESSAGE_TYPE_MESH_CHANNEL_DESTROY:
1058       handle_ch_destroy (t,
1059                          (struct GNUNET_MESH_ChannelManage *) msgh,
1060                          fwd);
1061       break;
1062
1063     default:
1064       GNUNET_break_op (0);
1065       LOG (GNUNET_ERROR_TYPE_DEBUG,
1066            "end-to-end message not known (%u)\n",
1067            ntohs (msgh->type));
1068   }
1069 }
1070
1071 /******************************************************************************/
1072 /********************************    API    ***********************************/
1073 /******************************************************************************/
1074
1075 /**
1076  * Decrypt and demultiplex by message type. Call appropriate handler
1077  * for every message.
1078  *
1079  * @param t Tunnel this message came on.
1080  * @param msg Encrypted message.
1081  * @param fwd Is this message fwd?
1082  */
1083 void
1084 GMT_handle_encrypted (struct MeshTunnel3 *t,
1085                       const struct GNUNET_MESH_Encrypted *msg,
1086                       int fwd)
1087 {
1088   size_t size = ntohs (msg->header.size);
1089   size_t payload_size = size - sizeof (struct GNUNET_MESH_Encrypted);
1090   size_t decrypted_size;
1091   char cbuf [payload_size];
1092   struct GNUNET_MessageHeader *msgh;
1093   unsigned int off;
1094
1095   decrypted_size = t_decrypt (t, cbuf, &msg[1], payload_size, msg->iv);
1096   off = 0;
1097   while (off < decrypted_size)
1098   {
1099     msgh = (struct GNUNET_MessageHeader *) &cbuf[off];
1100     handle_decrypted (t, msgh, fwd);
1101     off += ntohs (msgh->size);
1102   }
1103 }
1104
1105
1106 /**
1107  * Demultiplex an encapsulated KX message by message type.
1108  *
1109  * @param t Tunnel on which the message came.
1110  * @param message Payload of KX message.
1111  */
1112 void
1113 GMT_handle_kx (struct MeshTunnel3 *t,
1114                const struct GNUNET_MessageHeader *message)
1115 {
1116   uint16_t type;
1117
1118   type = ntohs (message->type);
1119   LOG (GNUNET_ERROR_TYPE_DEBUG, "kx message received\n", type);
1120   switch (type)
1121   {
1122     case GNUNET_MESSAGE_TYPE_MESH_KX_EPHEMERAL:
1123       handle_ephemeral (t, (struct GNUNET_MESH_KX_Ephemeral *) message);
1124       break;
1125
1126     case GNUNET_MESSAGE_TYPE_MESH_KX_PING:
1127       handle_ping (t, (struct GNUNET_MESH_KX_Ping *) message);
1128       break;
1129
1130     case GNUNET_MESSAGE_TYPE_MESH_KX_PONG:
1131       handle_pong (t, (struct GNUNET_MESH_KX_Pong *) message);
1132       break;
1133
1134     default:
1135       GNUNET_break_op (0);
1136       LOG (GNUNET_ERROR_TYPE_DEBUG, "kx message not known (%u)\n", type);
1137   }
1138 }
1139
1140
1141 /**
1142  * Initialize the tunnel subsystem.
1143  *
1144  * @param c Configuration handle.
1145  * @param key ECC private key, to derive all other keys and do crypto.
1146  */
1147 void
1148 GMT_init (const struct GNUNET_CONFIGURATION_Handle *c,
1149           const struct GNUNET_CRYPTO_EddsaPrivateKey *key)
1150 {
1151   LOG (GNUNET_ERROR_TYPE_DEBUG, "init\n");
1152   if (GNUNET_OK !=
1153       GNUNET_CONFIGURATION_get_value_number (c, "MESH", "DEFAULT_TTL",
1154                                              &default_ttl))
1155   {
1156     GNUNET_log_config_invalid (GNUNET_ERROR_TYPE_WARNING,
1157                                "MESH", "DEFAULT_TTL", "USING DEFAULT");
1158     default_ttl = 64;
1159   }
1160   if (GNUNET_OK !=
1161       GNUNET_CONFIGURATION_get_value_time (c, "MESH", "REKEY_PERIOD",
1162                                            &rekey_period))
1163   {
1164     rekey_period = GNUNET_TIME_UNIT_DAYS;
1165   }
1166
1167   my_private_key = key;
1168   kx_msg.header.size = htons (sizeof (kx_msg));
1169   kx_msg.header.type = htons (GNUNET_MESSAGE_TYPE_MESH_KX_EPHEMERAL);
1170   kx_msg.purpose.purpose = htonl (GNUNET_SIGNATURE_PURPOSE_MESH_KX);
1171   kx_msg.purpose.size = htonl (ephemeral_purpose_size ());
1172   kx_msg.origin_identity = my_full_id;
1173   rekey_task = GNUNET_SCHEDULER_add_now (&rekey, NULL);
1174
1175   tunnels = GNUNET_CONTAINER_multipeermap_create (128, GNUNET_YES);
1176 }
1177
1178
1179 /**
1180  * Shut down the tunnel subsystem.
1181  */
1182 void
1183 GMT_shutdown (void)
1184 {
1185   if (GNUNET_SCHEDULER_NO_TASK != rekey_task)
1186   {
1187     GNUNET_SCHEDULER_cancel (rekey_task);
1188     rekey_task = GNUNET_SCHEDULER_NO_TASK;
1189   }
1190   GNUNET_CONTAINER_multipeermap_destroy (tunnels);
1191 }
1192
1193
1194 /**
1195  * Create a tunnel.
1196  *
1197  * @param destination Peer this tunnel is towards.
1198  */
1199 struct MeshTunnel3 *
1200 GMT_new (struct MeshPeer *destination)
1201 {
1202   struct MeshTunnel3 *t;
1203
1204   t = GNUNET_new (struct MeshTunnel3);
1205   t->next_chid = 0;
1206   t->peer = destination;
1207
1208   if (GNUNET_OK !=
1209       GNUNET_CONTAINER_multipeermap_put (tunnels, GMP_get_id (destination), t,
1210                                          GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST))
1211   {
1212     GNUNET_break (0);
1213     GNUNET_free (t);
1214     return NULL;
1215   }
1216   return t;
1217 }
1218
1219
1220 /**
1221  * Change the tunnel state.
1222  *
1223  * @param t Tunnel whose state to change.
1224  * @param state New state.
1225  */
1226 void
1227 GMT_change_state (struct MeshTunnel3* t, enum MeshTunnel3State state)
1228 {
1229   if (NULL == t)
1230     return;
1231   LOG (GNUNET_ERROR_TYPE_DEBUG,
1232               "Tunnel %s state was %s\n",
1233               GMP_2s (t->peer),
1234               GMT_state2s (t->state));
1235   LOG (GNUNET_ERROR_TYPE_DEBUG,
1236               "Tunnel %s state is now %s\n",
1237               GMP_2s (t->peer),
1238               GMT_state2s (state));
1239   if (myid != GMP_get_short_id (t->peer) &&
1240       MESH_TUNNEL3_WAITING == t->state && MESH_TUNNEL3_READY == state)
1241   {
1242     LOG (GNUNET_ERROR_TYPE_DEBUG, "  triggered rekey\n");
1243     rekey_tunnel (t, NULL);
1244     LOG (GNUNET_ERROR_TYPE_DEBUG,
1245          "Tunnel %s state is now %s\n",
1246          GMP_2s (t->peer),
1247          GMT_state2s (t->state));
1248   }
1249   else
1250   {
1251     t->state = state;
1252   }
1253   if (MESH_TUNNEL3_READY == state && 3 <= GMT_count_connections (t))
1254   {
1255     GMP_stop_search (t->peer);
1256   }
1257 }
1258
1259
1260 /**
1261  * Add a connection to a tunnel.
1262  *
1263  * @param t Tunnel.
1264  * @param c Connection.
1265  */
1266 void
1267 GMT_add_connection (struct MeshTunnel3 *t, struct MeshConnection *c)
1268 {
1269   struct MeshTConnection *aux;
1270
1271   for (aux = t->connection_head; aux != NULL; aux = aux->next)
1272     if (aux->c == c)
1273       return;
1274
1275   aux = GNUNET_new (struct MeshTConnection);
1276   aux->c = c;
1277   GNUNET_CONTAINER_DLL_insert_tail (t->connection_head, t->connection_tail, aux);
1278 }
1279
1280
1281 /**
1282  * Remove a connection from a tunnel.
1283  *
1284  * @param t Tunnel.
1285  * @param c Connection.
1286  */
1287 void
1288 GMT_remove_connection (struct MeshTunnel3 *t, struct MeshConnection *c)
1289 {
1290   struct MeshTConnection *aux;
1291
1292   for (aux = t->connection_head; aux != NULL; aux = aux->next)
1293     if (aux->c == c)
1294     {
1295       GNUNET_CONTAINER_DLL_remove (t->connection_head, t->connection_tail, aux);
1296       GNUNET_free (aux);
1297       return;
1298     }
1299 }
1300
1301
1302 /**
1303  * Add a channel to a tunnel.
1304  *
1305  * @param t Tunnel.
1306  * @param ch Channel.
1307  */
1308 void
1309 GMT_add_channel (struct MeshTunnel3 *t, struct MeshChannel *ch)
1310 {
1311   struct MeshTChannel *aux;
1312
1313   LOG (GNUNET_ERROR_TYPE_DEBUG, "Adding channel %p to tunnel %p\n", ch, t);
1314
1315   for (aux = t->channel_head; aux != NULL; aux = aux->next)
1316   {
1317     LOG (GNUNET_ERROR_TYPE_DEBUG, "  already there %p\n", aux->ch);
1318     if (aux->ch == ch)
1319       return;
1320   }
1321
1322   aux = GNUNET_new (struct MeshTChannel);
1323   aux->ch = ch;
1324   LOG (GNUNET_ERROR_TYPE_DEBUG, " adding %p to %p\n", aux, t->channel_head);
1325   GNUNET_CONTAINER_DLL_insert_tail (t->channel_head, t->channel_tail, aux);
1326 }
1327
1328
1329 /**
1330  * Remove a channel from a tunnel.
1331  *
1332  * @param t Tunnel.
1333  * @param ch Channel.
1334  */
1335 void
1336 GMT_remove_channel (struct MeshTunnel3 *t, struct MeshChannel *ch)
1337 {
1338   struct MeshTChannel *aux;
1339
1340   LOG (GNUNET_ERROR_TYPE_DEBUG, "Removing channel %p from tunnel %p\n", ch, t);
1341   for (aux = t->channel_head; aux != NULL; aux = aux->next)
1342   {
1343     if (aux->ch == ch)
1344     {
1345       LOG (GNUNET_ERROR_TYPE_DEBUG, " found! %s\n", GMCH_2s (ch));
1346       GNUNET_CONTAINER_DLL_remove (t->channel_head, t->channel_tail, aux);
1347       GNUNET_free (aux);
1348       return;
1349     }
1350   }
1351 }
1352
1353
1354 /**
1355  * Search for a channel by global ID.
1356  *
1357  * @param t Tunnel containing the channel.
1358  * @param chid Public channel number.
1359  *
1360  * @return channel handler, NULL if doesn't exist
1361  */
1362 struct MeshChannel *
1363 GMT_get_channel (struct MeshTunnel3 *t, MESH_ChannelNumber chid)
1364 {
1365   struct MeshTChannel *iter;
1366
1367   if (NULL == t)
1368     return NULL;
1369
1370   for (iter = t->channel_head; NULL != iter; iter = iter->next)
1371   {
1372     if (GMCH_get_id (iter->ch) == chid)
1373       break;
1374   }
1375
1376   return NULL == iter ? NULL : iter->ch;
1377 }
1378
1379
1380 /**
1381  * Tunnel is empty: destroy it.
1382  *
1383  * Notifies all connections about the destruction.
1384  *
1385  * @param t Tunnel to destroy.
1386  */
1387 void
1388 GMT_destroy_empty (struct MeshTunnel3 *t)
1389 {
1390   struct MeshTConnection *iter;
1391
1392   for (iter = t->connection_head; NULL != iter; iter = iter->next)
1393   {
1394     GMC_send_destroy (iter->c);
1395   }
1396
1397   t->destroy = GNUNET_YES;
1398 }
1399
1400
1401 /**
1402  * Destroy tunnel if empty (no more channels).
1403  *
1404  * @param t Tunnel to destroy if empty.
1405  */
1406 void
1407 GMT_destroy_if_empty (struct MeshTunnel3 *t)
1408 {
1409   if (1 < GMT_count_channels (t))
1410     return;
1411
1412   GMT_destroy_empty (t);
1413 }
1414
1415
1416 /**
1417  * Destroy the tunnel.
1418  *
1419  * This function does not generate any warning traffic to clients or peers.
1420  *
1421  * Tasks:
1422  * Cancel messages belonging to this tunnel queued to neighbors.
1423  * Free any allocated resources linked to the tunnel.
1424  *
1425  * @param t The tunnel to destroy.
1426  */
1427 void
1428 GMT_destroy (struct MeshTunnel3 *t)
1429 {
1430   struct MeshTConnection *iter;
1431   struct MeshTConnection *next;
1432
1433   if (NULL == t)
1434     return;
1435
1436   LOG (GNUNET_ERROR_TYPE_DEBUG, "destroying tunnel %s\n", GMP_2s (t->peer));
1437
1438 //   if (GNUNET_YES != GNUNET_CONTAINER_multihashmap_remove (tunnels, &t->id, t))
1439 //     GNUNET_break (0);
1440
1441   for (iter = t->connection_head; NULL != iter; iter = next)
1442   {
1443     next = iter->next;
1444     GMC_destroy (iter->c);
1445   }
1446
1447   GNUNET_STATISTICS_update (stats, "# tunnels", -1, GNUNET_NO);
1448   GMP_set_tunnel (t->peer, NULL);
1449
1450   if (GNUNET_SCHEDULER_NO_TASK != t->rekey_task)
1451     GNUNET_SCHEDULER_cancel (t->rekey_task);
1452
1453   GNUNET_free (t);
1454 }
1455
1456
1457 /**
1458  * @brief Use the given path for the tunnel.
1459  * Update the next and prev hops (and RCs).
1460  * (Re)start the path refresh in case the tunnel is locally owned.
1461  *
1462  * @param t Tunnel to update.
1463  * @param p Path to use.
1464  *
1465  * @return Connection created.
1466  */
1467 struct MeshConnection *
1468 GMT_use_path (struct MeshTunnel3 *t, struct MeshPeerPath *p)
1469 {
1470   struct MeshConnection *c;
1471   struct GNUNET_HashCode cid;
1472   unsigned int own_pos;
1473
1474   if (NULL == t || NULL == p)
1475   {
1476     GNUNET_break (0);
1477     return NULL;
1478   }
1479
1480   for (own_pos = 0; own_pos < p->length; own_pos++)
1481   {
1482     if (p->peers[own_pos] == myid)
1483       break;
1484   }
1485   if (own_pos > p->length - 1)
1486   {
1487     GNUNET_break (0);
1488     return NULL;
1489   }
1490
1491   GNUNET_CRYPTO_hash_create_random (GNUNET_CRYPTO_QUALITY_NONCE, &cid);
1492   c = GMC_new (&cid, t, p, own_pos);
1493   GMT_add_connection (t, c);
1494   return c;
1495 }
1496
1497
1498 /**
1499  * Count established (ready) connections of a tunnel.
1500  *
1501  * @param t Tunnel on which to count.
1502  *
1503  * @return Number of connections.
1504  */
1505 unsigned int
1506 GMT_count_connections (struct MeshTunnel3 *t)
1507 {
1508   struct MeshTConnection *iter;
1509   unsigned int count;
1510
1511   for (count = 0, iter = t->connection_head;
1512        NULL != iter;
1513        iter = iter->next, count++);
1514
1515   return count;
1516 }
1517
1518 /**
1519  * Count channels of a tunnel.
1520  *
1521  * @param t Tunnel on which to count.
1522  *
1523  * @return Number of channels.
1524  */
1525 unsigned int
1526 GMT_count_channels (struct MeshTunnel3 *t)
1527 {
1528   struct MeshTChannel *iter;
1529   unsigned int count;
1530
1531   for (count = 0, iter = t->channel_head;
1532        NULL != iter;
1533        iter = iter->next, count++) /* skip */;
1534
1535   return count;
1536 }
1537
1538
1539 /**
1540  * Get the state of a tunnel.
1541  *
1542  * @param t Tunnel.
1543  *
1544  * @return Tunnel's state.
1545  */
1546 enum MeshTunnel3State
1547 GMT_get_state (struct MeshTunnel3 *t)
1548 {
1549   if (NULL == t)
1550     return (enum MeshTunnel3State) -1;
1551   return t->state;
1552 }
1553
1554 /**
1555  * Get the total buffer space for a tunnel.
1556  *
1557  * If terminal, use the biggest channel buffer (or 64) if no channel exists.
1558  * If not terminal, use the sum of all connection buffers.
1559  *
1560  * @param t Tunnel.
1561  * @param fwd Is this for FWD traffic?
1562  *
1563  * @return Buffer space offered by all entities (c/ch) in the tunnel.
1564  */
1565 unsigned int
1566 GMT_get_buffer (struct MeshTunnel3 *t, int fwd)
1567 {
1568   struct MeshTConnection *iter;
1569   unsigned int buffer;
1570
1571   iter = t->connection_head;
1572   buffer = 0;
1573
1574   /* If terminal, return biggest channel buffer */
1575   if (NULL == iter || GMC_is_terminal (iter->c, fwd))
1576   {
1577     struct MeshTChannel *iter_ch;
1578     unsigned int ch_buf;
1579
1580     if (NULL == t->channel_head)
1581     {
1582       /* Probably getting buffer for a channel create/handshake. */
1583       return 64;
1584     }
1585
1586     for (iter_ch = t->channel_head; NULL != iter_ch; iter_ch = iter_ch->next)
1587     {
1588       ch_buf = GMCH_get_buffer (iter_ch->ch, fwd);
1589       if (ch_buf > buffer)
1590         buffer = ch_buf;
1591     }
1592     return buffer;
1593   }
1594
1595   /* If not terminal, return sum of connection buffers */
1596   while (NULL != iter)
1597   {
1598     if (GMC_get_state (iter->c) != MESH_CONNECTION_READY)
1599     {
1600       iter = iter->next;
1601       continue;
1602     }
1603
1604     buffer += GMC_get_buffer (iter->c, fwd);
1605     iter = iter->next;
1606   }
1607
1608   return buffer;
1609 }
1610
1611
1612 /**
1613  * Get the tunnel's destination.
1614  *
1615  * @param t Tunnel.
1616  *
1617  * @return ID of the destination peer.
1618  */
1619 const struct GNUNET_PeerIdentity *
1620 GMT_get_destination (struct MeshTunnel3 *t)
1621 {
1622   return GMP_get_id (t->peer);
1623 }
1624
1625
1626 /**
1627  * Get the tunnel's next free global channel ID.
1628  *
1629  * @param t Tunnel.
1630  *
1631  * @return GID of a channel free to use.
1632  */
1633 MESH_ChannelNumber
1634 GMT_get_next_chid (struct MeshTunnel3 *t)
1635 {
1636   MESH_ChannelNumber chid;
1637
1638   while (NULL != GMT_get_channel (t, t->next_chid))
1639   {
1640     LOG (GNUNET_ERROR_TYPE_DEBUG, "Channel %u exists...\n", t->next_chid);
1641     t->next_chid = (t->next_chid + 1) & ~GNUNET_MESH_LOCAL_CHANNEL_ID_CLI;
1642   }
1643   chid = t->next_chid;
1644   t->next_chid = (t->next_chid + 1) & ~GNUNET_MESH_LOCAL_CHANNEL_ID_CLI;
1645
1646   return chid;
1647 }
1648
1649
1650 /**
1651  * Send ACK on one or more channels due to buffer in connections.
1652  *
1653  * @param t Channel which has some free buffer space.
1654  * @param fwd Is this for FWD traffic? (ACK goes to root)
1655  */
1656 void
1657 GMT_unchoke_channels (struct MeshTunnel3 *t, int fwd)
1658 {
1659   struct MeshTChannel *iter;
1660   unsigned int buffer;
1661   unsigned int channels = GMT_count_channels (t);
1662   unsigned int choked_n;
1663   struct MeshChannel *choked[channels];
1664
1665   LOG (GNUNET_ERROR_TYPE_DEBUG, "GMT_unchoke_channels on %s\n", GMT_2s (t));
1666   LOG (GNUNET_ERROR_TYPE_DEBUG, " head: %p\n", t->channel_head);
1667   if (NULL != t->channel_head)
1668     LOG (GNUNET_ERROR_TYPE_DEBUG, " head ch: %p\n", t->channel_head->ch);
1669
1670   if (NULL == t)
1671   {
1672     GNUNET_break (0);
1673     return;
1674   }
1675
1676   /* Get buffer space */
1677   buffer = GMT_get_buffer (t, fwd);
1678   if (0 == buffer)
1679   {
1680     return;
1681   }
1682
1683   /* Count and remember choked channels */
1684   choked_n = 0;
1685   for (iter = t->channel_head; NULL != iter; iter = iter->next)
1686   {
1687     if (GNUNET_NO == GMCH_get_allowed (iter->ch, fwd))
1688     {
1689       choked[choked_n++] = iter->ch;
1690     }
1691   }
1692
1693   /* Unchoke random channels */
1694   while (0 < buffer && 0 < choked_n)
1695   {
1696     unsigned int r = GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_WEAK,
1697                                                choked_n);
1698     GMCH_allow_client (choked[r], fwd);
1699     choked_n--;
1700     buffer--;
1701     choked[r] = choked[choked_n];
1702   }
1703 }
1704
1705
1706 /**
1707  * Send ACK on one or more connections due to buffer space to the client.
1708  *
1709  * Iterates all connections of the tunnel and sends ACKs appropriately.
1710  *
1711  * @param t Tunnel.
1712  * @param fwd Is this in for FWD traffic? (ACK goes dest->root)
1713  */
1714 void
1715 GMT_send_acks (struct MeshTunnel3 *t, int fwd)
1716 {
1717   struct MeshTConnection *iter;
1718   uint32_t allowed;
1719   uint32_t to_allow;
1720   uint32_t allow_per_connection;
1721   unsigned int cs;
1722   unsigned int buffer;
1723
1724   LOG (GNUNET_ERROR_TYPE_DEBUG,
1725        "Tunnel send %s ACKs on %s\n",
1726        fwd ? "FWD" : "BCK", GMT_2s (t));
1727
1728   if (NULL == t)
1729   {
1730     GNUNET_break (0);
1731     return;
1732   }
1733   if (NULL == t->channel_head ||
1734       GNUNET_NO == GMCH_is_origin (t->channel_head->ch, !fwd))
1735   {
1736     GNUNET_break (0);
1737     return;
1738   }
1739
1740   buffer = GMT_get_buffer (t, fwd);
1741
1742   /* Count connections, how many messages are already allowed */
1743   cs = GMT_count_connections (t);
1744   for (allowed = 0, iter = t->connection_head; NULL != iter; iter = iter->next)
1745   {
1746     allowed += GMC_get_allowed (iter->c, fwd);
1747   }
1748
1749   /* Make sure there is no overflow */
1750   if (allowed > buffer)
1751   {
1752     GNUNET_break (0);
1753     return;
1754   }
1755
1756   /* Authorize connections to send more data */
1757   to_allow = buffer; /* - allowed; */
1758
1759   for (iter = t->connection_head; NULL != iter && to_allow > 0; iter = iter->next)
1760   {
1761     allow_per_connection = to_allow/cs;
1762     to_allow -= allow_per_connection;
1763     cs--;
1764     if (GMC_get_allowed (iter->c, fwd) > 64 / 3)
1765     {
1766       continue;
1767     }
1768     GMC_allow (iter->c, buffer, fwd);
1769   }
1770
1771   GNUNET_break (to_allow == 0);
1772 }
1773
1774
1775 /**
1776  * Sends an already built message on a tunnel, encrypting it and
1777  * choosing the best connection.
1778  *
1779  * @param message Message to send. Function modifies it.
1780  * @param t Tunnel on which this message is transmitted.
1781  * @param ch Channel on which this message is transmitted.
1782  * @param fwd Is this a fwd message on @c ch?
1783  */
1784 void
1785 GMT_send_prebuilt_message (const struct GNUNET_MessageHeader *message,
1786                            struct MeshTunnel3 *t,
1787                            struct MeshChannel *ch,
1788                            int fwd)
1789 {
1790   struct MeshConnection *c;
1791   struct GNUNET_MESH_Encrypted *msg;
1792   size_t size = ntohs (message->size);
1793   size_t encrypted_size;
1794   char cbuf[sizeof (struct GNUNET_MESH_Encrypted) + size];
1795   uint32_t iv;
1796   uint16_t type;
1797
1798   if (MESH_TUNNEL3_READY != t->state)
1799   {
1800     queue_data (t, ch, message);
1801     return;
1802   }
1803   LOG (GNUNET_ERROR_TYPE_DEBUG, "GMT Send on Tunnel %s\n", GMT_2s (t));
1804
1805   if (myid == GMP_get_short_id (t->peer))
1806   {
1807     LOG (GNUNET_ERROR_TYPE_DEBUG, "  loopback!\n");
1808     handle_decrypted (t, message, fwd);
1809     return;
1810   }
1811
1812   iv = GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_NONCE, UINT32_MAX);
1813   msg = (struct GNUNET_MESH_Encrypted *) cbuf;
1814   msg->header.type = htons (GNUNET_MESSAGE_TYPE_MESH_ENCRYPTED);
1815   msg->iv = iv;
1816   encrypted_size = t_encrypt (t, &msg[1], message, size, iv);
1817   msg->header.size = htons (sizeof (struct GNUNET_MESH_Encrypted) + encrypted_size);
1818   c = tunnel_get_connection (t);
1819   if (NULL == c)
1820   {
1821     GNUNET_break (GNUNET_YES == t->destroy);
1822     return;
1823   }
1824   type = ntohs (message->type);
1825   switch (type)
1826   {
1827     case GNUNET_MESSAGE_TYPE_MESH_DATA:
1828     case GNUNET_MESSAGE_TYPE_MESH_CHANNEL_CREATE:
1829     case GNUNET_MESSAGE_TYPE_MESH_CHANNEL_DESTROY:
1830     case GNUNET_MESSAGE_TYPE_MESH_CHANNEL_ACK:
1831       msg->cid = *GMC_get_id (c);
1832       msg->ttl = htonl (default_ttl);
1833       break;
1834     default:
1835       LOG (GNUNET_ERROR_TYPE_DEBUG, "unkown type %s\n",
1836            GNUNET_MESH_DEBUG_M2S (type));
1837       GNUNET_break (0);
1838   }
1839
1840   fwd = GMC_is_origin (c, GNUNET_YES);
1841   GMC_send_prebuilt_message (&msg->header, c, fwd);
1842 }
1843
1844 /**
1845  * Is the tunnel directed towards the local peer?
1846  *
1847  * @param t Tunnel.
1848  *
1849  * @return #GNUNET_YES if it is loopback.
1850  */
1851 int
1852 GMT_is_loopback (const struct MeshTunnel3 *t)
1853 {
1854   return (myid == GMP_get_short_id(t->peer));
1855 }
1856
1857
1858 /**
1859  * Is the tunnel using this path already?
1860  *
1861  * @param t Tunnel.
1862  * @param p Path.
1863  *
1864  * @return #GNUNET_YES a connection uses this path.
1865  */
1866 int
1867 GMT_is_path_used (const struct MeshTunnel3 *t, const struct MeshPeerPath *p)
1868 {
1869   struct MeshTConnection *iter;
1870
1871   for (iter = t->connection_head; NULL != iter; iter = iter->next)
1872     if (GMC_get_path (iter->c) == p)
1873       return GNUNET_YES;
1874
1875   return GNUNET_NO;
1876 }
1877
1878
1879 /**
1880  * Get a cost of a path for a tunnel considering existing connections.
1881  *
1882  * @param t Tunnel.
1883  * @param path Candidate path.
1884  *
1885  * @return Cost of the path (path length + number of overlapping nodes)
1886  */
1887 unsigned int
1888 GMT_get_path_cost (const struct MeshTunnel3 *t,
1889                    const struct MeshPeerPath *path)
1890 {
1891   struct MeshTConnection *iter;
1892   unsigned int overlap;
1893   unsigned int i;
1894   unsigned int j;
1895
1896   if (NULL == path)
1897     return 0;
1898
1899   overlap = 0;
1900   GNUNET_assert (NULL != t);
1901
1902   for (i = 0; i < path->length; i++)
1903   {
1904     for (iter = t->connection_head; NULL != iter; iter = iter->next)
1905     {
1906       for (j = 0; j < GMC_get_path (iter->c)->length; j++)
1907       {
1908         if (path->peers[i] == GMC_get_path (iter->c)->peers[j])
1909         {
1910           overlap++;
1911           break;
1912         }
1913       }
1914     }
1915   }
1916   return (path->length + overlap) * (path->score * -1);
1917 }
1918
1919
1920 /**
1921  * Get the static string for the peer this tunnel is directed.
1922  *
1923  * @param t Tunnel.
1924  *
1925  * @return Static string the destination peer's ID.
1926  */
1927 const char *
1928 GMT_2s (const struct MeshTunnel3 *t)
1929 {
1930   return GMP_2s (t->peer);
1931 }