diff options
author | Patrick McHardy <kaber@trash.net> | 2014-01-09 18:55:50 +0000 |
---|---|---|
committer | Patrick McHardy <kaber@trash.net> | 2014-01-09 18:55:50 +0000 |
commit | 01cd6fa3cce3517f92a16151d94e4ce35542e88c (patch) | |
tree | cd78851d10e3f409c297c9b7710d9c5492de3357 | |
parent | 87787ee86ec95a8a5494615268a03a756f48433f (diff) | |
parent | f930cc50031851c6975058e33408214ad0c240b6 (diff) |
Merge remote-tracking branch 'origin/master' into next-3.14
-rw-r--r-- | include/mnl.h | 2 | ||||
-rw-r--r-- | src/main.c | 12 | ||||
-rw-r--r-- | src/mnl.c | 8 |
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, @@ -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) |