blob: 8793f5a7b820e981080123ae652a31b345cf225a [file] [log] [blame]
Jozsef Kadlecsik72205fc2011-02-01 15:33:17 +01001#ifndef _IP_SET_TIMEOUT_H
2#define _IP_SET_TIMEOUT_H
3
Jozsef Kadlecsik075e64c2013-04-27 14:28:55 +02004/* Copyright (C) 2003-2013 Jozsef Kadlecsik <kadlec@blackhole.kfki.hu>
Jozsef Kadlecsik72205fc2011-02-01 15:33:17 +01005 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License version 2 as
8 * published by the Free Software Foundation.
9 */
10
11#ifdef __KERNEL__
12
13/* How often should the gc be run by default */
14#define IPSET_GC_TIME (3 * 60)
15
16/* Timeout period depending on the timeout value of the given set */
17#define IPSET_GC_PERIOD(timeout) \
18 ((timeout/3) ? min_t(u32, (timeout)/3, IPSET_GC_TIME) : 1)
19
Jozsef Kadlecsik075e64c2013-04-27 14:28:55 +020020/* Entry is set with no timeout value */
21#define IPSET_ELEM_PERMANENT 0
22
23/* Set is defined with timeout support: timeout value may be 0 */
Jozsef Kadlecsik72205fc2011-02-01 15:33:17 +010024#define IPSET_NO_TIMEOUT UINT_MAX
25
Jozsef Kadlecsikca134ce2013-09-07 00:10:07 +020026#define ip_set_adt_opt_timeout(opt, set) \
27((opt)->ext.timeout != IPSET_NO_TIMEOUT ? (opt)->ext.timeout : (set)->timeout)
Jozsef Kadlecsikac8cc922011-06-16 18:42:40 +020028
Jozsef Kadlecsik72205fc2011-02-01 15:33:17 +010029static inline unsigned int
30ip_set_timeout_uget(struct nlattr *tb)
31{
32 unsigned int timeout = ip_set_get_h32(tb);
33
Jozsef Kadlecsik127f5592012-05-07 02:35:44 +000034 /* Normalize to fit into jiffies */
35 if (timeout > UINT_MAX/MSEC_PER_SEC)
36 timeout = UINT_MAX/MSEC_PER_SEC;
37
Jozsef Kadlecsik72205fc2011-02-01 15:33:17 +010038 /* Userspace supplied TIMEOUT parameter: adjust crazy size */
39 return timeout == IPSET_NO_TIMEOUT ? IPSET_NO_TIMEOUT - 1 : timeout;
40}
41
Jozsef Kadlecsik72205fc2011-02-01 15:33:17 +010042static inline bool
Jozsef Kadlecsikb57b2d12015-06-13 14:22:25 +020043ip_set_timeout_expired(unsigned long *t)
Jozsef Kadlecsik72205fc2011-02-01 15:33:17 +010044{
Jozsef Kadlecsikb57b2d12015-06-13 14:22:25 +020045 return *t != IPSET_ELEM_PERMANENT && time_is_before_jiffies(*t);
Jozsef Kadlecsik72205fc2011-02-01 15:33:17 +010046}
47
Jozsef Kadlecsik075e64c2013-04-27 14:28:55 +020048static inline void
Jozsef Kadlecsikb57b2d12015-06-13 14:22:25 +020049ip_set_timeout_set(unsigned long *timeout, u32 value)
Jozsef Kadlecsik72205fc2011-02-01 15:33:17 +010050{
Jozsef Kadlecsikb57b2d12015-06-13 14:22:25 +020051 unsigned long t;
52
53 if (!value) {
Jozsef Kadlecsik075e64c2013-04-27 14:28:55 +020054 *timeout = IPSET_ELEM_PERMANENT;
55 return;
56 }
Jozsef Kadlecsik72205fc2011-02-01 15:33:17 +010057
Jozsef Kadlecsikb57b2d12015-06-13 14:22:25 +020058 t = msecs_to_jiffies(value * MSEC_PER_SEC) + jiffies;
59 if (t == IPSET_ELEM_PERMANENT)
Jozsef Kadlecsik72205fc2011-02-01 15:33:17 +010060 /* Bingo! :-) */
Jozsef Kadlecsikb57b2d12015-06-13 14:22:25 +020061 t--;
62 *timeout = t;
Jozsef Kadlecsik72205fc2011-02-01 15:33:17 +010063}
64
65static inline u32
Jozsef Kadlecsik075e64c2013-04-27 14:28:55 +020066ip_set_timeout_get(unsigned long *timeout)
Jozsef Kadlecsik72205fc2011-02-01 15:33:17 +010067{
Jozsef Kadlecsik6e02c062018-05-31 18:45:21 +020068 u32 t;
69
70 if (*timeout == IPSET_ELEM_PERMANENT)
71 return 0;
72
73 t = jiffies_to_msecs(*timeout - jiffies)/MSEC_PER_SEC;
74 /* Zero value in userspace means no timeout */
75 return t == 0 ? 1 : t;
Jozsef Kadlecsik72205fc2011-02-01 15:33:17 +010076}
Jozsef Kadlecsik72205fc2011-02-01 15:33:17 +010077
78#endif /* __KERNEL__ */
Jozsef Kadlecsik72205fc2011-02-01 15:33:17 +010079#endif /* _IP_SET_TIMEOUT_H */