[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