summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
author/C=DE/ST=Berlin/L=Berlin/O=Netfilter Project/OU=Development/CN=pablo/emailAddress=pablo@netfilter.org </C=DE/ST=Berlin/L=Berlin/O=Netfilter Project/OU=Development/CN=pablo/emailAddress=pablo@netfilter.org>2005-10-23 22:14:05 +0000
committer/C=DE/ST=Berlin/L=Berlin/O=Netfilter Project/OU=Development/CN=pablo/emailAddress=pablo@netfilter.org </C=DE/ST=Berlin/L=Berlin/O=Netfilter Project/OU=Development/CN=pablo/emailAddress=pablo@netfilter.org>2005-10-23 22:14:05 +0000
commitf23f45f0f09656c0ef960febf6e07442c9053e6d (patch)
treedea24d9ad3e1a93b44406e927d8e1be15c1f8af3
parentfd5957445131fa3855d40db40e421e78e9c9246a (diff)
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()
-rw-r--r--include/libnetfilter_conntrack/libnetfilter_conntrack.h13
-rw-r--r--src/libnetfilter_conntrack.c21
-rw-r--r--utils/ctnl_test.c18
3 files changed, 42 insertions, 10 deletions
diff --git a/include/libnetfilter_conntrack/libnetfilter_conntrack.h b/include/libnetfilter_conntrack/libnetfilter_conntrack.h
index fdd3134..1f09354 100644
--- a/include/libnetfilter_conntrack/libnetfilter_conntrack.h
+++ b/include/libnetfilter_conntrack/libnetfilter_conntrack.h
@@ -30,6 +30,12 @@ enum {
*/
#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 @@ enum {
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 void nfct_unregister_proto(struct nfct_proto *h);
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);
diff --git a/src/libnetfilter_conntrack.c b/src/libnetfilter_conntrack.c
index 7900574..2dfdca1 100644
--- a/src/libnetfilter_conntrack.c
+++ b/src/libnetfilter_conntrack.c
@@ -104,6 +104,11 @@ void nfct_set_callback(struct nfct_handle *cth, nfct_callback callback)
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 @@ static int nfct_conntrack_netlink_handler(struct sockaddr_nl *sock,
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 @@ static int nfct_conntrack_netlink_handler(struct sockaddr_nl *sock,
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 @@ void nfct_default_conntrack_display(void *arg, unsigned int flags, int type)
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 @@ void nfct_default_expect_display(void *arg, unsigned int flags, int type)
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,
diff --git a/utils/ctnl_test.c b/utils/ctnl_test.c
index 5f33424..8fad660 100644
--- a/utils/ctnl_test.c
+++ b/utils/ctnl_test.c
@@ -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 @@ int main(int argc, char **argv)
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 @@ int main(int argc, char **argv)
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);