diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/main.c | 12 | ||||
-rw-r--r-- | src/mnl.c | 8 |
2 files changed, 13 insertions, 7 deletions
@@ -160,9 +160,10 @@ static int nft_netlink(struct parser_state *state, struct list_head *msgs) struct cmd *cmd, *next; struct mnl_err *err, *tmp; LIST_HEAD(err_list); + uint32_t batch_seqnum; int ret = 0; - mnl_batch_begin(); + batch_seqnum = mnl_batch_begin(); list_for_each_entry(cmd, &state->cmds, list) { memset(&ctx, 0, sizeof(ctx)); ctx.msgs = msgs; @@ -183,12 +184,15 @@ static int nft_netlink(struct parser_state *state, struct list_head *msgs) list_for_each_entry_safe(err, tmp, &err_list, head) { list_for_each_entry(cmd, &state->cmds, list) { - if (err->seqnum == cmd->seqnum) { + if (err->seqnum == cmd->seqnum || + err->seqnum == batch_seqnum) { netlink_io_error(&ctx, &cmd->location, "Could not process rule in batch: %s", strerror(err->err)); - mnl_err_list_free(err); - break; + if (err->seqnum == cmd->seqnum) { + mnl_err_list_free(err); + break; + } } } } @@ -106,7 +106,7 @@ static void mnl_batch_page_add(void) batch = mnl_batch_alloc(); } -static void mnl_batch_put(int type) +static uint32_t mnl_batch_put(int type) { struct nlmsghdr *nlh; struct nfgenmsg *nfg; @@ -123,11 +123,13 @@ static void mnl_batch_put(int type) if (!mnl_nlmsg_batch_next(batch)) mnl_batch_page_add(); + + return nlh->nlmsg_seq; } -void mnl_batch_begin(void) +uint32_t mnl_batch_begin(void) { - mnl_batch_put(NFNL_MSG_BATCH_BEGIN); + return mnl_batch_put(NFNL_MSG_BATCH_BEGIN); } void mnl_batch_end(void) |