Fixed channel recv buffer space accounting error when receiving a duplicate message
[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., 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 "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, " COPYFREE RECV %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 4 * %s\n",
824              GNUNET_STRINGS_relative_time_to_string (rel->expected_delay,
825                                                      GNUNET_YES));
826         if (0 != rel->expected_delay.rel_value_us)
827         {
828           rel->retry_timer =
829           GNUNET_TIME_relative_multiply (rel->expected_delay,
830                                          CADET_RETRANSMIT_MARGIN);
831         }
832         else
833         {
834           rel->retry_timer = CADET_RETRANSMIT_TIME;
835         }
836         LOG (GNUNET_ERROR_TYPE_DEBUG, "  using delay %s\n",
837              GNUNET_STRINGS_relative_time_to_string (rel->retry_timer,
838                                                      GNUNET_NO));
839         rel->retry_task =
840             GNUNET_SCHEDULER_add_delayed (rel->retry_timer,
841                                           &channel_retransmit_message, rel);
842       }
843       else
844       {
845         LOG (GNUNET_ERROR_TYPE_DEBUG, "retry running %p\n", rel->retry_task);
846       }
847       copy->chq = NULL;
848       break;
849
850
851     case GNUNET_MESSAGE_TYPE_CADET_DATA_ACK:
852     case GNUNET_MESSAGE_TYPE_CADET_CHANNEL_CREATE:
853     case GNUNET_MESSAGE_TYPE_CADET_CHANNEL_ACK:
854       LOG (GNUNET_ERROR_TYPE_DEBUG, "sent %s\n", GC_m2s (chq->type));
855       rel = chq->rel;
856       GNUNET_assert (rel->uniq == chq);
857       rel->uniq = NULL;
858
859       if (CADET_CHANNEL_READY != rel->ch->state
860           && GNUNET_MESSAGE_TYPE_CADET_DATA_ACK != type
861           && GNUNET_NO == rel->ch->destroy)
862       {
863         GNUNET_assert (NULL == rel->retry_task);
864         LOG (GNUNET_ERROR_TYPE_DEBUG, "STD BACKOFF %s\n",
865              GNUNET_STRINGS_relative_time_to_string (rel->retry_timer,
866                                                      GNUNET_NO));
867         rel->retry_timer = GNUNET_TIME_STD_BACKOFF (rel->retry_timer);
868         rel->retry_task = GNUNET_SCHEDULER_add_delayed (rel->retry_timer,
869                                                         &channel_recreate, rel);
870       }
871       break;
872
873     default:
874       GNUNET_break (0);
875   }
876
877   GNUNET_free (chq);
878 }
879
880
881 /**
882  * send a channel create message.
883  *
884  * @param ch Channel for which to send.
885  */
886 static void
887 send_create (struct CadetChannel *ch)
888 {
889   struct GNUNET_CADET_ChannelCreate msgcc;
890
891   msgcc.header.size = htons (sizeof (msgcc));
892   msgcc.header.type = htons (GNUNET_MESSAGE_TYPE_CADET_CHANNEL_CREATE);
893   msgcc.chid = htonl (ch->gid);
894   msgcc.port = htonl (ch->port);
895   msgcc.opt = htonl (channel_get_options (ch));
896
897   GCCH_send_prebuilt_message (&msgcc.header, ch, GNUNET_YES, NULL);
898 }
899
900
901 /**
902  * Confirm we got a channel create or FWD ack.
903  *
904  * @param ch The channel to confirm.
905  * @param fwd Should we send a FWD ACK? (going dest->root)
906  */
907 static void
908 send_ack (struct CadetChannel *ch, int fwd)
909 {
910   struct GNUNET_CADET_ChannelManage msg;
911
912   msg.header.size = htons (sizeof (msg));
913   msg.header.type = htons (GNUNET_MESSAGE_TYPE_CADET_CHANNEL_ACK);
914   LOG (GNUNET_ERROR_TYPE_DEBUG, "  sending channel %s ack for channel %s\n",
915        GC_f2s (fwd), GCCH_2s (ch));
916
917   msg.chid = htonl (ch->gid);
918   GCCH_send_prebuilt_message (&msg.header, ch, !fwd, NULL);
919 }
920
921
922 /**
923  * Send a message and don't keep any info about it: we won't need to cancel it
924  * or resend it.
925  *
926  * @param msg Header of the message to fire away.
927  * @param ch Channel on which the message should go.
928  * @param force Is this a forced (undroppable) message?
929  */
930 static void
931 fire_and_forget (const struct GNUNET_MessageHeader *msg,
932                  struct CadetChannel *ch,
933                  int force)
934 {
935   GNUNET_break (NULL == GCT_send_prebuilt_message (msg, ch->t, NULL,
936                                                    force, NULL, NULL));
937 }
938
939
940 /**
941  * Notify that a channel create didn't succeed.
942  *
943  * @param ch The channel to reject.
944  */
945 static void
946 send_nack (struct CadetChannel *ch)
947 {
948   struct GNUNET_CADET_ChannelManage msg;
949
950   msg.header.size = htons (sizeof (msg));
951   msg.header.type = htons (GNUNET_MESSAGE_TYPE_CADET_CHANNEL_NACK);
952   LOG (GNUNET_ERROR_TYPE_DEBUG,
953        "  sending channel NACK for channel %s\n",
954        GCCH_2s (ch));
955
956   msg.chid = htonl (ch->gid);
957   GCCH_send_prebuilt_message (&msg.header, ch, GNUNET_NO, NULL);
958 }
959
960
961 /**
962  * Destroy all reliable messages queued for a channel,
963  * during a channel destruction.
964  * Frees the reliability structure itself.
965  *
966  * @param rel Reliability data for a channel.
967  */
968 static void
969 channel_rel_free_all (struct CadetChannelReliability *rel)
970 {
971   struct CadetReliableMessage *copy;
972   struct CadetReliableMessage *next;
973
974   if (NULL == rel)
975     return;
976
977   for (copy = rel->head_recv; NULL != copy; copy = next)
978   {
979     next = copy->next;
980     GNUNET_CONTAINER_DLL_remove (rel->head_recv, rel->tail_recv, copy);
981     LOG (GNUNET_ERROR_TYPE_DEBUG, " COPYFREE ALL RECV %p\n", copy);
982     GNUNET_break (NULL == copy->chq);
983     GNUNET_free (copy);
984   }
985   for (copy = rel->head_sent; NULL != copy; copy = next)
986   {
987     next = copy->next;
988     GNUNET_CONTAINER_DLL_remove (rel->head_sent, rel->tail_sent, copy);
989     LOG (GNUNET_ERROR_TYPE_DEBUG, " COPYFREE ALL SEND %p\n", copy);
990     if (NULL != copy->chq)
991     {
992       if (NULL != copy->chq->tq)
993       {
994         GCT_cancel (copy->chq->tq);
995         /* ch_message_sent will free copy->q */
996       }
997       else
998       {
999         GNUNET_free (copy->chq);
1000         GNUNET_break (0);
1001       }
1002     }
1003     GNUNET_free (copy);
1004   }
1005   if (NULL != rel->uniq && NULL != rel->uniq->tq)
1006   {
1007     GCT_cancel (rel->uniq->tq);
1008     /* ch_message_sent is called freeing uniq */
1009   }
1010   if (NULL != rel->retry_task)
1011   {
1012     GNUNET_SCHEDULER_cancel (rel->retry_task);
1013     rel->retry_task = NULL;
1014   }
1015   GNUNET_free (rel);
1016 }
1017
1018
1019 /**
1020  * Mark future messages as ACK'd.
1021  *
1022  * @param rel Reliability data.
1023  * @param msg DataACK message with a bitfield of future ACK'd messages.
1024  */
1025 static void
1026 channel_rel_free_sent (struct CadetChannelReliability *rel,
1027                        const struct GNUNET_CADET_DataACK *msg)
1028 {
1029   struct CadetReliableMessage *copy;
1030   struct CadetReliableMessage *next;
1031   uint64_t bitfield;
1032   uint64_t mask;
1033   uint32_t mid;
1034   uint32_t target;
1035   unsigned int i;
1036
1037   bitfield = msg->futures;
1038   mid = ntohl (msg->mid);
1039   LOG (GNUNET_ERROR_TYPE_DEBUG, "free_sent_reliable %u %llX\n", mid, bitfield);
1040   LOG (GNUNET_ERROR_TYPE_DEBUG, " rel %p, head %p\n", rel, rel->head_sent);
1041   for (i = 0, copy = rel->head_sent;
1042        i < 64 && NULL != copy && 0 != bitfield;
1043        i++)
1044   {
1045     LOG (GNUNET_ERROR_TYPE_DEBUG, " trying bit %u (mid %u)\n", i, mid + i + 1);
1046     mask = 0x1LL << i;
1047     if (0 == (bitfield & mask))
1048      continue;
1049
1050     LOG (GNUNET_ERROR_TYPE_DEBUG, " set!\n");
1051     /* Bit was set, clear the bit from the bitfield */
1052     bitfield &= ~mask;
1053
1054     /* The i-th bit was set. Do we have that copy? */
1055     /* Skip copies with mid < target */
1056     target = mid + i + 1;
1057     LOG (GNUNET_ERROR_TYPE_DEBUG, " target %u\n", target);
1058     while (NULL != copy && GC_is_pid_bigger (target, copy->mid))
1059       copy = copy->next;
1060
1061     /* Did we run out of copies? (previously freed, it's ok) */
1062     if (NULL == copy)
1063     {
1064       LOG (GNUNET_ERROR_TYPE_DEBUG, "run out of copies...\n");
1065       return;
1066     }
1067
1068     /* Did we overshoot the target? (previously freed, it's ok) */
1069     if (GC_is_pid_bigger (copy->mid, target))
1070     {
1071       LOG (GNUNET_ERROR_TYPE_DEBUG, " next copy %u\n", copy->mid);
1072       i += copy->mid - target - 1;   /* MID: 90, t = 85, i += 4 (i++ later) */
1073       mask = (0x1LL << (i + 1)) - 1; /* Mask = i-th bit and all before */
1074       bitfield &= ~mask;             /* Clear all bits up to MID - 1 */
1075       continue;
1076     }
1077
1078     /* Now copy->mid == target, free it */
1079     next = copy->next;
1080     GNUNET_break (GNUNET_YES != rel_message_free (copy, GNUNET_YES));
1081     copy = next;
1082   }
1083   LOG (GNUNET_ERROR_TYPE_DEBUG, "free_sent_reliable END\n");
1084 }
1085
1086
1087 /**
1088  * Destroy a reliable message after it has been acknowledged, either by
1089  * direct mid ACK or bitfield. Updates the appropriate data structures and
1090  * timers and frees all memory.
1091  *
1092  * @param copy Message that is no longer needed: remote peer got it.
1093  * @param update_time Is the timing information relevant?
1094  *                    If this message is ACK in a batch the timing information
1095  *                    is skewed by the retransmission, count only for the
1096  *                    retransmitted message.
1097  *
1098  * @return #GNUNET_YES if channel was destroyed as a result of the call,
1099  *         #GNUNET_NO otherwise.
1100  */
1101 static int
1102 rel_message_free (struct CadetReliableMessage *copy, int update_time)
1103 {
1104   struct CadetChannelReliability *rel;
1105   struct GNUNET_TIME_Relative time;
1106
1107   rel = copy->rel;
1108   LOG (GNUNET_ERROR_TYPE_DEBUG, "TIME Freeing %u\n", copy->mid);
1109   if (update_time)
1110   {
1111     time = GNUNET_TIME_absolute_get_duration (copy->timestamp);
1112     if (0 == rel->expected_delay.rel_value_us)
1113       rel->expected_delay = time;
1114     else
1115     {
1116       rel->expected_delay.rel_value_us *= 7;
1117       rel->expected_delay.rel_value_us += time.rel_value_us;
1118       rel->expected_delay.rel_value_us /= 8;
1119     }
1120     LOG (GNUNET_ERROR_TYPE_INFO, "TIME  message   %12s\n",
1121          GNUNET_STRINGS_relative_time_to_string (time, GNUNET_NO));
1122     LOG (GNUNET_ERROR_TYPE_INFO, "TIME  new delay %12s\n",
1123          GNUNET_STRINGS_relative_time_to_string (rel->expected_delay,
1124                                                  GNUNET_NO));
1125     rel->retry_timer = rel->expected_delay;
1126   }
1127   else
1128   {
1129     LOG (GNUNET_ERROR_TYPE_INFO, "TIME batch free, ignoring timing\n");
1130   }
1131   rel->ch->pending_messages--;
1132   if (NULL != copy->chq)
1133   {
1134     GCT_cancel (copy->chq->tq);
1135     /* copy->q is set to NULL by ch_message_sent */
1136   }
1137   GNUNET_CONTAINER_DLL_remove (rel->head_sent, rel->tail_sent, copy);
1138   LOG (GNUNET_ERROR_TYPE_DEBUG, " COPYFREE SEND %p\n", copy);
1139   GNUNET_free (copy);
1140
1141   if (GNUNET_NO != rel->ch->destroy && 0 == rel->ch->pending_messages)
1142   {
1143     GCCH_destroy (rel->ch);
1144     return GNUNET_YES;
1145   }
1146   return GNUNET_NO;
1147 }
1148
1149
1150 /**
1151  * Channel was ACK'd by remote peer, mark as ready and cancel retransmission.
1152  *
1153  * @param ch Channel to mark as ready.
1154  * @param fwd Was the ACK message a FWD ACK? (dest->root, SYNACK)
1155  */
1156 static void
1157 channel_confirm (struct CadetChannel *ch, int fwd)
1158 {
1159   struct CadetChannelReliability *rel;
1160   enum CadetChannelState oldstate;
1161
1162   rel = fwd ? ch->root_rel : ch->dest_rel;
1163   if (NULL == rel)
1164   {
1165     GNUNET_break (GNUNET_NO != ch->destroy);
1166     return;
1167   }
1168   LOG (GNUNET_ERROR_TYPE_DEBUG, "  channel confirm %s %s\n",
1169        GC_f2s (fwd), GCCH_2s (ch));
1170   oldstate = ch->state;
1171   ch->state = CADET_CHANNEL_READY;
1172
1173   if (CADET_CHANNEL_READY != oldstate || GNUNET_YES == is_loopback (ch))
1174   {
1175     rel->client_ready = GNUNET_YES;
1176     rel->expected_delay = rel->retry_timer;
1177     LOG (GNUNET_ERROR_TYPE_DEBUG, "  confirm retry timer %s\n",
1178          GNUNET_STRINGS_relative_time_to_string (rel->retry_timer, GNUNET_NO));
1179     if (GCT_get_connections_buffer (ch->t) > 0 || GCT_is_loopback (ch->t))
1180       send_client_ack (ch, fwd);
1181
1182     if (NULL != rel->retry_task)
1183     {
1184       GNUNET_SCHEDULER_cancel (rel->retry_task);
1185       rel->retry_task = NULL;
1186     }
1187     else if (NULL != rel->uniq)
1188     {
1189       GCT_cancel (rel->uniq->tq);
1190       /* ch_message_sent will free and NULL uniq */
1191     }
1192     else if (GNUNET_NO == is_loopback (ch))
1193     {
1194       /* We SHOULD have been trying to retransmit this! */
1195       GNUNET_break (0);
1196     }
1197   }
1198
1199   /* In case of a FWD ACK (SYNACK) send a BCK ACK (ACK). */
1200   if (GNUNET_YES == fwd)
1201     send_ack (ch, GNUNET_NO);
1202 }
1203
1204
1205 /**
1206  * Save a copy to retransmit in case it gets lost.
1207  *
1208  * Initializes all needed callbacks and timers.
1209  *
1210  * @param ch Channel this message goes on.
1211  * @param msg Message to copy.
1212  * @param fwd Is this fwd traffic?
1213  */
1214 static struct CadetReliableMessage *
1215 channel_save_copy (struct CadetChannel *ch,
1216                    const struct GNUNET_MessageHeader *msg,
1217                    int fwd)
1218 {
1219   struct CadetChannelReliability *rel;
1220   struct CadetReliableMessage *copy;
1221   uint32_t mid;
1222   uint16_t type;
1223   uint16_t size;
1224
1225   rel = fwd ? ch->root_rel : ch->dest_rel;
1226   mid = rel->mid_send - 1;
1227   type = ntohs (msg->type);
1228   size = ntohs (msg->size);
1229
1230   LOG (GNUNET_ERROR_TYPE_DEBUG, "save MID %u %s\n", mid, GC_m2s (type));
1231   copy = GNUNET_malloc (sizeof (struct CadetReliableMessage) + size);
1232   LOG (GNUNET_ERROR_TYPE_DEBUG, "  at %p\n", copy);
1233   copy->mid = mid;
1234   copy->rel = rel;
1235   copy->type = type;
1236   memcpy (&copy[1], msg, size);
1237   GNUNET_CONTAINER_DLL_insert_tail (rel->head_sent, rel->tail_sent, copy);
1238   ch->pending_messages++;
1239
1240   return copy;
1241 }
1242
1243
1244 /**
1245  * Create a new channel.
1246  *
1247  * @param t Tunnel this channel is in.
1248  * @param owner Client that owns the channel, NULL for foreign channels.
1249  * @param lid_root Local ID for root client.
1250  *
1251  * @return A new initialized channel. NULL on error.
1252  */
1253 static struct CadetChannel *
1254 channel_new (struct CadetTunnel *t,
1255              struct CadetClient *owner,
1256              CADET_ChannelNumber lid_root)
1257 {
1258   struct CadetChannel *ch;
1259
1260   ch = GNUNET_new (struct CadetChannel);
1261   ch->root = owner;
1262   ch->lid_root = lid_root;
1263   ch->t = t;
1264
1265   GNUNET_STATISTICS_update (stats, "# channels", 1, GNUNET_NO);
1266
1267   if (NULL != owner)
1268   {
1269     ch->gid = GCT_get_next_chid (t);
1270     GML_channel_add (owner, lid_root, ch);
1271   }
1272   GCT_add_channel (t, ch);
1273
1274   return ch;
1275 }
1276
1277
1278 /**
1279  * Handle a loopback message: call the appropriate handler for the message type.
1280  *
1281  * @param ch Channel this message is on.
1282  * @param msgh Message header.
1283  * @param fwd Is this FWD traffic?
1284  */
1285 void
1286 handle_loopback (struct CadetChannel *ch,
1287                  const struct GNUNET_MessageHeader *msgh,
1288                  int fwd)
1289 {
1290   uint16_t type;
1291
1292   type = ntohs (msgh->type);
1293   LOG (GNUNET_ERROR_TYPE_DEBUG,
1294        "Loopback %s %s message!\n",
1295        GC_f2s (fwd), GC_m2s (type));
1296
1297   switch (type)
1298   {
1299     case GNUNET_MESSAGE_TYPE_CADET_DATA:
1300       /* Don't send hop ACK, wait for client to ACK */
1301       LOG (GNUNET_ERROR_TYPE_DEBUG, "SEND loopback %u (%u)\n",
1302            ntohl (((struct GNUNET_CADET_Data *) msgh)->mid), ntohs (msgh->size));
1303       GCCH_handle_data (ch, (struct GNUNET_CADET_Data *) msgh, fwd);
1304       break;
1305
1306     case GNUNET_MESSAGE_TYPE_CADET_DATA_ACK:
1307       GCCH_handle_data_ack (ch, (struct GNUNET_CADET_DataACK *) msgh, fwd);
1308       break;
1309
1310     case GNUNET_MESSAGE_TYPE_CADET_CHANNEL_CREATE:
1311       GCCH_handle_create (ch->t,
1312                           (struct GNUNET_CADET_ChannelCreate *) msgh);
1313       break;
1314
1315     case GNUNET_MESSAGE_TYPE_CADET_CHANNEL_ACK:
1316       GCCH_handle_ack (ch,
1317                        (struct GNUNET_CADET_ChannelManage *) msgh,
1318                        fwd);
1319       break;
1320
1321     case GNUNET_MESSAGE_TYPE_CADET_CHANNEL_NACK:
1322       GCCH_handle_nack (ch);
1323       break;
1324
1325     case GNUNET_MESSAGE_TYPE_CADET_CHANNEL_DESTROY:
1326       GCCH_handle_destroy (ch,
1327                            (struct GNUNET_CADET_ChannelManage *) msgh,
1328                            fwd);
1329       break;
1330
1331     default:
1332       GNUNET_break_op (0);
1333       LOG (GNUNET_ERROR_TYPE_DEBUG,
1334            "end-to-end message not known (%u)\n",
1335            ntohs (msgh->type));
1336   }
1337 }
1338
1339
1340
1341 /******************************************************************************/
1342 /********************************    API    ***********************************/
1343 /******************************************************************************/
1344
1345 /**
1346  * Destroy a channel and free all resources.
1347  *
1348  * @param ch Channel to destroy.
1349  */
1350 void
1351 GCCH_destroy (struct CadetChannel *ch)
1352 {
1353   struct CadetClient *c;
1354   struct CadetTunnel *t;
1355
1356   if (NULL == ch)
1357     return;
1358   if (2 == ch->destroy)
1359     return; /* recursive call */
1360   ch->destroy = 2;
1361
1362   LOG (GNUNET_ERROR_TYPE_DEBUG, "destroying channel %s:%u\n",
1363               GCT_2s (ch->t), ch->gid);
1364   GCCH_debug (ch);
1365
1366   c = ch->root;
1367   if (NULL != c)
1368   {
1369     GML_channel_remove (c, ch->lid_root, ch);
1370   }
1371
1372   c = ch->dest;
1373   if (NULL != c)
1374   {
1375     GML_channel_remove (c, ch->lid_dest, ch);
1376   }
1377
1378   channel_rel_free_all (ch->root_rel);
1379   channel_rel_free_all (ch->dest_rel);
1380
1381   t = ch->t;
1382   GCT_remove_channel (t, ch);
1383   GNUNET_STATISTICS_update (stats, "# channels", -1, GNUNET_NO);
1384
1385   GNUNET_free (ch);
1386   GCT_destroy_if_empty (t);
1387 }
1388
1389
1390 /**
1391  * Get the channel's public ID.
1392  *
1393  * @param ch Channel.
1394  *
1395  * @return ID used to identify the channel with the remote peer.
1396  */
1397 CADET_ChannelNumber
1398 GCCH_get_id (const struct CadetChannel *ch)
1399 {
1400   return ch->gid;
1401 }
1402
1403
1404 /**
1405  * Get the channel tunnel.
1406  *
1407  * @param ch Channel to get the tunnel from.
1408  *
1409  * @return tunnel of the channel.
1410  */
1411 struct CadetTunnel *
1412 GCCH_get_tunnel (const struct CadetChannel *ch)
1413 {
1414   return ch->t;
1415 }
1416
1417
1418 /**
1419  * Get free buffer space towards the client on a specific channel.
1420  *
1421  * @param ch Channel.
1422  * @param fwd Is query about FWD traffic?
1423  *
1424  * @return Free buffer space [0 - 64]
1425  */
1426 unsigned int
1427 GCCH_get_buffer (struct CadetChannel *ch, int fwd)
1428 {
1429   struct CadetChannelReliability *rel;
1430
1431   rel = fwd ? ch->dest_rel : ch->root_rel;
1432   LOG (GNUNET_ERROR_TYPE_DEBUG, "   get buffer, channel %s\n", GCCH_2s (ch));
1433   GCCH_debug (ch);
1434   /* If rel is NULL it means that the end is not yet created,
1435    * most probably is a loopback channel at the point of sending
1436    * the ChannelCreate to itself.
1437    */
1438   if (NULL == rel)
1439   {
1440     LOG (GNUNET_ERROR_TYPE_DEBUG, "  rel is NULL: max\n");
1441     return 64;
1442   }
1443
1444   LOG (GNUNET_ERROR_TYPE_DEBUG, "   n_recv %d\n", rel->n_recv);
1445   return (64 - rel->n_recv);
1446 }
1447
1448
1449 /**
1450  * Get flow control status of end point: is client allow to send?
1451  *
1452  * @param ch Channel.
1453  * @param fwd Is query about FWD traffic? (Request root status).
1454  *
1455  * @return #GNUNET_YES if client is allowed to send us data.
1456  */
1457 int
1458 GCCH_get_allowed (struct CadetChannel *ch, int fwd)
1459 {
1460   struct CadetChannelReliability *rel;
1461
1462   rel = fwd ? ch->root_rel : ch->dest_rel;
1463
1464   if (NULL == rel)
1465   {
1466     /* Probably shutting down: root/dest NULL'ed to mark disconnection */
1467     GNUNET_break (GNUNET_NO != ch->destroy);
1468     return 0;
1469   }
1470
1471   return rel->client_allowed;
1472 }
1473
1474
1475 /**
1476  * Is the root client for this channel on this peer?
1477  *
1478  * @param ch Channel.
1479  * @param fwd Is this for fwd traffic?
1480  *
1481  * @return #GNUNET_YES in case it is.
1482  */
1483 int
1484 GCCH_is_origin (struct CadetChannel *ch, int fwd)
1485 {
1486   struct CadetClient *c;
1487
1488   c = fwd ? ch->root : ch->dest;
1489   return NULL != c;
1490 }
1491
1492
1493 /**
1494  * Is the destination client for this channel on this peer?
1495  *
1496  * @param ch Channel.
1497  * @param fwd Is this for fwd traffic?
1498  *
1499  * @return #GNUNET_YES in case it is.
1500  */
1501 int
1502 GCCH_is_terminal (struct CadetChannel *ch, int fwd)
1503 {
1504   struct CadetClient *c;
1505
1506   c = fwd ? ch->dest : ch->root;
1507   return NULL != c;
1508 }
1509
1510
1511 /**
1512  * Send an end-to-end ACK message for the most recent in-sequence payload.
1513  *
1514  * If channel is not reliable, do nothing.
1515  *
1516  * @param ch Channel this is about.
1517  * @param fwd Is for FWD traffic? (ACK dest->owner)
1518  */
1519 void
1520 GCCH_send_data_ack (struct CadetChannel *ch, int fwd)
1521 {
1522   struct GNUNET_CADET_DataACK msg;
1523   struct CadetChannelReliability *rel;
1524   struct CadetReliableMessage *copy;
1525   unsigned int delta;
1526   uint64_t mask;
1527   uint32_t ack;
1528
1529   if (GNUNET_NO == ch->reliable)
1530     return;
1531
1532   rel = fwd ? ch->dest_rel : ch->root_rel;
1533   ack = rel->mid_recv - 1;
1534
1535   msg.header.type = htons (GNUNET_MESSAGE_TYPE_CADET_DATA_ACK);
1536   msg.header.size = htons (sizeof (msg));
1537   msg.chid = htonl (ch->gid);
1538   msg.mid = htonl (ack);
1539
1540   msg.futures = 0LL;
1541   for (copy = rel->head_recv; NULL != copy; copy = copy->next)
1542   {
1543     if (copy->type != GNUNET_MESSAGE_TYPE_CADET_DATA)
1544     {
1545       LOG (GNUNET_ERROR_TYPE_DEBUG, " Type %s, expected DATA\n",
1546            GC_m2s (copy->type));
1547       continue;
1548     }
1549     GNUNET_assert (GC_is_pid_bigger(copy->mid, ack));
1550     delta = copy->mid - (ack + 1);
1551     if (63 < delta)
1552       break;
1553     mask = 0x1LL << delta;
1554     msg.futures |= mask;
1555     LOG (GNUNET_ERROR_TYPE_DEBUG,
1556          " setting bit for %u (delta %u) (%llX) -> %llX\n",
1557          copy->mid, delta, mask, msg.futures);
1558   }
1559   LOG (GNUNET_ERROR_TYPE_INFO, "===> DATA_ACK for %u + %llX\n",
1560        ack, msg.futures);
1561
1562   GCCH_send_prebuilt_message (&msg.header, ch, !fwd, NULL);
1563   LOG (GNUNET_ERROR_TYPE_DEBUG, "send_data_ack END\n");
1564 }
1565
1566
1567 /**
1568  * Allow a client to send us more data, in case it was choked.
1569  *
1570  * @param ch Channel.
1571  * @param fwd Is this about FWD traffic? (Root client).
1572  */
1573 void
1574 GCCH_allow_client (struct CadetChannel *ch, int fwd)
1575 {
1576   struct CadetChannelReliability *rel;
1577   unsigned int buffer;
1578
1579   LOG (GNUNET_ERROR_TYPE_DEBUG, "GMCH allow\n");
1580
1581   if (CADET_CHANNEL_READY != ch->state)
1582   {
1583     LOG (GNUNET_ERROR_TYPE_DEBUG, " channel not ready yet!\n");
1584     return;
1585   }
1586
1587   if (GNUNET_YES == ch->reliable)
1588   {
1589     rel = fwd ? ch->root_rel : ch->dest_rel;
1590     if (NULL == rel)
1591     {
1592       GNUNET_break (GNUNET_NO != ch->destroy);
1593       return;
1594     }
1595     if (NULL != rel->head_sent)
1596     {
1597       if (64 <= rel->mid_send - rel->head_sent->mid)
1598       {
1599         LOG (GNUNET_ERROR_TYPE_DEBUG, " too big MID gap! Wait for ACK.\n");
1600         return;
1601       }
1602       else
1603       {
1604         LOG (GNUNET_ERROR_TYPE_DEBUG, " gap ok: %u - %u\n",
1605              rel->head_sent->mid, rel->mid_send);
1606         struct CadetReliableMessage *aux;
1607         for (aux = rel->head_sent; NULL != aux; aux = aux->next)
1608         {
1609           LOG (GNUNET_ERROR_TYPE_DEBUG, "   - sent mid %u\n", aux->mid);
1610         }
1611       }
1612     }
1613     else
1614     {
1615       LOG (GNUNET_ERROR_TYPE_DEBUG, " head sent is NULL\n");
1616     }
1617   }
1618
1619   if (is_loopback (ch))
1620     buffer = GCCH_get_buffer (ch, fwd);
1621   else
1622     buffer = GCT_get_connections_buffer (ch->t);
1623
1624   if (0 == buffer)
1625   {
1626     LOG (GNUNET_ERROR_TYPE_DEBUG, " no buffer space.\n");
1627     return;
1628   }
1629
1630   LOG (GNUNET_ERROR_TYPE_DEBUG, " buffer space %u, allowing\n", buffer);
1631   send_client_ack (ch, fwd);
1632 }
1633
1634
1635 /**
1636  * Log channel info.
1637  *
1638  * @param ch Channel.
1639  */
1640 void
1641 GCCH_debug (struct CadetChannel *ch)
1642 {
1643   if (NULL == ch)
1644   {
1645     LOG (GNUNET_ERROR_TYPE_DEBUG, "*** DEBUG NULL CHANNEL ***\n");
1646     return;
1647   }
1648   LOG (GNUNET_ERROR_TYPE_DEBUG, "Channel %s:%X (%p)\n",
1649               GCT_2s (ch->t), ch->gid, ch);
1650   LOG (GNUNET_ERROR_TYPE_DEBUG, "  root %p/%p\n",
1651               ch->root, ch->root_rel);
1652   if (NULL != ch->root)
1653   {
1654     LOG (GNUNET_ERROR_TYPE_DEBUG, "  cli %s\n", GML_2s (ch->root));
1655     LOG (GNUNET_ERROR_TYPE_DEBUG, "  ready %s\n",
1656                 ch->root_rel->client_ready ? "YES" : "NO");
1657     LOG (GNUNET_ERROR_TYPE_DEBUG, "  id %X\n", ch->lid_root);
1658     LOG (GNUNET_ERROR_TYPE_DEBUG, "  recv %d\n", ch->root_rel->n_recv);
1659     LOG (GNUNET_ERROR_TYPE_DEBUG, "  MID r: %d, s: %d\n",
1660          ch->root_rel->mid_recv, ch->root_rel->mid_send);
1661   }
1662   LOG (GNUNET_ERROR_TYPE_DEBUG, "  dest %p/%p\n",
1663               ch->dest, ch->dest_rel);
1664   if (NULL != ch->dest)
1665   {
1666     LOG (GNUNET_ERROR_TYPE_DEBUG, "  cli %s\n", GML_2s (ch->dest));
1667     LOG (GNUNET_ERROR_TYPE_DEBUG, "  ready %s\n",
1668                 ch->dest_rel->client_ready ? "YES" : "NO");
1669     LOG (GNUNET_ERROR_TYPE_DEBUG, "  id %X\n", ch->lid_dest);
1670     LOG (GNUNET_ERROR_TYPE_DEBUG, "  recv %d\n", ch->dest_rel->n_recv);
1671     LOG (GNUNET_ERROR_TYPE_DEBUG, "  MID r: %d, s: %d\n",
1672          ch->dest_rel->mid_recv, ch->dest_rel->mid_send);
1673
1674   }
1675 }
1676
1677
1678 /**
1679  * Handle an ACK given by a client.
1680  *
1681  * Mark client as ready and send him any buffered data we could have for him.
1682  *
1683  * @param ch Channel.
1684  * @param fwd Is this a "FWD ACK"? (FWD ACKs are sent by dest and go BCK)
1685  */
1686 void
1687 GCCH_handle_local_ack (struct CadetChannel *ch, int fwd)
1688 {
1689   struct CadetChannelReliability *rel;
1690   struct CadetClient *c;
1691
1692   rel = fwd ? ch->dest_rel : ch->root_rel;
1693   c   = fwd ? ch->dest     : ch->root;
1694
1695   rel->client_ready = GNUNET_YES;
1696   send_client_buffered_data (ch, c, fwd);
1697
1698   if (GNUNET_YES == ch->destroy && 0 == rel->n_recv)
1699   {
1700     send_destroy (ch, GNUNET_YES);
1701     GCCH_destroy (ch);
1702     return;
1703   }
1704   /* if loopback is marked for destruction, no need to ACK to the other peer,
1705    * it requested the destruction and is already gone, therefore, else if.
1706    */
1707   else if (is_loopback (ch))
1708   {
1709     unsigned int buffer;
1710
1711     buffer = GCCH_get_buffer (ch, fwd);
1712     if (0 < buffer)
1713       GCCH_allow_client (ch, fwd);
1714
1715     return;
1716   }
1717   GCT_send_connection_acks (ch->t);
1718 }
1719
1720
1721 /**
1722  * Handle data given by a client.
1723  *
1724  * Check whether the client is allowed to send in this tunnel, save if channel
1725  * is reliable and send an ACK to the client if there is still buffer space
1726  * in the tunnel.
1727  *
1728  * @param ch Channel.
1729  * @param c Client which sent the data.
1730  * @param fwd Is this a FWD data?
1731  * @param message Data message.
1732  * @param size Size of data.
1733  *
1734  * @return GNUNET_OK if everything goes well, GNUNET_SYSERR in case of en error.
1735  */
1736 int
1737 GCCH_handle_local_data (struct CadetChannel *ch,
1738                         struct CadetClient *c, int fwd,
1739                         const struct GNUNET_MessageHeader *message,
1740                         size_t size)
1741 {
1742   struct CadetChannelReliability *rel;
1743   struct GNUNET_CADET_Data *payload;
1744   uint16_t p2p_size = sizeof(struct GNUNET_CADET_Data) + size;
1745   unsigned char cbuf[p2p_size];
1746   unsigned char buffer;
1747
1748   /* Is the client in the channel? */
1749   if ( !( (fwd &&
1750            ch->root == c)
1751          ||
1752           (!fwd &&
1753            ch->dest == c) ) )
1754   {
1755     GNUNET_break_op (0);
1756     return GNUNET_SYSERR;
1757   }
1758
1759   rel = fwd ? ch->root_rel : ch->dest_rel;
1760
1761   if (GNUNET_NO == rel->client_allowed)
1762   {
1763     GNUNET_break_op (0);
1764     return GNUNET_SYSERR;
1765   }
1766
1767   rel->client_allowed = GNUNET_NO;
1768
1769   /* Ok, everything is correct, send the message. */
1770   payload = (struct GNUNET_CADET_Data *) cbuf;
1771   payload->mid = htonl (rel->mid_send);
1772   rel->mid_send++;
1773   memcpy (&payload[1], message, size);
1774   payload->header.size = htons (p2p_size);
1775   payload->header.type = htons (GNUNET_MESSAGE_TYPE_CADET_DATA);
1776   payload->chid = htonl (ch->gid);
1777   LOG (GNUNET_ERROR_TYPE_DEBUG, "  sending on channel...\n");
1778   GCCH_send_prebuilt_message (&payload->header, ch, fwd, NULL);
1779
1780   if (is_loopback (ch))
1781     buffer = GCCH_get_buffer (ch, fwd);
1782   else
1783     buffer = GCT_get_connections_buffer (ch->t);
1784
1785   if (0 < buffer)
1786     GCCH_allow_client (ch, fwd);
1787
1788   return GNUNET_OK;
1789 }
1790
1791
1792 /**
1793  * Handle a channel destroy requested by a client.
1794  *
1795  * TODO: add "reason" field
1796  *
1797  * Destroy the channel and the tunnel in case this was the last channel.
1798  *
1799  * @param ch Channel.
1800  * @param c Client that requested the destruction (to avoid notifying him).
1801  * @param is_root Is the request coming from root?
1802  */
1803 void
1804 GCCH_handle_local_destroy (struct CadetChannel *ch,
1805                            struct CadetClient *c,
1806                            int is_root)
1807 {
1808   ch->destroy = GNUNET_YES;
1809   /* Cleanup after the tunnel */
1810   if (GNUNET_NO == is_root && c == ch->dest)
1811   {
1812     LOG (GNUNET_ERROR_TYPE_DEBUG, " Client %s is destination.\n", GML_2s (c));
1813     GML_client_delete_channel (c, ch, ch->lid_dest);
1814     ch->dest = NULL;
1815   }
1816   if (GNUNET_YES == is_root && c == ch->root)
1817   {
1818     LOG (GNUNET_ERROR_TYPE_DEBUG, " Client %s is owner.\n", GML_2s (c));
1819     GML_client_delete_channel (c, ch, ch->lid_root);
1820     ch->root = NULL;
1821   }
1822
1823   send_destroy (ch, GNUNET_NO);
1824   if (0 == ch->pending_messages)
1825     GCCH_destroy (ch);
1826 }
1827
1828
1829 /**
1830  * Handle a channel create requested by a client.
1831  *
1832  * Create the channel and the tunnel in case this was the first0 channel.
1833  *
1834  * @param c Client that requested the creation (will be the root).
1835  * @param msg Create Channel message.
1836  *
1837  * @return GNUNET_OK if everything went fine, GNUNET_SYSERR otherwise.
1838  */
1839 int
1840 GCCH_handle_local_create (struct CadetClient *c,
1841                           struct GNUNET_CADET_ChannelMessage *msg)
1842 {
1843   struct CadetChannel *ch;
1844   struct CadetTunnel *t;
1845   struct CadetPeer *peer;
1846   CADET_ChannelNumber chid;
1847
1848   LOG (GNUNET_ERROR_TYPE_DEBUG, "  towards %s:%u\n",
1849               GNUNET_i2s (&msg->peer), ntohl (msg->port));
1850   chid = ntohl (msg->channel_id);
1851
1852   /* Sanity check for duplicate channel IDs */
1853   if (NULL != GML_channel_get (c, chid))
1854   {
1855     GNUNET_break (0);
1856     return GNUNET_SYSERR;
1857   }
1858
1859   peer = GCP_get (&msg->peer);
1860   GCP_add_tunnel (peer);
1861   t = GCP_get_tunnel (peer);
1862
1863   if (GCP_get_short_id (peer) == myid)
1864   {
1865     GCT_change_cstate (t, CADET_TUNNEL_READY);
1866   }
1867   else
1868   {
1869     /* FIXME change to a tunnel API, eliminate ch <-> peer connection */
1870     GCP_connect (peer);
1871   }
1872
1873   /* Create channel */
1874   ch = channel_new (t, c, chid);
1875   if (NULL == ch)
1876   {
1877     GNUNET_break (0);
1878     return GNUNET_SYSERR;
1879   }
1880   ch->port = ntohl (msg->port);
1881   channel_set_options (ch, ntohl (msg->opt));
1882
1883   /* In unreliable channels, we'll use the DLL to buffer BCK data */
1884   ch->root_rel = GNUNET_new (struct CadetChannelReliability);
1885   ch->root_rel->ch = ch;
1886   ch->root_rel->retry_timer = CADET_RETRANSMIT_TIME;
1887   ch->root_rel->expected_delay.rel_value_us = 0;
1888
1889   LOG (GNUNET_ERROR_TYPE_DEBUG, "CREATED CHANNEL %s\n", GCCH_2s (ch));
1890
1891   send_create (ch);
1892
1893   return GNUNET_OK;
1894 }
1895
1896
1897 /**
1898  * Handler for cadet network payload traffic.
1899  *
1900  * @param ch Channel for the message.
1901  * @param msg Unencryted data message.
1902  * @param fwd Is this message fwd? This only is meaningful in loopback channels.
1903  *            #GNUNET_YES if message is FWD on the respective channel (loopback)
1904  *            #GNUNET_NO if message is BCK on the respective channel (loopback)
1905  *            #GNUNET_SYSERR if message on a one-ended channel (remote)
1906  */
1907 void
1908 GCCH_handle_data (struct CadetChannel *ch,
1909                   const struct GNUNET_CADET_Data *msg,
1910                   int fwd)
1911 {
1912   struct CadetChannelReliability *rel;
1913   struct CadetClient *c;
1914   uint32_t mid;
1915
1916   /* If this is a remote (non-loopback) channel, find 'fwd'. */
1917   if (GNUNET_SYSERR == fwd)
1918   {
1919     if (is_loopback (ch))
1920     {
1921       /* It is a loopback channel after all... */
1922       GNUNET_break (0);
1923       return;
1924     }
1925     fwd = (NULL != ch->dest) ? GNUNET_YES : GNUNET_NO;
1926   }
1927
1928   /*  Initialize FWD/BCK data */
1929   c   = fwd ? ch->dest     : ch->root;
1930   rel = fwd ? ch->dest_rel : ch->root_rel;
1931
1932   if (NULL == c)
1933   {
1934     GNUNET_break (GNUNET_NO != ch->destroy);
1935     return;
1936   }
1937
1938   if (CADET_CHANNEL_READY != ch->state)
1939   {
1940     if (GNUNET_NO == fwd)
1941     {
1942       /* If we are the root, this means the other peer has sent traffic before
1943        * receiving our ACK. Even if the SYNACK goes missing, no traffic should
1944        * be sent before the ACK.
1945        */
1946       GNUNET_break_op (0);
1947       return;
1948     }
1949     /* If we are the dest, this means that the SYNACK got to the root but
1950      * the ACK went missing. Treat this as an ACK.
1951      */
1952     channel_confirm (ch, GNUNET_NO);
1953   }
1954
1955   GNUNET_STATISTICS_update (stats, "# data received", 1, GNUNET_NO);
1956
1957   mid = ntohl (msg->mid);
1958   LOG (GNUNET_ERROR_TYPE_INFO, "<=== DATA %u %s on channel %s\n",
1959        mid, GC_f2s (fwd), GCCH_2s (ch));
1960
1961   if (GNUNET_NO == ch->reliable ||
1962       ( !GC_is_pid_bigger (rel->mid_recv, mid) &&
1963         GC_is_pid_bigger (rel->mid_recv + 64, mid) ) )
1964   {
1965     LOG (GNUNET_ERROR_TYPE_DEBUG, "RECV MID %u (%u)\n",
1966          mid, ntohs (msg->header.size));
1967     if (GNUNET_YES == ch->reliable)
1968     {
1969       /* Is this the exact next expected messasge? */
1970       if (mid == rel->mid_recv)
1971       {
1972         LOG (GNUNET_ERROR_TYPE_DEBUG, "as expected, sending to client\n");
1973         send_client_data (ch, msg, fwd);
1974       }
1975       else
1976       {
1977         LOG (GNUNET_ERROR_TYPE_DEBUG, "save for later\n");
1978         add_buffered_data (msg, rel);
1979       }
1980     }
1981     else
1982     {
1983       /* Tunnel is unreliable: send to clients directly */
1984       /* FIXME: accept Out Of Order traffic */
1985       rel->mid_recv = mid + 1;
1986       send_client_data (ch, msg, fwd);
1987     }
1988   }
1989   else
1990   {
1991     if (GC_is_pid_bigger (rel->mid_recv, mid))
1992     {
1993       GNUNET_break_op (0);
1994       LOG (GNUNET_ERROR_TYPE_WARNING,
1995           "MID %u on channel %s not expected (window: %u - %u). Dropping!\n",
1996           mid, GCCH_2s (ch), rel->mid_recv, rel->mid_recv + 63);
1997     }
1998     else
1999     {
2000       LOG (GNUNET_ERROR_TYPE_WARNING,
2001            "Duplicate MID %u, channel %s (expecting MID %u). Re-sending ACK!\n",
2002            mid, GCCH_2s (ch), rel->mid_recv);
2003       if (NULL != rel->uniq)
2004       {
2005         LOG (GNUNET_ERROR_TYPE_WARNING,
2006             "We are trying to send an ACK, but don't seem have the "
2007             "bandwidth. Try to increase your ats QUOTA in you config file\n");
2008       }
2009
2010     }
2011   }
2012
2013   GCCH_send_data_ack (ch, fwd);
2014 }
2015
2016
2017 /**
2018  * Handler for cadet network traffic end-to-end ACKs.
2019  *
2020  * @param ch Channel on which we got this message.
2021  * @param msg Data message.
2022  * @param fwd Is this message fwd? This only is meaningful in loopback channels.
2023  *            #GNUNET_YES if message is FWD on the respective channel (loopback)
2024  *            #GNUNET_NO if message is BCK on the respective channel (loopback)
2025  *            #GNUNET_SYSERR if message on a one-ended channel (remote)
2026  */
2027 void
2028 GCCH_handle_data_ack (struct CadetChannel *ch,
2029                       const struct GNUNET_CADET_DataACK *msg,
2030                       int fwd)
2031 {
2032   struct CadetChannelReliability *rel;
2033   struct CadetReliableMessage *copy;
2034   struct CadetReliableMessage *next;
2035   uint32_t ack;
2036   int work;
2037
2038   /* If this is a remote (non-loopback) channel, find 'fwd'. */
2039   if (GNUNET_SYSERR == fwd)
2040   {
2041     if (is_loopback (ch))
2042     {
2043       /* It is a loopback channel after all... */
2044       GNUNET_break (0);
2045       return;
2046     }
2047     /* Inverted: if message came 'FWD' is a 'BCK ACK'. */
2048     fwd = (NULL != ch->dest) ? GNUNET_NO : GNUNET_YES;
2049   }
2050
2051   ack = ntohl (msg->mid);
2052   LOG (GNUNET_ERROR_TYPE_INFO, "<=== %s ACK %u + %llX\n",
2053        GC_f2s (fwd), ack, msg->futures);
2054
2055   if (GNUNET_YES == fwd)
2056   {
2057     rel = ch->root_rel;
2058   }
2059   else
2060   {
2061     rel = ch->dest_rel;
2062   }
2063   if (NULL == rel)
2064   {
2065     GNUNET_break_op (GNUNET_NO != ch->destroy);
2066     return;
2067   }
2068
2069   /* Free ACK'd copies: no need to retransmit those anymore FIXME refactor */
2070   for (work = GNUNET_NO, copy = rel->head_sent; copy != NULL; copy = next)
2071   {
2072     if (GC_is_pid_bigger (copy->mid, ack))
2073     {
2074       LOG (GNUNET_ERROR_TYPE_DEBUG, "  head %u, out!\n", copy->mid);
2075       channel_rel_free_sent (rel, msg);
2076       break;
2077     }
2078     work = GNUNET_YES;
2079     LOG (GNUNET_ERROR_TYPE_DEBUG, "  id %u\n", copy->mid);
2080     next = copy->next;
2081     if (GNUNET_YES == rel_message_free (copy, GNUNET_YES))
2082       return;
2083   }
2084
2085   /* ACK client if needed and possible */
2086   GCCH_allow_client (ch, fwd);
2087
2088   /* If some message was free'd, update the retransmission delay */
2089   if (GNUNET_YES == work)
2090   {
2091     if (NULL != rel->retry_task)
2092     {
2093       GNUNET_SCHEDULER_cancel (rel->retry_task);
2094       rel->retry_task = NULL;
2095       if (NULL != rel->head_sent && NULL == rel->head_sent->chq)
2096       {
2097         struct GNUNET_TIME_Absolute new_target;
2098         struct GNUNET_TIME_Relative delay;
2099
2100         delay = GNUNET_TIME_relative_multiply (rel->retry_timer,
2101                                                CADET_RETRANSMIT_MARGIN);
2102         new_target = GNUNET_TIME_absolute_add (rel->head_sent->timestamp,
2103                                                delay);
2104         delay = GNUNET_TIME_absolute_get_remaining (new_target);
2105         rel->retry_task =
2106             GNUNET_SCHEDULER_add_delayed (delay,
2107                                           &channel_retransmit_message,
2108                                           rel);
2109       }
2110     }
2111     else
2112     {
2113       /* Work was done but no task was pending? Shouldn't happen! */
2114       GNUNET_break (0);
2115     }
2116   }
2117 }
2118
2119
2120 /**
2121  * Handler for channel create messages.
2122  *
2123  * Does not have fwd parameter because it's always 'FWD': channel is incoming.
2124  *
2125  * @param t Tunnel this channel will be in.
2126  * @param msg Channel crate message.
2127  */
2128 struct CadetChannel *
2129 GCCH_handle_create (struct CadetTunnel *t,
2130                     const struct GNUNET_CADET_ChannelCreate *msg)
2131 {
2132   CADET_ChannelNumber chid;
2133   struct CadetChannel *ch;
2134   struct CadetClient *c;
2135   int new_channel;
2136
2137   chid = ntohl (msg->chid);
2138   ch = GCT_get_channel (t, chid);
2139   if (NULL == ch)
2140   {
2141     /* Create channel */
2142     ch = channel_new (t, NULL, 0);
2143     ch->gid = chid;
2144     channel_set_options (ch, ntohl (msg->opt));
2145     new_channel = GNUNET_YES;
2146   }
2147   else
2148   {
2149     new_channel = GNUNET_NO;
2150   }
2151
2152   if (GNUNET_YES == new_channel || GCT_is_loopback (t))
2153   {
2154     /* Find a destination client */
2155     ch->port = ntohl (msg->port);
2156     LOG (GNUNET_ERROR_TYPE_DEBUG, "   port %u\n", ch->port);
2157     c = GML_client_get_by_port (ch->port);
2158     if (NULL == c)
2159     {
2160       LOG (GNUNET_ERROR_TYPE_DEBUG, "  no client has port registered\n");
2161       if (is_loopback (ch))
2162       {
2163         LOG (GNUNET_ERROR_TYPE_DEBUG, "  loopback: destroy on handler\n");
2164         send_nack (ch);
2165       }
2166       else
2167       {
2168         LOG (GNUNET_ERROR_TYPE_DEBUG, "  not loopback: destroy now\n");
2169         send_nack (ch);
2170         GCCH_destroy (ch);
2171       }
2172       return NULL;
2173     }
2174     else
2175     {
2176       LOG (GNUNET_ERROR_TYPE_DEBUG, "  client %p has port registered\n", c);
2177     }
2178
2179     add_destination (ch, c);
2180     if (GNUNET_YES == ch->reliable)
2181       LOG (GNUNET_ERROR_TYPE_DEBUG, "Reliable\n");
2182     else
2183       LOG (GNUNET_ERROR_TYPE_DEBUG, "Not Reliable\n");
2184
2185     send_client_create (ch);
2186     ch->state =  CADET_CHANNEL_SENT;
2187   }
2188   else
2189   {
2190     LOG (GNUNET_ERROR_TYPE_DEBUG, "  duplicate create channel\n");
2191     if (NULL != ch->dest_rel->retry_task)
2192     {
2193       LOG (GNUNET_ERROR_TYPE_DEBUG, "  clearing retry task\n");
2194       /* we were waiting to re-send our 'SYNACK', wait no more! */
2195       GNUNET_SCHEDULER_cancel (ch->dest_rel->retry_task);
2196       ch->dest_rel->retry_task = NULL;
2197     }
2198     else if (NULL != ch->dest_rel->uniq)
2199     {
2200       /* we are waiting to for our 'SYNACK' to leave the queue, all done! */
2201       return ch;
2202     }
2203   }
2204   send_ack (ch, GNUNET_YES);
2205
2206   return ch;
2207 }
2208
2209
2210 /**
2211  * Handler for channel NACK messages.
2212  *
2213  * NACK messages always go dest -> root, no need for 'fwd' or 'msg' parameter.
2214  *
2215  * @param ch Channel.
2216  */
2217 void
2218 GCCH_handle_nack (struct CadetChannel *ch)
2219 {
2220   send_client_nack (ch);
2221   GCCH_destroy (ch);
2222 }
2223
2224
2225 /**
2226  * Handler for channel ack messages.
2227  *
2228  * @param ch Channel.
2229  * @param msg Message.
2230  * @param fwd Is this message fwd? This only is meaningful in loopback channels.
2231  *            #GNUNET_YES if message is FWD on the respective channel (loopback)
2232  *            #GNUNET_NO if message is BCK on the respective channel (loopback)
2233  *            #GNUNET_SYSERR if message on a one-ended channel (remote)
2234  */
2235 void
2236 GCCH_handle_ack (struct CadetChannel *ch,
2237                  const struct GNUNET_CADET_ChannelManage *msg,
2238                  int fwd)
2239 {
2240   /* If this is a remote (non-loopback) channel, find 'fwd'. */
2241   if (GNUNET_SYSERR == fwd)
2242   {
2243     if (is_loopback (ch))
2244     {
2245       /* It is a loopback channel after all... */
2246       GNUNET_break (0);
2247       return;
2248     }
2249     fwd = (NULL != ch->dest) ? GNUNET_YES : GNUNET_NO;
2250   }
2251
2252   channel_confirm (ch, !fwd);
2253 }
2254
2255
2256 /**
2257  * Handler for channel destroy messages.
2258  *
2259  * @param ch Channel to be destroyed of.
2260  * @param msg Message.
2261  * @param fwd Is this message fwd? This only is meaningful in loopback channels.
2262  *            #GNUNET_YES if message is FWD on the respective channel (loopback)
2263  *            #GNUNET_NO if message is BCK on the respective channel (loopback)
2264  *            #GNUNET_SYSERR if message on a one-ended channel (remote)
2265  */
2266 void
2267 GCCH_handle_destroy (struct CadetChannel *ch,
2268                      const struct GNUNET_CADET_ChannelManage *msg,
2269                      int fwd)
2270 {
2271   struct CadetChannelReliability *rel;
2272
2273   /* If this is a remote (non-loopback) channel, find 'fwd'. */
2274   if (GNUNET_SYSERR == fwd)
2275   {
2276     if (is_loopback (ch))
2277     {
2278       /* It is a loopback channel after all... */
2279       GNUNET_break (0);
2280       return;
2281     }
2282     fwd = (NULL != ch->dest) ? GNUNET_YES : GNUNET_NO;
2283   }
2284
2285   GCCH_debug (ch);
2286   if ( (fwd && NULL == ch->dest) || (!fwd && NULL == ch->root) )
2287   {
2288     /* Not for us (don't destroy twice a half-open loopback channel) */
2289     return;
2290   }
2291
2292   rel = fwd ? ch->dest_rel : ch->root_rel;
2293   if (0 == rel->n_recv)
2294   {
2295     send_destroy (ch, GNUNET_YES);
2296     GCCH_destroy (ch);
2297   }
2298   else
2299   {
2300     ch->destroy = GNUNET_YES;
2301   }
2302 }
2303
2304
2305 /**
2306  * Sends an already built message on a channel.
2307  *
2308  * If the channel is on a loopback tunnel, notifies the appropriate destination
2309  * client locally.
2310  *
2311  * On a normal channel passes the message to the tunnel for encryption and
2312  * sending on a connection.
2313  *
2314  * This function DOES NOT save the message for retransmission.
2315  *
2316  * @param message Message to send. Function makes a copy of it.
2317  * @param ch Channel on which this message is transmitted.
2318  * @param fwd Is this a fwd message?
2319  * @param existing_copy This is a retransmission, don't save a copy.
2320  */
2321 void
2322 GCCH_send_prebuilt_message (const struct GNUNET_MessageHeader *message,
2323                             struct CadetChannel *ch, int fwd,
2324                             void *existing_copy)
2325 {
2326   struct CadetChannelQueue *chq;
2327   uint16_t type;
2328
2329   type = ntohs (message->type);
2330   LOG (GNUNET_ERROR_TYPE_INFO, "===> %s %s on channel %s\n",
2331        GC_m2s (type), GC_f2s (fwd), GCCH_2s (ch));
2332
2333   if (GCT_is_loopback (ch->t))
2334   {
2335     handle_loopback (ch, message, fwd);
2336     return;
2337   }
2338
2339   switch (type)
2340   {
2341     struct GNUNET_CADET_Data *payload;
2342     case GNUNET_MESSAGE_TYPE_CADET_DATA:
2343
2344       payload = (struct GNUNET_CADET_Data *) message;
2345       LOG (GNUNET_ERROR_TYPE_INFO, "===> %s %u\n",
2346            GC_m2s (type), ntohl (payload->mid));
2347       if (GNUNET_YES == ch->reliable)
2348       {
2349         chq = GNUNET_new (struct CadetChannelQueue);
2350         chq->type = type;
2351         if (NULL == existing_copy)
2352           chq->copy = channel_save_copy (ch, message, fwd);
2353         else
2354         {
2355           chq->copy = (struct CadetReliableMessage *) existing_copy;
2356           if (NULL != chq->copy->chq)
2357           {
2358             /* Last retransmission was queued but not yet sent!
2359              * This retransmission was scheduled by a ch_message_sent which
2360              * followed a very fast RTT, so the tiny delay made the
2361              * retransmission function to execute before the previous
2362              * retransmitted message even had a chance to leave the peer.
2363              * Cancel this message and wait until the pending
2364              * retransmission leaves the peer and ch_message_sent starts
2365              * the timer for the next one.
2366              */
2367             GNUNET_free (chq);
2368             LOG (GNUNET_ERROR_TYPE_DEBUG,
2369                  "  exisitng copy not yet transmitted!\n");
2370             return;
2371           }
2372           LOG (GNUNET_ERROR_TYPE_DEBUG,
2373                "  using existing copy: %p {r:%p q:%p t:%u}\n",
2374                existing_copy,
2375                chq->copy->rel, chq->copy->chq, chq->copy->type);
2376         }
2377         LOG (GNUNET_ERROR_TYPE_DEBUG, "  new chq: %p\n", chq);
2378         chq->copy->chq = chq;
2379         chq->tq = GCT_send_prebuilt_message (message, ch->t, NULL,
2380                                              NULL != existing_copy,
2381                                              &ch_message_sent, chq);
2382         /* q itself is stored in copy */
2383         GNUNET_assert (NULL != chq->tq || GNUNET_NO != ch->destroy);
2384       }
2385       else
2386       {
2387         fire_and_forget (message, ch, GNUNET_NO);
2388       }
2389       break;
2390
2391
2392     case GNUNET_MESSAGE_TYPE_CADET_DATA_ACK:
2393     case GNUNET_MESSAGE_TYPE_CADET_CHANNEL_CREATE:
2394     case GNUNET_MESSAGE_TYPE_CADET_CHANNEL_ACK:
2395       chq = GNUNET_new (struct CadetChannelQueue);
2396       chq->type = type;
2397       chq->rel = fwd ? ch->root_rel : ch->dest_rel;
2398       if (NULL != chq->rel->uniq)
2399       {
2400         if (NULL != chq->rel->uniq->tq)
2401         {
2402           GCT_cancel (chq->rel->uniq->tq);
2403           /* ch_message_sent is called, freeing and NULLing uniq */
2404           GNUNET_break (NULL == chq->rel->uniq);
2405         }
2406         else
2407         {
2408           GNUNET_break (0);
2409           GNUNET_free (chq->rel->uniq);
2410         }
2411       }
2412
2413       chq->tq = GCT_send_prebuilt_message (message, ch->t, NULL, GNUNET_YES,
2414                                            &ch_message_sent, chq);
2415       if (NULL == chq->tq)
2416       {
2417         GNUNET_break (0);
2418         GCT_debug (ch->t, GNUNET_ERROR_TYPE_ERROR);
2419         GNUNET_free (chq);
2420         chq = NULL;
2421         return;
2422       }
2423       chq->rel->uniq = chq;
2424       break;
2425
2426
2427     case GNUNET_MESSAGE_TYPE_CADET_CHANNEL_DESTROY:
2428     case GNUNET_MESSAGE_TYPE_CADET_CHANNEL_NACK:
2429       fire_and_forget (message, ch, GNUNET_YES);
2430       break;
2431
2432
2433     default:
2434       GNUNET_break (0);
2435       LOG (GNUNET_ERROR_TYPE_DEBUG, "type %s unknown!\n", GC_m2s (type));
2436       fire_and_forget (message, ch, GNUNET_YES);
2437   }
2438 }
2439
2440
2441 /**
2442  * Get the static string for identification of the channel.
2443  *
2444  * @param ch Channel.
2445  *
2446  * @return Static string with the channel IDs.
2447  */
2448 const char *
2449 GCCH_2s (const struct CadetChannel *ch)
2450 {
2451   static char buf[64];
2452
2453   if (NULL == ch)
2454     return "(NULL Channel)";
2455
2456   SPRINTF (buf, "%s:%u gid:%X (%X / %X)",
2457            GCT_2s (ch->t), ch->port, ch->gid, ch->lid_root, ch->lid_dest);
2458
2459   return buf;
2460 }