static inline bool bitmap_timeout(const struct bitmap_ipmac *map, u32 id) { const struct ipmac_telem *elem = bitmap_ipmac_elem(map, id); return ip_set_timeout_test(elem->timeout); }
static inline bool list_set_timeout(const struct list_set *map, u32 id) { const struct set_telem *elem = list_set_telem(map, id); return ip_set_timeout_test(elem->timeout); }
static int bitmap_ip_ttest(struct ip_set *set, void *value, u32 timeout) { const struct bitmap_ip *map = set->data; const unsigned long *members = map->members; u16 id = *(u16 *)value; return ip_set_timeout_test(members[id]); }
static int bitmap_ip_tdel(struct ip_set *set, void *value, u32 timeout) { struct bitmap_ip *map = set->data; unsigned long *members = map->members; u16 id = *(u16 *)value; int ret = -IPSET_ERR_EXIST; if (ip_set_timeout_test(members[id])) ret = 0; members[id] = IPSET_ELEM_UNSET; return ret; }
static int bitmap_ip_tadd(struct ip_set *set, void *value, u32 timeout) { struct bitmap_ip *map = set->data; unsigned long *members = map->members; u16 id = *(u16 *)value; if (ip_set_timeout_test(members[id])) return -IPSET_ERR_EXIST; members[id] = ip_set_timeout_set(timeout); return 0; }
static int bitmap_port_tlist(const struct ip_set *set, struct sk_buff *skb, struct netlink_callback *cb) { const struct bitmap_port *map = set->data; struct nlattr *adt, *nested; u16 id, first = cb->args[2]; u16 last = map->last_port - map->first_port; const unsigned long *members = map->members; adt = ipset_nest_start(skb, IPSET_ATTR_ADT); if (!adt) return -EMSGSIZE; for (; cb->args[2] <= last; cb->args[2]++) { id = cb->args[2]; if (!ip_set_timeout_test(members[id])) continue; nested = ipset_nest_start(skb, IPSET_ATTR_DATA); if (!nested) { if (id == first) { nla_nest_cancel(skb, adt); return -EMSGSIZE; } else goto nla_put_failure; } NLA_PUT_NET16(skb, IPSET_ATTR_PORT, htons(map->first_port + id)); NLA_PUT_NET32(skb, IPSET_ATTR_TIMEOUT, htonl(ip_set_timeout_get(members[id]))); ipset_nest_end(skb, nested); } ipset_nest_end(skb, adt); /* Set listing finished */ cb->args[2] = 0; return 0; nla_put_failure: nla_nest_cancel(skb, nested); ipset_nest_end(skb, adt); if (unlikely(id == first)) { cb->args[2] = 0; return -EMSGSIZE; } return 0; }