Signed-off-by: Eric Leblond <e...@regit.org> --- include/nftables.h | 4 -- include/nftables_common.h | 18 ++++++++ src/Makefile.am | 1 + src/cli.c | 1 + src/libnftables.c | 2 + src/main.c | 85 ------------------------------------- src/nftables_common.c | 104 ++++++++++++++++++++++++++++++++++++++++++++++ 7 files changed, 126 insertions(+), 89 deletions(-) create mode 100644 include/nftables_common.h create mode 100644 src/nftables_common.c
diff --git a/include/nftables.h b/include/nftables.h index 717af37..c2bb7d8 100644 --- a/include/nftables.h +++ b/include/nftables.h @@ -124,10 +124,6 @@ struct input_descriptor { struct parser_state; struct mnl_socket; -int nft_run(struct nft_ctx *nft, struct mnl_socket *nf_sock, - struct nft_cache *cache, void *scanner, struct parser_state *state, - struct list_head *msgs); - void ct_label_table_init(void); void mark_table_init(void); void gmp_init(void); diff --git a/include/nftables_common.h b/include/nftables_common.h new file mode 100644 index 0000000..c3f54a5 --- /dev/null +++ b/include/nftables_common.h @@ -0,0 +1,18 @@ +/* + * Copyright (c) 2017 Eric Leblond <e...@regit.org> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + */ + + +#ifndef NFTABLES_NFTABLES_COMMON_H +#define NFTABLES_NFTABLES_COMMON_H + +int nft_run(struct nft_ctx *nft, struct mnl_socket *nf_sock, + struct nft_cache *cache, void *scanner, struct parser_state *state, + struct list_head *msgs); + +#endif diff --git a/src/Makefile.am b/src/Makefile.am index a340d39..cddd3a2 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -58,6 +58,7 @@ libnftables_la_SOURCES = rule.c \ libnftables.c \ scanner.l \ tcpopt.c \ + nftables_common.c \ parser_bison.y if BUILD_MINIGMP diff --git a/src/cli.c b/src/cli.c index a50fc58..7501b29 100644 --- a/src/cli.c +++ b/src/cli.c @@ -30,6 +30,7 @@ #include <utils.h> #include <iface.h> #include <cli.h> +#include <nftables_common.h> #include <libmnl/libmnl.h> diff --git a/src/libnftables.c b/src/libnftables.c index 8c92fbf..6599248 100644 --- a/src/libnftables.c +++ b/src/libnftables.c @@ -16,6 +16,8 @@ #include <erec.h> #include <libmnl/libmnl.h> #include <mnl.h> +#include <netlink.h> +#include <nftables_common.h> #include <nftables/nftables.h> diff --git a/src/main.c b/src/main.c index 658988d..9b4e450 100644 --- a/src/main.c +++ b/src/main.c @@ -182,91 +182,6 @@ static const struct { }; #endif -static int nft_netlink(struct nft_ctx *nft, struct nft_cache *cache, - struct parser_state *state, struct list_head *msgs, - struct mnl_socket *nf_sock) -{ - uint32_t batch_seqnum, seqnum = 0; - struct nftnl_batch *batch; - struct netlink_ctx ctx; - struct cmd *cmd; - struct mnl_err *err, *tmp; - LIST_HEAD(err_list); - bool batch_supported = netlink_batch_supported(nf_sock, &seqnum); - int ret = 0; - - batch = mnl_batch_init(); - - batch_seqnum = mnl_batch_begin(batch, mnl_seqnum_alloc(&seqnum)); - list_for_each_entry(cmd, &state->cmds, list) { - memset(&ctx, 0, sizeof(ctx)); - ctx.msgs = msgs; - ctx.seqnum = cmd->seqnum = mnl_seqnum_alloc(&seqnum); - ctx.batch = batch; - ctx.batch_supported = batch_supported; - ctx.octx = &nft->output; - ctx.nf_sock = nf_sock; - ctx.cache = cache; - init_list_head(&ctx.list); - ret = do_command(&ctx, cmd); - if (ret < 0) - goto out; - } - if (!nft->check) - mnl_batch_end(batch, mnl_seqnum_alloc(&seqnum)); - - if (!mnl_batch_ready(batch)) - goto out; - - ret = netlink_batch_send(&ctx, &err_list); - - list_for_each_entry_safe(err, tmp, &err_list, head) { - list_for_each_entry(cmd, &state->cmds, list) { - if (err->seqnum == cmd->seqnum || - err->seqnum == batch_seqnum) { - netlink_io_error(&ctx, &cmd->location, - "Could not process rule: %s", - strerror(err->err)); - ret = -1; - errno = err->err; - if (err->seqnum == cmd->seqnum) { - mnl_err_list_free(err); - break; - } - } - } - } -out: - mnl_batch_reset(batch); - return ret; -} - -int nft_run(struct nft_ctx *nft, struct mnl_socket *nf_sock, - struct nft_cache *cache, void *scanner, struct parser_state *state, - struct list_head *msgs) -{ - struct cmd *cmd, *next; - int ret; - - ret = nft_parse(scanner, state); - if (ret != 0 || state->nerrs > 0) { - ret = -1; - goto err1; - } - - list_for_each_entry(cmd, &state->cmds, list) - nft_cmd_expand(cmd); - - ret = nft_netlink(nft, cache, state, msgs, nf_sock); -err1: - list_for_each_entry_safe(cmd, next, &state->cmds, list) { - list_del(&cmd->list); - cmd_free(cmd); - } - - return ret; -} - int main(int argc, char * const *argv) { struct parser_state state; diff --git a/src/nftables_common.c b/src/nftables_common.c new file mode 100644 index 0000000..4ae9f3e --- /dev/null +++ b/src/nftables_common.c @@ -0,0 +1,104 @@ +/* + * Copyright (c) 2017 Eric Leblond <e...@regit.org> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + */ + +#include <string.h> +#include <errno.h> + +#include <nftables.h> +#include <nftables_common.h> +#include <netlink.h> +#include <parser.h> +#include <mnl.h> + +static int nft_netlink(struct nft_ctx *nft, struct nft_cache *cache, + struct parser_state *state, struct list_head *msgs, + struct mnl_socket *nf_sock) +{ + uint32_t batch_seqnum, seqnum = 0; + struct nftnl_batch *batch; + struct netlink_ctx ctx; + struct cmd *cmd; + struct mnl_err *err, *tmp; + LIST_HEAD(err_list); + bool batch_supported = netlink_batch_supported(nf_sock, &seqnum); + int ret = 0; + + batch = mnl_batch_init(); + + batch_seqnum = mnl_batch_begin(batch, mnl_seqnum_alloc(&seqnum)); + list_for_each_entry(cmd, &state->cmds, list) { + memset(&ctx, 0, sizeof(ctx)); + ctx.msgs = msgs; + ctx.seqnum = cmd->seqnum = mnl_seqnum_alloc(&seqnum); + ctx.batch = batch; + ctx.batch_supported = batch_supported; + ctx.octx = &nft->output; + ctx.nf_sock = nf_sock; + ctx.cache = cache; + init_list_head(&ctx.list); + ret = do_command(&ctx, cmd); + if (ret < 0) + goto out; + } + if (!nft->check) + mnl_batch_end(batch, mnl_seqnum_alloc(&seqnum)); + + if (!mnl_batch_ready(batch)) + goto out; + + ret = netlink_batch_send(&ctx, &err_list); + + list_for_each_entry_safe(err, tmp, &err_list, head) { + list_for_each_entry(cmd, &state->cmds, list) { + if (err->seqnum == cmd->seqnum || + err->seqnum == batch_seqnum) { + netlink_io_error(&ctx, &cmd->location, + "Could not process rule: %s", + strerror(err->err)); + ret = -1; + errno = err->err; + if (err->seqnum == cmd->seqnum) { + mnl_err_list_free(err); + break; + } + } + } + } +out: + mnl_batch_reset(batch); + return ret; +} + +int nft_run(struct nft_ctx *nft, struct mnl_socket *nf_sock, + struct nft_cache *cache, void *scanner, struct parser_state *state, + struct list_head *msgs) +{ + struct cmd *cmd, *next; + int ret; + + ret = nft_parse(scanner, state); + if (ret != 0 || state->nerrs > 0) { + ret = -1; + goto err1; + } + + list_for_each_entry(cmd, &state->cmds, list) + nft_cmd_expand(cmd); + + ret = nft_netlink(nft, cache, state, msgs, nf_sock); +err1: + list_for_each_entry_safe(cmd, next, &state->cmds, list) { + list_del(&cmd->list); + cmd_free(cmd); + } + + return ret; +} + + -- 2.14.1 -- To unsubscribe from this list: send the line "unsubscribe netfilter-devel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html