[netfilter-cvslog] r4381 - in trunk/libnetfilter_conntrack: include/libnetfilter_conntrack src utils

pablo at netfilter.org pablo at netfilter.org
Mon Oct 24 00:14:10 CEST 2005


Author: pablo at netfilter.org
Date: 2005-10-24 00:14:05 +0200 (Mon, 24 Oct 2005)
New Revision: 4381

Modified:
   trunk/libnetfilter_conntrack/include/libnetfilter_conntrack/libnetfilter_conntrack.h
   trunk/libnetfilter_conntrack/src/libnetfilter_conntrack.c
   trunk/libnetfilter_conntrack/utils/ctnl_test.c
Log:
o Add conntrack event notification test
o Define NFCT_ANY_GROUP flag
o Now callback can return a value to stop receiving events
o implement nfct_unset_callback()



Modified: trunk/libnetfilter_conntrack/include/libnetfilter_conntrack/libnetfilter_conntrack.h
===================================================================
--- trunk/libnetfilter_conntrack/include/libnetfilter_conntrack/libnetfilter_conntrack.h	2005-10-23 18:16:33 UTC (rev 4380)
+++ trunk/libnetfilter_conntrack/include/libnetfilter_conntrack/libnetfilter_conntrack.h	2005-10-23 22:14:05 UTC (rev 4381)
@@ -30,6 +30,12 @@
  */
 #define NFCT_ANY_ID 0
 
+/*
+ * Default flag that is passed to nfct_open(), subscribe
+ * to all possible groups
+ */
+#define NFCT_ANY_GROUP ~0U
+
 union nfct_l4 {
 	/* Add other protocols here. */
 	u_int16_t all;
@@ -149,7 +155,7 @@
 	NFCT_MSG_DESTROY
 };
 
-typedef void (*nfct_callback)(void *arg, unsigned int flags, int);
+typedef int (*nfct_callback)(void *arg, unsigned int flags, int);
 typedef int (*nfct_handler)(struct sockaddr_nl *, struct nlmsghdr *, void *arg);
 
 struct nfct_handle {
@@ -177,12 +183,13 @@
 extern struct nfct_handle *nfct_open(u_int8_t, unsigned);
 extern int nfct_close(struct nfct_handle *cth);
 extern void nfct_set_callback(struct nfct_handle *cth, nfct_callback callback);
+extern void nfct_unset_callback(struct nfct_handle *cth);
 
 /*
  * callback displayers
  */
-extern void nfct_default_conntrack_display(void *arg, unsigned int, int); 
-extern void nfct_default_expect_display(void *arg, unsigned int, int);
+extern int nfct_default_conntrack_display(void *arg, unsigned int, int); 
+extern int nfct_default_expect_display(void *arg, unsigned int, int);
 
 extern int nfct_create_conntrack(struct nfct_handle *cth, 
 				 struct nfct_conntrack *ct);

Modified: trunk/libnetfilter_conntrack/src/libnetfilter_conntrack.c
===================================================================
--- trunk/libnetfilter_conntrack/src/libnetfilter_conntrack.c	2005-10-23 18:16:33 UTC (rev 4380)
+++ trunk/libnetfilter_conntrack/src/libnetfilter_conntrack.c	2005-10-23 22:14:05 UTC (rev 4381)
@@ -104,6 +104,11 @@
 	cth->callback = callback;
 }
 
+void nfct_unset_callback(struct nfct_handle *cth)
+{
+	cth->callback = NULL;
+}
+
 static void nfct_set_handler(struct nfct_handle *cth, nfct_handler hndlr)
 {
 	cth->handler = hndlr;
@@ -419,7 +424,7 @@
 	struct nfct_conntrack ct;
 	unsigned int flags = 0;
 	struct nfct_handle *cth = arg;
-	int type = NFNL_MSG_TYPE(nlh->nlmsg_type);
+	int type = NFNL_MSG_TYPE(nlh->nlmsg_type), ret = 0;
 
 	memset(&ct, 0, sizeof(struct nfct_conntrack));
 
@@ -473,13 +478,13 @@
 		attr = NFA_NEXT(attr, attrlen);
 	}
 	if (cth->callback)
-		cth->callback((void *) &ct, flags,
-			      typemsg2enum(type, nlh->nlmsg_flags));
+		ret = cth->callback((void *) &ct, flags,
+				    typemsg2enum(type, nlh->nlmsg_flags));
 
-	return 0;
+	return ret;
 }
 
-void nfct_default_conntrack_display(void *arg, unsigned int flags, int type)
+int nfct_default_conntrack_display(void *arg, unsigned int flags, int type)
 {
 	struct nfct_conntrack *ct = arg;
 	struct nfct_proto *h = NULL;
@@ -535,9 +540,11 @@
 
 	sprintf(buf+size, "\n");
 	fprintf(stdout, buf);
+
+	return 0;
 }
 
-void nfct_default_expect_display(void *arg, unsigned int flags, int type)
+int nfct_default_expect_display(void *arg, unsigned int flags, int type)
 {
 	struct nfct_expect *exp = arg;
 	char buf[256];
@@ -553,6 +560,8 @@
 	size += sprintf(buf+size, "id=%u ", exp->id);
 	size += sprintf(buf, "\n");
 	fprintf(stdout, buf);
+
+	return 0;
 }
 
 static int nfct_event_netlink_handler(struct sockaddr_nl *sock, 

Modified: trunk/libnetfilter_conntrack/utils/ctnl_test.c
===================================================================
--- trunk/libnetfilter_conntrack/utils/ctnl_test.c	2005-10-23 18:16:33 UTC (rev 4380)
+++ trunk/libnetfilter_conntrack/utils/ctnl_test.c	2005-10-23 22:14:05 UTC (rev 4381)
@@ -14,6 +14,17 @@
 #include <errno.h>
 #include <libnetfilter_conntrack/libnetfilter_conntrack.h>
 
+static int event_counter(void *arg, unsigned int flags, int type)
+{
+	static int counter = 0;
+
+	fprintf(stdout, "Event number %d\n", ++counter);
+	if (counter > 10)
+		return -1;
+	
+	return 0;
+}
+
 int main(int argc, char **argv)
 {
 	struct nfct_conntrack *ct;
@@ -53,7 +64,7 @@
 		goto end;
 	}
 
-	cth = nfct_open(CONNTRACK, 0);
+	cth = nfct_open(CONNTRACK, NFCT_ANY_GROUP);
 	if (!cth) {
 		fprintf(stderr, "Can't open handler\n");
 		errors++;
@@ -75,6 +86,11 @@
 	fprintf(stdout, "TEST 2: dump conntrack table (%d)\n", ret);
 	if (ret < 0)
 		errors++;
+
+	fprintf(stdout, "TEST 3: Waiting for 10 conntrack events\n");
+	nfct_set_callback(cth, event_counter);
+	ret = nfct_event_conntrack(cth);
+	fprintf(stdout, "TEST 3: Received 10 conntrack events (%d)\n", ret);
 	
 	nfct_close(cth);
 	nfct_conntrack_free(ct);




More information about the netfilter-cvslog mailing list