summaryrefslogtreecommitdiffstats
path: root/src/set.c
diff options
context:
space:
mode:
authorPablo Neira Ayuso <pablo@netfilter.org>2013-02-02 12:17:31 +0100
committerPablo Neira Ayuso <pablo@netfilter.org>2013-02-05 13:55:02 +0100
commitd2a0036dd3e16d40f4039a11677241827ea057c5 (patch)
tree757e14859d225f34ad5499e554957476f9647785 /src/set.c
parentd07d9c1911739037be2db1d54a59aadf5c2d4adc (diff)
set: add support to add elements to sets
This patch includes iterators and several examples. Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
Diffstat (limited to 'src/set.c')
-rw-r--r--src/set.c41
1 files changed, 23 insertions, 18 deletions
diff --git a/src/set.c b/src/set.c
index 54cc55d..f285b34 100644
--- a/src/set.c
+++ b/src/set.c
@@ -26,20 +26,6 @@
#include "linux_list.h"
#include "expr/data_reg.h"
-struct nft_set {
- struct list_head head;
-
- uint32_t set_flags;
- char *table;
- char *name;
- uint32_t key_type;
- size_t key_len;
- uint32_t data_type;
- size_t data_len;
-
- uint32_t flags;
-};
-
struct nft_set *nft_set_alloc(void)
{
struct nft_set *s;
@@ -48,17 +34,24 @@ struct nft_set *nft_set_alloc(void)
if (s == NULL)
return NULL;
+ INIT_LIST_HEAD(&s->element_list);
return s;
}
EXPORT_SYMBOL(nft_set_alloc);
void nft_set_free(struct nft_set *s)
{
+ struct nft_set_elem *elem, *tmp;
+
if (s->table != NULL)
free(s->table);
if (s->name != NULL)
free(s->name);
+ list_for_each_entry_safe(elem, tmp, &s->element_list, head) {
+ list_del(&elem->head);
+ nft_set_elem_free(elem);
+ }
free(s);
}
EXPORT_SYMBOL(nft_set_free);
@@ -275,18 +268,30 @@ int nft_set_snprintf(char *buf, size_t size, struct nft_set *s,
{
int ret;
int len = size, offset = 0;
+ struct nft_set_elem *elem;
- ret = snprintf(buf, size, "set=%s table=%s flags=%x ",
+ ret = snprintf(buf, size, "set=%s table=%s flags=%x\n",
s->name, s->table, s->set_flags);
SNPRINTF_BUFFER_SIZE(ret, size, len, offset);
- ret = snprintf(buf+offset-1, len, "\n");
- SNPRINTF_BUFFER_SIZE(ret, size, len, offset);
+ list_for_each_entry(elem, &s->element_list, head) {
+ ret = snprintf(buf+offset, size, "\t");
+ SNPRINTF_BUFFER_SIZE(ret, size, len, offset);
- return ret;
+ ret = nft_set_elem_snprintf(buf+offset, size, elem, type, flags);
+ SNPRINTF_BUFFER_SIZE(ret, size, len, offset);
+ }
+
+ return offset;
}
EXPORT_SYMBOL(nft_set_snprintf);
+void nft_set_elem_add(struct nft_set *s, struct nft_set_elem *elem)
+{
+ list_add_tail(&elem->head, &s->element_list);
+}
+EXPORT_SYMBOL(nft_set_elem_add);
+
struct nft_set_list {
struct list_head list;
};