- debug
[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_statistics_service.h"
25
26 #include "mesh_protocol_enc.h"
27
28 #include "gnunet-service-mesh_tunnel.h"
29 #include "gnunet-service-mesh_connection.h"
30 #include "gnunet-service-mesh_channel.h"
31 #include "gnunet-service-mesh_peer.h"
32 #include "mesh_path.h"
33
34 #define LOG(level, ...) GNUNET_log_from(level,"mesh-tun",__VA_ARGS__)
35
36 #define START_FUNCTION LOG(GNUNET_ERROR_TYPE_DEBUG, "%s start\n", __FUNCTION__)
37 #define END_FUNCTION LOG(GNUNET_ERROR_TYPE_DEBUG, "%s end\n", __FUNCTION__)
38
39
40 /******************************************************************************/
41 /********************************   STRUCTS  **********************************/
42 /******************************************************************************/
43
44 struct MeshTChannel
45 {
46   struct MeshTChannel *next;
47   struct MeshTChannel *prev;
48   struct MeshChannel *ch;
49 };
50
51 struct MeshTConnection
52 {
53   struct MeshTConnection *next;
54   struct MeshTConnection *prev;
55   struct MeshConnection *c;
56 };
57
58 /**
59  * Struct containing all information regarding a tunnel to a peer.
60  */
61 struct MeshTunnel3
62 {
63     /**
64      * Endpoint of the tunnel.
65      */
66   struct MeshPeer *peer;
67
68     /**
69      * State of the tunnel.
70      */
71   enum MeshTunnel3State state;
72
73   /**
74    * Local peer ephemeral private key
75    */
76   struct GNUNET_CRYPTO_EddsaPrivateKey *my_eph_key;
77
78   /**
79    * Local peer ephemeral public key
80    */
81   struct GNUNET_CRYPTO_EddsaPublicKey *my_eph;
82
83   /**
84    * Remote peer's public key.
85    */
86   struct GNUNET_CRYPTO_EddsaPublicKey *peers_eph;
87
88   /**
89    * Encryption ("our") key.
90    */
91   struct GNUNET_CRYPTO_SymmetricSessionKey e_key;
92
93   /**
94    * Decryption ("their") key.
95    */
96   struct GNUNET_CRYPTO_SymmetricSessionKey d_key;
97
98   /**
99    * Paths that are actively used to reach the destination peer.
100    */
101   struct MeshTConnection *connection_head;
102   struct MeshTConnection *connection_tail;
103
104   /**
105    * Next connection number.
106    */
107   uint32_t next_cid;
108
109   /**
110    * Channels inside this tunnel.
111    */
112   struct MeshTChannel *channel_head;
113   struct MeshTChannel *channel_tail;
114
115   /**
116    * Channel ID for the next created channel.
117    */
118   MESH_ChannelNumber next_chid;
119
120   /**
121    * Pending message count.
122    */
123   int pending_messages;
124
125   /**
126    * Destroy flag: if true, destroy on last message.
127    */
128   int destroy;
129
130   /**
131    * Queued messages, to transmit once tunnel gets connected.
132    */
133   struct MeshTunnelQueue *tq_head;
134   struct MeshTunnelQueue *tq_tail;
135 };
136
137
138 /**
139  * Struct used to queue messages in a tunnel.
140  */
141 struct MeshTunnelQueue
142 {
143   /**
144    * DLL
145    */
146   struct MeshTunnelQueue *next;
147   struct MeshTunnelQueue *prev;
148
149   /**
150    * Channel.
151    */
152   struct MeshChannel *ch;
153
154   /**
155    * Message to send.
156    */
157   /* struct GNUNET_MessageHeader *msg; */
158 };
159
160 /******************************************************************************/
161 /*******************************   GLOBALS  ***********************************/
162 /******************************************************************************/
163
164 /**
165  * Global handle to the statistics service.
166  */
167 extern struct GNUNET_STATISTICS_Handle *stats;
168
169 /**
170  * Local peer own ID (memory efficient handle).
171  */
172 extern GNUNET_PEER_Id myid;
173
174 /**
175  * Local peer own ID (full value).
176  */
177 extern struct GNUNET_PeerIdentity my_full_id;
178
179 /**
180  * Default TTL for payload packets.
181  */
182 static unsigned long long default_ttl;
183
184 /**
185  * Own private key.
186  */
187 const static struct GNUNET_CRYPTO_EddsaPrivateKey *my_private_key;
188
189
190 /******************************************************************************/
191 /********************************   STATIC  ***********************************/
192 /******************************************************************************/
193
194 /**
195  * Get string description for tunnel state.
196  *
197  * @param s Tunnel state.
198  *
199  * @return String representation.
200  */
201 static const char *
202 GMT_state2s (enum MeshTunnel3State s)
203 {
204   static char buf[128];
205
206   switch (s)
207   {
208     case MESH_TUNNEL3_NEW:
209       return "MESH_TUNNEL3_NEW";
210     case MESH_TUNNEL3_SEARCHING:
211       return "MESH_TUNNEL3_SEARCHING";
212     case MESH_TUNNEL3_WAITING:
213       return "MESH_TUNNEL3_WAITING";
214     case MESH_TUNNEL3_READY:
215       return "MESH_TUNNEL3_READY";
216     case MESH_TUNNEL3_RECONNECTING:
217       return "MESH_TUNNEL3_RECONNECTING";
218
219     default:
220       sprintf (buf, "%u (UNKNOWN STATE)", s);
221       return buf;
222   }
223 }
224
225 /**
226  * Pick a connection on which send the next data message.
227  *
228  * @param t Tunnel on which to send the message.
229  * @param fwd Is this a fwd message?
230  *
231  * @return The connection on which to send the next message.
232  */
233 static struct MeshConnection *
234 tunnel_get_connection (struct MeshTunnel3 *t, int fwd)
235 {
236   struct MeshTConnection *iter;
237   struct MeshConnection *best;
238   unsigned int qn;
239   unsigned int lowest_q;
240
241   LOG (GNUNET_ERROR_TYPE_DEBUG, "tunnel_get_connection %s\n", GMP_2s (t->peer));
242   best = NULL;
243   lowest_q = UINT_MAX;
244   for (iter = t->connection_head; NULL != iter; iter = iter->next)
245   {
246     LOG (GNUNET_ERROR_TYPE_DEBUG, "  connection %s: %u\n",
247          GNUNET_h2s (GMC_get_id (iter->c)), GMC_get_state (iter->c));
248     if (MESH_CONNECTION_READY == GMC_get_state (iter->c))
249     {
250       qn = GMC_get_qn (iter->c, fwd);
251       LOG (GNUNET_ERROR_TYPE_DEBUG, "    q_n %u, \n", qn);
252       if (qn < lowest_q)
253       {
254         best = iter->c;
255         lowest_q = qn;
256       }
257     }
258   }
259   return best;
260 }
261
262
263 /**
264  * FIXME FIXME FIXME FIXME FIXME FIXME FIXME FIXME FIXME FIXME FIXME
265  * Encrypt data with the tunnel key.
266  *
267  * @param t Tunnel whose key to use.
268  * @param dst Destination for the GMT_encrypted data.
269  * @param src Source of the plaintext.
270  * @param size Size of the plaintext.
271  * @param iv Initialization Vector to use.
272  * @param fwd Is this a fwd message?
273  */
274 static void
275 GMT_encrypt (struct MeshTunnel3 *t,
276              void *dst, const void *src,
277              size_t size, uint64_t iv, int fwd)
278 {
279   memcpy (dst, src, size);
280 }
281
282
283 /**
284  * FIXME FIXME FIXME FIXME FIXME FIXME FIXME FIXME FIXME FIXME FIXME
285  * Decrypt data with the tunnel key.
286  *
287  * @param t Tunnel whose key to use.
288  * @param dst Destination for the plaintext.
289  * @param src Source of the GMT_encrypted data.
290  * @param size Size of the GMT_encrypted data.
291  * @param iv Initialization Vector to use.
292  * @param fwd Is this a fwd message?
293  */
294 static void
295 GMT_decrypt (struct MeshTunnel3 *t,
296              void *dst, const void *src,
297              size_t size, uint64_t iv, int fwd)
298 {
299   memcpy (dst, src, size);
300 }
301
302
303 void
304 handle_data (struct MeshTunnel3 *t,
305              const struct GNUNET_MESH_Data *msg,
306              int fwd)
307 {
308   struct MeshChannel *ch;
309   uint16_t type;
310   size_t size;
311
312   /* Check size */
313   size = ntohs (msg->header.size);
314   if (size <
315       sizeof (struct GNUNET_MESH_Data) +
316       sizeof (struct GNUNET_MessageHeader))
317   {
318     GNUNET_break (0);
319     return;
320   }
321   type = ntohs (msg->header.type);
322   LOG (GNUNET_ERROR_TYPE_DEBUG, "got a %s message\n",
323               GNUNET_MESH_DEBUG_M2S (type));
324   LOG (GNUNET_ERROR_TYPE_DEBUG, " payload of type %s\n",
325               GNUNET_MESH_DEBUG_M2S (ntohs (msg[1].header.type)));
326
327   /* Check channel */
328   ch = GMT_get_channel (t, ntohl (msg->chid));
329   if (NULL == ch)
330   {
331     GNUNET_STATISTICS_update (stats, "# data on unknown channel",
332                               1, GNUNET_NO);
333     LOG (GNUNET_ERROR_TYPE_DEBUG, "WARNING channel %u unknown\n",
334          ntohl (msg->chid));
335     return;
336   }
337
338   GMT_change_state (t, MESH_TUNNEL3_READY);
339   GMCH_handle_data (ch, msg, fwd);
340 }
341
342 void
343 handle_data_ack (struct MeshTunnel3 *t,
344                  const struct GNUNET_MESH_DataACK *msg,
345                  int fwd)
346 {
347   struct MeshChannel *ch;
348   size_t size;
349
350   /* Check size */
351   size = ntohs (msg->header.size);
352   if (size != sizeof (struct GNUNET_MESH_DataACK))
353   {
354     GNUNET_break (0);
355     return;
356   }
357
358   /* Check channel */
359   ch = GMT_get_channel (t, ntohl (msg->chid));
360   if (NULL == ch)
361   {
362     GNUNET_STATISTICS_update (stats, "# data ack on unknown channel",
363                               1, GNUNET_NO);
364     LOG (GNUNET_ERROR_TYPE_DEBUG, "WARNING channel %u unknown\n",
365          ntohl (msg->chid));
366     return;
367   }
368
369   GMCH_handle_data_ack (ch, msg, fwd);
370 }
371
372 void
373 handle_ch_create (struct MeshTunnel3 *t,
374                   const struct GNUNET_MESH_ChannelCreate *msg,
375                   int fwd)
376 {
377   ;
378
379   struct MeshTChannel *tch;
380   struct MeshChannel *ch;
381   size_t size;
382
383   /* Check size */
384   size = ntohs (msg->header.size);
385   if (size != sizeof (struct GNUNET_MESH_ChannelCreate))
386   {
387     GNUNET_break (0);
388     return;
389   }
390
391   /* Check channel */
392   ch = GMT_get_channel (t, ntohl (msg->chid));
393   if (NULL != ch)
394   {
395     /* Probably a retransmission, safe to ignore */
396     LOG (GNUNET_ERROR_TYPE_DEBUG, "   already exists...\n");
397   }
398   else
399   {
400     ch = GMCH_handle_create (t, msg, fwd);
401   }
402
403   tch = GNUNET_new (struct MeshTChannel);
404   tch->ch = ch;
405   GNUNET_CONTAINER_DLL_insert (t->channel_head, t->channel_tail, tch);
406
407   ;
408 }
409
410 void
411 handle_ch_ack (struct MeshTunnel3 *t,
412                const struct GNUNET_MESH_ChannelManage *msg,
413                int fwd)
414 {
415   struct MeshChannel *ch;
416   size_t size;
417
418   /* Check size */
419   size = ntohs (msg->header.size);
420   if (size != sizeof (struct GNUNET_MESH_ChannelManage))
421   {
422     GNUNET_break (0);
423     return;
424   }
425
426   /* Check channel */
427   ch = GMT_get_channel (t, ntohl (msg->chid));
428   if (NULL == ch)
429   {
430     GNUNET_STATISTICS_update (stats, "# channel ack on unknown channel",
431                               1, GNUNET_NO);
432     LOG (GNUNET_ERROR_TYPE_DEBUG, "WARNING channel %u unknown\n",
433          ntohl (msg->chid));
434     return;
435   }
436
437   GMCH_handle_ack (ch, msg, fwd);
438 }
439
440 void
441 handle_ch_destroy (struct MeshTunnel3 *t,
442                    const struct GNUNET_MESH_ChannelManage *msg,
443                    int fwd)
444 {
445   struct MeshChannel *ch;
446   size_t size;
447
448   /* Check size */
449   size = ntohs (msg->header.size);
450   if (size != sizeof (struct GNUNET_MESH_ChannelManage))
451   {
452     GNUNET_break (0);
453     return;
454   }
455
456   /* Check channel */
457   ch = GMT_get_channel (t, ntohl (msg->chid));
458   if (NULL == ch)
459   {
460     /* Probably a retransmission, safe to ignore */
461     return;
462   }
463
464   GMCH_handle_destroy (ch, msg, fwd);
465 }
466
467
468 /**
469  * Demultiplex by message type and call appropriate handler for a message
470  * towards a channel of a local tunnel.
471  *
472  * @param t Tunnel this message came on.
473  * @param msgh Message header.
474  * @param fwd Is this message fwd?
475  */
476 static void
477 handle_decrypted (struct MeshTunnel3 *t,
478                   const struct GNUNET_MessageHeader *msgh,
479                   int fwd)
480 {
481   uint16_t type;
482
483   type = ntohs (msgh->type);
484   LOG (GNUNET_ERROR_TYPE_DEBUG,
485        "Got a %s message!\n",
486        GNUNET_MESH_DEBUG_M2S (type));
487
488   switch (type)
489   {
490     case GNUNET_MESSAGE_TYPE_MESH_DATA:
491       /* Don't send hop ACK, wait for client to ACK */
492       handle_data (t, (struct GNUNET_MESH_Data *) msgh, fwd);
493       break;
494
495     case GNUNET_MESSAGE_TYPE_MESH_DATA_ACK:
496       handle_data_ack (t, (struct GNUNET_MESH_DataACK *) msgh, fwd);
497       break;
498
499     case GNUNET_MESSAGE_TYPE_MESH_CHANNEL_CREATE:
500       handle_ch_create (t,
501                         (struct GNUNET_MESH_ChannelCreate *) msgh,
502                         fwd);
503       break;
504
505     case GNUNET_MESSAGE_TYPE_MESH_CHANNEL_ACK:
506       handle_ch_ack (t,
507                      (struct GNUNET_MESH_ChannelManage *) msgh,
508                      fwd);
509       break;
510
511     case GNUNET_MESSAGE_TYPE_MESH_CHANNEL_DESTROY:
512       handle_ch_destroy (t,
513                          (struct GNUNET_MESH_ChannelManage *) msgh,
514                          fwd);
515       break;
516
517     default:
518       GNUNET_break_op (0);
519       LOG (GNUNET_ERROR_TYPE_DEBUG,
520            "end-to-end message not known (%u)\n",
521            ntohs (msgh->type));
522   }
523 }
524
525 /******************************************************************************/
526 /********************************    API    ***********************************/
527 /******************************************************************************/
528
529
530 /**
531  * Decrypt and demultiplex by message type. Call appropriate handler
532  * for every message.
533  *
534  * @param t Tunnel this message came on.
535  * @param msg Encrypted message.
536  * @param fwd Is this message fwd?
537  */
538 void
539 GMT_handle_encrypted (struct MeshTunnel3 *t,
540                       const struct GNUNET_MESH_Encrypted *msg,
541                       int fwd)
542 {
543   size_t size = ntohs (msg->header.size);
544   size_t payload_size = size - sizeof (struct GNUNET_MESH_Encrypted);
545   char cbuf[payload_size];
546   struct GNUNET_MessageHeader *msgh;
547   unsigned int off;
548
549   GMT_decrypt (t, cbuf, &msg[1], payload_size, msg->iv, fwd);
550   off = 0;
551   while (off < payload_size)
552   {
553     msgh = (struct GNUNET_MessageHeader *) &cbuf[off];
554         handle_decrypted (t, msgh, fwd);
555     off += ntohs (msgh->size);
556   }
557 }
558
559
560 /**
561  * Cache a message to be sent once tunnel is online.
562  *
563  * @param t Tunnel to hold the message.
564  * @param ch Channel the message is about.
565  * @param msg Message itself (copy will be made).
566  * @param fwd Is this fwd?
567  */
568 void
569 GMT_queue_data (struct MeshTunnel3 *t,
570                 struct MeshChannel *ch,
571                 struct GNUNET_MessageHeader *msg,
572                 int fwd)
573 {
574   struct MeshTunnelQueue *tq;
575   uint16_t size = ntohs (msg->size);
576
577   tq = GNUNET_malloc (sizeof (struct MeshTunnelQueue) + size);
578
579   tq->ch = ch;
580   memcpy (&tq[1], msg, size);
581   GNUNET_CONTAINER_DLL_insert_tail (t->tq_head, t->tq_tail, tq);
582
583   if (MESH_TUNNEL3_READY == t->state)
584     GMT_send_queued_data (t, fwd);
585 }
586
587
588 /**
589  * Send all cached messages that we can, tunnel is online.
590  *
591  * @param t Tunnel that holds the messages.
592  * @param fwd Is this fwd?
593  */
594 void
595 GMT_send_queued_data (struct MeshTunnel3 *t, int fwd)
596 {
597   struct MeshTunnelQueue *tq;
598   struct MeshTunnelQueue *next;
599   unsigned int room;
600
601   LOG (GNUNET_ERROR_TYPE_DEBUG,
602               "GMT_send_queued_data on tunnel %s\n",
603               GMT_2s (t));
604   room = GMT_get_buffer (t, fwd);
605   LOG (GNUNET_ERROR_TYPE_DEBUG, "  buffer space: %u\n", room);
606   for (tq = t->tq_head; NULL != tq && room > 0; tq = next)
607   {
608     LOG (GNUNET_ERROR_TYPE_DEBUG, " data on channel %s\n", GMCH_2s (tq->ch));
609     next = tq->next;
610     room--;
611     GNUNET_CONTAINER_DLL_remove (t->tq_head, t->tq_tail, tq);
612     GMCH_send_prebuilt_message ((struct GNUNET_MessageHeader *) &tq[1],
613                                 tq->ch, fwd);
614
615     GNUNET_free (tq);
616   }
617   LOG (GNUNET_ERROR_TYPE_DEBUG,
618        "GMT_send_queued_data end\n",
619        GMP_2s (t->peer));
620 }
621
622
623 /**
624  * Initialize the tunnel subsystem.
625  *
626  * @param c Configuration handle.
627  * @param key ECC private key, to derive all other keys and do crypto.
628  */
629 void
630 GMT_init (const struct GNUNET_CONFIGURATION_Handle *c,
631           const struct GNUNET_CRYPTO_EddsaPrivateKey *key)
632 {
633   LOG (GNUNET_ERROR_TYPE_DEBUG, "init\n");
634   if (GNUNET_OK !=
635       GNUNET_CONFIGURATION_get_value_number (c, "MESH", "DEFAULT_TTL",
636                                              &default_ttl))
637   {
638     GNUNET_log_config_invalid (GNUNET_ERROR_TYPE_WARNING,
639                                "MESH", "DEFAULT_TTL", "USING DEFAULT");
640     default_ttl = 64;
641   }
642   my_private_key = key;
643 }
644
645
646 /**
647  * Shut down the tunnel subsystem.
648  */
649 void
650 GMT_shutdown (void)
651 {
652 }
653
654
655 /**
656  * Create a tunnel.
657  *
658  * @param destination Peer this tunnel is towards.
659  */
660 struct MeshTunnel3 *
661 GMT_new (struct MeshPeer *destination)
662 {
663   struct MeshTunnel3 *t;
664
665   t = GNUNET_new (struct MeshTunnel3);
666   t->next_chid = 0;
667   t->peer = destination;
668 //   if (GNUNET_OK !=
669 //       GNUNET_CONTAINER_multihashmap_put (tunnels, tid, t,
670 //                                          GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST))
671 //   {
672 //     GNUNET_break (0);
673 //     tunnel_destroy (t);
674 //     return NULL;
675 //   }
676
677 //   char salt[] = "salt";
678 //   GNUNET_CRYPTO_kdf (&t->e_key, sizeof (struct GNUNET_CRYPTO_SymmetricSessionKey),
679 //                      salt, sizeof (salt),
680 //                      &t->e_key, sizeof (struct GNUNET_CRYPTO_SymmetricSessionKey),
681 //                      &my_full_id, sizeof (struct GNUNET_PeerIdentity),
682 //                      GNUNET_PEER_resolve2 (t->peer->id), sizeof (struct GNUNET_PeerIdentity),
683 //                      NULL);
684 //   GNUNET_CRYPTO_kdf (&t->d_key, sizeof (struct GNUNET_CRYPTO_SymmetricSessionKey),
685 //                      salt, sizeof (salt),
686 //                      &t->d_key, sizeof (struct GNUNET_CRYPTO_SymmetricSessionKey),
687 //                      GNUNET_PEER_resolve2 (t->peer->id), sizeof (struct GNUNET_PeerIdentity),
688 //                      &my_full_id, sizeof (struct GNUNET_PeerIdentity),
689 //                      NULL);
690
691   return t;
692 }
693
694
695 /**
696  * Change the tunnel state.
697  *
698  * @param t Tunnel whose state to change.
699  * @param state New state.
700  */
701 void
702 GMT_change_state (struct MeshTunnel3* t, enum MeshTunnel3State state)
703 {
704   if (NULL == t)
705     return;
706   LOG (GNUNET_ERROR_TYPE_DEBUG,
707               "Tunnel %s state was %s\n",
708               GMP_2s (t->peer),
709               GMT_state2s (t->state));
710   LOG (GNUNET_ERROR_TYPE_DEBUG,
711               "Tunnel %s state is now %s\n",
712               GMP_2s (t->peer),
713               GMT_state2s (state));
714   t->state = state;
715   if (MESH_TUNNEL3_READY == state && 3 <= GMT_count_connections (t))
716   {
717     GMP_stop_search (t->peer);
718   }
719 }
720
721
722 /**
723  * Add a connection to a tunnel.
724  *
725  * @param t Tunnel.
726  * @param c Connection.
727  */
728 void
729 GMT_add_connection (struct MeshTunnel3 *t, struct MeshConnection *c)
730 {
731   struct MeshTConnection *aux;
732
733   for (aux = t->connection_head; aux != NULL; aux = aux->next)
734     if (aux->c == c)
735       return;
736
737   aux = GNUNET_new (struct MeshTConnection);
738   aux->c = c;
739   GNUNET_CONTAINER_DLL_insert_tail (t->connection_head, t->connection_tail, aux);
740 }
741
742
743 /**
744  * Remove a connection from a tunnel.
745  *
746  * @param t Tunnel.
747  * @param c Connection.
748  */
749 void
750 GMT_remove_connection (struct MeshTunnel3 *t, struct MeshConnection *c)
751 {
752   struct MeshTConnection *aux;
753
754   for (aux = t->connection_head; aux != NULL; aux = aux->next)
755     if (aux->c == c)
756     {
757       GNUNET_CONTAINER_DLL_remove (t->connection_head, t->connection_tail, aux);
758       GNUNET_free (aux);
759       return;
760     }
761 }
762
763
764 /**
765  * Add a channel to a tunnel.
766  *
767  * @param t Tunnel.
768  * @param ch Channel.
769  */
770 void
771 GMT_add_channel (struct MeshTunnel3 *t, struct MeshChannel *ch)
772 {
773   struct MeshTChannel *aux;
774
775   for (aux = t->channel_head; aux != NULL; aux = aux->next)
776     if (aux->ch == ch)
777       return;
778
779   aux = GNUNET_new (struct MeshTChannel);
780   aux->ch = ch;
781   GNUNET_CONTAINER_DLL_insert_tail (t->channel_head, t->channel_tail, aux);
782 }
783
784
785 /**
786  * Remove a channel from a tunnel.
787  *
788  * @param t Tunnel.
789  * @param ch Channel.
790  */
791 void
792 GMT_remove_channel (struct MeshTunnel3 *t, struct MeshChannel *ch)
793 {
794   struct MeshTChannel *aux;
795   struct MeshTChannel *next;
796
797   LOG (GNUNET_ERROR_TYPE_DEBUG,
798        "Removing channel %p from tunnel %p\n",
799        ch, t);
800   for (aux = t->channel_head; aux != NULL; aux = next)
801   {
802     next = aux->next;
803     if (aux->ch == ch)
804     {
805       LOG (GNUNET_ERROR_TYPE_DEBUG, " found! %s\n", GMCH_2s (ch));
806       GNUNET_CONTAINER_DLL_remove (t->channel_head, t->channel_tail, aux);
807       GNUNET_free (aux);
808       return;
809     }
810   }
811 }
812
813
814 /**
815  * Search for a channel by global ID.
816  *
817  * @param t Tunnel containing the channel.
818  * @param chid Public channel number.
819  *
820  * @return channel handler, NULL if doesn't exist
821  */
822 struct MeshChannel *
823 GMT_get_channel (struct MeshTunnel3 *t, MESH_ChannelNumber chid)
824 {
825   struct MeshTChannel *iter;
826
827   if (NULL == t)
828     return NULL;
829
830   for (iter = t->channel_head; NULL != iter; iter = iter->next)
831   {
832     if (GMCH_get_id (iter->ch) == chid)
833       break;
834   }
835
836   return NULL == iter ? NULL : iter->ch;
837 }
838
839
840 /**
841  * Tunnel is empty: destroy it.
842  *
843  * Notifies all connections about the destruction.
844  *
845  * @param t Tunnel to destroy.
846  */
847 void
848 GMT_destroy_empty (struct MeshTunnel3 *t)
849 {
850   struct MeshTConnection *iter;
851
852   for (iter = t->connection_head; NULL != iter; iter = iter->next)
853   {
854     GMC_send_destroy (iter->c);
855   }
856
857   if (0 == t->pending_messages)
858     GMT_destroy (t);
859   else
860     t->destroy = GNUNET_YES;
861 }
862
863
864 /**
865  * Destroy tunnel if empty (no more channels).
866  *
867  * @param t Tunnel to destroy if empty.
868  */
869 void
870 GMT_destroy_if_empty (struct MeshTunnel3 *t)
871 {
872   if (1 < GMT_count_channels (t))
873     return;
874
875   GMT_destroy_empty (t);
876 }
877
878
879 /**
880  * Destroy the tunnel.
881  *
882  * This function does not generate any warning traffic to clients or peers.
883  *
884  * Tasks:
885  * Cancel messages belonging to this tunnel queued to neighbors.
886  * Free any allocated resources linked to the tunnel.
887  *
888  * @param t The tunnel to destroy.
889  */
890 void
891 GMT_destroy (struct MeshTunnel3 *t)
892 {
893   struct MeshTConnection *iter;
894   struct MeshTConnection *next;
895
896   if (NULL == t)
897     return;
898
899   LOG (GNUNET_ERROR_TYPE_DEBUG, "destroying tunnel %s\n", GMP_2s (t->peer));
900
901 //   if (GNUNET_YES != GNUNET_CONTAINER_multihashmap_remove (tunnels, &t->id, t))
902 //     GNUNET_break (0);
903
904   for (iter = t->connection_head; NULL != iter; iter = next)
905   {
906     next = iter->next;
907     GMC_destroy (iter->c);
908     GNUNET_free (iter);
909   }
910
911   GNUNET_STATISTICS_update (stats, "# tunnels", -1, GNUNET_NO);
912   GMP_set_tunnel (t->peer, NULL);
913
914   GNUNET_free (t);
915 }
916
917
918 /**
919  * @brief Use the given path for the tunnel.
920  * Update the next and prev hops (and RCs).
921  * (Re)start the path refresh in case the tunnel is locally owned.
922  *
923  * @param t Tunnel to update.
924  * @param p Path to use.
925  *
926  * @return Connection created.
927  */
928 struct MeshConnection *
929 GMT_use_path (struct MeshTunnel3 *t, struct MeshPeerPath *p)
930 {
931   struct MeshConnection *c;
932   struct GNUNET_HashCode cid;
933   unsigned int own_pos;
934
935   if (NULL == t || NULL == p)
936   {
937     GNUNET_break (0);
938     return NULL;
939   }
940
941   for (own_pos = 0; own_pos < p->length; own_pos++)
942   {
943     if (p->peers[own_pos] == myid)
944       break;
945   }
946   if (own_pos > p->length - 1)
947   {
948     GNUNET_break (0);
949     return NULL;
950   }
951
952   GNUNET_CRYPTO_hash_create_random (GNUNET_CRYPTO_QUALITY_NONCE, &cid);
953   c = GMC_new (&cid, t, p, own_pos);
954   GMT_add_connection (t, c);
955   return c;
956 }
957
958
959 /**
960  * Count established (ready) connections of a tunnel.
961  *
962  * @param t Tunnel on which to count.
963  *
964  * @return Number of connections.
965  */
966 unsigned int
967 GMT_count_connections (struct MeshTunnel3 *t)
968 {
969   struct MeshTConnection *iter;
970   unsigned int count;
971
972   for (count = 0, iter = t->connection_head;
973        NULL != iter;
974        iter = iter->next, count++);
975
976   return count;
977 }
978
979 /**
980  * Count channels of a tunnel.
981  *
982  * @param t Tunnel on which to count.
983  *
984  * @return Number of channels.
985  */
986 unsigned int
987 GMT_count_channels (struct MeshTunnel3 *t)
988 {
989   struct MeshTChannel *iter;
990   unsigned int count;
991
992   for (count = 0, iter = t->channel_head;
993        NULL != iter;
994        iter = iter->next, count++) /* skip */;
995
996   return count;
997 }
998
999
1000 /**
1001  * Get the state of a tunnel.
1002  *
1003  * @param t Tunnel.
1004  *
1005  * @return Tunnel's state.
1006  */
1007 enum MeshTunnel3State
1008 GMT_get_state (struct MeshTunnel3 *t)
1009 {
1010   if (NULL == t)
1011     return (enum MeshTunnel3State) -1;
1012   return t->state;
1013 }
1014
1015 /**
1016  * Get the total buffer space for a tunnel.
1017  *
1018  * If terminal, use the biggest channel buffer (or 64) if no channel exists.
1019  * If not terminal, use the sum of all connection buffers.
1020  *
1021  * @param t Tunnel.
1022  * @param fwd Is this for FWD traffic?
1023  *
1024  * @return Buffer space offered by all entities (c/ch) in the tunnel.
1025  */
1026 unsigned int
1027 GMT_get_buffer (struct MeshTunnel3 *t, int fwd)
1028 {
1029   struct MeshTConnection *iter;
1030   unsigned int buffer;
1031
1032   iter = t->connection_head;
1033   buffer = 0;
1034
1035   /* If terminal, return biggest channel buffer */
1036   if (NULL == iter || GMC_is_terminal (iter->c, fwd))
1037   {
1038     struct MeshTChannel *iter_ch;
1039     unsigned int ch_buf;
1040
1041     if (NULL == t->channel_head)
1042     {
1043       /* Probably getting buffer for a channel create/handshake. */
1044       return 64;
1045     }
1046
1047     for (iter_ch = t->channel_head; NULL != iter_ch; iter_ch = iter_ch->next)
1048     {
1049       ch_buf = GMCH_get_buffer (iter_ch->ch, fwd);
1050       if (ch_buf > buffer)
1051         buffer = ch_buf;
1052     }
1053     return buffer;
1054   }
1055
1056   /* If not terminal, return sum of connection buffers */
1057   while (NULL != iter)
1058   {
1059     if (GMC_get_state (iter->c) != MESH_CONNECTION_READY)
1060     {
1061       iter = iter->next;
1062       continue;
1063     }
1064
1065     buffer += GMC_get_buffer (iter->c, fwd);
1066     iter = iter->next;
1067   }
1068
1069   return buffer;
1070 }
1071
1072
1073 /**
1074  * Get the tunnel's destination.
1075  *
1076  * @param t Tunnel.
1077  *
1078  * @return ID of the destination peer.
1079  */
1080 const struct GNUNET_PeerIdentity *
1081 GMT_get_destination (struct MeshTunnel3 *t)
1082 {
1083   return GMP_get_id (t->peer);
1084 }
1085
1086
1087 /**
1088  * Get the tunnel's next free global channel ID.
1089  *
1090  * @param t Tunnel.
1091  *
1092  * @return GID of a channel free to use.
1093  */
1094 MESH_ChannelNumber
1095 GMT_get_next_chid (struct MeshTunnel3 *t)
1096 {
1097   MESH_ChannelNumber chid;
1098
1099   while (NULL != GMT_get_channel (t, t->next_chid))
1100   {
1101     LOG (GNUNET_ERROR_TYPE_DEBUG, "Channel %u exists...\n", t->next_chid);
1102     t->next_chid = (t->next_chid + 1) & ~GNUNET_MESH_LOCAL_CHANNEL_ID_CLI;
1103   }
1104   chid = t->next_chid;
1105   t->next_chid = (t->next_chid + 1) & ~GNUNET_MESH_LOCAL_CHANNEL_ID_CLI;
1106
1107   return chid;
1108 }
1109
1110
1111 /**
1112  * Send ACK on one or more channels due to buffer in connections.
1113  *
1114  * @param t Channel which has some free buffer space.
1115  * @param fwd Is this for FWD traffic? (ACK goes to root)
1116  */
1117 void
1118 GMT_unchoke_channels (struct MeshTunnel3 *t, int fwd)
1119 {
1120   struct MeshTChannel *iter;
1121   unsigned int buffer;
1122   unsigned int channels = GMT_count_channels (t);
1123   unsigned int choked_n;
1124   struct MeshChannel *choked[channels];
1125
1126   LOG (GNUNET_ERROR_TYPE_DEBUG, "GMT_unchoke_channels on %s\n", GMT_2s (t));
1127
1128   if (NULL == t)
1129   {
1130     GNUNET_break (0);
1131     return;
1132   }
1133
1134   /* Get buffer space */
1135   buffer = GMT_get_buffer (t, fwd);
1136   if (0 == buffer)
1137   {
1138     return;
1139   }
1140
1141   /* Count and remember choked channels */
1142   choked_n = 0;
1143   for (iter = t->channel_head; NULL != iter; iter = iter->next)
1144   {
1145     if (GNUNET_NO == GMCH_get_allowed (iter->ch, fwd))
1146     {
1147       choked[choked_n++] = iter->ch;
1148     }
1149   }
1150
1151   /* Unchoke random channels */
1152   while (0 < buffer && 0 < choked_n)
1153   {
1154     unsigned int r = GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_WEAK,
1155                                                choked_n);
1156     GMCH_allow_client (choked[r], fwd);
1157     choked_n--;
1158     buffer--;
1159     choked[r] = choked[choked_n];
1160   }
1161 }
1162
1163
1164 /**
1165  * Send ACK on one or more connections due to buffer space to the client.
1166  *
1167  * Iterates all connections of the tunnel and sends ACKs appropriately.
1168  *
1169  * @param t Tunnel.
1170  * @param fwd Is this in for FWD traffic? (ACK goes dest->root)
1171  */
1172 void
1173 GMT_send_acks (struct MeshTunnel3 *t, int fwd)
1174 {
1175   struct MeshTConnection *iter;
1176   uint32_t allowed;
1177   uint32_t to_allow;
1178   uint32_t allow_per_connection;
1179   unsigned int cs;
1180   unsigned int buffer;
1181
1182   LOG (GNUNET_ERROR_TYPE_DEBUG,
1183        "Tunnel send %s ACKs on %s\n",
1184        fwd ? "FWD" : "BCK", GMT_2s (t));
1185
1186   if (NULL == t)
1187   {
1188     GNUNET_break (0);
1189     return;
1190   }
1191   if (NULL == t->channel_head ||
1192       GNUNET_NO == GMCH_is_origin (t->channel_head->ch, !fwd))
1193   {
1194     GNUNET_break (0);
1195     return;
1196   }
1197
1198   buffer = GMT_get_buffer (t, fwd);
1199
1200   /* Count connections, how many messages are already allowed */
1201   cs = GMT_count_connections (t);
1202   for (allowed = 0, iter = t->connection_head; NULL != iter; iter = iter->next)
1203   {
1204     allowed += GMC_get_allowed (iter->c, fwd);
1205   }
1206
1207   /* Make sure there is no overflow */
1208   if (allowed > buffer)
1209   {
1210     GNUNET_break (0);
1211     return;
1212   }
1213
1214   /* Authorize connections to send more data */
1215   to_allow = buffer; /* - allowed; */
1216
1217   for (iter = t->connection_head; NULL != iter && to_allow > 0; iter = iter->next)
1218   {
1219     allow_per_connection = to_allow/cs;
1220     to_allow -= allow_per_connection;
1221     cs--;
1222     if (GMC_get_allowed (iter->c, fwd) > 64 / 3)
1223     {
1224       continue;
1225     }
1226     GMC_allow (iter->c, buffer, fwd);
1227   }
1228
1229   GNUNET_break (to_allow == 0);
1230 }
1231
1232
1233 /**
1234  * Sends an already built message on a tunnel, GMT_encrypting it and
1235  * choosing the best connection.
1236  *
1237  * @param message Message to send. Function modifies it.
1238  * @param t Tunnel on which this message is transmitted.
1239  * @param ch Channel on which this message is transmitted.
1240  * @param fwd Is this a fwd message?
1241  */
1242 void
1243 GMT_send_prebuilt_message (const struct GNUNET_MessageHeader *message,
1244                            struct MeshTunnel3 *t,
1245                            struct MeshChannel *ch,
1246                            int fwd)
1247 {
1248   struct MeshConnection *c;
1249   struct GNUNET_MESH_Encrypted *msg;
1250   size_t size = ntohs (message->size);
1251   char *cbuf[sizeof (struct GNUNET_MESH_Encrypted) + size];
1252   uint64_t iv;
1253   uint16_t type;
1254
1255   LOG (GNUNET_ERROR_TYPE_DEBUG, "GMT Send on Tunnel %s\n", GMP_2s (t->peer));
1256
1257   iv = GNUNET_CRYPTO_random_u64 (GNUNET_CRYPTO_QUALITY_NONCE, UINT64_MAX);
1258   msg = (struct GNUNET_MESH_Encrypted *) cbuf;
1259   msg->header.type = htons (GNUNET_MESSAGE_TYPE_MESH_ENCRYPTED);
1260   msg->header.size = htons (sizeof (struct GNUNET_MESH_Encrypted) + size);
1261   msg->iv = GNUNET_htonll (iv);
1262   GMT_encrypt (t, &msg[1], message, size, iv, fwd);
1263   c = tunnel_get_connection (t, fwd);
1264   if (NULL == c)
1265   {
1266     GNUNET_break (GNUNET_YES == t->destroy);
1267     return;
1268   }
1269   type = ntohs (message->type);
1270   switch (type)
1271   {
1272     case GNUNET_MESSAGE_TYPE_MESH_DATA:
1273     case GNUNET_MESSAGE_TYPE_MESH_CHANNEL_CREATE:
1274     case GNUNET_MESSAGE_TYPE_MESH_CHANNEL_DESTROY:
1275     case GNUNET_MESSAGE_TYPE_MESH_CHANNEL_ACK:
1276       msg->cid = *GMC_get_id (c);
1277       msg->ttl = htonl (default_ttl);
1278       break;
1279     default:
1280       LOG (GNUNET_ERROR_TYPE_DEBUG, "unkown type %s\n",
1281            GNUNET_MESH_DEBUG_M2S (type));
1282       GNUNET_break (0);
1283   }
1284   msg->reserved = 0;
1285
1286   t->pending_messages++;
1287   GMC_send_prebuilt_message (&msg->header, c, ch, fwd);
1288 }
1289
1290 /**
1291  * Is the tunnel directed towards the local peer?
1292  *
1293  * @param t Tunnel.
1294  *
1295  * @return GNUNET_YES if it is loopback.
1296  */
1297 int
1298 GMT_is_loopback (const struct MeshTunnel3 *t)
1299 {
1300   return (myid == GMP_get_short_id(t->peer));
1301 }
1302
1303
1304 /**
1305  * Is the tunnel using this path already?
1306  *
1307  * @param t Tunnel.
1308  * @param p Path.
1309  *
1310  * @return GNUNET_YES a connection uses this path.
1311  */
1312 int
1313 GMT_is_path_used (const struct MeshTunnel3 *t, const struct MeshPeerPath *p)
1314 {
1315   struct MeshTConnection *iter;
1316
1317   for (iter = t->connection_head; NULL != iter; iter = iter->next)
1318     if (GMC_get_path (iter->c) == p)
1319       return GNUNET_YES;
1320
1321   return GNUNET_NO;
1322 }
1323
1324
1325 /**
1326  * Get a cost of a path for a tunnel considering existing connections.
1327  *
1328  * @param t Tunnel.
1329  * @param path Candidate path.
1330  *
1331  * @return Cost of the path (path length + number of overlapping nodes)
1332  */
1333 unsigned int
1334 GMT_get_path_cost (const struct MeshTunnel3 *t,
1335                    const struct MeshPeerPath *path)
1336 {
1337   struct MeshTConnection *iter;
1338   unsigned int overlap;
1339   unsigned int i;
1340   unsigned int j;
1341
1342   if (NULL == path)
1343     return 0;
1344
1345   overlap = 0;
1346   GNUNET_assert (NULL != t);
1347
1348   for (i = 0; i < path->length; i++)
1349   {
1350     for (iter = t->connection_head; NULL != iter; iter = iter->next)
1351     {
1352       for (j = 0; j < GMC_get_path (iter->c)->length; j++)
1353       {
1354         if (path->peers[i] == GMC_get_path (iter->c)->peers[j])
1355         {
1356           overlap++;
1357           break;
1358         }
1359       }
1360     }
1361   }
1362   return (path->length + overlap) * (path->score * -1);
1363 }
1364
1365
1366 /**
1367  * Get the static string for the peer this tunnel is directed.
1368  *
1369  * @param t Tunnel.
1370  *
1371  * @return Static string the destination peer's ID.
1372  */
1373 const char *
1374 GMT_2s (const struct MeshTunnel3 *t)
1375 {
1376   return GMP_2s (t->peer);
1377 }