gnunet

Main GNUnet Logic
Log | Files | Refs | Submodules | README | LICENSE

gnunet-service-core.h (5750B)


      1 /*
      2      This file is part of GNUnet.
      3      Copyright (C) 2009, 2010, 2011, 2026 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 
     21 /**
     22  * @file core/gnunet-service-core.h
     23  * @brief Globals for gnunet-service-core
     24  * @author Christian Grothoff
     25  */
     26 #ifndef GNUNET_SERVICE_CORE_H
     27 #define GNUNET_SERVICE_CORE_H
     28 
     29 #include "gnunet_statistics_service.h"
     30 #include "gnunet_core_service.h"
     31 #include "gnunet_pils_service.h"
     32 #include "core.h"
     33 
     34 
     35 /**
     36  * Opaque handle to a client.
     37  */
     38 struct GSC_Client;
     39 
     40 
     41 /**
     42  * Record kept for each request for transmission issued by a
     43  * client that is still pending. (This struct is used by
     44  * both the 'CLIENTS' and 'SESSIONS' subsystems.)
     45  */
     46 struct GSC_ClientActiveRequest
     47 {
     48   /**
     49    * Active requests are kept in a doubly-linked list of
     50    * the respective target peer.
     51    */
     52   struct GSC_ClientActiveRequest *next;
     53 
     54   /**
     55    * Active requests are kept in a doubly-linked list of
     56    * the respective target peer.
     57    */
     58   struct GSC_ClientActiveRequest *prev;
     59 
     60   /**
     61    * Handle to the client.
     62    */
     63   struct GSC_Client *client_handle;
     64 
     65   /**
     66    * Which peer is the message going to be for?
     67    */
     68   struct GNUNET_PeerIdentity target;
     69 
     70   /**
     71    * At what time did we first see this request?
     72    */
     73   struct GNUNET_TIME_Absolute received_time;
     74 
     75   /**
     76    * By what time would the client want to see this message out?
     77    */
     78   struct GNUNET_TIME_Absolute deadline;
     79 
     80   /**
     81    * How important is this request.
     82    */
     83   enum GNUNET_MQ_PriorityPreferences priority;
     84 
     85   /**
     86    * Has this request been solicited yet?
     87    */
     88   int was_solicited;
     89 
     90   /**
     91    * How many bytes does the client intend to send?
     92    */
     93   uint16_t msize;
     94 
     95   /**
     96    * Unique request ID (in big endian).
     97    */
     98   uint16_t smr_id;
     99 };
    100 
    101 
    102 /**
    103  * Tell a client that we are ready to receive the message.
    104  *
    105  * @param car request that is now ready; the responsibility
    106  *        for the handle remains shared between CLIENTS
    107  *        and SESSIONS after this call.
    108  */
    109 void
    110 GSC_CLIENTS_solicit_request (struct GSC_ClientActiveRequest *car);
    111 
    112 
    113 /**
    114  * We will never be ready to transmit the given message in (disconnect
    115  * or invalid request).  Frees resources associated with @a car.  We
    116  * don't explicitly tell the client, it'll learn with the disconnect
    117  * (or violated the protocol).
    118  *
    119  * @param car request that now permanently failed; the
    120  *        responsibility for the handle is now returned
    121  *        to CLIENTS (SESSIONS is done with it).
    122  * @param drop_client #GNUNET_YES if the client violated the protocol
    123  *        and we should thus drop the connection
    124  */
    125 void
    126 GSC_CLIENTS_reject_request (struct GSC_ClientActiveRequest *car,
    127                             int drop_client);
    128 
    129 
    130 /**
    131  * Notify a particular client about a change to existing connection to
    132  * one of our neighbours (check if the client is interested).  Called
    133  * from #GSC_SESSIONS_notify_client_about_sessions().
    134  *
    135  * @param client client to notify
    136  * @param neighbour identity of the neighbour that changed status
    137  * @param tmap_old previous type map for the neighbour, NULL for connect
    138  * @param tmap_new updated type map for the neighbour, NULL for disconnect
    139  * @param class the class of the neighbour that changed status
    140  */
    141 void
    142 GSC_CLIENTS_notify_client_about_neighbour (
    143   struct GSC_Client *client,
    144   const struct GNUNET_PeerIdentity *neighbour,
    145   enum GNUNET_CORE_PeerClass class);
    146 
    147 
    148 /**
    149  * Deliver P2P message to interested clients.  Caller must have checked
    150  * that the sending peer actually lists the given message type as one
    151  * of its types.
    152  *
    153  * @param sender peer who sent us the message
    154  * @param msg the message
    155  * @param msize number of bytes to transmit
    156  * @param options options for checking which clients should
    157  *        receive the message
    158  */
    159 void
    160 GSC_CLIENTS_deliver_message (const struct GNUNET_PeerIdentity *sender,
    161                              const struct GNUNET_MessageHeader *msg,
    162                              uint16_t msize,
    163                              uint32_t options);
    164 
    165 
    166 /**
    167  * Notify all clients about a change to existing session.
    168  * Called from SESSIONS whenever there is a change in sessions
    169  * or types processed by the respective peer.
    170  *
    171  * @param neighbour identity of the neighbour that changed status
    172  * @param tmap_old previous type map for the neighbour, NULL for connect
    173  * @param tmap_new updated type map for the neighbour, NULL for disconnect
    174  * @param class the class of the neighbour that changed status
    175  */
    176 void
    177 GSC_CLIENTS_notify_clients_about_neighbour (
    178   const struct GNUNET_PeerIdentity *neighbour,
    179   enum GNUNET_CORE_PeerClass class);
    180 
    181 
    182 /**
    183  * This function is called from GSC_KX_init() once it got its peer id from
    184  * pils.
    185  * @param cls closure to the callback
    186  */
    187 void
    188 GSC_complete_initialization_cb (void);
    189 
    190 
    191 /**
    192  * Our configuration.
    193  */
    194 extern const struct GNUNET_CONFIGURATION_Handle *GSC_cfg;
    195 
    196 /**
    197  * For creating statistics.
    198  */
    199 extern struct GNUNET_STATISTICS_Handle *GSC_stats;
    200 
    201 /**
    202  * Our Pils service.
    203  */
    204 extern struct GNUNET_PILS_Handle *GSC_pils;
    205 
    206 /**
    207  * Our peer class
    208  */
    209 static enum GNUNET_CORE_PeerClass GSC_peer_class;
    210 
    211 
    212 #endif