7cf53b333342b05f4b27ca1f48d93aabffe1436f
[oweals/gnunet.git] / src / mesh / gnunet-service-mesh_channel.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
22 #include "platform.h"
23 #include "gnunet_util_lib.h"
24
25 #include "gnunet_statistics_service.h"
26
27 #include "mesh.h"
28 #include "mesh_protocol.h"
29
30 #include "gnunet-service-mesh_channel.h"
31 #include "gnunet-service-mesh_local.h"
32 #include "gnunet-service-mesh_tunnel.h"
33 #include "gnunet-service-mesh_peer.h"
34
35 #define LOG(level, ...) GNUNET_log_from(level,"mesh-chn",__VA_ARGS__)
36
37 #define MESH_RETRANSMIT_TIME    GNUNET_TIME_UNIT_SECONDS
38 #define MESH_RETRANSMIT_MARGIN  4
39
40
41 /**
42  * All the states a connection can be in.
43  */
44 enum MeshChannelState
45 {
46   /**
47    * Uninitialized status, should never appear in operation.
48    */
49   MESH_CHANNEL_NEW,
50
51   /**
52    * Connection create message sent, waiting for ACK.
53    */
54   MESH_CHANNEL_SENT,
55
56   /**
57    * Connection confirmed, ready to carry traffic.
58    */
59   MESH_CHANNEL_READY,
60 };
61
62
63 /**
64  * Info holder for channel messages in queues.
65  */
66 struct MeshChannelQueue
67 {
68   /**
69    * Tunnel Queue.
70    */
71   struct MeshTunnel3Queue *q;
72
73   /**
74    * Message type (DATA/DATA_ACK)
75    */
76   uint16_t type;
77
78   /**
79    * Message copy (for DATAs, to start retransmission timer)
80    */
81   struct MeshReliableMessage *copy;
82
83   /**
84    * Reliability (for DATA_ACKs, to access rel->ack_q)
85    */
86   struct MeshChannelReliability *rel;
87 };
88
89
90 /**
91  * Info needed to retry a message in case it gets lost.
92  */
93 struct MeshReliableMessage
94 {
95     /**
96      * Double linked list, FIFO style
97      */
98   struct MeshReliableMessage    *next;
99   struct MeshReliableMessage    *prev;
100
101     /**
102      * Type of message (payload, channel management).
103      */
104   int16_t type;
105
106     /**
107      * Tunnel Reliability queue this message is in.
108      */
109   struct MeshChannelReliability  *rel;
110
111     /**
112      * ID of the message (ACK needed to free)
113      */
114   uint32_t                      mid;
115
116   /**
117    * Tunnel Queue.
118    */
119   struct MeshChannelQueue       *q;
120
121     /**
122      * When was this message issued (to calculate ACK delay)
123      */
124   struct GNUNET_TIME_Absolute   timestamp;
125
126   /* struct GNUNET_MESH_Data with payload */
127 };
128
129
130 /**
131  * Info about the traffic state for a client in a channel.
132  */
133 struct MeshChannelReliability
134 {
135     /**
136      * Channel this is about.
137      */
138   struct MeshChannel *ch;
139
140     /**
141      * DLL of messages sent and not yet ACK'd.
142      */
143   struct MeshReliableMessage        *head_sent;
144   struct MeshReliableMessage        *tail_sent;
145
146     /**
147      * DLL of messages received out of order.
148      */
149   struct MeshReliableMessage        *head_recv;
150   struct MeshReliableMessage        *tail_recv;
151
152     /**
153      * Messages received.
154      */
155   unsigned int                      n_recv;
156
157     /**
158      * Next MID to use for outgoing traffic.
159      */
160   uint32_t                          mid_send;
161
162     /**
163      * Next MID expected for incoming traffic.
164      */
165   uint32_t                          mid_recv;
166
167     /**
168      * Handle for queued DATA_ACKs.
169      */
170   struct MeshChannelQueue           *ack_q;
171
172     /**
173      * Can we send data to the client?
174      */
175   int                               client_ready;
176
177   /**
178    * Can the client send data to us?
179    */
180   int                               client_allowed;
181
182     /**
183      * Task to resend/poll in case no ACK is received.
184      */
185   GNUNET_SCHEDULER_TaskIdentifier   retry_task;
186
187     /**
188      * Counter for exponential backoff.
189      */
190   struct GNUNET_TIME_Relative       retry_timer;
191
192     /**
193      * How long does it usually take to get an ACK.
194      */
195   struct GNUNET_TIME_Relative       expected_delay;
196 };
197
198
199 /**
200  * Struct containing all information regarding a channel to a remote client.
201  */
202 struct MeshChannel
203 {
204     /**
205      * Tunnel this channel is in.
206      */
207   struct MeshTunnel3 *t;
208
209     /**
210      * Destination port of the channel.
211      */
212   uint32_t port;
213
214     /**
215      * Global channel number ( < GNUNET_MESH_LOCAL_CHANNEL_ID_CLI)
216      */
217   MESH_ChannelNumber gid;
218
219     /**
220      * Local tunnel number for root (owner) client.
221      * ( >= GNUNET_MESH_LOCAL_CHANNEL_ID_CLI or 0 )
222      */
223   MESH_ChannelNumber lid_root;
224
225     /**
226      * Local tunnel number for local destination clients (incoming number)
227      * ( >= GNUNET_MESH_LOCAL_CHANNEL_ID_SERV or 0).
228      */
229   MESH_ChannelNumber lid_dest;
230
231     /**
232      * Channel state.
233      */
234   enum MeshChannelState state;
235
236     /**
237      * Is the tunnel bufferless (minimum latency)?
238      */
239   int nobuffer;
240
241     /**
242      * Is the tunnel reliable?
243      */
244   int reliable;
245
246     /**
247      * Last time the channel was used
248      */
249   struct GNUNET_TIME_Absolute timestamp;
250
251     /**
252      * Client owner of the tunnel, if any
253      */
254   struct MeshClient *root;
255
256     /**
257      * Client destination of the tunnel, if any.
258      */
259   struct MeshClient *dest;
260
261     /**
262      * Flag to signal the destruction of the channel.
263      * If this is set GNUNET_YES the channel will be destroyed
264      * when the queue is empty.
265      */
266   int destroy;
267
268     /**
269      * Total (reliable) messages pending ACK for this channel.
270      */
271   unsigned int pending_messages;
272
273     /**
274      * Reliability data.
275      * Only present (non-NULL) at the owner of a tunnel.
276      */
277   struct MeshChannelReliability *root_rel;
278
279     /**
280      * Reliability data.
281      * Only present (non-NULL) at the destination of a tunnel.
282      */
283   struct MeshChannelReliability *dest_rel;
284
285 };
286
287
288 /******************************************************************************/
289 /*******************************   GLOBALS  ***********************************/
290 /******************************************************************************/
291
292 /**
293  * Global handle to the statistics service.
294  */
295 extern struct GNUNET_STATISTICS_Handle *stats;
296
297 /**
298  * Local peer own ID (memory efficient handle).
299  */
300 extern GNUNET_PEER_Id myid;
301
302
303 /******************************************************************************/
304 /********************************   STATIC  ***********************************/
305 /******************************************************************************/
306
307 /**
308  * Destroy a reliable message after it has been acknowledged, either by
309  * direct mid ACK or bitfield. Updates the appropriate data structures and
310  * timers and frees all memory.
311  *
312  * @param copy Message that is no longer needed: remote peer got it.
313  * @param update_time Is the timing information relevant?
314  *                    If this message is ACK in a batch the timing information
315  *                    is skewed by the retransmission, count only for the
316  *                    retransmitted message.
317  */
318 static void
319 rel_message_free (struct MeshReliableMessage *copy, int update_time);
320
321 /**
322  * We have received a message out of order, or the client is not ready.
323  * Buffer it until we receive an ACK from the client or the missing
324  * message from the channel.
325  *
326  * @param msg Message to buffer (MUST be of type MESH_DATA).
327  * @param rel Reliability data to the corresponding direction.
328  */
329 static void
330 add_buffered_data (const struct GNUNET_MESH_Data *msg,
331                    struct MeshChannelReliability *rel)
332 {
333   struct MeshReliableMessage *copy;
334   struct MeshReliableMessage *prev;
335   uint32_t mid;
336   uint16_t size;
337
338   size = ntohs (msg->header.size);
339   mid = ntohl (msg->mid);
340
341   LOG (GNUNET_ERROR_TYPE_DEBUG, "add_buffered_data %u\n", mid);
342
343   copy = GNUNET_malloc (sizeof (*copy) + size);
344   copy->mid = mid;
345   copy->rel = rel;
346   copy->type = GNUNET_MESSAGE_TYPE_MESH_DATA;
347   memcpy (&copy[1], msg, size);
348
349   rel->n_recv++;
350
351   // FIXME do something better than O(n), although n < 64...
352   // FIXME start from the end (most messages are the latest ones)
353   for (prev = rel->head_recv; NULL != prev; prev = prev->next)
354   {
355     LOG (GNUNET_ERROR_TYPE_DEBUG, " prev %u\n", prev->mid);
356     if (GM_is_pid_bigger (prev->mid, mid))
357     {
358       LOG (GNUNET_ERROR_TYPE_DEBUG, " bingo!\n");
359       GNUNET_CONTAINER_DLL_insert_before (rel->head_recv, rel->tail_recv,
360                                           prev, copy);
361       return;
362     }
363   }
364     LOG (GNUNET_ERROR_TYPE_DEBUG, " insert at tail!\n");
365     GNUNET_CONTAINER_DLL_insert_tail (rel->head_recv, rel->tail_recv, copy);
366     LOG (GNUNET_ERROR_TYPE_DEBUG, "add_buffered_data END\n");
367 }
368
369 /**
370  * Add a destination client to a channel, initializing all data structures
371  * in the channel and the client.
372  *
373  * @param ch Channel to which add the destination.
374  * @param c Client which to add to the channel.
375  */
376 static void
377 add_destination (struct MeshChannel *ch, struct MeshClient *c)
378 {
379   if (NULL != ch->dest)
380   {
381     GNUNET_break (0);
382     return;
383   }
384
385   /* Assign local id as destination */
386   ch->lid_dest = GML_get_next_chid (c);
387
388   /* Store in client's hashmap */
389   GML_channel_add (c, ch->lid_dest, ch);
390
391   GNUNET_break (NULL == ch->dest_rel);
392   ch->dest_rel = GNUNET_new (struct MeshChannelReliability);
393   ch->dest_rel->ch = ch;
394   ch->dest_rel->expected_delay.rel_value_us = 0;
395
396   ch->dest = c;
397 }
398
399
400 /**
401  * Send data to a client.
402  *
403  * If the client is ready, send directly, otherwise buffer while listening
404  * for a local ACK.
405  *
406  * @param ch Channel
407  * @param msg Message.
408  * @param fwd Is this a fwd (root->dest) message?
409  */
410 static void
411 send_client_data (struct MeshChannel *ch,
412                   const struct GNUNET_MESH_Data *msg,
413                   int fwd)
414 {
415   if (fwd)
416   {
417     if (ch->dest_rel->client_ready)
418       GML_send_data (ch->dest, msg, ch->lid_dest);
419     else
420       add_buffered_data (msg, ch->dest_rel);
421   }
422   else
423   {
424     if (ch->root_rel->client_ready)
425       GML_send_data (ch->root, msg, ch->lid_root);
426     else
427       add_buffered_data (msg, ch->root_rel);
428   }
429 }
430
431
432 /**
433  * Send a buffered message to the client, for in order delivery or
434  * as result of client ACK.
435  *
436  * @param ch Channel on which to empty the message buffer.
437  * @param c Client to send to.
438  * @param fwd Is this to send FWD data?.
439  */
440 static void
441 send_client_buffered_data (struct MeshChannel *ch,
442                            struct MeshClient *c,
443                            int fwd)
444 {
445   struct MeshReliableMessage *copy;
446   struct MeshChannelReliability *rel;
447
448   LOG (GNUNET_ERROR_TYPE_DEBUG, "send_buffered_data\n");
449   rel = fwd ? ch->dest_rel : ch->root_rel;
450   if (GNUNET_NO == rel->client_ready)
451   {
452     LOG (GNUNET_ERROR_TYPE_DEBUG, "client not ready\n");
453     return;
454   }
455
456   copy = rel->head_recv;
457   /* We never buffer channel management messages */
458   if (NULL != copy)
459   {
460     if (copy->mid == rel->mid_recv || GNUNET_NO == ch->reliable)
461     {
462       struct GNUNET_MESH_Data *msg = (struct GNUNET_MESH_Data *) &copy[1];
463
464       LOG (GNUNET_ERROR_TYPE_DEBUG,
465            " have %u! now expecting %u\n",
466            copy->mid, rel->mid_recv + 1);
467       send_client_data (ch, msg, fwd);
468       rel->n_recv--;
469       rel->mid_recv++;
470       GNUNET_CONTAINER_DLL_remove (rel->head_recv, rel->tail_recv, copy);
471       GNUNET_free (copy);
472     }
473     else
474     {
475       LOG (GNUNET_ERROR_TYPE_DEBUG,
476            " reliable && don't have %u, next is %u\n",
477            rel->mid_recv,
478            copy->mid);
479       return;
480     }
481   }
482   LOG (GNUNET_ERROR_TYPE_DEBUG, "send_buffered_data END\n");
483 }
484
485
486 /**
487  * Allow a client to send more data.
488  *
489  * In case the client was already allowed to send data, do nothing.
490  *
491  * @param ch Channel.
492  * @param fwd Is this a FWD ACK? (FWD ACKs are sent to root)
493  */
494 static void
495 send_client_ack (struct MeshChannel *ch, int fwd)
496 {
497   struct MeshChannelReliability *rel = fwd ? ch->root_rel : ch->dest_rel;
498
499   LOG (GNUNET_ERROR_TYPE_DEBUG,
500        "  sending %s ack to client on channel %s\n",
501        GM_f2s (fwd), GMCH_2s (ch));
502
503   if (NULL == rel)
504   {
505     GNUNET_break (0);
506     return;
507   }
508
509   if (GNUNET_YES == rel->client_allowed)
510   {
511     LOG (GNUNET_ERROR_TYPE_DEBUG, "  already allowed\n");
512     return;
513   }
514   rel->client_allowed = GNUNET_YES;
515
516   GML_send_ack (fwd ? ch->root : ch->dest, fwd ? ch->lid_root : ch->lid_dest);
517 }
518
519
520 /**
521  * Notify the root that the destination rejected the channel.
522  *
523  * @param ch Rejected channel.
524  */
525 static void
526 send_client_nack (struct MeshChannel *ch)
527 {
528   if (NULL == ch->root)
529   {
530     GNUNET_break (0);
531     return;
532   }
533   GML_send_nack (ch->root, ch->lid_root);
534 }
535
536
537 /**
538  * Notify a client that the channel is no longer valid.
539  *
540  * @param ch Channel that is destroyed.
541  * @param local_only Should we avoid sending it to other peers?
542  */
543 static void
544 send_destroy (struct MeshChannel *ch, int local_only)
545 {
546   struct GNUNET_MESH_ChannelManage msg;
547
548   msg.header.type = htons (GNUNET_MESSAGE_TYPE_MESH_CHANNEL_DESTROY);
549   msg.header.size = htons (sizeof (msg));
550   msg.chid = htonl (ch->gid);
551
552   /* If root is not NULL, notify.
553    * If it's NULL, check lid_root. When a local destroy comes in, root
554    * is set to NULL but lid_root is left untouched. In this case, do nothing,
555    * the client is the one who reuqested the channel to be destroyed.
556    */
557   if (NULL != ch->root)
558     GML_send_channel_destroy (ch->root, ch->lid_root);
559   else if (0 == ch->lid_root && GNUNET_NO == local_only)
560     GMCH_send_prebuilt_message (&msg.header, ch, GNUNET_NO, NULL);
561
562   if (NULL != ch->dest)
563     GML_send_channel_destroy (ch->dest, ch->lid_dest);
564   else if (0 == ch->lid_dest && GNUNET_NO == local_only)
565     GMCH_send_prebuilt_message (&msg.header, ch, GNUNET_YES, NULL);
566 }
567
568
569 /**
570  * Destroy all reliable messages queued for a channel,
571  * during a channel destruction.
572  * Frees the reliability structure itself.
573  *
574  * @param rel Reliability data for a channel.
575  */
576 static void
577 channel_rel_free_all (struct MeshChannelReliability *rel)
578 {
579   struct MeshReliableMessage *copy;
580   struct MeshReliableMessage *next;
581
582   if (NULL == rel)
583     return;
584
585   for (copy = rel->head_recv; NULL != copy; copy = next)
586   {
587     next = copy->next;
588     GNUNET_CONTAINER_DLL_remove (rel->head_recv, rel->tail_recv, copy);
589     GNUNET_free (copy);
590   }
591   for (copy = rel->head_sent; NULL != copy; copy = next)
592   {
593     next = copy->next;
594     GNUNET_CONTAINER_DLL_remove (rel->head_sent, rel->tail_sent, copy);
595     GNUNET_free (copy);
596   }
597   if (GNUNET_SCHEDULER_NO_TASK != rel->retry_task)
598     GNUNET_SCHEDULER_cancel (rel->retry_task);
599   if (NULL != rel->ack_q)
600     GMT_cancel (rel->ack_q->q);
601   GNUNET_free (rel);
602 }
603
604
605 /**
606  * Mark future messages as ACK'd.
607  *
608  * @param rel Reliability data.
609  * @param msg DataACK message with a bitfield of future ACK'd messages.
610  */
611 static void
612 channel_rel_free_sent (struct MeshChannelReliability *rel,
613                        const struct GNUNET_MESH_DataACK *msg)
614 {
615   struct MeshReliableMessage *copy;
616   struct MeshReliableMessage *next;
617   uint64_t bitfield;
618   uint64_t mask;
619   uint32_t mid;
620   uint32_t target;
621   unsigned int i;
622
623   bitfield = msg->futures;
624   mid = ntohl (msg->mid);
625   LOG (GNUNET_ERROR_TYPE_DEBUG,
626               "!!! free_sent_reliable %u %llX\n",
627               mid, bitfield);
628   LOG (GNUNET_ERROR_TYPE_DEBUG,
629               " rel %p, head %p\n",
630               rel, rel->head_sent);
631   for (i = 0, copy = rel->head_sent;
632        i < 64 && NULL != copy && 0 != bitfield;
633        i++)
634   {
635     LOG (GNUNET_ERROR_TYPE_DEBUG,
636                 " trying bit %u (mid %u)\n",
637                 i, mid + i + 1);
638     mask = 0x1LL << i;
639     if (0 == (bitfield & mask))
640      continue;
641
642     LOG (GNUNET_ERROR_TYPE_DEBUG, " set!\n");
643     /* Bit was set, clear the bit from the bitfield */
644     bitfield &= ~mask;
645
646     /* The i-th bit was set. Do we have that copy? */
647     /* Skip copies with mid < target */
648     target = mid + i + 1;
649     LOG (GNUNET_ERROR_TYPE_DEBUG, " target %u\n", target);
650     while (NULL != copy && GM_is_pid_bigger (target, copy->mid))
651      copy = copy->next;
652
653     /* Did we run out of copies? (previously freed, it's ok) */
654     if (NULL == copy)
655     {
656      LOG (GNUNET_ERROR_TYPE_DEBUG, "run out of copies...\n");
657      return;
658     }
659
660     /* Did we overshoot the target? (previously freed, it's ok) */
661     if (GM_is_pid_bigger (copy->mid, target))
662     {
663      LOG (GNUNET_ERROR_TYPE_DEBUG, " next copy %u\n", copy->mid);
664      continue;
665     }
666
667     /* Now copy->mid == target, free it */
668     next = copy->next;
669     rel_message_free (copy, GNUNET_YES);
670     copy = next;
671   }
672   LOG (GNUNET_ERROR_TYPE_DEBUG, "free_sent_reliable END\n");
673 }
674
675
676 /**
677  * We haven't received an ACK after a certain time: restransmit the message.
678  *
679  * @param cls Closure (MeshReliableMessage with the message to restransmit)
680  * @param tc TaskContext.
681  */
682 static void
683 channel_retransmit_message (void *cls,
684                             const struct GNUNET_SCHEDULER_TaskContext *tc)
685 {
686   struct MeshChannelReliability *rel = cls;
687   struct MeshReliableMessage *copy;
688   struct MeshChannel *ch;
689   struct GNUNET_MESH_Data *payload;
690   int fwd;
691
692   rel->retry_task = GNUNET_SCHEDULER_NO_TASK;
693   if (0 != (tc->reason & GNUNET_SCHEDULER_REASON_SHUTDOWN))
694     return;
695
696   ch = rel->ch;
697   copy = rel->head_sent;
698   if (NULL == copy)
699   {
700     GNUNET_break (0);
701     return;
702   }
703
704   payload = (struct GNUNET_MESH_Data *) &copy[1];
705   fwd = (rel == ch->root_rel);
706
707   /* Message not found in the queue that we are going to use. */
708   LOG (GNUNET_ERROR_TYPE_DEBUG, "!!! RETRANSMIT %u\n", copy->mid);
709
710   GMCH_send_prebuilt_message (&payload->header, ch, fwd, copy);
711   GNUNET_STATISTICS_update (stats, "# data retransmitted", 1, GNUNET_NO);
712 }
713
714
715 /**
716  * Destroy a reliable message after it has been acknowledged, either by
717  * direct mid ACK or bitfield. Updates the appropriate data structures and
718  * timers and frees all memory.
719  *
720  * @param copy Message that is no longer needed: remote peer got it.
721  * @param update_time Is the timing information relevant?
722  *                    If this message is ACK in a batch the timing information
723  *                    is skewed by the retransmission, count only for the
724  *                    retransmitted message.
725  */
726 static void
727 rel_message_free (struct MeshReliableMessage *copy, int update_time)
728 {
729   struct MeshChannelReliability *rel;
730   struct GNUNET_TIME_Relative time;
731
732   rel = copy->rel;
733   LOG (GNUNET_ERROR_TYPE_DEBUG, "!!! Freeing %u\n", copy->mid);
734   if (update_time)
735   {
736     time = GNUNET_TIME_absolute_get_duration (copy->timestamp);
737     if (0 == rel->expected_delay.rel_value_us)
738       rel->expected_delay = time;
739     else
740     {
741       rel->expected_delay.rel_value_us *= 7;
742       rel->expected_delay.rel_value_us += time.rel_value_us;
743       rel->expected_delay.rel_value_us /= 8;
744     }
745     LOG (GNUNET_ERROR_TYPE_DEBUG, "!!!  took %s\n",
746                 GNUNET_STRINGS_relative_time_to_string (time, GNUNET_NO));
747     LOG (GNUNET_ERROR_TYPE_DEBUG, "!!!  new expected delay %s\n",
748                 GNUNET_STRINGS_relative_time_to_string (rel->expected_delay,
749                                                         GNUNET_NO));
750     rel->retry_timer = rel->expected_delay;
751   }
752   else
753   {
754     LOG (GNUNET_ERROR_TYPE_DEBUG, "!!! batch free, ignoring timing\n");
755   }
756   rel->ch->pending_messages--;
757   if (GNUNET_NO != rel->ch->destroy && 0 == rel->ch->pending_messages)
758   {
759     struct MeshTunnel3 *t = rel->ch->t;
760     GMCH_destroy (rel->ch);
761     GMT_destroy_if_empty (t);
762   }
763   if (NULL != copy->q)
764   {
765     GMT_cancel (copy->q->q);
766   }
767   GNUNET_CONTAINER_DLL_remove (rel->head_sent, rel->tail_sent, copy);
768   GNUNET_free (copy);
769 }
770
771
772 /**
773  * Confirm we got a channel create.
774  *
775  * @param ch The channel to confirm.
776  * @param fwd Should we send a FWD ACK? (going dest->root)
777  */
778 static void
779 channel_send_ack (struct MeshChannel *ch, int fwd)
780 {
781   struct GNUNET_MESH_ChannelManage msg;
782
783   msg.header.size = htons (sizeof (msg));
784   msg.header.type = htons (GNUNET_MESSAGE_TYPE_MESH_CHANNEL_ACK);
785   LOG (GNUNET_ERROR_TYPE_DEBUG,
786               "  sending channel %s ack for channel %s\n",
787               GM_f2s (fwd), GMCH_2s (ch));
788
789   msg.chid = htonl (ch->gid);
790   GMCH_send_prebuilt_message (&msg.header, ch, !fwd, NULL);
791 }
792
793
794 /**
795  * Notify that a channel create didn't succeed.
796  *
797  * @param ch The channel to reject.
798  */
799 static void
800 channel_send_nack (struct MeshChannel *ch)
801 {
802   struct GNUNET_MESH_ChannelManage msg;
803
804   msg.header.size = htons (sizeof (msg));
805   msg.header.type = htons (GNUNET_MESSAGE_TYPE_MESH_CHANNEL_NACK);
806   LOG (GNUNET_ERROR_TYPE_DEBUG,
807        "  sending channel NACK for channel %s\n",
808        GMCH_2s (ch));
809
810   msg.chid = htonl (ch->gid);
811   GMCH_send_prebuilt_message (&msg.header, ch, GNUNET_NO, NULL);
812 }
813
814
815 /**
816  * Channel was ACK'd by remote peer, mark as ready and cancel retransmission.
817  *
818  * @param ch Channel to mark as ready.
819  * @param fwd Was the ACK message a FWD ACK? (dest->root, SYNACK)
820  */
821 static void
822 channel_confirm (struct MeshChannel *ch, int fwd)
823 {
824   struct MeshChannelReliability *rel;
825   struct MeshReliableMessage *copy;
826   struct MeshReliableMessage *next;
827
828   LOG (GNUNET_ERROR_TYPE_DEBUG,
829               "  channel confirm %s %s:%X\n",
830               GM_f2s (fwd), GMT_2s (ch->t), ch->gid);
831   ch->state = MESH_CHANNEL_READY;
832
833   rel = fwd ? ch->root_rel : ch->dest_rel;
834   rel->client_ready = GNUNET_YES;
835   for (copy = rel->head_sent; NULL != copy; copy = next)
836   {
837     struct GNUNET_MessageHeader *msg;
838
839     next = copy->next;
840     msg = (struct GNUNET_MessageHeader *) &copy[1];
841     if (ntohs (msg->type) == GNUNET_MESSAGE_TYPE_MESH_CHANNEL_CREATE)
842     {
843       rel_message_free (copy, GNUNET_YES);
844       /* TODO return? */
845     }
846   }
847   send_client_ack (ch, fwd);
848
849   /* In case of a FWD ACK (SYNACK) send a BCK ACK (ACK). */
850   if (fwd)
851     channel_send_ack (ch, !fwd);
852 }
853
854
855 /**
856  * Message has been sent: start retransmission timer.
857  *
858  * @param cls Closure (queue structure).
859  * @param t Tunnel.
860  * @param q Queue handler (no longer valid).
861  * @param type Type of message.
862  * @param size Size of the message.
863  */
864 static void
865 ch_message_sent (void *cls,
866                  struct MeshTunnel3 *t,
867                  struct MeshTunnel3Queue *q,
868                  uint16_t type, size_t size)
869 {
870   struct MeshChannelQueue *ch_q = cls;
871   struct MeshReliableMessage *copy = ch_q->copy;
872   struct MeshChannelReliability *rel;
873
874   switch (ch_q->type)
875   {
876     case GNUNET_MESSAGE_TYPE_MESH_DATA:
877       LOG (GNUNET_ERROR_TYPE_DEBUG, "!!! SENT %u %s\n",
878            NULL != copy ? copy->mid : 0, GM_m2s (type));
879       copy->timestamp = GNUNET_TIME_absolute_get ();
880       rel = copy->rel;
881       if (GNUNET_SCHEDULER_NO_TASK == rel->retry_task)
882       {
883         if (0 != rel->expected_delay.rel_value_us)
884         {
885           rel->retry_timer =
886               GNUNET_TIME_relative_multiply (rel->expected_delay,
887                                              MESH_RETRANSMIT_MARGIN);
888         }
889         else
890         {
891           rel->retry_timer = MESH_RETRANSMIT_TIME;
892         }
893         rel->retry_task =
894             GNUNET_SCHEDULER_add_delayed (rel->retry_timer,
895                                           &channel_retransmit_message,
896                                           rel);
897       }
898       copy->q = NULL;
899       break;
900
901
902     case GNUNET_MESSAGE_TYPE_MESH_DATA_ACK:
903       rel = ch_q->rel;
904       GNUNET_assert (rel->ack_q == ch_q);
905       rel->ack_q = NULL;
906       break;
907
908
909     default:
910       GNUNET_break (0);
911       GNUNET_free (ch_q);
912       return;
913   }
914
915   GNUNET_free (ch_q);
916 }
917
918
919 /**
920  * Save a copy to retransmit in case it gets lost.
921  *
922  * Initializes all needed callbacks and timers.
923  *
924  * @param ch Channel this message goes on.
925  * @param msg Message to copy.
926  * @param fwd Is this fwd traffic?
927  */
928 static struct MeshReliableMessage *
929 channel_save_copy (struct MeshChannel *ch,
930                    const struct GNUNET_MessageHeader *msg,
931                    int fwd)
932 {
933   struct MeshChannelReliability *rel;
934   struct MeshReliableMessage *copy;
935   uint32_t mid;
936   uint16_t type;
937   uint16_t size;
938
939   rel = fwd ? ch->root_rel : ch->dest_rel;
940   mid = rel->mid_send - 1;
941   type = ntohs (msg->type);
942   size = ntohs (msg->size);
943
944   LOG (GNUNET_ERROR_TYPE_DEBUG, "!!! SAVE %u %s\n", mid, GM_m2s (type));
945   copy = GNUNET_malloc (sizeof (struct MeshReliableMessage) + size);
946   copy->mid = mid;
947   copy->rel = rel;
948   copy->type = type;
949   memcpy (&copy[1], msg, size);
950   GNUNET_CONTAINER_DLL_insert_tail (rel->head_sent, rel->tail_sent, copy);
951   ch->pending_messages++;
952
953   return copy;
954 }
955
956
957 /**
958  * Create a new channel.
959  *
960  * @param t Tunnel this channel is in.
961  * @param owner Client that owns the channel, NULL for foreign channels.
962  * @param lid_root Local ID for root client.
963  *
964  * @return A new initialized channel. NULL on error.
965  */
966 static struct MeshChannel *
967 channel_new (struct MeshTunnel3 *t,
968              struct MeshClient *owner,
969              MESH_ChannelNumber lid_root)
970 {
971   struct MeshChannel *ch;
972
973   ch = GNUNET_new (struct MeshChannel);
974   ch->root = owner;
975   ch->lid_root = lid_root;
976   ch->t = t;
977
978   GNUNET_STATISTICS_update (stats, "# channels", 1, GNUNET_NO);
979
980   if (NULL != owner)
981   {
982     ch->gid = GMT_get_next_chid (t);
983     GML_channel_add (owner, lid_root, ch);
984   }
985   GMT_add_channel (t, ch);
986
987   return ch;
988 }
989
990
991 /**
992  * Set options in a channel, extracted from a bit flag field
993  *
994  * @param ch Channel to set options to.
995  * @param options Bit array in host byte order.
996  */
997 static void
998 channel_set_options (struct MeshChannel *ch, uint32_t options)
999 {
1000   ch->nobuffer = (options & GNUNET_MESH_OPTION_NOBUFFER) != 0 ?
1001                  GNUNET_YES : GNUNET_NO;
1002   ch->reliable = (options & GNUNET_MESH_OPTION_RELIABLE) != 0 ?
1003                  GNUNET_YES : GNUNET_NO;
1004 }
1005
1006 static int
1007 is_loopback (const struct MeshChannel *ch)
1008 {
1009   if (NULL != ch->t)
1010     return GMT_is_loopback (ch->t);
1011
1012   return (NULL != ch->root && NULL != ch->dest);
1013 }
1014
1015
1016 /**
1017  * Handle a loopback message: call the appropriate handler for the message type.
1018  *
1019  * @param ch Channel this message is on.
1020  * @param msgh Message header.
1021  * @param fwd Is this FWD traffic?
1022  */
1023 void
1024 handle_loopback (struct MeshChannel *ch,
1025                  const struct GNUNET_MessageHeader *msgh,
1026                  int fwd)
1027 {
1028   uint16_t type;
1029
1030   type = ntohs (msgh->type);
1031   LOG (GNUNET_ERROR_TYPE_DEBUG,
1032        "Loopback %s %s message!\n",
1033        GM_f2s (fwd), GM_m2s (type));
1034
1035   switch (type)
1036   {
1037     case GNUNET_MESSAGE_TYPE_MESH_DATA:
1038       /* Don't send hop ACK, wait for client to ACK */
1039       GMCH_handle_data (ch, (struct GNUNET_MESH_Data *) msgh, fwd);
1040       break;
1041
1042     case GNUNET_MESSAGE_TYPE_MESH_DATA_ACK:
1043       GMCH_handle_data_ack (ch, (struct GNUNET_MESH_DataACK *) msgh, fwd);
1044       break;
1045
1046     case GNUNET_MESSAGE_TYPE_MESH_CHANNEL_CREATE:
1047       GMCH_handle_create (ch->t,
1048                           (struct GNUNET_MESH_ChannelCreate *) msgh);
1049       break;
1050
1051     case GNUNET_MESSAGE_TYPE_MESH_CHANNEL_ACK:
1052       GMCH_handle_ack (ch,
1053                        (struct GNUNET_MESH_ChannelManage *) msgh,
1054                        fwd);
1055       break;
1056
1057     case GNUNET_MESSAGE_TYPE_MESH_CHANNEL_NACK:
1058       GMCH_handle_nack (ch);
1059       break;
1060
1061     case GNUNET_MESSAGE_TYPE_MESH_CHANNEL_DESTROY:
1062       GMCH_handle_destroy (ch,
1063                            (struct GNUNET_MESH_ChannelManage *) msgh,
1064                            fwd);
1065       break;
1066
1067     default:
1068       GNUNET_break_op (0);
1069       LOG (GNUNET_ERROR_TYPE_DEBUG,
1070            "end-to-end message not known (%u)\n",
1071            ntohs (msgh->type));
1072   }
1073 }
1074
1075
1076
1077 /******************************************************************************/
1078 /********************************    API    ***********************************/
1079 /******************************************************************************/
1080
1081 /**
1082  * Destroy a channel and free all resources.
1083  *
1084  * @param ch Channel to destroy.
1085  */
1086 void
1087 GMCH_destroy (struct MeshChannel *ch)
1088 {
1089   struct MeshClient *c;
1090
1091   if (NULL == ch)
1092     return;
1093
1094   LOG (GNUNET_ERROR_TYPE_DEBUG, "destroying channel %s:%u\n",
1095               GMT_2s (ch->t), ch->gid);
1096   GMCH_debug (ch);
1097
1098   c = ch->root;
1099   if (NULL != c)
1100   {
1101     GML_channel_remove (c, ch->lid_root, ch);
1102   }
1103
1104   c = ch->dest;
1105   if (NULL != c)
1106   {
1107     GML_channel_remove (c, ch->lid_dest, ch);
1108   }
1109
1110   channel_rel_free_all (ch->root_rel);
1111   channel_rel_free_all (ch->dest_rel);
1112
1113   GMT_remove_channel (ch->t, ch);
1114   GNUNET_STATISTICS_update (stats, "# channels", -1, GNUNET_NO);
1115
1116   GNUNET_free (ch);
1117 }
1118
1119
1120 /**
1121  * Get channel ID.
1122  *
1123  * @param ch Channel.
1124  *
1125  * @return ID
1126  */
1127 MESH_ChannelNumber
1128 GMCH_get_id (const struct MeshChannel *ch)
1129 {
1130   return ch->gid;
1131 }
1132
1133
1134 /**
1135  * Get the channel tunnel.
1136  *
1137  * @param ch Channel to get the tunnel from.
1138  *
1139  * @return tunnel of the channel.
1140  */
1141 struct MeshTunnel3 *
1142 GMCH_get_tunnel (const struct MeshChannel *ch)
1143 {
1144   return ch->t;
1145 }
1146
1147
1148 /**
1149  * Get free buffer space towards the client on a specific channel.
1150  *
1151  * @param ch Channel.
1152  * @param fwd Is query about FWD traffic?
1153  *
1154  * @return Free buffer space [0 - 64]
1155  */
1156 unsigned int
1157 GMCH_get_buffer (struct MeshChannel *ch, int fwd)
1158 {
1159   struct MeshChannelReliability *rel;
1160
1161   rel = fwd ? ch->dest_rel : ch->root_rel;
1162
1163   /* If rel is NULL it means that the end is not yet created,
1164    * most probably is a loopback channel at the point of sending
1165    * the ChannelCreate to itself.
1166    */
1167   if (NULL == rel)
1168     return 64;
1169
1170   return (64 - rel->n_recv);
1171 }
1172
1173
1174 /**
1175  * Get flow control status of end point: is client allow to send?
1176  *
1177  * @param ch Channel.
1178  * @param fwd Is query about FWD traffic? (Request root status).
1179  *
1180  * @return #GNUNET_YES if client is allowed to send us data.
1181  */
1182 int
1183 GMCH_get_allowed (struct MeshChannel *ch, int fwd)
1184 {
1185   struct MeshChannelReliability *rel;
1186
1187   rel = fwd ? ch->root_rel : ch->dest_rel;
1188
1189   if (NULL == rel)
1190   {
1191     /* Probably shutting down: root/dest NULL'ed to mark disconnection */
1192     GNUNET_break (GNUNET_NO != ch->destroy);
1193     return 0;
1194   }
1195
1196   return rel->client_allowed;
1197 }
1198
1199
1200 /**
1201  * Is the root client for this channel on this peer?
1202  *
1203  * @param ch Channel.
1204  * @param fwd Is this for fwd traffic?
1205  *
1206  * @return #GNUNET_YES in case it is.
1207  */
1208 int
1209 GMCH_is_origin (struct MeshChannel *ch, int fwd)
1210 {
1211   struct MeshClient *c;
1212
1213   c = fwd ? ch->root : ch->dest;
1214   return NULL != c;
1215 }
1216
1217
1218 /**
1219  * Is the destination client for this channel on this peer?
1220  *
1221  * @param ch Channel.
1222  * @param fwd Is this for fwd traffic?
1223  *
1224  * @return #GNUNET_YES in case it is.
1225  */
1226 int
1227 GMCH_is_terminal (struct MeshChannel *ch, int fwd)
1228 {
1229   struct MeshClient *c;
1230
1231   c = fwd ? ch->dest : ch->root;
1232   return NULL != c;
1233 }
1234
1235
1236 /**
1237  * Notify the destination client that a new incoming channel was created.
1238  *
1239  * @param ch Channel that was created.
1240  */
1241 void
1242 GMCH_send_create (struct MeshChannel *ch)
1243 {
1244   uint32_t opt;
1245
1246   if (NULL == ch->dest)
1247     return;
1248
1249   opt = 0;
1250   opt |= GNUNET_YES == ch->reliable ? GNUNET_MESH_OPTION_RELIABLE : 0;
1251   opt |= GNUNET_YES == ch->nobuffer ? GNUNET_MESH_OPTION_NOBUFFER : 0;
1252   GML_send_channel_create (ch->dest, ch->lid_dest, ch->port, opt,
1253                            GMT_get_destination (ch->t));
1254
1255 }
1256
1257
1258 /**
1259  * Send an end-to-end ACK message for the most recent in-sequence payload.
1260  *
1261  * If channel is not reliable, do nothing.
1262  *
1263  * @param ch Channel this is about.
1264  * @param fwd Is for FWD traffic? (ACK dest->owner)
1265  */
1266 void
1267 GMCH_send_data_ack (struct MeshChannel *ch, int fwd)
1268 {
1269   struct GNUNET_MESH_DataACK msg;
1270   struct MeshChannelReliability *rel;
1271   struct MeshReliableMessage *copy;
1272   unsigned int delta;
1273   uint64_t mask;
1274   uint32_t ack;
1275
1276   if (GNUNET_NO == ch->reliable)
1277   {
1278     return;
1279   }
1280   rel = fwd ? ch->dest_rel : ch->root_rel;
1281   ack = rel->mid_recv - 1;
1282   LOG (GNUNET_ERROR_TYPE_DEBUG,
1283               " !! Send DATA_ACK for %u\n",
1284               ack);
1285
1286   msg.header.type = htons (GNUNET_MESSAGE_TYPE_MESH_DATA_ACK);
1287   msg.header.size = htons (sizeof (msg));
1288   msg.chid = htonl (ch->gid);
1289   msg.futures = 0;
1290   for (copy = rel->head_recv; NULL != copy; copy = copy->next)
1291   {
1292     if (copy->type != GNUNET_MESSAGE_TYPE_MESH_DATA)
1293     {
1294       LOG (GNUNET_ERROR_TYPE_DEBUG,
1295            "!!  Type %s, expected DATA\n",
1296            GM_m2s (copy->type));
1297       continue;
1298     }
1299     if (copy->mid == ack + 1)
1300     {
1301       ack++;
1302       continue;
1303     }
1304     delta = copy->mid - (ack + 1);
1305     if (63 < delta)
1306       break;
1307     mask = 0x1LL << delta;
1308     msg.futures |= mask;
1309     LOG (GNUNET_ERROR_TYPE_DEBUG,
1310          " !! setting bit for %u (delta %u) (%llX) -> %llX\n",
1311          copy->mid, delta, mask, msg.futures);
1312   }
1313   msg.mid = htonl (ack);
1314   LOG (GNUNET_ERROR_TYPE_DEBUG,
1315        "!!! ACK for %u, futures %llX\n",
1316        ack, msg.futures);
1317
1318   GMCH_send_prebuilt_message (&msg.header, ch, !fwd, NULL);
1319   LOG (GNUNET_ERROR_TYPE_DEBUG, "send_data_ack END\n");
1320 }
1321
1322
1323 /**
1324  * Allow a client to send us more data, in case it was choked.
1325  *
1326  * @param ch Channel.
1327  * @param fwd Is this about FWD traffic? (Root client).
1328  */
1329 void
1330 GMCH_allow_client (struct MeshChannel *ch, int fwd)
1331 {
1332   struct MeshChannelReliability *rel;
1333   unsigned int buffer;
1334
1335   LOG (GNUNET_ERROR_TYPE_DEBUG, "GMCH allow\n");
1336
1337   if (MESH_CHANNEL_READY != ch->state)
1338   {
1339     LOG (GNUNET_ERROR_TYPE_DEBUG, " channel not ready yet!\n");
1340     return;
1341   }
1342
1343   if (GNUNET_YES == ch->reliable)
1344   {
1345     rel = fwd ? ch->root_rel : ch->dest_rel;
1346     if (NULL == rel)
1347     {
1348       GNUNET_break (GNUNET_NO != ch->destroy);
1349       return;
1350     }
1351     if (NULL != rel->head_sent && 64 <= rel->mid_send - rel->head_sent->mid)
1352     {
1353       LOG (GNUNET_ERROR_TYPE_DEBUG, " too big MID gap! Wait for ACK.\n");
1354       return;
1355     }
1356   }
1357
1358   if (is_loopback (ch))
1359     buffer = GMCH_get_buffer (ch, fwd);
1360   else
1361     buffer = GMT_get_connections_buffer (ch->t);
1362
1363   if (0 == buffer)
1364   {
1365     LOG (GNUNET_ERROR_TYPE_DEBUG, " no buffer space.\n");
1366     return;
1367   }
1368
1369   LOG (GNUNET_ERROR_TYPE_DEBUG, " buffer space %u, allowing\n", buffer);
1370   send_client_ack (ch, fwd);
1371 }
1372
1373
1374 /**
1375  * Log channel info.
1376  *
1377  * @param ch Channel.
1378  */
1379 void
1380 GMCH_debug (struct MeshChannel *ch)
1381 {
1382   if (NULL == ch)
1383   {
1384     LOG (GNUNET_ERROR_TYPE_DEBUG, "*** DEBUG NULL CHANNEL ***\n");
1385     return;
1386   }
1387   LOG (GNUNET_ERROR_TYPE_DEBUG, "Channel %s:%X (%p)\n",
1388               GMT_2s (ch->t), ch->gid, ch);
1389   LOG (GNUNET_ERROR_TYPE_DEBUG, "  root %p/%p\n",
1390               ch->root, ch->root_rel);
1391   if (NULL != ch->root)
1392   {
1393     LOG (GNUNET_ERROR_TYPE_DEBUG, "  cli %s\n", GML_2s (ch->root));
1394     LOG (GNUNET_ERROR_TYPE_DEBUG, "  ready %s\n",
1395                 ch->root_rel->client_ready ? "YES" : "NO");
1396     LOG (GNUNET_ERROR_TYPE_DEBUG, "  id %X\n", ch->lid_root);
1397   }
1398   LOG (GNUNET_ERROR_TYPE_DEBUG, "  dest %p/%p\n",
1399               ch->dest, ch->dest_rel);
1400   if (NULL != ch->dest)
1401   {
1402     LOG (GNUNET_ERROR_TYPE_DEBUG, "  cli %s\n", GML_2s (ch->dest));
1403     LOG (GNUNET_ERROR_TYPE_DEBUG, "  ready %s\n",
1404                 ch->dest_rel->client_ready ? "YES" : "NO");
1405     LOG (GNUNET_ERROR_TYPE_DEBUG, "  id %X\n", ch->lid_dest);
1406   }
1407 }
1408
1409
1410 /**
1411  * Handle an ACK given by a client.
1412  *
1413  * Mark client as ready and send him any buffered data we could have for him.
1414  *
1415  * @param ch Channel.
1416  * @param fwd Is this a "FWD ACK"? (FWD ACKs are sent by dest and go BCK)
1417  */
1418 void
1419 GMCH_handle_local_ack (struct MeshChannel *ch, int fwd)
1420 {
1421   struct MeshChannelReliability *rel;
1422   struct MeshClient *c;
1423
1424   rel = fwd ? ch->dest_rel : ch->root_rel;
1425   c   = fwd ? ch->dest     : ch->root;
1426
1427   rel->client_ready = GNUNET_YES;
1428   send_client_buffered_data (ch, c, fwd);
1429   if (is_loopback (ch))
1430   {
1431     unsigned int buffer;
1432
1433     buffer = GMCH_get_buffer (ch, fwd);
1434     if (0 < buffer)
1435       GMCH_allow_client (ch, fwd);
1436
1437     return;
1438   }
1439   GMT_send_connection_acks (ch->t);
1440 }
1441
1442
1443 /**
1444  * Handle data given by a client.
1445  *
1446  * Check whether the client is allowed to send in this tunnel, save if channel
1447  * is reliable and send an ACK to the client if there is still buffer space
1448  * in the tunnel.
1449  *
1450  * @param ch Channel.
1451  * @param c Client which sent the data.
1452  * @param message Message.
1453  * @param fwd Is this a FWD data?
1454  *
1455  * @return GNUNET_OK if everything goes well, GNUNET_SYSERR in case of en error.
1456  */
1457 int
1458 GMCH_handle_local_data (struct MeshChannel *ch,
1459                         struct MeshClient *c,
1460                         struct GNUNET_MessageHeader *message,
1461                         int fwd)
1462 {
1463   struct MeshChannelReliability *rel;
1464   struct GNUNET_MESH_Data *payload;
1465   size_t size = ntohs (message->size);
1466   uint16_t p2p_size = sizeof(struct GNUNET_MESH_Data) + size;
1467   unsigned char cbuf[p2p_size];
1468
1469   /* Is the client in the channel? */
1470   if ( !( (fwd &&
1471            ch->root == c)
1472          ||
1473           (!fwd &&
1474            ch->dest == c) ) )
1475   {
1476     GNUNET_break_op (0);
1477     return GNUNET_SYSERR;
1478   }
1479
1480   rel = fwd ? ch->root_rel : ch->dest_rel;
1481
1482   if (GNUNET_NO == rel->client_allowed)
1483   {
1484     GNUNET_break_op (0);
1485     return GNUNET_SYSERR;
1486   }
1487
1488   rel->client_allowed = GNUNET_NO;
1489
1490   /* Ok, everything is correct, send the message. */
1491   payload = (struct GNUNET_MESH_Data *) cbuf;
1492   payload->mid = htonl (rel->mid_send);
1493   rel->mid_send++;
1494   memcpy (&payload[1], message, size);
1495   payload->header.size = htons (p2p_size);
1496   payload->header.type = htons (GNUNET_MESSAGE_TYPE_MESH_DATA);
1497   payload->chid = htonl (ch->gid);
1498   LOG (GNUNET_ERROR_TYPE_DEBUG, "  sending on channel...\n");
1499   GMCH_send_prebuilt_message (&payload->header, ch, fwd, NULL);
1500
1501   if (is_loopback (ch))
1502   {
1503     if (GMCH_get_buffer (ch, fwd) > 0)
1504       send_client_ack (ch, fwd);
1505
1506     return GNUNET_OK;
1507   }
1508
1509   if (GMT_get_connections_buffer (ch->t) > 0)
1510   {
1511     send_client_ack (ch, fwd);
1512   }
1513
1514   return GNUNET_OK;
1515 }
1516
1517
1518 /**
1519  * Handle a channel destroy requested by a client.
1520  *
1521  * Destroy the channel and the tunnel in case this was the last channel.
1522  *
1523  * @param ch Channel.
1524  * @param c Client that requested the destruction (to avoid notifying him).
1525  * @param is_root Is the request coming from root?
1526  */
1527 void
1528 GMCH_handle_local_destroy (struct MeshChannel *ch,
1529                            struct MeshClient *c,
1530                            int is_root)
1531 {
1532   struct MeshTunnel3 *t;
1533
1534   ch->destroy = GNUNET_YES;
1535   /* Cleanup after the tunnel */
1536   if (GNUNET_NO == is_root && c == ch->dest)
1537   {
1538     LOG (GNUNET_ERROR_TYPE_DEBUG, " Client %s is destination.\n", GML_2s (c));
1539     GML_client_delete_channel (c, ch, ch->lid_dest);
1540     ch->dest = NULL;
1541   }
1542   if (GNUNET_YES == is_root && c == ch->root)
1543   {
1544     LOG (GNUNET_ERROR_TYPE_DEBUG, " Client %s is owner.\n", GML_2s (c));
1545     GML_client_delete_channel (c, ch, ch->lid_root);
1546     ch->root = NULL;
1547   }
1548
1549   t = ch->t;
1550   send_destroy (ch, GNUNET_NO);
1551   if (0 == ch->pending_messages)
1552   {
1553     GMCH_destroy (ch);
1554     GMT_destroy_if_empty (t);
1555   }
1556 }
1557
1558
1559 /**
1560  * Handle a channel create requested by a client.
1561  *
1562  * Create the channel and the tunnel in case this was the first0 channel.
1563  *
1564  * @param c Client that requested the creation (will be the root).
1565  * @param msg Create Channel message.
1566  *
1567  * @return GNUNET_OK if everything went fine, GNUNET_SYSERR otherwise.
1568  */
1569 int
1570 GMCH_handle_local_create (struct MeshClient *c,
1571                           struct GNUNET_MESH_ChannelMessage *msg)
1572 {
1573   struct MeshChannel *ch;
1574   struct MeshTunnel3 *t;
1575   struct MeshPeer *peer;
1576   MESH_ChannelNumber chid;
1577
1578   LOG (GNUNET_ERROR_TYPE_DEBUG, "  towards %s:%u\n",
1579               GNUNET_i2s (&msg->peer), ntohl (msg->port));
1580   chid = ntohl (msg->channel_id);
1581
1582   /* Sanity check for duplicate channel IDs */
1583   if (NULL != GML_channel_get (c, chid))
1584   {
1585     GNUNET_break (0);
1586     return GNUNET_SYSERR;
1587   }
1588
1589   peer = GMP_get (&msg->peer);
1590   GMP_add_tunnel (peer);
1591   t = GMP_get_tunnel (peer);
1592
1593   if (GMP_get_short_id (peer) == myid)
1594   {
1595     GMT_change_cstate (t, MESH_TUNNEL3_READY);
1596   }
1597   else
1598   {
1599     GMP_connect (peer);
1600   }
1601
1602   /* Create channel */
1603   ch = channel_new (t, c, chid);
1604   if (NULL == ch)
1605   {
1606     GNUNET_break (0);
1607     return GNUNET_SYSERR;
1608   }
1609   ch->port = ntohl (msg->port);
1610   channel_set_options (ch, ntohl (msg->opt));
1611
1612   /* In unreliable channels, we'll use the DLL to buffer BCK data */
1613   ch->root_rel = GNUNET_new (struct MeshChannelReliability);
1614   ch->root_rel->ch = ch;
1615   ch->root_rel->expected_delay.rel_value_us = 0;
1616
1617   LOG (GNUNET_ERROR_TYPE_DEBUG, "CREATED CHANNEL %s\n", GMCH_2s (ch));
1618
1619   /* Send create channel */
1620   {
1621     struct GNUNET_MESH_ChannelCreate msgcc;
1622
1623     msgcc.header.size = htons (sizeof (msgcc));
1624     msgcc.header.type = htons (GNUNET_MESSAGE_TYPE_MESH_CHANNEL_CREATE);
1625     msgcc.chid = htonl (ch->gid);
1626     msgcc.port = msg->port;
1627     msgcc.opt = msg->opt;
1628
1629     /* FIXME retransmit if lost */
1630     GMT_send_prebuilt_message (&msgcc.header, t, ch,
1631                                GNUNET_YES, GNUNET_YES, NULL, NULL);
1632   }
1633   return GNUNET_OK;
1634 }
1635
1636
1637 /**
1638  * Handler for mesh network payload traffic.
1639  *
1640  * @param ch Channel for the message.
1641  * @param msg Unencryted data message.
1642  * @param fwd Is this message fwd? This only is meaningful in loopback channels.
1643  *            #GNUNET_YES if message is FWD on the respective channel (loopback)
1644  *            #GNUNET_NO if message is BCK on the respective channel (loopback)
1645  *            #GNUNET_SYSERR if message on a one-ended channel (remote)
1646  */
1647 void
1648 GMCH_handle_data (struct MeshChannel *ch,
1649                   const struct GNUNET_MESH_Data *msg,
1650                   int fwd)
1651 {
1652   struct MeshChannelReliability *rel;
1653   struct MeshClient *c;
1654   uint32_t mid;
1655
1656   /* If this is a remote (non-loopback) channel, find 'fwd'. */
1657   if (GNUNET_SYSERR == fwd)
1658   {
1659     if (is_loopback (ch))
1660     {
1661       /* It is a loopback channel after all... */
1662       GNUNET_break (0);
1663       return;
1664     }
1665     fwd = (NULL != ch->dest) ? GNUNET_YES : GNUNET_NO;
1666   }
1667
1668   /*  Initialize FWD/BCK data */
1669   c   = fwd ? ch->dest     : ch->root;
1670   rel = fwd ? ch->dest_rel : ch->root_rel;
1671
1672   if (NULL == c)
1673   {
1674     GNUNET_break (0);
1675     return;
1676   }
1677
1678   GNUNET_STATISTICS_update (stats, "# data received", 1, GNUNET_NO);
1679
1680   mid = ntohl (msg->mid);
1681   LOG (GNUNET_ERROR_TYPE_DEBUG, "!! got mid %u\n", mid);
1682
1683   if (GNUNET_NO == ch->reliable ||
1684       ( !GM_is_pid_bigger (rel->mid_recv, mid) &&
1685         GM_is_pid_bigger (rel->mid_recv + 64, mid) ) )
1686   {
1687     LOG (GNUNET_ERROR_TYPE_DEBUG, "!!! RECV %u\n", mid);
1688     if (GNUNET_YES == ch->reliable)
1689     {
1690       /* Is this the exact next expected messasge? */
1691       if (mid == rel->mid_recv)
1692       {
1693         LOG (GNUNET_ERROR_TYPE_DEBUG, "as expected\n");
1694         rel->mid_recv++;
1695         send_client_data (ch, msg, fwd);
1696       }
1697       else
1698       {
1699         LOG (GNUNET_ERROR_TYPE_DEBUG, "save for later\n");
1700         add_buffered_data (msg, rel);
1701       }
1702     }
1703     else
1704     {
1705       /* Tunnel is unreliable: send to clients directly */
1706       /* FIXME: accept Out Of Order traffic */
1707       rel->mid_recv = mid + 1;
1708       send_client_data (ch, msg, fwd);
1709     }
1710   }
1711   else
1712   {
1713     GNUNET_break_op (0);
1714     LOG (GNUNET_ERROR_TYPE_DEBUG,
1715                 " !!! MID %u not expected (%u - %u), dropping!\n",
1716                 mid, rel->mid_recv, rel->mid_recv + 63);
1717   }
1718
1719   GMCH_send_data_ack (ch, fwd);
1720 }
1721
1722
1723 /**
1724  * Handler for mesh network traffic end-to-end ACKs.
1725  *
1726  * @param ch Channel on which we got this message.
1727  * @param msg Data message.
1728  * @param fwd Is this message fwd? This only is meaningful in loopback channels.
1729  *            #GNUNET_YES if message is FWD on the respective channel (loopback)
1730  *            #GNUNET_NO if message is BCK on the respective channel (loopback)
1731  *            #GNUNET_SYSERR if message on a one-ended channel (remote)
1732  */
1733 void
1734 GMCH_handle_data_ack (struct MeshChannel *ch,
1735                       const struct GNUNET_MESH_DataACK *msg,
1736                       int fwd)
1737 {
1738   struct MeshChannelReliability *rel;
1739   struct MeshReliableMessage *copy;
1740   struct MeshReliableMessage *next;
1741   uint32_t ack;
1742   int work;
1743
1744   /* If this is a remote (non-loopback) channel, find 'fwd'. */
1745   if (GNUNET_SYSERR == fwd)
1746   {
1747     if (is_loopback (ch))
1748     {
1749       /* It is a loopback channel after all... */
1750       GNUNET_break (0);
1751       return;
1752     }
1753     /* Inverted: if message came 'FWD' is a 'BCK ACK'. */
1754     fwd = (NULL != ch->dest) ? GNUNET_NO : GNUNET_YES;
1755   }
1756
1757   ack = ntohl (msg->mid);
1758   LOG (GNUNET_ERROR_TYPE_DEBUG, "!!! %s ACK %u\n",
1759        (GNUNET_YES == fwd) ? "FWD" : "BCK", ack);
1760
1761   if (GNUNET_YES == fwd)
1762   {
1763     rel = ch->root_rel;
1764   }
1765   else
1766   {
1767     rel = ch->dest_rel;
1768   }
1769   if (NULL == rel)
1770   {
1771     GNUNET_break_op (0);
1772     return;
1773   }
1774
1775   /* Free ACK'd copies: no need to retransmit those anymore */
1776   for (work = GNUNET_NO, copy = rel->head_sent; copy != NULL; copy = next)
1777   {
1778     if (GM_is_pid_bigger (copy->mid, ack))
1779     {
1780       LOG (GNUNET_ERROR_TYPE_DEBUG, "!!!  head %u, out!\n", copy->mid);
1781       channel_rel_free_sent (rel, msg);
1782       break;
1783     }
1784     work = GNUNET_YES;
1785     LOG (GNUNET_ERROR_TYPE_DEBUG, " !!  id %u\n", copy->mid);
1786     next = copy->next;
1787     rel_message_free (copy, GNUNET_YES);
1788   }
1789
1790   /* ACK client if needed */
1791   GMCH_allow_client (ch, fwd);
1792
1793   /* If some message was free'd, update the retransmission delay */
1794   if (GNUNET_YES == work)
1795   {
1796     if (GNUNET_SCHEDULER_NO_TASK != rel->retry_task)
1797     {
1798       GNUNET_SCHEDULER_cancel (rel->retry_task);
1799       if (NULL == rel->head_sent)
1800       {
1801         rel->retry_task = GNUNET_SCHEDULER_NO_TASK;
1802       }
1803       else if (NULL == rel->head_sent->q)
1804       {
1805         struct GNUNET_TIME_Absolute new_target;
1806         struct GNUNET_TIME_Relative delay;
1807
1808         delay = GNUNET_TIME_relative_multiply (rel->retry_timer,
1809                                                MESH_RETRANSMIT_MARGIN);
1810         new_target = GNUNET_TIME_absolute_add (rel->head_sent->timestamp,
1811                                                delay);
1812         delay = GNUNET_TIME_absolute_get_remaining (new_target);
1813         rel->retry_task =
1814             GNUNET_SCHEDULER_add_delayed (delay,
1815                                           &channel_retransmit_message,
1816                                           rel);
1817       }
1818     }
1819     else
1820       GNUNET_break (0);
1821   }
1822 }
1823
1824
1825 /**
1826  * Handler for channel create messages.
1827  *
1828  * Does not have fwd parameter because it's always 'FWD': channel is incoming.
1829  *
1830  * @param t Tunnel this channel will be in.
1831  * @param msg Channel crate message.
1832  */
1833 struct MeshChannel *
1834 GMCH_handle_create (struct MeshTunnel3 *t,
1835                     const struct GNUNET_MESH_ChannelCreate *msg)
1836 {
1837   MESH_ChannelNumber chid;
1838   struct MeshChannel *ch;
1839   struct MeshClient *c;
1840
1841   chid = ntohl (msg->chid);
1842
1843   ch = GMT_get_channel (t, chid);
1844   if (NULL == ch)
1845   {
1846     /* Create channel */
1847     ch = channel_new (t, NULL, 0);
1848     ch->gid = chid;
1849   }
1850   channel_set_options (ch, ntohl (msg->opt));
1851
1852   /* Find a destination client */
1853   ch->port = ntohl (msg->port);
1854   LOG (GNUNET_ERROR_TYPE_DEBUG, "   port %u\n", ch->port);
1855   c = GML_client_get_by_port (ch->port);
1856   if (NULL == c)
1857   {
1858     /* TODO send reject */
1859     LOG (GNUNET_ERROR_TYPE_DEBUG, "  no client has port registered\n");
1860     if (is_loopback (ch))
1861     {
1862       LOG (GNUNET_ERROR_TYPE_DEBUG, "  loopback: destroy on handler\n");
1863       channel_send_nack (ch);
1864     }
1865     else
1866     {
1867       LOG (GNUNET_ERROR_TYPE_DEBUG, "  not loopback: destroy now\n");
1868       channel_send_nack (ch);
1869       GMCH_destroy (ch);
1870     }
1871     return NULL;
1872   }
1873   else
1874   {
1875     LOG (GNUNET_ERROR_TYPE_DEBUG, "  client %p has port registered\n", c);
1876   }
1877
1878   add_destination (ch, c);
1879   if (GNUNET_YES == ch->reliable)
1880     LOG (GNUNET_ERROR_TYPE_DEBUG, "!!! Reliable\n");
1881   else
1882     LOG (GNUNET_ERROR_TYPE_DEBUG, "!!! Not Reliable\n");
1883
1884   GMCH_send_create (ch);
1885   channel_send_ack (ch, GNUNET_YES);
1886
1887   return ch;
1888 }
1889
1890
1891 /**
1892  * Handler for channel NACK messages.
1893  *
1894  * NACK messages always go dest -> root, no need for 'fwd' or 'msg' parameter.
1895  *
1896  * @param ch Channel.
1897  */
1898 void
1899 GMCH_handle_nack (struct MeshChannel *ch)
1900 {
1901   send_client_nack (ch);
1902   GMCH_destroy (ch);
1903 }
1904
1905
1906 /**
1907  * Handler for channel ack messages.
1908  *
1909  * @param ch Channel.
1910  * @param msg Message.
1911  * @param fwd Is this message fwd? This only is meaningful in loopback channels.
1912  *            #GNUNET_YES if message is FWD on the respective channel (loopback)
1913  *            #GNUNET_NO if message is BCK on the respective channel (loopback)
1914  *            #GNUNET_SYSERR if message on a one-ended channel (remote)
1915  */
1916 void
1917 GMCH_handle_ack (struct MeshChannel *ch,
1918                  const struct GNUNET_MESH_ChannelManage *msg,
1919                  int fwd)
1920 {
1921   /* If this is a remote (non-loopback) channel, find 'fwd'. */
1922   if (GNUNET_SYSERR == fwd)
1923   {
1924     if (is_loopback (ch))
1925     {
1926       /* It is a loopback channel after all... */
1927       GNUNET_break (0);
1928       return;
1929     }
1930     fwd = (NULL != ch->dest) ? GNUNET_YES : GNUNET_NO;
1931   }
1932
1933   channel_confirm (ch, !fwd);
1934 }
1935
1936
1937 /**
1938  * Handler for channel destroy messages.
1939  *
1940  * @param ch Channel to be destroyed of.
1941  * @param msg Message.
1942  * @param fwd Is this message fwd? This only is meaningful in loopback channels.
1943  *            #GNUNET_YES if message is FWD on the respective channel (loopback)
1944  *            #GNUNET_NO if message is BCK on the respective channel (loopback)
1945  *            #GNUNET_SYSERR if message on a one-ended channel (remote)
1946  */
1947 void
1948 GMCH_handle_destroy (struct MeshChannel *ch,
1949                      const struct GNUNET_MESH_ChannelManage *msg,
1950                      int fwd)
1951 {
1952   struct MeshTunnel3 *t;
1953
1954   /* If this is a remote (non-loopback) channel, find 'fwd'. */
1955   if (GNUNET_SYSERR == fwd)
1956   {
1957     if (is_loopback (ch))
1958     {
1959       /* It is a loopback channel after all... */
1960       GNUNET_break (0);
1961       return;
1962     }
1963     fwd = (NULL != ch->dest) ? GNUNET_YES : GNUNET_NO;
1964   }
1965
1966   GMCH_debug (ch);
1967   if ( (fwd && NULL == ch->dest) || (!fwd && NULL == ch->root) )
1968   {
1969     /* Not for us (don't destroy twice a half-open loopback channel) */
1970     return;
1971   }
1972
1973   t = ch->t;
1974   send_destroy (ch, GNUNET_YES);
1975   GMCH_destroy (ch);
1976   GMT_destroy_if_empty (t);
1977 }
1978
1979
1980 /**
1981  * Sends an already built message on a channel.
1982  *
1983  * If the channel is on a loopback tunnel, notifies the appropriate destination
1984  * client locally.
1985  *
1986  * On a normal channel passes the message to the tunnel for encryption and
1987  * sending on a connection.
1988  *
1989  * This function DOES NOT save the message for retransmission.
1990  *
1991  * @param message Message to send. Function makes a copy of it.
1992  * @param ch Channel on which this message is transmitted.
1993  * @param fwd Is this a fwd message?
1994  * @param existing_copy This is a retransmission, don't save a copy.
1995  */
1996 void
1997 GMCH_send_prebuilt_message (const struct GNUNET_MessageHeader *message,
1998                             struct MeshChannel *ch, int fwd,
1999                             void *existing_copy)
2000 {
2001   uint16_t type;
2002
2003   type = ntohs (message->type);
2004   LOG (GNUNET_ERROR_TYPE_DEBUG, "GMCH Send %s %s on channel %s\n",
2005        GM_f2s (fwd), GM_m2s (type),
2006        GMCH_2s (ch));
2007
2008   if (GMT_is_loopback (ch->t))
2009   {
2010     handle_loopback (ch, message, fwd);
2011     return;
2012   }
2013
2014   switch (type)
2015   {
2016     case GNUNET_MESSAGE_TYPE_MESH_DATA:
2017
2018       if (GNUNET_YES == ch->reliable)
2019       {
2020         struct MeshChannelQueue *q;
2021
2022         q = GNUNET_new (struct MeshChannelQueue);
2023         q->type = type;
2024         if (NULL == existing_copy)
2025           q->copy = channel_save_copy (ch, message, fwd);
2026         else
2027         {
2028           q->copy = (struct MeshReliableMessage *) existing_copy;
2029           LOG (GNUNET_ERROR_TYPE_DEBUG,
2030                "  ### using existing copy: %p {r:0x%p q:0x%p t:%u}\n",
2031                existing_copy,
2032                q->copy->rel, q->copy->q, q->copy->type);
2033         }
2034         q->copy->q = q;
2035         q->q = GMT_send_prebuilt_message (message, ch->t, ch,
2036                                           fwd, NULL != existing_copy,
2037                                           &ch_message_sent, q);
2038         /* Don't store q itself: we never need to cancel messages */
2039       }
2040       else
2041       {
2042         GNUNET_break (NULL == GMT_send_prebuilt_message (message, ch->t, ch,
2043                                                          fwd, GNUNET_NO,
2044                                                          NULL, NULL));
2045       }
2046       break;
2047
2048     case GNUNET_MESSAGE_TYPE_MESH_DATA_ACK:
2049       {
2050         struct MeshChannelReliability *rel;
2051
2052         rel = fwd ? ch->root_rel : ch->dest_rel;
2053         if (NULL != rel->ack_q)
2054         {
2055           GMT_cancel (rel->ack_q->q);
2056           /* ch_message_sent is called, freeing ack_q */
2057         }
2058         rel->ack_q = GNUNET_new (struct MeshChannelQueue);
2059         rel->ack_q->type = type;
2060         rel->ack_q->rel = rel;
2061         rel->ack_q->q = GMT_send_prebuilt_message (message, ch->t, ch,
2062                                                   fwd, GNUNET_YES,
2063                                                   &ch_message_sent, rel->ack_q);
2064       }
2065       break;
2066     default:
2067       GNUNET_break (NULL == GMT_send_prebuilt_message (message, ch->t, ch,
2068                                                        fwd, GNUNET_YES,
2069                                                        NULL, NULL));
2070   }
2071 }
2072
2073
2074 /**
2075  * Get the static string for identification of the channel.
2076  *
2077  * @param ch Channel.
2078  *
2079  * @return Static string with the channel IDs.
2080  */
2081 const char *
2082 GMCH_2s (const struct MeshChannel *ch)
2083 {
2084   static char buf[64];
2085
2086   if (NULL == ch)
2087     return "(NULL Channel)";
2088
2089   sprintf (buf, "%s:%u gid:%X (%X / %X)",
2090            GMT_2s (ch->t), ch->port, ch->gid, ch->lid_root, ch->lid_dest);
2091
2092   return buf;
2093 }