tor

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

relay_msg.h (2427B)


      1 /* Copyright (c) 2023, The Tor Project, Inc. */
      2 /* See LICENSE for licensing information */
      3 
      4 /**
      5 * \file relay_msg.h
      6 * \brief Header file for relay_msg.c.
      7 **/
      8 
      9 #ifndef TOR_RELAY_MSG_H
     10 #define TOR_RELAY_MSG_H
     11 
     12 #include "core/or/or.h"
     13 
     14 #include "core/or/relay_msg_st.h"
     15 
     16 /* Relay message */
     17 void relay_msg_free_(relay_msg_t *msg);
     18 void relay_msg_clear(relay_msg_t *msg);
     19 relay_msg_t *relay_msg_copy(const relay_msg_t *msg);
     20 
     21 int relay_msg_encode_cell(relay_cell_fmt_t format,
     22                          const relay_msg_t *msg,
     23                          cell_t *cell_out) ATTR_WUR;
     24 int relay_msg_decode_cell_in_place(relay_cell_fmt_t format,
     25                                   const cell_t *cell,
     26                                   relay_msg_t *msg_out) ATTR_WUR;
     27 relay_msg_t *relay_msg_decode_cell(
     28                          relay_cell_fmt_t format,
     29                          const cell_t *cell) ATTR_WUR;
     30 
     31 #define relay_msg_free(msg) \
     32  FREE_AND_NULL(relay_msg_t, relay_msg_free_, (msg))
     33 
     34 /* Getters */
     35 
     36 /*
     37 * NOTE: The following are inlined for performance reasons. These values are
     38 * accessed everywhere and so, even if not expensive, we avoid a function call.
     39 */
     40 
     41 /** Return true iff 'cmd' uses a stream ID when using
     42 * the v1 relay message format. */
     43 static bool
     44 relay_cmd_expects_streamid_in_v1(uint8_t relay_command)
     45 {
     46  switch (relay_command) {
     47    case RELAY_COMMAND_BEGIN:
     48    case RELAY_COMMAND_BEGIN_DIR:
     49    case RELAY_COMMAND_CONNECTED:
     50    case RELAY_COMMAND_DATA:
     51    case RELAY_COMMAND_END:
     52    case RELAY_COMMAND_RESOLVE:
     53    case RELAY_COMMAND_RESOLVED:
     54    case RELAY_COMMAND_XOFF:
     55    case RELAY_COMMAND_XON:
     56      return true;
     57    default:
     58      return false;
     59  }
     60 }
     61 
     62 /** Return the size of the relay cell payload for the given relay
     63 * cell format. */
     64 static inline size_t
     65 relay_cell_max_payload_size(relay_cell_fmt_t format,
     66                            uint8_t relay_command)
     67 {
     68  switch (format) {
     69    case RELAY_CELL_FORMAT_V0:
     70      return CELL_PAYLOAD_SIZE - RELAY_HEADER_SIZE_V0;
     71    case RELAY_CELL_FORMAT_V1: {
     72      if (relay_cmd_expects_streamid_in_v1(relay_command)) {
     73        return CELL_PAYLOAD_SIZE - RELAY_HEADER_SIZE_V1_WITH_STREAM_ID;
     74      } else {
     75        return CELL_PAYLOAD_SIZE - RELAY_HEADER_SIZE_V1_NO_STREAM_ID;
     76      }
     77    }
     78    default:
     79      tor_fragile_assert();
     80      return 0;
     81  }
     82 }
     83 
     84 #ifdef RELAY_MSG_PRIVATE
     85 
     86 #endif /* RELAY_MSG_PRIVATE */
     87 
     88 #endif /* TOR_RELAY_MSG_H */