]> granicus.if.org Git - ipset/commitdiff
netfilter: ipset: Separate memsize calculation code into dedicated functions
authorJozsef Kadlecsik <kadlec@blackhole.kfki.hu>
Wed, 6 May 2015 05:48:20 +0000 (07:48 +0200)
committerJozsef Kadlecsik <kadlec@blackhole.kfki.hu>
Wed, 6 May 2015 05:48:20 +0000 (07:48 +0200)
Hash types already has it's memsize calculation code in separate
functions. Do the same for *bitmap* and *list* sets.

Ported from a patch proposed by Sergey Popovich <popovich_sergei@mail.ua>.

Suggested-by: Sergey Popovich <popovich_sergei@mail.ua>
Signed-off-by: Jozsef Kadlecsik <kadlec@blackhole.kfki.hu>
kernel/net/netfilter/ipset/ip_set_bitmap_gen.h
kernel/net/netfilter/ipset/ip_set_list_set.c

index d05e759ed0fafe62ef299e6f097f0d18f08ec567..b984bcf08d10332ba1349977f141818b15ae8ccc 100644 (file)
@@ -22,6 +22,7 @@
 #define mtype_kadt             IPSET_TOKEN(MTYPE, _kadt)
 #define mtype_uadt             IPSET_TOKEN(MTYPE, _uadt)
 #define mtype_destroy          IPSET_TOKEN(MTYPE, _destroy)
+#define mtype_memsize          IPSET_TOKEN(MTYPE, _memsize)
 #define mtype_flush            IPSET_TOKEN(MTYPE, _flush)
 #define mtype_head             IPSET_TOKEN(MTYPE, _head)
 #define mtype_same_set         IPSET_TOKEN(MTYPE, _same_set)
@@ -87,21 +88,30 @@ mtype_flush(struct ip_set *set)
        memset(map->members, 0, map->memsize);
 }
 
+/* Calculate the actual memory size of the set data */
+static size_t
+mtype_memsize(const struct mtype *map, size_t dsize)
+{
+       size_t memsize = sizeof(*map) +
+                        map->memsize +
+                        map->elements * dsize;
+
+       return memsize;
+}
+
 static int
 mtype_head(struct ip_set *set, struct sk_buff *skb)
 {
        const struct mtype *map = set->data;
        struct nlattr *nested;
+       size_t memsize = mtype_memsize(map, set->dsize);
 
        nested = ipset_nest_start(skb, IPSET_ATTR_DATA);
        if (!nested)
                goto nla_put_failure;
        if (mtype_do_head(skb, map) ||
            nla_put_net32(skb, IPSET_ATTR_REFERENCES, htonl(set->ref - 1)) ||
-           nla_put_net32(skb, IPSET_ATTR_MEMSIZE,
-                         htonl(sizeof(*map) +
-                               map->memsize +
-                               set->dsize * map->elements)))
+           nla_put_net32(skb, IPSET_ATTR_MEMSIZE, htonl(memsize)))
                goto nla_put_failure;
        if (unlikely(ip_set_put_flags(skb, set)))
                goto nla_put_failure;
index a1fe5377a2b3376d29f29b18d77ebfe08fc988e1..db55d585aaef53747f6b7dfed9ef0d2581c1f6ea 100644 (file)
@@ -442,24 +442,35 @@ list_set_destroy(struct ip_set *set)
        set->data = NULL;
 }
 
-static int
-list_set_head(struct ip_set *set, struct sk_buff *skb)
+/* Calculate the actual memory size of the set data */
+static size_t
+list_set_memsize(const struct list_set *map, size_t dsize)
 {
-       const struct list_set *map = set->data;
-       struct nlattr *nested;
        struct set_elem *e;
+       size_t memsize;
        u32 n = 0;
 
        list_for_each_entry(e, &map->members, list)
                n++;
 
+       memsize = sizeof(*map) + n * dsize;
+
+       return memsize;
+}
+
+static int
+list_set_head(struct ip_set *set, struct sk_buff *skb)
+{
+       const struct list_set *map = set->data;
+       struct nlattr *nested;
+       size_t memsize = list_set_memsize(map, set->dsize);
+
        nested = ipset_nest_start(skb, IPSET_ATTR_DATA);
        if (!nested)
                goto nla_put_failure;
        if (nla_put_net32(skb, IPSET_ATTR_SIZE, htonl(map->size)) ||
            nla_put_net32(skb, IPSET_ATTR_REFERENCES, htonl(set->ref - 1)) ||
-           nla_put_net32(skb, IPSET_ATTR_MEMSIZE,
-                         htonl(sizeof(*map) + n * set->dsize)))
+           nla_put_net32(skb, IPSET_ATTR_MEMSIZE, htonl(memsize)))
                goto nla_put_failure;
        if (unlikely(ip_set_put_flags(skb, set)))
                goto nla_put_failure;