xref: /openbsd-src/sbin/iked/timer.c (revision c6d32703678a653345b1406f145d7afc17d97a4e)
1*c6d32703Smikeb /*	$OpenBSD: timer.c,v 1.13 2016/09/13 10:49:52 mikeb Exp $	*/
2a183e813Sreyk 
3a183e813Sreyk /*
4fcebd35dSreyk  * Copyright (c) 2010-2013 Reyk Floeter <reyk@openbsd.org>
5a183e813Sreyk  *
6a183e813Sreyk  * Permission to use, copy, modify, and distribute this software for any
7a183e813Sreyk  * purpose with or without fee is hereby granted, provided that the above
8a183e813Sreyk  * copyright notice and this permission notice appear in all copies.
9a183e813Sreyk  *
10a183e813Sreyk  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11a183e813Sreyk  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12a183e813Sreyk  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13a183e813Sreyk  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14a183e813Sreyk  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15a183e813Sreyk  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16a183e813Sreyk  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17a183e813Sreyk  */
18a183e813Sreyk 
19a183e813Sreyk #include <sys/queue.h>
20a183e813Sreyk #include <sys/socket.h>
21a183e813Sreyk #include <sys/uio.h>
22a183e813Sreyk 
23a183e813Sreyk #include <stdio.h>
24a183e813Sreyk #include <stdlib.h>
25a183e813Sreyk #include <unistd.h>
26a183e813Sreyk #include <string.h>
27a183e813Sreyk #include <errno.h>
28a183e813Sreyk #include <fcntl.h>
29a183e813Sreyk #include <ctype.h>
30a183e813Sreyk #include <event.h>
31a183e813Sreyk 
32a183e813Sreyk #include "iked.h"
33a183e813Sreyk 
34e487e0e8Smikeb void	 timer_callback(int, short, void *);
35a183e813Sreyk 
36a183e813Sreyk void
timer_set(struct iked * env,struct iked_timer * tmr,void (* cb)(struct iked *,void *),void * arg)37b3eeacebSmikeb timer_set(struct iked *env, struct iked_timer *tmr,
38e71a3409Smikeb     void (*cb)(struct iked *, void *), void *arg)
39e71a3409Smikeb {
40*c6d32703Smikeb 	if (evtimer_initialized(&tmr->tmr_ev) &&
41*c6d32703Smikeb 	    evtimer_pending(&tmr->tmr_ev, NULL))
42*c6d32703Smikeb 		evtimer_del(&tmr->tmr_ev);
43*c6d32703Smikeb 
44e71a3409Smikeb 	tmr->tmr_env = env;
45e71a3409Smikeb 	tmr->tmr_cb = cb;
46e71a3409Smikeb 	tmr->tmr_cbarg = arg;
47e71a3409Smikeb 	evtimer_set(&tmr->tmr_ev, timer_callback, tmr);
48e71a3409Smikeb }
49e71a3409Smikeb 
50e71a3409Smikeb void
timer_add(struct iked * env,struct iked_timer * tmr,int timeout)51b3eeacebSmikeb timer_add(struct iked *env, struct iked_timer *tmr, int timeout)
52a183e813Sreyk {
53e487e0e8Smikeb 	struct timeval		 tv = { timeout };
54a183e813Sreyk 
55e487e0e8Smikeb 	evtimer_add(&tmr->tmr_ev, &tv);
56a183e813Sreyk }
57a183e813Sreyk 
58a183e813Sreyk void
timer_del(struct iked * env,struct iked_timer * tmr)59b3eeacebSmikeb timer_del(struct iked *env, struct iked_timer *tmr)
603476d919Smikeb {
61b3eeacebSmikeb 	if (tmr->tmr_env == env && tmr->tmr_cb &&
62b3eeacebSmikeb 	    evtimer_initialized(&tmr->tmr_ev))
633476d919Smikeb 		evtimer_del(&tmr->tmr_ev);
643476d919Smikeb }
653476d919Smikeb 
663476d919Smikeb void
timer_callback(int fd,short event,void * arg)67e487e0e8Smikeb timer_callback(int fd, short event, void *arg)
68a183e813Sreyk {
69e487e0e8Smikeb 	struct iked_timer	*tmr = arg;
70a183e813Sreyk 
71e487e0e8Smikeb 	if (tmr->tmr_cb)
72e487e0e8Smikeb 		tmr->tmr_cb(tmr->tmr_env, tmr->tmr_cbarg);
73a183e813Sreyk }
74