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