GNUnet 0.22.2
gnunet-service-cadet.c
Go to the documentation of this file.
1/*
2 This file is part of GNUnet.
3 Copyright (C) 2001-2013, 2017 GNUnet e.V.
4
5 GNUnet is free software: you can redistribute it and/or modify it
6 under the terms of the GNU Affero General Public License as published
7 by the Free Software Foundation, either version 3 of the License,
8 or (at your 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 Affero General Public License for more details.
14
15 You should have received a copy of the GNU Affero General Public License
16 along with this program. If not, see <http://www.gnu.org/licenses/>.
17
18 SPDX-License-Identifier: AGPL3.0-or-later
19 */
20
35#include "cadet.h"
36
37#include "gnunet_util_lib.h"
48#include "gnunet_constants.h"
49
50
51#define LOG(level, ...) GNUNET_log (level, __VA_ARGS__)
52
53
58{
63
68
74
79
84
90
96
100 unsigned int id;
101};
102
103
104/******************************************************************************/
105/*********************** GLOBAL VARIABLES ****************************/
106/******************************************************************************/
107
108/****************************** Global variables ******************************/
109
114
119
124
129
134
139
144
149
153static unsigned int next_client_id;
154
160
167
172
178
182unsigned long long ratchet_messages;
183
188
193
197unsigned long long drop_percent;
198
199
206void
208 struct GNUNET_MQ_Envelope *env)
209{
210 GNUNET_MQ_send (c->mq,
211 env);
212}
213
214
221const char *
223{
224 static char buf[32];
225
226 GNUNET_snprintf (buf,
227 sizeof(buf),
228 "Client(%u)",
229 c->id);
230 return buf;
231}
232
233
241static struct CadetChannel *
244{
246 ntohl (ccn.channel_of_client));
247}
248
249
258{
259 struct GNUNET_CADET_ClientChannelNumber ccn = c->next_ccn;
260
261 /* increment until we have a free one... */
262 while (NULL !=
264 ccn))
265 {
267 = htonl (1 + (ntohl (ccn.channel_of_client)));
268 if (ntohl (ccn.channel_of_client) >=
270 ccn.channel_of_client = htonl (0);
271 }
272 c->next_ccn.channel_of_client
273 = htonl (1 + (ntohl (ccn.channel_of_client)));
274 return ccn;
275}
276
277
292 struct CadetChannel *ch,
293 struct CadetPeer *dest,
294 const struct GNUNET_HashCode *port,
295 uint32_t options)
296{
297 struct GNUNET_MQ_Envelope *env;
300
301 ccn = client_get_next_ccn (c);
304 ntohl (
306 ch,
309 "Accepting incoming %s from %s on open port %s (%u), assigning ccn %X\n",
310 GCCH_2s (ch),
311 GCP_2s (dest),
313 (uint32_t) ntohl (options),
314 (uint32_t) ntohl (ccn.channel_of_client));
315 /* notify local client about incoming connection! */
316 env = GNUNET_MQ_msg (cm,
318 cm->ccn = ccn;
319 cm->port = *port;
320 cm->opt = htonl (options);
321 cm->peer = *GCP_get_id (dest);
323 env);
324 return ccn;
325}
326
327
337static int
339 const struct GNUNET_PeerIdentity *pid,
340 void *value)
341{
342 struct CadetPeer *cp = value;
343 struct CadetTunnel *t = GCP_get_tunnel (cp,
344 GNUNET_NO);
345
346 if (NULL != t)
348 return GNUNET_OK;
349}
350
351
361static int
363 const struct GNUNET_PeerIdentity *pid,
364 void *value)
365{
366 struct CadetPeer *cp = value;
367
369 return GNUNET_OK;
370}
371
372
376static void
378{
379 if (NULL != stats)
380 {
382 GNUNET_NO);
383 stats = NULL;
384 }
385 /* Destroy tunnels. Note that all channels must be destroyed first! */
387 NULL);
388 /* All tunnels, channels, connections and CORE must be down before this point. */
390 NULL);
391 /* All paths, tunnels, channels, connections and CORE must be down before this point. */
393 if (NULL != open_ports)
394 {
396 open_ports = NULL;
397 }
398 if (NULL != loose_channels)
399 {
401 loose_channels = NULL;
402 }
403 if (NULL != peers)
404 {
406 peers = NULL;
407 }
408 if (NULL != connections)
409 {
411 connections = NULL;
412 }
413 if (NULL != transport)
414 {
416 transport = NULL;
417 }
418 GCD_shutdown ();
419 GCH_shutdown ();
421 my_private_key = NULL;
422}
423
424
430static void
431shutdown_task (void *cls)
432{
434 "Shutting down\n");
436 GCO_shutdown ();
437 if (NULL == clients_head)
438 shutdown_rest ();
439}
440
441
451static int
453 const struct GNUNET_HashCode *port,
454 void *value)
455{
456 struct OpenPort *op = cls;
457 struct CadetChannel *ch = value;
458
459 GCCH_bind (ch,
460 op->c,
461 &op->port);
464 &op->h_port,
465 ch));
466 return GNUNET_YES;
467}
468
469
479static void
481 const struct GNUNET_CADET_PortMessage *pmsg)
482{
483 struct CadetClient *c = cls;
484 struct OpenPort *op;
485
487 "Open port %s requested by %s\n",
488 GNUNET_h2s (&pmsg->port),
489 GSC_2s (c));
490 if (NULL == c->ports)
492 GNUNET_NO);
493 op = GNUNET_new (struct OpenPort);
494 op->c = c;
495 op->port = pmsg->port;
496 GCCH_hash_port (&op->h_port,
497 &pmsg->port,
498 &my_full_id);
499 if (GNUNET_OK !=
501 &op->port,
502 op,
504 {
505 GNUNET_break (0);
507 return;
508 }
510 &op->h_port,
511 op,
514 &op->h_port,
516 op);
518}
519
520
530static void
532 const struct GNUNET_CADET_PortMessage *pmsg)
533{
534 struct CadetClient *c = cls;
535 struct OpenPort *op;
536
538 "Closing port %s as requested by %s\n",
539 GNUNET_h2s (&pmsg->port),
540 GSC_2s (c));
541 if (NULL == c->ports)
542 {
543 /* Client closed a port despite _never_ having opened one? */
544 GNUNET_break (0);
546 return;
547 }
549 &pmsg->port);
550 if (NULL == op)
551 {
552 GNUNET_break (0);
554 return;
555 }
558 &op->port,
559 op));
562 &op->h_port,
563 op));
564 GNUNET_free (op);
566}
567
568
575static void
578{
579 struct CadetClient *c = cls;
580 struct CadetChannel *ch;
581
583 {
584 /* Channel ID not in allowed range. */
585 LOG (GNUNET_ERROR_TYPE_DEBUG,"Channel ID not in allowed range.");
586 GNUNET_break (0);
588 return;
589 }
590 ch = lookup_channel (c,
591 tcm->ccn);
592 if (NULL != ch)
593 {
594 /* Channel ID already in use. Not allowed. */
595 LOG (GNUNET_ERROR_TYPE_DEBUG,"Channel ID already in use. Not allowed.");
596 GNUNET_break (0);
598 return;
599 }
601 "New channel to %s at port %s requested by %s\n",
602 GNUNET_i2s (&tcm->peer),
603 GNUNET_h2s (&tcm->port),
604 GSC_2s (c));
605
606 /* Create channel */
608 tcm->ccn,
609 GCP_get (&tcm->peer,
610 GNUNET_YES),
611 &tcm->port,
612 ntohl (tcm->opt));
613 if (NULL == ch)
614 {
615 GNUNET_break (0);
617 return;
618 }
621 ntohl (
622 tcm->ccn.
623 channel_of_client),
624 ch,
626
628}
629
630
637static void
639 const struct
641{
642 struct CadetClient *c = cls;
643 struct CadetChannel *ch;
644
645 ch = lookup_channel (c,
646 msg->ccn);
647 if (NULL == ch)
648 {
649 /* Client attempted to destroy unknown channel.
650 Can happen if the other side went down at the same time.*/
652 "%s tried to destroy unknown channel %X\n",
653 GSC_2s (c),
654 (uint32_t) ntohl (msg->ccn.channel_of_client));
656 return;
657 }
659 "%s is destroying %s\n",
660 GSC_2s (c),
661 GCCH_2s (ch));
664 ntohl (
665 msg->ccn.
666 channel_of_client),
667 ch));
669 c,
670 msg->ccn);
672}
673
674
682static int
684 const struct GNUNET_CADET_LocalData *msg)
685{
686 size_t payload_size;
687 size_t payload_claimed_size;
688 const char *buf;
689 struct GNUNET_MessageHeader pa;
690
691 /* FIXME: what is the format we shall allow for @a msg?
692 ONE payload item or multiple? Seems current cadet_api
693 at least in theory allows more than one. Next-gen
694 cadet_api will likely no more, so we could then
695 simplify this mess again. *//* Sanity check for message size */payload_size = ntohs (msg->header.size) - sizeof(*msg);
696 buf = (const char *) &msg[1];
697 while (payload_size >= sizeof(struct GNUNET_MessageHeader))
698 {
699 /* need to memcpy() for alignment */
700 GNUNET_memcpy (&pa,
701 buf,
702 sizeof(pa));
703 payload_claimed_size = ntohs (pa.size);
704 if ((payload_size < payload_claimed_size) ||
705 (payload_claimed_size < sizeof(struct GNUNET_MessageHeader)) ||
706 (GNUNET_CONSTANTS_MAX_CADET_MESSAGE_SIZE < payload_claimed_size))
707 {
708 GNUNET_break (0);
710 "Local data of %u total size had sub-message %u at %u with %u bytes\n",
711 ntohs (msg->header.size),
712 ntohs (pa.type),
713 (unsigned int) (buf - (const char *) &msg[1]),
714 (unsigned int) payload_claimed_size);
715 return GNUNET_SYSERR;
716 }
717 payload_size -= payload_claimed_size;
718 buf += payload_claimed_size;
719 }
720 if (0 != payload_size)
721 {
722 GNUNET_break_op (0);
723 return GNUNET_SYSERR;
724 }
725 return GNUNET_OK;
726}
727
728
736static void
738 const struct GNUNET_CADET_LocalData *msg)
739{
740 struct CadetClient *c = cls;
741 struct CadetChannel *ch;
742 size_t payload_size;
743 const char *buf;
744
745 ch = lookup_channel (c,
746 msg->ccn);
747 if (NULL == ch)
748 {
749 /* Channel does not exist (anymore) */
751 "Dropping payload for channel %u from client (channel unknown, other endpoint may have disconnected)\n",
752 (unsigned int) ntohl (msg->ccn.channel_of_client));
754 return;
755 }
756 payload_size = ntohs (msg->header.size) - sizeof(*msg);
758 "# payload received from clients",
759 payload_size,
760 GNUNET_NO);
761 buf = (const char *) &msg[1];
763 "Received %u bytes payload from %s for %s\n",
764 (unsigned int) payload_size,
765 GSC_2s (c),
766 GCCH_2s (ch));
767 if (GNUNET_OK !=
769 msg->ccn,
770 buf,
771 payload_size))
772 {
773 GNUNET_break (0);
775 return;
776 }
778}
779
780
787static void
789 const struct GNUNET_CADET_LocalAck *msg)
790{
791 struct CadetClient *c = cls;
792 struct CadetChannel *ch;
793
794 ch = lookup_channel (c,
795 msg->ccn);
796 if (NULL == ch)
797 {
798 /* Channel does not exist (anymore) */
800 "Ignoring local ACK for channel %u from client (channel unknown, other endpoint may have disconnected)\n",
801 (unsigned int) ntohl (msg->ccn.channel_of_client));
803 return;
804 }
806 "Got a local ACK from %s for %s\n",
807 GSC_2s (c),
808 GCCH_2s (ch));
810 msg->ccn);
812}
813
814
823static int
825 const struct GNUNET_PeerIdentity *peer,
826 void *value)
827{
828 struct CadetClient *c = cls;
829 struct CadetPeer *p = value;
830 struct GNUNET_MQ_Envelope *env;
832
835 msg->destination = *peer;
836 msg->paths = htons (GCP_count_paths (p));
837 msg->tunnel = htons (NULL != GCP_get_tunnel (p,
838 GNUNET_NO));
839 msg->best_path_length = htonl (0); // FIXME: get length of shortest known path!
840 GNUNET_MQ_send (c->mq,
841 env);
842 return GNUNET_YES;
843}
844
845
852static void
854 const struct GNUNET_MessageHeader *message)
855{
856 struct CadetClient *c = cls;
857 struct GNUNET_MQ_Envelope *env;
858 struct GNUNET_MessageHeader *reply;
859
861 c);
862 env = GNUNET_MQ_msg (reply,
864 GNUNET_MQ_send (c->mq,
865 env);
867}
868
869
880static int
882 struct CadetPeerPath *path,
883 unsigned int off)
884{
885 struct GNUNET_MQ_Handle *mq = cls;
886 struct GNUNET_MQ_Envelope *env;
887 struct GNUNET_CADET_LocalInfoPath *resp;
888 struct GNUNET_PeerIdentity *id;
889 size_t path_size;
890 unsigned int path_length;
891
892 path_length = GCPP_get_length (path);
893 path_size = sizeof(struct GNUNET_PeerIdentity) * path_length;
894 if (sizeof(*resp) + path_size > UINT16_MAX)
895 {
896 /* try just giving the relevant path */
897 path_length = GNUNET_MIN ((UINT16_MAX - sizeof(*resp)) / sizeof(struct
899 off);
900 path_size = sizeof(struct GNUNET_PeerIdentity) * path_length;
901 }
902 if (sizeof(*resp) + path_size > UINT16_MAX)
903 {
905 "Path of %u entries is too long for info message\n",
906 path_length);
907 return GNUNET_YES;
908 }
909 env = GNUNET_MQ_msg_extra (resp,
910 path_size,
912 id = (struct GNUNET_PeerIdentity *) &resp[1];
913
914 /* Don't copy first peer. First peer is always the local one. Last
915 * peer is always the destination (leave as 0, EOL).
916 */
917 for (unsigned int i = 0; i < path_length; i++)
918 id[i] = *GCP_get_id (GCPP_get_peer_at_offset (path,
919 i));
920 resp->off = htonl (off);
922 env);
923 return GNUNET_YES;
924}
925
926
933static void
936{
937 struct CadetClient *c = cls;
938 struct CadetPeer *p;
939 struct GNUNET_MQ_Envelope *env;
940 struct GNUNET_MessageHeader *resp;
941
942 p = GCP_get (&msg->peer,
943 GNUNET_NO);
944 if (NULL != p)
947 c->mq);
948 env = GNUNET_MQ_msg (resp,
950 GNUNET_MQ_send (c->mq,
951 env);
953}
954
955
964static int
966 const struct GNUNET_PeerIdentity *peer,
967 void *value)
968{
969 struct CadetClient *c = cls;
970 struct CadetPeer *p = value;
971 struct GNUNET_MQ_Envelope *env;
973 struct CadetTunnel *t;
974
975 t = GCP_get_tunnel (p,
976 GNUNET_NO);
977 if (NULL == t)
978 return GNUNET_YES;
981 msg->destination = *peer;
982 msg->channels = htonl (GCT_count_channels (t));
983 msg->connections = htonl (GCT_count_any_connections (t));
984 msg->cstate = htons (0);
985 msg->estate = htons (GCT_get_estate (t));
986 GNUNET_MQ_send (c->mq,
987 env);
988 return GNUNET_YES;
989}
990
991
998static void
1000 const struct GNUNET_MessageHeader *message)
1001{
1002 struct CadetClient *c = cls;
1003 struct GNUNET_MQ_Envelope *env;
1004 struct GNUNET_MessageHeader *reply;
1005
1007 c);
1008 env = GNUNET_MQ_msg (reply,
1010 GNUNET_MQ_send (c->mq,
1011 env);
1013}
1014
1015
1022static void
1024 const struct GNUNET_CADET_RequestDropCadetMessage *message)
1025{
1026 struct CadetClient *c = cls;
1027 struct CadetChannel *ch;
1028
1029 ch = lookup_channel (c,
1030 message->ccn);
1031
1032 if (NULL != ch)
1033 GCCH_assign_type_to_drop (ch, message);
1034
1036}
1037
1038
1047static void *
1049 struct GNUNET_SERVICE_Client *client,
1050 struct GNUNET_MQ_Handle *mq)
1051{
1052 struct CadetClient *c;
1053
1054 c = GNUNET_new (struct CadetClient);
1055 c->client = client;
1056 c->mq = mq;
1057 c->id = next_client_id++; /* overflow not important: just for debug */
1058 c->channels
1062 c);
1064 "# clients",
1065 +1,
1066 GNUNET_NO);
1068 "%s connected\n",
1069 GSC_2s (c));
1070 return c;
1071}
1072
1073
1081void
1084 struct CadetChannel *ch)
1085{
1086 struct GNUNET_MQ_Envelope *env;
1088
1089 env = GNUNET_MQ_msg (tdm,
1091 tdm->ccn = ccn;
1093 env);
1096 ntohl (
1098 ch));
1099}
1100
1101
1102void
1104 struct CadetChannel *ch)
1105{
1108 h_port,
1109 ch));
1110}
1111
1112
1121static int
1123 uint32_t key,
1124 void *value)
1125{
1126 struct CadetClient *c = cls;
1128 struct CadetChannel *ch = value;
1129
1131 "Destroying %s, due to %s disconnecting.\n",
1132 GCCH_2s (ch),
1133 GSC_2s (c));
1134 ccn.channel_of_client = htonl (key);
1137 key,
1138 ch));
1140 c,
1141 ccn);
1142 return GNUNET_OK;
1143}
1144
1145
1154static int
1156 const struct GNUNET_HashCode *port,
1157 void *value)
1158{
1159 struct CadetClient *c = cls;
1160 struct OpenPort *op = value;
1161
1162 GNUNET_assert (c == op->c);
1164 "Closing port %s due to %s disconnect.\n",
1165 GNUNET_h2s (port),
1166 GSC_2s (c));
1169 &op->h_port,
1170 op));
1173 port,
1174 op));
1175 GNUNET_free (op);
1176 return GNUNET_OK;
1177}
1178
1179
1187static void
1189 struct GNUNET_SERVICE_Client *client,
1190 void *internal_cls)
1191{
1192 struct CadetClient *c = internal_cls;
1193
1194 GNUNET_assert (c->client == client);
1196 "%s is disconnecting.\n",
1197 GSC_2s (c));
1198 if (NULL != c->channels)
1199 {
1202 c);
1205 }
1206 if (NULL != c->ports)
1207 {
1210 c);
1212 }
1215 c);
1217 "# clients",
1218 -1,
1219 GNUNET_NO);
1220 GNUNET_free (c);
1221 if ((NULL == clients_head) &&
1223 shutdown_rest ();
1224}
1225
1226
1233static void
1234run (void *cls,
1235 const struct GNUNET_CONFIGURATION_Handle *c,
1237{
1238 cfg = c;
1239 if (GNUNET_OK !=
1241 "CADET",
1242 "RATCHET_MESSAGES",
1244 {
1246 "CADET",
1247 "RATCHET_MESSAGES",
1248 "needs to be a number");
1249 ratchet_messages = 64;
1250 }
1251 if (GNUNET_OK !=
1253 "CADET",
1254 "RATCHET_TIME",
1255 &ratchet_time))
1256 {
1258 "CADET",
1259 "RATCHET_TIME",
1260 "need delay value");
1262 }
1263 if (GNUNET_OK !=
1265 "CADET",
1266 "REFRESH_CONNECTION_TIME",
1268 {
1270 "CADET",
1271 "REFRESH_CONNECTION_TIME",
1272 "need delay value");
1274 }
1275 if (GNUNET_OK !=
1277 "CADET",
1278 "DROP_PERCENT",
1279 &drop_percent))
1280 {
1281 drop_percent = 0;
1282 }
1283 else
1284 {
1285 LOG (GNUNET_ERROR_TYPE_WARNING, "**************************************\n");
1286 LOG (GNUNET_ERROR_TYPE_WARNING, "Cadet is running with DROP enabled.\n");
1287 LOG (GNUNET_ERROR_TYPE_WARNING, "This is NOT a good idea!\n");
1288 LOG (GNUNET_ERROR_TYPE_WARNING, "Remove DROP_PERCENT from config file.\n");
1289 LOG (GNUNET_ERROR_TYPE_WARNING, "**************************************\n");
1290 }
1292 if (NULL == my_private_key)
1293 {
1294 GNUNET_break (0);
1296 return;
1297 }
1301 c);
1303 NULL);
1305 /* FIXME: optimize code to allow GNUNET_YES here! */
1307 GNUNET_NO);
1309 GNUNET_NO);
1311 GNUNET_YES);
1313 GNUNET_YES);
1314 GCH_init (c);
1315 GCD_init (c);
1316 GCO_init (c);
1318 "CADET started for peer %s\n",
1320}
1321
1322
1328 "cadet",
1330 &run,
1333 NULL,
1334 GNUNET_MQ_hd_fixed_size (port_open,
1337 NULL),
1338 GNUNET_MQ_hd_fixed_size (port_close,
1341 NULL),
1342 GNUNET_MQ_hd_fixed_size (channel_create,
1345 NULL),
1349 NULL),
1350 GNUNET_MQ_hd_var_size (local_data,
1353 NULL),
1354 GNUNET_MQ_hd_fixed_size (local_ack,
1356 struct GNUNET_CADET_LocalAck,
1357 NULL),
1360 struct GNUNET_MessageHeader,
1361 NULL),
1362 GNUNET_MQ_hd_fixed_size (show_path,
1365 NULL),
1366 GNUNET_MQ_hd_fixed_size (info_tunnels,
1368 struct GNUNET_MessageHeader,
1369 NULL),
1370 GNUNET_MQ_hd_fixed_size (drop_message,
1373 NULL),
1375
1376/* end of gnunet-service-cadet-new.c */
struct GNUNET_GETOPT_CommandLineOption options[]
Definition: 002.c:5
struct GNUNET_MQ_Handle * mq
Definition: 003.c:5
struct GNUNET_MessageHeader * msg
Definition: 005.c:2
struct GNUNET_MQ_Envelope * env
Definition: 005.c:1
#define GNUNET_CADET_LOCAL_CHANNEL_ID_CLI
Minimum value for channel IDs of local clients.
Definition: cadet.h:70
static struct GNUNET_ARM_Operation * op
Current operation.
Definition: gnunet-arm.c:143
static uint16_t port
Port number.
Definition: gnunet-bcd.c:146
static void get_peers(void *cls)
Call CADET's meta API, get all peers known to a peer.
Definition: gnunet-cadet.c:584
static struct GNUNET_CADET_Channel * ch
Channel handle.
Definition: gnunet-cadet.c:117
struct GNUNET_HashCode key
The key used in the DHT.
static struct GNUNET_IDENTITY_Handle * id
Handle to IDENTITY.
static char * value
Value of the record to add/remove.
static struct GNUNET_SERVICE_Handle * service
Handle to our service instance.
struct GNUNET_CONTAINER_MultiPeerMap * peers
Map from PIDs to struct CadetPeer entries.
struct GNUNET_CONTAINER_MultiShortmap * connections
Map from struct GNUNET_CADET_ConnectionTunnelIdentifier hash codes to struct CadetConnection objects.
static void handle_info_tunnels(void *cls, const struct GNUNET_MessageHeader *message)
Handler for client's GNUNET_MESSAGE_TYPE_CADET_LOCAL_REQUEST_INFO_TUNNELS request.
static struct CadetClient * clients_tail
DLL with all the clients, tail.
struct GNUNET_PeerIdentity my_full_id
Local peer own ID.
void GSC_handle_remote_channel_destroy(struct CadetClient *c, struct GNUNET_CADET_ClientChannelNumber ccn, struct CadetChannel *ch)
A channel was destroyed by the other peer.
static void handle_channel_destroy(void *cls, const struct GNUNET_CADET_LocalChannelDestroyMessage *msg)
Handler for requests of destroying an existing channel.
static int channel_destroy_iterator(void *cls, uint32_t key, void *value)
Iterator for deleting each channel whose client endpoint disconnected.
static unsigned int next_client_id
Next ID to assign to a client.
GNUNET_SERVICE_MAIN(GNUNET_OS_project_data_gnunet(), "cadet", GNUNET_SERVICE_OPTION_NONE, &run, &client_connect_cb, &client_disconnect_cb, NULL, GNUNET_MQ_hd_fixed_size(port_open, GNUNET_MESSAGE_TYPE_CADET_LOCAL_PORT_OPEN, struct GNUNET_CADET_PortMessage, NULL), GNUNET_MQ_hd_fixed_size(port_close, GNUNET_MESSAGE_TYPE_CADET_LOCAL_PORT_CLOSE, struct GNUNET_CADET_PortMessage, NULL), GNUNET_MQ_hd_fixed_size(channel_create, GNUNET_MESSAGE_TYPE_CADET_LOCAL_CHANNEL_CREATE, struct GNUNET_CADET_LocalChannelCreateMessage, NULL), GNUNET_MQ_hd_fixed_size(channel_destroy, GNUNET_MESSAGE_TYPE_CADET_LOCAL_CHANNEL_DESTROY, struct GNUNET_CADET_LocalChannelDestroyMessage, NULL), GNUNET_MQ_hd_var_size(local_data, GNUNET_MESSAGE_TYPE_CADET_LOCAL_DATA, struct GNUNET_CADET_LocalData, NULL), GNUNET_MQ_hd_fixed_size(local_ack, GNUNET_MESSAGE_TYPE_CADET_LOCAL_ACK, struct GNUNET_CADET_LocalAck, NULL), GNUNET_MQ_hd_fixed_size(get_peers, GNUNET_MESSAGE_TYPE_CADET_LOCAL_REQUEST_INFO_PEERS, struct GNUNET_MessageHeader, NULL), GNUNET_MQ_hd_fixed_size(show_path, GNUNET_MESSAGE_TYPE_CADET_LOCAL_REQUEST_INFO_PATH, struct GNUNET_CADET_RequestPathInfoMessage, NULL), GNUNET_MQ_hd_fixed_size(info_tunnels, GNUNET_MESSAGE_TYPE_CADET_LOCAL_REQUEST_INFO_TUNNELS, struct GNUNET_MessageHeader, NULL), GNUNET_MQ_hd_fixed_size(drop_message, GNUNET_MESSAGE_TYPE_CADET_DROP_CADET_MESSAGE, struct GNUNET_CADET_RequestDropCadetMessage, NULL), GNUNET_MQ_handler_end())
Define "main" method using service macro.
unsigned long long drop_percent
Set to non-zero values to create random drops to test retransmissions.
static void handle_port_open(void *cls, const struct GNUNET_CADET_PortMessage *pmsg)
Handle port open request.
static void handle_channel_create(void *cls, const struct GNUNET_CADET_LocalChannelCreateMessage *tcm)
Handler for requests for us creating a new channel to another peer and port.
struct GNUNET_STATISTICS_Handle * stats
Handle to the statistics service.
static void handle_show_path(void *cls, const struct GNUNET_CADET_RequestPathInfoMessage *msg)
Handler for client's GNUNET_MESSAGE_TYPE_CADET_LOCAL_REQUEST_INFO_PATH request.
static struct CadetChannel * lookup_channel(struct CadetClient *c, struct GNUNET_CADET_ClientChannelNumber ccn)
Lookup channel of client c by ccn.
const struct GNUNET_CONFIGURATION_Handle * cfg
Handle to our configuration.
struct GNUNET_TIME_Relative keepalive_period
How frequently do we send KEEPALIVE messages on idle connections?
static void handle_get_peers(void *cls, const struct GNUNET_MessageHeader *message)
Handler for client's INFO PEERS request.
static int get_all_tunnels_iterator(void *cls, const struct GNUNET_PeerIdentity *peer, void *value)
Iterator over all tunnels to send a monitoring client info about each tunnel.
static int bind_loose_channel(void *cls, const struct GNUNET_HashCode *port, void *value)
We had a remote connection value to port h_port before client cls opened port port.
void GSC_send_to_client(struct CadetClient *c, struct GNUNET_MQ_Envelope *env)
Send a message to a client.
static void shutdown_task(void *cls)
Task run during shutdown.
static int destroy_paths_now(void *cls, const struct GNUNET_PeerIdentity *pid, void *value)
Callback invoked on all peers to destroy all tunnels that may still exist.
static void * client_connect_cb(void *cls, struct GNUNET_SERVICE_Client *client, struct GNUNET_MQ_Handle *mq)
Callback called when a client connects to the service.
int shutting_down
Signal that shutdown is happening: prevent recovery measures.
unsigned long long ratchet_messages
How many messages are needed to trigger an AXOLOTL ratchet advance.
static void run(void *cls, const struct GNUNET_CONFIGURATION_Handle *c, struct GNUNET_SERVICE_Handle *service)
Setup CADET internals.
static int check_local_data(void *cls, const struct GNUNET_CADET_LocalData *msg)
Check for client traffic data message is well-formed.
static void handle_local_ack(void *cls, const struct GNUNET_CADET_LocalAck *msg)
Handler for client's ACKs for payload traffic.
static int client_release_ports(void *cls, const struct GNUNET_HashCode *port, void *value)
Remove client's ports from the global hashmap on disconnect.
struct GNUNET_TRANSPORT_ApplicationHandle * transport
Handle to Transport service.
static void handle_local_data(void *cls, const struct GNUNET_CADET_LocalData *msg)
Handler for client payload traffic to be send on a channel to another peer.
static void shutdown_rest()
Shutdown everything once the clients have disconnected.
static int path_info_iterator(void *cls, struct CadetPeerPath *path, unsigned int off)
Iterator over all paths of a peer to build an InfoPeer message.
static int get_all_peers_iterator(void *cls, const struct GNUNET_PeerIdentity *peer, void *value)
Iterator over all peers to send a monitoring client info about each peer.
#define LOG(level,...)
struct GNUNET_CONTAINER_MultiHashMap * open_ports
All ports clients of this peer have opened.
static struct CadetClient * clients_head
DLL with all the clients, head.
struct GNUNET_CADET_ClientChannelNumber GSC_bind(struct CadetClient *c, struct CadetChannel *ch, struct CadetPeer *dest, const struct GNUNET_HashCode *port, uint32_t options)
Bind incoming channel to this client, and notify client about incoming connection.
struct GNUNET_CONTAINER_MultiHashMap * loose_channels
Map from ports to channels where the ports were closed at the time we got the inbound connection.
struct GNUNET_CRYPTO_EddsaPrivateKey * my_private_key
Own private key.
static struct GNUNET_CADET_ClientChannelNumber client_get_next_ccn(struct CadetClient *c)
Obtain the next LID to use for incoming connections to the given client.
static void client_disconnect_cb(void *cls, struct GNUNET_SERVICE_Client *client, void *internal_cls)
Callback called when a client disconnected from the service.
struct GNUNET_TIME_Relative ratchet_time
How long until we trigger a ratched advance due to time.
static void handle_drop_message(void *cls, const struct GNUNET_CADET_RequestDropCadetMessage *message)
Handler for client's GNUNET_MESSAGE_TYPE_CADET_DROP_CADET_MESSAGE request.
static int destroy_tunnels_now(void *cls, const struct GNUNET_PeerIdentity *pid, void *value)
Callback invoked on all peers to destroy all tunnels that may still exist.
static void handle_port_close(void *cls, const struct GNUNET_CADET_PortMessage *pmsg)
Handler for port close requests.
void GSC_drop_loose_channel(const struct GNUNET_HashCode *h_port, struct CadetChannel *ch)
A client that created a loose channel that was not bound to a port disconnected, drop it from the loo...
const char * GSC_2s(struct CadetClient *c)
Return identifier for a client as a string.
Information we track per peer.
static void channel_destroy(struct CadetChannel *ch)
Destroy the given channel.
int GCCH_handle_local_data(struct CadetChannel *ch, struct GNUNET_CADET_ClientChannelNumber sender_ccn, const char *buf, size_t buf_len)
Handle data given by a client.
void GCCH_bind(struct CadetChannel *ch, struct CadetClient *c, const struct GNUNET_HashCode *port)
A client is bound to the port that we have a channel open to.
const char * GCCH_2s(const struct CadetChannel *ch)
Get the static string for identification of the channel.
void GCCH_handle_local_ack(struct CadetChannel *ch, struct GNUNET_CADET_ClientChannelNumber client_ccn)
Handle ACK from client on local channel.
void GCCH_channel_local_destroy(struct CadetChannel *ch, struct CadetClient *c, struct GNUNET_CADET_ClientChannelNumber ccn)
Destroy locally created channel.
void GCCH_assign_type_to_drop(struct CadetChannel *ch, const struct GNUNET_CADET_RequestDropCadetMessage *message)
Assign type of message to drop.
struct CadetChannel * GCCH_channel_local_new(struct CadetClient *owner, struct GNUNET_CADET_ClientChannelNumber ccn, struct CadetPeer *destination, const struct GNUNET_HashCode *port, uint32_t options)
Create a new channel.
void GCCH_hash_port(struct GNUNET_HashCode *h_port, const struct GNUNET_HashCode *port, const struct GNUNET_PeerIdentity *listener)
Hash the port and initiator and listener to calculate the "challenge" h_port we send to the other pee...
GNUnet CADET service with encryption.
void GCO_shutdown()
Shut down the CORE subsystem.
void GCO_init(const struct GNUNET_CONFIGURATION_Handle *c)
Initialize the CORE subsystem.
cadet service; interaction with CORE service
void GCD_init(const struct GNUNET_CONFIGURATION_Handle *c)
Initialize the DHT subsystem.
void GCD_shutdown(void)
Shut down the DHT subsystem.
cadet service; dealing with DHT requests and results
void GCH_shutdown()
Shut down the hello subsystem.
void GCH_init(const struct GNUNET_CONFIGURATION_Handle *c)
Initialize the hello subsystem.
cadet service; dealing with hello messages
unsigned int GCPP_get_length(struct CadetPeerPath *path)
Return the length of the path.
struct CadetPeer * GCPP_get_peer_at_offset(struct CadetPeerPath *path, unsigned int off)
Obtain the peer at offset off in path.
const struct GNUNET_PeerIdentity * GCP_get_id(struct CadetPeer *cp)
Obtain the peer identity for a struct CadetPeer.
struct CadetPeer * GCP_get(const struct GNUNET_PeerIdentity *peer_id, int create)
Retrieve the CadetPeer structure associated with the peer.
struct CadetTunnel * GCP_get_tunnel(struct CadetPeer *cp, int create)
Get the tunnel towards a peer.
unsigned int GCP_count_paths(const struct CadetPeer *cp)
Count the number of known paths toward the peer.
void GCP_drop_owned_paths(struct CadetPeer *cp)
Drop all paths owned by this peer, and do not allow new ones to be added: We are shutting down.
unsigned int GCP_iterate_indirect_paths(struct CadetPeer *cp, GCP_PathIterator callback, void *callback_cls)
Iterate over the paths to a peer without direct link.
const char * GCP_2s(const struct CadetPeer *cp)
Get the static string for a peer ID.
void GCP_destroy_all_peers()
Clean up all entries about all peers.
void GCP_iterate_all(GNUNET_CONTAINER_PeerMapIterator iter, void *cls)
Iterate over all known peers.
Information we track per peer.
unsigned int GCT_count_any_connections(const struct CadetTunnel *t)
Counts the number of connections created for a tunnel, including busy connections.
unsigned int GCT_count_channels(struct CadetTunnel *t)
Returns the number of channels using a tunnel.
enum CadetTunnelEState GCT_get_estate(struct CadetTunnel *t)
Get the encryption state of a tunnel.
void GCT_destroy_tunnel_now(struct CadetTunnel *t)
Destroys the tunnel t now, without delay.
Information we track per tunnel.
static struct GNUNET_PeerIdentity pid
Identity of the peer we transmit to / connect to.
static struct GNUNET_OS_Process * p
Helper process we started.
Definition: gnunet-uri.c:38
static struct GNUNET_SCHEDULER_Task * t
Main task.
API to create, modify and access statistics.
Bandwidth allocation API for applications to interact with.
void GNUNET_TRANSPORT_application_done(struct GNUNET_TRANSPORT_ApplicationHandle *ch)
Shutdown TRANSPORT application client.
struct GNUNET_TRANSPORT_ApplicationHandle * GNUNET_TRANSPORT_application_init(const struct GNUNET_CONFIGURATION_Handle *cfg)
Initialize the TRANSPORT application client handle.
enum GNUNET_GenericReturnValue GNUNET_CONFIGURATION_get_value_number(const struct GNUNET_CONFIGURATION_Handle *cfg, const char *section, const char *option, unsigned long long *number)
Get a configuration value that should be a number.
enum GNUNET_GenericReturnValue GNUNET_CONFIGURATION_get_value_time(const struct GNUNET_CONFIGURATION_Handle *cfg, const char *section, const char *option, struct GNUNET_TIME_Relative *time)
Get a configuration value that should be a relative time.
#define GNUNET_CONSTANTS_MAX_CADET_MESSAGE_SIZE
Maximum message size that can be sent on CADET.
void GNUNET_CRYPTO_eddsa_key_get_public(const struct GNUNET_CRYPTO_EddsaPrivateKey *priv, struct GNUNET_CRYPTO_EddsaPublicKey *pub)
Extract the public key for the given private key.
Definition: crypto_ecc.c:201
struct GNUNET_CRYPTO_EddsaPrivateKey * GNUNET_CRYPTO_eddsa_key_create_from_configuration(const struct GNUNET_CONFIGURATION_Handle *cfg)
Create a new private key by reading our peer's key from the file specified in the configuration.
#define GNUNET_CONTAINER_DLL_remove(head, tail, element)
Remove an element from a DLL.
#define GNUNET_CONTAINER_DLL_insert(head, tail, element)
Insert an element at the head of a DLL.
int GNUNET_CONTAINER_multihashmap_iterate(struct GNUNET_CONTAINER_MultiHashMap *map, GNUNET_CONTAINER_MultiHashMapIteratorCallback it, void *it_cls)
Iterate over all entries in the map.
enum GNUNET_GenericReturnValue GNUNET_CONTAINER_multihashmap32_put(struct GNUNET_CONTAINER_MultiHashMap32 *map, uint32_t key, void *value, enum GNUNET_CONTAINER_MultiHashMapOption opt)
Store a key-value pair in the map.
void GNUNET_CONTAINER_multipeermap_destroy(struct GNUNET_CONTAINER_MultiPeerMap *map)
Destroy a hash map.
void * GNUNET_CONTAINER_multihashmap_get(const struct GNUNET_CONTAINER_MultiHashMap *map, const struct GNUNET_HashCode *key)
Given a key find a value in the map matching the key.
struct GNUNET_CONTAINER_MultiHashMap32 * GNUNET_CONTAINER_multihashmap32_create(unsigned int len)
Create a 32-bit key multi hash map.
enum GNUNET_GenericReturnValue GNUNET_CONTAINER_multihashmap32_remove(struct GNUNET_CONTAINER_MultiHashMap32 *map, uint32_t key, const void *value)
Remove the given key-value pair from the map.
enum GNUNET_GenericReturnValue GNUNET_CONTAINER_multihashmap_remove(struct GNUNET_CONTAINER_MultiHashMap *map, const struct GNUNET_HashCode *key, const void *value)
Remove the given key-value pair from the map.
unsigned int GNUNET_CONTAINER_multihashmap32_size(const struct GNUNET_CONTAINER_MultiHashMap32 *map)
Get the number of key-value pairs in the map.
struct GNUNET_CONTAINER_MultiShortmap * GNUNET_CONTAINER_multishortmap_create(unsigned int len, int do_not_copy_keys)
Create a multi peer map (hash map for public keys of peers).
void * GNUNET_CONTAINER_multihashmap32_get(const struct GNUNET_CONTAINER_MultiHashMap32 *map, uint32_t key)
Given a key find a value in the map matching the key.
enum GNUNET_GenericReturnValue GNUNET_CONTAINER_multihashmap_put(struct GNUNET_CONTAINER_MultiHashMap *map, const struct GNUNET_HashCode *key, void *value, enum GNUNET_CONTAINER_MultiHashMapOption opt)
Store a key-value pair in the map.
void GNUNET_CONTAINER_multihashmap_destroy(struct GNUNET_CONTAINER_MultiHashMap *map)
Destroy a hash map.
struct GNUNET_CONTAINER_MultiHashMap * GNUNET_CONTAINER_multihashmap_create(unsigned int len, int do_not_copy_keys)
Create a multi hash map.
struct GNUNET_CONTAINER_MultiPeerMap * GNUNET_CONTAINER_multipeermap_create(unsigned int len, int do_not_copy_keys)
Create a multi peer map (hash map for public keys of peers).
void GNUNET_CONTAINER_multishortmap_destroy(struct GNUNET_CONTAINER_MultiShortmap *map)
Destroy a hash map.
enum GNUNET_GenericReturnValue GNUNET_CONTAINER_multihashmap_get_multiple(struct GNUNET_CONTAINER_MultiHashMap *map, const struct GNUNET_HashCode *key, GNUNET_CONTAINER_MultiHashMapIteratorCallback it, void *it_cls)
Iterate over all entries in the map that match a particular key.
void GNUNET_CONTAINER_multihashmap32_destroy(struct GNUNET_CONTAINER_MultiHashMap32 *map)
Destroy a 32-bit key hash map.
int GNUNET_CONTAINER_multihashmap32_iterate(struct GNUNET_CONTAINER_MultiHashMap32 *map, GNUNET_CONTAINER_MultiHashMapIterator32Callback it, void *it_cls)
Iterate over all entries in the map.
@ GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE
Allow multiple values with the same key.
@ GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY
There must only be one value per key; storing a value should fail if a value under the same key alrea...
uint16_t type
The type of the message (GNUNET_MESSAGE_TYPE_XXXX), in big-endian format.
#define GNUNET_log(kind,...)
#define GNUNET_memcpy(dst, src, n)
Call memcpy() but check for n being 0 first.
#define GNUNET_MIN(a, b)
uint16_t size
The length of the struct (in bytes, including the length field itself), in big-endian format.
@ GNUNET_OK
@ GNUNET_YES
@ GNUNET_NO
@ GNUNET_SYSERR
#define GNUNET_break_op(cond)
Use this for assertion violations caused by other peers (i.e.
const char * GNUNET_i2s(const struct GNUNET_PeerIdentity *pid)
Convert a peer identity to a string (for printing debug messages).
#define GNUNET_assert(cond)
Use this for fatal errors that cannot be handled.
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur.
const char * GNUNET_h2s(const struct GNUNET_HashCode *hc)
Convert a hash value to a string (for printing debug messages).
void GNUNET_log_config_invalid(enum GNUNET_ErrorType kind, const char *section, const char *option, const char *required)
Log error message about invalid configuration option value.
@ GNUNET_ERROR_TYPE_WARNING
@ GNUNET_ERROR_TYPE_DEBUG
@ GNUNET_ERROR_TYPE_INFO
int GNUNET_snprintf(char *buf, size_t size, const char *format,...) __attribute__((format(printf
Like snprintf, just aborts if the buffer is of insufficient size.
#define GNUNET_new(type)
Allocate a struct or union of the given type.
#define GNUNET_free(ptr)
Wrapper around free.
void GNUNET_MQ_send(struct GNUNET_MQ_Handle *mq, struct GNUNET_MQ_Envelope *ev)
Send a message with the given message queue.
Definition: mq.c:305
#define GNUNET_MQ_handler_end()
End-marker for the handlers array.
#define GNUNET_MQ_msg_extra(mvar, esize, type)
Allocate an envelope, with extra space allocated after the space needed by the message struct.
Definition: gnunet_mq_lib.h:61
#define GNUNET_MQ_msg(mvar, type)
Allocate a GNUNET_MQ_Envelope.
Definition: gnunet_mq_lib.h:76
#define GNUNET_MQ_hd_var_size(name, code, str, ctx)
#define GNUNET_MQ_hd_fixed_size(name, code, str, ctx)
const struct GNUNET_OS_ProjectData * GNUNET_OS_project_data_gnunet(void)
Return default project data used by 'libgnunetutil' for GNUnet.
#define GNUNET_MESSAGE_TYPE_CADET_LOCAL_CHANNEL_CREATE
Ask the cadet service to create a new channel.
#define GNUNET_MESSAGE_TYPE_CADET_LOCAL_REQUEST_INFO_PEERS
Request local information about all peers known to the service.
#define GNUNET_MESSAGE_TYPE_CADET_LOCAL_INFO_TUNNELS
Local information about all tunnels of service.
#define GNUNET_MESSAGE_TYPE_CADET_LOCAL_INFO_TUNNELS_END
End of local information about all tunnels of service.
#define GNUNET_MESSAGE_TYPE_CADET_LOCAL_ACK
Local ACK for data.
#define GNUNET_MESSAGE_TYPE_CADET_DROP_CADET_MESSAGE
Request to drop a message of type X to peer y.
#define GNUNET_MESSAGE_TYPE_CADET_LOCAL_INFO_PATH_END
End of local information of service about a specific path.
#define GNUNET_MESSAGE_TYPE_CADET_LOCAL_REQUEST_INFO_PATH
Request local information of service about paths to specific peer.
#define GNUNET_MESSAGE_TYPE_CADET_LOCAL_INFO_PEERS
Local information about all peers known to the service.
#define GNUNET_MESSAGE_TYPE_CADET_LOCAL_INFO_PEERS_END
End of local information about all peers known to the service.
#define GNUNET_MESSAGE_TYPE_CADET_LOCAL_PORT_CLOSE
Stop listening on a port.
#define GNUNET_MESSAGE_TYPE_CADET_LOCAL_PORT_OPEN
Start listening on a port.
#define GNUNET_MESSAGE_TYPE_CADET_LOCAL_INFO_PATH
Local information of service about a specific path.
#define GNUNET_MESSAGE_TYPE_CADET_LOCAL_REQUEST_INFO_TUNNELS
Request local information about all tunnels of service.
#define GNUNET_MESSAGE_TYPE_CADET_LOCAL_DATA
Payload client <-> service.
#define GNUNET_MESSAGE_TYPE_CADET_LOCAL_CHANNEL_DESTROY
Tell client that a channel was destroyed.
void GNUNET_SCHEDULER_shutdown(void)
Request the shutdown of a scheduler.
Definition: scheduler.c:567
struct GNUNET_SCHEDULER_Task * GNUNET_SCHEDULER_add_shutdown(GNUNET_SCHEDULER_TaskCallback task, void *task_cls)
Schedule a new task to be run on shutdown, that is when a CTRL-C signal is received,...
Definition: scheduler.c:1339
void GNUNET_SERVICE_client_drop(struct GNUNET_SERVICE_Client *c)
Ask the server to disconnect from the given client.
Definition: service.c:2418
void GNUNET_SERVICE_client_continue(struct GNUNET_SERVICE_Client *c)
Continue receiving further messages from the given client.
Definition: service.c:2389
@ GNUNET_SERVICE_OPTION_NONE
Use defaults.
struct GNUNET_STATISTICS_Handle * GNUNET_STATISTICS_create(const char *subsystem, const struct GNUNET_CONFIGURATION_Handle *cfg)
Get handle for the statistics service.
void GNUNET_STATISTICS_update(struct GNUNET_STATISTICS_Handle *handle, const char *name, int64_t delta, int make_persistent)
Set statistic value for the peer.
void GNUNET_STATISTICS_destroy(struct GNUNET_STATISTICS_Handle *h, int sync_first)
Destroy a handle (free all state associated with it).
#define GNUNET_TIME_UNIT_HOURS
One hour.
#define GNUNET_TIME_UNIT_MINUTES
One minute.
Struct containing all information regarding a channel to a remote client.
Struct containing information about a client of the service.
struct GNUNET_MQ_Handle * mq
Handle to communicate with the client.
struct GNUNET_SERVICE_Client * client
Client handle.
struct CadetClient * prev
Linked list prev.
unsigned int id
ID of the client, mainly for debug messages.
struct GNUNET_CONTAINER_MultiHashMap * ports
Ports that this client has declared interest in.
struct GNUNET_CONTAINER_MultiHashMap32 * channels
Tunnels that belong to this client, indexed by local id, value is a struct CadetChannel.
struct GNUNET_CADET_ClientChannelNumber next_ccn
Channel ID to use for the next incoming channel for this client.
struct CadetClient * next
Linked list next.
Information regarding a possible path to reach a peer.
Struct containing all information regarding a given peer.
Struct containing all information regarding a tunnel to a peer.
Number uniquely identifying a channel of a client.
Definition: cadet.h:101
uint32_t channel_of_client
Values for channel numbering.
Definition: cadet.h:109
Message to allow the client send more data to the service (always service -> client).
Definition: cadet.h:280
Message for a client to create channels.
Definition: cadet.h:201
struct GNUNET_PeerIdentity peer
Channel's peer.
Definition: cadet.h:217
struct GNUNET_CADET_ClientChannelNumber ccn
ID of a channel controlled by this client.
Definition: cadet.h:212
struct GNUNET_HashCode port
Port of the channel.
Definition: cadet.h:222
Message for or to a client to destroy tunnel.
Definition: cadet.h:235
struct GNUNET_CADET_ClientChannelNumber ccn
ID of a channel controlled by this client.
Definition: cadet.h:244
Message for cadet data traffic.
Definition: cadet.h:252
Message to inform the client about one of the paths known to the service.
Definition: cadet.h:407
uint32_t off
Offset of the peer that was requested.
Definition: cadet.h:416
Message to inform the client about one of the peers in the service.
Definition: cadet.h:424
Message to inform the client about one of the tunnels in the service.
Definition: cadet.h:458
Message for a client to create and destroy channels.
Definition: cadet.h:181
struct GNUNET_HashCode port
Port to open/close.
Definition: cadet.h:193
Message to drop another message of specific type.
Definition: cadet.h:321
struct GNUNET_CADET_ClientChannelNumber ccn
ID of the channel we want to drop a message for.
Definition: cadet.h:336
Message to inform the client about channels in the service.
Definition: cadet.h:344
Internal representation of the hash map.
Internal representation of the hash map.
Internal representation of the hash map.
Internal representation of the hash map.
Private ECC key encoded for transmission.
A 512-bit hashcode.
Handle to a message queue.
Definition: mq.c:87
Header for all communications.
The identity of the host (wraps the signing key of the peer).
struct GNUNET_CRYPTO_EddsaPublicKey public_key
Handle to a client that is connected to a service.
Definition: service.c:249
Handle to a service.
Definition: service.c:116
Handle for the service.
Time for relative time used by GNUnet, in microseconds.
Handle to the TRANSPORT subsystem for application management.
Port opened by a client.
struct CadetClient * c
Client that opened the port.