GNUnet 0.28.1-dev.4-2-gb857fff5c
 
Loading...
Searching...
No Matches
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_pils_service.h"
38#include "gnunet_util_lib.h"
49#include "gnunet_constants.h"
50
51
52#define LOG(level, ...) GNUNET_log (level, __VA_ARGS__)
53
54
103
104
105/******************************************************************************/
106/*********************** GLOBAL VARIABLES ****************************/
107/******************************************************************************/
108
109/****************************** Global variables ******************************/
110
115
120
125
130
135
140
145
149static unsigned int next_client_id;
150
156
163
168
174
178unsigned long long ratchet_messages;
179
184
189
193unsigned long long drop_percent;
194
195
202void
204 struct GNUNET_MQ_Envelope *env)
205{
206 GNUNET_MQ_send (c->mq,
207 env);
208}
209
210
217const char *
219{
220 static char buf[32];
221
222 GNUNET_snprintf (buf,
223 sizeof(buf),
224 "Client(%u)",
225 c->id);
226 return buf;
227}
228
229
237static struct CadetChannel *
244
245
254{
255 struct GNUNET_CADET_ClientChannelNumber ccn = c->next_ccn;
256
257 /* increment until we have a free one... */
258 while (NULL !=
260 ccn))
261 {
263 = htonl (1 + (ntohl (ccn.channel_of_client)));
264 if (ntohl (ccn.channel_of_client) >=
266 ccn.channel_of_client = htonl (0);
267 }
268 c->next_ccn.channel_of_client
269 = htonl (1 + (ntohl (ccn.channel_of_client)));
270 return ccn;
271}
272
273
288 struct CadetChannel *ch,
289 struct CadetPeer *dest,
290 const struct GNUNET_HashCode *port,
291 uint32_t options)
292{
293 struct GNUNET_MQ_Envelope *env;
296
297 ccn = client_get_next_ccn (c);
300 ntohl (
302 ch,
305 "Accepting incoming %s from %s on open port %s (%u), assigning ccn %X\n",
306 GCCH_2s (ch),
307 GCP_2s (dest),
309 (uint32_t) ntohl (options),
310 (uint32_t) ntohl (ccn.channel_of_client));
311 /* notify local client about incoming connection! */
312 env = GNUNET_MQ_msg (cm,
314 cm->ccn = ccn;
315 cm->port = *port;
316 cm->opt = htonl (options);
317 cm->peer = *GCP_get_id (dest);
319 env);
320 return ccn;
321}
322
323
333static int
335 const struct GNUNET_PeerIdentity *pid,
336 void *value)
337{
338 struct CadetPeer *cp = value;
339 struct CadetTunnel *t = GCP_get_tunnel (cp,
340 GNUNET_NO);
341
342 if (NULL != t)
344 return GNUNET_OK;
345}
346
347
357static int
359 const struct GNUNET_PeerIdentity *pid,
360 void *value)
361{
362 struct CadetPeer *cp = value;
363
365 return GNUNET_OK;
366}
367
368
372static void
374{
375 if (NULL != stats)
376 {
378 GNUNET_NO);
379 stats = NULL;
380 }
381 /* Destroy tunnels. Note that all channels must be destroyed first! */
383 NULL);
384 /* All tunnels, channels, connections and CORE must be down before this point. */
386 NULL);
387 /* All paths, tunnels, channels, connections and CORE must be down before this point. */
389 if (NULL != open_ports)
390 {
392 open_ports = NULL;
393 }
394 if (NULL != loose_channels)
395 {
397 loose_channels = NULL;
398 }
399 if (NULL != peers)
400 {
402 peers = NULL;
403 }
404 if (NULL != connections)
405 {
407 connections = NULL;
408 }
409 if (NULL != transport)
410 {
412 transport = NULL;
413 }
414 GCD_shutdown ();
415 GCH_shutdown ();
416}
417
418
424static void
425shutdown_task (void *cls)
426{
428 "Shutting down\n");
430 GCO_shutdown ();
431 if (NULL == clients_head)
432 shutdown_rest ();
433}
434
435
445static int
447 const struct GNUNET_HashCode *port,
448 void *value)
449{
450 struct OpenPort *op = cls;
451 struct CadetChannel *ch = value;
452
453 GCCH_bind (ch,
454 op->c,
455 &op->port);
458 &op->h_port,
459 ch));
460 return GNUNET_YES;
461}
462
463
473static void
475 const struct GNUNET_CADET_PortMessage *pmsg)
476{
477 const struct GNUNET_PeerIdentity *my_identity;
478 struct CadetClient *c = cls;
479 struct OpenPort *op;
480
482 "Open port %s requested by %s\n",
483 GNUNET_h2s (&pmsg->port),
484 GSC_2s (c));
485
487 if (! my_identity)
488 {
489 /* PILS has not delivered our peer identity yet -- #GCH_init() only
490 *starts* the connection, so there is a window right after startup in
491 which we are already accepting clients but cannot compute @e h_port.
492
493 This used to `return' here, which called neither
494 #GNUNET_SERVICE_client_continue() nor #GNUNET_SERVICE_client_drop().
495 The service framework then never reads another message from that
496 client, for the lifetime of the process: it just logs "Processing code
497 for message of type 1022 did not call `GNUNET_SERVICE_client_continue'"
498 once a minute, forever. The port was silently never opened either, so
499 the application waits for incoming channels that cannot arrive, and a
500 later #GNUNET_MESSAGE_TYPE_CADET_LOCAL_PORT_CLOSE for it trips the
501 GNUNET_break(0) in #handle_port_close().
502
503 Dropping the client is recoverable and honest: the port really was not
504 opened, and #reconnect_cbk() in cadet_api.c re-opens every port the
505 client holds after a GNUNET_TIME_STD_BACKOFF delay, by which time PILS
506 will have answered. */
508 "Cannot open port for %s yet: no peer identity from PILS. "
509 "Dropping the client so that it retries.\n",
510 GSC_2s (c));
512 return;
513 }
514
515 if (NULL == c->ports)
517 GNUNET_NO);
518 op = GNUNET_new (struct OpenPort);
519 op->c = c;
520 op->port = pmsg->port;
521 GCCH_hash_port (&op->h_port,
522 &pmsg->port,
524 if (GNUNET_OK !=
526 &op->port,
527 op,
529 {
530 GNUNET_break (0);
532 return;
533 }
535 &op->h_port,
536 op,
539 &op->h_port,
541 op);
543}
544
545
555static void
557 const struct GNUNET_CADET_PortMessage *pmsg)
558{
559 struct CadetClient *c = cls;
560 struct OpenPort *op;
561
563 "Closing port %s as requested by %s\n",
564 GNUNET_h2s (&pmsg->port),
565 GSC_2s (c));
566 if (NULL == c->ports)
567 {
568 /* Client closed a port despite _never_ having opened one? */
569 GNUNET_break (0);
571 return;
572 }
574 &pmsg->port);
575 if (NULL == op)
576 {
577 GNUNET_break (0);
579 return;
580 }
583 &op->port,
584 op));
587 &op->h_port,
588 op));
589 GNUNET_free (op);
591}
592
593
600static void
603{
604 struct CadetClient *c = cls;
605 struct CadetChannel *ch;
606
608 {
609 /* Channel ID not in allowed range. */
610 LOG (GNUNET_ERROR_TYPE_DEBUG,"Channel ID not in allowed range.");
611 GNUNET_break (0);
613 return;
614 }
615 ch = lookup_channel (c,
616 tcm->ccn);
617 if (NULL != ch)
618 {
619 /* Channel ID already in use. Not allowed. */
620 LOG (GNUNET_ERROR_TYPE_DEBUG,"Channel ID already in use. Not allowed.");
621 GNUNET_break (0);
623 return;
624 }
626 "New channel to %s at port %s requested by %s\n",
627 GNUNET_i2s (&tcm->peer),
628 GNUNET_h2s (&tcm->port),
629 GSC_2s (c));
630
631 /* Create channel */
633 tcm->ccn,
634 GCP_get (&tcm->peer,
635 GNUNET_YES),
636 &tcm->port,
637 ntohl (tcm->opt));
638 if (NULL == ch)
639 {
640 GNUNET_break (0);
642 return;
643 }
646 ntohl (
647 tcm->ccn.
648 channel_of_client),
649 ch,
651
653}
654
655
662static void
664 const struct
666{
667 struct CadetClient *c = cls;
668 struct CadetChannel *ch;
669
670 ch = lookup_channel (c,
671 msg->ccn);
672 if (NULL == ch)
673 {
674 /* Client attempted to destroy unknown channel.
675 Can happen if the other side went down at the same time.*/
677 "%s tried to destroy unknown channel %X\n",
678 GSC_2s (c),
679 (uint32_t) ntohl (msg->ccn.channel_of_client));
681 return;
682 }
684 "%s is destroying %s\n",
685 GSC_2s (c),
686 GCCH_2s (ch));
689 ntohl (
690 msg->ccn.
691 channel_of_client),
692 ch));
694 c,
695 msg->ccn);
697}
698
699
707static int
709 const struct GNUNET_CADET_LocalData *msg)
710{
711 size_t payload_size;
712 size_t payload_claimed_size;
713 const char *buf;
714 struct GNUNET_MessageHeader pa;
715
716 /* FIXME: what is the format we shall allow for @a msg?
717 ONE payload item or multiple? Seems current cadet_api
718 at least in theory allows more than one. Next-gen
719 cadet_api will likely no more, so we could then
720 simplify this mess again. *//* Sanity check for message size */payload_size = ntohs (msg->header.size) - sizeof(*msg);
721 buf = (const char *) &msg[1];
722 while (payload_size >= sizeof(struct GNUNET_MessageHeader))
723 {
724 /* need to memcpy() for alignment */
725 GNUNET_memcpy (&pa,
726 buf,
727 sizeof(pa));
728 payload_claimed_size = ntohs (pa.size);
729 if ((payload_size < payload_claimed_size) ||
730 (payload_claimed_size < sizeof(struct GNUNET_MessageHeader)) ||
731 (GNUNET_CONSTANTS_MAX_CADET_MESSAGE_SIZE < payload_claimed_size))
732 {
733 GNUNET_break (0);
735 "Local data of %u total size had sub-message %u at %u with %u bytes\n",
736 ntohs (msg->header.size),
737 ntohs (pa.type),
738 (unsigned int) (buf - (const char *) &msg[1]),
739 (unsigned int) payload_claimed_size);
740 return GNUNET_SYSERR;
741 }
742 payload_size -= payload_claimed_size;
743 buf += payload_claimed_size;
744 }
745 if (0 != payload_size)
746 {
747 GNUNET_break_op (0);
748 return GNUNET_SYSERR;
749 }
750 return GNUNET_OK;
751}
752
753
761static void
763 const struct GNUNET_CADET_LocalData *msg)
764{
765 struct CadetClient *c = cls;
766 struct CadetChannel *ch;
767 size_t payload_size;
768 const char *buf;
769
770 ch = lookup_channel (c,
771 msg->ccn);
772 if (NULL == ch)
773 {
774 /* Channel does not exist (anymore) */
776 "Dropping payload for channel %u from client (channel unknown, other endpoint may have disconnected)\n",
777 (unsigned int) ntohl (msg->ccn.channel_of_client));
779 return;
780 }
781 payload_size = ntohs (msg->header.size) - sizeof(*msg);
783 "# payload received from clients",
784 payload_size,
785 GNUNET_NO);
786 buf = (const char *) &msg[1];
788 "Received %u bytes payload from %s for %s\n",
789 (unsigned int) payload_size,
790 GSC_2s (c),
791 GCCH_2s (ch));
792 if (GNUNET_OK !=
794 msg->ccn,
795 buf,
796 payload_size))
797 {
798 GNUNET_break (0);
800 return;
801 }
803}
804
805
812static void
814 const struct GNUNET_CADET_LocalAck *msg)
815{
816 struct CadetClient *c = cls;
817 struct CadetChannel *ch;
818
819 ch = lookup_channel (c,
820 msg->ccn);
821 if (NULL == ch)
822 {
823 /* Channel does not exist (anymore) */
825 "Ignoring local ACK for channel %u from client (channel unknown, other endpoint may have disconnected)\n",
826 (unsigned int) ntohl (msg->ccn.channel_of_client));
828 return;
829 }
831 "Got a local ACK from %s for %s\n",
832 GSC_2s (c),
833 GCCH_2s (ch));
835 msg->ccn);
837}
838
839
848static int
850 const struct GNUNET_PeerIdentity *peer,
851 void *value)
852{
853 struct CadetClient *c = cls;
854 struct CadetPeer *p = value;
855 struct GNUNET_MQ_Envelope *env;
857
860 msg->destination = *peer;
861 msg->paths = htons (GCP_count_paths (p));
862 msg->tunnel = htons (NULL != GCP_get_tunnel (p,
863 GNUNET_NO));
864 msg->best_path_length = htonl (0); // FIXME: get length of shortest known path!
865 GNUNET_MQ_send (c->mq,
866 env);
867 return GNUNET_YES;
868}
869
870
877static void
879 const struct GNUNET_MessageHeader *message)
880{
881 struct CadetClient *c = cls;
882 struct GNUNET_MQ_Envelope *env;
883 struct GNUNET_MessageHeader *reply;
884
886 c);
887 env = GNUNET_MQ_msg (reply,
889 GNUNET_MQ_send (c->mq,
890 env);
892}
893
894
905static int
907 struct CadetPeerPath *path,
908 unsigned int off)
909{
910 struct GNUNET_MQ_Handle *mq = cls;
911 struct GNUNET_MQ_Envelope *env;
913 struct GNUNET_PeerIdentity *id;
914 size_t path_size;
915 unsigned int path_length;
916
917 path_length = GCPP_get_length (path);
918 path_size = sizeof(struct GNUNET_PeerIdentity) * path_length;
919 if (sizeof(*resp) + path_size > UINT16_MAX)
920 {
921 /* try just giving the relevant path */
922 path_length = GNUNET_MIN ((UINT16_MAX - sizeof(*resp)) / sizeof(struct
924 off);
925 path_size = sizeof(struct GNUNET_PeerIdentity) * path_length;
926 }
927 if (sizeof(*resp) + path_size > UINT16_MAX)
928 {
930 "Path of %u entries is too long for info message\n",
931 path_length);
932 return GNUNET_YES;
933 }
934 env = GNUNET_MQ_msg_extra (resp,
935 path_size,
937 id = (struct GNUNET_PeerIdentity *) &resp[1];
938
939 /* Don't copy first peer. First peer is always the local one. Last
940 * peer is always the destination (leave as 0, EOL).
941 */
942 for (unsigned int i = 0; i < path_length; i++)
943 id[i] = *GCP_get_id (GCPP_get_peer_at_offset (path,
944 i));
945 resp->off = htonl (off);
947 env);
948 return GNUNET_YES;
949}
950
951
958static void
961{
962 struct CadetClient *c = cls;
963 struct CadetPeer *p;
964 struct GNUNET_MQ_Envelope *env;
965 struct GNUNET_MessageHeader *resp;
966
967 p = GCP_get (&msg->peer,
968 GNUNET_NO);
969 if (NULL != p)
972 c->mq);
973 env = GNUNET_MQ_msg (resp,
975 GNUNET_MQ_send (c->mq,
976 env);
978}
979
980
989static int
991 const struct GNUNET_PeerIdentity *peer,
992 void *value)
993{
994 struct CadetClient *c = cls;
995 struct CadetPeer *p = value;
996 struct GNUNET_MQ_Envelope *env;
998 struct CadetTunnel *t;
999
1000 t = GCP_get_tunnel (p,
1001 GNUNET_NO);
1002 if (NULL == t)
1003 return GNUNET_YES;
1006 msg->destination = *peer;
1007 msg->channels = htonl (GCT_count_channels (t));
1008 msg->connections = htonl (GCT_count_any_connections (t));
1009 msg->cstate = htons (0);
1010 msg->estate = htons (GCT_get_estate (t));
1011 GNUNET_MQ_send (c->mq,
1012 env);
1013 return GNUNET_YES;
1014}
1015
1016
1023static void
1025 const struct GNUNET_MessageHeader *message)
1026{
1027 struct CadetClient *c = cls;
1028 struct GNUNET_MQ_Envelope *env;
1029 struct GNUNET_MessageHeader *reply;
1030
1032 c);
1033 env = GNUNET_MQ_msg (reply,
1035 GNUNET_MQ_send (c->mq,
1036 env);
1038}
1039
1040
1047static void
1049 const struct GNUNET_CADET_RequestDropCadetMessage *message)
1050{
1051 struct CadetClient *c = cls;
1052 struct CadetChannel *ch;
1053
1054 ch = lookup_channel (c,
1055 message->ccn);
1056
1057 if (NULL != ch)
1058 GCCH_assign_type_to_drop (ch, message);
1059
1061}
1062
1063
1072static void *
1074 struct GNUNET_SERVICE_Client *client,
1075 struct GNUNET_MQ_Handle *mq)
1076{
1077 struct CadetClient *c;
1078
1079 c = GNUNET_new (struct CadetClient);
1080 c->client = client;
1081 c->mq = mq;
1082 c->id = next_client_id++; /* overflow not important: just for debug */
1083 c->channels
1087 c);
1089 "# clients",
1090 +1,
1091 GNUNET_NO);
1093 "%s connected\n",
1094 GSC_2s (c));
1095 return c;
1096}
1097
1098
1106void
1126
1127
1128void
1130 struct CadetChannel *ch)
1131{
1134 h_port,
1135 ch));
1136}
1137
1138
1147static int
1149 uint32_t key,
1150 void *value)
1151{
1152 struct CadetClient *c = cls;
1154 struct CadetChannel *ch = value;
1155
1157 "Destroying %s, due to %s disconnecting.\n",
1158 GCCH_2s (ch),
1159 GSC_2s (c));
1160 ccn.channel_of_client = htonl (key);
1163 key,
1164 ch));
1166 c,
1167 ccn);
1168 return GNUNET_OK;
1169}
1170
1171
1180static int
1182 const struct GNUNET_HashCode *port,
1183 void *value)
1184{
1185 struct CadetClient *c = cls;
1186 struct OpenPort *op = value;
1187
1188 GNUNET_assert (c == op->c);
1190 "Closing port %s due to %s disconnect.\n",
1191 GNUNET_h2s (port),
1192 GSC_2s (c));
1195 &op->h_port,
1196 op));
1199 port,
1200 op));
1201 GNUNET_free (op);
1202 return GNUNET_OK;
1203}
1204
1205
1213static void
1215 struct GNUNET_SERVICE_Client *client,
1216 void *internal_cls)
1217{
1218 struct CadetClient *c = internal_cls;
1219
1220 GNUNET_assert (c->client == client);
1222 "%s is disconnecting.\n",
1223 GSC_2s (c));
1224 if (NULL != c->channels)
1225 {
1228 c);
1231 }
1232 if (NULL != c->ports)
1233 {
1236 c);
1238 }
1241 c);
1243 "# clients",
1244 -1,
1245 GNUNET_NO);
1246 GNUNET_free (c);
1247 if ((NULL == clients_head) &&
1249 shutdown_rest ();
1250}
1251
1252
1259static void
1260run (void *cls,
1261 const struct GNUNET_CONFIGURATION_Handle *c,
1263{
1264 cfg = c;
1265 if (GNUNET_OK !=
1267 "CADET",
1268 "RATCHET_MESSAGES",
1270 {
1272 "CADET",
1273 "RATCHET_MESSAGES",
1274 "needs to be a number");
1275 ratchet_messages = 64;
1276 }
1277 if (GNUNET_OK !=
1279 "CADET",
1280 "RATCHET_TIME",
1281 &ratchet_time))
1282 {
1284 "CADET",
1285 "RATCHET_TIME",
1286 "need delay value");
1288 }
1289 if (GNUNET_OK !=
1291 "CADET",
1292 "REFRESH_CONNECTION_TIME",
1294 {
1296 "CADET",
1297 "REFRESH_CONNECTION_TIME",
1298 "need delay value");
1300 }
1301 if (GNUNET_OK !=
1303 "CADET",
1304 "DROP_PERCENT",
1305 &drop_percent))
1306 {
1307 drop_percent = 0;
1308 }
1309 else
1310 {
1311 LOG (GNUNET_ERROR_TYPE_WARNING, "**************************************\n");
1312 LOG (GNUNET_ERROR_TYPE_WARNING, "Cadet is running with DROP enabled.\n");
1313 LOG (GNUNET_ERROR_TYPE_WARNING, "This is NOT a good idea!\n");
1314 LOG (GNUNET_ERROR_TYPE_WARNING, "Remove DROP_PERCENT from config file.\n");
1315 LOG (GNUNET_ERROR_TYPE_WARNING, "**************************************\n");
1316 }
1318 c);
1320 NULL);
1322 /* FIXME: optimize code to allow GNUNET_YES here! */
1324 GNUNET_NO);
1326 GNUNET_NO);
1328 GNUNET_YES);
1330 GNUNET_YES);
1331 GCH_init (c);
1332 GCD_init (c);
1333 GCO_init (c);
1335 "CADET started for peer %s\n",
1337}
1338
1339
1345 "cadet",
1347 &run,
1350 NULL,
1351 GNUNET_MQ_hd_fixed_size (port_open,
1354 NULL),
1355 GNUNET_MQ_hd_fixed_size (port_close,
1358 NULL),
1359 GNUNET_MQ_hd_fixed_size (channel_create,
1362 NULL),
1366 NULL),
1367 GNUNET_MQ_hd_var_size (local_data,
1370 NULL),
1371 GNUNET_MQ_hd_fixed_size (local_ack,
1373 struct GNUNET_CADET_LocalAck,
1374 NULL),
1377 struct GNUNET_MessageHeader,
1378 NULL),
1379 GNUNET_MQ_hd_fixed_size (show_path,
1382 NULL),
1383 GNUNET_MQ_hd_fixed_size (info_tunnels,
1385 struct GNUNET_MessageHeader,
1386 NULL),
1387 GNUNET_MQ_hd_fixed_size (drop_message,
1390 NULL),
1392
1393/* end of gnunet-service-cadet-new.c */
struct GNUNET_GETOPT_CommandLineOption options[]
Definition 002.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.
static struct GNUNET_CADET_Channel * ch
Channel handle.
struct GNUNET_HashCode key
The key used in the DHT.
struct GNUNET_SCHEDULER_Task * shutdown_task
static struct GNUNET_SCHEDULER_Task * t
Main task.
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.
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 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.
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.
struct GNUNET_PILS_Handle * pils
Handle to the pils service.
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 my_identity
Identity of this peer.
static struct GNUNET_Process * p
Helper process we started.
Definition gnunet-uri.c:38
const struct GNUNET_PeerIdentity * GNUNET_PILS_get_identity(const struct GNUNET_PILS_Handle *handle)
Return the current peer identity of a given handle.
Definition pils_api.c:875
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.
#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:337
#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.
#define GNUNET_MQ_msg(mvar, type)
Allocate a GNUNET_MQ_Envelope.
#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.
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:1345
#define GNUNET_SERVICE_MAIN(pd, service_name, service_options, init_cb, connect_cb, disconnect_cb, cls,...)
Creates the "main" function for a GNUnet service.
void GNUNET_SERVICE_client_drop(struct GNUNET_SERVICE_Client *c)
Ask the server to disconnect from the given client.
Definition service.c:2463
void GNUNET_SERVICE_client_continue(struct GNUNET_SERVICE_Client *c)
Continue receiving further messages from the given client.
Definition service.c:2434
@ 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.
static struct GNUNET_MQ_Handle * mq
Our connection to the resolver service, created on-demand, but then persists until error or shutdown.
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.
A 512-bit hashcode.
Handle to a message queue.
Definition mq.c:87
Header for all communications.
A handle for the PILS service.
Definition pils_api.c:86
The identity of the host (wraps the signing key of the peer).
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.