Line data Source code
1 : /* Copyright (c) 2015-2021, The Tor Project, Inc. */ 2 : /* See LICENSE for licensing information */ 3 : 4 : /** 5 : * @file periodic.h 6 : * @brief Header for periodic.c 7 : **/ 8 : 9 : #ifndef TOR_PERIODIC_H 10 : #define TOR_PERIODIC_H 11 : 12 : #define PERIODIC_EVENT_NO_UPDATE (-1) 13 : 14 : /* Tor roles for which a periodic event item is for. An event can be for 15 : * multiple roles, they can be combined. */ 16 : #define PERIODIC_EVENT_ROLE_CLIENT (1U << 0) 17 : #define PERIODIC_EVENT_ROLE_RELAY (1U << 1) 18 : #define PERIODIC_EVENT_ROLE_BRIDGE (1U << 2) 19 : #define PERIODIC_EVENT_ROLE_DIRAUTH (1U << 3) 20 : #define PERIODIC_EVENT_ROLE_BRIDGEAUTH (1U << 4) 21 : #define PERIODIC_EVENT_ROLE_HS_SERVICE (1U << 5) 22 : #define PERIODIC_EVENT_ROLE_DIRSERVER (1U << 6) 23 : #define PERIODIC_EVENT_ROLE_CONTROLEV (1U << 7) 24 : 25 : #define PERIODIC_EVENT_ROLE_NET_PARTICIPANT (1U << 8) 26 : #define PERIODIC_EVENT_ROLE_ALL (1U << 9) 27 : 28 : /* Helper macro to make it a bit less annoying to defined groups of roles that 29 : * are often used. */ 30 : 31 : /* Router that is a Bridge or Relay. */ 32 : #define PERIODIC_EVENT_ROLE_ROUTER \ 33 : (PERIODIC_EVENT_ROLE_BRIDGE | PERIODIC_EVENT_ROLE_RELAY) 34 : /* Authorities that is both bridge and directory. */ 35 : #define PERIODIC_EVENT_ROLE_AUTHORITIES \ 36 : (PERIODIC_EVENT_ROLE_BRIDGEAUTH | PERIODIC_EVENT_ROLE_DIRAUTH) 37 : 38 : /* 39 : * Event flags which can change the behavior of an event. 40 : */ 41 : 42 : /* Indicate that the event needs the network meaning that if we are in 43 : * DisableNetwork or hibernation mode, the event won't be enabled. This obey 44 : * the net_is_disabled() check. */ 45 : #define PERIODIC_EVENT_FLAG_NEED_NET (1U << 0) 46 : 47 : /* Indicate that if the event is enabled, it needs to be run once before 48 : * it becomes disabled. 49 : */ 50 : #define PERIODIC_EVENT_FLAG_RUN_ON_DISABLE (1U << 1) 51 : 52 : /** Callback function for a periodic event to take action. The return value 53 : * influences the next time the function will get called. Return 54 : * PERIODIC_EVENT_NO_UPDATE to not update <b>last_action_time</b> and be polled 55 : * again in the next second. If a positive value is returned it will update the 56 : * interval time. */ 57 : typedef int (*periodic_event_helper_t)(time_t now, 58 : const or_options_t *options); 59 : 60 : struct mainloop_event_t; 61 : 62 : /** A single item for the periodic-events-function table. */ 63 : typedef struct periodic_event_item_t { 64 : periodic_event_helper_t fn; /**< The function to run the event */ 65 : time_t last_action_time; /**< The last time the function did something */ 66 : struct mainloop_event_t *ev; /**< Libevent callback we're using to implement 67 : * this */ 68 : const char *name; /**< Name of the function -- for debug */ 69 : 70 : /* Bitmask of roles define above for which this event applies. */ 71 : uint32_t roles; 72 : /* Bitmask of flags which can change the behavior of the event. */ 73 : uint32_t flags; 74 : /* Indicate that this event has been enabled that is scheduled. */ 75 : unsigned int enabled : 1; 76 : } periodic_event_item_t; 77 : 78 : /** events will get their interval from first execution */ 79 : #ifndef COCCI 80 : #define PERIODIC_EVENT(fn, r, f) { fn##_callback, 0, NULL, #fn, r, f, 0 } 81 : #define END_OF_PERIODIC_EVENTS { NULL, 0, NULL, NULL, 0, 0, 0 } 82 : #endif 83 : 84 : /* Return true iff the given event was setup before thus is enabled to be 85 : * scheduled. */ 86 : static inline int 87 8703 : periodic_event_is_enabled(const periodic_event_item_t *item) 88 : { 89 8703 : return item->enabled; 90 : } 91 : 92 : void periodic_event_launch(periodic_event_item_t *event); 93 : void periodic_event_connect(periodic_event_item_t *event); 94 : //void periodic_event_disconnect(periodic_event_item_t *event); 95 : void periodic_event_reschedule(periodic_event_item_t *event); 96 : void periodic_event_enable(periodic_event_item_t *event); 97 : void periodic_event_disable(periodic_event_item_t *event); 98 : void periodic_event_schedule_and_disable(periodic_event_item_t *event); 99 : 100 : void periodic_events_register(periodic_event_item_t *item); 101 : void periodic_events_connect_all(void); 102 : void periodic_events_reset_all(void); 103 : periodic_event_item_t *periodic_events_find(const char *name); 104 : void periodic_events_rescan_by_roles(int roles, bool net_disabled); 105 : void periodic_events_disconnect_all(void); 106 : 107 : int safe_timer_diff(time_t now, time_t next); 108 : 109 : #endif /* !defined(TOR_PERIODIC_H) */