10 #include <linux/module.h>
13 #include <linux/errno.h>
15 #include <linux/netfilter/ipset/ip_set.h>
17 #include <linux/netfilter/ipset/ip_set_list.h>
19 #define REVISION_MIN 0
20 #define REVISION_MAX 0
59 list_set_timeout(
const struct list_set *map,
u32 id)
63 return ip_set_timeout_test(elem->
timeout);
67 list_set_expired(
const struct list_set *map,
u32 id)
71 return ip_set_timeout_expired(elem->
timeout);
86 for (i = 0; i < map->
size; i++) {
87 elem = list_set_elem(map, i);
90 if (with_timeout(map->
timeout) && list_set_expired(map, i))
121 elem = list_set_elem(map, i);
122 return elem->
id ==
id;
134 elem = list_set_elem(map, i);
135 return !!(elem->
id ==
id &&
136 !(with_timeout(map->
timeout) &&
137 list_set_expired(map, i)));
148 for (; i < map->
size; i++) {
149 e = list_set_elem(map, i);
158 unsigned long timeout)
162 for (; i < map->
size; i++) {
163 e = list_set_telem(map, i);
173 unsigned long timeout)
175 const struct set_elem *e = list_set_elem(map, i);
180 if (with_timeout(map->
timeout))
181 list_elem_tadd(map, i,
id, ip_set_timeout_set(timeout));
183 list_elem_add(map, i,
id);
191 struct set_elem *
a = list_set_elem(map, i), *
b;
195 for (; i < map->
size - 1; i++) {
196 b = list_set_elem(map, i + 1);
198 if (with_timeout(map->
timeout))
211 cleanup_entries(
struct list_set *map)
216 for (i = 0; i < map->
size; i++) {
217 e = list_set_telem(map, i);
219 list_set_del(map, i);
228 bool with_timeout = with_timeout(map->
timeout);
244 *lineno = nla_get_u32(tb[IPSET_ATTR_LINENO]);
256 u32 f = ip_set_get_h32(tb[IPSET_ATTR_CADT_FLAGS]);
265 if (tb[IPSET_ATTR_NAMEREF]) {
280 timeout = ip_set_timeout_uget(tb[IPSET_ATTR_TIMEOUT]);
283 cleanup_entries(map);
287 for (i = 0; i < map->
size && !
ret; i++) {
288 elem = list_set_elem(map, i);
290 (before != 0 && i + 1 >= map->
size))
292 else if (with_timeout && list_set_expired(map, i))
294 else if (before > 0 && elem->
id ==
id)
295 ret = id_eq_timeout(map, i + 1, refid);
296 else if (before < 0 && elem->
id == refid)
297 ret = id_eq_timeout(map, i + 1,
id);
298 else if (before == 0 && elem->
id ==
id)
303 for (i = 0; i < map->
size; i++) {
304 elem = list_set_elem(map, i);
307 if (!(with_timeout && flag_exist)) {
311 struct set_telem *e = list_set_telem(map, i);
314 !id_eq(map, i + 1, refid)) ||
316 (i == 0 || !id_eq(map, i - 1, refid)))) {
320 e->
timeout = ip_set_timeout_set(timeout);
328 elem = list_set_elem(map, i);
331 : list_set_add(map, i,
id, timeout);
332 else if (elem->
id != refid)
335 ret = list_set_add(map, i,
id, timeout);
336 else if (i + 1 < map->
size)
337 ret = list_set_add(map, i + 1,
id, timeout);
343 elem = list_set_elem(map, i);
348 }
else if (elem->
id ==
id &&
350 (before > 0 && id_eq(map, i + 1, refid))))
351 ret = list_set_del(map, i);
352 else if (elem->
id == refid &&
353 before < 0 && id_eq(map, i + 1,
id))
354 ret = list_set_del(map, i + 1);
367 return ip_set_eexist(ret, flags) ? 0 :
ret;
371 list_set_flush(
struct ip_set *
set)
377 for (i = 0; i < map->
size; i++) {
378 elem = list_set_elem(map, i);
387 list_set_destroy(
struct ip_set *
set)
391 if (with_timeout(map->
timeout))
402 const struct list_set *map =
set->data;
407 goto nla_put_failure;
410 nla_put_net32(skb, IPSET_ATTR_TIMEOUT,
htonl(map->
timeout))) ||
414 goto nla_put_failure;
423 list_set_list(
const struct ip_set *
set,
426 const struct list_set *map =
set->data;
427 struct nlattr *atd, *nested;
436 e = list_set_elem(map, i);
439 if (with_timeout(map->
timeout) && list_set_expired(map, i))
444 nla_nest_cancel(skb, atd);
447 goto nla_put_failure;
451 goto nla_put_failure;
452 if (with_timeout(map->
timeout)) {
456 if (nla_put_net32(skb, IPSET_ATTR_TIMEOUT, to))
457 goto nla_put_failure;
468 nla_nest_cancel(skb, nested);
478 list_set_same_set(
const struct ip_set *a,
const struct ip_set *
b)
488 .kadt = list_set_kadt,
489 .uadt = list_set_uadt,
490 .destroy = list_set_destroy,
491 .flush = list_set_flush,
492 .head = list_set_head,
493 .list = list_set_list,
494 .same_set = list_set_same_set,
498 list_set_gc(
unsigned long ul_set)
501 struct list_set *map =
set->data;
504 cleanup_entries(map);
512 list_set_gc_init(
struct ip_set *
set)
514 struct list_set *map =
set->data;
517 map->
gc.data = (
unsigned long)
set;
518 map->
gc.function = list_set_gc;
527 unsigned long timeout)
529 struct list_set *
map;
533 map = kzalloc(
sizeof(*map) + size * dsize,
GFP_KERNEL);
542 for (i = 0; i <
size; i++) {
543 e = list_set_elem(map, i);
556 !ip_set_optattr_netorder(tb, IPSET_ATTR_TIMEOUT)))
560 size = ip_set_get_h32(tb[IPSET_ATTR_SIZE]);
564 if (tb[IPSET_ATTR_TIMEOUT]) {
565 if (!init_list_set(
set, size,
sizeof(
struct set_telem),
566 ip_set_timeout_uget(tb[IPSET_ATTR_TIMEOUT])))
569 list_set_gc_init(
set);
571 if (!init_list_set(
set, size,
sizeof(
struct set_elem),
575 set->variant = &list_set;
587 .create = list_set_create,