GNUnet 0.26.2-113-ged4734898
 
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 return;
489
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,
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;
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
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 c);
1295 NULL);
1297 /* FIXME: optimize code to allow GNUNET_YES here! */
1299 GNUNET_NO);
1301 GNUNET_NO);
1303 GNUNET_YES);
1305 GNUNET_YES);
1306 GCH_init (c);
1307 GCD_init (c);
1308 GCO_init (c);
1310 "CADET started for peer %s\n",
1312}
1313
1314
1320 "cadet",
1322 &run,
1325 NULL,
1326 GNUNET_MQ_hd_fixed_size (port_open,
1329 NULL),
1330 GNUNET_MQ_hd_fixed_size (port_close,
1333 NULL),
1334 GNUNET_MQ_hd_fixed_size (channel_create,
1337 NULL),
1341 NULL),
1342 GNUNET_MQ_hd_var_size (local_data,
1345 NULL),
1346 GNUNET_MQ_hd_fixed_size (local_ack,
1348 struct GNUNET_CADET_LocalAck,
1349 NULL),
1352 struct GNUNET_MessageHeader,
1353 NULL),
1354 GNUNET_MQ_hd_fixed_size (show_path,
1357 NULL),
1358 GNUNET_MQ_hd_fixed_size (info_tunnels,
1360 struct GNUNET_MessageHeader,
1361 NULL),
1362 GNUNET_MQ_hd_fixed_size (drop_message,
1365 NULL),
1367
1368/* 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_PeerIdentity pid
Identity of the peer we transmit to / connect to.
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:727
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: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.
#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:82
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.