diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/mnl.c | 15 | ||||
-rw-r--r-- | src/netlink.c | 14 |
2 files changed, 28 insertions, 1 deletions
@@ -902,6 +902,21 @@ int mnl_nft_setelem_batch_add(struct nftnl_set *nls, unsigned int flags, return mnl_nft_setelem_batch(nls, NFT_MSG_NEWSETELEM, flags, seqnum); } +int mnl_nft_setelem_batch_flush(struct nftnl_set *nls, unsigned int flags, + uint32_t seqnum) +{ + struct nlmsghdr *nlh; + + nlh = nftnl_set_elem_nlmsg_build_hdr(nftnl_batch_buffer(batch), + NFT_MSG_DELSETELEM, + nftnl_set_get_u32(nls, NFTNL_SET_FAMILY), + NLM_F_CREATE | flags, seqnum); + nftnl_set_elems_nlmsg_build_payload(nlh, nls); + mnl_nft_batch_continue(); + + return 0; +} + int mnl_nft_setelem_batch_del(struct nftnl_set *nls, unsigned int flags, uint32_t seqnum) { diff --git a/src/netlink.c b/src/netlink.c index 714df4e8..d6d00199 100644 --- a/src/netlink.c +++ b/src/netlink.c @@ -1410,7 +1410,19 @@ static int netlink_del_setelems_compat(struct netlink_ctx *ctx, int netlink_flush_setelems(struct netlink_ctx *ctx, const struct handle *h, const struct location *loc) { - return netlink_del_setelems_batch(ctx, h, NULL); + struct nftnl_set *nls; + int err; + + nls = alloc_nftnl_set(h); + netlink_dump_set(nls); + + err = mnl_nft_setelem_batch_flush(nls, 0, ctx->seqnum); + nftnl_set_free(nls); + if (err < 0) + netlink_io_error(ctx, loc, + "Could not flush set elements: %s", + strerror(errno)); + return err; } static struct expr *netlink_parse_concat_elem(const struct datatype *dtype, |