Will be used with the "generation id" infrastructure.
When we're told that the commit failed because someone else made
changes, we can use this to re-initialize the cache and then
revalidate the transaction list (e.g. to detect that we now have
to flush the user-defined chain 'foo' that we wanted to create, but
was added just now by someone else).
Signed-off-by: Florian Westphal <fw@strlen.de>
Acked-by: Pablo Neira Ayuso <pablo@netfilter.org>
return 0;
}
+static void __nft_build_cache(struct nft_handle *h)
+{
+ fetch_chain_cache(h);
+ fetch_rule_cache(h);
+ h->have_cache = true;
+}
+
+
+void nft_build_cache(struct nft_handle *h)
+{
+ if (!h->have_cache)
+ __nft_build_cache(h);
+}
+
+void nft_rebuild_cache(struct nft_handle *h)
+{
+ if (!h->have_cache)
+ flush_chain_cache(h, NULL);
+
+ __nft_build_cache(h);
+}
+
struct nftnl_chain_list *nft_chain_list_get(struct nft_handle *h,
const char *table)
{
if (!t)
return NULL;
- if (!h->have_cache) {
- fetch_chain_cache(h);
- fetch_rule_cache(h);
- h->have_cache = true;
- }
+ nft_build_cache(h);
return h->table[t->type].chain_cache;
}
void *data);
int nft_init(struct nft_handle *h, const struct builtin_table *t);
void nft_fini(struct nft_handle *h);
+void nft_build_cache(struct nft_handle *h);
+void nft_rebuild_cache(struct nft_handle *h);
/*
* Operations with tables.
if (p->tablename && (strcmp(p->tablename, table) != 0))
continue;
- /* Fixme: Needed to init chain cache.
- * Should create explicit function to do this.
- */
- nft_chain_list_get(h, table);
+ nft_build_cache(h);
if (h->noflush == 0) {
DEBUGP("Cleaning all chains of table '%s'\n",