Skip to content

Commit 702b71e

Browse files
author
Jozsef Kadlecsik
committed
netfilter: ipset: Add element count to all set types header
It is better to list the set elements for all set types, thus the header information is uniform. Element counts are therefore added to the bitmap and list types. Signed-off-by: Jozsef Kadlecsik <kadlec@blackhole.kfki.hu>
1 parent a54dad5 commit 702b71e

File tree

5 files changed

+27
-14
lines changed

5 files changed

+27
-14
lines changed

include/linux/netfilter/ipset/ip_set.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -250,6 +250,8 @@ struct ip_set {
250250
u8 flags;
251251
/* Default timeout value, if enabled */
252252
u32 timeout;
253+
/* Number of elements (vs timeout) */
254+
u32 elements;
253255
/* Element data size */
254256
size_t dsize;
255257
/* Offsets to extensions in elements */

include/linux/netfilter/ipset/ip_set_bitmap.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@
66
#define IPSET_BITMAP_MAX_RANGE 0x0000FFFF
77

88
enum {
9+
IPSET_ADD_STORE_PLAIN_TIMEOUT = -1,
910
IPSET_ADD_FAILED = 1,
10-
IPSET_ADD_STORE_PLAIN_TIMEOUT,
1111
IPSET_ADD_START_STORED_TIMEOUT,
1212
};
1313

net/netfilter/ipset/ip_set_bitmap_gen.h

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ mtype_flush(struct ip_set *set)
8383
if (set->extensions & IPSET_EXT_DESTROY)
8484
mtype_ext_cleanup(set);
8585
memset(map->members, 0, map->memsize);
86+
set->elements = 0;
8687
}
8788

8889
/* Calculate the actual memory size of the set data */
@@ -105,7 +106,8 @@ mtype_head(struct ip_set *set, struct sk_buff *skb)
105106
goto nla_put_failure;
106107
if (mtype_do_head(skb, map) ||
107108
nla_put_net32(skb, IPSET_ATTR_REFERENCES, htonl(set->ref)) ||
108-
nla_put_net32(skb, IPSET_ATTR_MEMSIZE, htonl(memsize)))
109+
nla_put_net32(skb, IPSET_ATTR_MEMSIZE, htonl(memsize)) ||
110+
nla_put_net32(skb, IPSET_ATTR_ELEMENTS, htonl(set->elements)))
109111
goto nla_put_failure;
110112
if (unlikely(ip_set_put_flags(skb, set)))
111113
goto nla_put_failure;
@@ -149,6 +151,7 @@ mtype_add(struct ip_set *set, void *value, const struct ip_set_ext *ext,
149151
if (ret == IPSET_ADD_FAILED) {
150152
if (SET_WITH_TIMEOUT(set) &&
151153
ip_set_timeout_expired(ext_timeout(x, set))) {
154+
set->elements--;
152155
ret = 0;
153156
} else if (!(flags & IPSET_FLAG_EXIST)) {
154157
set_bit(e->id, map->members);
@@ -157,6 +160,8 @@ mtype_add(struct ip_set *set, void *value, const struct ip_set_ext *ext,
157160
/* Element is re-added, cleanup extensions */
158161
ip_set_ext_destroy(set, x);
159162
}
163+
if (ret > 0)
164+
set->elements--;
160165

161166
if (SET_WITH_TIMEOUT(set))
162167
#ifdef IP_SET_BITMAP_STORED_TIMEOUT
@@ -174,6 +179,7 @@ mtype_add(struct ip_set *set, void *value, const struct ip_set_ext *ext,
174179

175180
/* Activate element */
176181
set_bit(e->id, map->members);
182+
set->elements++;
177183

178184
return 0;
179185
}
@@ -190,6 +196,7 @@ mtype_del(struct ip_set *set, void *value, const struct ip_set_ext *ext,
190196
return -IPSET_ERR_EXIST;
191197

192198
ip_set_ext_destroy(set, x);
199+
set->elements--;
193200
if (SET_WITH_TIMEOUT(set) &&
194201
ip_set_timeout_expired(ext_timeout(x, set)))
195202
return -IPSET_ERR_EXIST;
@@ -285,6 +292,7 @@ mtype_gc(unsigned long ul_set)
285292
if (ip_set_timeout_expired(ext_timeout(x, set))) {
286293
clear_bit(id, map->members);
287294
ip_set_ext_destroy(set, x);
295+
set->elements--;
288296
}
289297
}
290298
spin_unlock_bh(&set->lock);

net/netfilter/ipset/ip_set_hash_gen.h

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -275,7 +275,6 @@ htable_bits(u32 hashsize)
275275
struct htype {
276276
struct htable __rcu *table; /* the hash table */
277277
u32 maxelem; /* max elements in the hash */
278-
u32 elements; /* current element (vs timeout) */
279278
u32 initval; /* random jhash init value */
280279
#ifdef IP_SET_HASH_WITH_MARKMASK
281280
u32 markmask; /* markmask value for mark mask to store */
@@ -400,7 +399,7 @@ mtype_flush(struct ip_set *set)
400399
#ifdef IP_SET_HASH_WITH_NETS
401400
memset(h->nets, 0, sizeof(struct net_prefixes) * NLEN(set->family));
402401
#endif
403-
h->elements = 0;
402+
set->elements = 0;
404403
}
405404

406405
/* Destroy the hashtable part of the set */
@@ -506,7 +505,7 @@ mtype_expire(struct ip_set *set, struct htype *h, u8 nets_length, size_t dsize)
506505
nets_length, k);
507506
#endif
508507
ip_set_ext_destroy(set, data);
509-
h->elements--;
508+
set->elements--;
510509
d++;
511510
}
512511
}
@@ -715,11 +714,11 @@ mtype_add(struct ip_set *set, void *value, const struct ip_set_ext *ext,
715714
bool deleted = false, forceadd = false, reuse = false;
716715
u32 key, multi = 0;
717716

718-
if (h->elements >= h->maxelem) {
717+
if (set->elements >= h->maxelem) {
719718
if (SET_WITH_TIMEOUT(set))
720719
/* FIXME: when set is full, we slow down here */
721720
mtype_expire(set, h, NLEN(set->family), set->dsize);
722-
if (h->elements >= h->maxelem && SET_WITH_FORCEADD(set))
721+
if (set->elements >= h->maxelem && SET_WITH_FORCEADD(set))
723722
forceadd = true;
724723
}
725724

@@ -732,7 +731,7 @@ mtype_add(struct ip_set *set, void *value, const struct ip_set_ext *ext,
732731
pr_warn("Set %s is full, maxelem %u reached\n",
733732
set->name, h->maxelem);
734733
return -IPSET_ERR_HASH_FULL;
735-
} else if (h->elements >= h->maxelem) {
734+
} else if (set->elements >= h->maxelem) {
736735
goto set_full;
737736
}
738737
old = NULL;
@@ -781,11 +780,11 @@ mtype_add(struct ip_set *set, void *value, const struct ip_set_ext *ext,
781780
NLEN(set->family), i);
782781
#endif
783782
ip_set_ext_destroy(set, data);
784-
h->elements--;
783+
set->elements--;
785784
}
786785
goto copy_data;
787786
}
788-
if (h->elements >= h->maxelem)
787+
if (set->elements >= h->maxelem)
789788
goto set_full;
790789
/* Create a new slot */
791790
if (n->pos >= n->size) {
@@ -810,7 +809,7 @@ mtype_add(struct ip_set *set, void *value, const struct ip_set_ext *ext,
810809
j = n->pos++;
811810
data = ahash_data(n, j, set->dsize);
812811
copy_data:
813-
h->elements++;
812+
set->elements++;
814813
#ifdef IP_SET_HASH_WITH_NETS
815814
for (i = 0; i < IPSET_NET_COUNT; i++)
816815
mtype_add_cidr(h, NCIDR_PUT(DCIDR_GET(d->cidr, i)),
@@ -883,7 +882,7 @@ mtype_del(struct ip_set *set, void *value, const struct ip_set_ext *ext,
883882
smp_mb__after_atomic();
884883
if (i + 1 == n->pos)
885884
n->pos--;
886-
h->elements--;
885+
set->elements--;
887886
#ifdef IP_SET_HASH_WITH_NETS
888887
for (j = 0; j < IPSET_NET_COUNT; j++)
889888
mtype_del_cidr(h, NCIDR_PUT(DCIDR_GET(d->cidr, j)),
@@ -1084,7 +1083,7 @@ mtype_head(struct ip_set *set, struct sk_buff *skb)
10841083
#endif
10851084
if (nla_put_net32(skb, IPSET_ATTR_REFERENCES, htonl(set->ref)) ||
10861085
nla_put_net32(skb, IPSET_ATTR_MEMSIZE, htonl(memsize)) ||
1087-
nla_put_net32(skb, IPSET_ATTR_ELEMENTS, htonl(h->elements)))
1086+
nla_put_net32(skb, IPSET_ATTR_ELEMENTS, htonl(set->elements)))
10881087
goto nla_put_failure;
10891088
if (unlikely(ip_set_put_flags(skb, set)))
10901089
goto nla_put_failure;

net/netfilter/ipset/ip_set_list_set.c

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,7 @@ __list_set_del_rcu(struct rcu_head * rcu)
166166
static inline void
167167
list_set_del(struct ip_set *set, struct set_elem *e)
168168
{
169+
set->elements--;
169170
list_del_rcu(&e->list);
170171
call_rcu(&e->rcu, __list_set_del_rcu);
171172
}
@@ -309,6 +310,7 @@ list_set_uadd(struct ip_set *set, void *value, const struct ip_set_ext *ext,
309310
list_add_rcu(&e->list, &prev->list);
310311
else
311312
list_add_tail_rcu(&e->list, &map->members);
313+
set->elements++;
312314

313315
return 0;
314316
}
@@ -419,6 +421,7 @@ list_set_flush(struct ip_set *set)
419421

420422
list_for_each_entry_safe(e, n, &map->members, list)
421423
list_set_del(set, e);
424+
set->elements = 0;
422425
}
423426

424427
static void
@@ -471,7 +474,8 @@ list_set_head(struct ip_set *set, struct sk_buff *skb)
471474
goto nla_put_failure;
472475
if (nla_put_net32(skb, IPSET_ATTR_SIZE, htonl(map->size)) ||
473476
nla_put_net32(skb, IPSET_ATTR_REFERENCES, htonl(set->ref)) ||
474-
nla_put_net32(skb, IPSET_ATTR_MEMSIZE, htonl(memsize)))
477+
nla_put_net32(skb, IPSET_ATTR_MEMSIZE, htonl(memsize)) ||
478+
nla_put_net32(skb, IPSET_ATTR_ELEMENTS, htonl(set->elements)))
475479
goto nla_put_failure;
476480
if (unlikely(ip_set_put_flags(skb, set)))
477481
goto nla_put_failure;

0 commit comments

Comments
 (0)