src: add events reporting
PATCH v2 8/8 src: add events reporting
This patch adds a basic events reporting option to nft.
The syntax is:
% nft monitor [new|destroy] [tables|chains|rules|sets|elements] [xml|json]
---
v2: Move code to libnftnl. Allow multiple set_elem in a single event.
Rename functions. Rename options to [new|destroy]. Handle chain/table updates.
include/mnl.h | 3 include/netlink.h | 10 + include/rule.h | 6 + src/evaluate.c | 1 src/mnl.c | 10 + src/netlink.c | 547 +++++++++++++++++++++++++++++++++++++++++++++++++++++ src/parser.y | 90 ++++++++- src/rule.c | 89 +++++++++ src/scanner.l | 5 9 files changed, 755 insertions(+), 6 deletions(-)
include/mnl.h +3 -0
@@ -67,4 +67,7 @@ int mnl_nft_setelem_get(struct mnl_socket *nf_sock, struct nft_set *nls);struct nft_ruleset *mnl_nft_ruleset_dump (struct mnl_socket *nf_sock,uint32_t family); +int mnl_nft_event_listener (struct mnl_socket *nf_sock, +int (*cb)(const struct nlmsghdr *nlh,void *data), +void *cb_data);#endif /* _NFTABLES_MNL_H_ */
include/netlink.h +10 -0
@@ -136,6 +136,7 @@ extern void netlink_dump_expr(struct nft_rule_expr *nle);extern void netlink_dump_set (struct nft_set *nls);extern int netlink_batch_send (struct list_head *err_list); +extern void netlink_abi_error (void )__noreturn ;extern int netlink_io_error (struct netlink_ctx *ctx,const struct location *loc,const char *fmt, ...);extern void netlink_open_error (void )__noreturn ;
@@ -143,4 +144,13 @@ extern void netlink_open_error(void) __noreturn;extern struct nft_ruleset *netlink_dump_ruleset (struct netlink_ctx *ctx,const struct handle *h,const struct location *loc); +struct netlink_mon_handler { +uint32_t monitor_flags; +uint32_t format; +struct netlink_ctx *ctx; +const struct location *loc; +bool cache_needed; +}; + +extern int netlink_monitor (struct netlink_mon_handler *monhandler);#endif /* NFTABLES_NETLINK_H */
include/rule.h +6 -0
@@ -195,8 +195,11 @@ struct set {extern struct set *set_alloc (const struct location *loc);extern struct set *set_get (struct set *set);extern void set_free (struct set *set); +extern struct set *set_clone (const struct set *set);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_plain (const struct set *s);
@@ -212,6 +215,7 @@ extern void set_print_plain(const struct set *s);* @CMD_FLUSH: flush container * @CMD_RENAME: rename object * @CMD_EXPORT: export the ruleset in a given format +* @CMD_MONITOR: event listener */ enum cmd_ops {CMD_INVALID ,
@@ -223,6 +227,7 @@ enum cmd_ops {CMD_FLUSH ,CMD_RENAME ,CMD_EXPORT , + CMD_MONITOR, };/**
@@ -278,6 +283,7 @@ struct cmd { };const void *arg;uint32_t format; +uint32_t monitor_flags; }; extern struct cmd *cmd_alloc(enum cmd_ops op, enum cmd_obj obj,
src/evaluate.c +1 -0
@@ -1428,6 +1428,7 @@ int cmd_evaluate(struct eval_ctx *ctx, struct cmd *cmd)case CMD_FLUSH :case CMD_RENAME :case CMD_EXPORT : +case CMD_MONITOR :return 0 ;default :BUG ("invalid command operation %u\n" , cmd->op);
src/mnl.c +10 -0
@@ -813,3 +813,13 @@ out:nft_ruleset_free (rs);return NULL ; } + +/* +* events +*/ +int mnl_nft_event_listener (struct mnl_socket *nf_sock, +int (*cb)(const struct nlmsghdr *nlh,void *data), +void *cb_data) +{ +return nft_mnl_recv (nf_sock,0 ,0 , cb, cb_data); +}
src/netlink.c +544 -3
577 lines not on this page · raw message
src/parser.y +87 -3
132 lines not on this page · raw message
src/rule.c +89 -0
113 lines not on this page · raw message
src/scanner.l +5 -0
@@ -232,12 +232,16 @@ addrstring ({macaddr}|{ip4addr}|{ip6addr}) "table" { return TABLE; } "tables" { return TABLES; } "chain" { return CHAIN; } +"chains" { return CHAINS; } "rule" { return RULE; } +"rules" { return RULES; } "sets" { return SETS; } "set" { return SET; } "element" { return ELEMENT; } "map" { return MAP; } "handle" { return HANDLE; } +"new" { return NEW; } +"destroy" { return DESTROY; } "accept" { return ACCEPT; } "drop" { return DROP; }
@@ -256,6 +260,7 @@ addrstring ({macaddr}|{ip4addr}|{ip6addr}) "flush" { return FLUSH; } "rename" { return RENAME; } "export" { return EXPORT; } +"monitor" { return MONITOR; } "position" { return POSITION; } "comment" { return COMMENT; }
Quoted 10 lines · Arturo Borrero Gonzalez
This patch adds a basic events reporting option to nft.
The syntax is:
% nft monitor [new|destroy] [tables|chains|rules|sets|elements] [xml|json]Signed-off-by Arturo Borrero Gonzalez <[email protected]>---
v2: Move code to libnftnl. Allow multipleset_elemin a single event.
Rename functions. Rename options to [new|destroy]. Handle chain/table updates.
If Pablo has no further objections I'll apply your series.
Pablo Neira Ayuso
maintainerQuoted 6 lines · Patrick McHardy
Quoted 5 lines · Arturo Borrero Gonzalez
This patch adds a basic events reporting option to nft.
The syntax is:
% nft monitor [new|destroy] [tables|chains|rules|sets|elements] [xml|json]
Quoted 7 lines
Quoted 5 lines
Signed-off-by Arturo Borrero Gonzalez <[email protected]>---
v2: Move code to libnftnl. Allow multipleset_elemin a single event.
Rename functions. Rename options to [new|destroy]. Handle chain/table updates.If Pablo has no further objections I'll apply your series.
This look good to me, thanks Patrick and Arturo!