tor

The Tor anonymity network
git clone https://git.dasho.dev/tor.git
Log | Files | Refs | README | LICENSE

pubsub_builder_st.h (5064B)


      1 /* Copyright (c) 2001, Matej Pfajfar.
      2 * Copyright (c) 2001-2004, Roger Dingledine.
      3 * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
      4 * Copyright (c) 2007-2021, The Tor Project, Inc. */
      5 /* See LICENSE for licensing information */
      6 
      7 /**
      8 * @file pubsub_builder_st.h
      9 *
     10 * @brief private structures used for configuring dispatchers and messages.
     11 */
     12 
     13 #ifndef TOR_PUBSUB_BUILDER_ST_H
     14 #define TOR_PUBSUB_BUILDER_ST_H
     15 
     16 #ifdef PUBSUB_PRIVATE
     17 
     18 #include <stdbool.h>
     19 #include <stddef.h>
     20 
     21 struct dispatch_cfg_t;
     22 struct smartlist_t;
     23 struct pub_binding_t;
     24 
     25 /**
     26 * Configuration for a single publication or subscription request.
     27 *
     28 * These can be stored while the dispatcher is in use, but are only used for
     29 * setup, teardown, and debugging.
     30 *
     31 * There are various fields in this request describing the message; all of
     32 * them must match other descriptions of the message, or a bug has occurred.
     33 **/
     34 typedef struct pubsub_cfg_t {
     35  /** True if this is a publishing request; false for a subscribing request. */
     36  bool is_publish;
     37  /** The system making this request. */
     38  subsys_id_t subsys;
     39  /** The channel on which the message is to be sent. */
     40  channel_id_t channel;
     41  /** The message ID to be sent or received. */
     42  message_id_t msg;
     43  /** The C type associated with the message. */
     44  msg_type_id_t type;
     45  /** One or more DISP_FLAGS_* items, combined with bitwise OR. */
     46  unsigned flags;
     47 
     48  /**
     49   * Publishing only: a pub_binding object that will receive the binding for
     50   * this request.  We will finish filling this in when the dispatcher is
     51   * constructed, so that the subsystem can publish then and not before.
     52   */
     53  struct pub_binding_t *pub_binding;
     54 
     55  /**
     56   * Subscribing only: a function to receive message objects for this request.
     57   */
     58  recv_fn_t recv_fn;
     59 
     60  /** The file from which this message was configured */
     61  const char *added_by_file;
     62  /** The line at which this message was configured */
     63  unsigned added_by_line;
     64 } pubsub_cfg_t;
     65 
     66 /**
     67 * Configuration request for a single C type.
     68 *
     69 * These are stored while the dispatcher is in use, but are only used for
     70 * setup, teardown, and debugging.
     71 **/
     72 typedef struct pubsub_type_cfg_t {
     73  /**
     74   * The identifier for this type.
     75   */
     76  msg_type_id_t type;
     77  /**
     78   * Functions to use when manipulating the type.
     79   */
     80  dispatch_typefns_t fns;
     81 
     82  /** The subsystem that configured this type. */
     83  subsys_id_t subsys;
     84  /** The file from which this type was configured */
     85  const char *added_by_file;
     86  /** The line at which this type was configured */
     87  unsigned added_by_line;
     88 } pubsub_type_cfg_t;
     89 
     90 /**
     91 * The set of configuration requests for a dispatcher, as made by various
     92 * subsystems.
     93 **/
     94 struct pubsub_items_t {
     95  /** List of pubsub_cfg_t. */
     96  struct smartlist_t *items;
     97  /** List of pubsub_type_cfg_t. */
     98  struct smartlist_t *type_items;
     99 };
    100 
    101 /**
    102 * Type used to construct a dispatcher.  We use this type to build up the
    103 * configuration for a dispatcher, and then pass ownership of that
    104 * configuration to the newly constructed dispatcher.
    105 **/
    106 struct pubsub_builder_t {
    107  /** Number of outstanding pubsub_connector_t objects pointing to this
    108   * pubsub_builder_t. */
    109  int n_connectors;
    110  /** Number of errors encountered while constructing this object so far. */
    111  int n_errors;
    112  /** In-progress configuration that we're constructing, as a list of the
    113   * requests that have been made. */
    114  struct pubsub_items_t *items;
    115  /** In-progress configuration that we're constructing, in a form that can
    116   * be converted to a dispatch_t. */
    117  struct dispatch_cfg_t *cfg;
    118 };
    119 
    120 /**
    121 * Type given to a subsystem when adding connections to a pubsub_builder_t.
    122 * We use this type to force each subsystem to get blamed for the
    123 * publications, subscriptions, and types that it adds.
    124 **/
    125 struct pubsub_connector_t {
    126  /** The pubsub_builder that this connector refers to. */
    127  struct pubsub_builder_t *builder;
    128  /** The subsystem that has been given this connector. */
    129  subsys_id_t subsys_id;
    130 };
    131 
    132 /**
    133 * Helper structure used when constructing a dispatcher that sorts the
    134 * pubsub_cfg_t objects in various ways.
    135 **/
    136 typedef struct pubsub_adjmap_t {
    137  /* XXXX The next three fields are currently constructed but not yet
    138   * XXXX used. I believe we'll want them in the future, though. -nickm
    139   */
    140  /** Number of subsystems; length of the *_by_subsys arrays. */
    141  size_t n_subsystems;
    142  /** Array of lists of publisher pubsub_cfg_t objects, indexed by
    143   * subsystem. */
    144  struct smartlist_t **pub_by_subsys;
    145  /** Array of lists of subscriber pubsub_cfg_t objects, indexed by
    146   * subsystem. */
    147  struct smartlist_t **sub_by_subsys;
    148 
    149  /** Number of message IDs; length of the *_by_msg arrays. */
    150  size_t n_msgs;
    151  /** Array of lists of publisher pubsub_cfg_t objects, indexed by
    152   * message ID. */
    153  struct smartlist_t **pub_by_msg;
    154  /** Array of lists of subscriber pubsub_cfg_t objects, indexed by
    155   * message ID. */
    156  struct smartlist_t **sub_by_msg;
    157 } pubsub_adjmap_t;
    158 
    159 #endif /* defined(PUBSUB_PRIVATE) */
    160 
    161 #endif /* !defined(TOR_PUBSUB_BUILDER_ST_H) */