2 * OpenVPN -- An application to securely tunnel IP networks
3 * over a single TCP/UDP port, with support for SSL/TLS-based
4 * session authentication and key exchange,
5 * packet encryption, packet authentication, and
8 * Copyright (C) 2002-2005 OpenVPN Solutions LLC <info@openvpn.net>
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License version 2
12 * as published by the Free Software Foundation.
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
19 * You should have received a copy of the GNU General Public License
20 * along with this program (see the file COPYING included with this
21 * distribution); if not, write to the Free Software Foundation, Inc.,
22 * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
26 * The interval_ routines are designed to optimize the calling of a routine
27 * (normally tls_multi_process()) which can be called less frequently
36 #define INTERVAL_DEBUG 0
39 * Designed to limit calls to expensive functions that need to be called
47 time_t future_trigger
;
49 time_t last_test_true
;
52 void interval_init (struct interval
*top
, int horizon
, int refresh
);
56 * last_action less than horizon seconds ago
57 * OR last_test_true more than refresh seconds ago
58 * OR hit future_trigger
62 * set wakeup to the number of seconds until a true return
67 interval_test (struct interval
* top
)
70 const time_t local_now
= now
;
72 if (top
->future_trigger
&& local_now
>= top
->future_trigger
)
75 top
->future_trigger
= 0;
78 if (top
->last_action
+ top
->horizon
> local_now
||
79 top
->last_test_true
+ top
->refresh
<= local_now
||
82 top
->last_test_true
= local_now
;
84 dmsg (D_INTERVAL
, "INTERVAL interval_test true");
95 interval_schedule_wakeup (struct interval
* top
, interval_t
*wakeup
)
97 const time_t local_now
= now
;
98 interval_earliest_wakeup (wakeup
, top
->last_test_true
+ top
->refresh
, local_now
);
99 interval_earliest_wakeup (wakeup
, top
->future_trigger
, local_now
);
101 dmsg (D_INTERVAL
, "INTERVAL interval_schedule wakeup=%d", (int)*wakeup
);
106 * In wakeup seconds, interval_test will return true once.
109 interval_future_trigger (struct interval
* top
, interval_t wakeup
) {
113 dmsg (D_INTERVAL
, "INTERVAL interval_future_trigger %d", (int)wakeup
);
115 top
->future_trigger
= now
+ wakeup
;
120 * Once an action is triggered, interval_test will remain true for
124 interval_action (struct interval
* top
)
127 dmsg (D_INTERVAL
, "INTERVAL action");
129 top
->last_action
= now
;
133 * Measure when n seconds beyond an event have elapsed
140 time_t last
; /* time of last event */
144 event_timeout_defined (const struct event_timeout
* et
)
150 event_timeout_clear (struct event_timeout
* et
)
157 static inline struct event_timeout
158 event_timeout_clear_ret ()
160 struct event_timeout ret
;
161 event_timeout_clear (&ret
);
166 event_timeout_init (struct event_timeout
* et
, interval_t n
, const time_t local_now
)
169 et
->n
= (n
>= 0) ? n
: 0;
170 et
->last
= local_now
;
174 event_timeout_reset (struct event_timeout
* et
)
181 * This is the principal function for testing and triggering recurring
182 * timers and will return true on a timer signal event.
183 * If et_const_retry == ETT_DEFAULT and a signal occurs,
184 * the function will return true and *et will be armed for the
185 * next event. If et_const_retry >= 0 and a signal occurs,
186 * *et will not be touched, but *tv will be set to
187 * minimum (*tv, et_const_retry) for a future re-test,
188 * and the function will return true.
191 #define ETT_DEFAULT (-1)
193 bool event_timeout_trigger (struct event_timeout
*et
,
195 const int et_const_retry
);
198 * Measure time intervals in microseconds
201 #define USEC_TIMER_MAX 60 /* maximum interval size in seconds */
203 #define USEC_TIMER_MAX_USEC (USEC_TIMER_MAX * 1000000)
206 struct timeval start
;
210 #ifdef HAVE_GETTIMEOFDAY
213 usec_timer_start (struct usec_timer
*obj
)
216 gettimeofday (&obj
->start
, NULL
);
220 usec_timer_end (struct usec_timer
*obj
)
222 gettimeofday (&obj
->end
, NULL
);
225 #endif /* HAVE_GETTIMEOFDAY */
228 usec_timer_interval_defined (struct usec_timer
*obj
)
230 return obj
->start
.tv_sec
&& obj
->end
.tv_sec
;
234 usec_timer_interval (struct usec_timer
*obj
)
236 return tv_subtract (&obj
->end
, &obj
->start
, USEC_TIMER_MAX
);
239 #endif /* INTERVAL_H */