123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328 |
- /*
- This file is part of GNUnet.
- Copyright (C) 2001-2017 GNUnet e.V.
- GNUnet is free software: you can redistribute it and/or modify it
- under the terms of the GNU Affero General Public License as published
- by the Free Software Foundation, either version 3 of the License,
- or (at your option) any later version.
- GNUnet is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Affero General Public License for more details.
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
- SPDX-License-Identifier: AGPL3.0-or-later
- */
- /**
- * @file cadet/gnunet-service-cadet.h
- * @brief Information we track per peer.
- * @author Bartlomiej Polot
- * @author Christian Grothoff
- */
- #ifndef GNUNET_SERVICE_CADET_H
- #define GNUNET_SERVICE_CADET_H
- #include "gnunet_util_lib.h"
- #include "cadet_protocol.h"
- /**
- * A client to the CADET service. Each client gets a unique handle.
- */
- struct CadetClient;
- /**
- * A peer in the GNUnet network. Each peer we care about must have one globally
- * unique such handle within this process.
- */
- struct CadetPeer;
- /**
- * Tunnel from us to another peer. There can only be at most one
- * tunnel per peer.
- */
- struct CadetTunnel;
- /**
- * Entry in the message queue of a `struct CadetTunnel`.
- */
- struct CadetTunnelQueueEntry;
- /**
- * A path of peer in the GNUnet network. There must only be at most
- * once such path. Paths may share disjoint prefixes, but must all
- * end at a unique suffix. Paths must also not be proper subsets of
- * other existing paths.
- */
- struct CadetPeerPath;
- /**
- * Entry in a peer path.
- */
- struct CadetPeerPathEntry
- {
- /**
- * DLL of paths where the same @e peer is at the same offset.
- */
- struct CadetPeerPathEntry *next;
- /**
- * DLL of paths where the same @e peer is at the same offset.
- */
- struct CadetPeerPathEntry *prev;
- /**
- * The peer at this offset of the path.
- */
- struct CadetPeer *peer;
- /**
- * Path this entry belongs to.
- */
- struct CadetPeerPath *path;
- /**
- * Connection using this path, or NULL for none.
- */
- struct CadetConnection *cc;
- /**
- * Path's historic score up to this point. Basically, how often did
- * we succeed or fail to use the path up to this entry in a
- * connection. Positive values indicate good experiences, negative
- * values bad experiences. Code updating the score must guard
- * against overflows.
- */
- int score;
- };
- /**
- * Entry in list of connections used by tunnel, with metadata.
- */
- struct CadetTConnection
- {
- /**
- * Next in DLL.
- */
- struct CadetTConnection *next;
- /**
- * Prev in DLL.
- */
- struct CadetTConnection *prev;
- /**
- * Connection handle.
- */
- struct CadetConnection *cc;
- /**
- * Tunnel this connection belongs to.
- */
- struct CadetTunnel *t;
- /**
- * Creation time, to keep oldest connection alive.
- */
- struct GNUNET_TIME_Absolute created;
- /**
- * Connection throughput, to keep fastest connection alive.
- */
- uint32_t throughput;
- /**
- * Is the connection currently ready for transmission?
- */
- int is_ready;
- };
- /**
- * Port opened by a client.
- */
- struct OpenPort
- {
- /**
- * Client that opened the port.
- */
- struct CadetClient *c;
- /**
- * Port number.
- */
- struct GNUNET_HashCode port;
- /**
- * Port hashed with our PID (matches incoming OPEN messages).
- */
- struct GNUNET_HashCode h_port;
- };
- /**
- * Active path through the network (used by a tunnel). There may
- * be at most one connection per path.
- */
- struct CadetConnection;
- /**
- * Description of a segment of a `struct CadetConnection` at the
- * intermediate peers. Routes are basically entries in a peer's
- * routing table for forwarding traffic. At both endpoints, the
- * routes are terminated by a `struct CadetConnection`, which knows
- * the complete `struct CadetPath` that is formed by the individual
- * routes.
- */
- struct CadetRoute;
- /**
- * Logical end-to-end conenction between clients. There can be
- * any number of channels between clients.
- */
- struct CadetChannel;
- /**
- * Handle to our configuration.
- */
- extern const struct GNUNET_CONFIGURATION_Handle *cfg;
- /**
- * Handle to the statistics service.
- */
- extern struct GNUNET_STATISTICS_Handle *stats;
- /**
- * Handle to communicate with ATS.
- */
- extern struct GNUNET_ATS_ConnectivityHandle *ats_ch;
- /**
- * Local peer own ID.
- */
- extern struct GNUNET_PeerIdentity my_full_id;
- /**
- * Own private key.
- */
- extern struct GNUNET_CRYPTO_EddsaPrivateKey *my_private_key;
- /**
- * All ports clients of this peer have opened. Maps from
- * a hashed port to a `struct OpenPort`.
- */
- extern struct GNUNET_CONTAINER_MultiHashMap *open_ports;
- /**
- * Map from `struct GNUNET_CADET_ConnectionTunnelIdentifier`
- * hash codes to `struct CadetConnection` objects.
- */
- extern struct GNUNET_CONTAINER_MultiShortmap *connections;
- /**
- * Map from ports to channels where the ports were closed at the
- * time we got the inbound connection.
- * Indexed by h_port, contains `struct CadetChannel`.
- */
- extern struct GNUNET_CONTAINER_MultiHashMap *loose_channels;
- /**
- * Map from PIDs to `struct CadetPeer` entries.
- */
- extern struct GNUNET_CONTAINER_MultiPeerMap *peers;
- /**
- * How many messages are needed to trigger an AXOLOTL ratchet advance.
- */
- extern unsigned long long ratchet_messages;
- /**
- * How long until we trigger a ratched advance due to time.
- */
- extern struct GNUNET_TIME_Relative ratchet_time;
- /**
- * How frequently do we send KEEPALIVE messages on idle connections?
- */
- extern struct GNUNET_TIME_Relative keepalive_period;
- /**
- * Signal that shutdown is happening: prevent recovery measures.
- */
- extern int shutting_down;
- /**
- * Set to non-zero values to create random drops to test retransmissions.
- */
- extern unsigned long long drop_percent;
- /**
- * Send a message to a client.
- *
- * @param c client to get the message
- * @param env envelope with the message
- */
- void
- GSC_send_to_client (struct CadetClient *c,
- struct GNUNET_MQ_Envelope *env);
- /**
- * A channel was destroyed by the other peer. Tell our client.
- *
- * @param c client that lost a channel
- * @param ccn channel identification number for the client
- * @param ch the channel object
- */
- void
- GSC_handle_remote_channel_destroy (struct CadetClient *c,
- struct GNUNET_CADET_ClientChannelNumber ccn,
- struct CadetChannel *ch);
- /**
- * A client that created a loose channel that was not bound to a port
- * disconnected, drop it from the #loose_channels list.
- *
- * @param h_port the hashed port the channel was trying to bind to
- * @param ch the channel that was lost
- */
- void
- GSC_drop_loose_channel (const struct GNUNET_HashCode *h_port,
- struct CadetChannel *ch);
- /**
- * Bind incoming channel to this client, and notify client
- * about incoming connection.
- *
- * @param c client to bind to
- * @param ch channel to be bound
- * @param dest peer that establishes the connection
- * @param port port number
- * @param options options
- * @return local channel number assigned to the new client
- */
- struct GNUNET_CADET_ClientChannelNumber
- GSC_bind (struct CadetClient *c,
- struct CadetChannel *ch,
- struct CadetPeer *dest,
- const struct GNUNET_HashCode *port,
- uint32_t options);
- /**
- * Return identifier for a client as a string.
- *
- * @param c client to identify
- * @return string for debugging
- */
- const char *
- GSC_2s (struct CadetClient *c);
- #endif
|