diff options
author | Pablo Neira Ayuso <pablo@netfilter.org> | 2013-02-02 12:17:31 +0100 |
---|---|---|
committer | Pablo Neira Ayuso <pablo@netfilter.org> | 2013-02-05 13:55:02 +0100 |
commit | d2a0036dd3e16d40f4039a11677241827ea057c5 (patch) | |
tree | 757e14859d225f34ad5499e554957476f9647785 /src/set.c | |
parent | d07d9c1911739037be2db1d54a59aadf5c2d4adc (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.c | 41 |
1 files changed, 23 insertions, 18 deletions
@@ -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; }; |