From: Pablo Neira Ayuso <pablo@netfilter.org>
To: Varsha Rao <rvarsha016@gmail.com>
Cc: netfilter-devel@vger.kernel.org
Subject: Re: [PATCH nft] src: Pass stateless, numeric, ip2name and handle variables as structure members.
Date: Thu, 15 Jun 2017 11:46:06 +0200 [thread overview]
Message-ID: <20170615094606.GA8817@salvia> (raw)
In-Reply-To: <59418f32.1623620a.a2188.374c@mx.google.com>
On Thu, Jun 15, 2017 at 01:01:57AM +0530, Varsha Rao wrote:
> diff --git a/include/datatype.h b/include/datatype.h
> index 04b7d88..748688e 100644
> --- a/include/datatype.h
> +++ b/include/datatype.h
> @@ -145,7 +145,8 @@ struct datatype {
> const char *desc;
> const struct datatype *basetype;
> const char *basefmt;
> - void (*print)(const struct expr *expr);
> + void (*print)(const struct expr *expr,
> + struct print_ctx *ct);
Could you use:
struct print_ctx *pctx
instead?
'ct' usually refers to the connection tracking system (ct) in our
codebase, so I would prefer we have a different variable name.
This applies everywhere in this patch.
> struct error_record *(*parse)(const struct expr *sym,
> struct expr **res);
> const struct symbol_table *sym_tbl;
> @@ -157,7 +158,7 @@ extern const struct datatype *datatype_lookup_byname(const char *name);
>
> extern struct error_record *symbol_parse(const struct expr *sym,
> struct expr **res);
> -extern void datatype_print(const struct expr *expr);
> +extern void datatype_print(const struct expr *expr, struct print_ctx *ct);
>
> static inline bool datatype_equal(const struct datatype *d1,
> const struct datatype *d2)
> @@ -205,7 +206,8 @@ extern struct error_record *symbolic_constant_parse(const struct expr *sym,
> const struct symbol_table *tbl,
> struct expr **res);
> extern void symbolic_constant_print(const struct symbol_table *tbl,
> - const struct expr *expr, bool quotes);
> + const struct expr *expr, bool quotes,
> + struct print_ctx *ct);
> extern void symbol_table_print(const struct symbol_table *tbl,
> const struct datatype *dtype,
> enum byteorder byteorder);
> diff --git a/include/expression.h b/include/expression.h
> index 9ba87e8..80f91d0 100644
> --- a/include/expression.h
> +++ b/include/expression.h
> @@ -157,7 +157,8 @@ struct expr_ops {
> void (*set_type)(const struct expr *expr,
> const struct datatype *dtype,
> enum byteorder byteorder);
> - void (*print)(const struct expr *expr);
> + void (*print)(const struct expr *expr,
> + struct print_ctx *ct);
> bool (*cmp)(const struct expr *e1,
> const struct expr *e2);
> void (*pctx_update)(struct proto_ctx *ctx,
> @@ -330,7 +331,7 @@ extern struct expr *expr_alloc(const struct location *loc,
> extern struct expr *expr_clone(const struct expr *expr);
> extern struct expr *expr_get(struct expr *expr);
> extern void expr_free(struct expr *expr);
> -extern void expr_print(const struct expr *expr);
> +extern void expr_print(const struct expr *expr, struct print_ctx *ct);
> extern bool expr_cmp(const struct expr *e1, const struct expr *e2);
> extern void expr_describe(const struct expr *expr);
>
> @@ -410,7 +411,7 @@ extern struct expr *list_expr_alloc(const struct location *loc);
>
> extern struct expr *set_expr_alloc(const struct location *loc);
> extern int set_to_intervals(struct list_head *msgs, struct set *set,
> - struct expr *init, bool add);
> + struct expr *init, bool add, struct print_ctx *ct);
Why do we need this? I think we only need print_ctx for *_print()
functions.
> extern void interval_map_decompose(struct expr *set);
>
> extern struct expr *mapping_expr_alloc(const struct location *loc,
> diff --git a/include/netlink.h b/include/netlink.h
> index 81538ff..0c7cd90 100644
> --- a/include/netlink.h
> +++ b/include/netlink.h
> @@ -213,6 +213,7 @@ struct netlink_mon_handler {
> struct netlink_ctx *ctx;
> const struct location *loc;
> bool cache_needed;
> + struct print_ctx *ct;
I think you can place this in 'struct netlink_ctx', see more detailed
comment below.
> diff --git a/include/nftables.h b/include/nftables.h
> index 6f54155..1c747d6 100644
> --- a/include/nftables.h
> +++ b/include/nftables.h
> @@ -24,12 +24,16 @@ enum debug_level {
>
> #define INCLUDE_PATHS_MAX 16
>
> +struct print_ctx {
> + unsigned int numeric_output;
> + unsigned int stateless_output;
> + unsigned int ip2name_output;
> + unsigned int handle_output;
You can probably remove the trailing "_output" now that this is inside
struct print_ctx, it is obvious they refer to printing toggles.
> +};
> +
> extern unsigned int max_errors;
> -extern unsigned int numeric_output;
> -extern unsigned int stateless_output;
> -extern unsigned int ip2name_output;
> -extern unsigned int handle_output;
> extern unsigned int debug_level;
> +
> extern const char *include_paths[INCLUDE_PATHS_MAX];
>
> enum nftables_exit_codes {
> @@ -107,6 +111,7 @@ struct input_descriptor {
>
> struct parser_state;
>
> -int nft_run(void *scanner, struct parser_state *state, struct list_head *msgs);
> +int nft_run(void *scanner, struct parser_state *state, struct list_head *msgs,
> + struct print_ctx *ct);
>
> #endif /* NFTABLES_NFTABLES_H */
> diff --git a/include/rule.h b/include/rule.h
> index fb46064..48cb5f1 100644
> --- a/include/rule.h
> +++ b/include/rule.h
> @@ -195,7 +195,7 @@ struct rule {
> extern struct rule *rule_alloc(const struct location *loc,
> const struct handle *h);
> extern void rule_free(struct rule *rule);
> -extern void rule_print(const struct rule *rule);
> +extern void rule_print(const struct rule *rule, struct print_ctx *ct);
> extern struct rule *rule_lookup(const struct chain *chain, uint64_t handle);
>
> /**
> @@ -244,7 +244,7 @@ extern void set_add_hash(struct set *set, struct table *table);
> extern struct set *set_lookup(const struct table *table, const char *name);
> extern struct set *set_lookup_global(uint32_t family, const char *table,
> const char *name);
> -extern void set_print(const struct set *set);
> +extern void set_print(const struct set *set, struct print_ctx *ct);
> extern void set_print_plain(const struct set *s);
>
> #include <statement.h>
> @@ -292,7 +292,7 @@ void obj_free(struct obj *obj);
> void obj_add_hash(struct obj *obj, struct table *table);
> struct obj *obj_lookup(const struct table *table, const char *name,
> uint32_t type);
> -void obj_print(const struct obj *n);
> +void obj_print(const struct obj *n, struct print_ctx *ct);
> void obj_print_plain(const struct obj *obj);
> const char *obj_type_name(uint32_t type);
>
> @@ -475,7 +475,8 @@ extern int cmd_evaluate(struct eval_ctx *ctx, struct cmd *cmd);
> extern struct error_record *rule_postprocess(struct rule *rule);
>
> struct netlink_ctx;
> -extern int do_command(struct netlink_ctx *ctx, struct cmd *cmd);
> +extern int do_command(struct netlink_ctx *ctx, struct cmd *cmd,
> + struct print_ctx *ct);
You can place this in netlink_ctx so...
struct netlink_ctx {
...
struct print_ctx *pctx;
};
So we can make this patch smaller, you don't need to update that many
functions.
> extern int cache_update(enum cmd_ops cmd, struct list_head *msgs);
> extern void cache_flush(void);
> diff --git a/include/statement.h b/include/statement.h
> index 317d53e..d6ebc01 100644
> --- a/include/statement.h
> +++ b/include/statement.h
> @@ -261,7 +261,8 @@ struct stmt_ops {
> enum stmt_types type;
> const char *name;
> void (*destroy)(struct stmt *stmt);
> - void (*print)(const struct stmt *stmt);
> + void (*print)(const struct stmt *stmt,
> + struct print_ctx *ct);
> };
>
> enum stmt_flags {
> @@ -312,7 +313,7 @@ extern struct stmt *stmt_alloc(const struct location *loc,
> int stmt_evaluate(struct eval_ctx *ctx, struct stmt *stmt);
> extern void stmt_free(struct stmt *stmt);
> extern void stmt_list_free(struct list_head *list);
> -extern void stmt_print(const struct stmt *stmt);
> +extern void stmt_print(const struct stmt *stmt, struct print_ctx *ct);
>
> const char *get_rate(uint64_t byte_rate, uint64_t *rate);
>
> diff --git a/src/cli.c b/src/cli.c
> index a74411a..c91eced 100644
> --- a/src/cli.c
> +++ b/src/cli.c
> @@ -129,7 +129,7 @@ static void cli_complete(char *line)
>
> parser_init(state, &msgs);
> scanner_push_buffer(scanner, &indesc_cli, line);
> - nft_run(scanner, state, &msgs);
> + nft_run(scanner, state, &msgs, NULL);
I suggest you pass it here as global. Look, the cli code (interactive
mode that you exercise via -i) will not go into libnftables, so it's
fine to to keep it global.
next prev parent reply other threads:[~2017-06-15 9:46 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-06-14 19:31 [PATCH nft] src: Pass stateless, numeric, ip2name and handle variables as structure members Varsha Rao
2017-06-15 9:46 ` Pablo Neira Ayuso [this message]
2017-06-15 11:28 ` Varsha Rao
2017-06-15 12:23 ` Pablo Neira Ayuso
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20170615094606.GA8817@salvia \
--to=pablo@netfilter.org \
--cc=netfilter-devel@vger.kernel.org \
--cc=rvarsha016@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).