msgtypes.h (2079B)
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 msgtypes.h 9 * \brief Types used for messages in the dispatcher code. 10 **/ 11 12 #ifndef TOR_DISPATCH_MSGTYPES_H 13 #define TOR_DISPATCH_MSGTYPES_H 14 15 #include <stdint.h> 16 17 #include "ext/tor_queue.h" 18 19 /** 20 * These types are aliases for subsystems, channels, and message IDs. 21 **/ 22 typedef uint16_t subsys_id_t; 23 typedef uint16_t channel_id_t; 24 typedef uint16_t message_id_t; 25 26 /** 27 * This identifies a C type that can be sent along with a message. 28 **/ 29 typedef uint16_t msg_type_id_t; 30 31 /** 32 * An ID value returned for *_type_t when none exists. 33 */ 34 #define ERROR_ID 65535 35 36 /** 37 * Auxiliary (untyped) data sent along with a message. 38 * 39 * We define this as a union of a pointer and a u64, so that the integer 40 * types will have the same range across platforms. 41 **/ 42 typedef union { 43 void *ptr; 44 uint64_t u64; 45 } msg_aux_data_t; 46 47 /** 48 * Structure of a received message. 49 **/ 50 typedef struct msg_t { 51 TOR_SIMPLEQ_ENTRY(msg_t) next; 52 subsys_id_t sender; 53 channel_id_t channel; 54 message_id_t msg; 55 /** We could omit this field, since it is implicit in the message type, but 56 * IMO let's leave it in for safety. */ 57 msg_type_id_t type; 58 /** Untyped auxiliary data. You shouldn't have to mess with this 59 * directly. */ 60 msg_aux_data_t aux_data__; 61 } msg_t; 62 63 /** 64 * A function that a subscriber uses to receive a message. 65 **/ 66 typedef void (*recv_fn_t)(const msg_t *m); 67 68 /** 69 * Table of functions to use for a given C type. Any omitted (NULL) functions 70 * will be treated as no-ops. 71 **/ 72 typedef struct dispatch_typefns_t { 73 /** Release storage held for the auxiliary data of this type. */ 74 void (*free_fn)(msg_aux_data_t); 75 /** Format and return a newly allocated string describing the contents 76 * of this data element. */ 77 char *(*fmt_fn)(msg_aux_data_t); 78 } dispatch_typefns_t; 79 80 #endif /* !defined(TOR_DISPATCH_MSGTYPES_H) */