summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/mnl.h2
-rw-r--r--src/main.c12
-rw-r--r--src/mnl.c8
3 files changed, 14 insertions, 8 deletions
diff --git a/include/mnl.h b/include/mnl.h
index fe2fb400..a6306058 100644
--- a/include/mnl.h
+++ b/include/mnl.h
@@ -18,7 +18,7 @@ void mnl_err_list_free(struct mnl_err *err);
void mnl_batch_init(void);
bool mnl_batch_ready(void);
void mnl_batch_reset(void);
-void mnl_batch_begin(void);
+uint32_t mnl_batch_begin(void);
void mnl_batch_end(void);
int mnl_batch_talk(struct mnl_socket *nl, struct list_head *err_list);
int mnl_nft_rule_batch_add(struct nft_rule *nlr, unsigned int flags,
diff --git a/src/main.c b/src/main.c
index 0c97120b..32a991a6 100644
--- a/src/main.c
+++ b/src/main.c
@@ -156,9 +156,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;
@@ -179,12 +180,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;
+ }
}
}
}
diff --git a/src/mnl.c b/src/mnl.c
index a711b5e2..a4a4c4af 100644
--- a/src/mnl.c
+++ b/src/mnl.c
@@ -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)