-fix doxygen warning
[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 id Peer identity.
628  * @param key ECC private key, to derive all other keys and do crypto.
629  */
630 void
631 GMT_init (const struct GNUNET_CONFIGURATION_Handle *c,
632           const struct GNUNET_CRYPTO_EddsaPrivateKey *key)
633 {
634   LOG (GNUNET_ERROR_TYPE_DEBUG, "init\n");
635   if (GNUNET_OK !=
636       GNUNET_CONFIGURATION_get_value_number (c, "MESH", "DEFAULT_TTL",
637                                              &default_ttl))
638   {
639     GNUNET_log_config_invalid (GNUNET_ERROR_TYPE_WARNING,
640                                "MESH", "DEFAULT_TTL", "USING DEFAULT");
641     default_ttl = 64;
642   }
643   my_private_key = key;
644 }
645
646
647 /**
648  * Shut down the tunnel subsystem.
649  */
650 void
651 GMT_shutdown (void)
652 {
653 }
654
655
656 /**
657  * Create a tunnel.
658  *
659  * @param destination Peer this tunnel is towards.
660  */
661 struct MeshTunnel3 *
662 GMT_new (struct MeshPeer *destination)
663 {
664   struct MeshTunnel3 *t;
665
666   t = GNUNET_new (struct MeshTunnel3);
667   t->next_chid = 0;
668   t->peer = destination;
669 //   if (GNUNET_OK !=
670 //       GNUNET_CONTAINER_multihashmap_put (tunnels, tid, t,
671 //                                          GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST))
672 //   {
673 //     GNUNET_break (0);
674 //     tunnel_destroy (t);
675 //     return NULL;
676 //   }
677
678 //   char salt[] = "salt";
679 //   GNUNET_CRYPTO_kdf (&t->e_key, sizeof (struct GNUNET_CRYPTO_SymmetricSessionKey),
680 //                      salt, sizeof (salt),
681 //                      &t->e_key, sizeof (struct GNUNET_CRYPTO_SymmetricSessionKey),
682 //                      &my_full_id, sizeof (struct GNUNET_PeerIdentity),
683 //                      GNUNET_PEER_resolve2 (t->peer->id), sizeof (struct GNUNET_PeerIdentity),
684 //                      NULL);
685 //   GNUNET_CRYPTO_kdf (&t->d_key, sizeof (struct GNUNET_CRYPTO_SymmetricSessionKey),
686 //                      salt, sizeof (salt),
687 //                      &t->d_key, sizeof (struct GNUNET_CRYPTO_SymmetricSessionKey),
688 //                      GNUNET_PEER_resolve2 (t->peer->id), sizeof (struct GNUNET_PeerIdentity),
689 //                      &my_full_id, sizeof (struct GNUNET_PeerIdentity),
690 //                      NULL);
691
692   return t;
693 }
694
695
696 /**
697  * Change the tunnel state.
698  *
699  * @param t Tunnel whose state to change.
700  * @param state New state.
701  */
702 void
703 GMT_change_state (struct MeshTunnel3* t, enum MeshTunnel3State state)
704 {
705   if (NULL == t)
706     return;
707   LOG (GNUNET_ERROR_TYPE_DEBUG,
708               "Tunnel %s state was %s\n",
709               GMP_2s (t->peer),
710               GMT_state2s (t->state));
711   LOG (GNUNET_ERROR_TYPE_DEBUG,
712               "Tunnel %s state is now %s\n",
713               GMP_2s (t->peer),
714               GMT_state2s (state));
715   t->state = state;
716   if (MESH_TUNNEL3_READY == state && 3 <= GMT_count_connections (t))
717   {
718     GMP_stop_search (t->peer);
719   }
720 }
721
722
723 /**
724  * Add a connection to a tunnel.
725  *
726  * @param t Tunnel.
727  * @param c Connection.
728  */
729 void
730 GMT_add_connection (struct MeshTunnel3 *t, struct MeshConnection *c)
731 {
732   struct MeshTConnection *aux;
733
734   for (aux = t->connection_head; aux != NULL; aux = aux->next)
735     if (aux->c == c)
736       return;
737
738   aux = GNUNET_new (struct MeshTConnection);
739   aux->c = c;
740   GNUNET_CONTAINER_DLL_insert_tail (t->connection_head, t->connection_tail, aux);
741 }
742
743
744 /**
745  * Remove a connection from a tunnel.
746  *
747  * @param t Tunnel.
748  * @param c Connection.
749  */
750 void
751 GMT_remove_connection (struct MeshTunnel3 *t, struct MeshConnection *c)
752 {
753   struct MeshTConnection *aux;
754
755   for (aux = t->connection_head; aux != NULL; aux = aux->next)
756     if (aux->c == c)
757     {
758       GNUNET_CONTAINER_DLL_remove (t->connection_head, t->connection_tail, aux);
759       GNUNET_free (aux);
760       return;
761     }
762 }
763
764
765 /**
766  * Add a channel to a tunnel.
767  *
768  * @param t Tunnel.
769  * @param ch Channel.
770  */
771 void
772 GMT_add_channel (struct MeshTunnel3 *t, struct MeshChannel *ch)
773 {
774   struct MeshTChannel *aux;
775
776   for (aux = t->channel_head; aux != NULL; aux = aux->next)
777     if (aux->ch == ch)
778       return;
779
780   aux = GNUNET_new (struct MeshTChannel);
781   aux->ch = ch;
782   GNUNET_CONTAINER_DLL_insert_tail (t->channel_head, t->channel_tail, aux);
783 }
784
785
786 /**
787  * Remove a channel from a tunnel.
788  *
789  * @param t Tunnel.
790  * @param ch Channel.
791  */
792 void
793 GMT_remove_channel (struct MeshTunnel3 *t, struct MeshChannel *ch)
794 {
795   struct MeshTChannel *aux;
796
797   for (aux = t->channel_head; aux != NULL; aux = aux->next)
798     if (aux->ch == ch)
799     {
800       GNUNET_CONTAINER_DLL_remove (t->channel_head, t->channel_tail, aux);
801       GNUNET_free (aux);
802       return;
803     }
804 }
805
806
807 /**
808  * Search for a channel by global ID.
809  *
810  * @param t Tunnel containing the channel.
811  * @param chid Public channel number.
812  *
813  * @return channel handler, NULL if doesn't exist
814  */
815 struct MeshChannel *
816 GMT_get_channel (struct MeshTunnel3 *t, MESH_ChannelNumber chid)
817 {
818   struct MeshTChannel *iter;
819
820   if (NULL == t)
821     return NULL;
822
823   for (iter = t->channel_head; NULL != iter; iter = iter->next)
824   {
825     if (GMCH_get_id (iter->ch) == chid)
826       break;
827   }
828
829   return NULL == iter ? NULL : iter->ch;
830 }
831
832
833 /**
834  * Tunnel is empty: destroy it.
835  *
836  * Notifies all connections about the destruction.
837  *
838  * @param t Tunnel to destroy.
839  */
840 void
841 GMT_destroy_empty (struct MeshTunnel3 *t)
842 {
843   struct MeshTConnection *iter;
844
845   for (iter = t->connection_head; NULL != iter; iter = iter->next)
846   {
847     GMC_send_destroy (iter->c);
848   }
849
850   if (0 == t->pending_messages)
851     GMT_destroy (t);
852   else
853     t->destroy = GNUNET_YES;
854 }
855
856
857 /**
858  * Destroy tunnel if empty (no more channels).
859  *
860  * @param t Tunnel to destroy if empty.
861  */
862 void
863 GMT_destroy_if_empty (struct MeshTunnel3 *t)
864 {
865   if (1 < GMT_count_channels (t))
866     return;
867
868   GMT_destroy_empty (t);
869 }
870
871
872 /**
873  * Destroy the tunnel.
874  *
875  * This function does not generate any warning traffic to clients or peers.
876  *
877  * Tasks:
878  * Cancel messages belonging to this tunnel queued to neighbors.
879  * Free any allocated resources linked to the tunnel.
880  *
881  * @param t The tunnel to destroy.
882  */
883 void
884 GMT_destroy (struct MeshTunnel3 *t)
885 {
886   struct MeshTConnection *iter;
887   struct MeshTConnection *next;
888
889   if (NULL == t)
890     return;
891
892   LOG (GNUNET_ERROR_TYPE_DEBUG, "destroying tunnel %s\n", GMP_2s (t->peer));
893
894 //   if (GNUNET_YES != GNUNET_CONTAINER_multihashmap_remove (tunnels, &t->id, t))
895 //     GNUNET_break (0);
896
897   for (iter = t->connection_head; NULL != iter; iter = next)
898   {
899     next = iter->next;
900     GMC_destroy (iter->c);
901     GNUNET_free (iter);
902   }
903
904   GNUNET_STATISTICS_update (stats, "# tunnels", -1, GNUNET_NO);
905   GMP_set_tunnel (t->peer, NULL);
906
907   GNUNET_free (t);
908 }
909
910
911 /**
912  * @brief Use the given path for the tunnel.
913  * Update the next and prev hops (and RCs).
914  * (Re)start the path refresh in case the tunnel is locally owned.
915  *
916  * @param t Tunnel to update.
917  * @param p Path to use.
918  *
919  * @return Connection created.
920  */
921 struct MeshConnection *
922 GMT_use_path (struct MeshTunnel3 *t, struct MeshPeerPath *p)
923 {
924   struct MeshConnection *c;
925   struct GNUNET_HashCode cid;
926   unsigned int own_pos;
927
928   if (NULL == t || NULL == p)
929   {
930     GNUNET_break (0);
931     return NULL;
932   }
933
934   for (own_pos = 0; own_pos < p->length; own_pos++)
935   {
936     if (p->peers[own_pos] == myid)
937       break;
938   }
939   if (own_pos > p->length - 1)
940   {
941     GNUNET_break (0);
942     return NULL;
943   }
944
945   GNUNET_CRYPTO_hash_create_random (GNUNET_CRYPTO_QUALITY_NONCE, &cid);
946   c = GMC_new (&cid, t, p, own_pos);
947   GMT_add_connection (t, c);
948   return c;
949 }
950
951
952 /**
953  * Count established (ready) connections of a tunnel.
954  *
955  * @param t Tunnel on which to count.
956  *
957  * @return Number of connections.
958  */
959 unsigned int
960 GMT_count_connections (struct MeshTunnel3 *t)
961 {
962   struct MeshTConnection *iter;
963   unsigned int count;
964
965   for (count = 0, iter = t->connection_head;
966        NULL != iter;
967        iter = iter->next, count++);
968
969   return count;
970 }
971
972 /**
973  * Count channels of a tunnel.
974  *
975  * @param t Tunnel on which to count.
976  *
977  * @return Number of channels.
978  */
979 unsigned int
980 GMT_count_channels (struct MeshTunnel3 *t)
981 {
982   struct MeshTChannel *iter;
983   unsigned int count;
984
985   for (count = 0, iter = t->channel_head;
986        NULL != iter;
987        iter = iter->next, count++) /* skip */;
988
989   return count;
990 }
991
992
993 /**
994  * Get the state of a tunnel.
995  *
996  * @param t Tunnel.
997  *
998  * @return Tunnel's state.
999  */
1000 enum MeshTunnel3State
1001 GMT_get_state (struct MeshTunnel3 *t)
1002 {
1003   if (NULL == t)
1004     return (enum MeshTunnel3State) -1;
1005   return t->state;
1006 }
1007
1008 /**
1009  * Get the total buffer space for a tunnel.
1010  *
1011  * If terminal, use the biggest channel buffer (or 64) if no channel exists.
1012  * If not terminal, use the sum of all connection buffers.
1013  *
1014  * @param t Tunnel.
1015  * @param fwd Is this for FWD traffic?
1016  *
1017  * @return Buffer space offered by all entities (c/ch) in the tunnel.
1018  */
1019 unsigned int
1020 GMT_get_buffer (struct MeshTunnel3 *t, int fwd)
1021 {
1022   struct MeshTConnection *iter;
1023   unsigned int buffer;
1024
1025   iter = t->connection_head;
1026   buffer = 0;
1027
1028   /* If terminal, return biggest channel buffer */
1029   if (NULL == iter || GMC_is_terminal (iter->c, fwd))
1030   {
1031     struct MeshTChannel *iter_ch;
1032     unsigned int ch_buf;
1033
1034     if (NULL == t->channel_head)
1035     {
1036       /* Probably getting buffer for a channel create/handshake. */
1037       return 64;
1038     }
1039
1040     for (iter_ch = t->channel_head; NULL != iter_ch; iter_ch = iter_ch->next)
1041     {
1042       ch_buf = GMCH_get_buffer (iter_ch->ch, fwd);
1043       if (ch_buf > buffer)
1044         buffer = ch_buf;
1045     }
1046     return buffer;
1047   }
1048
1049   /* If not terminal, return sum of connection buffers */
1050   while (NULL != iter)
1051   {
1052     if (GMC_get_state (iter->c) != MESH_CONNECTION_READY)
1053     {
1054       iter = iter->next;
1055       continue;
1056     }
1057
1058     buffer += GMC_get_buffer (iter->c, fwd);
1059     iter = iter->next;
1060   }
1061
1062   return buffer;
1063 }
1064
1065
1066 /**
1067  * Get the tunnel's destination.
1068  *
1069  * @param t Tunnel.
1070  *
1071  * @return ID of the destination peer.
1072  */
1073 const struct GNUNET_PeerIdentity *
1074 GMT_get_destination (struct MeshTunnel3 *t)
1075 {
1076   return GMP_get_id (t->peer);
1077 }
1078
1079
1080 /**
1081  * Get the tunnel's next free global channel ID.
1082  *
1083  * @param t Tunnel.
1084  *
1085  * @return GID of a channel free to use.
1086  */
1087 MESH_ChannelNumber
1088 GMT_get_next_chid (struct MeshTunnel3 *t)
1089 {
1090   MESH_ChannelNumber chid;
1091
1092   while (NULL != GMT_get_channel (t, t->next_chid))
1093   {
1094     LOG (GNUNET_ERROR_TYPE_DEBUG, "Channel %u exists...\n", t->next_chid);
1095     t->next_chid = (t->next_chid + 1) & ~GNUNET_MESH_LOCAL_CHANNEL_ID_CLI;
1096   }
1097   chid = t->next_chid;
1098   t->next_chid = (t->next_chid + 1) & ~GNUNET_MESH_LOCAL_CHANNEL_ID_CLI;
1099
1100   return chid;
1101 }
1102
1103
1104 /**
1105  * Send ACK on one or more channels due to buffer in connections..
1106  *
1107  * @param t Channel which has some free buffer space.
1108  * @param fwd Is this for FWD traffic? (ACK goes to root)
1109  */
1110 void
1111 GMT_unchoke_channels (struct MeshTunnel3 *t, int fwd)
1112 {
1113   struct MeshTChannel *iter;
1114   unsigned int buffer;
1115   unsigned int channels = GMT_count_channels (t);
1116   unsigned int choked_n;
1117   struct MeshChannel *choked[channels];
1118
1119   LOG (GNUNET_ERROR_TYPE_DEBUG, "GMT_unchoke_channels on %s\n", GMT_2s (t));
1120
1121   if (NULL == t)
1122   {
1123     GNUNET_break (0);
1124     return;
1125   }
1126
1127   /* Get buffer space */
1128   buffer = GMT_get_buffer (t, fwd);
1129   if (0 == buffer)
1130   {
1131     return;
1132   }
1133
1134   /* Count and remember choked channels */
1135   choked_n = 0;
1136   for (iter = t->channel_head; NULL != iter; iter = iter->next)
1137   {
1138     if (GNUNET_NO == GMCH_get_allowed (iter->ch, fwd))
1139     {
1140       choked[choked_n++] = iter->ch;
1141     }
1142   }
1143
1144   /* Unchoke random channels */
1145   while (0 < buffer && 0 < choked_n)
1146   {
1147     unsigned int r = GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_WEAK,
1148                                                choked_n);
1149     GMCH_allow_client (choked[r], fwd);
1150     choked_n--;
1151     buffer--;
1152     choked[r] = choked[choked_n];
1153   }
1154 }
1155
1156
1157 /**
1158  * Send ACK on one or more connections due to buffer space to the client.
1159  *
1160  * Iterates all connections of the tunnel and sends ACKs appropriately.
1161  *
1162  * @param t Tunnel.
1163  * @param fwd Is this in for FWD traffic? (ACK goes dest->root)
1164  */
1165 void
1166 GMT_send_acks (struct MeshTunnel3 *t, int fwd)
1167 {
1168   struct MeshTConnection *iter;
1169   uint32_t allowed;
1170   uint32_t to_allow;
1171   uint32_t allow_per_connection;
1172   unsigned int cs;
1173   unsigned int buffer;
1174
1175   LOG (GNUNET_ERROR_TYPE_DEBUG,
1176        "Tunnel send %s ACKs on %s\n",
1177        fwd ? "FWD" : "BCK", GMT_2s (t));
1178
1179   if (NULL == t)
1180   {
1181     GNUNET_break (0);
1182     return;
1183   }
1184   if (NULL == t->channel_head ||
1185       GNUNET_NO == GMCH_is_origin (t->channel_head->ch, !fwd))
1186   {
1187     GNUNET_break (0);
1188     return;
1189   }
1190
1191   buffer = GMT_get_buffer (t, fwd);
1192
1193   /* Count connections, how many messages are already allowed */
1194   cs = GMT_count_connections (t);
1195   for (allowed = 0, iter = t->connection_head; NULL != iter; iter = iter->next)
1196   {
1197     allowed += GMC_get_allowed (iter->c, fwd);
1198   }
1199
1200   /* Make sure there is no overflow */
1201   if (allowed > buffer)
1202   {
1203     GNUNET_break (0);
1204     return;
1205   }
1206
1207   /* Authorize connections to send more data */
1208   to_allow = buffer; /* - allowed; */
1209
1210   for (iter = t->connection_head; NULL != iter && to_allow > 0; iter = iter->next)
1211   {
1212     allow_per_connection = to_allow/cs;
1213     to_allow -= allow_per_connection;
1214     cs--;
1215     if (GMC_get_allowed (iter->c, fwd) > 64 / 3)
1216     {
1217       continue;
1218     }
1219     GMC_allow (iter->c, buffer, fwd);
1220   }
1221
1222   GNUNET_break (to_allow == 0);
1223 }
1224
1225
1226 /**
1227  * Sends an already built message on a tunnel, GMT_encrypting it and
1228  * choosing the best connection.
1229  *
1230  * @param message Message to send. Function modifies it.
1231  * @param t Tunnel on which this message is transmitted.
1232  * @param ch Channel on which this message is transmitted.
1233  * @param fwd Is this a fwd message?
1234  */
1235 void
1236 GMT_send_prebuilt_message (const struct GNUNET_MessageHeader *message,
1237                            struct MeshTunnel3 *t,
1238                            struct MeshChannel *ch,
1239                            int fwd)
1240 {
1241   struct MeshConnection *c;
1242   struct GNUNET_MESH_Encrypted *msg;
1243   size_t size = ntohs (message->size);
1244   char *cbuf[sizeof (struct GNUNET_MESH_Encrypted) + size];
1245   uint64_t iv;
1246   uint16_t type;
1247
1248   LOG (GNUNET_ERROR_TYPE_DEBUG, "GMT Send on Tunnel %s\n", GMP_2s (t->peer));
1249
1250   iv = GNUNET_CRYPTO_random_u64 (GNUNET_CRYPTO_QUALITY_NONCE, UINT64_MAX);
1251   msg = (struct GNUNET_MESH_Encrypted *) cbuf;
1252   msg->header.type = htons (GNUNET_MESSAGE_TYPE_MESH_ENCRYPTED);
1253   msg->header.size = htons (sizeof (struct GNUNET_MESH_Encrypted) + size);
1254   msg->iv = GNUNET_htonll (iv);
1255   GMT_encrypt (t, &msg[1], message, size, iv, fwd);
1256   c = tunnel_get_connection (t, fwd);
1257   if (NULL == c)
1258   {
1259     GNUNET_break (GNUNET_YES == t->destroy);
1260     return;
1261   }
1262   type = ntohs (message->type);
1263   switch (type)
1264   {
1265     case GNUNET_MESSAGE_TYPE_MESH_DATA:
1266     case GNUNET_MESSAGE_TYPE_MESH_CHANNEL_CREATE:
1267     case GNUNET_MESSAGE_TYPE_MESH_CHANNEL_DESTROY:
1268     case GNUNET_MESSAGE_TYPE_MESH_CHANNEL_ACK:
1269       msg->cid = *GMC_get_id (c);
1270       msg->ttl = htonl (default_ttl);
1271       break;
1272     default:
1273       LOG (GNUNET_ERROR_TYPE_DEBUG, "unkown type %s\n",
1274            GNUNET_MESH_DEBUG_M2S (type));
1275       GNUNET_break (0);
1276   }
1277   msg->reserved = 0;
1278
1279   t->pending_messages++;
1280   GMC_send_prebuilt_message (&msg->header, c, ch, fwd);
1281 }
1282
1283 /**
1284  * Is the tunnel directed towards the local peer?
1285  *
1286  * @param t Tunnel.
1287  *
1288  * @return GNUNET_YES if it is loopback.
1289  */
1290 int
1291 GMT_is_loopback (const struct MeshTunnel3 *t)
1292 {
1293   return (myid == GMP_get_short_id(t->peer));
1294 }
1295
1296
1297 /**
1298  * Is the tunnel using this path already?
1299  *
1300  * @param t Tunnel.
1301  * @param p Path.
1302  *
1303  * @return GNUNET_YES a connection uses this path.
1304  */
1305 int
1306 GMT_is_path_used (const struct MeshTunnel3 *t, const struct MeshPeerPath *p)
1307 {
1308   struct MeshTConnection *iter;
1309
1310   for (iter = t->connection_head; NULL != iter; iter = iter->next)
1311     if (GMC_get_path (iter->c) == p)
1312       return GNUNET_YES;
1313
1314   return GNUNET_NO;
1315 }
1316
1317
1318 /**
1319  * Get a cost of a path for a tunnel considering existing connections.
1320  *
1321  * @param t Tunnel.
1322  * @param path Candidate path.
1323  *
1324  * @return Cost of the path (path length + number of overlapping nodes)
1325  */
1326 unsigned int
1327 GMT_get_path_cost (const struct MeshTunnel3 *t,
1328                    const struct MeshPeerPath *path)
1329 {
1330   struct MeshTConnection *iter;
1331   unsigned int overlap;
1332   unsigned int i;
1333   unsigned int j;
1334
1335   if (NULL == path)
1336     return 0;
1337
1338   overlap = 0;
1339   GNUNET_assert (NULL != t);
1340
1341   for (i = 0; i < path->length; i++)
1342   {
1343     for (iter = t->connection_head; NULL != iter; iter = iter->next)
1344     {
1345       for (j = 0; j < GMC_get_path (iter->c)->length; j++)
1346       {
1347         if (path->peers[i] == GMC_get_path (iter->c)->peers[j])
1348         {
1349           overlap++;
1350           break;
1351         }
1352       }
1353     }
1354   }
1355   return (path->length + overlap) * (path->score * -1);
1356 }
1357
1358
1359 /**
1360  * Get the static string for the peer this tunnel is directed.
1361  *
1362  * @param t Tunnel.
1363  *
1364  * @return Static string the destination peer's ID.
1365  */
1366 const char *
1367 GMT_2s (const struct MeshTunnel3 *t)
1368 {
1369   return GMP_2s (t->peer);
1370 }