- code formatting, logging
[oweals/gnunet.git] / src / cadet / gnunet-service-cadet_channel.c
1 /*
2      This file is part of GNUnet.
3      Copyright (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., 51 Franklin Street, Fifth Floor,
18      Boston, MA 02110-1301, USA.
19 */
20
21
22 #include "platform.h"
23 #include "gnunet_util_lib.h"
24
25 #include "gnunet_statistics_service.h"
26
27 #include "cadet.h"
28 #include "cadet_protocol.h"
29
30 #include "gnunet-service-cadet_channel.h"
31 #include "gnunet-service-cadet_local.h"
32 #include "gnunet-service-cadet_tunnel.h"
33 #include "gnunet-service-cadet_peer.h"
34
35 #define LOG(level, ...) GNUNET_log_from(level,"cadet-chn",__VA_ARGS__)
36
37 #define CADET_RETRANSMIT_TIME    GNUNET_TIME_relative_multiply(\
38                                     GNUNET_TIME_UNIT_MILLISECONDS, 250)
39 #define CADET_RETRANSMIT_MARGIN  4
40
41
42 /**
43  * All the states a connection can be in.
44  */
45 enum CadetChannelState
46 {
47   /**
48    * Uninitialized status, should never appear in operation.
49    */
50   CADET_CHANNEL_NEW,
51
52   /**
53    * Connection create message sent, waiting for ACK.
54    */
55   CADET_CHANNEL_SENT,
56
57   /**
58    * Connection confirmed, ready to carry traffic.
59    */
60   CADET_CHANNEL_READY,
61 };
62
63
64 /**
65  * Info holder for channel messages in queues.
66  */
67 struct CadetChannelQueue
68 {
69   /**
70    * Tunnel Queue.
71    */
72   struct CadetTunnelQueue *tq;
73
74   /**
75    * Message type (DATA/DATA_ACK)
76    */
77   uint16_t type;
78
79   /**
80    * Message copy (for DATAs, to start retransmission timer)
81    */
82   struct CadetReliableMessage *copy;
83
84   /**
85    * Reliability (for DATA_ACKs, to access rel->ack_q)
86    */
87   struct CadetChannelReliability *rel;
88 };
89
90
91 /**
92  * Info needed to retry a message in case it gets lost.
93  */
94 struct CadetReliableMessage
95 {
96     /**
97      * Double linked list, FIFO style
98      */
99   struct CadetReliableMessage   *next;
100   struct CadetReliableMessage   *prev;
101
102     /**
103      * Type of message (payload, channel management).
104      */
105   int16_t                       type;
106
107     /**
108      * Tunnel Reliability queue this message is in.
109      */
110   struct CadetChannelReliability *rel;
111
112     /**
113      * ID of the message (ACK needed to free)
114      */
115   uint32_t                      mid;
116
117   /**
118    * Tunnel Queue.
119    */
120   struct CadetChannelQueue      *chq;
121
122     /**
123      * When was this message issued (to calculate ACK delay)
124      */
125   struct GNUNET_TIME_Absolute   timestamp;
126
127   /* struct GNUNET_CADET_Data with payload */
128 };
129
130
131 /**
132  * Info about the traffic state for a client in a channel.
133  */
134 struct CadetChannelReliability
135 {
136     /**
137      * Channel this is about.
138      */
139   struct CadetChannel *ch;
140
141     /**
142      * DLL of messages sent and not yet ACK'd.
143      */
144   struct CadetReliableMessage        *head_sent;
145   struct CadetReliableMessage        *tail_sent;
146
147     /**
148      * DLL of messages received out of order.
149      */
150   struct CadetReliableMessage        *head_recv;
151   struct CadetReliableMessage        *tail_recv;
152
153     /**
154      * Messages received.
155      */
156   unsigned int                      n_recv;
157
158     /**
159      * Next MID to use for outgoing traffic.
160      */
161   uint32_t                          mid_send;
162
163     /**
164      * Next MID expected for incoming traffic.
165      */
166   uint32_t                          mid_recv;
167
168     /**
169      * Handle for queued unique data CREATE, DATA_ACK.
170      */
171   struct CadetChannelQueue           *uniq;
172
173     /**
174      * Can we send data to the client?
175      */
176   int                               client_ready;
177
178   /**
179    * Can the client send data to us?
180    */
181   int                               client_allowed;
182
183     /**
184      * Task to resend/poll in case no ACK is received.
185      */
186   struct GNUNET_SCHEDULER_Task *   retry_task;
187
188     /**
189      * Counter for exponential backoff.
190      */
191   struct GNUNET_TIME_Relative       retry_timer;
192
193     /**
194      * How long does it usually take to get an ACK.
195      */
196   struct GNUNET_TIME_Relative       expected_delay;
197 };
198
199
200 /**
201  * Struct containing all information regarding a channel to a remote client.
202  */
203 struct CadetChannel
204 {
205     /**
206      * Tunnel this channel is in.
207      */
208   struct CadetTunnel *t;
209
210     /**
211      * Destination port of the channel.
212      */
213   uint32_t port;
214
215     /**
216      * Global channel number ( < GNUNET_CADET_LOCAL_CHANNEL_ID_CLI)
217      */
218   CADET_ChannelNumber gid;
219
220     /**
221      * Local tunnel number for root (owner) client.
222      * ( >= GNUNET_CADET_LOCAL_CHANNEL_ID_CLI or 0 )
223      */
224   CADET_ChannelNumber lid_root;
225
226     /**
227      * Local tunnel number for local destination clients (incoming number)
228      * ( >= GNUNET_CADET_LOCAL_CHANNEL_ID_SERV or 0).
229      */
230   CADET_ChannelNumber lid_dest;
231
232     /**
233      * Channel state.
234      */
235   enum CadetChannelState state;
236
237     /**
238      * Is the tunnel bufferless (minimum latency)?
239      */
240   int nobuffer;
241
242     /**
243      * Is the tunnel reliable?
244      */
245   int reliable;
246
247     /**
248      * Last time the channel was used
249      */
250   struct GNUNET_TIME_Absolute timestamp;
251
252     /**
253      * Client owner of the tunnel, if any
254      */
255   struct CadetClient *root;
256
257     /**
258      * Client destination of the tunnel, if any.
259      */
260   struct CadetClient *dest;
261
262     /**
263      * Flag to signal the destruction of the channel.
264      * If this is set GNUNET_YES the channel will be destroyed
265      * when the queue is empty.
266      */
267   int destroy;
268
269     /**
270      * Total (reliable) messages pending ACK for this channel.
271      */
272   unsigned int pending_messages;
273
274     /**
275      * Reliability data.
276      * Only present (non-NULL) at the owner of a tunnel.
277      */
278   struct CadetChannelReliability *root_rel;
279
280     /**
281      * Reliability data.
282      * Only present (non-NULL) at the destination of a tunnel.
283      */
284   struct CadetChannelReliability *dest_rel;
285
286 };
287
288
289 /******************************************************************************/
290 /*******************************   GLOBALS  ***********************************/
291 /******************************************************************************/
292
293 /**
294  * Global handle to the statistics service.
295  */
296 extern struct GNUNET_STATISTICS_Handle *stats;
297
298 /**
299  * Local peer own ID (memory efficient handle).
300  */
301 extern GNUNET_PEER_Id myid;
302
303
304 /******************************************************************************/
305 /********************************   STATIC  ***********************************/
306 /******************************************************************************/
307
308
309 /**
310  * Destroy a reliable message after it has been acknowledged, either by
311  * direct mid ACK or bitfield. Updates the appropriate data structures and
312  * timers and frees all memory.
313  *
314  * @param copy Message that is no longer needed: remote peer got it.
315  * @param update_time Is the timing information relevant?
316  *                    If this message is ACK in a batch the timing information
317  *                    is skewed by the retransmission, count only for the
318  *                    retransmitted message.
319  *
320  * @return #GNUNET_YES if channel was destroyed as a result of the call,
321  *         #GNUNET_NO otherwise.
322  */
323 static int
324 rel_message_free (struct CadetReliableMessage *copy, int update_time);
325
326 /**
327  * send a channel create message.
328  *
329  * @param ch Channel for which to send.
330  */
331 static void
332 send_create (struct CadetChannel *ch);
333
334 /**
335  * Confirm we got a channel create, FWD ack.
336  *
337  * @param ch The channel to confirm.
338  * @param fwd Should we send a FWD ACK? (going dest->root)
339  */
340 static void
341 send_ack (struct CadetChannel *ch, int fwd);
342
343
344
345 /**
346  * Test if the channel is loopback: both root and dest are on the local peer.
347  *
348  * @param ch Channel to test.
349  *
350  * @return #GNUNET_YES if channel is loopback, #GNUNET_NO otherwise.
351  */
352 static int
353 is_loopback (const struct CadetChannel *ch)
354 {
355   if (NULL != ch->t)
356     return GCT_is_loopback (ch->t);
357
358   return (NULL != ch->root && NULL != ch->dest);
359 }
360
361
362 /**
363  * Save a copy of the data message for later retransmission.
364  *
365  * @param msg Message to copy.
366  * @param mid Message ID.
367  * @param rel Reliability data for retransmission.
368  */
369 static struct CadetReliableMessage *
370 copy_message (const struct GNUNET_CADET_Data *msg, uint32_t mid,
371               struct CadetChannelReliability *rel)
372 {
373   struct CadetReliableMessage *copy;
374   uint16_t size;
375
376   size = ntohs (msg->header.size);
377   copy = GNUNET_malloc (sizeof (*copy) + size);
378   copy->mid = mid;
379   copy->rel = rel;
380   copy->type = GNUNET_MESSAGE_TYPE_CADET_DATA;
381   memcpy (&copy[1], msg, size);
382
383   return copy;
384 }
385
386 /**
387  * We have received a message out of order, or the client is not ready.
388  * Buffer it until we receive an ACK from the client or the missing
389  * message from the channel.
390  *
391  * @param msg Message to buffer (MUST be of type CADET_DATA).
392  * @param rel Reliability data to the corresponding direction.
393  */
394 static void
395 add_buffered_data (const struct GNUNET_CADET_Data *msg,
396                    struct CadetChannelReliability *rel)
397 {
398   struct CadetReliableMessage *copy;
399   struct CadetReliableMessage *prev;
400   uint32_t mid;
401
402   mid = ntohl (msg->mid);
403
404   LOG (GNUNET_ERROR_TYPE_DEBUG, "add_buffered_data MID %u (%u)\n",
405        mid, rel->n_recv);
406
407   rel->n_recv++;
408
409   // FIXME do something better than O(n), although n < 64...
410   // FIXME start from the end (most messages are the latest ones)
411   for (prev = rel->head_recv; NULL != prev; prev = prev->next)
412   {
413     LOG (GNUNET_ERROR_TYPE_DEBUG, " prev %u\n", prev->mid);
414     if (prev->mid == mid)
415     {
416       LOG (GNUNET_ERROR_TYPE_DEBUG, " already there!\n");
417       rel->n_recv--;
418       return;
419     }
420     else if (GC_is_pid_bigger (prev->mid, mid))
421     {
422       LOG (GNUNET_ERROR_TYPE_DEBUG, " bingo!\n");
423       copy = copy_message (msg, mid, rel);
424       GNUNET_CONTAINER_DLL_insert_before (rel->head_recv, rel->tail_recv,
425                                           prev, copy);
426       return;
427     }
428   }
429   copy = copy_message (msg, mid, rel);
430   LOG (GNUNET_ERROR_TYPE_DEBUG, " insert at tail! (now: %u)\n", rel->n_recv);
431   GNUNET_CONTAINER_DLL_insert_tail (rel->head_recv, rel->tail_recv, copy);
432   LOG (GNUNET_ERROR_TYPE_DEBUG, "add_buffered_data END\n");
433 }
434
435
436 /**
437  * Add a destination client to a channel, initializing all data structures
438  * in the channel and the client.
439  *
440  * @param ch Channel to which add the destination.
441  * @param c Client which to add to the channel.
442  */
443 static void
444 add_destination (struct CadetChannel *ch, struct CadetClient *c)
445 {
446   if (NULL != ch->dest)
447   {
448     GNUNET_break (0);
449     return;
450   }
451
452   /* Assign local id as destination */
453   ch->lid_dest = GML_get_next_chid (c);
454
455   /* Store in client's hashmap */
456   GML_channel_add (c, ch->lid_dest, ch);
457
458   GNUNET_break (NULL == ch->dest_rel);
459   ch->dest_rel = GNUNET_new (struct CadetChannelReliability);
460   ch->dest_rel->ch = ch;
461   ch->dest_rel->expected_delay.rel_value_us = 0;
462   ch->dest_rel->retry_timer = CADET_RETRANSMIT_TIME;
463
464   ch->dest = c;
465 }
466
467
468 /**
469  * Set options in a channel, extracted from a bit flag field.
470  *
471  * @param ch Channel to set options to.
472  * @param options Bit array in host byte order.
473  */
474 static void
475 channel_set_options (struct CadetChannel *ch, uint32_t options)
476 {
477   ch->nobuffer = (options & GNUNET_CADET_OPTION_NOBUFFER) != 0 ?
478   GNUNET_YES : GNUNET_NO;
479   ch->reliable = (options & GNUNET_CADET_OPTION_RELIABLE) != 0 ?
480   GNUNET_YES : GNUNET_NO;
481 }
482
483
484 /**
485  * Get a bit flag field with the options of a channel.
486  *
487  * @param ch Channel to get options from.
488  *
489  * @return Bit array in host byte order.
490  */
491 static uint32_t
492 channel_get_options (struct CadetChannel *ch)
493 {
494   uint32_t options;
495
496   options = 0;
497   if (ch->nobuffer)
498     options |= GNUNET_CADET_OPTION_NOBUFFER;
499   if (ch->reliable)
500     options |= GNUNET_CADET_OPTION_RELIABLE;
501
502   return options;
503 }
504
505
506 /**
507  * Notify a client that the channel is no longer valid.
508  *
509  * @param ch Channel that is destroyed.
510  * @param local_only Should we avoid sending it to other peers?
511  */
512 static void
513 send_destroy (struct CadetChannel *ch, int local_only)
514 {
515   struct GNUNET_CADET_ChannelManage msg;
516
517   msg.header.type = htons (GNUNET_MESSAGE_TYPE_CADET_CHANNEL_DESTROY);
518   msg.header.size = htons (sizeof (msg));
519   msg.chid = htonl (ch->gid);
520
521   /* If root is not NULL, notify.
522    * If it's NULL, check lid_root. When a local destroy comes in, root
523    * is set to NULL but lid_root is left untouched. In this case, do nothing,
524    * the client is the one who requested the channel to be destroyed.
525    */
526   if (NULL != ch->root)
527     GML_send_channel_destroy (ch->root, ch->lid_root);
528   else if (0 == ch->lid_root && GNUNET_NO == local_only)
529     GCCH_send_prebuilt_message (&msg.header, ch, GNUNET_NO, NULL);
530
531   if (NULL != ch->dest)
532     GML_send_channel_destroy (ch->dest, ch->lid_dest);
533   else if (0 == ch->lid_dest && GNUNET_NO == local_only)
534     GCCH_send_prebuilt_message (&msg.header, ch, GNUNET_YES, NULL);
535 }
536
537
538 /**
539  * Notify the destination client that a new incoming channel was created.
540  *
541  * @param ch Channel that was created.
542  */
543 static void
544 send_client_create (struct CadetChannel *ch)
545 {
546   uint32_t opt;
547
548   if (NULL == ch->dest)
549     return;
550
551   opt = 0;
552   opt |= GNUNET_YES == ch->reliable ? GNUNET_CADET_OPTION_RELIABLE : 0;
553   opt |= GNUNET_YES == ch->nobuffer ? GNUNET_CADET_OPTION_NOBUFFER : 0;
554   GML_send_channel_create (ch->dest, ch->lid_dest, ch->port, opt,
555                            GCT_get_destination (ch->t));
556
557 }
558
559
560 /**
561  * Send data to a client.
562  *
563  * If the client is ready, send directly, otherwise buffer while listening
564  * for a local ACK.
565  *
566  * @param ch Channel
567  * @param msg Message.
568  * @param fwd Is this a fwd (root->dest) message?
569  */
570 static void
571 send_client_data (struct CadetChannel *ch,
572                   const struct GNUNET_CADET_Data *msg,
573                   int fwd)
574 {
575   if (fwd)
576   {
577     if (ch->dest_rel->client_ready)
578     {
579       GML_send_data (ch->dest, msg, ch->lid_dest);
580       ch->dest_rel->client_ready = GNUNET_NO;
581       ch->dest_rel->mid_recv++;
582     }
583     else
584       add_buffered_data (msg, ch->dest_rel);
585   }
586   else
587   {
588     if (ch->root_rel->client_ready)
589     {
590       GML_send_data (ch->root, msg, ch->lid_root);
591       ch->root_rel->client_ready = GNUNET_NO;
592       ch->root_rel->mid_recv++;
593     }
594     else
595       add_buffered_data (msg, ch->root_rel);
596   }
597 }
598
599
600 /**
601  * Send a buffered message to the client, for in order delivery or
602  * as result of client ACK.
603  *
604  * @param ch Channel on which to empty the message buffer.
605  * @param c Client to send to.
606  * @param fwd Is this to send FWD data?.
607  */
608 static void
609 send_client_buffered_data (struct CadetChannel *ch,
610                            struct CadetClient *c,
611                            int fwd)
612 {
613   struct CadetReliableMessage *copy;
614   struct CadetChannelReliability *rel;
615
616   LOG (GNUNET_ERROR_TYPE_DEBUG, "send_buffered_data\n");
617   rel = fwd ? ch->dest_rel : ch->root_rel;
618   if (GNUNET_NO == rel->client_ready)
619   {
620     LOG (GNUNET_ERROR_TYPE_DEBUG, "client not ready\n");
621     return;
622   }
623
624   copy = rel->head_recv;
625   /* We never buffer channel management messages */
626   if (NULL != copy)
627   {
628     if (copy->mid == rel->mid_recv || GNUNET_NO == ch->reliable)
629     {
630       struct GNUNET_CADET_Data *msg = (struct GNUNET_CADET_Data *) &copy[1];
631
632       LOG (GNUNET_ERROR_TYPE_DEBUG, " have %u! now expecting %u\n",
633            copy->mid, rel->mid_recv + 1);
634       send_client_data (ch, msg, fwd);
635       rel->n_recv--;
636       GNUNET_CONTAINER_DLL_remove (rel->head_recv, rel->tail_recv, copy);
637       LOG (GNUNET_ERROR_TYPE_DEBUG, " free copy recv MID %u (%p), %u left\n",
638            copy->mid, copy, rel->n_recv);
639       GNUNET_free (copy);
640       GCCH_send_data_ack (ch, fwd);
641     }
642     else
643     {
644       LOG (GNUNET_ERROR_TYPE_DEBUG, " reliable && don't have %u, next is %u\n",
645            rel->mid_recv, copy->mid);
646       if (GNUNET_YES == ch->destroy)
647       {
648         /* We don't have the next data piece and the remote peer has closed the
649          * channel. We won't receive it anymore, so just destroy the channel.
650          * FIXME: wait some time to allow other connections to
651          *        deliver missing messages
652          */
653         send_destroy (ch, GNUNET_YES);
654         GCCH_destroy (ch);
655       }
656     }
657   }
658   LOG (GNUNET_ERROR_TYPE_DEBUG, "send_buffered_data END\n");
659 }
660
661
662 /**
663  * Allow a client to send more data.
664  *
665  * In case the client was already allowed to send data, do nothing.
666  *
667  * @param ch Channel.
668  * @param fwd Is this a FWD ACK? (FWD ACKs are sent to root)
669  */
670 static void
671 send_client_ack (struct CadetChannel *ch, int fwd)
672 {
673   struct CadetChannelReliability *rel = fwd ? ch->root_rel : ch->dest_rel;
674   struct CadetClient *c = fwd ? ch->root : ch->dest;
675
676   if (NULL == c)
677   {
678     GNUNET_break (GNUNET_NO != ch->destroy);
679     return;
680   }
681   LOG (GNUNET_ERROR_TYPE_DEBUG,
682        "  sending %s ack to client on channel %s\n",
683        GC_f2s (fwd), GCCH_2s (ch));
684
685   if (NULL == rel)
686   {
687     GNUNET_break (0);
688     return;
689   }
690
691   if (GNUNET_YES == rel->client_allowed)
692   {
693     LOG (GNUNET_ERROR_TYPE_DEBUG, "  already allowed\n");
694     return;
695   }
696   rel->client_allowed = GNUNET_YES;
697
698   GML_send_ack (c, fwd ? ch->lid_root : ch->lid_dest);
699 }
700
701
702 /**
703  * Notify the root that the destination rejected the channel.
704  *
705  * @param ch Rejected channel.
706  */
707 static void
708 send_client_nack (struct CadetChannel *ch)
709 {
710   if (NULL == ch->root)
711   {
712     GNUNET_break (0);
713     return;
714   }
715   GML_send_channel_nack (ch->root, ch->lid_root);
716 }
717
718
719 /**
720  * We haven't received an ACK after a certain time: restransmit the message.
721  *
722  * @param cls Closure (CadetChannelReliability with the message to restransmit)
723  * @param tc TaskContext.
724  */
725 static void
726 channel_retransmit_message (void *cls,
727                             const struct GNUNET_SCHEDULER_TaskContext *tc)
728 {
729   struct CadetChannelReliability *rel = cls;
730   struct CadetReliableMessage *copy;
731   struct CadetChannel *ch;
732   struct GNUNET_CADET_Data *payload;
733   int fwd;
734
735   rel->retry_task = NULL;
736   if (0 != (tc->reason & GNUNET_SCHEDULER_REASON_SHUTDOWN))
737     return;
738
739   ch = rel->ch;
740   copy = rel->head_sent;
741   if (NULL == copy)
742   {
743     GNUNET_break (0); // FIXME tripped in rps testcase
744     return;
745   }
746
747   payload = (struct GNUNET_CADET_Data *) &copy[1];
748   fwd = (rel == ch->root_rel);
749
750   /* Message not found in the queue that we are going to use. */
751   LOG (GNUNET_ERROR_TYPE_DEBUG, "RETRANSMIT MID %u\n", copy->mid);
752
753   GCCH_send_prebuilt_message (&payload->header, ch, fwd, copy);
754   GNUNET_STATISTICS_update (stats, "# data retransmitted", 1, GNUNET_NO);
755 }
756
757
758 /**
759  * We haven't received an Channel ACK after a certain time: resend the CREATE.
760  *
761  * @param cls Closure (CadetChannelReliability of the channel to recreate)
762  * @param tc TaskContext.
763  */
764 static void
765 channel_recreate (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
766 {
767   struct CadetChannelReliability *rel = cls;
768
769   rel->retry_task = NULL;
770   if (0 != (tc->reason & GNUNET_SCHEDULER_REASON_SHUTDOWN))
771     return;
772
773   LOG (GNUNET_ERROR_TYPE_DEBUG, "RE-CREATE\n");
774   GNUNET_STATISTICS_update (stats, "# data retransmitted", 1, GNUNET_NO);
775
776   if (rel == rel->ch->root_rel)
777   {
778     send_create (rel->ch);
779   }
780   else if (rel == rel->ch->dest_rel)
781   {
782     send_ack (rel->ch, GNUNET_YES);
783   }
784   else
785   {
786     GNUNET_break (0);
787   }
788
789 }
790
791
792 /**
793  * Message has been sent: start retransmission timer.
794  *
795  * @param cls Closure (queue structure).
796  * @param t Tunnel.
797  * @param q Queue handler (no longer valid).
798  * @param type Type of message.
799  * @param size Size of the message.
800  */
801 static void
802 ch_message_sent (void *cls,
803                  struct CadetTunnel *t,
804                  struct CadetTunnelQueue *q,
805                  uint16_t type, size_t size)
806 {
807   struct CadetChannelQueue *chq = cls;
808   struct CadetReliableMessage *copy = chq->copy;
809   struct CadetChannelReliability *rel;
810
811   LOG (GNUNET_ERROR_TYPE_DEBUG, "channel_message_sent callback %s\n",
812        GC_m2s (chq->type));
813
814   switch (chq->type)
815   {
816     case GNUNET_MESSAGE_TYPE_CADET_DATA:
817       LOG (GNUNET_ERROR_TYPE_DEBUG, "data MID %u sent\n", copy->mid);
818       GNUNET_assert (chq == copy->chq);
819       copy->timestamp = GNUNET_TIME_absolute_get ();
820       rel = copy->rel;
821       if (NULL == rel->retry_task)
822       {
823         LOG (GNUNET_ERROR_TYPE_DEBUG, "  scheduling retry in %d * %s\n",
824              CADET_RETRANSMIT_MARGIN,
825              GNUNET_STRINGS_relative_time_to_string (rel->expected_delay,
826                                                      GNUNET_YES));
827         if (0 != rel->expected_delay.rel_value_us)
828         {
829           rel->retry_timer =
830               GNUNET_TIME_relative_multiply (rel->expected_delay,
831                                              CADET_RETRANSMIT_MARGIN);
832         }
833         else
834         {
835           rel->retry_timer = CADET_RETRANSMIT_TIME;
836         }
837         LOG (GNUNET_ERROR_TYPE_DEBUG, "  using delay %s\n",
838              GNUNET_STRINGS_relative_time_to_string (rel->retry_timer,
839                                                      GNUNET_NO));
840         rel->retry_task =
841             GNUNET_SCHEDULER_add_delayed (rel->retry_timer,
842                                           &channel_retransmit_message, rel);
843       }
844       else
845       {
846         LOG (GNUNET_ERROR_TYPE_DEBUG, "retry running %p\n", rel->retry_task);
847       }
848       copy->chq = NULL;
849       break;
850
851
852     case GNUNET_MESSAGE_TYPE_CADET_DATA_ACK:
853     case GNUNET_MESSAGE_TYPE_CADET_CHANNEL_CREATE:
854     case GNUNET_MESSAGE_TYPE_CADET_CHANNEL_ACK:
855       LOG (GNUNET_ERROR_TYPE_DEBUG, "sent %s\n", GC_m2s (chq->type));
856       rel = chq->rel;
857       GNUNET_assert (rel->uniq == chq);
858       rel->uniq = NULL;
859
860       if (CADET_CHANNEL_READY != rel->ch->state
861           && GNUNET_MESSAGE_TYPE_CADET_DATA_ACK != type
862           && GNUNET_NO == rel->ch->destroy)
863       {
864         GNUNET_assert (NULL == rel->retry_task);
865         LOG (GNUNET_ERROR_TYPE_DEBUG, "STD BACKOFF %s\n",
866              GNUNET_STRINGS_relative_time_to_string (rel->retry_timer,
867                                                      GNUNET_NO));
868         rel->retry_timer = GNUNET_TIME_STD_BACKOFF (rel->retry_timer);
869         rel->retry_task = GNUNET_SCHEDULER_add_delayed (rel->retry_timer,
870                                                         &channel_recreate, rel);
871       }
872       break;
873
874     default:
875       GNUNET_break (0);
876   }
877
878   GNUNET_free (chq);
879 }
880
881
882 /**
883  * send a channel create message.
884  *
885  * @param ch Channel for which to send.
886  */
887 static void
888 send_create (struct CadetChannel *ch)
889 {
890   struct GNUNET_CADET_ChannelCreate msgcc;
891
892   msgcc.header.size = htons (sizeof (msgcc));
893   msgcc.header.type = htons (GNUNET_MESSAGE_TYPE_CADET_CHANNEL_CREATE);
894   msgcc.chid = htonl (ch->gid);
895   msgcc.port = htonl (ch->port);
896   msgcc.opt = htonl (channel_get_options (ch));
897
898   GCCH_send_prebuilt_message (&msgcc.header, ch, GNUNET_YES, NULL);
899 }
900
901
902 /**
903  * Confirm we got a channel create or FWD ack.
904  *
905  * @param ch The channel to confirm.
906  * @param fwd Should we send a FWD ACK? (going dest->root)
907  */
908 static void
909 send_ack (struct CadetChannel *ch, int fwd)
910 {
911   struct GNUNET_CADET_ChannelManage msg;
912
913   msg.header.size = htons (sizeof (msg));
914   msg.header.type = htons (GNUNET_MESSAGE_TYPE_CADET_CHANNEL_ACK);
915   LOG (GNUNET_ERROR_TYPE_DEBUG, "  sending channel %s ack for channel %s\n",
916        GC_f2s (fwd), GCCH_2s (ch));
917
918   msg.chid = htonl (ch->gid);
919   GCCH_send_prebuilt_message (&msg.header, ch, !fwd, NULL);
920 }
921
922
923 /**
924  * Send a message and don't keep any info about it: we won't need to cancel it
925  * or resend it.
926  *
927  * @param msg Header of the message to fire away.
928  * @param ch Channel on which the message should go.
929  * @param force Is this a forced (undroppable) message?
930  */
931 static void
932 fire_and_forget (const struct GNUNET_MessageHeader *msg,
933                  struct CadetChannel *ch,
934                  int force)
935 {
936   GNUNET_break (NULL == GCT_send_prebuilt_message (msg, ch->t, NULL,
937                                                    force, NULL, NULL));
938 }
939
940
941 /**
942  * Notify that a channel create didn't succeed.
943  *
944  * @param ch The channel to reject.
945  */
946 static void
947 send_nack (struct CadetChannel *ch)
948 {
949   struct GNUNET_CADET_ChannelManage msg;
950
951   msg.header.size = htons (sizeof (msg));
952   msg.header.type = htons (GNUNET_MESSAGE_TYPE_CADET_CHANNEL_NACK);
953   LOG (GNUNET_ERROR_TYPE_DEBUG,
954        "  sending channel NACK for channel %s\n",
955        GCCH_2s (ch));
956
957   msg.chid = htonl (ch->gid);
958   GCCH_send_prebuilt_message (&msg.header, ch, GNUNET_NO, NULL);
959 }
960
961
962 /**
963  * Destroy all reliable messages queued for a channel,
964  * during a channel destruction.
965  * Frees the reliability structure itself.
966  *
967  * @param rel Reliability data for a channel.
968  */
969 static void
970 channel_rel_free_all (struct CadetChannelReliability *rel)
971 {
972   struct CadetReliableMessage *copy;
973   struct CadetReliableMessage *next;
974
975   if (NULL == rel)
976     return;
977
978   for (copy = rel->head_recv; NULL != copy; copy = next)
979   {
980     next = copy->next;
981     GNUNET_CONTAINER_DLL_remove (rel->head_recv, rel->tail_recv, copy);
982     LOG (GNUNET_ERROR_TYPE_DEBUG, " COPYFREE ALL RECV %p\n", copy);
983     GNUNET_break (NULL == copy->chq);
984     GNUNET_free (copy);
985   }
986   for (copy = rel->head_sent; NULL != copy; copy = next)
987   {
988     next = copy->next;
989     GNUNET_CONTAINER_DLL_remove (rel->head_sent, rel->tail_sent, copy);
990     LOG (GNUNET_ERROR_TYPE_DEBUG, " COPYFREE ALL SEND %p\n", copy);
991     if (NULL != copy->chq)
992     {
993       if (NULL != copy->chq->tq)
994       {
995         GCT_cancel (copy->chq->tq);
996         /* ch_message_sent will free copy->q */
997       }
998       else
999       {
1000         GNUNET_free (copy->chq);
1001         GNUNET_break (0);
1002       }
1003     }
1004     GNUNET_free (copy);
1005   }
1006   if (NULL != rel->uniq && NULL != rel->uniq->tq)
1007   {
1008     GCT_cancel (rel->uniq->tq);
1009     /* ch_message_sent is called freeing uniq */
1010   }
1011   if (NULL != rel->retry_task)
1012   {
1013     GNUNET_SCHEDULER_cancel (rel->retry_task);
1014     rel->retry_task = NULL;
1015   }
1016   GNUNET_free (rel);
1017 }
1018
1019
1020 /**
1021  * Mark future messages as ACK'd.
1022  *
1023  * @param rel Reliability data.
1024  * @param msg DataACK message with a bitfield of future ACK'd messages.
1025  */
1026 static void
1027 channel_rel_free_sent (struct CadetChannelReliability *rel,
1028                        const struct GNUNET_CADET_DataACK *msg)
1029 {
1030   struct CadetReliableMessage *copy;
1031   struct CadetReliableMessage *next;
1032   uint64_t bitfield;
1033   uint64_t mask;
1034   uint32_t mid;
1035   uint32_t target;
1036   unsigned int i;
1037
1038   bitfield = msg->futures;
1039   mid = ntohl (msg->mid);
1040   LOG (GNUNET_ERROR_TYPE_DEBUG, "free_sent_reliable %u %llX\n", mid, bitfield);
1041   LOG (GNUNET_ERROR_TYPE_DEBUG, " rel %p, head %p\n", rel, rel->head_sent);
1042   for (i = 0, copy = rel->head_sent;
1043        i < 64 && NULL != copy && 0 != bitfield;
1044        i++)
1045   {
1046     LOG (GNUNET_ERROR_TYPE_DEBUG, " trying bit %u (mid %u)\n", i, mid + i + 1);
1047     mask = 0x1LL << i;
1048     if (0 == (bitfield & mask))
1049      continue;
1050
1051     LOG (GNUNET_ERROR_TYPE_DEBUG, " set!\n");
1052     /* Bit was set, clear the bit from the bitfield */
1053     bitfield &= ~mask;
1054
1055     /* The i-th bit was set. Do we have that copy? */
1056     /* Skip copies with mid < target */
1057     target = mid + i + 1;
1058     LOG (GNUNET_ERROR_TYPE_DEBUG, " target %u\n", target);
1059     while (NULL != copy && GC_is_pid_bigger (target, copy->mid))
1060       copy = copy->next;
1061
1062     /* Did we run out of copies? (previously freed, it's ok) */
1063     if (NULL == copy)
1064     {
1065       LOG (GNUNET_ERROR_TYPE_DEBUG, "run out of copies...\n");
1066       return;
1067     }
1068
1069     /* Did we overshoot the target? (previously freed, it's ok) */
1070     if (GC_is_pid_bigger (copy->mid, target))
1071     {
1072       LOG (GNUNET_ERROR_TYPE_DEBUG, " next copy %u\n", copy->mid);
1073       i += copy->mid - target - 1;   /* MID: 90, t = 85, i += 4 (i++ later) */
1074       mask = (0x1LL << (i + 1)) - 1; /* Mask = i-th bit and all before */
1075       bitfield &= ~mask;             /* Clear all bits up to MID - 1 */
1076       continue;
1077     }
1078
1079     /* Now copy->mid == target, free it */
1080     next = copy->next;
1081     GNUNET_break (GNUNET_YES != rel_message_free (copy, GNUNET_YES));
1082     copy = next;
1083   }
1084   LOG (GNUNET_ERROR_TYPE_DEBUG, "free_sent_reliable END\n");
1085 }
1086
1087
1088 /**
1089  * Destroy a reliable message after it has been acknowledged, either by
1090  * direct mid ACK or bitfield. Updates the appropriate data structures and
1091  * timers and frees all memory.
1092  *
1093  * @param copy Message that is no longer needed: remote peer got it.
1094  * @param update_time Is the timing information relevant?
1095  *                    If this message is ACK in a batch the timing information
1096  *                    is skewed by the retransmission, count only for the
1097  *                    retransmitted message.
1098  *
1099  * @return #GNUNET_YES if channel was destroyed as a result of the call,
1100  *         #GNUNET_NO otherwise.
1101  */
1102 static int
1103 rel_message_free (struct CadetReliableMessage *copy, int update_time)
1104 {
1105   struct CadetChannelReliability *rel;
1106   struct GNUNET_TIME_Relative time;
1107
1108   rel = copy->rel;
1109   LOG (GNUNET_ERROR_TYPE_DEBUG, "Freeing %u\n", copy->mid);
1110   if (GNUNET_YES == update_time)
1111   {
1112     time = GNUNET_TIME_absolute_get_duration (copy->timestamp);
1113     if (0 == rel->expected_delay.rel_value_us)
1114       rel->expected_delay = time;
1115     else
1116     {
1117       rel->expected_delay.rel_value_us *= 7;
1118       rel->expected_delay.rel_value_us += time.rel_value_us;
1119       rel->expected_delay.rel_value_us /= 8;
1120     }
1121     LOG (GNUNET_ERROR_TYPE_DEBUG, "  message time %12s\n",
1122          GNUNET_STRINGS_relative_time_to_string (time, GNUNET_NO));
1123     LOG (GNUNET_ERROR_TYPE_DEBUG, "  new delay    %12s\n",
1124          GNUNET_STRINGS_relative_time_to_string (rel->expected_delay,
1125                                                  GNUNET_NO));
1126     rel->retry_timer = rel->expected_delay;
1127   }
1128   else
1129   {
1130     LOG (GNUNET_ERROR_TYPE_DEBUG, "batch free, ignoring timing\n");
1131   }
1132   rel->ch->pending_messages--;
1133   if (NULL != copy->chq)
1134   {
1135     GCT_cancel (copy->chq->tq);
1136     /* copy->q is set to NULL by ch_message_sent */
1137   }
1138   GNUNET_CONTAINER_DLL_remove (rel->head_sent, rel->tail_sent, copy);
1139   LOG (GNUNET_ERROR_TYPE_DEBUG, " free send copy MID %u at %p\n",
1140        copy->mid, copy);
1141   GNUNET_free (copy);
1142
1143   if (GNUNET_NO != rel->ch->destroy && 0 == rel->ch->pending_messages)
1144   {
1145     GCCH_destroy (rel->ch);
1146     return GNUNET_YES;
1147   }
1148   return GNUNET_NO;
1149 }
1150
1151
1152 /**
1153  * Channel was ACK'd by remote peer, mark as ready and cancel retransmission.
1154  *
1155  * @param ch Channel to mark as ready.
1156  * @param fwd Was the ACK message a FWD ACK? (dest->root, SYNACK)
1157  */
1158 static void
1159 channel_confirm (struct CadetChannel *ch, int fwd)
1160 {
1161   struct CadetChannelReliability *rel;
1162   enum CadetChannelState oldstate;
1163
1164   rel = fwd ? ch->root_rel : ch->dest_rel;
1165   if (NULL == rel)
1166   {
1167     GNUNET_break (GNUNET_NO != ch->destroy);
1168     return;
1169   }
1170   LOG (GNUNET_ERROR_TYPE_DEBUG, "  channel confirm %s %s\n",
1171        GC_f2s (fwd), GCCH_2s (ch));
1172   oldstate = ch->state;
1173   ch->state = CADET_CHANNEL_READY;
1174
1175   if (CADET_CHANNEL_READY != oldstate || GNUNET_YES == is_loopback (ch))
1176   {
1177     rel->client_ready = GNUNET_YES;
1178     rel->expected_delay = rel->retry_timer;
1179     LOG (GNUNET_ERROR_TYPE_DEBUG, "  confirm retry timer %s\n",
1180          GNUNET_STRINGS_relative_time_to_string (rel->retry_timer, GNUNET_NO));
1181     if (GCT_get_connections_buffer (ch->t) > 0 || GCT_is_loopback (ch->t))
1182       send_client_ack (ch, fwd);
1183
1184     if (NULL != rel->retry_task)
1185     {
1186       GNUNET_SCHEDULER_cancel (rel->retry_task);
1187       rel->retry_task = NULL;
1188     }
1189     else if (NULL != rel->uniq)
1190     {
1191       GCT_cancel (rel->uniq->tq);
1192       /* ch_message_sent will free and NULL uniq */
1193     }
1194     else if (GNUNET_NO == is_loopback (ch))
1195     {
1196       /* We SHOULD have been trying to retransmit this! */
1197       GNUNET_break (0);
1198     }
1199   }
1200
1201   /* In case of a FWD ACK (SYNACK) send a BCK ACK (ACK). */
1202   if (GNUNET_YES == fwd)
1203     send_ack (ch, GNUNET_NO);
1204 }
1205
1206
1207 /**
1208  * Save a copy to retransmit in case it gets lost.
1209  *
1210  * Initializes all needed callbacks and timers.
1211  *
1212  * @param ch Channel this message goes on.
1213  * @param msg Message to copy.
1214  * @param fwd Is this fwd traffic?
1215  */
1216 static struct CadetReliableMessage *
1217 channel_save_copy (struct CadetChannel *ch,
1218                    const struct GNUNET_MessageHeader *msg,
1219                    int fwd)
1220 {
1221   struct CadetChannelReliability *rel;
1222   struct CadetReliableMessage *copy;
1223   uint32_t mid;
1224   uint16_t type;
1225   uint16_t size;
1226
1227   rel = fwd ? ch->root_rel : ch->dest_rel;
1228   mid = rel->mid_send - 1;
1229   type = ntohs (msg->type);
1230   size = ntohs (msg->size);
1231
1232   LOG (GNUNET_ERROR_TYPE_DEBUG, "save MID %u %s\n", mid, GC_m2s (type));
1233   copy = GNUNET_malloc (sizeof (struct CadetReliableMessage) + size);
1234   LOG (GNUNET_ERROR_TYPE_DEBUG, "  at %p\n", copy);
1235   copy->mid = mid;
1236   copy->rel = rel;
1237   copy->type = type;
1238   memcpy (&copy[1], msg, size);
1239   GNUNET_CONTAINER_DLL_insert_tail (rel->head_sent, rel->tail_sent, copy);
1240   ch->pending_messages++;
1241
1242   return copy;
1243 }
1244
1245
1246 /**
1247  * Create a new channel.
1248  *
1249  * @param t Tunnel this channel is in.
1250  * @param owner Client that owns the channel, NULL for foreign channels.
1251  * @param lid_root Local ID for root client.
1252  *
1253  * @return A new initialized channel. NULL on error.
1254  */
1255 static struct CadetChannel *
1256 channel_new (struct CadetTunnel *t,
1257              struct CadetClient *owner,
1258              CADET_ChannelNumber lid_root)
1259 {
1260   struct CadetChannel *ch;
1261
1262   ch = GNUNET_new (struct CadetChannel);
1263   ch->root = owner;
1264   ch->lid_root = lid_root;
1265   ch->t = t;
1266
1267   GNUNET_STATISTICS_update (stats, "# channels", 1, GNUNET_NO);
1268
1269   if (NULL != owner)
1270   {
1271     ch->gid = GCT_get_next_chid (t);
1272     GML_channel_add (owner, lid_root, ch);
1273   }
1274   GCT_add_channel (t, ch);
1275
1276   return ch;
1277 }
1278
1279
1280 /**
1281  * Handle a loopback message: call the appropriate handler for the message type.
1282  *
1283  * @param ch Channel this message is on.
1284  * @param msgh Message header.
1285  * @param fwd Is this FWD traffic?
1286  */
1287 void
1288 handle_loopback (struct CadetChannel *ch,
1289                  const struct GNUNET_MessageHeader *msgh,
1290                  int fwd)
1291 {
1292   uint16_t type;
1293
1294   type = ntohs (msgh->type);
1295   LOG (GNUNET_ERROR_TYPE_DEBUG,
1296        "Loopback %s %s message!\n",
1297        GC_f2s (fwd), GC_m2s (type));
1298
1299   switch (type)
1300   {
1301     case GNUNET_MESSAGE_TYPE_CADET_DATA:
1302       /* Don't send hop ACK, wait for client to ACK */
1303       LOG (GNUNET_ERROR_TYPE_DEBUG, "SEND loopback %u (%u)\n",
1304            ntohl (((struct GNUNET_CADET_Data *) msgh)->mid), ntohs (msgh->size));
1305       GCCH_handle_data (ch, (struct GNUNET_CADET_Data *) msgh, fwd);
1306       break;
1307
1308     case GNUNET_MESSAGE_TYPE_CADET_DATA_ACK:
1309       GCCH_handle_data_ack (ch, (struct GNUNET_CADET_DataACK *) msgh, fwd);
1310       break;
1311
1312     case GNUNET_MESSAGE_TYPE_CADET_CHANNEL_CREATE:
1313       GCCH_handle_create (ch->t,
1314                           (struct GNUNET_CADET_ChannelCreate *) msgh);
1315       break;
1316
1317     case GNUNET_MESSAGE_TYPE_CADET_CHANNEL_ACK:
1318       GCCH_handle_ack (ch,
1319                        (struct GNUNET_CADET_ChannelManage *) msgh,
1320                        fwd);
1321       break;
1322
1323     case GNUNET_MESSAGE_TYPE_CADET_CHANNEL_NACK:
1324       GCCH_handle_nack (ch);
1325       break;
1326
1327     case GNUNET_MESSAGE_TYPE_CADET_CHANNEL_DESTROY:
1328       GCCH_handle_destroy (ch,
1329                            (struct GNUNET_CADET_ChannelManage *) msgh,
1330                            fwd);
1331       break;
1332
1333     default:
1334       GNUNET_break_op (0);
1335       LOG (GNUNET_ERROR_TYPE_DEBUG,
1336            "end-to-end message not known (%u)\n",
1337            ntohs (msgh->type));
1338   }
1339 }
1340
1341
1342
1343 /******************************************************************************/
1344 /********************************    API    ***********************************/
1345 /******************************************************************************/
1346
1347 /**
1348  * Destroy a channel and free all resources.
1349  *
1350  * @param ch Channel to destroy.
1351  */
1352 void
1353 GCCH_destroy (struct CadetChannel *ch)
1354 {
1355   struct CadetClient *c;
1356   struct CadetTunnel *t;
1357
1358   if (NULL == ch)
1359     return;
1360   if (2 == ch->destroy)
1361     return; /* recursive call */
1362   ch->destroy = 2;
1363
1364   LOG (GNUNET_ERROR_TYPE_DEBUG, "destroying channel %s:%u\n",
1365               GCT_2s (ch->t), ch->gid);
1366   GCCH_debug (ch);
1367
1368   c = ch->root;
1369   if (NULL != c)
1370   {
1371     GML_channel_remove (c, ch->lid_root, ch);
1372   }
1373
1374   c = ch->dest;
1375   if (NULL != c)
1376   {
1377     GML_channel_remove (c, ch->lid_dest, ch);
1378   }
1379
1380   channel_rel_free_all (ch->root_rel);
1381   channel_rel_free_all (ch->dest_rel);
1382
1383   t = ch->t;
1384   GCT_remove_channel (t, ch);
1385   GNUNET_STATISTICS_update (stats, "# channels", -1, GNUNET_NO);
1386
1387   GNUNET_free (ch);
1388   GCT_destroy_if_empty (t);
1389 }
1390
1391
1392 /**
1393  * Get the channel's public ID.
1394  *
1395  * @param ch Channel.
1396  *
1397  * @return ID used to identify the channel with the remote peer.
1398  */
1399 CADET_ChannelNumber
1400 GCCH_get_id (const struct CadetChannel *ch)
1401 {
1402   return ch->gid;
1403 }
1404
1405
1406 /**
1407  * Get the channel tunnel.
1408  *
1409  * @param ch Channel to get the tunnel from.
1410  *
1411  * @return tunnel of the channel.
1412  */
1413 struct CadetTunnel *
1414 GCCH_get_tunnel (const struct CadetChannel *ch)
1415 {
1416   return ch->t;
1417 }
1418
1419
1420 /**
1421  * Get free buffer space towards the client on a specific channel.
1422  *
1423  * @param ch Channel.
1424  * @param fwd Is query about FWD traffic?
1425  *
1426  * @return Free buffer space [0 - 64]
1427  */
1428 unsigned int
1429 GCCH_get_buffer (struct CadetChannel *ch, int fwd)
1430 {
1431   struct CadetChannelReliability *rel;
1432
1433   rel = fwd ? ch->dest_rel : ch->root_rel;
1434   LOG (GNUNET_ERROR_TYPE_DEBUG, "   get buffer, channel %s\n", GCCH_2s (ch));
1435   GCCH_debug (ch);
1436   /* If rel is NULL it means that the end is not yet created,
1437    * most probably is a loopback channel at the point of sending
1438    * the ChannelCreate to itself.
1439    */
1440   if (NULL == rel)
1441   {
1442     LOG (GNUNET_ERROR_TYPE_DEBUG, "  rel is NULL: max\n");
1443     return 64;
1444   }
1445
1446   LOG (GNUNET_ERROR_TYPE_DEBUG, "   n_recv %d\n", rel->n_recv);
1447   return (64 - rel->n_recv);
1448 }
1449
1450
1451 /**
1452  * Get flow control status of end point: is client allow to send?
1453  *
1454  * @param ch Channel.
1455  * @param fwd Is query about FWD traffic? (Request root status).
1456  *
1457  * @return #GNUNET_YES if client is allowed to send us data.
1458  */
1459 int
1460 GCCH_get_allowed (struct CadetChannel *ch, int fwd)
1461 {
1462   struct CadetChannelReliability *rel;
1463
1464   rel = fwd ? ch->root_rel : ch->dest_rel;
1465
1466   if (NULL == rel)
1467   {
1468     /* Probably shutting down: root/dest NULL'ed to mark disconnection */
1469     GNUNET_break (GNUNET_NO != ch->destroy);
1470     return 0;
1471   }
1472
1473   return rel->client_allowed;
1474 }
1475
1476
1477 /**
1478  * Is the root client for this channel on this peer?
1479  *
1480  * @param ch Channel.
1481  * @param fwd Is this for fwd traffic?
1482  *
1483  * @return #GNUNET_YES in case it is.
1484  */
1485 int
1486 GCCH_is_origin (struct CadetChannel *ch, int fwd)
1487 {
1488   struct CadetClient *c;
1489
1490   c = fwd ? ch->root : ch->dest;
1491   return NULL != c;
1492 }
1493
1494
1495 /**
1496  * Is the destination client for this channel on this peer?
1497  *
1498  * @param ch Channel.
1499  * @param fwd Is this for fwd traffic?
1500  *
1501  * @return #GNUNET_YES in case it is.
1502  */
1503 int
1504 GCCH_is_terminal (struct CadetChannel *ch, int fwd)
1505 {
1506   struct CadetClient *c;
1507
1508   c = fwd ? ch->dest : ch->root;
1509   return NULL != c;
1510 }
1511
1512
1513 /**
1514  * Send an end-to-end ACK message for the most recent in-sequence payload.
1515  *
1516  * If channel is not reliable, do nothing.
1517  *
1518  * @param ch Channel this is about.
1519  * @param fwd Is for FWD traffic? (ACK dest->owner)
1520  */
1521 void
1522 GCCH_send_data_ack (struct CadetChannel *ch, int fwd)
1523 {
1524   struct GNUNET_CADET_DataACK msg;
1525   struct CadetChannelReliability *rel;
1526   struct CadetReliableMessage *copy;
1527   unsigned int delta;
1528   uint64_t mask;
1529   uint32_t ack;
1530
1531   if (GNUNET_NO == ch->reliable)
1532     return;
1533
1534   rel = fwd ? ch->dest_rel : ch->root_rel;
1535   ack = rel->mid_recv - 1;
1536
1537   msg.header.type = htons (GNUNET_MESSAGE_TYPE_CADET_DATA_ACK);
1538   msg.header.size = htons (sizeof (msg));
1539   msg.chid = htonl (ch->gid);
1540   msg.mid = htonl (ack);
1541
1542   msg.futures = 0LL;
1543   for (copy = rel->head_recv; NULL != copy; copy = copy->next)
1544   {
1545     if (copy->type != GNUNET_MESSAGE_TYPE_CADET_DATA)
1546     {
1547       LOG (GNUNET_ERROR_TYPE_DEBUG, " Type %s, expected DATA\n",
1548            GC_m2s (copy->type));
1549       continue;
1550     }
1551     GNUNET_assert (GC_is_pid_bigger(copy->mid, ack));
1552     delta = copy->mid - (ack + 1);
1553     if (63 < delta)
1554       break;
1555     mask = 0x1LL << delta;
1556     msg.futures |= mask;
1557     LOG (GNUNET_ERROR_TYPE_DEBUG,
1558          " setting bit for %u (delta %u) (%llX) -> %llX\n",
1559          copy->mid, delta, mask, msg.futures);
1560   }
1561   LOG (GNUNET_ERROR_TYPE_INFO, "===> DATA_ACK for %u + %llX\n",
1562        ack, msg.futures);
1563
1564   GCCH_send_prebuilt_message (&msg.header, ch, !fwd, NULL);
1565   LOG (GNUNET_ERROR_TYPE_DEBUG, "send_data_ack END\n");
1566 }
1567
1568
1569 /**
1570  * Allow a client to send us more data, in case it was choked.
1571  *
1572  * @param ch Channel.
1573  * @param fwd Is this about FWD traffic? (Root client).
1574  */
1575 void
1576 GCCH_allow_client (struct CadetChannel *ch, int fwd)
1577 {
1578   struct CadetChannelReliability *rel;
1579   unsigned int buffer;
1580
1581   LOG (GNUNET_ERROR_TYPE_DEBUG, "GMCH allow\n");
1582
1583   if (CADET_CHANNEL_READY != ch->state)
1584   {
1585     LOG (GNUNET_ERROR_TYPE_DEBUG, " channel not ready yet!\n");
1586     return;
1587   }
1588
1589   if (GNUNET_YES == ch->reliable)
1590   {
1591     rel = fwd ? ch->root_rel : ch->dest_rel;
1592     if (NULL == rel)
1593     {
1594       GNUNET_break (GNUNET_NO != ch->destroy);
1595       return;
1596     }
1597     if (NULL != rel->head_sent)
1598     {
1599       if (64 <= rel->mid_send - rel->head_sent->mid)
1600       {
1601         LOG (GNUNET_ERROR_TYPE_DEBUG, " too big MID gap! Wait for ACK.\n");
1602         return;
1603       }
1604       else
1605       {
1606         LOG (GNUNET_ERROR_TYPE_DEBUG, " gap ok: %u - %u\n",
1607              rel->head_sent->mid, rel->mid_send);
1608         struct CadetReliableMessage *aux;
1609         for (aux = rel->head_sent; NULL != aux; aux = aux->next)
1610         {
1611           LOG (GNUNET_ERROR_TYPE_DEBUG, "   - sent mid %u\n", aux->mid);
1612         }
1613       }
1614     }
1615     else
1616     {
1617       LOG (GNUNET_ERROR_TYPE_DEBUG, " head sent is NULL\n");
1618     }
1619   }
1620
1621   if (is_loopback (ch))
1622     buffer = GCCH_get_buffer (ch, fwd);
1623   else
1624     buffer = GCT_get_connections_buffer (ch->t);
1625
1626   if (0 == buffer)
1627   {
1628     LOG (GNUNET_ERROR_TYPE_DEBUG, " no buffer space.\n");
1629     return;
1630   }
1631
1632   LOG (GNUNET_ERROR_TYPE_DEBUG, " buffer space %u, allowing\n", buffer);
1633   send_client_ack (ch, fwd);
1634 }
1635
1636
1637 /**
1638  * Log channel info.
1639  *
1640  * @param ch Channel.
1641  */
1642 void
1643 GCCH_debug (struct CadetChannel *ch)
1644 {
1645   if (NULL == ch)
1646   {
1647     LOG (GNUNET_ERROR_TYPE_DEBUG, "*** DEBUG NULL CHANNEL ***\n");
1648     return;
1649   }
1650   LOG (GNUNET_ERROR_TYPE_DEBUG, "Channel %s:%X (%p)\n",
1651               GCT_2s (ch->t), ch->gid, ch);
1652   LOG (GNUNET_ERROR_TYPE_DEBUG, "  root %p/%p\n",
1653               ch->root, ch->root_rel);
1654   if (NULL != ch->root)
1655   {
1656     LOG (GNUNET_ERROR_TYPE_DEBUG, "  cli %s\n", GML_2s (ch->root));
1657     LOG (GNUNET_ERROR_TYPE_DEBUG, "  ready %s\n",
1658                 ch->root_rel->client_ready ? "YES" : "NO");
1659     LOG (GNUNET_ERROR_TYPE_DEBUG, "  id %X\n", ch->lid_root);
1660     LOG (GNUNET_ERROR_TYPE_DEBUG, "  recv %d\n", ch->root_rel->n_recv);
1661     LOG (GNUNET_ERROR_TYPE_DEBUG, "  MID r: %d, s: %d\n",
1662          ch->root_rel->mid_recv, ch->root_rel->mid_send);
1663   }
1664   LOG (GNUNET_ERROR_TYPE_DEBUG, "  dest %p/%p\n",
1665               ch->dest, ch->dest_rel);
1666   if (NULL != ch->dest)
1667   {
1668     LOG (GNUNET_ERROR_TYPE_DEBUG, "  cli %s\n", GML_2s (ch->dest));
1669     LOG (GNUNET_ERROR_TYPE_DEBUG, "  ready %s\n",
1670                 ch->dest_rel->client_ready ? "YES" : "NO");
1671     LOG (GNUNET_ERROR_TYPE_DEBUG, "  id %X\n", ch->lid_dest);
1672     LOG (GNUNET_ERROR_TYPE_DEBUG, "  recv %d\n", ch->dest_rel->n_recv);
1673     LOG (GNUNET_ERROR_TYPE_DEBUG, "  MID r: %d, s: %d\n",
1674          ch->dest_rel->mid_recv, ch->dest_rel->mid_send);
1675
1676   }
1677 }
1678
1679
1680 /**
1681  * Handle an ACK given by a client.
1682  *
1683  * Mark client as ready and send him any buffered data we could have for him.
1684  *
1685  * @param ch Channel.
1686  * @param fwd Is this a "FWD ACK"? (FWD ACKs are sent by dest and go BCK)
1687  */
1688 void
1689 GCCH_handle_local_ack (struct CadetChannel *ch, int fwd)
1690 {
1691   struct CadetChannelReliability *rel;
1692   struct CadetClient *c;
1693
1694   rel = fwd ? ch->dest_rel : ch->root_rel;
1695   c   = fwd ? ch->dest     : ch->root;
1696
1697   rel->client_ready = GNUNET_YES;
1698   send_client_buffered_data (ch, c, fwd);
1699
1700   if (GNUNET_YES == ch->destroy && 0 == rel->n_recv)
1701   {
1702     send_destroy (ch, GNUNET_YES);
1703     GCCH_destroy (ch);
1704     return;
1705   }
1706   /* if loopback is marked for destruction, no need to ACK to the other peer,
1707    * it requested the destruction and is already gone, therefore, else if.
1708    */
1709   else if (is_loopback (ch))
1710   {
1711     unsigned int buffer;
1712
1713     buffer = GCCH_get_buffer (ch, fwd);
1714     if (0 < buffer)
1715       GCCH_allow_client (ch, fwd);
1716
1717     return;
1718   }
1719   GCT_send_connection_acks (ch->t);
1720 }
1721
1722
1723 /**
1724  * Handle data given by a client.
1725  *
1726  * Check whether the client is allowed to send in this tunnel, save if channel
1727  * is reliable and send an ACK to the client if there is still buffer space
1728  * in the tunnel.
1729  *
1730  * @param ch Channel.
1731  * @param c Client which sent the data.
1732  * @param fwd Is this a FWD data?
1733  * @param message Data message.
1734  * @param size Size of data.
1735  *
1736  * @return GNUNET_OK if everything goes well, GNUNET_SYSERR in case of en error.
1737  */
1738 int
1739 GCCH_handle_local_data (struct CadetChannel *ch,
1740                         struct CadetClient *c, int fwd,
1741                         const struct GNUNET_MessageHeader *message,
1742                         size_t size)
1743 {
1744   struct CadetChannelReliability *rel;
1745   struct GNUNET_CADET_Data *payload;
1746   uint16_t p2p_size = sizeof(struct GNUNET_CADET_Data) + size;
1747   unsigned char cbuf[p2p_size];
1748   unsigned char buffer;
1749
1750   /* Is the client in the channel? */
1751   if ( !( (fwd &&
1752            ch->root == c)
1753          ||
1754           (!fwd &&
1755            ch->dest == c) ) )
1756   {
1757     GNUNET_break_op (0);
1758     return GNUNET_SYSERR;
1759   }
1760
1761   rel = fwd ? ch->root_rel : ch->dest_rel;
1762
1763   if (GNUNET_NO == rel->client_allowed)
1764   {
1765     GNUNET_break_op (0);
1766     return GNUNET_SYSERR;
1767   }
1768
1769   rel->client_allowed = GNUNET_NO;
1770
1771   /* Ok, everything is correct, send the message. */
1772   payload = (struct GNUNET_CADET_Data *) cbuf;
1773   payload->mid = htonl (rel->mid_send);
1774   rel->mid_send++;
1775   memcpy (&payload[1], message, size);
1776   payload->header.size = htons (p2p_size);
1777   payload->header.type = htons (GNUNET_MESSAGE_TYPE_CADET_DATA);
1778   payload->chid = htonl (ch->gid);
1779   LOG (GNUNET_ERROR_TYPE_DEBUG, "  sending on channel...\n");
1780   GCCH_send_prebuilt_message (&payload->header, ch, fwd, NULL);
1781
1782   if (is_loopback (ch))
1783     buffer = GCCH_get_buffer (ch, fwd);
1784   else
1785     buffer = GCT_get_connections_buffer (ch->t);
1786
1787   if (0 < buffer)
1788     GCCH_allow_client (ch, fwd);
1789
1790   return GNUNET_OK;
1791 }
1792
1793
1794 /**
1795  * Handle a channel destroy requested by a client.
1796  *
1797  * TODO: add "reason" field
1798  *
1799  * Destroy the channel and the tunnel in case this was the last channel.
1800  *
1801  * @param ch Channel.
1802  * @param c Client that requested the destruction (to avoid notifying him).
1803  * @param is_root Is the request coming from root?
1804  */
1805 void
1806 GCCH_handle_local_destroy (struct CadetChannel *ch,
1807                            struct CadetClient *c,
1808                            int is_root)
1809 {
1810   ch->destroy = GNUNET_YES;
1811   /* Cleanup after the tunnel */
1812   if (GNUNET_NO == is_root && c == ch->dest)
1813   {
1814     LOG (GNUNET_ERROR_TYPE_DEBUG, " Client %s is destination.\n", GML_2s (c));
1815     GML_client_delete_channel (c, ch, ch->lid_dest);
1816     ch->dest = NULL;
1817   }
1818   if (GNUNET_YES == is_root && c == ch->root)
1819   {
1820     LOG (GNUNET_ERROR_TYPE_DEBUG, " Client %s is owner.\n", GML_2s (c));
1821     GML_client_delete_channel (c, ch, ch->lid_root);
1822     ch->root = NULL;
1823   }
1824
1825   send_destroy (ch, GNUNET_NO);
1826   if (0 == ch->pending_messages)
1827     GCCH_destroy (ch);
1828 }
1829
1830
1831 /**
1832  * Handle a channel create requested by a client.
1833  *
1834  * Create the channel and the tunnel in case this was the first0 channel.
1835  *
1836  * @param c Client that requested the creation (will be the root).
1837  * @param msg Create Channel message.
1838  *
1839  * @return GNUNET_OK if everything went fine, GNUNET_SYSERR otherwise.
1840  */
1841 int
1842 GCCH_handle_local_create (struct CadetClient *c,
1843                           struct GNUNET_CADET_ChannelMessage *msg)
1844 {
1845   struct CadetChannel *ch;
1846   struct CadetTunnel *t;
1847   struct CadetPeer *peer;
1848   CADET_ChannelNumber chid;
1849
1850   LOG (GNUNET_ERROR_TYPE_DEBUG, "  towards %s:%u\n",
1851               GNUNET_i2s (&msg->peer), ntohl (msg->port));
1852   chid = ntohl (msg->channel_id);
1853
1854   /* Sanity check for duplicate channel IDs */
1855   if (NULL != GML_channel_get (c, chid))
1856   {
1857     GNUNET_break (0);
1858     return GNUNET_SYSERR;
1859   }
1860
1861   peer = GCP_get (&msg->peer);
1862   GCP_add_tunnel (peer);
1863   t = GCP_get_tunnel (peer);
1864
1865   if (GCP_get_short_id (peer) == myid)
1866   {
1867     GCT_change_cstate (t, CADET_TUNNEL_READY);
1868   }
1869   else
1870   {
1871     /* FIXME change to a tunnel API, eliminate ch <-> peer connection */
1872     GCP_connect (peer);
1873   }
1874
1875   /* Create channel */
1876   ch = channel_new (t, c, chid);
1877   if (NULL == ch)
1878   {
1879     GNUNET_break (0);
1880     return GNUNET_SYSERR;
1881   }
1882   ch->port = ntohl (msg->port);
1883   channel_set_options (ch, ntohl (msg->opt));
1884
1885   /* In unreliable channels, we'll use the DLL to buffer BCK data */
1886   ch->root_rel = GNUNET_new (struct CadetChannelReliability);
1887   ch->root_rel->ch = ch;
1888   ch->root_rel->retry_timer = CADET_RETRANSMIT_TIME;
1889   ch->root_rel->expected_delay.rel_value_us = 0;
1890
1891   LOG (GNUNET_ERROR_TYPE_DEBUG, "CREATED CHANNEL %s\n", GCCH_2s (ch));
1892
1893   send_create (ch);
1894
1895   return GNUNET_OK;
1896 }
1897
1898
1899 /**
1900  * Handler for cadet network payload traffic.
1901  *
1902  * @param ch Channel for the message.
1903  * @param msg Unencryted data message.
1904  * @param fwd Is this message fwd? This only is meaningful in loopback channels.
1905  *            #GNUNET_YES if message is FWD on the respective channel (loopback)
1906  *            #GNUNET_NO if message is BCK on the respective channel (loopback)
1907  *            #GNUNET_SYSERR if message on a one-ended channel (remote)
1908  */
1909 void
1910 GCCH_handle_data (struct CadetChannel *ch,
1911                   const struct GNUNET_CADET_Data *msg,
1912                   int fwd)
1913 {
1914   struct CadetChannelReliability *rel;
1915   struct CadetClient *c;
1916   uint32_t mid;
1917
1918   /* If this is a remote (non-loopback) channel, find 'fwd'. */
1919   if (GNUNET_SYSERR == fwd)
1920   {
1921     if (is_loopback (ch))
1922     {
1923       /* It is a loopback channel after all... */
1924       GNUNET_break (0);
1925       return;
1926     }
1927     fwd = (NULL != ch->dest) ? GNUNET_YES : GNUNET_NO;
1928   }
1929
1930   /*  Initialize FWD/BCK data */
1931   c   = fwd ? ch->dest     : ch->root;
1932   rel = fwd ? ch->dest_rel : ch->root_rel;
1933
1934   if (NULL == c)
1935   {
1936     GNUNET_break (GNUNET_NO != ch->destroy);
1937     return;
1938   }
1939
1940   if (CADET_CHANNEL_READY != ch->state)
1941   {
1942     if (GNUNET_NO == fwd)
1943     {
1944       /* If we are the root, this means the other peer has sent traffic before
1945        * receiving our ACK. Even if the SYNACK goes missing, no traffic should
1946        * be sent before the ACK.
1947        */
1948       GNUNET_break_op (0);
1949       return;
1950     }
1951     /* If we are the dest, this means that the SYNACK got to the root but
1952      * the ACK went missing. Treat this as an ACK.
1953      */
1954     channel_confirm (ch, GNUNET_NO);
1955   }
1956
1957   GNUNET_STATISTICS_update (stats, "# data received", 1, GNUNET_NO);
1958
1959   mid = ntohl (msg->mid);
1960   LOG (GNUNET_ERROR_TYPE_INFO, "<=== DATA %u %s on channel %s\n",
1961        mid, GC_f2s (fwd), GCCH_2s (ch));
1962
1963   if (GNUNET_NO == ch->reliable ||
1964       ( !GC_is_pid_bigger (rel->mid_recv, mid) &&
1965         GC_is_pid_bigger (rel->mid_recv + 64, mid) ) )
1966   {
1967     LOG (GNUNET_ERROR_TYPE_DEBUG, "RECV MID %u (%u)\n",
1968          mid, ntohs (msg->header.size));
1969     if (GNUNET_YES == ch->reliable)
1970     {
1971       /* Is this the exact next expected messasge? */
1972       if (mid == rel->mid_recv)
1973       {
1974         LOG (GNUNET_ERROR_TYPE_DEBUG, "as expected, sending to client\n");
1975         send_client_data (ch, msg, fwd);
1976       }
1977       else
1978       {
1979         LOG (GNUNET_ERROR_TYPE_DEBUG, "save for later\n");
1980         add_buffered_data (msg, rel);
1981       }
1982     }
1983     else
1984     {
1985       /* Tunnel is unreliable: send to clients directly */
1986       /* FIXME: accept Out Of Order traffic */
1987       rel->mid_recv = mid + 1;
1988       send_client_data (ch, msg, fwd);
1989     }
1990   }
1991   else
1992   {
1993     if (GC_is_pid_bigger (rel->mid_recv, mid))
1994     {
1995       GNUNET_break_op (0);
1996       LOG (GNUNET_ERROR_TYPE_WARNING,
1997           "MID %u on channel %s not expected (window: %u - %u). Dropping!\n",
1998           mid, GCCH_2s (ch), rel->mid_recv, rel->mid_recv + 63);
1999     }
2000     else
2001     {
2002       LOG (GNUNET_ERROR_TYPE_WARNING,
2003            "Duplicate MID %u, channel %s (expecting MID %u). Re-sending ACK!\n",
2004            mid, GCCH_2s (ch), rel->mid_recv);
2005       if (NULL != rel->uniq)
2006       {
2007         LOG (GNUNET_ERROR_TYPE_WARNING,
2008             "We are trying to send an ACK, but don't seem have the "
2009             "bandwidth. Try to increase your ats QUOTA in you config file\n");
2010       }
2011
2012     }
2013   }
2014
2015   GCCH_send_data_ack (ch, fwd);
2016 }
2017
2018
2019 /**
2020  * Handler for cadet network traffic end-to-end ACKs.
2021  *
2022  * @param ch Channel on which we got this message.
2023  * @param msg Data message.
2024  * @param fwd Is this message fwd? This only is meaningful in loopback channels.
2025  *            #GNUNET_YES if message is FWD on the respective channel (loopback)
2026  *            #GNUNET_NO if message is BCK on the respective channel (loopback)
2027  *            #GNUNET_SYSERR if message on a one-ended channel (remote)
2028  */
2029 void
2030 GCCH_handle_data_ack (struct CadetChannel *ch,
2031                       const struct GNUNET_CADET_DataACK *msg,
2032                       int fwd)
2033 {
2034   struct CadetChannelReliability *rel;
2035   struct CadetReliableMessage *copy;
2036   struct CadetReliableMessage *next;
2037   uint32_t ack;
2038   int work;
2039
2040   /* If this is a remote (non-loopback) channel, find 'fwd'. */
2041   if (GNUNET_SYSERR == fwd)
2042   {
2043     if (is_loopback (ch))
2044     {
2045       /* It is a loopback channel after all... */
2046       GNUNET_break (0);
2047       return;
2048     }
2049     /* Inverted: if message came 'FWD' is a 'BCK ACK'. */
2050     fwd = (NULL != ch->dest) ? GNUNET_NO : GNUNET_YES;
2051   }
2052
2053   ack = ntohl (msg->mid);
2054   LOG (GNUNET_ERROR_TYPE_INFO, "<=== %s ACK %u + %llX\n",
2055        GC_f2s (fwd), ack, msg->futures);
2056
2057   if (GNUNET_YES == fwd)
2058     rel = ch->root_rel;
2059   else
2060     rel = ch->dest_rel;
2061
2062   if (NULL == rel)
2063   {
2064     GNUNET_break (GNUNET_NO != ch->destroy);
2065     return;
2066   }
2067
2068   /* Free ACK'd copies: no need to retransmit those anymore FIXME refactor */
2069   for (work = GNUNET_NO, copy = rel->head_sent; copy != NULL; copy = next)
2070   {
2071     if (GC_is_pid_bigger (copy->mid, ack))
2072     {
2073       LOG (GNUNET_ERROR_TYPE_DEBUG, "  head %u, out!\n", copy->mid);
2074       channel_rel_free_sent (rel, msg);
2075       break;
2076     }
2077     work = GNUNET_YES;
2078     LOG (GNUNET_ERROR_TYPE_DEBUG, "  id %u\n", copy->mid);
2079     next = copy->next;
2080     if (GNUNET_YES == rel_message_free (copy, GNUNET_YES))
2081     {
2082       LOG (GNUNET_ERROR_TYPE_DEBUG, " channel destoyed\n");
2083       return;
2084     }
2085   }
2086
2087   /* ACK client if needed and possible */
2088   GCCH_allow_client (ch, fwd);
2089
2090   /* If some message was free'd, update the retransmission delay */
2091   if (GNUNET_YES == work)
2092   {
2093     if (NULL != rel->retry_task)
2094     {
2095       GNUNET_SCHEDULER_cancel (rel->retry_task);
2096       rel->retry_task = NULL;
2097       if (NULL != rel->head_sent && NULL == rel->head_sent->chq)
2098       {
2099         struct GNUNET_TIME_Absolute new_target;
2100         struct GNUNET_TIME_Relative delay;
2101
2102         delay = GNUNET_TIME_relative_multiply (rel->retry_timer,
2103                                                CADET_RETRANSMIT_MARGIN);
2104         new_target = GNUNET_TIME_absolute_add (rel->head_sent->timestamp,
2105                                                delay);
2106         delay = GNUNET_TIME_absolute_get_remaining (new_target);
2107         rel->retry_task =
2108             GNUNET_SCHEDULER_add_delayed (delay,
2109                                           &channel_retransmit_message,
2110                                           rel);
2111       }
2112     }
2113     else
2114     {
2115       /* Work was done but no task was pending? Shouldn't happen! */
2116       GNUNET_break (0);
2117     }
2118   }
2119 }
2120
2121
2122 /**
2123  * Handler for channel create messages.
2124  *
2125  * Does not have fwd parameter because it's always 'FWD': channel is incoming.
2126  *
2127  * @param t Tunnel this channel will be in.
2128  * @param msg Channel crate message.
2129  */
2130 struct CadetChannel *
2131 GCCH_handle_create (struct CadetTunnel *t,
2132                     const struct GNUNET_CADET_ChannelCreate *msg)
2133 {
2134   CADET_ChannelNumber chid;
2135   struct CadetChannel *ch;
2136   struct CadetClient *c;
2137   int new_channel;
2138
2139   chid = ntohl (msg->chid);
2140   ch = GCT_get_channel (t, chid);
2141   if (NULL == ch)
2142   {
2143     /* Create channel */
2144     ch = channel_new (t, NULL, 0);
2145     ch->gid = chid;
2146     channel_set_options (ch, ntohl (msg->opt));
2147     new_channel = GNUNET_YES;
2148   }
2149   else
2150   {
2151     new_channel = GNUNET_NO;
2152   }
2153
2154   if (GNUNET_YES == new_channel || GCT_is_loopback (t))
2155   {
2156     /* Find a destination client */
2157     ch->port = ntohl (msg->port);
2158     LOG (GNUNET_ERROR_TYPE_DEBUG, "   port %u\n", ch->port);
2159     c = GML_client_get_by_port (ch->port);
2160     if (NULL == c)
2161     {
2162       LOG (GNUNET_ERROR_TYPE_DEBUG, "  no client has port registered\n");
2163       if (is_loopback (ch))
2164       {
2165         LOG (GNUNET_ERROR_TYPE_DEBUG, "  loopback: destroy on handler\n");
2166         send_nack (ch);
2167       }
2168       else
2169       {
2170         LOG (GNUNET_ERROR_TYPE_DEBUG, "  not loopback: destroy now\n");
2171         send_nack (ch);
2172         GCCH_destroy (ch);
2173       }
2174       return NULL;
2175     }
2176     else
2177     {
2178       LOG (GNUNET_ERROR_TYPE_DEBUG, "  client %p has port registered\n", c);
2179     }
2180
2181     add_destination (ch, c);
2182     if (GNUNET_YES == ch->reliable)
2183       LOG (GNUNET_ERROR_TYPE_DEBUG, "Reliable\n");
2184     else
2185       LOG (GNUNET_ERROR_TYPE_DEBUG, "Not Reliable\n");
2186
2187     send_client_create (ch);
2188     ch->state =  CADET_CHANNEL_SENT;
2189   }
2190   else
2191   {
2192     LOG (GNUNET_ERROR_TYPE_DEBUG, "  duplicate create channel\n");
2193     if (NULL != ch->dest_rel->retry_task)
2194     {
2195       LOG (GNUNET_ERROR_TYPE_DEBUG, "  clearing retry task\n");
2196       /* we were waiting to re-send our 'SYNACK', wait no more! */
2197       GNUNET_SCHEDULER_cancel (ch->dest_rel->retry_task);
2198       ch->dest_rel->retry_task = NULL;
2199     }
2200     else if (NULL != ch->dest_rel->uniq)
2201     {
2202       /* we are waiting to for our 'SYNACK' to leave the queue, all done! */
2203       return ch;
2204     }
2205   }
2206   send_ack (ch, GNUNET_YES);
2207
2208   return ch;
2209 }
2210
2211
2212 /**
2213  * Handler for channel NACK messages.
2214  *
2215  * NACK messages always go dest -> root, no need for 'fwd' or 'msg' parameter.
2216  *
2217  * @param ch Channel.
2218  */
2219 void
2220 GCCH_handle_nack (struct CadetChannel *ch)
2221 {
2222   send_client_nack (ch);
2223   GCCH_destroy (ch);
2224 }
2225
2226
2227 /**
2228  * Handler for channel ack messages.
2229  *
2230  * @param ch Channel.
2231  * @param msg Message.
2232  * @param fwd Is this message fwd? This only is meaningful in loopback channels.
2233  *            #GNUNET_YES if message is FWD on the respective channel (loopback)
2234  *            #GNUNET_NO if message is BCK on the respective channel (loopback)
2235  *            #GNUNET_SYSERR if message on a one-ended channel (remote)
2236  */
2237 void
2238 GCCH_handle_ack (struct CadetChannel *ch,
2239                  const struct GNUNET_CADET_ChannelManage *msg,
2240                  int fwd)
2241 {
2242   /* If this is a remote (non-loopback) channel, find 'fwd'. */
2243   if (GNUNET_SYSERR == fwd)
2244   {
2245     if (is_loopback (ch))
2246     {
2247       /* It is a loopback channel after all... */
2248       GNUNET_break (0);
2249       return;
2250     }
2251     fwd = (NULL != ch->dest) ? GNUNET_YES : GNUNET_NO;
2252   }
2253
2254   channel_confirm (ch, !fwd);
2255 }
2256
2257
2258 /**
2259  * Handler for channel destroy messages.
2260  *
2261  * @param ch Channel to be destroyed of.
2262  * @param msg Message.
2263  * @param fwd Is this message fwd? This only is meaningful in loopback channels.
2264  *            #GNUNET_YES if message is FWD on the respective channel (loopback)
2265  *            #GNUNET_NO if message is BCK on the respective channel (loopback)
2266  *            #GNUNET_SYSERR if message on a one-ended channel (remote)
2267  */
2268 void
2269 GCCH_handle_destroy (struct CadetChannel *ch,
2270                      const struct GNUNET_CADET_ChannelManage *msg,
2271                      int fwd)
2272 {
2273   struct CadetChannelReliability *rel;
2274
2275   /* If this is a remote (non-loopback) channel, find 'fwd'. */
2276   if (GNUNET_SYSERR == fwd)
2277   {
2278     if (is_loopback (ch))
2279     {
2280       /* It is a loopback channel after all... */
2281       GNUNET_break (0);
2282       return;
2283     }
2284     fwd = (NULL != ch->dest) ? GNUNET_YES : GNUNET_NO;
2285   }
2286
2287   GCCH_debug (ch);
2288   if ( (fwd && NULL == ch->dest) || (!fwd && NULL == ch->root) )
2289   {
2290     /* Not for us (don't destroy twice a half-open loopback channel) */
2291     return;
2292   }
2293
2294   rel = fwd ? ch->dest_rel : ch->root_rel;
2295   if (0 == rel->n_recv)
2296   {
2297     send_destroy (ch, GNUNET_YES);
2298     GCCH_destroy (ch);
2299   }
2300   else
2301   {
2302     ch->destroy = GNUNET_YES;
2303   }
2304 }
2305
2306
2307 /**
2308  * Sends an already built message on a channel.
2309  *
2310  * If the channel is on a loopback tunnel, notifies the appropriate destination
2311  * client locally.
2312  *
2313  * On a normal channel passes the message to the tunnel for encryption and
2314  * sending on a connection.
2315  *
2316  * This function DOES NOT save the message for retransmission.
2317  *
2318  * @param message Message to send. Function makes a copy of it.
2319  * @param ch Channel on which this message is transmitted.
2320  * @param fwd Is this a fwd message?
2321  * @param existing_copy This is a retransmission, don't save a copy.
2322  */
2323 void
2324 GCCH_send_prebuilt_message (const struct GNUNET_MessageHeader *message,
2325                             struct CadetChannel *ch, int fwd,
2326                             void *existing_copy)
2327 {
2328   struct CadetChannelQueue *chq;
2329   uint16_t type;
2330
2331   type = ntohs (message->type);
2332   LOG (GNUNET_ERROR_TYPE_INFO, "===> %s %s on channel %s\n",
2333        GC_m2s (type), GC_f2s (fwd), GCCH_2s (ch));
2334
2335   if (GCT_is_loopback (ch->t))
2336   {
2337     handle_loopback (ch, message, fwd);
2338     return;
2339   }
2340
2341   switch (type)
2342   {
2343     struct GNUNET_CADET_Data *payload;
2344     case GNUNET_MESSAGE_TYPE_CADET_DATA:
2345
2346       payload = (struct GNUNET_CADET_Data *) message;
2347       LOG (GNUNET_ERROR_TYPE_INFO, "===> %s %u\n",
2348            GC_m2s (type), ntohl (payload->mid));
2349       if (GNUNET_YES == ch->reliable)
2350       {
2351         chq = GNUNET_new (struct CadetChannelQueue);
2352         chq->type = type;
2353         if (NULL == existing_copy)
2354           chq->copy = channel_save_copy (ch, message, fwd);
2355         else
2356         {
2357           chq->copy = (struct CadetReliableMessage *) existing_copy;
2358           if (NULL != chq->copy->chq)
2359           {
2360             /* Last retransmission was queued but not yet sent!
2361              * This retransmission was scheduled by a ch_message_sent which
2362              * followed a very fast RTT, so the tiny delay made the
2363              * retransmission function to execute before the previous
2364              * retransmitted message even had a chance to leave the peer.
2365              * Cancel this message and wait until the pending
2366              * retransmission leaves the peer and ch_message_sent starts
2367              * the timer for the next one.
2368              */
2369             GNUNET_free (chq);
2370             LOG (GNUNET_ERROR_TYPE_DEBUG,
2371                  "  exisitng copy not yet transmitted!\n");
2372             return;
2373           }
2374           LOG (GNUNET_ERROR_TYPE_DEBUG,
2375                "  using existing copy: %p {r:%p q:%p t:%u}\n",
2376                existing_copy,
2377                chq->copy->rel, chq->copy->chq, chq->copy->type);
2378         }
2379         LOG (GNUNET_ERROR_TYPE_DEBUG, "  new chq: %p\n", chq);
2380         chq->copy->chq = chq;
2381         chq->tq = GCT_send_prebuilt_message (message, ch->t, NULL,
2382                                              NULL != existing_copy,
2383                                              &ch_message_sent, chq);
2384         /* q itself is stored in copy */
2385         GNUNET_assert (NULL != chq->tq || GNUNET_NO != ch->destroy);
2386       }
2387       else
2388       {
2389         fire_and_forget (message, ch, GNUNET_NO);
2390       }
2391       break;
2392
2393
2394     case GNUNET_MESSAGE_TYPE_CADET_DATA_ACK:
2395     case GNUNET_MESSAGE_TYPE_CADET_CHANNEL_CREATE:
2396     case GNUNET_MESSAGE_TYPE_CADET_CHANNEL_ACK:
2397       chq = GNUNET_new (struct CadetChannelQueue);
2398       chq->type = type;
2399       chq->rel = fwd ? ch->root_rel : ch->dest_rel;
2400       if (NULL != chq->rel->uniq)
2401       {
2402         if (NULL != chq->rel->uniq->tq)
2403         {
2404           GCT_cancel (chq->rel->uniq->tq);
2405           /* ch_message_sent is called, freeing and NULLing uniq */
2406           GNUNET_break (NULL == chq->rel->uniq);
2407         }
2408         else
2409         {
2410           GNUNET_break (0);
2411           GNUNET_free (chq->rel->uniq);
2412         }
2413       }
2414
2415       chq->tq = GCT_send_prebuilt_message (message, ch->t, NULL, GNUNET_YES,
2416                                            &ch_message_sent, chq);
2417       if (NULL == chq->tq)
2418       {
2419         GNUNET_break (0);
2420         GCT_debug (ch->t, GNUNET_ERROR_TYPE_ERROR);
2421         GNUNET_free (chq);
2422         chq = NULL;
2423         return;
2424       }
2425       chq->rel->uniq = chq;
2426       break;
2427
2428
2429     case GNUNET_MESSAGE_TYPE_CADET_CHANNEL_DESTROY:
2430     case GNUNET_MESSAGE_TYPE_CADET_CHANNEL_NACK:
2431       fire_and_forget (message, ch, GNUNET_YES);
2432       break;
2433
2434
2435     default:
2436       GNUNET_break (0);
2437       LOG (GNUNET_ERROR_TYPE_DEBUG, "type %s unknown!\n", GC_m2s (type));
2438       fire_and_forget (message, ch, GNUNET_YES);
2439   }
2440 }
2441
2442
2443 /**
2444  * Get the static string for identification of the channel.
2445  *
2446  * @param ch Channel.
2447  *
2448  * @return Static string with the channel IDs.
2449  */
2450 const char *
2451 GCCH_2s (const struct CadetChannel *ch)
2452 {
2453   static char buf[64];
2454
2455   if (NULL == ch)
2456     return "(NULL Channel)";
2457
2458   SPRINTF (buf, "%s:%u gid:%X (%X / %X)",
2459            GCT_2s (ch->t), ch->port, ch->gid, ch->lid_root, ch->lid_dest);
2460
2461   return buf;
2462 }