GNUnet 0.21.1
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 "platform.h"
36#include "gnunet_util_lib.h"
37#include "cadet.h"
49#include "gnunet_constants.h"
50
51
52#define LOG(level, ...) GNUNET_log (level, __VA_ARGS__)
53
54
59{
64
69
75
80
85
91
97
101 unsigned int id;
102};
103
104
105/******************************************************************************/
106/*********************** GLOBAL VARIABLES ****************************/
107/******************************************************************************/
108
109/****************************** Global variables ******************************/
110
115
120
125
130
135
140
145
150
154static unsigned int next_client_id;
155
161
168
173
179
183unsigned long long ratchet_messages;
184
189
194
198unsigned long long drop_percent;
199
200
207void
209 struct GNUNET_MQ_Envelope *env)
210{
211 GNUNET_MQ_send (c->mq,
212 env);
213}
214
215
222const char *
224{
225 static char buf[32];
226
227 GNUNET_snprintf (buf,
228 sizeof(buf),
229 "Client(%u)",
230 c->id);
231 return buf;
232}
233
234
242static struct CadetChannel *
245{
247 ntohl (ccn.channel_of_client));
248}
249
250
259{
260 struct GNUNET_CADET_ClientChannelNumber ccn = c->next_ccn;
261
262 /* increment until we have a free one... */
263 while (NULL !=
265 ccn))
266 {
268 = htonl (1 + (ntohl (ccn.channel_of_client)));
269 if (ntohl (ccn.channel_of_client) >=
271 ccn.channel_of_client = htonl (0);
272 }
273 c->next_ccn.channel_of_client
274 = htonl (1 + (ntohl (ccn.channel_of_client)));
275 return ccn;
276}
277
278
293 struct CadetChannel *ch,
294 struct CadetPeer *dest,
295 const struct GNUNET_HashCode *port,
296 uint32_t options)
297{
298 struct GNUNET_MQ_Envelope *env;
301
302 ccn = client_get_next_ccn (c);
305 ntohl (
307 ch,
310 "Accepting incoming %s from %s on open port %s (%u), assigning ccn %X\n",
311 GCCH_2s (ch),
312 GCP_2s (dest),
314 (uint32_t) ntohl (options),
315 (uint32_t) ntohl (ccn.channel_of_client));
316 /* notify local client about incoming connection! */
317 env = GNUNET_MQ_msg (cm,
319 cm->ccn = ccn;
320 cm->port = *port;
321 cm->opt = htonl (options);
322 cm->peer = *GCP_get_id (dest);
324 env);
325 return ccn;
326}
327
328
338static int
340 const struct GNUNET_PeerIdentity *pid,
341 void *value)
342{
343 struct CadetPeer *cp = value;
344 struct CadetTunnel *t = GCP_get_tunnel (cp,
345 GNUNET_NO);
346
347 if (NULL != t)
349 return GNUNET_OK;
350}
351
352
362static int
364 const struct GNUNET_PeerIdentity *pid,
365 void *value)
366{
367 struct CadetPeer *cp = value;
368
370 return GNUNET_OK;
371}
372
373
377static void
379{
380 if (NULL != stats)
381 {
383 GNUNET_NO);
384 stats = NULL;
385 }
386 /* Destroy tunnels. Note that all channels must be destroyed first! */
388 NULL);
389 /* All tunnels, channels, connections and CORE must be down before this point. */
391 NULL);
392 /* All paths, tunnels, channels, connections and CORE must be down before this point. */
394 if (NULL != open_ports)
395 {
397 open_ports = NULL;
398 }
399 if (NULL != loose_channels)
400 {
402 loose_channels = NULL;
403 }
404 if (NULL != peers)
405 {
407 peers = NULL;
408 }
409 if (NULL != connections)
410 {
412 connections = NULL;
413 }
414 if (NULL != transport)
415 {
417 transport = NULL;
418 }
419 GCD_shutdown ();
420 GCH_shutdown ();
422 my_private_key = NULL;
423}
424
425
431static void
432shutdown_task (void *cls)
433{
435 "Shutting down\n");
437 GCO_shutdown ();
438 if (NULL == clients_head)
439 shutdown_rest ();
440}
441
442
452static int
454 const struct GNUNET_HashCode *port,
455 void *value)
456{
457 struct OpenPort *op = cls;
458 struct CadetChannel *ch = value;
459
460 GCCH_bind (ch,
461 op->c,
462 &op->port);
465 &op->h_port,
466 ch));
467 return GNUNET_YES;
468}
469
470
480static void
482 const struct GNUNET_CADET_PortMessage *pmsg)
483{
484 struct CadetClient *c = cls;
485 struct OpenPort *op;
486
488 "Open port %s requested by %s\n",
489 GNUNET_h2s (&pmsg->port),
490 GSC_2s (c));
491 if (NULL == c->ports)
493 GNUNET_NO);
494 op = GNUNET_new (struct OpenPort);
495 op->c = c;
496 op->port = pmsg->port;
497 GCCH_hash_port (&op->h_port,
498 &pmsg->port,
499 &my_full_id);
500 if (GNUNET_OK !=
502 &op->port,
503 op,
505 {
506 GNUNET_break (0);
508 return;
509 }
511 &op->h_port,
512 op,
515 &op->h_port,
517 op);
519}
520
521
531static void
533 const struct GNUNET_CADET_PortMessage *pmsg)
534{
535 struct CadetClient *c = cls;
536 struct OpenPort *op;
537
539 "Closing port %s as requested by %s\n",
540 GNUNET_h2s (&pmsg->port),
541 GSC_2s (c));
542 if (NULL == c->ports)
543 {
544 /* Client closed a port despite _never_ having opened one? */
545 GNUNET_break (0);
547 return;
548 }
550 &pmsg->port);
551 if (NULL == op)
552 {
553 GNUNET_break (0);
555 return;
556 }
559 &op->port,
560 op));
563 &op->h_port,
564 op));
565 GNUNET_free (op);
567}
568
569
576static void
579{
580 struct CadetClient *c = cls;
581 struct CadetChannel *ch;
582
584 {
585 /* Channel ID not in allowed range. */
586 LOG (GNUNET_ERROR_TYPE_DEBUG,"Channel ID not in allowed range.");
587 GNUNET_break (0);
589 return;
590 }
591 ch = lookup_channel (c,
592 tcm->ccn);
593 if (NULL != ch)
594 {
595 /* Channel ID already in use. Not allowed. */
596 LOG (GNUNET_ERROR_TYPE_DEBUG,"Channel ID already in use. Not allowed.");
597 GNUNET_break (0);
599 return;
600 }
602 "New channel to %s at port %s requested by %s\n",
603 GNUNET_i2s (&tcm->peer),
604 GNUNET_h2s (&tcm->port),
605 GSC_2s (c));
606
607 /* Create channel */
609 tcm->ccn,
610 GCP_get (&tcm->peer,
611 GNUNET_YES),
612 &tcm->port,
613 ntohl (tcm->opt));
614 if (NULL == ch)
615 {
616 GNUNET_break (0);
618 return;
619 }
622 ntohl (
623 tcm->ccn.
624 channel_of_client),
625 ch,
627
629}
630
631
638static void
640 const struct
642{
643 struct CadetClient *c = cls;
644 struct CadetChannel *ch;
645
646 ch = lookup_channel (c,
647 msg->ccn);
648 if (NULL == ch)
649 {
650 /* Client attempted to destroy unknown channel.
651 Can happen if the other side went down at the same time.*/
653 "%s tried to destroy unknown channel %X\n",
654 GSC_2s (c),
655 (uint32_t) ntohl (msg->ccn.channel_of_client));
657 return;
658 }
660 "%s is destroying %s\n",
661 GSC_2s (c),
662 GCCH_2s (ch));
665 ntohl (
666 msg->ccn.
667 channel_of_client),
668 ch));
670 c,
671 msg->ccn);
673}
674
675
683static int
685 const struct GNUNET_CADET_LocalData *msg)
686{
687 size_t payload_size;
688 size_t payload_claimed_size;
689 const char *buf;
690 struct GNUNET_MessageHeader pa;
691
692 /* FIXME: what is the format we shall allow for @a msg?
693 ONE payload item or multiple? Seems current cadet_api
694 at least in theory allows more than one. Next-gen
695 cadet_api will likely no more, so we could then
696 simplify this mess again. *//* Sanity check for message size */payload_size = ntohs (msg->header.size) - sizeof(*msg);
697 buf = (const char *) &msg[1];
698 while (payload_size >= sizeof(struct GNUNET_MessageHeader))
699 {
700 /* need to memcpy() for alignment */
701 GNUNET_memcpy (&pa,
702 buf,
703 sizeof(pa));
704 payload_claimed_size = ntohs (pa.size);
705 if ((payload_size < payload_claimed_size) ||
706 (payload_claimed_size < sizeof(struct GNUNET_MessageHeader)) ||
707 (GNUNET_CONSTANTS_MAX_CADET_MESSAGE_SIZE < payload_claimed_size))
708 {
709 GNUNET_break (0);
711 "Local data of %u total size had sub-message %u at %u with %u bytes\n",
712 ntohs (msg->header.size),
713 ntohs (pa.type),
714 (unsigned int) (buf - (const char *) &msg[1]),
715 (unsigned int) payload_claimed_size);
716 return GNUNET_SYSERR;
717 }
718 payload_size -= payload_claimed_size;
719 buf += payload_claimed_size;
720 }
721 if (0 != payload_size)
722 {
723 GNUNET_break_op (0);
724 return GNUNET_SYSERR;
725 }
726 return GNUNET_OK;
727}
728
729
737static void
739 const struct GNUNET_CADET_LocalData *msg)
740{
741 struct CadetClient *c = cls;
742 struct CadetChannel *ch;
743 size_t payload_size;
744 const char *buf;
745
746 ch = lookup_channel (c,
747 msg->ccn);
748 if (NULL == ch)
749 {
750 /* Channel does not exist (anymore) */
752 "Dropping payload for channel %u from client (channel unknown, other endpoint may have disconnected)\n",
753 (unsigned int) ntohl (msg->ccn.channel_of_client));
755 return;
756 }
757 payload_size = ntohs (msg->header.size) - sizeof(*msg);
759 "# payload received from clients",
760 payload_size,
761 GNUNET_NO);
762 buf = (const char *) &msg[1];
764 "Received %u bytes payload from %s for %s\n",
765 (unsigned int) payload_size,
766 GSC_2s (c),
767 GCCH_2s (ch));
768 if (GNUNET_OK !=
770 msg->ccn,
771 buf,
772 payload_size))
773 {
774 GNUNET_break (0);
776 return;
777 }
779}
780
781
788static void
790 const struct GNUNET_CADET_LocalAck *msg)
791{
792 struct CadetClient *c = cls;
793 struct CadetChannel *ch;
794
795 ch = lookup_channel (c,
796 msg->ccn);
797 if (NULL == ch)
798 {
799 /* Channel does not exist (anymore) */
801 "Ignoring local ACK for channel %u from client (channel unknown, other endpoint may have disconnected)\n",
802 (unsigned int) ntohl (msg->ccn.channel_of_client));
804 return;
805 }
807 "Got a local ACK from %s for %s\n",
808 GSC_2s (c),
809 GCCH_2s (ch));
811 msg->ccn);
813}
814
815
824static int
826 const struct GNUNET_PeerIdentity *peer,
827 void *value)
828{
829 struct CadetClient *c = cls;
830 struct CadetPeer *p = value;
831 struct GNUNET_MQ_Envelope *env;
833
836 msg->destination = *peer;
837 msg->paths = htons (GCP_count_paths (p));
838 msg->tunnel = htons (NULL != GCP_get_tunnel (p,
839 GNUNET_NO));
840 msg->best_path_length = htonl (0); // FIXME: get length of shortest known path!
841 GNUNET_MQ_send (c->mq,
842 env);
843 return GNUNET_YES;
844}
845
846
853static void
855 const struct GNUNET_MessageHeader *message)
856{
857 struct CadetClient *c = cls;
858 struct GNUNET_MQ_Envelope *env;
859 struct GNUNET_MessageHeader *reply;
860
862 c);
863 env = GNUNET_MQ_msg (reply,
865 GNUNET_MQ_send (c->mq,
866 env);
868}
869
870
881static int
883 struct CadetPeerPath *path,
884 unsigned int off)
885{
886 struct GNUNET_MQ_Handle *mq = cls;
887 struct GNUNET_MQ_Envelope *env;
888 struct GNUNET_CADET_LocalInfoPath *resp;
889 struct GNUNET_PeerIdentity *id;
890 size_t path_size;
891 unsigned int path_length;
892
893 path_length = GCPP_get_length (path);
894 path_size = sizeof(struct GNUNET_PeerIdentity) * path_length;
895 if (sizeof(*resp) + path_size > UINT16_MAX)
896 {
897 /* try just giving the relevant path */
898 path_length = GNUNET_MIN ((UINT16_MAX - sizeof(*resp)) / sizeof(struct
900 off);
901 path_size = sizeof(struct GNUNET_PeerIdentity) * path_length;
902 }
903 if (sizeof(*resp) + path_size > UINT16_MAX)
904 {
906 "Path of %u entries is too long for info message\n",
907 path_length);
908 return GNUNET_YES;
909 }
910 env = GNUNET_MQ_msg_extra (resp,
911 path_size,
913 id = (struct GNUNET_PeerIdentity *) &resp[1];
914
915 /* Don't copy first peer. First peer is always the local one. Last
916 * peer is always the destination (leave as 0, EOL).
917 */
918 for (unsigned int i = 0; i < path_length; i++)
919 id[i] = *GCP_get_id (GCPP_get_peer_at_offset (path,
920 i));
921 resp->off = htonl (off);
923 env);
924 return GNUNET_YES;
925}
926
927
934static void
937{
938 struct CadetClient *c = cls;
939 struct CadetPeer *p;
940 struct GNUNET_MQ_Envelope *env;
941 struct GNUNET_MessageHeader *resp;
942
943 p = GCP_get (&msg->peer,
944 GNUNET_NO);
945 if (NULL != p)
948 c->mq);
949 env = GNUNET_MQ_msg (resp,
951 GNUNET_MQ_send (c->mq,
952 env);
954}
955
956
965static int
967 const struct GNUNET_PeerIdentity *peer,
968 void *value)
969{
970 struct CadetClient *c = cls;
971 struct CadetPeer *p = value;
972 struct GNUNET_MQ_Envelope *env;
974 struct CadetTunnel *t;
975
976 t = GCP_get_tunnel (p,
977 GNUNET_NO);
978 if (NULL == t)
979 return GNUNET_YES;
982 msg->destination = *peer;
983 msg->channels = htonl (GCT_count_channels (t));
984 msg->connections = htonl (GCT_count_any_connections (t));
985 msg->cstate = htons (0);
986 msg->estate = htons ((uint16_t) GCT_get_estate (t));
987 GNUNET_MQ_send (c->mq,
988 env);
989 return GNUNET_YES;
990}
991
992
999static void
1001 const struct GNUNET_MessageHeader *message)
1002{
1003 struct CadetClient *c = cls;
1004 struct GNUNET_MQ_Envelope *env;
1005 struct GNUNET_MessageHeader *reply;
1006
1008 c);
1009 env = GNUNET_MQ_msg (reply,
1011 GNUNET_MQ_send (c->mq,
1012 env);
1014}
1015
1016
1023static void
1025 const struct GNUNET_CADET_RequestDropCadetMessage *message)
1026{
1027 struct CadetClient *c = cls;
1028 struct CadetChannel *ch;
1029
1030 ch = lookup_channel (c,
1031 message->ccn);
1032
1033 if (NULL != ch)
1034 GCCH_assign_type_to_drop (ch, message);
1035
1037}
1038
1039
1048static void *
1050 struct GNUNET_SERVICE_Client *client,
1051 struct GNUNET_MQ_Handle *mq)
1052{
1053 struct CadetClient *c;
1054
1055 c = GNUNET_new (struct CadetClient);
1056 c->client = client;
1057 c->mq = mq;
1058 c->id = next_client_id++; /* overflow not important: just for debug */
1059 c->channels
1063 c);
1065 "# clients",
1066 +1,
1067 GNUNET_NO);
1069 "%s connected\n",
1070 GSC_2s (c));
1071 return c;
1072}
1073
1074
1082void
1085 struct CadetChannel *ch)
1086{
1087 struct GNUNET_MQ_Envelope *env;
1089
1090 env = GNUNET_MQ_msg (tdm,
1092 tdm->ccn = ccn;
1094 env);
1097 ntohl (
1099 ch));
1100}
1101
1102
1103void
1105 struct CadetChannel *ch)
1106{
1109 h_port,
1110 ch));
1111}
1112
1113
1122static int
1124 uint32_t key,
1125 void *value)
1126{
1127 struct CadetClient *c = cls;
1129 struct CadetChannel *ch = value;
1130
1132 "Destroying %s, due to %s disconnecting.\n",
1133 GCCH_2s (ch),
1134 GSC_2s (c));
1135 ccn.channel_of_client = htonl (key);
1138 key,
1139 ch));
1141 c,
1142 ccn);
1143 return GNUNET_OK;
1144}
1145
1146
1155static int
1157 const struct GNUNET_HashCode *port,
1158 void *value)
1159{
1160 struct CadetClient *c = cls;
1161 struct OpenPort *op = value;
1162
1163 GNUNET_assert (c == op->c);
1165 "Closing port %s due to %s disconnect.\n",
1166 GNUNET_h2s (port),
1167 GSC_2s (c));
1170 &op->h_port,
1171 op));
1174 port,
1175 op));
1176 GNUNET_free (op);
1177 return GNUNET_OK;
1178}
1179
1180
1188static void
1190 struct GNUNET_SERVICE_Client *client,
1191 void *internal_cls)
1192{
1193 struct CadetClient *c = internal_cls;
1194
1195 GNUNET_assert (c->client == client);
1197 "%s is disconnecting.\n",
1198 GSC_2s (c));
1199 if (NULL != c->channels)
1200 {
1203 c);
1206 }
1207 if (NULL != c->ports)
1208 {
1211 c);
1213 }
1216 c);
1218 "# clients",
1219 -1,
1220 GNUNET_NO);
1221 GNUNET_free (c);
1222 if ((NULL == clients_head) &&
1224 shutdown_rest ();
1225}
1226
1227
1234static void
1235run (void *cls,
1236 const struct GNUNET_CONFIGURATION_Handle *c,
1238{
1239 cfg = c;
1240 if (GNUNET_OK !=
1242 "CADET",
1243 "RATCHET_MESSAGES",
1245 {
1247 "CADET",
1248 "RATCHET_MESSAGES",
1249 "needs to be a number");
1250 ratchet_messages = 64;
1251 }
1252 if (GNUNET_OK !=
1254 "CADET",
1255 "RATCHET_TIME",
1256 &ratchet_time))
1257 {
1259 "CADET",
1260 "RATCHET_TIME",
1261 "need delay value");
1263 }
1264 if (GNUNET_OK !=
1266 "CADET",
1267 "REFRESH_CONNECTION_TIME",
1269 {
1271 "CADET",
1272 "REFRESH_CONNECTION_TIME",
1273 "need delay value");
1275 }
1276 if (GNUNET_OK !=
1278 "CADET",
1279 "DROP_PERCENT",
1280 &drop_percent))
1281 {
1282 drop_percent = 0;
1283 }
1284 else
1285 {
1286 LOG (GNUNET_ERROR_TYPE_WARNING, "**************************************\n");
1287 LOG (GNUNET_ERROR_TYPE_WARNING, "Cadet is running with DROP enabled.\n");
1288 LOG (GNUNET_ERROR_TYPE_WARNING, "This is NOT a good idea!\n");
1289 LOG (GNUNET_ERROR_TYPE_WARNING, "Remove DROP_PERCENT from config file.\n");
1290 LOG (GNUNET_ERROR_TYPE_WARNING, "**************************************\n");
1291 }
1293 if (NULL == my_private_key)
1294 {
1295 GNUNET_break (0);
1297 return;
1298 }
1302 c);
1304 NULL);
1306 /* FIXME: optimize code to allow GNUNET_YES here! */
1308 GNUNET_NO);
1310 GNUNET_NO);
1312 GNUNET_YES);
1314 GNUNET_YES);
1315 GCH_init (c);
1316 GCD_init (c);
1317 GCO_init (c);
1319 "CADET started for peer %s\n",
1321}
1322
1323
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:144
static uint16_t port
Port number.
Definition: gnunet-bcd.c:147
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.
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.
GNUNET_SERVICE_MAIN("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.
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.
A connection is a live end-to-end messaging mechanism where the peers are identified by a path and kn...
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:198
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...
#define GNUNET_log(kind,...)
#define GNUNET_memcpy(dst, src, n)
Call memcpy() but check for n being 0 first.
#define GNUNET_MIN(a, b)
@ 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:304
#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:63
#define GNUNET_MQ_msg(mvar, type)
Allocate a GNUNET_MQ_Envelope.
Definition: gnunet_mq_lib.h:78
#define GNUNET_MQ_hd_var_size(name, code, str, ctx)
#define GNUNET_MQ_hd_fixed_size(name, code, str, ctx)
#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:1340
void GNUNET_SERVICE_client_drop(struct GNUNET_SERVICE_Client *c)
Ask the server to disconnect from the given client.
Definition: service.c:2489
void GNUNET_SERVICE_client_continue(struct GNUNET_SERVICE_Client *c)
Continue receiving further messages from the given client.
Definition: service.c:2408
@ 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.
uint16_t type
The type of the message (GNUNET_MESSAGE_TYPE_XXXX), in big-endian format.
uint16_t size
The length of the struct (in bytes, including the length field itself), in big-endian format.
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:252
Handle to a service.
Definition: service.c:118
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.