Skip to contentSkip to conversation

src: add events reporting

PATCH In review Arturo Borrero Gonzalez 3 participants 3 messages Apr 16, 2014 netfilter

lore
Share & tools
lore
#0 lore raw

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
index f4de27d..ece7ee7 100644
@@ -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
index 1fb0356..eca4a48 100644
@@ -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
index 6c373e6..da604a5 100644
@@ -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
index dc4406c..2330bbb 100644
@@ -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
index c034961..4d60d64 100644
@@ -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
index 47c5933..53e2498 100644
@@ -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; }
#1 lore raw
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]

---
v2: Move code to libnftnl. Allow multiple set_elem in 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.

#2 lore raw
Quoted 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

---
v2: Move code to libnftnl. Allow multiple set_elem in 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!